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 5533)
+++ branches/OKB (trunk integration)/HeuristicLab.Clients.OKB/3.3/Administration/AdministrationClient.cs	(revision 5533)
@@ -0,0 +1,316 @@
+﻿#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.Clients.Common;
+using HeuristicLab.Collections;
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.PluginInfrastructure;
+
+namespace HeuristicLab.Clients.OKB.Administration {
+  [Item("AdministrationClient", "OKB administration client.")]
+  public sealed class AdministrationClient : IContent {
+    private static AdministrationClient instance;
+    public static AdministrationClient Instance {
+      get {
+        if (instance == null) instance = new AdministrationClient();
+        return instance;
+      }
+    }
+
+    #region Properties
+    private ItemCollection<Platform> platforms;
+    public ItemCollection<Platform> Platforms {
+      get { return platforms; }
+    }
+    private ItemCollection<AlgorithmClass> algorithmClasses;
+    public ItemCollection<AlgorithmClass> AlgorithmClasses {
+      get { return algorithmClasses; }
+    }
+    private ItemCollection<Algorithm> algorithms;
+    public ItemCollection<Algorithm> Algorithms {
+      get { return algorithms; }
+    }
+    private ItemCollection<ProblemClass> problemClasses;
+    public ItemCollection<ProblemClass> ProblemClasses {
+      get { return problemClasses; }
+    }
+    private ItemCollection<Problem> problems;
+    public ItemCollection<Problem> Problems {
+      get { return problems; }
+    }
+    #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);
+    }
+
+    #region Refresh
+    public void Refresh() {
+      OnRefreshing();
+
+      platforms.Clear();
+      algorithmClasses.Clear();
+      algorithms.Clear();
+      problemClasses.Clear();
+      problems.Clear();
+
+      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;
+        }
+        catch (Exception ex) {
+          return ex;
+        }
+      });
+      call.BeginInvoke(delegate(IAsyncResult result) {
+        Exception ex = call.EndInvoke(result);
+        if (ex != null) ErrorHandling.ShowErrorDialog("Refresh failed.", ex);
+        OnRefreshed();
+      }, null);
+    }
+    #endregion
+
+    #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;
+      }
+    }
+    #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;
+      }
+    }
+    #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;
+      }
+    }
+    #endregion
+
+    #region Events
+    public event EventHandler Refreshing;
+    private void OnRefreshing() {
+      EventHandler handler = Refreshing;
+      if (handler != null) handler(this, EventArgs.Empty);
+    }
+    public event EventHandler Refreshed;
+    private void OnRefreshed() {
+      EventHandler 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) {
+      AdministrationServiceClient client = ClientFactory.CreateClient<AdministrationServiceClient, IAdministrationService>();
+      try {
+        call(client);
+      }
+      finally {
+        try {
+          client.Close();
+        }
+        catch (Exception) {
+          client.Abort();
+        }
+      }
+    }
+    private T CallAdministrationService<T>(Func<IAdministrationService, T> call) {
+      AdministrationServiceClient client = ClientFactory.CreateClient<AdministrationServiceClient, IAdministrationService>();
+      try {
+        return call(client);
+      }
+      finally {
+        try {
+          client.Close();
+        }
+        catch (Exception) {
+          client.Abort();
+        }
+      }
+    }
+    #endregion
+  }
+}
Index: branches/OKB (trunk integration)/HeuristicLab.Clients.OKB/3.3/Administration/AdministratorMenuItem.cs
===================================================================
--- branches/OKB (trunk integration)/HeuristicLab.Clients.OKB/3.3/Administration/AdministratorMenuItem.cs	(revision 5533)
+++ branches/OKB (trunk integration)/HeuristicLab.Clients.OKB/3.3/Administration/AdministratorMenuItem.cs	(revision 5533)
@@ -0,0 +1,42 @@
+﻿#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.Collections.Generic;
+using HeuristicLab.MainForm;
+using HeuristicLab.Optimizer;
+
+namespace HeuristicLab.Clients.OKB.Administration {
+  internal class AdministratorMenuItem : HeuristicLab.MainForm.WindowsForms.MenuItem, IOptimizerUserInterfaceItemProvider {
+    public override string Name {
+      get { return "&Administrator"; }
+    }
+    public override IEnumerable<string> Structure {
+      get { return new string[] { "&Services", "&OKB" }; }
+    }
+    public override int Position {
+      get { return 4210; }
+    }
+
+    public override void Execute() {
+      MainFormManager.MainForm.ShowContent(AdministrationClient.Instance);
+    }
+  }
+}
Index: branches/OKB (trunk integration)/HeuristicLab.Clients.OKB/3.3/Administration/ServiceClient/AdministrationServiceClient.cs
===================================================================
--- branches/OKB (trunk integration)/HeuristicLab.Clients.OKB/3.3/Administration/ServiceClient/AdministrationServiceClient.cs	(revision 5504)
+++ branches/OKB (trunk integration)/HeuristicLab.Clients.OKB/3.3/Administration/ServiceClient/AdministrationServiceClient.cs	(revision 5533)
@@ -9,606 +9,500 @@
 //------------------------------------------------------------------------------
 
