Index: trunk/sources/HeuristicLab.Core.Views/3.3/Clipboard.Designer.cs
===================================================================
--- trunk/sources/HeuristicLab.Core.Views/3.3/Clipboard.Designer.cs	(revision 3298)
+++ trunk/sources/HeuristicLab.Core.Views/3.3/Clipboard.Designer.cs	(revision 3299)
@@ -83,5 +83,4 @@
       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);
@@ -178,5 +177,4 @@
       // saveButton
       // 
-      this.saveButton.Enabled = false;
       this.saveButton.Image = HeuristicLab.Common.Resources.VS2008ImageLibrary.Save;
       this.saveButton.Location = new System.Drawing.Point(120, 0);
Index: trunk/sources/HeuristicLab.Core.Views/3.3/Clipboard.cs
===================================================================
--- trunk/sources/HeuristicLab.Core.Views/3.3/Clipboard.cs	(revision 3298)
+++ trunk/sources/HeuristicLab.Core.Views/3.3/Clipboard.cs	(revision 3299)
@@ -101,5 +101,5 @@
           item.ToStringChanged += new EventHandler(Item_ToStringChanged);
           sortAscendingButton.Enabled = sortDescendingButton.Enabled = listView.Items.Count > 1;
-          saveButton.Enabled = listView.Items.Count > 0;
+          AdjustListViewColumnSizes();
         }
       }
@@ -114,5 +114,4 @@
           itemListViewItemTable.Remove(item);
           sortAscendingButton.Enabled = sortDescendingButton.Enabled = listView.Items.Count > 1;
-          saveButton.Enabled = listView.Items.Count > 0;
         }
       }
@@ -204,8 +203,4 @@
     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) {
@@ -294,4 +289,14 @@
         itemListViewItemTable[item].Text = item.ToString();
         listView.Sort();
+        AdjustListViewColumnSizes();
+      }
+    }
+    #endregion
+
+    #region Helpers
+    private void AdjustListViewColumnSizes() {
+      if (listView.Items.Count > 0) {
+        for (int i = 0; i < listView.Columns.Count; i++)
+          listView.Columns[i].AutoResize(ColumnHeaderAutoResizeStyle.ColumnContent);
       }
     }
Index: trunk/sources/HeuristicLab.Optimization.Views/3.3/AlgorithmView.Designer.cs
===================================================================
--- trunk/sources/HeuristicLab.Optimization.Views/3.3/AlgorithmView.Designer.cs	(revision 3298)
+++ trunk/sources/HeuristicLab.Optimization.Views/3.3/AlgorithmView.Designer.cs	(revision 3299)
@@ -50,10 +50,13 @@
       this.parameterCollectionView = new HeuristicLab.Core.Views.ParameterCollectionView();
       this.problemTabPage = new System.Windows.Forms.TabPage();
+      this.problemPanel = new System.Windows.Forms.Panel();
+      this.problemViewHost = new HeuristicLab.MainForm.WindowsForms.ViewHost();
       this.saveProblemButton = new System.Windows.Forms.Button();
       this.openProblemButton = new System.Windows.Forms.Button();
       this.newProblemButton = new System.Windows.Forms.Button();
-      this.problemViewHost = new HeuristicLab.MainForm.WindowsForms.ViewHost();
       this.resultsTabPage = new System.Windows.Forms.TabPage();
       this.resultsView = new HeuristicLab.Optimization.Views.ResultCollectionView();
+      this.runsTabPage = new System.Windows.Forms.TabPage();
+      this.runsView = new HeuristicLab.Optimization.Views.RunCollectionView();
       this.startButton = new System.Windows.Forms.Button();
       this.pauseButton = new System.Windows.Forms.Button();
@@ -64,10 +67,9 @@
       this.saveFileDialog = new System.Windows.Forms.SaveFileDialog();
       this.stopButton = new System.Windows.Forms.Button();
-      this.runsTabPage = new System.Windows.Forms.TabPage();
-      this.runsView = new HeuristicLab.Optimization.Views.RunCollectionView();
       ((System.ComponentModel.ISupportInitialize)(this.errorProvider)).BeginInit();
       this.tabControl.SuspendLayout();
       this.parametersTabPage.SuspendLayout();
       this.problemTabPage.SuspendLayout();
