Index: /branches/OKB/HeuristicLab.Clients.OKB-3.3/Administrator.cs
===================================================================
--- /branches/OKB/HeuristicLab.Clients.OKB-3.3/Administrator.cs	(revision 4480)
+++ /branches/OKB/HeuristicLab.Clients.OKB-3.3/Administrator.cs	(revision 4481)
@@ -40,8 +40,17 @@
     }
 
+    #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 {
@@ -52,15 +61,17 @@
       get { return algorithms; }
     }
-    private ItemCollection<DataType> dataTypes;
-    public ItemCollection<DataType> DataTypes {
-      get { return dataTypes; }
-    }
-    private IEnumerable<User> users;
-    public IEnumerable<User> Users {
-      get { return users; }
-    }
+    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();
@@ -70,4 +81,9 @@
       }
       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>();
@@ -80,17 +96,24 @@
       }
       algorithms.Clear();
-      if (dataTypes == null) {
-        dataTypes = new ItemCollection<DataType>();
-        dataTypes.ItemsRemoved += new CollectionItemsChangedEventHandler<DataType>(dataTypes_ItemsRemoved);
-      }
-      dataTypes.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));
-          dataTypes.AddRange(CallAdminService<DataType[]>(s => s.GetDataTypes()).OrderBy(x => x.Name));
-          users = CallAuthenticationService<User[]>(s => s.GetUsers()).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;
         }
@@ -105,15 +128,36 @@
       }, null);
     }
-
+    #endregion
+
+    #region Store
     public bool Store(IOKBItem item) {
       try {
-        if (item is Platform)
-          CallAdminService(s => s.StorePlatform((Platform)item));
-        else if (item is AlgorithmClass)
-          CallAdminService(s => s.StoreAlgorithmClass((AlgorithmClass)item));
-        else if (item is Algorithm)
-          CallAdminService(s => s.StoreAlgorithm((Algorithm)item));
-        else if (item is DataType)
-          CallAdminService(s => s.StoreDataType((DataType)item));
+        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;
       }
@@ -123,5 +167,7 @@
       }
     }
-
+    #endregion
+
+    #region Algorithm Methods
     public Guid[] GetAlgorithmUsers(long algorithmId) {
       try {
@@ -133,26 +179,77 @@
       }
     }
-    public bool StoreAlgorithmUsers(long algorithmId, Guid[] users) {
-      try {
-        CallAdminService(s => s.StoreAlgorithmUsers(algorithmId, users));
-        return true;
-      }
-      catch (Exception ex) {
-        ErrorHandling.ShowErrorDialog("Store authorized algorithm users failed.", ex);
-        return false;
-      }
-    }
-
-    public bool StoreAlgorithmData(AlgorithmData algorithmData) {
-      try {
-        CallAdminService(s => s.StoreAlgorithmData(algorithmData));
-        return true;
-      }
-      catch (Exception ex) {
-        ErrorHandling.ShowErrorDialog("Store serialized algorithm failed.", ex);
-        return false;
-      }
-    }
-
+    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() {
@@ -175,4 +272,13 @@
       }
     }
+    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 {
@@ -193,13 +299,23 @@
       }
     }
-    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 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
@@ -218,5 +334,5 @@
       }
     }
