Index: branches/OKB (trunk integration)/HeuristicLab.Services.OKB.DataTransfer/3.3/BinaryData.cs
===================================================================
--- branches/OKB (trunk integration)/HeuristicLab.Services.OKB.DataTransfer/3.3/BinaryData.cs	(revision 5379)
+++ branches/OKB (trunk integration)/HeuristicLab.Services.OKB.DataTransfer/3.3/BinaryData.cs	(revision 5389)
@@ -27,6 +27,4 @@
     [DataMember]
     public byte[] Data { get; set; }
-    [DataMember]
-    public byte[] Hash { get; set; }
   }
 }
Index: branches/OKB (trunk integration)/HeuristicLab.Services.OKB/3.3/AdministrationService.cs
===================================================================
--- branches/OKB (trunk integration)/HeuristicLab.Services.OKB/3.3/AdministrationService.cs	(revision 5379)
+++ branches/OKB (trunk integration)/HeuristicLab.Services.OKB/3.3/AdministrationService.cs	(revision 5389)
@@ -24,4 +24,5 @@
 using System.Data.Linq;
 using System.Linq;
+using System.Security.Cryptography;
 using System.ServiceModel;
 using HeuristicLab.Services.OKB.DataAccess;
@@ -103,4 +104,39 @@
     #endregion
 
+    #region BinaryData Methods
+    public long GetBinaryDataId(byte[] hash) {
+      using (OKBDataContext okb = new OKBDataContext()) {
+        var id = okb.BinaryDatas.Where(x => x.Hash.Equals(hash)).Select(x => x.Id).FirstOrDefault();
+        if (id == 0) return -1;
+        else return id;
+      }
+    }
+    public long AddBinaryData(DataTransfer.BinaryData dto) {
+      byte[] hash;
+      using (SHA1 sha1 = SHA1.Create()) {
+        hash = sha1.ComputeHash(dto.Data);
+      }
+
+      using (OKBDataContext okb = new OKBDataContext()) {
+        var id = okb.BinaryDatas.Where(x => x.Hash.Equals(hash)).Select(x => x.Id).FirstOrDefault();
+        if (id != 0) {
+          return id;
+        } else {
+          DataAccess.BinaryData entity = Convert.ToEntity(dto); entity.Id = 0;
+          okb.BinaryDatas.InsertOnSubmit(entity);
+          okb.SubmitChanges();
+          return entity.Id;
+        }
+      }
+    }
+    public void DeleteBinaryData(long id) {
+      using (OKBDataContext okb = new OKBDataContext()) {
+        DataAccess.BinaryData entity = okb.BinaryDatas.FirstOrDefault(x => x.Id == id);
+        if (entity != null) okb.BinaryDatas.DeleteOnSubmit(entity);
+        okb.SubmitChanges();
+      }
+    }
+    #endregion
+
     #region AlgorithmClass Methods
     public DataTransfer.AlgorithmClass GetAlgorithmClass(long id) {
@@ -183,53 +219,10 @@
       }
     }
