Index: /branches/OKB (trunk integration)/HeuristicLab.Clients.OKB/3.3/Administration/AdministrationClient.cs
===================================================================
--- /branches/OKB (trunk integration)/HeuristicLab.Clients.OKB/3.3/Administration/AdministrationClient.cs	(revision 5549)
+++ /branches/OKB (trunk integration)/HeuristicLab.Clients.OKB/3.3/Administration/AdministrationClient.cs	(revision 5550)
@@ -24,8 +24,6 @@
 using System.Linq;
 using HeuristicLab.Clients.Common;
-using HeuristicLab.Collections;
 using HeuristicLab.Common;
 using HeuristicLab.Core;
-using HeuristicLab.PluginInfrastructure;
 
 namespace HeuristicLab.Clients.OKB.Administration {
@@ -63,16 +61,5 @@
     #endregion
 
-    private AdministrationClient() {
-      platforms = new ItemCollection<Platform>();
-      platforms.ItemsRemoved += new CollectionItemsChangedEventHandler<Platform>(platforms_ItemsRemoved);
-      algorithmClasses = new ItemCollection<AlgorithmClass>();
-      algorithmClasses.ItemsRemoved += new CollectionItemsChangedEventHandler<AlgorithmClass>(algorithmClasses_ItemsRemoved);
-      algorithms = new ItemCollection<Algorithm>();
-      algorithms.ItemsRemoved += new CollectionItemsChangedEventHandler<Algorithm>(algorithms_ItemsRemoved);
-      problemClasses = new ItemCollection<ProblemClass>();
-      problemClasses.ItemsRemoved += new CollectionItemsChangedEventHandler<ProblemClass>(problemClasses_ItemsRemoved);
-      problems = new ItemCollection<Problem>();
-      problems.ItemsRemoved += new CollectionItemsChangedEventHandler<Problem>(problems_ItemsRemoved);
-    }
+    public AdministrationClient() { }
 
     #region Refresh
@@ -80,27 +67,34 @@
       OnRefreshing();
 
-      platforms.Clear();
-      algorithmClasses.Clear();
-      algorithms.Clear();
-      problemClasses.Clear();
-      problems.Clear();
-
+      platforms = new OKBItemCollection<Platform>();
+      algorithmClasses = new OKBItemCollection<AlgorithmClass>();
+      algorithms = new OKBItemCollection<Algorithm>();
+      problemClasses = new OKBItemCollection<ProblemClass>();
+      problems = new OKBItemCollection<Problem>();
+
+      try {
+        platforms.AddRange(CallAdministrationService<List<Platform>>(s => s.GetPlatforms()).OrderBy(x => x.Name));
+        algorithmClasses.AddRange(CallAdministrationService<List<AlgorithmClass>>(s => s.GetAlgorithmClasses()).OrderBy(x => x.Name));
+        algorithms.AddRange(CallAdministrationService<List<Algorithm>>(s => s.GetAlgorithms()).OrderBy(x => x.Name));
+        problemClasses.AddRange(CallAdministrationService<List<ProblemClass>>(s => s.GetProblemClasses()).OrderBy(x => x.Name));
+        problems.AddRange(CallAdministrationService<List<Problem>>(s => s.GetProblems()).OrderBy(x => x.Name));
+      }
+      finally {
+        OnRefreshed();
+      }
+    }
+    public void RefreshAsync(Action<Exception> exceptionCallback) {
       var call = new Func<Exception>(delegate() {
         try {
-          platforms.AddRange(CallAdministrationService<List<Platform>>(s => s.GetPlatforms()).OrderBy(x => x.Name));
-          algorithmClasses.AddRange(CallAdministrationService<List<AlgorithmClass>>(s => s.GetAlgorithmClasses()).OrderBy(x => x.Name));
-          algorithms.AddRange(CallAdministrationService<List<Algorithm>>(s => s.GetAlgorithms()).OrderBy(x => x.Name));
-          problemClasses.AddRange(CallAdministrationService<List<ProblemClass>>(s => s.GetProblemClasses()).OrderBy(x => x.Name));
-          problems.AddRange(CallAdministrationService<List<Problem>>(s => s.GetProblems()).OrderBy(x => x.Name));
-          return null;
+          Refresh();
         }
         catch (Exception ex) {
           return ex;
         }
+        return null;
       });
       call.BeginInvoke(delegate(IAsyncResult result) {
         Exception ex = call.EndInvoke(result);
-        if (ex != null) ErrorHandling.ShowErrorDialog("Refresh failed.", ex);
-        OnRefreshed();
+        if (ex != null) exceptionCallback(ex);
       }, null);
     }
@@ -108,117 +102,74 @@
 
     #region Store
