Index: branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive.ExperimentManager/3.4/MenuItems/ExperimentManagerMenuItem.cs
===================================================================
--- branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive.ExperimentManager/3.4/MenuItems/ExperimentManagerMenuItem.cs	(revision 6465)
+++ branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive.ExperimentManager/3.4/MenuItems/ExperimentManagerMenuItem.cs	(revision 6479)
@@ -27,5 +27,5 @@
   public class ExperimentManagerMenuItem : HeuristicLab.MainForm.WindowsForms.MenuItem, IOptimizerUserInterfaceItemProvider {
     public override string Name {
-      get { return "&Experiment Manager (dev)"; }
+      get { return "&Experiment Manager"; }
     }
     public override IEnumerable<string> Structure {
Index: branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive.ExperimentManager/3.4/Views/HiveExperimentPermissionView.Designer.cs
===================================================================
--- branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive.ExperimentManager/3.4/Views/HiveExperimentPermissionView.Designer.cs	(revision 6465)
+++ branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive.ExperimentManager/3.4/Views/HiveExperimentPermissionView.Designer.cs	(revision 6479)
@@ -61,4 +61,5 @@
       this.usernameTextBox.TabIndex = 3;
       this.usernameTextBox.Validated += new System.EventHandler(this.usernameTextBox_Validated);
+      this.usernameTextBox.Validating += new System.ComponentModel.CancelEventHandler(usernameTextBox_Validating);
       // 
       // permissionComboBox
@@ -73,4 +74,5 @@
       this.permissionComboBox.TabIndex = 4;
       this.permissionComboBox.Validated += new System.EventHandler(this.permissionComboBox_Validated);
+      this.permissionComboBox.Validating += new System.ComponentModel.CancelEventHandler(permissionComboBox_Validating);
       // 
       // HiveExperimentPermissionView
@@ -92,5 +94,4 @@
 
     }
-
     #endregion
 
Index: branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive.ExperimentManager/3.4/Views/HiveExperimentPermissionView.cs
===================================================================
--- branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive.ExperimentManager/3.4/Views/HiveExperimentPermissionView.cs	(revision 6465)
+++ branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive.ExperimentManager/3.4/Views/HiveExperimentPermissionView.cs	(revision 6479)
@@ -20,4 +20,5 @@
 #endregion
 
+using System.ComponentModel;
 using HeuristicLab.Clients.Hive.Views;
 using HeuristicLab.MainForm;
@@ -62,10 +63,17 @@
 
     #region Child Control Events
-    private void usernameTextBox_Validated(object sender, System.EventArgs e) {
+
+    private void usernameTextBox_Validating(object sender, CancelEventArgs e) {
       Content.GrantedUserName = usernameTextBox.Text;
     }
+    private void usernameTextBox_Validated(object sender, System.EventArgs e) {
+      
+    }
 
+    private void permissionComboBox_Validating(object sender, CancelEventArgs e) {
+      Content.Permission = (Permission)permissionComboBox.SelectedItem;
+    }
     private void permissionComboBox_Validated(object sender, System.EventArgs e) {
-      Content.Permission = (Permission)permissionComboBox.SelectedItem;
+      
     }
     #endregion
Index: branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive.ExperimentManager/3.4/Views/RefreshableHiveExperimentListView.cs
===================================================================
--- branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive.ExperimentManager/3.4/Views/RefreshableHiveExperimentListView.cs	(revision 6465)
+++ branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive.ExperimentManager/3.4/Views/RefreshableHiveExperimentListView.cs	(revision 6479)
@@ -39,8 +39,10 @@
       this.itemsListView.HeaderStyle = ColumnHeaderStyle.Clickable;
       this.itemsListView.FullRowSelect = true;
+      this.itemsListView.Sorting = SortOrder.Ascending;
+      this.itemsListView.Sort();
     }
 
     protected override RefreshableHiveExperiment CreateItem() {
-      return new RefreshableHiveExperiment();
+      return new RefreshableHiveExperiment() { IsAllowedPrivileged = HiveClient.Instance.IsAllowedPrivileged };
     }
 
@@ -52,4 +54,9 @@
     }
 