-    private T CallAdminService<T>(Func<IAdminService, T> call) where T : class {
+    private T CallAdminService<T>(Func<IAdminService, T> call) {
       AdminServiceClient client = ClientFactory.CreateClient<AdminServiceClient, IAdminService>();
       try {
@@ -232,5 +348,5 @@
       }
     }
-    private T CallAuthenticationService<T>(Func<IAuthenticationService, T> call) where T : class {
+    private T CallAuthenticationService<T>(Func<IAuthenticationService, T> call) {
       AuthenticationServiceClient client = ClientFactory.CreateClient<AuthenticationServiceClient, IAuthenticationService>();
       try {
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 4480)
+++ /branches/OKB/HeuristicLab.Clients.OKB-3.3/HeuristicLab.Clients.OKB-3.3.csproj	(revision 4481)
@@ -53,7 +53,9 @@
       <HintPath>..\..\..\..\..\..\Program Files\HeuristicLab 3.3\HeuristicLab.MainForm.WindowsForms-3.3.dll</HintPath>
     </Reference>
+    <Reference Include="HeuristicLab.Optimization-3.3, Version=3.3.0.0, Culture=neutral, PublicKeyToken=ba48961d6f65dcec, processorArchitecture=MSIL" />
     <Reference Include="HeuristicLab.Optimizer-3.3">
       <HintPath>..\..\..\..\..\..\Program Files\HeuristicLab 3.3\HeuristicLab.Optimizer-3.3.dll</HintPath>
     </Reference>
+    <Reference Include="HeuristicLab.Persistence-3.3, Version=3.3.0.0, Culture=neutral, PublicKeyToken=ba48961d6f65dcec, processorArchitecture=MSIL" />
     <Reference Include="HeuristicLab.PluginInfrastructure-3.3">
       <HintPath>..\..\..\..\..\..\Program Files\HeuristicLab 3.3\HeuristicLab.PluginInfrastructure-3.3.dll</HintPath>
@@ -85,4 +87,7 @@
     </Compile>
     <Compile Include="ServiceClients\AuthenticationServiceClient.cs" />
+    <Compile Include="ServiceClients\AlgorithmData.cs" />
+    <Compile Include="ServiceClients\Problem.cs" />
+    <Compile Include="ServiceClients\ProblemClass.cs" />
     <Compile Include="ServiceClients\DataType.cs" />
     <Compile Include="ServiceClients\NamedOKBItem.cs" />
@@ -121,4 +126,22 @@
       <DependentUpon>AlgorithmView.cs</DependentUpon>
     </Compile>
+    <Compile Include="Views\AlgorithmDataView.cs">
+      <SubType>UserControl</SubType>
+    </Compile>
+    <Compile Include="Views\AlgorithmDataView.Designer.cs">
+      <DependentUpon>AlgorithmDataView.cs</DependentUpon>
+    </Compile>
+    <Compile Include="Views\ProblemCollectionView.cs">
+      <SubType>UserControl</SubType>
+    </Compile>
+    <Compile Include="Views\ProblemCollectionView.Designer.cs">
+      <DependentUpon>ProblemCollectionView.cs</DependentUpon>
+    </Compile>
+    <Compile Include="Views\ProblemClassCollectionView.cs">
+      <SubType>UserControl</SubType>
+    </Compile>
+    <Compile Include="Views\ProblemClassCollectionView.Designer.cs">
+      <DependentUpon>ProblemClassCollectionView.cs</DependentUpon>
+    </Compile>
     <Compile Include="Views\DataTypeView.cs">
       <SubType>UserControl</SubType>
@@ -161,6 +184,6 @@
   </ItemGroup>
   <ItemGroup>
-    <EmbeddedResource Include="Views\AdministratorView.resx">
-      <DependentUpon>AdministratorView.cs</DependentUpon>
+    <EmbeddedResource Include="Views\AlgorithmDataView.resx">
+      <DependentUpon>AlgorithmDataView.cs</DependentUpon>
     </EmbeddedResource>
     <EmbeddedResource Include="Views\AlgorithmView.resx">
Index: /branches/OKB/HeuristicLab.Clients.OKB-3.3/HeuristicLabClientsOKBPlugin.cs.frame
===================================================================
--- /branches/OKB/HeuristicLab.Clients.OKB-3.3/HeuristicLabClientsOKBPlugin.cs.frame	(revision 4480)
+++ /branches/OKB/HeuristicLab.Clients.OKB-3.3/HeuristicLabClientsOKBPlugin.cs.frame	(revision 4481)
@@ -36,5 +36,7 @@
   [PluginDependency("HeuristicLab.MainForm", "3.3")]
   [PluginDependency("HeuristicLab.MainForm.WindowsForms", "3.3")]
+  [PluginDependency("HeuristicLab.Optimization", "3.3")]
   [PluginDependency("HeuristicLab.Optimizer", "3.3")]
+  [PluginDependency("HeuristicLab.Persistence", "3.3")]
   public class HeuristicLabClientsOKBPlugin : PluginBase {
   }
Index: /branches/OKB/HeuristicLab.Clients.OKB-3.3/ServiceClients/AdminServiceClient.cs
===================================================================
--- /branches/OKB/HeuristicLab.Clients.OKB-3.3/ServiceClients/AdminServiceClient.cs	(revision 4480)
+++ /branches/OKB/HeuristicLab.Clients.OKB-3.3/ServiceClients/AdminServiceClient.cs	(revision 4481)
@@ -9,515 +9,669 @@
 //------------------------------------------------------------------------------
 
-namespace HeuristicLab.Clients.OKB
-{
-    using System.Runtime.Serialization;
-    
-    
-    [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.AlgorithmClass))]
-    [System.Runtime.Serialization.KnownTypeAttribute(typeof(HeuristicLab.Clients.OKB.Algorithm))]
-    [System.Runtime.Serialization.KnownTypeAttribute(typeof(HeuristicLab.Clients.OKB.Platform))]
-    public partial class OKBItem : object, System.Runtime.Serialization.IExtensibleDataObject, System.ComponentModel.INotifyPropertyChanged
-    {
-        
-        private System.Runtime.Serialization.ExtensionDataObject extensionDataField;
-        
-        private long IdField;
-        
-        public System.Runtime.Serialization.ExtensionDataObject ExtensionData
-        {
-            get
-            {
-                return this.extensionDataField;
-            }
-            set
-            {
-                this.extensionDataField = value;
-            }
-        }
-        
-        [System.Runtime.Serialization.DataMemberAttribute()]
-        public long Id
-        {
-            get
-            {
-                return this.IdField;
-            }
-            set
-            {
-                if ((this.IdField.Equals(value) != true))
-                {
-                    this.IdField = value;
-                    this.RaisePropertyChanged("Id");
-                }
-            }
-        }
-        
-        public event System.ComponentModel.PropertyChangedEventHandler PropertyChanged;
-    }
-    
-    [System.Diagnostics.DebuggerStepThroughAttribute()]
-    [System.CodeDom.Compiler.GeneratedCodeAttribute("System.Runtime.Serialization", "4.0.0.0")]
-    [System.Runtime.Serialization.DataContractAttribute(Name="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.AlgorithmClass))]
-    [System.Runtime.Serialization.KnownTypeAttribute(typeof(HeuristicLab.Clients.OKB.Algorithm))]
-    [System.Runtime.Serialization.KnownTypeAttribute(typeof(HeuristicLab.Clients.OKB.Platform))]
-    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="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="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="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/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/StorePlatform", ReplyAction="http://tempuri.org/IAdminService/StorePlatformResponse")]
-        void StorePlatform(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/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/StoreAlgorithmClass", ReplyAction="http://tempuri.org/IAdminService/StoreAlgorithmClassResponse")]
-        void StoreAlgorithmClass(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/StoreAlgorithm", ReplyAction="http://tempuri.org/IAdminService/StoreAlgorithmResponse")]
-        void StoreAlgorithm(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/StoreAlgorithmUsers", ReplyAction="http://tempuri.org/IAdminService/StoreAlgorithmUsersResponse")]
-        void StoreAlgorithmUsers(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/StoreAlgorithmData", ReplyAction="http://tempuri.org/IAdminService/StoreAlgorithmDataResponse")]
-        void StoreAlgorithmData(HeuristicLab.Clients.OKB.AlgorithmData dto);
-        
-        [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/StoreDataType", ReplyAction="http://tempuri.org/IAdminService/StoreDataTypeResponse")]
-        void StoreDataType(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.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.Platform GetPlatform(long id)
-        {
-            return base.Channel.GetPlatform(id);
-        }
-        
-        public HeuristicLab.Clients.OKB.Platform[] GetPlatforms()
-        {
-            return base.Channel.GetPlatforms();
-        }
-        
-        public void StorePlatform(HeuristicLab.Clients.OKB.Platform dto)
-        {
-            base.Channel.StorePlatform(dto);
-        }
-        
-        public void DeletePlatform(long id)
-        {
-            base.Channel.DeletePlatform(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 void StoreAlgorithmClass(HeuristicLab.Clients.OKB.AlgorithmClass dto)
-        {
-            base.Channel.StoreAlgorithmClass(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 void StoreAlgorithm(HeuristicLab.Clients.OKB.Algorithm dto)
-        {
-            base.Channel.StoreAlgorithm(dto);
-        }
-        
-        public void DeleteAlgorithm(long id)
-        {
-            base.Channel.DeleteAlgorithm(id);
-        }
-        
-        public System.Guid[] GetAlgorithmUsers(long algorithmId)
-        {
-            return base.Channel.GetAlgorithmUsers(algorithmId);
-        }
-        
-        public void StoreAlgorithmUsers(long algorithmId, System.Guid[] users)
-        {
-            base.Channel.StoreAlgorithmUsers(algorithmId, users);
-        }
-        
-        public HeuristicLab.Clients.OKB.AlgorithmData GetAlgorithmData(long algorithmId)
-        {
-            return base.Channel.GetAlgorithmData(algorithmId);
-        }
-        
-        public void StoreAlgorithmData(HeuristicLab.Clients.OKB.AlgorithmData dto)
-        {
-            base.Channel.StoreAlgorithmData(dto);
-        }
-        
-        public HeuristicLab.Clients.OKB.DataType GetDataType(long id)
-        {
-            return base.Channel.GetDataType(id);
-        }
-        
-        public HeuristicLab.Clients.OKB.DataType[] GetDataTypes()
-        {
-            return base.Channel.GetDataTypes();
-        }
-        
-        public void StoreDataType(HeuristicLab.Clients.OKB.DataType dto)
-        {
-            base.Channel.StoreDataType(dto);
-        }
-        
-        public void DeleteDataType(long id)
-        {
-            base.Channel.DeleteDataType(id);
-        }
-    }
+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/AlgorithmData.cs
===================================================================
--- /branches/OKB/HeuristicLab.Clients.OKB-3.3/ServiceClients/AlgorithmData.cs	(revision 4481)
+++ /branches/OKB/HeuristicLab.Clients.OKB-3.3/ServiceClients/AlgorithmData.cs	(revision 4481)
@@ -0,0 +1,26 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2010 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using HeuristicLab.Common;
+
+namespace HeuristicLab.Clients.OKB {
+  public partial class AlgorithmData : IContent { }
+}
Index: /branches/OKB/HeuristicLab.Clients.OKB-3.3/ServiceClients/Problem.cs
===================================================================
--- /branches/OKB/HeuristicLab.Clients.OKB-3.3/ServiceClients/Problem.cs	(revision 4481)
+++ /branches/OKB/HeuristicLab.Clients.OKB-3.3/ServiceClients/Problem.cs	(revision 4481)
@@ -0,0 +1,31 @@
+﻿#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;
+
+namespace HeuristicLab.Clients.OKB {
+  [Item("Problem", "An OKB problem.")]
+  public partial class Problem {
+    public Problem() {
+      Name = "New Problem";
+    }
+  }
+}
Index: /branches/OKB/HeuristicLab.Clients.OKB-3.3/ServiceClients/ProblemClass.cs
===================================================================
--- /branches/OKB/HeuristicLab.Clients.OKB-3.3/ServiceClients/ProblemClass.cs	(revision 4481)
+++ /branches/OKB/HeuristicLab.Clients.OKB-3.3/ServiceClients/ProblemClass.cs	(revision 4481)
@@ -0,0 +1,31 @@
+﻿#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;
+
+namespace HeuristicLab.Clients.OKB {
+  [Item("ProblemClass", "An OKB problem class.")]
+  public partial class ProblemClass {
+    public ProblemClass() {
+      Name = "New Problem Class";
+    }
+  }
+}
Index: /branches/OKB/HeuristicLab.Clients.OKB-3.3/Views/AdministratorView.Designer.cs
===================================================================
--- /branches/OKB/HeuristicLab.Clients.OKB-3.3/Views/AdministratorView.Designer.cs	(revision 4480)
+++ /branches/OKB/HeuristicLab.Clients.OKB-3.3/Views/AdministratorView.Designer.cs	(revision 4481)
@@ -46,21 +46,26 @@
     private void InitializeComponent() {
       this.components = new System.ComponentModel.Container();
-      System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(AdministratorView));
       this.tabControl = new System.Windows.Forms.TabControl();
       this.platformsTabPage = new System.Windows.Forms.TabPage();
       this.platformCollectionView = new HeuristicLab.Clients.OKB.PlatformCollectionView();
+      this.dataTypesTabPage = new System.Windows.Forms.TabPage();
+      this.dataTypeCollectionView = new HeuristicLab.Clients.OKB.DataTypeCollectionView();
       this.algorithmClassesTabPage = new System.Windows.Forms.TabPage();
       this.algorithmClassCollectionView = new HeuristicLab.Clients.OKB.AlgorithmClassCollectionView();
       this.algorithmsTabPage = new System.Windows.Forms.TabPage();
       this.algorithmCollectionView = new HeuristicLab.Clients.OKB.AlgorithmCollectionView();
-      this.dataTypesTabPage = new System.Windows.Forms.TabPage();
+      this.problemClassesTabPage = new System.Windows.Forms.TabPage();
+      this.problemsTabPage = new System.Windows.Forms.TabPage();
       this.refreshButton = new System.Windows.Forms.Button();
       this.toolTip = new System.Windows.Forms.ToolTip(this.components);
-      this.dataTypeCollectionView = new HeuristicLab.Clients.OKB.DataTypeCollectionView();
+      this.problemClassCollectionView = new HeuristicLab.Clients.OKB.ProblemClassCollectionView();
+      this.problemCollectionView = new HeuristicLab.Clients.OKB.ProblemCollectionView();
       this.tabControl.SuspendLayout();
       this.platformsTabPage.SuspendLayout();
+      this.dataTypesTabPage.SuspendLayout();
       this.algorithmClassesTabPage.SuspendLayout();
       this.algorithmsTabPage.SuspendLayout();
-      this.dataTypesTabPage.SuspendLayout();
+      this.problemClassesTabPage.SuspendLayout();
+      this.problemsTabPage.SuspendLayout();
       this.SuspendLayout();
       // 
@@ -71,7 +76,9 @@
                   | System.Windows.Forms.AnchorStyles.Right)));
       this.tabControl.Controls.Add(this.platformsTabPage);
+      this.tabControl.Controls.Add(this.dataTypesTabPage);
       this.tabControl.Controls.Add(this.algorithmClassesTabPage);
       this.tabControl.Controls.Add(this.algorithmsTabPage);
-      this.tabControl.Controls.Add(this.dataTypesTabPage);
+      this.tabControl.Controls.Add(this.problemClassesTabPage);
+      this.tabControl.Controls.Add(this.problemsTabPage);
       this.tabControl.Location = new System.Drawing.Point(0, 29);
       this.tabControl.Name = "tabControl";
@@ -98,9 +105,33 @@
       this.platformCollectionView.Caption = "PlatformCollection View";
       this.platformCollectionView.Content = null;
-      this.platformCollectionView.Location = new System.Drawing.Point(6, 6);
+      this.platformCollectionView.Location = new System.Drawing.Point(3, 3);
       this.platformCollectionView.Name = "platformCollectionView";
       this.platformCollectionView.ReadOnly = false;
-      this.platformCollectionView.Size = new System.Drawing.Size(707, 368);
+      this.platformCollectionView.Size = new System.Drawing.Size(713, 374);
       this.platformCollectionView.TabIndex = 0;
+      // 
+      // dataTypesTabPage
+      // 
+      this.dataTypesTabPage.Controls.Add(this.dataTypeCollectionView);
+      this.dataTypesTabPage.Location = new System.Drawing.Point(4, 22);
+      this.dataTypesTabPage.Name = "dataTypesTabPage";
+      this.dataTypesTabPage.Padding = new System.Windows.Forms.Padding(3);
+      this.dataTypesTabPage.Size = new System.Drawing.Size(719, 380);
+      this.dataTypesTabPage.TabIndex = 3;
+      this.dataTypesTabPage.Text = "Data Types";
+      this.dataTypesTabPage.UseVisualStyleBackColor = true;
+      // 
+      // dataTypeCollectionView
+      // 
+      this.dataTypeCollectionView.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom)
+                  | System.Windows.Forms.AnchorStyles.Left)
+                  | System.Windows.Forms.AnchorStyles.Right)));
+      this.dataTypeCollectionView.Caption = "DataTypeCollection View";
+      this.dataTypeCollectionView.Content = null;
+      this.dataTypeCollectionView.Location = new System.Drawing.Point(3, 3);
+      this.dataTypeCollectionView.Name = "dataTypeCollectionView";
+      this.dataTypeCollectionView.ReadOnly = false;
+      this.dataTypeCollectionView.Size = new System.Drawing.Size(713, 374);
+      this.dataTypeCollectionView.TabIndex = 0;
       // 
       // algorithmClassesTabPage
@@ -122,8 +153,8 @@
       this.algorithmClassCollectionView.Caption = "AlgorithmClassCollection View";
       this.algorithmClassCollectionView.Content = null;
-      this.algorithmClassCollectionView.Location = new System.Drawing.Point(6, 6);
+      this.algorithmClassCollectionView.Location = new System.Drawing.Point(3, 3);
       this.algorithmClassCollectionView.Name = "algorithmClassCollectionView";
       this.algorithmClassCollectionView.ReadOnly = false;
-      this.algorithmClassCollectionView.Size = new System.Drawing.Size(707, 368);
+      this.algorithmClassCollectionView.Size = new System.Drawing.Size(713, 374);
       this.algorithmClassCollectionView.TabIndex = 0;
       // 
@@ -146,24 +177,33 @@
       this.algorithmCollectionView.Caption = "AlgorithmCollection View";
       this.algorithmCollectionView.Content = null;
-      this.algorithmCollectionView.Location = new System.Drawing.Point(6, 6);
+      this.algorithmCollectionView.Location = new System.Drawing.Point(3, 3);
       this.algorithmCollectionView.Name = "algorithmCollectionView";
       this.algorithmCollectionView.ReadOnly = false;
-      this.algorithmCollectionView.Size = new System.Drawing.Size(707, 368);
+      this.algorithmCollectionView.Size = new System.Drawing.Size(713, 374);
       this.algorithmCollectionView.TabIndex = 0;
       // 
-      // dataTypesTabPage
-      // 
-      this.dataTypesTabPage.Controls.Add(this.dataTypeCollectionView);
-      this.dataTypesTabPage.Location = new System.Drawing.Point(4, 22);
-      this.dataTypesTabPage.Name = "dataTypesTabPage";
-      this.dataTypesTabPage.Padding = new System.Windows.Forms.Padding(3);
-      this.dataTypesTabPage.Size = new System.Drawing.Size(719, 380);
-      this.dataTypesTabPage.TabIndex = 3;
-      this.dataTypesTabPage.Text = "Data Types";
-      this.dataTypesTabPage.UseVisualStyleBackColor = true;
+      // problemClassesTabPage
+      // 
+      this.problemClassesTabPage.Controls.Add(this.problemClassCollectionView);
+      this.problemClassesTabPage.Location = new System.Drawing.Point(4, 22);
+      this.problemClassesTabPage.Name = "problemClassesTabPage";
+      this.problemClassesTabPage.Size = new System.Drawing.Size(719, 380);
+      this.problemClassesTabPage.TabIndex = 4;
+      this.problemClassesTabPage.Text = "Problem Classes";
+      this.problemClassesTabPage.UseVisualStyleBackColor = true;
+      // 
+      // problemsTabPage
+      // 
+      this.problemsTabPage.Controls.Add(this.problemCollectionView);
+      this.problemsTabPage.Location = new System.Drawing.Point(4, 22);
+      this.problemsTabPage.Name = "problemsTabPage";
+      this.problemsTabPage.Size = new System.Drawing.Size(719, 380);
+      this.problemsTabPage.TabIndex = 5;
+      this.problemsTabPage.Text = "Problems";
+      this.problemsTabPage.UseVisualStyleBackColor = true;
       // 
       // refreshButton
       // 
-      this.refreshButton.Image = ((System.Drawing.Image)(resources.GetObject("refreshButton.Image")));
+      this.refreshButton.Image = HeuristicLab.Common.Resources.VS2008ImageLibrary.Refresh;
       this.refreshButton.Location = new System.Drawing.Point(0, 0);
       this.refreshButton.Name = "refreshButton";
@@ -174,16 +214,29 @@
       this.refreshButton.Click += new System.EventHandler(this.refreshButton_Click);
       // 
-      // dataTypeCollectionView
-      // 
-      this.dataTypeCollectionView.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom)
-                  | System.Windows.Forms.AnchorStyles.Left)
-                  | System.Windows.Forms.AnchorStyles.Right)));
-      this.dataTypeCollectionView.Caption = "DataTypeCollection View";
-      this.dataTypeCollectionView.Content = null;
-      this.dataTypeCollectionView.Location = new System.Drawing.Point(6, 6);
-      this.dataTypeCollectionView.Name = "dataTypeCollectionView";
-      this.dataTypeCollectionView.ReadOnly = false;
-      this.dataTypeCollectionView.Size = new System.Drawing.Size(707, 368);
-      this.dataTypeCollectionView.TabIndex = 0;
+      // problemClassCollectionView
+      // 
+      this.problemClassCollectionView.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom)
+                  | System.Windows.Forms.AnchorStyles.Left)
+                  | System.Windows.Forms.AnchorStyles.Right)));
+      this.problemClassCollectionView.Caption = "ProblemClassCollection View";
+      this.problemClassCollectionView.Content = null;
+      this.problemClassCollectionView.Location = new System.Drawing.Point(3, 3);
+      this.problemClassCollectionView.Name = "problemClassCollectionView";
+      this.problemClassCollectionView.ReadOnly = false;
+      this.problemClassCollectionView.Size = new System.Drawing.Size(713, 374);
+      this.problemClassCollectionView.TabIndex = 0;
+      // 
+      // problemCollectionView
+      // 
+      this.problemCollectionView.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom)
+                  | System.Windows.Forms.AnchorStyles.Left)
+                  | System.Windows.Forms.AnchorStyles.Right)));
+      this.problemCollectionView.Caption = "ProblemCollection View";
+      this.problemCollectionView.Content = null;
+      this.problemCollectionView.Location = new System.Drawing.Point(3, 3);
+      this.problemCollectionView.Name = "problemCollectionView";
+      this.problemCollectionView.ReadOnly = false;
+      this.problemCollectionView.Size = new System.Drawing.Size(713, 374);
+      this.problemCollectionView.TabIndex = 0;
       // 
       // AdministratorView
