Index: trunk/sources/HeuristicLab.Core.Views/3.3/Clipboard.Designer.cs
===================================================================
--- trunk/sources/HeuristicLab.Core.Views/3.3/Clipboard.Designer.cs	(revision 3297)
+++ trunk/sources/HeuristicLab.Core.Views/3.3/Clipboard.Designer.cs	(revision 3298)
@@ -21,5 +21,5 @@
 
 namespace HeuristicLab.Core.Views {
-  partial class Clipboard {
+  partial class Clipboard<T> {
     /// <summary> 
     /// Required designer variable.
@@ -33,4 +33,5 @@
     protected override void Dispose(bool disposing) {
       if (disposing) {
+        if (typeSelectorDialog != null) typeSelectorDialog.Dispose();
         if (components != null) components.Dispose();
       }
@@ -45,5 +46,145 @@
     /// </summary>
     private void InitializeComponent() {
+      this.components = new System.ComponentModel.Container();
+      this.listView = new System.Windows.Forms.ListView();
+      this.columnHeader1 = new System.Windows.Forms.ColumnHeader();
+      this.imageList = new System.Windows.Forms.ImageList(this.components);
+      this.infoPanel = new System.Windows.Forms.Panel();
+      this.progressBar = new System.Windows.Forms.ProgressBar();
+      this.infoLabel = new System.Windows.Forms.Label();
+      this.sortDescendingButton = new System.Windows.Forms.Button();
+      this.sortAscendingButton = new System.Windows.Forms.Button();
+      this.removeButton = new System.Windows.Forms.Button();
+      this.addButton = new System.Windows.Forms.Button();
+      this.toolTip = new System.Windows.Forms.ToolTip(this.components);
+      this.saveButton = new System.Windows.Forms.Button();
+      this.infoPanel.SuspendLayout();
       this.SuspendLayout();
+      // 
+      // listView
+      // 
+      this.listView.AllowDrop = true;
+      this.listView.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom)
+                  | System.Windows.Forms.AnchorStyles.Left)
+                  | System.Windows.Forms.AnchorStyles.Right)));
+      this.listView.Columns.AddRange(new System.Windows.Forms.ColumnHeader[] {
+            this.columnHeader1});
+      this.listView.FullRowSelect = true;
+      this.listView.HeaderStyle = System.Windows.Forms.ColumnHeaderStyle.None;
+      this.listView.HideSelection = false;
+      this.listView.Location = new System.Drawing.Point(0, 30);
+      this.listView.Name = "listView";
+      this.listView.ShowItemToolTips = true;
+      this.listView.Size = new System.Drawing.Size(179, 432);
+      this.listView.SmallImageList = this.imageList;
+      this.listView.Sorting = System.Windows.Forms.SortOrder.Ascending;
+      this.listView.TabIndex = 0;
+      this.listView.UseCompatibleStateImageBehavior = false;
+      this.listView.View = System.Windows.Forms.View.Details;
+      this.listView.SelectedIndexChanged += new System.EventHandler(this.listView_SelectedIndexChanged);
+      this.listView.SizeChanged += new System.EventHandler(this.listView_SizeChanged);
+      this.listView.DoubleClick += new System.EventHandler(this.listView_DoubleClick);
+      this.listView.DragDrop += new System.Windows.Forms.DragEventHandler(this.listView_DragDrop);
+      this.listView.DragEnter += new System.Windows.Forms.DragEventHandler(this.listView_DragEnterOver);
+      this.listView.KeyDown += new System.Windows.Forms.KeyEventHandler(this.listView_KeyDown);
+      this.listView.ItemDrag += new System.Windows.Forms.ItemDragEventHandler(this.listView_ItemDrag);
+      this.listView.DragOver += new System.Windows.Forms.DragEventHandler(this.listView_DragEnterOver);
+      // 
+      // imageList
+      // 
+      this.imageList.ColorDepth = System.Windows.Forms.ColorDepth.Depth8Bit;
+      this.imageList.ImageSize = new System.Drawing.Size(16, 16);
+      this.imageList.TransparentColor = System.Drawing.Color.Transparent;
+      // 
+      // infoPanel
+      // 
+      this.infoPanel.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Left | System.Windows.Forms.AnchorStyles.Right)));
+      this.infoPanel.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle;
+      this.infoPanel.Controls.Add(this.progressBar);
+      this.infoPanel.Controls.Add(this.infoLabel);
+      this.infoPanel.Enabled = false;
+      this.infoPanel.Location = new System.Drawing.Point(13, 202);
+      this.infoPanel.Name = "infoPanel";
+      this.infoPanel.Size = new System.Drawing.Size(154, 59);
+      this.infoPanel.TabIndex = 6;
+      // 
+      // progressBar
+      // 
+      this.progressBar.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Left | System.Windows.Forms.AnchorStyles.Right)));
+      this.progressBar.Location = new System.Drawing.Point(3, 30);
+      this.progressBar.Name = "progressBar";
+      this.progressBar.Size = new System.Drawing.Size(146, 23);
+      this.progressBar.Step = 1;
+      this.progressBar.TabIndex = 1;
+      // 
+      // infoLabel
+      // 
+      this.infoLabel.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Left | System.Windows.Forms.AnchorStyles.Right)));
+      this.infoLabel.Font = new System.Drawing.Font("Microsoft Sans Serif", 12F, System.Drawing.FontStyle.Italic, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
+      this.infoLabel.Location = new System.Drawing.Point(3, 4);
+      this.infoLabel.Name = "infoLabel";
+      this.infoLabel.Size = new System.Drawing.Size(146, 23);
+      this.infoLabel.TabIndex = 0;
+      this.infoLabel.Text = "Loading ...";
+      this.infoLabel.TextAlign = System.Drawing.ContentAlignment.BottomCenter;
+      // 
+      // sortDescendingButton
+      // 
+      this.sortDescendingButton.Enabled = false;
+      this.sortDescendingButton.Image = HeuristicLab.Common.Resources.VS2008ImageLibrary.SortUp;
+      this.sortDescendingButton.Location = new System.Drawing.Point(30, 0);
+      this.sortDescendingButton.Name = "sortDescendingButton";
+      this.sortDescendingButton.Size = new System.Drawing.Size(24, 24);
+      this.sortDescendingButton.TabIndex = 2;
+      this.toolTip.SetToolTip(this.sortDescendingButton, "Sort Descending");
+      this.sortDescendingButton.UseVisualStyleBackColor = true;
+      this.sortDescendingButton.Click += new System.EventHandler(this.sortDescendingButton_Click);
+      // 
+      // sortAscendingButton
+      // 
+      this.sortAscendingButton.Enabled = false;
+      this.sortAscendingButton.Image = HeuristicLab.Common.Resources.VS2008ImageLibrary.Sort;
+      this.sortAscendingButton.Location = new System.Drawing.Point(60, 0);
+      this.sortAscendingButton.Name = "sortAscendingButton";
+      this.sortAscendingButton.Size = new System.Drawing.Size(24, 24);
+      this.sortAscendingButton.TabIndex = 3;
+      this.toolTip.SetToolTip(this.sortAscendingButton, "Sort Ascending");
+      this.sortAscendingButton.UseVisualStyleBackColor = true;
+      this.sortAscendingButton.Click += new System.EventHandler(this.sortAscendingButton_Click);
+      // 
+      // removeButton
+      // 
+      this.removeButton.Enabled = false;
+      this.removeButton.Image = HeuristicLab.Common.Resources.VS2008ImageLibrary.Remove;
+      this.removeButton.Location = new System.Drawing.Point(90, 0);
+      this.removeButton.Name = "removeButton";
+      this.removeButton.Size = new System.Drawing.Size(24, 24);
+      this.removeButton.TabIndex = 4;
+      this.toolTip.SetToolTip(this.removeButton, "Remove Item");
+      this.removeButton.UseVisualStyleBackColor = true;
+      this.removeButton.Click += new System.EventHandler(this.removeButton_Click);
+      // 
+      // addButton
+      // 
+      this.addButton.Image = HeuristicLab.Common.Resources.VS2008ImageLibrary.Add;
+      this.addButton.Location = new System.Drawing.Point(0, 0);
+      this.addButton.Name = "addButton";
+      this.addButton.Size = new System.Drawing.Size(24, 24);
+      this.addButton.TabIndex = 1;
+      this.toolTip.SetToolTip(this.addButton, "Add Item");
+      this.addButton.UseVisualStyleBackColor = true;
+      this.addButton.Click += new System.EventHandler(this.addButton_Click);
+      // 
+      // saveButton
+      // 
+      this.saveButton.Enabled = false;
+      this.saveButton.Image = HeuristicLab.Common.Resources.VS2008ImageLibrary.Save;
+      this.saveButton.Location = new System.Drawing.Point(120, 0);
+      this.saveButton.Name = "saveButton";
+      this.saveButton.Size = new System.Drawing.Size(24, 24);
+      this.saveButton.TabIndex = 5;
+      this.toolTip.SetToolTip(this.saveButton, "Save All Items");
+      this.saveButton.UseVisualStyleBackColor = true;
+      this.saveButton.Click += new System.EventHandler(this.saveButton_Click);
       // 
       // Clipboard
@@ -52,6 +193,14 @@
       this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
       this.Caption = "Clipboard";
+      this.Controls.Add(this.sortDescendingButton);
+      this.Controls.Add(this.sortAscendingButton);
+      this.Controls.Add(this.saveButton);
+      this.Controls.Add(this.removeButton);
+      this.Controls.Add(this.addButton);
+      this.Controls.Add(this.infoPanel);
+      this.Controls.Add(this.listView);
       this.Name = "Clipboard";
-      this.Size = new System.Drawing.Size(316, 296);
+      this.Size = new System.Drawing.Size(179, 462);
+      this.infoPanel.ResumeLayout(false);
       this.ResumeLayout(false);
 
@@ -59,4 +208,17 @@
 
     #endregion
+
+    private System.Windows.Forms.ListView listView;
+    private System.Windows.Forms.Panel infoPanel;
+    private System.Windows.Forms.ProgressBar progressBar;
+    private System.Windows.Forms.Label infoLabel;
+    private System.Windows.Forms.ImageList imageList;
+    private System.Windows.Forms.Button sortDescendingButton;
+    private System.Windows.Forms.Button sortAscendingButton;
+    private System.Windows.Forms.Button removeButton;
+    private System.Windows.Forms.Button addButton;
+    private System.Windows.Forms.ColumnHeader columnHeader1;
+    private System.Windows.Forms.ToolTip toolTip;
+    private System.Windows.Forms.Button saveButton;
 
   }