-namespace HeuristicLab.Clients.OKB.Administration
-{
-    using System.Runtime.Serialization;
-    
-    
-    [System.Diagnostics.DebuggerStepThroughAttribute()]
-    [System.CodeDom.Compiler.GeneratedCodeAttribute("System.Runtime.Serialization", "4.0.0.0")]
-    [System.Runtime.Serialization.DataContractAttribute(Name="Platform", Namespace="http://schemas.datacontract.org/2004/07/HeuristicLab.Services.OKB.Administration." +
-        "DataTransfer")]
-    public partial class Platform : HeuristicLab.Clients.OKB.Administration.NamedOKBItem
-    {
-    }
-    
-    [System.Diagnostics.DebuggerStepThroughAttribute()]
-    [System.CodeDom.Compiler.GeneratedCodeAttribute("System.Runtime.Serialization", "4.0.0.0")]
-    [System.Runtime.Serialization.DataContractAttribute(Name="OKBItem", Namespace="http://schemas.datacontract.org/2004/07/HeuristicLab.Services.OKB.Administration." +
-        "DataTransfer")]
-    [System.Runtime.Serialization.KnownTypeAttribute(typeof(HeuristicLab.Clients.OKB.Administration.NamedOKBItem))]
-    [System.Runtime.Serialization.KnownTypeAttribute(typeof(HeuristicLab.Clients.OKB.Administration.AlgorithmClass))]
-    [System.Runtime.Serialization.KnownTypeAttribute(typeof(HeuristicLab.Clients.OKB.Administration.Algorithm))]
-    [System.Runtime.Serialization.KnownTypeAttribute(typeof(HeuristicLab.Clients.OKB.Administration.ProblemClass))]
-    [System.Runtime.Serialization.KnownTypeAttribute(typeof(HeuristicLab.Clients.OKB.Administration.Problem))]
-    [System.Runtime.Serialization.KnownTypeAttribute(typeof(HeuristicLab.Clients.OKB.Administration.Platform))]
-    public partial class OKBItem : object, System.Runtime.Serialization.IExtensibleDataObject, System.ComponentModel.INotifyPropertyChanged
-    {
-        
-        private System.Runtime.Serialization.ExtensionDataObject extensionDataField;
-        
-        private long IdField;
-        
-        public System.Runtime.Serialization.ExtensionDataObject ExtensionData
-        {
-            get
-            {
-                return this.extensionDataField;
-            }
-            set
-            {
-                this.extensionDataField = value;
-            }
-        }
-        
-        [System.Runtime.Serialization.DataMemberAttribute()]
-        public long Id
-        {
-            get
-            {
-                return this.IdField;
-            }
-            set
-            {
-                if ((this.IdField.Equals(value) != true))
-                {
-                    this.IdField = value;
-                    this.RaisePropertyChanged("Id");
-                }
-            }
-        }
-        
-        public event System.ComponentModel.PropertyChangedEventHandler PropertyChanged;
-        
-        protected void RaisePropertyChanged(string propertyName)
-        {
-            System.ComponentModel.PropertyChangedEventHandler propertyChanged = this.PropertyChanged;
-            if ((propertyChanged != null))
-            {
-                propertyChanged(this, new System.ComponentModel.PropertyChangedEventArgs(propertyName));
-            }
-        }
-    }
-    
-    [System.Diagnostics.DebuggerStepThroughAttribute()]
-    [System.CodeDom.Compiler.GeneratedCodeAttribute("System.Runtime.Serialization", "4.0.0.0")]
-    [System.Runtime.Serialization.DataContractAttribute(Name="NamedOKBItem", Namespace="http://schemas.datacontract.org/2004/07/HeuristicLab.Services.OKB.Administration." +
-        "DataTransfer")]
-    [System.Runtime.Serialization.KnownTypeAttribute(typeof(HeuristicLab.Clients.OKB.Administration.AlgorithmClass))]
-    [System.Runtime.Serialization.KnownTypeAttribute(typeof(HeuristicLab.Clients.OKB.Administration.Algorithm))]
-    [System.Runtime.Serialization.KnownTypeAttribute(typeof(HeuristicLab.Clients.OKB.Administration.ProblemClass))]
-    [System.Runtime.Serialization.KnownTypeAttribute(typeof(HeuristicLab.Clients.OKB.Administration.Problem))]
-    [System.Runtime.Serialization.KnownTypeAttribute(typeof(HeuristicLab.Clients.OKB.Administration.Platform))]
-    public partial class NamedOKBItem : HeuristicLab.Clients.OKB.Administration.OKBItem
-    {
-        
-        private string DescriptionField;
-        
-        private string NameField;
-        
-        [System.Runtime.Serialization.DataMemberAttribute()]
-        public string Description
-        {
-            get
-            {
-                return this.DescriptionField;
-            }
-            set
-            {
-                if ((object.ReferenceEquals(this.DescriptionField, value) != true))
-                {
-                    this.DescriptionField = value;
-                    this.RaisePropertyChanged("Description");
-                }
-            }
-        }
-        
-        [System.Runtime.Serialization.DataMemberAttribute()]
-        public string Name
-        {
-            get
-            {
-                return this.NameField;
-            }
-            set
-            {
-                if ((object.ReferenceEquals(this.NameField, value) != true))
-                {
-                    this.NameField = value;
-                    this.RaisePropertyChanged("Name");
-                }
-            }
-        }
-    }
-    
-    [System.Diagnostics.DebuggerStepThroughAttribute()]
-    [System.CodeDom.Compiler.GeneratedCodeAttribute("System.Runtime.Serialization", "4.0.0.0")]
-    [System.Runtime.Serialization.DataContractAttribute(Name="AlgorithmClass", Namespace="http://schemas.datacontract.org/2004/07/HeuristicLab.Services.OKB.Administration." +
-        "DataTransfer")]
-    public partial class AlgorithmClass : HeuristicLab.Clients.OKB.Administration.NamedOKBItem
-    {
-    }
-    
-    [System.Diagnostics.DebuggerStepThroughAttribute()]
-    [System.CodeDom.Compiler.GeneratedCodeAttribute("System.Runtime.Serialization", "4.0.0.0")]
-    [System.Runtime.Serialization.DataContractAttribute(Name="Algorithm", Namespace="http://schemas.datacontract.org/2004/07/HeuristicLab.Services.OKB.Administration." +
-        "DataTransfer")]
-    public partial class Algorithm : HeuristicLab.Clients.OKB.Administration.NamedOKBItem
-    {
-        
-        private long AlgorithmClassIdField;
-        
-        private HeuristicLab.Clients.OKB.Administration.DataType DataTypeField;
-        
-        private long PlatformIdField;
-        
-        [System.Runtime.Serialization.DataMemberAttribute()]
-        public long AlgorithmClassId
-        {
-            get
-            {
-                return this.AlgorithmClassIdField;
-            }
-            set
-            {
-                if ((this.AlgorithmClassIdField.Equals(value) != true))
-                {
-                    this.AlgorithmClassIdField = value;
-                    this.RaisePropertyChanged("AlgorithmClassId");
-                }
-            }
-        }
-        
-        [System.Runtime.Serialization.DataMemberAttribute()]
-        public HeuristicLab.Clients.OKB.Administration.DataType DataType
-        {
-            get
-            {
-                return this.DataTypeField;
-            }
-            set
-            {
-                if ((object.ReferenceEquals(this.DataTypeField, value) != true))
-                {
-                    this.DataTypeField = value;
-                    this.RaisePropertyChanged("DataType");
-                }
-            }
-        }
-        
-        [System.Runtime.Serialization.DataMemberAttribute()]
-        public long PlatformId
-        {
-            get
-            {
-                return this.PlatformIdField;
-            }
-            set
-            {
-                if ((this.PlatformIdField.Equals(value) != true))
-                {
-                    this.PlatformIdField = value;
-                    this.RaisePropertyChanged("PlatformId");
-                }
-            }
-        }
-    }
-    
-    [System.Diagnostics.DebuggerStepThroughAttribute()]
-    [System.CodeDom.Compiler.GeneratedCodeAttribute("System.Runtime.Serialization", "4.0.0.0")]
-    [System.Runtime.Serialization.DataContractAttribute(Name="ProblemClass", Namespace="http://schemas.datacontract.org/2004/07/HeuristicLab.Services.OKB.Administration." +
-        "DataTransfer")]
-    public partial class ProblemClass : HeuristicLab.Clients.OKB.Administration.NamedOKBItem
-    {
-    }
-    
-    [System.Diagnostics.DebuggerStepThroughAttribute()]
-    [System.CodeDom.Compiler.GeneratedCodeAttribute("System.Runtime.Serialization", "4.0.0.0")]
-    [System.Runtime.Serialization.DataContractAttribute(Name="Problem", Namespace="http://schemas.datacontract.org/2004/07/HeuristicLab.Services.OKB.Administration." +
-        "DataTransfer")]
-    public partial class Problem : HeuristicLab.Clients.OKB.Administration.NamedOKBItem
-    {
-        
-        private HeuristicLab.Clients.OKB.Administration.DataType DataTypeField;
-        
-        private long PlatformIdField;
-        
-        private long ProblemClassIdField;
-        
-        [System.Runtime.Serialization.DataMemberAttribute()]
-        public HeuristicLab.Clients.OKB.Administration.DataType DataType
-        {
-            get
-            {
-                return this.DataTypeField;
-            }
-            set
-            {
-                if ((object.ReferenceEquals(this.DataTypeField, value) != true))
-                {
-                    this.DataTypeField = value;
-                    this.RaisePropertyChanged("DataType");
-                }
-            }
-        }
-        
-        [System.Runtime.Serialization.DataMemberAttribute()]
-        public long PlatformId
-        {
-            get
-            {
-                return this.PlatformIdField;
-            }
-            set
-            {
-                if ((this.PlatformIdField.Equals(value) != true))
-                {
-                    this.PlatformIdField = value;
-                    this.RaisePropertyChanged("PlatformId");
-                }
-            }
-        }
-        
-        [System.Runtime.Serialization.DataMemberAttribute()]
-        public long ProblemClassId
-        {
-            get
-            {
-                return this.ProblemClassIdField;
-            }
-            set
-            {
-                if ((this.ProblemClassIdField.Equals(value) != true))
-                {
-                    this.ProblemClassIdField = value;
-                    this.RaisePropertyChanged("ProblemClassId");
-                }
-            }
-        }
-    }
-    
-    [System.Diagnostics.DebuggerStepThroughAttribute()]
-    [System.CodeDom.Compiler.GeneratedCodeAttribute("System.Runtime.Serialization", "4.0.0.0")]
-    [System.Runtime.Serialization.DataContractAttribute(Name="DataType", Namespace="http://schemas.datacontract.org/2004/07/HeuristicLab.Services.OKB.Administration." +
-        "DataTransfer")]
-    public partial class DataType : object, System.Runtime.Serialization.IExtensibleDataObject, System.ComponentModel.INotifyPropertyChanged
-    {
-        
-        private System.Runtime.Serialization.ExtensionDataObject extensionDataField;
-        
-        private string NameField;
-        
-        private string TypeNameField;
-        
-        public System.Runtime.Serialization.ExtensionDataObject ExtensionData
-        {
-            get
-            {
-                return this.extensionDataField;
-            }
-            set
-            {
-                this.extensionDataField = value;
-            }
-        }
-        
-        [System.Runtime.Serialization.DataMemberAttribute()]
-        public string Name
-        {
-            get
-            {
-                return this.NameField;
-            }
-            set
-            {
-                if ((object.ReferenceEquals(this.NameField, value) != true))
-                {
-                    this.NameField = value;
-                    this.RaisePropertyChanged("Name");
-                }
-            }
-        }
-        
-        [System.Runtime.Serialization.DataMemberAttribute()]
-        public string TypeName
-        {
-            get
-            {
-                return this.TypeNameField;
-            }
-            set
-            {
-                if ((object.ReferenceEquals(this.TypeNameField, value) != true))
-                {
-                    this.TypeNameField = value;
-                    this.RaisePropertyChanged("TypeName");
-                }
-            }
-        }
-        
-        public event System.ComponentModel.PropertyChangedEventHandler PropertyChanged;
-        
-        protected void RaisePropertyChanged(string propertyName)
-        {
-            System.ComponentModel.PropertyChangedEventHandler propertyChanged = this.PropertyChanged;
-            if ((propertyChanged != null))
-            {
-                propertyChanged(this, new System.ComponentModel.PropertyChangedEventArgs(propertyName));
-            }
-        }
-    }
-    
-    [System.CodeDom.Compiler.GeneratedCodeAttribute("System.ServiceModel", "4.0.0.0")]
-    [System.ServiceModel.ServiceContractAttribute(ConfigurationName="HeuristicLab.Clients.OKB.Administration.IAdministrationService")]
-    public interface IAdministrationService
-    {
-        
-        [System.ServiceModel.OperationContractAttribute(Action="http://tempuri.org/IAdministrationService/UpdateProblemUsers", ReplyAction="http://tempuri.org/IAdministrationService/UpdateProblemUsersResponse")]
-        void UpdateProblemUsers(long problemId, System.Collections.Generic.List<System.Guid> users);
-        
-        [System.ServiceModel.OperationContractAttribute(Action="http://tempuri.org/IAdministrationService/GetProblemData", ReplyAction="http://tempuri.org/IAdministrationService/GetProblemDataResponse")]
-        byte[] GetProblemData(long problemId);
-        
-        [System.ServiceModel.OperationContractAttribute(Action="http://tempuri.org/IAdministrationService/UpdateProblemData", ReplyAction="http://tempuri.org/IAdministrationService/UpdateProblemDataResponse")]
-        void UpdateProblemData(long problemId, byte[] data);
-        
-        [System.ServiceModel.OperationContractAttribute(Action="http://tempuri.org/IAdministrationService/GetPlatforms", ReplyAction="http://tempuri.org/IAdministrationService/GetPlatformsResponse")]
-        System.Collections.Generic.List<HeuristicLab.Clients.OKB.Administration.Platform> GetPlatforms();
-        
-        [System.ServiceModel.OperationContractAttribute(Action="http://tempuri.org/IAdministrationService/AddPlatform", ReplyAction="http://tempuri.org/IAdministrationService/AddPlatformResponse")]
-        long AddPlatform(HeuristicLab.Clients.OKB.Administration.Platform dto);
-        
-        [System.ServiceModel.OperationContractAttribute(Action="http://tempuri.org/IAdministrationService/UpdatePlatform", ReplyAction="http://tempuri.org/IAdministrationService/UpdatePlatformResponse")]
-        void UpdatePlatform(HeuristicLab.Clients.OKB.Administration.Platform dto);
-        
-        [System.ServiceModel.OperationContractAttribute(Action="http://tempuri.org/IAdministrationService/DeletePlatform", ReplyAction="http://tempuri.org/IAdministrationService/DeletePlatformResponse")]
-        void DeletePlatform(long id);
-        
-        [System.ServiceModel.OperationContractAttribute(Action="http://tempuri.org/IAdministrationService/GetAlgorithmClasses", ReplyAction="http://tempuri.org/IAdministrationService/GetAlgorithmClassesResponse")]
-        System.Collections.Generic.List<HeuristicLab.Clients.OKB.Administration.AlgorithmClass> GetAlgorithmClasses();
-        
-        [System.ServiceModel.OperationContractAttribute(Action="http://tempuri.org/IAdministrationService/AddAlgorithmClass", ReplyAction="http://tempuri.org/IAdministrationService/AddAlgorithmClassResponse")]
-        long AddAlgorithmClass(HeuristicLab.Clients.OKB.Administration.AlgorithmClass dto);
-        
-        [System.ServiceModel.OperationContractAttribute(Action="http://tempuri.org/IAdministrationService/UpdateAlgorithmClass", ReplyAction="http://tempuri.org/IAdministrationService/UpdateAlgorithmClassResponse")]
-        void UpdateAlgorithmClass(HeuristicLab.Clients.OKB.Administration.AlgorithmClass dto);
-        
-        [System.ServiceModel.OperationContractAttribute(Action="http://tempuri.org/IAdministrationService/DeleteAlgorithmClass", ReplyAction="http://tempuri.org/IAdministrationService/DeleteAlgorithmClassResponse")]
-        void DeleteAlgorithmClass(long id);
-        
-        [System.ServiceModel.OperationContractAttribute(Action="http://tempuri.org/IAdministrationService/GetAlgorithms", ReplyAction="http://tempuri.org/IAdministrationService/GetAlgorithmsResponse")]
-        System.Collections.Generic.List<HeuristicLab.Clients.OKB.Administration.Algorithm> GetAlgorithms();
-        
-        [System.ServiceModel.OperationContractAttribute(Action="http://tempuri.org/IAdministrationService/AddAlgorithm", ReplyAction="http://tempuri.org/IAdministrationService/AddAlgorithmResponse")]
-        long AddAlgorithm(HeuristicLab.Clients.OKB.Administration.Algorithm dto);
-        
-        [System.ServiceModel.OperationContractAttribute(Action="http://tempuri.org/IAdministrationService/UpdateAlgorithm", ReplyAction="http://tempuri.org/IAdministrationService/UpdateAlgorithmResponse")]
-        void UpdateAlgorithm(HeuristicLab.Clients.OKB.Administration.Algorithm dto);
-        
-        [System.ServiceModel.OperationContractAttribute(Action="http://tempuri.org/IAdministrationService/DeleteAlgorithm", ReplyAction="http://tempuri.org/IAdministrationService/DeleteAlgorithmResponse")]
-        void DeleteAlgorithm(long id);
-        
-        [System.ServiceModel.OperationContractAttribute(Action="http://tempuri.org/IAdministrationService/GetAlgorithmUsers", ReplyAction="http://tempuri.org/IAdministrationService/GetAlgorithmUsersResponse")]
-        System.Collections.Generic.List<System.Guid> GetAlgorithmUsers(long algorithmId);
-        
-        [System.ServiceModel.OperationContractAttribute(Action="http://tempuri.org/IAdministrationService/UpdateAlgorithmUsers", ReplyAction="http://tempuri.org/IAdministrationService/UpdateAlgorithmUsersResponse")]
-        void UpdateAlgorithmUsers(long algorithmId, System.Collections.Generic.List<System.Guid> users);
-        
-        [System.ServiceModel.OperationContractAttribute(Action="http://tempuri.org/IAdministrationService/GetAlgorithmData", ReplyAction="http://tempuri.org/IAdministrationService/GetAlgorithmDataResponse")]
-        byte[] GetAlgorithmData(long algorithmId);
-        
-        [System.ServiceModel.OperationContractAttribute(Action="http://tempuri.org/IAdministrationService/UpdateAlgorithmData", ReplyAction="http://tempuri.org/IAdministrationService/UpdateAlgorithmDataResponse")]
-        void UpdateAlgorithmData(long algorithmId, byte[] data);
-        
-        [System.ServiceModel.OperationContractAttribute(Action="http://tempuri.org/IAdministrationService/GetProblemClasses", ReplyAction="http://tempuri.org/IAdministrationService/GetProblemClassesResponse")]
-        System.Collections.Generic.List<HeuristicLab.Clients.OKB.Administration.ProblemClass> GetProblemClasses();
-        
-        [System.ServiceModel.OperationContractAttribute(Action="http://tempuri.org/IAdministrationService/AddProblemClass", ReplyAction="http://tempuri.org/IAdministrationService/AddProblemClassResponse")]
-        long AddProblemClass(HeuristicLab.Clients.OKB.Administration.ProblemClass dto);
-        
-        [System.ServiceModel.OperationContractAttribute(Action="http://tempuri.org/IAdministrationService/UpdateProblemClass", ReplyAction="http://tempuri.org/IAdministrationService/UpdateProblemClassResponse")]
-        void UpdateProblemClass(HeuristicLab.Clients.OKB.Administration.ProblemClass dto);
-        
-        [System.ServiceModel.OperationContractAttribute(Action="http://tempuri.org/IAdministrationService/DeleteProblemClass", ReplyAction="http://tempuri.org/IAdministrationService/DeleteProblemClassResponse")]
-        void DeleteProblemClass(long id);
-        
-        [System.ServiceModel.OperationContractAttribute(Action="http://tempuri.org/IAdministrationService/GetProblems", ReplyAction="http://tempuri.org/IAdministrationService/GetProblemsResponse")]
-        System.Collections.Generic.List<HeuristicLab.Clients.OKB.Administration.Problem> GetProblems();
-        
-        [System.ServiceModel.OperationContractAttribute(Action="http://tempuri.org/IAdministrationService/AddProblem", ReplyAction="http://tempuri.org/IAdministrationService/AddProblemResponse")]
-        long AddProblem(HeuristicLab.Clients.OKB.Administration.Problem dto);
-        
-        [System.ServiceModel.OperationContractAttribute(Action="http://tempuri.org/IAdministrationService/UpdateProblem", ReplyAction="http://tempuri.org/IAdministrationService/UpdateProblemResponse")]
-        void UpdateProblem(HeuristicLab.Clients.OKB.Administration.Problem dto);
-        
-        [System.ServiceModel.OperationContractAttribute(Action="http://tempuri.org/IAdministrationService/DeleteProblem", ReplyAction="http://tempuri.org/IAdministrationService/DeleteProblemResponse")]
-        void DeleteProblem(long id);
-        
-        [System.ServiceModel.OperationContractAttribute(Action="http://tempuri.org/IAdministrationService/GetProblemUsers", ReplyAction="http://tempuri.org/IAdministrationService/GetProblemUsersResponse")]
-        System.Collections.Generic.List<System.Guid> GetProblemUsers(long problemId);
-    }
-    
-    [System.CodeDom.Compiler.GeneratedCodeAttribute("System.ServiceModel", "4.0.0.0")]
-    public interface IAdministrationServiceChannel : HeuristicLab.Clients.OKB.Administration.IAdministrationService, System.ServiceModel.IClientChannel
-    {
-    }
-    
-    [System.Diagnostics.DebuggerStepThroughAttribute()]
-    [System.CodeDom.Compiler.GeneratedCodeAttribute("System.ServiceModel", "4.0.0.0")]
-    public partial class AdministrationServiceClient : System.ServiceModel.ClientBase<HeuristicLab.Clients.OKB.Administration.IAdministrationService>, HeuristicLab.Clients.OKB.Administration.IAdministrationService
-    {
-        
-        public AdministrationServiceClient()
-        {
-        }
-        
-        public AdministrationServiceClient(string endpointConfigurationName) : 
-                base(endpointConfigurationName)
-        {
-        }
-        
-        public AdministrationServiceClient(string endpointConfigurationName, string remoteAddress) : 
-                base(endpointConfigurationName, remoteAddress)
-        {
-        }
-        
-        public AdministrationServiceClient(string endpointConfigurationName, System.ServiceModel.EndpointAddress remoteAddress) : 
-                base(endpointConfigurationName, remoteAddress)
-        {
-        }
-        
-        public AdministrationServiceClient(System.ServiceModel.Channels.Binding binding, System.ServiceModel.EndpointAddress remoteAddress) : 
-                base(binding, remoteAddress)
-        {
-        }
-        
-        public void UpdateProblemUsers(long problemId, System.Collections.Generic.List<System.Guid> users)
-        {
-            base.Channel.UpdateProblemUsers(problemId, users);
-        }
-        
-        public byte[] GetProblemData(long problemId)
-        {
-            return base.Channel.GetProblemData(problemId);
-        }
-        
-        public void UpdateProblemData(long problemId, byte[] data)
-        {
-            base.Channel.UpdateProblemData(problemId, data);
-        }
-        
-        public System.Collections.Generic.List<HeuristicLab.Clients.OKB.Administration.Platform> GetPlatforms()
-        {
-            return base.Channel.GetPlatforms();
-        }
-        
-        public long AddPlatform(HeuristicLab.Clients.OKB.Administration.Platform dto)
-        {
-            return base.Channel.AddPlatform(dto);
-        }
-        
-        public void UpdatePlatform(HeuristicLab.Clients.OKB.Administration.Platform dto)
-        {
-            base.Channel.UpdatePlatform(dto);
-        }
-        
-        public void DeletePlatform(long id)
-        {
-            base.Channel.DeletePlatform(id);
-        }
-        
-        public System.Collections.Generic.List<HeuristicLab.Clients.OKB.Administration.AlgorithmClass> GetAlgorithmClasses()
-        {
-            return base.Channel.GetAlgorithmClasses();
-        }
-        
-        public long AddAlgorithmClass(HeuristicLab.Clients.OKB.Administration.AlgorithmClass dto)
-        {
-            return base.Channel.AddAlgorithmClass(dto);
-        }
-        
-        public void UpdateAlgorithmClass(HeuristicLab.Clients.OKB.Administration.AlgorithmClass dto)
-        {
-            base.Channel.UpdateAlgorithmClass(dto);
-        }
-        
-        public void DeleteAlgorithmClass(long id)
-        {
-            base.Channel.DeleteAlgorithmClass(id);
-        }
-        
-        public System.Collections.Generic.List<HeuristicLab.Clients.OKB.Administration.Algorithm> GetAlgorithms()
-        {
-            return base.Channel.GetAlgorithms();
-        }
-        
-        public long AddAlgorithm(HeuristicLab.Clients.OKB.Administration.Algorithm dto)
-        {
-            return base.Channel.AddAlgorithm(dto);
-        }
-        
-        public void UpdateAlgorithm(HeuristicLab.Clients.OKB.Administration.Algorithm dto)
-        {
-            base.Channel.UpdateAlgorithm(dto);
-        }
-        
-        public void DeleteAlgorithm(long id)
-        {
-            base.Channel.DeleteAlgorithm(id);
-        }
-        
-        public System.Collections.Generic.List<System.Guid> GetAlgorithmUsers(long algorithmId)
-        {
-            return base.Channel.GetAlgorithmUsers(algorithmId);
-        }
-        
-        public void UpdateAlgorithmUsers(long algorithmId, System.Collections.Generic.List<System.Guid> users)
-        {
-            base.Channel.UpdateAlgorithmUsers(algorithmId, users);
-        }
-        
-        public byte[] GetAlgorithmData(long algorithmId)
-        {
-            return base.Channel.GetAlgorithmData(algorithmId);
-        }
-        
-        public void UpdateAlgorithmData(long algorithmId, byte[] data)
-        {
-            base.Channel.UpdateAlgorithmData(algorithmId, data);
-        }
-        
-        public System.Collections.Generic.List<HeuristicLab.Clients.OKB.Administration.ProblemClass> GetProblemClasses()
-        {
-            return base.Channel.GetProblemClasses();
-        }
-        
-        public long AddProblemClass(HeuristicLab.Clients.OKB.Administration.ProblemClass dto)
-        {
-            return base.Channel.AddProblemClass(dto);
-        }
-        
-        public void UpdateProblemClass(HeuristicLab.Clients.OKB.Administration.ProblemClass dto)
-        {
-            base.Channel.UpdateProblemClass(dto);
-        }
-        
-        public void DeleteProblemClass(long id)
-        {
-            base.Channel.DeleteProblemClass(id);
-        }
-        
-        public System.Collections.Generic.List<HeuristicLab.Clients.OKB.Administration.Problem> GetProblems()
-        {
-            return base.Channel.GetProblems();
-        }
-        
-        public long AddProblem(HeuristicLab.Clients.OKB.Administration.Problem dto)
-        {
-            return base.Channel.AddProblem(dto);
-        }
-        
-        public void UpdateProblem(HeuristicLab.Clients.OKB.Administration.Problem dto)
-        {
-            base.Channel.UpdateProblem(dto);
-        }
-        
-        public void DeleteProblem(long id)
-        {
-            base.Channel.DeleteProblem(id);
-        }
-        
-        public System.Collections.Generic.List<System.Guid> GetProblemUsers(long problemId)
-        {
-            return base.Channel.GetProblemUsers(problemId);
-        }
-    }
+namespace HeuristicLab.Clients.OKB.Administration {
+  using System.Runtime.Serialization;
+
+
+  [System.Diagnostics.DebuggerStepThroughAttribute()]
+  [System.CodeDom.Compiler.GeneratedCodeAttribute("System.Runtime.Serialization", "4.0.0.0")]
+  [System.Runtime.Serialization.DataContractAttribute(Name = "Platform", Namespace = "http://schemas.datacontract.org/2004/07/HeuristicLab.Services.OKB.Administration." +
+      "DataTransfer")]
+  public partial class Platform : HeuristicLab.Clients.OKB.Administration.NamedOKBItem {
+  }
+
+  [System.Diagnostics.DebuggerStepThroughAttribute()]
+  [System.CodeDom.Compiler.GeneratedCodeAttribute("System.Runtime.Serialization", "4.0.0.0")]
+  [System.Runtime.Serialization.DataContractAttribute(Name = "OKBItem", Namespace = "http://schemas.datacontract.org/2004/07/HeuristicLab.Services.OKB.Administration." +
+      "DataTransfer")]
+  [System.Runtime.Serialization.KnownTypeAttribute(typeof(HeuristicLab.Clients.OKB.Administration.NamedOKBItem))]
+  [System.Runtime.Serialization.KnownTypeAttribute(typeof(HeuristicLab.Clients.OKB.Administration.AlgorithmClass))]
+  [System.Runtime.Serialization.KnownTypeAttribute(typeof(HeuristicLab.Clients.OKB.Administration.Algorithm))]
+  [System.Runtime.Serialization.KnownTypeAttribute(typeof(HeuristicLab.Clients.OKB.Administration.ProblemClass))]
+  [System.Runtime.Serialization.KnownTypeAttribute(typeof(HeuristicLab.Clients.OKB.Administration.Problem))]
+  [System.Runtime.Serialization.KnownTypeAttribute(typeof(HeuristicLab.Clients.OKB.Administration.Platform))]
+  public partial class OKBItem : object, System.Runtime.Serialization.IExtensibleDataObject, System.ComponentModel.INotifyPropertyChanged {
+
+    private System.Runtime.Serialization.ExtensionDataObject extensionDataField;
+
+    private long IdField;
+
+    public System.Runtime.Serialization.ExtensionDataObject ExtensionData {
+      get {
+        return this.extensionDataField;
+      }
+      set {
+        this.extensionDataField = value;
+      }
+    }
+
+    [System.Runtime.Serialization.DataMemberAttribute()]
+    public long Id {
+      get {
+        return this.IdField;
+      }
+      set {
+        if ((this.IdField.Equals(value) != true)) {
+          this.IdField = value;
+          this.RaisePropertyChanged("Id");
+        }
+      }
+    }
+
+    public event System.ComponentModel.PropertyChangedEventHandler PropertyChanged;
+  }
+
+  [System.Diagnostics.DebuggerStepThroughAttribute()]
+  [System.CodeDom.Compiler.GeneratedCodeAttribute("System.Runtime.Serialization", "4.0.0.0")]
+  [System.Runtime.Serialization.DataContractAttribute(Name = "NamedOKBItem", Namespace = "http://schemas.datacontract.org/2004/07/HeuristicLab.Services.OKB.Administration." +
+      "DataTransfer")]
+  [System.Runtime.Serialization.KnownTypeAttribute(typeof(HeuristicLab.Clients.OKB.Administration.AlgorithmClass))]
+  [System.Runtime.Serialization.KnownTypeAttribute(typeof(HeuristicLab.Clients.OKB.Administration.Algorithm))]
+  [System.Runtime.Serialization.KnownTypeAttribute(typeof(HeuristicLab.Clients.OKB.Administration.ProblemClass))]
+  [System.Runtime.Serialization.KnownTypeAttribute(typeof(HeuristicLab.Clients.OKB.Administration.Problem))]
+  [System.Runtime.Serialization.KnownTypeAttribute(typeof(HeuristicLab.Clients.OKB.Administration.Platform))]
+  public partial class NamedOKBItem : HeuristicLab.Clients.OKB.Administration.OKBItem {
+
+    private string DescriptionField;
+
+    private string NameField;
+
+    [System.Runtime.Serialization.DataMemberAttribute()]
+    public string Description {
+      get {
+        return this.DescriptionField;
+      }
+      set {
+        if ((object.ReferenceEquals(this.DescriptionField, value) != true)) {
+          this.DescriptionField = value;
+          this.RaisePropertyChanged("Description");
+        }
+      }
+    }
+
+    [System.Runtime.Serialization.DataMemberAttribute()]
+    public string Name {
+      get {
+        return this.NameField;
+      }
+      set {
+        if ((object.ReferenceEquals(this.NameField, value) != true)) {
+          this.NameField = value;
+          this.RaisePropertyChanged("Name");
+        }
+      }
+    }
+  }
+
+  [System.Diagnostics.DebuggerStepThroughAttribute()]
+  [System.CodeDom.Compiler.GeneratedCodeAttribute("System.Runtime.Serialization", "4.0.0.0")]
+  [System.Runtime.Serialization.DataContractAttribute(Name = "AlgorithmClass", Namespace = "http://schemas.datacontract.org/2004/07/HeuristicLab.Services.OKB.Administration." +
+      "DataTransfer")]
+  public partial class AlgorithmClass : HeuristicLab.Clients.OKB.Administration.NamedOKBItem {
+  }
+
+  [System.Diagnostics.DebuggerStepThroughAttribute()]
+  [System.CodeDom.Compiler.GeneratedCodeAttribute("System.Runtime.Serialization", "4.0.0.0")]
+  [System.Runtime.Serialization.DataContractAttribute(Name = "Algorithm", Namespace = "http://schemas.datacontract.org/2004/07/HeuristicLab.Services.OKB.Administration." +
+      "DataTransfer")]
+  public partial class Algorithm : HeuristicLab.Clients.OKB.Administration.NamedOKBItem {
+
+    private long AlgorithmClassIdField;
+
+    private HeuristicLab.Clients.OKB.Administration.DataType DataTypeField;
+
+    private long PlatformIdField;
+
+    [System.Runtime.Serialization.DataMemberAttribute()]
+    public long AlgorithmClassId {
+      get {
+        return this.AlgorithmClassIdField;
+      }
+      set {
+        if ((this.AlgorithmClassIdField.Equals(value) != true)) {
+          this.AlgorithmClassIdField = value;
+          this.RaisePropertyChanged("AlgorithmClassId");
+        }
+      }
+    }
+
+    [System.Runtime.Serialization.DataMemberAttribute()]
+    public HeuristicLab.Clients.OKB.Administration.DataType DataType {
+      get {
+        return this.DataTypeField;
+      }
+      set {
+        if ((object.ReferenceEquals(this.DataTypeField, value) != true)) {
+          this.DataTypeField = value;
+          this.RaisePropertyChanged("DataType");
+        }
+      }
+    }
+
+    [System.Runtime.Serialization.DataMemberAttribute()]
+    public long PlatformId {
+      get {
+        return this.PlatformIdField;
+      }
+      set {
+        if ((this.PlatformIdField.Equals(value) != true)) {
+          this.PlatformIdField = value;
+          this.RaisePropertyChanged("PlatformId");
+        }
+      }
+    }
+  }
+
+  [System.Diagnostics.DebuggerStepThroughAttribute()]
+  [System.CodeDom.Compiler.GeneratedCodeAttribute("System.Runtime.Serialization", "4.0.0.0")]
+  [System.Runtime.Serialization.DataContractAttribute(Name = "ProblemClass", Namespace = "http://schemas.datacontract.org/2004/07/HeuristicLab.Services.OKB.Administration." +
+      "DataTransfer")]
+  public partial class ProblemClass : HeuristicLab.Clients.OKB.Administration.NamedOKBItem {
+  }
+
+  [System.Diagnostics.DebuggerStepThroughAttribute()]
+  [System.CodeDom.Compiler.GeneratedCodeAttribute("System.Runtime.Serialization", "4.0.0.0")]
+  [System.Runtime.Serialization.DataContractAttribute(Name = "Problem", Namespace = "http://schemas.datacontract.org/2004/07/HeuristicLab.Services.OKB.Administration." +
+      "DataTransfer")]
+  public partial class Problem : HeuristicLab.Clients.OKB.Administration.NamedOKBItem {
+
+    private HeuristicLab.Clients.OKB.Administration.DataType DataTypeField;
+
+    private long PlatformIdField;
+
+    private long ProblemClassIdField;
+
+    [System.Runtime.Serialization.DataMemberAttribute()]
+    public HeuristicLab.Clients.OKB.Administration.DataType DataType {
+      get {
+        return this.DataTypeField;
+      }
+      set {
+        if ((object.ReferenceEquals(this.DataTypeField, value) != true)) {
+          this.DataTypeField = value;
+          this.RaisePropertyChanged("DataType");
+        }
+      }
+    }
+
+    [System.Runtime.Serialization.DataMemberAttribute()]
+    public long PlatformId {
+      get {
+        return this.PlatformIdField;
+      }
+      set {
+        if ((this.PlatformIdField.Equals(value) != true)) {
+          this.PlatformIdField = value;
+          this.RaisePropertyChanged("PlatformId");
+        }
+      }
+    }
+
+    [System.Runtime.Serialization.DataMemberAttribute()]
+    public long ProblemClassId {
+      get {
+        return this.ProblemClassIdField;
+      }
+      set {
+        if ((this.ProblemClassIdField.Equals(value) != true)) {
+          this.ProblemClassIdField = value;
+          this.RaisePropertyChanged("ProblemClassId");
+        }
+      }
+    }
+  }
+
+  [System.Diagnostics.DebuggerStepThroughAttribute()]
+  [System.CodeDom.Compiler.GeneratedCodeAttribute("System.Runtime.Serialization", "4.0.0.0")]
+  [System.Runtime.Serialization.DataContractAttribute(Name = "DataType", Namespace = "http://schemas.datacontract.org/2004/07/HeuristicLab.Services.OKB.Administration." +
+      "DataTransfer")]
+  public partial class DataType : object, System.Runtime.Serialization.IExtensibleDataObject, System.ComponentModel.INotifyPropertyChanged {
+
+    private System.Runtime.Serialization.ExtensionDataObject extensionDataField;
+
+    private string NameField;
+
+    private string TypeNameField;
+
+    public System.Runtime.Serialization.ExtensionDataObject ExtensionData {
+      get {
+        return this.extensionDataField;
+      }
+      set {
+        this.extensionDataField = value;
+      }
+    }
+
+    [System.Runtime.Serialization.DataMemberAttribute()]
+    public string Name {
+      get {
+        return this.NameField;
+      }
+      set {
+        if ((object.ReferenceEquals(this.NameField, value) != true)) {
+          this.NameField = value;
+          this.RaisePropertyChanged("Name");
+        }
+      }
+    }
+
+    [System.Runtime.Serialization.DataMemberAttribute()]
+    public string TypeName {
+      get {
+        return this.TypeNameField;
+      }
+      set {
+        if ((object.ReferenceEquals(this.TypeNameField, value) != true)) {
+          this.TypeNameField = value;
+          this.RaisePropertyChanged("TypeName");
+        }
+      }
+    }
+
+    public event System.ComponentModel.PropertyChangedEventHandler PropertyChanged;
+
+    protected void RaisePropertyChanged(string propertyName) {
+      System.ComponentModel.PropertyChangedEventHandler propertyChanged = this.PropertyChanged;
+      if ((propertyChanged != null)) {
+        propertyChanged(this, new System.ComponentModel.PropertyChangedEventArgs(propertyName));
+      }
+    }
+  }
+
+  [System.CodeDom.Compiler.GeneratedCodeAttribute("System.ServiceModel", "4.0.0.0")]
+  [System.ServiceModel.ServiceContractAttribute(ConfigurationName = "HeuristicLab.Clients.OKB.Administration.IAdministrationService")]
+  public interface IAdministrationService {
+
+    [System.ServiceModel.OperationContractAttribute(Action = "http://tempuri.org/IAdministrationService/UpdateProblemUsers", ReplyAction = "http://tempuri.org/IAdministrationService/UpdateProblemUsersResponse")]
+    void UpdateProblemUsers(long problemId, System.Collections.Generic.List<System.Guid> users);
+
+    [System.ServiceModel.OperationContractAttribute(Action = "http://tempuri.org/IAdministrationService/GetProblemData", ReplyAction = "http://tempuri.org/IAdministrationService/GetProblemDataResponse")]
+    byte[] GetProblemData(long problemId);
+
+    [System.ServiceModel.OperationContractAttribute(Action = "http://tempuri.org/IAdministrationService/UpdateProblemData", ReplyAction = "http://tempuri.org/IAdministrationService/UpdateProblemDataResponse")]
+    void UpdateProblemData(long problemId, byte[] data);
+
+    [System.ServiceModel.OperationContractAttribute(Action = "http://tempuri.org/IAdministrationService/GetPlatforms", ReplyAction = "http://tempuri.org/IAdministrationService/GetPlatformsResponse")]
+    System.Collections.Generic.List<HeuristicLab.Clients.OKB.Administration.Platform> GetPlatforms();
+
+    [System.ServiceModel.OperationContractAttribute(Action = "http://tempuri.org/IAdministrationService/AddPlatform", ReplyAction = "http://tempuri.org/IAdministrationService/AddPlatformResponse")]
+    long AddPlatform(HeuristicLab.Clients.OKB.Administration.Platform dto);
+
+    [System.ServiceModel.OperationContractAttribute(Action = "http://tempuri.org/IAdministrationService/UpdatePlatform", ReplyAction = "http://tempuri.org/IAdministrationService/UpdatePlatformResponse")]
+    void UpdatePlatform(HeuristicLab.Clients.OKB.Administration.Platform dto);
+
+    [System.ServiceModel.OperationContractAttribute(Action = "http://tempuri.org/IAdministrationService/DeletePlatform", ReplyAction = "http://tempuri.org/IAdministrationService/DeletePlatformResponse")]
+    void DeletePlatform(long id);
+
+    [System.ServiceModel.OperationContractAttribute(Action = "http://tempuri.org/IAdministrationService/GetAlgorithmClasses", ReplyAction = "http://tempuri.org/IAdministrationService/GetAlgorithmClassesResponse")]
+    System.Collections.Generic.List<HeuristicLab.Clients.OKB.Administration.AlgorithmClass> GetAlgorithmClasses();
+
+    [System.ServiceModel.OperationContractAttribute(Action = "http://tempuri.org/IAdministrationService/AddAlgorithmClass", ReplyAction = "http://tempuri.org/IAdministrationService/AddAlgorithmClassResponse")]
+    long AddAlgorithmClass(HeuristicLab.Clients.OKB.Administration.AlgorithmClass dto);
+
+    [System.ServiceModel.OperationContractAttribute(Action = "http://tempuri.org/IAdministrationService/UpdateAlgorithmClass", ReplyAction = "http://tempuri.org/IAdministrationService/UpdateAlgorithmClassResponse")]
+    void UpdateAlgorithmClass(HeuristicLab.Clients.OKB.Administration.AlgorithmClass dto);
+
+    [System.ServiceModel.OperationContractAttribute(Action = "http://tempuri.org/IAdministrationService/DeleteAlgorithmClass", ReplyAction = "http://tempuri.org/IAdministrationService/DeleteAlgorithmClassResponse")]
+    void DeleteAlgorithmClass(long id);
+
+    [System.ServiceModel.OperationContractAttribute(Action = "http://tempuri.org/IAdministrationService/GetAlgorithms", ReplyAction = "http://tempuri.org/IAdministrationService/GetAlgorithmsResponse")]
+    System.Collections.Generic.List<HeuristicLab.Clients.OKB.Administration.Algorithm> GetAlgorithms();
+
+    [System.ServiceModel.OperationContractAttribute(Action = "http://tempuri.org/IAdministrationService/AddAlgorithm", ReplyAction = "http://tempuri.org/IAdministrationService/AddAlgorithmResponse")]
+    long AddAlgorithm(HeuristicLab.Clients.OKB.Administration.Algorithm dto);
+
+    [System.ServiceModel.OperationContractAttribute(Action = "http://tempuri.org/IAdministrationService/UpdateAlgorithm", ReplyAction = "http://tempuri.org/IAdministrationService/UpdateAlgorithmResponse")]
+    void UpdateAlgorithm(HeuristicLab.Clients.OKB.Administration.Algorithm dto);
+
+    [System.ServiceModel.OperationContractAttribute(Action = "http://tempuri.org/IAdministrationService/DeleteAlgorithm", ReplyAction = "http://tempuri.org/IAdministrationService/DeleteAlgorithmResponse")]
+    void DeleteAlgorithm(long id);
+
+    [System.ServiceModel.OperationContractAttribute(Action = "http://tempuri.org/IAdministrationService/GetAlgorithmUsers", ReplyAction = "http://tempuri.org/IAdministrationService/GetAlgorithmUsersResponse")]
+    System.Collections.Generic.List<System.Guid> GetAlgorithmUsers(long algorithmId);
+
+    [System.ServiceModel.OperationContractAttribute(Action = "http://tempuri.org/IAdministrationService/UpdateAlgorithmUsers", ReplyAction = "http://tempuri.org/IAdministrationService/UpdateAlgorithmUsersResponse")]
+    void UpdateAlgorithmUsers(long algorithmId, System.Collections.Generic.List<System.Guid> users);
+
+    [System.ServiceModel.OperationContractAttribute(Action = "http://tempuri.org/IAdministrationService/GetAlgorithmData", ReplyAction = "http://tempuri.org/IAdministrationService/GetAlgorithmDataResponse")]
+    byte[] GetAlgorithmData(long algorithmId);
+
+    [System.ServiceModel.OperationContractAttribute(Action = "http://tempuri.org/IAdministrationService/UpdateAlgorithmData", ReplyAction = "http://tempuri.org/IAdministrationService/UpdateAlgorithmDataResponse")]
+    void UpdateAlgorithmData(long algorithmId, byte[] data);
+
+    [System.ServiceModel.OperationContractAttribute(Action = "http://tempuri.org/IAdministrationService/GetProblemClasses", ReplyAction = "http://tempuri.org/IAdministrationService/GetProblemClassesResponse")]
+    System.Collections.Generic.List<HeuristicLab.Clients.OKB.Administration.ProblemClass> GetProblemClasses();
+
+    [System.ServiceModel.OperationContractAttribute(Action = "http://tempuri.org/IAdministrationService/AddProblemClass", ReplyAction = "http://tempuri.org/IAdministrationService/AddProblemClassResponse")]
+    long AddProblemClass(HeuristicLab.Clients.OKB.Administration.ProblemClass dto);
+
+    [System.ServiceModel.OperationContractAttribute(Action = "http://tempuri.org/IAdministrationService/UpdateProblemClass", ReplyAction = "http://tempuri.org/IAdministrationService/UpdateProblemClassResponse")]
+    void UpdateProblemClass(HeuristicLab.Clients.OKB.Administration.ProblemClass dto);
+
+    [System.ServiceModel.OperationContractAttribute(Action = "http://tempuri.org/IAdministrationService/DeleteProblemClass", ReplyAction = "http://tempuri.org/IAdministrationService/DeleteProblemClassResponse")]
+    void DeleteProblemClass(long id);
+
+    [System.ServiceModel.OperationContractAttribute(Action = "http://tempuri.org/IAdministrationService/GetProblems", ReplyAction = "http://tempuri.org/IAdministrationService/GetProblemsResponse")]
+    System.Collections.Generic.List<HeuristicLab.Clients.OKB.Administration.Problem> GetProblems();
+
+    [System.ServiceModel.OperationContractAttribute(Action = "http://tempuri.org/IAdministrationService/AddProblem", ReplyAction = "http://tempuri.org/IAdministrationService/AddProblemResponse")]
+    long AddProblem(HeuristicLab.Clients.OKB.Administration.Problem dto);
+
+    [System.ServiceModel.OperationContractAttribute(Action = "http://tempuri.org/IAdministrationService/UpdateProblem", ReplyAction = "http://tempuri.org/IAdministrationService/UpdateProblemResponse")]
+    void UpdateProblem(HeuristicLab.Clients.OKB.Administration.Problem dto);
+
+    [System.ServiceModel.OperationContractAttribute(Action = "http://tempuri.org/IAdministrationService/DeleteProblem", ReplyAction = "http://tempuri.org/IAdministrationService/DeleteProblemResponse")]
+    void DeleteProblem(long id);
+
+    [System.ServiceModel.OperationContractAttribute(Action = "http://tempuri.org/IAdministrationService/GetProblemUsers", ReplyAction = "http://tempuri.org/IAdministrationService/GetProblemUsersResponse")]
+    System.Collections.Generic.List<System.Guid> GetProblemUsers(long problemId);
+  }
+
+  [System.CodeDom.Compiler.GeneratedCodeAttribute("System.ServiceModel", "4.0.0.0")]
+  public interface IAdministrationServiceChannel : HeuristicLab.Clients.OKB.Administration.IAdministrationService, System.ServiceModel.IClientChannel {
+  }
+
+  [System.Diagnostics.DebuggerStepThroughAttribute()]
+  [System.CodeDom.Compiler.GeneratedCodeAttribute("System.ServiceModel", "4.0.0.0")]
+  public partial class AdministrationServiceClient : System.ServiceModel.ClientBase<HeuristicLab.Clients.OKB.Administration.IAdministrationService>, HeuristicLab.Clients.OKB.Administration.IAdministrationService {
+
+    public AdministrationServiceClient() {
+    }
+
+    public AdministrationServiceClient(string endpointConfigurationName) :
+      base(endpointConfigurationName) {
+    }
+
+    public AdministrationServiceClient(string endpointConfigurationName, string remoteAddress) :
+      base(endpointConfigurationName, remoteAddress) {
+    }
+
+    public AdministrationServiceClient(string endpointConfigurationName, System.ServiceModel.EndpointAddress remoteAddress) :
+      base(endpointConfigurationName, remoteAddress) {
+    }
+
+    public AdministrationServiceClient(System.ServiceModel.Channels.Binding binding, System.ServiceModel.EndpointAddress remoteAddress) :
+      base(binding, remoteAddress) {
+    }
+
+    public void UpdateProblemUsers(long problemId, System.Collections.Generic.List<System.Guid> users) {
+      base.Channel.UpdateProblemUsers(problemId, users);
+    }
+
+    public byte[] GetProblemData(long problemId) {
+      return base.Channel.GetProblemData(problemId);
+    }
+
+    public void UpdateProblemData(long problemId, byte[] data) {
+      base.Channel.UpdateProblemData(problemId, data);
+    }
+
+    public System.Collections.Generic.List<HeuristicLab.Clients.OKB.Administration.Platform> GetPlatforms() {
+      return base.Channel.GetPlatforms();
+    }
+
+    public long AddPlatform(HeuristicLab.Clients.OKB.Administration.Platform dto) {
+      return base.Channel.AddPlatform(dto);
+    }
+
+    public void UpdatePlatform(HeuristicLab.Clients.OKB.Administration.Platform dto) {
+      base.Channel.UpdatePlatform(dto);
+    }
+
+    public void DeletePlatform(long id) {
+      base.Channel.DeletePlatform(id);
+    }
+
+    public System.Collections.Generic.List<HeuristicLab.Clients.OKB.Administration.AlgorithmClass> GetAlgorithmClasses() {
+      return base.Channel.GetAlgorithmClasses();
+    }
+
+    public long AddAlgorithmClass(HeuristicLab.Clients.OKB.Administration.AlgorithmClass dto) {
+      return base.Channel.AddAlgorithmClass(dto);
+    }
+
+    public void UpdateAlgorithmClass(HeuristicLab.Clients.OKB.Administration.AlgorithmClass dto) {
+      base.Channel.UpdateAlgorithmClass(dto);
+    }
+
+    public void DeleteAlgorithmClass(long id) {
+      base.Channel.DeleteAlgorithmClass(id);
+    }
+
+    public System.Collections.Generic.List<HeuristicLab.Clients.OKB.Administration.Algorithm> GetAlgorithms() {
+      return base.Channel.GetAlgorithms();
+    }
+
+    public long AddAlgorithm(HeuristicLab.Clients.OKB.Administration.Algorithm dto) {
+      return base.Channel.AddAlgorithm(dto);
+    }
+
+    public void UpdateAlgorithm(HeuristicLab.Clients.OKB.Administration.Algorithm dto) {
+      base.Channel.UpdateAlgorithm(dto);
+    }
+
+    public void DeleteAlgorithm(long id) {
+      base.Channel.DeleteAlgorithm(id);
+    }
+
+    public System.Collections.Generic.List<System.Guid> GetAlgorithmUsers(long algorithmId) {
+      return base.Channel.GetAlgorithmUsers(algorithmId);
+    }
+
+    public void UpdateAlgorithmUsers(long algorithmId, System.Collections.Generic.List<System.Guid> users) {
+      base.Channel.UpdateAlgorithmUsers(algorithmId, users);
+    }
+
+    public byte[] GetAlgorithmData(long algorithmId) {
+      return base.Channel.GetAlgorithmData(algorithmId);
+    }
+
+    public void UpdateAlgorithmData(long algorithmId, byte[] data) {
+      base.Channel.UpdateAlgorithmData(algorithmId, data);
+    }
+
+    public System.Collections.Generic.List<HeuristicLab.Clients.OKB.Administration.ProblemClass> GetProblemClasses() {
+      return base.Channel.GetProblemClasses();
+    }
+
+    public long AddProblemClass(HeuristicLab.Clients.OKB.Administration.ProblemClass dto) {
+      return base.Channel.AddProblemClass(dto);
+    }
+
+    public void UpdateProblemClass(HeuristicLab.Clients.OKB.Administration.ProblemClass dto) {
+      base.Channel.UpdateProblemClass(dto);
+    }
+
+    public void DeleteProblemClass(long id) {
+      base.Channel.DeleteProblemClass(id);
+    }
+
+    public System.Collections.Generic.List<HeuristicLab.Clients.OKB.Administration.Problem> GetProblems() {
+      return base.Channel.GetProblems();
+    }
+
+    public long AddProblem(HeuristicLab.Clients.OKB.Administration.Problem dto) {
+      return base.Channel.AddProblem(dto);
+    }
+
+    public void UpdateProblem(HeuristicLab.Clients.OKB.Administration.Problem dto) {
+      base.Channel.UpdateProblem(dto);
+    }
+
+    public void DeleteProblem(long id) {
+      base.Channel.DeleteProblem(id);
+    }
+
+    public System.Collections.Generic.List<System.Guid> GetProblemUsers(long problemId) {
+      return base.Channel.GetProblemUsers(problemId);
+    }
+  }
 }
Index: branches/OKB (trunk integration)/HeuristicLab.Clients.OKB/3.3/Administration/ServiceClient/Algorithm.cs
===================================================================
--- branches/OKB (trunk integration)/HeuristicLab.Clients.OKB/3.3/Administration/ServiceClient/Algorithm.cs	(revision 5533)
+++ branches/OKB (trunk integration)/HeuristicLab.Clients.OKB/3.3/Administration/ServiceClient/Algorithm.cs	(revision 5533)
@@ -0,0 +1,43 @@
+﻿#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 HeuristicLab.Common;
+using HeuristicLab.Core;
+
+namespace HeuristicLab.Clients.OKB.Administration {
+  [Item("Algorithm", "An OKB algorithm.")]
+  public partial class Algorithm {
+    protected Algorithm(Algorithm original, Cloner cloner)
+      : base(original, cloner) {
+      PlatformId = original.PlatformId;
+      AlgorithmClassId = original.AlgorithmClassId;
+    }
+    public Algorithm() {
+      Name = "New Algorithm";
+      PlatformId = 1;
+      AlgorithmClassId = 1;
+    }
+
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new Algorithm(this, cloner);
+    }
+  }
+}
Index: branches/OKB (trunk integration)/HeuristicLab.Clients.OKB/3.3/Administration/ServiceClient/AlgorithmClass.cs
===================================================================
--- branches/OKB (trunk integration)/HeuristicLab.Clients.OKB/3.3/Administration/ServiceClient/AlgorithmClass.cs	(revision 5533)
+++ branches/OKB (trunk integration)/HeuristicLab.Clients.OKB/3.3/Administration/ServiceClient/AlgorithmClass.cs	(revision 5533)
@@ -0,0 +1,37 @@
+﻿#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 HeuristicLab.Common;
+using HeuristicLab.Core;
+
+namespace HeuristicLab.Clients.OKB.Administration {
+  [Item("AlgorithmClass", "An OKB algorithm class.")]
+  public partial class AlgorithmClass {
+    protected AlgorithmClass(AlgorithmClass original, Cloner cloner) : base(original, cloner) { }
+    public AlgorithmClass() {
+      Name = "New Algorithm Class";
+    }
+
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new AlgorithmClass(this, cloner);
+    }
+  }
+}
Index: branches/OKB (trunk integration)/HeuristicLab.Clients.OKB/3.3/Administration/ServiceClient/INamedOKBItem.cs
===================================================================
--- branches/OKB (trunk integration)/HeuristicLab.Clients.OKB/3.3/Administration/ServiceClient/INamedOKBItem.cs	(revision 5533)
+++ branches/OKB (trunk integration)/HeuristicLab.Clients.OKB/3.3/Administration/ServiceClient/INamedOKBItem.cs	(revision 5533)
@@ -0,0 +1,27 @@
+#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 {
+  public interface INamedOKBItem : IOKBItem {
+    string Name { get; set; }
+    string Description { get; set; }
+  }
+}
Index: branches/OKB (trunk integration)/HeuristicLab.Clients.OKB/3.3/Administration/ServiceClient/IOKBItem.cs
===================================================================
--- branches/OKB (trunk integration)/HeuristicLab.Clients.OKB/3.3/Administration/ServiceClient/IOKBItem.cs	(revision 5533)
+++ branches/OKB (trunk integration)/HeuristicLab.Clients.OKB/3.3/Administration/ServiceClient/IOKBItem.cs	(revision 5533)
@@ -0,0 +1,35 @@
+#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.ComponentModel;
+using HeuristicLab.Core;
+
+namespace HeuristicLab.Clients.OKB.Administration {
+  public interface IOKBItem : IItem, INotifyPropertyChanged {
+    long Id { get; set; }
+    bool Modified { get; }
+
+    void Store();
+
+    event EventHandler ModifiedChanged;
+  }
+}
Index: branches/OKB (trunk integration)/HeuristicLab.Clients.OKB/3.3/Administration/ServiceClient/NamedOKBItem.cs
===================================================================
--- branches/OKB (trunk integration)/HeuristicLab.Clients.OKB/3.3/Administration/ServiceClient/NamedOKBItem.cs	(revision 5533)
+++ branches/OKB (trunk integration)/HeuristicLab.Clients.OKB/3.3/Administration/ServiceClient/NamedOKBItem.cs	(revision 5533)
@@ -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
+
+using System.ComponentModel;
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+
+namespace HeuristicLab.Clients.OKB.Administration {
+  [Item("NamedOKBItem", "Base class for all named OKB items.")]
+  public partial class NamedOKBItem : INamedOKBItem {
+    protected NamedOKBItem(NamedOKBItem original, Cloner cloner)
+      : base(original, cloner) {
+      Name = original.Name;
+      Description = original.Description;
+    }
+    public NamedOKBItem() {
+      Name = "New Item";
+      Description = string.Empty;
+    }
+
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new NamedOKBItem(this, cloner);
+    }
+
+    public override string ToString() {
+      return Name;
+    }
+
+    protected override void OnPropertyChanged(PropertyChangedEventArgs e) {
+      base.OnPropertyChanged(e);
+      if (e.PropertyName == "Name")
+        OnToStringChanged();
+    }
+  }
+}
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 5533)
+++ branches/OKB (trunk integration)/HeuristicLab.Clients.OKB/3.3/Administration/ServiceClient/OKBItem.cs	(revision 5533)
@@ -0,0 +1,119 @@
+#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.ComponentModel;
+using System.Drawing;
+using System.Runtime.Serialization;
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+
+namespace HeuristicLab.Clients.OKB.Administration {
+  [Item("OKBItem", "Base class for all OKB items.")]
+  public partial class OKBItem : IOKBItem {
+    public virtual string ItemName {
+      get { return ItemAttribute.GetName(this.GetType()); }
+    }
+    public virtual string ItemDescription {
+      get { return ItemAttribute.GetDescription(this.GetType()); }
+    }
+    public Version ItemVersion {
+      get { return ItemAttribute.GetVersion(this.GetType()); }
+    }
+    public virtual Image ItemImage {
+      get {
+        if (Modified)
+          return HeuristicLab.Common.Resources.VSImageLibrary.DatabaseModified;
+        else
+          return HeuristicLab.Common.Resources.VSImageLibrary.Database;
+      }
+    }
+
+    private bool modified;
+    public bool Modified {
+      get { return modified; }
+      private set {
+        if (value != modified) {
+          modified = value;
+          OnModifiedChanged();
+          RaisePropertyChanged("Modified");
+          OnItemImageChanged();
+          RaisePropertyChanged("ItemImage");
+        }
+      }
+    }
+
+    protected OKBItem(OKBItem original, Cloner cloner) {
+      cloner.RegisterClonedObject(original, this);
+      modified = true;
+    }
+    protected OKBItem() {
+      modified = true;
+    }
+
+    [OnDeserialized]
+    private void OnDeserialized(StreamingContext context) {
+      modified = false;
+    }
+
+    public object Clone() {
+      return Clone(new Cloner());
+    }
+    public virtual IDeepCloneable Clone(Cloner cloner) {
+      return new OKBItem(this, cloner);
+    }
+
+    public override string ToString() {
+      return ItemName;
+    }
+
+    public void Store() {
+      if (AdministrationClient.Instance.Store(this))
+        Modified = false;
+    }
+
+    protected void RaisePropertyChanged(string propertyName) {
+      OnPropertyChanged(new PropertyChangedEventArgs(propertyName));
+      if ((propertyName != "Id") && (propertyName != "Modified") && (propertyName != "ItemImage")) {
+        Modified = true;
+      }
+    }
+    protected virtual void OnPropertyChanged(PropertyChangedEventArgs e) {
+      PropertyChangedEventHandler handler = PropertyChanged;
+      if (handler != null) handler(this, e);
+    }
+    public event EventHandler ModifiedChanged;
+    protected virtual void OnModifiedChanged() {
+      EventHandler handler = ModifiedChanged;
+      if (handler != null) handler(this, EventArgs.Empty);
+    }
+    public event EventHandler ItemImageChanged;
+    protected virtual void OnItemImageChanged() {
+      EventHandler handler = ItemImageChanged;
+      if (handler != null) handler(this, EventArgs.Empty);
+    }
+    public event EventHandler ToStringChanged;
+    protected virtual void OnToStringChanged() {
+      EventHandler handler = ToStringChanged;
+      if (handler != null) handler(this, EventArgs.Empty);
+    }
+  }
+}
Index: branches/OKB (trunk integration)/HeuristicLab.Clients.OKB/3.3/Administration/ServiceClient/Platform.cs
===================================================================
--- branches/OKB (trunk integration)/HeuristicLab.Clients.OKB/3.3/Administration/ServiceClient/Platform.cs	(revision 5533)
+++ branches/OKB (trunk integration)/HeuristicLab.Clients.OKB/3.3/Administration/ServiceClient/Platform.cs	(revision 5533)
@@ -0,0 +1,37 @@
+﻿#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 HeuristicLab.Common;
+using HeuristicLab.Core;
+
+namespace HeuristicLab.Clients.OKB.Administration {
+  [Item("Platform", "An OKB platform.")]
+  public partial class Platform {
+    protected Platform(Platform original, Cloner cloner) : base(original, cloner) { }
+    public Platform() {
+      Name = "New Platform";
+    }
+
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new Platform(this, cloner);
+    }
+  }
+}
Index: branches/OKB (trunk integration)/HeuristicLab.Clients.OKB/3.3/Administration/ServiceClient/Problem.cs
===================================================================
--- branches/OKB (trunk integration)/HeuristicLab.Clients.OKB/3.3/Administration/ServiceClient/Problem.cs	(revision 5533)
+++ branches/OKB (trunk integration)/HeuristicLab.Clients.OKB/3.3/Administration/ServiceClient/Problem.cs	(revision 5533)
@@ -0,0 +1,43 @@
+﻿#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 HeuristicLab.Common;
+using HeuristicLab.Core;
+
+namespace HeuristicLab.Clients.OKB.Administration {
+  [Item("Problem", "An OKB problem.")]
+  public partial class Problem {
+    protected Problem(Problem original, Cloner cloner)
+      : base(original, cloner) {
+      PlatformId = original.PlatformId;
+      ProblemClassId = original.ProblemClassId;
+    }
+    public Problem() {
+      Name = "New Problem";
+      PlatformId = 1;
+      ProblemClassId = 1;
+    }
+
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new Problem(this, cloner);
+    }
+  }
+}
Index: branches/OKB (trunk integration)/HeuristicLab.Clients.OKB/3.3/Administration/ServiceClient/ProblemClass.cs
===================================================================
--- branches/OKB (trunk integration)/HeuristicLab.Clients.OKB/3.3/Administration/ServiceClient/ProblemClass.cs	(revision 5533)
+++ branches/OKB (trunk integration)/HeuristicLab.Clients.OKB/3.3/Administration/ServiceClient/ProblemClass.cs	(revision 5533)
@@ -0,0 +1,37 @@
+﻿#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 HeuristicLab.Common;
+using HeuristicLab.Core;
+
+namespace HeuristicLab.Clients.OKB.Administration {
+  [Item("ProblemClass", "An OKB problem class.")]
+  public partial class ProblemClass {
+    protected ProblemClass(ProblemClass original, Cloner cloner) : base(original, cloner) { }
+    public ProblemClass() {
+      Name = "New Problem Class";
+    }
+
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new ProblemClass(this, cloner);
+    }
+  }
+}
Index: branches/OKB (trunk integration)/HeuristicLab.Clients.OKB/3.3/Administration/Views/AdministratorView.Designer.cs
===================================================================
--- branches/OKB (trunk integration)/HeuristicLab.Clients.OKB/3.3/Administration/Views/AdministratorView.Designer.cs	(revision 5533)
+++ branches/OKB (trunk integration)/HeuristicLab.Clients.OKB/3.3/Administration/Views/AdministratorView.Designer.cs	(revision 5533)
@@ -0,0 +1,264 @@
+#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 AdministratorView {
+    /// <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() {
+      this.components = new System.ComponentModel.Container();
+      this.tabControl = new System.Windows.Forms.TabControl();
+      this.platformsTabPage = new System.Windows.Forms.TabPage();
+      this.platformCollectionView = new HeuristicLab.Clients.OKB.Administration.PlatformCollectionView();
+      this.dataTypesTabPage = new System.Windows.Forms.TabPage();
+      this.algorithmClassesTabPage = new System.Windows.Forms.TabPage();
+      this.algorithmClassCollectionView = new HeuristicLab.Clients.OKB.Administration.AlgorithmClassCollectionView();
+      this.algorithmsTabPage = new System.Windows.Forms.TabPage();
+      this.algorithmCollectionView = new HeuristicLab.Clients.OKB.Administration.AlgorithmCollectionView();
+      this.problemClassesTabPage = new System.Windows.Forms.TabPage();
+      this.problemsTabPage = new System.Windows.Forms.TabPage();
+      this.refreshButton = new System.Windows.Forms.Button();
+      this.toolTip = new System.Windows.Forms.ToolTip(this.components);
+      this.problemClassCollectionView = new HeuristicLab.Clients.OKB.Administration.ProblemClassCollectionView();
+      this.problemCollectionView = new HeuristicLab.Clients.OKB.Administration.ProblemCollectionView();
+      this.tabControl.SuspendLayout();
+      this.platformsTabPage.SuspendLayout();
+      this.dataTypesTabPage.SuspendLayout();
+      this.algorithmClassesTabPage.SuspendLayout();
+      this.algorithmsTabPage.SuspendLayout();
+      this.problemClassesTabPage.SuspendLayout();
+      this.problemsTabPage.SuspendLayout();
+      this.SuspendLayout();
+      // 
+      // tabControl
+      // 
+      this.tabControl.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.tabControl.Controls.Add(this.platformsTabPage);
+      this.tabControl.Controls.Add(this.dataTypesTabPage);
+      this.tabControl.Controls.Add(this.algorithmClassesTabPage);
+      this.tabControl.Controls.Add(this.algorithmsTabPage);
+      this.tabControl.Controls.Add(this.problemClassesTabPage);
+      this.tabControl.Controls.Add(this.problemsTabPage);
+      this.tabControl.Location = new System.Drawing.Point(0, 29);
+      this.tabControl.Name = "tabControl";
+      this.tabControl.SelectedIndex = 0;
+      this.tabControl.Size = new System.Drawing.Size(727, 406);
+      this.tabControl.TabIndex = 1;
+      // 
+      // platformsTabPage
+      // 
+      this.platformsTabPage.Controls.Add(this.platformCollectionView);
+      this.platformsTabPage.Location = new System.Drawing.Point(4, 22);
+      this.platformsTabPage.Name = "platformsTabPage";
+      this.platformsTabPage.Padding = new System.Windows.Forms.Padding(3);
+      this.platformsTabPage.Size = new System.Drawing.Size(719, 380);
+      this.platformsTabPage.TabIndex = 2;
+      this.platformsTabPage.Text = "Platforms";
+      this.platformsTabPage.UseVisualStyleBackColor = true;
+      // 
+      // platformCollectionView
+      // 
+      this.platformCollectionView.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.platformCollectionView.Caption = "PlatformCollection View";
+      this.platformCollectionView.Content = null;
+      this.platformCollectionView.Location = new System.Drawing.Point(3, 3);
+      this.platformCollectionView.Name = "platformCollectionView";
+      this.platformCollectionView.ReadOnly = false;
+      this.platformCollectionView.Size = new System.Drawing.Size(713, 374);
+      this.platformCollectionView.TabIndex = 0;
+      // 
+      // dataTypesTabPage
+      // 
+      this.dataTypesTabPage.Location = new System.Drawing.Point(4, 22);
+      this.dataTypesTabPage.Name = "dataTypesTabPage";
+      this.dataTypesTabPage.Padding = new System.Windows.Forms.Padding(3);
+      this.dataTypesTabPage.Size = new System.Drawing.Size(719, 380);
+      this.dataTypesTabPage.TabIndex = 3;
+      this.dataTypesTabPage.Text = "Data Types";
+      this.dataTypesTabPage.UseVisualStyleBackColor = true;
+      // 
+      // algorithmClassesTabPage
+      // 
+      this.algorithmClassesTabPage.Controls.Add(this.algorithmClassCollectionView);
+      this.algorithmClassesTabPage.Location = new System.Drawing.Point(4, 22);
+      this.algorithmClassesTabPage.Name = "algorithmClassesTabPage";
+      this.algorithmClassesTabPage.Padding = new System.Windows.Forms.Padding(3);
+      this.algorithmClassesTabPage.Size = new System.Drawing.Size(719, 380);
+      this.algorithmClassesTabPage.TabIndex = 0;
+      this.algorithmClassesTabPage.Text = "Algorithm Classes";
+      this.algorithmClassesTabPage.UseVisualStyleBackColor = true;
+      // 
+      // algorithmClassCollectionView
+      // 
+      this.algorithmClassCollectionView.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.algorithmClassCollectionView.Caption = "AlgorithmClassCollection View";
+      this.algorithmClassCollectionView.Content = null;
+      this.algorithmClassCollectionView.Location = new System.Drawing.Point(3, 3);
+      this.algorithmClassCollectionView.Name = "algorithmClassCollectionView";
+      this.algorithmClassCollectionView.ReadOnly = false;
+      this.algorithmClassCollectionView.Size = new System.Drawing.Size(713, 374);
+      this.algorithmClassCollectionView.TabIndex = 0;
+      // 
+      // algorithmsTabPage
+      // 
+      this.algorithmsTabPage.Controls.Add(this.algorithmCollectionView);
+      this.algorithmsTabPage.Location = new System.Drawing.Point(4, 22);
+      this.algorithmsTabPage.Name = "algorithmsTabPage";
+      this.algorithmsTabPage.Padding = new System.Windows.Forms.Padding(3);
+      this.algorithmsTabPage.Size = new System.Drawing.Size(719, 380);
+      this.algorithmsTabPage.TabIndex = 1;
+      this.algorithmsTabPage.Text = "Algorithms";
+      this.algorithmsTabPage.UseVisualStyleBackColor = true;
+      // 
+      // algorithmCollectionView
+      // 
+      this.algorithmCollectionView.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.algorithmCollectionView.Caption = "AlgorithmCollection View";
+      this.algorithmCollectionView.Content = null;
+      this.algorithmCollectionView.Location = new System.Drawing.Point(3, 3);
+      this.algorithmCollectionView.Name = "algorithmCollectionView";
+      this.algorithmCollectionView.ReadOnly = false;
+      this.algorithmCollectionView.Size = new System.Drawing.Size(713, 374);
+      this.algorithmCollectionView.TabIndex = 0;
+      // 
+      // problemClassesTabPage
+      // 
+      this.problemClassesTabPage.Controls.Add(this.problemClassCollectionView);
+      this.problemClassesTabPage.Location = new System.Drawing.Point(4, 22);
+      this.problemClassesTabPage.Name = "problemClassesTabPage";
+      this.problemClassesTabPage.Size = new System.Drawing.Size(719, 380);
+      this.problemClassesTabPage.TabIndex = 4;
+      this.problemClassesTabPage.Text = "Problem Classes";
+      this.problemClassesTabPage.UseVisualStyleBackColor = true;
+      // 
+      // problemsTabPage
+      // 
+      this.problemsTabPage.Controls.Add(this.problemCollectionView);
+      this.problemsTabPage.Location = new System.Drawing.Point(4, 22);
+      this.problemsTabPage.Name = "problemsTabPage";
+      this.problemsTabPage.Size = new System.Drawing.Size(719, 380);
+      this.problemsTabPage.TabIndex = 5;
+      this.problemsTabPage.Text = "Problems";
+      this.problemsTabPage.UseVisualStyleBackColor = true;
+      // 
+      // refreshButton
+      // 
+      this.refreshButton.Image = HeuristicLab.Common.Resources.VSImageLibrary.Refresh;
+      this.refreshButton.Location = new System.Drawing.Point(0, 0);
+      this.refreshButton.Name = "refreshButton";
+      this.refreshButton.Size = new System.Drawing.Size(24, 24);
+      this.refreshButton.TabIndex = 0;
+      this.toolTip.SetToolTip(this.refreshButton, "Refresh Data");
+      this.refreshButton.UseVisualStyleBackColor = true;
+      this.refreshButton.Click += new System.EventHandler(this.refreshButton_Click);
+      // 
+      // problemClassCollectionView
+      // 
+      this.problemClassCollectionView.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.problemClassCollectionView.Caption = "ProblemClassCollection View";
+      this.problemClassCollectionView.Content = null;
+      this.problemClassCollectionView.Location = new System.Drawing.Point(3, 3);
+      this.problemClassCollectionView.Name = "problemClassCollectionView";
+      this.problemClassCollectionView.ReadOnly = false;
+      this.problemClassCollectionView.Size = new System.Drawing.Size(713, 374);
+      this.problemClassCollectionView.TabIndex = 0;
+      // 
+      // problemCollectionView
+      // 
+      this.problemCollectionView.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.problemCollectionView.Caption = "ProblemCollection View";
+      this.problemCollectionView.Content = null;
+      this.problemCollectionView.Location = new System.Drawing.Point(3, 3);
+      this.problemCollectionView.Name = "problemCollectionView";
+      this.problemCollectionView.ReadOnly = false;
+      this.problemCollectionView.Size = new System.Drawing.Size(713, 374);
+      this.problemCollectionView.TabIndex = 0;
+      // 
+      // AdministratorView
+      // 
+      this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
+      this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
+      this.Controls.Add(this.tabControl);
+      this.Controls.Add(this.refreshButton);
+      this.Name = "AdministratorView";
+      this.Size = new System.Drawing.Size(727, 435);
+      this.tabControl.ResumeLayout(false);
+      this.platformsTabPage.ResumeLayout(false);
+      this.dataTypesTabPage.ResumeLayout(false);
+      this.algorithmClassesTabPage.ResumeLayout(false);
+      this.algorithmsTabPage.ResumeLayout(false);
+      this.problemClassesTabPage.ResumeLayout(false);
+      this.problemsTabPage.ResumeLayout(false);
+      this.ResumeLayout(false);
+
+    }
+
+    #endregion
+
+    private System.Windows.Forms.TabControl tabControl;
+    private System.Windows.Forms.TabPage algorithmClassesTabPage;
+    private System.Windows.Forms.TabPage algorithmsTabPage;
+    private System.Windows.Forms.Button refreshButton;
+    private AlgorithmClassCollectionView algorithmClassCollectionView;
+    private AlgorithmCollectionView algorithmCollectionView;
+    private System.Windows.Forms.ToolTip toolTip;
+    private System.Windows.Forms.TabPage platformsTabPage;
+    private PlatformCollectionView platformCollectionView;
+    private System.Windows.Forms.TabPage dataTypesTabPage;
+    private System.Windows.Forms.TabPage problemClassesTabPage;
+    private System.Windows.Forms.TabPage problemsTabPage;
+    private ProblemClassCollectionView problemClassCollectionView;
+    private ProblemCollectionView problemCollectionView;
+
+  }
+}
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 5533)
+++ branches/OKB (trunk integration)/HeuristicLab.Clients.OKB/3.3/Administration/Views/AdministratorView.cs	(revision 5533)
@@ -0,0 +1,107 @@
+#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.MainForm;
+using HeuristicLab.MainForm.WindowsForms;
+
+namespace HeuristicLab.Clients.OKB.Administration {
+  [View("OKB Administrator")]
+  [Content(typeof(AdministrationClient), true)]
+  public sealed partial class AdministratorView : AsynchronousContentView {
+    public new AdministrationClient Content {
+      get { return (AdministrationClient)base.Content; }
+      set { base.Content = value; }
+    }
+
+    public AdministratorView() {
+      InitializeComponent();
+    }
+
+    protected override void DeregisterContentEvents() {
+      Content.Refreshing -= new EventHandler(Content_Refreshing);
+      Content.Refreshed -= new EventHandler(Content_Refreshed);
+      base.DeregisterContentEvents();
+    }
+
+    protected override void RegisterContentEvents() {
+      base.RegisterContentEvents();
+      Content.Refreshing += new EventHandler(Content_Refreshing);
+      Content.Refreshed += new EventHandler(Content_Refreshed);
+    }
+
+    protected override void OnContentChanged() {
+      base.OnContentChanged();
+      if (Content == null) {
+        platformCollectionView.Content = null;
+        algorithmClassCollectionView.Content = null;
+        algorithmCollectionView.Content = null;
+        problemClassCollectionView.Content = null;
+        problemCollectionView.Content = null;
+      } else {
+        platformCollectionView.Content = Content.Platforms;
+        algorithmClassCollectionView.Content = Content.AlgorithmClasses;
+        algorithmCollectionView.Content = Content.Algorithms;
+        problemClassCollectionView.Content = Content.ProblemClasses;
+        problemCollectionView.Content = Content.Problems;
+      }
+    }
+
+    protected override void SetEnabledStateOfControls() {
+      base.SetEnabledStateOfControls();
+      refreshButton.Enabled = Content != null;
+      platformCollectionView.Enabled = Content != null;
+      algorithmClassCollectionView.Enabled = Content != null;
+      algorithmCollectionView.Enabled = Content != null;
+      problemClassCollectionView.Enabled = Content != null;
+      problemCollectionView.Enabled = Content != null;
+    }
+
+    private void Content_Refreshing(object sender, EventArgs e) {
+      if (InvokeRequired) {
+        Invoke(new EventHandler(Content_Refreshing), sender, e);
+      } else {
+        Cursor = Cursors.AppStarting;
+        refreshButton.Enabled = false;
+        tabControl.Enabled = false;
+      }
+    }
+    private void Content_Refreshed(object sender, EventArgs e) {
+      if (InvokeRequired) {
+        Invoke(new EventHandler(Content_Refreshed), sender, e);
+      } else {
+        platformCollectionView.Content = Content.Platforms;
+        algorithmClassCollectionView.Content = Content.AlgorithmClasses;
+        algorithmCollectionView.Content = Content.Algorithms;
+        problemClassCollectionView.Content = Content.ProblemClasses;
+        problemCollectionView.Content = Content.Problems;
+        refreshButton.Enabled = true;
+        tabControl.Enabled = true;
+        Cursor = Cursors.Default;
+      }
+    }
+
+    private void refreshButton_Click(object sender, EventArgs e) {
+      Content.Refresh();
+    }
+  }
+}
Index: branches/OKB (trunk integration)/HeuristicLab.Clients.OKB/3.3/Administration/Views/AlgorithmClassCollectionView.Designer.cs
===================================================================
--- branches/OKB (trunk integration)/HeuristicLab.Clients.OKB/3.3/Administration/Views/AlgorithmClassCollectionView.Designer.cs	(revision 5533)
+++ branches/OKB (trunk integration)/HeuristicLab.Clients.OKB/3.3/Administration/Views/AlgorithmClassCollectionView.Designer.cs	(revision 5533)
@@ -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 AlgorithmClassCollectionView {
+    /// <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/AlgorithmClassCollectionView.cs
===================================================================
--- branches/OKB (trunk integration)/HeuristicLab.Clients.OKB/3.3/Administration/Views/AlgorithmClassCollectionView.cs	(revision 5533)
+++ branches/OKB (trunk integration)/HeuristicLab.Clients.OKB/3.3/Administration/Views/AlgorithmClassCollectionView.cs	(revision 5533)
@@ -0,0 +1,40 @@
+﻿#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.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> {
+    public AlgorithmClassCollectionView() {
+      InitializeComponent();
+      itemsGroupBox.Text = "Algorithm Classes";
+    }
+
+    protected override AlgorithmClass CreateItem() {
+      return new AlgorithmClass();
+    }
+  }
+}
Index: branches/OKB (trunk integration)/HeuristicLab.Clients.OKB/3.3/Administration/Views/AlgorithmCollectionView.Designer.cs
===================================================================
--- branches/OKB (trunk integration)/HeuristicLab.Clients.OKB/3.3/Administration/Views/AlgorithmCollectionView.Designer.cs	(revision 5533)
+++ branches/OKB (trunk integration)/HeuristicLab.Clients.OKB/3.3/Administration/Views/AlgorithmCollectionView.Designer.cs	(revision 5533)
@@ -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 AlgorithmCollectionView {
+    /// <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/AlgorithmCollectionView.cs
===================================================================
--- branches/OKB (trunk integration)/HeuristicLab.Clients.OKB/3.3/Administration/Views/AlgorithmCollectionView.cs	(revision 5533)
+++ branches/OKB (trunk integration)/HeuristicLab.Clients.OKB/3.3/Administration/Views/AlgorithmCollectionView.cs	(revision 5533)
@@ -0,0 +1,40 @@
+﻿#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.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> {
+    public AlgorithmCollectionView() {
+      InitializeComponent();
+      itemsGroupBox.Text = "Algorithms";
+    }
+
+    protected override Algorithm CreateItem() {
+      return new Algorithm();
+    }
+  }
+}
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 5533)
+++ branches/OKB (trunk integration)/HeuristicLab.Clients.OKB/3.3/Administration/Views/AlgorithmView.Designer.cs	(revision 5533)
@@ -0,0 +1,280 @@
+#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 AlgorithmView {
+    /// <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() {
+      this.platformLabel = new System.Windows.Forms.Label();
+      this.platformComboBox = new System.Windows.Forms.ComboBox();
+      this.algorithmClassLabel = new System.Windows.Forms.Label();
+      this.algorithmClassComboBox = new System.Windows.Forms.ComboBox();
+      this.usersListBox = new System.Windows.Forms.ListBox();
+      this.tabControl = new System.Windows.Forms.TabControl();
+      this.usersTabPage = new System.Windows.Forms.TabPage();
+      this.storeUsersButton = new System.Windows.Forms.Button();
+      this.refreshUsersButton = new System.Windows.Forms.Button();
+      this.dataTabPage = new System.Windows.Forms.TabPage();
+      this.parametersTabPage = new System.Windows.Forms.TabPage();
+      this.refreshParametersButton = new System.Windows.Forms.Button();
+      this.resultsTabPage = new System.Windows.Forms.TabPage();
+      this.refreshResultsButton = new System.Windows.Forms.Button();
+      this.experimentsTabPage = new System.Windows.Forms.TabPage();
+      this.refreshExperimentsButton = new System.Windows.Forms.Button();
+      this.tabControl.SuspendLayout();
+      this.usersTabPage.SuspendLayout();
+      this.dataTabPage.SuspendLayout();
+      this.parametersTabPage.SuspendLayout();
+      this.resultsTabPage.SuspendLayout();
+      this.experimentsTabPage.SuspendLayout();
+      this.SuspendLayout();
+      // 
+      // nameTextBox
+      // 
+      this.nameTextBox.Location = new System.Drawing.Point(90, 29);
+      this.nameTextBox.Size = new System.Drawing.Size(543, 20);
+      // 
+      // descriptionTextBox
+      // 
+      this.descriptionTextBox.Location = new System.Drawing.Point(90, 55);
+      this.descriptionTextBox.Size = new System.Drawing.Size(543, 20);
+      // 
+      // storeButton
+      // 
+      this.toolTip.SetToolTip(this.storeButton, "Store Data");
+      // 
+      // platformLabel
+      // 
+      this.platformLabel.AutoSize = true;
+      this.platformLabel.Location = new System.Drawing.Point(3, 84);
+      this.platformLabel.Name = "platformLabel";
+      this.platformLabel.Size = new System.Drawing.Size(48, 13);
+      this.platformLabel.TabIndex = 5;
+      this.platformLabel.Text = "&Platform:";
+      // 
+      // platformComboBox
+      // 
+      this.platformComboBox.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
+                  | System.Windows.Forms.AnchorStyles.Right)));
+      this.platformComboBox.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList;
+      this.platformComboBox.FormattingEnabled = true;
+      this.platformComboBox.Location = new System.Drawing.Point(90, 81);
+      this.platformComboBox.Name = "platformComboBox";
+      this.platformComboBox.Size = new System.Drawing.Size(543, 21);
+      this.platformComboBox.TabIndex = 6;
+      this.platformComboBox.SelectedValueChanged += new System.EventHandler(this.platformComboBox_SelectedValueChanged);
+      // 
+      // algorithmClassLabel
+      // 
+      this.algorithmClassLabel.AutoSize = true;
+      this.algorithmClassLabel.Location = new System.Drawing.Point(3, 111);
+      this.algorithmClassLabel.Name = "algorithmClassLabel";
+      this.algorithmClassLabel.Size = new System.Drawing.Size(81, 13);
+      this.algorithmClassLabel.TabIndex = 7;
+      this.algorithmClassLabel.Text = "&Algorithm Class:";
+      // 
+      // algorithmClassComboBox
+      // 
+      this.algorithmClassComboBox.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
+                  | System.Windows.Forms.AnchorStyles.Right)));
+      this.algorithmClassComboBox.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList;
+      this.algorithmClassComboBox.FormattingEnabled = true;
+      this.algorithmClassComboBox.Location = new System.Drawing.Point(90, 108);
+      this.algorithmClassComboBox.Name = "algorithmClassComboBox";
+      this.algorithmClassComboBox.Size = new System.Drawing.Size(543, 21);
+      this.algorithmClassComboBox.TabIndex = 8;
+      this.algorithmClassComboBox.SelectedValueChanged += new System.EventHandler(this.algorithmClassComboBox_SelectedValueChanged);
+      // 
+      // usersListBox
+      // 
+      this.usersListBox.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.usersListBox.Enabled = false;
+      this.usersListBox.FormattingEnabled = true;
+      this.usersListBox.Location = new System.Drawing.Point(6, 36);
+      this.usersListBox.Name = "usersListBox";
+      this.usersListBox.SelectionMode = System.Windows.Forms.SelectionMode.MultiSimple;
+      this.usersListBox.Size = new System.Drawing.Size(613, 225);
+      this.usersListBox.TabIndex = 2;
+      this.usersListBox.SelectedIndexChanged += new System.EventHandler(this.usersListBox_SelectedIndexChanged);
+      // 
+      // tabControl
+      // 
+      this.tabControl.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.tabControl.Controls.Add(this.usersTabPage);
+      this.tabControl.Controls.Add(this.dataTabPage);
+      this.tabControl.Controls.Add(this.parametersTabPage);
+      this.tabControl.Controls.Add(this.resultsTabPage);
+      this.tabControl.Controls.Add(this.experimentsTabPage);
+      this.tabControl.Location = new System.Drawing.Point(0, 162);
+      this.tabControl.Name = "tabControl";
+      this.tabControl.SelectedIndex = 0;
+      this.tabControl.Size = new System.Drawing.Size(633, 292);
+      this.tabControl.TabIndex = 9;
+      // 
+      // usersTabPage
+      // 
+      this.usersTabPage.Controls.Add(this.storeUsersButton);
+      this.usersTabPage.Controls.Add(this.refreshUsersButton);
+      this.usersTabPage.Controls.Add(this.usersListBox);
+      this.usersTabPage.Location = new System.Drawing.Point(4, 22);
+      this.usersTabPage.Name = "usersTabPage";
+      this.usersTabPage.Padding = new System.Windows.Forms.Padding(3);
+      this.usersTabPage.Size = new System.Drawing.Size(625, 266);
+      this.usersTabPage.TabIndex = 0;
+      this.usersTabPage.Text = "Authorized Users";
+      this.usersTabPage.UseVisualStyleBackColor = true;
+      // 
+      // storeUsersButton
+      // 
+      this.storeUsersButton.Image = HeuristicLab.Common.Resources.VSImageLibrary.PublishToWeb;
+      this.storeUsersButton.Location = new System.Drawing.Point(36, 6);
+      this.storeUsersButton.Name = "storeUsersButton";
+      this.storeUsersButton.Size = new System.Drawing.Size(24, 24);
+      this.storeUsersButton.TabIndex = 1;
+      this.toolTip.SetToolTip(this.storeUsersButton, "Store Authorized Users");
+      this.storeUsersButton.UseVisualStyleBackColor = true;
+      this.storeUsersButton.Click += new System.EventHandler(this.storeUsersButton_Click);
+      // 
+      // refreshUsersButton
+      // 
+      this.refreshUsersButton.Image = HeuristicLab.Common.Resources.VSImageLibrary.Refresh;
+      this.refreshUsersButton.Location = new System.Drawing.Point(6, 6);
+      this.refreshUsersButton.Name = "refreshUsersButton";
+      this.refreshUsersButton.Size = new System.Drawing.Size(24, 24);
+      this.refreshUsersButton.TabIndex = 0;
+      this.toolTip.SetToolTip(this.refreshUsersButton, "Refresh Authorized Users");
+      this.refreshUsersButton.UseVisualStyleBackColor = true;
+      this.refreshUsersButton.Click += new System.EventHandler(this.refreshUsersButton_Click);
+      // 
+      // dataTabPage
+      // 
+      this.dataTabPage.Location = new System.Drawing.Point(4, 22);
+      this.dataTabPage.Name = "dataTabPage";
+      this.dataTabPage.Padding = new System.Windows.Forms.Padding(3);
+      this.dataTabPage.Size = new System.Drawing.Size(625, 266);
+      this.dataTabPage.TabIndex = 1;
+      this.dataTabPage.Text = "Platform-Specific Algorithm Data";
+      this.dataTabPage.UseVisualStyleBackColor = true;
+      // 
+      // refreshParametersButton
+      // 
+      this.refreshParametersButton.Image = HeuristicLab.Common.Resources.VSImageLibrary.Refresh;
+      this.refreshParametersButton.Location = new System.Drawing.Point(6, 6);
+      this.refreshParametersButton.Name = "refreshParametersButton";
+      this.refreshParametersButton.Size = new System.Drawing.Size(24, 24);
+      this.refreshParametersButton.TabIndex = 0;
+      this.refreshParametersButton.UseVisualStyleBackColor = true;
+      // 
+      // refreshResultsButton
+      // 
+      this.refreshResultsButton.Image = HeuristicLab.Common.Resources.VSImageLibrary.Refresh;
+      this.refreshResultsButton.Location = new System.Drawing.Point(6, 6);
+      this.refreshResultsButton.Name = "refreshResultsButton";
+      this.refreshResultsButton.Size = new System.Drawing.Size(24, 24);
+      this.refreshResultsButton.TabIndex = 0;
+      this.refreshResultsButton.UseVisualStyleBackColor = true;
+      // 
+      // refreshExperimentsButton
+      // 
+      this.refreshExperimentsButton.Image = HeuristicLab.Common.Resources.VSImageLibrary.Refresh;
+      this.refreshExperimentsButton.Location = new System.Drawing.Point(6, 6);
+      this.refreshExperimentsButton.Name = "refreshExperimentsButton";
+      this.refreshExperimentsButton.Size = new System.Drawing.Size(24, 24);
+      this.refreshExperimentsButton.TabIndex = 0;
+      this.refreshExperimentsButton.UseVisualStyleBackColor = true;
+      // 
+      // AlgorithmView
+      // 
+      this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
+      this.Controls.Add(this.tabControl);
+      this.Controls.Add(this.platformComboBox);
+      this.Controls.Add(this.platformLabel);
+      this.Controls.Add(this.algorithmClassComboBox);
+      this.Controls.Add(this.algorithmClassLabel);
+      this.Name = "AlgorithmView";
+      this.Size = new System.Drawing.Size(633, 454);
+      this.Controls.SetChildIndex(this.algorithmClassLabel, 0);
+      this.Controls.SetChildIndex(this.algorithmClassComboBox, 0);
+      this.Controls.SetChildIndex(this.platformLabel, 0);
+      this.Controls.SetChildIndex(this.platformComboBox, 0);
+      this.Controls.SetChildIndex(this.tabControl, 0);
+      this.Controls.SetChildIndex(this.storeButton, 0);
+      this.Controls.SetChildIndex(this.nameTextBox, 0);
+      this.Controls.SetChildIndex(this.nameLabel, 0);
+      this.Controls.SetChildIndex(this.descriptionLabel, 0);
+      this.Controls.SetChildIndex(this.descriptionTextBox, 0);
+      this.tabControl.ResumeLayout(false);
+      this.usersTabPage.ResumeLayout(false);
+      this.dataTabPage.ResumeLayout(false);
+      this.parametersTabPage.ResumeLayout(false);
+      this.resultsTabPage.ResumeLayout(false);
+      this.experimentsTabPage.ResumeLayout(false);
+      this.ResumeLayout(false);
+      this.PerformLayout();
+
+    }
+
+    #endregion
+
+    private System.Windows.Forms.Label platformLabel;
+    private System.Windows.Forms.ComboBox platformComboBox;
+    private System.Windows.Forms.Label algorithmClassLabel;
+    private System.Windows.Forms.ComboBox algorithmClassComboBox;
+    private System.Windows.Forms.ListBox usersListBox;
+    private System.Windows.Forms.TabControl tabControl;
+    private System.Windows.Forms.TabPage usersTabPage;
+    private System.Windows.Forms.Button storeUsersButton;
+    private System.Windows.Forms.Button refreshUsersButton;
+    private System.Windows.Forms.TabPage dataTabPage;
+    private System.Windows.Forms.TabPage parametersTabPage;
+    private System.Windows.Forms.TabPage resultsTabPage;
+    private System.Windows.Forms.Button refreshParametersButton;
+    private System.Windows.Forms.Button refreshResultsButton;
+    private System.Windows.Forms.TabPage experimentsTabPage;
+    private System.Windows.Forms.Button refreshExperimentsButton;
+
+  }
+}
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 5533)
+++ branches/OKB (trunk integration)/HeuristicLab.Clients.OKB/3.3/Administration/Views/AlgorithmView.cs	(revision 5533)
@@ -0,0 +1,120 @@
+#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 System.Windows.Forms;
+using HeuristicLab.Clients.OKB.Authentication;
+using HeuristicLab.MainForm;
+using HeuristicLab.MainForm.WindowsForms;
+
+namespace HeuristicLab.Clients.OKB.Administration {
+  [View("Algorithm View")]
+  [Content(typeof(Algorithm), true)]
+  public partial class AlgorithmView : NamedOKBItemView {
+    private List<Platform> platformComboBoxValues;
+    private List<AlgorithmClass> algorithmClassComboBoxValues;
+
+    public new Algorithm Content {
+      get { return (Algorithm)base.Content; }
+      set { base.Content = value; }
+    }
+
+    public AlgorithmView() {
+      InitializeComponent();
+    }
+
+    protected override void OnInitialized(System.EventArgs e) {
+      base.OnInitialized(e);
+      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;
+      } else {
+        platformComboBox.SelectedItem = platformComboBoxValues.FirstOrDefault(p => p.Id == Content.PlatformId);
+        algorithmClassComboBox.SelectedItem = algorithmClassComboBoxValues.FirstOrDefault(a => a.Id == Content.AlgorithmClassId);
+      }
+      usersListBox.DataSource = null;
+    }
+
+    protected override void SetEnabledStateOfControls() {
+      base.SetEnabledStateOfControls();
+      platformComboBox.Enabled = (Content != null) && !ReadOnly;
+      algorithmClassComboBox.Enabled = (Content != null) && !ReadOnly;
+      refreshUsersButton.Enabled = Content != null;
+      storeUsersButton.Enabled = (usersListBox.DataSource != null) && !ReadOnly;
+      usersListBox.Enabled = (usersListBox.DataSource != null) && !ReadOnly;
+    }
+
+    protected override void OnContentPropertyChanged(string propertyName) {
+      switch (propertyName) {
+        case "PlatformId":
+          platformComboBox.SelectedItem = platformComboBoxValues.FirstOrDefault(p => p.Id == Content.PlatformId);
+          break;
+        case "AlgorithmClassId":
+          algorithmClassComboBox.SelectedItem = algorithmClassComboBoxValues.FirstOrDefault(a => a.Id == Content.AlgorithmClassId);
+          break;
+      }
+    }
+
+    private void platformComboBox_SelectedValueChanged(object sender, System.EventArgs e) {
+      if (Content != null) {
+        Platform selected = platformComboBox.SelectedItem as Platform;
+        if (selected != null) Content.PlatformId = selected.Id;
+      }
+    }
+    private void algorithmClassComboBox_SelectedValueChanged(object sender, System.EventArgs e) {
+      if (Content != null) {
+        AlgorithmClass selected = algorithmClassComboBox.SelectedItem as AlgorithmClass;
+        if (selected != null) Content.AlgorithmClassId = selected.Id;
+      }
+    }
+
+    private void refreshUsersButton_Click(object sender, System.EventArgs e) {
+      List<Guid> ids = AdministrationClient.Instance.GetAlgorithmUsers(Content.Id);
+      if (ids != null) {
+        List<User> users = AuthenticationClient.Instance.Users.ToList();
+        usersListBox.DataSource = users;
+        usersListBox.DisplayMember = "Name";
+        usersListBox.SelectedItems.Clear();
+        foreach (Guid id in ids)
+          usersListBox.SelectedItems.Add(users.First(u => u.Id == id));
+        usersListBox.Enabled = !ReadOnly;
+        storeUsersButton.Enabled = false;
+      }
+    }
+    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;
+    }
+    private void usersListBox_SelectedIndexChanged(object sender, EventArgs 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 5533)
+++ branches/OKB (trunk integration)/HeuristicLab.Clients.OKB/3.3/Administration/Views/NamedOKBItemView.Designer.cs	(revision 5533)
@@ -0,0 +1,125 @@
+#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 NamedOKBItemView {
+    /// <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() {
+      this.nameLabel = new System.Windows.Forms.Label();
+      this.nameTextBox = new System.Windows.Forms.TextBox();
+      this.descriptionLabel = new System.Windows.Forms.Label();
+      this.descriptionTextBox = new System.Windows.Forms.TextBox();
+      this.SuspendLayout();
+      // 
+      // storeButton
+      // 
+      this.toolTip.SetToolTip(this.storeButton, "Store Data");
+      // 
+      // nameLabel
+      // 
+      this.nameLabel.AutoSize = true;
+      this.nameLabel.Location = new System.Drawing.Point(3, 32);
+      this.nameLabel.Name = "nameLabel";
+      this.nameLabel.Size = new System.Drawing.Size(38, 13);
+      this.nameLabel.TabIndex = 1;
+      this.nameLabel.Text = "&Name:";
+      // 
+      // nameTextBox
+      // 
+      this.nameTextBox.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
+                  | System.Windows.Forms.AnchorStyles.Right)));
+      this.nameTextBox.Location = new System.Drawing.Point(72, 29);
+      this.nameTextBox.Name = "nameTextBox";
+      this.nameTextBox.Size = new System.Drawing.Size(278, 20);
+      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
+      // 
+      this.descriptionLabel.AutoSize = true;
+      this.descriptionLabel.Location = new System.Drawing.Point(3, 58);
+      this.descriptionLabel.Name = "descriptionLabel";
+      this.descriptionLabel.Size = new System.Drawing.Size(63, 13);
+      this.descriptionLabel.TabIndex = 3;
+      this.descriptionLabel.Text = "&Description:";
+      // 
+      // descriptionTextBox
+      // 
+      this.descriptionTextBox.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
+                  | System.Windows.Forms.AnchorStyles.Right)));
+      this.descriptionTextBox.Location = new System.Drawing.Point(72, 55);
+      this.descriptionTextBox.Name = "descriptionTextBox";
+      this.descriptionTextBox.ScrollBars = System.Windows.Forms.ScrollBars.Vertical;
+      this.descriptionTextBox.Size = new System.Drawing.Size(278, 20);
+      this.descriptionTextBox.TabIndex = 4;
+      this.descriptionTextBox.TextChanged += new System.EventHandler(this.descriptionTextBox_TextChanged);
+      this.descriptionTextBox.DoubleClick += new System.EventHandler(this.descriptionTextBox_DoubleClick);
+      // 
+      // NamedOKBItemView
+      // 
+      this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
+      this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
+      this.Controls.Add(this.descriptionTextBox);
+      this.Controls.Add(this.descriptionLabel);
+      this.Controls.Add(this.nameLabel);
+      this.Controls.Add(this.nameTextBox);
+      this.Name = "NamedOKBItemView";
+      this.Size = new System.Drawing.Size(350, 93);
+      this.Controls.SetChildIndex(this.storeButton, 0);
+      this.Controls.SetChildIndex(this.nameTextBox, 0);
+      this.Controls.SetChildIndex(this.nameLabel, 0);
+      this.Controls.SetChildIndex(this.descriptionLabel, 0);
+      this.Controls.SetChildIndex(this.descriptionTextBox, 0);
+      this.ResumeLayout(false);
+      this.PerformLayout();
+
+    }
+
+    #endregion
+
+    protected System.Windows.Forms.TextBox nameTextBox;
+    protected System.Windows.Forms.Label nameLabel;
+    protected System.Windows.Forms.Label descriptionLabel;
+    protected System.Windows.Forms.TextBox descriptionTextBox;
+  }
+}
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 5533)
+++ branches/OKB (trunk integration)/HeuristicLab.Clients.OKB/3.3/Administration/Views/NamedOKBItemView.cs	(revision 5533)
@@ -0,0 +1,105 @@
+#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.MainForm.WindowsForms;
+
+namespace HeuristicLab.Clients.OKB.Administration {
+  [View("NamedOKBItem View")]
+  [Content(typeof(NamedOKBItem), true)]
+  [Content(typeof(INamedOKBItem), false)]
+  public partial class NamedOKBItemView : OKBItemView {
+    public new INamedOKBItem Content {
+      get { return (INamedOKBItem)base.Content; }
+      set { base.Content = value; }
+    }
+
+    public NamedOKBItemView() {
+      InitializeComponent();
+    }
+
+    protected override void OnContentChanged() {
+      base.OnContentChanged();
+      if (Content == null) {
+        nameTextBox.Text = string.Empty;
+        descriptionTextBox.Text = string.Empty;
+        toolTip.SetToolTip(descriptionTextBox, string.Empty);
+        if (ViewAttribute.HasViewAttribute(this.GetType()))
+          this.Caption = ViewAttribute.GetViewName(this.GetType());
+        else
+          this.Caption = "NamedEntity View";
+      } else {
+        nameTextBox.Text = Content.Name;
+        descriptionTextBox.Text = Content.Description;
+        toolTip.SetToolTip(descriptionTextBox, Content.Description);
+        Caption = Content.Name;
+      }
+    }
+
+    protected override void SetEnabledStateOfControls() {
+      base.SetEnabledStateOfControls();
+      nameTextBox.Enabled = Content != null;
+      nameTextBox.ReadOnly = ReadOnly;
+      descriptionTextBox.Enabled = Content != null;
+      descriptionTextBox.ReadOnly = ReadOnly;
+    }
+
+    protected override void OnContentPropertyChanged(string propertyName) {
+      switch (propertyName) {
+        case "Name":
+          nameTextBox.Text = Content.Name;
+          Caption = Content.Name;
+          break;
+        case "Description":
+          descriptionTextBox.Text = Content.Description;
+          toolTip.SetToolTip(descriptionTextBox, Content.Description);
+          break;
+      }
+    }
+
+    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)
+        Content.Name = nameTextBox.Text;
+    }
+    protected virtual void descriptionTextBox_TextChanged(object sender, EventArgs e) {
+      if (descriptionTextBox.Text != Content.Description)
+        Content.Description = descriptionTextBox.Text;
+    }
+
+    protected void descriptionTextBox_DoubleClick(object sender, EventArgs e) {
+      using (TextDialog dialog = new TextDialog("Description of " + Content.Name, descriptionTextBox.Text, ReadOnly)) {
+        if (dialog.ShowDialog(this) == DialogResult.OK)
+          Content.Description = dialog.Content;
+      }
+    }
+  }
+}
Index: branches/OKB (trunk integration)/HeuristicLab.Clients.OKB/3.3/Administration/Views/OKBItemView.Designer.cs
===================================================================
--- branches/OKB (trunk integration)/HeuristicLab.Clients.OKB/3.3/Administration/Views/OKBItemView.Designer.cs	(revision 5533)
+++ branches/OKB (trunk integration)/HeuristicLab.Clients.OKB/3.3/Administration/Views/OKBItemView.Designer.cs	(revision 5533)
@@ -0,0 +1,82 @@
+#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 OKBItemView {
+    /// <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() {
+      this.components = new System.ComponentModel.Container();
+      this.storeButton = new System.Windows.Forms.Button();
+      this.toolTip = new System.Windows.Forms.ToolTip(this.components);
+      this.SuspendLayout();
+      // 
+      // storeButton
+      // 
+      this.storeButton.Image = HeuristicLab.Common.Resources.VSImageLibrary.PublishToWeb;
+      this.storeButton.Location = new System.Drawing.Point(0, 0);
+      this.storeButton.Name = "storeButton";
+      this.storeButton.Size = new System.Drawing.Size(24, 24);
+      this.storeButton.TabIndex = 0;
+      this.toolTip.SetToolTip(this.storeButton, "Store Data");
+      this.storeButton.UseVisualStyleBackColor = true;
+      this.storeButton.Click += new System.EventHandler(this.storeButton_Click);
+      // 
+      // OKBItemView
+      // 
+      this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
+      this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
+      this.Controls.Add(this.storeButton);
+      this.Name = "OKBItemView";
+      this.Size = new System.Drawing.Size(354, 308);
+      this.ResumeLayout(false);
+
+    }
+
+    #endregion
+
+    protected System.Windows.Forms.Button storeButton;
+    protected System.Windows.Forms.ToolTip toolTip;
+
+
+
+  }
+}
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 5533)
+++ branches/OKB (trunk integration)/HeuristicLab.Clients.OKB/3.3/Administration/Views/OKBItemView.cs	(revision 5533)
@@ -0,0 +1,78 @@
+#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.ComponentModel;
+using System.Windows.Forms;
+using HeuristicLab.Core.Views;
+using HeuristicLab.MainForm;
+using HeuristicLab.MainForm.WindowsForms;
+
+namespace HeuristicLab.Clients.OKB.Administration {
+  [View("OKBItem View")]
+  [Content(typeof(OKBItem), true)]
+  [Content(typeof(IOKBItem), false)]
+  public partial class OKBItemView : ItemView {
+    public new IOKBItem Content {
+      get { return (IOKBItem)base.Content; }
+      set { base.Content = value; }
+    }
+
+    public OKBItemView() {
+      InitializeComponent();
+    }
+
+    protected override void DeregisterContentEvents() {
+      Content.PropertyChanged -= new PropertyChangedEventHandler(Content_PropertyChanged);
+      Content.ModifiedChanged -= new EventHandler(Content_ModifiedChanged);
+      base.DeregisterContentEvents();
+    }
+    protected override void RegisterContentEvents() {
+      base.RegisterContentEvents();
+      Content.PropertyChanged += new PropertyChangedEventHandler(Content_PropertyChanged);
+      Content.ModifiedChanged += new EventHandler(Content_ModifiedChanged);
+    }
+
+    protected override void SetEnabledStateOfControls() {
+      base.SetEnabledStateOfControls();
+      storeButton.Enabled = (Content != null) && !ReadOnly && Content.Modified;
+    }
+
+    private void Content_PropertyChanged(object sender, PropertyChangedEventArgs e) {
+      if (InvokeRequired)
+        Invoke(new PropertyChangedEventHandler(Content_PropertyChanged), sender, e);
+      else {
+        OnContentPropertyChanged(e.PropertyName);
+      }
+    }
+    protected virtual void OnContentPropertyChanged(string propertyName) { }
+    protected virtual void Content_ModifiedChanged(object sender, EventArgs e) {
+      if (InvokeRequired)
+        Invoke(new EventHandler(Content_ModifiedChanged), sender, e);
+      else
+        SetEnabledStateOfControls();
+    }
+
+    protected virtual void storeButton_Click(object sender, EventArgs e) {
+      Content.Store();
+    }
+  }
+}
Index: branches/OKB (trunk integration)/HeuristicLab.Clients.OKB/3.3/Administration/Views/PlatformCollectionView.Designer.cs
===================================================================
--- branches/OKB (trunk integration)/HeuristicLab.Clients.OKB/3.3/Administration/Views/PlatformCollectionView.Designer.cs	(revision 5533)
+++ branches/OKB (trunk integration)/HeuristicLab.Clients.OKB/3.3/Administration/Views/PlatformCollectionView.Designer.cs	(revision 5533)
@@ -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 PlatformCollectionView {
+    /// <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/PlatformCollectionView.cs
===================================================================
--- branches/OKB (trunk integration)/HeuristicLab.Clients.OKB/3.3/Administration/Views/PlatformCollectionView.cs	(revision 5533)
+++ branches/OKB (trunk integration)/HeuristicLab.Clients.OKB/3.3/Administration/Views/PlatformCollectionView.cs	(revision 5533)
@@ -0,0 +1,40 @@
+﻿#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.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> {
+    public PlatformCollectionView() {
+      InitializeComponent();
+      itemsGroupBox.Text = "Platforms";
+    }
+
+    protected override Platform CreateItem() {
+      return new Platform();
+    }
+  }
+}
Index: branches/OKB (trunk integration)/HeuristicLab.Clients.OKB/3.3/Administration/Views/ProblemClassCollectionView.Designer.cs
===================================================================
--- branches/OKB (trunk integration)/HeuristicLab.Clients.OKB/3.3/Administration/Views/ProblemClassCollectionView.Designer.cs	(revision 5533)
+++ branches/OKB (trunk integration)/HeuristicLab.Clients.OKB/3.3/Administration/Views/ProblemClassCollectionView.Designer.cs	(revision 5533)
@@ -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 ProblemClassCollectionView {
+    /// <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/ProblemClassCollectionView.cs
===================================================================
--- branches/OKB (trunk integration)/HeuristicLab.Clients.OKB/3.3/Administration/Views/ProblemClassCollectionView.cs	(revision 5533)
+++ branches/OKB (trunk integration)/HeuristicLab.Clients.OKB/3.3/Administration/Views/ProblemClassCollectionView.cs	(revision 5533)
@@ -0,0 +1,40 @@
+﻿#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.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> {
+    public ProblemClassCollectionView() {
+      InitializeComponent();
+      itemsGroupBox.Text = "Problem Classes";
+    }
+
+    protected override ProblemClass CreateItem() {
+      return new ProblemClass();
+    }
+  }
+}
Index: branches/OKB (trunk integration)/HeuristicLab.Clients.OKB/3.3/Administration/Views/ProblemCollectionView.Designer.cs
===================================================================
--- branches/OKB (trunk integration)/HeuristicLab.Clients.OKB/3.3/Administration/Views/ProblemCollectionView.Designer.cs	(revision 5533)
+++ branches/OKB (trunk integration)/HeuristicLab.Clients.OKB/3.3/Administration/Views/ProblemCollectionView.Designer.cs	(revision 5533)
@@ -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 ProblemCollectionView {
+    /// <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/ProblemCollectionView.cs
===================================================================
--- branches/OKB (trunk integration)/HeuristicLab.Clients.OKB/3.3/Administration/Views/ProblemCollectionView.cs	(revision 5533)
+++ branches/OKB (trunk integration)/HeuristicLab.Clients.OKB/3.3/Administration/Views/ProblemCollectionView.cs	(revision 5533)
@@ -0,0 +1,40 @@
+﻿#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.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> {
+    public ProblemCollectionView() {
+      InitializeComponent();
+      itemsGroupBox.Text = "Problems";
+    }
+
+    protected override Problem CreateItem() {
+      return new Problem();
+    }
+  }
+}
Index: branches/OKB (trunk integration)/HeuristicLab.Clients.OKB/3.3/Administration/Views/ProblemView.Designer.cs
===================================================================
--- branches/OKB (trunk integration)/HeuristicLab.Clients.OKB/3.3/Administration/Views/ProblemView.Designer.cs	(revision 5533)
+++ branches/OKB (trunk integration)/HeuristicLab.Clients.OKB/3.3/Administration/Views/ProblemView.Designer.cs	(revision 5533)
@@ -0,0 +1,232 @@
+#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 ProblemView {
+    /// <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() {
+      this.platformLabel = new System.Windows.Forms.Label();
+      this.platformComboBox = new System.Windows.Forms.ComboBox();
+      this.problemClassLabel = new System.Windows.Forms.Label();
+      this.problemClassComboBox = new System.Windows.Forms.ComboBox();
+      this.usersListBox = new System.Windows.Forms.ListBox();
+      this.tabControl = new System.Windows.Forms.TabControl();
+      this.usersTabPage = new System.Windows.Forms.TabPage();
+      this.storeUsersButton = new System.Windows.Forms.Button();
+      this.refreshUsersButton = new System.Windows.Forms.Button();
+      this.dataTabPage = new System.Windows.Forms.TabPage();
+      this.tabControl.SuspendLayout();
+      this.usersTabPage.SuspendLayout();
+      this.dataTabPage.SuspendLayout();
+      this.SuspendLayout();
+      // 
+      // nameTextBox
+      // 
+      this.nameTextBox.Location = new System.Drawing.Point(90, 29);
+      this.nameTextBox.Size = new System.Drawing.Size(543, 20);
+      // 
+      // descriptionTextBox
+      // 
+      this.descriptionTextBox.Location = new System.Drawing.Point(90, 55);
+      this.descriptionTextBox.Size = new System.Drawing.Size(543, 20);
+      // 
+      // storeButton
+      // 
+      this.toolTip.SetToolTip(this.storeButton, "Store Data");
+      // 
+      // platformLabel
+      // 
+      this.platformLabel.AutoSize = true;
+      this.platformLabel.Location = new System.Drawing.Point(3, 84);
+      this.platformLabel.Name = "platformLabel";
+      this.platformLabel.Size = new System.Drawing.Size(48, 13);
+      this.platformLabel.TabIndex = 5;
+      this.platformLabel.Text = "&Platform:";
+      // 
+      // platformComboBox
+      // 
+      this.platformComboBox.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
+                  | System.Windows.Forms.AnchorStyles.Right)));
+      this.platformComboBox.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList;
+      this.platformComboBox.FormattingEnabled = true;
+      this.platformComboBox.Location = new System.Drawing.Point(90, 81);
+      this.platformComboBox.Name = "platformComboBox";
+      this.platformComboBox.Size = new System.Drawing.Size(543, 21);
+      this.platformComboBox.TabIndex = 6;
+      this.platformComboBox.SelectedValueChanged += new System.EventHandler(this.platformComboBox_SelectedValueChanged);
+      // 
+      // problemClassLabel
+      // 
+      this.problemClassLabel.AutoSize = true;
+      this.problemClassLabel.Location = new System.Drawing.Point(3, 111);
+      this.problemClassLabel.Name = "problemClassLabel";
+      this.problemClassLabel.Size = new System.Drawing.Size(81, 13);
+      this.problemClassLabel.TabIndex = 7;
+      this.problemClassLabel.Text = "&Problem Class:";
+      // 
+      // problemClassComboBox
+      // 
+      this.problemClassComboBox.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
+                  | System.Windows.Forms.AnchorStyles.Right)));
+      this.problemClassComboBox.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList;
+      this.problemClassComboBox.FormattingEnabled = true;
+      this.problemClassComboBox.Location = new System.Drawing.Point(90, 108);
+      this.problemClassComboBox.Name = "problemClassComboBox";
+      this.problemClassComboBox.Size = new System.Drawing.Size(543, 21);
+      this.problemClassComboBox.TabIndex = 8;
+      this.problemClassComboBox.SelectedValueChanged += new System.EventHandler(this.problemClassComboBox_SelectedValueChanged);
+      // 
+      // usersListBox
+      // 
+      this.usersListBox.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.usersListBox.Enabled = false;
+      this.usersListBox.FormattingEnabled = true;
+      this.usersListBox.Location = new System.Drawing.Point(6, 36);
+      this.usersListBox.Name = "usersListBox";
+      this.usersListBox.SelectionMode = System.Windows.Forms.SelectionMode.MultiSimple;
+      this.usersListBox.Size = new System.Drawing.Size(613, 225);
+      this.usersListBox.TabIndex = 2;
+      this.usersListBox.SelectedIndexChanged += new System.EventHandler(this.usersListBox_SelectedIndexChanged);
+      // 
+      // tabControl
+      // 
+      this.tabControl.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.tabControl.Controls.Add(this.usersTabPage);
+      this.tabControl.Controls.Add(this.dataTabPage);
+      this.tabControl.Location = new System.Drawing.Point(0, 162);
+      this.tabControl.Name = "tabControl";
+      this.tabControl.SelectedIndex = 0;
+      this.tabControl.Size = new System.Drawing.Size(633, 292);
+      this.tabControl.TabIndex = 9;
+      // 
+      // usersTabPage
+      // 
+      this.usersTabPage.Controls.Add(this.storeUsersButton);
+      this.usersTabPage.Controls.Add(this.refreshUsersButton);
+      this.usersTabPage.Controls.Add(this.usersListBox);
+      this.usersTabPage.Location = new System.Drawing.Point(4, 22);
+      this.usersTabPage.Name = "usersTabPage";
+      this.usersTabPage.Padding = new System.Windows.Forms.Padding(3);
+      this.usersTabPage.Size = new System.Drawing.Size(625, 266);
+      this.usersTabPage.TabIndex = 0;
+      this.usersTabPage.Text = "Authorized Users";
+      this.usersTabPage.UseVisualStyleBackColor = true;
+      // 
+      // storeUsersButton
+      // 
+      this.storeUsersButton.Image = HeuristicLab.Common.Resources.VSImageLibrary.PublishToWeb;
+      this.storeUsersButton.Location = new System.Drawing.Point(36, 6);
+      this.storeUsersButton.Name = "storeUsersButton";
+      this.storeUsersButton.Size = new System.Drawing.Size(24, 24);
+      this.storeUsersButton.TabIndex = 1;
+      this.toolTip.SetToolTip(this.storeUsersButton, "Store Authorized Users");
+      this.storeUsersButton.UseVisualStyleBackColor = true;
+      this.storeUsersButton.Click += new System.EventHandler(this.storeUsersButton_Click);
+      // 
+      // refreshUsersButton
+      // 
+      this.refreshUsersButton.Image = HeuristicLab.Common.Resources.VSImageLibrary.Refresh;
+      this.refreshUsersButton.Location = new System.Drawing.Point(6, 6);
+      this.refreshUsersButton.Name = "refreshUsersButton";
+      this.refreshUsersButton.Size = new System.Drawing.Size(24, 24);
+      this.refreshUsersButton.TabIndex = 0;
+      this.toolTip.SetToolTip(this.refreshUsersButton, "Refresh Authorized Users");
+      this.refreshUsersButton.UseVisualStyleBackColor = true;
+      this.refreshUsersButton.Click += new System.EventHandler(this.refreshUsersButton_Click);
+      // 
+      // dataTabPage
+      // 
+      this.dataTabPage.Location = new System.Drawing.Point(4, 22);
+      this.dataTabPage.Name = "dataTabPage";
+      this.dataTabPage.Padding = new System.Windows.Forms.Padding(3);
+      this.dataTabPage.Size = new System.Drawing.Size(625, 266);
+      this.dataTabPage.TabIndex = 1;
+      this.dataTabPage.Text = "Platform-Specific Problem Data";
+      this.dataTabPage.UseVisualStyleBackColor = true;
+      // 
+      // ProblemView
+      // 
+      this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
+      this.Controls.Add(this.tabControl);
+      this.Controls.Add(this.platformComboBox);
+      this.Controls.Add(this.platformLabel);
+      this.Controls.Add(this.problemClassComboBox);
+      this.Controls.Add(this.problemClassLabel);
+      this.Name = "ProblemView";
+      this.Size = new System.Drawing.Size(633, 454);
+      this.Controls.SetChildIndex(this.problemClassLabel, 0);
+      this.Controls.SetChildIndex(this.problemClassComboBox, 0);
+      this.Controls.SetChildIndex(this.platformLabel, 0);
+      this.Controls.SetChildIndex(this.platformComboBox, 0);
+      this.Controls.SetChildIndex(this.tabControl, 0);
+      this.Controls.SetChildIndex(this.storeButton, 0);
+      this.Controls.SetChildIndex(this.nameTextBox, 0);
+      this.Controls.SetChildIndex(this.nameLabel, 0);
+      this.Controls.SetChildIndex(this.descriptionLabel, 0);
+      this.Controls.SetChildIndex(this.descriptionTextBox, 0);
+      this.tabControl.ResumeLayout(false);
+      this.usersTabPage.ResumeLayout(false);
+      this.dataTabPage.ResumeLayout(false);
+      this.ResumeLayout(false);
+      this.PerformLayout();
+
+    }
+
+    #endregion
+
+    private System.Windows.Forms.Label platformLabel;
+    private System.Windows.Forms.ComboBox platformComboBox;
+    private System.Windows.Forms.Label problemClassLabel;
+    private System.Windows.Forms.ComboBox problemClassComboBox;
+    private System.Windows.Forms.ListBox usersListBox;
+    private System.Windows.Forms.TabControl tabControl;
+    private System.Windows.Forms.TabPage usersTabPage;
+    private System.Windows.Forms.Button storeUsersButton;
+    private System.Windows.Forms.Button refreshUsersButton;
+    private System.Windows.Forms.TabPage dataTabPage;
+
+  }
+}
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 5533)
+++ branches/OKB (trunk integration)/HeuristicLab.Clients.OKB/3.3/Administration/Views/ProblemView.cs	(revision 5533)
@@ -0,0 +1,120 @@
+#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 System.Windows.Forms;
+using HeuristicLab.Clients.OKB.Authentication;
+using HeuristicLab.MainForm;
+using HeuristicLab.MainForm.WindowsForms;
+
+namespace HeuristicLab.Clients.OKB.Administration {
+  [View("Problem View")]
+  [Content(typeof(Problem), true)]
+  public partial class ProblemView : NamedOKBItemView {
+    private List<Platform> platformComboBoxValues;
+    private List<ProblemClass> problemClassComboBoxValues;
+
+    public new Problem Content {
+      get { return (Problem)base.Content; }
+      set { base.Content = value; }
+    }
+
+    public ProblemView() {
+      InitializeComponent();
+    }
+
+    protected override void OnInitialized(System.EventArgs e) {
+      base.OnInitialized(e);
+      platformComboBoxValues = AdministrationClient.Instance.Platforms.ToList();
+      platformComboBox.DataSource = platformComboBoxValues;
+      problemClassComboBoxValues = AdministrationClient.Instance.ProblemClasses.ToList();
+      problemClassComboBox.DataSource = problemClassComboBoxValues;
+    }
+
+    protected override void OnContentChanged() {
+      base.OnContentChanged();
+      if (Content == null) {
+        platformComboBox.SelectedIndex = -1;
+        problemClassComboBox.SelectedIndex = -1;
+      } else {
+        platformComboBox.SelectedItem = platformComboBoxValues.FirstOrDefault(p => p.Id == Content.PlatformId);
+        problemClassComboBox.SelectedItem = problemClassComboBoxValues.FirstOrDefault(a => a.Id == Content.ProblemClassId);
+      }
+      usersListBox.DataSource = null;
+    }
+
+    protected override void SetEnabledStateOfControls() {
+      base.SetEnabledStateOfControls();
+      platformComboBox.Enabled = (Content != null) && !ReadOnly;
+      problemClassComboBox.Enabled = (Content != null) && !ReadOnly;
+      refreshUsersButton.Enabled = Content != null;
+      storeUsersButton.Enabled = (usersListBox.DataSource != null) && !ReadOnly;
+      usersListBox.Enabled = (usersListBox.DataSource != null) && !ReadOnly;
+    }
+
+    protected override void OnContentPropertyChanged(string propertyName) {
+      switch (propertyName) {
+        case "PlatformId":
+          platformComboBox.SelectedItem = platformComboBoxValues.FirstOrDefault(p => p.Id == Content.PlatformId);
+          break;
+        case "ProblemClassId":
+          problemClassComboBox.SelectedItem = problemClassComboBoxValues.FirstOrDefault(a => a.Id == Content.ProblemClassId);
+          break;
+      }
+    }
+
+    private void platformComboBox_SelectedValueChanged(object sender, System.EventArgs e) {
+      if (Content != null) {
+        Platform selected = platformComboBox.SelectedItem as Platform;
+        if (selected != null) Content.PlatformId = selected.Id;
+      }
+    }
+    private void problemClassComboBox_SelectedValueChanged(object sender, System.EventArgs e) {
+      if (Content != null) {
+        ProblemClass selected = problemClassComboBox.SelectedItem as ProblemClass;
+        if (selected != null) Content.ProblemClassId = selected.Id;
+      }
+    }
+
+    private void refreshUsersButton_Click(object sender, System.EventArgs e) {
+      List<Guid> ids = AdministrationClient.Instance.GetProblemUsers(Content.Id);
+      if (ids != null) {
+        List<User> users = AuthenticationClient.Instance.Users.ToList();
+        usersListBox.DataSource = users;
+        usersListBox.DisplayMember = "Name";
+        usersListBox.SelectedItems.Clear();
+        foreach (Guid id in ids)
+          usersListBox.SelectedItems.Add(users.First(u => u.Id == id));
+        usersListBox.Enabled = !ReadOnly;
+        storeUsersButton.Enabled = false;
+      }
+    }
+    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;
+    }
+    private void usersListBox_SelectedIndexChanged(object sender, EventArgs e) {
+      storeUsersButton.Enabled = !ReadOnly;
+    }
+  }
+}
Index: branches/OKB (trunk integration)/HeuristicLab.Clients.OKB/3.3/AdministratorMenuItem.cs
===================================================================
--- branches/OKB (trunk integration)/HeuristicLab.Clients.OKB/3.3/AdministratorMenuItem.cs	(revision 5504)
+++ 	(revision )
@@ -1,42 +1,0 @@
-﻿#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.Collections.Generic;
-using HeuristicLab.MainForm;
-using HeuristicLab.Optimizer;
-
-namespace HeuristicLab.Clients.OKB {
-  internal class AdministratorMenuItem : HeuristicLab.MainForm.WindowsForms.MenuItem, IOptimizerUserInterfaceItemProvider {
-    public override string Name {
-      get { return "&Administrator"; }
-    }
-    public override IEnumerable<string> Structure {
-      get { return new string[] { "&Services", "&OKB" }; }
-    }
-    public override int Position {
-      get { return 4210; }
-    }
-
-    public override void Execute() {
-      MainFormManager.MainForm.ShowContent(OKBClient.Instance);
-    }
-  }
-}
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 5533)
+++ branches/OKB (trunk integration)/HeuristicLab.Clients.OKB/3.3/Authentication/AuthenticationClient.cs	(revision 5533)
@@ -0,0 +1,101 @@
+﻿#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.Clients.Common;
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.PluginInfrastructure;
+
+namespace HeuristicLab.Clients.OKB.Authentication {
+  [Item("AuthenticationClient", "OKB authentication client.")]
+  public sealed class AuthenticationClient : IContent {
+    private static AuthenticationClient instance;
+    public static AuthenticationClient Instance {
+      get {
+        if (instance == null) instance = new AuthenticationClient();
+        return instance;
+      }
+    }
+
+    #region Properties
+    private IEnumerable<User> users;
+    public IEnumerable<User> Users {
+      get { return users; }
+    }
+    #endregion
+
+    private AuthenticationClient() { }
+
+    #region Refresh
+    public void Refresh() {
+      OnRefreshing();
+
+      var call = new Func<Exception>(delegate() {
+        try {
+          users = CallAuthenticationService<List<User>>(s => s.GetUsers()).OrderBy(x => x.Name);
+          return null;
+        }
+        catch (Exception ex) {
+          return ex;
+        }
+      });
+      call.BeginInvoke(delegate(IAsyncResult result) {
+        Exception ex = call.EndInvoke(result);
+        if (ex != null) ErrorHandling.ShowErrorDialog("Refresh failed.", ex);
+        OnRefreshed();
+      }, null);
+    }
+    #endregion
+
+    #region Events
+    public event EventHandler Refreshing;
+    private void OnRefreshing() {
+      EventHandler handler = Refreshing;
+      if (handler != null) handler(this, EventArgs.Empty);
+    }
+    public event EventHandler Refreshed;
+    private void OnRefreshed() {
+      EventHandler handler = Refreshed;
+      if (handler != null) handler(this, EventArgs.Empty);
+    }
+    #endregion
+
+    #region Helpers
+    private T CallAuthenticationService<T>(Func<IAuthenticationService, T> call) {
+      AuthenticationServiceClient client = ClientFactory.CreateClient<AuthenticationServiceClient, IAuthenticationService>();
+      try {
+        return call(client);
+      }
+      finally {
+        try {
+          client.Close();
+        }
+        catch (Exception) {
+          client.Abort();
+        }
+      }
+    }
+    #endregion
+  }
+}
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 5504)
+++ branches/OKB (trunk integration)/HeuristicLab.Clients.OKB/3.3/HeuristicLab.Clients.OKB-3.3.csproj	(revision 5533)
@@ -99,316 +99,82 @@
   </ItemGroup>
   <ItemGroup>