@@ -197,7 +250,9 @@
       this.tabControl.ResumeLayout(false);
       this.platformsTabPage.ResumeLayout(false);
+      this.dataTypesTabPage.ResumeLayout(false);
       this.algorithmClassesTabPage.ResumeLayout(false);
       this.algorithmsTabPage.ResumeLayout(false);
-      this.dataTypesTabPage.ResumeLayout(false);
+      this.problemClassesTabPage.ResumeLayout(false);
+      this.problemsTabPage.ResumeLayout(false);
       this.ResumeLayout(false);
 
@@ -217,4 +272,8 @@
     private System.Windows.Forms.TabPage dataTypesTabPage;
     private DataTypeCollectionView dataTypeCollectionView;
+    private System.Windows.Forms.TabPage problemClassesTabPage;
+    private System.Windows.Forms.TabPage problemsTabPage;
+    private ProblemClassCollectionView problemClassCollectionView;
+    private ProblemCollectionView problemCollectionView;
 
   }
Index: /branches/OKB/HeuristicLab.Clients.OKB-3.3/Views/AdministratorView.cs
===================================================================
--- /branches/OKB/HeuristicLab.Clients.OKB-3.3/Views/AdministratorView.cs	(revision 4480)
+++ /branches/OKB/HeuristicLab.Clients.OKB-3.3/Views/AdministratorView.cs	(revision 4481)
@@ -54,12 +54,16 @@
       if (Content == null) {
         platformCollectionView.Content = null;
+        dataTypeCollectionView.Content = null;
         algorithmClassCollectionView.Content = null;
         algorithmCollectionView.Content = null;
-        dataTypeCollectionView.Content = null;
+        problemClassCollectionView.Content = null;
+        problemCollectionView.Content = null;
       } else {
         platformCollectionView.Content = Content.Platforms;
+        dataTypeCollectionView.Content = Content.DataTypes;
         algorithmClassCollectionView.Content = Content.AlgorithmClasses;
         algorithmCollectionView.Content = Content.Algorithms;
-        dataTypeCollectionView.Content = Content.DataTypes;
+        problemClassCollectionView.Content = Content.ProblemClasses;
+        problemCollectionView.Content = Content.Problems;
       }
     }
@@ -69,7 +73,9 @@
       refreshButton.Enabled = Content != null;
       platformCollectionView.Enabled = Content != null;
+      dataTypeCollectionView.Enabled = Content != null;
       algorithmClassCollectionView.Enabled = Content != null;
       algorithmCollectionView.Enabled = Content != null;
-      dataTypeCollectionView.Enabled = Content != null;
+      problemClassCollectionView.Enabled = Content != null;
+      problemCollectionView.Enabled = Content != null;
     }
 