-    #endregion
-
-    #region AlgorithmData Methods
-    public DataTransfer.AlgorithmData GetAlgorithmData(long algorithmId) {
-      using (OKBDataContext okb = new OKBDataContext()) {
-        return Convert.ToDto(okb.AlgorithmDatas.FirstOrDefault(x => x.AlgorithmId == algorithmId));
-      }
-    }
-    public void UpdateAlgorithmData(DataTransfer.AlgorithmData dto) {
-      using (OKBDataContext okb = new OKBDataContext()) {
-        DataAccess.AlgorithmData entity = okb.AlgorithmDatas.FirstOrDefault(x => x.AlgorithmId == dto.AlgorithmId);
-        if (entity == null) okb.AlgorithmDatas.InsertOnSubmit(Convert.ToEntity(dto));
-        else Convert.ToEntity(dto, entity);
-        okb.SubmitChanges();
-      }
-    }
-    #endregion
-
-    #region AlgorithmParameter Methods
-    public DataTransfer.AlgorithmParameter GetAlgorithmParameter(long id) {
-      using (OKBDataContext okb = new OKBDataContext()) {
-        return Convert.ToDto(okb.AlgorithmParameters.FirstOrDefault(x => x.Id == id));
-      }
-    }
-    public IEnumerable<DataTransfer.AlgorithmParameter> GetAlgorithmParameters(long algorithmId) {
-      using (OKBDataContext okb = new OKBDataContext()) {
-        return okb.AlgorithmParameters.Where(x => x.AlgorithmId == algorithmId).Select(x => Convert.ToDto(x)).ToArray();
-      }
-    }
-    public long AddAlgorithmParameter(DataTransfer.AlgorithmParameter dto) {
-      using (OKBDataContext okb = new OKBDataContext()) {
-        DataAccess.AlgorithmParameter entity = Convert.ToEntity(dto); entity.Id = 0;
-        okb.AlgorithmParameters.InsertOnSubmit(entity);
-        okb.SubmitChanges();
-        return entity.Id;
-      }
-    }
-    public void UpdateAlgorithmParameter(DataTransfer.AlgorithmParameter dto) {
-      using (OKBDataContext okb = new OKBDataContext()) {
-        DataAccess.AlgorithmParameter entity = okb.AlgorithmParameters.FirstOrDefault(x => x.Id == dto.Id);
-        Convert.ToEntity(dto, entity);
-        okb.SubmitChanges();
-      }
-    }
-    public void DeleteAlgorithmParameter(long id) {
-      using (OKBDataContext okb = new OKBDataContext()) {
-        DataAccess.AlgorithmParameter entity = okb.AlgorithmParameters.FirstOrDefault(x => x.Id == id);
-        if (entity != null) okb.AlgorithmParameters.DeleteOnSubmit(entity);
-        okb.SubmitChanges();
+    public DataTransfer.BinaryData GetAlgorithmData(long algorithmId) {
+      using (OKBDataContext okb = new OKBDataContext()) {
+        DataLoadOptions dlo = new DataLoadOptions();
+        dlo.LoadWith<Algorithm>(x => x.BinaryData);
+        okb.LoadOptions = dlo;
+        return Convert.ToDto(okb.Algorithms.Where(x => x.Id == algorithmId).Select(x => x.BinaryData).FirstOrDefault());
       }
     }
@@ -316,18 +309,10 @@
       }
     }