Index: trunk/sources/HeuristicLab.Core.Views/3.3/Clipboard.cs
===================================================================
--- trunk/sources/HeuristicLab.Core.Views/3.3/Clipboard.cs	(revision 3297)
+++ trunk/sources/HeuristicLab.Core.Views/3.3/Clipboard.cs	(revision 3298)
@@ -21,16 +21,59 @@
 
 using System;
+using System.Collections.Generic;
+using System.IO;
+using System.Linq;
+using System.Threading;
 using System.Windows.Forms;
 using HeuristicLab.MainForm;
+using HeuristicLab.Persistence.Default.Xml;
 
 namespace HeuristicLab.Core.Views {
   [View("Clipboard")]
-  public partial class Clipboard : HeuristicLab.MainForm.WindowsForms.View {
+  public sealed partial class Clipboard<T> : HeuristicLab.MainForm.WindowsForms.View where T : class, IItem {
+    private TypeSelectorDialog typeSelectorDialog;
+    private Dictionary<T, ListViewItem> itemListViewItemTable;
+
+    private string itemsPath;
+    public string ItemsPath {
+      get { return itemsPath; }
+      private set {
+        if (string.IsNullOrEmpty(value)) throw new ArgumentException(string.Format("Invalid items path \"{0}\".", value));
+        itemsPath = value;
+        try {
+          if (!Directory.Exists(itemsPath)) {
+            Directory.CreateDirectory(itemsPath);
+            // directory creation might take some time -> wait until it is definitively created
+            while (!Directory.Exists(itemsPath)) {
+              Thread.Sleep(100);
+              Directory.CreateDirectory(itemsPath);
+            }
+          }
+        }
+        catch (Exception ex) {
+          throw new ArgumentException(string.Format("Invalid items path \"{0}\".", itemsPath), ex);
+        }
+      }
+    }
+
     public Clipboard() {
       InitializeComponent();
+      ItemsPath = Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData) +
+                  Path.DirectorySeparatorChar + "HeuristicLab" + Path.DirectorySeparatorChar + "Clipboard";
+      itemListViewItemTable = new Dictionary<T, ListViewItem>();
+    }
+    public Clipboard(string itemsPath) {
+      InitializeComponent();
+      ItemsPath = itemsPath;
+      itemListViewItemTable = new Dictionary<T, ListViewItem>();
     }
 
     protected override void OnInitialized(EventArgs e) {
       base.OnInitialized(e);
+      Enabled = false;
+      infoLabel.Text = "Loading ...";
+      progressBar.Value = 0;
+      infoPanel.Visible = true;
+      ThreadPool.QueueUserWorkItem(new WaitCallback(LoadItems));
     }
     protected override void OnClosing(FormClosingEventArgs e) {
@@ -41,4 +84,217 @@
       }
     }
+
+    public void AddItem(T item) {
+      if (InvokeRequired)
+        Invoke(new Action<T>(AddItem), item);
+      else {
+        if (!itemListViewItemTable.ContainsKey(item)) {
+          if (!listView.SmallImageList.Images.ContainsKey(item.GetType().FullName))
+            listView.SmallImageList.Images.Add(item.GetType().FullName, item.ItemImage);
+
+          ListViewItem listViewItem = new ListViewItem(item.ToString());
+          listViewItem.ToolTipText = item.ItemName + ": " + item.ItemDescription;
+          listViewItem.ImageIndex = listView.SmallImageList.Images.IndexOfKey(item.GetType().FullName);
+          listViewItem.Tag = item;
+          listView.Items.Add(listViewItem);
+          itemListViewItemTable.Add(item, listViewItem);
+          item.ToStringChanged += new EventHandler(Item_ToStringChanged);
+          sortAscendingButton.Enabled = sortDescendingButton.Enabled = listView.Items.Count > 1;
+          saveButton.Enabled = listView.Items.Count > 0;
+        }
+      }
+    }
+    private void RemoveItem(T item) {
+      if (InvokeRequired)
+        Invoke(new Action<T>(RemoveItem), item);
+      else {
+        if (itemListViewItemTable.ContainsKey(item)) {
+          item.ToStringChanged -= new EventHandler(Item_ToStringChanged);
+          itemListViewItemTable[item].Remove();
+          itemListViewItemTable.Remove(item);
+          sortAscendingButton.Enabled = sortDescendingButton.Enabled = listView.Items.Count > 1;
+          saveButton.Enabled = listView.Items.Count > 0;
+        }
+      }
+    }
+    private void Save() {
+      if (InvokeRequired)
+        Invoke(new Action(Save));
+      else {
+        Enabled = false;
+        infoLabel.Text = "Saving ...";
+        progressBar.Value = 0;
+        infoPanel.Visible = true;
+        ThreadPool.QueueUserWorkItem(new WaitCallback(SaveItems));
+      }
+    }
+
+    #region Loading/Saving Items
+    private void LoadItems(object state) {
+      string[] items = Directory.GetFiles(ItemsPath);
+      foreach (string filename in items) {
+        try {
+          T item = XmlParser.Deserialize<T>(filename);
+          OnItemLoaded(item, progressBar.Maximum / items.Length);
+        }
+        catch (Exception) { }
+      }
+      OnAllItemsLoaded();
+    }
+    private void OnItemLoaded(T item, int progress) {
+      if (InvokeRequired)
+        Invoke(new Action<T, int>(OnItemLoaded), item, progress);
+      else {
+        AddItem(item);
+        progressBar.Value += progress;
+      }
+    }
+    private void OnAllItemsLoaded() {
+      if (InvokeRequired)
+        Invoke(new Action(OnAllItemsLoaded));
+      else {
+        Enabled = true;
+        if (listView.Items.Count > 0) {
+          for (int i = 0; i < listView.Columns.Count; i++)
+            listView.Columns[i].AutoResize(ColumnHeaderAutoResizeStyle.ColumnContent);
+        }
+        infoPanel.Visible = false;
+      }
+    }
+    private void SaveItems(object param) {
+      Directory.Delete(ItemsPath, true);
+      Directory.CreateDirectory(ItemsPath);
+      // directory creation might take some time -> wait until it is definitively created
+      while (!Directory.Exists(ItemsPath)) {
+        Thread.Sleep(100);
+        Directory.CreateDirectory(ItemsPath);
+      }
+
+      int i = 0;
+      T[] items = itemListViewItemTable.Keys.ToArray();
+      foreach (T item in items) {
+        try {
+          i++;
+          XmlGenerator.Serialize(item, ItemsPath + Path.DirectorySeparatorChar + i.ToString("00000000") + ".hl", 9);
+          OnItemSaved(item, progressBar.Maximum / listView.Items.Count);
+        }
+        catch (Exception) { }
+      }
+      OnAllItemsSaved();
+    }
+    private void OnItemSaved(T item, int progress) {
+      if (item != null) {
+        if (InvokeRequired)
+          Invoke(new Action<T, int>(OnItemLoaded), item, progress);
+        else
+          progressBar.Value += progress;
+      }
+    }
+    private void OnAllItemsSaved() {
+      if (InvokeRequired)
+        Invoke(new Action(OnAllItemsLoaded));
+      else {
+        Enabled = true;
+        infoPanel.Visible = false;
+      }
+    }
+    #endregion
+
+    #region ListView Events
+    private void listView_SelectedIndexChanged(object sender, EventArgs e) {
+      removeButton.Enabled = listView.SelectedItems.Count > 0;
+    }
+    private void listView_SizeChanged(object sender, EventArgs e) {
+      if (listView.Columns.Count > 0)
+        listView.Columns[0].Width = Math.Max(0, listView.Width - 25);
+    }
+    private void listView_KeyDown(object sender, KeyEventArgs e) {
+      if (e.KeyCode == Keys.Delete) {
+        if (listView.SelectedItems.Count > 0) {
+          foreach (ListViewItem item in listView.SelectedItems)
+            RemoveItem((T)item.Tag);
+        }
+      }
+    }
+    private void listView_DoubleClick(object sender, EventArgs e) {
+      if (listView.SelectedItems.Count == 1) {
+        T item = (T)listView.SelectedItems[0].Tag;
+        IView view = MainFormManager.CreateDefaultView(item);
+        if (view != null) view.Show();
+      }
+    }
+    private void listView_ItemDrag(object sender, ItemDragEventArgs e) {
+      ListViewItem listViewItem = (ListViewItem)e.Item;
+      T item = (T)listViewItem.Tag;
+      DataObject data = new DataObject();
+      data.SetData("Type", item.GetType());
+      data.SetData("Value", item);
+      DragDropEffects result = DoDragDrop(data, DragDropEffects.Copy | DragDropEffects.Link | DragDropEffects.Move);
+      if ((result & DragDropEffects.Move) == DragDropEffects.Move)
+        RemoveItem(item);
+    }
+    private void listView_DragEnterOver(object sender, DragEventArgs e) {
+      e.Effect = DragDropEffects.None;
+      Type type = e.Data.GetData("Type") as Type;
+      T item = e.Data.GetData("Value") as T;
+      if ((type != null) && (item != null)) {
+        if ((e.KeyState & 8) == 8) e.Effect = DragDropEffects.Copy;  // CTRL key
+        else if (((e.KeyState & 4) == 4) && !itemListViewItemTable.ContainsKey(item)) e.Effect = DragDropEffects.Move;  // SHIFT key
+        else if (((e.AllowedEffect & DragDropEffects.Link) == DragDropEffects.Link) && !itemListViewItemTable.ContainsKey(item)) e.Effect = DragDropEffects.Link;
+        else if ((e.AllowedEffect & DragDropEffects.Copy) == DragDropEffects.Copy) e.Effect = DragDropEffects.Copy;
+        else if (((e.AllowedEffect & DragDropEffects.Move) == DragDropEffects.Move) && !itemListViewItemTable.ContainsKey(item)) e.Effect = DragDropEffects.Move;
+      }
+    }
+    private void listView_DragDrop(object sender, DragEventArgs e) {
+      if (e.Effect != DragDropEffects.None) {
+        T item = e.Data.GetData("Value") as T;
+        if ((e.Effect & DragDropEffects.Copy) == DragDropEffects.Copy) item = (T)item.Clone();
+        AddItem(item);
+      }
+    }
+    #endregion
+
+    #region Button Events
+    private void addButton_Click(object sender, EventArgs e) {
+      if (typeSelectorDialog == null) {
+        typeSelectorDialog = new TypeSelectorDialog();
+        typeSelectorDialog.Caption = "Select Item";
+        typeSelectorDialog.TypeSelector.Caption = "Available Items";
+        typeSelectorDialog.TypeSelector.Configure(typeof(T), false, false);
+      }
+
+      if (typeSelectorDialog.ShowDialog(this) == DialogResult.OK)
+        AddItem((T)typeSelectorDialog.TypeSelector.CreateInstanceOfSelectedType());
+    }
+    private void sortAscendingButton_Click(object sender, EventArgs e) {
+      listView.Sorting = SortOrder.None;
+      listView.Sorting = SortOrder.Ascending;
+    }
+    private void sortDescendingButton_Click(object sender, EventArgs e) {
+      listView.Sorting = SortOrder.None;
+      listView.Sorting = SortOrder.Descending;
+    }
+    private void removeButton_Click(object sender, EventArgs e) {
+      if (listView.SelectedItems.Count > 0) {
+        foreach (ListViewItem item in listView.SelectedItems)
+          RemoveItem((T)item.Tag);
+      }
+    }
+    private void saveButton_Click(object sender, EventArgs e) {
+      Save();
+    }
+    #endregion
+
+    #region Item Events
+    private void Item_ToStringChanged(object sender, EventArgs e) {
+      if (InvokeRequired)
+        Invoke(new EventHandler(Item_ToStringChanged), sender, e);
+      else {
+        T item = (T)sender;
+        itemListViewItemTable[item].Text = item.ToString();
+        listView.Sort();
+      }
+    }
+    #endregion
   }
 }