@@ -88,7 +94,9 @@
       } else {
         platformCollectionView.Content = Content.Platforms;
+        dataTypeCollectionView.Content = Content.DataTypes;
         algorithmClassCollectionView.Content = Content.AlgorithmClasses;
         algorithmCollectionView.Content = Content.Algorithms;
-        dataTypeCollectionView.Content = Content.DataTypes;
+        problemClassCollectionView.Content = Content.ProblemClasses;
+        problemCollectionView.Content = Content.Problems;
         refreshButton.Enabled = true;
         tabControl.Enabled = true;
Index: /branches/OKB/HeuristicLab.Clients.OKB-3.3/Views/AlgorithmDataView.Designer.cs
===================================================================
--- /branches/OKB/HeuristicLab.Clients.OKB-3.3/Views/AlgorithmDataView.Designer.cs	(revision 4481)
+++ /branches/OKB/HeuristicLab.Clients.OKB-3.3/Views/AlgorithmDataView.Designer.cs	(revision 4481)
@@ -0,0 +1,255 @@
+#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 AlgorithmDataView {
+    /// <summary> 
+    /// Required designer variable.
+    /// </summary>
+    private System.ComponentModel.IContainer components = null;
+
+    /// <summary> 
+    /// Clean up any resources being used.
+    /// </summary>
+    /// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
+    protected override void Dispose(bool disposing) {
+      if (disposing) {
+        if (components != null) components.Dispose();
+      }
+      base.Dispose(disposing);
+    }
+
+    #region Component Designer generated code
+
+    /// <summary> 
+    /// Required method for Designer support - do not modify 
+    /// the contents of this method with the code editor.
+    /// </summary>
+    private void InitializeComponent() {
+      this.components = new System.ComponentModel.Container();
+      System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(AlgorithmDataView));
+      this.openFileDialog = new System.Windows.Forms.OpenFileDialog();
+      this.saveFileDialog = new System.Windows.Forms.SaveFileDialog();
+      this.groupBox = new System.Windows.Forms.GroupBox();
+      this.noViewAvailableLabel = new System.Windows.Forms.Label();
+      this.viewHost = new HeuristicLab.MainForm.WindowsForms.ViewHost();
+      this.dataTypeComboBox = new System.Windows.Forms.ComboBox();
+      this.newDataButton = new System.Windows.Forms.Button();
+      this.saveFileButton = new System.Windows.Forms.Button();
+      this.openFileButton = new System.Windows.Forms.Button();
+      this.fileTextBox = new System.Windows.Forms.TextBox();
+      this.refreshDataButton = new System.Windows.Forms.Button();
+      this.storeDataButton = new System.Windows.Forms.Button();
+      this.dataTypeLabel = new System.Windows.Forms.Label();
+      this.fileLabel = new System.Windows.Forms.Label();
+      this.toolTip = new System.Windows.Forms.ToolTip(this.components);
+      this.groupBox.SuspendLayout();
+      this.SuspendLayout();
+      // 
+      // openFileDialog
+      // 
+      this.openFileDialog.FileName = "data";
+      this.openFileDialog.Filter = "All Files (*.*)|*.*";
+      this.openFileDialog.Title = "Load Algorithm Data";
+      // 
+      // saveFileDialog
+      // 
+      this.saveFileDialog.FileName = "data";
+      this.saveFileDialog.Filter = "All Files (*.*)|*.*";
+      this.saveFileDialog.Title = "Save Algorithm Data";
+      // 
+      // groupBox
+      // 
+      this.groupBox.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom)
+                  | System.Windows.Forms.AnchorStyles.Left)
+                  | System.Windows.Forms.AnchorStyles.Right)));
+      this.groupBox.Controls.Add(this.noViewAvailableLabel);
+      this.groupBox.Controls.Add(this.viewHost);
+      this.groupBox.Location = new System.Drawing.Point(0, 83);
+      this.groupBox.Name = "groupBox";
+      this.groupBox.Size = new System.Drawing.Size(633, 371);
+      this.groupBox.TabIndex = 19;
+      this.groupBox.TabStop = false;
+      this.groupBox.Text = "Data:";
+      // 
+      // noViewAvailableLabel
+      // 
+      this.noViewAvailableLabel.Anchor = System.Windows.Forms.AnchorStyles.None;
+      this.noViewAvailableLabel.AutoSize = true;
+      this.noViewAvailableLabel.Location = new System.Drawing.Point(269, 179);
+      this.noViewAvailableLabel.Name = "noViewAvailableLabel";
+      this.noViewAvailableLabel.Size = new System.Drawing.Size(94, 13);
+      this.noViewAvailableLabel.TabIndex = 1;
+      this.noViewAvailableLabel.Text = "No view available.";
+      this.noViewAvailableLabel.Visible = false;
+      // 
+      // viewHost
+      // 
+      this.viewHost.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom)
+                  | System.Windows.Forms.AnchorStyles.Left)
+                  | System.Windows.Forms.AnchorStyles.Right)));
+      this.viewHost.Caption = "View";
+      this.viewHost.Content = null;
+      this.viewHost.Enabled = false;
+      this.viewHost.Location = new System.Drawing.Point(6, 19);
+      this.viewHost.Name = "viewHost";
+      this.viewHost.ReadOnly = false;
+      this.viewHost.Size = new System.Drawing.Size(621, 346);
+      this.viewHost.TabIndex = 0;
+      this.viewHost.ViewType = null;
+      // 
+      // dataTypeComboBox
+      // 
+      this.dataTypeComboBox.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
+                  | System.Windows.Forms.AnchorStyles.Right)));
+      this.dataTypeComboBox.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList;
+      this.dataTypeComboBox.FormattingEnabled = true;
+      this.dataTypeComboBox.Location = new System.Drawing.Point(66, 30);
+      this.dataTypeComboBox.Name = "dataTypeComboBox";
+      this.dataTypeComboBox.Size = new System.Drawing.Size(567, 21);
+      this.dataTypeComboBox.TabIndex = 16;
+      this.dataTypeComboBox.SelectedIndexChanged += new System.EventHandler(this.dataTypeComboBox_SelectedIndexChanged);
+      // 
+      // newDataButton
+      // 
+      this.newDataButton.Image = ((System.Drawing.Image)(resources.GetObject("newDataButton.Image")));
+      this.newDataButton.Location = new System.Drawing.Point(90, 0);
+      this.newDataButton.Name = "newDataButton";
+      this.newDataButton.Size = new System.Drawing.Size(24, 24);
+      this.newDataButton.TabIndex = 12;
+      this.toolTip.SetToolTip(this.newDataButton, "Create New Algorithm Data");
+      this.newDataButton.UseVisualStyleBackColor = true;
+      this.newDataButton.Click += new System.EventHandler(this.newDataButton_Click);
+      // 
+      // saveFileButton
+      // 
+      this.saveFileButton.Image = ((System.Drawing.Image)(resources.GetObject("saveFileButton.Image")));
+      this.saveFileButton.Location = new System.Drawing.Point(150, 0);
+      this.saveFileButton.Name = "saveFileButton";
+      this.saveFileButton.Size = new System.Drawing.Size(24, 24);
+      this.saveFileButton.TabIndex = 14;
+      this.toolTip.SetToolTip(this.saveFileButton, "Save Algorithm Data into File");
+      this.saveFileButton.UseVisualStyleBackColor = true;
+      this.saveFileButton.Click += new System.EventHandler(this.saveFileButton_Click);
+      // 
+      // openFileButton
+      // 
+      this.openFileButton.Image = ((System.Drawing.Image)(resources.GetObject("openFileButton.Image")));
+      this.openFileButton.Location = new System.Drawing.Point(120, 0);
+      this.openFileButton.Name = "openFileButton";
+      this.openFileButton.Size = new System.Drawing.Size(24, 24);
+      this.openFileButton.TabIndex = 13;
+      this.toolTip.SetToolTip(this.openFileButton, "Load Algorithm Data from File");
+      this.openFileButton.UseVisualStyleBackColor = true;
+      this.openFileButton.Click += new System.EventHandler(this.openFileButton_Click);
+      // 
+      // fileTextBox
+      // 
+      this.fileTextBox.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
+                  | System.Windows.Forms.AnchorStyles.Right)));
+      this.fileTextBox.Location = new System.Drawing.Point(66, 57);
+      this.fileTextBox.Name = "fileTextBox";
+      this.fileTextBox.ReadOnly = true;
+      this.fileTextBox.Size = new System.Drawing.Size(567, 20);
+      this.fileTextBox.TabIndex = 18;
+      // 
+      // refreshDataButton
+      // 
+      this.refreshDataButton.Image = ((System.Drawing.Image)(resources.GetObject("refreshDataButton.Image")));
+      this.refreshDataButton.Location = new System.Drawing.Point(0, 0);
+      this.refreshDataButton.Name = "refreshDataButton";
+      this.refreshDataButton.Size = new System.Drawing.Size(24, 24);
+      this.refreshDataButton.TabIndex = 10;
+      this.toolTip.SetToolTip(this.refreshDataButton, "Refresh Algorithm Data from OKB");
+      this.refreshDataButton.UseVisualStyleBackColor = true;
+      this.refreshDataButton.Click += new System.EventHandler(this.refreshDataButton_Click);
+      // 
+      // storeDataButton
+      // 
+      this.storeDataButton.Image = ((System.Drawing.Image)(resources.GetObject("storeDataButton.Image")));
+      this.storeDataButton.Location = new System.Drawing.Point(30, 0);
+      this.storeDataButton.Name = "storeDataButton";
+      this.storeDataButton.Size = new System.Drawing.Size(24, 24);
+      this.storeDataButton.TabIndex = 11;
+      this.toolTip.SetToolTip(this.storeDataButton, "Store Algorithm Data in OKB");
+      this.storeDataButton.UseVisualStyleBackColor = true;
+      this.storeDataButton.Click += new System.EventHandler(this.storeDataButton_Click);
+      // 
+      // dataTypeLabel
+      // 
+      this.dataTypeLabel.AutoSize = true;
+      this.dataTypeLabel.Location = new System.Drawing.Point(3, 33);
+      this.dataTypeLabel.Name = "dataTypeLabel";
+      this.dataTypeLabel.Size = new System.Drawing.Size(57, 13);
+      this.dataTypeLabel.TabIndex = 15;
+      this.dataTypeLabel.Text = "&DataType:";
+      // 
+      // fileLabel
+      // 
+      this.fileLabel.AutoSize = true;
+      this.fileLabel.Location = new System.Drawing.Point(3, 60);
+      this.fileLabel.Name = "fileLabel";
+      this.fileLabel.Size = new System.Drawing.Size(26, 13);
+      this.fileLabel.TabIndex = 17;
+      this.fileLabel.Text = "&File:";
+      // 
+      // AlgorithmDataView
+      // 
+      this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
+      this.Controls.Add(this.groupBox);
+      this.Controls.Add(this.dataTypeComboBox);
+      this.Controls.Add(this.newDataButton);
+      this.Controls.Add(this.saveFileButton);
+      this.Controls.Add(this.openFileButton);
+      this.Controls.Add(this.fileTextBox);
+      this.Controls.Add(this.refreshDataButton);
+      this.Controls.Add(this.storeDataButton);
+      this.Controls.Add(this.dataTypeLabel);
+      this.Controls.Add(this.fileLabel);
+      this.Name = "AlgorithmDataView";
+      this.Size = new System.Drawing.Size(633, 454);
+      this.groupBox.ResumeLayout(false);
+      this.groupBox.PerformLayout();
+      this.ResumeLayout(false);
+      this.PerformLayout();
+
+    }
+
+    #endregion
+
+    private System.Windows.Forms.ToolTip toolTip;
+    private System.Windows.Forms.OpenFileDialog openFileDialog;
+    private System.Windows.Forms.SaveFileDialog saveFileDialog;
+    private System.Windows.Forms.GroupBox groupBox;
+    private System.Windows.Forms.Label noViewAvailableLabel;
+    private MainForm.WindowsForms.ViewHost viewHost;
+    private System.Windows.Forms.ComboBox dataTypeComboBox;
+    private System.Windows.Forms.Button newDataButton;
+    private System.Windows.Forms.Button saveFileButton;
+    private System.Windows.Forms.Button openFileButton;
+    private System.Windows.Forms.TextBox fileTextBox;
+    private System.Windows.Forms.Button refreshDataButton;
+    private System.Windows.Forms.Button storeDataButton;
+    private System.Windows.Forms.Label dataTypeLabel;
+    private System.Windows.Forms.Label fileLabel;
+
+  }
+}
Index: /branches/OKB/HeuristicLab.Clients.OKB-3.3/Views/AlgorithmDataView.cs
===================================================================
--- /branches/OKB/HeuristicLab.Clients.OKB-3.3/Views/AlgorithmDataView.cs	(revision 4481)
+++ /branches/OKB/HeuristicLab.Clients.OKB-3.3/Views/AlgorithmDataView.cs	(revision 4481)
@@ -0,0 +1,201 @@
+#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.IO;
+using System.Linq;
+using System.Windows.Forms;
+using HeuristicLab.Common;
+using HeuristicLab.Core.Views;
+using HeuristicLab.MainForm;
+using HeuristicLab.MainForm.WindowsForms;
+using HeuristicLab.Optimization;
+using HeuristicLab.Persistence.Default.Xml;
+using HeuristicLab.PluginInfrastructure;
+
+namespace HeuristicLab.Clients.OKB {
+  [View("AlgorithmData View")]
+  [Content(typeof(AlgorithmData), true)]
+  public partial class AlgorithmDataView : AsynchronousContentView {
+    public long AlgorithmId { get; set; }
+
+    public new AlgorithmData Content {
+      get { return (AlgorithmData)base.Content; }
+      set { base.Content = value; }
+    }
+
+    public AlgorithmDataView() {
+      InitializeComponent();
+    }
+
+    protected override void OnInitialized(System.EventArgs e) {
+      base.OnInitialized(e);
+      dataTypeComboBox.DataSource = Administrator.Instance.DataTypes.ToList();
+      dataTypeComboBox.SelectedIndex = -1;
+    }
+
+    protected override void OnContentChanged() {
+      base.OnContentChanged();
+      if (Content == null) {
+        dataTypeComboBox.SelectedIndex = -1;
+        viewHost.Content = null;
+        noViewAvailableLabel.Visible = false;
+      } else {
+        dataTypeComboBox.SelectedItem = Administrator.Instance.DataTypes.FirstOrDefault(d => d.Id == Content.DataTypeId);
+
+        using (MemoryStream stream = new MemoryStream(Content.Data)) {
+          try {
+            viewHost.Content = XmlParser.Deserialize<IContent>(stream);
+            noViewAvailableLabel.Visible = false;
+          }
+          catch (Exception) {
+            viewHost.Content = null;
+            noViewAvailableLabel.Visible = true;
+          }
+          stream.Close();
+        }
+      }
+      fileTextBox.Text = "-";
+    }
+
+    protected override void SetEnabledStateOfControls() {
+      base.SetEnabledStateOfControls();
+      storeDataButton.Enabled = saveFileButton.Enabled = Content != null;
+      dataTypeComboBox.Enabled = Content != null && viewHost.Content == null;
+      fileTextBox.Enabled = Content != null;
+      groupBox.Enabled = Content != null;
+    }
+
+    private void refreshDataButton_Click(object sender, EventArgs e) {
+      AlgorithmData data = Administrator.Instance.GetAlgorithmData(AlgorithmId);
+      Content = data;
+    }
+    private void storeDataButton_Click(object sender, EventArgs e) {
+      if (viewHost.Content != null) {
+        try {
+          using (MemoryStream stream = new MemoryStream()) {
+            IAlgorithm algorithm = viewHost.Content as IAlgorithm;
+            algorithm.Prepare(true);
+            algorithm.Problem = null;
+            XmlGenerator.Serialize(algorithm, stream);
+            stream.Close();
+            Content.Data = stream.ToArray();
+          }
+        }
+        catch (Exception ex) {
+          ErrorHandling.ShowErrorDialog(this, ex);
+        }
+      }
+      Administrator.Instance.UpdateAlgorithmData(Content);
+    }
+    private void newDataButton_Click(object sender, EventArgs e) {
+      using (TypeSelectorDialog dialog = new TypeSelectorDialog()) {
+        dialog.Caption = "Select Algorithm";
+        dialog.TypeSelector.Caption = "Available Algorithms";
+        dialog.TypeSelector.Configure(typeof(IAlgorithm), false, true);
+        if (dialog.ShowDialog(this) == DialogResult.OK) {
+          try {
+            if (Content == null) Content = new AlgorithmData { AlgorithmId = AlgorithmId, Data = new byte[0] };
+            viewHost.Content = (IContent)dialog.TypeSelector.CreateInstanceOfSelectedType();
+            DataType dataType = Administrator.Instance.DataTypes.FirstOrDefault(d => d.Name == viewHost.Content.GetType().AssemblyQualifiedName);
+            if (dataType == null) {
+              dataType = new DataType { Name = viewHost.Content.GetType().AssemblyQualifiedName, SqlName = "Blob" };
+              dataType.PlatformId = Administrator.Instance.Platforms.FirstOrDefault(p => p.Name == "HeuristicLab 3.3").Id;
+
+              Administrator.Instance.Store(dataType);
+              Administrator.Instance.DataTypes.Add(dataType);
+              dataTypeComboBox.DataSource = Administrator.Instance.DataTypes.OrderBy(d => d.Name).ToList();
+            }
+            dataTypeComboBox.SelectedItem = dataType;
+            dataTypeComboBox.Enabled = false;
+            fileTextBox.Text = "-";
+            noViewAvailableLabel.Visible = false;
+          }
+          catch (Exception ex) {
+            ErrorHandling.ShowErrorDialog(this, ex);
+          }
+        }
+      }
+    }
+    private void openFileButton_Click(object sender, EventArgs e) {
+      if (openFileDialog.ShowDialog(this) == DialogResult.OK) {
+        try {
+          if (Content == null) Content = new AlgorithmData { AlgorithmId = AlgorithmId, Data = new byte[0] };
+          IAlgorithm algorithm = null;
+          try {
+            algorithm = XmlParser.Deserialize<IAlgorithm>(openFileDialog.FileName);
+          }
+          catch (Exception) { }
+
+          if (algorithm != null) {
+            viewHost.Content = algorithm;
+            noViewAvailableLabel.Visible = false;
+            DataType dataType = Administrator.Instance.DataTypes.FirstOrDefault(d => d.Name == viewHost.Content.GetType().AssemblyQualifiedName);
+            if (dataType == null) {
+              dataType = new DataType { Name = viewHost.Content.GetType().AssemblyQualifiedName, SqlName = "Blob" };
+              dataType.PlatformId = Administrator.Instance.Platforms.FirstOrDefault(p => p.Name == "HeuristicLab 3.3").Id;
+
+              Administrator.Instance.Store(dataType);
+              Administrator.Instance.DataTypes.Add(dataType);
+              dataTypeComboBox.DataSource = Administrator.Instance.DataTypes.OrderBy(d => d.Name).ToList();
+            }
+            dataTypeComboBox.SelectedItem = dataType;
+          } else {
+            viewHost.Content = null;
+            noViewAvailableLabel.Visible = true;
+            using (FileStream stream = new FileStream(openFileDialog.FileName, FileMode.Open, FileAccess.Read)) {
+              byte[] bytes = new byte[stream.Length];
+              stream.Read(bytes, 0, bytes.Length);
+              stream.Close();
+              Content.Data = bytes;
+            }
+          }
+          dataTypeComboBox.Enabled = viewHost.Content == null;
+          fileTextBox.Text = openFileDialog.FileName;
+        }
+        catch (Exception ex) {
+          ErrorHandling.ShowErrorDialog(this, ex);
+        }
+      }
+    }
+    private void saveFileButton_Click(object sender, EventArgs e) {
+      if (saveFileDialog.ShowDialog(this) == DialogResult.OK) {
+        try {
+          if (viewHost.Content != null) {
+            XmlGenerator.Serialize(viewHost.Content, saveFileDialog.FileName);
+          } else {
+            using (FileStream stream = new FileStream(saveFileDialog.FileName, FileMode.Create, FileAccess.Write)) {
+              stream.Write(Content.Data, 0, Content.Data.Length);
+              stream.Close();
+            }
+          }
+          fileTextBox.Text = saveFileDialog.FileName;
+        }
+        catch (Exception ex) {
+          ErrorHandling.ShowErrorDialog(this, ex);
+        }
+      }
+    }
+    private void dataTypeComboBox_SelectedIndexChanged(object sender, EventArgs e) {
+      if (Content != null) Content.DataTypeId = ((DataType)dataTypeComboBox.SelectedItem).Id;
+    }
+  }
+}
Index: /branches/OKB/HeuristicLab.Clients.OKB-3.3/Views/AlgorithmView.Designer.cs
===================================================================
--- /branches/OKB/HeuristicLab.Clients.OKB-3.3/Views/AlgorithmView.Designer.cs	(revision 4480)
+++ /branches/OKB/HeuristicLab.Clients.OKB-3.3/Views/AlgorithmView.Designer.cs	(revision 4481)
@@ -45,4 +45,5 @@
     /// </summary>
     private void InitializeComponent() {
+      System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(AlgorithmView));
       this.platformLabel = new System.Windows.Forms.Label();
       this.platformComboBox = new System.Windows.Forms.ComboBox();
