Index: branches/OKB/HeuristicLab.Clients.OKB-3.3/OKBClient.cs
===================================================================
--- branches/OKB/HeuristicLab.Clients.OKB-3.3/OKBClient.cs	(revision 4587)
+++ branches/OKB/HeuristicLab.Clients.OKB-3.3/OKBClient.cs	(revision 4591)
@@ -144,4 +144,8 @@
           else if (item is Result)
             item.Id = CallAdminService<long>(s => s.AddResult((Result)item));
+          else if (item is Experiment)
+            item.Id = CallAdminService<long>(s => s.AddExperiment((Experiment)item));
+          else if (item is Run)
+            item.Id = CallAdminService<long>(s => s.AddRun((Run)item));
         } else {
           if (item is Platform)
@@ -163,4 +167,8 @@
           else if (item is Result)
             CallAdminService(s => s.UpdateResult((Result)item));
+          else if (item is Experiment)
+            item.Id = CallAdminService<long>(s => s.AddExperiment((Experiment)item));
+          else if (item is Run)
+            item.Id = CallAdminService<long>(s => s.AddRun((Run)item));
         }
         return true;
@@ -315,5 +323,5 @@
 
     #region Run Methods
-    public bool AddRun(long algorithmId, long problemId, Run run) {
+    public bool AddRun(long algorithmId, long problemId, HeuristicLab.Optimization.Run run) {
       try {
         IAlgorithm algorithm = run.Algorithm;
@@ -321,7 +329,24 @@
 
         ItemCollection<AlgorithmParameter> algorithmParameters = GetAlgorithmParameters(algorithmId);
-        AddAlgorithmParamters(algorithmId, algorithmParameters, algorithm, "");
+        List<AlgorithmParameterValue> algorithmParameterValues = CollectAlgorithmParameterValues(algorithmId, algorithmParameters, algorithm, "");
         ItemCollection<ProblemParameter> problemParameters = GetProblemParameters(problemId);
-        AddProblemParamters(problemId, problemParameters, problem, "");
+        List<ProblemParameterValue> problemParameterValues = CollectProblemParamterValues(problemId, problemParameters, problem, "");
+        ItemCollection<Result> results = GetResults(algorithmId);
+        List<ResultValue> resultValues = CollectResultValues(algorithmId, results, algorithm);
+
+        Experiment exp = new Experiment();
+        exp.AlgorithmId = algorithmId;
+        exp.ProblemId = problemId;
+        exp.AlgorithmParameterValues = algorithmParameterValues.ToArray();
+        exp.ProblemParameterValues = problemParameterValues.ToArray();
+        exp.Store();
+
+        Run r = new Run();
+        r.ExperimentId = exp.Id;
+        r.ClientId = Guid.NewGuid();
+        r.FinishedDate = DateTime.Now;
+        r.RandomSeed = ((IntValue)((IValueParameter)run.Parameters["Seed"]).Value).Value;
+        r.ResultValues = resultValues.ToArray();
+        r.Store();
 
         return true;
@@ -333,21 +358,32 @@
     }
 
-    private void AddAlgorithmParamters(long algorithmId, ItemCollection<AlgorithmParameter> parameters, IParameterizedItem item, string prefix) {
+    private List<AlgorithmParameterValue> CollectAlgorithmParameterValues(long algorithmId, ItemCollection<AlgorithmParameter> parameters, IParameterizedItem item, string prefix) {
+      List<AlgorithmParameterValue> values = new List<AlgorithmParameterValue>();
       foreach (IValueParameter param in item.Parameters.OfType<IValueParameter>()) {
-        if (param.GetsCollected && (param.Value != null) && (parameters.FirstOrDefault(x => x.Name == prefix + param.Name) == null)) {
-          AlgorithmParameter p = new AlgorithmParameter();
-          p.Name = prefix + param.Name;
-          p.Alias = prefix + param.Name;
-          p.Description = param.Description;
-          p.AlgorithmId = algorithmId;
-          p.DataTypeId = ConvertToDataType(param.DataType).Id;
-          p.Store();
-          parameters.Add(p);
-        }
+        if (param.GetsCollected && (param.Value != null)) {
+          AlgorithmParameter p = parameters.FirstOrDefault(x => x.Name == prefix + param.Name);
+          if (p == null) {
+            p = new AlgorithmParameter();
+            p.Name = prefix + param.Name;
+            p.Alias = prefix + param.Name;
+            p.Description = param.Description;
+            p.AlgorithmId = algorithmId;
+            p.DataTypeId = ConvertToDataType(param.DataType).Id;
+            p.Store();
+            parameters.Add(p);
+          }
+          AlgorithmParameterValue value = null;
+          // TODO
+          value.AlgorithmParameterId = p.Id;
+          value.DataTypeId = ConvertToDataType(param.Value.GetType()).Id;
+        }
+
         if (param.Value is IParameterizedItem)
-          AddAlgorithmParamters(algorithmId, parameters, (IParameterizedItem)param.Value, (string.IsNullOrEmpty(prefix) ? param.Name : prefix + param.Name) + ".");
-      }
-    }
-    private void AddProblemParamters(long problemId, ItemCollection<ProblemParameter> parameters, IParameterizedItem item, string prefix) {
+          values.AddRange(CollectAlgorithmParameterValues(algorithmId, parameters, (IParameterizedItem)param.Value, (string.IsNullOrEmpty(prefix) ? param.Name : prefix + param.Name) + "."));
+      }
+      return values;
+    }
+    private List<ProblemParameterValue> CollectProblemParamterValues(long problemId, ItemCollection<ProblemParameter> parameters, IParameterizedItem item, string prefix) {
+      List<ProblemParameterValue> values = new List<ProblemParameterValue>();
       foreach (IValueParameter param in item.Parameters.OfType<IValueParameter>()) {
         if (param.GetsCollected && (param.Value != null) && (parameters.FirstOrDefault(x => x.Name == prefix + param.Name) == null)) {
@@ -362,6 +398,23 @@
         }
         if (param.Value is IParameterizedItem)
-          AddProblemParamters(problemId, parameters, (IParameterizedItem)param.Value, (string.IsNullOrEmpty(prefix) ? param.Name : prefix + param.Name) + ".");
-      }
+          values.AddRange(CollectProblemParamterValues(problemId, parameters, (IParameterizedItem)param.Value, (string.IsNullOrEmpty(prefix) ? param.Name : prefix + param.Name) + "."));
+      }
+      return values;
+    }
+    private List<ResultValue> CollectResultValues(long algorithmId, ItemCollection<Result> results, IAlgorithm algorithm) {
+      List<ResultValue> values = new List<ResultValue>();
+      foreach (IResult result in algorithm.Results) {
+        if ((result.Value != null) && (results.FirstOrDefault(x => x.Name == result.Name) == null)) {
+          Result r = new Result();
+          r.Name = result.Name;
+          r.Alias = result.Name;
+          r.Description = result.Description;
+          r.AlgorithmId = algorithmId;
+          r.DataTypeId = ConvertToDataType(result.DataType).Id;
+          r.Store();
+          results.Add(r);
+        }
+      }
+      return values;
     }
     #endregion
Index: branches/OKB/HeuristicLab.Clients.OKB-3.3/OKBExperiment.cs
===================================================================
--- branches/OKB/HeuristicLab.Clients.OKB-3.3/OKBExperiment.cs	(revision 4587)
+++ branches/OKB/HeuristicLab.Clients.OKB-3.3/OKBExperiment.cs	(revision 4591)
@@ -320,5 +320,5 @@
     private void Runs_ItemsAdded(object sender, Collections.CollectionItemsChangedEventArgs<IRun> e) {
       try {
-        foreach (Run run in e.Items)
+        foreach (HeuristicLab.Optimization.Run run in e.Items)
           OKBClient.Instance.AddRun(AlgorithmId, ProblemId, run);
       }
Index: branches/OKB/HeuristicLab.Clients.OKB-3.3/ServiceClients/OKBServiceClient.cs
===================================================================
--- branches/OKB/HeuristicLab.Clients.OKB-3.3/ServiceClients/OKBServiceClient.cs	(revision 4587)
+++ branches/OKB/HeuristicLab.Clients.OKB-3.3/ServiceClients/OKBServiceClient.cs	(revision 4591)
@@ -15,4 +15,6 @@
   [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.Experiment))]
+  [System.Runtime.Serialization.KnownTypeAttribute(typeof(HeuristicLab.Clients.OKB.Run))]
   [System.Runtime.Serialization.KnownTypeAttribute(typeof(HeuristicLab.Clients.OKB.DataType))]
   [System.Runtime.Serialization.KnownTypeAttribute(typeof(HeuristicLab.Clients.OKB.NamedOKBItem))]
@@ -58,4 +60,166 @@
   [System.Diagnostics.DebuggerStepThroughAttribute()]
   [System.CodeDom.Compiler.GeneratedCodeAttribute("System.Runtime.Serialization", "4.0.0.0")]