Index: trunk/sources/HeuristicLab.Core.Views/3.3/ItemCollectionView.cs
===================================================================
--- trunk/sources/HeuristicLab.Core.Views/3.3/ItemCollectionView.cs	(revision 3297)
+++ trunk/sources/HeuristicLab.Core.Views/3.3/ItemCollectionView.cs	(revision 3298)
@@ -268,6 +268,6 @@
     #region Helpers
     protected virtual void SortItemsListView(SortOrder sortOrder) {
+      itemsListView.Sorting = SortOrder.None;
       itemsListView.Sorting = sortOrder;
-      itemsListView.Sort();
       itemsListView.Sorting = SortOrder.None;
     }
Index: trunk/sources/HeuristicLab.Optimizer/3.3/HeuristicLab.Optimizer-3.3.csproj
===================================================================
--- trunk/sources/HeuristicLab.Optimizer/3.3/HeuristicLab.Optimizer-3.3.csproj	(revision 3297)
+++ trunk/sources/HeuristicLab.Optimizer/3.3/HeuristicLab.Optimizer-3.3.csproj	(revision 3298)
@@ -88,4 +88,5 @@
     <Compile Include="FileManager.cs" />
     <Compile Include="MenuItems\ClipboardMenuItem.cs" />
+    <Compile Include="MenuItems\CopyToClipboardMenuItem.cs" />
     <Compile Include="MenuItems\StartPageMenuItem.cs" />
     <Compile Include="Properties\Settings.Designer.cs">