@@ -55,11 +56,5 @@
       this.refreshUsersButton = new System.Windows.Forms.Button();
       this.dataTabPage = new System.Windows.Forms.TabPage();
-      this.fileLabel = new System.Windows.Forms.Label();
-      this.storeDataButton = new System.Windows.Forms.Button();
-      this.fileTextBox = new System.Windows.Forms.TextBox();
-      this.openFileButton = new System.Windows.Forms.Button();
-      this.openFileDialog = new System.Windows.Forms.OpenFileDialog();
-      this.dataTypeLabel = new System.Windows.Forms.Label();
-      this.dataTypeComboBox = new System.Windows.Forms.ComboBox();
+      this.algorithmDataView = new HeuristicLab.Clients.OKB.AlgorithmDataView();
       ((System.ComponentModel.ISupportInitialize)(this.modifiedPictureBox)).BeginInit();
       this.tabControl.SuspendLayout();
@@ -135,5 +130,5 @@
       this.usersListBox.Enabled = false;
       this.usersListBox.FormattingEnabled = true;
-      this.usersListBox.Location = new System.Drawing.Point(6, 35);
+      this.usersListBox.Location = new System.Drawing.Point(6, 36);
       this.usersListBox.Name = "usersListBox";
       this.usersListBox.SelectionMode = System.Windows.Forms.SelectionMode.MultiSimple;
@@ -170,9 +165,9 @@
       // storeUsersButton
       // 
-      this.storeUsersButton.Location = new System.Drawing.Point(86, 6);
+      this.storeUsersButton.Image = ((System.Drawing.Image)(resources.GetObject("storeUsersButton.Image")));
+      this.storeUsersButton.Location = new System.Drawing.Point(36, 6);
       this.storeUsersButton.Name = "storeUsersButton";
-      this.storeUsersButton.Size = new System.Drawing.Size(75, 23);
+      this.storeUsersButton.Size = new System.Drawing.Size(24, 24);
       this.storeUsersButton.TabIndex = 1;
-      this.storeUsersButton.Text = "&Store";
       this.toolTip.SetToolTip(this.storeUsersButton, "Store Authorized Users");
       this.storeUsersButton.UseVisualStyleBackColor = true;
@@ -181,9 +176,9 @@
       // refreshUsersButton
       // 
+      this.refreshUsersButton.Image = ((System.Drawing.Image)(resources.GetObject("refreshUsersButton.Image")));
       this.refreshUsersButton.Location = new System.Drawing.Point(6, 6);
       this.refreshUsersButton.Name = "refreshUsersButton";
-      this.refreshUsersButton.Size = new System.Drawing.Size(75, 23);
+      this.refreshUsersButton.Size = new System.Drawing.Size(24, 24);
       this.refreshUsersButton.TabIndex = 0;
-      this.refreshUsersButton.Text = "&Refresh";
       this.toolTip.SetToolTip(this.refreshUsersButton, "Refresh Authorized Users");
       this.refreshUsersButton.UseVisualStyleBackColor = true;
@@ -192,10 +187,5 @@
       // dataTabPage
       // 
-      this.dataTabPage.Controls.Add(this.dataTypeComboBox);
-      this.dataTabPage.Controls.Add(this.openFileButton);
-      this.dataTabPage.Controls.Add(this.fileTextBox);
-      this.dataTabPage.Controls.Add(this.storeDataButton);
-      this.dataTabPage.Controls.Add(this.dataTypeLabel);
-      this.dataTabPage.Controls.Add(this.fileLabel);
+      this.dataTabPage.Controls.Add(this.algorithmDataView);
       this.dataTabPage.Location = new System.Drawing.Point(4, 22);
       this.dataTabPage.Name = "dataTabPage";
@@ -203,75 +193,19 @@
       this.dataTabPage.Size = new System.Drawing.Size(625, 266);
       this.dataTabPage.TabIndex = 1;
-      this.dataTabPage.Text = "Serialized Algorithm";
+      this.dataTabPage.Text = "Platform-Specific Algorithm Data";
       this.dataTabPage.UseVisualStyleBackColor = true;
       // 
-      // fileLabel
-      // 
-      this.fileLabel.AutoSize = true;
-      this.fileLabel.Location = new System.Drawing.Point(6, 38);
-      this.fileLabel.Name = "fileLabel";
-      this.fileLabel.Size = new System.Drawing.Size(26, 13);
-      this.fileLabel.TabIndex = 1;
-      this.fileLabel.Text = "&File:";
-      // 
-      // storeDataButton
-      // 
-      this.storeDataButton.Enabled = false;
-      this.storeDataButton.Location = new System.Drawing.Point(6, 6);
-      this.storeDataButton.Name = "storeDataButton";
-      this.storeDataButton.Size = new System.Drawing.Size(75, 23);
-      this.storeDataButton.TabIndex = 0;
-      this.storeDataButton.Text = "&Store";
-      this.toolTip.SetToolTip(this.storeDataButton, "Store Serialized Algorithm");
-      this.storeDataButton.UseVisualStyleBackColor = true;
-      this.storeDataButton.Click += new System.EventHandler(this.storeDataButton_Click);
-      // 
-      // fileTextBox
-      // 
-      this.fileTextBox.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
-                  | System.Windows.Forms.AnchorStyles.Right)));
-      this.fileTextBox.Location = new System.Drawing.Point(69, 35);
-      this.fileTextBox.Name = "fileTextBox";
-      this.fileTextBox.ReadOnly = true;
-      this.fileTextBox.Size = new System.Drawing.Size(520, 20);
-      this.fileTextBox.TabIndex = 2;
-      // 
-      // openFileButton
-      // 
-      this.openFileButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right)));
-      this.openFileButton.Location = new System.Drawing.Point(595, 32);
-      this.openFileButton.Name = "openFileButton";
-      this.openFileButton.Size = new System.Drawing.Size(24, 24);
-      this.openFileButton.TabIndex = 3;
-      this.openFileButton.Text = "...";
-      this.openFileButton.UseVisualStyleBackColor = true;
-      this.openFileButton.Click += new System.EventHandler(this.openFileButton_Click);
-      // 
-      // openFileDialog
-      // 
-      this.openFileDialog.FileName = "algorithm";
-      this.openFileDialog.Filter = "All Files (*.*)|*.*";
-      this.openFileDialog.Title = "Select Algorithm File";
-      // 
-      // dataTypeLabel
-      // 
-      this.dataTypeLabel.AutoSize = true;
-      this.dataTypeLabel.Location = new System.Drawing.Point(6, 64);
-      this.dataTypeLabel.Name = "dataTypeLabel";
-      this.dataTypeLabel.Size = new System.Drawing.Size(57, 13);
-      this.dataTypeLabel.TabIndex = 4;
-      this.dataTypeLabel.Text = "&DataType:";
-      // 
-      // dataTypeComboBox
-      // 
-      this.dataTypeComboBox.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
-                  | System.Windows.Forms.AnchorStyles.Right)));
-      this.dataTypeComboBox.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList;
-      this.dataTypeComboBox.FormattingEnabled = true;
-      this.dataTypeComboBox.Location = new System.Drawing.Point(69, 61);
-      this.dataTypeComboBox.Name = "dataTypeComboBox";
-      this.dataTypeComboBox.Size = new System.Drawing.Size(550, 21);
-      this.dataTypeComboBox.TabIndex = 5;
-      this.dataTypeComboBox.SelectedIndexChanged += new System.EventHandler(this.dataTypeComboBox_SelectedIndexChanged);
+      // algorithmDataView
+      // 
+      this.algorithmDataView.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom)
+                  | System.Windows.Forms.AnchorStyles.Left)
+                  | System.Windows.Forms.AnchorStyles.Right)));
+      this.algorithmDataView.Caption = "AlgorithmData View";
+      this.algorithmDataView.Content = null;
+      this.algorithmDataView.Location = new System.Drawing.Point(6, 6);
+      this.algorithmDataView.Name = "algorithmDataView";
+      this.algorithmDataView.ReadOnly = false;
+      this.algorithmDataView.Size = new System.Drawing.Size(613, 254);
+      this.algorithmDataView.TabIndex = 0;
       // 
       // AlgorithmView