-    #endregion
-
-    #region ProblemData Methods
-    public DataTransfer.ProblemData GetProblemData(long problemId) {
-      using (OKBDataContext okb = new OKBDataContext()) {
-        return Convert.ToDto(okb.ProblemDatas.FirstOrDefault(x => x.ProblemId == problemId));
-      }
-    }
-    public void UpdateProblemData(DataTransfer.ProblemData dto) {
-      using (OKBDataContext okb = new OKBDataContext()) {
-        DataAccess.ProblemData entity = okb.ProblemDatas.FirstOrDefault(x => x.ProblemId == dto.ProblemId);
-        if (entity == null) okb.ProblemDatas.InsertOnSubmit(Convert.ToEntity(dto));
-        else Convert.ToEntity(dto, entity);
-        okb.SubmitChanges();
+    public DataTransfer.BinaryData GetProblemData(long problemId) {
+      using (OKBDataContext okb = new OKBDataContext()) {
+        DataLoadOptions dlo = new DataLoadOptions();
+        dlo.LoadWith<Problem>(x => x.BinaryData);
+        okb.LoadOptions = dlo;
+        return Convert.ToDto(okb.Problems.Where(x => x.Id == problemId).Select(x => x.BinaryData).FirstOrDefault());
       }
     }
Index: branches/OKB (trunk integration)/HeuristicLab.Services.OKB/3.3/Convert.cs
===================================================================
--- branches/OKB (trunk integration)/HeuristicLab.Services.OKB/3.3/Convert.cs	(revision 5379)
+++ branches/OKB (trunk integration)/HeuristicLab.Services.OKB/3.3/Convert.cs	(revision 5389)
@@ -47,13 +47,29 @@
     public static DT.DataType ToDto(DA.DataType source) {
       if (source == null) return null;
-      return new DT.DataType { Id = source.Id, Name = source.Name, TypeName = source.TypeName, SqlName = source.SqlName, PlatformId = source.PlatformId };
+      return new DT.DataType { Id = source.Id, Name = source.Name, TypeName = source.TypeName, PlatformId = source.PlatformId };
     }
     public static DA.DataType ToEntity(DT.DataType source) {
       if (source == null) return null;
-      return new DA.DataType { Id = source.Id, Name = source.Name, TypeName = source.TypeName, SqlName = source.SqlName, PlatformId = source.PlatformId };
+      return new DA.DataType { Id = source.Id, Name = source.Name, TypeName = source.TypeName, PlatformId = source.PlatformId };
     }
     public static void ToEntity(DT.DataType source, DA.DataType target) {
       if ((source != null) && (target != null)) {
-        target.Id = source.Id; target.Name = source.Name; target.TypeName = source.TypeName; target.SqlName = source.SqlName; target.PlatformId = source.PlatformId;
+        target.Id = source.Id; target.Name = source.Name; target.TypeName = source.TypeName; target.PlatformId = source.PlatformId;
+      }
+    }
+    #endregion
+
+    #region BinaryData
+    public static DT.BinaryData ToDto(DA.BinaryData source) {
+      if (source == null) return null;
+      return new DT.BinaryData { Id = source.Id, Data = source.Data.ToArray() };
+    }
+    public static DA.BinaryData ToEntity(DT.BinaryData source) {
+      if (source == null) return null;
+      return new DA.BinaryData { Id = source.Id, Data = source.Data };
+    }
+    public static void ToEntity(DT.BinaryData source, DA.BinaryData target) {
+      if ((source != null) && (target != null)) {
+        target.Id = source.Id; target.Data = source.Data;
       }
     }
@@ -79,29 +95,13 @@
     public static DT.Algorithm ToDto(DA.Algorithm source) {
       if (source == null) return null;
-      return new DT.Algorithm { Id = source.Id, Name = source.Name, Description = source.Description, PlatformId = source.PlatformId, AlgorithmClassId = source.AlgorithmClassId };
+      return new DT.Algorithm { Id = source.Id, Name = source.Name, Description = source.Description, PlatformId = source.PlatformId, AlgorithmClassId = source.AlgorithmClassId, DataTypeId = source.DataTypeId, BinaryDataId = source.BinaryDataId };
     }
     public static DA.Algorithm ToEntity(DT.Algorithm source) {
       if (source == null) return null;
-      return new DA.Algorithm { Id = source.Id, Name = source.Name, Description = source.Description, PlatformId = source.PlatformId, AlgorithmClassId = source.AlgorithmClassId };
+      return new DA.Algorithm { Id = source.Id, Name = source.Name, Description = source.Description, PlatformId = source.PlatformId, AlgorithmClassId = source.AlgorithmClassId, DataTypeId = source.DataTypeId, BinaryDataId = source.BinaryDataId };
     }
     public static void ToEntity(DT.Algorithm source, DA.Algorithm target) {
       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
-
-    #region AlgorithmData
-    public static DT.AlgorithmData ToDto(DA.AlgorithmData source) {
-      if (source == null) return null;
-      return new DT.AlgorithmData { AlgorithmId = source.AlgorithmId, DataTypeId = source.DataTypeId, Data = source.Data.ToArray() };
-    }
-    public static DA.AlgorithmData ToEntity(DT.AlgorithmData source) {
-      if (source == null) return null;
-      return new DA.AlgorithmData { AlgorithmId = source.AlgorithmId, DataTypeId = source.DataTypeId, Data = new Binary(source.Data) };
-    }
-    public static void ToEntity(DT.AlgorithmData source, DA.AlgorithmData target) {
-      if ((source != null) && (target != null)) {
-        target.AlgorithmId = source.AlgorithmId; target.DataTypeId = source.DataTypeId; target.Data = new Binary(source.Data);
+        target.Id = source.Id; target.Name = source.Name; target.Description = source.Description; target.PlatformId = source.PlatformId; target.AlgorithmClassId = source.AlgorithmClassId; target.DataTypeId = source.DataTypeId; target.BinaryDataId = source.BinaryDataId;
       }
     }
@@ -223,29 +223,13 @@
     public static DT.Problem ToDto(DA.Problem source) {
       if (source == null) return null;
-      return new DT.Problem { Id = source.Id, Name = source.Name, Description = source.Description, PlatformId = source.PlatformId, ProblemClassId = source.ProblemClassId };
+      return new DT.Problem { Id = source.Id, Name = source.Name, Description = source.Description, PlatformId = source.PlatformId, ProblemClassId = source.ProblemClassId, DataTypeId = source.DataTypeId, BinaryDataId = source.BinaryDataId };
     }
     public static DA.Problem ToEntity(DT.Problem source) {
       if (source == null) return null;
-      return new DA.Problem { Id = source.Id, Name = source.Name, Description = source.Description, PlatformId = source.PlatformId, ProblemClassId = source.ProblemClassId };
+      return new DA.Problem { Id = source.Id, Name = source.Name, Description = source.Description, PlatformId = source.PlatformId, ProblemClassId = source.ProblemClassId, DataTypeId = source.DataTypeId, BinaryDataId = source.BinaryDataId };
     }
     public static void ToEntity(DT.Problem source, DA.Problem target) {
       if ((source != null) && (target != null)) {
-        target.Id = source.Id; target.Name = source.Name; target.Description = source.Description; target.PlatformId = source.PlatformId; target.ProblemClassId = source.ProblemClassId;
-      }
-    }
-    #endregion
-
-    #region ProblemData
-    public static DT.ProblemData ToDto(DA.ProblemData source) {
-      if (source == null) return null;
-      return new DT.ProblemData { ProblemId = source.ProblemId, DataTypeId = source.DataTypeId, Data = source.Data.ToArray() };
-    }
-    public static DA.ProblemData ToEntity(DT.ProblemData source) {
-      if (source == null) return null;
-      return new DA.ProblemData { ProblemId = source.ProblemId, DataTypeId = source.DataTypeId, Data = new Binary(source.Data) };
-    }
-    public static void ToEntity(DT.ProblemData source, DA.ProblemData target) {
-      if ((source != null) && (target != null)) {
-        target.ProblemId = source.ProblemId; target.DataTypeId = source.DataTypeId; target.Data = new Binary(source.Data);
+        target.Id = source.Id; target.Name = source.Name; target.Description = source.Description; target.PlatformId = source.PlatformId; target.ProblemClassId = source.ProblemClassId; target.DataTypeId = source.DataTypeId; target.BinaryDataId = source.BinaryDataId;
       }
     }
Index: branches/OKB (trunk integration)/HeuristicLab.Services.OKB/3.3/ExperimentEqualityComparer.cs
===================================================================
--- branches/OKB (trunk integration)/HeuristicLab.Services.OKB/3.3/ExperimentEqualityComparer.cs	(revision 5379)
+++ 	(revision )
@@ -1,150 +1,0 @@
-﻿#region License Information
-/* HeuristicLab
- * Copyright (C) 2002-2010 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
- *
- * This file is part of HeuristicLab.
- *
- * HeuristicLab is free software: you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * HeuristicLab is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
- */
-#endregion
-
-using System.Collections.Generic;
-using 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.Length == value.Y.Value.Length;
-          if (equal) {
-            byte[] xBlob = value.X.Value.ToArray();
-            byte[] yBlob = value.Y.Value.ToArray();
-            int i = 0;
-            while (equal && (i < xBlob.Length)) {
-              equal = equal && xBlob[i] == yBlob[i];
-              i++;
-            }
-          }
-        }
-      }
-      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.Length == value.Y.Value.Length;
-          if (equal) {
-            byte[] xBlob = value.X.Value.ToArray();
-            byte[] yBlob = value.Y.Value.ToArray();
-            int i = 0;
-            while (equal && (i < xBlob.Length)) {
-              equal = equal && xBlob[i] == yBlob[i];
-              i++;
-            }
-          }
-        }
-      }
-      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 (trunk integration)/HeuristicLab.Services.OKB/3.3/GenericEqualityComparer.cs
===================================================================
--- branches/OKB (trunk integration)/HeuristicLab.Services.OKB/3.3/GenericEqualityComparer.cs	(revision 5379)
+++ 	(revision )
@@ -1,41 +1,0 @@
-﻿#region License Information
-/* HeuristicLab
- * Copyright (C) 2002-2010 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
- *
- * This file is part of HeuristicLab.
- *
- * HeuristicLab is free software: you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * HeuristicLab is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
- */
-#endregion
-
-using System;
-using System.Collections.Generic;
-
-namespace HeuristicLab.Services.OKB {
-  public class GenericEqualityComparer<T> : IEqualityComparer<T> {
-    private Func<T, T, bool> comparison;
-
-    public GenericEqualityComparer(Func<T, T, bool> comparison) {
-      this.comparison = comparison;
-    }
-
-    public bool Equals(T x, T y) {
-      return comparison(x, y);
-    }
-
-    public int GetHashCode(T obj) {
-      return obj.GetHashCode();
-    }
-  }
-}
Index: branches/OKB (trunk integration)/HeuristicLab.Services.OKB/3.3/HeuristicLab.Services.OKB-3.3.csproj
===================================================================
--- branches/OKB (trunk integration)/HeuristicLab.Services.OKB/3.3/HeuristicLab.Services.OKB-3.3.csproj	(revision 5379)
+++ branches/OKB (trunk integration)/HeuristicLab.Services.OKB/3.3/HeuristicLab.Services.OKB-3.3.csproj	(revision 5389)
@@ -160,6 +160,4 @@
     <Compile Include="Filters\ResultStringValueValueFilter.cs" />
     <Compile Include="Filters\ResultFloatValueValueFilter.cs" />
