Index: trunk/sources/HeuristicLab.Optimization.Views/3.3/ExperimentTreeView.Designer.cs
===================================================================
--- trunk/sources/HeuristicLab.Optimization.Views/3.3/ExperimentTreeView.Designer.cs	(revision 6572)
+++ trunk/sources/HeuristicLab.Optimization.Views/3.3/ExperimentTreeView.Designer.cs	(revision 6573)
@@ -171,4 +171,5 @@
       this.treeView.AfterLabelEdit += new System.Windows.Forms.NodeLabelEditEventHandler(treeView_AfterLabelEdit);
       this.treeView.BeforeLabelEdit += new System.Windows.Forms.NodeLabelEditEventHandler(treeView_BeforeLabelEdit);
+      this.treeView.AfterSelect += new System.Windows.Forms.TreeViewEventHandler(treeView_AfterSelect);
       this.treeView.ItemDrag += new System.Windows.Forms.ItemDragEventHandler(this.optimizerTreeView_ItemDrag);
       this.treeView.NodeMouseClick += new System.Windows.Forms.TreeNodeMouseClickEventHandler(this.treeview_NodeMouseClick);
Index: trunk/sources/HeuristicLab.Optimization.Views/3.3/ExperimentTreeView.cs
===================================================================
--- trunk/sources/HeuristicLab.Optimization.Views/3.3/ExperimentTreeView.cs	(revision 6572)
+++ trunk/sources/HeuristicLab.Optimization.Views/3.3/ExperimentTreeView.cs	(revision 6573)
@@ -265,20 +265,11 @@
 
       foreach (TreeNodeCollection parentNode in parentNodes) {
-        //get all effected child nodes
-        foreach (TreeNode childNode in parentNode.OfType<TreeNode>()
-          .Where(n => e.OldItems.Select(x => x.Value).Contains((IOptimizer)n.Tag)).ToList()) {
-          DisposeTreeNode(childNode);
-          childNode.Remove();
-        }
-
-        foreach (var childOptimizer in e.Items) {
-          TreeNode childNode = CreateTreeNode(childOptimizer.Value);
-          UpdateChildTreeNodes(childNode.Nodes, childOptimizer.Value);
-          childNode.ExpandAll();
-          parentNode.Insert(childOptimizer.Index, childNode);
-        }
-      }
-      RebuildImageList();
-      UpdateDetailsViewHost();
+        var backup = parentNode.OfType<TreeNode>().ToList();
+        foreach (var indexedItem in e.Items) {
+          var node = backup.Where(n => n.Tag == indexedItem.Value).First();
+          node.Remove();
+          parentNode.Insert(indexedItem.Index, node);
+        }
+      }
     }
     private void Optimizers_ItemsRemoved(object sender, CollectionItemsChangedEventArgs<IndexedItem<IOptimizer>> e) {
@@ -640,4 +631,13 @@
     }
 
+
+    private void treeView_AfterSelect(object sender, TreeViewEventArgs e) {
+      if (e.Action == TreeViewAction.ByKeyboard) {
+        UpdateDetailsViewHost();
+        //NOTE: necessary because algorithm view steals the focus
+        treeView.Focus();
+      }
+    }
+
     private bool rightClickOccured = true;
     private TreeNode toolStripMenuNode = null;
@@ -736,10 +736,9 @@
       else experiment = (Experiment)treeView.SelectedNode.Parent.Tag;
 
+      var selectedNode = treeView.SelectedNode;
       int index = treeView.SelectedNode.Index;
       experiment.Optimizers.Reverse(index - 1, 2);
-      treeView.SelectedNode = treeNodeTagMapping[optimizer].First();
+      treeView.SelectedNode = selectedNode;
       SetEnabledStateOfControls();
-      UpdateDetailsViewHost();
-      RebuildImageList();
     }
     private void moveDownButton_Click(object sender, EventArgs e) {
@@ -749,10 +748,9 @@
       else experiment = (Experiment)treeView.SelectedNode.Parent.Tag;
 
+      var selectedNode = treeView.SelectedNode;
       int index = treeView.SelectedNode.Index;
       experiment.Optimizers.Reverse(index, 2);
-      treeView.SelectedNode = treeNodeTagMapping[optimizer].First();
+      treeView.SelectedNode = selectedNode;
       SetEnabledStateOfControls();
-      UpdateDetailsViewHost();
-      RebuildImageList();
     }
 
@@ -885,4 +883,5 @@
       var topLevelNodes = treeView.Nodes.OfType<TreeNode>().ToArray();
       var nodes = IterateTreeNodes().ToList();
+      var selectedNode = treeView.SelectedNode;
       treeView.Nodes.Clear();
 
@@ -894,4 +893,5 @@
       }
       treeView.Nodes.AddRange(topLevelNodes);
+      treeView.SelectedNode = selectedNode;
       treeView.EndUpdate();
     }