@@ -300,5 +234,4 @@
       this.usersTabPage.ResumeLayout(false);
       this.dataTabPage.ResumeLayout(false);
-      this.dataTabPage.PerformLayout();
       this.ResumeLayout(false);
       this.PerformLayout();
@@ -318,11 +251,5 @@
     private System.Windows.Forms.Button refreshUsersButton;
     private System.Windows.Forms.TabPage dataTabPage;
-    private System.Windows.Forms.ComboBox dataTypeComboBox;
-    private System.Windows.Forms.Button openFileButton;
-    private System.Windows.Forms.TextBox fileTextBox;
-    private System.Windows.Forms.Button storeDataButton;
-    private System.Windows.Forms.Label dataTypeLabel;
-    private System.Windows.Forms.Label fileLabel;
-    private System.Windows.Forms.OpenFileDialog openFileDialog;
+    private AlgorithmDataView algorithmDataView;
 
   }
Index: /branches/OKB/HeuristicLab.Clients.OKB-3.3/Views/AlgorithmView.cs
===================================================================
--- /branches/OKB/HeuristicLab.Clients.OKB-3.3/Views/AlgorithmView.cs	(revision 4480)
+++ /branches/OKB/HeuristicLab.Clients.OKB-3.3/Views/AlgorithmView.cs	(revision 4481)
@@ -26,5 +26,4 @@
 using HeuristicLab.MainForm;
 using HeuristicLab.MainForm.WindowsForms;
-using System.IO;
 
 namespace HeuristicLab.Clients.OKB {
@@ -45,5 +44,4 @@
       platformComboBox.DataSource = Administrator.Instance.Platforms.ToList();
       algorithmClassComboBox.DataSource = Administrator.Instance.AlgorithmClasses.ToList();
-      dataTypeComboBox.DataSource = Administrator.Instance.DataTypes.ToList();
     }
 
@@ -62,11 +60,12 @@
         platformComboBox.SelectedIndex = -1;
         algorithmClassComboBox.SelectedIndex = -1;
+        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);
+        algorithmDataView.AlgorithmId = Content.Id;
       }
       usersListBox.DataSource = null;
-      fileTextBox.Text = "";
-      dataTypeComboBox.SelectedIndex = -1;
+      algorithmDataView.Content = null;
     }
 
@@ -78,5 +77,5 @@
       storeUsersButton.Enabled = usersListBox.DataSource != null;
       usersListBox.Enabled = usersListBox.DataSource != null;
-      storeDataButton.Enabled = !string.IsNullOrEmpty(fileTextBox.Text) && dataTypeComboBox.SelectedIndex != -1;
+      algorithmDataView.Enabled = Content != null;
     }
 
@@ -119,5 +118,5 @@
     }
     private void storeUsersButton_Click(object sender, System.EventArgs e) {
-      if (Administrator.Instance.StoreAlgorithmUsers(Content.Id, usersListBox.SelectedItems.Cast<User>().Select(u => u.Id).ToArray()))
+      if (Administrator.Instance.UpdateAlgorithmUsers(Content.Id, usersListBox.SelectedItems.Cast<User>().Select(u => u.Id).ToArray()))
         storeUsersButton.Enabled = false;
     }
@@ -125,29 +124,4 @@
       storeUsersButton.Enabled = true;
     }
-
-    private void storeDataButton_Click(object sender, EventArgs e) {
-      AlgorithmData data = new AlgorithmData();
-      data.AlgorithmId = Content.Id;
-      data.DataTypeId = ((DataType)dataTypeComboBox.SelectedItem).Id;
-
-      using (FileStream stream = new FileStream(fileTextBox.Text, FileMode.Open, FileAccess.Read)) {
-        byte[] bytes = new byte[stream.Length];
-        stream.Read(bytes, 0, bytes.Length);
-        stream.Close();
-        data.Data = bytes;
-      }
-
-      if (Administrator.Instance.StoreAlgorithmData(data))
-        storeDataButton.Enabled = false;
-    }
-    private void openFileButton_Click(object sender, EventArgs e) {
-      if (openFileDialog.ShowDialog(this) == DialogResult.OK) {
-        fileTextBox.Text = openFileDialog.FileName;
-        storeDataButton.Enabled = true;
-      }
-    }
-    private void dataTypeComboBox_SelectedIndexChanged(object sender, EventArgs e) {
-      storeDataButton.Enabled = !string.IsNullOrEmpty(fileTextBox.Text);
-    }
   }
 }
Index: /branches/OKB/HeuristicLab.Clients.OKB-3.3/Views/ProblemClassCollectionView.Designer.cs
===================================================================
--- /branches/OKB/HeuristicLab.Clients.OKB-3.3/Views/ProblemClassCollectionView.Designer.cs	(revision 4481)
+++ /branches/OKB/HeuristicLab.Clients.OKB-3.3/Views/ProblemClassCollectionView.Designer.cs	(revision 4481)
@@ -0,0 +1,53 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2010 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+namespace HeuristicLab.Clients.OKB {
+  partial class ProblemClassCollectionView {
+    /// <summary> 
+    /// Required designer variable.
+    /// </summary>
+    private System.ComponentModel.IContainer components = null;
+
+    /// <summary> 
+    /// Clean up any resources being used.
+    /// </summary>
+    /// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
+    protected override void Dispose(bool disposing) {
+      if (disposing) {
+        if (components != null) components.Dispose();
+      }
+      base.Dispose(disposing);
+    }
+
+    #region Component Designer generated code
+
+    /// <summary> 
+    /// Required method for Designer support - do not modify 
+    /// the contents of this method with the code editor.
+    /// </summary>
+    private void InitializeComponent() {
+      components = new System.ComponentModel.Container();
+      this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
+    }
+
+    #endregion
+  }
+}
Index: /branches/OKB/HeuristicLab.Clients.OKB-3.3/Views/ProblemClassCollectionView.cs
===================================================================
--- /branches/OKB/HeuristicLab.Clients.OKB-3.3/Views/ProblemClassCollectionView.cs	(revision 4481)
+++ /branches/OKB/HeuristicLab.Clients.OKB-3.3/Views/ProblemClassCollectionView.cs	(revision 4481)
@@ -0,0 +1,40 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2010 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System.Windows.Forms;
+using HeuristicLab.Core;
+using HeuristicLab.Core.Views;
+using HeuristicLab.MainForm;
+
+namespace HeuristicLab.Clients.OKB {
+  [View("ProblemClassCollection View")]
+  [Content(typeof(IItemCollection<ProblemClass>), true)]
+  public partial class ProblemClassCollectionView : ItemCollectionView<ProblemClass> {
+    public ProblemClassCollectionView() {
+      InitializeComponent();
+      itemsGroupBox.Text = "Problem Classes";
+    }
+
+    protected override ProblemClass CreateItem() {
+      return new ProblemClass();
+    }
+  }
+}
Index: /branches/OKB/HeuristicLab.Clients.OKB-3.3/Views/ProblemCollectionView.Designer.cs
===================================================================
--- /branches/OKB/HeuristicLab.Clients.OKB-3.3/Views/ProblemCollectionView.Designer.cs	(revision 4481)
+++ /branches/OKB/HeuristicLab.Clients.OKB-3.3/Views/ProblemCollectionView.Designer.cs	(revision 4481)
@@ -0,0 +1,53 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2010 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+namespace HeuristicLab.Clients.OKB {
+  partial class ProblemCollectionView {
+    /// <summary> 
+    /// Required designer variable.
+    /// </summary>
+    private System.ComponentModel.IContainer components = null;
+
+    /// <summary> 
+    /// Clean up any resources being used.
+    /// </summary>
+    /// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
+    protected override void Dispose(bool disposing) {
+      if (disposing) {
+        if (components != null) components.Dispose();
+      }
+      base.Dispose(disposing);
+    }
+
+    #region Component Designer generated code
+
+    /// <summary> 
+    /// Required method for Designer support - do not modify 
+    /// the contents of this method with the code editor.
+    /// </summary>
+    private void InitializeComponent() {
+      components = new System.ComponentModel.Container();
+      this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
+    }
+
+    #endregion
+  }
+}
Index: /branches/OKB/HeuristicLab.Clients.OKB-3.3/Views/ProblemCollectionView.cs
===================================================================
--- /branches/OKB/HeuristicLab.Clients.OKB-3.3/Views/ProblemCollectionView.cs	(revision 4481)
+++ /branches/OKB/HeuristicLab.Clients.OKB-3.3/Views/ProblemCollectionView.cs	(revision 4481)
@@ -0,0 +1,40 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2010 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System.Windows.Forms;
+using HeuristicLab.Core;
+using HeuristicLab.Core.Views;
+using HeuristicLab.MainForm;
+
+namespace HeuristicLab.Clients.OKB {
+  [View("ProblemCollection View")]
+  [Content(typeof(IItemCollection<Problem>), true)]
+  public partial class ProblemCollectionView : ItemCollectionView<Problem> {
+    public ProblemCollectionView() {
+      InitializeComponent();
+      itemsGroupBox.Text = "Problems";
+    }
+
+    protected override Problem CreateItem() {
+      return new Problem();
+    }
+  }
+}
Index: /branches/OKB/HeuristicLab.Clients.OKB-3.3/app.config
===================================================================
--- /branches/OKB/HeuristicLab.Clients.OKB-3.3/app.config	(revision 4480)
+++ /branches/OKB/HeuristicLab.Clients.OKB-3.3/app.config	(revision 4481)
@@ -11,5 +11,5 @@
                     allowCookies="false">
                     <readerQuotas maxDepth="32" maxStringContentLength="8192" maxArrayLength="200000000"
-                        maxBytesPerRead="4096" maxNameTableCharCount="16384" />
+                        maxBytesPerRead="200000000" maxNameTableCharCount="16384" />
                     <reliableSession ordered="true" inactivityTimeout="00:10:00"
                         enabled="false" />
Index: /branches/OKB/HeuristicLab.Services.OKB.DataAccess/3.3/OKB.dbml
===================================================================
--- /branches/OKB/HeuristicLab.Services.OKB.DataAccess/3.3/OKB.dbml	(revision 4480)
+++ /branches/OKB/HeuristicLab.Services.OKB.DataAccess/3.3/OKB.dbml	(revision 4481)
@@ -30,5 +30,4 @@
       <Column Name="ProblemClassId" Type="System.Int64" DbType="BigInt NOT NULL" CanBeNull="false" />
       <Column Name="PlatformId" Type="System.Int64" DbType="BigInt NOT NULL" CanBeNull="false" />
-      <Column Name="SolutionRepresentationId" Storage="_SolutionRepresentationid" Type="System.Int64" DbType="BigInt NOT NULL" CanBeNull="false" />
       <Column Name="Name" Type="System.String" DbType="NVarChar(200) NOT NULL" CanBeNull="false" />
       <Column Name="Description" Type="System.String" DbType="NVarChar(MAX)" CanBeNull="true" />
Index: /branches/OKB/HeuristicLab.Services.OKB.DataAccess/3.3/OKB.dbml.layout
===================================================================
--- /branches/OKB/HeuristicLab.Services.OKB.DataAccess/3.3/OKB.dbml.layout	(revision 4480)
+++ /branches/OKB/HeuristicLab.Services.OKB.DataAccess/3.3/OKB.dbml.layout	(revision 4481)
@@ -22,8 +22,8 @@
       </nodes>
     </associationConnector>
-    <classShape Id="27d0903a-8f45-4b0b-8d0e-8d632bffc702" absoluteBounds="13.25, 2.125, 2, 1.9631982421875">
+    <classShape Id="27d0903a-8f45-4b0b-8d0e-8d632bffc702" absoluteBounds="13.25, 2.125, 2, 1.7708968098958331">
       <DataClassMoniker Name="/OKBDataContext/Problem" />
       <nestedChildShapes>