+  [System.Runtime.Serialization.DataContractAttribute(Name = "Experiment", Namespace = "http://schemas.datacontract.org/2004/07/HeuristicLab.Services.OKB.DataTransfer")]
+  public partial class Experiment : HeuristicLab.Clients.OKB.OKBItem {
+
+    private long AlgorithmIdField;
+
+    private HeuristicLab.Clients.OKB.AlgorithmParameterValue[] AlgorithmParameterValuesField;
+
+    private long ProblemIdField;
+
+    private HeuristicLab.Clients.OKB.ProblemParameterValue[] ProblemParameterValuesField;
+
+    [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 HeuristicLab.Clients.OKB.AlgorithmParameterValue[] AlgorithmParameterValues {
+      get {
+        return this.AlgorithmParameterValuesField;
+      }
+      set {
+        if ((object.ReferenceEquals(this.AlgorithmParameterValuesField, value) != true)) {
+          this.AlgorithmParameterValuesField = value;
+          this.RaisePropertyChanged("AlgorithmParameterValues");
+        }
+      }
+    }
+
+    [System.Runtime.Serialization.DataMemberAttribute()]
+    public long ProblemId {
+      get {
+        return this.ProblemIdField;
+      }
+      set {
+        if ((this.ProblemIdField.Equals(value) != true)) {
+          this.ProblemIdField = value;
+          this.RaisePropertyChanged("ProblemId");
+        }
+      }
+    }
+
+    [System.Runtime.Serialization.DataMemberAttribute()]
+    public HeuristicLab.Clients.OKB.ProblemParameterValue[] ProblemParameterValues {
+      get {
+        return this.ProblemParameterValuesField;
+      }
+      set {
+        if ((object.ReferenceEquals(this.ProblemParameterValuesField, value) != true)) {
+          this.ProblemParameterValuesField = value;
+          this.RaisePropertyChanged("ProblemParameterValues");
+        }
+      }
+    }
+  }
+
+  [System.Diagnostics.DebuggerStepThroughAttribute()]
+  [System.CodeDom.Compiler.GeneratedCodeAttribute("System.Runtime.Serialization", "4.0.0.0")]
+  [System.Runtime.Serialization.DataContractAttribute(Name = "Run", Namespace = "http://schemas.datacontract.org/2004/07/HeuristicLab.Services.OKB.DataTransfer")]
+  public partial class Run : HeuristicLab.Clients.OKB.OKBItem {
+
+    private System.Guid ClientIdField;
+
+    private long ExperimentIdField;
+
+    private System.Nullable<System.DateTime> FinishedDateField;
+
+    private int RandomSeedField;
+
+    private HeuristicLab.Clients.OKB.ResultValue[] ResultValuesField;
+
+    private System.Guid UserIdField;
+
+    [System.Runtime.Serialization.DataMemberAttribute()]
+    public System.Guid ClientId {
+      get {
+        return this.ClientIdField;
+      }
+      set {
+        if ((this.ClientIdField.Equals(value) != true)) {
+          this.ClientIdField = value;
+          this.RaisePropertyChanged("ClientId");
+        }
+      }
+    }
+
+    [System.Runtime.Serialization.DataMemberAttribute()]
+    public long ExperimentId {
+      get {
+        return this.ExperimentIdField;
+      }
+      set {
+        if ((this.ExperimentIdField.Equals(value) != true)) {
+          this.ExperimentIdField = value;
+          this.RaisePropertyChanged("ExperimentId");
+        }
+      }
+    }
+
+    [System.Runtime.Serialization.DataMemberAttribute()]
+    public System.Nullable<System.DateTime> FinishedDate {
+      get {
+        return this.FinishedDateField;
+      }
+      set {
+        if ((this.FinishedDateField.Equals(value) != true)) {
+          this.FinishedDateField = value;
+          this.RaisePropertyChanged("FinishedDate");
+        }
+      }
+    }
+
+    [System.Runtime.Serialization.DataMemberAttribute()]
+    public int RandomSeed {
+      get {
+        return this.RandomSeedField;
+      }
+      set {
+        if ((this.RandomSeedField.Equals(value) != true)) {
+          this.RandomSeedField = value;
+          this.RaisePropertyChanged("RandomSeed");
+        }
+      }
+    }
+
+    [System.Runtime.Serialization.DataMemberAttribute()]
+    public HeuristicLab.Clients.OKB.ResultValue[] ResultValues {
+      get {
+        return this.ResultValuesField;
+      }
+      set {
+        if ((object.ReferenceEquals(this.ResultValuesField, value) != true)) {
+          this.ResultValuesField = value;
+          this.RaisePropertyChanged("ResultValues");
+        }
+      }
+    }
+
+    [System.Runtime.Serialization.DataMemberAttribute()]
+    public System.Guid UserId {
+      get {
+        return this.UserIdField;
+      }
+      set {
+        if ((this.UserIdField.Equals(value) != true)) {
+          this.UserIdField = value;
+          this.RaisePropertyChanged("UserId");
+        }
+      }
+    }
+  }
+
+  [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 {
@@ -396,14 +560,14 @@
   [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 {
+  [System.Runtime.Serialization.DataContractAttribute(Name = "AlgorithmParameterValue", Namespace = "http://schemas.datacontract.org/2004/07/HeuristicLab.Services.OKB.DataTransfer")]
+  public partial class AlgorithmParameterValue : object, System.Runtime.Serialization.IExtensibleDataObject, System.ComponentModel.INotifyPropertyChanged {
 
     private System.Runtime.Serialization.ExtensionDataObject extensionDataField;
 
-    private byte[] DataField;
+    private long AlgorithmParameterIdField;
 
     private long DataTypeIdField;
 
-    private long ProblemIdField;
+    private long ExperimentIdField;
 
     public System.Runtime.Serialization.ExtensionDataObject ExtensionData {
@@ -417,12 +581,12 @@
 
     [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");
+    public long AlgorithmParameterId {
+      get {
+        return this.AlgorithmParameterIdField;
+      }
+      set {
+        if ((this.AlgorithmParameterIdField.Equals(value) != true)) {
+          this.AlgorithmParameterIdField = value;
+          this.RaisePropertyChanged("AlgorithmParameterId");
         }
       }
@@ -443,12 +607,12 @@
 
     [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 long ExperimentId {
+      get {
+        return this.ExperimentIdField;
+      }
+      set {
+        if ((this.ExperimentIdField.Equals(value) != true)) {
+          this.ExperimentIdField = value;
+          this.RaisePropertyChanged("ExperimentId");
         }
       }
@@ -467,15 +631,15 @@
   [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 {
+  [System.Runtime.Serialization.DataContractAttribute(Name = "ProblemParameterValue", Namespace = "http://schemas.datacontract.org/2004/07/HeuristicLab.Services.OKB.DataTransfer")]
+  public partial class ProblemParameterValue : object, System.Runtime.Serialization.IExtensibleDataObject, System.ComponentModel.INotifyPropertyChanged {
 
     private System.Runtime.Serialization.ExtensionDataObject extensionDataField;
 
-    private long AlgorithmIdField;
-
-    private byte[] DataField;
-
     private long DataTypeIdField;
 
+    private long ExperimentIdField;
+
+    private long ProblemParameterIdField;
+
     public System.Runtime.Serialization.ExtensionDataObject ExtensionData {
       get {
@@ -484,30 +648,4 @@
       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");
-        }
       }
     }
@@ -522,4 +660,30 @@
           this.DataTypeIdField = value;
           this.RaisePropertyChanged("DataTypeId");
+        }
+      }
+    }
+
+    [System.Runtime.Serialization.DataMemberAttribute()]
+    public long ExperimentId {
+      get {
+        return this.ExperimentIdField;
+      }
+      set {
+        if ((this.ExperimentIdField.Equals(value) != true)) {
+          this.ExperimentIdField = value;
+          this.RaisePropertyChanged("ExperimentId");
+        }
+      }
+    }
+
+    [System.Runtime.Serialization.DataMemberAttribute()]
+    public long ProblemParameterId {
+      get {
+        return this.ProblemParameterIdField;
+      }
+      set {
+        if ((this.ProblemParameterIdField.Equals(value) != true)) {
+          this.ProblemParameterIdField = value;
+          this.RaisePropertyChanged("ProblemParameterId");
         }
       }
@@ -536,4 +700,217 @@
   }
 
+  [System.Diagnostics.DebuggerStepThroughAttribute()]
+  [System.CodeDom.Compiler.GeneratedCodeAttribute("System.Runtime.Serialization", "4.0.0.0")]
+  [System.Runtime.Serialization.DataContractAttribute(Name = "ResultValue", Namespace = "http://schemas.datacontract.org/2004/07/HeuristicLab.Services.OKB.DataTransfer")]
+  public partial class ResultValue : object, System.Runtime.Serialization.IExtensibleDataObject, System.ComponentModel.INotifyPropertyChanged {
+
+    private System.Runtime.Serialization.ExtensionDataObject extensionDataField;
+
+    private long DataTypeIdField;
+
+    private long ResultIdField;
+
+    private long RunIdField;
+
+    public System.Runtime.Serialization.ExtensionDataObject ExtensionData {
+      get {
+        return this.extensionDataField;
+      }
+      set {
+        this.extensionDataField = value;
+      }
+    }
+
+    [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 ResultId {
+      get {
+        return this.ResultIdField;
+      }
+      set {
+        if ((this.ResultIdField.Equals(value) != true)) {
+          this.ResultIdField = value;
+          this.RaisePropertyChanged("ResultId");
+        }
+      }
+    }
+
+    [System.Runtime.Serialization.DataMemberAttribute()]
+    public long RunId {
+      get {
+        return this.RunIdField;
+      }
+      set {
+        if ((this.RunIdField.Equals(value) != true)) {
+          this.RunIdField = value;
+          this.RaisePropertyChanged("RunId");
+        }
+      }
+    }
+
+    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 = "ProblemData", Namespace = "http://schemas.datacontract.org/2004/07/HeuristicLab.Services.OKB.DataTransfer")]
+  public partial class ProblemData : object, System.Runtime.Serialization.IExtensibleDataObject, System.ComponentModel.INotifyPropertyChanged {
+
+    private System.Runtime.Serialization.ExtensionDataObject extensionDataField;
+
+    private byte[] DataField;
+
+    private long DataTypeIdField;
+
+    private long ProblemIdField;
+
+    public System.Runtime.Serialization.ExtensionDataObject ExtensionData {
+      get {
+        return this.extensionDataField;
+      }
+      set {
+        this.extensionDataField = value;
+      }
+    }
+
+    [System.Runtime.Serialization.DataMemberAttribute()]
+    public byte[] Data {
+      get {
+        return this.DataField;
+      }
+      set {
+        if ((object.ReferenceEquals(this.DataField, value) != true)) {
+          this.DataField = value;
+          this.RaisePropertyChanged("Data");
+        }
+      }
+    }
+
+    [System.Runtime.Serialization.DataMemberAttribute()]
+    public long DataTypeId {
+      get {
+        return this.DataTypeIdField;
+      }
+      set {
+        if ((this.DataTypeIdField.Equals(value) != true)) {
+          this.DataTypeIdField = value;
+          this.RaisePropertyChanged("DataTypeId");
+        }
+      }
+    }
+
+    [System.Runtime.Serialization.DataMemberAttribute()]
+    public long ProblemId {
+      get {
+        return this.ProblemIdField;
+      }
+      set {
+        if ((this.ProblemIdField.Equals(value) != true)) {
+          this.ProblemIdField = value;
+          this.RaisePropertyChanged("ProblemId");
+        }
+      }
+    }
+
+    public event System.ComponentModel.PropertyChangedEventHandler PropertyChanged;
+
+    protected void RaisePropertyChanged(string propertyName) {
+      System.ComponentModel.PropertyChangedEventHandler propertyChanged = this.PropertyChanged;
+      if ((propertyChanged != null)) {
+        propertyChanged(this, new System.ComponentModel.PropertyChangedEventArgs(propertyName));
+      }
+    }
+  }
+
+  [System.Diagnostics.DebuggerStepThroughAttribute()]
+  [System.CodeDom.Compiler.GeneratedCodeAttribute("System.Runtime.Serialization", "4.0.0.0")]
+  [System.Runtime.Serialization.DataContractAttribute(Name = "AlgorithmData", Namespace = "http://schemas.datacontract.org/2004/07/HeuristicLab.Services.OKB.DataTransfer")]
+  public partial class AlgorithmData : object, System.Runtime.Serialization.IExtensibleDataObject, System.ComponentModel.INotifyPropertyChanged {
+
+    private System.Runtime.Serialization.ExtensionDataObject extensionDataField;
+
+    private long AlgorithmIdField;
+
+    private byte[] DataField;
+
+    private long DataTypeIdField;
+
+    public System.Runtime.Serialization.ExtensionDataObject ExtensionData {
+      get {
+        return this.extensionDataField;
+      }
+      set {
+        this.extensionDataField = value;
+      }
+    }
+
+    [System.Runtime.Serialization.DataMemberAttribute()]
+    public long AlgorithmId {
+      get {
+        return this.AlgorithmIdField;
+      }
+      set {
+        if ((this.AlgorithmIdField.Equals(value) != true)) {
+          this.AlgorithmIdField = value;
+          this.RaisePropertyChanged("AlgorithmId");
+        }
+      }
+    }
+
+    [System.Runtime.Serialization.DataMemberAttribute()]
+    public byte[] Data {
+      get {
+        return this.DataField;
+      }
+      set {
+        if ((object.ReferenceEquals(this.DataField, value) != true)) {
+          this.DataField = value;
+          this.RaisePropertyChanged("Data");
+        }
+      }
+    }
+
+    [System.Runtime.Serialization.DataMemberAttribute()]
+    public long DataTypeId {
+      get {
+        return this.DataTypeIdField;
+      }
+      set {
+        if ((this.DataTypeIdField.Equals(value) != true)) {
+          this.DataTypeIdField = value;
+          this.RaisePropertyChanged("DataTypeId");
+        }
+      }
+    }
+
+    public event System.ComponentModel.PropertyChangedEventHandler PropertyChanged;
+
+    protected void RaisePropertyChanged(string propertyName) {
+      System.ComponentModel.PropertyChangedEventHandler propertyChanged = this.PropertyChanged;
+      if ((propertyChanged != null)) {
+        propertyChanged(this, new System.ComponentModel.PropertyChangedEventArgs(propertyName));
+      }
+    }
+  }
+
   [System.CodeDom.Compiler.GeneratedCodeAttribute("System.ServiceModel", "4.0.0.0")]
   [System.ServiceModel.ServiceContractAttribute(ConfigurationName = "HeuristicLab.Clients.OKB.IOKBService")]
@@ -549,4 +926,28 @@
     void DeleteResult(long id);
 
+    [System.ServiceModel.OperationContractAttribute(Action = "http://tempuri.org/IOKBService/GetExperiment", ReplyAction = "http://tempuri.org/IOKBService/GetExperimentResponse")]
+    HeuristicLab.Clients.OKB.Experiment GetExperiment(long id);
+
+    [System.ServiceModel.OperationContractAttribute(Action = "http://tempuri.org/IOKBService/GetExperiments", ReplyAction = "http://tempuri.org/IOKBService/GetExperimentsResponse")]
+    HeuristicLab.Clients.OKB.Experiment[] GetExperiments(long algorithmId, long problemId);
+
+    [System.ServiceModel.OperationContractAttribute(Action = "http://tempuri.org/IOKBService/AddExperiment", ReplyAction = "http://tempuri.org/IOKBService/AddExperimentResponse")]
+    long AddExperiment(HeuristicLab.Clients.OKB.Experiment dto);
+
+    [System.ServiceModel.OperationContractAttribute(Action = "http://tempuri.org/IOKBService/DeleteExperiment", ReplyAction = "http://tempuri.org/IOKBService/DeleteExperimentResponse")]
+    void DeleteExperiment(long id);
+
+    [System.ServiceModel.OperationContractAttribute(Action = "http://tempuri.org/IOKBService/GetRun", ReplyAction = "http://tempuri.org/IOKBService/GetRunResponse")]
+    HeuristicLab.Clients.OKB.Run GetRun(long id);
+
+    [System.ServiceModel.OperationContractAttribute(Action = "http://tempuri.org/IOKBService/GetRuns", ReplyAction = "http://tempuri.org/IOKBService/GetRunsResponse")]
+    HeuristicLab.Clients.OKB.Run[] GetRuns(long experimentId);
+
+    [System.ServiceModel.OperationContractAttribute(Action = "http://tempuri.org/IOKBService/AddRun", ReplyAction = "http://tempuri.org/IOKBService/AddRunResponse")]
+    long AddRun(HeuristicLab.Clients.OKB.Run dto);
+
+    [System.ServiceModel.OperationContractAttribute(Action = "http://tempuri.org/IOKBService/DeleteRun", ReplyAction = "http://tempuri.org/IOKBService/DeleteRunResponse")]
+    void DeleteRun(long id);
+
     [System.ServiceModel.OperationContractAttribute(Action = "http://tempuri.org/IOKBService/GetAlgorithmParameters", ReplyAction = "http://tempuri.org/IOKBService/GetAlgorithmParametersResponse")]
     HeuristicLab.Clients.OKB.AlgorithmParameter[] GetAlgorithmParameters(long algorithmId);
@@ -739,4 +1140,36 @@
     }
 
+    public HeuristicLab.Clients.OKB.Experiment GetExperiment(long id) {
+      return base.Channel.GetExperiment(id);
+    }
+
+    public HeuristicLab.Clients.OKB.Experiment[] GetExperiments(long algorithmId, long problemId) {
+      return base.Channel.GetExperiments(algorithmId, problemId);
+    }
+
+    public long AddExperiment(HeuristicLab.Clients.OKB.Experiment dto) {
+      return base.Channel.AddExperiment(dto);
+    }
+
+    public void DeleteExperiment(long id) {
+      base.Channel.DeleteExperiment(id);
+    }
+
+    public HeuristicLab.Clients.OKB.Run GetRun(long id) {
+      return base.Channel.GetRun(id);
+    }
+
+    public HeuristicLab.Clients.OKB.Run[] GetRuns(long experimentId) {
+      return base.Channel.GetRuns(experimentId);
+    }
+
+    public long AddRun(HeuristicLab.Clients.OKB.Run dto) {
+      return base.Channel.AddRun(dto);
+    }
+
+    public void DeleteRun(long id) {
+      base.Channel.DeleteRun(id);
+    }
+
     public HeuristicLab.Clients.OKB.AlgorithmParameter[] GetAlgorithmParameters(long algorithmId) {
       return base.Channel.GetAlgorithmParameters(algorithmId);
Index: branches/OKB/HeuristicLab.Clients.OKB-3.3/app.config
===================================================================
--- branches/OKB/HeuristicLab.Clients.OKB-3.3/app.config	(revision 4587)
+++ branches/OKB/HeuristicLab.Clients.OKB-3.3/app.config	(revision 4591)
@@ -7,8 +7,8 @@
                     openTimeout="00:01:00" receiveTimeout="00:10:00" sendTimeout="00:01:00"
                     bypassProxyOnLocal="false" transactionFlow="false" hostNameComparisonMode="StrongWildcard"
-                    maxBufferPoolSize="524288" maxReceivedMessageSize="200000000"
+                    maxBufferPoolSize="524288" maxReceivedMessageSize="65536"
                     messageEncoding="Text" textEncoding="utf-8" useDefaultWebProxy="true"
                     allowCookies="false">
-                    <readerQuotas maxDepth="32" maxStringContentLength="8192" maxArrayLength="200000000"
+                    <readerQuotas maxDepth="32" maxStringContentLength="8192" maxArrayLength="16384"
                         maxBytesPerRead="4096" maxNameTableCharCount="16384" />
                     <reliableSession ordered="true" inactivityTimeout="00:10:00"
Index: branches/OKB/HeuristicLab.Services.OKB.DataAccess/3.3/OKB.dbml
===================================================================
--- branches/OKB/HeuristicLab.Services.OKB.DataAccess/3.3/OKB.dbml	(revision 4587)
+++ branches/OKB/HeuristicLab.Services.OKB.DataAccess/3.3/OKB.dbml	(revision 4591)
@@ -140,5 +140,4 @@
       <Association Name="Run_ResultStringValue" Member="ResultStringValues" ThisKey="Id" OtherKey="RunId" Type="ResultStringValue" />
       <Association Name="Experiment_Run" Member="Experiment" ThisKey="ExperimentId" OtherKey="Id" Type="Experiment" IsForeignKey="true" />
-      <Association Name="Client_Run" Member="Client" ThisKey="ClientId" OtherKey="Id" Type="Client" IsForeignKey="true" />
     </Type>
   </Table>
@@ -158,11 +157,4 @@
       <Association Name="Algorithm_Result" Member="Algorithm" ThisKey="AlgorithmId" OtherKey="Id" Type="Algorithm" IsForeignKey="true" />
       <Association Name="DataType_Result" Member="DataType" ThisKey="DataTypeId" OtherKey="Id" Type="DataType" IsForeignKey="true" />
-    </Type>
-  </Table>
-  <Table Name="dbo.Client" Member="Clients">
-    <Type Name="Client">
-      <Column Name="Id" Type="System.Guid" DbType="UniqueIdentifier NOT NULL" IsPrimaryKey="true" CanBeNull="false" />
-      <Column Name="Name" Type="System.String" DbType="NVarChar(200) NOT NULL" CanBeNull="false" />
-      <Association Name="Client_Run" Member="Runs" ThisKey="Id" OtherKey="ClientId" Type="Run" />
     </Type>
   </Table>
Index: branches/OKB/HeuristicLab.Services.OKB.DataAccess/3.3/OKB.dbml.layout
===================================================================
--- branches/OKB/HeuristicLab.Services.OKB.DataAccess/3.3/OKB.dbml.layout	(revision 4587)
+++ branches/OKB/HeuristicLab.Services.OKB.DataAccess/3.3/OKB.dbml.layout	(revision 4591)
@@ -34,5 +34,5 @@
       </nestedChildShapes>
     </classShape>
-    <associationConnector edgePoints="[(14.25 : 1.8862939453125); (14.25 : 2.125)]" fixedFrom="Algorithm" fixedTo="Algorithm">
+    <associationConnector edgePoints="[(14.25 : 1.8862939453125); (14.25 : 2.125)]" fixedFrom="NotFixed" fixedTo="NotFixed">
       <AssociationMoniker Name="/OKBDataContext/ProblemClass/ProblemClass_Problem" />
       <nodes>
@@ -47,5 +47,5 @@
       </nestedChildShapes>
     </classShape>
-    <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">
+    <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="NotFixed" fixedTo="NotFixed">
       <AssociationMoniker Name="/OKBDataContext/Problem/Problem_Experiment" />
       <nodes>
@@ -73,5 +73,5 @@
       </nestedChildShapes>
     </classShape>
-    <associationConnector edgePoints="[(14.25 : 3.89589680989583); (14.25 : 4.375)]" fixedFrom="Algorithm" fixedTo="Algorithm">
+    <associationConnector edgePoints="[(14.25 : 3.89589680989583); (14.25 : 4.375)]" fixedFrom="NotFixed" fixedTo="NotFixed">
       <AssociationMoniker Name="/OKBDataContext/Problem/Problem_ProblemParameter" />
       <nodes>
@@ -119,5 +119,5 @@
       </nodes>
     </associationConnector>
-    <associationConnector edgePoints="[(10 : 2.85); (13.25 : 2.85)]" fixedFrom="Algorithm" fixedTo="Algorithm">
+    <associationConnector edgePoints="[(10 : 2.85); (13.25 : 2.85)]" fixedFrom="NotFixed" fixedTo="NotFixed">
       <AssociationMoniker Name="/OKBDataContext/Platform/Platform_Problem" />
       <nodes>
@@ -159,17 +159,4 @@
       </nodes>
     </associationConnector>
-    <classShape Id="8b301cad-7a91-46f5-9c49-75b17bac7a67" absoluteBounds="11.75, 10.25, 2, 1.1939925130208344">
-      <DataClassMoniker Name="/OKBDataContext/Client" />
-      <nestedChildShapes>
-        <elementListCompartment Id="aacc92af-97a1-46b2-8614-a54b03736b54" absoluteBounds="11.765, 10.71, 1.9700000000000002, 0.63399251302083326" name="DataPropertiesCompartment" titleTextColor="Black" itemTextColor="Black" />
-      </nestedChildShapes>
-    </classShape>
-    <associationConnector edgePoints="[(11.75 : 10.8469962565104); (10 : 10.8469962565104)]" fixedFrom="NotFixed" fixedTo="NotFixed">
-      <AssociationMoniker Name="/OKBDataContext/Client/Client_Run" />
-      <nodes>
-        <classShapeMoniker Id="8b301cad-7a91-46f5-9c49-75b17bac7a67" />
-        <classShapeMoniker Id="83a5f628-defe-486f-bc6a-4ab430293368" />
-      </nodes>
-    </associationConnector>
     <classShape Id="06cdd7a7-aece-4230-94df-523959acef3f" isExpanded="false" absoluteBounds="5, 4.375, 2, 0.45">
       <DataClassMoniker Name="/OKBDataContext/AlgorithmParameterBlobValue" />
@@ -361,5 +348,5 @@
       </nodes>
     </associationConnector>
-    <associationConnector edgePoints="[(13.25 : 4.6); (13 : 4.6)]" fixedFrom="Algorithm" fixedTo="Algorithm">
+    <associationConnector edgePoints="[(13.25 : 4.6); (13 : 4.6)]" fixedFrom="NotFixed" fixedTo="NotFixed">
       <AssociationMoniker Name="/OKBDataContext/ProblemParameter/ProblemParameter_ProblemParameterBlobValue" />
       <nodes>
@@ -644,5 +631,5 @@
       </nodes>
     </associationConnector>
-    <associationConnector edgePoints="[(13.25 : 3.27707098556576); (13 : 3.27707098556576)]" fixedFrom="Algorithm" fixedTo="Algorithm">
+    <associationConnector edgePoints="[(13.25 : 3.27707098556576); (13 : 3.27707098556576)]" fixedFrom="NotFixed" fixedTo="NotFixed">
       <AssociationMoniker Name="/OKBDataContext/Problem/Problem_ProblemData" />
       <nodes>
Index: branches/OKB/HeuristicLab.Services.OKB.DataTransfer/3.3/AlgorithmParameterBlobValue.cs
===================================================================
--- branches/OKB/HeuristicLab.Services.OKB.DataTransfer/3.3/AlgorithmParameterBlobValue.cs	(revision 4591)
+++ branches/OKB/HeuristicLab.Services.OKB.DataTransfer/3.3/AlgorithmParameterBlobValue.cs	(revision 4591)
@@ -0,0 +1,30 @@
+﻿#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 AlgorithmParameterBlobValue : AlgorithmParameterValue {
+    [DataMember]
+    public byte[] Value { get; set; }
+  }
+}
Index: branches/OKB/HeuristicLab.Services.OKB.DataTransfer/3.3/AlgorithmParameterBoolValue.cs
===================================================================
--- branches/OKB/HeuristicLab.Services.OKB.DataTransfer/3.3/AlgorithmParameterBoolValue.cs	(revision 4591)
+++ branches/OKB/HeuristicLab.Services.OKB.DataTransfer/3.3/AlgorithmParameterBoolValue.cs	(revision 4591)
@@ -0,0 +1,30 @@
+﻿#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 AlgorithmParameterBoolValue : AlgorithmParameterValue {
+    [DataMember]
+    public bool Value { get; set; }
+  }
+}
Index: branches/OKB/HeuristicLab.Services.OKB.DataTransfer/3.3/AlgorithmParameterFloatValue.cs
===================================================================
--- branches/OKB/HeuristicLab.Services.OKB.DataTransfer/3.3/AlgorithmParameterFloatValue.cs	(revision 4591)
+++ branches/OKB/HeuristicLab.Services.OKB.DataTransfer/3.3/AlgorithmParameterFloatValue.cs	(revision 4591)
@@ -0,0 +1,30 @@
+﻿#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 AlgorithmParameterFloatValue : AlgorithmParameterValue {
+    [DataMember]
+    public double Value { get; set; }
+  }
+}
Index: branches/OKB/HeuristicLab.Services.OKB.DataTransfer/3.3/AlgorithmParameterIntValue.cs
===================================================================
--- branches/OKB/HeuristicLab.Services.OKB.DataTransfer/3.3/AlgorithmParameterIntValue.cs	(revision 4591)
+++ branches/OKB/HeuristicLab.Services.OKB.DataTransfer/3.3/AlgorithmParameterIntValue.cs	(revision 4591)
@@ -0,0 +1,30 @@
+﻿#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 AlgorithmParameterIntValue : AlgorithmParameterValue {
+    [DataMember]
+    public long Value { get; set; }
+  }
+}
Index: branches/OKB/HeuristicLab.Services.OKB.DataTransfer/3.3/AlgorithmParameterStringValue.cs
===================================================================
--- branches/OKB/HeuristicLab.Services.OKB.DataTransfer/3.3/AlgorithmParameterStringValue.cs	(revision 4591)
+++ branches/OKB/HeuristicLab.Services.OKB.DataTransfer/3.3/AlgorithmParameterStringValue.cs	(revision 4591)
@@ -0,0 +1,30 @@
+﻿#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 AlgorithmParameterStringValue : AlgorithmParameterValue {
+    [DataMember]
+    public string Value { get; set; }
+  }
+}
Index: branches/OKB/HeuristicLab.Services.OKB.DataTransfer/3.3/AlgorithmParameterValue.cs
===================================================================
--- branches/OKB/HeuristicLab.Services.OKB.DataTransfer/3.3/AlgorithmParameterValue.cs	(revision 4591)
+++ branches/OKB/HeuristicLab.Services.OKB.DataTransfer/3.3/AlgorithmParameterValue.cs	(revision 4591)
@@ -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 abstract class AlgorithmParameterValue {
+    [DataMember]
+    public long AlgorithmParameterId { get; set; }
+    [DataMember]
+    public long ExperimentId { get; set; }
+    [DataMember]
+    public long DataTypeId { get; set; }
+  }
+}
Index: branches/OKB/HeuristicLab.Services.OKB.DataTransfer/3.3/Experiment.cs
===================================================================
--- branches/OKB/HeuristicLab.Services.OKB.DataTransfer/3.3/Experiment.cs	(revision 4587)
+++ branches/OKB/HeuristicLab.Services.OKB.DataTransfer/3.3/Experiment.cs	(revision 4591)
@@ -20,4 +20,5 @@
 #endregion
 