Index: trunk/sources/HeuristicLab.Optimizer/3.3/MenuItems/ClipboardMenuItem.cs
===================================================================
--- trunk/sources/HeuristicLab.Optimizer/3.3/MenuItems/ClipboardMenuItem.cs	(revision 3297)
+++ trunk/sources/HeuristicLab.Optimizer/3.3/MenuItems/ClipboardMenuItem.cs	(revision 3298)
@@ -24,4 +24,5 @@
 using System.Linq;
 using System.Windows.Forms;
+using HeuristicLab.Core;
 using HeuristicLab.Core.Views;
 using HeuristicLab.MainForm;
@@ -38,5 +39,5 @@
     }
     public override int Position {
-      get { return 2200; }
+      get { return 3200; }
     }
 
@@ -53,5 +54,5 @@
 
     private void MainForm_ViewShown(object sender, ViewShownEventArgs e) {
-      if ((e.View is HeuristicLab.Core.Views.Clipboard) && (menuItem != null)) {
+      if ((e.View is Clipboard<IItem>) && (menuItem != null)) {
         menuItem.Checked = true;
         Properties.Settings.Default.ShowClipboard = true;
@@ -60,5 +61,5 @@
     }
     private void MainForm_ViewHidden(object sender, ViewEventArgs e) {
-      if ((e.View is HeuristicLab.Core.Views.Clipboard) && (menuItem != null)) {
+      if ((e.View is Clipboard<IItem>) && (menuItem != null)) {
         menuItem.Checked = false;
         Properties.Settings.Default.ShowClipboard = false;
Index: trunk/sources/HeuristicLab.Optimizer/3.3/MenuItems/CopyToClipboardMenuItem.cs
===================================================================
--- trunk/sources/HeuristicLab.Optimizer/3.3/MenuItems/CopyToClipboardMenuItem.cs	(revision 3298)
+++ trunk/sources/HeuristicLab.Optimizer/3.3/MenuItems/CopyToClipboardMenuItem.cs	(revision 3298)
@@ -0,0 +1,60 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2010 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.Collections.Generic;
+using System.Windows.Forms;
+using HeuristicLab.Core;
+using HeuristicLab.Core.Views;
+using HeuristicLab.MainForm;
+
+namespace HeuristicLab.Optimizer.MenuItems {
+  internal class CopyToClipboardMenuItem : HeuristicLab.MainForm.WindowsForms.MenuItem, IOptimizerUserInterfaceItemProvider {
+    public override string Name {
+      get { return "&Copy To Clipboard"; }
+    }
+    public override IEnumerable<string> Structure {
+      get { return new string[] { "&Edit" }; }
+    }
+    public override int Position {
+      get { return 2100; }
+    }
+    public override Keys ShortCutKeys {
+      get { return Keys.Control | Keys.C; }
+    }
+
+    protected override void OnToolStripItemSet(EventArgs e) {
+      ToolStripItem.Enabled = false;
+    }
+    protected override void OnActiveViewChanged(object sender, EventArgs e) {
+      ItemView activeView = MainFormManager.MainForm.ActiveView as ItemView;
+      ToolStripItem.Enabled = (activeView != null) && (activeView.SaveEnabled);
+    }
+
+    public override void Execute() {
+      ItemView activeView = MainFormManager.MainForm.ActiveView as ItemView;
+      if ((activeView != null) && (activeView.SaveEnabled)) {
+        Clipboard<IItem> clipboard = ((OptimizerMainForm)MainFormManager.MainForm).Clipboard;
+        clipboard.AddItem((IItem)activeView.Content.Clone());
+      }
+    }
+  }
+}
Index: trunk/sources/HeuristicLab.Optimizer/3.3/MenuItems/OperatorsMenuItem.cs
===================================================================
--- trunk/sources/HeuristicLab.Optimizer/3.3/MenuItems/OperatorsMenuItem.cs	(revision 3297)
+++ trunk/sources/HeuristicLab.Optimizer/3.3/MenuItems/OperatorsMenuItem.cs	(revision 3298)
@@ -38,5 +38,5 @@
     }
     public override int Position {
-      get { return 2300; }
+      get { return 3300; }
     }
 
Index: trunk/sources/HeuristicLab.Optimizer/3.3/MenuItems/StartPageMenuItem.cs
===================================================================
--- trunk/sources/HeuristicLab.Optimizer/3.3/MenuItems/StartPageMenuItem.cs	(revision 3297)
+++ trunk/sources/HeuristicLab.Optimizer/3.3/MenuItems/StartPageMenuItem.cs	(revision 3298)
@@ -38,5 +38,5 @@
     }
     public override int Position {
-      get { return 2100; }
+      get { return 3100; }
     }
 
Index: trunk/sources/HeuristicLab.Optimizer/3.3/OptimizerMainForm.cs
===================================================================
--- trunk/sources/HeuristicLab.Optimizer/3.3/OptimizerMainForm.cs	(revision 3297)
+++ trunk/sources/HeuristicLab.Optimizer/3.3/OptimizerMainForm.cs	(revision 3298)
@@ -24,4 +24,5 @@
 using System.Reflection;
 using System.Windows.Forms;
+using HeuristicLab.Core;
 using HeuristicLab.Core.Views;
 using HeuristicLab.MainForm;
@@ -30,6 +31,6 @@
 namespace HeuristicLab.Optimizer {
   internal partial class OptimizerMainForm : DockingMainForm {
-    private HeuristicLab.Core.Views.Clipboard clipboard;
-    public HeuristicLab.Core.Views.Clipboard Clipboard {
+    private Clipboard<IItem> clipboard;
+    public Clipboard<IItem> Clipboard {
       get { return clipboard; }
     }
@@ -53,5 +54,5 @@
       ViewClosed += new EventHandler<ViewEventArgs>(FileManager.ViewClosed);
 
-      clipboard = new HeuristicLab.Core.Views.Clipboard();
+      clipboard = new Clipboard<IItem>();
       clipboard.Dock = DockStyle.Left;
       if (Properties.Settings.Default.ShowClipboard) {
Index: trunk/sources/HeuristicLab.Optimizer/3.3/StartPage.Designer.cs
===================================================================
--- trunk/sources/HeuristicLab.Optimizer/3.3/StartPage.Designer.cs	(revision 3297)
+++ trunk/sources/HeuristicLab.Optimizer/3.3/StartPage.Designer.cs	(revision 3298)
@@ -164,4 +164,5 @@
       this.samplesListView.View = System.Windows.Forms.View.Details;
       this.samplesListView.DoubleClick += new System.EventHandler(this.samplesListView_DoubleClick);
+      this.samplesListView.ItemDrag += new System.Windows.Forms.ItemDragEventHandler(this.samplesListView_ItemDrag);
       // 
       // nameColumnHeader
Index: trunk/sources/HeuristicLab.Optimizer/3.3/StartPage.cs
===================================================================
--- trunk/sources/HeuristicLab.Optimizer/3.3/StartPage.cs	(revision 3297)
+++ trunk/sources/HeuristicLab.Optimizer/3.3/StartPage.cs	(revision 3298)
@@ -70,6 +70,6 @@
       Assembly assembly = Assembly.GetExecutingAssembly();
       var samples = assembly.GetManifestResourceNames().Where(x => x.EndsWith(".hl"));
+      int count = samples.Count();
       string path = Path.GetTempFileName();
-      int progress = loadingProgressBar.Maximum / samples.Count();
 
       foreach (string name in samples) {
@@ -77,6 +77,6 @@
           using (Stream stream = assembly.GetManifestResourceStream(name)) {
             WriteStreamToTempFile(stream, path);
-            IItem item = XmlParser.Deserialize<IItem>(path);
-            OnSampleLoaded(item as INamedItem, progress);
+            INamedItem item = XmlParser.Deserialize<INamedItem>(path);
+            OnSampleLoaded(item, loadingProgressBar.Maximum / count);
           }
         }
@@ -86,16 +86,14 @@
     }
     private void OnSampleLoaded(INamedItem sample, int progress) {
-      if (sample != null) {
-        if (InvokeRequired)
-          Invoke(new Action<INamedItem, int>(OnSampleLoaded), sample, progress);
-        else {
-          ListViewItem item = new ListViewItem(new string[] { sample.Name, sample.Description });
-          item.ToolTipText = sample.ItemName + " (" + sample.ItemDescription + ")";
-          samplesListView.SmallImageList.Images.Add(sample.ItemImage);
-          item.ImageIndex = samplesListView.SmallImageList.Images.Count - 1;
-          item.Tag = sample;
-          samplesListView.Items.Add(item);
-          loadingProgressBar.Value += progress;
-        }
+      if (InvokeRequired)
+        Invoke(new Action<INamedItem, int>(OnSampleLoaded), sample, progress);
+      else {
+        ListViewItem item = new ListViewItem(new string[] { sample.Name, sample.Description });
+        item.ToolTipText = sample.ItemName + ": " + sample.ItemDescription;
+        samplesListView.SmallImageList.Images.Add(sample.ItemImage);
+        item.ImageIndex = samplesListView.SmallImageList.Images.Count - 1;
+        item.Tag = sample;
+        samplesListView.Items.Add(item);
+        loadingProgressBar.Value += progress;
       }
     }
@@ -121,4 +119,12 @@
         MainFormManager.CreateDefaultView(((IItem)samplesListView.SelectedItems[0].Tag).Clone()).Show();
     }
+    private void samplesListView_ItemDrag(object sender, ItemDragEventArgs e) {
+      ListViewItem listViewItem = (ListViewItem)e.Item;
+      IItem item = (IItem)listViewItem.Tag;
+      DataObject data = new DataObject();
+      data.SetData("Type", item.GetType());
+      data.SetData("Value", item);
+      DragDropEffects result = DoDragDrop(data, DragDropEffects.Copy);
+    }
 
     private void showStartPageCheckBox_CheckedChanged(object sender, EventArgs e) {