+      this.problemPanel.SuspendLayout();
       this.resultsTabPage.SuspendLayout();
       this.runsTabPage.SuspendLayout();
@@ -124,8 +126,8 @@
       // problemTabPage
       // 
+      this.problemTabPage.Controls.Add(this.problemPanel);
       this.problemTabPage.Controls.Add(this.saveProblemButton);
       this.problemTabPage.Controls.Add(this.openProblemButton);
       this.problemTabPage.Controls.Add(this.newProblemButton);
-      this.problemTabPage.Controls.Add(this.problemViewHost);
       this.problemTabPage.Location = new System.Drawing.Point(4, 22);
       this.problemTabPage.Name = "problemTabPage";
@@ -135,4 +137,29 @@
       this.problemTabPage.Text = "Problem";
       this.problemTabPage.UseVisualStyleBackColor = true;
+      // 
+      // problemPanel
+      // 
+      this.problemPanel.AllowDrop = true;
+      this.problemPanel.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.problemPanel.Controls.Add(this.problemViewHost);
+      this.problemPanel.Location = new System.Drawing.Point(6, 36);
+      this.problemPanel.Name = "problemPanel";
+      this.problemPanel.Size = new System.Drawing.Size(659, 332);
+      this.problemPanel.TabIndex = 3;
+      this.problemPanel.DragOver += new System.Windows.Forms.DragEventHandler(this.problemPanel_DragEnterOver);
+      this.problemPanel.DragDrop += new System.Windows.Forms.DragEventHandler(this.problemPanel_DragDrop);
+      this.problemPanel.DragEnter += new System.Windows.Forms.DragEventHandler(this.problemPanel_DragEnterOver);
+      // 
+      // problemViewHost
+      // 
+      this.problemViewHost.Content = null;
+      this.problemViewHost.Dock = System.Windows.Forms.DockStyle.Fill;
+      this.problemViewHost.Location = new System.Drawing.Point(0, 0);
+      this.problemViewHost.Name = "problemViewHost";
+      this.problemViewHost.Size = new System.Drawing.Size(659, 332);
+      this.problemViewHost.TabIndex = 0;
+      this.problemViewHost.ViewType = null;
       // 
       // saveProblemButton
@@ -169,16 +196,4 @@
       this.newProblemButton.Click += new System.EventHandler(this.newProblemButton_Click);
       // 
-      // problemViewHost
-      // 
-      this.problemViewHost.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.problemViewHost.Content = null;
-      this.problemViewHost.Location = new System.Drawing.Point(6, 36);
-      this.problemViewHost.Name = "problemViewHost";
-      this.problemViewHost.Size = new System.Drawing.Size(659, 332);
-      this.problemViewHost.TabIndex = 3;
-      this.problemViewHost.ViewType = null;
-      // 
       // resultsTabPage
       // 
@@ -203,4 +218,27 @@
       this.resultsView.Size = new System.Drawing.Size(659, 362);
       this.resultsView.TabIndex = 0;
+      // 
+      // runsTabPage
+      // 
+      this.runsTabPage.Controls.Add(this.runsView);
+      this.runsTabPage.Location = new System.Drawing.Point(4, 22);
+      this.runsTabPage.Name = "runsTabPage";
+      this.runsTabPage.Padding = new System.Windows.Forms.Padding(3);
+      this.runsTabPage.Size = new System.Drawing.Size(671, 374);
+      this.runsTabPage.TabIndex = 3;
+      this.runsTabPage.Text = "Runs";
+      this.runsTabPage.UseVisualStyleBackColor = true;
+      // 
+      // runsView
+      // 
+      this.runsView.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.runsView.Caption = "RunCollection";
+      this.runsView.Content = null;
+      this.runsView.Location = new System.Drawing.Point(6, 6);
+      this.runsView.Name = "runsView";
+      this.runsView.Size = new System.Drawing.Size(659, 362);
+      this.runsView.TabIndex = 0;
       // 
       // startButton
@@ -285,27 +323,4 @@
       this.stopButton.UseVisualStyleBackColor = true;
       this.stopButton.Click += new System.EventHandler(this.stopButton_Click);