+using System.Collections.Generic;
 using System.Runtime.Serialization;
 
@@ -29,4 +30,8 @@
     [DataMember]
     public long ProblemId { get; set; }
+    [DataMember]
+    public IEnumerable<AlgorithmParameterValue> AlgorithmParameterValues { get; set; }
+    [DataMember]
+    public IEnumerable<ProblemParameterValue> ProblemParameterValues { get; set; }
   }
 }
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 4587)
+++ branches/OKB/HeuristicLab.Services.OKB.DataTransfer/3.3/HeuristicLab.Services.OKB.DataTransfer-3.3.csproj	(revision 4591)
@@ -52,4 +52,22 @@
     <Compile Include="AlgorithmData.cs" />
     <Compile Include="AlgorithmParameter.cs" />
+    <Compile Include="AlgorithmParameterValue.cs" />
+    <Compile Include="AlgorithmParameterBlobValue.cs" />
+    <Compile Include="AlgorithmParameterBoolValue.cs" />
+    <Compile Include="AlgorithmParameterFloatValue.cs" />
+    <Compile Include="AlgorithmParameterIntValue.cs" />
+    <Compile Include="AlgorithmParameterStringValue.cs" />
+    <Compile Include="ResultFloatValue.cs" />
+    <Compile Include="ResultBoolValue.cs" />
+    <Compile Include="ResultIntValue.cs" />
+    <Compile Include="ResultStringValue.cs" />
+    <Compile Include="ResultBlobValue.cs" />
+    <Compile Include="ProblemParameterBoolValue.cs" />
+    <Compile Include="ProblemParameterFloatValue.cs" />
+    <Compile Include="ProblemParameterIntValue.cs" />
+    <Compile Include="ProblemParameterStringValue.cs" />
+    <Compile Include="ProblemParameterBlobValue.cs" />
+    <Compile Include="ResultValue.cs" />
+    <Compile Include="ProblemParameterValue.cs" />
     <Compile Include="Run.cs" />
     <Compile Include="Experiment.cs" />