+    <Compile Include="Administration\AdministrationClient.cs" />
+    <Compile Include="Administration\AdministratorMenuItem.cs" />
     <Compile Include="Administration\ServiceClient\AdministrationServiceClient.cs" />
-    <Compile Include="AdministratorMenuItem.cs" />
+    <Compile Include="Administration\ServiceClient\Algorithm.cs" />
+    <Compile Include="Administration\ServiceClient\AlgorithmClass.cs" />
+    <Compile Include="Administration\ServiceClient\INamedOKBItem.cs" />
+    <Compile Include="Administration\ServiceClient\IOKBItem.cs" />
+    <Compile Include="Administration\ServiceClient\NamedOKBItem.cs" />
+    <Compile Include="Administration\ServiceClient\OKBItem.cs" />
+    <Compile Include="Administration\ServiceClient\Platform.cs" />
+    <Compile Include="Administration\ServiceClient\Problem.cs" />
+    <Compile Include="Administration\ServiceClient\ProblemClass.cs" />
+    <Compile Include="Administration\Views\AdministratorView.cs">
+      <SubType>UserControl</SubType>
+    </Compile>
+    <Compile Include="Administration\Views\AdministratorView.Designer.cs">
+      <DependentUpon>AdministratorView.cs</DependentUpon>
+    </Compile>
+    <Compile Include="Administration\Views\AlgorithmClassCollectionView.cs">
+      <SubType>UserControl</SubType>
+    </Compile>
+    <Compile Include="Administration\Views\AlgorithmClassCollectionView.Designer.cs">
+      <DependentUpon>AlgorithmClassCollectionView.cs</DependentUpon>
+    </Compile>
+    <Compile Include="Administration\Views\AlgorithmCollectionView.cs">
+      <SubType>UserControl</SubType>
+    </Compile>
+    <Compile Include="Administration\Views\AlgorithmCollectionView.Designer.cs">
+      <DependentUpon>AlgorithmCollectionView.cs</DependentUpon>
+    </Compile>
+    <Compile Include="Administration\Views\AlgorithmView.cs">
+      <SubType>UserControl</SubType>
+    </Compile>
+    <Compile Include="Administration\Views\AlgorithmView.Designer.cs">
+      <DependentUpon>AlgorithmView.cs</DependentUpon>
+    </Compile>
+    <Compile Include="Administration\Views\NamedOKBItemView.cs">
+      <SubType>UserControl</SubType>
+    </Compile>
+    <Compile Include="Administration\Views\NamedOKBItemView.Designer.cs">
+      <DependentUpon>NamedOKBItemView.cs</DependentUpon>
+    </Compile>
+    <Compile Include="Administration\Views\OKBItemView.cs">
+      <SubType>UserControl</SubType>
+    </Compile>
+    <Compile Include="Administration\Views\OKBItemView.Designer.cs">
+      <DependentUpon>OKBItemView.cs</DependentUpon>
+    </Compile>
+    <Compile Include="Administration\Views\PlatformCollectionView.cs">
+      <SubType>UserControl</SubType>
+    </Compile>
+    <Compile Include="Administration\Views\PlatformCollectionView.Designer.cs">
+      <DependentUpon>PlatformCollectionView.cs</DependentUpon>
+    </Compile>
+    <Compile Include="Administration\Views\ProblemClassCollectionView.cs">
+      <SubType>UserControl</SubType>
+    </Compile>
+    <Compile Include="Administration\Views\ProblemClassCollectionView.Designer.cs">
+      <DependentUpon>ProblemClassCollectionView.cs</DependentUpon>
+    </Compile>
+    <Compile Include="Administration\Views\ProblemCollectionView.cs">
+      <SubType>UserControl</SubType>
+    </Compile>
+    <Compile Include="Administration\Views\ProblemCollectionView.Designer.cs">
+      <DependentUpon>ProblemCollectionView.cs</DependentUpon>
+    </Compile>
+    <Compile Include="Administration\Views\ProblemView.cs">
+      <SubType>UserControl</SubType>
+    </Compile>
+    <Compile Include="Administration\Views\ProblemView.Designer.cs">
+      <DependentUpon>ProblemView.cs</DependentUpon>
+    </Compile>
+    <Compile Include="Authentication\AuthenticationClient.cs" />
     <Compile Include="Authentication\ServiceClient\AuthenticationServiceClient.cs" />