+    protected override void Content_ItemsAdded(object sender, Collections.CollectionItemsChangedEventArgs<RefreshableHiveExperiment> e) {
+      base.Content_ItemsAdded(sender, e);
+
+    }
+
     protected override ListViewItem CreateListViewItem(RefreshableHiveExperiment item) {
       ListViewItem listViewItem = base.CreateListViewItem(item);
@@ -59,4 +66,13 @@
       listViewItem.Group = GetListViewGroup(item.HiveExperiment.OwnerUsername);
       return listViewItem;
+    }
+
+    protected override void UpdateListViewItemText(ListViewItem listViewItem) {
+      if (listViewItem == null) throw new ArgumentNullException();
+      var item = listViewItem.Tag as RefreshableHiveExperiment;
+      listViewItem.SubItems[0].Text = item == null ? "null" : item.HiveExperiment.DateCreated.ToString("dd.MM.yyyy HH:mm");
+      listViewItem.SubItems[1].Text = item == null ? "null" : item.HiveExperiment.Name;
+      listViewItem.Group = GetListViewGroup(item.HiveExperiment.OwnerUsername);
+      listViewItem.ToolTipText = item == null ? string.Empty : item.ItemName + ": " + item.ItemDescription;
     }
 
Index: branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive.ExperimentManager/3.4/Views/RefreshableHiveExperimentView.Designer.cs
===================================================================
--- branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive.ExperimentManager/3.4/Views/RefreshableHiveExperimentView.Designer.cs	(revision 6465)
+++ branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive.ExperimentManager/3.4/Views/RefreshableHiveExperimentView.Designer.cs	(revision 6479)
@@ -55,4 +55,5 @@
       this.stateLogViewHost = new HeuristicLab.MainForm.WindowsForms.ViewHost();
       this.sharingTabPage = new System.Windows.Forms.TabPage();
+      this.refreshPermissionsButton = new System.Windows.Forms.Button();
       this.hiveExperimentPermissionListView = new HeuristicLab.Clients.Hive.ExperimentManager.Views.HiveExperimentPermissionListView();
       this.logTabPage = new System.Windows.Forms.TabPage();
@@ -79,5 +80,4 @@
       this.calculatingLabel = new System.Windows.Forms.Label();
       this.jobsLabel = new System.Windows.Forms.Label();
-      this.refreshPermissionsButton = new System.Windows.Forms.Button();
       this.tabControl.SuspendLayout();
       this.jobsTabPage.SuspendLayout();
@@ -102,4 +102,5 @@
       this.tabControl.Size = new System.Drawing.Size(717, 452);
       this.tabControl.TabIndex = 4;
+      this.tabControl.SelectedIndexChanged += new System.EventHandler(this.tabControl_SelectedIndexChanged);
       // 
       // jobsTabPage
@@ -165,4 +166,15 @@
       this.sharingTabPage.UseVisualStyleBackColor = true;
       // 
+      // refreshPermissionsButton
+      // 
+      this.refreshPermissionsButton.Image = ((System.Drawing.Image)(resources.GetObject("refreshPermissionsButton.Image")));
+      this.refreshPermissionsButton.Location = new System.Drawing.Point(3, 3);
+      this.refreshPermissionsButton.Name = "refreshPermissionsButton";
+      this.refreshPermissionsButton.Size = new System.Drawing.Size(24, 24);
+      this.refreshPermissionsButton.TabIndex = 23;
+      this.toolTip.SetToolTip(this.refreshPermissionsButton, "Refresh Data");
+      this.refreshPermissionsButton.UseVisualStyleBackColor = true;
+      this.refreshPermissionsButton.Click += new System.EventHandler(this.refreshPermissionsButton_Click);
+      // 
       // hiveExperimentPermissionListView
       // 
@@ -172,4 +184,5 @@
       this.hiveExperimentPermissionListView.Caption = "HiveExperimentPermissionList View";
       this.hiveExperimentPermissionListView.Content = null;