Index: branches/OKB/HeuristicLab.Services.OKB.DataTransfer/3.3/ProblemParameterBlobValue.cs
===================================================================
--- branches/OKB/HeuristicLab.Services.OKB.DataTransfer/3.3/ProblemParameterBlobValue.cs	(revision 4591)
+++ branches/OKB/HeuristicLab.Services.OKB.DataTransfer/3.3/ProblemParameterBlobValue.cs	(revision 4591)
@@ -0,0 +1,30 @@
+﻿#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 ProblemParameterBlobValue : ProblemParameterValue {
+    [DataMember]
+    public byte[] Value { get; set; }
+  }
+}
Index: branches/OKB/HeuristicLab.Services.OKB.DataTransfer/3.3/ProblemParameterBoolValue.cs
===================================================================
--- branches/OKB/HeuristicLab.Services.OKB.DataTransfer/3.3/ProblemParameterBoolValue.cs	(revision 4591)
+++ branches/OKB/HeuristicLab.Services.OKB.DataTransfer/3.3/ProblemParameterBoolValue.cs	(revision 4591)
@@ -0,0 +1,30 @@
+﻿#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 ProblemParameterBoolValue : ProblemParameterValue {
+    [DataMember]
+    public bool Value { get; set; }
+  }
+}
Index: branches/OKB/HeuristicLab.Services.OKB.DataTransfer/3.3/ProblemParameterFloatValue.cs
===================================================================
--- branches/OKB/HeuristicLab.Services.OKB.DataTransfer/3.3/ProblemParameterFloatValue.cs	(revision 4591)
+++ branches/OKB/HeuristicLab.Services.OKB.DataTransfer/3.3/ProblemParameterFloatValue.cs	(revision 4591)
@@ -0,0 +1,30 @@
+﻿#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 ProblemParameterFloatValue : ProblemParameterValue {
+    [DataMember]
+    public double Value { get; set; }
+  }
+}
Index: branches/OKB/HeuristicLab.Services.OKB.DataTransfer/3.3/ProblemParameterIntValue.cs
===================================================================
--- branches/OKB/HeuristicLab.Services.OKB.DataTransfer/3.3/ProblemParameterIntValue.cs	(revision 4591)
+++ branches/OKB/HeuristicLab.Services.OKB.DataTransfer/3.3/ProblemParameterIntValue.cs	(revision 4591)
@@ -0,0 +1,30 @@
+﻿#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 ProblemParameterIntValue : ProblemParameterValue {
+    [DataMember]
+    public long Value { get; set; }
+  }
+}
Index: branches/OKB/HeuristicLab.Services.OKB.DataTransfer/3.3/ProblemParameterStringValue.cs
===================================================================
--- branches/OKB/HeuristicLab.Services.OKB.DataTransfer/3.3/ProblemParameterStringValue.cs	(revision 4591)
+++ branches/OKB/HeuristicLab.Services.OKB.DataTransfer/3.3/ProblemParameterStringValue.cs	(revision 4591)
@@ -0,0 +1,30 @@
+﻿#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 ProblemParameterStringValue : ProblemParameterValue {
+    [DataMember]
+    public string Value { get; set; }
+  }
+}
Index: branches/OKB/HeuristicLab.Services.OKB.DataTransfer/3.3/ProblemParameterValue.cs
===================================================================
--- branches/OKB/HeuristicLab.Services.OKB.DataTransfer/3.3/ProblemParameterValue.cs	(revision 4591)
+++ branches/OKB/HeuristicLab.Services.OKB.DataTransfer/3.3/ProblemParameterValue.cs	(revision 4591)
@@ -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 abstract class ProblemParameterValue {
+    [DataMember]
+    public long ProblemParameterId { get; set; }
+    [DataMember]
+    public long ExperimentId { get; set; }
+    [DataMember]
+    public long DataTypeId { get; set; }
+  }
+}
Index: branches/OKB/HeuristicLab.Services.OKB.DataTransfer/3.3/ResultBlobValue.cs
===================================================================
--- branches/OKB/HeuristicLab.Services.OKB.DataTransfer/3.3/ResultBlobValue.cs	(revision 4591)
+++ branches/OKB/HeuristicLab.Services.OKB.DataTransfer/3.3/ResultBlobValue.cs	(revision 4591)
@@ -0,0 +1,30 @@
+﻿#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 ResultBlobValue : ResultValue {
+    [DataMember]
+    public byte[] Value { get; set; }
+  }
+}
Index: branches/OKB/HeuristicLab.Services.OKB.DataTransfer/3.3/ResultBoolValue.cs
===================================================================
--- branches/OKB/HeuristicLab.Services.OKB.DataTransfer/3.3/ResultBoolValue.cs	(revision 4591)
+++ branches/OKB/HeuristicLab.Services.OKB.DataTransfer/3.3/ResultBoolValue.cs	(revision 4591)
@@ -0,0 +1,30 @@
+﻿#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 ResultBoolValue : ResultValue {
+    [DataMember]
+    public bool Value { get; set; }
+  }
+}
Index: branches/OKB/HeuristicLab.Services.OKB.DataTransfer/3.3/ResultFloatValue.cs
===================================================================
--- branches/OKB/HeuristicLab.Services.OKB.DataTransfer/3.3/ResultFloatValue.cs	(revision 4591)
+++ branches/OKB/HeuristicLab.Services.OKB.DataTransfer/3.3/ResultFloatValue.cs	(revision 4591)
@@ -0,0 +1,30 @@
+﻿#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 ResultFloatValue : ResultValue {
+    [DataMember]
+    public double Value { get; set; }
+  }
+}
Index: branches/OKB/HeuristicLab.Services.OKB.DataTransfer/3.3/ResultIntValue.cs
===================================================================
--- branches/OKB/HeuristicLab.Services.OKB.DataTransfer/3.3/ResultIntValue.cs	(revision 4591)
+++ branches/OKB/HeuristicLab.Services.OKB.DataTransfer/3.3/ResultIntValue.cs	(revision 4591)
@@ -0,0 +1,30 @@
+﻿#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 ResultIntValue : ResultValue {
+    [DataMember]
+    public long Value { get; set; }
+  }
+}
Index: branches/OKB/HeuristicLab.Services.OKB.DataTransfer/3.3/ResultStringValue.cs
===================================================================
--- branches/OKB/HeuristicLab.Services.OKB.DataTransfer/3.3/ResultStringValue.cs	(revision 4591)
+++ branches/OKB/HeuristicLab.Services.OKB.DataTransfer/3.3/ResultStringValue.cs	(revision 4591)
@@ -0,0 +1,30 @@
+﻿#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 ResultStringValue : ResultValue {
+    [DataMember]
+    public string Value { get; set; }
+  }
+}
Index: branches/OKB/HeuristicLab.Services.OKB.DataTransfer/3.3/ResultValue.cs
===================================================================
--- branches/OKB/HeuristicLab.Services.OKB.DataTransfer/3.3/ResultValue.cs	(revision 4591)
+++ branches/OKB/HeuristicLab.Services.OKB.DataTransfer/3.3/ResultValue.cs	(revision 4591)
@@ -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 abstract class ResultValue {
+    [DataMember]
+    public long ResultId { get; set; }
+    [DataMember]
+    public long RunId { get; set; }
+    [DataMember]
+    public long DataTypeId { get; set; }
+  }
+}
Index: branches/OKB/HeuristicLab.Services.OKB.DataTransfer/3.3/Run.cs
===================================================================
--- branches/OKB/HeuristicLab.Services.OKB.DataTransfer/3.3/Run.cs	(revision 4587)
+++ branches/OKB/HeuristicLab.Services.OKB.DataTransfer/3.3/Run.cs	(revision 4591)
@@ -21,4 +21,5 @@
 
 using System;
