Index: branches/OKB/HeuristicLab.Clients.OKB-3.3/Administrator.cs
===================================================================
--- branches/OKB/HeuristicLab.Clients.OKB-3.3/Administrator.cs	(revision 4539)
+++ 	(revision )
@@ -1,366 +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 HeuristicLab.Clients.Common;
-using HeuristicLab.Collections;
-using HeuristicLab.Common;
-using HeuristicLab.Core;
-using HeuristicLab.PluginInfrastructure;
-
-namespace HeuristicLab.Clients.OKB {
-  [Item("Administrator", "OKB administrator front-end.")]
-  public sealed class Administrator : IContent {
-    private static Administrator instance;
-    public static Administrator Instance {
-      get {
-        if (instance == null) instance = new Administrator();
-        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 Administrator() { }
-
-    #region Refresh
-    public void Refresh() {
-      OnRefreshing();
-      if (platforms == null) {
-        platforms = new ItemCollection<Platform>();
-        platforms.ItemsRemoved += new CollectionItemsChangedEventHandler<Platform>(platforms_ItemsRemoved);
-      }
-      platforms.Clear();
-      if (dataTypes == null) {
-        dataTypes = new ItemCollection<DataType>();
-        dataTypes.ItemsRemoved += new CollectionItemsChangedEventHandler<DataType>(dataTypes_ItemsRemoved);
-      }
-      dataTypes.Clear();
-      if (algorithmClasses == null) {
-        algorithmClasses = new ItemCollection<AlgorithmClass>();
-        algorithmClasses.ItemsRemoved += new CollectionItemsChangedEventHandler<AlgorithmClass>(algorithmClasses_ItemsRemoved);
-      }
-      algorithmClasses.Clear();
-      if (algorithms == null) {
-        algorithms = new ItemCollection<Algorithm>();
-        algorithms.ItemsRemoved += new CollectionItemsChangedEventHandler<Algorithm>(algorithms_ItemsRemoved);
-      }
-      algorithms.Clear();
-      if (problemClasses == null) {
-        problemClasses = new ItemCollection<ProblemClass>();
-        problemClasses.ItemsRemoved += new CollectionItemsChangedEventHandler<ProblemClass>(problemClasses_ItemsRemoved);
-      }
-      problemClasses.Clear();
-      if (problems == null) {
-        problems = new ItemCollection<Problem>();
-        problems.ItemsRemoved += new CollectionItemsChangedEventHandler<Problem>(problems_ItemsRemoved);
-      }
-      problems.Clear();
-
-      var call = new Func<Exception>(delegate() {
-        try {
-          platforms.AddRange(CallAdminService<Platform[]>(s => s.GetPlatforms()).OrderBy(x => x.Name));
-          dataTypes.AddRange(CallAdminService<DataType[]>(s => s.GetDataTypes()).OrderBy(x => x.Name));
-          users = CallAuthenticationService<User[]>(s => s.GetUsers()).OrderBy(x => x.Name);
-          algorithmClasses.AddRange(CallAdminService<AlgorithmClass[]>(s => s.GetAlgorithmClasses()).OrderBy(x => x.Name));
-          algorithms.AddRange(CallAdminService<Algorithm[]>(s => s.GetAlgorithms()).OrderBy(x => x.Name));
-          problemClasses.AddRange(CallAdminService<ProblemClass[]>(s => s.GetProblemClasses()).OrderBy(x => x.Name));
-          problems.AddRange(CallAdminService<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 = CallAdminService<long>(s => s.AddPlatform((Platform)item));
-          else if (item is DataType)
-            item.Id = CallAdminService<long>(s => s.AddDataType((DataType)item));
-          else if (item is AlgorithmClass)
-            item.Id = CallAdminService<long>(s => s.AddAlgorithmClass((AlgorithmClass)item));
-          else if (item is Algorithm)
-            item.Id = CallAdminService<long>(s => s.AddAlgorithm((Algorithm)item));
-          else if (item is ProblemClass)
-            item.Id = CallAdminService<long>(s => s.AddProblemClass((ProblemClass)item));
-          else if (item is Problem)
-            item.Id = CallAdminService<long>(s => s.AddProblem((Problem)item));
-        } else {
-          if (item is Platform)
-            CallAdminService(s => s.UpdatePlatform((Platform)item));
-          else if (item is DataType)
-            CallAdminService(s => s.UpdateDataType((DataType)item));
-          else if (item is AlgorithmClass)
-            CallAdminService(s => s.UpdateAlgorithmClass((AlgorithmClass)item));
-          else if (item is Algorithm)
-            CallAdminService(s => s.UpdateAlgorithm((Algorithm)item));
-          else if (item is ProblemClass)
-            CallAdminService(s => s.UpdateProblemClass((ProblemClass)item));
-          else if (item is Problem)
-            CallAdminService(s => s.UpdateProblem((Problem)item));
-        }
-        return true;
-      }
-      catch (Exception ex) {
-        ErrorHandling.ShowErrorDialog("Store failed.", ex);
-        return false;
-      }
-    }
-    #endregion
-
-    #region Algorithm Methods
-    public Guid[] GetAlgorithmUsers(long algorithmId) {
-      try {
-        return CallAdminService<Guid[]>(s => s.GetAlgorithmUsers(algorithmId));
-      }
-      catch (Exception ex) {
-        ErrorHandling.ShowErrorDialog("Refresh authorized algorithm users failed.", ex);
-        return null;
-      }
-    }
-    public bool UpdateAlgorithmUsers(long algorithmId, Guid[] users) {
-      try {
-        CallAdminService(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 CallAdminService<AlgorithmData>(s => s.GetAlgorithmData(algorithmId));
-      }
-      catch (Exception ex) {
-        ErrorHandling.ShowErrorDialog("Refresh algorithm data failed.", ex);
-        return null;
-      }
-    }
-    public bool UpdateAlgorithmData(AlgorithmData algorithmData) {
-      try {
-        CallAdminService(s => s.UpdateAlgorithmData(algorithmData));
-        return true;
-      }
-      catch (Exception ex) {
-        ErrorHandling.ShowErrorDialog("Update algorithm data failed.", ex);
-        return false;
-      }
-    }
-    #endregion
-
-    #region Problem Methods
-    public Guid[] GetProblemUsers(long problemId) {
-      try {
-        return CallAdminService<Guid[]>(s => s.GetProblemUsers(problemId));
-      }
-      catch (Exception ex) {
-        ErrorHandling.ShowErrorDialog("Refresh authorized problem users failed.", ex);
-        return null;
-      }
-    }
-    public bool UpdateProblemUsers(long problemId, Guid[] users) {
-      try {
-        CallAdminService(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 CallAdminService<ProblemData>(s => s.GetProblemData(problemId));
-      }
-      catch (Exception ex) {
-        ErrorHandling.ShowErrorDialog("Refresh problem data failed.", ex);
-        return null;
-      }
-    }
-    public bool UpdateProblemData(ProblemData problemData) {
-      try {
-        CallAdminService(s => s.UpdateProblemData(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)
-          CallAdminService(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)
-          CallAdminService(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)
-          CallAdminService(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)
-          CallAdminService(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)
-          CallAdminService(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)
-          CallAdminService(s => s.DeleteProblem(p.Id));
-      }
-      catch (Exception ex) {
-        ErrorHandling.ShowErrorDialog("Delete failed.", ex);
-      }
-    }
-    #endregion
-
-    #region Helpers
-    private void CallAdminService(Action<IAdminService> call) {
-      AdminServiceClient client = ClientFactory.CreateClient<AdminServiceClient, IAdminService>();
-      try {
-        call(client);
-      }
-      finally {
-        try {
-          client.Close();
-        }
-        catch (Exception) {
-          client.Abort();
-        }
-      }
-    }
-    private T CallAdminService<T>(Func<IAdminService, T> call) {
-      AdminServiceClient client = ClientFactory.CreateClient<AdminServiceClient, IAdminService>();
-      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/HeuristicLab.Clients.OKB-3.3/AdministratorMenuItem.cs
===================================================================
--- branches/OKB/HeuristicLab.Clients.OKB-3.3/AdministratorMenuItem.cs	(revision 4539)
+++ branches/OKB/HeuristicLab.Clients.OKB-3.3/AdministratorMenuItem.cs	(revision 4548)
@@ -37,5 +37,5 @@
 
     public override void Execute() {
-      MainFormManager.MainForm.ShowContent(Administrator.Instance);
+      MainFormManager.MainForm.ShowContent(OKB.Instance);
     }
   }
Index: branches/OKB/HeuristicLab.Clients.OKB-3.3/HeuristicLab.Clients.OKB-3.3.csproj
===================================================================
--- branches/OKB/HeuristicLab.Clients.OKB-3.3/HeuristicLab.Clients.OKB-3.3.csproj	(revision 4539)
+++ branches/OKB/HeuristicLab.Clients.OKB-3.3/HeuristicLab.Clients.OKB-3.3.csproj	(revision 4548)
@@ -47,4 +47,7 @@
     <Reference Include="HeuristicLab.Core-3.3, Version=3.3.0.0, Culture=neutral, PublicKeyToken=ba48961d6f65dcec, processorArchitecture=MSIL" />
     <Reference Include="HeuristicLab.Core.Views-3.3, Version=3.3.0.0, Culture=neutral, PublicKeyToken=ba48961d6f65dcec, processorArchitecture=MSIL" />
+    <Reference Include="HeuristicLab.Data-3.3">
+      <HintPath>..\..\..\..\..\..\Program Files\HeuristicLab 3.3\HeuristicLab.Data-3.3.dll</HintPath>
+    </Reference>
     <Reference Include="HeuristicLab.MainForm-3.3">
       <HintPath>..\..\..\..\..\..\Program Files\HeuristicLab 3.3\HeuristicLab.MainForm-3.3.dll</HintPath>
@@ -73,11 +76,9 @@
   </ItemGroup>
   <ItemGroup>
-    <Compile Include="Administrator.cs">
-      <SubType>Code</SubType>
-    </Compile>
     <Compile Include="AdministratorMenuItem.cs" />
+    <Compile Include="OKB.cs" />
+    <Compile Include="OKBExperiment.cs" />
     <Compile Include="HeuristicLabClientsOKBPlugin.cs" />
     <Compile Include="Properties\AssemblyInfo.cs" />
-    <Compile Include="ServiceClients\AdminServiceClient.cs" />
     <Compile Include="ServiceClients\Algorithm.cs">
       <SubType>Code</SubType>
@@ -88,4 +89,5 @@
     <Compile Include="ServiceClients\AuthenticationServiceClient.cs" />
     <Compile Include="ServiceClients\AlgorithmData.cs" />
+    <Compile Include="ServiceClients\OKBServiceClient.cs" />
     <Compile Include="ServiceClients\ProblemData.cs" />
     <Compile Include="ServiceClients\Problem.cs" />
@@ -132,4 +134,10 @@
     <Compile Include="Views\AlgorithmDataView.Designer.cs">
       <DependentUpon>AlgorithmDataView.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">
Index: branches/OKB/HeuristicLab.Clients.OKB-3.3/HeuristicLabClientsOKBPlugin.cs.frame
===================================================================
--- branches/OKB/HeuristicLab.Clients.OKB-3.3/HeuristicLabClientsOKBPlugin.cs.frame	(revision 4539)
+++ branches/OKB/HeuristicLab.Clients.OKB-3.3/HeuristicLabClientsOKBPlugin.cs.frame	(revision 4548)
@@ -34,4 +34,5 @@
   [PluginDependency("HeuristicLab.Core", "3.3")]
   [PluginDependency("HeuristicLab.Core.Views", "3.3")]
+  [PluginDependency("HeuristicLab.Data", "3.3")]
   [PluginDependency("HeuristicLab.MainForm", "3.3")]
   [PluginDependency("HeuristicLab.MainForm.WindowsForms", "3.3")]
Index: branches/OKB/HeuristicLab.Clients.OKB-3.3/OKB.cs
===================================================================
--- branches/OKB/HeuristicLab.Clients.OKB-3.3/OKB.cs	(revision 4548)
+++ branches/OKB/HeuristicLab.Clients.OKB-3.3/OKB.cs	(revision 4548)
@@ -0,0 +1,366 @@
+﻿#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 {
+  [Item("OKB", "OKB front-end.")]
+  public sealed class OKB : IContent {
+    private static OKB instance;
+    public static OKB Instance {
+      get {
+        if (instance == null) instance = new OKB();
+        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 OKB() { }
+
+    #region Refresh
+    public void Refresh() {
+      OnRefreshing();
+      if (platforms == null) {
+        platforms = new ItemCollection<Platform>();
+        platforms.ItemsRemoved += new CollectionItemsChangedEventHandler<Platform>(platforms_ItemsRemoved);
+      }
+      platforms.Clear();
+      if (dataTypes == null) {
+        dataTypes = new ItemCollection<DataType>();
+        dataTypes.ItemsRemoved += new CollectionItemsChangedEventHandler<DataType>(dataTypes_ItemsRemoved);
+      }
+      dataTypes.Clear();
+      if (algorithmClasses == null) {
+        algorithmClasses = new ItemCollection<AlgorithmClass>();
+        algorithmClasses.ItemsRemoved += new CollectionItemsChangedEventHandler<AlgorithmClass>(algorithmClasses_ItemsRemoved);
+      }
+      algorithmClasses.Clear();
+      if (algorithms == null) {
+        algorithms = new ItemCollection<Algorithm>();
+        algorithms.ItemsRemoved += new CollectionItemsChangedEventHandler<Algorithm>(algorithms_ItemsRemoved);
+      }
+      algorithms.Clear();
+      if (problemClasses == null) {
+        problemClasses = new ItemCollection<ProblemClass>();
+        problemClasses.ItemsRemoved += new CollectionItemsChangedEventHandler<ProblemClass>(problemClasses_ItemsRemoved);
+      }
+      problemClasses.Clear();
+      if (problems == null) {
+        problems = new ItemCollection<Problem>();
+        problems.ItemsRemoved += new CollectionItemsChangedEventHandler<Problem>(problems_ItemsRemoved);
+      }
+      problems.Clear();
+
+      var call = new Func<Exception>(delegate() {
+        try {
+          platforms.AddRange(CallAdminService<Platform[]>(s => s.GetPlatforms()).OrderBy(x => x.Name));
+          dataTypes.AddRange(CallAdminService<DataType[]>(s => s.GetDataTypes()).OrderBy(x => x.Name));
+          users = CallAuthenticationService<User[]>(s => s.GetUsers()).OrderBy(x => x.Name);
+          algorithmClasses.AddRange(CallAdminService<AlgorithmClass[]>(s => s.GetAlgorithmClasses()).OrderBy(x => x.Name));
+          algorithms.AddRange(CallAdminService<Algorithm[]>(s => s.GetAlgorithms()).OrderBy(x => x.Name));
+          problemClasses.AddRange(CallAdminService<ProblemClass[]>(s => s.GetProblemClasses()).OrderBy(x => x.Name));
+          problems.AddRange(CallAdminService<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 = CallAdminService<long>(s => s.AddPlatform((Platform)item));
+          else if (item is DataType)
+            item.Id = CallAdminService<long>(s => s.AddDataType((DataType)item));
+          else if (item is AlgorithmClass)
+            item.Id = CallAdminService<long>(s => s.AddAlgorithmClass((AlgorithmClass)item));
+          else if (item is Algorithm)
+            item.Id = CallAdminService<long>(s => s.AddAlgorithm((Algorithm)item));
+          else if (item is ProblemClass)
+            item.Id = CallAdminService<long>(s => s.AddProblemClass((ProblemClass)item));
+          else if (item is Problem)
+            item.Id = CallAdminService<long>(s => s.AddProblem((Problem)item));
+        } else {
+          if (item is Platform)
+            CallAdminService(s => s.UpdatePlatform((Platform)item));
+          else if (item is DataType)
+            CallAdminService(s => s.UpdateDataType((DataType)item));
+          else if (item is AlgorithmClass)
+            CallAdminService(s => s.UpdateAlgorithmClass((AlgorithmClass)item));
+          else if (item is Algorithm)
+            CallAdminService(s => s.UpdateAlgorithm((Algorithm)item));
+          else if (item is ProblemClass)
+            CallAdminService(s => s.UpdateProblemClass((ProblemClass)item));
+          else if (item is Problem)
+            CallAdminService(s => s.UpdateProblem((Problem)item));
+        }
+        return true;
+      }
+      catch (Exception ex) {
+        ErrorHandling.ShowErrorDialog("Store failed.", ex);
+        return false;
+      }
+    }
+    #endregion
+
+    #region Algorithm Methods
+    public Guid[] GetAlgorithmUsers(long algorithmId) {
+      try {
+        return CallAdminService<Guid[]>(s => s.GetAlgorithmUsers(algorithmId));
+      }
+      catch (Exception ex) {
+        ErrorHandling.ShowErrorDialog("Refresh authorized algorithm users failed.", ex);
+        return null;
+      }
+    }
+    public bool UpdateAlgorithmUsers(long algorithmId, Guid[] users) {
+      try {
+        CallAdminService(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 CallAdminService<AlgorithmData>(s => s.GetAlgorithmData(algorithmId));
+      }
+      catch (Exception ex) {
+        ErrorHandling.ShowErrorDialog("Refresh algorithm data failed.", ex);
+        return null;
+      }
+    }
+    public bool UpdateAlgorithmData(AlgorithmData algorithmData) {
+      try {
+        CallAdminService(s => s.UpdateAlgorithmData(algorithmData));
+        return true;
+      }
+      catch (Exception ex) {
+        ErrorHandling.ShowErrorDialog("Update algorithm data failed.", ex);
+        return false;
+      }
+    }
+    #endregion
+
+    #region Problem Methods
+    public Guid[] GetProblemUsers(long problemId) {
+      try {
+        return CallAdminService<Guid[]>(s => s.GetProblemUsers(problemId));
+      }
+      catch (Exception ex) {
+        ErrorHandling.ShowErrorDialog("Refresh authorized problem users failed.", ex);
+        return null;
+      }
+    }
+    public bool UpdateProblemUsers(long problemId, Guid[] users) {
+      try {
+        CallAdminService(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 CallAdminService<ProblemData>(s => s.GetProblemData(problemId));
+      }
+      catch (Exception ex) {
+        ErrorHandling.ShowErrorDialog("Refresh problem data failed.", ex);
+        return null;
+      }
+    }
+    public bool UpdateProblemData(ProblemData problemData) {
+      try {
+        CallAdminService(s => s.UpdateProblemData(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)
+          CallAdminService(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)
+          CallAdminService(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)
+          CallAdminService(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)
+          CallAdminService(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)
+          CallAdminService(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)
+          CallAdminService(s => s.DeleteProblem(p.Id));
+      }
+      catch (Exception ex) {
+        ErrorHandling.ShowErrorDialog("Delete failed.", ex);
+      }
+    }
+    #endregion
+
+    #region Helpers
+    private void CallAdminService(Action<IOKBService> call) {
+      OKBServiceClient client = ClientFactory.CreateClient<OKBServiceClient, IOKBService>();
+      try {
+        call(client);
+      }
+      finally {
+        try {
+          client.Close();
+        }
+        catch (Exception) {
+          client.Abort();
+        }
+      }
+    }
+    private T CallAdminService<T>(Func<IOKBService, T> call) {
+      OKBServiceClient client = ClientFactory.CreateClient<OKBServiceClient, IOKBService>();
+      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/HeuristicLab.Clients.OKB-3.3/OKBExperiment.cs
===================================================================
--- branches/OKB/HeuristicLab.Clients.OKB-3.3/OKBExperiment.cs	(revision 4548)
+++ branches/OKB/HeuristicLab.Clients.OKB-3.3/OKBExperiment.cs	(revision 4548)
@@ -0,0 +1,124 @@
+﻿#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.Core;
+using HeuristicLab.Optimization;
+using HeuristicLab.Common;
+using System.Drawing;
+
+namespace HeuristicLab.Clients.OKB {
+  [Creatable("OKB")]
+  [Item("OKB Experiment", "...")]
+  public sealed class OKBExperiment : NamedItem, IOptimizer, IStorableContent {
+    public string Filename { get; set; }
+
+    public override Image ItemImage {
+      get {
+        if (ExecutionState == ExecutionState.Prepared) return HeuristicLab.Common.Resources.VS2008ImageLibrary.ExecutablePrepared;
+        else if (ExecutionState == ExecutionState.Started) return HeuristicLab.Common.Resources.VS2008ImageLibrary.ExecutableStarted;
+        else if (ExecutionState == ExecutionState.Paused) return HeuristicLab.Common.Resources.VS2008ImageLibrary.ExecutablePaused;
+        else if (ExecutionState == ExecutionState.Stopped) return HeuristicLab.Common.Resources.VS2008ImageLibrary.ExecutableStopped;
+        else return HeuristicLab.Common.Resources.VS2008ImageLibrary.Event;
+      }
+    }
+
+    public override bool CanChangeName {
+      get { return false; }
+    }
+    public override bool CanChangeDescription {
+      get { return false; }
+    }
+
+    private IAlgorithm algorithm;
+    private IAlgorithm Algorithm {
+      get { return algorithm; }
+      set { algorithm = value; }
+    }
+    private IProblem problem;
+    private IProblem Problem {
+      get { return problem; }
+      set { problem = value; }
+    }
+
+    public void LoadAlgorithm(long algorithmId) {
+
+    }
+    public void LoadProblem(long problemId) {
+
+    }
+
+
+
+    #region IOptimizer Members
+
+    public void Prepare(bool clearRuns) {
+      throw new System.NotImplementedException();
+    }
+
+    public RunCollection Runs {
+      get { throw new System.NotImplementedException(); }
+    }
+
+    #endregion
+
+    #region IExecutable Members
+
+    public event System.EventHandler<EventArgs<System.Exception>> ExceptionOccurred;
+
+    public ExecutionState ExecutionState {
+      get { throw new System.NotImplementedException(); }
+    }
+
+    public event System.EventHandler ExecutionStateChanged;
+
+    public System.TimeSpan ExecutionTime {
+      get { throw new System.NotImplementedException(); }
+    }
+
+    public event System.EventHandler ExecutionTimeChanged;
+
+    public void Pause() {
+      throw new System.NotImplementedException();
+    }
+
+    public event System.EventHandler Paused;
+
+    public void Prepare() {
+      throw new System.NotImplementedException();
+    }
+
+    public event System.EventHandler Prepared;
+
+    public void Start() {
+      throw new System.NotImplementedException();
+    }
+
+    public event System.EventHandler Started;
+
+    public void Stop() {
+      throw new System.NotImplementedException();
+    }
+
+    public event System.EventHandler Stopped;
+
+    #endregion
+  }
+}
Index: branches/OKB/HeuristicLab.Clients.OKB-3.3/ServiceClients/AdminServiceClient.cs
===================================================================
--- branches/OKB/HeuristicLab.Clients.OKB-3.3/ServiceClients/AdminServiceClient.cs	(revision 4539)
+++ 	(revision )
@@ -1,677 +1,0 @@
-﻿//------------------------------------------------------------------------------
-// <auto-generated>
-//     This code was generated by a tool.
-//     Runtime Version:4.0.30319.1
-//
-//     Changes to this file may cause incorrect behavior and will be lost if
-//     the code is regenerated.
-// </auto-generated>
-//------------------------------------------------------------------------------
-
-namespace HeuristicLab.Clients.OKB {
-
-
-  [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.DataTransfer")]
-  public partial class ProblemClass : HeuristicLab.Clients.OKB.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.DataTransfer")]
-  [System.Runtime.Serialization.KnownTypeAttribute(typeof(HeuristicLab.Clients.OKB.DataType))]
-  [System.Runtime.Serialization.KnownTypeAttribute(typeof(HeuristicLab.Clients.OKB.NamedOKBItem))]
-  [System.Runtime.Serialization.KnownTypeAttribute(typeof(HeuristicLab.Clients.OKB.Problem))]
-  [System.Runtime.Serialization.KnownTypeAttribute(typeof(HeuristicLab.Clients.OKB.Platform))]
-  [System.Runtime.Serialization.KnownTypeAttribute(typeof(HeuristicLab.Clients.OKB.AlgorithmClass))]
-  [System.Runtime.Serialization.KnownTypeAttribute(typeof(HeuristicLab.Clients.OKB.Algorithm))]
-  [System.Runtime.Serialization.KnownTypeAttribute(typeof(HeuristicLab.Clients.OKB.ProblemClass))]
-  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 = "DataType", Namespace = "http://schemas.datacontract.org/2004/07/HeuristicLab.Services.OKB.DataTransfer")]
-  public partial class DataType : HeuristicLab.Clients.OKB.OKBItem {
-
-    private string NameField;
-
-    private long PlatformIdField;
-
-    private string SqlNameField;
-
-    [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 long PlatformId {
-      get {
-        return this.PlatformIdField;
-      }
-      set {
-        if ((this.PlatformIdField.Equals(value) != true)) {
-          this.PlatformIdField = value;
-          this.RaisePropertyChanged("PlatformId");
-        }
-      }
-    }
-
-    [System.Runtime.Serialization.DataMemberAttribute()]
-    public string SqlName {
-      get {
-        return this.SqlNameField;
-      }
-      set {
-        if ((object.ReferenceEquals(this.SqlNameField, value) != true)) {
-          this.SqlNameField = value;
-          this.RaisePropertyChanged("SqlName");
-        }
-      }
-    }
-  }
-
-  [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.DataTransfer")]
-  [System.Runtime.Serialization.KnownTypeAttribute(typeof(HeuristicLab.Clients.OKB.Problem))]
-  [System.Runtime.Serialization.KnownTypeAttribute(typeof(HeuristicLab.Clients.OKB.Platform))]
-  [System.Runtime.Serialization.KnownTypeAttribute(typeof(HeuristicLab.Clients.OKB.AlgorithmClass))]
-  [System.Runtime.Serialization.KnownTypeAttribute(typeof(HeuristicLab.Clients.OKB.Algorithm))]
-  [System.Runtime.Serialization.KnownTypeAttribute(typeof(HeuristicLab.Clients.OKB.ProblemClass))]
-  public partial class NamedOKBItem : HeuristicLab.Clients.OKB.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 = "Problem", Namespace = "http://schemas.datacontract.org/2004/07/HeuristicLab.Services.OKB.DataTransfer")]
-  public partial class Problem : HeuristicLab.Clients.OKB.NamedOKBItem {
-
-    private long PlatformIdField;
-
-    private long ProblemClassIdField;
-
-    [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 = "Platform", Namespace = "http://schemas.datacontract.org/2004/07/HeuristicLab.Services.OKB.DataTransfer")]
-  public partial class Platform : HeuristicLab.Clients.OKB.NamedOKBItem {
-  }
-
-  [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.DataTransfer")]
-  public partial class AlgorithmClass : HeuristicLab.Clients.OKB.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.DataTransfer")]
-  public partial class Algorithm : HeuristicLab.Clients.OKB.NamedOKBItem {
-
-    private long AlgorithmClassIdField;
-
-    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 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 = "ProblemData", Namespace = "http://schemas.datacontract.org/2004/07/HeuristicLab.Services.OKB.DataTransfer")]
-  public partial class ProblemData : object, System.Runtime.Serialization.IExtensibleDataObject, System.ComponentModel.INotifyPropertyChanged {
-
-    private System.Runtime.Serialization.ExtensionDataObject extensionDataField;
-
-    private byte[] DataField;
-
-    private long DataTypeIdField;
-
-    private long ProblemIdField;
-
-    public System.Runtime.Serialization.ExtensionDataObject ExtensionData {
-      get {
-        return this.extensionDataField;
-      }
-      set {
-        this.extensionDataField = value;
-      }
-    }
-
-    [System.Runtime.Serialization.DataMemberAttribute()]
-    public byte[] Data {
-      get {
-        return this.DataField;
-      }
-      set {
-        if ((object.ReferenceEquals(this.DataField, value) != true)) {
-          this.DataField = value;
-          this.RaisePropertyChanged("Data");
-        }
-      }
-    }
-
-    [System.Runtime.Serialization.DataMemberAttribute()]
-    public long DataTypeId {
-      get {
-        return this.DataTypeIdField;
-      }
-      set {
-        if ((this.DataTypeIdField.Equals(value) != true)) {
-          this.DataTypeIdField = value;
-          this.RaisePropertyChanged("DataTypeId");
-        }
-      }
-    }
-
-    [System.Runtime.Serialization.DataMemberAttribute()]
-    public long ProblemId {
-      get {
-        return this.ProblemIdField;
-      }
-      set {
-        if ((this.ProblemIdField.Equals(value) != true)) {
-          this.ProblemIdField = value;
-          this.RaisePropertyChanged("ProblemId");
-        }
-      }
-    }
-
-    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 = "AlgorithmData", Namespace = "http://schemas.datacontract.org/2004/07/HeuristicLab.Services.OKB.DataTransfer")]
-  public partial class AlgorithmData : object, System.Runtime.Serialization.IExtensibleDataObject, System.ComponentModel.INotifyPropertyChanged {
-
-    private System.Runtime.Serialization.ExtensionDataObject extensionDataField;
-
-    private long AlgorithmIdField;
-
-    private byte[] DataField;
-
-    private long DataTypeIdField;
-
-    public System.Runtime.Serialization.ExtensionDataObject ExtensionData {
-      get {
-        return this.extensionDataField;
-      }
-      set {
-        this.extensionDataField = value;
-      }
-    }
-
-    [System.Runtime.Serialization.DataMemberAttribute()]
-    public long AlgorithmId {
-      get {
-        return this.AlgorithmIdField;
-      }
-      set {
-        if ((this.AlgorithmIdField.Equals(value) != true)) {
-          this.AlgorithmIdField = value;
-          this.RaisePropertyChanged("AlgorithmId");
-        }
-      }
-    }
-
-    [System.Runtime.Serialization.DataMemberAttribute()]
-    public byte[] Data {
-      get {
-        return this.DataField;
-      }
-      set {
-        if ((object.ReferenceEquals(this.DataField, value) != true)) {
-          this.DataField = value;
-          this.RaisePropertyChanged("Data");
-        }
-      }
-    }
-
-    [System.Runtime.Serialization.DataMemberAttribute()]
-    public long DataTypeId {
-      get {
-        return this.DataTypeIdField;
-      }
-      set {
-        if ((this.DataTypeIdField.Equals(value) != true)) {
-          this.DataTypeIdField = value;
-          this.RaisePropertyChanged("DataTypeId");
-        }
-      }
-    }
-
-    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.IAdminService")]
-  public interface IAdminService {
-
-    [System.ServiceModel.OperationContractAttribute(Action = "http://tempuri.org/IAdminService/GetProblemClasses", ReplyAction = "http://tempuri.org/IAdminService/GetProblemClassesResponse")]
-    HeuristicLab.Clients.OKB.ProblemClass[] GetProblemClasses();
-
-    [System.ServiceModel.OperationContractAttribute(Action = "http://tempuri.org/IAdminService/AddProblemClass", ReplyAction = "http://tempuri.org/IAdminService/AddProblemClassResponse")]
-    long AddProblemClass(HeuristicLab.Clients.OKB.ProblemClass dto);
-
-    [System.ServiceModel.OperationContractAttribute(Action = "http://tempuri.org/IAdminService/UpdateProblemClass", ReplyAction = "http://tempuri.org/IAdminService/UpdateProblemClassResponse")]
-    void UpdateProblemClass(HeuristicLab.Clients.OKB.ProblemClass dto);
-
-    [System.ServiceModel.OperationContractAttribute(Action = "http://tempuri.org/IAdminService/DeleteProblemClass", ReplyAction = "http://tempuri.org/IAdminService/DeleteProblemClassResponse")]
-    void DeleteProblemClass(long id);
-
-    [System.ServiceModel.OperationContractAttribute(Action = "http://tempuri.org/IAdminService/GetProblem", ReplyAction = "http://tempuri.org/IAdminService/GetProblemResponse")]
-    HeuristicLab.Clients.OKB.Problem GetProblem(long id);
-
-    [System.ServiceModel.OperationContractAttribute(Action = "http://tempuri.org/IAdminService/GetProblems", ReplyAction = "http://tempuri.org/IAdminService/GetProblemsResponse")]
-    HeuristicLab.Clients.OKB.Problem[] GetProblems();
-
-    [System.ServiceModel.OperationContractAttribute(Action = "http://tempuri.org/IAdminService/AddProblem", ReplyAction = "http://tempuri.org/IAdminService/AddProblemResponse")]
-    long AddProblem(HeuristicLab.Clients.OKB.Problem dto);
-
-    [System.ServiceModel.OperationContractAttribute(Action = "http://tempuri.org/IAdminService/UpdateProblem", ReplyAction = "http://tempuri.org/IAdminService/UpdateProblemResponse")]
-    void UpdateProblem(HeuristicLab.Clients.OKB.Problem dto);
-
-    [System.ServiceModel.OperationContractAttribute(Action = "http://tempuri.org/IAdminService/DeleteProblem", ReplyAction = "http://tempuri.org/IAdminService/DeleteProblemResponse")]
-    void DeleteProblem(long id);
-
-    [System.ServiceModel.OperationContractAttribute(Action = "http://tempuri.org/IAdminService/GetProblemUsers", ReplyAction = "http://tempuri.org/IAdminService/GetProblemUsersResponse")]
-    System.Guid[] GetProblemUsers(long problemId);
-
-    [System.ServiceModel.OperationContractAttribute(Action = "http://tempuri.org/IAdminService/UpdateProblemUsers", ReplyAction = "http://tempuri.org/IAdminService/UpdateProblemUsersResponse")]
-    void UpdateProblemUsers(long problemId, System.Guid[] users);
-
-    [System.ServiceModel.OperationContractAttribute(Action = "http://tempuri.org/IAdminService/GetProblemData", ReplyAction = "http://tempuri.org/IAdminService/GetProblemDataResponse")]
-    HeuristicLab.Clients.OKB.ProblemData GetProblemData(long problemId);
-
-    [System.ServiceModel.OperationContractAttribute(Action = "http://tempuri.org/IAdminService/UpdateProblemData", ReplyAction = "http://tempuri.org/IAdminService/UpdateProblemDataResponse")]
-    void UpdateProblemData(HeuristicLab.Clients.OKB.ProblemData dto);
-
-    [System.ServiceModel.OperationContractAttribute(Action = "http://tempuri.org/IAdminService/GetPlatform", ReplyAction = "http://tempuri.org/IAdminService/GetPlatformResponse")]
-    HeuristicLab.Clients.OKB.Platform GetPlatform(long id);
-
-    [System.ServiceModel.OperationContractAttribute(Action = "http://tempuri.org/IAdminService/GetPlatforms", ReplyAction = "http://tempuri.org/IAdminService/GetPlatformsResponse")]
-    HeuristicLab.Clients.OKB.Platform[] GetPlatforms();
-
-    [System.ServiceModel.OperationContractAttribute(Action = "http://tempuri.org/IAdminService/AddPlatform", ReplyAction = "http://tempuri.org/IAdminService/AddPlatformResponse")]
-    long AddPlatform(HeuristicLab.Clients.OKB.Platform dto);
-
-    [System.ServiceModel.OperationContractAttribute(Action = "http://tempuri.org/IAdminService/UpdatePlatform", ReplyAction = "http://tempuri.org/IAdminService/UpdatePlatformResponse")]
-    void UpdatePlatform(HeuristicLab.Clients.OKB.Platform dto);
-
-    [System.ServiceModel.OperationContractAttribute(Action = "http://tempuri.org/IAdminService/DeletePlatform", ReplyAction = "http://tempuri.org/IAdminService/DeletePlatformResponse")]
-    void DeletePlatform(long id);
-
-    [System.ServiceModel.OperationContractAttribute(Action = "http://tempuri.org/IAdminService/GetDataType", ReplyAction = "http://tempuri.org/IAdminService/GetDataTypeResponse")]
-    HeuristicLab.Clients.OKB.DataType GetDataType(long id);
-
-    [System.ServiceModel.OperationContractAttribute(Action = "http://tempuri.org/IAdminService/GetDataTypes", ReplyAction = "http://tempuri.org/IAdminService/GetDataTypesResponse")]
-    HeuristicLab.Clients.OKB.DataType[] GetDataTypes();
-
-    [System.ServiceModel.OperationContractAttribute(Action = "http://tempuri.org/IAdminService/AddDataType", ReplyAction = "http://tempuri.org/IAdminService/AddDataTypeResponse")]
-    long AddDataType(HeuristicLab.Clients.OKB.DataType dto);
-
-    [System.ServiceModel.OperationContractAttribute(Action = "http://tempuri.org/IAdminService/UpdateDataType", ReplyAction = "http://tempuri.org/IAdminService/UpdateDataTypeResponse")]
-    void UpdateDataType(HeuristicLab.Clients.OKB.DataType dto);
-
-    [System.ServiceModel.OperationContractAttribute(Action = "http://tempuri.org/IAdminService/DeleteDataType", ReplyAction = "http://tempuri.org/IAdminService/DeleteDataTypeResponse")]
-    void DeleteDataType(long id);
-
-    [System.ServiceModel.OperationContractAttribute(Action = "http://tempuri.org/IAdminService/GetAlgorithmClass", ReplyAction = "http://tempuri.org/IAdminService/GetAlgorithmClassResponse")]
-    HeuristicLab.Clients.OKB.AlgorithmClass GetAlgorithmClass(long id);
-
-    [System.ServiceModel.OperationContractAttribute(Action = "http://tempuri.org/IAdminService/GetAlgorithmClasses", ReplyAction = "http://tempuri.org/IAdminService/GetAlgorithmClassesResponse")]
-    HeuristicLab.Clients.OKB.AlgorithmClass[] GetAlgorithmClasses();
-
-    [System.ServiceModel.OperationContractAttribute(Action = "http://tempuri.org/IAdminService/AddAlgorithmClass", ReplyAction = "http://tempuri.org/IAdminService/AddAlgorithmClassResponse")]
-    long AddAlgorithmClass(HeuristicLab.Clients.OKB.AlgorithmClass dto);
-
-    [System.ServiceModel.OperationContractAttribute(Action = "http://tempuri.org/IAdminService/UpdateAlgorithmClass", ReplyAction = "http://tempuri.org/IAdminService/UpdateAlgorithmClassResponse")]
-    void UpdateAlgorithmClass(HeuristicLab.Clients.OKB.AlgorithmClass dto);
-
-    [System.ServiceModel.OperationContractAttribute(Action = "http://tempuri.org/IAdminService/DeleteAlgorithmClass", ReplyAction = "http://tempuri.org/IAdminService/DeleteAlgorithmClassResponse")]
-    void DeleteAlgorithmClass(long id);
-
-    [System.ServiceModel.OperationContractAttribute(Action = "http://tempuri.org/IAdminService/GetAlgorithm", ReplyAction = "http://tempuri.org/IAdminService/GetAlgorithmResponse")]
-    HeuristicLab.Clients.OKB.Algorithm GetAlgorithm(long id);
-
-    [System.ServiceModel.OperationContractAttribute(Action = "http://tempuri.org/IAdminService/GetAlgorithms", ReplyAction = "http://tempuri.org/IAdminService/GetAlgorithmsResponse")]
-    HeuristicLab.Clients.OKB.Algorithm[] GetAlgorithms();
-
-    [System.ServiceModel.OperationContractAttribute(Action = "http://tempuri.org/IAdminService/AddAlgorithm", ReplyAction = "http://tempuri.org/IAdminService/AddAlgorithmResponse")]
-    long AddAlgorithm(HeuristicLab.Clients.OKB.Algorithm dto);
-
-    [System.ServiceModel.OperationContractAttribute(Action = "http://tempuri.org/IAdminService/UpdateAlgorithm", ReplyAction = "http://tempuri.org/IAdminService/UpdateAlgorithmResponse")]
-    void UpdateAlgorithm(HeuristicLab.Clients.OKB.Algorithm dto);
-
-    [System.ServiceModel.OperationContractAttribute(Action = "http://tempuri.org/IAdminService/DeleteAlgorithm", ReplyAction = "http://tempuri.org/IAdminService/DeleteAlgorithmResponse")]
-    void DeleteAlgorithm(long id);
-
-    [System.ServiceModel.OperationContractAttribute(Action = "http://tempuri.org/IAdminService/GetAlgorithmUsers", ReplyAction = "http://tempuri.org/IAdminService/GetAlgorithmUsersResponse")]
-    System.Guid[] GetAlgorithmUsers(long algorithmId);
-
-    [System.ServiceModel.OperationContractAttribute(Action = "http://tempuri.org/IAdminService/UpdateAlgorithmUsers", ReplyAction = "http://tempuri.org/IAdminService/UpdateAlgorithmUsersResponse")]
-    void UpdateAlgorithmUsers(long algorithmId, System.Guid[] users);
-
-    [System.ServiceModel.OperationContractAttribute(Action = "http://tempuri.org/IAdminService/GetAlgorithmData", ReplyAction = "http://tempuri.org/IAdminService/GetAlgorithmDataResponse")]
-    HeuristicLab.Clients.OKB.AlgorithmData GetAlgorithmData(long algorithmId);
-
-    [System.ServiceModel.OperationContractAttribute(Action = "http://tempuri.org/IAdminService/UpdateAlgorithmData", ReplyAction = "http://tempuri.org/IAdminService/UpdateAlgorithmDataResponse")]
-    void UpdateAlgorithmData(HeuristicLab.Clients.OKB.AlgorithmData dto);
-
-    [System.ServiceModel.OperationContractAttribute(Action = "http://tempuri.org/IAdminService/GetProblemClass", ReplyAction = "http://tempuri.org/IAdminService/GetProblemClassResponse")]
-    HeuristicLab.Clients.OKB.ProblemClass GetProblemClass(long id);
-  }
-
-  [System.CodeDom.Compiler.GeneratedCodeAttribute("System.ServiceModel", "4.0.0.0")]
-  public interface IAdminServiceChannel : HeuristicLab.Clients.OKB.IAdminService, System.ServiceModel.IClientChannel {
-  }
-
-  [System.Diagnostics.DebuggerStepThroughAttribute()]
-  [System.CodeDom.Compiler.GeneratedCodeAttribute("System.ServiceModel", "4.0.0.0")]
-  public partial class AdminServiceClient : System.ServiceModel.ClientBase<HeuristicLab.Clients.OKB.IAdminService>, HeuristicLab.Clients.OKB.IAdminService {
-
-    public AdminServiceClient() {
-    }
-
-    public AdminServiceClient(string endpointConfigurationName) :
-      base(endpointConfigurationName) {
-    }
-
-    public AdminServiceClient(string endpointConfigurationName, string remoteAddress) :
-      base(endpointConfigurationName, remoteAddress) {
-    }
-
-    public AdminServiceClient(string endpointConfigurationName, System.ServiceModel.EndpointAddress remoteAddress) :
-      base(endpointConfigurationName, remoteAddress) {
-    }
-
-    public AdminServiceClient(System.ServiceModel.Channels.Binding binding, System.ServiceModel.EndpointAddress remoteAddress) :
-      base(binding, remoteAddress) {
-    }
-
-    public HeuristicLab.Clients.OKB.ProblemClass[] GetProblemClasses() {
-      return base.Channel.GetProblemClasses();
-    }
-
-    public long AddProblemClass(HeuristicLab.Clients.OKB.ProblemClass dto) {
-      return base.Channel.AddProblemClass(dto);
-    }
-
-    public void UpdateProblemClass(HeuristicLab.Clients.OKB.ProblemClass dto) {
-      base.Channel.UpdateProblemClass(dto);
-    }
-
-    public void DeleteProblemClass(long id) {
-      base.Channel.DeleteProblemClass(id);
-    }
-
-    public HeuristicLab.Clients.OKB.Problem GetProblem(long id) {
-      return base.Channel.GetProblem(id);
-    }
-
-    public HeuristicLab.Clients.OKB.Problem[] GetProblems() {
-      return base.Channel.GetProblems();
-    }
-
-    public long AddProblem(HeuristicLab.Clients.OKB.Problem dto) {
-      return base.Channel.AddProblem(dto);
-    }
-
-    public void UpdateProblem(HeuristicLab.Clients.OKB.Problem dto) {
-      base.Channel.UpdateProblem(dto);
-    }
-
-    public void DeleteProblem(long id) {
-      base.Channel.DeleteProblem(id);
-    }
-
-    public System.Guid[] GetProblemUsers(long problemId) {
-      return base.Channel.GetProblemUsers(problemId);
-    }
-
-    public void UpdateProblemUsers(long problemId, System.Guid[] users) {
-      base.Channel.UpdateProblemUsers(problemId, users);
-    }
-
-    public HeuristicLab.Clients.OKB.ProblemData GetProblemData(long problemId) {
-      return base.Channel.GetProblemData(problemId);
-    }
-
-    public void UpdateProblemData(HeuristicLab.Clients.OKB.ProblemData dto) {
-      base.Channel.UpdateProblemData(dto);
-    }
-
-    public HeuristicLab.Clients.OKB.Platform GetPlatform(long id) {
-      return base.Channel.GetPlatform(id);
-    }
-
-    public HeuristicLab.Clients.OKB.Platform[] GetPlatforms() {
-      return base.Channel.GetPlatforms();
-    }
-
-    public long AddPlatform(HeuristicLab.Clients.OKB.Platform dto) {
-      return base.Channel.AddPlatform(dto);
-    }
-
-    public void UpdatePlatform(HeuristicLab.Clients.OKB.Platform dto) {
-      base.Channel.UpdatePlatform(dto);
-    }
-
-    public void DeletePlatform(long id) {
-      base.Channel.DeletePlatform(id);
-    }
-
-    public HeuristicLab.Clients.OKB.DataType GetDataType(long id) {
-      return base.Channel.GetDataType(id);
-    }
-
-    public HeuristicLab.Clients.OKB.DataType[] GetDataTypes() {
-      return base.Channel.GetDataTypes();
-    }
-
-    public long AddDataType(HeuristicLab.Clients.OKB.DataType dto) {
-      return base.Channel.AddDataType(dto);
-    }
-
-    public void UpdateDataType(HeuristicLab.Clients.OKB.DataType dto) {
-      base.Channel.UpdateDataType(dto);
-    }
-
-    public void DeleteDataType(long id) {
-      base.Channel.DeleteDataType(id);
-    }
-
-    public HeuristicLab.Clients.OKB.AlgorithmClass GetAlgorithmClass(long id) {
-      return base.Channel.GetAlgorithmClass(id);
-    }
-
-    public HeuristicLab.Clients.OKB.AlgorithmClass[] GetAlgorithmClasses() {
-      return base.Channel.GetAlgorithmClasses();
-    }
-
-    public long AddAlgorithmClass(HeuristicLab.Clients.OKB.AlgorithmClass dto) {
-      return base.Channel.AddAlgorithmClass(dto);
-    }
-
-    public void UpdateAlgorithmClass(HeuristicLab.Clients.OKB.AlgorithmClass dto) {
-      base.Channel.UpdateAlgorithmClass(dto);
-    }
-
-    public void DeleteAlgorithmClass(long id) {
-      base.Channel.DeleteAlgorithmClass(id);
-    }
-
-    public HeuristicLab.Clients.OKB.Algorithm GetAlgorithm(long id) {
-      return base.Channel.GetAlgorithm(id);
-    }
-
-    public HeuristicLab.Clients.OKB.Algorithm[] GetAlgorithms() {
-      return base.Channel.GetAlgorithms();
-    }
-
-    public long AddAlgorithm(HeuristicLab.Clients.OKB.Algorithm dto) {
-      return base.Channel.AddAlgorithm(dto);
-    }
-
-    public void UpdateAlgorithm(HeuristicLab.Clients.OKB.Algorithm dto) {
-      base.Channel.UpdateAlgorithm(dto);
-    }
-
-    public void DeleteAlgorithm(long id) {
-      base.Channel.DeleteAlgorithm(id);
-    }
-
-    public System.Guid[] GetAlgorithmUsers(long algorithmId) {
-      return base.Channel.GetAlgorithmUsers(algorithmId);
-    }
-
-    public void UpdateAlgorithmUsers(long algorithmId, System.Guid[] users) {
-      base.Channel.UpdateAlgorithmUsers(algorithmId, users);
-    }
-
-    public HeuristicLab.Clients.OKB.AlgorithmData GetAlgorithmData(long algorithmId) {
-      return base.Channel.GetAlgorithmData(algorithmId);
-    }
-
-    public void UpdateAlgorithmData(HeuristicLab.Clients.OKB.AlgorithmData dto) {
-      base.Channel.UpdateAlgorithmData(dto);
-    }
-
-    public HeuristicLab.Clients.OKB.ProblemClass GetProblemClass(long id) {
-      return base.Channel.GetProblemClass(id);
-    }
-  }
-}
Index: branches/OKB/HeuristicLab.Clients.OKB-3.3/ServiceClients/GenerateServiceClients.cmd
===================================================================
--- branches/OKB/HeuristicLab.Clients.OKB-3.3/ServiceClients/GenerateServiceClients.cmd	(revision 4539)
+++ branches/OKB/HeuristicLab.Clients.OKB-3.3/ServiceClients/GenerateServiceClients.cmd	(revision 4548)
@@ -3,10 +3,10 @@
 echo.
 echo *******************************************************************************************
-echo Generating AdminService client
+echo Generating OKBService client
 echo.
 
 svcutil.exe ^
-  http://localhost:8732/Design_Time_Addresses/OKB-3.3/AdminService/mex ^
-  /out:AdminServiceClient ^
+  http://localhost:8732/Design_Time_Addresses/OKB-3.3/OKBService/mex ^
+  /out:OKBServiceClient ^
   /namespace:*,HeuristicLab.Clients.OKB ^
   /targetClientVersion:Version35 ^
@@ -24,5 +24,5 @@
 echo ---------------------------------------------------------------------------------------
 echo.
-echo Generation of AdminService client finished.
+echo Generation of OKBService client finished.
 echo *******************************************************************************************
 echo.
Index: branches/OKB/HeuristicLab.Clients.OKB-3.3/ServiceClients/OKBItem.cs
===================================================================
--- branches/OKB/HeuristicLab.Clients.OKB-3.3/ServiceClients/OKBItem.cs	(revision 4539)
+++ branches/OKB/HeuristicLab.Clients.OKB-3.3/ServiceClients/OKBItem.cs	(revision 4548)
@@ -86,5 +86,5 @@
 
     public void Store() {
-      if (Administrator.Instance.Store(this))
+      if (OKB.Instance.Store(this))
         Modified = false;
     }
Index: branches/OKB/HeuristicLab.Clients.OKB-3.3/ServiceClients/OKBServiceClient.cs
===================================================================
--- branches/OKB/HeuristicLab.Clients.OKB-3.3/ServiceClients/OKBServiceClient.cs	(revision 4548)
+++ branches/OKB/HeuristicLab.Clients.OKB-3.3/ServiceClients/OKBServiceClient.cs	(revision 4548)
@@ -0,0 +1,677 @@
+﻿//------------------------------------------------------------------------------
+// <auto-generated>
+//     This code was generated by a tool.
+//     Runtime Version:4.0.30319.1
+//
+//     Changes to this file may cause incorrect behavior and will be lost if
+//     the code is regenerated.
+// </auto-generated>
+//------------------------------------------------------------------------------
+
+namespace HeuristicLab.Clients.OKB {
+
+
+  [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.DataTransfer")]
+  public partial class ProblemClass : HeuristicLab.Clients.OKB.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.DataTransfer")]
+  [System.Runtime.Serialization.KnownTypeAttribute(typeof(HeuristicLab.Clients.OKB.DataType))]
+  [System.Runtime.Serialization.KnownTypeAttribute(typeof(HeuristicLab.Clients.OKB.NamedOKBItem))]
+  [System.Runtime.Serialization.KnownTypeAttribute(typeof(HeuristicLab.Clients.OKB.Problem))]
+  [System.Runtime.Serialization.KnownTypeAttribute(typeof(HeuristicLab.Clients.OKB.Platform))]
+  [System.Runtime.Serialization.KnownTypeAttribute(typeof(HeuristicLab.Clients.OKB.AlgorithmClass))]
+  [System.Runtime.Serialization.KnownTypeAttribute(typeof(HeuristicLab.Clients.OKB.Algorithm))]
+  [System.Runtime.Serialization.KnownTypeAttribute(typeof(HeuristicLab.Clients.OKB.ProblemClass))]
+  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 = "DataType", Namespace = "http://schemas.datacontract.org/2004/07/HeuristicLab.Services.OKB.DataTransfer")]
+  public partial class DataType : HeuristicLab.Clients.OKB.OKBItem {
+
+    private string NameField;
+
+    private long PlatformIdField;
+
+    private string SqlNameField;
+
+    [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 long PlatformId {
+      get {
+        return this.PlatformIdField;
+      }
+      set {
+        if ((this.PlatformIdField.Equals(value) != true)) {
+          this.PlatformIdField = value;
+          this.RaisePropertyChanged("PlatformId");
+        }
+      }
+    }
+
+    [System.Runtime.Serialization.DataMemberAttribute()]
+    public string SqlName {
+      get {
+        return this.SqlNameField;
+      }
+      set {
+        if ((object.ReferenceEquals(this.SqlNameField, value) != true)) {
+          this.SqlNameField = value;
+          this.RaisePropertyChanged("SqlName");
+        }
+      }
+    }
+  }
+
+  [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.DataTransfer")]
+  [System.Runtime.Serialization.KnownTypeAttribute(typeof(HeuristicLab.Clients.OKB.Problem))]
+  [System.Runtime.Serialization.KnownTypeAttribute(typeof(HeuristicLab.Clients.OKB.Platform))]
+  [System.Runtime.Serialization.KnownTypeAttribute(typeof(HeuristicLab.Clients.OKB.AlgorithmClass))]
+  [System.Runtime.Serialization.KnownTypeAttribute(typeof(HeuristicLab.Clients.OKB.Algorithm))]
+  [System.Runtime.Serialization.KnownTypeAttribute(typeof(HeuristicLab.Clients.OKB.ProblemClass))]
+  public partial class NamedOKBItem : HeuristicLab.Clients.OKB.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 = "Problem", Namespace = "http://schemas.datacontract.org/2004/07/HeuristicLab.Services.OKB.DataTransfer")]
+  public partial class Problem : HeuristicLab.Clients.OKB.NamedOKBItem {
+
+    private long PlatformIdField;
+
+    private long ProblemClassIdField;
+
+    [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 = "Platform", Namespace = "http://schemas.datacontract.org/2004/07/HeuristicLab.Services.OKB.DataTransfer")]
+  public partial class Platform : HeuristicLab.Clients.OKB.NamedOKBItem {
+  }
+
+  [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.DataTransfer")]
+  public partial class AlgorithmClass : HeuristicLab.Clients.OKB.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.DataTransfer")]
+  public partial class Algorithm : HeuristicLab.Clients.OKB.NamedOKBItem {
+
+    private long AlgorithmClassIdField;
+
+    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 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 = "ProblemData", Namespace = "http://schemas.datacontract.org/2004/07/HeuristicLab.Services.OKB.DataTransfer")]
+  public partial class ProblemData : object, System.Runtime.Serialization.IExtensibleDataObject, System.ComponentModel.INotifyPropertyChanged {
+
+    private System.Runtime.Serialization.ExtensionDataObject extensionDataField;
+
+    private byte[] DataField;
+
+    private long DataTypeIdField;
+
+    private long ProblemIdField;
+
+    public System.Runtime.Serialization.ExtensionDataObject ExtensionData {
+      get {
+        return this.extensionDataField;
+      }
+      set {
+        this.extensionDataField = value;
+      }
+    }
+
+    [System.Runtime.Serialization.DataMemberAttribute()]
+    public byte[] Data {
+      get {
+        return this.DataField;
+      }
+      set {
+        if ((object.ReferenceEquals(this.DataField, value) != true)) {
+          this.DataField = value;
+          this.RaisePropertyChanged("Data");
+        }
+      }
+    }
+
+    [System.Runtime.Serialization.DataMemberAttribute()]
+    public long DataTypeId {
+      get {
+        return this.DataTypeIdField;
+      }
+      set {
+        if ((this.DataTypeIdField.Equals(value) != true)) {
+          this.DataTypeIdField = value;
+          this.RaisePropertyChanged("DataTypeId");
+        }
+      }
+    }
+
+    [System.Runtime.Serialization.DataMemberAttribute()]
+    public long ProblemId {
+      get {
+        return this.ProblemIdField;
+      }
+      set {
+        if ((this.ProblemIdField.Equals(value) != true)) {
+          this.ProblemIdField = value;
+          this.RaisePropertyChanged("ProblemId");
+        }
+      }
+    }
+
+    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 = "AlgorithmData", Namespace = "http://schemas.datacontract.org/2004/07/HeuristicLab.Services.OKB.DataTransfer")]
+  public partial class AlgorithmData : object, System.Runtime.Serialization.IExtensibleDataObject, System.ComponentModel.INotifyPropertyChanged {
+
+    private System.Runtime.Serialization.ExtensionDataObject extensionDataField;
+
+    private long AlgorithmIdField;
+
+    private byte[] DataField;
+
+    private long DataTypeIdField;
+
+    public System.Runtime.Serialization.ExtensionDataObject ExtensionData {
+      get {
+        return this.extensionDataField;
+      }
+      set {
+        this.extensionDataField = value;
+      }
+    }
+
+    [System.Runtime.Serialization.DataMemberAttribute()]
+    public long AlgorithmId {
+      get {
+        return this.AlgorithmIdField;
+      }
+      set {
+        if ((this.AlgorithmIdField.Equals(value) != true)) {
+          this.AlgorithmIdField = value;
+          this.RaisePropertyChanged("AlgorithmId");
+        }
+      }
+    }
+
+    [System.Runtime.Serialization.DataMemberAttribute()]
+    public byte[] Data {
+      get {
+        return this.DataField;
+      }
+      set {
+        if ((object.ReferenceEquals(this.DataField, value) != true)) {
+          this.DataField = value;
+          this.RaisePropertyChanged("Data");
+        }
+      }
+    }
+
+    [System.Runtime.Serialization.DataMemberAttribute()]
+    public long DataTypeId {
+      get {
+        return this.DataTypeIdField;
+      }
+      set {
+        if ((this.DataTypeIdField.Equals(value) != true)) {
+          this.DataTypeIdField = value;
+          this.RaisePropertyChanged("DataTypeId");
+        }
+      }
+    }
+
+    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.IOKBService")]
+  public interface IOKBService {
+
+    [System.ServiceModel.OperationContractAttribute(Action = "http://tempuri.org/IOKBService/GetProblemClasses", ReplyAction = "http://tempuri.org/IOKBService/GetProblemClassesResponse")]
+    HeuristicLab.Clients.OKB.ProblemClass[] GetProblemClasses();
+
+    [System.ServiceModel.OperationContractAttribute(Action = "http://tempuri.org/IOKBService/AddProblemClass", ReplyAction = "http://tempuri.org/IOKBService/AddProblemClassResponse")]
+    long AddProblemClass(HeuristicLab.Clients.OKB.ProblemClass dto);
+
+    [System.ServiceModel.OperationContractAttribute(Action = "http://tempuri.org/IOKBService/UpdateProblemClass", ReplyAction = "http://tempuri.org/IOKBService/UpdateProblemClassResponse")]
+    void UpdateProblemClass(HeuristicLab.Clients.OKB.ProblemClass dto);
+
+    [System.ServiceModel.OperationContractAttribute(Action = "http://tempuri.org/IOKBService/DeleteProblemClass", ReplyAction = "http://tempuri.org/IOKBService/DeleteProblemClassResponse")]
+    void DeleteProblemClass(long id);
+
+    [System.ServiceModel.OperationContractAttribute(Action = "http://tempuri.org/IOKBService/GetProblem", ReplyAction = "http://tempuri.org/IOKBService/GetProblemResponse")]
+    HeuristicLab.Clients.OKB.Problem GetProblem(long id);
+
+    [System.ServiceModel.OperationContractAttribute(Action = "http://tempuri.org/IOKBService/GetProblems", ReplyAction = "http://tempuri.org/IOKBService/GetProblemsResponse")]
+    HeuristicLab.Clients.OKB.Problem[] GetProblems();
+
+    [System.ServiceModel.OperationContractAttribute(Action = "http://tempuri.org/IOKBService/AddProblem", ReplyAction = "http://tempuri.org/IOKBService/AddProblemResponse")]
+    long AddProblem(HeuristicLab.Clients.OKB.Problem dto);
+
+    [System.ServiceModel.OperationContractAttribute(Action = "http://tempuri.org/IOKBService/UpdateProblem", ReplyAction = "http://tempuri.org/IOKBService/UpdateProblemResponse")]
+    void UpdateProblem(HeuristicLab.Clients.OKB.Problem dto);
+
+    [System.ServiceModel.OperationContractAttribute(Action = "http://tempuri.org/IOKBService/DeleteProblem", ReplyAction = "http://tempuri.org/IOKBService/DeleteProblemResponse")]
+    void DeleteProblem(long id);
+
+    [System.ServiceModel.OperationContractAttribute(Action = "http://tempuri.org/IOKBService/GetProblemUsers", ReplyAction = "http://tempuri.org/IOKBService/GetProblemUsersResponse")]
+    System.Guid[] GetProblemUsers(long problemId);
+
+    [System.ServiceModel.OperationContractAttribute(Action = "http://tempuri.org/IOKBService/UpdateProblemUsers", ReplyAction = "http://tempuri.org/IOKBService/UpdateProblemUsersResponse")]
+    void UpdateProblemUsers(long problemId, System.Guid[] users);
+
+    [System.ServiceModel.OperationContractAttribute(Action = "http://tempuri.org/IOKBService/GetProblemData", ReplyAction = "http://tempuri.org/IOKBService/GetProblemDataResponse")]
+    HeuristicLab.Clients.OKB.ProblemData GetProblemData(long problemId);
+
+    [System.ServiceModel.OperationContractAttribute(Action = "http://tempuri.org/IOKBService/UpdateProblemData", ReplyAction = "http://tempuri.org/IOKBService/UpdateProblemDataResponse")]
+    void UpdateProblemData(HeuristicLab.Clients.OKB.ProblemData dto);
+
+    [System.ServiceModel.OperationContractAttribute(Action = "http://tempuri.org/IOKBService/GetPlatform", ReplyAction = "http://tempuri.org/IOKBService/GetPlatformResponse")]
+    HeuristicLab.Clients.OKB.Platform GetPlatform(long id);
+
+    [System.ServiceModel.OperationContractAttribute(Action = "http://tempuri.org/IOKBService/GetPlatforms", ReplyAction = "http://tempuri.org/IOKBService/GetPlatformsResponse")]
+    HeuristicLab.Clients.OKB.Platform[] GetPlatforms();
+
+    [System.ServiceModel.OperationContractAttribute(Action = "http://tempuri.org/IOKBService/AddPlatform", ReplyAction = "http://tempuri.org/IOKBService/AddPlatformResponse")]
+    long AddPlatform(HeuristicLab.Clients.OKB.Platform dto);
+
+    [System.ServiceModel.OperationContractAttribute(Action = "http://tempuri.org/IOKBService/UpdatePlatform", ReplyAction = "http://tempuri.org/IOKBService/UpdatePlatformResponse")]
+    void UpdatePlatform(HeuristicLab.Clients.OKB.Platform dto);
+
+    [System.ServiceModel.OperationContractAttribute(Action = "http://tempuri.org/IOKBService/DeletePlatform", ReplyAction = "http://tempuri.org/IOKBService/DeletePlatformResponse")]
+    void DeletePlatform(long id);
+
+    [System.ServiceModel.OperationContractAttribute(Action = "http://tempuri.org/IOKBService/GetDataType", ReplyAction = "http://tempuri.org/IOKBService/GetDataTypeResponse")]
+    HeuristicLab.Clients.OKB.DataType GetDataType(long id);
+
+    [System.ServiceModel.OperationContractAttribute(Action = "http://tempuri.org/IOKBService/GetDataTypes", ReplyAction = "http://tempuri.org/IOKBService/GetDataTypesResponse")]
+    HeuristicLab.Clients.OKB.DataType[] GetDataTypes();
+
+    [System.ServiceModel.OperationContractAttribute(Action = "http://tempuri.org/IOKBService/AddDataType", ReplyAction = "http://tempuri.org/IOKBService/AddDataTypeResponse")]
+    long AddDataType(HeuristicLab.Clients.OKB.DataType dto);
+
+    [System.ServiceModel.OperationContractAttribute(Action = "http://tempuri.org/IOKBService/UpdateDataType", ReplyAction = "http://tempuri.org/IOKBService/UpdateDataTypeResponse")]
+    void UpdateDataType(HeuristicLab.Clients.OKB.DataType dto);
+
+    [System.ServiceModel.OperationContractAttribute(Action = "http://tempuri.org/IOKBService/DeleteDataType", ReplyAction = "http://tempuri.org/IOKBService/DeleteDataTypeResponse")]
+    void DeleteDataType(long id);
+
+    [System.ServiceModel.OperationContractAttribute(Action = "http://tempuri.org/IOKBService/GetAlgorithmClass", ReplyAction = "http://tempuri.org/IOKBService/GetAlgorithmClassResponse")]
+    HeuristicLab.Clients.OKB.AlgorithmClass GetAlgorithmClass(long id);
+
+    [System.ServiceModel.OperationContractAttribute(Action = "http://tempuri.org/IOKBService/GetAlgorithmClasses", ReplyAction = "http://tempuri.org/IOKBService/GetAlgorithmClassesResponse")]
+    HeuristicLab.Clients.OKB.AlgorithmClass[] GetAlgorithmClasses();
+
+    [System.ServiceModel.OperationContractAttribute(Action = "http://tempuri.org/IOKBService/AddAlgorithmClass", ReplyAction = "http://tempuri.org/IOKBService/AddAlgorithmClassResponse")]
+    long AddAlgorithmClass(HeuristicLab.Clients.OKB.AlgorithmClass dto);
+
+    [System.ServiceModel.OperationContractAttribute(Action = "http://tempuri.org/IOKBService/UpdateAlgorithmClass", ReplyAction = "http://tempuri.org/IOKBService/UpdateAlgorithmClassResponse")]
+    void UpdateAlgorithmClass(HeuristicLab.Clients.OKB.AlgorithmClass dto);
+
+    [System.ServiceModel.OperationContractAttribute(Action = "http://tempuri.org/IOKBService/DeleteAlgorithmClass", ReplyAction = "http://tempuri.org/IOKBService/DeleteAlgorithmClassResponse")]
+    void DeleteAlgorithmClass(long id);
+
+    [System.ServiceModel.OperationContractAttribute(Action = "http://tempuri.org/IOKBService/GetAlgorithm", ReplyAction = "http://tempuri.org/IOKBService/GetAlgorithmResponse")]
+    HeuristicLab.Clients.OKB.Algorithm GetAlgorithm(long id);
+
+    [System.ServiceModel.OperationContractAttribute(Action = "http://tempuri.org/IOKBService/GetAlgorithms", ReplyAction = "http://tempuri.org/IOKBService/GetAlgorithmsResponse")]
+    HeuristicLab.Clients.OKB.Algorithm[] GetAlgorithms();
+
+    [System.ServiceModel.OperationContractAttribute(Action = "http://tempuri.org/IOKBService/AddAlgorithm", ReplyAction = "http://tempuri.org/IOKBService/AddAlgorithmResponse")]
+    long AddAlgorithm(HeuristicLab.Clients.OKB.Algorithm dto);
+
+    [System.ServiceModel.OperationContractAttribute(Action = "http://tempuri.org/IOKBService/UpdateAlgorithm", ReplyAction = "http://tempuri.org/IOKBService/UpdateAlgorithmResponse")]
+    void UpdateAlgorithm(HeuristicLab.Clients.OKB.Algorithm dto);
+
+    [System.ServiceModel.OperationContractAttribute(Action = "http://tempuri.org/IOKBService/DeleteAlgorithm", ReplyAction = "http://tempuri.org/IOKBService/DeleteAlgorithmResponse")]
+    void DeleteAlgorithm(long id);
+
+    [System.ServiceModel.OperationContractAttribute(Action = "http://tempuri.org/IOKBService/GetAlgorithmUsers", ReplyAction = "http://tempuri.org/IOKBService/GetAlgorithmUsersResponse")]
+    System.Guid[] GetAlgorithmUsers(long algorithmId);
+
+    [System.ServiceModel.OperationContractAttribute(Action = "http://tempuri.org/IOKBService/UpdateAlgorithmUsers", ReplyAction = "http://tempuri.org/IOKBService/UpdateAlgorithmUsersResponse")]
+    void UpdateAlgorithmUsers(long algorithmId, System.Guid[] users);
+
+    [System.ServiceModel.OperationContractAttribute(Action = "http://tempuri.org/IOKBService/GetAlgorithmData", ReplyAction = "http://tempuri.org/IOKBService/GetAlgorithmDataResponse")]
+    HeuristicLab.Clients.OKB.AlgorithmData GetAlgorithmData(long algorithmId);
+
+    [System.ServiceModel.OperationContractAttribute(Action = "http://tempuri.org/IOKBService/UpdateAlgorithmData", ReplyAction = "http://tempuri.org/IOKBService/UpdateAlgorithmDataResponse")]
+    void UpdateAlgorithmData(HeuristicLab.Clients.OKB.AlgorithmData dto);
+
+    [System.ServiceModel.OperationContractAttribute(Action = "http://tempuri.org/IOKBService/GetProblemClass", ReplyAction = "http://tempuri.org/IOKBService/GetProblemClassResponse")]
+    HeuristicLab.Clients.OKB.ProblemClass GetProblemClass(long id);
+  }
+
+  [System.CodeDom.Compiler.GeneratedCodeAttribute("System.ServiceModel", "4.0.0.0")]
+  public interface IOKBServiceChannel : HeuristicLab.Clients.OKB.IOKBService, System.ServiceModel.IClientChannel {
+  }
+
+  [System.Diagnostics.DebuggerStepThroughAttribute()]
+  [System.CodeDom.Compiler.GeneratedCodeAttribute("System.ServiceModel", "4.0.0.0")]
+  public partial class OKBServiceClient : System.ServiceModel.ClientBase<HeuristicLab.Clients.OKB.IOKBService>, HeuristicLab.Clients.OKB.IOKBService {
+
+    public OKBServiceClient() {
+    }
+
+    public OKBServiceClient(string endpointConfigurationName) :
+      base(endpointConfigurationName) {
+    }
+
+    public OKBServiceClient(string endpointConfigurationName, string remoteAddress) :
+      base(endpointConfigurationName, remoteAddress) {
+    }
+
+    public OKBServiceClient(string endpointConfigurationName, System.ServiceModel.EndpointAddress remoteAddress) :
+      base(endpointConfigurationName, remoteAddress) {
+    }
+
+    public OKBServiceClient(System.ServiceModel.Channels.Binding binding, System.ServiceModel.EndpointAddress remoteAddress) :
+      base(binding, remoteAddress) {
+    }
+
+    public HeuristicLab.Clients.OKB.ProblemClass[] GetProblemClasses() {
+      return base.Channel.GetProblemClasses();
+    }
+
+    public long AddProblemClass(HeuristicLab.Clients.OKB.ProblemClass dto) {
+      return base.Channel.AddProblemClass(dto);
+    }
+
+    public void UpdateProblemClass(HeuristicLab.Clients.OKB.ProblemClass dto) {
+      base.Channel.UpdateProblemClass(dto);
+    }
+
+    public void DeleteProblemClass(long id) {
+      base.Channel.DeleteProblemClass(id);
+    }
+
+    public HeuristicLab.Clients.OKB.Problem GetProblem(long id) {
+      return base.Channel.GetProblem(id);
+    }
+
+    public HeuristicLab.Clients.OKB.Problem[] GetProblems() {
+      return base.Channel.GetProblems();
+    }
+
+    public long AddProblem(HeuristicLab.Clients.OKB.Problem dto) {
+      return base.Channel.AddProblem(dto);
+    }
+
+    public void UpdateProblem(HeuristicLab.Clients.OKB.Problem dto) {
+      base.Channel.UpdateProblem(dto);
+    }
+
+    public void DeleteProblem(long id) {
+      base.Channel.DeleteProblem(id);
+    }
+
+    public System.Guid[] GetProblemUsers(long problemId) {
+      return base.Channel.GetProblemUsers(problemId);
+    }
+
+    public void UpdateProblemUsers(long problemId, System.Guid[] users) {
+      base.Channel.UpdateProblemUsers(problemId, users);
+    }
+
+    public HeuristicLab.Clients.OKB.ProblemData GetProblemData(long problemId) {
+      return base.Channel.GetProblemData(problemId);
+    }
+
+    public void UpdateProblemData(HeuristicLab.Clients.OKB.ProblemData dto) {
+      base.Channel.UpdateProblemData(dto);
+    }
+
+    public HeuristicLab.Clients.OKB.Platform GetPlatform(long id) {
+      return base.Channel.GetPlatform(id);
+    }
+
+    public HeuristicLab.Clients.OKB.Platform[] GetPlatforms() {
+      return base.Channel.GetPlatforms();
+    }
+
+    public long AddPlatform(HeuristicLab.Clients.OKB.Platform dto) {
+      return base.Channel.AddPlatform(dto);
+    }
+
+    public void UpdatePlatform(HeuristicLab.Clients.OKB.Platform dto) {
+      base.Channel.UpdatePlatform(dto);
+    }
+
+    public void DeletePlatform(long id) {
+      base.Channel.DeletePlatform(id);
+    }
+
+    public HeuristicLab.Clients.OKB.DataType GetDataType(long id) {
+      return base.Channel.GetDataType(id);
+    }
+
+    public HeuristicLab.Clients.OKB.DataType[] GetDataTypes() {
+      return base.Channel.GetDataTypes();
+    }
+
+    public long AddDataType(HeuristicLab.Clients.OKB.DataType dto) {
+      return base.Channel.AddDataType(dto);
+    }
+
+    public void UpdateDataType(HeuristicLab.Clients.OKB.DataType dto) {
+      base.Channel.UpdateDataType(dto);
+    }
+
+    public void DeleteDataType(long id) {
+      base.Channel.DeleteDataType(id);
+    }
+
+    public HeuristicLab.Clients.OKB.AlgorithmClass GetAlgorithmClass(long id) {
+      return base.Channel.GetAlgorithmClass(id);
+    }
+
+    public HeuristicLab.Clients.OKB.AlgorithmClass[] GetAlgorithmClasses() {
+      return base.Channel.GetAlgorithmClasses();
+    }
+
+    public long AddAlgorithmClass(HeuristicLab.Clients.OKB.AlgorithmClass dto) {
+      return base.Channel.AddAlgorithmClass(dto);
+    }
+
+    public void UpdateAlgorithmClass(HeuristicLab.Clients.OKB.AlgorithmClass dto) {
+      base.Channel.UpdateAlgorithmClass(dto);
+    }
+
+    public void DeleteAlgorithmClass(long id) {
+      base.Channel.DeleteAlgorithmClass(id);
+    }
+
+    public HeuristicLab.Clients.OKB.Algorithm GetAlgorithm(long id) {
+      return base.Channel.GetAlgorithm(id);
+    }
+
+    public HeuristicLab.Clients.OKB.Algorithm[] GetAlgorithms() {
+      return base.Channel.GetAlgorithms();
+    }
+
+    public long AddAlgorithm(HeuristicLab.Clients.OKB.Algorithm dto) {
+      return base.Channel.AddAlgorithm(dto);
+    }
+
+    public void UpdateAlgorithm(HeuristicLab.Clients.OKB.Algorithm dto) {
+      base.Channel.UpdateAlgorithm(dto);
+    }
+
+    public void DeleteAlgorithm(long id) {
+      base.Channel.DeleteAlgorithm(id);
+    }
+
+    public System.Guid[] GetAlgorithmUsers(long algorithmId) {
+      return base.Channel.GetAlgorithmUsers(algorithmId);
+    }
+
+    public void UpdateAlgorithmUsers(long algorithmId, System.Guid[] users) {
+      base.Channel.UpdateAlgorithmUsers(algorithmId, users);
+    }
+
+    public HeuristicLab.Clients.OKB.AlgorithmData GetAlgorithmData(long algorithmId) {
+      return base.Channel.GetAlgorithmData(algorithmId);
+    }
+
+    public void UpdateAlgorithmData(HeuristicLab.Clients.OKB.AlgorithmData dto) {
+      base.Channel.UpdateAlgorithmData(dto);
+    }
+
+    public HeuristicLab.Clients.OKB.ProblemClass GetProblemClass(long id) {
+      return base.Channel.GetProblemClass(id);
+    }
+  }
+}
Index: branches/OKB/HeuristicLab.Clients.OKB-3.3/Views/AdministratorView.cs
===================================================================
--- branches/OKB/HeuristicLab.Clients.OKB-3.3/Views/AdministratorView.cs	(revision 4539)
+++ branches/OKB/HeuristicLab.Clients.OKB-3.3/Views/AdministratorView.cs	(revision 4548)
@@ -27,8 +27,8 @@
 namespace HeuristicLab.Clients.OKB {
   [View("OKB Administrator")]
-  [Content(typeof(Administrator), true)]
+  [Content(typeof(OKB), true)]
   public sealed partial class AdministratorView : AsynchronousContentView {
-    public new Administrator Content {
-      get { return (Administrator)base.Content; }
+    public new OKB Content {
+      get { return (OKB)base.Content; }
       set { base.Content = value; }
     }
Index: branches/OKB/HeuristicLab.Clients.OKB-3.3/Views/AlgorithmDataView.cs
===================================================================
--- branches/OKB/HeuristicLab.Clients.OKB-3.3/Views/AlgorithmDataView.cs	(revision 4539)
+++ branches/OKB/HeuristicLab.Clients.OKB-3.3/Views/AlgorithmDataView.cs	(revision 4548)
@@ -60,5 +60,5 @@
     protected override void OnInitialized(System.EventArgs e) {
       base.OnInitialized(e);
-      dataTypeComboBox.DataSource = Administrator.Instance.DataTypes.ToList();
+      dataTypeComboBox.DataSource = OKB.Instance.DataTypes.ToList();
       dataTypeComboBox.SelectedIndex = -1;
     }
@@ -80,5 +80,5 @@
         noViewAvailableLabel.Visible = false;
       } else {
-        dataTypeComboBox.SelectedItem = Administrator.Instance.DataTypes.FirstOrDefault(d => d.Id == Content.DataTypeId);
+        dataTypeComboBox.SelectedItem = OKB.Instance.DataTypes.FirstOrDefault(d => d.Id == Content.DataTypeId);
 
         using (MemoryStream stream = new MemoryStream(Content.Data)) {
@@ -111,5 +111,5 @@
       switch (e.PropertyName) {
         case "DataTypeId":
-          dataTypeComboBox.SelectedItem = Administrator.Instance.DataTypes.FirstOrDefault(d => d.Id == Content.DataTypeId);
+          dataTypeComboBox.SelectedItem = OKB.Instance.DataTypes.FirstOrDefault(d => d.Id == Content.DataTypeId);
           break;
       }
@@ -119,5 +119,5 @@
       BeginAsyncCall();
       var call = new Action(delegate() {
-        AlgorithmData data = Administrator.Instance.GetAlgorithmData(AlgorithmId);
+        AlgorithmData data = OKB.Instance.GetAlgorithmData(AlgorithmId);
         Content = data;
       });
@@ -142,5 +142,5 @@
         }
       }
-      Administrator.Instance.UpdateAlgorithmData(Content);
+      OKB.Instance.UpdateAlgorithmData(Content);
     }
     private void newDataButton_Click(object sender, EventArgs e) {
@@ -153,11 +153,11 @@
             if (Content == null) Content = new AlgorithmData { AlgorithmId = AlgorithmId };
             viewHost.Content = (IContent)dialog.TypeSelector.CreateInstanceOfSelectedType();
-            DataType dataType = Administrator.Instance.DataTypes.FirstOrDefault(d => d.Name == viewHost.Content.GetType().AssemblyQualifiedName);
+            DataType dataType = OKB.Instance.DataTypes.FirstOrDefault(d => d.Name == viewHost.Content.GetType().AssemblyQualifiedName);
             if (dataType == null) {
               dataType = new DataType { Name = viewHost.Content.GetType().AssemblyQualifiedName, SqlName = "varbinary" };
-              dataType.PlatformId = Administrator.Instance.Platforms.FirstOrDefault(p => p.Name == "HeuristicLab 3.3").Id;
+              dataType.PlatformId = OKB.Instance.Platforms.FirstOrDefault(p => p.Name == "HeuristicLab 3.3").Id;
               dataType.Store();
-              Administrator.Instance.DataTypes.Add(dataType);
-              dataTypeComboBox.DataSource = Administrator.Instance.DataTypes.OrderBy(d => d.Name).ToList();
+              OKB.Instance.DataTypes.Add(dataType);
+              dataTypeComboBox.DataSource = OKB.Instance.DataTypes.OrderBy(d => d.Name).ToList();
             }
             dataTypeComboBox.SelectedItem = dataType;
@@ -185,11 +185,11 @@
             viewHost.Content = algorithm;
             noViewAvailableLabel.Visible = false;
-            DataType dataType = Administrator.Instance.DataTypes.FirstOrDefault(d => d.Name == viewHost.Content.GetType().AssemblyQualifiedName);
+            DataType dataType = OKB.Instance.DataTypes.FirstOrDefault(d => d.Name == viewHost.Content.GetType().AssemblyQualifiedName);
             if (dataType == null) {
               dataType = new DataType { Name = viewHost.Content.GetType().AssemblyQualifiedName, SqlName = "varbinary" };
-              dataType.PlatformId = Administrator.Instance.Platforms.FirstOrDefault(p => p.Name == "HeuristicLab 3.3").Id;
+              dataType.PlatformId = OKB.Instance.Platforms.FirstOrDefault(p => p.Name == "HeuristicLab 3.3").Id;
               dataType.Store();
-              Administrator.Instance.DataTypes.Add(dataType);
-              dataTypeComboBox.DataSource = Administrator.Instance.DataTypes.OrderBy(d => d.Name).ToList();
+              OKB.Instance.DataTypes.Add(dataType);
+              dataTypeComboBox.DataSource = OKB.Instance.DataTypes.OrderBy(d => d.Name).ToList();
             }
             dataTypeComboBox.SelectedItem = dataType;
Index: branches/OKB/HeuristicLab.Clients.OKB-3.3/Views/AlgorithmView.cs
===================================================================
--- branches/OKB/HeuristicLab.Clients.OKB-3.3/Views/AlgorithmView.cs	(revision 4539)
+++ branches/OKB/HeuristicLab.Clients.OKB-3.3/Views/AlgorithmView.cs	(revision 4548)
@@ -42,6 +42,6 @@
     protected override void OnInitialized(System.EventArgs e) {
       base.OnInitialized(e);
-      platformComboBox.DataSource = Administrator.Instance.Platforms.ToList();
-      algorithmClassComboBox.DataSource = Administrator.Instance.AlgorithmClasses.ToList();
+      platformComboBox.DataSource = OKB.Instance.Platforms.ToList();
+      algorithmClassComboBox.DataSource = OKB.Instance.AlgorithmClasses.ToList();
     }
 
@@ -53,6 +53,6 @@
         algorithmDataView.AlgorithmId = 0;
       } else {
-        platformComboBox.SelectedItem = Administrator.Instance.Platforms.FirstOrDefault(p => p.Id == Content.PlatformId);
-        algorithmClassComboBox.SelectedItem = Administrator.Instance.AlgorithmClasses.FirstOrDefault(a => a.Id == Content.AlgorithmClassId);
+        platformComboBox.SelectedItem = OKB.Instance.Platforms.FirstOrDefault(p => p.Id == Content.PlatformId);
+        algorithmClassComboBox.SelectedItem = OKB.Instance.AlgorithmClasses.FirstOrDefault(a => a.Id == Content.AlgorithmClassId);
         algorithmDataView.AlgorithmId = Content.Id;
       }
@@ -77,8 +77,8 @@
           break;
         case "PlatformId":
-          platformComboBox.SelectedItem = Administrator.Instance.Platforms.FirstOrDefault(p => p.Id == Content.PlatformId);
+          platformComboBox.SelectedItem = OKB.Instance.Platforms.FirstOrDefault(p => p.Id == Content.PlatformId);
           break;
         case "AlgorithmClassId":
-          algorithmClassComboBox.SelectedItem = Administrator.Instance.AlgorithmClasses.FirstOrDefault(a => a.Id == Content.AlgorithmClassId);
+          algorithmClassComboBox.SelectedItem = OKB.Instance.AlgorithmClasses.FirstOrDefault(a => a.Id == Content.AlgorithmClassId);
           break;
       }
@@ -99,7 +99,7 @@
 
     private void refreshUsersButton_Click(object sender, System.EventArgs e) {
-      Guid[] ids = Administrator.Instance.GetAlgorithmUsers(Content.Id);
+      Guid[] ids = OKB.Instance.GetAlgorithmUsers(Content.Id);
       if (ids != null) {
-        List<User> users = Administrator.Instance.Users.ToList();
+        List<User> users = OKB.Instance.Users.ToList();
         usersListBox.DataSource = users;
         usersListBox.DisplayMember = "Name";
@@ -112,5 +112,5 @@
     }
     private void storeUsersButton_Click(object sender, System.EventArgs e) {
-      if (Administrator.Instance.UpdateAlgorithmUsers(Content.Id, usersListBox.SelectedItems.Cast<User>().Select(u => u.Id).ToArray()))
+      if (OKB.Instance.UpdateAlgorithmUsers(Content.Id, usersListBox.SelectedItems.Cast<User>().Select(u => u.Id).ToArray()))
         storeUsersButton.Enabled = false;
     }
Index: branches/OKB/HeuristicLab.Clients.OKB-3.3/Views/DataTypeView.cs
===================================================================
--- branches/OKB/HeuristicLab.Clients.OKB-3.3/Views/DataTypeView.cs	(revision 4539)
+++ branches/OKB/HeuristicLab.Clients.OKB-3.3/Views/DataTypeView.cs	(revision 4548)
@@ -41,5 +41,5 @@
     protected override void OnInitialized(System.EventArgs e) {
       base.OnInitialized(e);
-      platformComboBox.DataSource = Administrator.Instance.Platforms.ToList();
+      platformComboBox.DataSource = OKB.Instance.Platforms.ToList();
     }
 
@@ -57,5 +57,5 @@
         nameTextBox.Text = Content.Name;
         sqlNameComboBox.Text = Content.SqlName;
-        platformComboBox.SelectedItem = Administrator.Instance.Platforms.FirstOrDefault(p => p.Id == Content.PlatformId);
+        platformComboBox.SelectedItem = OKB.Instance.Platforms.FirstOrDefault(p => p.Id == Content.PlatformId);
         Caption = Content.Name;
       }
@@ -80,5 +80,5 @@
           break;
         case "PlatformId":
-          platformComboBox.SelectedItem = Administrator.Instance.Platforms.FirstOrDefault(p => p.Id == Content.PlatformId);
+          platformComboBox.SelectedItem = OKB.Instance.Platforms.FirstOrDefault(p => p.Id == Content.PlatformId);
           break;
       }
Index: branches/OKB/HeuristicLab.Clients.OKB-3.3/Views/OKBExperimentView.Designer.cs
===================================================================
--- branches/OKB/HeuristicLab.Clients.OKB-3.3/Views/OKBExperimentView.Designer.cs	(revision 4548)
+++ branches/OKB/HeuristicLab.Clients.OKB-3.3/Views/OKBExperimentView.Designer.cs	(revision 4548)
@@ -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
+
+namespace HeuristicLab.Clients.OKB {
+  partial class OKBExperimentView {
+    /// <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() {
+      ((System.ComponentModel.ISupportInitialize)(this.errorProvider)).BeginInit();
+      this.SuspendLayout();
+      // 
+      // nameTextBox
+      // 
+      this.errorProvider.SetIconAlignment(this.nameTextBox, System.Windows.Forms.ErrorIconAlignment.MiddleLeft);
+      this.errorProvider.SetIconPadding(this.nameTextBox, 2);
+      this.nameTextBox.Size = new System.Drawing.Size(463, 20);
+      // 
+      // descriptionTextBox
+      // 
+      this.descriptionTextBox.Size = new System.Drawing.Size(463, 20);
+      // 
+      // OKBExperimentView
+      // 
+      this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
+      this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
+      this.Name = "OKBExperimentView";
+      this.Size = new System.Drawing.Size(535, 388);
+      ((System.ComponentModel.ISupportInitialize)(this.errorProvider)).EndInit();
+      this.ResumeLayout(false);
+      this.PerformLayout();
+
+    }
+
+    #endregion
+
+
+
+
+  }
+}
Index: branches/OKB/HeuristicLab.Clients.OKB-3.3/Views/OKBExperimentView.cs
===================================================================
--- branches/OKB/HeuristicLab.Clients.OKB-3.3/Views/OKBExperimentView.cs	(revision 4548)
+++ branches/OKB/HeuristicLab.Clients.OKB-3.3/Views/OKBExperimentView.cs	(revision 4548)
@@ -0,0 +1,54 @@
+#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.Views;
+using HeuristicLab.MainForm;
+using HeuristicLab.MainForm.WindowsForms;
+
+namespace HeuristicLab.Clients.OKB {
+  [View("OKBItem View")]
+  [Content(typeof(OKBExperiment), true)]
+  public partial class OKBExperimentView : NamedItemView {
+    public new OKBExperiment Content {
+      get { return (OKBExperiment)base.Content; }
+      set { base.Content = value; }
+    }
+
+    public OKBExperimentView() {
+      InitializeComponent();
+    }
+
+    protected override void DeregisterContentEvents() {
+      // ...
+      base.DeregisterContentEvents();
+    }
+    protected override void RegisterContentEvents() {
+      base.RegisterContentEvents();
+      // ...
+    }
+
+    protected override void SetEnabledStateOfControls() {
+      base.SetEnabledStateOfControls();
+      // ...
+    }
+  }
+}
Index: branches/OKB/HeuristicLab.Clients.OKB-3.3/Views/ProblemDataView.cs
===================================================================
--- branches/OKB/HeuristicLab.Clients.OKB-3.3/Views/ProblemDataView.cs	(revision 4539)
+++ branches/OKB/HeuristicLab.Clients.OKB-3.3/Views/ProblemDataView.cs	(revision 4548)
@@ -60,5 +60,5 @@
     protected override void OnInitialized(System.EventArgs e) {
       base.OnInitialized(e);
-      dataTypeComboBox.DataSource = Administrator.Instance.DataTypes.ToList();
+      dataTypeComboBox.DataSource = OKB.Instance.DataTypes.ToList();
       dataTypeComboBox.SelectedIndex = -1;
     }
@@ -80,5 +80,5 @@
         noViewAvailableLabel.Visible = false;
       } else {
-        dataTypeComboBox.SelectedItem = Administrator.Instance.DataTypes.FirstOrDefault(d => d.Id == Content.DataTypeId);
+        dataTypeComboBox.SelectedItem = OKB.Instance.DataTypes.FirstOrDefault(d => d.Id == Content.DataTypeId);
 
         using (MemoryStream stream = new MemoryStream(Content.Data)) {
@@ -111,5 +111,5 @@
       switch (e.PropertyName) {
         case "DataTypeId":
-          dataTypeComboBox.SelectedItem = Administrator.Instance.DataTypes.FirstOrDefault(d => d.Id == Content.DataTypeId);
+          dataTypeComboBox.SelectedItem = OKB.Instance.DataTypes.FirstOrDefault(d => d.Id == Content.DataTypeId);
           break;
       }
@@ -119,5 +119,5 @@
       BeginAsyncCall();
       var call = new Action(delegate() {
-        ProblemData data = Administrator.Instance.GetProblemData(ProblemId);
+        ProblemData data = OKB.Instance.GetProblemData(ProblemId);
         Content = data;
       });
@@ -141,5 +141,5 @@
         }
       }
-      Administrator.Instance.UpdateProblemData(Content);
+      OKB.Instance.UpdateProblemData(Content);
     }
     private void newDataButton_Click(object sender, EventArgs e) {
@@ -152,11 +152,11 @@
             if (Content == null) Content = new ProblemData { ProblemId = ProblemId };
             viewHost.Content = (IContent)dialog.TypeSelector.CreateInstanceOfSelectedType();
-            DataType dataType = Administrator.Instance.DataTypes.FirstOrDefault(d => d.Name == viewHost.Content.GetType().AssemblyQualifiedName);
+            DataType dataType = OKB.Instance.DataTypes.FirstOrDefault(d => d.Name == viewHost.Content.GetType().AssemblyQualifiedName);
             if (dataType == null) {
               dataType = new DataType { Name = viewHost.Content.GetType().AssemblyQualifiedName, SqlName = "varbinary" };
-              dataType.PlatformId = Administrator.Instance.Platforms.FirstOrDefault(p => p.Name == "HeuristicLab 3.3").Id;
+              dataType.PlatformId = OKB.Instance.Platforms.FirstOrDefault(p => p.Name == "HeuristicLab 3.3").Id;
               dataType.Store();
-              Administrator.Instance.DataTypes.Add(dataType);
-              dataTypeComboBox.DataSource = Administrator.Instance.DataTypes.OrderBy(d => d.Name).ToList();
+              OKB.Instance.DataTypes.Add(dataType);
+              dataTypeComboBox.DataSource = OKB.Instance.DataTypes.OrderBy(d => d.Name).ToList();
             }
             dataTypeComboBox.SelectedItem = dataType;
@@ -184,11 +184,11 @@
             viewHost.Content = problem;
             noViewAvailableLabel.Visible = false;
-            DataType dataType = Administrator.Instance.DataTypes.FirstOrDefault(d => d.Name == viewHost.Content.GetType().AssemblyQualifiedName);
+            DataType dataType = OKB.Instance.DataTypes.FirstOrDefault(d => d.Name == viewHost.Content.GetType().AssemblyQualifiedName);
             if (dataType == null) {
               dataType = new DataType { Name = viewHost.Content.GetType().AssemblyQualifiedName, SqlName = "varbinary" };
-              dataType.PlatformId = Administrator.Instance.Platforms.FirstOrDefault(p => p.Name == "HeuristicLab 3.3").Id;
+              dataType.PlatformId = OKB.Instance.Platforms.FirstOrDefault(p => p.Name == "HeuristicLab 3.3").Id;
               dataType.Store();
-              Administrator.Instance.DataTypes.Add(dataType);
-              dataTypeComboBox.DataSource = Administrator.Instance.DataTypes.OrderBy(d => d.Name).ToList();
+              OKB.Instance.DataTypes.Add(dataType);
+              dataTypeComboBox.DataSource = OKB.Instance.DataTypes.OrderBy(d => d.Name).ToList();
             }
             dataTypeComboBox.SelectedItem = dataType;
Index: branches/OKB/HeuristicLab.Clients.OKB-3.3/Views/ProblemView.cs
===================================================================
--- branches/OKB/HeuristicLab.Clients.OKB-3.3/Views/ProblemView.cs	(revision 4539)
+++ branches/OKB/HeuristicLab.Clients.OKB-3.3/Views/ProblemView.cs	(revision 4548)
@@ -42,6 +42,6 @@
     protected override void OnInitialized(System.EventArgs e) {
       base.OnInitialized(e);
-      platformComboBox.DataSource = Administrator.Instance.Platforms.ToList();
-      problemClassComboBox.DataSource = Administrator.Instance.ProblemClasses.ToList();
+      platformComboBox.DataSource = OKB.Instance.Platforms.ToList();
+      problemClassComboBox.DataSource = OKB.Instance.ProblemClasses.ToList();
     }
 
@@ -53,6 +53,6 @@
         problemDataView.ProblemId = 0;
       } else {
-        platformComboBox.SelectedItem = Administrator.Instance.Platforms.FirstOrDefault(p => p.Id == Content.PlatformId);
-        problemClassComboBox.SelectedItem = Administrator.Instance.ProblemClasses.FirstOrDefault(a => a.Id == Content.ProblemClassId);
+        platformComboBox.SelectedItem = OKB.Instance.Platforms.FirstOrDefault(p => p.Id == Content.PlatformId);
+        problemClassComboBox.SelectedItem = OKB.Instance.ProblemClasses.FirstOrDefault(a => a.Id == Content.ProblemClassId);
         problemDataView.ProblemId = Content.Id;
       }
@@ -77,8 +77,8 @@
           break;
         case "PlatformId":
-          platformComboBox.SelectedItem = Administrator.Instance.Platforms.FirstOrDefault(p => p.Id == Content.PlatformId);
+          platformComboBox.SelectedItem = OKB.Instance.Platforms.FirstOrDefault(p => p.Id == Content.PlatformId);
           break;
         case "ProblemClassId":
-          problemClassComboBox.SelectedItem = Administrator.Instance.ProblemClasses.FirstOrDefault(a => a.Id == Content.ProblemClassId);
+          problemClassComboBox.SelectedItem = OKB.Instance.ProblemClasses.FirstOrDefault(a => a.Id == Content.ProblemClassId);
           break;
       }
@@ -99,7 +99,7 @@
 
     private void refreshUsersButton_Click(object sender, System.EventArgs e) {
-      Guid[] ids = Administrator.Instance.GetProblemUsers(Content.Id);
+      Guid[] ids = OKB.Instance.GetProblemUsers(Content.Id);
       if (ids != null) {
-        List<User> users = Administrator.Instance.Users.ToList();
+        List<User> users = OKB.Instance.Users.ToList();
         usersListBox.DataSource = users;
         usersListBox.DisplayMember = "Name";
@@ -112,5 +112,5 @@
     }
     private void storeUsersButton_Click(object sender, System.EventArgs e) {
-      if (Administrator.Instance.UpdateProblemUsers(Content.Id, usersListBox.SelectedItems.Cast<User>().Select(u => u.Id).ToArray()))
+      if (OKB.Instance.UpdateProblemUsers(Content.Id, usersListBox.SelectedItems.Cast<User>().Select(u => u.Id).ToArray()))
         storeUsersButton.Enabled = false;
     }
Index: branches/OKB/HeuristicLab.Clients.OKB-3.3/app.config
===================================================================
--- branches/OKB/HeuristicLab.Clients.OKB-3.3/app.config	(revision 4539)
+++ branches/OKB/HeuristicLab.Clients.OKB-3.3/app.config	(revision 4548)
@@ -4,12 +4,12 @@
         <bindings>
             <wsHttpBinding>
-                <binding name="WSHttpBinding_IAdminService" closeTimeout="00:01:00"
+                <binding name="WSHttpBinding_IOKBService" closeTimeout="00:01:00"
                     openTimeout="00:01:00" receiveTimeout="00:10:00" sendTimeout="00:01:00"
                     bypassProxyOnLocal="false" transactionFlow="false" hostNameComparisonMode="StrongWildcard"
-                    maxBufferPoolSize="524288" maxReceivedMessageSize="200000000"
+                    maxBufferPoolSize="524288" maxReceivedMessageSize="65536"
                     messageEncoding="Text" textEncoding="utf-8" useDefaultWebProxy="true"
                     allowCookies="false">
-                    <readerQuotas maxDepth="32" maxStringContentLength="8192" maxArrayLength="200000000"
-                        maxBytesPerRead="200000000" maxNameTableCharCount="16384" />
+                    <readerQuotas maxDepth="32" maxStringContentLength="8192" maxArrayLength="16384"
+                        maxBytesPerRead="4096" maxNameTableCharCount="16384" />
                     <reliableSession ordered="true" inactivityTimeout="00:10:00"
                         enabled="false" />
@@ -41,7 +41,7 @@
         </bindings>
         <client>
-            <endpoint address="http://localhost:8732/Design_Time_Addresses/OKB-3.3/AdminService"
-                binding="wsHttpBinding" bindingConfiguration="WSHttpBinding_IAdminService"
-                contract="HeuristicLab.Clients.OKB.IAdminService" name="WSHttpBinding_IAdminService">
+            <endpoint address="http://localhost:8732/Design_Time_Addresses/OKB-3.3/OKBService"
+                binding="wsHttpBinding" bindingConfiguration="WSHttpBinding_IOKBService"
+                contract="HeuristicLab.Clients.OKB.IOKBService" name="WSHttpBinding_IOKBService">
                 <identity>
                     <certificate encodedValue="AwAAAAEAAAAUAAAAD/AlkYJw/OUhl6D/9w8mjJBh39kgAAAAAQAAAPIBAAAwggHuMIIBW6ADAgECAhAdEzTisaf2sEZxrqYZfYtCMAkGBSsOAwIdBQAwFDESMBAGA1UEAxMJbG9jYWxob3N0MB4XDTEwMDgyMDIyMzIwOFoXDTM5MTIzMTIzNTk1OVowFDESMBAGA1UEAxMJbG9jYWxob3N0MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDPkfCSLRX8/4F+Z4ys43yZ4MMzjB44cMakPz4Nri+mEB5n2z/0GFatCYzkI2f/nniWqVrBYjHkjsZy2EZioHu4wa99c1XEGJnFNDuNn6ESkfEyhyF4+OqKGnpK9HNrw7OWMuqn2oOh0iFd9fl6FTAm+Y0p3LP+38BuYzpCniqqdwIDAQABo0kwRzBFBgNVHQEEPjA8gBDvi8Rgio9v+mr58TiAvqF5oRYwFDESMBAGA1UEAxMJbG9jYWxob3N0ghAdEzTisaf2sEZxrqYZfYtCMAkGBSsOAwIdBQADgYEANdGlvHKeUptfNu9I0wgA5qjmVB+JDldOAkrfM0R+4IcVQ06y5K7P07uxQAV7+rhnDLgLyFJunUHgzbfjsjFy7vjwtoieXA5j0AYlm4AHR7dHt4HVgkIMYt8XOCqMw5jjFX91xJ89tC7mM9zYR48N9T5QSeMGo+f+JzybeLWxnNs=" />
Index: branches/OKB/HeuristicLab.Services.OKB/3.3/AdminService.cs
===================================================================
--- branches/OKB/HeuristicLab.Services.OKB/3.3/AdminService.cs	(revision 4539)
+++ 	(revision )
@@ -1,431 +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.ServiceModel;
-using HeuristicLab.Services.OKB.DataAccess;
-
-namespace HeuristicLab.Services.OKB {
-  /// <summary>
-  /// Implementation of the OKB administration service (interface <see cref="IAdminService"/>).
-  /// </summary>
-  [ServiceBehavior(IncludeExceptionDetailInFaults = true)]
-  public class AdminService : IAdminService {
-    #region Platform Methods
-    public DataTransfer.Platform GetPlatform(long id) {
-      using (OKBDataContext okb = new OKBDataContext()) {
-        return Convert.ToDto(okb.Platforms.FirstOrDefault(x => x.Id == id));
-      }
-    }
-    public IEnumerable<DataTransfer.Platform> GetPlatforms() {
-      using (OKBDataContext okb = new OKBDataContext()) {
-        return okb.Platforms.Select(x => Convert.ToDto(x)).ToArray();
-      }
-    }
-    public long AddPlatform(DataTransfer.Platform dto) {
-      using (OKBDataContext okb = new OKBDataContext()) {
-        DataAccess.Platform entity = Convert.ToEntity(dto); entity.Id = 0;
-        okb.Platforms.InsertOnSubmit(entity);
-        okb.SubmitChanges();
-        return entity.Id;
-      }
-    }
-    public void UpdatePlatform(DataTransfer.Platform dto) {
-      using (OKBDataContext okb = new OKBDataContext()) {
-        DataAccess.Platform entity = okb.Platforms.FirstOrDefault(x => x.Id == dto.Id);
-        Convert.ToEntity(dto, entity);
-        okb.SubmitChanges();
-      }
-    }
-    public void DeletePlatform(long id) {
-      using (OKBDataContext okb = new OKBDataContext()) {
-        DataAccess.Platform entity = okb.Platforms.FirstOrDefault(x => x.Id == id);
-        if (entity != null) okb.Platforms.DeleteOnSubmit(entity);
-        okb.SubmitChanges();
-      }
-    }
-    #endregion
-
-    #region DataType Methods
-    public DataTransfer.DataType GetDataType(long id) {
-      using (OKBDataContext okb = new OKBDataContext()) {
-        return Convert.ToDto(okb.DataTypes.FirstOrDefault(x => x.Id == id));
-      }
-    }
-    public IEnumerable<DataTransfer.DataType> GetDataTypes() {
-      using (OKBDataContext okb = new OKBDataContext()) {
-        return okb.DataTypes.Select(x => Convert.ToDto(x)).ToArray();
-      }
-    }
-    public long AddDataType(DataTransfer.DataType dto) {
-      using (OKBDataContext okb = new OKBDataContext()) {
-        DataAccess.DataType entity = Convert.ToEntity(dto); entity.Id = 0;
-        okb.DataTypes.InsertOnSubmit(entity);
-        okb.SubmitChanges();
-        return entity.Id;
-      }
-    }
-    public void UpdateDataType(DataTransfer.DataType dto) {
-      using (OKBDataContext okb = new OKBDataContext()) {
-        DataAccess.DataType entity = okb.DataTypes.FirstOrDefault(x => x.Id == dto.Id);
-        Convert.ToEntity(dto, entity);
-        okb.SubmitChanges();
-      }
-    }
-    public void DeleteDataType(long id) {
-      using (OKBDataContext okb = new OKBDataContext()) {
-        DataAccess.DataType entity = okb.DataTypes.FirstOrDefault(x => x.Id == id);
-        if (entity != null) okb.DataTypes.DeleteOnSubmit(entity);
-        okb.SubmitChanges();
-      }
-    }
-    #endregion
-
-    #region AlgorithmClass Methods
-    public DataTransfer.AlgorithmClass GetAlgorithmClass(long id) {
-      using (OKBDataContext okb = new OKBDataContext()) {
-        return Convert.ToDto(okb.AlgorithmClasses.FirstOrDefault(x => x.Id == id));
-      }
-    }
-    public IEnumerable<DataTransfer.AlgorithmClass> GetAlgorithmClasses() {
-      using (OKBDataContext okb = new OKBDataContext()) {
-        return okb.AlgorithmClasses.Select(x => Convert.ToDto(x)).ToArray();
-      }
-    }
-    public long AddAlgorithmClass(DataTransfer.AlgorithmClass dto) {
-      using (OKBDataContext okb = new OKBDataContext()) {
-        DataAccess.AlgorithmClass entity = Convert.ToEntity(dto); entity.Id = 0;
-        okb.AlgorithmClasses.InsertOnSubmit(entity);
-        okb.SubmitChanges();
-        return entity.Id;
-      }
-    }
-    public void UpdateAlgorithmClass(DataTransfer.AlgorithmClass dto) {
-      using (OKBDataContext okb = new OKBDataContext()) {
-        DataAccess.AlgorithmClass entity = okb.AlgorithmClasses.FirstOrDefault(x => x.Id == dto.Id);
-        Convert.ToEntity(dto, entity);
-        okb.SubmitChanges();
-      }
-    }
-    public void DeleteAlgorithmClass(long id) {
-      using (OKBDataContext okb = new OKBDataContext()) {
-        DataAccess.AlgorithmClass entity = okb.AlgorithmClasses.FirstOrDefault(x => x.Id == id);
-        if (entity != null) okb.AlgorithmClasses.DeleteOnSubmit(entity);
-        okb.SubmitChanges();
-      }
-    }
-    #endregion
-
-    #region Algorithm Methods
-    public DataTransfer.Algorithm GetAlgorithm(long id) {
-      using (OKBDataContext okb = new OKBDataContext()) {
-        return Convert.ToDto(okb.Algorithms.FirstOrDefault(x => x.Id == id));
-      }
-    }
-    public IEnumerable<DataTransfer.Algorithm> GetAlgorithms() {
-      using (OKBDataContext okb = new OKBDataContext()) {
-        return okb.Algorithms.Select(x => Convert.ToDto(x)).ToArray();
-      }
-    }
-    public long AddAlgorithm(DataTransfer.Algorithm dto) {
-      using (OKBDataContext okb = new OKBDataContext()) {
-        DataAccess.Algorithm entity = Convert.ToEntity(dto); entity.Id = 0;
-        okb.Algorithms.InsertOnSubmit(entity);
-        okb.SubmitChanges();
-        return entity.Id;
-      }
-    }
-    public void UpdateAlgorithm(DataTransfer.Algorithm dto) {
-      using (OKBDataContext okb = new OKBDataContext()) {
-        DataAccess.Algorithm entity = okb.Algorithms.FirstOrDefault(x => x.Id == dto.Id);
-        Convert.ToEntity(dto, entity);
-        okb.SubmitChanges();
-      }
-    }
-    public void DeleteAlgorithm(long id) {
-      using (OKBDataContext okb = new OKBDataContext()) {
-        DataAccess.Algorithm entity = okb.Algorithms.FirstOrDefault(x => x.Id == id);
-        if (entity != null) okb.Algorithms.DeleteOnSubmit(entity);
-        okb.SubmitChanges();
-      }
-    }
-    public IEnumerable<Guid> GetAlgorithmUsers(long algorithmId) {
-      using (OKBDataContext okb = new OKBDataContext()) {
-        return okb.AlgorithmUsers.Where(x => x.AlgorithmId == algorithmId).Select(x => x.UserId).ToArray();
-      }
-    }
-    public void UpdateAlgorithmUsers(long algorithmId, IEnumerable<Guid> users) {
-      using (OKBDataContext okb = new OKBDataContext()) {
-        okb.AlgorithmUsers.DeleteAllOnSubmit(okb.AlgorithmUsers.Where(x => x.AlgorithmId == algorithmId));
-        okb.AlgorithmUsers.InsertAllOnSubmit(users.Select(x => new DataAccess.AlgorithmUser { AlgorithmId = algorithmId, UserId = x }));
-        okb.SubmitChanges();
-      }
-    }
-    #endregion
-
-    #region AlgorithmData Methods
-    public DataTransfer.AlgorithmData GetAlgorithmData(long algorithmId) {
-      using (OKBDataContext okb = new OKBDataContext()) {
-        return Convert.ToDto(okb.AlgorithmDatas.FirstOrDefault(x => x.AlgorithmId == algorithmId));
-      }
-    }
-    public void UpdateAlgorithmData(DataTransfer.AlgorithmData dto) {
-      using (OKBDataContext okb = new OKBDataContext()) {
-        DataAccess.AlgorithmData entity = okb.AlgorithmDatas.FirstOrDefault(x => x.AlgorithmId == dto.AlgorithmId);
-        if (entity == null) okb.AlgorithmDatas.InsertOnSubmit(Convert.ToEntity(dto));
-        else Convert.ToEntity(dto, entity);
-        okb.SubmitChanges();
-      }
-    }
-    #endregion
-
-    #region ProblemClass Methods
-    public DataTransfer.ProblemClass GetProblemClass(long id) {
-      using (OKBDataContext okb = new OKBDataContext()) {
-        return Convert.ToDto(okb.ProblemClasses.FirstOrDefault(x => x.Id == id));
-      }
-    }
-    public IEnumerable<DataTransfer.ProblemClass> GetProblemClasses() {
-      using (OKBDataContext okb = new OKBDataContext()) {
-        return okb.ProblemClasses.Select(x => Convert.ToDto(x)).ToArray();
-      }
-    }
-    public long AddProblemClass(DataTransfer.ProblemClass dto) {
-      using (OKBDataContext okb = new OKBDataContext()) {
-        DataAccess.ProblemClass entity = Convert.ToEntity(dto); entity.Id = 0;
-        okb.ProblemClasses.InsertOnSubmit(entity);
-        okb.SubmitChanges();
-        return entity.Id;
-      }
-    }
-    public void UpdateProblemClass(DataTransfer.ProblemClass dto) {
-      using (OKBDataContext okb = new OKBDataContext()) {
-        DataAccess.ProblemClass entity = okb.ProblemClasses.FirstOrDefault(x => x.Id == dto.Id);
-        Convert.ToEntity(dto, entity);
-        okb.SubmitChanges();
-      }
-    }
-    public void DeleteProblemClass(long id) {
-      using (OKBDataContext okb = new OKBDataContext()) {
-        DataAccess.ProblemClass entity = okb.ProblemClasses.FirstOrDefault(x => x.Id == id);
-        if (entity != null) okb.ProblemClasses.DeleteOnSubmit(entity);
-        okb.SubmitChanges();
-      }
-    }
-    #endregion
-
-    #region Problem Methods
-    public DataTransfer.Problem GetProblem(long id) {
-      using (OKBDataContext okb = new OKBDataContext()) {
-        return Convert.ToDto(okb.Problems.FirstOrDefault(x => x.Id == id));
-      }
-    }
-    public IEnumerable<DataTransfer.Problem> GetProblems() {
-      using (OKBDataContext okb = new OKBDataContext()) {
-        return okb.Problems.Select(x => Convert.ToDto(x)).ToArray();
-      }
-    }
-    public long AddProblem(DataTransfer.Problem dto) {
-      using (OKBDataContext okb = new OKBDataContext()) {
-        DataAccess.Problem entity = Convert.ToEntity(dto); entity.Id = 0;
-        okb.Problems.InsertOnSubmit(entity);
-        okb.SubmitChanges();
-        return entity.Id;
-      }
-    }
-    public void UpdateProblem(DataTransfer.Problem dto) {
-      using (OKBDataContext okb = new OKBDataContext()) {
-        DataAccess.Problem entity = okb.Problems.FirstOrDefault(x => x.Id == dto.Id);
-        Convert.ToEntity(dto, entity);
-        okb.SubmitChanges();
-      }
-    }
-    public void DeleteProblem(long id) {
-      using (OKBDataContext okb = new OKBDataContext()) {
-        DataAccess.Problem entity = okb.Problems.FirstOrDefault(x => x.Id == id);
-        if (entity != null) okb.Problems.DeleteOnSubmit(entity);
-        okb.SubmitChanges();
-      }
-    }
-    public IEnumerable<Guid> GetProblemUsers(long problemId) {
-      using (OKBDataContext okb = new OKBDataContext()) {
-        return okb.ProblemUsers.Where(x => x.ProblemId == problemId).Select(x => x.UserId).ToArray();
-      }
-    }
-    public void UpdateProblemUsers(long problemId, IEnumerable<Guid> users) {
-      using (OKBDataContext okb = new OKBDataContext()) {
-        okb.ProblemUsers.DeleteAllOnSubmit(okb.ProblemUsers.Where(x => x.ProblemId == problemId));
-        okb.ProblemUsers.InsertAllOnSubmit(users.Select(x => new DataAccess.ProblemUser { ProblemId = problemId, UserId = x }));
-        okb.SubmitChanges();
-      }
-    }
-    #endregion
-
-    #region ProblemData Methods
-    public DataTransfer.ProblemData GetProblemData(long problemId) {
-      using (OKBDataContext okb = new OKBDataContext()) {
-        return Convert.ToDto(okb.ProblemDatas.FirstOrDefault(x => x.ProblemId == problemId));
-      }
-    }
-    public void UpdateProblemData(DataTransfer.ProblemData dto) {
-      using (OKBDataContext okb = new OKBDataContext()) {
-        DataAccess.ProblemData entity = okb.ProblemDatas.FirstOrDefault(x => x.ProblemId == dto.ProblemId);
-        if (entity == null) okb.ProblemDatas.InsertOnSubmit(Convert.ToEntity(dto));
-        else Convert.ToEntity(dto, entity);
-        okb.SubmitChanges();
-      }
-    }
-    #endregion
-
-    /*
-
-    /// <summary>
-    /// Gets the complete algorithm object graph up to the following entities:
-    /// <list type="bullet">
-    ///   <item>Parameter</item>
-    ///   <item>Algorithm_Paramters.Parameter.DataType</item>
-    ///   <item>Algorithm_Results.Result.DataType</item>
-    /// </list>
-    /// </summary>
-    /// <param name="id">The algorithm id.</param>
-    /// <returns>An <see cref="Algorithm"/></returns>
-    public Algorithm GetCompleteAlgorithm(int id) {
-      using (OKBDataContext okb = new OKBDataContext()) {
-        var dlo = new DataLoadOptions();
-        dlo.LoadWith<Algorithm>(a => a.AlgorithmClass);
-        dlo.LoadWith<Algorithm>(a => a.Platform);
-        dlo.LoadWith<Algorithm>(a => a.AlgorithmUsers);
-        dlo.LoadWith<AlgorithmUser>(u => u.User);
-        okb.LoadOptions = dlo;
-        return okb.Algorithms.Single(a => a.Id == id);
-      }
-    }
-
-    /// <summary>
-    /// Gets the complete problem object graph up to the following entities:
-    /// <list type="bullet">
-    ///   <item>Platform</item>
-    ///   <item>SolutionRepresentation</item>
-    ///   <item>Problem_Parameters.Parameter</item>
-    ///   <item>IntProblemCharacteristicValues.ProblemCharacteristic.DataType</item>
-    ///   <item>FloatProblemCharacteristicValues.ProblemCharacteristic.DataType</item>
-    ///   <item>CharProblemCharacteristicValues.ProblemCharacteristic.DataType</item>
-    /// </list>
-    /// </summary>
-    /// <param name="id">The problem id.</param>
-    /// <returns>A <see cref="Problem"/></returns>
-    public Problem GetCompleteProblem(int id) {
-      using (OKBDataContext okb = new OKBDataContext()) {
-        var dlo = new DataLoadOptions();
-        dlo.LoadWith<Problem>(p => p.ProblemClass);
-        dlo.LoadWith<Problem>(p => p.Platform);
-        dlo.LoadWith<Problem>(p => p.ProblemUsers);
-        dlo.LoadWith<ProblemUser>(u => u.User);
-        okb.LoadOptions = dlo;
-        return okb.Problems.Single(p => p.Id == id);
-      }
-    }
-
-    /// <summary>
-    /// Updates the algorithm object graph including the following properties and linked entitites:
-    /// <list type="bullet">
-    ///   <item>Name</item>
-    ///   <item>Description</item>
-    ///   <item>AlgorithmClassId</item>
-    ///   <item>PlatformId</item>
-    ///   <item>Algorithm_Parameters</item>
-    ///   <item>Algorithm_Results</item>
-    /// </list>
-    /// <remarks>
-    /// New <see cref="Parameter"/>s or <see cref="Result"/>s will not be
-    /// created but have to be pre-existing.
-    /// </remarks>
-    /// </summary>
-    /// <param name="algorithm">The algorithm.</param>
-    public void UpdateCompleteAlgorithm(Algorithm algorithm) {
-      using (OKBDataContext okb = new OKBDataContext()) {
-        Algorithm original = okb.Algorithms.Single(a => a.Id == algorithm.Id);
-        UpdateAlgorithmData(algorithm, original, okb);
-        okb.SubmitChanges();
-      }
-    }
-
-    /// <summary>
-    /// Updates the problem object graph including the following properties and linked entities:
-    /// <list type="bullet">
-    ///   <item>Name</item>
-    ///   <item>Description</item>
-    ///   <item>ProblemClassId</item>
-    ///   <item>PlatformId</item>
-    ///   <item>SolutionRepresentationId</item>
-    ///   <item>IntProblemCharacteristicValues.Value</item>
-    ///   <item>FloatProblemCharacteristicValues.Value</item>
-    ///   <item>CharProblemCharacteristicValues.Value</item>
-    ///   <item>Problem_Parameters</item>
-    /// </list>
-    /// <remarks>
-    /// New <see cref="ProblemCharacteristic"/>s or <see cref="Parameter"/>s will
-    /// not be created but have to be pre-existing.
-    /// </remarks>
-    /// </summary>
-    /// <param name="problem">The problem.</param>
-    public void UpdateCompleteProblem(Problem problem) {
-      using (OKBDataContext okb = new OKBDataContext()) {
-        Problem originalProblem = okb.Problems.Single(p => p.Id == problem.Id);
-        UpdateProblemData(problem, originalProblem, okb);
-        okb.SubmitChanges();
-      }
-    }
-
-    private static void UpdateAlgorithmData(Algorithm algorithm, Algorithm original, OKBDataContext okb) {
-      original.Name = algorithm.Name;
-      original.Description = algorithm.Description;
-      original.AlgorithmClassId = algorithm.AlgorithmClassId;
-      original.PlatformId = algorithm.PlatformId;
-      okb.AlgorithmUsers.DeleteAllOnSubmit(original.AlgorithmUsers);
-      original.AlgorithmUsers.Clear();
-      foreach (var u in algorithm.AlgorithmUsers) {
-        original.AlgorithmUsers.Add(new AlgorithmUser() {
-          AlgorithmId = original.Id,
-          UserId = u.UserId
-        });
-      }
-    }
-
-    private static void UpdateProblemData(Problem problem, Problem original, OKBDataContext okb) {
-      original.Name = problem.Name;
-      original.Description = problem.Description;
-      original.ProblemClassId = problem.ProblemClassId;
-      original.SolutionRepresentationId = problem.SolutionRepresentationId;
-      original.PlatformId = problem.PlatformId;
-      okb.ProblemUsers.DeleteAllOnSubmit(original.ProblemUsers);
-      original.ProblemUsers.Clear();
-      foreach (var u in problem.ProblemUsers) {
-        original.ProblemUsers.Add(new ProblemUser() {
-          ProblemId = original.Id,
-          UserId = u.UserId
-        });
-      }
-    }*/
-  }
-}
Index: branches/OKB/HeuristicLab.Services.OKB/3.3/HeuristicLab.Services.OKB-3.3.csproj
===================================================================
--- branches/OKB/HeuristicLab.Services.OKB/3.3/HeuristicLab.Services.OKB-3.3.csproj	(revision 4539)
+++ branches/OKB/HeuristicLab.Services.OKB/3.3/HeuristicLab.Services.OKB-3.3.csproj	(revision 4548)
@@ -120,9 +120,9 @@
   </ItemGroup>
   <ItemGroup>
-    <Compile Include="AdminService.cs" />
     <Compile Include="Convert.cs" />
     <Compile Include="AuthenticationService.cs" />
     <Compile Include="Interfaces\IAuthenticationService.cs" />
-    <Compile Include="Interfaces\IAdminService.cs" />
+    <Compile Include="Interfaces\IOKBService.cs" />
+    <Compile Include="OKBService.cs" />
     <Compile Include="Properties\AssemblyInfo.cs" />
   </ItemGroup>
Index: branches/OKB/HeuristicLab.Services.OKB/3.3/Interfaces/IAdminService.cs
===================================================================
--- branches/OKB/HeuristicLab.Services.OKB/3.3/Interfaces/IAdminService.cs	(revision 4539)
+++ 	(revision )
@@ -1,134 +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.Net.Security;
-using System.ServiceModel;
-using HeuristicLab.Services.OKB.DataTransfer;
-
-namespace HeuristicLab.Services.OKB {
-  /// <summary>
-  /// Interface of the OKB administration service.
-  /// </summary>
-  [ServiceContract(ProtectionLevel = ProtectionLevel.EncryptAndSign)]
-  public interface IAdminService {
-    #region Platform Methods
-    [OperationContract]
-    Platform GetPlatform(long id);
-    [OperationContract]
-    IEnumerable<Platform> GetPlatforms();
-    [OperationContract]
-    long AddPlatform(Platform dto);
-    [OperationContract]
-    void UpdatePlatform(Platform dto);
-    [OperationContract]
-    void DeletePlatform(long id);
-    #endregion
-
-    #region DataType Methods
-    [OperationContract]
-    DataType GetDataType(long id);
-    [OperationContract]
-    IEnumerable<DataType> GetDataTypes();
-    [OperationContract]
-    long AddDataType(DataType dto);
-    [OperationContract]
-    void UpdateDataType(DataType dto);
-    [OperationContract]
-    void DeleteDataType(long id);
-    #endregion
-
-    #region AlgorithmClass Methods
-    [OperationContract]
-    AlgorithmClass GetAlgorithmClass(long id);
-    [OperationContract]
-    IEnumerable<AlgorithmClass> GetAlgorithmClasses();
-    [OperationContract]
-    long AddAlgorithmClass(AlgorithmClass dto);
-    [OperationContract]
-    void UpdateAlgorithmClass(AlgorithmClass dto);
-    [OperationContract]
-    void DeleteAlgorithmClass(long id);
-    #endregion
-
-    #region Algorithm Methods
-    [OperationContract]
-    Algorithm GetAlgorithm(long id);
-    [OperationContract]
-    IEnumerable<Algorithm> GetAlgorithms();
-    [OperationContract]
-    long AddAlgorithm(Algorithm dto);
-    [OperationContract]
-    void UpdateAlgorithm(Algorithm dto);
-    [OperationContract]
-    void DeleteAlgorithm(long id);
-    [OperationContract]
-    IEnumerable<Guid> GetAlgorithmUsers(long algorithmId);
-    [OperationContract]
-    void UpdateAlgorithmUsers(long algorithmId, IEnumerable<Guid> users);
-    #endregion
-
-    #region AlgorithmData Methods
-    [OperationContract]
-    AlgorithmData GetAlgorithmData(long algorithmId);
-    [OperationContract]
-    void UpdateAlgorithmData(AlgorithmData dto);
-    #endregion
-
-    #region ProblemClass Methods
-    [OperationContract]
-    ProblemClass GetProblemClass(long id);
-    [OperationContract]
-    IEnumerable<ProblemClass> GetProblemClasses();
-    [OperationContract]
-    long AddProblemClass(ProblemClass dto);
-    [OperationContract]
-    void UpdateProblemClass(ProblemClass dto);
-    [OperationContract]
-    void DeleteProblemClass(long id);
-    #endregion
-
-    #region Problem Methods
-    [OperationContract]
-    Problem GetProblem(long id);
-    [OperationContract]
-    IEnumerable<Problem> GetProblems();
-    [OperationContract]
-    long AddProblem(Problem dto);
-    [OperationContract]
-    void UpdateProblem(Problem dto);
-    [OperationContract]
-    void DeleteProblem(long id);
-    [OperationContract]
-    IEnumerable<Guid> GetProblemUsers(long problemId);
-    [OperationContract]
-    void UpdateProblemUsers(long problemId, IEnumerable<Guid> users);
-    #endregion
-
-    #region ProblemData Methods
-    [OperationContract]
-    ProblemData GetProblemData(long problemId);
-    [OperationContract]
-    void UpdateProblemData(ProblemData dto);
-    #endregion
-  }
-}
Index: branches/OKB/HeuristicLab.Services.OKB/3.3/Interfaces/IOKBService.cs
===================================================================
--- branches/OKB/HeuristicLab.Services.OKB/3.3/Interfaces/IOKBService.cs	(revision 4548)
+++ branches/OKB/HeuristicLab.Services.OKB/3.3/Interfaces/IOKBService.cs	(revision 4548)
@@ -0,0 +1,134 @@
+﻿#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.Net.Security;
+using System.ServiceModel;
+using HeuristicLab.Services.OKB.DataTransfer;
+
+namespace HeuristicLab.Services.OKB {
+  /// <summary>
+  /// Interface of the OKB service.
+  /// </summary>
+  [ServiceContract(ProtectionLevel = ProtectionLevel.EncryptAndSign)]
+  public interface IOKBService {
+    #region Platform Methods
+    [OperationContract]
+    Platform GetPlatform(long id);
+    [OperationContract]
+    IEnumerable<Platform> GetPlatforms();
+    [OperationContract]
+    long AddPlatform(Platform dto);
+    [OperationContract]
+    void UpdatePlatform(Platform dto);
+    [OperationContract]
+    void DeletePlatform(long id);
+    #endregion
+
+    #region DataType Methods
+    [OperationContract]
+    DataType GetDataType(long id);
+    [OperationContract]
+    IEnumerable<DataType> GetDataTypes();
+    [OperationContract]
+    long AddDataType(DataType dto);
+    [OperationContract]
+    void UpdateDataType(DataType dto);
+    [OperationContract]
+    void DeleteDataType(long id);
+    #endregion
+
+    #region AlgorithmClass Methods
+    [OperationContract]
+    AlgorithmClass GetAlgorithmClass(long id);
+    [OperationContract]
+    IEnumerable<AlgorithmClass> GetAlgorithmClasses();
+    [OperationContract]
+    long AddAlgorithmClass(AlgorithmClass dto);
+    [OperationContract]
+    void UpdateAlgorithmClass(AlgorithmClass dto);
+    [OperationContract]
+    void DeleteAlgorithmClass(long id);
+    #endregion
+
+    #region Algorithm Methods
+    [OperationContract]
+    Algorithm GetAlgorithm(long id);
+    [OperationContract]
+    IEnumerable<Algorithm> GetAlgorithms();
+    [OperationContract]
+    long AddAlgorithm(Algorithm dto);
+    [OperationContract]
+    void UpdateAlgorithm(Algorithm dto);
+    [OperationContract]
+    void DeleteAlgorithm(long id);
+    [OperationContract]
+    IEnumerable<Guid> GetAlgorithmUsers(long algorithmId);
+    [OperationContract]
+    void UpdateAlgorithmUsers(long algorithmId, IEnumerable<Guid> users);
+    #endregion
+
+    #region AlgorithmData Methods
+    [OperationContract]
+    AlgorithmData GetAlgorithmData(long algorithmId);
+    [OperationContract]
+    void UpdateAlgorithmData(AlgorithmData dto);
+    #endregion
+
+    #region ProblemClass Methods
+    [OperationContract]
+    ProblemClass GetProblemClass(long id);
+    [OperationContract]
+    IEnumerable<ProblemClass> GetProblemClasses();
+    [OperationContract]
+    long AddProblemClass(ProblemClass dto);
+    [OperationContract]
+    void UpdateProblemClass(ProblemClass dto);
+    [OperationContract]
+    void DeleteProblemClass(long id);
+    #endregion
+
+    #region Problem Methods
+    [OperationContract]
+    Problem GetProblem(long id);
+    [OperationContract]
+    IEnumerable<Problem> GetProblems();
+    [OperationContract]
+    long AddProblem(Problem dto);
+    [OperationContract]
+    void UpdateProblem(Problem dto);
+    [OperationContract]
+    void DeleteProblem(long id);
+    [OperationContract]
+    IEnumerable<Guid> GetProblemUsers(long problemId);
+    [OperationContract]
+    void UpdateProblemUsers(long problemId, IEnumerable<Guid> users);
+    #endregion
+
+    #region ProblemData Methods
+    [OperationContract]
+    ProblemData GetProblemData(long problemId);
+    [OperationContract]
+    void UpdateProblemData(ProblemData dto);
+    #endregion
+  }
+}
Index: branches/OKB/HeuristicLab.Services.OKB/3.3/OKBService.cs
===================================================================
--- branches/OKB/HeuristicLab.Services.OKB/3.3/OKBService.cs	(revision 4548)
+++ branches/OKB/HeuristicLab.Services.OKB/3.3/OKBService.cs	(revision 4548)
@@ -0,0 +1,431 @@
+﻿#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.ServiceModel;
+using HeuristicLab.Services.OKB.DataAccess;
+
+namespace HeuristicLab.Services.OKB {
+  /// <summary>
+  /// Implementation of the OKB service (interface <see cref="IOKBService"/>).
+  /// </summary>
+  [ServiceBehavior(IncludeExceptionDetailInFaults = true)]
+  public class OKBService : IOKBService {
+    #region Platform Methods
+    public DataTransfer.Platform GetPlatform(long id) {
+      using (OKBDataContext okb = new OKBDataContext()) {
+        return Convert.ToDto(okb.Platforms.FirstOrDefault(x => x.Id == id));
+      }
+    }
+    public IEnumerable<DataTransfer.Platform> GetPlatforms() {
+      using (OKBDataContext okb = new OKBDataContext()) {
+        return okb.Platforms.Select(x => Convert.ToDto(x)).ToArray();
+      }
+    }
+    public long AddPlatform(DataTransfer.Platform dto) {
+      using (OKBDataContext okb = new OKBDataContext()) {
+        DataAccess.Platform entity = Convert.ToEntity(dto); entity.Id = 0;
+        okb.Platforms.InsertOnSubmit(entity);
+        okb.SubmitChanges();
+        return entity.Id;
+      }
+    }
+    public void UpdatePlatform(DataTransfer.Platform dto) {
+      using (OKBDataContext okb = new OKBDataContext()) {
+        DataAccess.Platform entity = okb.Platforms.FirstOrDefault(x => x.Id == dto.Id);
+        Convert.ToEntity(dto, entity);
+        okb.SubmitChanges();
+      }
+    }
+    public void DeletePlatform(long id) {
+      using (OKBDataContext okb = new OKBDataContext()) {
+        DataAccess.Platform entity = okb.Platforms.FirstOrDefault(x => x.Id == id);
+        if (entity != null) okb.Platforms.DeleteOnSubmit(entity);
+        okb.SubmitChanges();
+      }
+    }
+    #endregion
+
+    #region DataType Methods
+    public DataTransfer.DataType GetDataType(long id) {
+      using (OKBDataContext okb = new OKBDataContext()) {
+        return Convert.ToDto(okb.DataTypes.FirstOrDefault(x => x.Id == id));
+      }
+    }
+    public IEnumerable<DataTransfer.DataType> GetDataTypes() {
+      using (OKBDataContext okb = new OKBDataContext()) {
+        return okb.DataTypes.Select(x => Convert.ToDto(x)).ToArray();
+      }
+    }
+    public long AddDataType(DataTransfer.DataType dto) {
+      using (OKBDataContext okb = new OKBDataContext()) {
+        DataAccess.DataType entity = Convert.ToEntity(dto); entity.Id = 0;
+        okb.DataTypes.InsertOnSubmit(entity);
+        okb.SubmitChanges();
+        return entity.Id;
+      }
+    }
+    public void UpdateDataType(DataTransfer.DataType dto) {
+      using (OKBDataContext okb = new OKBDataContext()) {
+        DataAccess.DataType entity = okb.DataTypes.FirstOrDefault(x => x.Id == dto.Id);
+        Convert.ToEntity(dto, entity);
+        okb.SubmitChanges();
+      }
+    }
+    public void DeleteDataType(long id) {
+      using (OKBDataContext okb = new OKBDataContext()) {
+        DataAccess.DataType entity = okb.DataTypes.FirstOrDefault(x => x.Id == id);
+        if (entity != null) okb.DataTypes.DeleteOnSubmit(entity);
+        okb.SubmitChanges();
+      }
+    }
+    #endregion
+
+    #region AlgorithmClass Methods
+    public DataTransfer.AlgorithmClass GetAlgorithmClass(long id) {
+      using (OKBDataContext okb = new OKBDataContext()) {
+        return Convert.ToDto(okb.AlgorithmClasses.FirstOrDefault(x => x.Id == id));
+      }
+    }
+    public IEnumerable<DataTransfer.AlgorithmClass> GetAlgorithmClasses() {
+      using (OKBDataContext okb = new OKBDataContext()) {
+        return okb.AlgorithmClasses.Select(x => Convert.ToDto(x)).ToArray();
+      }
+    }
+    public long AddAlgorithmClass(DataTransfer.AlgorithmClass dto) {
+      using (OKBDataContext okb = new OKBDataContext()) {
+        DataAccess.AlgorithmClass entity = Convert.ToEntity(dto); entity.Id = 0;
+        okb.AlgorithmClasses.InsertOnSubmit(entity);
+        okb.SubmitChanges();
+        return entity.Id;
+      }
+    }
+    public void UpdateAlgorithmClass(DataTransfer.AlgorithmClass dto) {
+      using (OKBDataContext okb = new OKBDataContext()) {
+        DataAccess.AlgorithmClass entity = okb.AlgorithmClasses.FirstOrDefault(x => x.Id == dto.Id);
+        Convert.ToEntity(dto, entity);
+        okb.SubmitChanges();
+      }
+    }
+    public void DeleteAlgorithmClass(long id) {
+      using (OKBDataContext okb = new OKBDataContext()) {
+        DataAccess.AlgorithmClass entity = okb.AlgorithmClasses.FirstOrDefault(x => x.Id == id);
+        if (entity != null) okb.AlgorithmClasses.DeleteOnSubmit(entity);
+        okb.SubmitChanges();
+      }
+    }
+    #endregion
+
+    #region Algorithm Methods
+    public DataTransfer.Algorithm GetAlgorithm(long id) {
+      using (OKBDataContext okb = new OKBDataContext()) {
+        return Convert.ToDto(okb.Algorithms.FirstOrDefault(x => x.Id == id));
+      }
+    }
+    public IEnumerable<DataTransfer.Algorithm> GetAlgorithms() {
+      using (OKBDataContext okb = new OKBDataContext()) {
+        return okb.Algorithms.Select(x => Convert.ToDto(x)).ToArray();
+      }
+    }
+    public long AddAlgorithm(DataTransfer.Algorithm dto) {
+      using (OKBDataContext okb = new OKBDataContext()) {
+        DataAccess.Algorithm entity = Convert.ToEntity(dto); entity.Id = 0;
+        okb.Algorithms.InsertOnSubmit(entity);
+        okb.SubmitChanges();
+        return entity.Id;
+      }
+    }
+    public void UpdateAlgorithm(DataTransfer.Algorithm dto) {
+      using (OKBDataContext okb = new OKBDataContext()) {
+        DataAccess.Algorithm entity = okb.Algorithms.FirstOrDefault(x => x.Id == dto.Id);
+        Convert.ToEntity(dto, entity);
+        okb.SubmitChanges();
+      }
+    }
+    public void DeleteAlgorithm(long id) {
+      using (OKBDataContext okb = new OKBDataContext()) {
+        DataAccess.Algorithm entity = okb.Algorithms.FirstOrDefault(x => x.Id == id);
+        if (entity != null) okb.Algorithms.DeleteOnSubmit(entity);
+        okb.SubmitChanges();
+      }
+    }
+    public IEnumerable<Guid> GetAlgorithmUsers(long algorithmId) {
+      using (OKBDataContext okb = new OKBDataContext()) {
+        return okb.AlgorithmUsers.Where(x => x.AlgorithmId == algorithmId).Select(x => x.UserId).ToArray();
+      }
+    }
+    public void UpdateAlgorithmUsers(long algorithmId, IEnumerable<Guid> users) {
+      using (OKBDataContext okb = new OKBDataContext()) {
+        okb.AlgorithmUsers.DeleteAllOnSubmit(okb.AlgorithmUsers.Where(x => x.AlgorithmId == algorithmId));
+        okb.AlgorithmUsers.InsertAllOnSubmit(users.Select(x => new DataAccess.AlgorithmUser { AlgorithmId = algorithmId, UserId = x }));
+        okb.SubmitChanges();
+      }
+    }
+    #endregion
+
+    #region AlgorithmData Methods
+    public DataTransfer.AlgorithmData GetAlgorithmData(long algorithmId) {
+      using (OKBDataContext okb = new OKBDataContext()) {
+        return Convert.ToDto(okb.AlgorithmDatas.FirstOrDefault(x => x.AlgorithmId == algorithmId));
+      }
+    }
+    public void UpdateAlgorithmData(DataTransfer.AlgorithmData dto) {
+      using (OKBDataContext okb = new OKBDataContext()) {
+        DataAccess.AlgorithmData entity = okb.AlgorithmDatas.FirstOrDefault(x => x.AlgorithmId == dto.AlgorithmId);
+        if (entity == null) okb.AlgorithmDatas.InsertOnSubmit(Convert.ToEntity(dto));
+        else Convert.ToEntity(dto, entity);
+        okb.SubmitChanges();
+      }
+    }
+    #endregion
+
+    #region ProblemClass Methods
+    public DataTransfer.ProblemClass GetProblemClass(long id) {
+      using (OKBDataContext okb = new OKBDataContext()) {
+        return Convert.ToDto(okb.ProblemClasses.FirstOrDefault(x => x.Id == id));
+      }
+    }
+    public IEnumerable<DataTransfer.ProblemClass> GetProblemClasses() {
+      using (OKBDataContext okb = new OKBDataContext()) {
+        return okb.ProblemClasses.Select(x => Convert.ToDto(x)).ToArray();
+      }
+    }
+    public long AddProblemClass(DataTransfer.ProblemClass dto) {
+      using (OKBDataContext okb = new OKBDataContext()) {
+        DataAccess.ProblemClass entity = Convert.ToEntity(dto); entity.Id = 0;
+        okb.ProblemClasses.InsertOnSubmit(entity);
+        okb.SubmitChanges();
+        return entity.Id;
+      }
+    }
+    public void UpdateProblemClass(DataTransfer.ProblemClass dto) {
+      using (OKBDataContext okb = new OKBDataContext()) {
+        DataAccess.ProblemClass entity = okb.ProblemClasses.FirstOrDefault(x => x.Id == dto.Id);
+        Convert.ToEntity(dto, entity);
+        okb.SubmitChanges();
+      }
+    }
+    public void DeleteProblemClass(long id) {
+      using (OKBDataContext okb = new OKBDataContext()) {
+        DataAccess.ProblemClass entity = okb.ProblemClasses.FirstOrDefault(x => x.Id == id);
+        if (entity != null) okb.ProblemClasses.DeleteOnSubmit(entity);
+        okb.SubmitChanges();
+      }
+    }
+    #endregion
+
+    #region Problem Methods
+    public DataTransfer.Problem GetProblem(long id) {
+      using (OKBDataContext okb = new OKBDataContext()) {
+        return Convert.ToDto(okb.Problems.FirstOrDefault(x => x.Id == id));
+      }
+    }
+    public IEnumerable<DataTransfer.Problem> GetProblems() {
+      using (OKBDataContext okb = new OKBDataContext()) {
+        return okb.Problems.Select(x => Convert.ToDto(x)).ToArray();
+      }
+    }
+    public long AddProblem(DataTransfer.Problem dto) {
+      using (OKBDataContext okb = new OKBDataContext()) {
+        DataAccess.Problem entity = Convert.ToEntity(dto); entity.Id = 0;
+        okb.Problems.InsertOnSubmit(entity);
+        okb.SubmitChanges();
+        return entity.Id;
+      }
+    }
+    public void UpdateProblem(DataTransfer.Problem dto) {
+      using (OKBDataContext okb = new OKBDataContext()) {
+        DataAccess.Problem entity = okb.Problems.FirstOrDefault(x => x.Id == dto.Id);
+        Convert.ToEntity(dto, entity);
+        okb.SubmitChanges();
+      }
+    }
+    public void DeleteProblem(long id) {
+      using (OKBDataContext okb = new OKBDataContext()) {
+        DataAccess.Problem entity = okb.Problems.FirstOrDefault(x => x.Id == id);
+        if (entity != null) okb.Problems.DeleteOnSubmit(entity);
+        okb.SubmitChanges();
+      }
+    }
+    public IEnumerable<Guid> GetProblemUsers(long problemId) {
+      using (OKBDataContext okb = new OKBDataContext()) {
+        return okb.ProblemUsers.Where(x => x.ProblemId == problemId).Select(x => x.UserId).ToArray();
+      }
+    }
+    public void UpdateProblemUsers(long problemId, IEnumerable<Guid> users) {
+      using (OKBDataContext okb = new OKBDataContext()) {
+        okb.ProblemUsers.DeleteAllOnSubmit(okb.ProblemUsers.Where(x => x.ProblemId == problemId));
+        okb.ProblemUsers.InsertAllOnSubmit(users.Select(x => new DataAccess.ProblemUser { ProblemId = problemId, UserId = x }));
+        okb.SubmitChanges();
+      }
+    }
+    #endregion
+
+    #region ProblemData Methods
+    public DataTransfer.ProblemData GetProblemData(long problemId) {
+      using (OKBDataContext okb = new OKBDataContext()) {
+        return Convert.ToDto(okb.ProblemDatas.FirstOrDefault(x => x.ProblemId == problemId));
+      }
+    }
+    public void UpdateProblemData(DataTransfer.ProblemData dto) {
+      using (OKBDataContext okb = new OKBDataContext()) {
+        DataAccess.ProblemData entity = okb.ProblemDatas.FirstOrDefault(x => x.ProblemId == dto.ProblemId);
+        if (entity == null) okb.ProblemDatas.InsertOnSubmit(Convert.ToEntity(dto));
+        else Convert.ToEntity(dto, entity);
+        okb.SubmitChanges();
+      }
+    }
+    #endregion
+
+    /*
+
+    /// <summary>
+    /// Gets the complete algorithm object graph up to the following entities:
+    /// <list type="bullet">
+    ///   <item>Parameter</item>
+    ///   <item>Algorithm_Paramters.Parameter.DataType</item>
+    ///   <item>Algorithm_Results.Result.DataType</item>
+    /// </list>
+    /// </summary>
+    /// <param name="id">The algorithm id.</param>
+    /// <returns>An <see cref="Algorithm"/></returns>
+    public Algorithm GetCompleteAlgorithm(int id) {
+      using (OKBDataContext okb = new OKBDataContext()) {
+        var dlo = new DataLoadOptions();
+        dlo.LoadWith<Algorithm>(a => a.AlgorithmClass);
+        dlo.LoadWith<Algorithm>(a => a.Platform);
+        dlo.LoadWith<Algorithm>(a => a.AlgorithmUsers);
+        dlo.LoadWith<AlgorithmUser>(u => u.User);
+        okb.LoadOptions = dlo;
+        return okb.Algorithms.Single(a => a.Id == id);
+      }
+    }
+
+    /// <summary>
+    /// Gets the complete problem object graph up to the following entities:
+    /// <list type="bullet">
+    ///   <item>Platform</item>
+    ///   <item>SolutionRepresentation</item>
+    ///   <item>Problem_Parameters.Parameter</item>
+    ///   <item>IntProblemCharacteristicValues.ProblemCharacteristic.DataType</item>
+    ///   <item>FloatProblemCharacteristicValues.ProblemCharacteristic.DataType</item>
+    ///   <item>CharProblemCharacteristicValues.ProblemCharacteristic.DataType</item>
+    /// </list>
+    /// </summary>
+    /// <param name="id">The problem id.</param>
+    /// <returns>A <see cref="Problem"/></returns>
+    public Problem GetCompleteProblem(int id) {
+      using (OKBDataContext okb = new OKBDataContext()) {
+        var dlo = new DataLoadOptions();
+        dlo.LoadWith<Problem>(p => p.ProblemClass);
+        dlo.LoadWith<Problem>(p => p.Platform);
+        dlo.LoadWith<Problem>(p => p.ProblemUsers);
+        dlo.LoadWith<ProblemUser>(u => u.User);
+        okb.LoadOptions = dlo;
+        return okb.Problems.Single(p => p.Id == id);
+      }
+    }
+
+    /// <summary>
+    /// Updates the algorithm object graph including the following properties and linked entitites:
+    /// <list type="bullet">
+    ///   <item>Name</item>
+    ///   <item>Description</item>
+    ///   <item>AlgorithmClassId</item>
+    ///   <item>PlatformId</item>
+    ///   <item>Algorithm_Parameters</item>
+    ///   <item>Algorithm_Results</item>
+    /// </list>
+    /// <remarks>
+    /// New <see cref="Parameter"/>s or <see cref="Result"/>s will not be
+    /// created but have to be pre-existing.
+    /// </remarks>
+    /// </summary>
+    /// <param name="algorithm">The algorithm.</param>
+    public void UpdateCompleteAlgorithm(Algorithm algorithm) {
+      using (OKBDataContext okb = new OKBDataContext()) {
+        Algorithm original = okb.Algorithms.Single(a => a.Id == algorithm.Id);
+        UpdateAlgorithmData(algorithm, original, okb);
+        okb.SubmitChanges();
+      }
+    }
+
+    /// <summary>
+    /// Updates the problem object graph including the following properties and linked entities:
+    /// <list type="bullet">
+    ///   <item>Name</item>
+    ///   <item>Description</item>
+    ///   <item>ProblemClassId</item>
+    ///   <item>PlatformId</item>
+    ///   <item>SolutionRepresentationId</item>
+    ///   <item>IntProblemCharacteristicValues.Value</item>
+    ///   <item>FloatProblemCharacteristicValues.Value</item>
+    ///   <item>CharProblemCharacteristicValues.Value</item>
+    ///   <item>Problem_Parameters</item>
+    /// </list>
+    /// <remarks>
+    /// New <see cref="ProblemCharacteristic"/>s or <see cref="Parameter"/>s will
+    /// not be created but have to be pre-existing.
+    /// </remarks>
+    /// </summary>
+    /// <param name="problem">The problem.</param>
+    public void UpdateCompleteProblem(Problem problem) {
+      using (OKBDataContext okb = new OKBDataContext()) {
+        Problem originalProblem = okb.Problems.Single(p => p.Id == problem.Id);
+        UpdateProblemData(problem, originalProblem, okb);
+        okb.SubmitChanges();
+      }
+    }
+
+    private static void UpdateAlgorithmData(Algorithm algorithm, Algorithm original, OKBDataContext okb) {
+      original.Name = algorithm.Name;
+      original.Description = algorithm.Description;
+      original.AlgorithmClassId = algorithm.AlgorithmClassId;
+      original.PlatformId = algorithm.PlatformId;
+      okb.AlgorithmUsers.DeleteAllOnSubmit(original.AlgorithmUsers);
+      original.AlgorithmUsers.Clear();
+      foreach (var u in algorithm.AlgorithmUsers) {
+        original.AlgorithmUsers.Add(new AlgorithmUser() {
+          AlgorithmId = original.Id,
+          UserId = u.UserId
+        });
+      }
+    }
+
+    private static void UpdateProblemData(Problem problem, Problem original, OKBDataContext okb) {
+      original.Name = problem.Name;
+      original.Description = problem.Description;
+      original.ProblemClassId = problem.ProblemClassId;
+      original.SolutionRepresentationId = problem.SolutionRepresentationId;
+      original.PlatformId = problem.PlatformId;
+      okb.ProblemUsers.DeleteAllOnSubmit(original.ProblemUsers);
+      original.ProblemUsers.Clear();
+      foreach (var u in problem.ProblemUsers) {
+        original.ProblemUsers.Add(new ProblemUser() {
+          ProblemId = original.Id,
+          UserId = u.UserId
+        });
+      }
+    }*/
+  }
+}
Index: branches/OKB/HeuristicLab.Services.OKB/3.3/app.config
===================================================================
--- branches/OKB/HeuristicLab.Services.OKB/3.3/app.config	(revision 4539)
+++ branches/OKB/HeuristicLab.Services.OKB/3.3/app.config	(revision 4548)
@@ -67,10 +67,10 @@
 
     <services>
-      <service name="HeuristicLab.Services.OKB.AdminService" behaviorConfiguration="DefaultServiceBehavior">
+      <service name="HeuristicLab.Services.OKB.OKBService" behaviorConfiguration="DefaultServiceBehavior">
         <endpoint address="mex" binding="mexHttpBinding" bindingConfiguration="DefaultMexHttpBinding" contract="IMetadataExchange" />
-        <endpoint binding="wsHttpBinding" bindingConfiguration="DefaultWsHttpBinding" contract="HeuristicLab.Services.OKB.IAdminService" />
+        <endpoint binding="wsHttpBinding" bindingConfiguration="DefaultWsHttpBinding" contract="HeuristicLab.Services.OKB.IOKBService" />
         <host>
           <baseAddresses>
-            <add baseAddress="http://localhost:8732/Design_Time_Addresses/OKB-3.3/AdminService" />
+            <add baseAddress="http://localhost:8732/Design_Time_Addresses/OKB-3.3/OKBService" />
           </baseAddresses>
         </host>