-    public bool Store(IOKBItem item) {
-      try {
-        if (item.Id == 0) {
-          if (item is Platform)
-            item.Id = CallAdministrationService<long>(s => s.AddPlatform((Platform)item));
-          else if (item is AlgorithmClass)
-            item.Id = CallAdministrationService<long>(s => s.AddAlgorithmClass((AlgorithmClass)item));
-          else if (item is Algorithm)
-            item.Id = CallAdministrationService<long>(s => s.AddAlgorithm((Algorithm)item));
-          else if (item is ProblemClass)
-            item.Id = CallAdministrationService<long>(s => s.AddProblemClass((ProblemClass)item));
-          else if (item is Problem)
-            item.Id = CallAdministrationService<long>(s => s.AddProblem((Problem)item));
-        } else {
-          if (item is Platform)
-            CallAdministrationService(s => s.UpdatePlatform((Platform)item));
-          else if (item is AlgorithmClass)
-            CallAdministrationService(s => s.UpdateAlgorithmClass((AlgorithmClass)item));
-          else if (item is Algorithm)
-            CallAdministrationService(s => s.UpdateAlgorithm((Algorithm)item));
-          else if (item is ProblemClass)
-            CallAdministrationService(s => s.UpdateProblemClass((ProblemClass)item));
-          else if (item is Problem)
-            CallAdministrationService(s => s.UpdateProblem((Problem)item));
-        }
-        return true;
-      }
-      catch (Exception ex) {
-        ErrorHandling.ShowErrorDialog("Store failed.", ex);
-        return false;
-      }
+    public static void Store(IOKBItem item) {
+      if (item.Id == 0) {
+        if (item is Platform)
+          item.Id = CallAdministrationService<long>(s => s.AddPlatform((Platform)item));
+        else if (item is AlgorithmClass)
+          item.Id = CallAdministrationService<long>(s => s.AddAlgorithmClass((AlgorithmClass)item));
+        else if (item is Algorithm)
+          item.Id = CallAdministrationService<long>(s => s.AddAlgorithm((Algorithm)item));
+        else if (item is ProblemClass)
+          item.Id = CallAdministrationService<long>(s => s.AddProblemClass((ProblemClass)item));
+        else if (item is Problem)
+          item.Id = CallAdministrationService<long>(s => s.AddProblem((Problem)item));
+      } else {
+        if (item is Platform)
+          CallAdministrationService(s => s.UpdatePlatform((Platform)item));
+        else if (item is AlgorithmClass)
+          CallAdministrationService(s => s.UpdateAlgorithmClass((AlgorithmClass)item));
+        else if (item is Algorithm)
+          CallAdministrationService(s => s.UpdateAlgorithm((Algorithm)item));
+        else if (item is ProblemClass)
+          CallAdministrationService(s => s.UpdateProblemClass((ProblemClass)item));
+        else if (item is Problem)
+          CallAdministrationService(s => s.UpdateProblem((Problem)item));
+      }
+    }
+    #endregion
+
+    #region Delete
+    public static void Delete(IOKBItem item) {
+      if (item is Platform)
+        CallAdministrationService(s => s.DeletePlatform(item.Id));
+      else if (item is AlgorithmClass)
+        CallAdministrationService(s => s.DeleteAlgorithmClass(item.Id));
+      else if (item is Algorithm)
+        CallAdministrationService(s => s.DeleteAlgorithm(item.Id));
+      else if (item is ProblemClass)
+        CallAdministrationService(s => s.DeleteProblemClass(item.Id));
+      else if (item is Problem)
+        CallAdministrationService(s => s.DeleteProblem(item.Id));
+      item.Id = 0;
     }
     #endregion
 
     #region Algorithm Methods
-    public List<Guid> GetAlgorithmUsers(long algorithmId) {
-      try {
-        return CallAdministrationService<List<Guid>>(s => s.GetAlgorithmUsers(algorithmId));
-      }
-      catch (Exception ex) {
-        ErrorHandling.ShowErrorDialog("Refresh authorized algorithm users failed.", ex);
-        return null;
-      }
-    }
-    public bool UpdateAlgorithmUsers(long algorithmId, List<Guid> users) {
-      try {
-        CallAdministrationService(s => s.UpdateAlgorithmUsers(algorithmId, users));
-        return true;
-      }
-      catch (Exception ex) {
-        ErrorHandling.ShowErrorDialog("Update authorized algorithm users failed.", ex);
-        return false;
-      }
-    }
-    public byte[] GetAlgorithmData(long algorithmId) {
-      try {
-        return CallAdministrationService<byte[]>(s => s.GetAlgorithmData(algorithmId));
-      }
-      catch (Exception ex) {
-        ErrorHandling.ShowErrorDialog("Refresh algorithm data failed.", ex);
-        return null;
-      }
-    }
-    public bool UpdateAlgorithmData(long algorithmId, byte[] algorithmData) {
-      try {
-        CallAdministrationService(s => s.UpdateAlgorithmData(algorithmId, algorithmData));
-        return true;
-      }
-      catch (Exception ex) {
-        ErrorHandling.ShowErrorDialog("Update algorithm data failed.", ex);
-        return false;
-      }
+    public static List<Guid> GetAlgorithmUsers(long algorithmId) {
+      return CallAdministrationService<List<Guid>>(s => s.GetAlgorithmUsers(algorithmId));
+    }
+    public static void UpdateAlgorithmUsers(long algorithmId, List<Guid> users) {
+      CallAdministrationService(s => s.UpdateAlgorithmUsers(algorithmId, users));
+    }
+    public static byte[] GetAlgorithmData(long algorithmId) {
+      return CallAdministrationService<byte[]>(s => s.GetAlgorithmData(algorithmId));
+    }
+    public static void UpdateAlgorithmData(long algorithmId, byte[] algorithmData) {
+      CallAdministrationService(s => s.UpdateAlgorithmData(algorithmId, algorithmData));
     }
     #endregion
 
     #region Problem Methods
-    public List<Guid> GetProblemUsers(long problemId) {
-      try {
-        return CallAdministrationService<List<Guid>>(s => s.GetProblemUsers(problemId));
-      }
-      catch (Exception ex) {
-        ErrorHandling.ShowErrorDialog("Refresh authorized problem users failed.", ex);
-        return null;
-      }
-    }
-    public bool UpdateProblemUsers(long problemId, List<Guid> users) {
-      try {
-        CallAdministrationService(s => s.UpdateProblemUsers(problemId, users));
-        return true;
-      }
-      catch (Exception ex) {
-        ErrorHandling.ShowErrorDialog("Update authorized problem users failed.", ex);
-        return false;
-      }
-    }
-    public byte[] GetProblemData(long problemId) {
-      try {
-        return CallAdministrationService<byte[]>(s => s.GetProblemData(problemId));
-      }
-      catch (Exception ex) {
-        ErrorHandling.ShowErrorDialog("Refresh problem data failed.", ex);
-        return null;
-      }
-    }
-    public bool UpdateProblemData(long problemId, byte[] problemData) {
-      try {
-        CallAdministrationService(s => s.UpdateProblemData(problemId, problemData));
-        return true;
-      }
-      catch (Exception ex) {
-        ErrorHandling.ShowErrorDialog("Update problem data failed.", ex);
-        return false;
-      }
+    public static List<Guid> GetProblemUsers(long problemId) {
+      return CallAdministrationService<List<Guid>>(s => s.GetProblemUsers(problemId));
+    }
+    public static void UpdateProblemUsers(long problemId, List<Guid> users) {
+      CallAdministrationService(s => s.UpdateProblemUsers(problemId, users));
+    }
+    public static byte[] GetProblemData(long problemId) {
+      return CallAdministrationService<byte[]>(s => s.GetProblemData(problemId));
+    }
+    public static void UpdateProblemData(long problemId, byte[] problemData) {
+      CallAdministrationService(s => s.UpdateProblemData(problemId, problemData));
     }
     #endregion
@@ -232,57 +183,11 @@
     public event EventHandler Refreshed;
     private void OnRefreshed() {
-      EventHandler handler = Refreshed;
+      var handler = Refreshed;
       if (handler != null) handler(this, EventArgs.Empty);
     }
-
-    private void platforms_ItemsRemoved(object sender, CollectionItemsChangedEventArgs<Platform> e) {
-      try {
-        foreach (Platform p in e.Items)
-          CallAdministrationService(s => s.DeletePlatform(p.Id));
-      }
-      catch (Exception ex) {
-        ErrorHandling.ShowErrorDialog("Delete failed.", ex);
-      }
-    }
-    private void algorithmClasses_ItemsRemoved(object sender, CollectionItemsChangedEventArgs<AlgorithmClass> e) {
-      try {
-        foreach (AlgorithmClass a in e.Items)
-          CallAdministrationService(s => s.DeleteAlgorithmClass(a.Id));
-      }
-      catch (Exception ex) {
-        ErrorHandling.ShowErrorDialog("Delete failed.", ex);
-      }
-    }
-    private void algorithms_ItemsRemoved(object sender, CollectionItemsChangedEventArgs<Algorithm> e) {
-      try {
-        foreach (Algorithm a in e.Items)
-          CallAdministrationService(s => s.DeleteAlgorithm(a.Id));
-      }
-      catch (Exception ex) {
-        ErrorHandling.ShowErrorDialog("Delete failed.", ex);
-      }
-    }
-    private void problemClasses_ItemsRemoved(object sender, CollectionItemsChangedEventArgs<ProblemClass> e) {
-      try {
-        foreach (ProblemClass p in e.Items)
-          CallAdministrationService(s => s.DeleteProblemClass(p.Id));
-      }
-      catch (Exception ex) {
-        ErrorHandling.ShowErrorDialog("Delete failed.", ex);
-      }
-    }
-    private void problems_ItemsRemoved(object sender, CollectionItemsChangedEventArgs<Problem> e) {
-      try {
-        foreach (Problem p in e.Items)
-          CallAdministrationService(s => s.DeleteProblem(p.Id));
-      }
-      catch (Exception ex) {
-        ErrorHandling.ShowErrorDialog("Delete failed.", ex);
-      }
-    }
     #endregion
 
     #region Helpers
-    private void CallAdministrationService(Action<IAdministrationService> call) {
+    private static void CallAdministrationService(Action<IAdministrationService> call) {
       AdministrationServiceClient client = ClientFactory.CreateClient<AdministrationServiceClient, IAdministrationService>();
       try {
@@ -298,5 +203,5 @@
       }
     }
-    private T CallAdministrationService<T>(Func<IAdministrationService, T> call) {
+    private static T CallAdministrationService<T>(Func<IAdministrationService, T> call) {
       AdministrationServiceClient client = ClientFactory.CreateClient<AdministrationServiceClient, IAdministrationService>();
       try {
Index: /branches/OKB (trunk integration)/HeuristicLab.Clients.OKB/3.3/Administration/ServiceClient/OKBItem.cs
===================================================================
--- /branches/OKB (trunk integration)/HeuristicLab.Clients.OKB/3.3/Administration/ServiceClient/OKBItem.cs	(revision 5549)
+++ /branches/OKB (trunk integration)/HeuristicLab.Clients.OKB/3.3/Administration/ServiceClient/OKBItem.cs	(revision 5550)
@@ -87,6 +87,6 @@
 
     public void Store() {
-      if (AdministrationClient.Instance.Store(this))
-        Modified = false;
+      AdministrationClient.Store(this);
+      Modified = false;
     }
 
Index: /branches/OKB (trunk integration)/HeuristicLab.Clients.OKB/3.3/Administration/ServiceClient/OKBItemCollection.cs
===================================================================
--- /branches/OKB (trunk integration)/HeuristicLab.Clients.OKB/3.3/Administration/ServiceClient/OKBItemCollection.cs	(revision 5550)
+++ /branches/OKB (trunk integration)/HeuristicLab.Clients.OKB/3.3/Administration/ServiceClient/OKBItemCollection.cs	(revision 5550)
@@ -0,0 +1,72 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2010 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+
+namespace HeuristicLab.Clients.OKB.Administration {
+  [Item("OKBItem Collection", "Represents a collection of OKB items.")]
+  public class OKBItemCollection<T> : ItemCollection<T> where T : class, IOKBItem {
+    protected OKBItemCollection(OKBItemCollection<T> original, Cloner cloner) : base(original, cloner) { }
+    public OKBItemCollection() : base() { }
+    public OKBItemCollection(IEnumerable<T> collection) : base(collection) { }
+
+    public override IDeepCloneable Clone(Cloner cloner) { return new OKBItemCollection<T>(this, cloner); }
+
+    protected override void OnItemsRemoved(IEnumerable<T> items) {
+      IEnumerable<T> successful, unsuccessful;
+      Exception ex;
+      RemoveItems(items, out successful, out unsuccessful, out ex);
+      list.AddRange(unsuccessful);
+      base.OnItemsRemoved(successful);
+      if (ex != null) throw ex;
+    }
+    protected override void OnCollectionReset(IEnumerable<T> items, IEnumerable<T> oldItems) {
+      IEnumerable<T> successful, unsuccessful;
+      Exception ex;
+      RemoveItems(oldItems, out successful, out unsuccessful, out ex);
+      list.AddRange(unsuccessful);
+      base.OnCollectionReset(items.Concat(unsuccessful), oldItems);
+      if (ex != null) throw ex;
+    }
+
+    private void RemoveItems(IEnumerable<T> items, out IEnumerable<T> successful, out IEnumerable<T> unsuccessful, out Exception exception) {
+      List<T> removed = new List<T>();
+      List<T> notremoved = new List<T>();
+      exception = null;
+      foreach (T item in items) {
+        try {
+          AdministrationClient.Delete(item);
+          removed.Add(item);
+        }
+        catch (Exception ex) {
+          exception = ex;
+          notremoved.Add(item);
+        }
+      }
+      successful = removed;
+      unsuccessful = notremoved;
+    }
+  }
+}
Index: /branches/OKB (trunk integration)/HeuristicLab.Clients.OKB/3.3/Administration/Views/AdministratorView.cs
===================================================================
--- /branches/OKB (trunk integration)/HeuristicLab.Clients.OKB/3.3/Administration/Views/AdministratorView.cs	(revision 5549)
+++ /branches/OKB (trunk integration)/HeuristicLab.Clients.OKB/3.3/Administration/Views/AdministratorView.cs	(revision 5550)
@@ -24,4 +24,5 @@
 using HeuristicLab.MainForm;
 using HeuristicLab.MainForm.WindowsForms;
+using HeuristicLab.PluginInfrastructure;
 
 namespace HeuristicLab.Clients.OKB.Administration {
@@ -49,4 +50,5 @@
       Content.Refreshed += new EventHandler(Content_Refreshed);
     }
+
 
     protected override void OnContentChanged() {
@@ -102,5 +104,5 @@
 
     private void refreshButton_Click(object sender, EventArgs e) {
-      Content.Refresh();
+      Content.RefreshAsync(new Action<Exception>((Exception ex) => ErrorHandling.ShowErrorDialog(this, "Refresh failed.", ex)));
     }
   }
Index: /branches/OKB (trunk integration)/HeuristicLab.Clients.OKB/3.3/Administration/Views/AlgorithmClassCollectionView.cs
===================================================================
--- /branches/OKB (trunk integration)/HeuristicLab.Clients.OKB/3.3/Administration/Views/AlgorithmClassCollectionView.cs	(revision 5549)
+++ /branches/OKB (trunk integration)/HeuristicLab.Clients.OKB/3.3/Administration/Views/AlgorithmClassCollectionView.cs	(revision 5550)
@@ -21,12 +21,10 @@
 
 using System.Windows.Forms;
-using HeuristicLab.Core;
-using HeuristicLab.Core.Views;
 using HeuristicLab.MainForm;
 
 namespace HeuristicLab.Clients.OKB.Administration {
   [View("AlgorithmClassCollection View")]
-  [Content(typeof(IItemCollection<AlgorithmClass>), true)]
-  public partial class AlgorithmClassCollectionView : ItemCollectionView<AlgorithmClass> {
+  [Content(typeof(OKBItemCollection<AlgorithmClass>), true)]
+  public partial class AlgorithmClassCollectionView : OKBItemCollectionView<AlgorithmClass> {
     public AlgorithmClassCollectionView() {
       InitializeComponent();
Index: /branches/OKB (trunk integration)/HeuristicLab.Clients.OKB/3.3/Administration/Views/AlgorithmCollectionView.cs
===================================================================
--- /branches/OKB (trunk integration)/HeuristicLab.Clients.OKB/3.3/Administration/Views/AlgorithmCollectionView.cs	(revision 5549)
+++ /branches/OKB (trunk integration)/HeuristicLab.Clients.OKB/3.3/Administration/Views/AlgorithmCollectionView.cs	(revision 5550)
@@ -21,12 +21,10 @@
 
 using System.Windows.Forms;
-using HeuristicLab.Core;
-using HeuristicLab.Core.Views;
 using HeuristicLab.MainForm;
 
 namespace HeuristicLab.Clients.OKB.Administration {
   [View("AlgorithmCollection View")]
-  [Content(typeof(IItemCollection<Algorithm>), true)]
-  public partial class AlgorithmCollectionView : ItemCollectionView<Algorithm> {
+  [Content(typeof(OKBItemCollection<Algorithm>), true)]
+  public partial class AlgorithmCollectionView : OKBItemCollectionView<Algorithm> {
     public AlgorithmCollectionView() {
       InitializeComponent();
Index: /branches/OKB (trunk integration)/HeuristicLab.Clients.OKB/3.3/Administration/Views/AlgorithmView.Designer.cs
===================================================================
--- /branches/OKB (trunk integration)/HeuristicLab.Clients.OKB/3.3/Administration/Views/AlgorithmView.Designer.cs	(revision 5549)
+++ /branches/OKB (trunk integration)/HeuristicLab.Clients.OKB/3.3/Administration/Views/AlgorithmView.Designer.cs	(revision 5550)
@@ -34,4 +34,5 @@
     /// </summary>
     private void InitializeComponent() {
+      System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(AlgorithmView));
       this.platformLabel = new System.Windows.Forms.Label();
       this.platformComboBox = new System.Windows.Forms.ComboBox();
@@ -122,5 +123,5 @@
       this.tabControl.SelectedIndex = 0;
       this.tabControl.Size = new System.Drawing.Size(633, 206);
-      this.tabControl.TabIndex = 9;
+      this.tabControl.TabIndex = 10;
       // 
       // usersTabPage
@@ -134,5 +135,5 @@
       this.usersTabPage.Size = new System.Drawing.Size(625, 180);
       this.usersTabPage.TabIndex = 0;
-      this.usersTabPage.Text = "Authorized Users";
+      this.usersTabPage.Text = "Authorized Users and Groups";
       this.usersTabPage.UseVisualStyleBackColor = true;
       // 
@@ -142,13 +143,15 @@
                   | System.Windows.Forms.AnchorStyles.Left)
                   | System.Windows.Forms.AnchorStyles.Right)));
+      this.usersListBox.CheckOnClick = true;
       this.usersListBox.FormattingEnabled = true;
       this.usersListBox.Location = new System.Drawing.Point(6, 35);
       this.usersListBox.Name = "usersListBox";
       this.usersListBox.Size = new System.Drawing.Size(613, 139);
-      this.usersListBox.TabIndex = 3;
+      this.usersListBox.TabIndex = 2;
+      this.usersListBox.ItemCheck += new System.Windows.Forms.ItemCheckEventHandler(this.usersListBox_ItemCheck);
       // 
       // storeUsersButton
       // 
-      this.storeUsersButton.Image = HeuristicLab.Common.Resources.VSImageLibrary.PublishToWeb;
+      this.storeUsersButton.Image = ((System.Drawing.Image)(resources.GetObject("storeUsersButton.Image")));
       this.storeUsersButton.Location = new System.Drawing.Point(36, 6);
       this.storeUsersButton.Name = "storeUsersButton";
@@ -161,5 +164,5 @@
       // refreshUsersButton
       // 
-      this.refreshUsersButton.Image = HeuristicLab.Common.Resources.VSImageLibrary.Refresh;
+      this.refreshUsersButton.Image = ((System.Drawing.Image)(resources.GetObject("refreshUsersButton.Image")));
       this.refreshUsersButton.Location = new System.Drawing.Point(6, 6);
       this.refreshUsersButton.Name = "refreshUsersButton";
@@ -186,5 +189,5 @@
       this.dataTypeNameLabel.Name = "dataTypeNameLabel";
       this.dataTypeNameLabel.Size = new System.Drawing.Size(38, 13);
-      this.dataTypeNameLabel.TabIndex = 7;
+      this.dataTypeNameLabel.TabIndex = 0;
       this.dataTypeNameLabel.Text = "&Name:";
       // 
@@ -201,5 +204,5 @@
       this.dataTypeGroupBox.Name = "dataTypeGroupBox";
       this.dataTypeGroupBox.Size = new System.Drawing.Size(633, 77);
-      this.dataTypeGroupBox.TabIndex = 10;
+      this.dataTypeGroupBox.TabIndex = 9;
       this.dataTypeGroupBox.TabStop = false;
       this.dataTypeGroupBox.Text = "Data Type";
@@ -212,15 +215,16 @@
       this.dataTypeTypeNameTextBox.Name = "dataTypeTypeNameTextBox";
       this.dataTypeTypeNameTextBox.Size = new System.Drawing.Size(507, 20);
-      this.dataTypeTypeNameTextBox.TabIndex = 8;
-      this.dataTypeTypeNameTextBox.Validated += new System.EventHandler(this.dataTypeTypeNameTextBox_Validated);
+      this.dataTypeTypeNameTextBox.TabIndex = 3;
+      this.toolTip.SetToolTip(this.dataTypeTypeNameTextBox, "Machine Readable Data Type Name (e.g. Assembly Qualified Name)");
+      this.dataTypeTypeNameTextBox.TextChanged += new System.EventHandler(this.dataTypeTypeNameTextBox_TextChanged);
       // 
       // setDataTypeButton
       // 
       this.setDataTypeButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right)));
-      this.setDataTypeButton.Image = HeuristicLab.Common.Resources.VSImageLibrary.Edit;
+      this.setDataTypeButton.Image = ((System.Drawing.Image)(resources.GetObject("setDataTypeButton.Image")));
       this.setDataTypeButton.Location = new System.Drawing.Point(603, 29);
       this.setDataTypeButton.Name = "setDataTypeButton";
       this.setDataTypeButton.Size = new System.Drawing.Size(24, 24);
-      this.setDataTypeButton.TabIndex = 1;
+      this.setDataTypeButton.TabIndex = 4;
       this.toolTip.SetToolTip(this.setDataTypeButton, "Set Data Type");
       this.setDataTypeButton.UseVisualStyleBackColor = true;
@@ -234,6 +238,7 @@
       this.dataTypeNameTextBox.Name = "dataTypeNameTextBox";
       this.dataTypeNameTextBox.Size = new System.Drawing.Size(507, 20);
-      this.dataTypeNameTextBox.TabIndex = 8;
-      this.dataTypeNameTextBox.Validated += new System.EventHandler(this.dataTypeNameTextBox_Validated);
+      this.dataTypeNameTextBox.TabIndex = 1;
+      this.toolTip.SetToolTip(this.dataTypeNameTextBox, "Human Readable Data Type Name");
+      this.dataTypeNameTextBox.TextChanged += new System.EventHandler(this.dataTypeNameTextBox_TextChanged);
       // 
       // dataTypeTypeNameLabel
@@ -243,5 +248,5 @@
       this.dataTypeTypeNameLabel.Name = "dataTypeTypeNameLabel";
       this.dataTypeTypeNameLabel.Size = new System.Drawing.Size(65, 13);
-      this.dataTypeTypeNameLabel.TabIndex = 7;
+      this.dataTypeTypeNameLabel.TabIndex = 2;
       this.dataTypeTypeNameLabel.Text = "&Type Name:";
       // 
Index: /branches/OKB (trunk integration)/HeuristicLab.Clients.OKB/3.3/Administration/Views/AlgorithmView.cs
===================================================================
--- /branches/OKB (trunk integration)/HeuristicLab.Clients.OKB/3.3/Administration/Views/AlgorithmView.cs	(revision 5549)
+++ /branches/OKB (trunk integration)/HeuristicLab.Clients.OKB/3.3/Administration/Views/AlgorithmView.cs	(revision 5550)
@@ -55,19 +55,17 @@
     }
 
-    protected override void OnInitialized(System.EventArgs e) {
-      base.OnInitialized(e);
+    protected override void OnContentChanged() {
+      base.OnContentChanged();
+
       platformComboBoxValues = AdministrationClient.Instance.Platforms.ToList();
       platformComboBox.DataSource = platformComboBoxValues;
       algorithmClassComboBoxValues = AdministrationClient.Instance.AlgorithmClasses.ToList();
       algorithmClassComboBox.DataSource = algorithmClassComboBoxValues;
-    }
 
-    protected override void OnContentChanged() {
-      base.OnContentChanged();
       if (Content == null) {
         platformComboBox.SelectedIndex = -1;
         algorithmClassComboBox.SelectedIndex = -1;
-        dataTypeNameTextBox.Text = "";
-        dataTypeTypeNameTextBox.Text = "";
+        dataTypeNameTextBox.Text = string.Empty;
+        dataTypeTypeNameTextBox.Text = string.Empty;
       } else {
         platformComboBox.SelectedItem = platformComboBoxValues.FirstOrDefault(p => p.Id == Content.PlatformId);
@@ -84,5 +82,5 @@
       algorithmClassComboBox.Enabled = (Content != null) && !ReadOnly;
       dataTypeGroupBox.Enabled = (Content != null) && !ReadOnly;
-      refreshUsersButton.Enabled = Content != null;
+      refreshUsersButton.Enabled = (Content != null) && (Content.Id != 0);
       storeUsersButton.Enabled = (usersListBox.DataSource != null) && !ReadOnly;
       usersListBox.Enabled = (usersListBox.DataSource != null) && !ReadOnly;
@@ -96,4 +94,7 @@
     protected override void OnContentPropertyChanged(string propertyName) {
       switch (propertyName) {
+        case "Id":
+          SetEnabledStateOfControls();
+          break;
         case "PlatformId":
           platformComboBox.SelectedItem = platformComboBoxValues.FirstOrDefault(p => p.Id == Content.PlatformId);
@@ -137,14 +138,17 @@
       }
     }
-    private void dataTypeNameTextBox_Validated(object sender, EventArgs e) {
-      Content.DataTypeName = dataTypeNameTextBox.Text;
+    private void dataTypeNameTextBox_TextChanged(object sender, EventArgs e) {
+      if (dataTypeNameTextBox.Text != Content.DataTypeName)
+        Content.DataTypeName = dataTypeNameTextBox.Text;
     }
-    private void dataTypeTypeNameTextBox_Validated(object sender, EventArgs e) {
-      Content.DataTypeTypeName = dataTypeTypeNameTextBox.Text;
+    private void dataTypeTypeNameTextBox_TextChanged(object sender, EventArgs e) {
+      if (dataTypeTypeNameTextBox.Text != Content.DataTypeTypeName)
+        Content.DataTypeTypeName = dataTypeTypeNameTextBox.Text;
     }
 
     private void refreshUsersButton_Click(object sender, System.EventArgs e) {
-      List<Guid> ids = AdministrationClient.Instance.GetAlgorithmUsers(Content.Id);
+      List<Guid> ids = AdministrationClient.GetAlgorithmUsers(Content.Id);
       if (ids != null) {
+        if (AuthenticationClient.Instance.Users == null) AuthenticationClient.Instance.Refresh();
         List<User> users = AuthenticationClient.Instance.Users.ToList();
         usersListBox.DataSource = users;
@@ -157,8 +161,8 @@
     }
     private void storeUsersButton_Click(object sender, System.EventArgs e) {
-      if (AdministrationClient.Instance.UpdateAlgorithmUsers(Content.Id, usersListBox.SelectedItems.Cast<User>().Select(u => u.Id).ToList()))
-        storeUsersButton.Enabled = false;
+      AdministrationClient.UpdateAlgorithmUsers(Content.Id, usersListBox.SelectedItems.Cast<User>().Select(u => u.Id).ToList());
+      storeUsersButton.Enabled = false;
     }
-    private void usersListBox_SelectedIndexChanged(object sender, EventArgs e) {
+    private void usersListBox_ItemCheck(object sender, ItemCheckEventArgs e) {
       storeUsersButton.Enabled = !ReadOnly;
     }
Index: /branches/OKB (trunk integration)/HeuristicLab.Clients.OKB/3.3/Administration/Views/NamedOKBItemView.Designer.cs
===================================================================
--- /branches/OKB (trunk integration)/HeuristicLab.Clients.OKB/3.3/Administration/Views/NamedOKBItemView.Designer.cs	(revision 5549)
+++ /branches/OKB (trunk integration)/HeuristicLab.Clients.OKB/3.3/Administration/Views/NamedOKBItemView.Designer.cs	(revision 5550)
@@ -73,5 +73,4 @@
       this.nameTextBox.TabIndex = 2;
       this.nameTextBox.TextChanged += new System.EventHandler(this.nameTextBox_TextChanged);
-      this.nameTextBox.KeyDown += new System.Windows.Forms.KeyEventHandler(this.nameTextBox_KeyDown);
       // 
       // descriptionLabel
Index: /branches/OKB (trunk integration)/HeuristicLab.Clients.OKB/3.3/Administration/Views/NamedOKBItemView.cs
===================================================================
--- /branches/OKB (trunk integration)/HeuristicLab.Clients.OKB/3.3/Administration/Views/NamedOKBItemView.cs	(revision 5549)
+++ /branches/OKB (trunk integration)/HeuristicLab.Clients.OKB/3.3/Administration/Views/NamedOKBItemView.cs	(revision 5550)
@@ -49,5 +49,5 @@
           this.Caption = ViewAttribute.GetViewName(this.GetType());
         else
-          this.Caption = "NamedEntity View";
+          this.Caption = "NamedOKBItem View";
       } else {
         nameTextBox.Text = Content.Name;
@@ -79,12 +79,4 @@
     }
 
-    protected virtual void nameTextBox_KeyDown(object sender, KeyEventArgs e) {
-      if ((e.KeyCode == Keys.Enter) || (e.KeyCode == Keys.Return))
-        nameLabel.Focus();  // set focus on label to validate data
-      if (e.KeyCode == Keys.Escape) {
-        nameTextBox.Text = Content.Name;
-        nameLabel.Focus();  // set focus on label to validate data
-      }
-    }
     protected virtual void nameTextBox_TextChanged(object sender, EventArgs e) {
       if (nameTextBox.Text != Content.Name)
Index: /branches/OKB (trunk integration)/HeuristicLab.Clients.OKB/3.3/Administration/Views/OKBItemCollectionView.Designer.cs
===================================================================
--- /branches/OKB (trunk integration)/HeuristicLab.Clients.OKB/3.3/Administration/Views/OKBItemCollectionView.Designer.cs	(revision 5550)
+++ /branches/OKB (trunk integration)/HeuristicLab.Clients.OKB/3.3/Administration/Views/OKBItemCollectionView.Designer.cs	(revision 5550)
@@ -0,0 +1,53 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2010 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+namespace HeuristicLab.Clients.OKB.Administration {
+  partial class OKBItemCollectionView<T> {
+    /// <summary> 
+    /// Required designer variable.
+    /// </summary>
+    private System.ComponentModel.IContainer components = null;
+
+    /// <summary> 
+    /// Clean up any resources being used.
+    /// </summary>
+    /// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
+    protected override void Dispose(bool disposing) {
+      if (disposing) {
+        if (components != null) components.Dispose();
+      }
+      base.Dispose(disposing);
+    }
+
+    #region Component Designer generated code
+
+    /// <summary> 
+    /// Required method for Designer support - do not modify 
+    /// the contents of this method with the code editor.
+    /// </summary>
+    private void InitializeComponent() {
+      components = new System.ComponentModel.Container();
+      this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
+    }
+
+    #endregion
+  }
+}
Index: /branches/OKB (trunk integration)/HeuristicLab.Clients.OKB/3.3/Administration/Views/OKBItemCollectionView.cs
===================================================================
--- /branches/OKB (trunk integration)/HeuristicLab.Clients.OKB/3.3/Administration/Views/OKBItemCollectionView.cs	(revision 5550)
+++ /branches/OKB (trunk integration)/HeuristicLab.Clients.OKB/3.3/Administration/Views/OKBItemCollectionView.cs	(revision 5550)
@@ -0,0 +1,62 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2010 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.Windows.Forms;
+using HeuristicLab.Core.Views;
+using HeuristicLab.MainForm;
+using HeuristicLab.PluginInfrastructure;
+
+namespace HeuristicLab.Clients.OKB.Administration {
+  [View("OKBItemCollection View")]
+  [Content(typeof(OKBItemCollection<>), true)]
+  public partial class OKBItemCollectionView<T> : ItemCollectionView<T> where T : class, IOKBItem {
+    public OKBItemCollectionView() {
+      InitializeComponent();
+      itemsGroupBox.Text = "OKB Items";
+    }
+
+    protected override void removeButton_Click(object sender, System.EventArgs e) {
+      try {
+        base.removeButton_Click(sender, e);
+      }
+      catch (Exception ex) {
+        ErrorHandling.ShowErrorDialog(this, "Delete failed.", ex);
+      }
+    }
+    protected override void itemsListView_KeyDown(object sender, KeyEventArgs e) {
+      try {
+        base.itemsListView_KeyDown(sender, e);
+      }
+      catch (Exception ex) {
+        ErrorHandling.ShowErrorDialog(this, "Delete failed.", ex);
+      }
+    }
+    protected override void itemsListView_ItemDrag(object sender, ItemDragEventArgs e) {
+      try {
+        base.itemsListView_ItemDrag(sender, e);
+      }
+      catch (Exception ex) {
+        ErrorHandling.ShowErrorDialog(this, "Delete failed.", ex);
+      }
+    }
+  }
+}
Index: /branches/OKB (trunk integration)/HeuristicLab.Clients.OKB/3.3/Administration/Views/OKBItemView.cs
===================================================================
--- /branches/OKB (trunk integration)/HeuristicLab.Clients.OKB/3.3/Administration/Views/OKBItemView.cs	(revision 5549)
+++ /branches/OKB (trunk integration)/HeuristicLab.Clients.OKB/3.3/Administration/Views/OKBItemView.cs	(revision 5550)
@@ -26,4 +26,5 @@
 using HeuristicLab.MainForm;
 using HeuristicLab.MainForm.WindowsForms;
+using HeuristicLab.PluginInfrastructure;
 
 namespace HeuristicLab.Clients.OKB.Administration {
@@ -73,5 +74,10 @@
 
     protected virtual void storeButton_Click(object sender, EventArgs e) {
-      Content.Store();
+      try {
+        Content.Store();
+      }
+      catch (Exception ex) {
+        ErrorHandling.ShowErrorDialog(this, "Store failed.", ex);
+      }
     }
   }
Index: /branches/OKB (trunk integration)/HeuristicLab.Clients.OKB/3.3/Administration/Views/PlatformCollectionView.cs
===================================================================
--- /branches/OKB (trunk integration)/HeuristicLab.Clients.OKB/3.3/Administration/Views/PlatformCollectionView.cs	(revision 5549)
+++ /branches/OKB (trunk integration)/HeuristicLab.Clients.OKB/3.3/Administration/Views/PlatformCollectionView.cs	(revision 5550)
@@ -21,12 +21,10 @@
 
 using System.Windows.Forms;
-using HeuristicLab.Core;
-using HeuristicLab.Core.Views;
 using HeuristicLab.MainForm;
 
 namespace HeuristicLab.Clients.OKB.Administration {
   [View("PlatformCollection View")]
-  [Content(typeof(IItemCollection<Platform>), true)]
-  public partial class PlatformCollectionView : ItemCollectionView<Platform> {
+  [Content(typeof(OKBItemCollection<Platform>), true)]
+  public partial class PlatformCollectionView : OKBItemCollectionView<Platform> {
     public PlatformCollectionView() {
       InitializeComponent();
Index: /branches/OKB (trunk integration)/HeuristicLab.Clients.OKB/3.3/Administration/Views/ProblemClassCollectionView.cs
===================================================================
--- /branches/OKB (trunk integration)/HeuristicLab.Clients.OKB/3.3/Administration/Views/ProblemClassCollectionView.cs	(revision 5549)
+++ /branches/OKB (trunk integration)/HeuristicLab.Clients.OKB/3.3/Administration/Views/ProblemClassCollectionView.cs	(revision 5550)
@@ -21,12 +21,10 @@
 
 using System.Windows.Forms;
-using HeuristicLab.Core;
-using HeuristicLab.Core.Views;
 using HeuristicLab.MainForm;
 
 namespace HeuristicLab.Clients.OKB.Administration {
   [View("ProblemClassCollection View")]
-  [Content(typeof(IItemCollection<ProblemClass>), true)]
-  public partial class ProblemClassCollectionView : ItemCollectionView<ProblemClass> {
+  [Content(typeof(OKBItemCollection<ProblemClass>), true)]
+  public partial class ProblemClassCollectionView : OKBItemCollectionView<ProblemClass> {
     public ProblemClassCollectionView() {
       InitializeComponent();
Index: /branches/OKB (trunk integration)/HeuristicLab.Clients.OKB/3.3/Administration/Views/ProblemCollectionView.cs
===================================================================
--- /branches/OKB (trunk integration)/HeuristicLab.Clients.OKB/3.3/Administration/Views/ProblemCollectionView.cs	(revision 5549)
+++ /branches/OKB (trunk integration)/HeuristicLab.Clients.OKB/3.3/Administration/Views/ProblemCollectionView.cs	(revision 5550)
@@ -21,12 +21,10 @@
 
 using System.Windows.Forms;
-using HeuristicLab.Core;
-using HeuristicLab.Core.Views;
 using HeuristicLab.MainForm;
 
 namespace HeuristicLab.Clients.OKB.Administration {
   [View("ProblemCollection View")]
-  [Content(typeof(IItemCollection<Problem>), true)]
-  public partial class ProblemCollectionView : ItemCollectionView<Problem> {
+  [Content(typeof(OKBItemCollection<Problem>), true)]
+  public partial class ProblemCollectionView : OKBItemCollectionView<Problem> {
     public ProblemCollectionView() {
       InitializeComponent();
Index: /branches/OKB (trunk integration)/HeuristicLab.Clients.OKB/3.3/Administration/Views/ProblemView.cs
===================================================================
--- /branches/OKB (trunk integration)/HeuristicLab.Clients.OKB/3.3/Administration/Views/ProblemView.cs	(revision 5549)
+++ /branches/OKB (trunk integration)/HeuristicLab.Clients.OKB/3.3/Administration/Views/ProblemView.cs	(revision 5550)
@@ -98,5 +98,5 @@
 
     private void refreshUsersButton_Click(object sender, System.EventArgs e) {
-      List<Guid> ids = AdministrationClient.Instance.GetProblemUsers(Content.Id);
+      List<Guid> ids = AdministrationClient.GetProblemUsers(Content.Id);
       if (ids != null) {
         List<User> users = AuthenticationClient.Instance.Users.ToList();
@@ -111,6 +111,6 @@
     }
     private void storeUsersButton_Click(object sender, System.EventArgs e) {
-      if (AdministrationClient.Instance.UpdateProblemUsers(Content.Id, usersListBox.SelectedItems.Cast<User>().Select(u => u.Id).ToList()))
-        storeUsersButton.Enabled = false;
+      AdministrationClient.UpdateProblemUsers(Content.Id, usersListBox.SelectedItems.Cast<User>().Select(u => u.Id).ToList());
+      storeUsersButton.Enabled = false;
     }
     private void usersListBox_SelectedIndexChanged(object sender, EventArgs e) {
Index: /branches/OKB (trunk integration)/HeuristicLab.Clients.OKB/3.3/Authentication/AuthenticationClient.cs
===================================================================
--- /branches/OKB (trunk integration)/HeuristicLab.Clients.OKB/3.3/Authentication/AuthenticationClient.cs	(revision 5549)
+++ /branches/OKB (trunk integration)/HeuristicLab.Clients.OKB/3.3/Authentication/AuthenticationClient.cs	(revision 5550)
@@ -51,19 +51,31 @@
     public void Refresh() {
       OnRefreshing();
-
+      try {
+        users = CallAuthenticationService<List<User>>(s => s.GetUsers()).OrderBy(x => x.Name);
+      }
+      finally {
+        OnRefreshed();
+      }
+    }
+    public void RefreshAsync(Action<Exception> exceptionCallback) {
       var call = new Func<Exception>(delegate() {
         try {
-          users = CallAuthenticationService<List<User>>(s => s.GetUsers()).OrderBy(x => x.Name);
-          return null;
+          Refresh();
         }
         catch (Exception ex) {
           return ex;
         }
+        return null;
       });
       call.BeginInvoke(delegate(IAsyncResult result) {
         Exception ex = call.EndInvoke(result);
-        if (ex != null) ErrorHandling.ShowErrorDialog("Refresh failed.", ex);
-        OnRefreshed();
+        if (ex != null) exceptionCallback(ex);
       }, null);
+    }
+    #endregion
+
+    #region User Methods
+    public static IEnumerable<User> GetUsers() {
+      return CallAuthenticationService<List<User>>(s => s.GetUsers()).OrderBy(x => x.Name);
     }
     #endregion
@@ -83,5 +95,5 @@
 
     #region Helpers
-    private T CallAuthenticationService<T>(Func<IAuthenticationService, T> call) {
+    private static T CallAuthenticationService<T>(Func<IAuthenticationService, T> call) {
       AuthenticationServiceClient client = ClientFactory.CreateClient<AuthenticationServiceClient, IAuthenticationService>();
       try {
Index: /branches/OKB (trunk integration)/HeuristicLab.Clients.OKB/3.3/HeuristicLab.Clients.OKB-3.3.csproj
===================================================================
--- /branches/OKB (trunk integration)/HeuristicLab.Clients.OKB/3.3/HeuristicLab.Clients.OKB-3.3.csproj	(revision 5549)
+++ /branches/OKB (trunk integration)/HeuristicLab.Clients.OKB/3.3/HeuristicLab.Clients.OKB-3.3.csproj	(revision 5550)
@@ -104,4 +104,5 @@
     <Compile Include="Administration\ServiceClient\Algorithm.cs" />
     <Compile Include="Administration\ServiceClient\AlgorithmClass.cs" />
+    <Compile Include="Administration\ServiceClient\OKBItemCollection.cs" />
     <Compile Include="Administration\ServiceClient\INamedOKBItem.cs" />
     <Compile Include="Administration\ServiceClient\IOKBItem.cs" />
@@ -134,4 +135,10 @@
     <Compile Include="Administration\Views\AlgorithmView.Designer.cs">
       <DependentUpon>AlgorithmView.cs</DependentUpon>
+    </Compile>
+    <Compile Include="Administration\Views\OKBItemCollectionView.cs">
+      <SubType>UserControl</SubType>
+    </Compile>
+    <Compile Include="Administration\Views\OKBItemCollectionView.Designer.cs">
+      <DependentUpon>OKBItemCollectionView.cs</DependentUpon>
     </Compile>
     <Compile Include="Administration\Views\NamedOKBItemView.cs">
@@ -189,4 +196,9 @@
     <None Include="HeuristicLabClientsOKBPlugin.cs.frame" />
   </ItemGroup>
+  <ItemGroup>
+    <EmbeddedResource Include="Administration\Views\AlgorithmView.resx">
+      <DependentUpon>AlgorithmView.cs</DependentUpon>
+    </EmbeddedResource>
+  </ItemGroup>
   <Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
   <PropertyGroup>