+using System.Collections.Generic;
 using System.Runtime.Serialization;
 
@@ -36,4 +37,6 @@
     [DataMember]
     public Guid ClientId { get; set; }
+    [DataMember]
+    public IEnumerable<ResultValue> ResultValues { get; set; }
   }
 }
Index: branches/OKB/HeuristicLab.Services.OKB/3.3/Convert.cs
===================================================================
--- branches/OKB/HeuristicLab.Services.OKB/3.3/Convert.cs	(revision 4587)
+++ branches/OKB/HeuristicLab.Services.OKB/3.3/Convert.cs	(revision 4591)
@@ -20,5 +20,7 @@
 #endregion
 
+using System.Collections.Generic;
 using System.Data.Linq;
+using System.Linq;
 using DA = HeuristicLab.Services.OKB.DataAccess;
 using DT = HeuristicLab.Services.OKB.DataTransfer;
@@ -36,6 +38,7 @@
     }
     public static void ToEntity(DT.Platform source, DA.Platform target) {
-      if ((source != null) && (target != null))
+      if ((source != null) && (target != null)) {
         target.Id = source.Id; target.Name = source.Name; target.Description = source.Description;
+      }
     }
     #endregion
@@ -51,6 +54,7 @@
     }
     public static void ToEntity(DT.DataType source, DA.DataType target) {
-      if ((source != null) && (target != null))
+      if ((source != null) && (target != null)) {
         target.Id = source.Id; target.Name = source.Name; target.SqlName = source.SqlName; target.PlatformId = source.PlatformId;
+      }
     }
     #endregion
@@ -66,6 +70,7 @@
     }
     public static void ToEntity(DT.AlgorithmClass source, DA.AlgorithmClass target) {
-      if ((source != null) && (target != null))
+      if ((source != null) && (target != null)) {
         target.Id = source.Id; target.Name = source.Name; target.Description = source.Description;
+      }
     }
     #endregion
@@ -81,6 +86,7 @@
     }
     public static void ToEntity(DT.Algorithm source, DA.Algorithm target) {
-      if ((source != null) && (target != null))
+      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
@@ -96,6 +102,7 @@
     }
     public static void ToEntity(DT.AlgorithmData source, DA.AlgorithmData target) {
-      if ((source != null) && (target != null))
+      if ((source != null) && (target != null)) {
         target.AlgorithmId = source.AlgorithmId; target.DataTypeId = source.DataTypeId; target.Data = new Binary(source.Data);
+      }
     }
     #endregion
@@ -111,6 +118,87 @@
     }
     public static void ToEntity(DT.AlgorithmParameter source, DA.AlgorithmParameter target) {
-      if ((source != null) && (target != null))
+      if ((source != null) && (target != null)) {
         target.Id = source.Id; target.Name = source.Name; target.Description = source.Description; target.Alias = source.Alias; target.AlgorithmId = source.AlgorithmId; target.DataTypeId = source.DataTypeId;
+      }
+    }
+    #endregion
+
+    #region AlgorithmParameterBlobValue
+    public static DT.AlgorithmParameterBlobValue ToDto(DA.AlgorithmParameterBlobValue source) {
+      if (source == null) return null;
+      return new DT.AlgorithmParameterBlobValue { AlgorithmParameterId = source.AlgorithmParameterId, ExperimentId = source.ExperimentId, DataTypeId = source.DataTypeId, Value = source.Value.ToArray() };
+    }
+    public static DA.AlgorithmParameterBlobValue ToEntity(DT.AlgorithmParameterBlobValue source) {
+      if (source == null) return null;
+      return new DA.AlgorithmParameterBlobValue { AlgorithmParameterId = source.AlgorithmParameterId, ExperimentId = source.ExperimentId, DataTypeId = source.DataTypeId, Value = new Binary(source.Value) };
+    }
+    public static void ToEntity(DT.AlgorithmParameterBlobValue source, DA.AlgorithmParameterBlobValue target) {
+      if ((source != null) && (target != null)) {
+        target.AlgorithmParameterId = source.AlgorithmParameterId; target.ExperimentId = source.ExperimentId; target.DataTypeId = source.DataTypeId; target.Value = new Binary(source.Value);
+      }
+    }
+    #endregion
+
+    #region AlgorithmParameterBoolValue
+    public static DT.AlgorithmParameterBoolValue ToDto(DA.AlgorithmParameterBoolValue source) {
+      if (source == null) return null;
+      return new DT.AlgorithmParameterBoolValue { AlgorithmParameterId = source.AlgorithmParameterId, ExperimentId = source.ExperimentId, DataTypeId = source.DataTypeId, Value = source.Value };
+    }
+    public static DA.AlgorithmParameterBoolValue ToEntity(DT.AlgorithmParameterBoolValue source) {
+      if (source == null) return null;
+      return new DA.AlgorithmParameterBoolValue { AlgorithmParameterId = source.AlgorithmParameterId, ExperimentId = source.ExperimentId, DataTypeId = source.DataTypeId, Value = source.Value };
+    }
+    public static void ToEntity(DT.AlgorithmParameterBoolValue source, DA.AlgorithmParameterBoolValue target) {
+      if ((source != null) && (target != null)) {
+        target.AlgorithmParameterId = source.AlgorithmParameterId; target.ExperimentId = source.ExperimentId; target.DataTypeId = source.DataTypeId; target.Value = source.Value;
+      }
+    }
+    #endregion
+
+    #region AlgorithmParameterFloatValue
+    public static DT.AlgorithmParameterFloatValue ToDto(DA.AlgorithmParameterFloatValue source) {
+      if (source == null) return null;
+      return new DT.AlgorithmParameterFloatValue { AlgorithmParameterId = source.AlgorithmParameterId, ExperimentId = source.ExperimentId, DataTypeId = source.DataTypeId, Value = source.Value };
+    }
+    public static DA.AlgorithmParameterFloatValue ToEntity(DT.AlgorithmParameterFloatValue source) {
+      if (source == null) return null;
+      return new DA.AlgorithmParameterFloatValue { AlgorithmParameterId = source.AlgorithmParameterId, ExperimentId = source.ExperimentId, DataTypeId = source.DataTypeId, Value = source.Value };
+    }
+    public static void ToEntity(DT.AlgorithmParameterFloatValue source, DA.AlgorithmParameterFloatValue target) {
+      if ((source != null) && (target != null)) {
+        target.AlgorithmParameterId = source.AlgorithmParameterId; target.ExperimentId = source.ExperimentId; target.DataTypeId = source.DataTypeId; target.Value = source.Value;
+      }
+    }
+    #endregion
+
+    #region AlgorithmParameterIntValue
+    public static DT.AlgorithmParameterIntValue ToDto(DA.AlgorithmParameterIntValue source) {
+      if (source == null) return null;
+      return new DT.AlgorithmParameterIntValue { AlgorithmParameterId = source.AlgorithmParameterId, ExperimentId = source.ExperimentId, DataTypeId = source.DataTypeId, Value = source.Value };
+    }
+    public static DA.AlgorithmParameterIntValue ToEntity(DT.AlgorithmParameterIntValue source) {
+      if (source == null) return null;
+      return new DA.AlgorithmParameterIntValue { AlgorithmParameterId = source.AlgorithmParameterId, ExperimentId = source.ExperimentId, DataTypeId = source.DataTypeId, Value = source.Value };
+    }
+    public static void ToEntity(DT.AlgorithmParameterIntValue source, DA.AlgorithmParameterIntValue target) {
+      if ((source != null) && (target != null)) {
+        target.AlgorithmParameterId = source.AlgorithmParameterId; target.ExperimentId = source.ExperimentId; target.DataTypeId = source.DataTypeId; target.Value = source.Value;
+      }
+    }
+    #endregion
+
+    #region AlgorithmParameterStringValue
+    public static DT.AlgorithmParameterStringValue ToDto(DA.AlgorithmParameterStringValue source) {
+      if (source == null) return null;
+      return new DT.AlgorithmParameterStringValue { AlgorithmParameterId = source.AlgorithmParameterId, ExperimentId = source.ExperimentId, DataTypeId = source.DataTypeId, Value = source.Value };
+    }
+    public static DA.AlgorithmParameterStringValue ToEntity(DT.AlgorithmParameterStringValue source) {
+      if (source == null) return null;
+      return new DA.AlgorithmParameterStringValue { AlgorithmParameterId = source.AlgorithmParameterId, ExperimentId = source.ExperimentId, DataTypeId = source.DataTypeId, Value = source.Value };
+    }
+    public static void ToEntity(DT.AlgorithmParameterStringValue source, DA.AlgorithmParameterStringValue target) {
+      if ((source != null) && (target != null)) {
+        target.AlgorithmParameterId = source.AlgorithmParameterId; target.ExperimentId = source.ExperimentId; target.DataTypeId = source.DataTypeId; target.Value = source.Value;
+      }
     }
     #endregion
@@ -126,6 +214,7 @@
     }
     public static void ToEntity(DT.ProblemClass source, DA.ProblemClass target) {
-      if ((source != null) && (target != null))
+      if ((source != null) && (target != null)) {
         target.Id = source.Id; target.Name = source.Name; target.Description = source.Description;
+      }
     }
     #endregion
@@ -141,6 +230,7 @@
     }
     public static void ToEntity(DT.Problem source, DA.Problem target) {
-      if ((source != null) && (target != null))
+      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
@@ -156,6 +246,7 @@
     }
     public static void ToEntity(DT.ProblemData source, DA.ProblemData target) {
-      if ((source != null) && (target != null))
+      if ((source != null) && (target != null)) {
         target.ProblemId = source.ProblemId; target.DataTypeId = source.DataTypeId; target.Data = new Binary(source.Data);
+      }
     }
     #endregion