-    <Compile Include="GenericEqualityComparer.cs" />
-    <Compile Include="ExperimentEqualityComparer.cs" />
     <Compile Include="Interfaces\IQueryService.cs" />
     <Compile Include="Interfaces\IAuthenticationService.cs" />
Index: branches/OKB (trunk integration)/HeuristicLab.Services.OKB/3.3/Interfaces/IAdministrationService.cs
===================================================================
--- branches/OKB (trunk integration)/HeuristicLab.Services.OKB/3.3/Interfaces/IAdministrationService.cs	(revision 5379)
+++ branches/OKB (trunk integration)/HeuristicLab.Services.OKB/3.3/Interfaces/IAdministrationService.cs	(revision 5389)
@@ -58,4 +58,13 @@
     #endregion
 
+    #region BinaryData Methods
+    [OperationContract]
+    long GetBinaryDataId(byte[] hash);
+    [OperationContract]
+    long AddBinaryData(BinaryData dto);
+    [OperationContract]
+    void DeleteBinaryData(long id);
+    #endregion
+
     #region AlgorithmClass Methods
     [OperationContract]
@@ -86,24 +95,6 @@
     [OperationContract]
     void UpdateAlgorithmUsers(long algorithmId, IEnumerable<Guid> users);
-    #endregion
-
-    #region AlgorithmData Methods
     [OperationContract]