+      this.hiveExperimentPermissionListView.HiveExperimentId = new System.Guid("00000000-0000-0000-0000-000000000000");
       this.hiveExperimentPermissionListView.Location = new System.Drawing.Point(3, 33);
       this.hiveExperimentPermissionListView.Name = "hiveExperimentPermissionListView";
@@ -410,15 +423,4 @@
       this.jobsLabel.TabIndex = 0;
       this.jobsLabel.Text = "Jobs:";
-      // 
-      // refreshPermissionsButton
-      // 
-      this.refreshPermissionsButton.Image = ((System.Drawing.Image)(resources.GetObject("refreshPermissionsButton.Image")));
-      this.refreshPermissionsButton.Location = new System.Drawing.Point(3, 3);
-      this.refreshPermissionsButton.Name = "refreshPermissionsButton";
-      this.refreshPermissionsButton.Size = new System.Drawing.Size(24, 24);
-      this.refreshPermissionsButton.TabIndex = 23;
-      this.toolTip.SetToolTip(this.refreshPermissionsButton, "Refresh Data");
-      this.refreshPermissionsButton.UseVisualStyleBackColor = true;
-      this.refreshPermissionsButton.Click += new System.EventHandler(this.refreshPermissionsButton_Click);
       // 
       // RefreshableHiveExperimentView
Index: branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive.ExperimentManager/3.4/Views/RefreshableHiveExperimentView.cs
===================================================================
--- branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive.ExperimentManager/3.4/Views/RefreshableHiveExperimentView.cs	(revision 6465)
+++ branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive.ExperimentManager/3.4/Views/RefreshableHiveExperimentView.cs	(revision 6479)
@@ -63,4 +63,9 @@
       Content.ExceptionOccured += new EventHandler<EventArgs<Exception>>(Content_ExceptionOccured);
       Content.StateLogListChanged += new EventHandler(Content_StateLogListChanged);
+      Content.IsProgressingChanged += new EventHandler(Content_IsProgressingChanged);
+      Content.HiveJobsChanged += new EventHandler(Content_HiveJobChanged);
+      Content.ExecutionStateChanged += new EventHandler(Content_ExecutionStateChanged);
+      Content.ExecutionTimeChanged += new EventHandler(Content_ExecutionTimeChanged);
+      Content.IsAllowedPrivilegedChanged += new EventHandler(Content_IsAllowedPrivilegedChanged);
     }
 
@@ -72,32 +77,28 @@
       Content.ExceptionOccured -= new EventHandler<EventArgs<Exception>>(Content_ExceptionOccured);
       Content.StateLogListChanged -= new EventHandler(Content_StateLogListChanged);