@@ -171,6 +262,87 @@
     }
     public static void ToEntity(DT.ProblemParameter source, DA.ProblemParameter target) {
-      if ((source != null) && (target != null))
+      if ((source != null) && (target != null)) {
         target.Id = source.Id; target.Name = source.Name; target.Description = source.Description; target.Alias = source.Alias; target.ProblemId = source.ProblemId; target.DataTypeId = source.DataTypeId;
+      }
+    }
+    #endregion
+
+    #region ProblemParameterBlobValue
+    public static DT.ProblemParameterBlobValue ToDto(DA.ProblemParameterBlobValue source) {
+      if (source == null) return null;
+      return new DT.ProblemParameterBlobValue { ProblemParameterId = source.ProblemParameterId, ExperimentId = source.ExperimentId, DataTypeId = source.DataTypeId, Value = source.Value.ToArray() };
+    }
+    public static DA.ProblemParameterBlobValue ToEntity(DT.ProblemParameterBlobValue source) {
+      if (source == null) return null;
+      return new DA.ProblemParameterBlobValue { ProblemParameterId = source.ProblemParameterId, ExperimentId = source.ExperimentId, DataTypeId = source.DataTypeId, Value = new Binary(source.Value) };
+    }
+    public static void ToEntity(DT.ProblemParameterBlobValue source, DA.ProblemParameterBlobValue target) {
+      if ((source != null) && (target != null)) {
+        target.ProblemParameterId = source.ProblemParameterId; target.ExperimentId = source.ExperimentId; target.DataTypeId = source.DataTypeId; target.Value = new Binary(source.Value);
+      }
+    }
+    #endregion
+
+    #region ProblemParameterBoolValue
+    public static DT.ProblemParameterBoolValue ToDto(DA.ProblemParameterBoolValue source) {
+      if (source == null) return null;
+      return new DT.ProblemParameterBoolValue { ProblemParameterId = source.ProblemParameterId, ExperimentId = source.ExperimentId, DataTypeId = source.DataTypeId, Value = source.Value };
+    }
+    public static DA.ProblemParameterBoolValue ToEntity(DT.ProblemParameterBoolValue source) {
+      if (source == null) return null;
+      return new DA.ProblemParameterBoolValue { ProblemParameterId = source.ProblemParameterId, ExperimentId = source.ExperimentId, DataTypeId = source.DataTypeId, Value = source.Value };
+    }
+    public static void ToEntity(DT.ProblemParameterBoolValue source, DA.ProblemParameterBoolValue target) {
+      if ((source != null) && (target != null)) {
+        target.ProblemParameterId = source.ProblemParameterId; target.ExperimentId = source.ExperimentId; target.DataTypeId = source.DataTypeId; target.Value = source.Value;
+      }
+    }
+    #endregion
+
+    #region ProblemParameterFloatValue
+    public static DT.ProblemParameterFloatValue ToDto(DA.ProblemParameterFloatValue source) {
+      if (source == null) return null;
+      return new DT.ProblemParameterFloatValue { ProblemParameterId = source.ProblemParameterId, ExperimentId = source.ExperimentId, DataTypeId = source.DataTypeId, Value = source.Value };
+    }
+    public static DA.ProblemParameterFloatValue ToEntity(DT.ProblemParameterFloatValue source) {
+      if (source == null) return null;
+      return new DA.ProblemParameterFloatValue { ProblemParameterId = source.ProblemParameterId, ExperimentId = source.ExperimentId, DataTypeId = source.DataTypeId, Value = source.Value };
+    }
+    public static void ToEntity(DT.ProblemParameterFloatValue source, DA.ProblemParameterFloatValue target) {
+      if ((source != null) && (target != null)) {
+        target.ProblemParameterId = source.ProblemParameterId; target.ExperimentId = source.ExperimentId; target.DataTypeId = source.DataTypeId; target.Value = source.Value;
+      }
+    }
+    #endregion
+
+    #region ProblemParameterIntValue
+    public static DT.ProblemParameterIntValue ToDto(DA.ProblemParameterIntValue source) {
+      if (source == null) return null;
+      return new DT.ProblemParameterIntValue { ProblemParameterId = source.ProblemParameterId, ExperimentId = source.ExperimentId, DataTypeId = source.DataTypeId, Value = source.Value };
+    }
+    public static DA.ProblemParameterIntValue ToEntity(DT.ProblemParameterIntValue source) {
+      if (source == null) return null;
+      return new DA.ProblemParameterIntValue { ProblemParameterId = source.ProblemParameterId, ExperimentId = source.ExperimentId, DataTypeId = source.DataTypeId, Value = source.Value };
+    }
+    public static void ToEntity(DT.ProblemParameterIntValue source, DA.ProblemParameterIntValue target) {
+      if ((source != null) && (target != null)) {
+        target.ProblemParameterId = source.ProblemParameterId; target.ExperimentId = source.ExperimentId; target.DataTypeId = source.DataTypeId; target.Value = source.Value;
+      }
+    }
+    #endregion
+
+    #region ProblemParameterStringValue
+    public static DT.ProblemParameterStringValue ToDto(DA.ProblemParameterStringValue source) {
+      if (source == null) return null;
+      return new DT.ProblemParameterStringValue { ProblemParameterId = source.ProblemParameterId, ExperimentId = source.ExperimentId, DataTypeId = source.DataTypeId, Value = source.Value };
+    }
+    public static DA.ProblemParameterStringValue ToEntity(DT.ProblemParameterStringValue source) {
+      if (source == null) return null;
+      return new DA.ProblemParameterStringValue { ProblemParameterId = source.ProblemParameterId, ExperimentId = source.ExperimentId, DataTypeId = source.DataTypeId, Value = source.Value };
+    }
+    public static void ToEntity(DT.ProblemParameterStringValue source, DA.ProblemParameterStringValue target) {
+      if ((source != null) && (target != null)) {
+        target.ProblemParameterId = source.ProblemParameterId; target.ExperimentId = source.ExperimentId; target.DataTypeId = source.DataTypeId; target.Value = source.Value;
+      }
     }
     #endregion
@@ -186,6 +358,87 @@
     }
     public static void ToEntity(DT.Result source, DA.Result target) {
-      if ((source != null) && (target != null))
+      if ((source != null) && (target != null)) {
         target.Id = source.Id; target.Name = source.Name; target.Description = source.Description; target.Alias = source.Alias; target.AlgorithmId = source.AlgorithmId; target.DataTypeId = source.DataTypeId;
+      }
+    }
+    #endregion
+
+    #region ResultBlobValue
+    public static DT.ResultBlobValue ToDto(DA.ResultBlobValue source) {
+      if (source == null) return null;
+      return new DT.ResultBlobValue { ResultId = source.ResultId, RunId = source.RunId, DataTypeId = source.DataTypeId, Value = source.Value.ToArray() };
+    }
+    public static DA.ResultBlobValue ToEntity(DT.ResultBlobValue source) {
+      if (source == null) return null;
+      return new DA.ResultBlobValue { ResultId = source.ResultId, RunId = source.RunId, DataTypeId = source.DataTypeId, Value = new Binary(source.Value) };
+    }
+    public static void ToEntity(DT.ResultBlobValue source, DA.ResultBlobValue target) {
+      if ((source != null) && (target != null)) {
+        target.ResultId = source.ResultId; target.RunId = source.RunId; target.DataTypeId = source.DataTypeId; target.Value = new Binary(source.Value);
+      }
+    }
+    #endregion
+
+    #region ResultBoolValue
+    public static DT.ResultBoolValue ToDto(DA.ResultBoolValue source) {
+      if (source == null) return null;
+      return new DT.ResultBoolValue { ResultId = source.ResultId, RunId = source.RunId, DataTypeId = source.DataTypeId, Value = source.Value };
+    }
+    public static DA.ResultBoolValue ToEntity(DT.ResultBoolValue source) {
+      if (source == null) return null;
+      return new DA.ResultBoolValue { ResultId = source.ResultId, RunId = source.RunId, DataTypeId = source.DataTypeId, Value = source.Value };
+    }
+    public static void ToEntity(DT.ResultBoolValue source, DA.ResultBoolValue target) {
+      if ((source != null) && (target != null)) {
+        target.ResultId = source.ResultId; target.RunId = source.RunId; target.DataTypeId = source.DataTypeId; target.Value = source.Value;
+      }
+    }
+    #endregion
+
+    #region ResultFloatValue
+    public static DT.ResultFloatValue ToDto(DA.ResultFloatValue source) {
+      if (source == null) return null;
+      return new DT.ResultFloatValue { ResultId = source.ResultId, RunId = source.RunId, DataTypeId = source.DataTypeId, Value = source.Value };
+    }
+    public static DA.ResultFloatValue ToEntity(DT.ResultFloatValue source) {
+      if (source == null) return null;
+      return new DA.ResultFloatValue { ResultId = source.ResultId, RunId = source.RunId, DataTypeId = source.DataTypeId, Value = source.Value };
+    }
+    public static void ToEntity(DT.ResultFloatValue source, DA.ResultFloatValue target) {
+      if ((source != null) && (target != null)) {
+        target.ResultId = source.ResultId; target.RunId = source.RunId; target.DataTypeId = source.DataTypeId; target.Value = source.Value;
+      }
+    }
+    #endregion
+
+    #region ResultIntValue
+    public static DT.ResultIntValue ToDto(DA.ResultIntValue source) {
+      if (source == null) return null;
+      return new DT.ResultIntValue { ResultId = source.ResultId, RunId = source.RunId, DataTypeId = source.DataTypeId, Value = source.Value };
+    }
+    public static DA.ResultIntValue ToEntity(DT.ResultIntValue source) {
+      if (source == null) return null;
+      return new DA.ResultIntValue { ResultId = source.ResultId, RunId = source.RunId, DataTypeId = source.DataTypeId, Value = source.Value };
+    }
+    public static void ToEntity(DT.ResultIntValue source, DA.ResultIntValue target) {
+      if ((source != null) && (target != null)) {
+        target.ResultId = source.ResultId; target.RunId = source.RunId; target.DataTypeId = source.DataTypeId; target.Value = source.Value;
+      }
+    }
+    #endregion
+
+    #region ResultStringValue
+    public static DT.ResultStringValue ToDto(DA.ResultStringValue source) {
+      if (source == null) return null;
+      return new DT.ResultStringValue { ResultId = source.ResultId, RunId = source.RunId, DataTypeId = source.DataTypeId, Value = source.Value };
+    }
+    public static DA.ResultStringValue ToEntity(DT.ResultStringValue source) {
+      if (source == null) return null;
+      return new DA.ResultStringValue { ResultId = source.ResultId, RunId = source.RunId, DataTypeId = source.DataTypeId, Value = source.Value };
+    }
+    public static void ToEntity(DT.ResultStringValue source, DA.ResultStringValue target) {
+      if ((source != null) && (target != null)) {
+        target.ResultId = source.ResultId; target.RunId = source.RunId; target.DataTypeId = source.DataTypeId; target.Value = source.Value;
+      }
     }
     #endregion