-        <elementListCompartment Id="9038b68e-8013-42c0-bba9-60a0b75fffd1" absoluteBounds="13.265, 2.585, 1.9700000000000002, 1.4031982421875" name="DataPropertiesCompartment" titleTextColor="Black" itemTextColor="Black" />
+        <elementListCompartment Id="9038b68e-8013-42c0-bba9-60a0b75fffd1" absoluteBounds="13.265, 2.585, 1.9700000000000002, 1.2108968098958333" name="DataPropertiesCompartment" titleTextColor="Black" itemTextColor="Black" />
       </nestedChildShapes>
     </classShape>
@@ -34,5 +34,5 @@
       </nestedChildShapes>
     </classShape>
-    <associationConnector edgePoints="[(14.25 : 1.8862939453125); (14.25 : 2.125)]" fixedFrom="NotFixed" fixedTo="NotFixed">
+    <associationConnector edgePoints="[(14.25 : 1.8862939453125); (14.25 : 2.125)]" fixedFrom="Algorithm" fixedTo="Algorithm">
       <AssociationMoniker Name="/OKBDataContext/ProblemClass/ProblemClass_Problem" />
       <nodes>
@@ -47,5 +47,5 @@
       </nestedChildShapes>
     </classShape>
-    <associationConnector edgePoints="[(13.25 : 3.70933229417067); (10.3177083333333 : 3.70933229417067 : JumpStart); (10.0755208333334 : 3.70933229417067 : JumpEnd); (9.39129711009978 : 3.70933229417067); (9.39129711009978 : 4.375)]" manuallyRouted="true" fixedFrom="NotFixed" fixedTo="NotFixed">
+    <associationConnector edgePoints="[(13.25 : 3.73768854532225); (10.3177083333333 : 3.73768854532225 : JumpStart); (10.0755208333334 : 3.73768854532225 : JumpEnd); (9.39129711009978 : 3.73768854532225); (9.39129711009978 : 4.375)]" manuallyRouted="true" fixedFrom="Caller" fixedTo="Algorithm">
       <AssociationMoniker Name="/OKBDataContext/Problem/Problem_Experiment" />
       <nodes>
@@ -73,5 +73,5 @@
       </nestedChildShapes>
     </classShape>
-    <associationConnector edgePoints="[(14.25 : 4.0881982421875); (14.25 : 4.375)]" fixedFrom="NotFixed" fixedTo="NotFixed">
+    <associationConnector edgePoints="[(14.25 : 3.89589680989583); (14.25 : 4.375)]" fixedFrom="Algorithm" fixedTo="Algorithm">
       <AssociationMoniker Name="/OKBDataContext/Problem/Problem_ProblemParameter" />
       <nodes>
@@ -86,5 +86,5 @@
       </nestedChildShapes>
     </classShape>
-    <associationConnector edgePoints="[(4.75 : 2.35); (5 : 2.35)]" manuallyRouted="true" fixedFrom="Algorithm" fixedTo="Algorithm">
+    <associationConnector edgePoints="[(4.75 : 2.35); (5 : 2.35)]" manuallyRouted="true" fixedFrom="NotFixed" fixedTo="NotFixed">
       <AssociationMoniker Name="/OKBDataContext/Algorithm/Algorithm_AlgorithmUser" />
       <nodes>
@@ -99,5 +99,5 @@
       </nestedChildShapes>
     </classShape>
-    <associationConnector edgePoints="[(13.25 : 2.35); (13 : 2.35)]" manuallyRouted="true" fixedFrom="Algorithm" fixedTo="Algorithm">
+    <associationConnector edgePoints="[(13.25 : 2.32796054349691); (13.125 : 2.32796054349691); (13.125 : 2.35); (13 : 2.35)]" manuallyRouted="true" fixedFrom="NotFixed" fixedTo="NotFixed">
       <AssociationMoniker Name="/OKBDataContext/Problem/Problem_ProblemUser" />
       <nodes>
@@ -112,5 +112,5 @@
       </nestedChildShapes>
     </classShape>
-    <associationConnector edgePoints="[(8 : 2.85); (4.75 : 2.85)]" fixedFrom="Algorithm" fixedTo="Algorithm">
+    <associationConnector edgePoints="[(8 : 2.85); (4.75 : 2.85)]" fixedFrom="NotFixed" fixedTo="NotFixed">
       <AssociationMoniker Name="/OKBDataContext/Platform/Platform_Algorithm" />
       <nodes>
@@ -126,5 +126,5 @@
       </nodes>
     </associationConnector>
-    <associationConnector edgePoints="[(4.75 : 3.73206647840153); (7.58333333333334 : 3.73206647840152 : JumpStart); (7.75 : 3.73206647840153 : JumpEnd); (8.66439605504989 : 3.73206647840153); (8.66439605504989 : 4.375)]" fixedFrom="Caller" fixedTo="Algorithm">
+    <associationConnector edgePoints="[(4.75 : 3.73206647840153); (7.58333333333334 : 3.73206647840153 : JumpStart); (7.75 : 3.73206647840153 : JumpEnd); (8.66439605504989 : 3.73206647840153); (8.66439605504989 : 4.375)]" fixedFrom="NotFixed" fixedTo="NotFixed">
       <AssociationMoniker Name="/OKBDataContext/Algorithm/Algorithm_Experiment" />
       <nodes>
@@ -361,5 +361,5 @@
       </nodes>
     </associationConnector>
-    <associationConnector edgePoints="[(13.25 : 4.6); (13 : 4.6)]" fixedFrom="NotFixed" fixedTo="NotFixed">
+    <associationConnector edgePoints="[(13.25 : 4.6); (13 : 4.6)]" fixedFrom="Algorithm" fixedTo="Algorithm">
       <AssociationMoniker Name="/OKBDataContext/ProblemParameter/ProblemParameter_ProblemParameterBlobValue" />
       <nodes>
@@ -617,5 +617,5 @@
       </nestedChildShapes>
     </classShape>
-    <associationConnector edgePoints="[(4.75 : 3.35); (5 : 3.35)]" fixedFrom="Algorithm" fixedTo="Algorithm">
+    <associationConnector edgePoints="[(4.75 : 3.35); (5 : 3.35)]" fixedFrom="NotFixed" fixedTo="NotFixed">
       <AssociationMoniker Name="/OKBDataContext/Algorithm/Algorithm_AlgorithmData" />
       <nodes>
@@ -644,5 +644,5 @@
       </nodes>
     </associationConnector>
-    <associationConnector edgePoints="[(13.25 : 3.35); (13 : 3.35)]" fixedFrom="Algorithm" fixedTo="Algorithm">
+    <associationConnector edgePoints="[(13.25 : 3.27707098556576); (13 : 3.27707098556576)]" fixedFrom="Algorithm" fixedTo="Algorithm">
       <AssociationMoniker Name="/OKBDataContext/Problem/Problem_ProblemData" />
       <nodes>
Index: /branches/OKB/HeuristicLab.Services.OKB.DataTransfer/3.3/HeuristicLab.Services.OKB.DataTransfer-3.3.csproj
===================================================================
--- /branches/OKB/HeuristicLab.Services.OKB.DataTransfer/3.3/HeuristicLab.Services.OKB.DataTransfer-3.3.csproj	(revision 4480)
+++ /branches/OKB/HeuristicLab.Services.OKB.DataTransfer/3.3/HeuristicLab.Services.OKB.DataTransfer-3.3.csproj	(revision 4481)
@@ -51,4 +51,7 @@
     <Compile Include="Algorithm.cs" />
     <Compile Include="AlgorithmData.cs" />
+    <Compile Include="ProblemData.cs" />
+    <Compile Include="Problem.cs" />
+    <Compile Include="ProblemClass.cs" />
     <Compile Include="DataType.cs" />
     <Compile Include="User.cs" />
Index: /branches/OKB/HeuristicLab.Services.OKB.DataTransfer/3.3/Problem.cs
===================================================================
--- /branches/OKB/HeuristicLab.Services.OKB.DataTransfer/3.3/Problem.cs	(revision 4481)
+++ /branches/OKB/HeuristicLab.Services.OKB.DataTransfer/3.3/Problem.cs	(revision 4481)
@@ -0,0 +1,32 @@
+﻿#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.Runtime.Serialization;
+
+namespace HeuristicLab.Services.OKB.DataTransfer {
+  [DataContract]
+  public class Problem : NamedOKBItem {
+    [DataMember]
+    public long PlatformId { get; set; }
+    [DataMember]
+    public long ProblemClassId { get; set; }
+  }
+}
Index: /branches/OKB/HeuristicLab.Services.OKB.DataTransfer/3.3/ProblemClass.cs
===================================================================
--- /branches/OKB/HeuristicLab.Services.OKB.DataTransfer/3.3/ProblemClass.cs	(revision 4481)
+++ /branches/OKB/HeuristicLab.Services.OKB.DataTransfer/3.3/ProblemClass.cs	(revision 4481)
@@ -0,0 +1,27 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2010 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System.Runtime.Serialization;
+
+namespace HeuristicLab.Services.OKB.DataTransfer {
+  [DataContract]
+  public class ProblemClass : NamedOKBItem { }
+}
Index: /branches/OKB/HeuristicLab.Services.OKB.DataTransfer/3.3/ProblemData.cs
===================================================================
--- /branches/OKB/HeuristicLab.Services.OKB.DataTransfer/3.3/ProblemData.cs	(revision 4481)
+++ /branches/OKB/HeuristicLab.Services.OKB.DataTransfer/3.3/ProblemData.cs	(revision 4481)
@@ -0,0 +1,34 @@
+﻿#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.Runtime.Serialization;
+
+namespace HeuristicLab.Services.OKB.DataTransfer {
+  [DataContract]
+  public class ProblemData {
+    [DataMember]
+    public long ProblemId { get; set; }
+    [DataMember]
+    public long DataTypeId { get; set; }
+    [DataMember]
+    public byte[] Data { get; set; }
+  }
+}
Index: /branches/OKB/HeuristicLab.Services.OKB/3.3/AdminService.cs
===================================================================
--- /branches/OKB/HeuristicLab.Services.OKB/3.3/AdminService.cs	(revision 4480)
+++ /branches/OKB/HeuristicLab.Services.OKB/3.3/AdminService.cs	(revision 4481)
@@ -43,9 +43,16 @@
       }
     }
-    public void StorePlatform(DataTransfer.Platform dto) {
+    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);
-        if (entity == null) okb.Platforms.InsertOnSubmit(Convert.ToEntity(dto));
-        else Convert.ToEntity(dto, entity);
+        Convert.ToEntity(dto, entity);
         okb.SubmitChanges();
       }
@@ -60,4 +67,39 @@
     #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) {
@@ -71,9 +113,16 @@
       }
     }
-    public void StoreAlgorithmClass(DataTransfer.AlgorithmClass dto) {
+    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);
-        if (entity == null) okb.AlgorithmClasses.InsertOnSubmit(Convert.ToEntity(dto));
-        else Convert.ToEntity(dto, entity);
+        Convert.ToEntity(dto, entity);
         okb.SubmitChanges();
       }
@@ -99,9 +148,16 @@
       }
     }
-    public void StoreAlgorithm(DataTransfer.Algorithm dto) {
+    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);
-        if (entity == null) okb.Algorithms.InsertOnSubmit(Convert.ToEntity(dto));
-        else Convert.ToEntity(dto, entity);
+        Convert.ToEntity(dto, entity);
         okb.SubmitChanges();
       }
@@ -119,5 +175,5 @@
       }
     }