+      Content.IsProgressingChanged -= new EventHandler(Content_IsProgressingChanged);
+      Content.HiveJobsChanged -= new EventHandler(Content_HiveJobChanged);
+      Content.ExecutionStateChanged -= new EventHandler(Content_ExecutionStateChanged);
+      Content.ExecutionTimeChanged -= new EventHandler(Content_ExecutionTimeChanged);
       base.DeregisterContentEvents();
     }
 
     private void RegisterHiveExperimentEvents() {
-      Content.HiveExperiment.ExecutionStateChanged += new EventHandler(Content_ExecutionStateChanged);
-      Content.HiveExperiment.ExecutionTimeChanged += new EventHandler(Content_ExecutionTimeChanged);
-      Content.HiveExperiment.HiveJobsChanged += new EventHandler(Content_HiveJobChanged);
-      Content.HiveExperiment.IsProgressingChanged += new EventHandler(Content_IsProgressingChanged);
       Content.HiveExperiment.PropertyChanged += new PropertyChangedEventHandler(HiveExperiment_PropertyChanged);
     }
     
     private void DeregisterHiveExperimentEvents() {
-      Content.HiveExperiment.ExecutionStateChanged -= new EventHandler(Content_ExecutionStateChanged);
-      Content.HiveExperiment.ExecutionTimeChanged -= new EventHandler(Content_ExecutionTimeChanged);
-      Content.HiveExperiment.HiveJobsChanged -= new EventHandler(Content_HiveJobChanged);
-      Content.HiveExperiment.IsProgressingChanged -= new EventHandler(Content_IsProgressingChanged);
       Content.HiveExperiment.PropertyChanged -= new PropertyChangedEventHandler(HiveExperiment_PropertyChanged);
     }
 
     private void RegisterHiveJobEvents() {
-      Content.HiveExperiment.HiveJobs.ItemsAdded += new CollectionItemsChangedEventHandler<HiveJob>(HiveJobs_ItemsAdded_Removed_Reset);
-      Content.HiveExperiment.HiveJobs.ItemsRemoved += new CollectionItemsChangedEventHandler<HiveJob>(HiveJobs_ItemsAdded_Removed_Reset);
-      Content.HiveExperiment.HiveJobs.CollectionReset += new CollectionItemsChangedEventHandler<HiveJob>(HiveJobs_ItemsAdded_Removed_Reset);
+      Content.HiveJobs.ItemsAdded += new CollectionItemsChangedEventHandler<HiveJob>(HiveJobs_ItemsAdded_Removed_Reset);
+      Content.HiveJobs.ItemsRemoved += new CollectionItemsChangedEventHandler<HiveJob>(HiveJobs_ItemsAdded_Removed_Reset);
+      Content.HiveJobs.CollectionReset += new CollectionItemsChangedEventHandler<HiveJob>(HiveJobs_ItemsAdded_Removed_Reset);
     }
     private void DeregisterHiveJobEvents() {
-      Content.HiveExperiment.HiveJobs.ItemsAdded -= new CollectionItemsChangedEventHandler<HiveJob>(HiveJobs_ItemsAdded_Removed_Reset);
-      Content.HiveExperiment.HiveJobs.ItemsRemoved -= new CollectionItemsChangedEventHandler<HiveJob>(HiveJobs_ItemsAdded_Removed_Reset);
-      Content.HiveExperiment.HiveJobs.CollectionReset -= new CollectionItemsChangedEventHandler<HiveJob>(HiveJobs_ItemsAdded_Removed_Reset);
+      Content.HiveJobs.ItemsAdded -= new CollectionItemsChangedEventHandler<HiveJob>(HiveJobs_ItemsAdded_Removed_Reset);
+      Content.HiveJobs.ItemsRemoved -= new CollectionItemsChangedEventHandler<HiveJob>(HiveJobs_ItemsAdded_Removed_Reset);
+      Content.HiveJobs.CollectionReset -= new CollectionItemsChangedEventHandler<HiveJob>(HiveJobs_ItemsAdded_Removed_Reset);
     }
 