@@ -194,13 +447,66 @@
     public static DT.Experiment ToDto(DA.Experiment source) {
       if (source == null) return null;
-      return new DT.Experiment { Id = source.Id, AlgorithmId = source.AlgorithmId, ProblemId = source.ProblemId };
+      DT.Experiment target = new DT.Experiment { Id = source.Id, AlgorithmId = source.AlgorithmId, ProblemId = source.ProblemId };
+
+      List<DT.AlgorithmParameterValue> algorithmParameterValues = new List<DT.AlgorithmParameterValue>();
+      foreach (DA.AlgorithmParameterBlobValue value in source.AlgorithmParameterBlobValues)
+        algorithmParameterValues.Add(Convert.ToDto(value));
+      foreach (DA.AlgorithmParameterBoolValue value in source.AlgorithmParameterBoolValues)
+        algorithmParameterValues.Add(Convert.ToDto(value));
+      foreach (DA.AlgorithmParameterFloatValue value in source.AlgorithmParameterFloatValues)
+        algorithmParameterValues.Add(Convert.ToDto(value));
+      foreach (DA.AlgorithmParameterIntValue value in source.AlgorithmParameterIntValues)
+        algorithmParameterValues.Add(Convert.ToDto(value));
+      foreach (DA.AlgorithmParameterStringValue value in source.AlgorithmParameterStringValues)
+        algorithmParameterValues.Add(Convert.ToDto(value));
+      target.AlgorithmParameterValues = algorithmParameterValues.ToArray();
+
+      List<DT.ProblemParameterValue> problemParameterValues = new List<DT.ProblemParameterValue>();
+      foreach (DA.ProblemParameterBlobValue value in source.ProblemParameterBlobValues)
+        problemParameterValues.Add(Convert.ToDto(value));
+      foreach (DA.ProblemParameterBoolValue value in source.ProblemParameterBoolValues)
+        problemParameterValues.Add(Convert.ToDto(value));
+      foreach (DA.ProblemParameterFloatValue value in source.ProblemParameterFloatValues)
+        problemParameterValues.Add(Convert.ToDto(value));
+      foreach (DA.ProblemParameterIntValue value in source.ProblemParameterIntValues)
+        problemParameterValues.Add(Convert.ToDto(value));
+      foreach (DA.ProblemParameterStringValue value in source.ProblemParameterStringValues)
+        problemParameterValues.Add(Convert.ToDto(value));
+      target.ProblemParameterValues = problemParameterValues.ToArray();
+
+      return target;
     }
     public static DA.Experiment ToEntity(DT.Experiment source) {
       if (source == null) return null;
-      return new DA.Experiment { Id = source.Id, AlgorithmId = source.AlgorithmId, ProblemId = source.ProblemId };
+      DA.Experiment target = new DA.Experiment();
+      Convert.ToEntity(source, target);
+      return target;
     }
     public static void ToEntity(DT.Experiment source, DA.Experiment target) {
-      if ((source != null) && (target != null))
+      if ((source != null) && (target != null)) {
         target.Id = source.Id; target.AlgorithmId = source.AlgorithmId; target.ProblemId = source.ProblemId;
+
+        foreach (DT.AlgorithmParameterBlobValue value in source.AlgorithmParameterValues.OfType<DT.AlgorithmParameterBlobValue>())
+          target.AlgorithmParameterBlobValues.Add(Convert.ToEntity(value));
+        foreach (DT.AlgorithmParameterBoolValue value in source.AlgorithmParameterValues.OfType<DT.AlgorithmParameterBoolValue>())
+          target.AlgorithmParameterBoolValues.Add(Convert.ToEntity(value));
+        foreach (DT.AlgorithmParameterFloatValue value in source.AlgorithmParameterValues.OfType<DT.AlgorithmParameterFloatValue>())
+          target.AlgorithmParameterFloatValues.Add(Convert.ToEntity(value));
+        foreach (DT.AlgorithmParameterIntValue value in source.AlgorithmParameterValues.OfType<DT.AlgorithmParameterIntValue>())
+          target.AlgorithmParameterIntValues.Add(Convert.ToEntity(value));
+        foreach (DT.AlgorithmParameterStringValue value in source.AlgorithmParameterValues.OfType<DT.AlgorithmParameterStringValue>())
+          target.AlgorithmParameterStringValues.Add(Convert.ToEntity(value));
+
+        foreach (DT.ProblemParameterBlobValue value in source.ProblemParameterValues.OfType<DT.ProblemParameterBlobValue>())
+          target.ProblemParameterBlobValues.Add(Convert.ToEntity(value));
+        foreach (DT.ProblemParameterBoolValue value in source.ProblemParameterValues.OfType<DT.ProblemParameterBoolValue>())
+          target.ProblemParameterBoolValues.Add(Convert.ToEntity(value));
+        foreach (DT.ProblemParameterFloatValue value in source.ProblemParameterValues.OfType<DT.ProblemParameterFloatValue>())
+          target.ProblemParameterFloatValues.Add(Convert.ToEntity(value));
+        foreach (DT.ProblemParameterIntValue value in source.ProblemParameterValues.OfType<DT.ProblemParameterIntValue>())
+          target.ProblemParameterIntValues.Add(Convert.ToEntity(value));
+        foreach (DT.ProblemParameterStringValue value in source.ProblemParameterValues.OfType<DT.ProblemParameterStringValue>())
+          target.ProblemParameterStringValues.Add(Convert.ToEntity(value));
+      }
     }
     #endregion
@@ -209,14 +515,42 @@
     public static DT.Run ToDto(DA.Run source) {
       if (source == null) return null;
-      return new DT.Run { Id = source.Id, RandomSeed = source.RandomSeed, FinishedDate = source.FinishedDate, ExperimentId = source.ExperimentId, UserId = source.UserId, ClientId = source.ClientId };
+      DT.Run target = new DT.Run { Id = source.Id, RandomSeed = source.RandomSeed, FinishedDate = source.FinishedDate, ExperimentId = source.ExperimentId, UserId = source.UserId, ClientId = source.ClientId };
+
+      List<DT.ResultValue> resultValues = new List<DT.ResultValue>();
+      foreach (DA.ResultBlobValue value in source.ResultBlobValues)
+        resultValues.Add(Convert.ToDto(value));
+      foreach (DA.ResultBoolValue value in source.ResultBoolValues)
+        resultValues.Add(Convert.ToDto(value));
+      foreach (DA.ResultFloatValue value in source.ResultFloatValues)
+        resultValues.Add(Convert.ToDto(value));
+      foreach (DA.ResultIntValue value in source.ResultIntValues)
+        resultValues.Add(Convert.ToDto(value));
+      foreach (DA.ResultStringValue value in source.ResultStringValues)
+        resultValues.Add(Convert.ToDto(value));
+      target.ResultValues = resultValues.ToArray();
+
+      return target;
     }
     public static DA.Run ToEntity(DT.Run source) {
       if (source == null) return null;
-      return new DA.Run { Id = source.Id, RandomSeed = source.RandomSeed, FinishedDate = source.FinishedDate, ExperimentId = source.ExperimentId, UserId = source.UserId, ClientId = source.ClientId };
+      DA.Run target = new DA.Run();
+      Convert.ToEntity(source, target);
+      return target;
     }
     public static void ToEntity(DT.Run source, DA.Run target) {
-      if ((source != null) && (target != null))
+      if ((source != null) && (target != null)) {
         target.Id = source.Id; target.RandomSeed = source.RandomSeed; target.FinishedDate = source.FinishedDate; target.ExperimentId = source.ExperimentId; target.UserId = source.UserId; target.ClientId = source.ClientId;
 
+        foreach (DT.ResultBlobValue value in source.ResultValues.OfType<DT.ResultBlobValue>())
+          target.ResultBlobValues.Add(Convert.ToEntity(value));
+        foreach (DT.ResultBoolValue value in source.ResultValues.OfType<DT.ResultBoolValue>())
+          target.ResultBoolValues.Add(Convert.ToEntity(value));
+        foreach (DT.ResultFloatValue value in source.ResultValues.OfType<DT.ResultFloatValue>())
+          target.ResultFloatValues.Add(Convert.ToEntity(value));
+        foreach (DT.ResultIntValue value in source.ResultValues.OfType<DT.ResultIntValue>())
+          target.ResultIntValues.Add(Convert.ToEntity(value));
+        foreach (DT.ResultStringValue value in source.ResultValues.OfType<DT.ResultStringValue>())
+          target.ResultStringValues.Add(Convert.ToEntity(value));
+      }
     }
     #endregion
Index: branches/OKB/HeuristicLab.Services.OKB/3.3/ExperimentEqualityComparer.cs
===================================================================
--- branches/OKB/HeuristicLab.Services.OKB/3.3/ExperimentEqualityComparer.cs	(revision 4591)
+++ branches/OKB/HeuristicLab.Services.OKB/3.3/ExperimentEqualityComparer.cs	(revision 4591)
@@ -0,0 +1,132 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2010 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System.Collections.Generic;
+using System.Linq;
+using HeuristicLab.Services.OKB.DataAccess;
+
+namespace HeuristicLab.Services.OKB {
+  public class ExperimentEqualityComparer : IEqualityComparer<Experiment> {
+    public bool Equals(Experiment x, Experiment y) {
+      bool equal = true;
+      equal = equal && x.AlgorithmId == y.AlgorithmId;
+      equal = equal && x.ProblemId == y.ProblemId;
+      equal = equal && x.AlgorithmParameterBlobValues.Count == y.AlgorithmParameterBlobValues.Count;
+      equal = equal && x.AlgorithmParameterBoolValues.Count == y.AlgorithmParameterBoolValues.Count;
+      equal = equal && x.AlgorithmParameterFloatValues.Count == y.AlgorithmParameterFloatValues.Count;
+      equal = equal && x.AlgorithmParameterIntValues.Count == y.AlgorithmParameterIntValues.Count;
+      equal = equal && x.AlgorithmParameterStringValues.Count == y.AlgorithmParameterStringValues.Count;
+      equal = equal && x.ProblemParameterBlobValues.Count == y.ProblemParameterBlobValues.Count;
+      equal = equal && x.ProblemParameterBoolValues.Count == y.ProblemParameterBoolValues.Count;
+      equal = equal && x.ProblemParameterFloatValues.Count == y.ProblemParameterFloatValues.Count;
+      equal = equal && x.ProblemParameterIntValues.Count == y.ProblemParameterIntValues.Count;
+      equal = equal && x.ProblemParameterStringValues.Count == y.ProblemParameterStringValues.Count;
+
+      if (equal) {
+        var values = x.AlgorithmParameterBlobValues.Zip(y.AlgorithmParameterBlobValues, (a, b) => new { X = a, Y = b });
+        foreach (var value in values) {
+          equal = equal && value.X.AlgorithmParameterId == value.Y.AlgorithmParameterId;
+          equal = equal && value.X.DataTypeId == value.Y.DataTypeId;
+          equal = equal && value.X.Value.Equals(value.Y.Value);
+        }
+      }
+      if (equal) {
+        var values = x.AlgorithmParameterBoolValues.Zip(y.AlgorithmParameterBoolValues, (a, b) => new { X = a, Y = b });
+        foreach (var value in values) {
+          equal = equal && value.X.AlgorithmParameterId == value.Y.AlgorithmParameterId;
+          equal = equal && value.X.DataTypeId == value.Y.DataTypeId;
+          equal = equal && value.X.Value == value.Y.Value;
+        }
+      }
+      if (equal) {
+        var values = x.AlgorithmParameterFloatValues.Zip(y.AlgorithmParameterFloatValues, (a, b) => new { X = a, Y = b });
+        foreach (var value in values) {
+          equal = equal && value.X.AlgorithmParameterId == value.Y.AlgorithmParameterId;
+          equal = equal && value.X.DataTypeId == value.Y.DataTypeId;
+          equal = equal && value.X.Value == value.Y.Value;
+        }
+      }
+      if (equal) {
+        var values = x.AlgorithmParameterIntValues.Zip(y.AlgorithmParameterIntValues, (a, b) => new { X = a, Y = b });
+        foreach (var value in values) {
+          equal = equal && value.X.AlgorithmParameterId == value.Y.AlgorithmParameterId;
+          equal = equal && value.X.DataTypeId == value.Y.DataTypeId;
+          equal = equal && value.X.Value == value.Y.Value;
+        }
+      }
+      if (equal) {
+        var values = x.AlgorithmParameterStringValues.Zip(y.AlgorithmParameterStringValues, (a, b) => new { X = a, Y = b });
+        foreach (var value in values) {
+          equal = equal && value.X.AlgorithmParameterId == value.Y.AlgorithmParameterId;
+          equal = equal && value.X.DataTypeId == value.Y.DataTypeId;
+          equal = equal && value.X.Value == value.Y.Value;
+        }
+      }
+
+      if (equal) {
+        var values = x.ProblemParameterBlobValues.Zip(y.ProblemParameterBlobValues, (a, b) => new { X = a, Y = b });
+        foreach (var value in values) {
+          equal = equal && value.X.ProblemParameterId == value.Y.ProblemParameterId;
+          equal = equal && value.X.DataTypeId == value.Y.DataTypeId;
+          equal = equal && value.X.Value.Equals(value.Y.Value);
+        }
+      }
+      if (equal) {
+        var values = x.ProblemParameterBoolValues.Zip(y.ProblemParameterBoolValues, (a, b) => new { X = a, Y = b });
+        foreach (var value in values) {
+          equal = equal && value.X.ProblemParameterId == value.Y.ProblemParameterId;
+          equal = equal && value.X.DataTypeId == value.Y.DataTypeId;
+          equal = equal && value.X.Value == value.Y.Value;
+        }
+      }
+      if (equal) {
+        var values = x.ProblemParameterFloatValues.Zip(y.ProblemParameterFloatValues, (a, b) => new { X = a, Y = b });
+        foreach (var value in values) {
+          equal = equal && value.X.ProblemParameterId == value.Y.ProblemParameterId;
+          equal = equal && value.X.DataTypeId == value.Y.DataTypeId;
+          equal = equal && value.X.Value == value.Y.Value;
+        }
+      }
+      if (equal) {
+        var values = x.ProblemParameterIntValues.Zip(y.ProblemParameterIntValues, (a, b) => new { X = a, Y = b });
+        foreach (var value in values) {
+          equal = equal && value.X.ProblemParameterId == value.Y.ProblemParameterId;
+          equal = equal && value.X.DataTypeId == value.Y.DataTypeId;
+          equal = equal && value.X.Value == value.Y.Value;
+        }
+      }
+      if (equal) {
+        var values = x.ProblemParameterStringValues.Zip(y.ProblemParameterStringValues, (a, b) => new { X = a, Y = b });
+        foreach (var value in values) {
+          equal = equal && value.X.ProblemParameterId == value.Y.ProblemParameterId;
+          equal = equal && value.X.DataTypeId == value.Y.DataTypeId;
+          equal = equal && value.X.Value == value.Y.Value;
+        }
+      }
+
+      return equal;
+    }
+
+    public int GetHashCode(Experiment obj) {
+      return obj.GetHashCode();
+    }
+  }
+}
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 4587)
+++ branches/OKB/HeuristicLab.Services.OKB/3.3/HeuristicLab.Services.OKB-3.3.csproj	(revision 4591)
@@ -122,4 +122,5 @@
     <Compile Include="Convert.cs" />
     <Compile Include="AuthenticationService.cs" />