-    AlgorithmData GetAlgorithmData(long algorithmId);
-    [OperationContract]
-    void UpdateAlgorithmData(AlgorithmData dto);
-    #endregion
-
-    #region AlgorithmParameter Methods
-    [OperationContract]
-    AlgorithmParameter GetAlgorithmParameter(long id);
-    [OperationContract]
-    IEnumerable<AlgorithmParameter> GetAlgorithmParameters(long algorithmId);
-    [OperationContract]
-    long AddAlgorithmParameter(AlgorithmParameter dto);
-    [OperationContract]
-    void UpdateAlgorithmParameter(AlgorithmParameter dto);
-    [OperationContract]
-    void DeleteAlgorithmParameter(long id);
+    BinaryData GetAlgorithmData(long algorithmId);
     #endregion
 
@@ -136,48 +127,6 @@
     [OperationContract]
     void UpdateProblemUsers(long problemId, IEnumerable<Guid> users);
-    #endregion
-
-    #region ProblemData Methods
     [OperationContract]
-    ProblemData GetProblemData(long problemId);
-    [OperationContract]
-    void UpdateProblemData(ProblemData dto);
-    #endregion
-
-    #region ProblemParameter Methods
-    [OperationContract]
-    ProblemParameter GetProblemParameter(long id);
-    [OperationContract]
-    IEnumerable<ProblemParameter> GetProblemParameters(long problemId);
-    [OperationContract]
-    long AddProblemParameter(ProblemParameter dto);
-    [OperationContract]
-    void UpdateProblemParameter(ProblemParameter dto);
-    [OperationContract]
-    void DeleteProblemParameter(long id);
-    #endregion
-
-    #region Result Methods
-    [OperationContract]
-    Result GetResult(long id);
-    [OperationContract]
-    IEnumerable<Result> GetResults(long algorithmId);
-    [OperationContract]
-    long AddResult(Result dto);
-    [OperationContract]
-    void UpdateResult(Result dto);
-    [OperationContract]
-    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);
+    BinaryData GetProblemData(long problemId);
     #endregion
 
@@ -186,5 +135,5 @@
     Run GetRun(long id);
     [OperationContract]
-    IEnumerable<Run> GetRuns(long experimentId);
+    IEnumerable<Run> GetRuns(long algorithmId, long problemId);
     [OperationContract]
     long AddRun(Run dto);