-    public void StoreAlgorithmUsers(long algorithmId, IEnumerable<Guid> users) {
+    public void UpdateAlgorithmUsers(long algorithmId, IEnumerable<Guid> users) {
       using (OKBDataContext okb = new OKBDataContext()) {
         okb.AlgorithmUsers.DeleteAllOnSubmit(okb.AlgorithmUsers.Where(x => x.AlgorithmId == algorithmId));
@@ -134,5 +190,5 @@
       }
     }
-    public void StoreAlgorithmData(DataTransfer.AlgorithmData dto) {
+    public void UpdateAlgorithmData(DataTransfer.AlgorithmData dto) {
       using (OKBDataContext okb = new OKBDataContext()) {
         DataAccess.AlgorithmData entity = okb.AlgorithmDatas.FirstOrDefault(x => x.AlgorithmId == dto.AlgorithmId);
@@ -144,27 +200,97 @@
     #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 void StoreDataType(DataTransfer.DataType dto) {
-      using (OKBDataContext okb = new OKBDataContext()) {
-        DataAccess.DataType entity = okb.DataTypes.FirstOrDefault(x => x.Id == dto.Id);
-        if (entity == null) okb.DataTypes.InsertOnSubmit(Convert.ToEntity(dto));
+    #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();
-      }
-    }
-    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();
       }
Index: /branches/OKB/HeuristicLab.Services.OKB/3.3/Convert.cs
===================================================================
--- /branches/OKB/HeuristicLab.Services.OKB/3.3/Convert.cs	(revision 4480)
+++ /branches/OKB/HeuristicLab.Services.OKB/3.3/Convert.cs	(revision 4481)
@@ -28,11 +28,29 @@
     #region Platform
     public static DT.Platform ToDto(DA.Platform source) {
+      if (source == null) return null;
       return new DT.Platform { Id = source.Id, Name = source.Name, Description = source.Description };
     }
     public static DA.Platform ToEntity(DT.Platform source) {
+      if (source == null) return null;
       return new DA.Platform { Id = source.Id, Name = source.Name, Description = source.Description };
     }
     public static void ToEntity(DT.Platform source, DA.Platform target) {
-      target.Id = source.Id; target.Name = source.Name; target.Description = source.Description;
+      if ((source != null) && (target != null))
+        target.Id = source.Id; target.Name = source.Name; target.Description = source.Description;
+    }
+    #endregion
+
+    #region DataType
+    public static DT.DataType ToDto(DA.DataType source) {
+      if (source == null) return null;
+      return new DT.DataType { Id = source.Id, Name = source.Name, SqlName = source.SqlName, PlatformId = source.PlatformId };
+    }
+    public static DA.DataType ToEntity(DT.DataType source) {
+      if (source == null) return null;
+      return new DA.DataType { Id = source.Id, Name = source.Name, SqlName = source.SqlName, PlatformId = source.PlatformId };
+    }
+    public static void ToEntity(DT.DataType source, DA.DataType target) {
+      if ((source != null) && (target != null))
+        target.Id = source.Id; target.Name = source.Name; target.SqlName = source.SqlName; target.PlatformId = source.PlatformId;
     }
     #endregion
@@ -40,11 +58,14 @@
     #region AlgorithmClass
     public static DT.AlgorithmClass ToDto(DA.AlgorithmClass source) {
+      if (source == null) return null;
       return new DT.AlgorithmClass { Id = source.Id, Name = source.Name, Description = source.Description };
     }
     public static DA.AlgorithmClass ToEntity(DT.AlgorithmClass source) {
+      if (source == null) return null;
       return new DA.AlgorithmClass { Id = source.Id, Name = source.Name, Description = source.Description };
     }
     public static void ToEntity(DT.AlgorithmClass source, DA.AlgorithmClass target) {
-      target.Id = source.Id; target.Name = source.Name; target.Description = source.Description;
+      if ((source != null) && (target != null))
+        target.Id = source.Id; target.Name = source.Name; target.Description = source.Description;
     }
     #endregion
@@ -52,11 +73,14 @@
     #region Algorithm
     public static DT.Algorithm ToDto(DA.Algorithm source) {
+      if (source == null) return null;
       return new DT.Algorithm { Id = source.Id, Name = source.Name, Description = source.Description, PlatformId = source.PlatformId, AlgorithmClassId = source.AlgorithmClassId };
     }
     public static DA.Algorithm ToEntity(DT.Algorithm source) {
+      if (source == null) return null;
       return new DA.Algorithm { Id = source.Id, Name = source.Name, Description = source.Description, PlatformId = source.PlatformId, AlgorithmClassId = source.AlgorithmClassId };
     }
     public static void ToEntity(DT.Algorithm source, DA.Algorithm target) {
-      target.Id = source.Id; target.Name = source.Name; target.Description = source.Description; target.PlatformId = source.PlatformId; target.AlgorithmClassId = source.AlgorithmClassId;
+      if ((source != null) && (target != null))
+        target.Id = source.Id; target.Name = source.Name; target.Description = source.Description; target.PlatformId = source.PlatformId; target.AlgorithmClassId = source.AlgorithmClassId;
     }
     #endregion
@@ -64,23 +88,59 @@
     #region AlgorithmData
     public static DT.AlgorithmData ToDto(DA.AlgorithmData source) {
+      if (source == null) return null;
       return new DT.AlgorithmData { AlgorithmId = source.AlgorithmId, DataTypeId = source.DataTypeId, Data = source.Data.ToArray() };
     }
     public static DA.AlgorithmData ToEntity(DT.AlgorithmData source) {
+      if (source == null) return null;
       return new DA.AlgorithmData { AlgorithmId = source.AlgorithmId, DataTypeId = source.DataTypeId, Data = new Binary(source.Data) };
     }
     public static void ToEntity(DT.AlgorithmData source, DA.AlgorithmData target) {
-      target.AlgorithmId = source.AlgorithmId; target.DataTypeId = source.DataTypeId; target.Data = new Binary(source.Data);
+      if ((source != null) && (target != null))
+        target.AlgorithmId = source.AlgorithmId; target.DataTypeId = source.DataTypeId; target.Data = new Binary(source.Data);
     }
     #endregion
 
-    #region DataType
-    public static DT.DataType ToDto(DA.DataType source) {
-      return new DT.DataType { Id = source.Id, Name = source.Name, SqlName = source.SqlName, PlatformId = source.PlatformId };
+    #region ProblemClass
+    public static DT.ProblemClass ToDto(DA.ProblemClass source) {
+      if (source == null) return null;
+      return new DT.ProblemClass { Id = source.Id, Name = source.Name, Description = source.Description };
     }
-    public static DA.DataType ToEntity(DT.DataType source) {
-      return new DA.DataType { Id = source.Id, Name = source.Name, SqlName = source.SqlName, PlatformId = source.PlatformId };
+    public static DA.ProblemClass ToEntity(DT.ProblemClass source) {
+      if (source == null) return null;
+      return new DA.ProblemClass { Id = source.Id, Name = source.Name, Description = source.Description };
     }
-    public static void ToEntity(DT.DataType source, DA.DataType target) {
-      target.Id = source.Id; target.Name = source.Name; target.SqlName = source.SqlName; target.PlatformId = source.PlatformId;
+    public static void ToEntity(DT.ProblemClass source, DA.ProblemClass target) {
+      if ((source != null) && (target != null))
+        target.Id = source.Id; target.Name = source.Name; target.Description = source.Description;
+    }
+    #endregion
+
+    #region Algorithm
+    public static DT.Problem ToDto(DA.Problem source) {
+      if (source == null) return null;
+      return new DT.Problem { Id = source.Id, Name = source.Name, Description = source.Description, PlatformId = source.PlatformId, ProblemClassId = source.ProblemClassId };
+    }
+    public static DA.Problem ToEntity(DT.Problem source) {
+      if (source == null) return null;
+      return new DA.Problem { Id = source.Id, Name = source.Name, Description = source.Description, PlatformId = source.PlatformId, ProblemClassId = source.ProblemClassId };
+    }
+    public static void ToEntity(DT.Problem source, DA.Problem target) {
+      if ((source != null) && (target != null))
+        target.Id = source.Id; target.Name = source.Name; target.Description = source.Description; target.PlatformId = source.PlatformId; target.ProblemClassId = source.ProblemClassId;
+    }
+    #endregion
+
+    #region ProblemData
+    public static DT.ProblemData ToDto(DA.ProblemData source) {
+      if (source == null) return null;
+      return new DT.ProblemData { ProblemId = source.ProblemId, DataTypeId = source.DataTypeId, Data = source.Data.ToArray() };
+    }
+    public static DA.ProblemData ToEntity(DT.ProblemData source) {
+      if (source == null) return null;
+      return new DA.ProblemData { ProblemId = source.ProblemId, DataTypeId = source.DataTypeId, Data = new Binary(source.Data) };
+    }
+    public static void ToEntity(DT.ProblemData source, DA.ProblemData target) {
+      if ((source != null) && (target != null))
+        target.ProblemId = source.ProblemId; target.DataTypeId = source.DataTypeId; target.Data = new Binary(source.Data);
     }
     #endregion
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 4480)
+++ /branches/OKB/HeuristicLab.Services.OKB/3.3/HeuristicLab.Services.OKB-3.3.csproj	(revision 4481)
@@ -149,5 +149,5 @@
       <FlavorProperties GUID="{3D9AD99F-2412-4246-B90B-4EAA41C64699}">
         <WcfProjectProperties>
-          <AutoStart>True</AutoStart>
+          <AutoStart>False</AutoStart>
         </WcfProjectProperties>
       </FlavorProperties>
Index: /branches/OKB/HeuristicLab.Services.OKB/3.3/Interfaces/IAdminService.cs
===================================================================
--- /branches/OKB/HeuristicLab.Services.OKB/3.3/Interfaces/IAdminService.cs	(revision 4480)
+++ /branches/OKB/HeuristicLab.Services.OKB/3.3/Interfaces/IAdminService.cs	(revision 4481)
@@ -38,7 +38,22 @@
     IEnumerable<Platform> GetPlatforms();
     [OperationContract]
-    void StorePlatform(Platform dto);
+    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
 
@@ -49,5 +64,7 @@
     IEnumerable<AlgorithmClass> GetAlgorithmClasses();
     [OperationContract]
-    void StoreAlgorithmClass(AlgorithmClass dto);
+    long AddAlgorithmClass(AlgorithmClass dto);
+    [OperationContract]
+    void UpdateAlgorithmClass(AlgorithmClass dto);
     [OperationContract]
     void DeleteAlgorithmClass(long id);
@@ -60,5 +77,7 @@
     IEnumerable<Algorithm> GetAlgorithms();
     [OperationContract]
-    void StoreAlgorithm(Algorithm dto);
+    long AddAlgorithm(Algorithm dto);
+    [OperationContract]
+    void UpdateAlgorithm(Algorithm dto);
     [OperationContract]
     void DeleteAlgorithm(long id);
@@ -66,5 +85,5 @@
     IEnumerable<Guid> GetAlgorithmUsers(long algorithmId);
     [OperationContract]
-    void StoreAlgorithmUsers(long algorithmId, IEnumerable<Guid> users);
+    void UpdateAlgorithmUsers(long algorithmId, IEnumerable<Guid> users);
     #endregion
 
@@ -73,16 +92,42 @@
     AlgorithmData GetAlgorithmData(long algorithmId);
     [OperationContract]
-    void StoreAlgorithmData(AlgorithmData dto);
+    void UpdateAlgorithmData(AlgorithmData dto);
     #endregion
 
-    #region DataType Methods
+    #region ProblemClass Methods
     [OperationContract]
-    DataType GetDataType(long id);
+    ProblemClass GetProblemClass(long id);
     [OperationContract]
-    IEnumerable<DataType> GetDataTypes();
+    IEnumerable<ProblemClass> GetProblemClasses();
     [OperationContract]
-    void StoreDataType(DataType dto);
+    long AddProblemClass(ProblemClass dto);
     [OperationContract]
-    void DeleteDataType(long id);
+    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
   }