-      // 
-      // runsTabPage
-      // 
-      this.runsTabPage.Controls.Add(this.runsView);
-      this.runsTabPage.Location = new System.Drawing.Point(4, 22);
-      this.runsTabPage.Name = "runsTabPage";
-      this.runsTabPage.Padding = new System.Windows.Forms.Padding(3);
-      this.runsTabPage.Size = new System.Drawing.Size(671, 374);
-      this.runsTabPage.TabIndex = 3;
-      this.runsTabPage.Text = "Runs";
-      this.runsTabPage.UseVisualStyleBackColor = true;
-      // 
-      // runsView
-      // 
-      this.runsView.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.runsView.Caption = "RunCollection";
-      this.runsView.Content = null;
-      this.runsView.Location = new System.Drawing.Point(6, 6);
-      this.runsView.Name = "runsView";
-      this.runsView.Size = new System.Drawing.Size(659, 362);
-      this.runsView.TabIndex = 0;
       // 
       // AlgorithmView
@@ -337,4 +352,5 @@
       this.parametersTabPage.ResumeLayout(false);
       this.problemTabPage.ResumeLayout(false);
+      this.problemPanel.ResumeLayout(false);
       this.resultsTabPage.ResumeLayout(false);
       this.runsTabPage.ResumeLayout(false);
@@ -366,4 +382,5 @@
     protected System.Windows.Forms.TabPage runsTabPage;
     protected RunCollectionView runsView;
+    protected System.Windows.Forms.Panel problemPanel;
 
   }
Index: trunk/sources/HeuristicLab.Optimization.Views/3.3/AlgorithmView.cs
===================================================================
--- trunk/sources/HeuristicLab.Optimization.Views/3.3/AlgorithmView.cs	(revision 3298)
+++ trunk/sources/HeuristicLab.Optimization.Views/3.3/AlgorithmView.cs	(revision 3299)
@@ -163,5 +163,5 @@
     #endregion
 
-    #region Button events
+    #region Control Events
     protected virtual void newProblemButton_Click(object sender, EventArgs e) {
       if (problemTypeSelectorDialog == null) {
@@ -247,4 +247,22 @@
       }
     }
+    protected virtual void problemPanel_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 ((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;
+      }
+    }
+    protected virtual void problemPanel_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();
+        Content.Problem = problem;
+      }
+    }
     #endregion
 
Index: trunk/sources/HeuristicLab.Optimization.Views/3.3/BatchRunView.Designer.cs
===================================================================
--- trunk/sources/HeuristicLab.Optimization.Views/3.3/BatchRunView.Designer.cs	(revision 3298)
+++ trunk/sources/HeuristicLab.Optimization.Views/3.3/BatchRunView.Designer.cs	(revision 3299)
@@ -48,8 +48,9 @@
       this.tabControl = new System.Windows.Forms.TabControl();
       this.algorithmTabPage = new System.Windows.Forms.TabPage();
+      this.algorithmPanel = new System.Windows.Forms.Panel();
+      this.algorithmViewHost = new HeuristicLab.MainForm.WindowsForms.ViewHost();
       this.saveAlgorithmButton = new System.Windows.Forms.Button();
       this.openAlgorithmButton = new System.Windows.Forms.Button();
       this.newAlgorithmButton = new System.Windows.Forms.Button();
-      this.algorithmViewHost = new HeuristicLab.MainForm.WindowsForms.ViewHost();
       this.runsTabPage = new System.Windows.Forms.TabPage();
       this.runsView = new HeuristicLab.Optimization.Views.RunCollectionView();
@@ -67,4 +68,5 @@
       this.tabControl.SuspendLayout();
       this.algorithmTabPage.SuspendLayout();
+      this.algorithmPanel.SuspendLayout();
       this.runsTabPage.SuspendLayout();
       ((System.ComponentModel.ISupportInitialize)(this.repetitionsNumericUpDown)).BeginInit();
@@ -96,8 +98,8 @@
       // algorithmTabPage
       // 
+      this.algorithmTabPage.Controls.Add(this.algorithmPanel);
       this.algorithmTabPage.Controls.Add(this.saveAlgorithmButton);
       this.algorithmTabPage.Controls.Add(this.openAlgorithmButton);
       this.algorithmTabPage.Controls.Add(this.newAlgorithmButton);
-      this.algorithmTabPage.Controls.Add(this.algorithmViewHost);
       this.algorithmTabPage.Location = new System.Drawing.Point(4, 22);
       this.algorithmTabPage.Name = "algorithmTabPage";