@@ -114,5 +115,5 @@
       } else {
         nameTextBox.Text = Content.HiveExperiment.Name;
-        executionTimeTextBox.Text = Content.HiveExperiment.ExecutionTime.ToString();
+        executionTimeTextBox.Text = Content.ExecutionTime.ToString();
         resourceNamesTextBox.Text = Content.HiveExperiment.ResourceNames;
         isPrivilegedCheckBox.Checked = Content.HiveExperiment.IsPrivileged;
@@ -139,17 +140,17 @@
       if (Content != null) {
         bool alreadyUploaded = Content.Id != Guid.Empty;
-        bool jobsLoaded = Content.HiveExperiment.HiveJobs != null && Content.HiveExperiment.HiveJobs.All(x => x.Job.Id != Guid.Empty);
-
-        this.nameTextBox.ReadOnly = !Content.IsControllable || Content.HiveExperiment.ExecutionState != ExecutionState.Prepared || alreadyUploaded;
-        this.resourceNamesTextBox.ReadOnly = !Content.IsControllable || Content.HiveExperiment.ExecutionState != ExecutionState.Prepared || alreadyUploaded;
-        this.jobsTreeView.ReadOnly = !Content.IsControllable || Content.HiveExperiment.ExecutionState != ExecutionState.Prepared || alreadyUploaded;
-
-        this.isPrivilegedCheckBox.Enabled = Content.IsControllable && !(Content.HiveExperiment.ExecutionState != ExecutionState.Prepared || alreadyUploaded); // TODO: check if user has the rights to do this        
-        this.refreshAutomaticallyCheckBox.Enabled = Content.IsControllable && alreadyUploaded && jobsLoaded && Content.HiveExperiment.ExecutionState == ExecutionState.Started;
-        this.refreshButton.Enabled = Content.IsControllable && alreadyUploaded;
-        this.Locked = !Content.IsControllable || Content.HiveExperiment.ExecutionState == ExecutionState.Started;
-
+        bool jobsLoaded = Content.HiveJobs != null && Content.HiveJobs.All(x => x.Job.Id != Guid.Empty);
+
+        this.nameTextBox.ReadOnly = !Content.IsControllable || Content.ExecutionState != ExecutionState.Prepared || alreadyUploaded;
+        this.resourceNamesTextBox.ReadOnly = !Content.IsControllable || Content.ExecutionState != ExecutionState.Prepared || alreadyUploaded;
+        this.jobsTreeView.ReadOnly = !Content.IsControllable || Content.ExecutionState != ExecutionState.Prepared || alreadyUploaded;
+
+        this.isPrivilegedCheckBox.Enabled = Content.IsAllowedPrivileged && Content.IsControllable && !(Content.ExecutionState != ExecutionState.Prepared || alreadyUploaded); // TODO: check if user has the rights to do this        
+        this.refreshAutomaticallyCheckBox.Enabled = Content.IsControllable && alreadyUploaded && jobsLoaded && Content.ExecutionState == ExecutionState.Started;
+        this.refreshButton.Enabled = Content.IsDownloadable && alreadyUploaded;
+        this.Locked = !Content.IsControllable || Content.ExecutionState == ExecutionState.Started;
       }
       SetEnabledStateOfExecutableButtons();
+      tabControl_SelectedIndexChanged(this, EventArgs.Empty); // ensure sharing tabpage is disabled
     }
 
@@ -214,5 +215,5 @@
         Invoke(new EventHandler(Content_ExecutionTimeChanged), sender, e);
       else
