Index: trunk/sources/HeuristicLab.Algorithms.DataAnalysis.Views/3.3/CrossValidationView.cs
===================================================================
--- trunk/sources/HeuristicLab.Algorithms.DataAnalysis.Views/3.3/CrossValidationView.cs	(revision 5741)
+++ trunk/sources/HeuristicLab.Algorithms.DataAnalysis.Views/3.3/CrossValidationView.cs	(revision 5744)
@@ -317,20 +317,17 @@
     private void algorithmTabPage_DragEnterOver(object sender, DragEventArgs e) {
       e.Effect = DragDropEffects.None;
-      if (ReadOnly) return;
-      Type type = e.Data.GetData("Type") as Type;
-      IAlgorithm algorithm = e.Data.GetData("Value") as IAlgorithm;
-      if ((type != null) && (typeof(IAlgorithm).IsAssignableFrom(type)) &&
-        algorithm != null && Content.ProblemType.IsAssignableFrom(algorithm.Problem.GetType())) {
+      IAlgorithm algorithm = e.Data.GetData("HeuristicLab") as IAlgorithm;
+      if (!ReadOnly && (algorithm != null) && Content.ProblemType.IsAssignableFrom(algorithm.Problem.GetType())) {
         if ((e.KeyState & 32) == 32) e.Effect = DragDropEffects.Link;  // ALT key
         else if ((e.KeyState & 4) == 4) e.Effect = DragDropEffects.Move;  // SHIFT key
-        else if ((e.AllowedEffect & DragDropEffects.Copy) == DragDropEffects.Copy) e.Effect = DragDropEffects.Copy;
-        else if ((e.AllowedEffect & DragDropEffects.Move) == DragDropEffects.Move) e.Effect = DragDropEffects.Move;
-        else if ((e.AllowedEffect & DragDropEffects.Link) == DragDropEffects.Link) e.Effect = DragDropEffects.Link;
+        else if (e.AllowedEffect.HasFlag(DragDropEffects.Copy)) e.Effect = DragDropEffects.Copy;
+        else if (e.AllowedEffect.HasFlag(DragDropEffects.Move)) e.Effect = DragDropEffects.Move;
+        else if (e.AllowedEffect.HasFlag(DragDropEffects.Link)) e.Effect = DragDropEffects.Link;
       }
     }
     private void algorithmTabPage_DragDrop(object sender, DragEventArgs e) {
       if (e.Effect != DragDropEffects.None) {
-        IAlgorithm algorithm = e.Data.GetData("Value") as IAlgorithm;
-        if ((e.Effect & DragDropEffects.Copy) == DragDropEffects.Copy) algorithm = (IAlgorithm)algorithm.Clone();
+        IAlgorithm algorithm = e.Data.GetData("HeuristicLab") as IAlgorithm;
+        if (e.Effect.HasFlag(DragDropEffects.Copy)) algorithm = (IAlgorithm)algorithm.Clone();
         Content.Algorithm = algorithm;
       }
@@ -339,19 +336,17 @@
     private void algorithmProblemTabPage_DragEnterOver(object sender, DragEventArgs e) {
       e.Effect = DragDropEffects.None;
-      if (ReadOnly) return;
-      Type type = e.Data.GetData("Type") as Type;
-      if ((type != null) && (Content.ProblemType.IsAssignableFrom(type)) &&
-        (Content.Algorithm.ProblemType.IsAssignableFrom(type))) {
+      Type type = e.Data.GetData("HeuristicLab") != null ? e.Data.GetData("HeuristicLab").GetType() : null;
+      if (!ReadOnly && (type != null) && Content.ProblemType.IsAssignableFrom(type) && Content.Algorithm.ProblemType.IsAssignableFrom(type)) {
         if ((e.KeyState & 32) == 32) e.Effect = DragDropEffects.Link;  // ALT key
         else if ((e.KeyState & 4) == 4) e.Effect = DragDropEffects.Move;  // SHIFT key
-        else if ((e.AllowedEffect & DragDropEffects.Copy) == DragDropEffects.Copy) e.Effect = DragDropEffects.Copy;
-        else if ((e.AllowedEffect & DragDropEffects.Move) == DragDropEffects.Move) e.Effect = DragDropEffects.Move;
-        else if ((e.AllowedEffect & DragDropEffects.Link) == DragDropEffects.Link) e.Effect = DragDropEffects.Link;
+        else if (e.AllowedEffect.HasFlag(DragDropEffects.Copy)) e.Effect = DragDropEffects.Copy;
+        else if (e.AllowedEffect.HasFlag(DragDropEffects.Move)) e.Effect = DragDropEffects.Move;
+        else if (e.AllowedEffect.HasFlag(DragDropEffects.Link)) e.Effect = DragDropEffects.Link;
       }
     }
     private void algorithmProblemTabPage_DragDrop(object sender, DragEventArgs e) {
       if (e.Effect != DragDropEffects.None) {
-        ISingleObjectiveDataAnalysisProblem problem = e.Data.GetData("Value") as ISingleObjectiveDataAnalysisProblem;
-        if ((e.Effect & DragDropEffects.Copy) == DragDropEffects.Copy) problem = (ISingleObjectiveDataAnalysisProblem)problem.Clone();
+        ISingleObjectiveDataAnalysisProblem problem = e.Data.GetData("HeuristicLab") as ISingleObjectiveDataAnalysisProblem;
+        if (e.Effect.HasFlag(DragDropEffects.Copy)) problem = (ISingleObjectiveDataAnalysisProblem)problem.Clone();
         Content.Problem = problem;
       }
Index: trunk/sources/HeuristicLab.Core.Views/3.3/Clipboard.Designer.cs
===================================================================
--- trunk/sources/HeuristicLab.Core.Views/3.3/Clipboard.Designer.cs	(revision 5741)
+++ trunk/sources/HeuristicLab.Core.Views/3.3/Clipboard.Designer.cs	(revision 5744)
@@ -74,8 +74,8 @@
       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.DragEnter += new System.Windows.Forms.DragEventHandler(this.listView_DragEnter);
       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);
+      this.listView.DragOver += new System.Windows.Forms.DragEventHandler(this.listView_DragOver);
       // 
       // imageList
Index: trunk/sources/HeuristicLab.Core.Views/3.3/Clipboard.cs
===================================================================
--- trunk/sources/HeuristicLab.Core.Views/3.3/Clipboard.cs	(revision 5741)
+++ trunk/sources/HeuristicLab.Core.Views/3.3/Clipboard.cs	(revision 5744)
@@ -21,4 +21,5 @@
 
 using System;
+using System.Collections;
 using System.Collections.Generic;
 using System.IO;
@@ -35,4 +36,6 @@
     private TypeSelectorDialog typeSelectorDialog;
     private Dictionary<T, ListViewItem> itemListViewItemMapping;
+    private bool validDragOperation;
+    private bool draggedItemsAlreadyContained;
 
     private string itemsPath;
@@ -264,37 +267,62 @@
     }
     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);
-      if (ReadOnly) {
-        DragDropEffects result = DoDragDrop(data, DragDropEffects.Copy | DragDropEffects.Link);
-      } else {
-        DragDropEffects result = DoDragDrop(data, DragDropEffects.Copy | DragDropEffects.Link | DragDropEffects.Move);
-        if ((result & DragDropEffects.Move) == DragDropEffects.Move) {
-          RemoveItem(item);
-          RebuildImageList();
-        }
-      }
-    }
-    private void listView_DragEnterOver(object sender, DragEventArgs e) {
+      List<T> items = new List<T>();
+      foreach (ListViewItem listViewItem in listView.SelectedItems) {
+        T item = listViewItem.Tag as T;
+        if (item != null) items.Add(item);
+      }
+
+      if (items.Count > 0) {
+        DataObject data = new DataObject();
+        if (items.Count == 1) data.SetData("HeuristicLab", items[0]);
+        else data.SetData("HeuristicLab", items);
+        if (ReadOnly) {
+          DoDragDrop(data, DragDropEffects.Copy | DragDropEffects.Link);
+        } else {
+          DragDropEffects result = DoDragDrop(data, DragDropEffects.Copy | DragDropEffects.Link | DragDropEffects.Move);
+          if ((result & DragDropEffects.Move) == DragDropEffects.Move) {
+            foreach (T item in items) RemoveItem(item);
+            RebuildImageList();
+          }
+        }
+      }
+    }
+    private void listView_DragEnter(object sender, DragEventArgs e) {
+      validDragOperation = false;
+      draggedItemsAlreadyContained = false;
+      if (e.Data.GetData("HeuristicLab") is T) {
+        validDragOperation = true;
+        draggedItemsAlreadyContained = itemListViewItemMapping.ContainsKey((T)e.Data.GetData("HeuristicLab"));
+      } else if (e.Data.GetData("HeuristicLab") is IEnumerable) {
+        validDragOperation = true;
+        IEnumerable items = (IEnumerable)e.Data.GetData("HeuristicLab");
+        foreach (object item in items) {
+          validDragOperation = validDragOperation && (item is T);
+          draggedItemsAlreadyContained = draggedItemsAlreadyContained || itemListViewItemMapping.ContainsKey((T)item);
+        }
+      }
+      validDragOperation = validDragOperation && !ReadOnly;
+    }
+    private void listView_DragOver(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 (!ReadOnly && (type != null) && (item != null)) {
-        if ((e.KeyState & 32) == 32) e.Effect = DragDropEffects.Link;  // ALT key
-        else if (((e.KeyState & 4) == 4) && !itemListViewItemMapping.ContainsKey(item)) e.Effect = DragDropEffects.Move;  // SHIFT key
-        else if ((e.AllowedEffect & DragDropEffects.Copy) == DragDropEffects.Copy) e.Effect = DragDropEffects.Copy;
-        else if (((e.AllowedEffect & DragDropEffects.Move) == DragDropEffects.Move) && !itemListViewItemMapping.ContainsKey(item)) e.Effect = DragDropEffects.Move;
-        else if (((e.AllowedEffect & DragDropEffects.Link) == DragDropEffects.Link) && !itemListViewItemMapping.ContainsKey(item)) e.Effect = DragDropEffects.Link;
+      if (validDragOperation) {
+        if (((e.KeyState & 32) == 32) && !draggedItemsAlreadyContained) e.Effect = DragDropEffects.Link;  // ALT key
+        else if (((e.KeyState & 4) == 4) && !draggedItemsAlreadyContained) e.Effect = DragDropEffects.Move;  // SHIFT key
+        else if (e.AllowedEffect.HasFlag(DragDropEffects.Copy)) e.Effect = DragDropEffects.Copy;
+        else if (e.AllowedEffect.HasFlag(DragDropEffects.Move) && !draggedItemsAlreadyContained) e.Effect = DragDropEffects.Move;
+        else if (e.AllowedEffect.HasFlag(DragDropEffects.Link) && !draggedItemsAlreadyContained) e.Effect = DragDropEffects.Link;
       }
     }
     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();
         try {
-          AddItem(item);
+          if (e.Data.GetData("HeuristicLab") is T) {
+            T item = (T)e.Data.GetData("HeuristicLab");
+            AddItem(e.Effect.HasFlag(DragDropEffects.Copy) ? (T)item.Clone() : item);
+          } else if (e.Data.GetData("HeuristicLab") is IEnumerable) {
+            IEnumerable<T> items = ((IEnumerable)e.Data.GetData("HeuristicLab")).Cast<T>();
+            foreach (T item in items)
+              AddItem(e.Effect.HasFlag(DragDropEffects.Copy) ? (T)item.Clone() : item);
+          }
         }
         catch (Exception ex) {
Index: trunk/sources/HeuristicLab.Core.Views/3.3/ItemArrayView.Designer.cs
===================================================================
--- trunk/sources/HeuristicLab.Core.Views/3.3/ItemArrayView.Designer.cs	(revision 5741)
+++ trunk/sources/HeuristicLab.Core.Views/3.3/ItemArrayView.Designer.cs	(revision 5744)
@@ -149,6 +149,6 @@
       this.itemsListView.SelectedIndexChanged += new System.EventHandler(this.itemsListView_SelectedIndexChanged);
       this.itemsListView.DragDrop += new System.Windows.Forms.DragEventHandler(this.itemsListView_DragDrop);
-      this.itemsListView.DragEnter += new System.Windows.Forms.DragEventHandler(this.itemsListView_DragEnterOver);
-      this.itemsListView.DragOver += new System.Windows.Forms.DragEventHandler(this.itemsListView_DragEnterOver);
+      this.itemsListView.DragEnter += new System.Windows.Forms.DragEventHandler(this.itemsListView_DragEnter);
+      this.itemsListView.DragOver += new System.Windows.Forms.DragEventHandler(this.itemsListView_DragOver);
       this.itemsListView.DoubleClick += new System.EventHandler(this.itemsListView_DoubleClick);
       this.itemsListView.KeyDown += new System.Windows.Forms.KeyEventHandler(this.itemsListView_KeyDown);
Index: trunk/sources/HeuristicLab.Core.Views/3.3/ItemArrayView.cs
===================================================================
--- trunk/sources/HeuristicLab.Core.Views/3.3/ItemArrayView.cs	(revision 5741)
+++ trunk/sources/HeuristicLab.Core.Views/3.3/ItemArrayView.cs	(revision 5744)
@@ -37,4 +37,5 @@
     protected Dictionary<T, List<ListViewItem>> itemListViewItemMapping;
     protected TypeSelectorDialog typeSelectorDialog;
+    protected bool validDragOperation;
 
     public new IItemArray<T> Content {
@@ -274,24 +275,32 @@
     protected virtual void itemsListView_ItemDrag(object sender, ItemDragEventArgs e) {
       if (!Locked) {
-        ListViewItem listViewItem = (ListViewItem)e.Item;
-        T item = listViewItem.Tag as T;
-        if (item != null) {
+        List<T> items = new List<T>();
+        foreach (ListViewItem listViewItem in itemsListView.SelectedItems) {
+          T item = listViewItem.Tag as T;
+          if (item != null) items.Add(item);
+        }
+
+        if (items.Count > 0) {
           DataObject data = new DataObject();
-          data.SetData("Type", item.GetType());
-          data.SetData("Value", item);
+          if (items.Count == 1) data.SetData("HeuristicLab", items[0]);
+          else data.SetData("HeuristicLab", items);
           if (Content.IsReadOnly || ReadOnly) {
             DoDragDrop(data, DragDropEffects.Copy | DragDropEffects.Link);
           } else {
             DragDropEffects result = DoDragDrop(data, DragDropEffects.Copy | DragDropEffects.Link | DragDropEffects.Move);
-            if ((result & DragDropEffects.Move) == DragDropEffects.Move)
-              Content[listViewItem.Index] = null;
+            if ((result & DragDropEffects.Move) == DragDropEffects.Move) {
+              foreach (ListViewItem listViewItem in itemsListView.SelectedItems.Cast<ListViewItem>().ToArray())
+                Content[listViewItem.Index] = null;
+            }
           }
         }
       }
     }
-    protected virtual void itemsListView_DragEnterOver(object sender, DragEventArgs e) {
+    protected virtual void itemsListView_DragEnter(object sender, DragEventArgs e) {
+      validDragOperation = !Content.IsReadOnly && !ReadOnly && e.Data.GetData("HeuristicLab") is T;
+    }
+    protected virtual void itemsListView_DragOver(object sender, DragEventArgs e) {
       e.Effect = DragDropEffects.None;
-      Type type = e.Data.GetData("Type") as Type;
-      if (!Content.IsReadOnly && !ReadOnly && (type != null) && (typeof(T).IsAssignableFrom(type))) {
+      if (validDragOperation) {
         Point p = itemsListView.PointToClient(new Point(e.X, e.Y));
         ListViewItem listViewItem = itemsListView.GetItemAt(p.X, p.Y);
@@ -299,7 +308,7 @@
           if ((e.KeyState & 32) == 32) e.Effect = DragDropEffects.Link;  // ALT key
           else if ((e.KeyState & 4) == 4) e.Effect = DragDropEffects.Move;  // SHIFT key
-          else if ((e.AllowedEffect & DragDropEffects.Copy) == DragDropEffects.Copy) e.Effect = DragDropEffects.Copy;
-          else if ((e.AllowedEffect & DragDropEffects.Move) == DragDropEffects.Move) e.Effect = DragDropEffects.Move;
-          else if ((e.AllowedEffect & DragDropEffects.Link) == DragDropEffects.Link) e.Effect = DragDropEffects.Link;
+          else if (e.AllowedEffect.HasFlag(DragDropEffects.Copy)) e.Effect = DragDropEffects.Copy;
+          else if (e.AllowedEffect.HasFlag(DragDropEffects.Move)) e.Effect = DragDropEffects.Move;
+          else if (e.AllowedEffect.HasFlag(DragDropEffects.Link)) e.Effect = DragDropEffects.Link;
         }
       }
@@ -307,10 +316,8 @@
     protected virtual void itemsListView_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();
-
         Point p = itemsListView.PointToClient(new Point(e.X, e.Y));
         ListViewItem listViewItem = itemsListView.GetItemAt(p.X, p.Y);
-        Content[listViewItem.Index] = item;
+        T item = e.Data.GetData("HeuristicLab") as T;
+        Content[listViewItem.Index] = e.Effect.HasFlag(DragDropEffects.Copy) ? (T)item.Clone() : item;
       }
     }
Index: trunk/sources/HeuristicLab.Core.Views/3.3/ItemCollectionView.Designer.cs
===================================================================
--- trunk/sources/HeuristicLab.Core.Views/3.3/ItemCollectionView.Designer.cs	(revision 5741)
+++ trunk/sources/HeuristicLab.Core.Views/3.3/ItemCollectionView.Designer.cs	(revision 5744)
@@ -102,6 +102,6 @@
       this.itemsListView.SelectedIndexChanged += new System.EventHandler(this.itemsListView_SelectedIndexChanged);
       this.itemsListView.DragDrop += new System.Windows.Forms.DragEventHandler(this.itemsListView_DragDrop);
-      this.itemsListView.DragEnter += new System.Windows.Forms.DragEventHandler(this.itemsListView_DragEnterOver);
-      this.itemsListView.DragOver += new System.Windows.Forms.DragEventHandler(this.itemsListView_DragEnterOver);
+      this.itemsListView.DragEnter += new System.Windows.Forms.DragEventHandler(this.itemsListView_DragEnter);
+      this.itemsListView.DragOver += new System.Windows.Forms.DragEventHandler(this.itemsListView_DragOver);
       this.itemsListView.DoubleClick += new System.EventHandler(this.itemsListView_DoubleClick);
       this.itemsListView.KeyDown += new System.Windows.Forms.KeyEventHandler(this.itemsListView_KeyDown);
Index: trunk/sources/HeuristicLab.Core.Views/3.3/ItemCollectionView.cs
===================================================================
--- trunk/sources/HeuristicLab.Core.Views/3.3/ItemCollectionView.cs	(revision 5741)
+++ trunk/sources/HeuristicLab.Core.Views/3.3/ItemCollectionView.cs	(revision 5744)
@@ -21,4 +21,5 @@
 
 using System;
+using System.Collections;
 using System.Collections.Generic;
 using System.Linq;
@@ -36,4 +37,5 @@
     protected Dictionary<T, List<ListViewItem>> itemListViewItemMapping;
     protected TypeSelectorDialog typeSelectorDialog;
+    protected bool validDragOperation;
 
     public new IItemCollection<T> Content {
@@ -243,36 +245,57 @@
     protected virtual void itemsListView_ItemDrag(object sender, ItemDragEventArgs e) {
       if (!Locked) {
-        ListViewItem listViewItem = (ListViewItem)e.Item;
-        T item = listViewItem.Tag as T;
-        if (item != null) {
+        List<T> items = new List<T>();
+        foreach (ListViewItem listViewItem in itemsListView.SelectedItems) {
+          T item = listViewItem.Tag as T;
+          if (item != null) items.Add(item);
+        }
+
+        if (items.Count > 0) {
           DataObject data = new DataObject();
-          data.SetData("Type", item.GetType());
-          data.SetData("Value", item);
+          if (items.Count == 1) data.SetData("HeuristicLab", items[0]);
+          else data.SetData("HeuristicLab", items);
           if (Content.IsReadOnly || ReadOnly) {
             DoDragDrop(data, DragDropEffects.Copy | DragDropEffects.Link);
           } else {
             DragDropEffects result = DoDragDrop(data, DragDropEffects.Copy | DragDropEffects.Link | DragDropEffects.Move);
-            if ((result & DragDropEffects.Move) == DragDropEffects.Move)
-              Content.Remove(item);
+            if ((result & DragDropEffects.Move) == DragDropEffects.Move) {
+              foreach (T item in items) Content.Remove(item);
+            }
           }
         }
       }
     }
-    protected virtual void itemsListView_DragEnterOver(object sender, DragEventArgs e) {
+    protected virtual void itemsListView_DragEnter(object sender, DragEventArgs e) {
+      validDragOperation = false;
+      if (e.Data.GetData("HeuristicLab") is T) {
+        validDragOperation = true;
+      } else if (e.Data.GetData("HeuristicLab") is IEnumerable) {
+        validDragOperation = true;
+        IEnumerable items = (IEnumerable)e.Data.GetData("HeuristicLab");
+        foreach (object item in items)
+          validDragOperation = validDragOperation && (item is T);
+      }
+      validDragOperation = validDragOperation && !Content.IsReadOnly && !ReadOnly;
+    }
+    protected virtual void itemsListView_DragOver(object sender, DragEventArgs e) {
       e.Effect = DragDropEffects.None;
-      Type type = e.Data.GetData("Type") as Type;
-      if (!Content.IsReadOnly && !ReadOnly && (type != null) && (typeof(T).IsAssignableFrom(type))) {
+      if (validDragOperation) {
         if ((e.KeyState & 32) == 32) e.Effect = DragDropEffects.Link;  // ALT key
         else if ((e.KeyState & 4) == 4) e.Effect = DragDropEffects.Move;  // SHIFT key
-        else if ((e.AllowedEffect & DragDropEffects.Copy) == DragDropEffects.Copy) e.Effect = DragDropEffects.Copy;
-        else if ((e.AllowedEffect & DragDropEffects.Move) == DragDropEffects.Move) e.Effect = DragDropEffects.Move;
-        else if ((e.AllowedEffect & DragDropEffects.Link) == DragDropEffects.Link) e.Effect = DragDropEffects.Link;
+        else if (e.AllowedEffect.HasFlag(DragDropEffects.Copy)) e.Effect = DragDropEffects.Copy;
+        else if (e.AllowedEffect.HasFlag(DragDropEffects.Move)) e.Effect = DragDropEffects.Move;
+        else if (e.AllowedEffect.HasFlag(DragDropEffects.Link)) e.Effect = DragDropEffects.Link;
       }
     }
     protected virtual void itemsListView_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();
-        Content.Add(item);
+        if (e.Data.GetData("HeuristicLab") is T) {
+          T item = (T)e.Data.GetData("HeuristicLab");
+          Content.Add(e.Effect.HasFlag(DragDropEffects.Copy) ? (T)item.Clone() : item);
+        } else if (e.Data.GetData("HeuristicLab") is IEnumerable) {
+          IEnumerable<T> items = ((IEnumerable)e.Data.GetData("HeuristicLab")).Cast<T>();
+          foreach (T item in items)
+            Content.Add(e.Effect.HasFlag(DragDropEffects.Copy) ? (T)item.Clone() : item);
+        }
       }
     }
Index: trunk/sources/HeuristicLab.Core.Views/3.3/ItemListView.Designer.cs
===================================================================
--- trunk/sources/HeuristicLab.Core.Views/3.3/ItemListView.Designer.cs	(revision 5741)
+++ trunk/sources/HeuristicLab.Core.Views/3.3/ItemListView.Designer.cs	(revision 5744)
@@ -151,6 +151,6 @@
       this.itemsListView.SelectedIndexChanged += new System.EventHandler(this.itemsListView_SelectedIndexChanged);
       this.itemsListView.DragDrop += new System.Windows.Forms.DragEventHandler(this.itemsListView_DragDrop);
-      this.itemsListView.DragEnter += new System.Windows.Forms.DragEventHandler(this.itemsListView_DragEnterOver);
-      this.itemsListView.DragOver += new System.Windows.Forms.DragEventHandler(this.itemsListView_DragEnterOver);
+      this.itemsListView.DragEnter += new System.Windows.Forms.DragEventHandler(this.itemsListView_DragEnter);
+      this.itemsListView.DragOver += new System.Windows.Forms.DragEventHandler(this.itemsListView_DragOver);
       this.itemsListView.DoubleClick += new System.EventHandler(this.itemsListView_DoubleClick);
       this.itemsListView.KeyDown += new System.Windows.Forms.KeyEventHandler(this.itemsListView_KeyDown);
Index: trunk/sources/HeuristicLab.Core.Views/3.3/ItemListView.cs
===================================================================
--- trunk/sources/HeuristicLab.Core.Views/3.3/ItemListView.cs	(revision 5741)
+++ trunk/sources/HeuristicLab.Core.Views/3.3/ItemListView.cs	(revision 5744)
@@ -21,4 +21,5 @@
 
 using System;
+using System.Collections;
 using System.Collections.Generic;
 using System.Drawing;
@@ -37,4 +38,5 @@
     protected Dictionary<T, List<ListViewItem>> itemListViewItemMapping;
     protected TypeSelectorDialog typeSelectorDialog;
+    protected bool validDragOperation;
 
     public new IItemList<T> Content {
@@ -277,40 +279,65 @@
     protected virtual void itemsListView_ItemDrag(object sender, ItemDragEventArgs e) {
       if (!Locked) {
-        ListViewItem listViewItem = (ListViewItem)e.Item;
-        T item = listViewItem.Tag as T;
-        if (item != null) {
+        List<T> items = new List<T>();
+        foreach (ListViewItem listViewItem in itemsListView.SelectedItems) {
+          T item = listViewItem.Tag as T;
+          if (item != null) items.Add(item);
+        }
+
+        if (items.Count > 0) {
           DataObject data = new DataObject();
-          data.SetData("Type", item.GetType());
-          data.SetData("Value", item);
+          if (items.Count == 1) data.SetData("HeuristicLab", items[0]);
+          else data.SetData("HeuristicLab", items);
           if (Content.IsReadOnly || ReadOnly) {
             DoDragDrop(data, DragDropEffects.Copy | DragDropEffects.Link);
           } else {
             DragDropEffects result = DoDragDrop(data, DragDropEffects.Copy | DragDropEffects.Link | DragDropEffects.Move);
-            if ((result & DragDropEffects.Move) == DragDropEffects.Move)
-              Content.RemoveAt(listViewItem.Index);
+            if ((result & DragDropEffects.Move) == DragDropEffects.Move) {
+              foreach (ListViewItem listViewItem in itemsListView.SelectedItems.Cast<ListViewItem>().ToArray()) {
+                if (listViewItem.Tag != null) Content.RemoveAt(listViewItem.Index);
+              }
+            }
           }
         }
       }
     }
-    protected virtual void itemsListView_DragEnterOver(object sender, DragEventArgs e) {
+    protected virtual void itemsListView_DragEnter(object sender, DragEventArgs e) {
+      validDragOperation = false;
+      if (e.Data.GetData("HeuristicLab") is T) {
+        validDragOperation = true;
+      } else if (e.Data.GetData("HeuristicLab") is IEnumerable) {
+        validDragOperation = true;
+        IEnumerable items = (IEnumerable)e.Data.GetData("HeuristicLab");
+        foreach (object item in items)
+          validDragOperation = validDragOperation && (item is T);
+      }
+      validDragOperation = validDragOperation && !Content.IsReadOnly && !ReadOnly;
+    }
+    protected virtual void itemsListView_DragOver(object sender, DragEventArgs e) {
       e.Effect = DragDropEffects.None;
-      Type type = e.Data.GetData("Type") as Type;
-      if (!Content.IsReadOnly && !ReadOnly && (type != null) && (typeof(T).IsAssignableFrom(type))) {
+      if (validDragOperation) {
         if ((e.KeyState & 32) == 32) e.Effect = DragDropEffects.Link;  // ALT key
         else if ((e.KeyState & 4) == 4) e.Effect = DragDropEffects.Move;  // SHIFT key
-        else if ((e.AllowedEffect & DragDropEffects.Copy) == DragDropEffects.Copy) e.Effect = DragDropEffects.Copy;
-        else if ((e.AllowedEffect & DragDropEffects.Move) == DragDropEffects.Move) e.Effect = DragDropEffects.Move;
-        else if ((e.AllowedEffect & DragDropEffects.Link) == DragDropEffects.Link) e.Effect = DragDropEffects.Link;
+        else if (e.AllowedEffect.HasFlag(DragDropEffects.Copy)) e.Effect = DragDropEffects.Copy;
+        else if (e.AllowedEffect.HasFlag(DragDropEffects.Move)) e.Effect = DragDropEffects.Move;
+        else if (e.AllowedEffect.HasFlag(DragDropEffects.Link)) e.Effect = DragDropEffects.Link;
       }
     }
     protected virtual void itemsListView_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();
-
         Point p = itemsListView.PointToClient(new Point(e.X, e.Y));
         ListViewItem listViewItem = itemsListView.GetItemAt(p.X, p.Y);
-        if (listViewItem != null) Content.Insert(listViewItem.Index, item);
-        else Content.Add(item);
+
+        if (e.Data.GetData("HeuristicLab") is T) {
+          T item = (T)e.Data.GetData("HeuristicLab");
+          if (listViewItem != null) Content.Insert(listViewItem.Index, e.Effect.HasFlag(DragDropEffects.Copy) ? (T)item.Clone() : item);
+          else Content.Add(e.Effect.HasFlag(DragDropEffects.Copy) ? (T)item.Clone() : item);
+        } else if (e.Data.GetData("HeuristicLab") is IEnumerable) {
+          IEnumerable<T> items = ((IEnumerable)e.Data.GetData("HeuristicLab")).Cast<T>();
+          foreach (T item in items) {
+            if (listViewItem != null) Content.Insert(listViewItem.Index, e.Effect.HasFlag(DragDropEffects.Copy) ? (T)item.Clone() : item);
+            else Content.Add(e.Effect.HasFlag(DragDropEffects.Copy) ? (T)item.Clone() : item);
+          }
+        }
       }
     }
Index: trunk/sources/HeuristicLab.Core.Views/3.3/ItemSetView.cs
===================================================================
--- trunk/sources/HeuristicLab.Core.Views/3.3/ItemSetView.cs	(revision 5741)
+++ trunk/sources/HeuristicLab.Core.Views/3.3/ItemSetView.cs	(revision 5744)
@@ -20,4 +20,5 @@
 #endregion
 
+using System.Collections;
 using System.Windows.Forms;
 using HeuristicLab.MainForm;
@@ -28,4 +29,6 @@
   [Content(typeof(IItemSet<>), false)]
   public partial class ItemSetView<T> : ItemCollectionView<T> where T : class, IItem {
+    protected bool draggedItemsAlreadyContained;
+
     public new IItemSet<T> Content {
       get { return (IItemSet<T>)base.Content; }
@@ -37,9 +40,25 @@
     }
 
-    protected override void itemsListView_DragEnterOver(object sender, DragEventArgs e) {
-      base.itemsListView_DragEnterOver(sender, e);
-      if (e.Effect == DragDropEffects.Link || e.Effect == DragDropEffects.Move) {
-        T item = e.Data.GetData("Value") as T;
-        if (Content.Contains(item)) e.Effect = DragDropEffects.None;
+    protected override void itemsListView_DragEnter(object sender, DragEventArgs e) {
+      base.itemsListView_DragEnter(sender, e);
+      draggedItemsAlreadyContained = false;
+      if (validDragOperation) {
+        if (e.Data.GetData("HeuristicLab") is T) {
+          draggedItemsAlreadyContained = Content.Contains((T)e.Data.GetData("HeuristicLab"));
+        } else if (e.Data.GetData("HeuristicLab") is IEnumerable) {
+          IEnumerable items = (IEnumerable)e.Data.GetData("HeuristicLab");
+          foreach (object item in items)
+            draggedItemsAlreadyContained = draggedItemsAlreadyContained || Content.Contains((T)item);
+        }
+      }
+    }
+    protected override void itemsListView_DragOver(object sender, DragEventArgs e) {
+      e.Effect = DragDropEffects.None;
+      if (validDragOperation) {
+        if (((e.KeyState & 32) == 32) && !draggedItemsAlreadyContained) e.Effect = DragDropEffects.Link;  // ALT key
+        else if (((e.KeyState & 4) == 4) && !draggedItemsAlreadyContained) e.Effect = DragDropEffects.Move;  // SHIFT key
+        else if (e.AllowedEffect.HasFlag(DragDropEffects.Copy)) e.Effect = DragDropEffects.Copy;
+        else if (e.AllowedEffect.HasFlag(DragDropEffects.Move) && !draggedItemsAlreadyContained) e.Effect = DragDropEffects.Move;
+        else if (e.AllowedEffect.HasFlag(DragDropEffects.Link) && !draggedItemsAlreadyContained) e.Effect = DragDropEffects.Link;
       }
     }
Index: trunk/sources/HeuristicLab.Core.Views/3.3/NamedItemCollectionView.cs
===================================================================
--- trunk/sources/HeuristicLab.Core.Views/3.3/NamedItemCollectionView.cs	(revision 5741)
+++ trunk/sources/HeuristicLab.Core.Views/3.3/NamedItemCollectionView.cs	(revision 5744)
@@ -20,4 +20,7 @@
 #endregion
 
+using System.Collections;
+using System.Collections.Generic;
+using System.Linq;
 using System.Windows.Forms;
 using HeuristicLab.Collections;
@@ -75,10 +78,14 @@
 
     #region ListView Events
-    protected override void itemsListView_DragEnterOver(object sender, DragEventArgs e) {
-      base.itemsListView_DragEnterOver(sender, e);
-      if (e.Effect != DragDropEffects.None) {
-        T item = e.Data.GetData("Value") as T;
-        if ((item == null) || (Content.ContainsKey(item.Name)))
-          e.Effect = DragDropEffects.None;
+    protected override void itemsListView_DragEnter(object sender, DragEventArgs e) {
+      base.itemsListView_DragEnter(sender, e);
+      if (validDragOperation) {
+        if (e.Data.GetData("HeuristicLab") is T) {
+          validDragOperation = validDragOperation && !Content.ContainsKey(((T)e.Data.GetData("HeuristicLab")).Name);
+        } else if (e.Data.GetData("HeuristicLab") is IEnumerable) {
+          IEnumerable<T> items = ((IEnumerable)e.Data.GetData("HeuristicLab")).Cast<T>();
+          foreach (T item in items)
+            validDragOperation = validDragOperation && !Content.ContainsKey(item.Name);
+        }
       }
     }
Index: trunk/sources/HeuristicLab.Core.Views/3.3/OperatorTreeView.cs
===================================================================
--- trunk/sources/HeuristicLab.Core.Views/3.3/OperatorTreeView.cs	(revision 5741)
+++ trunk/sources/HeuristicLab.Core.Views/3.3/OperatorTreeView.cs	(revision 5744)
@@ -353,6 +353,5 @@
         IOperator op = GetOperatorTag(node);
         DataObject data = new DataObject();
-        data.SetData("Type", op.GetType());
-        data.SetData("Value", op);
+        data.SetData("HeuristicLab", op);
         if (ReadOnly || (opParam == null)) {
           DoDragDrop(data, DragDropEffects.Copy | DragDropEffects.Link);
@@ -366,6 +365,5 @@
     private void graphTreeView_DragEnterOver(object sender, DragEventArgs e) {
       e.Effect = DragDropEffects.None;
-      Type type = e.Data.GetData("Type") as Type;
-      if (!ReadOnly && (type != null) && (typeof(IOperator).IsAssignableFrom(type))) {
+      if (!ReadOnly && (e.Data.GetData("HeuristicLab") is IOperator)) {
         TreeNode node = graphTreeView.GetNodeAt(graphTreeView.PointToClient(new Point(e.X, e.Y)));
         if ((node != null) && !node.IsExpanded) node.Expand();
@@ -373,7 +371,7 @@
           if ((e.KeyState & 8) == 8) e.Effect = DragDropEffects.Copy;  // CTRL key
           else if ((e.KeyState & 4) == 4) e.Effect = DragDropEffects.Move;  // SHIFT key
-          else if ((e.AllowedEffect & DragDropEffects.Link) == DragDropEffects.Link) e.Effect = DragDropEffects.Link;
-          else if ((e.AllowedEffect & DragDropEffects.Copy) == DragDropEffects.Copy) e.Effect = DragDropEffects.Copy;
-          else if ((e.AllowedEffect & DragDropEffects.Move) == DragDropEffects.Move) e.Effect = DragDropEffects.Move;
+          else if (e.AllowedEffect.HasFlag(DragDropEffects.Link)) e.Effect = DragDropEffects.Link;
+          else if (e.AllowedEffect.HasFlag(DragDropEffects.Copy)) e.Effect = DragDropEffects.Copy;
+          else if (e.AllowedEffect.HasFlag(DragDropEffects.Move)) e.Effect = DragDropEffects.Move;
         }
       }
@@ -381,6 +379,6 @@
     private void graphTreeView_DragDrop(object sender, DragEventArgs e) {
       if (e.Effect != DragDropEffects.None) {
-        IOperator op = e.Data.GetData("Value") as IOperator;
-        if ((e.Effect & DragDropEffects.Copy) == DragDropEffects.Copy) op = (IOperator)op.Clone();
+        IOperator op = e.Data.GetData("HeuristicLab") as IOperator;
+        if (e.Effect.HasFlag(DragDropEffects.Copy)) op = (IOperator)op.Clone();
         TreeNode node = graphTreeView.GetNodeAt(graphTreeView.PointToClient(new Point(e.X, e.Y)));
         IValueParameter opParam = GetOperatorParameterTag(node);
Index: trunk/sources/HeuristicLab.Core.Views/3.3/ScopeView.cs
===================================================================
--- trunk/sources/HeuristicLab.Core.Views/3.3/ScopeView.cs	(revision 5741)
+++ trunk/sources/HeuristicLab.Core.Views/3.3/ScopeView.cs	(revision 5744)
@@ -168,6 +168,5 @@
         if (scope != null) {
           DataObject data = new DataObject();
-          data.SetData("Type", scope.GetType());
-          data.SetData("Value", scope);
+          data.SetData("HeuristicLab", scope);
           DoDragDrop(data, DragDropEffects.Copy | DragDropEffects.Link);
         }
Index: trunk/sources/HeuristicLab.Core.Views/3.3/TypeSelector.cs
===================================================================
--- trunk/sources/HeuristicLab.Core.Views/3.3/TypeSelector.cs	(revision 5741)
+++ trunk/sources/HeuristicLab.Core.Views/3.3/TypeSelector.cs	(revision 5744)
@@ -137,5 +137,6 @@
                   imageList.Images.Add(type.FullName, item.ItemImage);
                   typeNode.ImageIndex = imageList.Images.IndexOfKey(type.FullName);
-                } catch (Exception) { }
+                }
+                catch (Exception) { }
               }
               typeNode.SelectedImageIndex = typeNode.ImageIndex;
@@ -317,6 +318,5 @@
         object o = Activator.CreateInstance(type);
         DataObject data = new DataObject();
-        data.SetData("Type", type);
-        data.SetData("Value", o);
+        data.SetData("HeuristicLab", o);
         DoDragDrop(data, DragDropEffects.Copy);
       }
Index: trunk/sources/HeuristicLab.Core.Views/3.3/VariableValueView.cs
===================================================================
--- trunk/sources/HeuristicLab.Core.Views/3.3/VariableValueView.cs	(revision 5741)
+++ trunk/sources/HeuristicLab.Core.Views/3.3/VariableValueView.cs	(revision 5744)
@@ -88,17 +88,16 @@
     protected virtual void VariableValueView_DragEnterOver(object sender, DragEventArgs e) {
       e.Effect = DragDropEffects.None;
-      Type type = e.Data.GetData("Type") as Type;
-      if (!ReadOnly && (type != null) && (typeof(IItem).IsAssignableFrom(type))) {
+      if (!ReadOnly && (e.Data.GetData("HeuristicLab") is IItem)) {
         if ((e.KeyState & 32) == 32) e.Effect = DragDropEffects.Link;  // ALT key
         else if ((e.KeyState & 4) == 4) e.Effect = DragDropEffects.Move;  // SHIFT key
-        else if ((e.AllowedEffect & DragDropEffects.Copy) == DragDropEffects.Copy) e.Effect = DragDropEffects.Copy;
-        else if ((e.AllowedEffect & DragDropEffects.Move) == DragDropEffects.Move) e.Effect = DragDropEffects.Move;
-        else if ((e.AllowedEffect & DragDropEffects.Link) == DragDropEffects.Link) e.Effect = DragDropEffects.Link;
+        else if (e.AllowedEffect.HasFlag(DragDropEffects.Copy)) e.Effect = DragDropEffects.Copy;
+        else if (e.AllowedEffect.HasFlag(DragDropEffects.Move)) e.Effect = DragDropEffects.Move;
+        else if (e.AllowedEffect.HasFlag(DragDropEffects.Link)) e.Effect = DragDropEffects.Link;
       }
     }
     protected virtual void VariableValueView_DragDrop(object sender, DragEventArgs e) {
       if (e.Effect != DragDropEffects.None) {
-        IItem item = e.Data.GetData("Value") as IItem;
-        if ((e.Effect & DragDropEffects.Copy) == DragDropEffects.Copy) item = (IItem)item.Clone();
+        IItem item = e.Data.GetData("HeuristicLab") as IItem;
+        if (e.Effect.HasFlag(DragDropEffects.Copy)) item = (IItem)item.Clone();
         Content.Value = item;
       }
Index: trunk/sources/HeuristicLab.Core.Views/3.3/VariableView.cs
===================================================================
--- trunk/sources/HeuristicLab.Core.Views/3.3/VariableView.cs	(revision 5741)
+++ trunk/sources/HeuristicLab.Core.Views/3.3/VariableView.cs	(revision 5744)
@@ -135,17 +135,16 @@
     protected virtual void valuePanel_DragEnterOver(object sender, DragEventArgs e) {
       e.Effect = DragDropEffects.None;
-      Type type = e.Data.GetData("Type") as Type;
-      if (!ReadOnly && (type != null) && (typeof(IItem).IsAssignableFrom(type))) {
+      if (!ReadOnly && (e.Data.GetData("HeuristicLab") is IItem)) {
         if ((e.KeyState & 32) == 32) e.Effect = DragDropEffects.Link;  // ALT key
         else if ((e.KeyState & 4) == 4) e.Effect = DragDropEffects.Move;  // SHIFT key
-        else if ((e.AllowedEffect & DragDropEffects.Copy) == DragDropEffects.Copy) e.Effect = DragDropEffects.Copy;
-        else if ((e.AllowedEffect & DragDropEffects.Move) == DragDropEffects.Move) e.Effect = DragDropEffects.Move;
-        else if ((e.AllowedEffect & DragDropEffects.Link) == DragDropEffects.Link) e.Effect = DragDropEffects.Link;
+        else if (e.AllowedEffect.HasFlag(DragDropEffects.Copy)) e.Effect = DragDropEffects.Copy;
+        else if (e.AllowedEffect.HasFlag(DragDropEffects.Move)) e.Effect = DragDropEffects.Move;
+        else if (e.AllowedEffect.HasFlag(DragDropEffects.Link)) e.Effect = DragDropEffects.Link;
       }
     }
     protected virtual void valuePanel_DragDrop(object sender, DragEventArgs e) {
       if (e.Effect != DragDropEffects.None) {
-        IItem item = e.Data.GetData("Value") as IItem;
-        if ((e.Effect & DragDropEffects.Copy) == DragDropEffects.Copy) item = (IItem)item.Clone();
+        IItem item = e.Data.GetData("HeuristicLab") as IItem;
+        if (e.Effect.HasFlag(DragDropEffects.Copy)) item = (IItem)item.Clone();
         Content.Value = item;
       }
Index: trunk/sources/HeuristicLab.MainForm.WindowsForms/3.3/Controls/ViewHost.cs
===================================================================
--- trunk/sources/HeuristicLab.MainForm.WindowsForms/3.3/Controls/ViewHost.cs	(revision 5741)
+++ trunk/sources/HeuristicLab.MainForm.WindowsForms/3.3/Controls/ViewHost.cs	(revision 5744)
@@ -281,6 +281,5 @@
       if ((Control.MouseButtons & MouseButtons.Left) == MouseButtons.Left && startDragAndDrop) {
         DataObject data = new DataObject();
-        data.SetData("Type", Content.GetType());
-        data.SetData("Value", Content);
+        data.SetData("HeuristicLab", Content);
         DoDragDrop(data, DragDropEffects.Copy | DragDropEffects.Link);
       } else
Index: trunk/sources/HeuristicLab.Operators.Views.GraphVisualization/3.3/OperatorGraphVisualization/OperatorGraphView.cs
===================================================================
--- trunk/sources/HeuristicLab.Operators.Views.GraphVisualization/3.3/OperatorGraphVisualization/OperatorGraphView.cs	(revision 5741)
+++ trunk/sources/HeuristicLab.Operators.Views.GraphVisualization/3.3/OperatorGraphVisualization/OperatorGraphView.cs	(revision 5744)
@@ -204,11 +204,10 @@
     private void OperatorGraphView_DragEnterOver(object sender, DragEventArgs e) {
       e.Effect = DragDropEffects.None;
-      Type type = e.Data.GetData("Type") as Type;
-      if (!ReadOnly && (type != null) && (typeof(IOperator).IsAssignableFrom(type))) {
+      if (!ReadOnly && (e.Data.GetData("HeuristicLab") is IOperator)) {
         if ((e.KeyState & 32) == 32) e.Effect = DragDropEffects.Link;  // ALT key
         else if ((e.KeyState & 4) == 4) e.Effect = DragDropEffects.Move;  // SHIFT key
-        else if ((e.AllowedEffect & DragDropEffects.Copy) == DragDropEffects.Copy) e.Effect = DragDropEffects.Copy;
-        else if ((e.AllowedEffect & DragDropEffects.Move) == DragDropEffects.Move) e.Effect = DragDropEffects.Move;
-        else if ((e.AllowedEffect & DragDropEffects.Link) == DragDropEffects.Link) e.Effect = DragDropEffects.Link;
+        else if (e.AllowedEffect.HasFlag(DragDropEffects.Copy)) e.Effect = DragDropEffects.Copy;
+        else if (e.AllowedEffect.HasFlag(DragDropEffects.Move)) e.Effect = DragDropEffects.Move;
+        else if (e.AllowedEffect.HasFlag(DragDropEffects.Link)) e.Effect = DragDropEffects.Link;
       }
     }
@@ -216,6 +215,6 @@
     private void OperatorGraphView_DragDrop(object sender, DragEventArgs e) {
       if (e.Effect != DragDropEffects.None) {
-        IOperator op = e.Data.GetData("Value") as IOperator;
-        if ((e.Effect & DragDropEffects.Copy) == DragDropEffects.Copy) op = (IOperator)op.Clone();
+        IOperator op = e.Data.GetData("HeuristicLab") as IOperator;
+        if (e.Effect.HasFlag(DragDropEffects.Copy)) op = (IOperator)op.Clone();
         IOperatorShapeInfo shapeInfo = OperatorShapeInfoFactory.CreateOperatorShapeInfo(op);
         Point mouse = new Point(MousePosition.X, MousePosition.Y);
Index: trunk/sources/HeuristicLab.Optimization.Views/3.3/AlgorithmView.cs
===================================================================
--- trunk/sources/HeuristicLab.Optimization.Views/3.3/AlgorithmView.cs	(revision 5741)
+++ trunk/sources/HeuristicLab.Optimization.Views/3.3/AlgorithmView.cs	(revision 5744)
@@ -278,17 +278,16 @@
     protected virtual void problemTabPage_DragEnterOver(object sender, DragEventArgs e) {
       e.Effect = DragDropEffects.None;
-      Type type = e.Data.GetData("Type") as Type;
-      if ((type != null) && (Content.ProblemType.IsAssignableFrom(type))) {
+      if (!ReadOnly && (e.Data.GetData("HeuristicLab") != null) && Content.ProblemType.IsAssignableFrom(e.Data.GetData("HeuristicLab").GetType())) {
         if ((e.KeyState & 32) == 32) e.Effect = DragDropEffects.Link;  // ALT key
         else if ((e.KeyState & 4) == 4) e.Effect = DragDropEffects.Move;  // SHIFT key
-        else if ((e.AllowedEffect & DragDropEffects.Copy) == DragDropEffects.Copy) e.Effect = DragDropEffects.Copy;
-        else if ((e.AllowedEffect & DragDropEffects.Move) == DragDropEffects.Move) e.Effect = DragDropEffects.Move;
-        else if ((e.AllowedEffect & DragDropEffects.Link) == DragDropEffects.Link) e.Effect = DragDropEffects.Link;
+        else if (e.AllowedEffect.HasFlag(DragDropEffects.Copy)) e.Effect = DragDropEffects.Copy;
+        else if (e.AllowedEffect.HasFlag(DragDropEffects.Move)) e.Effect = DragDropEffects.Move;
+        else if (e.AllowedEffect.HasFlag(DragDropEffects.Link)) e.Effect = DragDropEffects.Link;
       }
     }
     protected virtual void problemTabPage_DragDrop(object sender, DragEventArgs e) {
       if (e.Effect != DragDropEffects.None) {
-        IProblem problem = e.Data.GetData("Value") as IProblem;
-        if ((e.Effect & DragDropEffects.Copy) == DragDropEffects.Copy) problem = (IProblem)problem.Clone();
+        IProblem problem = e.Data.GetData("HeuristicLab") as IProblem;
+        if (e.Effect.HasFlag(DragDropEffects.Copy)) problem = (IProblem)problem.Clone();
         Content.Problem = problem;
       }
Index: trunk/sources/HeuristicLab.Optimization.Views/3.3/BatchRunView.cs
===================================================================
--- trunk/sources/HeuristicLab.Optimization.Views/3.3/BatchRunView.cs	(revision 5741)
+++ trunk/sources/HeuristicLab.Optimization.Views/3.3/BatchRunView.cs	(revision 5744)
@@ -253,19 +253,16 @@
     private void optimizerTabPage_DragEnterOver(object sender, DragEventArgs e) {
       e.Effect = DragDropEffects.None;
-      if (ReadOnly)
-        return;
-      Type type = e.Data.GetData("Type") as Type;
-      if ((type != null) && (typeof(IOptimizer).IsAssignableFrom(type))) {
+      if (!ReadOnly && (e.Data.GetData("HeuristicLab") is IOptimizer)) {
         if ((e.KeyState & 32) == 32) e.Effect = DragDropEffects.Link;  // ALT key
         else if ((e.KeyState & 4) == 4) e.Effect = DragDropEffects.Move;  // SHIFT key
-        else if ((e.AllowedEffect & DragDropEffects.Copy) == DragDropEffects.Copy) e.Effect = DragDropEffects.Copy;
-        else if ((e.AllowedEffect & DragDropEffects.Move) == DragDropEffects.Move) e.Effect = DragDropEffects.Move;
-        else if ((e.AllowedEffect & DragDropEffects.Link) == DragDropEffects.Link) e.Effect = DragDropEffects.Link;
+        else if (e.AllowedEffect.HasFlag(DragDropEffects.Copy)) e.Effect = DragDropEffects.Copy;
+        else if (e.AllowedEffect.HasFlag(DragDropEffects.Move)) e.Effect = DragDropEffects.Move;
+        else if (e.AllowedEffect.HasFlag(DragDropEffects.Link)) e.Effect = DragDropEffects.Link;
       }
     }
     private void optimizerTabPage_DragDrop(object sender, DragEventArgs e) {
       if (e.Effect != DragDropEffects.None) {
-        IOptimizer optimizer = e.Data.GetData("Value") as IOptimizer;
-        if ((e.Effect & DragDropEffects.Copy) == DragDropEffects.Copy) optimizer = (IOptimizer)optimizer.Clone();
+        IOptimizer optimizer = e.Data.GetData("HeuristicLab") as IOptimizer;
+        if (e.Effect.HasFlag(DragDropEffects.Copy)) optimizer = (IOptimizer)optimizer.Clone();
         Content.Optimizer = optimizer;
       }
Index: trunk/sources/HeuristicLab.Optimization.Views/3.3/RunCollectionBubbleChartView.cs
===================================================================
--- trunk/sources/HeuristicLab.Optimization.Views/3.3/RunCollectionBubbleChartView.cs	(revision 5741)
+++ trunk/sources/HeuristicLab.Optimization.Views/3.3/RunCollectionBubbleChartView.cs	(revision 5744)
@@ -452,6 +452,5 @@
         if (this.draggedRun != null && h.ChartElementType != ChartElementType.DataPoint) {
           DataObject data = new DataObject();
-          data.SetData("Type", draggedRun.GetType());
-          data.SetData("Value", draggedRun);
+          data.SetData("HeuristicLab", draggedRun);
           if (ReadOnly)
             DoDragDrop(data, DragDropEffects.Copy | DragDropEffects.Link);
Index: trunk/sources/HeuristicLab.Optimization.Views/3.3/RunCollectionView.Designer.cs
===================================================================
--- trunk/sources/HeuristicLab.Optimization.Views/3.3/RunCollectionView.Designer.cs	(revision 5741)
+++ trunk/sources/HeuristicLab.Optimization.Views/3.3/RunCollectionView.Designer.cs	(revision 5744)
@@ -170,6 +170,6 @@
       this.itemsListView.SelectedIndexChanged += new System.EventHandler(this.itemsListView_SelectedIndexChanged);
       this.itemsListView.DragDrop += new System.Windows.Forms.DragEventHandler(this.itemsListView_DragDrop);
-      this.itemsListView.DragEnter += new System.Windows.Forms.DragEventHandler(this.itemsListView_DragEnterOver);
-      this.itemsListView.DragOver += new System.Windows.Forms.DragEventHandler(this.itemsListView_DragEnterOver);
+      this.itemsListView.DragEnter += new System.Windows.Forms.DragEventHandler(this.itemsListView_DragEnter);
+      this.itemsListView.DragOver += new System.Windows.Forms.DragEventHandler(this.itemsListView_DragOver);
       this.itemsListView.DoubleClick += new System.EventHandler(this.itemsListView_DoubleClick);
       this.itemsListView.KeyDown += new System.Windows.Forms.KeyEventHandler(this.itemsListView_KeyDown);
Index: trunk/sources/HeuristicLab.Optimization.Views/3.3/RunCollectionView.cs
===================================================================
--- trunk/sources/HeuristicLab.Optimization.Views/3.3/RunCollectionView.cs	(revision 5741)
+++ trunk/sources/HeuristicLab.Optimization.Views/3.3/RunCollectionView.cs	(revision 5744)
@@ -21,4 +21,5 @@
 
 using System;
+using System.Collections;
 using System.Collections.Generic;
 using System.Drawing;
@@ -37,4 +38,5 @@
   public sealed partial class RunCollectionView : ItemView {
     private Dictionary<IRun, List<ListViewItem>> itemListViewItemMapping;
+    private bool validDragOperation;
 
     public new IItemCollection<IRun> Content {
@@ -271,16 +273,11 @@
         if (items.Count > 0) {
           DataObject data = new DataObject();
-          if (items.Count == 1) {
-            data.SetData("Type", items[0].GetType());
-            data.SetData("Value", items[0]);
-          } else {
-            data.SetData("Type", typeof(IEnumerable<IRun>));
-            data.SetData("Value", items);
-          }
+          if (items.Count == 1) data.SetData("HeuristicLab", items[0]);
+          else data.SetData("HeuristicLab", items);
           if (Content.IsReadOnly || ReadOnly) {
             DoDragDrop(data, DragDropEffects.Copy | DragDropEffects.Link);
           } else {
             DragDropEffects result = DoDragDrop(data, DragDropEffects.Copy | DragDropEffects.Link | DragDropEffects.Move);
-            if ((result & DragDropEffects.Move) == DragDropEffects.Move) {
+            if (result.HasFlag(DragDropEffects.Move)) {
               foreach (IRun item in items) Content.Remove(item);
             }
@@ -289,27 +286,35 @@
       }
     }
-    private void itemsListView_DragEnterOver(object sender, DragEventArgs e) {
+    private void itemsListView_DragEnter(object sender, DragEventArgs e) {
+      validDragOperation = false;
+      if (e.Data.GetData("HeuristicLab") is IRun) {
+        validDragOperation = true;
+      } else if (e.Data.GetData("HeuristicLab") is IEnumerable) {
+        validDragOperation = true;
+        IEnumerable items = (IEnumerable)e.Data.GetData("HeuristicLab");
+        foreach (object item in items)
+          validDragOperation = validDragOperation && (item is IRun);
+      }
+      validDragOperation = validDragOperation && !Content.IsReadOnly && !ReadOnly;
+    }
+    private void itemsListView_DragOver(object sender, DragEventArgs e) {
       e.Effect = DragDropEffects.None;
-      Type type = e.Data.GetData("Type") as Type;
-      if (!Content.IsReadOnly && !ReadOnly && (type != null) && (typeof(IRun).IsAssignableFrom(type) || typeof(IEnumerable<IRun>).IsAssignableFrom(type))) {
+      if (validDragOperation) {
         if ((e.KeyState & 32) == 32) e.Effect = DragDropEffects.Link;  // ALT key
         else if ((e.KeyState & 4) == 4) e.Effect = DragDropEffects.Move;  // SHIFT key
-        else if ((e.AllowedEffect & DragDropEffects.Copy) == DragDropEffects.Copy) e.Effect = DragDropEffects.Copy;
-        else if ((e.AllowedEffect & DragDropEffects.Move) == DragDropEffects.Move) e.Effect = DragDropEffects.Move;
-        else if ((e.AllowedEffect & DragDropEffects.Link) == DragDropEffects.Link) e.Effect = DragDropEffects.Link;
+        else if (e.AllowedEffect.HasFlag(DragDropEffects.Copy)) e.Effect = DragDropEffects.Copy;
+        else if (e.AllowedEffect.HasFlag(DragDropEffects.Move)) e.Effect = DragDropEffects.Move;
+        else if (e.AllowedEffect.HasFlag(DragDropEffects.Link)) e.Effect = DragDropEffects.Link;
       }
     }
     private void itemsListView_DragDrop(object sender, DragEventArgs e) {
       if (e.Effect != DragDropEffects.None) {
-        object value = e.Data.GetData("Value");
-        IEnumerable<IRun> items = Enumerable.Empty<IRun>();
-        if (value is IRun)
-          items = new IRun[] { (IRun)value };
-        else if (value is IEnumerable<IRun>)
-          items = (IEnumerable<IRun>)value;
-
-        foreach (IRun item in items) {
-          if ((e.Effect & DragDropEffects.Copy) == DragDropEffects.Copy) Content.Add((IRun)item.Clone());
-          else Content.Add(item);
+        if (e.Data.GetData("HeuristicLab") is IRun) {
+          IRun item = (IRun)e.Data.GetData("HeuristicLab");
+          Content.Add(e.Effect.HasFlag(DragDropEffects.Copy) ? (IRun)item.Clone() : item);
+        } else if (e.Data.GetData("HeuristicLab") is IEnumerable) {
+          IEnumerable<IRun> items = ((IEnumerable)e.Data.GetData("HeuristicLab")).Cast<IRun>();
+          foreach (IRun item in items)
+            Content.Add(e.Effect.HasFlag(DragDropEffects.Copy) ? (IRun)item.Clone() : item);
         }
       }
Index: trunk/sources/HeuristicLab.Optimization.Views/3.3/RunView.cs
===================================================================
--- trunk/sources/HeuristicLab.Optimization.Views/3.3/RunView.cs	(revision 5741)
+++ trunk/sources/HeuristicLab.Optimization.Views/3.3/RunView.cs	(revision 5744)
@@ -149,6 +149,5 @@
         if (item != null) {
           DataObject data = new DataObject();
-          data.SetData("Type", item.GetType());
-          data.SetData("Value", item);
+          data.SetData("HeuristicLab", item);
           DragDropEffects result = DoDragDrop(data, DragDropEffects.Copy);
         }
Index: trunk/sources/HeuristicLab.Optimizer/3.3/StartPage.cs
===================================================================
--- trunk/sources/HeuristicLab.Optimizer/3.3/StartPage.cs	(revision 5741)
+++ trunk/sources/HeuristicLab.Optimizer/3.3/StartPage.cs	(revision 5744)
@@ -122,6 +122,5 @@
       IItem item = (IItem)listViewItem.Tag;
       DataObject data = new DataObject();
-      data.SetData("Type", item.GetType());
-      data.SetData("Value", item);
+      data.SetData("HeuristicLab", item);
       DragDropEffects result = DoDragDrop(data, DragDropEffects.Copy);
     }
Index: trunk/sources/HeuristicLab.Parameters.Views/3.3/ValueLookupParameterView.cs
===================================================================
--- trunk/sources/HeuristicLab.Parameters.Views/3.3/ValueLookupParameterView.cs	(revision 5741)
+++ trunk/sources/HeuristicLab.Parameters.Views/3.3/ValueLookupParameterView.cs	(revision 5744)
@@ -162,17 +162,16 @@
     protected virtual void valueGroupBox_DragEnterOver(object sender, DragEventArgs e) {
       e.Effect = DragDropEffects.None;
-      Type type = e.Data.GetData("Type") as Type;
-      if (!ReadOnly && (type != null) && (Content.DataType.IsAssignableFrom(type))) {
+      if (!ReadOnly && (e.Data.GetData("HeuristicLab") != null) && Content.DataType.IsAssignableFrom(e.Data.GetData("HeuristicLab").GetType())) {
         if ((e.KeyState & 32) == 32) e.Effect = DragDropEffects.Link;  // ALT key
         else if ((e.KeyState & 4) == 4) e.Effect = DragDropEffects.Move;  // SHIFT key
-        else if ((e.AllowedEffect & DragDropEffects.Copy) == DragDropEffects.Copy) e.Effect = DragDropEffects.Copy;
-        else if ((e.AllowedEffect & DragDropEffects.Move) == DragDropEffects.Move) e.Effect = DragDropEffects.Move;
-        else if ((e.AllowedEffect & DragDropEffects.Link) == DragDropEffects.Link) e.Effect = DragDropEffects.Link;
+        else if (e.AllowedEffect.HasFlag(DragDropEffects.Copy)) e.Effect = DragDropEffects.Copy;
+        else if (e.AllowedEffect.HasFlag(DragDropEffects.Move)) e.Effect = DragDropEffects.Move;
+        else if (e.AllowedEffect.HasFlag(DragDropEffects.Link)) e.Effect = DragDropEffects.Link;
       }
     }
     protected virtual void valueGroupBox_DragDrop(object sender, DragEventArgs e) {
       if (e.Effect != DragDropEffects.None) {
-        T value = e.Data.GetData("Value") as T;
-        if ((e.Effect & DragDropEffects.Copy) == DragDropEffects.Copy) value = (T)value.Clone();
+        T value = e.Data.GetData("HeuristicLab") as T;
+        if (e.Effect.HasFlag(DragDropEffects.Copy)) value = (T)value.Clone();
         Content.Value = value;
       }
Index: trunk/sources/HeuristicLab.Parameters.Views/3.3/ValueParameterView.cs
===================================================================
--- trunk/sources/HeuristicLab.Parameters.Views/3.3/ValueParameterView.cs	(revision 5741)
+++ trunk/sources/HeuristicLab.Parameters.Views/3.3/ValueParameterView.cs	(revision 5744)
@@ -148,17 +148,16 @@
     protected virtual void valueGroupBox_DragEnterOver(object sender, DragEventArgs e) {
       e.Effect = DragDropEffects.None;
-      Type type = e.Data.GetData("Type") as Type;
-      if (!ReadOnly && (type != null) && (Content.DataType.IsAssignableFrom(type))) {
+      if (!ReadOnly && (e.Data.GetData("HeuristicLab") != null) && Content.DataType.IsAssignableFrom(e.Data.GetData("HeuristicLab").GetType())) {
         if ((e.KeyState & 32) == 32) e.Effect = DragDropEffects.Link;  // ALT key
         else if ((e.KeyState & 4) == 4) e.Effect = DragDropEffects.Move;  // SHIFT key
-        else if ((e.AllowedEffect & DragDropEffects.Copy) == DragDropEffects.Copy) e.Effect = DragDropEffects.Copy;
-        else if ((e.AllowedEffect & DragDropEffects.Move) == DragDropEffects.Move) e.Effect = DragDropEffects.Move;
-        else if ((e.AllowedEffect & DragDropEffects.Link) == DragDropEffects.Link) e.Effect = DragDropEffects.Link;
+        else if (e.AllowedEffect.HasFlag(DragDropEffects.Copy)) e.Effect = DragDropEffects.Copy;
+        else if (e.AllowedEffect.HasFlag(DragDropEffects.Move)) e.Effect = DragDropEffects.Move;
+        else if (e.AllowedEffect.HasFlag(DragDropEffects.Link)) e.Effect = DragDropEffects.Link;
       }
     }
     protected virtual void valueGroupBox_DragDrop(object sender, DragEventArgs e) {
       if (e.Effect != DragDropEffects.None) {
-        T value = e.Data.GetData("Value") as T;
-        if ((e.Effect & DragDropEffects.Copy) == DragDropEffects.Copy) value = (T)value.Clone();
+        T value = e.Data.GetData("HeuristicLab") as T;
+        if (e.Effect.HasFlag(DragDropEffects.Copy)) value = (T)value.Clone();
         Content.Value = value;
       }