@@ -107,4 +109,29 @@
       this.algorithmTabPage.Text = "Algorithm";
       this.algorithmTabPage.UseVisualStyleBackColor = true;
+      // 
+      // algorithmPanel
+      // 
+      this.algorithmPanel.AllowDrop = true;
+      this.algorithmPanel.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.algorithmPanel.Controls.Add(this.algorithmViewHost);
+      this.algorithmPanel.Location = new System.Drawing.Point(6, 36);
+      this.algorithmPanel.Name = "algorithmPanel";
+      this.algorithmPanel.Size = new System.Drawing.Size(659, 306);
+      this.algorithmPanel.TabIndex = 3;
+      this.algorithmPanel.DragOver += new System.Windows.Forms.DragEventHandler(this.algorithmPanel_DragEnterOver);
+      this.algorithmPanel.DragDrop += new System.Windows.Forms.DragEventHandler(this.algorithmPanel_DragDrop);
+      this.algorithmPanel.DragEnter += new System.Windows.Forms.DragEventHandler(this.algorithmPanel_DragEnterOver);
+      // 
+      // algorithmViewHost
+      // 
+      this.algorithmViewHost.Content = null;
+      this.algorithmViewHost.Dock = System.Windows.Forms.DockStyle.Fill;
+      this.algorithmViewHost.Location = new System.Drawing.Point(0, 0);
+      this.algorithmViewHost.Name = "algorithmViewHost";
+      this.algorithmViewHost.Size = new System.Drawing.Size(659, 306);
+      this.algorithmViewHost.TabIndex = 0;
+      this.algorithmViewHost.ViewType = null;
       // 
       // saveAlgorithmButton
@@ -140,16 +167,4 @@
       this.newAlgorithmButton.UseVisualStyleBackColor = true;
       this.newAlgorithmButton.Click += new System.EventHandler(this.newAlgorithmButton_Click);
-      // 
-      // algorithmViewHost
-      // 
-      this.algorithmViewHost.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.algorithmViewHost.Content = null;
-      this.algorithmViewHost.Location = new System.Drawing.Point(6, 36);
-      this.algorithmViewHost.Name = "algorithmViewHost";
-      this.algorithmViewHost.Size = new System.Drawing.Size(659, 306);
-      this.algorithmViewHost.TabIndex = 3;
-      this.algorithmViewHost.ViewType = null;
       // 
       // runsTabPage
@@ -279,6 +294,6 @@
             0,
             0});
-      this.repetitionsNumericUpDown.Validated += new System.EventHandler(repetitionsNumericUpDown_Validated);
       this.repetitionsNumericUpDown.ValueChanged += new System.EventHandler(this.repetitionsNumericUpDown_ValueChanged);
+      this.repetitionsNumericUpDown.Validated += new System.EventHandler(this.repetitionsNumericUpDown_Validated);
       // 
       // pauseButton
@@ -325,4 +340,5 @@
       this.tabControl.ResumeLayout(false);
       this.algorithmTabPage.ResumeLayout(false);
+      this.algorithmPanel.ResumeLayout(false);
       this.runsTabPage.ResumeLayout(false);
       ((System.ComponentModel.ISupportInitialize)(this.repetitionsNumericUpDown)).EndInit();
@@ -351,4 +367,5 @@
     private RunCollectionView runsView;
     private System.Windows.Forms.Button pauseButton;
+    private System.Windows.Forms.Panel algorithmPanel;
 
   }
Index: trunk/sources/HeuristicLab.Optimization.Views/3.3/BatchRunView.cs
===================================================================
--- trunk/sources/HeuristicLab.Optimization.Views/3.3/BatchRunView.cs	(revision 3298)
+++ trunk/sources/HeuristicLab.Optimization.Views/3.3/BatchRunView.cs	(revision 3299)
@@ -235,4 +235,22 @@
       }
     }
+    private void algorithmPanel_DragEnterOver(object sender, DragEventArgs e) {
+      e.Effect = DragDropEffects.None;
+      Type type = e.Data.GetData("Type") as Type;
+      if ((type != null) && (typeof(IAlgorithm).IsAssignableFrom(type))) {
+        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;
+      }
+    }
+    private void algorithmPanel_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();
+        Content.Algorithm = algorithm;
+      }
+    }
     #endregion
 