-        executionTimeTextBox.Text = Content.HiveExperiment.ExecutionTime.ToString();
+        executionTimeTextBox.Text = Content.ExecutionTime.ToString();
     }
     private void Content_RefreshAutomaticallyChanged(object sender, EventArgs e) {
@@ -228,6 +229,6 @@
         Invoke(new EventHandler(Content_HiveJobChanged), sender, e);
       else {
-        if (Content != null && Content.HiveExperiment.HiveJobs != null) {
-          jobsTreeView.Content = Content.HiveExperiment.HiveJobs;
+        if (Content != null && Content.HiveJobs != null) {
+          jobsTreeView.Content = Content.HiveJobs;
           RegisterHiveJobEvents();
         } else {
@@ -263,8 +264,5 @@
     }
     private void Content_ExceptionOccured(object sender, EventArgs<Exception> e) {
-      if (Content.IsControllable) {
-        // show error dialog only if Controllable (otherwise it should continue trying without an error dialog (e.g. HiveEngine))
-        ErrorHandling.ShowErrorDialog(this, e.Value);
-      }
+      // don't show exception, it is logged anyway
     }
     private void Content_StateLogListChanged(object sender, EventArgs e) {
@@ -275,8 +273,16 @@
       }
     }
+    private void Content_IsAllowedPrivilegedChanged(object sender, EventArgs e) {
+      if (InvokeRequired)
+        Invoke(new EventHandler(Content_IsAllowedPrivilegedChanged), sender, e);
+      else {
+        SetEnabledStateOfControls();
+      }
+    }
+
 
     private void UpdateStateLogList() {
       if (Content != null && this.Content.HiveExperiment != null) {
-        stateLogViewHost.Content = this.Content.HiveExperiment.StateLogList;
+        stateLogViewHost.Content = this.Content.StateLogList;
       } else {
         stateLogViewHost.Content = null;
@@ -294,8 +300,8 @@
     }
     private void pauseButton_Click(object sender, EventArgs e) {
-      HiveClient.PauseExperiment(Content.HiveExperiment);
+      HiveClient.PauseExperiment(Content);
     }
     private void stopButton_Click(object sender, EventArgs e) {
-      HiveClient.StopExperiment(Content.HiveExperiment);
+      HiveClient.StopExperiment(Content);
     }
     private void resetButton_Click(object sender, EventArgs e) { }
@@ -320,6 +326,6 @@
 
     private void refreshButton_Click(object sender, EventArgs e) {
-      var invoker = new Action<HiveExperiment>(HiveClient.LoadExperiment);
-      invoker.BeginInvoke(Content.HiveExperiment, (ar) => {
+      var invoker = new Action<RefreshableHiveExperiment>(HiveClient.LoadExperiment);
+      invoker.BeginInvoke(Content, (ar) => {
         try {
           invoker.EndInvoke(ar);
@@ -343,7 +349,7 @@
         startButton.Enabled = pauseButton.Enabled = stopButton.Enabled = resetButton.Enabled = false;
       } else {
-        startButton.Enabled = Content.IsControllable && Content.HiveExperiment.HiveJobs != null && Content.HiveExperiment.HiveJobs.Count > 0 && Content.HiveExperiment.ExecutionState == ExecutionState.Prepared;
-        pauseButton.Enabled = Content.IsControllable && Content.HiveExperiment.ExecutionState == ExecutionState.Started;
-        stopButton.Enabled = Content.IsControllable && Content.HiveExperiment.ExecutionState == ExecutionState.Started;
+        startButton.Enabled = Content.IsControllable && Content.HiveJobs != null && Content.HiveJobs.Count > 0 && Content.ExecutionState == ExecutionState.Prepared;
+        pauseButton.Enabled = Content.IsControllable && Content.ExecutionState == ExecutionState.Started;
+        stopButton.Enabled = Content.IsControllable && Content.ExecutionState == ExecutionState.Started;
         resetButton.Enabled = false;
       }
@@ -356,5 +362,5 @@
         Invoke(new EventHandler(Content_IsProgressingChanged), sender, e);
       } else {
-        if (Content != null && Content.HiveExperiment.IsProgressing) {
+        if (Content != null && Content.IsProgressing) {
           SetProgressView();
         } else {
@@ -366,7 +372,7 @@
     private void SetProgressView() {
       if (progressView == null) {
-        progressView = new ProgressView(this, Content.HiveExperiment.Progress);
-      }
-      progressView.Progress = Content.HiveExperiment.Progress;
+        progressView = new ProgressView(this, Content.Progress);
+      }
+      progressView.Progress = Content.Progress;
     }
 
@@ -389,5 +395,6 @@
       var obj = e.Data.GetData(Constants.DragDropDataFormat);
       if (obj is IOptimizer) {
-        e.Effect = DragDropEffects.Copy;
+        if ((e.KeyState & 32) == 32) e.Effect = DragDropEffects.Link;  // ALT key
+        else if (e.AllowedEffect.HasFlag(DragDropEffects.Copy)) e.Effect = DragDropEffects.Copy;
       }
     }
@@ -399,9 +406,18 @@
         var optimizer = obj as IOptimizer;
         if (optimizer != null) {
-          Content.HiveExperiment.HiveJobs.Add(new OptimizerHiveJob(optimizer));
+          Content.HiveJobs.Add(new OptimizerHiveJob(e.Effect.HasFlag(DragDropEffects.Copy) ? (IOptimizer)optimizer.Clone() : optimizer));
         }
       }
     }
     #endregion
+
+    private void tabControl_SelectedIndexChanged(object sender, EventArgs e) {
+      if (tabControl.SelectedTab == sharingTabPage) {
+        if (!Content.IsSharable) {
+          MessageBox.Show("Unable to load tab. You have insufficient access privileges.");
+          tabControl.SelectedTab = jobsTabPage;
+        }
+      }
+    }
   }
 }