-    <Compile Include="ItemWrapper.cs" />
-    <Compile Include="NamedItemWrapper.cs" />
-    <Compile Include="OKBRun.cs" />
-    <Compile Include="EmptyAlgorithm.cs" />
-    <Compile Include="OKBAlgorithm.cs" />
-    <Compile Include="MultiObjectiveOKBProblem.cs" />
-    <Compile Include="EmptyMultiObjectiveProblem.cs" />
-    <Compile Include="EmptyEvaluator.cs" />
-    <Compile Include="EmptyProblem.cs" />
-    <Compile Include="EmptyMultiObjectiveEvaluator.cs" />
-    <Compile Include="EmptySolutionCreator.cs" />
-    <Compile Include="EmptySingleObjectiveEvaluator.cs" />
-    <Compile Include="EmptySingleObjectiveProblem.cs" />
     <Compile Include="Query\ServiceClient\QueryServiceClient.cs" />
     <Compile Include="RunCreation\ServiceClient\RunCreationServiceClient.cs" />
-    <Compile Include="SingleObjectiveOKBProblem.cs" />
-    <Compile Include="OKBProblem.cs" />
-    <Compile Include="QueryMenuItem.cs" />
-    <Compile Include="OKBClient.cs" />
-    <Compile Include="OKBExperiment.cs" />
     <Compile Include="HeuristicLabClientsOKBPlugin.cs" />
     <Compile Include="Properties\AssemblyInfo.cs" />
-    <Compile Include="ServiceClients\Algorithm.cs">
-      <SubType>Code</SubType>
-    </Compile>
-    <Compile Include="ServiceClients\AlgorithmClass.cs">
-      <SubType>Code</SubType>
-    </Compile>
-    <Compile Include="ServiceClients\AuthenticationServiceClient.cs" />
-    <Compile Include="ServiceClients\AlgorithmData.cs" />
-    <Compile Include="ServiceClients\AlgorithmParameter.cs" />
-    <Compile Include="ServiceClients\CombinedFilter.cs" />
-    <Compile Include="ServiceClients\OKBServiceClients.cs" />
-    <Compile Include="ServiceClients\SetComparisonStringAvailableValuesFilter.cs" />
-    <Compile Include="ServiceClients\NameSetComparisonStringAvailableValuesFilter.cs" />
-    <Compile Include="ServiceClients\OrdinalComparisonDateTimeFilter.cs" />
-    <Compile Include="ServiceClients\OrdinalComparisonLongFilter.cs" />
-    <Compile Include="ServiceClients\SetComparisonStringFilter.cs" />
-    <Compile Include="ServiceClients\NameSetComparisonStringFilter.cs" />
-    <Compile Include="ServiceClients\NameOrdinalComparisonLongFilter.cs" />
-    <Compile Include="ServiceClients\NameOrdinalComparisonDoubleFilter.cs" />
-    <Compile Include="ServiceClients\NameEqualityComparisonByteArrayFilter.cs" />
-    <Compile Include="ServiceClients\NameEqualityComparisonBoolFilter.cs" />
-    <Compile Include="ServiceClients\Filter.cs" />
-    <Compile Include="ServiceClients\Run.cs" />
-    <Compile Include="ServiceClients\Experiment.cs" />
-    <Compile Include="ServiceClients\Result.cs" />
-    <Compile Include="ServiceClients\ProblemParameter.cs" />
-    <Compile Include="ServiceClients\ProblemData.cs" />
-    <Compile Include="ServiceClients\Problem.cs" />
-    <Compile Include="ServiceClients\ProblemClass.cs" />
-    <Compile Include="ServiceClients\DataType.cs" />
-    <Compile Include="ServiceClients\NamedOKBItem.cs" />
-    <Compile Include="ServiceClients\Platform.cs" />
-    <Compile Include="ServiceClients\INamedOKBItem.cs">
-      <SubType>Code</SubType>
-    </Compile>
-    <Compile Include="ServiceClients\IOKBItem.cs">
-      <SubType>Code</SubType>
-    </Compile>
-    <Compile Include="ServiceClients\OKBItem.cs">
-      <SubType>Code</SubType>
-    </Compile>
-    <Compile Include="Views\AdministratorView.cs">
-      <SubType>UserControl</SubType>
-    </Compile>
-    <Compile Include="Views\AdministratorView.Designer.cs">
-      <DependentUpon>AdministratorView.cs</DependentUpon>
-    </Compile>
-    <Compile Include="Views\AlgorithmClassCollectionView.cs">
-      <SubType>UserControl</SubType>
-    </Compile>
-    <Compile Include="Views\AlgorithmClassCollectionView.Designer.cs">
-      <DependentUpon>AlgorithmClassCollectionView.cs</DependentUpon>
-    </Compile>
-    <Compile Include="Views\AlgorithmCollectionView.cs">
-      <SubType>UserControl</SubType>
-    </Compile>
-    <Compile Include="Views\AlgorithmCollectionView.Designer.cs">
-      <DependentUpon>AlgorithmCollectionView.cs</DependentUpon>
-    </Compile>
-    <Compile Include="Views\AlgorithmView.cs">
-      <SubType>UserControl</SubType>
-    </Compile>
-    <Compile Include="Views\AlgorithmView.Designer.cs">
-      <DependentUpon>AlgorithmView.cs</DependentUpon>
-    </Compile>
-    <Compile Include="Views\AlgorithmDataView.cs">
-      <SubType>UserControl</SubType>
-    </Compile>
-    <Compile Include="Views\AlgorithmDataView.Designer.cs">
-      <DependentUpon>AlgorithmDataView.cs</DependentUpon>
-    </Compile>
-    <Compile Include="Views\AlgorithmParameterCollectionView.cs">
-      <SubType>UserControl</SubType>
-    </Compile>
-    <Compile Include="Views\AlgorithmParameterCollectionView.Designer.cs">
-      <DependentUpon>AlgorithmParameterCollectionView.cs</DependentUpon>
-    </Compile>
-    <Compile Include="Views\AlgorithmParameterView.cs">
-      <SubType>UserControl</SubType>
-    </Compile>
-    <Compile Include="Views\AlgorithmParameterView.Designer.cs">
-      <DependentUpon>AlgorithmParameterView.cs</DependentUpon>
-    </Compile>
-    <Compile Include="Views\OKBAlgorithmView.cs">
-      <SubType>UserControl</SubType>
-    </Compile>
-    <Compile Include="Views\OKBAlgorithmView.Designer.cs">
-      <DependentUpon>OKBAlgorithmView.cs</DependentUpon>
-    </Compile>
-    <Compile Include="Views\OKBProblemView.cs">
-      <SubType>UserControl</SubType>
-    </Compile>
-    <Compile Include="Views\OKBProblemView.Designer.cs">
-      <DependentUpon>OKBProblemView.cs</DependentUpon>
-    </Compile>
-    <Compile Include="Views\SetComparisonStringAvailableValuesFilterView.cs">
-      <SubType>UserControl</SubType>
-    </Compile>
-    <Compile Include="Views\SetComparisonStringAvailableValuesFilterView.Designer.cs">
-      <DependentUpon>SetComparisonStringAvailableValuesFilterView.cs</DependentUpon>
-    </Compile>
-    <Compile Include="Views\NameSetComparisonStringAvailableValuesFilterView.cs">
-      <SubType>UserControl</SubType>
-    </Compile>
-    <Compile Include="Views\NameSetComparisonStringAvailableValuesFilterView.Designer.cs">
-      <DependentUpon>NameSetComparisonStringAvailableValuesFilterView.cs</DependentUpon>
-    </Compile>
-    <Compile Include="Views\CombinedFilterView.cs">
-      <SubType>UserControl</SubType>
-    </Compile>
-    <Compile Include="Views\CombinedFilterView.Designer.cs">
-      <DependentUpon>CombinedFilterView.cs</DependentUpon>
-    </Compile>
-    <Compile Include="Views\NameSetComparisonStringFilterView.cs">
-      <SubType>UserControl</SubType>
-    </Compile>
-    <Compile Include="Views\NameSetComparisonStringFilterView.Designer.cs">
-      <DependentUpon>NameSetComparisonStringFilterView.cs</DependentUpon>
-    </Compile>
-    <Compile Include="Views\NameOrdinalComparisonLongFilterView.cs">
-      <SubType>UserControl</SubType>
-    </Compile>
-    <Compile Include="Views\NameOrdinalComparisonLongFilterView.Designer.cs">
-      <DependentUpon>NameOrdinalComparisonLongFilterView.cs</DependentUpon>
-    </Compile>
-    <Compile Include="Views\NameEqualityComparisonBoolFilterView.cs">
-      <SubType>UserControl</SubType>
-    </Compile>
-    <Compile Include="Views\NameEqualityComparisonBoolFilterView.Designer.cs">
-      <DependentUpon>NameEqualityComparisonBoolFilterView.cs</DependentUpon>
-    </Compile>
-    <Compile Include="Views\SetComparisonStringFilterView.cs">
-      <SubType>UserControl</SubType>
-    </Compile>
-    <Compile Include="Views\SetComparisonStringFilterView.Designer.cs">
-      <DependentUpon>SetComparisonStringFilterView.cs</DependentUpon>
-    </Compile>
-    <Compile Include="Views\SetComparisonFilterView.cs">
-      <SubType>UserControl</SubType>
-    </Compile>
-    <Compile Include="Views\SetComparisonFilterView.Designer.cs">
-      <DependentUpon>SetComparisonFilterView.cs</DependentUpon>
-    </Compile>
-    <Compile Include="Views\OrdinalComparisonLongFilterView.cs">
-      <SubType>UserControl</SubType>
-    </Compile>
-    <Compile Include="Views\OrdinalComparisonLongFilterView.Designer.cs">
-      <DependentUpon>OrdinalComparisonLongFilterView.cs</DependentUpon>
-    </Compile>
-    <Compile Include="Views\NameOrdinalComparisonDoubleFilterView.cs">
-      <SubType>UserControl</SubType>
-    </Compile>
-    <Compile Include="Views\NameOrdinalComparisonDoubleFilterView.Designer.cs">
-      <DependentUpon>NameOrdinalComparisonDoubleFilterView.cs</DependentUpon>
-    </Compile>
-    <Compile Include="Views\OrdinalComparisonFilterView.cs">
-      <SubType>UserControl</SubType>
-    </Compile>
-    <Compile Include="Views\OrdinalComparisonFilterView.Designer.cs">
-      <DependentUpon>OrdinalComparisonFilterView.cs</DependentUpon>
-    </Compile>
-    <Compile Include="Views\EqualityComparisonFilterView.cs">
-      <SubType>UserControl</SubType>
-    </Compile>
-    <Compile Include="Views\EqualityComparisonFilterView.Designer.cs">
-      <DependentUpon>EqualityComparisonFilterView.cs</DependentUpon>
-    </Compile>
-    <Compile Include="Views\FilterView.cs">
-      <SubType>UserControl</SubType>
-    </Compile>
-    <Compile Include="Views\FilterView.Designer.cs">
-      <DependentUpon>FilterView.cs</DependentUpon>
-    </Compile>
-    <Compile Include="Views\QueryView.cs">
-      <SubType>UserControl</SubType>
-    </Compile>
-    <Compile Include="Views\QueryView.Designer.cs">
-      <DependentUpon>QueryView.cs</DependentUpon>
-    </Compile>
-    <Compile Include="Views\RunView.cs">
-      <SubType>UserControl</SubType>
-    </Compile>
-    <Compile Include="Views\RunView.Designer.cs">
-      <DependentUpon>RunView.cs</DependentUpon>
-    </Compile>
-    <Compile Include="Views\ExperimentView.cs">
-      <SubType>UserControl</SubType>
-    </Compile>
-    <Compile Include="Views\ExperimentView.Designer.cs">
-      <DependentUpon>ExperimentView.cs</DependentUpon>
-    </Compile>
-    <Compile Include="Views\RunCollectionView.cs">
-      <SubType>UserControl</SubType>
-    </Compile>
-    <Compile Include="Views\RunCollectionView.Designer.cs">
-      <DependentUpon>RunCollectionView.cs</DependentUpon>
-    </Compile>
-    <Compile Include="Views\ExperimentCollectionView.cs">
-      <SubType>UserControl</SubType>
-    </Compile>
-    <Compile Include="Views\ExperimentCollectionView.Designer.cs">
-      <DependentUpon>ExperimentCollectionView.cs</DependentUpon>
-    </Compile>
-    <Compile Include="Views\ProblemParameterView.cs">
-      <SubType>UserControl</SubType>
-    </Compile>
-    <Compile Include="Views\ProblemParameterView.Designer.cs">
-      <DependentUpon>ProblemParameterView.cs</DependentUpon>
-    </Compile>
-    <Compile Include="Views\ResultView.cs">
-      <SubType>UserControl</SubType>
-    </Compile>
-    <Compile Include="Views\ResultView.Designer.cs">
-      <DependentUpon>ResultView.cs</DependentUpon>
-    </Compile>
-    <Compile Include="Views\ResultCollectionView.cs">
-      <SubType>UserControl</SubType>
-    </Compile>
-    <Compile Include="Views\ResultCollectionView.Designer.cs">
-      <DependentUpon>ResultCollectionView.cs</DependentUpon>
-    </Compile>
-    <Compile Include="Views\ProblemParameterCollectionView.cs">
-      <SubType>UserControl</SubType>
-    </Compile>
-    <Compile Include="Views\ProblemParameterCollectionView.Designer.cs">
-      <DependentUpon>ProblemParameterCollectionView.cs</DependentUpon>
-    </Compile>
-    <Compile Include="Views\OKBExperimentView.cs">
-      <SubType>UserControl</SubType>
-    </Compile>
-    <Compile Include="Views\OKBExperimentView.Designer.cs">
-      <DependentUpon>OKBExperimentView.cs</DependentUpon>
-    </Compile>
-    <Compile Include="Views\ProblemDataView.cs">
-      <SubType>UserControl</SubType>
-    </Compile>
-    <Compile Include="Views\ProblemDataView.Designer.cs">
-      <DependentUpon>ProblemDataView.cs</DependentUpon>
-    </Compile>
-    <Compile Include="Views\ProblemView.cs">
-      <SubType>UserControl</SubType>
-    </Compile>
-    <Compile Include="Views\ProblemView.Designer.cs">
-      <DependentUpon>ProblemView.cs</DependentUpon>
-    </Compile>
-    <Compile Include="Views\ProblemCollectionView.cs">
-      <SubType>UserControl</SubType>
-    </Compile>
-    <Compile Include="Views\ProblemCollectionView.Designer.cs">
-      <DependentUpon>ProblemCollectionView.cs</DependentUpon>
-    </Compile>
-    <Compile Include="Views\ProblemClassCollectionView.cs">
-      <SubType>UserControl</SubType>
-    </Compile>
-    <Compile Include="Views\ProblemClassCollectionView.Designer.cs">
-      <DependentUpon>ProblemClassCollectionView.cs</DependentUpon>
-    </Compile>
-    <Compile Include="Views\DataTypeView.cs">
-      <SubType>UserControl</SubType>
-    </Compile>
-    <Compile Include="Views\DataTypeView.Designer.cs">
-      <DependentUpon>DataTypeView.cs</DependentUpon>
-    </Compile>
-    <Compile Include="Views\DataTypeCollectionView.cs">
-      <SubType>UserControl</SubType>
-    </Compile>
-    <Compile Include="Views\DataTypeCollectionView.Designer.cs">
-      <DependentUpon>DataTypeCollectionView.cs</DependentUpon>
-    </Compile>
-    <Compile Include="Views\PlatformCollectionView.cs">
-      <SubType>UserControl</SubType>
-    </Compile>
-    <Compile Include="Views\PlatformCollectionView.Designer.cs">
-      <DependentUpon>PlatformCollectionView.cs</DependentUpon>
-    </Compile>
-    <Compile Include="Views\OKBItemView.cs">
-      <SubType>UserControl</SubType>
-    </Compile>
-    <Compile Include="Views\OKBItemView.Designer.cs">
-      <DependentUpon>OKBItemView.cs</DependentUpon>
-    </Compile>
-    <Compile Include="Views\NamedOKBItemView.cs">
-      <SubType>UserControl</SubType>
-    </Compile>
-    <Compile Include="Views\NamedOKBItemView.Designer.cs">
-      <DependentUpon>NamedOKBItemView.cs</DependentUpon>
-    </Compile>
     <None Include="app.config" />
     <None Include="Authentication\ServiceClient\GenerateServiceClient.cmd" />
@@ -417,5 +183,4 @@
     <None Include="Query\ServiceClient\GenerateServiceClient.cmd" />
     <None Include="RunCreation\ServiceClient\GenerateServiceClient.cmd" />
-    <None Include="ServiceClients\GenerateServiceClients.cmd" />
     <None Include="UpdateLocalInstallation.cmd" />
   </ItemGroup>