+    <Compile Include="ExperimentEqualityComparer.cs" />
     <Compile Include="Interfaces\IAuthenticationService.cs" />
     <Compile Include="Interfaces\IOKBService.cs" />
Index: branches/OKB/HeuristicLab.Services.OKB/3.3/Interfaces/IOKBService.cs
===================================================================
--- branches/OKB/HeuristicLab.Services.OKB/3.3/Interfaces/IOKBService.cs	(revision 4587)
+++ branches/OKB/HeuristicLab.Services.OKB/3.3/Interfaces/IOKBService.cs	(revision 4591)
@@ -170,4 +170,26 @@
     void DeleteResult(long id);
     #endregion
+
+    #region Experiment Methods
+    [OperationContract]
+    Experiment GetExperiment(long id);
+    [OperationContract]
+    IEnumerable<Experiment> GetExperiments(long algorithmId, long problemId);
+    [OperationContract]
+    long AddExperiment(Experiment dto);
+    [OperationContract]
+    void DeleteExperiment(long id);
+    #endregion
+
+    #region Run Methods
+    [OperationContract]
+    Run GetRun(long id);
+    [OperationContract]
+    IEnumerable<Run> GetRuns(long experimentId);
+    [OperationContract]
+    long AddRun(Run dto);
+    [OperationContract]
+    void DeleteRun(long id);
+    #endregion
   }
 }
Index: branches/OKB/HeuristicLab.Services.OKB/3.3/OKBService.cs
===================================================================
--- branches/OKB/HeuristicLab.Services.OKB/3.3/OKBService.cs	(revision 4587)
+++ branches/OKB/HeuristicLab.Services.OKB/3.3/OKBService.cs	(revision 4591)
@@ -22,4 +22,5 @@
 using System;
 using System.Collections.Generic;
+using System.Data.Linq;
 using System.Linq;
 using System.ServiceModel;
@@ -398,4 +399,126 @@
         DataAccess.Result entity = okb.Results.FirstOrDefault(x => x.Id == id);
         if (entity != null) okb.Results.DeleteOnSubmit(entity);
+        okb.SubmitChanges();
+      }
+    }
+    #endregion
+
+    #region Experiment Methods
+    public DataTransfer.Experiment GetExperiment(long id) {
+      using (OKBDataContext okb = new OKBDataContext()) {
+        DataLoadOptions dlo = new DataLoadOptions();
+        dlo.LoadWith<Experiment>(x => x.AlgorithmParameterBlobValues);
+        dlo.LoadWith<Experiment>(x => x.AlgorithmParameterBoolValues);
+        dlo.LoadWith<Experiment>(x => x.AlgorithmParameterFloatValues);
+        dlo.LoadWith<Experiment>(x => x.AlgorithmParameterIntValues);
+        dlo.LoadWith<Experiment>(x => x.AlgorithmParameterStringValues);
+        dlo.LoadWith<Experiment>(x => x.ProblemParameterBlobValues);
+        dlo.LoadWith<Experiment>(x => x.ProblemParameterBoolValues);
+        dlo.LoadWith<Experiment>(x => x.ProblemParameterFloatValues);
+        dlo.LoadWith<Experiment>(x => x.ProblemParameterIntValues);
+        dlo.LoadWith<Experiment>(x => x.ProblemParameterStringValues);
+        okb.LoadOptions = dlo;
+        return Convert.ToDto(okb.Experiments.FirstOrDefault(x => x.Id == id));
+      }
+    }
+    public IEnumerable<DataTransfer.Experiment> GetExperiments(long algorithmId, long problemId) {
+      using (OKBDataContext okb = new OKBDataContext()) {
+        DataLoadOptions dlo = new DataLoadOptions();
+        dlo.LoadWith<Experiment>(x => x.AlgorithmParameterBlobValues);
+        dlo.LoadWith<Experiment>(x => x.AlgorithmParameterBoolValues);
+        dlo.LoadWith<Experiment>(x => x.AlgorithmParameterFloatValues);
+        dlo.LoadWith<Experiment>(x => x.AlgorithmParameterIntValues);
+        dlo.LoadWith<Experiment>(x => x.AlgorithmParameterStringValues);
+        dlo.LoadWith<Experiment>(x => x.ProblemParameterBlobValues);
+        dlo.LoadWith<Experiment>(x => x.ProblemParameterBoolValues);
+        dlo.LoadWith<Experiment>(x => x.ProblemParameterFloatValues);
+        dlo.LoadWith<Experiment>(x => x.ProblemParameterIntValues);
+        dlo.LoadWith<Experiment>(x => x.ProblemParameterStringValues);
+        okb.LoadOptions = dlo;
+        if ((algorithmId != 0) && (problemId != 0))
+          return okb.Experiments.Where(x => (x.AlgorithmId == algorithmId) && (x.ProblemId == problemId)).Select(x => Convert.ToDto(x)).ToArray();
+        else if (algorithmId != 0)
+          return okb.Experiments.Where(x => x.AlgorithmId == algorithmId).Select(x => Convert.ToDto(x)).ToArray();
+        else if (problemId != 0)
+          return okb.Experiments.Where(x => x.ProblemId == problemId).Select(x => Convert.ToDto(x)).ToArray();
+        else
+          return okb.Experiments.Select(x => Convert.ToDto(x)).ToArray();
+      }
+    }
+    public long AddExperiment(DataTransfer.Experiment dto) {
+      using (OKBDataContext okb = new OKBDataContext()) {
+        DataAccess.Experiment entity = Convert.ToEntity(dto); entity.Id = 0;
+
+        DataLoadOptions dlo = new DataLoadOptions();
+        dlo.LoadWith<Experiment>(x => x.AlgorithmParameterBlobValues);
+        dlo.LoadWith<Experiment>(x => x.AlgorithmParameterBoolValues);
+        dlo.LoadWith<Experiment>(x => x.AlgorithmParameterFloatValues);
+        dlo.LoadWith<Experiment>(x => x.AlgorithmParameterIntValues);
+        dlo.LoadWith<Experiment>(x => x.AlgorithmParameterStringValues);
+        dlo.LoadWith<Experiment>(x => x.ProblemParameterBlobValues);
+        dlo.LoadWith<Experiment>(x => x.ProblemParameterBoolValues);
+        dlo.LoadWith<Experiment>(x => x.ProblemParameterFloatValues);
+        dlo.LoadWith<Experiment>(x => x.ProblemParameterIntValues);
+        dlo.LoadWith<Experiment>(x => x.ProblemParameterStringValues);
+        okb.LoadOptions = dlo;
+
+        var experiments = okb.Experiments.Where(x => ((x.AlgorithmId == entity.AlgorithmId) && (x.ProblemId == entity.ProblemId)));
+        ExperimentEqualityComparer comparer = new ExperimentEqualityComparer();
+        Experiment exp = experiments.FirstOrDefault(x => comparer.Equals(x, entity));
+        if (exp != null) {
+          return exp.Id;
+        } else {
+          okb.Experiments.InsertOnSubmit(entity);
+          okb.SubmitChanges();
+          return entity.Id;
+        }
+      }
+    }
+    public void DeleteExperiment(long id) {
+      using (OKBDataContext okb = new OKBDataContext()) {
+        DataAccess.Experiment entity = okb.Experiments.FirstOrDefault(x => x.Id == id);
+        if (entity != null) okb.Experiments.DeleteOnSubmit(entity);
+        okb.SubmitChanges();
+      }
+    }
+    #endregion
+
+    #region Run Methods
+    public DataTransfer.Run GetRun(long id) {
+      using (OKBDataContext okb = new OKBDataContext()) {
+        DataLoadOptions dlo = new DataLoadOptions();
+        dlo.LoadWith<Run>(x => x.ResultBlobValues);
+        dlo.LoadWith<Run>(x => x.ResultBoolValues);
+        dlo.LoadWith<Run>(x => x.ResultFloatValues);
+        dlo.LoadWith<Run>(x => x.ResultIntValues);
+        dlo.LoadWith<Run>(x => x.ResultStringValues);
+        okb.LoadOptions = dlo;
+        return Convert.ToDto(okb.Runs.FirstOrDefault(x => x.Id == id));
+      }
+    }
+    public IEnumerable<DataTransfer.Run> GetRuns(long experimentId) {
+      using (OKBDataContext okb = new OKBDataContext()) {
+        DataLoadOptions dlo = new DataLoadOptions();
+        dlo.LoadWith<Run>(x => x.ResultBlobValues);
+        dlo.LoadWith<Run>(x => x.ResultBoolValues);
+        dlo.LoadWith<Run>(x => x.ResultFloatValues);
+        dlo.LoadWith<Run>(x => x.ResultIntValues);
+        dlo.LoadWith<Run>(x => x.ResultStringValues);
+        okb.LoadOptions = dlo;
+        return okb.Runs.Where(x => x.ExperimentId == experimentId).Select(x => Convert.ToDto(x)).ToArray();
+      }
+    }
+    public long AddRun(DataTransfer.Run dto) {
+      using (OKBDataContext okb = new OKBDataContext()) {
+        DataAccess.Run entity = Convert.ToEntity(dto); entity.Id = 0;
+        okb.Runs.InsertOnSubmit(entity);
+        okb.SubmitChanges();
+        return entity.Id;
+      }
+    }
+    public void DeleteRun(long id) {
+      using (OKBDataContext okb = new OKBDataContext()) {
+        DataAccess.Run entity = okb.Runs.FirstOrDefault(x => x.Id == id);
+        if (entity != null) okb.Runs.DeleteOnSubmit(entity);
         okb.SubmitChanges();
       }