Index: branches/OKB (trunk integration)/HeuristicLab.Clients.OKB/3.3/OKBClient.cs
===================================================================
--- branches/OKB (trunk integration)/HeuristicLab.Clients.OKB/3.3/OKBClient.cs	(revision 5504)
+++ 	(revision )
@@ -1,812 +1,0 @@
-﻿#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.IO;
-using System.Linq;
-using HeuristicLab.Clients.Common;
-using HeuristicLab.Collections;
-using HeuristicLab.Common;
-using HeuristicLab.Core;
-using HeuristicLab.Data;
-using HeuristicLab.Optimization;
-using HeuristicLab.Persistence.Default.Xml;
-using HeuristicLab.PluginInfrastructure;
-
-namespace HeuristicLab.Clients.OKB {
-  [Item("OKBClient", "Client for accessing the OKB.")]
-  public sealed class OKBClient : IContent {
-    private static OKBClient instance;
-    public static OKBClient Instance {
-      get {
-        if (instance == null) instance = new OKBClient();
-        return instance;
-      }
-    }
-
-    #region Properties
-    private ItemCollection<Platform> platforms;
-    public ItemCollection<Platform> Platforms {
-      get { return platforms; }
-    }
-    private ItemCollection<DataType> dataTypes;
-    public ItemCollection<DataType> DataTypes {
-      get { return dataTypes; }
-    }
-    private IEnumerable<User> users;
-    public IEnumerable<User> Users {
-      get { return users; }
-    }
-    private ItemCollection<AlgorithmClass> algorithmClasses;
-    public ItemCollection<AlgorithmClass> AlgorithmClasses {
-      get { return algorithmClasses; }
-    }
-    private ItemCollection<Algorithm> algorithms;
-    public ItemCollection<Algorithm> Algorithms {
-      get { return algorithms; }
-    }
-    private ItemCollection<ProblemClass> problemClasses;
-    public ItemCollection<ProblemClass> ProblemClasses {
-      get { return problemClasses; }
-    }
-    private ItemCollection<Problem> problems;
-    public ItemCollection<Problem> Problems {
-      get { return problems; }
-    }
-    #endregion
-
-    private OKBClient() {
-      platforms = new ItemCollection<Platform>();
-      platforms.ItemsRemoved += new CollectionItemsChangedEventHandler<Platform>(platforms_ItemsRemoved);
-      dataTypes = new ItemCollection<DataType>();
-      dataTypes.ItemsRemoved += new CollectionItemsChangedEventHandler<DataType>(dataTypes_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);
-    }
-
-    #region Refresh
-    public void Refresh() {
-      OnRefreshing();
-
-      platforms.Clear();
-      dataTypes.Clear();
-      algorithmClasses.Clear();
-      algorithms.Clear();
-      problemClasses.Clear();
-      problems.Clear();
-
-      var call = new Func<Exception>(delegate() {
-        try {
-          platforms.AddRange(CallAdministrationService<List<Platform>>(s => s.GetPlatforms()).OrderBy(x => x.Name));
-          dataTypes.AddRange(CallAdministrationService<List<DataType>>(s => s.GetDataTypes()).OrderBy(x => x.Name));
-          users = CallAuthenticationService<List<User>>(s => s.GetUsers()).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;
-        }
-        catch (Exception ex) {
-          return ex;
-        }
-      });
-      call.BeginInvoke(delegate(IAsyncResult result) {
-        Exception ex = call.EndInvoke(result);
-        if (ex != null) ErrorHandling.ShowErrorDialog("Refresh failed.", ex);
-        OnRefreshed();
-      }, null);
-    }
-    #endregion
-
-    #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 DataType)
-            item.Id = CallAdministrationService<long>(s => s.AddDataType((DataType)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 AlgorithmParameter)
-            item.Id = CallAdministrationService<long>(s => s.AddAlgorithmParameter((AlgorithmParameter)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 ProblemParameter)
-            item.Id = CallAdministrationService<long>(s => s.AddProblemParameter((ProblemParameter)item));
-          else if (item is Result)
-            item.Id = CallAdministrationService<long>(s => s.AddResult((Result)item));
-          else if (item is Experiment)
-            item.Id = CallAdministrationService<long>(s => s.AddExperiment((Experiment)item));
-          else if (item is Run)
-            item.Id = CallAdministrationService<long>(s => s.AddRun((Run)item));
-        } else {
-          if (item is Platform)
-            CallAdministrationService(s => s.UpdatePlatform((Platform)item));
-          else if (item is DataType)
-            CallAdministrationService(s => s.UpdateDataType((DataType)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 AlgorithmParameter)
-            CallAdministrationService(s => s.UpdateAlgorithmParameter((AlgorithmParameter)item));
-          else if (item is ProblemClass)
-            CallAdministrationService(s => s.UpdateProblemClass((ProblemClass)item));
-          else if (item is Problem)
-            CallAdministrationService(s => s.UpdateProblem((Problem)item));
-          else if (item is ProblemParameter)
-            CallAdministrationService(s => s.UpdateProblemParameter((ProblemParameter)item));
-          else if (item is Result)
-            CallAdministrationService(s => s.UpdateResult((Result)item));
-          else if (item is Experiment)
-            item.Id = CallAdministrationService<long>(s => s.AddExperiment((Experiment)item));
-          else if (item is Run)
-            item.Id = CallAdministrationService<long>(s => s.AddRun((Run)item));
-        }
-        return true;
-      }
-      catch (Exception ex) {
-        ErrorHandling.ShowErrorDialog("Store failed.", ex);
-        return false;
-      }
-    }
-    #endregion
-
-    #region DataType Methods
-    public DataType ConvertToDataType(Type type) {
-      DataType dataType = DataTypes.FirstOrDefault(x => x.TypeName == type.AssemblyQualifiedName);
-      if (dataType == null) {
-        dataType = new DataType();
-        dataType.Name = type.Name;
-        dataType.TypeName = type.AssemblyQualifiedName;
-        dataType.PlatformId = Platforms.FirstOrDefault(x => x.Name == "HeuristicLab 3.3").Id;
-
-        if (typeof(BoolValue).IsAssignableFrom(type))
-          dataType.SqlName = "bit";
-        else if (typeof(IntValue).IsAssignableFrom(type))
-          dataType.SqlName = "bigint";
-        else if (typeof(DoubleValue).IsAssignableFrom(type))
-          dataType.SqlName = "float";
-        else if (typeof(StringValue).IsAssignableFrom(type) || typeof(IStringConvertibleValue).IsAssignableFrom(type))
-          dataType.SqlName = "nvarchar";
-        else
-          dataType.SqlName = "varbinary";
-
-        dataType.Store();
-        DataTypes.Add(dataType);
-      }
-      return dataType;
-    }
-    #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 AlgorithmData GetAlgorithmData(long algorithmId) {
-      try {
-        return CallAdministrationService<AlgorithmData>(s => s.GetAlgorithmData(algorithmId));
-      }
-      catch (Exception ex) {
-        ErrorHandling.ShowErrorDialog("Refresh algorithm data failed.", ex);
-        return null;
-      }
-    }
-    public bool UpdateAlgorithmData(AlgorithmData algorithmData) {
-      try {
-        CallAdministrationService(s => s.UpdateAlgorithmData(algorithmData));
-        return true;
-      }
-      catch (Exception ex) {
-        ErrorHandling.ShowErrorDialog("Update algorithm data failed.", ex);
-        return false;
-      }
-    }
-    #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 ProblemData GetProblemData(long problemId) {
-      try {
-        return CallAdministrationService<ProblemData>(s => s.GetProblemData(problemId));
-      }
-      catch (Exception ex) {
-        ErrorHandling.ShowErrorDialog("Refresh problem data failed.", ex);
-        return null;
-      }
-    }
-    public bool UpdateProblemData(ProblemData problemData) {
-      try {
-        CallAdministrationService(s => s.UpdateProblemData(problemData));
-        return true;
-      }
-      catch (Exception ex) {
-        ErrorHandling.ShowErrorDialog("Update problem data failed.", ex);
-        return false;
-      }
-    }
-    #endregion
-
-    #region AlgorithmParameter Methods
-    public AlgorithmParameter GetAlgorithmParameter(long id) {
-      try {
-        return CallAdministrationService<AlgorithmParameter>(s => s.GetAlgorithmParameter(id));
-      }
-      catch (Exception ex) {
-        ErrorHandling.ShowErrorDialog("Refresh algorithm parameter failed.", ex);
-        return null;
-      }
-    }
-    public ItemCollection<AlgorithmParameter> GetAlgorithmParameters(long algorithmId) {
-      try {
-        ItemCollection<AlgorithmParameter> parameters = new ItemCollection<AlgorithmParameter>();
-        parameters.AddRange(CallAdministrationService<List<AlgorithmParameter>>(s => s.GetAlgorithmParameters(algorithmId)).OrderBy(x => x.Name));
-        return parameters;
-      }
-      catch (Exception ex) {
-        ErrorHandling.ShowErrorDialog("Refresh algorithm parameters failed.", ex);
-        return null;
-      }
-    }
-    #endregion
-
-    #region ProblemParameter Methods
-    public ProblemParameter GetProblemParameter(long id) {
-      try {
-        return CallAdministrationService<ProblemParameter>(s => s.GetProblemParameter(id));
-      }
-      catch (Exception ex) {
-        ErrorHandling.ShowErrorDialog("Refresh problem parameter failed.", ex);
-        return null;
-      }
-    }
-    public ItemCollection<ProblemParameter> GetProblemParameters(long problemId) {
-      try {
-        ItemCollection<ProblemParameter> parameters = new ItemCollection<ProblemParameter>();
-        parameters.AddRange(CallAdministrationService<List<ProblemParameter>>(s => s.GetProblemParameters(problemId)).OrderBy(x => x.Name));
-        return parameters;
-      }
-      catch (Exception ex) {
-        ErrorHandling.ShowErrorDialog("Refresh problem parameters failed.", ex);
-        return null;
-      }
-    }
-    #endregion
-
-    #region Result Methods
-    public Result GetResult(long id) {
-      try {
-        return CallAdministrationService<Result>(s => s.GetResult(id));
-      }
-      catch (Exception ex) {
-        ErrorHandling.ShowErrorDialog("Refresh result failed.", ex);
-        return null;
-      }
-    }
-    public ItemCollection<Result> GetResults(long algorithmId) {
-      try {
-        ItemCollection<Result> results = new ItemCollection<Result>();
-        results.AddRange(CallAdministrationService<List<Result>>(s => s.GetResults(algorithmId)).OrderBy(x => x.Name));
-        return results;
-      }
-      catch (Exception ex) {
-        ErrorHandling.ShowErrorDialog("Refresh results failed.", ex);
-        return null;
-      }
-    }
-    #endregion
-
-    #region Experiment Methods
-    public Experiment GetExperiment(long id) {
-      try {
-        return CallAdministrationService<Experiment>(s => s.GetExperiment(id));
-      }
-      catch (Exception ex) {
-        ErrorHandling.ShowErrorDialog("Refresh experiment failed.", ex);
-        return null;
-      }
-    }
-    public ItemCollection<Experiment> GetExperiments(long algorithmId, long problemId) {
-      try {
-        ItemCollection<Experiment> experiments = new ItemCollection<Experiment>();
-        experiments.AddRange(CallAdministrationService<List<Experiment>>(s => s.GetExperiments(algorithmId, problemId)));
-        experiments.ItemsRemoved += new CollectionItemsChangedEventHandler<Experiment>(experiments_ItemsRemoved);
-        return experiments;
-      }
-      catch (Exception ex) {
-        ErrorHandling.ShowErrorDialog("Refresh experiments failed.", ex);
-        return null;
-      }
-    }
-    #endregion
-
-    #region Run Methods
-    public ItemCollection<Run> GetRuns(long experimentId) {
-      try {
-        ItemCollection<Run> runs = new ItemCollection<Run>();
-        runs.AddRange(CallAdministrationService<List<Run>>(s => s.GetRuns(experimentId)).OrderByDescending(x => x.CreatedDate));
-        runs.ItemsRemoved += new CollectionItemsChangedEventHandler<Run>(runs_ItemsRemoved);
-        return runs;
-      }
-      catch (Exception ex) {
-        ErrorHandling.ShowErrorDialog("Refresh runs failed.", ex);
-        return null;
-      }
-    }
-    public bool AddRun(long algorithmId, long problemId, IAlgorithm algorithm) {
-      try {
-        IProblem problem = algorithm.Problem;
-
-        ItemCollection<AlgorithmParameter> algorithmParameters = GetAlgorithmParameters(algorithmId);
-        List<AlgorithmParameterValue> algorithmParameterValues = CollectAlgorithmParameterValues(algorithmId, algorithmParameters, algorithm, "");
-        ItemCollection<ProblemParameter> problemParameters = GetProblemParameters(problemId);
-        List<ProblemParameterValue> problemParameterValues = CollectProblemParamterValues(problemId, problemParameters, problem, "");
-        ItemCollection<Result> results = GetResults(algorithmId);
-        List<ResultValue> resultValues = CollectResultValues(algorithmId, results, algorithm);
-
-        Experiment exp = new Experiment();
-        exp.AlgorithmId = algorithmId;
-        exp.ProblemId = problemId;
-        exp.AlgorithmParameterValues = algorithmParameterValues;
-        exp.ProblemParameterValues = problemParameterValues;
-        exp.Store();
-
-        Run r = new Run();
-        r.ExperimentId = exp.Id;
-        r.ClientId = Guid.NewGuid();
-        r.CreatedDate = DateTime.Now;
-        r.RandomSeed = ((IntValue)((IValueParameter)algorithm.Parameters["Seed"]).Value).Value;
-        r.ResultValues = resultValues;
-        r.Store();
-
-        return true;
-      }
-      catch (Exception ex) {
-        ErrorHandling.ShowErrorDialog("Store run failed.", ex);
-        return false;
-      }
-    }
-
-    private List<AlgorithmParameterValue> CollectAlgorithmParameterValues(long algorithmId, ItemCollection<AlgorithmParameter> parameters, IParameterizedItem item, string prefix) {
-      List<AlgorithmParameterValue> values = new List<AlgorithmParameterValue>();
-      foreach (IValueParameter param in item.Parameters.OfType<IValueParameter>()) {
-        if (param.GetsCollected && (param.Value != null) && (param.Name != "Seed")) {
-          AlgorithmParameter p = parameters.FirstOrDefault(x => x.Name == prefix + param.Name);
-          if (p == null) {
-            p = new AlgorithmParameter();
-            p.Name = prefix + param.Name;
-            p.Alias = prefix + param.Name;
-            p.Description = param.Description;
-            p.AlgorithmId = algorithmId;
-            p.DataTypeId = ConvertToDataType(param.DataType).Id;
-            p.Store();
-            parameters.Add(p);
-          }
-          AlgorithmParameterValue value = CreateAlgorithmParameterValue(param.Value);
-          value.AlgorithmParameterId = p.Id;
-          value.DataTypeId = ConvertToDataType(param.Value.GetType()).Id;
-          values.Add(value);
-        }
-
-        if (param.Value is IParameterizedItem)
-          values.AddRange(CollectAlgorithmParameterValues(algorithmId, parameters, (IParameterizedItem)param.Value, (string.IsNullOrEmpty(prefix) ? param.Name : prefix + param.Name) + "."));
-      }
-      return values;
-    }
-    private AlgorithmParameterValue CreateAlgorithmParameterValue(IItem item) {
-      if (item is BoolValue) {
-        AlgorithmParameterBoolValue value = new AlgorithmParameterBoolValue();
-        value.Value = ((BoolValue)item).Value;
-        return value;
-      } else if (item is DoubleValue) {
-        AlgorithmParameterFloatValue value = new AlgorithmParameterFloatValue();
-        value.Value = ((DoubleValue)item).Value;
-        return value;
-      } else if (item is IntValue) {
-        AlgorithmParameterIntValue value = new AlgorithmParameterIntValue();
-        value.Value = ((IntValue)item).Value;
-        return value;
-      } else if (item is StringValue) {
-        AlgorithmParameterStringValue value = new AlgorithmParameterStringValue();
-        value.Value = ((StringValue)item).Value;
-        return value;
-      } else {
-        AlgorithmParameterBlobValue value = new AlgorithmParameterBlobValue();
-        try {
-          using (MemoryStream stream = new MemoryStream()) {
-            XmlGenerator.Serialize(item, stream);
-            stream.Close();
-            value.Value = stream.ToArray();
-          }
-        }
-        catch (Exception ex) {
-          ErrorHandling.ShowErrorDialog(ex);
-        }
-        return value;
-      }
-    }
-    private List<ProblemParameterValue> CollectProblemParamterValues(long problemId, ItemCollection<ProblemParameter> parameters, IParameterizedItem item, string prefix) {
-      List<ProblemParameterValue> values = new List<ProblemParameterValue>();
-      foreach (IValueParameter param in item.Parameters.OfType<IValueParameter>()) {
-        if (param.GetsCollected && (param.Value != null)) {
-          ProblemParameter p = parameters.FirstOrDefault(x => x.Name == prefix + param.Name);
-          if (p == null) {
-            p = new ProblemParameter();
-            p.Name = prefix + param.Name;
-            p.Alias = prefix + param.Name;
-            p.Description = param.Description;
-            p.ProblemId = problemId;
-            p.DataTypeId = ConvertToDataType(param.DataType).Id;
-            p.Store();
-            parameters.Add(p);
-          }
-          ProblemParameterValue value = CreateProblemParameterValue(param.Value);
-          value.ProblemParameterId = p.Id;
-          value.DataTypeId = ConvertToDataType(param.Value.GetType()).Id;
-          values.Add(value);
-        }
-
-        if (param.Value is IParameterizedItem)
-          values.AddRange(CollectProblemParamterValues(problemId, parameters, (IParameterizedItem)param.Value, (string.IsNullOrEmpty(prefix) ? param.Name : prefix + param.Name) + "."));
-      }
-      return values;
-    }
-    private ProblemParameterValue CreateProblemParameterValue(IItem item) {
-      if (item is BoolValue) {
-        ProblemParameterBoolValue value = new ProblemParameterBoolValue();
-        value.Value = ((BoolValue)item).Value;
-        return value;
-      } else if (item is DoubleValue) {
-        ProblemParameterFloatValue value = new ProblemParameterFloatValue();
-        value.Value = ((DoubleValue)item).Value;
-        return value;
-      } else if (item is IntValue) {
-        ProblemParameterIntValue value = new ProblemParameterIntValue();
-        value.Value = ((IntValue)item).Value;
-        return value;
-      } else if (item is StringValue) {
-        ProblemParameterStringValue value = new ProblemParameterStringValue();
-        value.Value = ((StringValue)item).Value;
-        return value;
-      } else {
-        ProblemParameterBlobValue value = new ProblemParameterBlobValue();
-        try {
-          using (MemoryStream stream = new MemoryStream()) {
-            XmlGenerator.Serialize(item, stream);
-            stream.Close();
-            value.Value = stream.ToArray();
-          }
-        }
-        catch (Exception ex) {
-          ErrorHandling.ShowErrorDialog(ex);
-        }
-        return value;
-      }
-    }
-    private List<ResultValue> CollectResultValues(long algorithmId, ItemCollection<Result> results, IAlgorithm algorithm) {
-      List<ResultValue> values = new List<ResultValue>();
-      foreach (IResult result in algorithm.Results) {
-        if (result.Value != null) {
-          Result r = results.FirstOrDefault(x => x.Name == result.Name);
-          if (r == null) {
-            r = new Result();
-            r.Name = result.Name;
-            r.Alias = result.Name;
-            r.Description = result.Description;
-            r.AlgorithmId = algorithmId;
-            r.DataTypeId = ConvertToDataType(result.DataType).Id;
-            r.Store();
-            results.Add(r);
-          }
-          ResultValue value = CreateResultValue(result.Value);
-          value.ResultId = r.Id;
-          value.DataTypeId = ConvertToDataType(result.Value.GetType()).Id;
-          values.Add(value);
-        }
-      }
-      return values;
-    }
-    private ResultValue CreateResultValue(IItem item) {
-      if (item is BoolValue) {
-        ResultBoolValue value = new ResultBoolValue();
-        value.Value = ((BoolValue)item).Value;
-        return value;
-      } else if (item is DoubleValue) {
-        ResultFloatValue value = new ResultFloatValue();
-        value.Value = ((DoubleValue)item).Value;
-        return value;
-      } else if (item is IntValue) {
-        ResultIntValue value = new ResultIntValue();
-        value.Value = ((IntValue)item).Value;
-        return value;
-      } else if (item is StringValue) {
-        ResultStringValue value = new ResultStringValue();
-        value.Value = ((StringValue)item).Value;
-        return value;
-      } else {
-        ResultBlobValue value = new ResultBlobValue();
-        try {
-          using (MemoryStream stream = new MemoryStream()) {
-            XmlGenerator.Serialize(item, stream);
-            stream.Close();
-            value.Value = stream.ToArray();
-          }
-        }
-        catch (Exception ex) {
-          ErrorHandling.ShowErrorDialog(ex);
-        }
-        return value;
-      }
-    }
-    #endregion
-
-    #region Query Methods
-    private IEnumerable<Filter> filters;
-    public IEnumerable<Filter> GetFilters(bool refresh) {
-      if (refresh || (filters == null)) {
-        try {
-          filters = CallQueryService<List<Filter>>(s => s.GetFilters());
-        }
-        catch (Exception ex) {
-          ErrorHandling.ShowErrorDialog("Get filters failed.", ex);
-          return Enumerable.Empty<Filter>();
-        }
-      }
-      return filters;
-    }
-    public IEnumerable<Filter> GetFilters() {
-      return GetFilters(false);
-    }
-    public long GetNumberOfQueryResults(Filter filter) {
-      try {
-        return CallQueryService<long>(x => x.GetNumberOfQueryResults(filter));
-      }
-      catch (Exception ex) {
-        ErrorHandling.ShowErrorDialog("Get number of query results failed.", ex);
-        return -1;
-      }
-    }
-    public IEnumerable<long> GetQueryResultIds(Filter filter) {
-      try {
-        return CallQueryService<IEnumerable<long>>(x => x.GetQueryResultIds(filter));
-      }
-      catch (Exception ex) {
-        ErrorHandling.ShowErrorDialog("Get query result ids failed.", ex);
-        return Enumerable.Empty<long>();
-      }
-    }
-    public IEnumerable<QueryResult> GetQueryResults(IEnumerable<long> ids) {
-      try {
-        return CallQueryService<IEnumerable<QueryResult>>(s => s.GetQueryResults(ids.ToList()));
-      }
-      catch (Exception ex) {
-        ErrorHandling.ShowErrorDialog("Get query results failed.", ex);
-        return null;
-      }
-    }
-    #endregion
-
-    #region Events
-    public event EventHandler Refreshing;
-    private void OnRefreshing() {
-      EventHandler handler = Refreshing;
-      if (handler != null) handler(this, EventArgs.Empty);
-    }
-    public event EventHandler Refreshed;
-    private void OnRefreshed() {
-      EventHandler 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 dataTypes_ItemsRemoved(object sender, CollectionItemsChangedEventArgs<DataType> e) {
-      try {
-        foreach (DataType d in e.Items)
-          CallAdministrationService(s => s.DeleteDataType(d.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);
-      }
-    }
-    private void experiments_ItemsRemoved(object sender, CollectionItemsChangedEventArgs<Experiment> e) {
-      try {
-        foreach (Experiment exp in e.Items)
-          CallAdministrationService(s => s.DeleteExperiment(exp.Id));
-      }
-      catch (Exception ex) {
-        ErrorHandling.ShowErrorDialog("Delete failed.", ex);
-      }
-    }
-    private void runs_ItemsRemoved(object sender, CollectionItemsChangedEventArgs<Run> e) {
-      try {
-        foreach (Run r in e.Items)
-          CallAdministrationService(s => s.DeleteRun(r.Id));
-      }
-      catch (Exception ex) {
-        ErrorHandling.ShowErrorDialog("Delete failed.", ex);
-      }
-    }
-    #endregion
-
-    #region Helpers
-    private void CallAdministrationService(Action<IAdministrationService> call) {
-      AdministrationServiceClient client = ClientFactory.CreateClient<AdministrationServiceClient, IAdministrationService>();
-      try {
-        call(client);
-      }
-      finally {
-        try {
-          client.Close();
-        }
-        catch (Exception) {
-          client.Abort();
-        }
-      }
-    }
-    private T CallAdministrationService<T>(Func<IAdministrationService, T> call) {
-      AdministrationServiceClient client = ClientFactory.CreateClient<AdministrationServiceClient, IAdministrationService>();
-      try {
-        return call(client);
-      }
-      finally {
-        try {
-          client.Close();
-        }
-        catch (Exception) {
-          client.Abort();
-        }
-      }
-    }
-    private void CallQueryService(Action<IQueryService> call) {
-      QueryServiceClient client = ClientFactory.CreateClient<QueryServiceClient, IQueryService>();
-      try {
-        call(client);
-      }
-      finally {
-        try {
-          client.Close();
-        }
-        catch (Exception) {
-          client.Abort();
-        }
-      }
-    }
-    private T CallQueryService<T>(Func<IQueryService, T> call) {
-      QueryServiceClient client = ClientFactory.CreateClient<QueryServiceClient, IQueryService>();
-      try {
-        return call(client);
-      }
-      finally {
-        try {
-          client.Close();
-        }
-        catch (Exception) {
-          client.Abort();
-        }
-      }
-    }
-    private T CallAuthenticationService<T>(Func<IAuthenticationService, T> call) {
-      AuthenticationServiceClient client = ClientFactory.CreateClient<AuthenticationServiceClient, IAuthenticationService>();
-      try {
-        return call(client);
-      }
-      finally {
-        try {
-          client.Close();
-        }
-        catch (Exception) {
-          client.Abort();
-        }
-      }
-    }
-    #endregion
-  }
-}
Index: branches/OKB (trunk integration)/HeuristicLab.Clients.OKB/3.3/Query/OKBClient.cs
===================================================================
--- branches/OKB (trunk integration)/HeuristicLab.Clients.OKB/3.3/Query/OKBClient.cs	(revision 5533)
+++ branches/OKB (trunk integration)/HeuristicLab.Clients.OKB/3.3/Query/OKBClient.cs	(revision 5533)
@@ -0,0 +1,812 @@
+﻿#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.IO;
+using System.Linq;
+using HeuristicLab.Clients.Common;
+using HeuristicLab.Collections;
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Data;
+using HeuristicLab.Optimization;
+using HeuristicLab.Persistence.Default.Xml;
+using HeuristicLab.PluginInfrastructure;
+
+namespace HeuristicLab.Clients.OKB {
+  [Item("OKBClient", "Client for accessing the OKB.")]
+  public sealed class OKBClient : IContent {
+    private static OKBClient instance;
+    public static OKBClient Instance {
+      get {
+        if (instance == null) instance = new OKBClient();
+        return instance;
+      }
+    }
+
+    #region Properties
+    private ItemCollection<Platform> platforms;
+    public ItemCollection<Platform> Platforms {
+      get { return platforms; }
+    }
+    private ItemCollection<DataType> dataTypes;
+    public ItemCollection<DataType> DataTypes {
+      get { return dataTypes; }
+    }
+    private IEnumerable<User> users;
+    public IEnumerable<User> Users {
+      get { return users; }
+    }
+    private ItemCollection<AlgorithmClass> algorithmClasses;
+    public ItemCollection<AlgorithmClass> AlgorithmClasses {
+      get { return algorithmClasses; }
+    }
+    private ItemCollection<Algorithm> algorithms;
+    public ItemCollection<Algorithm> Algorithms {
+      get { return algorithms; }
+    }
+    private ItemCollection<ProblemClass> problemClasses;
+    public ItemCollection<ProblemClass> ProblemClasses {
+      get { return problemClasses; }
+    }
+    private ItemCollection<Problem> problems;
+    public ItemCollection<Problem> Problems {
+      get { return problems; }
+    }
+    #endregion
+
+    private OKBClient() {
+      platforms = new ItemCollection<Platform>();
+      platforms.ItemsRemoved += new CollectionItemsChangedEventHandler<Platform>(platforms_ItemsRemoved);
+      dataTypes = new ItemCollection<DataType>();
+      dataTypes.ItemsRemoved += new CollectionItemsChangedEventHandler<DataType>(dataTypes_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);
+    }
+
+    #region Refresh
+    public void Refresh() {
+      OnRefreshing();
+
+      platforms.Clear();
+      dataTypes.Clear();
+      algorithmClasses.Clear();
+      algorithms.Clear();
+      problemClasses.Clear();
+      problems.Clear();
+
+      var call = new Func<Exception>(delegate() {
+        try {
+          platforms.AddRange(CallAdministrationService<List<Platform>>(s => s.GetPlatforms()).OrderBy(x => x.Name));
+          dataTypes.AddRange(CallAdministrationService<List<DataType>>(s => s.GetDataTypes()).OrderBy(x => x.Name));
+          users = CallAuthenticationService<List<User>>(s => s.GetUsers()).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;
+        }
+        catch (Exception ex) {
+          return ex;
+        }
+      });
+      call.BeginInvoke(delegate(IAsyncResult result) {
+        Exception ex = call.EndInvoke(result);
+        if (ex != null) ErrorHandling.ShowErrorDialog("Refresh failed.", ex);
+        OnRefreshed();
+      }, null);
+    }
+    #endregion
+
+    #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 DataType)
+            item.Id = CallAdministrationService<long>(s => s.AddDataType((DataType)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 AlgorithmParameter)
+            item.Id = CallAdministrationService<long>(s => s.AddAlgorithmParameter((AlgorithmParameter)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 ProblemParameter)
+            item.Id = CallAdministrationService<long>(s => s.AddProblemParameter((ProblemParameter)item));
+          else if (item is Result)
+            item.Id = CallAdministrationService<long>(s => s.AddResult((Result)item));
+          else if (item is Experiment)
+            item.Id = CallAdministrationService<long>(s => s.AddExperiment((Experiment)item));
+          else if (item is Run)
+            item.Id = CallAdministrationService<long>(s => s.AddRun((Run)item));
+        } else {
+          if (item is Platform)
+            CallAdministrationService(s => s.UpdatePlatform((Platform)item));
+          else if (item is DataType)
+            CallAdministrationService(s => s.UpdateDataType((DataType)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 AlgorithmParameter)
+            CallAdministrationService(s => s.UpdateAlgorithmParameter((AlgorithmParameter)item));
+          else if (item is ProblemClass)
+            CallAdministrationService(s => s.UpdateProblemClass((ProblemClass)item));
+          else if (item is Problem)
+            CallAdministrationService(s => s.UpdateProblem((Problem)item));
+          else if (item is ProblemParameter)
+            CallAdministrationService(s => s.UpdateProblemParameter((ProblemParameter)item));
+          else if (item is Result)
+            CallAdministrationService(s => s.UpdateResult((Result)item));
+          else if (item is Experiment)
+            item.Id = CallAdministrationService<long>(s => s.AddExperiment((Experiment)item));
+          else if (item is Run)
+            item.Id = CallAdministrationService<long>(s => s.AddRun((Run)item));
+        }
+        return true;
+      }
+      catch (Exception ex) {
+        ErrorHandling.ShowErrorDialog("Store failed.", ex);
+        return false;
+      }
+    }
+    #endregion
+
+    #region DataType Methods
+    public DataType ConvertToDataType(Type type) {
+      DataType dataType = DataTypes.FirstOrDefault(x => x.TypeName == type.AssemblyQualifiedName);
+      if (dataType == null) {
+        dataType = new DataType();
+        dataType.Name = type.Name;
+        dataType.TypeName = type.AssemblyQualifiedName;
+        dataType.PlatformId = Platforms.FirstOrDefault(x => x.Name == "HeuristicLab 3.3").Id;
+
+        if (typeof(BoolValue).IsAssignableFrom(type))
+          dataType.SqlName = "bit";
+        else if (typeof(IntValue).IsAssignableFrom(type))
+          dataType.SqlName = "bigint";
+        else if (typeof(DoubleValue).IsAssignableFrom(type))
+          dataType.SqlName = "float";
+        else if (typeof(StringValue).IsAssignableFrom(type) || typeof(IStringConvertibleValue).IsAssignableFrom(type))
+          dataType.SqlName = "nvarchar";
+        else
+          dataType.SqlName = "varbinary";
+
+        dataType.Store();
+        DataTypes.Add(dataType);
+      }
+      return dataType;
+    }
+    #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 AlgorithmData GetAlgorithmData(long algorithmId) {
+      try {
+        return CallAdministrationService<AlgorithmData>(s => s.GetAlgorithmData(algorithmId));
+      }
+      catch (Exception ex) {
+        ErrorHandling.ShowErrorDialog("Refresh algorithm data failed.", ex);
+        return null;
+      }
+    }
+    public bool UpdateAlgorithmData(AlgorithmData algorithmData) {
+      try {
+        CallAdministrationService(s => s.UpdateAlgorithmData(algorithmData));
+        return true;
+      }
+      catch (Exception ex) {
+        ErrorHandling.ShowErrorDialog("Update algorithm data failed.", ex);
+        return false;
+      }
+    }
+    #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 ProblemData GetProblemData(long problemId) {
+      try {
+        return CallAdministrationService<ProblemData>(s => s.GetProblemData(problemId));
+      }
+      catch (Exception ex) {
+        ErrorHandling.ShowErrorDialog("Refresh problem data failed.", ex);
+        return null;
+      }
+    }
+    public bool UpdateProblemData(ProblemData problemData) {
+      try {
+        CallAdministrationService(s => s.UpdateProblemData(problemData));
+        return true;
+      }
+      catch (Exception ex) {
+        ErrorHandling.ShowErrorDialog("Update problem data failed.", ex);
+        return false;
+      }
+    }
+    #endregion
+
+    #region AlgorithmParameter Methods
+    public AlgorithmParameter GetAlgorithmParameter(long id) {
+      try {
+        return CallAdministrationService<AlgorithmParameter>(s => s.GetAlgorithmParameter(id));
+      }
+      catch (Exception ex) {
+        ErrorHandling.ShowErrorDialog("Refresh algorithm parameter failed.", ex);
+        return null;
+      }
+    }
+    public ItemCollection<AlgorithmParameter> GetAlgorithmParameters(long algorithmId) {
+      try {
+        ItemCollection<AlgorithmParameter> parameters = new ItemCollection<AlgorithmParameter>();
+        parameters.AddRange(CallAdministrationService<List<AlgorithmParameter>>(s => s.GetAlgorithmParameters(algorithmId)).OrderBy(x => x.Name));
+        return parameters;
+      }
+      catch (Exception ex) {
+        ErrorHandling.ShowErrorDialog("Refresh algorithm parameters failed.", ex);
+        return null;
+      }
+    }
+    #endregion
+
+    #region ProblemParameter Methods
+    public ProblemParameter GetProblemParameter(long id) {
+      try {
+        return CallAdministrationService<ProblemParameter>(s => s.GetProblemParameter(id));
+      }
+      catch (Exception ex) {
+        ErrorHandling.ShowErrorDialog("Refresh problem parameter failed.", ex);
+        return null;
+      }
+    }
+    public ItemCollection<ProblemParameter> GetProblemParameters(long problemId) {
+      try {
+        ItemCollection<ProblemParameter> parameters = new ItemCollection<ProblemParameter>();
+        parameters.AddRange(CallAdministrationService<List<ProblemParameter>>(s => s.GetProblemParameters(problemId)).OrderBy(x => x.Name));
+        return parameters;
+      }
+      catch (Exception ex) {
+        ErrorHandling.ShowErrorDialog("Refresh problem parameters failed.", ex);
+        return null;
+      }
+    }
+    #endregion
+
+    #region Result Methods
+    public Result GetResult(long id) {
+      try {
+        return CallAdministrationService<Result>(s => s.GetResult(id));
+      }
+      catch (Exception ex) {
+        ErrorHandling.ShowErrorDialog("Refresh result failed.", ex);
+        return null;
+      }
+    }
+    public ItemCollection<Result> GetResults(long algorithmId) {
+      try {
+        ItemCollection<Result> results = new ItemCollection<Result>();
+        results.AddRange(CallAdministrationService<List<Result>>(s => s.GetResults(algorithmId)).OrderBy(x => x.Name));
+        return results;
+      }
+      catch (Exception ex) {
+        ErrorHandling.ShowErrorDialog("Refresh results failed.", ex);
+        return null;
+      }
+    }
+    #endregion
+
+    #region Experiment Methods
+    public Experiment GetExperiment(long id) {
+      try {
+        return CallAdministrationService<Experiment>(s => s.GetExperiment(id));
+      }
+      catch (Exception ex) {
+        ErrorHandling.ShowErrorDialog("Refresh experiment failed.", ex);
+        return null;
+      }
+    }
+    public ItemCollection<Experiment> GetExperiments(long algorithmId, long problemId) {
+      try {
+        ItemCollection<Experiment> experiments = new ItemCollection<Experiment>();
+        experiments.AddRange(CallAdministrationService<List<Experiment>>(s => s.GetExperiments(algorithmId, problemId)));
+        experiments.ItemsRemoved += new CollectionItemsChangedEventHandler<Experiment>(experiments_ItemsRemoved);
+        return experiments;
+      }
+      catch (Exception ex) {
+        ErrorHandling.ShowErrorDialog("Refresh experiments failed.", ex);
+        return null;
+      }
+    }
+    #endregion
+
+    #region Run Methods
+    public ItemCollection<Run> GetRuns(long experimentId) {
+      try {
+        ItemCollection<Run> runs = new ItemCollection<Run>();
+        runs.AddRange(CallAdministrationService<List<Run>>(s => s.GetRuns(experimentId)).OrderByDescending(x => x.CreatedDate));
+        runs.ItemsRemoved += new CollectionItemsChangedEventHandler<Run>(runs_ItemsRemoved);
+        return runs;
+      }
+      catch (Exception ex) {
+        ErrorHandling.ShowErrorDialog("Refresh runs failed.", ex);
+        return null;
+      }
+    }
+    public bool AddRun(long algorithmId, long problemId, IAlgorithm algorithm) {
+      try {
+        IProblem problem = algorithm.Problem;
+
+        ItemCollection<AlgorithmParameter> algorithmParameters = GetAlgorithmParameters(algorithmId);
+        List<AlgorithmParameterValue> algorithmParameterValues = CollectAlgorithmParameterValues(algorithmId, algorithmParameters, algorithm, "");
+        ItemCollection<ProblemParameter> problemParameters = GetProblemParameters(problemId);
+        List<ProblemParameterValue> problemParameterValues = CollectProblemParamterValues(problemId, problemParameters, problem, "");
+        ItemCollection<Result> results = GetResults(algorithmId);
+        List<ResultValue> resultValues = CollectResultValues(algorithmId, results, algorithm);
+
+        Experiment exp = new Experiment();
+        exp.AlgorithmId = algorithmId;
+        exp.ProblemId = problemId;
+        exp.AlgorithmParameterValues = algorithmParameterValues;
+        exp.ProblemParameterValues = problemParameterValues;
+        exp.Store();
+
+        Run r = new Run();
+        r.ExperimentId = exp.Id;
+        r.ClientId = Guid.NewGuid();
+        r.CreatedDate = DateTime.Now;
+        r.RandomSeed = ((IntValue)((IValueParameter)algorithm.Parameters["Seed"]).Value).Value;
+        r.ResultValues = resultValues;
+        r.Store();
+
+        return true;
+      }
+      catch (Exception ex) {
+        ErrorHandling.ShowErrorDialog("Store run failed.", ex);
+        return false;
+      }
+    }
+
+    private List<AlgorithmParameterValue> CollectAlgorithmParameterValues(long algorithmId, ItemCollection<AlgorithmParameter> parameters, IParameterizedItem item, string prefix) {
+      List<AlgorithmParameterValue> values = new List<AlgorithmParameterValue>();
+      foreach (IValueParameter param in item.Parameters.OfType<IValueParameter>()) {
+        if (param.GetsCollected && (param.Value != null) && (param.Name != "Seed")) {
+          AlgorithmParameter p = parameters.FirstOrDefault(x => x.Name == prefix + param.Name);
+          if (p == null) {
+            p = new AlgorithmParameter();
+            p.Name = prefix + param.Name;
+            p.Alias = prefix + param.Name;
+            p.Description = param.Description;
+            p.AlgorithmId = algorithmId;
+            p.DataTypeId = ConvertToDataType(param.DataType).Id;
+            p.Store();
+            parameters.Add(p);
+          }
+          AlgorithmParameterValue value = CreateAlgorithmParameterValue(param.Value);
+          value.AlgorithmParameterId = p.Id;
+          value.DataTypeId = ConvertToDataType(param.Value.GetType()).Id;
+          values.Add(value);
+        }
+
+        if (param.Value is IParameterizedItem)
+          values.AddRange(CollectAlgorithmParameterValues(algorithmId, parameters, (IParameterizedItem)param.Value, (string.IsNullOrEmpty(prefix) ? param.Name : prefix + param.Name) + "."));
+      }
+      return values;
+    }
+    private AlgorithmParameterValue CreateAlgorithmParameterValue(IItem item) {
+      if (item is BoolValue) {
+        AlgorithmParameterBoolValue value = new AlgorithmParameterBoolValue();
+        value.Value = ((BoolValue)item).Value;
+        return value;
+      } else if (item is DoubleValue) {
+        AlgorithmParameterFloatValue value = new AlgorithmParameterFloatValue();
+        value.Value = ((DoubleValue)item).Value;
+        return value;
+      } else if (item is IntValue) {
+        AlgorithmParameterIntValue value = new AlgorithmParameterIntValue();
+        value.Value = ((IntValue)item).Value;
+        return value;
+      } else if (item is StringValue) {
+        AlgorithmParameterStringValue value = new AlgorithmParameterStringValue();
+        value.Value = ((StringValue)item).Value;
+        return value;
+      } else {
+        AlgorithmParameterBlobValue value = new AlgorithmParameterBlobValue();
+        try {
+          using (MemoryStream stream = new MemoryStream()) {
+            XmlGenerator.Serialize(item, stream);
+            stream.Close();
+            value.Value = stream.ToArray();
+          }
+        }
+        catch (Exception ex) {
+          ErrorHandling.ShowErrorDialog(ex);
+        }
+        return value;
+      }
+    }
+    private List<ProblemParameterValue> CollectProblemParamterValues(long problemId, ItemCollection<ProblemParameter> parameters, IParameterizedItem item, string prefix) {
+      List<ProblemParameterValue> values = new List<ProblemParameterValue>();
+      foreach (IValueParameter param in item.Parameters.OfType<IValueParameter>()) {
+        if (param.GetsCollected && (param.Value != null)) {
+          ProblemParameter p = parameters.FirstOrDefault(x => x.Name == prefix + param.Name);
+          if (p == null) {
+            p = new ProblemParameter();
+            p.Name = prefix + param.Name;
+            p.Alias = prefix + param.Name;
+            p.Description = param.Description;
+            p.ProblemId = problemId;
+            p.DataTypeId = ConvertToDataType(param.DataType).Id;
+            p.Store();
+            parameters.Add(p);
+          }
+          ProblemParameterValue value = CreateProblemParameterValue(param.Value);
+          value.ProblemParameterId = p.Id;
+          value.DataTypeId = ConvertToDataType(param.Value.GetType()).Id;
+          values.Add(value);
+        }
+
+        if (param.Value is IParameterizedItem)
+          values.AddRange(CollectProblemParamterValues(problemId, parameters, (IParameterizedItem)param.Value, (string.IsNullOrEmpty(prefix) ? param.Name : prefix + param.Name) + "."));
+      }
+      return values;
+    }
+    private ProblemParameterValue CreateProblemParameterValue(IItem item) {
+      if (item is BoolValue) {
+        ProblemParameterBoolValue value = new ProblemParameterBoolValue();
+        value.Value = ((BoolValue)item).Value;
+        return value;
+      } else if (item is DoubleValue) {
+        ProblemParameterFloatValue value = new ProblemParameterFloatValue();
+        value.Value = ((DoubleValue)item).Value;
+        return value;
+      } else if (item is IntValue) {
+        ProblemParameterIntValue value = new ProblemParameterIntValue();
+        value.Value = ((IntValue)item).Value;
+        return value;
+      } else if (item is StringValue) {
+        ProblemParameterStringValue value = new ProblemParameterStringValue();
+        value.Value = ((StringValue)item).Value;
+        return value;
+      } else {
+        ProblemParameterBlobValue value = new ProblemParameterBlobValue();
+        try {
+          using (MemoryStream stream = new MemoryStream()) {
+            XmlGenerator.Serialize(item, stream);
+            stream.Close();
+            value.Value = stream.ToArray();
+          }
+        }
+        catch (Exception ex) {
+          ErrorHandling.ShowErrorDialog(ex);
+        }
+        return value;
+      }
+    }
+    private List<ResultValue> CollectResultValues(long algorithmId, ItemCollection<Result> results, IAlgorithm algorithm) {
+      List<ResultValue> values = new List<ResultValue>();
+      foreach (IResult result in algorithm.Results) {
+        if (result.Value != null) {
+          Result r = results.FirstOrDefault(x => x.Name == result.Name);
+          if (r == null) {
+            r = new Result();
+            r.Name = result.Name;
+            r.Alias = result.Name;
+            r.Description = result.Description;
+            r.AlgorithmId = algorithmId;
+            r.DataTypeId = ConvertToDataType(result.DataType).Id;
+            r.Store();
+            results.Add(r);
+          }
+          ResultValue value = CreateResultValue(result.Value);
+          value.ResultId = r.Id;
+          value.DataTypeId = ConvertToDataType(result.Value.GetType()).Id;
+          values.Add(value);
+        }
+      }
+      return values;
+    }
+    private ResultValue CreateResultValue(IItem item) {
+      if (item is BoolValue) {
+        ResultBoolValue value = new ResultBoolValue();
+        value.Value = ((BoolValue)item).Value;
+        return value;
+      } else if (item is DoubleValue) {
+        ResultFloatValue value = new ResultFloatValue();
+        value.Value = ((DoubleValue)item).Value;
+        return value;
+      } else if (item is IntValue) {
+        ResultIntValue value = new ResultIntValue();
+        value.Value = ((IntValue)item).Value;
+        return value;
+      } else if (item is StringValue) {
+        ResultStringValue value = new ResultStringValue();
+        value.Value = ((StringValue)item).Value;
+        return value;
+      } else {
+        ResultBlobValue value = new ResultBlobValue();
+        try {
+          using (MemoryStream stream = new MemoryStream()) {
+            XmlGenerator.Serialize(item, stream);
+            stream.Close();
+            value.Value = stream.ToArray();
+          }
+        }
+        catch (Exception ex) {
+          ErrorHandling.ShowErrorDialog(ex);
+        }
+        return value;
+      }
+    }
+    #endregion
+
+    #region Query Methods
+    private IEnumerable<Filter> filters;
+    public IEnumerable<Filter> GetFilters(bool refresh) {
+      if (refresh || (filters == null)) {
+        try {
+          filters = CallQueryService<List<Filter>>(s => s.GetFilters());
+        }
+        catch (Exception ex) {
+          ErrorHandling.ShowErrorDialog("Get filters failed.", ex);
+          return Enumerable.Empty<Filter>();
+        }
+      }
+      return filters;
+    }
+    public IEnumerable<Filter> GetFilters() {
+      return GetFilters(false);
+    }
+    public long GetNumberOfQueryResults(Filter filter) {
+      try {
+        return CallQueryService<long>(x => x.GetNumberOfQueryResults(filter));
+      }
+      catch (Exception ex) {
+        ErrorHandling.ShowErrorDialog("Get number of query results failed.", ex);
+        return -1;
+      }
+    }
+    public IEnumerable<long> GetQueryResultIds(Filter filter) {
+      try {
+        return CallQueryService<IEnumerable<long>>(x => x.GetQueryResultIds(filter));
+      }
+      catch (Exception ex) {
+        ErrorHandling.ShowErrorDialog("Get query result ids failed.", ex);
+        return Enumerable.Empty<long>();
+      }
+    }
+    public IEnumerable<QueryResult> GetQueryResults(IEnumerable<long> ids) {
+      try {
+        return CallQueryService<IEnumerable<QueryResult>>(s => s.GetQueryResults(ids.ToList()));
+      }
+      catch (Exception ex) {
+        ErrorHandling.ShowErrorDialog("Get query results failed.", ex);
+        return null;
+      }
+    }
+    #endregion
+
+    #region Events
+    public event EventHandler Refreshing;
+    private void OnRefreshing() {
+      EventHandler handler = Refreshing;
+      if (handler != null) handler(this, EventArgs.Empty);
+    }
+    public event EventHandler Refreshed;
+    private void OnRefreshed() {
+      EventHandler 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 dataTypes_ItemsRemoved(object sender, CollectionItemsChangedEventArgs<DataType> e) {
+      try {
+        foreach (DataType d in e.Items)
+          CallAdministrationService(s => s.DeleteDataType(d.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);
+      }
+    }
+    private void experiments_ItemsRemoved(object sender, CollectionItemsChangedEventArgs<Experiment> e) {
+      try {
+        foreach (Experiment exp in e.Items)
+          CallAdministrationService(s => s.DeleteExperiment(exp.Id));
+      }
+      catch (Exception ex) {
+        ErrorHandling.ShowErrorDialog("Delete failed.", ex);
+      }
+    }
+    private void runs_ItemsRemoved(object sender, CollectionItemsChangedEventArgs<Run> e) {
+      try {
+        foreach (Run r in e.Items)
+          CallAdministrationService(s => s.DeleteRun(r.Id));
+      }
+      catch (Exception ex) {
+        ErrorHandling.ShowErrorDialog("Delete failed.", ex);
+      }
+    }
+    #endregion
+
+    #region Helpers
+    private void CallAdministrationService(Action<IAdministrationService> call) {
+      AdministrationServiceClient client = ClientFactory.CreateClient<AdministrationServiceClient, IAdministrationService>();
+      try {
+        call(client);
+      }
+      finally {
+        try {
+          client.Close();
+        }
+        catch (Exception) {
+          client.Abort();
+        }
+      }
+    }
+    private T CallAdministrationService<T>(Func<IAdministrationService, T> call) {
+      AdministrationServiceClient client = ClientFactory.CreateClient<AdministrationServiceClient, IAdministrationService>();
+      try {
+        return call(client);
+      }
+      finally {
+        try {
+          client.Close();
+        }
+        catch (Exception) {
+          client.Abort();
+        }
+      }
+    }
+    private void CallQueryService(Action<IQueryService> call) {
+      QueryServiceClient client = ClientFactory.CreateClient<QueryServiceClient, IQueryService>();
+      try {
+        call(client);
+      }
+      finally {
+        try {
+          client.Close();
+        }
+        catch (Exception) {
+          client.Abort();
+        }
+      }
+    }
+    private T CallQueryService<T>(Func<IQueryService, T> call) {
+      QueryServiceClient client = ClientFactory.CreateClient<QueryServiceClient, IQueryService>();
+      try {
+        return call(client);
+      }
+      finally {
+        try {
+          client.Close();
+        }
+        catch (Exception) {
+          client.Abort();
+        }
+      }
+    }
+    private T CallAuthenticationService<T>(Func<IAuthenticationService, T> call) {
+      AuthenticationServiceClient client = ClientFactory.CreateClient<AuthenticationServiceClient, IAuthenticationService>();
+      try {
+        return call(client);
+      }
+      finally {
+        try {
+          client.Close();
+        }
+        catch (Exception) {
+          client.Abort();
+        }
+      }
+    }
+    #endregion
+  }
+}
Index: branches/OKB (trunk integration)/HeuristicLab.Clients.OKB/3.3/RunCreation/OKBClient.cs
===================================================================
--- branches/OKB (trunk integration)/HeuristicLab.Clients.OKB/3.3/RunCreation/OKBClient.cs	(revision 5533)
+++ branches/OKB (trunk integration)/HeuristicLab.Clients.OKB/3.3/RunCreation/OKBClient.cs	(revision 5533)
@@ -0,0 +1,812 @@
+﻿#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.IO;
+using System.Linq;
+using HeuristicLab.Clients.Common;
+using HeuristicLab.Collections;
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Data;
+using HeuristicLab.Optimization;
+using HeuristicLab.Persistence.Default.Xml;
+using HeuristicLab.PluginInfrastructure;
+
+namespace HeuristicLab.Clients.OKB {
+  [Item("OKBClient", "Client for accessing the OKB.")]
+  public sealed class OKBClient : IContent {
+    private static OKBClient instance;
+    public static OKBClient Instance {
+      get {
+        if (instance == null) instance = new OKBClient();
+        return instance;
+      }
+    }
+
+    #region Properties
+    private ItemCollection<Platform> platforms;
+    public ItemCollection<Platform> Platforms {
+      get { return platforms; }
+    }
+    private ItemCollection<DataType> dataTypes;
+    public ItemCollection<DataType> DataTypes {
+      get { return dataTypes; }
+    }
+    private IEnumerable<User> users;
+    public IEnumerable<User> Users {
+      get { return users; }
+    }
+    private ItemCollection<AlgorithmClass> algorithmClasses;
+    public ItemCollection<AlgorithmClass> AlgorithmClasses {
+      get { return algorithmClasses; }
+    }
+    private ItemCollection<Algorithm> algorithms;
+    public ItemCollection<Algorithm> Algorithms {
+      get { return algorithms; }
+    }
+    private ItemCollection<ProblemClass> problemClasses;
+    public ItemCollection<ProblemClass> ProblemClasses {
+      get { return problemClasses; }
+    }
+    private ItemCollection<Problem> problems;
+    public ItemCollection<Problem> Problems {
+      get { return problems; }
+    }
+    #endregion
+
+    private OKBClient() {
+      platforms = new ItemCollection<Platform>();
+      platforms.ItemsRemoved += new CollectionItemsChangedEventHandler<Platform>(platforms_ItemsRemoved);
+      dataTypes = new ItemCollection<DataType>();
+      dataTypes.ItemsRemoved += new CollectionItemsChangedEventHandler<DataType>(dataTypes_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);
+    }
+
+    #region Refresh
+    public void Refresh() {
+      OnRefreshing();
+
+      platforms.Clear();
+      dataTypes.Clear();
+      algorithmClasses.Clear();
+      algorithms.Clear();
+      problemClasses.Clear();
+      problems.Clear();
+
+      var call = new Func<Exception>(delegate() {
+        try {
+          platforms.AddRange(CallAdministrationService<List<Platform>>(s => s.GetPlatforms()).OrderBy(x => x.Name));
+          dataTypes.AddRange(CallAdministrationService<List<DataType>>(s => s.GetDataTypes()).OrderBy(x => x.Name));
+          users = CallAuthenticationService<List<User>>(s => s.GetUsers()).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;
+        }
+        catch (Exception ex) {
+          return ex;
+        }
+      });
+      call.BeginInvoke(delegate(IAsyncResult result) {
+        Exception ex = call.EndInvoke(result);
+        if (ex != null) ErrorHandling.ShowErrorDialog("Refresh failed.", ex);
+        OnRefreshed();
+      }, null);
+    }
+    #endregion
+
+    #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 DataType)
+            item.Id = CallAdministrationService<long>(s => s.AddDataType((DataType)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 AlgorithmParameter)
+            item.Id = CallAdministrationService<long>(s => s.AddAlgorithmParameter((AlgorithmParameter)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 ProblemParameter)
+            item.Id = CallAdministrationService<long>(s => s.AddProblemParameter((ProblemParameter)item));
+          else if (item is Result)
+            item.Id = CallAdministrationService<long>(s => s.AddResult((Result)item));
+          else if (item is Experiment)
+            item.Id = CallAdministrationService<long>(s => s.AddExperiment((Experiment)item));
+          else if (item is Run)
+            item.Id = CallAdministrationService<long>(s => s.AddRun((Run)item));
+        } else {
+          if (item is Platform)
+            CallAdministrationService(s => s.UpdatePlatform((Platform)item));
+          else if (item is DataType)
+            CallAdministrationService(s => s.UpdateDataType((DataType)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 AlgorithmParameter)
+            CallAdministrationService(s => s.UpdateAlgorithmParameter((AlgorithmParameter)item));
+          else if (item is ProblemClass)
+            CallAdministrationService(s => s.UpdateProblemClass((ProblemClass)item));
+          else if (item is Problem)
+            CallAdministrationService(s => s.UpdateProblem((Problem)item));
+          else if (item is ProblemParameter)
+            CallAdministrationService(s => s.UpdateProblemParameter((ProblemParameter)item));
+          else if (item is Result)
+            CallAdministrationService(s => s.UpdateResult((Result)item));
+          else if (item is Experiment)
+            item.Id = CallAdministrationService<long>(s => s.AddExperiment((Experiment)item));
+          else if (item is Run)
+            item.Id = CallAdministrationService<long>(s => s.AddRun((Run)item));
+        }
+        return true;
+      }
+      catch (Exception ex) {
+        ErrorHandling.ShowErrorDialog("Store failed.", ex);
+        return false;
+      }
+    }
+    #endregion
+
+    #region DataType Methods
+    public DataType ConvertToDataType(Type type) {
+      DataType dataType = DataTypes.FirstOrDefault(x => x.TypeName == type.AssemblyQualifiedName);
+      if (dataType == null) {
+        dataType = new DataType();
+        dataType.Name = type.Name;
+        dataType.TypeName = type.AssemblyQualifiedName;
+        dataType.PlatformId = Platforms.FirstOrDefault(x => x.Name == "HeuristicLab 3.3").Id;
+
+        if (typeof(BoolValue).IsAssignableFrom(type))
+          dataType.SqlName = "bit";
+        else if (typeof(IntValue).IsAssignableFrom(type))
+          dataType.SqlName = "bigint";
+        else if (typeof(DoubleValue).IsAssignableFrom(type))
+          dataType.SqlName = "float";
+        else if (typeof(StringValue).IsAssignableFrom(type) || typeof(IStringConvertibleValue).IsAssignableFrom(type))
+          dataType.SqlName = "nvarchar";
+        else
+          dataType.SqlName = "varbinary";
+
+        dataType.Store();
+        DataTypes.Add(dataType);
+      }
+      return dataType;
+    }
+    #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 AlgorithmData GetAlgorithmData(long algorithmId) {
+      try {
+        return CallAdministrationService<AlgorithmData>(s => s.GetAlgorithmData(algorithmId));
+      }
+      catch (Exception ex) {
+        ErrorHandling.ShowErrorDialog("Refresh algorithm data failed.", ex);
+        return null;
+      }
+    }
+    public bool UpdateAlgorithmData(AlgorithmData algorithmData) {
+      try {
+        CallAdministrationService(s => s.UpdateAlgorithmData(algorithmData));
+        return true;
+      }
+      catch (Exception ex) {
+        ErrorHandling.ShowErrorDialog("Update algorithm data failed.", ex);
+        return false;
+      }
+    }
+    #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 ProblemData GetProblemData(long problemId) {
+      try {
+        return CallAdministrationService<ProblemData>(s => s.GetProblemData(problemId));
+      }
+      catch (Exception ex) {
+        ErrorHandling.ShowErrorDialog("Refresh problem data failed.", ex);
+        return null;
+      }
+    }
+    public bool UpdateProblemData(ProblemData problemData) {
+      try {
+        CallAdministrationService(s => s.UpdateProblemData(problemData));
+        return true;
+      }
+      catch (Exception ex) {
+        ErrorHandling.ShowErrorDialog("Update problem data failed.", ex);
+        return false;
+      }
+    }
+    #endregion
+
+    #region AlgorithmParameter Methods
+    public AlgorithmParameter GetAlgorithmParameter(long id) {
+      try {
+        return CallAdministrationService<AlgorithmParameter>(s => s.GetAlgorithmParameter(id));
+      }
+      catch (Exception ex) {
+        ErrorHandling.ShowErrorDialog("Refresh algorithm parameter failed.", ex);
+        return null;
+      }
+    }
+    public ItemCollection<AlgorithmParameter> GetAlgorithmParameters(long algorithmId) {
+      try {
+        ItemCollection<AlgorithmParameter> parameters = new ItemCollection<AlgorithmParameter>();
+        parameters.AddRange(CallAdministrationService<List<AlgorithmParameter>>(s => s.GetAlgorithmParameters(algorithmId)).OrderBy(x => x.Name));
+        return parameters;
+      }
+      catch (Exception ex) {
+        ErrorHandling.ShowErrorDialog("Refresh algorithm parameters failed.", ex);
+        return null;
+      }
+    }
+    #endregion
+
+    #region ProblemParameter Methods
+    public ProblemParameter GetProblemParameter(long id) {
+      try {
+        return CallAdministrationService<ProblemParameter>(s => s.GetProblemParameter(id));
+      }
+      catch (Exception ex) {
+        ErrorHandling.ShowErrorDialog("Refresh problem parameter failed.", ex);
+        return null;
+      }
+    }
+    public ItemCollection<ProblemParameter> GetProblemParameters(long problemId) {
+      try {
+        ItemCollection<ProblemParameter> parameters = new ItemCollection<ProblemParameter>();
+        parameters.AddRange(CallAdministrationService<List<ProblemParameter>>(s => s.GetProblemParameters(problemId)).OrderBy(x => x.Name));
+        return parameters;
+      }
+      catch (Exception ex) {
+        ErrorHandling.ShowErrorDialog("Refresh problem parameters failed.", ex);
+        return null;
+      }
+    }
+    #endregion
+
+    #region Result Methods
+    public Result GetResult(long id) {
+      try {
+        return CallAdministrationService<Result>(s => s.GetResult(id));
+      }
+      catch (Exception ex) {
+        ErrorHandling.ShowErrorDialog("Refresh result failed.", ex);
+        return null;
+      }
+    }
+    public ItemCollection<Result> GetResults(long algorithmId) {
+      try {
+        ItemCollection<Result> results = new ItemCollection<Result>();
+        results.AddRange(CallAdministrationService<List<Result>>(s => s.GetResults(algorithmId)).OrderBy(x => x.Name));
+        return results;
+      }
+      catch (Exception ex) {
+        ErrorHandling.ShowErrorDialog("Refresh results failed.", ex);
+        return null;
+      }
+    }
+    #endregion
+
+    #region Experiment Methods
+    public Experiment GetExperiment(long id) {
+      try {
+        return CallAdministrationService<Experiment>(s => s.GetExperiment(id));
+      }
+      catch (Exception ex) {
+        ErrorHandling.ShowErrorDialog("Refresh experiment failed.", ex);
+        return null;
+      }
+    }
+    public ItemCollection<Experiment> GetExperiments(long algorithmId, long problemId) {
+      try {
+        ItemCollection<Experiment> experiments = new ItemCollection<Experiment>();
+        experiments.AddRange(CallAdministrationService<List<Experiment>>(s => s.GetExperiments(algorithmId, problemId)));
+        experiments.ItemsRemoved += new CollectionItemsChangedEventHandler<Experiment>(experiments_ItemsRemoved);
+        return experiments;
+      }
+      catch (Exception ex) {
+        ErrorHandling.ShowErrorDialog("Refresh experiments failed.", ex);
+        return null;
+      }
+    }
+    #endregion
+
+    #region Run Methods
+    public ItemCollection<Run> GetRuns(long experimentId) {
+      try {
+        ItemCollection<Run> runs = new ItemCollection<Run>();
+        runs.AddRange(CallAdministrationService<List<Run>>(s => s.GetRuns(experimentId)).OrderByDescending(x => x.CreatedDate));
+        runs.ItemsRemoved += new CollectionItemsChangedEventHandler<Run>(runs_ItemsRemoved);
+        return runs;
+      }
+      catch (Exception ex) {
+        ErrorHandling.ShowErrorDialog("Refresh runs failed.", ex);
+        return null;
+      }
+    }
+    public bool AddRun(long algorithmId, long problemId, IAlgorithm algorithm) {
+      try {
+        IProblem problem = algorithm.Problem;
+
+        ItemCollection<AlgorithmParameter> algorithmParameters = GetAlgorithmParameters(algorithmId);
+        List<AlgorithmParameterValue> algorithmParameterValues = CollectAlgorithmParameterValues(algorithmId, algorithmParameters, algorithm, "");
+        ItemCollection<ProblemParameter> problemParameters = GetProblemParameters(problemId);
+        List<ProblemParameterValue> problemParameterValues = CollectProblemParamterValues(problemId, problemParameters, problem, "");
+        ItemCollection<Result> results = GetResults(algorithmId);
+        List<ResultValue> resultValues = CollectResultValues(algorithmId, results, algorithm);
+
+        Experiment exp = new Experiment();
+        exp.AlgorithmId = algorithmId;
+        exp.ProblemId = problemId;
+        exp.AlgorithmParameterValues = algorithmParameterValues;
+        exp.ProblemParameterValues = problemParameterValues;
+        exp.Store();
+
+        Run r = new Run();
+        r.ExperimentId = exp.Id;
+        r.ClientId = Guid.NewGuid();
+        r.CreatedDate = DateTime.Now;
+        r.RandomSeed = ((IntValue)((IValueParameter)algorithm.Parameters["Seed"]).Value).Value;
+        r.ResultValues = resultValues;
+        r.Store();
+
+        return true;
+      }
+      catch (Exception ex) {
+        ErrorHandling.ShowErrorDialog("Store run failed.", ex);
+        return false;
+      }
+    }
+
+    private List<AlgorithmParameterValue> CollectAlgorithmParameterValues(long algorithmId, ItemCollection<AlgorithmParameter> parameters, IParameterizedItem item, string prefix) {
+      List<AlgorithmParameterValue> values = new List<AlgorithmParameterValue>();
+      foreach (IValueParameter param in item.Parameters.OfType<IValueParameter>()) {
+        if (param.GetsCollected && (param.Value != null) && (param.Name != "Seed")) {
+          AlgorithmParameter p = parameters.FirstOrDefault(x => x.Name == prefix + param.Name);
+          if (p == null) {
+            p = new AlgorithmParameter();
+            p.Name = prefix + param.Name;
+            p.Alias = prefix + param.Name;
+            p.Description = param.Description;
+            p.AlgorithmId = algorithmId;
+            p.DataTypeId = ConvertToDataType(param.DataType).Id;
+            p.Store();
+            parameters.Add(p);
+          }
+          AlgorithmParameterValue value = CreateAlgorithmParameterValue(param.Value);
+          value.AlgorithmParameterId = p.Id;
+          value.DataTypeId = ConvertToDataType(param.Value.GetType()).Id;
+          values.Add(value);
+        }
+
+        if (param.Value is IParameterizedItem)
+          values.AddRange(CollectAlgorithmParameterValues(algorithmId, parameters, (IParameterizedItem)param.Value, (string.IsNullOrEmpty(prefix) ? param.Name : prefix + param.Name) + "."));
+      }
+      return values;
+    }
+    private AlgorithmParameterValue CreateAlgorithmParameterValue(IItem item) {
+      if (item is BoolValue) {
+        AlgorithmParameterBoolValue value = new AlgorithmParameterBoolValue();
+        value.Value = ((BoolValue)item).Value;
+        return value;
+      } else if (item is DoubleValue) {
+        AlgorithmParameterFloatValue value = new AlgorithmParameterFloatValue();
+        value.Value = ((DoubleValue)item).Value;
+        return value;
+      } else if (item is IntValue) {
+        AlgorithmParameterIntValue value = new AlgorithmParameterIntValue();
+        value.Value = ((IntValue)item).Value;
+        return value;
+      } else if (item is StringValue) {
+        AlgorithmParameterStringValue value = new AlgorithmParameterStringValue();
+        value.Value = ((StringValue)item).Value;
+        return value;
+      } else {
+        AlgorithmParameterBlobValue value = new AlgorithmParameterBlobValue();
+        try {
+          using (MemoryStream stream = new MemoryStream()) {
+            XmlGenerator.Serialize(item, stream);
+            stream.Close();
+            value.Value = stream.ToArray();
+          }
+        }
+        catch (Exception ex) {
+          ErrorHandling.ShowErrorDialog(ex);
+        }
+        return value;
+      }
+    }
+    private List<ProblemParameterValue> CollectProblemParamterValues(long problemId, ItemCollection<ProblemParameter> parameters, IParameterizedItem item, string prefix) {
+      List<ProblemParameterValue> values = new List<ProblemParameterValue>();
+      foreach (IValueParameter param in item.Parameters.OfType<IValueParameter>()) {
+        if (param.GetsCollected && (param.Value != null)) {
+          ProblemParameter p = parameters.FirstOrDefault(x => x.Name == prefix + param.Name);
+          if (p == null) {
+            p = new ProblemParameter();
+            p.Name = prefix + param.Name;
+            p.Alias = prefix + param.Name;
+            p.Description = param.Description;
+            p.ProblemId = problemId;
+            p.DataTypeId = ConvertToDataType(param.DataType).Id;
+            p.Store();
+            parameters.Add(p);
+          }
+          ProblemParameterValue value = CreateProblemParameterValue(param.Value);
+          value.ProblemParameterId = p.Id;
+          value.DataTypeId = ConvertToDataType(param.Value.GetType()).Id;
+          values.Add(value);
+        }
+
+        if (param.Value is IParameterizedItem)
+          values.AddRange(CollectProblemParamterValues(problemId, parameters, (IParameterizedItem)param.Value, (string.IsNullOrEmpty(prefix) ? param.Name : prefix + param.Name) + "."));
+      }
+      return values;
+    }
+    private ProblemParameterValue CreateProblemParameterValue(IItem item) {
+      if (item is BoolValue) {
+        ProblemParameterBoolValue value = new ProblemParameterBoolValue();
+        value.Value = ((BoolValue)item).Value;
+        return value;
+      } else if (item is DoubleValue) {
+        ProblemParameterFloatValue value = new ProblemParameterFloatValue();
+        value.Value = ((DoubleValue)item).Value;
+        return value;
+      } else if (item is IntValue) {
+        ProblemParameterIntValue value = new ProblemParameterIntValue();
+        value.Value = ((IntValue)item).Value;
+        return value;
+      } else if (item is StringValue) {
+        ProblemParameterStringValue value = new ProblemParameterStringValue();
+        value.Value = ((StringValue)item).Value;
+        return value;
+      } else {
+        ProblemParameterBlobValue value = new ProblemParameterBlobValue();
+        try {
+          using (MemoryStream stream = new MemoryStream()) {
+            XmlGenerator.Serialize(item, stream);
+            stream.Close();
+            value.Value = stream.ToArray();
+          }
+        }
+        catch (Exception ex) {
+          ErrorHandling.ShowErrorDialog(ex);
+        }
+        return value;
+      }
+    }
+    private List<ResultValue> CollectResultValues(long algorithmId, ItemCollection<Result> results, IAlgorithm algorithm) {
+      List<ResultValue> values = new List<ResultValue>();
+      foreach (IResult result in algorithm.Results) {
+        if (result.Value != null) {
+          Result r = results.FirstOrDefault(x => x.Name == result.Name);
+          if (r == null) {
+            r = new Result();
+            r.Name = result.Name;
+            r.Alias = result.Name;
+            r.Description = result.Description;
+            r.AlgorithmId = algorithmId;
+            r.DataTypeId = ConvertToDataType(result.DataType).Id;
+            r.Store();
+            results.Add(r);
+          }
+          ResultValue value = CreateResultValue(result.Value);
+          value.ResultId = r.Id;
+          value.DataTypeId = ConvertToDataType(result.Value.GetType()).Id;
+          values.Add(value);
+        }
+      }
+      return values;
+    }
+    private ResultValue CreateResultValue(IItem item) {
+      if (item is BoolValue) {
+        ResultBoolValue value = new ResultBoolValue();
+        value.Value = ((BoolValue)item).Value;
+        return value;
+      } else if (item is DoubleValue) {
+        ResultFloatValue value = new ResultFloatValue();
+        value.Value = ((DoubleValue)item).Value;
+        return value;
+      } else if (item is IntValue) {
+        ResultIntValue value = new ResultIntValue();
+        value.Value = ((IntValue)item).Value;
+        return value;
+      } else if (item is StringValue) {
+        ResultStringValue value = new ResultStringValue();
+        value.Value = ((StringValue)item).Value;
+        return value;
+      } else {
+        ResultBlobValue value = new ResultBlobValue();
+        try {
+          using (MemoryStream stream = new MemoryStream()) {
+            XmlGenerator.Serialize(item, stream);
+            stream.Close();
+            value.Value = stream.ToArray();
+          }
+        }
+        catch (Exception ex) {
+          ErrorHandling.ShowErrorDialog(ex);
+        }
+        return value;
+      }
+    }
+    #endregion
+
+    #region Query Methods
+    private IEnumerable<Filter> filters;
+    public IEnumerable<Filter> GetFilters(bool refresh) {
+      if (refresh || (filters == null)) {
+        try {
+          filters = CallQueryService<List<Filter>>(s => s.GetFilters());
+        }
+        catch (Exception ex) {
+          ErrorHandling.ShowErrorDialog("Get filters failed.", ex);
+          return Enumerable.Empty<Filter>();
+        }
+      }
+      return filters;
+    }
+    public IEnumerable<Filter> GetFilters() {
+      return GetFilters(false);
+    }
+    public long GetNumberOfQueryResults(Filter filter) {
+      try {
+        return CallQueryService<long>(x => x.GetNumberOfQueryResults(filter));
+      }
+      catch (Exception ex) {
+        ErrorHandling.ShowErrorDialog("Get number of query results failed.", ex);
+        return -1;
+      }
+    }
+    public IEnumerable<long> GetQueryResultIds(Filter filter) {
+      try {
+        return CallQueryService<IEnumerable<long>>(x => x.GetQueryResultIds(filter));
+      }
+      catch (Exception ex) {
+        ErrorHandling.ShowErrorDialog("Get query result ids failed.", ex);
+        return Enumerable.Empty<long>();
+      }
+    }
+    public IEnumerable<QueryResult> GetQueryResults(IEnumerable<long> ids) {
+      try {
+        return CallQueryService<IEnumerable<QueryResult>>(s => s.GetQueryResults(ids.ToList()));
+      }
+      catch (Exception ex) {
+        ErrorHandling.ShowErrorDialog("Get query results failed.", ex);
+        return null;
+      }
+    }
+    #endregion
+
+    #region Events
+    public event EventHandler Refreshing;
+    private void OnRefreshing() {
+      EventHandler handler = Refreshing;
+      if (handler != null) handler(this, EventArgs.Empty);
+    }
+    public event EventHandler Refreshed;
+    private void OnRefreshed() {
+      EventHandler 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 dataTypes_ItemsRemoved(object sender, CollectionItemsChangedEventArgs<DataType> e) {
+      try {
+        foreach (DataType d in e.Items)
+          CallAdministrationService(s => s.DeleteDataType(d.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);
+      }
+    }
+    private void experiments_ItemsRemoved(object sender, CollectionItemsChangedEventArgs<Experiment> e) {
+      try {
+        foreach (Experiment exp in e.Items)
+          CallAdministrationService(s => s.DeleteExperiment(exp.Id));
+      }
+      catch (Exception ex) {
+        ErrorHandling.ShowErrorDialog("Delete failed.", ex);
+      }
+    }
+    private void runs_ItemsRemoved(object sender, CollectionItemsChangedEventArgs<Run> e) {
+      try {
+        foreach (Run r in e.Items)
+          CallAdministrationService(s => s.DeleteRun(r.Id));
+      }
+      catch (Exception ex) {
+        ErrorHandling.ShowErrorDialog("Delete failed.", ex);
+      }
+    }
+    #endregion
+
+    #region Helpers
+    private void CallAdministrationService(Action<IAdministrationService> call) {
+      AdministrationServiceClient client = ClientFactory.CreateClient<AdministrationServiceClient, IAdministrationService>();
+      try {
+        call(client);
+      }
+      finally {
+        try {
+          client.Close();
+        }
+        catch (Exception) {
+          client.Abort();
+        }
+      }
+    }
+    private T CallAdministrationService<T>(Func<IAdministrationService, T> call) {
+      AdministrationServiceClient client = ClientFactory.CreateClient<AdministrationServiceClient, IAdministrationService>();
+      try {
+        return call(client);
+      }
+      finally {
+        try {
+          client.Close();
+        }
+        catch (Exception) {
+          client.Abort();
+        }
+      }
+    }
+    private void CallQueryService(Action<IQueryService> call) {
+      QueryServiceClient client = ClientFactory.CreateClient<QueryServiceClient, IQueryService>();
+      try {
+        call(client);
+      }
+      finally {
+        try {
+          client.Close();
+        }
+        catch (Exception) {
+          client.Abort();
+        }
+      }
+    }
+    private T CallQueryService<T>(Func<IQueryService, T> call) {
+      QueryServiceClient client = ClientFactory.CreateClient<QueryServiceClient, IQueryService>();
+      try {
+        return call(client);
+      }
+      finally {
+        try {
+          client.Close();
+        }
+        catch (Exception) {
+          client.Abort();
+        }
+      }
+    }
+    private T CallAuthenticationService<T>(Func<IAuthenticationService, T> call) {
+      AuthenticationServiceClient client = ClientFactory.CreateClient<AuthenticationServiceClient, IAuthenticationService>();
+      try {
+        return call(client);
+      }
+      finally {
+        try {
+          client.Close();
+        }
+        catch (Exception) {
+          client.Abort();
+        }
+      }
+    }
+    #endregion
+  }
+}
Index: branches/OKB (trunk integration)/HeuristicLab.Clients.OKB/3.3/ServiceClients/Algorithm.cs
===================================================================
--- branches/OKB (trunk integration)/HeuristicLab.Clients.OKB/3.3/ServiceClients/Algorithm.cs	(revision 5504)
+++ 	(revision )
@@ -1,43 +1,0 @@
-﻿#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 HeuristicLab.Common;
-using HeuristicLab.Core;
-
-namespace HeuristicLab.Clients.OKB {
-  [Item("Algorithm", "An OKB algorithm.")]
-  public partial class Algorithm {
-    protected Algorithm(Algorithm original, Cloner cloner)
-      : base(original, cloner) {
-      PlatformId = original.PlatformId;
-      AlgorithmClassId = original.AlgorithmClassId;
-    }
-    public Algorithm() {
-      Name = "New Algorithm";
-      PlatformId = 1;
-      AlgorithmClassId = 1;
-    }
-
-    public override IDeepCloneable Clone(Cloner cloner) {
-      return new Algorithm(this, cloner);
-    }
-  }
-}
Index: branches/OKB (trunk integration)/HeuristicLab.Clients.OKB/3.3/ServiceClients/AlgorithmClass.cs
===================================================================
--- branches/OKB (trunk integration)/HeuristicLab.Clients.OKB/3.3/ServiceClients/AlgorithmClass.cs	(revision 5504)
+++ 	(revision )
@@ -1,37 +1,0 @@
-﻿#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 HeuristicLab.Common;
-using HeuristicLab.Core;
-
-namespace HeuristicLab.Clients.OKB {
-  [Item("AlgorithmClass", "An OKB algorithm class.")]
-  public partial class AlgorithmClass {
-    protected AlgorithmClass(AlgorithmClass original, Cloner cloner) : base(original, cloner) { }
-    public AlgorithmClass() {
-      Name = "New Algorithm Class";
-    }
-
-    public override IDeepCloneable Clone(Cloner cloner) {
-      return new AlgorithmClass(this, cloner);
-    }
-  }
-}
Index: branches/OKB (trunk integration)/HeuristicLab.Clients.OKB/3.3/ServiceClients/INamedOKBItem.cs
===================================================================
--- branches/OKB (trunk integration)/HeuristicLab.Clients.OKB/3.3/ServiceClients/INamedOKBItem.cs	(revision 5504)
+++ 	(revision )
@@ -1,27 +1,0 @@
-#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 {
-  public interface INamedOKBItem : IOKBItem {
-    string Name { get; set; }
-    string Description { get; set; }
-  }
-}
Index: branches/OKB (trunk integration)/HeuristicLab.Clients.OKB/3.3/ServiceClients/IOKBItem.cs
===================================================================
--- branches/OKB (trunk integration)/HeuristicLab.Clients.OKB/3.3/ServiceClients/IOKBItem.cs	(revision 5504)
+++ 	(revision )
@@ -1,35 +1,0 @@
-#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.ComponentModel;
-using HeuristicLab.Core;
-
-namespace HeuristicLab.Clients.OKB {
-  public interface IOKBItem : IItem, INotifyPropertyChanged {
-    long Id { get; set; }
-    bool Modified { get; }
-
-    void Store();
-
-    event EventHandler ModifiedChanged;
-  }
-}
Index: branches/OKB (trunk integration)/HeuristicLab.Clients.OKB/3.3/ServiceClients/NamedOKBItem.cs
===================================================================
--- branches/OKB (trunk integration)/HeuristicLab.Clients.OKB/3.3/ServiceClients/NamedOKBItem.cs	(revision 5504)
+++ 	(revision )
@@ -1,53 +1,0 @@
-﻿#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.ComponentModel;
-using HeuristicLab.Common;
-using HeuristicLab.Core;
-
-namespace HeuristicLab.Clients.OKB {
-  [Item("NamedOKBItem", "Base class for all named OKB items.")]
-  public partial class NamedOKBItem : INamedOKBItem {
-    protected NamedOKBItem(NamedOKBItem original, Cloner cloner)
-      : base(original, cloner) {
-      Name = original.Name;
-      Description = original.Description;
-    }
-    public NamedOKBItem() {
-      Name = "New Item";
-      Description = string.Empty;
-    }
-
-    public override IDeepCloneable Clone(Cloner cloner) {
-      return new NamedOKBItem(this, cloner);
-    }
-
-    public override string ToString() {
-      return Name;
-    }
-
-    protected override void OnPropertyChanged(PropertyChangedEventArgs e) {
-      base.OnPropertyChanged(e);
-      if (e.PropertyName == "Name")
-        OnToStringChanged();
-    }
-  }
-}
Index: branches/OKB (trunk integration)/HeuristicLab.Clients.OKB/3.3/ServiceClients/OKBItem.cs
===================================================================
--- branches/OKB (trunk integration)/HeuristicLab.Clients.OKB/3.3/ServiceClients/OKBItem.cs	(revision 5504)
+++ 	(revision )
@@ -1,119 +1,0 @@
-#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.ComponentModel;
-using System.Drawing;
-using System.Runtime.Serialization;
-using HeuristicLab.Common;
-using HeuristicLab.Core;
-
-namespace HeuristicLab.Clients.OKB {
-  [Item("OKBItem", "Base class for all OKB items.")]
-  public partial class OKBItem : IOKBItem {
-    public virtual string ItemName {
-      get { return ItemAttribute.GetName(this.GetType()); }
-    }
-    public virtual string ItemDescription {
-      get { return ItemAttribute.GetDescription(this.GetType()); }
-    }
-    public Version ItemVersion {
-      get { return ItemAttribute.GetVersion(this.GetType()); }
-    }
-    public virtual Image ItemImage {
-      get {
-        if (Modified)
-          return HeuristicLab.Common.Resources.VSImageLibrary.DatabaseModified;
-        else
-          return HeuristicLab.Common.Resources.VSImageLibrary.Database;
-      }
-    }
-
-    private bool modified;
-    public bool Modified {
-      get { return modified; }
-      private set {
-        if (value != modified) {
-          modified = value;
-          OnModifiedChanged();
-          RaisePropertyChanged("Modified");
-          OnItemImageChanged();
-          RaisePropertyChanged("ItemImage");
-        }
-      }
-    }
-
-    protected OKBItem(OKBItem original, Cloner cloner) {
-      cloner.RegisterClonedObject(original, this);
-      modified = true;
-    }
-    protected OKBItem() {
-      modified = true;
-    }
-
-    [OnDeserialized]
-    private void OnDeserialized(StreamingContext context) {
-      modified = false;
-    }
-
-    public object Clone() {
-      return Clone(new Cloner());
-    }
-    public virtual IDeepCloneable Clone(Cloner cloner) {
-      return new OKBItem(this, cloner);
-    }
-
-    public override string ToString() {
-      return ItemName;
-    }
-
-    public void Store() {
-      if (OKBClient.Instance.Store(this))
-        Modified = false;
-    }
-
-    protected void RaisePropertyChanged(string propertyName) {
-      OnPropertyChanged(new PropertyChangedEventArgs(propertyName));
-      if ((propertyName != "Id") && (propertyName != "Modified") && (propertyName != "ItemImage")) {
-        Modified = true;
-      }
-    }
-    protected virtual void OnPropertyChanged(PropertyChangedEventArgs e) {
-      PropertyChangedEventHandler handler = PropertyChanged;
-      if (handler != null) handler(this, e);
-    }
-    public event EventHandler ModifiedChanged;
-    protected virtual void OnModifiedChanged() {
-      EventHandler handler = ModifiedChanged;
-      if (handler != null) handler(this, EventArgs.Empty);
-    }
-    public event EventHandler ItemImageChanged;
-    protected virtual void OnItemImageChanged() {
-      EventHandler handler = ItemImageChanged;
-      if (handler != null) handler(this, EventArgs.Empty);
-    }
-    public event EventHandler ToStringChanged;
-    protected virtual void OnToStringChanged() {
-      EventHandler handler = ToStringChanged;
-      if (handler != null) handler(this, EventArgs.Empty);
-    }
-  }
-}
Index: branches/OKB (trunk integration)/HeuristicLab.Clients.OKB/3.3/ServiceClients/Platform.cs
===================================================================
--- branches/OKB (trunk integration)/HeuristicLab.Clients.OKB/3.3/ServiceClients/Platform.cs	(revision 5504)
+++ 	(revision )
@@ -1,37 +1,0 @@
-﻿#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 HeuristicLab.Common;
-using HeuristicLab.Core;
-
-namespace HeuristicLab.Clients.OKB {
-  [Item("Platform", "An OKB platform.")]
-  public partial class Platform {
-    protected Platform(Platform original, Cloner cloner) : base(original, cloner) { }
-    public Platform() {
-      Name = "New Platform";
-    }
-
-    public override IDeepCloneable Clone(Cloner cloner) {
-      return new Platform(this, cloner);
-    }
-  }
-}
Index: branches/OKB (trunk integration)/HeuristicLab.Clients.OKB/3.3/ServiceClients/Problem.cs
===================================================================
--- branches/OKB (trunk integration)/HeuristicLab.Clients.OKB/3.3/ServiceClients/Problem.cs	(revision 5504)
+++ 	(revision )
@@ -1,43 +1,0 @@
-﻿#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 HeuristicLab.Common;
-using HeuristicLab.Core;
-
-namespace HeuristicLab.Clients.OKB {
-  [Item("Problem", "An OKB problem.")]
-  public partial class Problem {
-    protected Problem(Problem original, Cloner cloner)
-      : base(original, cloner) {
-      PlatformId = original.PlatformId;
-      ProblemClassId = original.ProblemClassId;
-    }
-    public Problem() {
-      Name = "New Problem";
-      PlatformId = 1;
-      ProblemClassId = 1;
-    }
-
-    public override IDeepCloneable Clone(Cloner cloner) {
-      return new Problem(this, cloner);
-    }
-  }
-}
Index: branches/OKB (trunk integration)/HeuristicLab.Clients.OKB/3.3/ServiceClients/ProblemClass.cs
===================================================================
--- branches/OKB (trunk integration)/HeuristicLab.Clients.OKB/3.3/ServiceClients/ProblemClass.cs	(revision 5504)
+++ 	(revision )
@@ -1,37 +1,0 @@
-﻿#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 HeuristicLab.Common;
-using HeuristicLab.Core;
-
-namespace HeuristicLab.Clients.OKB {
-  [Item("ProblemClass", "An OKB problem class.")]
-  public partial class ProblemClass {
-    protected ProblemClass(ProblemClass original, Cloner cloner) : base(original, cloner) { }
-    public ProblemClass() {
-      Name = "New Problem Class";
-    }
-
-    public override IDeepCloneable Clone(Cloner cloner) {
-      return new ProblemClass(this, cloner);
-    }
-  }
-}
Index: branches/OKB (trunk integration)/HeuristicLab.Clients.OKB/3.3/Views/AdministratorView.Designer.cs
===================================================================
--- branches/OKB (trunk integration)/HeuristicLab.Clients.OKB/3.3/Views/AdministratorView.Designer.cs	(revision 5504)
+++ 	(revision )
@@ -1,280 +1,0 @@
-#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 {
-  partial class AdministratorView {
-    /// <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() {
-      this.components = new System.ComponentModel.Container();
-      this.tabControl = new System.Windows.Forms.TabControl();
-      this.platformsTabPage = new System.Windows.Forms.TabPage();
-      this.platformCollectionView = new HeuristicLab.Clients.OKB.PlatformCollectionView();
-      this.dataTypesTabPage = new System.Windows.Forms.TabPage();
-      this.dataTypeCollectionView = new HeuristicLab.Clients.OKB.DataTypeCollectionView();
-      this.algorithmClassesTabPage = new System.Windows.Forms.TabPage();
-      this.algorithmClassCollectionView = new HeuristicLab.Clients.OKB.AlgorithmClassCollectionView();
-      this.algorithmsTabPage = new System.Windows.Forms.TabPage();
-      this.algorithmCollectionView = new HeuristicLab.Clients.OKB.AlgorithmCollectionView();
-      this.problemClassesTabPage = new System.Windows.Forms.TabPage();
-      this.problemsTabPage = new System.Windows.Forms.TabPage();
-      this.refreshButton = new System.Windows.Forms.Button();
-      this.toolTip = new System.Windows.Forms.ToolTip(this.components);
-      this.problemClassCollectionView = new HeuristicLab.Clients.OKB.ProblemClassCollectionView();
-      this.problemCollectionView = new HeuristicLab.Clients.OKB.ProblemCollectionView();
-      this.tabControl.SuspendLayout();
-      this.platformsTabPage.SuspendLayout();
-      this.dataTypesTabPage.SuspendLayout();
-      this.algorithmClassesTabPage.SuspendLayout();
-      this.algorithmsTabPage.SuspendLayout();
-      this.problemClassesTabPage.SuspendLayout();
-      this.problemsTabPage.SuspendLayout();
-      this.SuspendLayout();
-      // 
-      // tabControl
-      // 
-      this.tabControl.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.tabControl.Controls.Add(this.platformsTabPage);
-      this.tabControl.Controls.Add(this.dataTypesTabPage);
-      this.tabControl.Controls.Add(this.algorithmClassesTabPage);
-      this.tabControl.Controls.Add(this.algorithmsTabPage);
-      this.tabControl.Controls.Add(this.problemClassesTabPage);
-      this.tabControl.Controls.Add(this.problemsTabPage);
-      this.tabControl.Location = new System.Drawing.Point(0, 29);
-      this.tabControl.Name = "tabControl";
-      this.tabControl.SelectedIndex = 0;
-      this.tabControl.Size = new System.Drawing.Size(727, 406);
-      this.tabControl.TabIndex = 1;
-      // 
-      // platformsTabPage
-      // 
-      this.platformsTabPage.Controls.Add(this.platformCollectionView);
-      this.platformsTabPage.Location = new System.Drawing.Point(4, 22);
-      this.platformsTabPage.Name = "platformsTabPage";
-      this.platformsTabPage.Padding = new System.Windows.Forms.Padding(3);
-      this.platformsTabPage.Size = new System.Drawing.Size(719, 380);
-      this.platformsTabPage.TabIndex = 2;
-      this.platformsTabPage.Text = "Platforms";
-      this.platformsTabPage.UseVisualStyleBackColor = true;
-      // 
-      // platformCollectionView
-      // 
-      this.platformCollectionView.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.platformCollectionView.Caption = "PlatformCollection View";
-      this.platformCollectionView.Content = null;
-      this.platformCollectionView.Location = new System.Drawing.Point(3, 3);
-      this.platformCollectionView.Name = "platformCollectionView";
-      this.platformCollectionView.ReadOnly = false;
-      this.platformCollectionView.Size = new System.Drawing.Size(713, 374);
-      this.platformCollectionView.TabIndex = 0;
-      // 
-      // dataTypesTabPage
-      // 
-      this.dataTypesTabPage.Controls.Add(this.dataTypeCollectionView);
-      this.dataTypesTabPage.Location = new System.Drawing.Point(4, 22);
-      this.dataTypesTabPage.Name = "dataTypesTabPage";
-      this.dataTypesTabPage.Padding = new System.Windows.Forms.Padding(3);
-      this.dataTypesTabPage.Size = new System.Drawing.Size(719, 380);
-      this.dataTypesTabPage.TabIndex = 3;
-      this.dataTypesTabPage.Text = "Data Types";
-      this.dataTypesTabPage.UseVisualStyleBackColor = true;
-      // 
-      // dataTypeCollectionView
-      // 
-      this.dataTypeCollectionView.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.dataTypeCollectionView.Caption = "DataTypeCollection View";
-      this.dataTypeCollectionView.Content = null;
-      this.dataTypeCollectionView.Location = new System.Drawing.Point(3, 3);
-      this.dataTypeCollectionView.Name = "dataTypeCollectionView";
-      this.dataTypeCollectionView.ReadOnly = false;
-      this.dataTypeCollectionView.Size = new System.Drawing.Size(713, 374);
-      this.dataTypeCollectionView.TabIndex = 0;
-      // 
-      // algorithmClassesTabPage
-      // 
-      this.algorithmClassesTabPage.Controls.Add(this.algorithmClassCollectionView);
-      this.algorithmClassesTabPage.Location = new System.Drawing.Point(4, 22);
-      this.algorithmClassesTabPage.Name = "algorithmClassesTabPage";
-      this.algorithmClassesTabPage.Padding = new System.Windows.Forms.Padding(3);
-      this.algorithmClassesTabPage.Size = new System.Drawing.Size(719, 380);
-      this.algorithmClassesTabPage.TabIndex = 0;
-      this.algorithmClassesTabPage.Text = "Algorithm Classes";
-      this.algorithmClassesTabPage.UseVisualStyleBackColor = true;
-      // 
-      // algorithmClassCollectionView
-      // 
-      this.algorithmClassCollectionView.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.algorithmClassCollectionView.Caption = "AlgorithmClassCollection View";
-      this.algorithmClassCollectionView.Content = null;
-      this.algorithmClassCollectionView.Location = new System.Drawing.Point(3, 3);
-      this.algorithmClassCollectionView.Name = "algorithmClassCollectionView";
-      this.algorithmClassCollectionView.ReadOnly = false;
-      this.algorithmClassCollectionView.Size = new System.Drawing.Size(713, 374);
-      this.algorithmClassCollectionView.TabIndex = 0;
-      // 
-      // algorithmsTabPage
-      // 
-      this.algorithmsTabPage.Controls.Add(this.algorithmCollectionView);
-      this.algorithmsTabPage.Location = new System.Drawing.Point(4, 22);
-      this.algorithmsTabPage.Name = "algorithmsTabPage";
-      this.algorithmsTabPage.Padding = new System.Windows.Forms.Padding(3);
-      this.algorithmsTabPage.Size = new System.Drawing.Size(719, 380);
-      this.algorithmsTabPage.TabIndex = 1;
-      this.algorithmsTabPage.Text = "Algorithms";
-      this.algorithmsTabPage.UseVisualStyleBackColor = true;
-      // 
-      // algorithmCollectionView
-      // 
-      this.algorithmCollectionView.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.algorithmCollectionView.Caption = "AlgorithmCollection View";
-      this.algorithmCollectionView.Content = null;
-      this.algorithmCollectionView.Location = new System.Drawing.Point(3, 3);
-      this.algorithmCollectionView.Name = "algorithmCollectionView";
-      this.algorithmCollectionView.ReadOnly = false;
-      this.algorithmCollectionView.Size = new System.Drawing.Size(713, 374);
-      this.algorithmCollectionView.TabIndex = 0;
-      // 
-      // problemClassesTabPage
-      // 
-      this.problemClassesTabPage.Controls.Add(this.problemClassCollectionView);
-      this.problemClassesTabPage.Location = new System.Drawing.Point(4, 22);
-      this.problemClassesTabPage.Name = "problemClassesTabPage";
-      this.problemClassesTabPage.Size = new System.Drawing.Size(719, 380);
-      this.problemClassesTabPage.TabIndex = 4;
-      this.problemClassesTabPage.Text = "Problem Classes";
-      this.problemClassesTabPage.UseVisualStyleBackColor = true;
-      // 
-      // problemsTabPage
-      // 
-      this.problemsTabPage.Controls.Add(this.problemCollectionView);
-      this.problemsTabPage.Location = new System.Drawing.Point(4, 22);
-      this.problemsTabPage.Name = "problemsTabPage";
-      this.problemsTabPage.Size = new System.Drawing.Size(719, 380);
-      this.problemsTabPage.TabIndex = 5;
-      this.problemsTabPage.Text = "Problems";
-      this.problemsTabPage.UseVisualStyleBackColor = true;
-      // 
-      // refreshButton
-      // 
-      this.refreshButton.Image = HeuristicLab.Common.Resources.VSImageLibrary.Refresh;
-      this.refreshButton.Location = new System.Drawing.Point(0, 0);
-      this.refreshButton.Name = "refreshButton";
-      this.refreshButton.Size = new System.Drawing.Size(24, 24);
-      this.refreshButton.TabIndex = 0;
-      this.toolTip.SetToolTip(this.refreshButton, "Refresh Data");
-      this.refreshButton.UseVisualStyleBackColor = true;
-      this.refreshButton.Click += new System.EventHandler(this.refreshButton_Click);
-      // 
-      // problemClassCollectionView
-      // 
-      this.problemClassCollectionView.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.problemClassCollectionView.Caption = "ProblemClassCollection View";
-      this.problemClassCollectionView.Content = null;
-      this.problemClassCollectionView.Location = new System.Drawing.Point(3, 3);
-      this.problemClassCollectionView.Name = "problemClassCollectionView";
-      this.problemClassCollectionView.ReadOnly = false;
-      this.problemClassCollectionView.Size = new System.Drawing.Size(713, 374);
-      this.problemClassCollectionView.TabIndex = 0;
-      // 
-      // problemCollectionView
-      // 
-      this.problemCollectionView.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.problemCollectionView.Caption = "ProblemCollection View";
-      this.problemCollectionView.Content = null;
-      this.problemCollectionView.Location = new System.Drawing.Point(3, 3);
-      this.problemCollectionView.Name = "problemCollectionView";
-      this.problemCollectionView.ReadOnly = false;
-      this.problemCollectionView.Size = new System.Drawing.Size(713, 374);
-      this.problemCollectionView.TabIndex = 0;
-      // 
-      // AdministratorView
-      // 
-      this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
-      this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
-      this.Controls.Add(this.tabControl);
-      this.Controls.Add(this.refreshButton);
-      this.Name = "AdministratorView";
-      this.Size = new System.Drawing.Size(727, 435);
-      this.tabControl.ResumeLayout(false);
-      this.platformsTabPage.ResumeLayout(false);
-      this.dataTypesTabPage.ResumeLayout(false);
-      this.algorithmClassesTabPage.ResumeLayout(false);
-      this.algorithmsTabPage.ResumeLayout(false);
-      this.problemClassesTabPage.ResumeLayout(false);
-      this.problemsTabPage.ResumeLayout(false);
-      this.ResumeLayout(false);
-
-    }
-
-    #endregion
-
-    private System.Windows.Forms.TabControl tabControl;
-    private System.Windows.Forms.TabPage algorithmClassesTabPage;
-    private System.Windows.Forms.TabPage algorithmsTabPage;
-    private System.Windows.Forms.Button refreshButton;
-    private AlgorithmClassCollectionView algorithmClassCollectionView;
-    private AlgorithmCollectionView algorithmCollectionView;
-    private System.Windows.Forms.ToolTip toolTip;
-    private System.Windows.Forms.TabPage platformsTabPage;
-    private PlatformCollectionView platformCollectionView;
-    private System.Windows.Forms.TabPage dataTypesTabPage;
-    private DataTypeCollectionView dataTypeCollectionView;
-    private System.Windows.Forms.TabPage problemClassesTabPage;
-    private System.Windows.Forms.TabPage problemsTabPage;
-    private ProblemClassCollectionView problemClassCollectionView;
-    private ProblemCollectionView problemCollectionView;
-
-  }
-}
Index: branches/OKB (trunk integration)/HeuristicLab.Clients.OKB/3.3/Views/AdministratorView.cs
===================================================================
--- branches/OKB (trunk integration)/HeuristicLab.Clients.OKB/3.3/Views/AdministratorView.cs	(revision 5504)
+++ 	(revision )
@@ -1,111 +1,0 @@
-#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.MainForm;
-using HeuristicLab.MainForm.WindowsForms;
-
-namespace HeuristicLab.Clients.OKB {
-  [View("OKB Administrator")]
-  [Content(typeof(OKBClient), true)]
-  public sealed partial class AdministratorView : AsynchronousContentView {
-    public new OKBClient Content {
-      get { return (OKBClient)base.Content; }
-      set { base.Content = value; }
-    }
-
-    public AdministratorView() {
-      InitializeComponent();
-    }
-
-    protected override void DeregisterContentEvents() {
-      Content.Refreshing -= new EventHandler(Content_Refreshing);
-      Content.Refreshed -= new EventHandler(Content_Refreshed);
-      base.DeregisterContentEvents();
-    }
-
-    protected override void RegisterContentEvents() {
-      base.RegisterContentEvents();
-      Content.Refreshing += new EventHandler(Content_Refreshing);
-      Content.Refreshed += new EventHandler(Content_Refreshed);
-    }
-
-    protected override void OnContentChanged() {
-      base.OnContentChanged();
-      if (Content == null) {
-        platformCollectionView.Content = null;
-        dataTypeCollectionView.Content = null;
-        algorithmClassCollectionView.Content = null;
-        algorithmCollectionView.Content = null;
-        problemClassCollectionView.Content = null;
-        problemCollectionView.Content = null;
-      } else {
-        platformCollectionView.Content = Content.Platforms;
-        dataTypeCollectionView.Content = Content.DataTypes;
-        algorithmClassCollectionView.Content = Content.AlgorithmClasses;
-        algorithmCollectionView.Content = Content.Algorithms;
-        problemClassCollectionView.Content = Content.ProblemClasses;
-        problemCollectionView.Content = Content.Problems;
-      }
-    }
-
-    protected override void SetEnabledStateOfControls() {
-      base.SetEnabledStateOfControls();
-      refreshButton.Enabled = Content != null;
-      platformCollectionView.Enabled = Content != null;
-      dataTypeCollectionView.Enabled = Content != null;
-      algorithmClassCollectionView.Enabled = Content != null;
-      algorithmCollectionView.Enabled = Content != null;
-      problemClassCollectionView.Enabled = Content != null;
-      problemCollectionView.Enabled = Content != null;
-    }
-
-    private void Content_Refreshing(object sender, EventArgs e) {
-      if (InvokeRequired) {
-        Invoke(new EventHandler(Content_Refreshing), sender, e);
-      } else {
-        Cursor = Cursors.AppStarting;
-        refreshButton.Enabled = false;
-        tabControl.Enabled = false;
-      }
-    }
-    private void Content_Refreshed(object sender, EventArgs e) {
-      if (InvokeRequired) {
-        Invoke(new EventHandler(Content_Refreshed), sender, e);
-      } else {
-        platformCollectionView.Content = Content.Platforms;
-        dataTypeCollectionView.Content = Content.DataTypes;
-        algorithmClassCollectionView.Content = Content.AlgorithmClasses;
-        algorithmCollectionView.Content = Content.Algorithms;
-        problemClassCollectionView.Content = Content.ProblemClasses;
-        problemCollectionView.Content = Content.Problems;
-        refreshButton.Enabled = true;
-        tabControl.Enabled = true;
-        Cursor = Cursors.Default;
-      }
-    }
-
-    private void refreshButton_Click(object sender, EventArgs e) {
-      Content.Refresh();
-    }
-  }
-}
Index: branches/OKB (trunk integration)/HeuristicLab.Clients.OKB/3.3/Views/AlgorithmClassCollectionView.Designer.cs
===================================================================
--- branches/OKB (trunk integration)/HeuristicLab.Clients.OKB/3.3/Views/AlgorithmClassCollectionView.Designer.cs	(revision 5504)
+++ 	(revision )
@@ -1,53 +1,0 @@
-﻿#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 {
-  partial class AlgorithmClassCollectionView {
-    /// <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/Views/AlgorithmClassCollectionView.cs
===================================================================
--- branches/OKB (trunk integration)/HeuristicLab.Clients.OKB/3.3/Views/AlgorithmClassCollectionView.cs	(revision 5504)
+++ 	(revision )
@@ -1,40 +1,0 @@
-﻿#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.Windows.Forms;
-using HeuristicLab.Core;
-using HeuristicLab.Core.Views;
-using HeuristicLab.MainForm;
-
-namespace HeuristicLab.Clients.OKB {
-  [View("AlgorithmClassCollection View")]
-  [Content(typeof(IItemCollection<AlgorithmClass>), true)]
-  public partial class AlgorithmClassCollectionView : ItemCollectionView<AlgorithmClass> {
-    public AlgorithmClassCollectionView() {
-      InitializeComponent();
-      itemsGroupBox.Text = "Algorithm Classes";
-    }
-
-    protected override AlgorithmClass CreateItem() {
-      return new AlgorithmClass();
-    }
-  }
-}
Index: branches/OKB (trunk integration)/HeuristicLab.Clients.OKB/3.3/Views/AlgorithmCollectionView.Designer.cs
===================================================================
--- branches/OKB (trunk integration)/HeuristicLab.Clients.OKB/3.3/Views/AlgorithmCollectionView.Designer.cs	(revision 5504)
+++ 	(revision )
@@ -1,53 +1,0 @@
-﻿#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 {
-  partial class AlgorithmCollectionView {
-    /// <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/Views/AlgorithmCollectionView.cs
===================================================================
--- branches/OKB (trunk integration)/HeuristicLab.Clients.OKB/3.3/Views/AlgorithmCollectionView.cs	(revision 5504)
+++ 	(revision )
@@ -1,40 +1,0 @@
-﻿#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.Windows.Forms;
-using HeuristicLab.Core;
-using HeuristicLab.Core.Views;
-using HeuristicLab.MainForm;
-
-namespace HeuristicLab.Clients.OKB {
-  [View("AlgorithmCollection View")]
-  [Content(typeof(IItemCollection<Algorithm>), true)]
-  public partial class AlgorithmCollectionView : ItemCollectionView<Algorithm> {
-    public AlgorithmCollectionView() {
-      InitializeComponent();
-      itemsGroupBox.Text = "Algorithms";
-    }
-
-    protected override Algorithm CreateItem() {
-      return new Algorithm();
-    }
-  }
-}
Index: branches/OKB (trunk integration)/HeuristicLab.Clients.OKB/3.3/Views/AlgorithmView.Designer.cs
===================================================================
--- branches/OKB (trunk integration)/HeuristicLab.Clients.OKB/3.3/Views/AlgorithmView.Designer.cs	(revision 5504)
+++ 	(revision )
@@ -1,381 +1,0 @@
-#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 {
-  partial class AlgorithmView {
-    /// <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() {
-      this.platformLabel = new System.Windows.Forms.Label();
-      this.platformComboBox = new System.Windows.Forms.ComboBox();
-      this.algorithmClassLabel = new System.Windows.Forms.Label();
-      this.algorithmClassComboBox = new System.Windows.Forms.ComboBox();
-      this.usersListBox = new System.Windows.Forms.ListBox();
-      this.tabControl = new System.Windows.Forms.TabControl();
-      this.usersTabPage = new System.Windows.Forms.TabPage();
-      this.storeUsersButton = new System.Windows.Forms.Button();
-      this.refreshUsersButton = new System.Windows.Forms.Button();
-      this.dataTabPage = new System.Windows.Forms.TabPage();
-      this.algorithmDataView = new HeuristicLab.Clients.OKB.AlgorithmDataView();
-      this.parametersTabPage = new System.Windows.Forms.TabPage();
-      this.algorithmParameterCollectionView = new HeuristicLab.Clients.OKB.AlgorithmParameterCollectionView();
-      this.refreshParametersButton = new System.Windows.Forms.Button();
-      this.resultsTabPage = new System.Windows.Forms.TabPage();
-      this.resultCollectionView = new HeuristicLab.Clients.OKB.ResultCollectionView();
-      this.refreshResultsButton = new System.Windows.Forms.Button();
-      this.experimentsTabPage = new System.Windows.Forms.TabPage();
-      this.refreshExperimentsButton = new System.Windows.Forms.Button();
-      this.experimentCollectionView = new HeuristicLab.Clients.OKB.ExperimentCollectionView();
-      this.tabControl.SuspendLayout();
-      this.usersTabPage.SuspendLayout();
-      this.dataTabPage.SuspendLayout();
-      this.parametersTabPage.SuspendLayout();
-      this.resultsTabPage.SuspendLayout();
-      this.experimentsTabPage.SuspendLayout();
-      this.SuspendLayout();
-      // 
-      // nameTextBox
-      // 
-      this.nameTextBox.Location = new System.Drawing.Point(90, 29);
-      this.nameTextBox.Size = new System.Drawing.Size(543, 20);
-      // 
-      // descriptionTextBox
-      // 
-      this.descriptionTextBox.Location = new System.Drawing.Point(90, 55);
-      this.descriptionTextBox.Size = new System.Drawing.Size(543, 20);
-      // 
-      // storeButton
-      // 
-      this.toolTip.SetToolTip(this.storeButton, "Store Data");
-      // 
-      // platformLabel
-      // 
-      this.platformLabel.AutoSize = true;
-      this.platformLabel.Location = new System.Drawing.Point(3, 84);
-      this.platformLabel.Name = "platformLabel";
-      this.platformLabel.Size = new System.Drawing.Size(48, 13);
-      this.platformLabel.TabIndex = 5;
-      this.platformLabel.Text = "&Platform:";
-      // 
-      // platformComboBox
-      // 
-      this.platformComboBox.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
-                  | System.Windows.Forms.AnchorStyles.Right)));
-      this.platformComboBox.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList;
-      this.platformComboBox.FormattingEnabled = true;
-      this.platformComboBox.Location = new System.Drawing.Point(90, 81);
-      this.platformComboBox.Name = "platformComboBox";
-      this.platformComboBox.Size = new System.Drawing.Size(543, 21);
-      this.platformComboBox.TabIndex = 6;
-      this.platformComboBox.SelectedValueChanged += new System.EventHandler(this.platformComboBox_SelectedValueChanged);
-      // 
-      // algorithmClassLabel
-      // 
-      this.algorithmClassLabel.AutoSize = true;
-      this.algorithmClassLabel.Location = new System.Drawing.Point(3, 111);
-      this.algorithmClassLabel.Name = "algorithmClassLabel";
-      this.algorithmClassLabel.Size = new System.Drawing.Size(81, 13);
-      this.algorithmClassLabel.TabIndex = 7;
-      this.algorithmClassLabel.Text = "&Algorithm Class:";
-      // 
-      // algorithmClassComboBox
-      // 
-      this.algorithmClassComboBox.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
-                  | System.Windows.Forms.AnchorStyles.Right)));
-      this.algorithmClassComboBox.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList;
-      this.algorithmClassComboBox.FormattingEnabled = true;
-      this.algorithmClassComboBox.Location = new System.Drawing.Point(90, 108);
-      this.algorithmClassComboBox.Name = "algorithmClassComboBox";
-      this.algorithmClassComboBox.Size = new System.Drawing.Size(543, 21);
-      this.algorithmClassComboBox.TabIndex = 8;
-      this.algorithmClassComboBox.SelectedValueChanged += new System.EventHandler(this.algorithmClassComboBox_SelectedValueChanged);
-      // 
-      // usersListBox
-      // 
-      this.usersListBox.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.usersListBox.Enabled = false;
-      this.usersListBox.FormattingEnabled = true;
-      this.usersListBox.Location = new System.Drawing.Point(6, 36);
-      this.usersListBox.Name = "usersListBox";
-      this.usersListBox.SelectionMode = System.Windows.Forms.SelectionMode.MultiSimple;
-      this.usersListBox.Size = new System.Drawing.Size(613, 225);
-      this.usersListBox.TabIndex = 2;
-      this.usersListBox.SelectedIndexChanged += new System.EventHandler(this.usersListBox_SelectedIndexChanged);
-      // 
-      // tabControl
-      // 
-      this.tabControl.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.tabControl.Controls.Add(this.usersTabPage);
-      this.tabControl.Controls.Add(this.dataTabPage);
-      this.tabControl.Controls.Add(this.parametersTabPage);
-      this.tabControl.Controls.Add(this.resultsTabPage);
-      this.tabControl.Controls.Add(this.experimentsTabPage);
-      this.tabControl.Location = new System.Drawing.Point(0, 162);
-      this.tabControl.Name = "tabControl";
-      this.tabControl.SelectedIndex = 0;
-      this.tabControl.Size = new System.Drawing.Size(633, 292);
-      this.tabControl.TabIndex = 9;
-      // 
-      // usersTabPage
-      // 
-      this.usersTabPage.Controls.Add(this.storeUsersButton);
-      this.usersTabPage.Controls.Add(this.refreshUsersButton);
-      this.usersTabPage.Controls.Add(this.usersListBox);
-      this.usersTabPage.Location = new System.Drawing.Point(4, 22);
-      this.usersTabPage.Name = "usersTabPage";
-      this.usersTabPage.Padding = new System.Windows.Forms.Padding(3);
-      this.usersTabPage.Size = new System.Drawing.Size(625, 266);
-      this.usersTabPage.TabIndex = 0;
-      this.usersTabPage.Text = "Authorized Users";
-      this.usersTabPage.UseVisualStyleBackColor = true;
-      // 
-      // storeUsersButton
-      // 
-      this.storeUsersButton.Image = HeuristicLab.Common.Resources.VSImageLibrary.PublishToWeb;
-      this.storeUsersButton.Location = new System.Drawing.Point(36, 6);
-      this.storeUsersButton.Name = "storeUsersButton";
-      this.storeUsersButton.Size = new System.Drawing.Size(24, 24);
-      this.storeUsersButton.TabIndex = 1;
-      this.toolTip.SetToolTip(this.storeUsersButton, "Store Authorized Users");
-      this.storeUsersButton.UseVisualStyleBackColor = true;
-      this.storeUsersButton.Click += new System.EventHandler(this.storeUsersButton_Click);
-      // 
-      // refreshUsersButton
-      // 
-      this.refreshUsersButton.Image = HeuristicLab.Common.Resources.VSImageLibrary.Refresh;
-      this.refreshUsersButton.Location = new System.Drawing.Point(6, 6);
-      this.refreshUsersButton.Name = "refreshUsersButton";
-      this.refreshUsersButton.Size = new System.Drawing.Size(24, 24);
-      this.refreshUsersButton.TabIndex = 0;
-      this.toolTip.SetToolTip(this.refreshUsersButton, "Refresh Authorized Users");
-      this.refreshUsersButton.UseVisualStyleBackColor = true;
-      this.refreshUsersButton.Click += new System.EventHandler(this.refreshUsersButton_Click);
-      // 
-      // dataTabPage
-      // 
-      this.dataTabPage.Controls.Add(this.algorithmDataView);
-      this.dataTabPage.Location = new System.Drawing.Point(4, 22);
-      this.dataTabPage.Name = "dataTabPage";
-      this.dataTabPage.Padding = new System.Windows.Forms.Padding(3);
-      this.dataTabPage.Size = new System.Drawing.Size(625, 266);
-      this.dataTabPage.TabIndex = 1;
-      this.dataTabPage.Text = "Platform-Specific Algorithm Data";
-      this.dataTabPage.UseVisualStyleBackColor = true;
-      // 
-      // algorithmDataView
-      // 
-      this.algorithmDataView.AlgorithmId = ((long)(0));
-      this.algorithmDataView.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.algorithmDataView.Caption = "AlgorithmData View";
-      this.algorithmDataView.Content = null;
-      this.algorithmDataView.Location = new System.Drawing.Point(6, 6);
-      this.algorithmDataView.Name = "algorithmDataView";
-      this.algorithmDataView.ReadOnly = false;
-      this.algorithmDataView.Size = new System.Drawing.Size(613, 254);
-      this.algorithmDataView.TabIndex = 0;
-      // 
-      // parametersTabPage
-      // 
-      this.parametersTabPage.Controls.Add(this.algorithmParameterCollectionView);
-      this.parametersTabPage.Controls.Add(this.refreshParametersButton);
-      this.parametersTabPage.Location = new System.Drawing.Point(4, 22);
-      this.parametersTabPage.Name = "parametersTabPage";
-      this.parametersTabPage.Padding = new System.Windows.Forms.Padding(3);
-      this.parametersTabPage.Size = new System.Drawing.Size(625, 266);
-      this.parametersTabPage.TabIndex = 2;
-      this.parametersTabPage.Text = "Parameters";
-      this.parametersTabPage.UseVisualStyleBackColor = true;
-      // 
-      // algorithmParameterCollectionView
-      // 
-      this.algorithmParameterCollectionView.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.algorithmParameterCollectionView.Caption = "AlgorithmParameterCollection View";
-      this.algorithmParameterCollectionView.Content = null;
-      this.algorithmParameterCollectionView.Location = new System.Drawing.Point(6, 36);
-      this.algorithmParameterCollectionView.Name = "algorithmParameterCollectionView";
-      this.algorithmParameterCollectionView.ReadOnly = false;
-      this.algorithmParameterCollectionView.Size = new System.Drawing.Size(613, 224);
-      this.algorithmParameterCollectionView.TabIndex = 1;
-      // 
-      // refreshParametersButton
-      // 
-      this.refreshParametersButton.Image = HeuristicLab.Common.Resources.VSImageLibrary.Refresh;
-      this.refreshParametersButton.Location = new System.Drawing.Point(6, 6);
-      this.refreshParametersButton.Name = "refreshParametersButton";
-      this.refreshParametersButton.Size = new System.Drawing.Size(24, 24);
-      this.refreshParametersButton.TabIndex = 0;
-      this.refreshParametersButton.UseVisualStyleBackColor = true;
-      this.refreshParametersButton.Click += new System.EventHandler(this.refreshParametersButton_Click);
-      // 
-      // resultsTabPage
-      // 
-      this.resultsTabPage.Controls.Add(this.resultCollectionView);
-      this.resultsTabPage.Controls.Add(this.refreshResultsButton);
-      this.resultsTabPage.Location = new System.Drawing.Point(4, 22);
-      this.resultsTabPage.Name = "resultsTabPage";
-      this.resultsTabPage.Padding = new System.Windows.Forms.Padding(3);
-      this.resultsTabPage.Size = new System.Drawing.Size(625, 266);
-      this.resultsTabPage.TabIndex = 3;
-      this.resultsTabPage.Text = "Results";
-      this.resultsTabPage.UseVisualStyleBackColor = true;
-      // 
-      // resultCollectionView
-      // 
-      this.resultCollectionView.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.resultCollectionView.Caption = "ResultCollection View";
-      this.resultCollectionView.Content = null;
-      this.resultCollectionView.Location = new System.Drawing.Point(6, 36);
-      this.resultCollectionView.Name = "resultCollectionView";
-      this.resultCollectionView.ReadOnly = false;
-      this.resultCollectionView.Size = new System.Drawing.Size(613, 224);
-      this.resultCollectionView.TabIndex = 1;
-      // 
-      // refreshResultsButton
-      // 
-      this.refreshResultsButton.Image = HeuristicLab.Common.Resources.VSImageLibrary.Refresh;
-      this.refreshResultsButton.Location = new System.Drawing.Point(6, 6);
-      this.refreshResultsButton.Name = "refreshResultsButton";
-      this.refreshResultsButton.Size = new System.Drawing.Size(24, 24);
-      this.refreshResultsButton.TabIndex = 0;
-      this.refreshResultsButton.UseVisualStyleBackColor = true;
-      this.refreshResultsButton.Click += new System.EventHandler(this.refreshResultsButton_Click);
-      // 
-      // experimentsTabPage
-      // 
-      this.experimentsTabPage.Controls.Add(this.experimentCollectionView);
-      this.experimentsTabPage.Controls.Add(this.refreshExperimentsButton);
-      this.experimentsTabPage.Location = new System.Drawing.Point(4, 22);
-      this.experimentsTabPage.Name = "experimentsTabPage";
-      this.experimentsTabPage.Padding = new System.Windows.Forms.Padding(3);
-      this.experimentsTabPage.Size = new System.Drawing.Size(625, 266);
-      this.experimentsTabPage.TabIndex = 4;
-      this.experimentsTabPage.Text = "Experiments";
-      this.experimentsTabPage.UseVisualStyleBackColor = true;
-      // 
-      // refreshExperimentsButton
-      // 
-      this.refreshExperimentsButton.Image = HeuristicLab.Common.Resources.VSImageLibrary.Refresh;
-      this.refreshExperimentsButton.Location = new System.Drawing.Point(6, 6);
-      this.refreshExperimentsButton.Name = "refreshExperimentsButton";
-      this.refreshExperimentsButton.Size = new System.Drawing.Size(24, 24);
-      this.refreshExperimentsButton.TabIndex = 0;
-      this.refreshExperimentsButton.UseVisualStyleBackColor = true;
-      this.refreshExperimentsButton.Click += new System.EventHandler(this.refreshExperimentsButton_Click);
-      // 
-      // experimentCollectionView
-      // 
-      this.experimentCollectionView.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.experimentCollectionView.Caption = "ExperimentCollection View";
-      this.experimentCollectionView.Content = null;
-      this.experimentCollectionView.Location = new System.Drawing.Point(6, 36);
-      this.experimentCollectionView.Name = "experimentCollectionView";
-      this.experimentCollectionView.ReadOnly = false;
-      this.experimentCollectionView.Size = new System.Drawing.Size(613, 224);
-      this.experimentCollectionView.TabIndex = 1;
-      // 
-      // AlgorithmView
-      // 
-      this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
-      this.Controls.Add(this.tabControl);
-      this.Controls.Add(this.platformComboBox);
-      this.Controls.Add(this.platformLabel);
-      this.Controls.Add(this.algorithmClassComboBox);
-      this.Controls.Add(this.algorithmClassLabel);
-      this.Name = "AlgorithmView";
-      this.Size = new System.Drawing.Size(633, 454);
-      this.Controls.SetChildIndex(this.algorithmClassLabel, 0);
-      this.Controls.SetChildIndex(this.algorithmClassComboBox, 0);
-      this.Controls.SetChildIndex(this.platformLabel, 0);
-      this.Controls.SetChildIndex(this.platformComboBox, 0);
-      this.Controls.SetChildIndex(this.tabControl, 0);
-      this.Controls.SetChildIndex(this.storeButton, 0);
-      this.Controls.SetChildIndex(this.nameTextBox, 0);
-      this.Controls.SetChildIndex(this.nameLabel, 0);
-      this.Controls.SetChildIndex(this.descriptionLabel, 0);
-      this.Controls.SetChildIndex(this.descriptionTextBox, 0);
-      this.tabControl.ResumeLayout(false);
-      this.usersTabPage.ResumeLayout(false);
-      this.dataTabPage.ResumeLayout(false);
-      this.parametersTabPage.ResumeLayout(false);
-      this.resultsTabPage.ResumeLayout(false);
-      this.experimentsTabPage.ResumeLayout(false);
-      this.ResumeLayout(false);
-      this.PerformLayout();
-
-    }
-
-    #endregion
-
-    private System.Windows.Forms.Label platformLabel;
-    private System.Windows.Forms.ComboBox platformComboBox;
-    private System.Windows.Forms.Label algorithmClassLabel;
-    private System.Windows.Forms.ComboBox algorithmClassComboBox;
-    private System.Windows.Forms.ListBox usersListBox;
-    private System.Windows.Forms.TabControl tabControl;
-    private System.Windows.Forms.TabPage usersTabPage;
-    private System.Windows.Forms.Button storeUsersButton;
-    private System.Windows.Forms.Button refreshUsersButton;
-    private System.Windows.Forms.TabPage dataTabPage;
-    private AlgorithmDataView algorithmDataView;
-    private System.Windows.Forms.TabPage parametersTabPage;
-    private System.Windows.Forms.TabPage resultsTabPage;
-    private AlgorithmParameterCollectionView algorithmParameterCollectionView;
-    private System.Windows.Forms.Button refreshParametersButton;
-    private System.Windows.Forms.Button refreshResultsButton;
-    private System.Windows.Forms.TabPage experimentsTabPage;
-    private ResultCollectionView resultCollectionView;
-    private ExperimentCollectionView experimentCollectionView;
-    private System.Windows.Forms.Button refreshExperimentsButton;
-
-  }
-}
Index: branches/OKB (trunk integration)/HeuristicLab.Clients.OKB/3.3/Views/AlgorithmView.cs
===================================================================
--- branches/OKB (trunk integration)/HeuristicLab.Clients.OKB/3.3/Views/AlgorithmView.cs	(revision 5504)
+++ 	(revision )
@@ -1,138 +1,0 @@
-#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 System.Windows.Forms;
-using HeuristicLab.MainForm;
-using HeuristicLab.MainForm.WindowsForms;
-
-namespace HeuristicLab.Clients.OKB {
-  [View("Algorithm View")]
-  [Content(typeof(Algorithm), true)]
-  public partial class AlgorithmView : NamedOKBItemView {
-    private List<Platform> platformComboBoxValues;
-    private List<AlgorithmClass> algorithmClassComboBoxValues;
-
-    public new Algorithm Content {
-      get { return (Algorithm)base.Content; }
-      set { base.Content = value; }
-    }
-
-    public AlgorithmView() {
-      InitializeComponent();
-    }
-
-    protected override void OnInitialized(System.EventArgs e) {
-      base.OnInitialized(e);
-      platformComboBoxValues = OKBClient.Instance.Platforms.ToList();
-      platformComboBox.DataSource = platformComboBoxValues;
-      algorithmClassComboBoxValues = OKBClient.Instance.AlgorithmClasses.ToList();
-      algorithmClassComboBox.DataSource = algorithmClassComboBoxValues;
-    }
-
-    protected override void OnContentChanged() {
-      base.OnContentChanged();
-      if (Content == null) {
-        platformComboBox.SelectedIndex = -1;
-        algorithmClassComboBox.SelectedIndex = -1;
-        algorithmDataView.AlgorithmId = 0;
-      } else {
-        platformComboBox.SelectedItem = platformComboBoxValues.FirstOrDefault(p => p.Id == Content.PlatformId);
-        algorithmClassComboBox.SelectedItem = algorithmClassComboBoxValues.FirstOrDefault(a => a.Id == Content.AlgorithmClassId);
-        algorithmDataView.AlgorithmId = Content.Id;
-      }
-      usersListBox.DataSource = null;
-      algorithmDataView.Content = null;
-    }
-
-    protected override void SetEnabledStateOfControls() {
-      base.SetEnabledStateOfControls();
-      platformComboBox.Enabled = (Content != null) && !ReadOnly;
-      algorithmClassComboBox.Enabled = (Content != null) && !ReadOnly;
-      refreshUsersButton.Enabled = Content != null;
-      storeUsersButton.Enabled = (usersListBox.DataSource != null) && !ReadOnly;
-      usersListBox.Enabled = (usersListBox.DataSource != null) && !ReadOnly;
-      algorithmDataView.Enabled = Content != null;
-    }
-
-    protected override void OnContentPropertyChanged(string propertyName) {
-      switch (propertyName) {
-        case "Id":
-          algorithmDataView.AlgorithmId = Content.Id;
-          break;
-        case "PlatformId":
-          platformComboBox.SelectedItem = platformComboBoxValues.FirstOrDefault(p => p.Id == Content.PlatformId);
-          break;
-        case "AlgorithmClassId":
-          algorithmClassComboBox.SelectedItem = algorithmClassComboBoxValues.FirstOrDefault(a => a.Id == Content.AlgorithmClassId);
-          break;
-      }
-    }
-
-    private void platformComboBox_SelectedValueChanged(object sender, System.EventArgs e) {
-      if (Content != null) {
-        Platform selected = platformComboBox.SelectedItem as Platform;
-        if (selected != null) Content.PlatformId = selected.Id;
-      }
-    }
-    private void algorithmClassComboBox_SelectedValueChanged(object sender, System.EventArgs e) {
-      if (Content != null) {
-        AlgorithmClass selected = algorithmClassComboBox.SelectedItem as AlgorithmClass;
-        if (selected != null) Content.AlgorithmClassId = selected.Id;
-      }
-    }
-
-    private void refreshUsersButton_Click(object sender, System.EventArgs e) {
-      List<Guid> ids = OKBClient.Instance.GetAlgorithmUsers(Content.Id);
-      if (ids != null) {
-        List<User> users = OKBClient.Instance.Users.ToList();
-        usersListBox.DataSource = users;
-        usersListBox.DisplayMember = "Name";
-        usersListBox.SelectedItems.Clear();
-        foreach (Guid id in ids)
-          usersListBox.SelectedItems.Add(users.First(u => u.Id == id));
-        usersListBox.Enabled = !ReadOnly;
-        storeUsersButton.Enabled = false;
-      }
-    }
-    private void storeUsersButton_Click(object sender, System.EventArgs e) {
-      if (OKBClient.Instance.UpdateAlgorithmUsers(Content.Id, usersListBox.SelectedItems.Cast<User>().Select(u => u.Id).ToList()))
-        storeUsersButton.Enabled = false;
-    }
-    private void usersListBox_SelectedIndexChanged(object sender, EventArgs e) {
-      storeUsersButton.Enabled = !ReadOnly;
-    }
-
-    private void refreshParametersButton_Click(object sender, EventArgs e) {
-      algorithmParameterCollectionView.Content = OKBClient.Instance.GetAlgorithmParameters(Content.Id);
-    }
-
-    private void refreshResultsButton_Click(object sender, EventArgs e) {
-      resultCollectionView.Content = OKBClient.Instance.GetResults(Content.Id);
-    }
-
-    private void refreshExperimentsButton_Click(object sender, EventArgs e) {
-      experimentCollectionView.Content = OKBClient.Instance.GetExperiments(Content.Id, 0);
-    }
-  }
-}
Index: branches/OKB (trunk integration)/HeuristicLab.Clients.OKB/3.3/Views/NamedOKBItemView.Designer.cs
===================================================================
--- branches/OKB (trunk integration)/HeuristicLab.Clients.OKB/3.3/Views/NamedOKBItemView.Designer.cs	(revision 5504)
+++ 	(revision )
@@ -1,125 +1,0 @@
-#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 {
-  partial class NamedOKBItemView {
-    /// <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() {
-      this.nameLabel = new System.Windows.Forms.Label();
-      this.nameTextBox = new System.Windows.Forms.TextBox();
-      this.descriptionLabel = new System.Windows.Forms.Label();
-      this.descriptionTextBox = new System.Windows.Forms.TextBox();
-      this.SuspendLayout();
-      // 
-      // storeButton
-      // 
-      this.toolTip.SetToolTip(this.storeButton, "Store Data");
-      // 
-      // nameLabel
-      // 
-      this.nameLabel.AutoSize = true;
-      this.nameLabel.Location = new System.Drawing.Point(3, 32);
-      this.nameLabel.Name = "nameLabel";
-      this.nameLabel.Size = new System.Drawing.Size(38, 13);
-      this.nameLabel.TabIndex = 1;
-      this.nameLabel.Text = "&Name:";
-      // 
-      // nameTextBox
-      // 
-      this.nameTextBox.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
-                  | System.Windows.Forms.AnchorStyles.Right)));
-      this.nameTextBox.Location = new System.Drawing.Point(72, 29);
-      this.nameTextBox.Name = "nameTextBox";
-      this.nameTextBox.Size = new System.Drawing.Size(278, 20);
-      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
-      // 
-      this.descriptionLabel.AutoSize = true;
-      this.descriptionLabel.Location = new System.Drawing.Point(3, 58);
-      this.descriptionLabel.Name = "descriptionLabel";
-      this.descriptionLabel.Size = new System.Drawing.Size(63, 13);
-      this.descriptionLabel.TabIndex = 3;
-      this.descriptionLabel.Text = "&Description:";
-      // 
-      // descriptionTextBox
-      // 
-      this.descriptionTextBox.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
-                  | System.Windows.Forms.AnchorStyles.Right)));
-      this.descriptionTextBox.Location = new System.Drawing.Point(72, 55);
-      this.descriptionTextBox.Name = "descriptionTextBox";
-      this.descriptionTextBox.ScrollBars = System.Windows.Forms.ScrollBars.Vertical;
-      this.descriptionTextBox.Size = new System.Drawing.Size(278, 20);
-      this.descriptionTextBox.TabIndex = 4;
-      this.descriptionTextBox.TextChanged += new System.EventHandler(this.descriptionTextBox_TextChanged);
-      this.descriptionTextBox.DoubleClick += new System.EventHandler(this.descriptionTextBox_DoubleClick);
-      // 
-      // NamedOKBItemView
-      // 
-      this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
-      this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
-      this.Controls.Add(this.descriptionTextBox);
-      this.Controls.Add(this.descriptionLabel);
-      this.Controls.Add(this.nameLabel);
-      this.Controls.Add(this.nameTextBox);
-      this.Name = "NamedOKBItemView";
-      this.Size = new System.Drawing.Size(350, 93);
-      this.Controls.SetChildIndex(this.storeButton, 0);
-      this.Controls.SetChildIndex(this.nameTextBox, 0);
-      this.Controls.SetChildIndex(this.nameLabel, 0);
-      this.Controls.SetChildIndex(this.descriptionLabel, 0);
-      this.Controls.SetChildIndex(this.descriptionTextBox, 0);
-      this.ResumeLayout(false);
-      this.PerformLayout();
-
-    }
-
-    #endregion
-
-    protected System.Windows.Forms.TextBox nameTextBox;
-    protected System.Windows.Forms.Label nameLabel;
-    protected System.Windows.Forms.Label descriptionLabel;
-    protected System.Windows.Forms.TextBox descriptionTextBox;
-  }
-}
Index: branches/OKB (trunk integration)/HeuristicLab.Clients.OKB/3.3/Views/NamedOKBItemView.cs
===================================================================
--- branches/OKB (trunk integration)/HeuristicLab.Clients.OKB/3.3/Views/NamedOKBItemView.cs	(revision 5504)
+++ 	(revision )
@@ -1,105 +1,0 @@
-#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.MainForm.WindowsForms;
-
-namespace HeuristicLab.Clients.OKB {
-  [View("NamedOKBItem View")]
-  [Content(typeof(NamedOKBItem), true)]
-  [Content(typeof(INamedOKBItem), false)]
-  public partial class NamedOKBItemView : OKBItemView {
-    public new INamedOKBItem Content {
-      get { return (INamedOKBItem)base.Content; }
-      set { base.Content = value; }
-    }
-
-    public NamedOKBItemView() {
-      InitializeComponent();
-    }
-
-    protected override void OnContentChanged() {
-      base.OnContentChanged();
-      if (Content == null) {
-        nameTextBox.Text = string.Empty;
-        descriptionTextBox.Text = string.Empty;
-        toolTip.SetToolTip(descriptionTextBox, string.Empty);
-        if (ViewAttribute.HasViewAttribute(this.GetType()))
-          this.Caption = ViewAttribute.GetViewName(this.GetType());
-        else
-          this.Caption = "NamedEntity View";
-      } else {
-        nameTextBox.Text = Content.Name;
-        descriptionTextBox.Text = Content.Description;
-        toolTip.SetToolTip(descriptionTextBox, Content.Description);
-        Caption = Content.Name;
-      }
-    }
-
-    protected override void SetEnabledStateOfControls() {
-      base.SetEnabledStateOfControls();
-      nameTextBox.Enabled = Content != null;
-      nameTextBox.ReadOnly = ReadOnly;
-      descriptionTextBox.Enabled = Content != null;
-      descriptionTextBox.ReadOnly = ReadOnly;
-    }
-
-    protected override void OnContentPropertyChanged(string propertyName) {
-      switch (propertyName) {
-        case "Name":
-          nameTextBox.Text = Content.Name;
-          Caption = Content.Name;
-          break;
-        case "Description":
-          descriptionTextBox.Text = Content.Description;
-          toolTip.SetToolTip(descriptionTextBox, Content.Description);
-          break;
-      }
-    }
-
-    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)
-        Content.Name = nameTextBox.Text;
-    }
-    protected virtual void descriptionTextBox_TextChanged(object sender, EventArgs e) {
-      if (descriptionTextBox.Text != Content.Description)
-        Content.Description = descriptionTextBox.Text;
-    }
-
-    protected void descriptionTextBox_DoubleClick(object sender, EventArgs e) {
-      using (TextDialog dialog = new TextDialog("Description of " + Content.Name, descriptionTextBox.Text, ReadOnly)) {
-        if (dialog.ShowDialog(this) == DialogResult.OK)
-          Content.Description = dialog.Content;
-      }
-    }
-  }
-}
Index: branches/OKB (trunk integration)/HeuristicLab.Clients.OKB/3.3/Views/OKBItemView.Designer.cs
===================================================================
--- branches/OKB (trunk integration)/HeuristicLab.Clients.OKB/3.3/Views/OKBItemView.Designer.cs	(revision 5504)
+++ 	(revision )
@@ -1,82 +1,0 @@
-#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 {
-  partial class OKBItemView {
-    /// <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() {
-      this.components = new System.ComponentModel.Container();
-      this.storeButton = new System.Windows.Forms.Button();
-      this.toolTip = new System.Windows.Forms.ToolTip(this.components);
-      this.SuspendLayout();
-      // 
-      // storeButton
-      // 
-      this.storeButton.Image = HeuristicLab.Common.Resources.VSImageLibrary.PublishToWeb;
-      this.storeButton.Location = new System.Drawing.Point(0, 0);
-      this.storeButton.Name = "storeButton";
-      this.storeButton.Size = new System.Drawing.Size(24, 24);
-      this.storeButton.TabIndex = 0;
-      this.toolTip.SetToolTip(this.storeButton, "Store Data");
-      this.storeButton.UseVisualStyleBackColor = true;
-      this.storeButton.Click += new System.EventHandler(this.storeButton_Click);
-      // 
-      // OKBItemView
-      // 
-      this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
-      this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
-      this.Controls.Add(this.storeButton);
-      this.Name = "OKBItemView";
-      this.Size = new System.Drawing.Size(354, 308);
-      this.ResumeLayout(false);
-
-    }
-
-    #endregion
-
-    protected System.Windows.Forms.Button storeButton;
-    protected System.Windows.Forms.ToolTip toolTip;
-
-
-
-  }
-}
Index: branches/OKB (trunk integration)/HeuristicLab.Clients.OKB/3.3/Views/OKBItemView.cs
===================================================================
--- branches/OKB (trunk integration)/HeuristicLab.Clients.OKB/3.3/Views/OKBItemView.cs	(revision 5504)
+++ 	(revision )
@@ -1,78 +1,0 @@
-#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.ComponentModel;
-using System.Windows.Forms;
-using HeuristicLab.Core.Views;
-using HeuristicLab.MainForm;
-using HeuristicLab.MainForm.WindowsForms;
-
-namespace HeuristicLab.Clients.OKB {
-  [View("OKBItem View")]
-  [Content(typeof(OKBItem), true)]
-  [Content(typeof(IOKBItem), false)]
-  public partial class OKBItemView : ItemView {
-    public new IOKBItem Content {
-      get { return (IOKBItem)base.Content; }
-      set { base.Content = value; }
-    }
-
-    public OKBItemView() {
-      InitializeComponent();
-    }
-
-    protected override void DeregisterContentEvents() {
-      Content.PropertyChanged -= new PropertyChangedEventHandler(Content_PropertyChanged);
-      Content.ModifiedChanged -= new EventHandler(Content_ModifiedChanged);
-      base.DeregisterContentEvents();
-    }
-    protected override void RegisterContentEvents() {
-      base.RegisterContentEvents();
-      Content.PropertyChanged += new PropertyChangedEventHandler(Content_PropertyChanged);
-      Content.ModifiedChanged += new EventHandler(Content_ModifiedChanged);
-    }
-
-    protected override void SetEnabledStateOfControls() {
-      base.SetEnabledStateOfControls();
-      storeButton.Enabled = (Content != null) && !ReadOnly && Content.Modified;
-    }
-
-    private void Content_PropertyChanged(object sender, PropertyChangedEventArgs e) {
-      if (InvokeRequired)
-        Invoke(new PropertyChangedEventHandler(Content_PropertyChanged), sender, e);
-      else {
-        OnContentPropertyChanged(e.PropertyName);
-      }
-    }
-    protected virtual void OnContentPropertyChanged(string propertyName) { }
-    protected virtual void Content_ModifiedChanged(object sender, EventArgs e) {
-      if (InvokeRequired)
-        Invoke(new EventHandler(Content_ModifiedChanged), sender, e);
-      else
-        SetEnabledStateOfControls();
-    }
-
-    protected virtual void storeButton_Click(object sender, EventArgs e) {
-      Content.Store();
-    }
-  }
-}
Index: branches/OKB (trunk integration)/HeuristicLab.Clients.OKB/3.3/Views/PlatformCollectionView.Designer.cs
===================================================================
--- branches/OKB (trunk integration)/HeuristicLab.Clients.OKB/3.3/Views/PlatformCollectionView.Designer.cs	(revision 5504)
+++ 	(revision )
@@ -1,53 +1,0 @@
-﻿#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 {
-  partial class PlatformCollectionView {
-    /// <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/Views/PlatformCollectionView.cs
===================================================================
--- branches/OKB (trunk integration)/HeuristicLab.Clients.OKB/3.3/Views/PlatformCollectionView.cs	(revision 5504)
+++ 	(revision )
@@ -1,40 +1,0 @@
-﻿#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.Windows.Forms;
-using HeuristicLab.Core;
-using HeuristicLab.Core.Views;
-using HeuristicLab.MainForm;
-
-namespace HeuristicLab.Clients.OKB {
-  [View("PlatformCollection View")]
-  [Content(typeof(IItemCollection<Platform>), true)]
-  public partial class PlatformCollectionView : ItemCollectionView<Platform> {
-    public PlatformCollectionView() {
-      InitializeComponent();
-      itemsGroupBox.Text = "Platforms";
-    }
-
-    protected override Platform CreateItem() {
-      return new Platform();
-    }
-  }
-}
Index: branches/OKB (trunk integration)/HeuristicLab.Clients.OKB/3.3/Views/ProblemClassCollectionView.Designer.cs
===================================================================
--- branches/OKB (trunk integration)/HeuristicLab.Clients.OKB/3.3/Views/ProblemClassCollectionView.Designer.cs	(revision 5504)
+++ 	(revision )
@@ -1,53 +1,0 @@
-﻿#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 {
-  partial class ProblemClassCollectionView {
-    /// <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/Views/ProblemClassCollectionView.cs
===================================================================
--- branches/OKB (trunk integration)/HeuristicLab.Clients.OKB/3.3/Views/ProblemClassCollectionView.cs	(revision 5504)
+++ 	(revision )
@@ -1,40 +1,0 @@
-﻿#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.Windows.Forms;
-using HeuristicLab.Core;
-using HeuristicLab.Core.Views;
-using HeuristicLab.MainForm;
-
-namespace HeuristicLab.Clients.OKB {
-  [View("ProblemClassCollection View")]
-  [Content(typeof(IItemCollection<ProblemClass>), true)]
-  public partial class ProblemClassCollectionView : ItemCollectionView<ProblemClass> {
-    public ProblemClassCollectionView() {
-      InitializeComponent();
-      itemsGroupBox.Text = "Problem Classes";
-    }
-
-    protected override ProblemClass CreateItem() {
-      return new ProblemClass();
-    }
-  }
-}
Index: branches/OKB (trunk integration)/HeuristicLab.Clients.OKB/3.3/Views/ProblemCollectionView.Designer.cs
===================================================================
--- branches/OKB (trunk integration)/HeuristicLab.Clients.OKB/3.3/Views/ProblemCollectionView.Designer.cs	(revision 5504)
+++ 	(revision )
@@ -1,53 +1,0 @@
-﻿#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 {
-  partial class ProblemCollectionView {
-    /// <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/Views/ProblemCollectionView.cs
===================================================================
--- branches/OKB (trunk integration)/HeuristicLab.Clients.OKB/3.3/Views/ProblemCollectionView.cs	(revision 5504)
+++ 	(revision )
@@ -1,40 +1,0 @@
-﻿#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.Windows.Forms;
-using HeuristicLab.Core;
-using HeuristicLab.Core.Views;
-using HeuristicLab.MainForm;
-
-namespace HeuristicLab.Clients.OKB {
-  [View("ProblemCollection View")]
-  [Content(typeof(IItemCollection<Problem>), true)]
-  public partial class ProblemCollectionView : ItemCollectionView<Problem> {
-    public ProblemCollectionView() {
-      InitializeComponent();
-      itemsGroupBox.Text = "Problems";
-    }
-
-    protected override Problem CreateItem() {
-      return new Problem();
-    }
-  }
-}
Index: branches/OKB (trunk integration)/HeuristicLab.Clients.OKB/3.3/Views/ProblemView.Designer.cs
===================================================================
--- branches/OKB (trunk integration)/HeuristicLab.Clients.OKB/3.3/Views/ProblemView.Designer.cs	(revision 5504)
+++ 	(revision )
@@ -1,249 +1,0 @@
-#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 {
-  partial class ProblemView {
-    /// <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() {
-      this.platformLabel = new System.Windows.Forms.Label();
-      this.platformComboBox = new System.Windows.Forms.ComboBox();
-      this.problemClassLabel = new System.Windows.Forms.Label();
-      this.problemClassComboBox = new System.Windows.Forms.ComboBox();
-      this.usersListBox = new System.Windows.Forms.ListBox();
-      this.tabControl = new System.Windows.Forms.TabControl();
-      this.usersTabPage = new System.Windows.Forms.TabPage();
-      this.storeUsersButton = new System.Windows.Forms.Button();
-      this.refreshUsersButton = new System.Windows.Forms.Button();
-      this.dataTabPage = new System.Windows.Forms.TabPage();
-      this.problemDataView = new HeuristicLab.Clients.OKB.ProblemDataView();
-      this.tabControl.SuspendLayout();
-      this.usersTabPage.SuspendLayout();
-      this.dataTabPage.SuspendLayout();
-      this.SuspendLayout();
-      // 
-      // nameTextBox
-      // 
-      this.nameTextBox.Location = new System.Drawing.Point(90, 29);
-      this.nameTextBox.Size = new System.Drawing.Size(543, 20);
-      // 
-      // descriptionTextBox
-      // 
-      this.descriptionTextBox.Location = new System.Drawing.Point(90, 55);
-      this.descriptionTextBox.Size = new System.Drawing.Size(543, 20);
-      // 
-      // storeButton
-      // 
-      this.toolTip.SetToolTip(this.storeButton, "Store Data");
-      // 
-      // platformLabel
-      // 
-      this.platformLabel.AutoSize = true;
-      this.platformLabel.Location = new System.Drawing.Point(3, 84);
-      this.platformLabel.Name = "platformLabel";
-      this.platformLabel.Size = new System.Drawing.Size(48, 13);
-      this.platformLabel.TabIndex = 5;
-      this.platformLabel.Text = "&Platform:";
-      // 
-      // platformComboBox
-      // 
-      this.platformComboBox.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
-                  | System.Windows.Forms.AnchorStyles.Right)));
-      this.platformComboBox.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList;
-      this.platformComboBox.FormattingEnabled = true;
-      this.platformComboBox.Location = new System.Drawing.Point(90, 81);
-      this.platformComboBox.Name = "platformComboBox";
-      this.platformComboBox.Size = new System.Drawing.Size(543, 21);
-      this.platformComboBox.TabIndex = 6;
-      this.platformComboBox.SelectedValueChanged += new System.EventHandler(this.platformComboBox_SelectedValueChanged);
-      // 
-      // problemClassLabel
-      // 
-      this.problemClassLabel.AutoSize = true;
-      this.problemClassLabel.Location = new System.Drawing.Point(3, 111);
-      this.problemClassLabel.Name = "problemClassLabel";
-      this.problemClassLabel.Size = new System.Drawing.Size(81, 13);
-      this.problemClassLabel.TabIndex = 7;
-      this.problemClassLabel.Text = "&Problem Class:";
-      // 
-      // problemClassComboBox
-      // 
-      this.problemClassComboBox.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
-                  | System.Windows.Forms.AnchorStyles.Right)));
-      this.problemClassComboBox.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList;
-      this.problemClassComboBox.FormattingEnabled = true;
-      this.problemClassComboBox.Location = new System.Drawing.Point(90, 108);
-      this.problemClassComboBox.Name = "problemClassComboBox";
-      this.problemClassComboBox.Size = new System.Drawing.Size(543, 21);
-      this.problemClassComboBox.TabIndex = 8;
-      this.problemClassComboBox.SelectedValueChanged += new System.EventHandler(this.problemClassComboBox_SelectedValueChanged);
-      // 
-      // usersListBox
-      // 
-      this.usersListBox.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.usersListBox.Enabled = false;
-      this.usersListBox.FormattingEnabled = true;
-      this.usersListBox.Location = new System.Drawing.Point(6, 36);
-      this.usersListBox.Name = "usersListBox";
-      this.usersListBox.SelectionMode = System.Windows.Forms.SelectionMode.MultiSimple;
-      this.usersListBox.Size = new System.Drawing.Size(613, 225);
-      this.usersListBox.TabIndex = 2;
-      this.usersListBox.SelectedIndexChanged += new System.EventHandler(this.usersListBox_SelectedIndexChanged);
-      // 
-      // tabControl
-      // 
-      this.tabControl.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.tabControl.Controls.Add(this.usersTabPage);
-      this.tabControl.Controls.Add(this.dataTabPage);
-      this.tabControl.Location = new System.Drawing.Point(0, 162);
-      this.tabControl.Name = "tabControl";
-      this.tabControl.SelectedIndex = 0;
-      this.tabControl.Size = new System.Drawing.Size(633, 292);
-      this.tabControl.TabIndex = 9;
-      // 
-      // usersTabPage
-      // 
-      this.usersTabPage.Controls.Add(this.storeUsersButton);
-      this.usersTabPage.Controls.Add(this.refreshUsersButton);
-      this.usersTabPage.Controls.Add(this.usersListBox);
-      this.usersTabPage.Location = new System.Drawing.Point(4, 22);
-      this.usersTabPage.Name = "usersTabPage";
-      this.usersTabPage.Padding = new System.Windows.Forms.Padding(3);
-      this.usersTabPage.Size = new System.Drawing.Size(625, 266);
-      this.usersTabPage.TabIndex = 0;
-      this.usersTabPage.Text = "Authorized Users";
-      this.usersTabPage.UseVisualStyleBackColor = true;
-      // 
-      // storeUsersButton
-      // 
-      this.storeUsersButton.Image = HeuristicLab.Common.Resources.VSImageLibrary.PublishToWeb;
-      this.storeUsersButton.Location = new System.Drawing.Point(36, 6);
-      this.storeUsersButton.Name = "storeUsersButton";
-      this.storeUsersButton.Size = new System.Drawing.Size(24, 24);
-      this.storeUsersButton.TabIndex = 1;
-      this.toolTip.SetToolTip(this.storeUsersButton, "Store Authorized Users");
-      this.storeUsersButton.UseVisualStyleBackColor = true;
-      this.storeUsersButton.Click += new System.EventHandler(this.storeUsersButton_Click);
-      // 
-      // refreshUsersButton
-      // 
-      this.refreshUsersButton.Image = HeuristicLab.Common.Resources.VSImageLibrary.Refresh;
-      this.refreshUsersButton.Location = new System.Drawing.Point(6, 6);
-      this.refreshUsersButton.Name = "refreshUsersButton";
-      this.refreshUsersButton.Size = new System.Drawing.Size(24, 24);
-      this.refreshUsersButton.TabIndex = 0;
-      this.toolTip.SetToolTip(this.refreshUsersButton, "Refresh Authorized Users");
-      this.refreshUsersButton.UseVisualStyleBackColor = true;
-      this.refreshUsersButton.Click += new System.EventHandler(this.refreshUsersButton_Click);
-      // 
-      // dataTabPage
-      // 
-      this.dataTabPage.Controls.Add(this.problemDataView);
-      this.dataTabPage.Location = new System.Drawing.Point(4, 22);
-      this.dataTabPage.Name = "dataTabPage";
-      this.dataTabPage.Padding = new System.Windows.Forms.Padding(3);
-      this.dataTabPage.Size = new System.Drawing.Size(625, 266);
-      this.dataTabPage.TabIndex = 1;
-      this.dataTabPage.Text = "Platform-Specific Problem Data";
-      this.dataTabPage.UseVisualStyleBackColor = true;
-      // 
-      // problemDataView
-      // 
-      this.problemDataView.ProblemId = ((long)(0));
-      this.problemDataView.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.problemDataView.Caption = "ProblemData View";
-      this.problemDataView.Content = null;
-      this.problemDataView.Location = new System.Drawing.Point(6, 6);
-      this.problemDataView.Name = "problemDataView";
-      this.problemDataView.ReadOnly = false;
-      this.problemDataView.Size = new System.Drawing.Size(613, 254);
-      this.problemDataView.TabIndex = 0;
-      // 
-      // ProblemView
-      // 
-      this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
-      this.Controls.Add(this.tabControl);
-      this.Controls.Add(this.platformComboBox);
-      this.Controls.Add(this.platformLabel);
-      this.Controls.Add(this.problemClassComboBox);
-      this.Controls.Add(this.problemClassLabel);
-      this.Name = "ProblemView";
-      this.Size = new System.Drawing.Size(633, 454);
-      this.Controls.SetChildIndex(this.problemClassLabel, 0);
-      this.Controls.SetChildIndex(this.problemClassComboBox, 0);
-      this.Controls.SetChildIndex(this.platformLabel, 0);
-      this.Controls.SetChildIndex(this.platformComboBox, 0);
-      this.Controls.SetChildIndex(this.tabControl, 0);
-      this.Controls.SetChildIndex(this.storeButton, 0);
-      this.Controls.SetChildIndex(this.nameTextBox, 0);
-      this.Controls.SetChildIndex(this.nameLabel, 0);
-      this.Controls.SetChildIndex(this.descriptionLabel, 0);
-      this.Controls.SetChildIndex(this.descriptionTextBox, 0);
-      this.tabControl.ResumeLayout(false);
-      this.usersTabPage.ResumeLayout(false);
-      this.dataTabPage.ResumeLayout(false);
-      this.ResumeLayout(false);
-      this.PerformLayout();
-
-    }
-
-    #endregion
-
-    private System.Windows.Forms.Label platformLabel;
-    private System.Windows.Forms.ComboBox platformComboBox;
-    private System.Windows.Forms.Label problemClassLabel;
-    private System.Windows.Forms.ComboBox problemClassComboBox;
-    private System.Windows.Forms.ListBox usersListBox;
-    private System.Windows.Forms.TabControl tabControl;
-    private System.Windows.Forms.TabPage usersTabPage;
-    private System.Windows.Forms.Button storeUsersButton;
-    private System.Windows.Forms.Button refreshUsersButton;
-    private System.Windows.Forms.TabPage dataTabPage;
-    private ProblemDataView problemDataView;
-
-  }
-}
Index: branches/OKB (trunk integration)/HeuristicLab.Clients.OKB/3.3/Views/ProblemView.cs
===================================================================
--- branches/OKB (trunk integration)/HeuristicLab.Clients.OKB/3.3/Views/ProblemView.cs	(revision 5504)
+++ 	(revision )
@@ -1,126 +1,0 @@
-#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 System.Windows.Forms;
-using HeuristicLab.MainForm;
-using HeuristicLab.MainForm.WindowsForms;
-
-namespace HeuristicLab.Clients.OKB {
-  [View("Problem View")]
-  [Content(typeof(Problem), true)]
-  public partial class ProblemView : NamedOKBItemView {
-    private List<Platform> platformComboBoxValues;
-    private List<ProblemClass> problemClassComboBoxValues;
-
-    public new Problem Content {
-      get { return (Problem)base.Content; }
-      set { base.Content = value; }
-    }
-
-    public ProblemView() {
-      InitializeComponent();
-    }
-
-    protected override void OnInitialized(System.EventArgs e) {
-      base.OnInitialized(e);
-      platformComboBoxValues = OKBClient.Instance.Platforms.ToList();
-      platformComboBox.DataSource = platformComboBoxValues;
-      problemClassComboBoxValues = OKBClient.Instance.ProblemClasses.ToList();
-      problemClassComboBox.DataSource = problemClassComboBoxValues;
-    }
-
-    protected override void OnContentChanged() {
-      base.OnContentChanged();
-      if (Content == null) {
-        platformComboBox.SelectedIndex = -1;
-        problemClassComboBox.SelectedIndex = -1;
-        problemDataView.ProblemId = 0;
-      } else {
-        platformComboBox.SelectedItem = platformComboBoxValues.FirstOrDefault(p => p.Id == Content.PlatformId);
-        problemClassComboBox.SelectedItem = problemClassComboBoxValues.FirstOrDefault(a => a.Id == Content.ProblemClassId);
-        problemDataView.ProblemId = Content.Id;
-      }
-      usersListBox.DataSource = null;
-      problemDataView.Content = null;
-    }
-
-    protected override void SetEnabledStateOfControls() {
-      base.SetEnabledStateOfControls();
-      platformComboBox.Enabled = (Content != null) && !ReadOnly;
-      problemClassComboBox.Enabled = (Content != null) && !ReadOnly;
-      refreshUsersButton.Enabled = Content != null;
-      storeUsersButton.Enabled = (usersListBox.DataSource != null) && !ReadOnly;
-      usersListBox.Enabled = (usersListBox.DataSource != null) && !ReadOnly;
-      problemDataView.Enabled = Content != null;
-    }
-
-    protected override void OnContentPropertyChanged(string propertyName) {
-      switch (propertyName) {
-        case "Id":
-          problemDataView.ProblemId = Content.Id;
-          break;
-        case "PlatformId":
-          platformComboBox.SelectedItem = platformComboBoxValues.FirstOrDefault(p => p.Id == Content.PlatformId);
-          break;
-        case "ProblemClassId":
-          problemClassComboBox.SelectedItem = problemClassComboBoxValues.FirstOrDefault(a => a.Id == Content.ProblemClassId);
-          break;
-      }
-    }
-
-    private void platformComboBox_SelectedValueChanged(object sender, System.EventArgs e) {
-      if (Content != null) {
-        Platform selected = platformComboBox.SelectedItem as Platform;
-        if (selected != null) Content.PlatformId = selected.Id;
-      }
-    }
-    private void problemClassComboBox_SelectedValueChanged(object sender, System.EventArgs e) {
-      if (Content != null) {
-        ProblemClass selected = problemClassComboBox.SelectedItem as ProblemClass;
-        if (selected != null) Content.ProblemClassId = selected.Id;
-      }
-    }
-
-    private void refreshUsersButton_Click(object sender, System.EventArgs e) {
-      List<Guid> ids = OKBClient.Instance.GetProblemUsers(Content.Id);
-      if (ids != null) {
-        List<User> users = OKBClient.Instance.Users.ToList();
-        usersListBox.DataSource = users;
-        usersListBox.DisplayMember = "Name";
-        usersListBox.SelectedItems.Clear();
-        foreach (Guid id in ids)
-          usersListBox.SelectedItems.Add(users.First(u => u.Id == id));
-        usersListBox.Enabled = !ReadOnly;
-        storeUsersButton.Enabled = false;
-      }
-    }
-    private void storeUsersButton_Click(object sender, System.EventArgs e) {
-      if (OKBClient.Instance.UpdateProblemUsers(Content.Id, usersListBox.SelectedItems.Cast<User>().Select(u => u.Id).ToList()))
-        storeUsersButton.Enabled = false;
-    }
-    private void usersListBox_SelectedIndexChanged(object sender, EventArgs e) {
-      storeUsersButton.Enabled = !ReadOnly;
-    }
-  }
-}
