Index: branches/OKB (trunk integration)/HeuristicLab.OKB.sln
===================================================================
--- branches/OKB (trunk integration)/HeuristicLab.OKB.sln	(revision 5482)
+++ branches/OKB (trunk integration)/HeuristicLab.OKB.sln	(revision 5502)
@@ -3,6 +3,4 @@
 # Visual Studio 2010
 Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Solution Items", "Solution Items", "{9E843318-7235-4B2B-81A7-160FDDADD9E1}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "HeuristicLab.Services.OKB.DataTransfer-3.3", "HeuristicLab.Services.OKB.DataTransfer\3.3\HeuristicLab.Services.OKB.DataTransfer-3.3.csproj", "{209FD7A1-DFB2-4B9F-9268-B95E886B2F7A}"
 EndProject
 Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "HeuristicLab.Services.OKB.DataAccess-3.3", "HeuristicLab.Services.OKB.DataAccess\3.3\HeuristicLab.Services.OKB.DataAccess-3.3.csproj", "{E36BE58F-F3CE-40BB-9AB3-9F9E30AD5CCF}"
@@ -24,12 +22,4 @@
 	EndGlobalSection
 	GlobalSection(ProjectConfigurationPlatforms) = postSolution
-		{209FD7A1-DFB2-4B9F-9268-B95E886B2F7A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
-		{209FD7A1-DFB2-4B9F-9268-B95E886B2F7A}.Debug|Any CPU.Build.0 = Debug|Any CPU
-		{209FD7A1-DFB2-4B9F-9268-B95E886B2F7A}.Debug|x64.ActiveCfg = Debug|Any CPU
-		{209FD7A1-DFB2-4B9F-9268-B95E886B2F7A}.Debug|x86.ActiveCfg = Debug|Any CPU
-		{209FD7A1-DFB2-4B9F-9268-B95E886B2F7A}.Release|Any CPU.ActiveCfg = Release|Any CPU
-		{209FD7A1-DFB2-4B9F-9268-B95E886B2F7A}.Release|Any CPU.Build.0 = Release|Any CPU
-		{209FD7A1-DFB2-4B9F-9268-B95E886B2F7A}.Release|x64.ActiveCfg = Release|Any CPU
-		{209FD7A1-DFB2-4B9F-9268-B95E886B2F7A}.Release|x86.ActiveCfg = Release|Any CPU
 		{E36BE58F-F3CE-40BB-9AB3-9F9E30AD5CCF}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
 		{E36BE58F-F3CE-40BB-9AB3-9F9E30AD5CCF}.Debug|Any CPU.Build.0 = Debug|Any CPU
Index: branches/OKB (trunk integration)/HeuristicLab.Services.OKB.DataAccess/3.3/HeuristicLab.Services.OKB.DataAccess-3.3.csproj
===================================================================
--- branches/OKB (trunk integration)/HeuristicLab.Services.OKB.DataAccess/3.3/HeuristicLab.Services.OKB.DataAccess-3.3.csproj	(revision 5482)
+++ branches/OKB (trunk integration)/HeuristicLab.Services.OKB.DataAccess/3.3/HeuristicLab.Services.OKB.DataAccess-3.3.csproj	(revision 5502)
@@ -184,10 +184,4 @@
     <None Include="SQL Scripts\Create OKB.sql" />
   </ItemGroup>
-  <ItemGroup>
-    <ProjectReference Include="..\..\HeuristicLab.Services.OKB.DataTransfer\3.3\HeuristicLab.Services.OKB.DataTransfer-3.3.csproj">
-      <Project>{209FD7A1-DFB2-4B9F-9268-B95E886B2F7A}</Project>
-      <Name>HeuristicLab.Services.OKB.DataTransfer-3.3</Name>
-    </ProjectReference>
-  </ItemGroup>
   <Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
   <PropertyGroup>
Index: branches/OKB (trunk integration)/HeuristicLab.Services.OKB.DataAccess/3.3/Tests/HeuristicLab.Services.OKB.DataAccess-3.3.Tests.csproj
===================================================================
--- branches/OKB (trunk integration)/HeuristicLab.Services.OKB.DataAccess/3.3/Tests/HeuristicLab.Services.OKB.DataAccess-3.3.Tests.csproj	(revision 5482)
+++ branches/OKB (trunk integration)/HeuristicLab.Services.OKB.DataAccess/3.3/Tests/HeuristicLab.Services.OKB.DataAccess-3.3.Tests.csproj	(revision 5502)
@@ -55,8 +55,4 @@
       <Name>HeuristicLab.Clients.OKB-3.3</Name>
     </ProjectReference>
-    <ProjectReference Include="..\..\..\HeuristicLab.Services.OKB.DataTransfer\3.3\HeuristicLab.Services.OKB.DataTransfer-3.3.csproj">
-      <Project>{209FD7A1-DFB2-4B9F-9268-B95E886B2F7A}</Project>
-      <Name>HeuristicLab.Services.OKB.DataTransfer-3.3</Name>
-    </ProjectReference>
     <ProjectReference Include="..\..\..\HeuristicLab.Services.OKB\3.3\HeuristicLab.Services.OKB-3.3.csproj">
       <Project>{766DA4B7-2A0E-4CDE-8F90-93D8B1AD62CF}</Project>
Index: branches/OKB (trunk integration)/HeuristicLab.Services.OKB/3.3/Convert.cs
===================================================================
--- branches/OKB (trunk integration)/HeuristicLab.Services.OKB/3.3/Convert.cs	(revision 5482)
+++ 	(revision )
@@ -1,537 +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.Data.Linq;
-using System.Linq;
-using DA = HeuristicLab.Services.OKB.DataAccess;
-using DT = HeuristicLab.Services.OKB.DataTransfer;
-
-namespace HeuristicLab.Services.OKB {
-  public static class Convert {
-    #region Platform
-    public static DT.Platform ToDto(DA.Platform source) {
-      if (source == null) return null;
-      return new DT.Platform { Id = source.Id, Name = source.Name, Description = source.Description };
-    }
-    public static DA.Platform ToEntity(DT.Platform source) {
-      if (source == null) return null;
-      return new DA.Platform { Id = source.Id, Name = source.Name, Description = source.Description };
-    }
-    public static void ToEntity(DT.Platform source, DA.Platform target) {
-      if ((source != null) && (target != null)) {
-        target.Id = source.Id; target.Name = source.Name; target.Description = source.Description;
-      }
-    }
-    #endregion
-
-    #region DataType
-    public static DT.DataType ToDto(DA.DataType source) {
-      if (source == null) return null;
-      return new DT.DataType { Id = source.Id, Name = source.Name, 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, 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;
-      }
-    }
-    #endregion
-
-    #region AlgorithmClass
-    public static DT.AlgorithmClass ToDto(DA.AlgorithmClass source) {
-      if (source == null) return null;
-      return new DT.AlgorithmClass { Id = source.Id, Name = source.Name, Description = source.Description };
-    }
-    public static DA.AlgorithmClass ToEntity(DT.AlgorithmClass source) {
-      if (source == null) return null;
-      return new DA.AlgorithmClass { Id = source.Id, Name = source.Name, Description = source.Description };
-    }
-    public static void ToEntity(DT.AlgorithmClass source, DA.AlgorithmClass target) {
-      if ((source != null) && (target != null)) {
-        target.Id = source.Id; target.Name = source.Name; target.Description = source.Description;
-      }
-    }
-    #endregion
-
-    #region Algorithm
-    public static DT.Algorithm ToDto(DA.Algorithm source) {
-      if (source == null) return null;
-      return new DT.Algorithm { Id = source.Id, Name = source.Name, Description = source.Description, PlatformId = source.PlatformId, AlgorithmClassId = source.AlgorithmClassId, 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, 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; target.DataTypeId = source.DataTypeId; target.BinaryDataId = source.BinaryDataId;
-      }
-    }
-    #endregion
-
-    #region AlgorithmParameter
-    public static DT.AlgorithmParameter ToDto(DA.AlgorithmParameter source) {
-      if (source == null) return null;
-      return new DT.AlgorithmParameter { Id = source.Id, Name = source.Name, Description = source.Description, Alias = source.Alias, AlgorithmId = source.AlgorithmId, DataTypeId = source.DataTypeId };
-    }
-    public static DA.AlgorithmParameter ToEntity(DT.AlgorithmParameter source) {
-      if (source == null) return null;
-      return new DA.AlgorithmParameter { Id = source.Id, Name = source.Name, Description = source.Description, Alias = source.Alias, AlgorithmId = source.AlgorithmId, DataTypeId = source.DataTypeId };
-    }
-    public static void ToEntity(DT.AlgorithmParameter source, DA.AlgorithmParameter target) {
-      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
-
-    #region ProblemClass
-    public static DT.ProblemClass ToDto(DA.ProblemClass source) {
-      if (source == null) return null;
-      return new DT.ProblemClass { Id = source.Id, Name = source.Name, Description = source.Description };
-    }
-    public static DA.ProblemClass ToEntity(DT.ProblemClass source) {
-      if (source == null) return null;
-      return new DA.ProblemClass { Id = source.Id, Name = source.Name, Description = source.Description };
-    }
-    public static void ToEntity(DT.ProblemClass source, DA.ProblemClass target) {
-      if ((source != null) && (target != null)) {
-        target.Id = source.Id; target.Name = source.Name; target.Description = source.Description;
-      }
-    }
-    #endregion
-
-    #region Problem
-    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, 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, 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; target.DataTypeId = source.DataTypeId; target.BinaryDataId = source.BinaryDataId;
-      }
-    }
-    #endregion
-
-    #region ProblemParameter
-    public static DT.ProblemParameter ToDto(DA.ProblemParameter source) {
-      if (source == null) return null;
-      return new DT.ProblemParameter { Id = source.Id, Name = source.Name, Description = source.Description, Alias = source.Alias, ProblemId = source.ProblemId, DataTypeId = source.DataTypeId };
-    }
-    public static DA.ProblemParameter ToEntity(DT.ProblemParameter source) {
-      if (source == null) return null;
-      return new DA.ProblemParameter { Id = source.Id, Name = source.Name, Description = source.Description, Alias = source.Alias, ProblemId = source.ProblemId, DataTypeId = source.DataTypeId };
-    }
-    public static void ToEntity(DT.ProblemParameter source, DA.ProblemParameter target) {
-      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
-
-    #region Result
-    public static DT.Result ToDto(DA.Result source) {
-      if (source == null) return null;
-      return new DT.Result { Id = source.Id, Name = source.Name, Description = source.Description, Alias = source.Alias, AlgorithmId = source.AlgorithmId, DataTypeId = source.DataTypeId };
-    }
-    public static DA.Result ToEntity(DT.Result source) {
-      if (source == null) return null;
-      return new DA.Result { Id = source.Id, Name = source.Name, Description = source.Description, Alias = source.Alias, AlgorithmId = source.AlgorithmId, DataTypeId = source.DataTypeId };
-    }
-    public static void ToEntity(DT.Result source, DA.Result target) {
-      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
-
-    #region Experiment
-    public static DT.Experiment ToDto(DA.Experiment source) {
-      if (source == null) return null;
-      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;
-      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)) {
-        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
-
-    #region Run
-    public static DT.Run ToDto(DA.Run source) {
-      if (source == null) return null;
-      DT.Run target = new DT.Run { Id = source.Id, RandomSeed = source.RandomSeed, CreatedDate = source.CreatedDate, 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;
-      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)) {
-        target.Id = source.Id; target.RandomSeed = source.RandomSeed; target.CreatedDate = source.CreatedDate; 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 (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 5482)
+++ branches/OKB (trunk integration)/HeuristicLab.Services.OKB/3.3/HeuristicLab.Services.OKB-3.3.csproj	(revision 5502)
@@ -134,8 +134,7 @@
     <Compile Include="Authentication\DataTransfer\User.cs" />
     <Compile Include="Authentication\IAuthenticationService.cs" />
-    <Compile Include="Convert.cs" />
     <Compile Include="Properties\AssemblyInfo.cs" />
+    <Compile Include="Query\Convert.cs" />
     <Compile Include="Query\DataTransfer\Algorithm.cs" />
-    <Compile Include="Query\DataTransfer\AlgorithmClass.cs" />
     <Compile Include="Query\DataTransfer\BinaryValue.cs" />
     <Compile Include="Query\DataTransfer\BooleanOperation.cs" />
@@ -163,7 +162,5 @@
     <Compile Include="Query\DataTransfer\OrdinalComparisonIntFilter.cs" />
     <Compile Include="Query\DataTransfer\OrdinalComparisonLongFilter.cs" />
-    <Compile Include="Query\DataTransfer\Platform.cs" />
     <Compile Include="Query\DataTransfer\Problem.cs" />
-    <Compile Include="Query\DataTransfer\ProblemClass.cs" />
     <Compile Include="Query\DataTransfer\Run.cs" />
     <Compile Include="Query\DataTransfer\StringComparison.cs" />
@@ -175,37 +172,24 @@
       <SubType>Code</SubType>
     </Compile>
-    <Compile Include="Query\Filters\AlgorithmDataDataTypeNameFilter.cs">
-      <SubType>Code</SubType>
-    </Compile>
     <Compile Include="Query\Filters\AlgorithmNameFilter.cs">
       <SubType>Code</SubType>
     </Compile>
-    <Compile Include="Query\Filters\AlgorithmParameterBlobValueDataTypeNameFilter.cs">
-      <SubType>Code</SubType>
-    </Compile>
-    <Compile Include="Query\Filters\AlgorithmParameterBlobValueValueFilter.cs">
-      <SubType>Code</SubType>
-    </Compile>
-    <Compile Include="Query\Filters\AlgorithmParameterBoolValueValueFilter.cs">
-      <SubType>Code</SubType>
-    </Compile>
-    <Compile Include="Query\Filters\AlgorithmParameterFloatValueValueFilter.cs">
-      <SubType>Code</SubType>
-    </Compile>
-    <Compile Include="Query\Filters\AlgorithmParameterIntValueValueFilter.cs">
-      <SubType>Code</SubType>
-    </Compile>
-    <Compile Include="Query\Filters\AlgorithmParameterNameFilter.cs">
-      <SubType>Code</SubType>
-    </Compile>
-    <Compile Include="Query\Filters\AlgorithmParameterStringValueValueFilter.cs">
-      <SubType>Code</SubType>
-    </Compile>
-    <Compile Include="Query\Filters\AlgorithmPlatformNameFilter.cs">
-      <SubType>Code</SubType>
-    </Compile>
     <Compile Include="Query\Filters\AndFilter.cs">
       <SubType>Code</SubType>
     </Compile>
+    <Compile Include="Query\Filters\AlgorithmDataTypeNameFilter.cs" />
+    <Compile Include="Query\Filters\AlgorithmPlatformNameFilter.cs" />
+    <Compile Include="Query\Filters\BoolValueFilter.cs" />
+    <Compile Include="Query\Filters\BinaryValueFilter.cs" />
+    <Compile Include="Query\Filters\StringValueFilter.cs" />
+    <Compile Include="Query\Filters\FloatValueFilter.cs" />
+    <Compile Include="Query\Filters\DoubleValueFilter.cs" />
+    <Compile Include="Query\Filters\LongValueFilter.cs" />
+    <Compile Include="Query\Filters\IntValueFilter.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="Query\Filters\ValueDataTypeNameFilter.cs" />
+    <Compile Include="Query\Filters\ProblemPlatformNameFilter.cs" />
+    <Compile Include="Query\Filters\ProblemDataTypeNameFilter.cs" />
     <Compile Include="Query\Filters\IFilter.cs" />
     <Compile Include="Query\Filters\OrFilter.cs">
@@ -215,55 +199,7 @@
       <SubType>Code</SubType>
     </Compile>
-    <Compile Include="Query\Filters\ProblemDataDataTypeNameFilter.cs">
-      <SubType>Code</SubType>
-    </Compile>
     <Compile Include="Query\Filters\ProblemNameFilter.cs">
       <SubType>Code</SubType>
     </Compile>
-    <Compile Include="Query\Filters\ProblemParameterBlobValueDataTypeNameFilter.cs">
-      <SubType>Code</SubType>
-    </Compile>
-    <Compile Include="Query\Filters\ProblemParameterBlobValueValueFilter.cs">
-      <SubType>Code</SubType>
-    </Compile>
-    <Compile Include="Query\Filters\ProblemParameterBoolValueValueFilter.cs">
-      <SubType>Code</SubType>
-    </Compile>
-    <Compile Include="Query\Filters\ProblemParameterFloatValueValueFilter.cs">
-      <SubType>Code</SubType>
-    </Compile>
-    <Compile Include="Query\Filters\ProblemParameterIntValueValueFilter.cs">
-      <SubType>Code</SubType>
-    </Compile>
-    <Compile Include="Query\Filters\ProblemParameterNameFilter.cs">
-      <SubType>Code</SubType>
-    </Compile>
-    <Compile Include="Query\Filters\ProblemParameterStringValueValueFilter.cs">
-      <SubType>Code</SubType>
-    </Compile>
-    <Compile Include="Query\Filters\ProblemPlatformNameFilter.cs">
-      <SubType>Code</SubType>
-    </Compile>
-    <Compile Include="Query\Filters\ResultBlobValueDataTypeNameFilter.cs">
-      <SubType>Code</SubType>
-    </Compile>
-    <Compile Include="Query\Filters\ResultBlobValueValueFilter.cs">
-      <SubType>Code</SubType>
-    </Compile>
-    <Compile Include="Query\Filters\ResultBoolValueValueFilter.cs">
-      <SubType>Code</SubType>
-    </Compile>
-    <Compile Include="Query\Filters\ResultFloatValueValueFilter.cs">
-      <SubType>Code</SubType>
-    </Compile>
-    <Compile Include="Query\Filters\ResultIntValueValueFilter.cs">
-      <SubType>Code</SubType>
-    </Compile>
-    <Compile Include="Query\Filters\ResultNameFilter.cs">
-      <SubType>Code</SubType>
-    </Compile>
-    <Compile Include="Query\Filters\ResultStringValueValueFilter.cs">
-      <SubType>Code</SubType>
-    </Compile>
     <Compile Include="Query\Filters\RunClientNameFilter.cs">
       <SubType>Code</SubType>
@@ -278,6 +214,11 @@
       <SubType>Code</SubType>
     </Compile>
+    <Compile Include="Query\Filters\ValueNameFilter.cs">
+      <SubType>Code</SubType>
+    </Compile>
     <Compile Include="Query\IQueryService.cs" />
-    <Compile Include="Query\QueryService.cs" />
+    <Compile Include="Query\QueryService.cs">
+      <SubType>Code</SubType>
+    </Compile>
     <Compile Include="RunCreation\Convert.cs" />
     <Compile Include="RunCreation\DataTransfer\Algorithm.cs" />
@@ -310,8 +251,4 @@
       <Name>HeuristicLab.Services.OKB.DataAccess-3.3</Name>
     </ProjectReference>
-    <ProjectReference Include="..\..\HeuristicLab.Services.OKB.DataTransfer\3.3\HeuristicLab.Services.OKB.DataTransfer-3.3.csproj">
-      <Project>{209FD7A1-DFB2-4B9F-9268-B95E886B2F7A}</Project>
-      <Name>HeuristicLab.Services.OKB.DataTransfer-3.3</Name>
-    </ProjectReference>
   </ItemGroup>
   <ItemGroup />
Index: branches/OKB (trunk integration)/HeuristicLab.Services.OKB/3.3/Query/Convert.cs
===================================================================
--- branches/OKB (trunk integration)/HeuristicLab.Services.OKB/3.3/Query/Convert.cs	(revision 5502)
+++ branches/OKB (trunk integration)/HeuristicLab.Services.OKB/3.3/Query/Convert.cs	(revision 5502)
@@ -0,0 +1,73 @@
+﻿#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.Linq;
+using DA = HeuristicLab.Services.OKB.DataAccess;
+using DT = HeuristicLab.Services.OKB.Query.DataTransfer;
+
+namespace HeuristicLab.Services.OKB.Query {
+  public static class Convert {
+    public static DT.Run ToDto(DA.Run source, bool includeBinaryValues) {
+      if (source == null) return null;
+      var dto = new DT.Run { Id = source.Id, Algorithm = Convert.ToDto(source.Algorithm), Problem = Convert.ToDto(source.Problem), CreatedDate = source.CreatedDate, RandomSeed = source.RandomSeed, ClientId = source.ClientId, UserId = source.UserId };
+      dto.ParameterValues = source.Values.Where(x => x.ValueName.Category == DA.ValueNameCategory.Parameter).Select(x => Convert.ToDto(x, includeBinaryValues)).ToArray();
+      dto.ResultValues = source.Values.Where(x => x.ValueName.Category == DA.ValueNameCategory.Result).Select(x => Convert.ToDto(x, includeBinaryValues)).ToArray();
+      return dto;
+    }
+
+    private static DT.Algorithm ToDto(DA.Algorithm source) {
+      if (source == null) return null;
+      return new DT.Algorithm { Name = source.Name, Description = source.Description, AlgorithmClass = source.AlgorithmClass.Name, Platform = source.Platform.Name, DataType = Convert.ToDto(source.DataType) };
+    }
+
+    private static DT.Problem ToDto(DA.Problem source) {
+      if (source == null) return null;
+      return new DT.Problem { Name = source.Name, Description = source.Description, ProblemClass = source.ProblemClass.Name, Platform = source.Platform.Name, DataType = Convert.ToDto(source.DataType) };
+    }
+
+    private static DT.DataType ToDto(DA.DataType source) {
+      if (source == null) return null;
+      return new DT.DataType { Name = source.Name, TypeName = source.TypeName };
+    }
+
+    private static DT.Value ToDto(DA.Value source, bool includeBinaryValues) {
+      if (source == null) return null;
+      if (source.ValueName.Type == DA.ValueNameType.Bool) {
+        return new DT.BoolValue { Name = source.ValueName.Name, DataType = Convert.ToDto(source.DataType), Value = source.BoolValue.GetValueOrDefault() };
+      } else if (source.ValueName.Type == DA.ValueNameType.Int) {
+        return new DT.IntValue { Name = source.ValueName.Name, DataType = Convert.ToDto(source.DataType), Value = source.IntValue.GetValueOrDefault() };
+      } else if (source.ValueName.Type == DA.ValueNameType.Long) {
+        return new DT.LongValue { Name = source.ValueName.Name, DataType = Convert.ToDto(source.DataType), Value = source.LongValue.GetValueOrDefault() };
+      } else if (source.ValueName.Type == DA.ValueNameType.Float) {
+        return new DT.FloatValue { Name = source.ValueName.Name, DataType = Convert.ToDto(source.DataType), Value = source.FloatValue.GetValueOrDefault() };
+      } else if (source.ValueName.Type == DA.ValueNameType.Double) {
+        return new DT.DoubleValue { Name = source.ValueName.Name, DataType = Convert.ToDto(source.DataType), Value = source.DoubleValue.GetValueOrDefault() };
+      } else if (source.ValueName.Type == DA.ValueNameType.String) {
+        return new DT.StringValue { Name = source.ValueName.Name, DataType = Convert.ToDto(source.DataType), Value = source.StringValue };
+      } else if (source.ValueName.Type == DA.ValueNameType.Binary) {
+        return new DT.BinaryValue { Name = source.ValueName.Name, DataType = Convert.ToDto(source.DataType), Value = includeBinaryValues ? source.BinaryData.Data.ToArray() : null };
+      } else {
+        throw new ArgumentException("Unknown value type.", "source");
+      }
+    }
+  }
+}
Index: branches/OKB (trunk integration)/HeuristicLab.Services.OKB/3.3/Query/DataTransfer/Algorithm.cs
===================================================================
--- branches/OKB (trunk integration)/HeuristicLab.Services.OKB/3.3/Query/DataTransfer/Algorithm.cs	(revision 5482)
+++ branches/OKB (trunk integration)/HeuristicLab.Services.OKB/3.3/Query/DataTransfer/Algorithm.cs	(revision 5502)
@@ -30,7 +30,7 @@
     public string Description { get; set; }
     [DataMember]
-    public Platform Platform { get; set; }
+    public string Platform { get; set; }
     [DataMember]
-    public AlgorithmClass AlgorithmClass { get; set; }
+    public string AlgorithmClass { get; set; }
     [DataMember]
     public DataType DataType { get; set; }
Index: branches/OKB (trunk integration)/HeuristicLab.Services.OKB/3.3/Query/DataTransfer/AlgorithmClass.cs
===================================================================
--- branches/OKB (trunk integration)/HeuristicLab.Services.OKB/3.3/Query/DataTransfer/AlgorithmClass.cs	(revision 5482)
+++ 	(revision )
@@ -1,32 +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.Runtime.Serialization;
-
-namespace HeuristicLab.Services.OKB.Query.DataTransfer {
-  [DataContract]
-  public class AlgorithmClass {
-    [DataMember]
-    public string Name { get; set; }
-    [DataMember]
-    public string Description { get; set; }
-  }
-}
Index: branches/OKB (trunk integration)/HeuristicLab.Services.OKB/3.3/Query/DataTransfer/BinaryValue.cs
===================================================================
--- branches/OKB (trunk integration)/HeuristicLab.Services.OKB/3.3/Query/DataTransfer/BinaryValue.cs	(revision 5482)
+++ branches/OKB (trunk integration)/HeuristicLab.Services.OKB/3.3/Query/DataTransfer/BinaryValue.cs	(revision 5502)
@@ -26,5 +26,5 @@
   public class BinaryValue : Value {
     [DataMember]
-    public long BinaryDataId { get; set; }
+    public byte[] Value { get; set; }
   }
 }
Index: branches/OKB (trunk integration)/HeuristicLab.Services.OKB/3.3/Query/DataTransfer/Platform.cs
===================================================================
--- branches/OKB (trunk integration)/HeuristicLab.Services.OKB/3.3/Query/DataTransfer/Platform.cs	(revision 5482)
+++ 	(revision )
@@ -1,32 +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.Runtime.Serialization;
-
-namespace HeuristicLab.Services.OKB.Query.DataTransfer {
-  [DataContract]
-  public class Platform {
-    [DataMember]
-    public string Name { get; set; }
-    [DataMember]
-    public string Description { get; set; }
-  }
-}
Index: branches/OKB (trunk integration)/HeuristicLab.Services.OKB/3.3/Query/DataTransfer/Problem.cs
===================================================================
--- branches/OKB (trunk integration)/HeuristicLab.Services.OKB/3.3/Query/DataTransfer/Problem.cs	(revision 5482)
+++ branches/OKB (trunk integration)/HeuristicLab.Services.OKB/3.3/Query/DataTransfer/Problem.cs	(revision 5502)
@@ -30,7 +30,7 @@
     public string Description { get; set; }
     [DataMember]
-    public Platform Platform { get; set; }
+    public string Platform { get; set; }
     [DataMember]
-    public ProblemClass ProblemClass { get; set; }
+    public string ProblemClass { get; set; }
     [DataMember]
     public DataType DataType { get; set; }
Index: branches/OKB (trunk integration)/HeuristicLab.Services.OKB/3.3/Query/DataTransfer/ProblemClass.cs
===================================================================
--- branches/OKB (trunk integration)/HeuristicLab.Services.OKB/3.3/Query/DataTransfer/ProblemClass.cs	(revision 5482)
+++ 	(revision )
@@ -1,32 +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.Runtime.Serialization;
-
-namespace HeuristicLab.Services.OKB.Query.DataTransfer {
-  [DataContract]
-  public class ProblemClass {
-    [DataMember]
-    public string Name { get; set; }
-    [DataMember]
-    public string Description { get; set; }
-  }
-}
Index: branches/OKB (trunk integration)/HeuristicLab.Services.OKB/3.3/Query/Filters/AlgorithmClassNameFilter.cs
===================================================================
--- branches/OKB (trunk integration)/HeuristicLab.Services.OKB/3.3/Query/Filters/AlgorithmClassNameFilter.cs	(revision 5482)
+++ branches/OKB (trunk integration)/HeuristicLab.Services.OKB/3.3/Query/Filters/AlgorithmClassNameFilter.cs	(revision 5502)
@@ -21,4 +21,5 @@
 
 using System;
+using System.Data.Linq.SqlClient;
 using System.Linq.Expressions;
 using HeuristicLab.Services.OKB.DataAccess;
@@ -33,11 +34,15 @@
         switch (Comparison) {
           case DataTransfer.StringComparison.Equal:
-            return x => x.Experiment.Algorithm.AlgorithmClass.Name == Value;
+            return x => x.Algorithm.AlgorithmClass.Name == Value;
           case DataTransfer.StringComparison.NotEqual:
-            return x => x.Experiment.Algorithm.AlgorithmClass.Name != Value;
+            return x => x.Algorithm.AlgorithmClass.Name != Value;
           case DataTransfer.StringComparison.Contains:
-            return x => x.Experiment.Algorithm.AlgorithmClass.Name.Contains(Value);
+            return x => x.Algorithm.AlgorithmClass.Name.Contains(Value);
           case DataTransfer.StringComparison.NotContains:
-            return x => !x.Experiment.Algorithm.AlgorithmClass.Name.Contains(Value);
+            return x => !x.Algorithm.AlgorithmClass.Name.Contains(Value);
+          case DataTransfer.StringComparison.Like:
+            return x => SqlMethods.Like(x.Algorithm.AlgorithmClass.Name, Value);
+          case DataTransfer.StringComparison.NotLike:
+            return x => !SqlMethods.Like(x.Algorithm.AlgorithmClass.Name, Value);
           default:
             return x => true;
@@ -50,5 +55,5 @@
       Value = value;
     }
-    public AlgorithmClassNameFilter(DataTransfer.SetComparisonStringFilter filter) {
+    public AlgorithmClassNameFilter(DataTransfer.StringComparisonFilter filter) {
       Comparison = filter.Comparison;
       Value = filter.Value;
Index: branches/OKB (trunk integration)/HeuristicLab.Services.OKB/3.3/Query/Filters/AlgorithmDataDataTypeNameFilter.cs
===================================================================
--- branches/OKB (trunk integration)/HeuristicLab.Services.OKB/3.3/Query/Filters/AlgorithmDataDataTypeNameFilter.cs	(revision 5482)
+++ 	(revision )
@@ -1,57 +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.Linq.Expressions;
-using HeuristicLab.Services.OKB.DataAccess;
-
-namespace HeuristicLab.Services.OKB.Query.Filters {
-  public class AlgorithmDataDataTypeNameFilter : IFilter {
-    public DataTransfer.StringComparison Comparison { get; set; }
-    public string Value { get; set; }
-
-    public Expression<Func<Run, bool>> Expression {
-      get {
-        switch (Comparison) {
-          case DataTransfer.StringComparison.Equal:
-            return x => (x.Experiment.Algorithm.AlgorithmData.DataType.Name == Value) || (x.Experiment.Algorithm.AlgorithmData.DataType.TypeName == Value);
-          case DataTransfer.StringComparison.NotEqual:
-            return x => (x.Experiment.Algorithm.AlgorithmData.DataType.Name != Value) && (x.Experiment.Algorithm.AlgorithmData.DataType.TypeName != Value);
-          case DataTransfer.StringComparison.Contains:
-            return x => x.Experiment.Algorithm.AlgorithmData.DataType.Name.Contains(Value) || x.Experiment.Algorithm.AlgorithmData.DataType.TypeName.Contains(Value);
-          case DataTransfer.StringComparison.NotContains:
-            return x => !x.Experiment.Algorithm.AlgorithmData.DataType.Name.Contains(Value) && !x.Experiment.Algorithm.AlgorithmData.DataType.TypeName.Contains(Value);
-          default:
-            return x => true;
-        }
-      }
-    }
-
-    public AlgorithmDataDataTypeNameFilter(DataTransfer.StringComparison comparison, string value) {
-      Comparison = comparison;
-      Value = value;
-    }
-    public AlgorithmDataDataTypeNameFilter(DataTransfer.SetComparisonStringFilter filter) {
-      Comparison = filter.Comparison;
-      Value = filter.Value;
-    }
-  }
-}
Index: branches/OKB (trunk integration)/HeuristicLab.Services.OKB/3.3/Query/Filters/AlgorithmDataTypeNameFilter.cs
===================================================================
--- branches/OKB (trunk integration)/HeuristicLab.Services.OKB/3.3/Query/Filters/AlgorithmDataTypeNameFilter.cs	(revision 5502)
+++ branches/OKB (trunk integration)/HeuristicLab.Services.OKB/3.3/Query/Filters/AlgorithmDataTypeNameFilter.cs	(revision 5502)
@@ -0,0 +1,62 @@
+﻿#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.Data.Linq.SqlClient;
+using System.Linq.Expressions;
+using HeuristicLab.Services.OKB.DataAccess;
+
+namespace HeuristicLab.Services.OKB.Query.Filters {
+  public class AlgorithmDataTypeNameFilter : IFilter {
+    public DataTransfer.StringComparison Comparison { get; set; }
+    public string Value { get; set; }
+
+    public Expression<Func<Run, bool>> Expression {
+      get {
+        switch (Comparison) {
+          case DataTransfer.StringComparison.Equal:
+            return x => x.Algorithm.DataType.Name == Value;
+          case DataTransfer.StringComparison.NotEqual:
+            return x => x.Algorithm.DataType.Name != Value;
+          case DataTransfer.StringComparison.Contains:
+            return x => x.Algorithm.DataType.Name.Contains(Value);
+          case DataTransfer.StringComparison.NotContains:
+            return x => !x.Algorithm.DataType.Name.Contains(Value);
+          case DataTransfer.StringComparison.Like:
+            return x => SqlMethods.Like(x.Algorithm.DataType.Name, Value);
+          case DataTransfer.StringComparison.NotLike:
+            return x => !SqlMethods.Like(x.Algorithm.DataType.Name, Value);
+          default:
+            return x => true;
+        }
+      }
+    }
+
+    public AlgorithmDataTypeNameFilter(DataTransfer.StringComparison comparison, string value) {
+      Comparison = comparison;
+      Value = value;
+    }
+    public AlgorithmDataTypeNameFilter(DataTransfer.StringComparisonFilter filter) {
+      Comparison = filter.Comparison;
+      Value = filter.Value;
+    }
+  }
+}
Index: branches/OKB (trunk integration)/HeuristicLab.Services.OKB/3.3/Query/Filters/AlgorithmNameFilter.cs
===================================================================
--- branches/OKB (trunk integration)/HeuristicLab.Services.OKB/3.3/Query/Filters/AlgorithmNameFilter.cs	(revision 5482)
+++ branches/OKB (trunk integration)/HeuristicLab.Services.OKB/3.3/Query/Filters/AlgorithmNameFilter.cs	(revision 5502)
@@ -21,4 +21,5 @@
 
 using System;
+using System.Data.Linq.SqlClient;
 using System.Linq.Expressions;
 using HeuristicLab.Services.OKB.DataAccess;
@@ -33,11 +34,15 @@
         switch (Comparison) {
           case DataTransfer.StringComparison.Equal:
-            return x => x.Experiment.Algorithm.Name == Value;
+            return x => x.Algorithm.Name == Value;
           case DataTransfer.StringComparison.NotEqual:
-            return x => x.Experiment.Algorithm.Name != Value;
+            return x => x.Algorithm.Name != Value;
           case DataTransfer.StringComparison.Contains:
-            return x => x.Experiment.Algorithm.Name.Contains(Value);
+            return x => x.Algorithm.Name.Contains(Value);
           case DataTransfer.StringComparison.NotContains:
-            return x => !x.Experiment.Algorithm.Name.Contains(Value);
+            return x => !x.Algorithm.Name.Contains(Value);
+          case DataTransfer.StringComparison.Like:
+            return x => SqlMethods.Like(x.Algorithm.Name, Value);
+          case DataTransfer.StringComparison.NotLike:
+            return x => !SqlMethods.Like(x.Algorithm.Name, Value);
           default:
             return x => true;
@@ -50,5 +55,5 @@
       Value = value;
     }
-    public AlgorithmNameFilter(DataTransfer.SetComparisonStringFilter filter) {
+    public AlgorithmNameFilter(DataTransfer.StringComparisonFilter filter) {
       Comparison = filter.Comparison;
       Value = filter.Value;
Index: branches/OKB (trunk integration)/HeuristicLab.Services.OKB/3.3/Query/Filters/AlgorithmParameterBlobValueDataTypeNameFilter.cs
===================================================================
--- branches/OKB (trunk integration)/HeuristicLab.Services.OKB/3.3/Query/Filters/AlgorithmParameterBlobValueDataTypeNameFilter.cs	(revision 5482)
+++ 	(revision )
@@ -1,60 +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.Linq.Expressions;
-using HeuristicLab.Services.OKB.DataAccess;
-
-namespace HeuristicLab.Services.OKB.Query.Filters {
-  public class AlgorithmParameterBlobValueDataTypeNameFilter : IFilter {
-    public string Name { get; protected set; }
-    public DataTransfer.StringComparison Comparison { get; set; }
-    public string Value { get; set; }
-
-    public Expression<Func<Run, bool>> Expression {
-      get {
-        switch (Comparison) {
-          case DataTransfer.StringComparison.Equal:
-            return x => x.Experiment.AlgorithmParameterBlobValues.Any(y => ((y.AlgorithmParameter.Name == Name) || (y.AlgorithmParameter.Alias == Name)) && ((y.DataType.Name == Value) || (y.DataType.TypeName == Value)));
-          case DataTransfer.StringComparison.NotEqual:
-            return x => x.Experiment.AlgorithmParameterBlobValues.Any(y => ((y.AlgorithmParameter.Name == Name) || (y.AlgorithmParameter.Alias == Name)) && ((y.DataType.Name != Value) && (!(y.DataType.TypeName != Value))));
-          case DataTransfer.StringComparison.Contains:
-            return x => x.Experiment.AlgorithmParameterBlobValues.Any(y => ((y.AlgorithmParameter.Name == Name) || (y.AlgorithmParameter.Alias == Name)) && (y.DataType.Name.Contains(Value) || y.DataType.TypeName.Contains(Value)));
-          case DataTransfer.StringComparison.NotContains:
-            return x => x.Experiment.AlgorithmParameterBlobValues.Any(y => ((y.AlgorithmParameter.Name == Name) || (y.AlgorithmParameter.Alias == Name)) && (!y.DataType.Name.Contains(Value) && !y.DataType.TypeName.Contains(Value)));
-          default:
-            return x => true;
-        }
-      }
-    }
-
-    public AlgorithmParameterBlobValueDataTypeNameFilter(string name, DataTransfer.StringComparison comparison, string value) {
-      Name = name;
-      Comparison = comparison;
-      Value = value;
-    }
-    public AlgorithmParameterBlobValueDataTypeNameFilter(DataTransfer.NameSetComparisonStringFilter filter) {
-      Name = filter.Name;
-      Comparison = filter.Comparison;
-      Value = filter.Value;
-    }
-  }
-}
Index: branches/OKB (trunk integration)/HeuristicLab.Services.OKB/3.3/Query/Filters/AlgorithmParameterBlobValueValueFilter.cs
===================================================================
--- branches/OKB (trunk integration)/HeuristicLab.Services.OKB/3.3/Query/Filters/AlgorithmParameterBlobValueValueFilter.cs	(revision 5482)
+++ 	(revision )
@@ -1,56 +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.Linq.Expressions;
-using HeuristicLab.Services.OKB.DataAccess;
-
-namespace HeuristicLab.Services.OKB.Query.Filters {
-  public class AlgorithmParameterBlobValueValueFilter : IFilter {
-    public string Name { get; protected set; }
-    public DataTransfer.EqualityComparison Comparison { get; set; }
-    public byte[] Value { get; set; }
-
-    public Expression<Func<Run, bool>> Expression {
-      get {
-        switch (Comparison) {
-          case DataTransfer.EqualityComparison.Equal:
-            return x => x.Experiment.AlgorithmParameterBlobValues.Any(y => ((y.AlgorithmParameter.Name == Name) || (y.AlgorithmParameter.Alias == Name)) && (y.Value == Value));
-          case DataTransfer.EqualityComparison.NotEqual:
-            return x => x.Experiment.AlgorithmParameterBlobValues.Any(y => ((y.AlgorithmParameter.Name == Name) || (y.AlgorithmParameter.Alias == Name)) && (y.Value != Value));
-          default:
-            return x => true;
-        }
-      }
-    }
-
-    public AlgorithmParameterBlobValueValueFilter(string name, DataTransfer.EqualityComparison comparison, byte[] value) {
-      Name = name;
-      Comparison = comparison;
-      Value = value;
-    }
-    public AlgorithmParameterBlobValueValueFilter(DataTransfer.NameEqualityComparisonByteArrayFilter filter) {
-      Name = filter.Name;
-      Comparison = filter.Comparison;
-      Value = filter.Value;
-    }
-  }
-}
Index: branches/OKB (trunk integration)/HeuristicLab.Services.OKB/3.3/Query/Filters/AlgorithmParameterBoolValueValueFilter.cs
===================================================================
--- branches/OKB (trunk integration)/HeuristicLab.Services.OKB/3.3/Query/Filters/AlgorithmParameterBoolValueValueFilter.cs	(revision 5482)
+++ 	(revision )
@@ -1,56 +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.Linq.Expressions;
-using HeuristicLab.Services.OKB.DataAccess;
-
-namespace HeuristicLab.Services.OKB.Query.Filters {
-  public class AlgorithmParameterBoolValueValueFilter : IFilter {
-    public string Name { get; protected set; }
-    public DataTransfer.EqualityComparison Comparison { get; set; }
-    public bool Value { get; set; }
-
-    public Expression<Func<Run, bool>> Expression {
-      get {
-        switch (Comparison) {
-          case DataTransfer.EqualityComparison.Equal:
-            return x => x.Experiment.AlgorithmParameterBoolValues.Any(y => ((y.AlgorithmParameter.Name == Name) || (y.AlgorithmParameter.Alias == Name)) && (y.Value == Value));
-          case DataTransfer.EqualityComparison.NotEqual:
-            return x => x.Experiment.AlgorithmParameterBoolValues.Any(y => ((y.AlgorithmParameter.Name == Name) || (y.AlgorithmParameter.Alias == Name)) && (y.Value != Value));
-          default:
-            return x => true;
-        }
-      }
-    }
-
-    public AlgorithmParameterBoolValueValueFilter(string name, DataTransfer.EqualityComparison comparison, bool value) {
-      Name = name;
-      Comparison = comparison;
-      Value = value;
-    }
-    public AlgorithmParameterBoolValueValueFilter(DataTransfer.NameEqualityComparisonBoolFilter filter) {
-      Name = filter.Name;
-      Comparison = filter.Comparison;
-      Value = filter.Value;
-    }
-  }
-}
Index: branches/OKB (trunk integration)/HeuristicLab.Services.OKB/3.3/Query/Filters/AlgorithmParameterFloatValueValueFilter.cs
===================================================================
--- branches/OKB (trunk integration)/HeuristicLab.Services.OKB/3.3/Query/Filters/AlgorithmParameterFloatValueValueFilter.cs	(revision 5482)
+++ 	(revision )
@@ -1,64 +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.Linq.Expressions;
-using HeuristicLab.Services.OKB.DataAccess;
-
-namespace HeuristicLab.Services.OKB.Query.Filters {
-  public class AlgorithmParameterFloatValueValueFilter : IFilter {
-    public string Name { get; protected set; }
-    public DataTransfer.OrdinalComparison Comparison { get; set; }
-    public double Value { get; set; }
-
-    public Expression<Func<Run, bool>> Expression {
-      get {
-        switch (Comparison) {
-          case DataTransfer.OrdinalComparison.Less:
-            return x => x.Experiment.AlgorithmParameterFloatValues.Any(y => ((y.AlgorithmParameter.Name == Name) || (y.AlgorithmParameter.Alias == Name)) && (y.Value < Value));
-          case DataTransfer.OrdinalComparison.LessOrEqual:
-            return x => x.Experiment.AlgorithmParameterFloatValues.Any(y => ((y.AlgorithmParameter.Name == Name) || (y.AlgorithmParameter.Alias == Name)) && (y.Value <= Value));
-          case DataTransfer.OrdinalComparison.Equal:
-            return x => x.Experiment.AlgorithmParameterFloatValues.Any(y => ((y.AlgorithmParameter.Name == Name) || (y.AlgorithmParameter.Alias == Name)) && (y.Value == Value));
-          case DataTransfer.OrdinalComparison.GreaterOrEqual:
-            return x => x.Experiment.AlgorithmParameterFloatValues.Any(y => ((y.AlgorithmParameter.Name == Name) || (y.AlgorithmParameter.Alias == Name)) && (y.Value >= Value));
-          case DataTransfer.OrdinalComparison.Greater:
-            return x => x.Experiment.AlgorithmParameterFloatValues.Any(y => ((y.AlgorithmParameter.Name == Name) || (y.AlgorithmParameter.Alias == Name)) && (y.Value > Value));
-          case DataTransfer.OrdinalComparison.NotEqual:
-            return x => x.Experiment.AlgorithmParameterFloatValues.Any(y => ((y.AlgorithmParameter.Name == Name) || (y.AlgorithmParameter.Alias == Name)) && (y.Value != Value));
-          default:
-            return x => true;
-        }
-      }
-    }
-
-    public AlgorithmParameterFloatValueValueFilter(string name, DataTransfer.OrdinalComparison comparison, double value) {
-      Name = name;
-      Comparison = comparison;
-      Value = value;
-    }
-    public AlgorithmParameterFloatValueValueFilter(DataTransfer.NameOrdinalComparisonDoubleFilter filter) {
-      Name = filter.Name;
-      Comparison = filter.Comparison;
-      Value = filter.Value;
-    }
-  }
-}
Index: branches/OKB (trunk integration)/HeuristicLab.Services.OKB/3.3/Query/Filters/AlgorithmParameterIntValueValueFilter.cs
===================================================================
--- branches/OKB (trunk integration)/HeuristicLab.Services.OKB/3.3/Query/Filters/AlgorithmParameterIntValueValueFilter.cs	(revision 5482)
+++ 	(revision )
@@ -1,64 +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.Linq.Expressions;
-using HeuristicLab.Services.OKB.DataAccess;
-
-namespace HeuristicLab.Services.OKB.Query.Filters {
-  public class AlgorithmParameterIntValueValueFilter : IFilter {
-    public string Name { get; protected set; }
-    public DataTransfer.OrdinalComparison Comparison { get; set; }
-    public long Value { get; set; }
-
-    public Expression<Func<Run, bool>> Expression {
-      get {
-        switch (Comparison) {
-          case DataTransfer.OrdinalComparison.Less:
-            return x => x.Experiment.AlgorithmParameterIntValues.Any(y => ((y.AlgorithmParameter.Name == Name) || (y.AlgorithmParameter.Alias == Name)) && (y.Value < Value));
-          case DataTransfer.OrdinalComparison.LessOrEqual:
-            return x => x.Experiment.AlgorithmParameterIntValues.Any(y => ((y.AlgorithmParameter.Name == Name) || (y.AlgorithmParameter.Alias == Name)) && (y.Value <= Value));
-          case DataTransfer.OrdinalComparison.Equal:
-            return x => x.Experiment.AlgorithmParameterIntValues.Any(y => ((y.AlgorithmParameter.Name == Name) || (y.AlgorithmParameter.Alias == Name)) && (y.Value == Value));
-          case DataTransfer.OrdinalComparison.GreaterOrEqual:
-            return x => x.Experiment.AlgorithmParameterIntValues.Any(y => ((y.AlgorithmParameter.Name == Name) || (y.AlgorithmParameter.Alias == Name)) && (y.Value >= Value));
-          case DataTransfer.OrdinalComparison.Greater:
-            return x => x.Experiment.AlgorithmParameterIntValues.Any(y => ((y.AlgorithmParameter.Name == Name) || (y.AlgorithmParameter.Alias == Name)) && (y.Value > Value));
-          case DataTransfer.OrdinalComparison.NotEqual:
-            return x => x.Experiment.AlgorithmParameterIntValues.Any(y => ((y.AlgorithmParameter.Name == Name) || (y.AlgorithmParameter.Alias == Name)) && (y.Value != Value));
-          default:
-            return x => true;
-        }
-      }
-    }
-
-    public AlgorithmParameterIntValueValueFilter(string name, DataTransfer.OrdinalComparison comparison, long value) {
-      Name = name;
-      Comparison = comparison;
-      Value = value;
-    }
-    public AlgorithmParameterIntValueValueFilter(DataTransfer.NameOrdinalComparisonLongFilter filter) {
-      Name = filter.Name;
-      Comparison = filter.Comparison;
-      Value = filter.Value;
-    }
-  }
-}
Index: branches/OKB (trunk integration)/HeuristicLab.Services.OKB/3.3/Query/Filters/AlgorithmParameterNameFilter.cs
===================================================================
--- branches/OKB (trunk integration)/HeuristicLab.Services.OKB/3.3/Query/Filters/AlgorithmParameterNameFilter.cs	(revision 5482)
+++ 	(revision )
@@ -1,57 +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.Linq.Expressions;
-using HeuristicLab.Services.OKB.DataAccess;
-
-namespace HeuristicLab.Services.OKB.Query.Filters {
-  public class AlgorithmParameterNameFilter : IFilter {
-    public DataTransfer.StringComparison Comparison { get; set; }
-    public string Value { get; set; }
-
-    public Expression<Func<Run, bool>> Expression {
-      get {
-        switch (Comparison) {
-          case DataTransfer.StringComparison.Equal:
-            return x => x.Experiment.Algorithm.AlgorithmParameters.Any(y => (y.Name == Value) || (y.Alias == Value));
-          case DataTransfer.StringComparison.NotEqual:
-            return x => x.Experiment.Algorithm.AlgorithmParameters.All(y => (y.Name != Value) && (y.Alias != Value));
-          case DataTransfer.StringComparison.Contains:
-            return x => x.Experiment.Algorithm.AlgorithmParameters.Any(y => y.Name.Contains(Value) || y.Alias.Contains(Value));
-          case DataTransfer.StringComparison.NotContains:
-            return x => x.Experiment.Algorithm.AlgorithmParameters.All(y => !y.Name.Contains(Value) && !y.Alias.Contains(Value));
-          default:
-            return x => true;
-        }
-      }
-    }
-
-    public AlgorithmParameterNameFilter(DataTransfer.StringComparison comparison, string value) {
-      Comparison = comparison;
-      Value = value;
-    }
-    public AlgorithmParameterNameFilter(DataTransfer.SetComparisonStringFilter filter) {
-      Comparison = filter.Comparison;
-      Value = filter.Value;
-    }
-  }
-}
Index: branches/OKB (trunk integration)/HeuristicLab.Services.OKB/3.3/Query/Filters/AlgorithmParameterStringValueValueFilter.cs
===================================================================
--- branches/OKB (trunk integration)/HeuristicLab.Services.OKB/3.3/Query/Filters/AlgorithmParameterStringValueValueFilter.cs	(revision 5482)
+++ 	(revision )
@@ -1,60 +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.Linq.Expressions;
-using HeuristicLab.Services.OKB.DataAccess;
-
-namespace HeuristicLab.Services.OKB.Query.Filters {
-  public class AlgorithmParameterStringValueValueFilter : IFilter {
-    public string Name { get; protected set; }
-    public DataTransfer.StringComparison Comparison { get; set; }
-    public string Value { get; set; }
-
-    public Expression<Func<Run, bool>> Expression {
-      get {
-        switch (Comparison) {
-          case DataTransfer.StringComparison.Equal:
-            return x => x.Experiment.AlgorithmParameterStringValues.Any(y => ((y.AlgorithmParameter.Name == Name) || (y.AlgorithmParameter.Alias == Name)) && (y.Value == Value));
-          case DataTransfer.StringComparison.NotEqual:
-            return x => x.Experiment.AlgorithmParameterStringValues.Any(y => ((y.AlgorithmParameter.Name == Name) || (y.AlgorithmParameter.Alias == Name)) && (y.Value != Value));
-          case DataTransfer.StringComparison.Contains:
-            return x => x.Experiment.AlgorithmParameterStringValues.Any(y => ((y.AlgorithmParameter.Name == Name) || (y.AlgorithmParameter.Alias == Name)) && y.Value.Contains(Value));
-          case DataTransfer.StringComparison.NotContains:
-            return x => x.Experiment.AlgorithmParameterStringValues.Any(y => ((y.AlgorithmParameter.Name == Name) || (y.AlgorithmParameter.Alias == Name)) && !y.Value.Contains(Value));
-          default:
-            return x => true;
-        }
-      }
-    }
-
-    public AlgorithmParameterStringValueValueFilter(string name, DataTransfer.StringComparison comparison, string value) {
-      Name = name;
-      Comparison = comparison;
-      Value = value;
-    }
-    public AlgorithmParameterStringValueValueFilter(DataTransfer.NameSetComparisonStringFilter filter) {
-      Name = filter.Name;
-      Comparison = filter.Comparison;
-      Value = filter.Value;
-    }
-  }
-}
Index: branches/OKB (trunk integration)/HeuristicLab.Services.OKB/3.3/Query/Filters/AlgorithmPlatformNameFilter.cs
===================================================================
--- branches/OKB (trunk integration)/HeuristicLab.Services.OKB/3.3/Query/Filters/AlgorithmPlatformNameFilter.cs	(revision 5482)
+++ branches/OKB (trunk integration)/HeuristicLab.Services.OKB/3.3/Query/Filters/AlgorithmPlatformNameFilter.cs	(revision 5502)
@@ -21,4 +21,5 @@
 
 using System;
+using System.Data.Linq.SqlClient;
 using System.Linq.Expressions;
 using HeuristicLab.Services.OKB.DataAccess;
@@ -33,11 +34,15 @@
         switch (Comparison) {
           case DataTransfer.StringComparison.Equal:
-            return x => x.Experiment.Algorithm.Platform.Name == Value;
+            return x => x.Algorithm.Platform.Name == Value;
           case DataTransfer.StringComparison.NotEqual:
-            return x => x.Experiment.Algorithm.Platform.Name != Value;
+            return x => x.Algorithm.Platform.Name != Value;
           case DataTransfer.StringComparison.Contains:
-            return x => x.Experiment.Algorithm.Platform.Name.Contains(Value);
+            return x => x.Algorithm.Platform.Name.Contains(Value);
           case DataTransfer.StringComparison.NotContains:
-            return x => !x.Experiment.Algorithm.Platform.Name.Contains(Value);
+            return x => !x.Algorithm.Platform.Name.Contains(Value);
+          case DataTransfer.StringComparison.Like:
+            return x => SqlMethods.Like(x.Algorithm.Platform.Name, Value);
+          case DataTransfer.StringComparison.NotLike:
+            return x => !SqlMethods.Like(x.Algorithm.Platform.Name, Value);
           default:
             return x => true;
@@ -50,5 +55,5 @@
       Value = value;
     }
-    public AlgorithmPlatformNameFilter(DataTransfer.SetComparisonStringFilter filter) {
+    public AlgorithmPlatformNameFilter(DataTransfer.StringComparisonFilter filter) {
       Comparison = filter.Comparison;
       Value = filter.Value;
Index: branches/OKB (trunk integration)/HeuristicLab.Services.OKB/3.3/Query/Filters/AndFilter.cs
===================================================================
--- branches/OKB (trunk integration)/HeuristicLab.Services.OKB/3.3/Query/Filters/AndFilter.cs	(revision 5482)
+++ branches/OKB (trunk integration)/HeuristicLab.Services.OKB/3.3/Query/Filters/AndFilter.cs	(revision 5502)
@@ -22,4 +22,5 @@
 using System;
 using System.Collections.Generic;
+using System.Linq;
 using System.Linq.Expressions;
 using HeuristicLab.Services.OKB.DataAccess;
Index: branches/OKB (trunk integration)/HeuristicLab.Services.OKB/3.3/Query/Filters/BinaryValueFilter.cs
===================================================================
--- branches/OKB (trunk integration)/HeuristicLab.Services.OKB/3.3/Query/Filters/BinaryValueFilter.cs	(revision 5502)
+++ branches/OKB (trunk integration)/HeuristicLab.Services.OKB/3.3/Query/Filters/BinaryValueFilter.cs	(revision 5502)
@@ -0,0 +1,57 @@
+﻿#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.Linq;
+using System.Linq.Expressions;
+using HeuristicLab.Services.OKB.DataAccess;
+
+namespace HeuristicLab.Services.OKB.Query.Filters {
+  public class BinaryValueFilter : IFilter {
+    public string Name { get; protected set; }
+    public DataTransfer.EqualityComparison Comparison { get; set; }
+    public byte[] Value { get; set; }
+
+    public Expression<Func<Run, bool>> Expression {
+      get {
+        switch (Comparison) {
+          case DataTransfer.EqualityComparison.Equal:
+            return x => x.Values.Any(y => (y.ValueName.Name == Name) && (y.BinaryData.Data == Value));
+          case DataTransfer.EqualityComparison.NotEqual:
+            return x => x.Values.Any(y => (y.ValueName.Name == Name) && (y.BinaryData.Data != Value));
+          default:
+            return x => true;
+        }
+      }
+    }
+
+    public BinaryValueFilter(string name, DataTransfer.EqualityComparison comparison, byte[] value) {
+      Name = name;
+      Comparison = comparison;
+      Value = value;
+    }
+    public BinaryValueFilter(DataTransfer.NameEqualityComparisonByteArrayFilter filter) {
+      Name = filter.Name;
+      Comparison = filter.Comparison;
+      Value = filter.Value;
+    }
+  }
+}
Index: branches/OKB (trunk integration)/HeuristicLab.Services.OKB/3.3/Query/Filters/BoolValueFilter.cs
===================================================================
--- branches/OKB (trunk integration)/HeuristicLab.Services.OKB/3.3/Query/Filters/BoolValueFilter.cs	(revision 5502)
+++ branches/OKB (trunk integration)/HeuristicLab.Services.OKB/3.3/Query/Filters/BoolValueFilter.cs	(revision 5502)
@@ -0,0 +1,57 @@
+﻿#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.Linq;
+using System.Linq.Expressions;
+using HeuristicLab.Services.OKB.DataAccess;
+
+namespace HeuristicLab.Services.OKB.Query.Filters {
+  public class BoolValueFilter : IFilter {
+    public string Name { get; protected set; }
+    public DataTransfer.EqualityComparison Comparison { get; set; }
+    public bool Value { get; set; }
+
+    public Expression<Func<Run, bool>> Expression {
+      get {
+        switch (Comparison) {
+          case DataTransfer.EqualityComparison.Equal:
+            return x => x.Values.Any(y => (y.ValueName.Name == Name) && (y.BoolValue == Value));
+          case DataTransfer.EqualityComparison.NotEqual:
+            return x => x.Values.Any(y => (y.ValueName.Name == Name) && (y.BoolValue != Value));
+          default:
+            return x => true;
+        }
+      }
+    }
+
+    public BoolValueFilter(string name, DataTransfer.EqualityComparison comparison, bool value) {
+      Name = name;
+      Comparison = comparison;
+      Value = value;
+    }
+    public BoolValueFilter(DataTransfer.NameEqualityComparisonBoolFilter filter) {
+      Name = filter.Name;
+      Comparison = filter.Comparison;
+      Value = filter.Value;
+    }
+  }
+}
Index: branches/OKB (trunk integration)/HeuristicLab.Services.OKB/3.3/Query/Filters/DoubleValueFilter.cs
===================================================================
--- branches/OKB (trunk integration)/HeuristicLab.Services.OKB/3.3/Query/Filters/DoubleValueFilter.cs	(revision 5502)
+++ branches/OKB (trunk integration)/HeuristicLab.Services.OKB/3.3/Query/Filters/DoubleValueFilter.cs	(revision 5502)
@@ -0,0 +1,65 @@
+﻿#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.Linq;
+using System.Linq.Expressions;
+using HeuristicLab.Services.OKB.DataAccess;
+
+namespace HeuristicLab.Services.OKB.Query.Filters {
+  public class DoubleValueFilter : IFilter {
+    public string Name { get; protected set; }
+    public DataTransfer.OrdinalComparison Comparison { get; set; }
+    public double Value { get; set; }
+
+    public Expression<Func<Run, bool>> Expression {
+      get {
+        switch (Comparison) {
+          case DataTransfer.OrdinalComparison.Less:
+            return x => x.Values.Any(y => (y.ValueName.Name == Name) && (y.DoubleValue < Value));
+          case DataTransfer.OrdinalComparison.LessOrEqual:
+            return x => x.Values.Any(y => (y.ValueName.Name == Name) && (y.DoubleValue <= Value));
+          case DataTransfer.OrdinalComparison.Equal:
+            return x => x.Values.Any(y => (y.ValueName.Name == Name) && (y.DoubleValue == Value));
+          case DataTransfer.OrdinalComparison.GreaterOrEqual:
+            return x => x.Values.Any(y => (y.ValueName.Name == Name) && (y.DoubleValue >= Value));
+          case DataTransfer.OrdinalComparison.Greater:
+            return x => x.Values.Any(y => (y.ValueName.Name == Name) && (y.DoubleValue > Value));
+          case DataTransfer.OrdinalComparison.NotEqual:
+            return x => x.Values.Any(y => (y.ValueName.Name == Name) && (y.DoubleValue != Value));
+          default:
+            return x => true;
+        }
+      }
+    }
+
+    public DoubleValueFilter(string name, DataTransfer.OrdinalComparison comparison, double value) {
+      Name = name;
+      Comparison = comparison;
+      Value = value;
+    }
+    public DoubleValueFilter(DataTransfer.NameOrdinalComparisonDoubleFilter filter) {
+      Name = filter.Name;
+      Comparison = filter.Comparison;
+      Value = filter.Value;
+    }
+  }
+}
Index: branches/OKB (trunk integration)/HeuristicLab.Services.OKB/3.3/Query/Filters/FloatValueFilter.cs
===================================================================
--- branches/OKB (trunk integration)/HeuristicLab.Services.OKB/3.3/Query/Filters/FloatValueFilter.cs	(revision 5502)
+++ branches/OKB (trunk integration)/HeuristicLab.Services.OKB/3.3/Query/Filters/FloatValueFilter.cs	(revision 5502)
@@ -0,0 +1,65 @@
+﻿#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.Linq;
+using System.Linq.Expressions;
+using HeuristicLab.Services.OKB.DataAccess;
+
+namespace HeuristicLab.Services.OKB.Query.Filters {
+  public class FloatValueFilter : IFilter {
+    public string Name { get; protected set; }
+    public DataTransfer.OrdinalComparison Comparison { get; set; }
+    public float Value { get; set; }
+
+    public Expression<Func<Run, bool>> Expression {
+      get {
+        switch (Comparison) {
+          case DataTransfer.OrdinalComparison.Less:
+            return x => x.Values.Any(y => (y.ValueName.Name == Name) && (y.FloatValue < Value));
+          case DataTransfer.OrdinalComparison.LessOrEqual:
+            return x => x.Values.Any(y => (y.ValueName.Name == Name) && (y.FloatValue <= Value));
+          case DataTransfer.OrdinalComparison.Equal:
+            return x => x.Values.Any(y => (y.ValueName.Name == Name) && (y.FloatValue == Value));
+          case DataTransfer.OrdinalComparison.GreaterOrEqual:
+            return x => x.Values.Any(y => (y.ValueName.Name == Name) && (y.FloatValue >= Value));
+          case DataTransfer.OrdinalComparison.Greater:
+            return x => x.Values.Any(y => (y.ValueName.Name == Name) && (y.FloatValue > Value));
+          case DataTransfer.OrdinalComparison.NotEqual:
+            return x => x.Values.Any(y => (y.ValueName.Name == Name) && (y.FloatValue != Value));
+          default:
+            return x => true;
+        }
+      }
+    }
+
+    public FloatValueFilter(string name, DataTransfer.OrdinalComparison comparison, float value) {
+      Name = name;
+      Comparison = comparison;
+      Value = value;
+    }
+    public FloatValueFilter(DataTransfer.NameOrdinalComparisonFloatFilter filter) {
+      Name = filter.Name;
+      Comparison = filter.Comparison;
+      Value = filter.Value;
+    }
+  }
+}
Index: branches/OKB (trunk integration)/HeuristicLab.Services.OKB/3.3/Query/Filters/IntValueFilter.cs
===================================================================
--- branches/OKB (trunk integration)/HeuristicLab.Services.OKB/3.3/Query/Filters/IntValueFilter.cs	(revision 5502)
+++ branches/OKB (trunk integration)/HeuristicLab.Services.OKB/3.3/Query/Filters/IntValueFilter.cs	(revision 5502)
@@ -0,0 +1,65 @@
+﻿#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.Linq;
+using System.Linq.Expressions;
+using HeuristicLab.Services.OKB.DataAccess;
+
+namespace HeuristicLab.Services.OKB.Query.Filters {
+  public class IntValueFilter : IFilter {
+    public string Name { get; protected set; }
+    public DataTransfer.OrdinalComparison Comparison { get; set; }
+    public int Value { get; set; }
+
+    public Expression<Func<Run, bool>> Expression {
+      get {
+        switch (Comparison) {
+          case DataTransfer.OrdinalComparison.Less:
+            return x => x.Values.Any(y => (y.ValueName.Name == Name) && (y.IntValue < Value));
+          case DataTransfer.OrdinalComparison.LessOrEqual:
+            return x => x.Values.Any(y => (y.ValueName.Name == Name) && (y.IntValue <= Value));
+          case DataTransfer.OrdinalComparison.Equal:
+            return x => x.Values.Any(y => (y.ValueName.Name == Name) && (y.IntValue == Value));
+          case DataTransfer.OrdinalComparison.GreaterOrEqual:
+            return x => x.Values.Any(y => (y.ValueName.Name == Name) && (y.IntValue >= Value));
+          case DataTransfer.OrdinalComparison.Greater:
+            return x => x.Values.Any(y => (y.ValueName.Name == Name) && (y.IntValue > Value));
+          case DataTransfer.OrdinalComparison.NotEqual:
+            return x => x.Values.Any(y => (y.ValueName.Name == Name) && (y.IntValue != Value));
+          default:
+            return x => true;
+        }
+      }
+    }
+
+    public IntValueFilter(string name, DataTransfer.OrdinalComparison comparison, int value) {
+      Name = name;
+      Comparison = comparison;
+      Value = value;
+    }
+    public IntValueFilter(DataTransfer.NameOrdinalComparisonIntFilter filter) {
+      Name = filter.Name;
+      Comparison = filter.Comparison;
+      Value = filter.Value;
+    }
+  }
+}
Index: branches/OKB (trunk integration)/HeuristicLab.Services.OKB/3.3/Query/Filters/LongValueFilter.cs
===================================================================
--- branches/OKB (trunk integration)/HeuristicLab.Services.OKB/3.3/Query/Filters/LongValueFilter.cs	(revision 5502)
+++ branches/OKB (trunk integration)/HeuristicLab.Services.OKB/3.3/Query/Filters/LongValueFilter.cs	(revision 5502)
@@ -0,0 +1,65 @@
+﻿#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.Linq;
+using System.Linq.Expressions;
+using HeuristicLab.Services.OKB.DataAccess;
+
+namespace HeuristicLab.Services.OKB.Query.Filters {
+  public class LongValueFilter : IFilter {
+    public string Name { get; protected set; }
+    public DataTransfer.OrdinalComparison Comparison { get; set; }
+    public long Value { get; set; }
+
+    public Expression<Func<Run, bool>> Expression {
+      get {
+        switch (Comparison) {
+          case DataTransfer.OrdinalComparison.Less:
+            return x => x.Values.Any(y => (y.ValueName.Name == Name) && (y.LongValue < Value));
+          case DataTransfer.OrdinalComparison.LessOrEqual:
+            return x => x.Values.Any(y => (y.ValueName.Name == Name) && (y.LongValue <= Value));
+          case DataTransfer.OrdinalComparison.Equal:
+            return x => x.Values.Any(y => (y.ValueName.Name == Name) && (y.LongValue == Value));
+          case DataTransfer.OrdinalComparison.GreaterOrEqual:
+            return x => x.Values.Any(y => (y.ValueName.Name == Name) && (y.LongValue >= Value));
+          case DataTransfer.OrdinalComparison.Greater:
+            return x => x.Values.Any(y => (y.ValueName.Name == Name) && (y.LongValue > Value));
+          case DataTransfer.OrdinalComparison.NotEqual:
+            return x => x.Values.Any(y => (y.ValueName.Name == Name) && (y.LongValue != Value));
+          default:
+            return x => true;
+        }
+      }
+    }
+
+    public LongValueFilter(string name, DataTransfer.OrdinalComparison comparison, long value) {
+      Name = name;
+      Comparison = comparison;
+      Value = value;
+    }
+    public LongValueFilter(DataTransfer.NameOrdinalComparisonLongFilter filter) {
+      Name = filter.Name;
+      Comparison = filter.Comparison;
+      Value = filter.Value;
+    }
+  }
+}
Index: branches/OKB (trunk integration)/HeuristicLab.Services.OKB/3.3/Query/Filters/OrFilter.cs
===================================================================
--- branches/OKB (trunk integration)/HeuristicLab.Services.OKB/3.3/Query/Filters/OrFilter.cs	(revision 5482)
+++ branches/OKB (trunk integration)/HeuristicLab.Services.OKB/3.3/Query/Filters/OrFilter.cs	(revision 5502)
@@ -22,4 +22,5 @@
 using System;
 using System.Collections.Generic;
+using System.Linq;
 using System.Linq.Expressions;
 using HeuristicLab.Services.OKB.DataAccess;
Index: branches/OKB (trunk integration)/HeuristicLab.Services.OKB/3.3/Query/Filters/ProblemClassNameFilter.cs
===================================================================
--- branches/OKB (trunk integration)/HeuristicLab.Services.OKB/3.3/Query/Filters/ProblemClassNameFilter.cs	(revision 5482)
+++ branches/OKB (trunk integration)/HeuristicLab.Services.OKB/3.3/Query/Filters/ProblemClassNameFilter.cs	(revision 5502)
@@ -21,4 +21,5 @@
 
 using System;
+using System.Data.Linq.SqlClient;
 using System.Linq.Expressions;
 using HeuristicLab.Services.OKB.DataAccess;
@@ -33,11 +34,15 @@
         switch (Comparison) {
           case DataTransfer.StringComparison.Equal:
-            return x => x.Experiment.Problem.ProblemClass.Name == Value;
+            return x => x.Problem.ProblemClass.Name == Value;
           case DataTransfer.StringComparison.NotEqual:
-            return x => x.Experiment.Problem.ProblemClass.Name != Value;
+            return x => x.Problem.ProblemClass.Name != Value;
           case DataTransfer.StringComparison.Contains:
-            return x => x.Experiment.Problem.ProblemClass.Name.Contains(Value);
+            return x => x.Problem.ProblemClass.Name.Contains(Value);
           case DataTransfer.StringComparison.NotContains:
-            return x => !x.Experiment.Problem.ProblemClass.Name.Contains(Value);
+            return x => !x.Problem.ProblemClass.Name.Contains(Value);
+          case DataTransfer.StringComparison.Like:
+            return x => SqlMethods.Like(x.Problem.ProblemClass.Name, Value);
+          case DataTransfer.StringComparison.NotLike:
+            return x => !SqlMethods.Like(x.Problem.ProblemClass.Name, Value);
           default:
             return x => true;
@@ -50,5 +55,5 @@
       Value = value;
     }
-    public ProblemClassNameFilter(DataTransfer.SetComparisonStringFilter filter) {
+    public ProblemClassNameFilter(DataTransfer.StringComparisonFilter filter) {
       Comparison = filter.Comparison;
       Value = filter.Value;
Index: branches/OKB (trunk integration)/HeuristicLab.Services.OKB/3.3/Query/Filters/ProblemDataDataTypeNameFilter.cs
===================================================================
--- branches/OKB (trunk integration)/HeuristicLab.Services.OKB/3.3/Query/Filters/ProblemDataDataTypeNameFilter.cs	(revision 5482)
+++ 	(revision )
@@ -1,57 +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.Linq.Expressions;
-using HeuristicLab.Services.OKB.DataAccess;
-
-namespace HeuristicLab.Services.OKB.Query.Filters {
-  public class ProblemDataDataTypeNameFilter : IFilter {
-    public DataTransfer.StringComparison Comparison { get; set; }
-    public string Value { get; set; }
-
-    public Expression<Func<Run, bool>> Expression {
-      get {
-        switch (Comparison) {
-          case DataTransfer.StringComparison.Equal:
-            return x => (x.Experiment.Problem.ProblemData.DataType.Name == Value) || (x.Experiment.Problem.ProblemData.DataType.TypeName == Value);
-          case DataTransfer.StringComparison.NotEqual:
-            return x => (x.Experiment.Problem.ProblemData.DataType.Name != Value) && (x.Experiment.Problem.ProblemData.DataType.TypeName != Value);
-          case DataTransfer.StringComparison.Contains:
-            return x => x.Experiment.Problem.ProblemData.DataType.Name.Contains(Value) || x.Experiment.Problem.ProblemData.DataType.TypeName.Contains(Value);
-          case DataTransfer.StringComparison.NotContains:
-            return x => !x.Experiment.Problem.ProblemData.DataType.Name.Contains(Value) && !x.Experiment.Problem.ProblemData.DataType.TypeName.Contains(Value);
-          default:
-            return x => true;
-        }
-      }
-    }
-
-    public ProblemDataDataTypeNameFilter(DataTransfer.StringComparison comparison, string value) {
-      Comparison = comparison;
-      Value = value;
-    }
-    public ProblemDataDataTypeNameFilter(DataTransfer.SetComparisonStringFilter filter) {
-      Comparison = filter.Comparison;
-      Value = filter.Value;
-    }
-  }
-}
Index: branches/OKB (trunk integration)/HeuristicLab.Services.OKB/3.3/Query/Filters/ProblemDataTypeNameFilter.cs
===================================================================
--- branches/OKB (trunk integration)/HeuristicLab.Services.OKB/3.3/Query/Filters/ProblemDataTypeNameFilter.cs	(revision 5502)
+++ branches/OKB (trunk integration)/HeuristicLab.Services.OKB/3.3/Query/Filters/ProblemDataTypeNameFilter.cs	(revision 5502)
@@ -0,0 +1,62 @@
+﻿#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.Data.Linq.SqlClient;
+using System.Linq.Expressions;
+using HeuristicLab.Services.OKB.DataAccess;
+
+namespace HeuristicLab.Services.OKB.Query.Filters {
+  public class ProblemDataTypeNameFilter : IFilter {
+    public DataTransfer.StringComparison Comparison { get; set; }
+    public string Value { get; set; }
+
+    public Expression<Func<Run, bool>> Expression {
+      get {
+        switch (Comparison) {
+          case DataTransfer.StringComparison.Equal:
+            return x => x.Problem.DataType.Name == Value;
+          case DataTransfer.StringComparison.NotEqual:
+            return x => x.Problem.DataType.Name != Value;
+          case DataTransfer.StringComparison.Contains:
+            return x => x.Problem.DataType.Name.Contains(Value);
+          case DataTransfer.StringComparison.NotContains:
+            return x => !x.Problem.DataType.Name.Contains(Value);
+          case DataTransfer.StringComparison.Like:
+            return x => SqlMethods.Like(x.Problem.DataType.Name, Value);
+          case DataTransfer.StringComparison.NotLike:
+            return x => !SqlMethods.Like(x.Problem.DataType.Name, Value);
+          default:
+            return x => true;
+        }
+      }
+    }
+
+    public ProblemDataTypeNameFilter(DataTransfer.StringComparison comparison, string value) {
+      Comparison = comparison;
+      Value = value;
+    }
+    public ProblemDataTypeNameFilter(DataTransfer.StringComparisonFilter filter) {
+      Comparison = filter.Comparison;
+      Value = filter.Value;
+    }
+  }
+}
Index: branches/OKB (trunk integration)/HeuristicLab.Services.OKB/3.3/Query/Filters/ProblemNameFilter.cs
===================================================================
--- branches/OKB (trunk integration)/HeuristicLab.Services.OKB/3.3/Query/Filters/ProblemNameFilter.cs	(revision 5482)
+++ branches/OKB (trunk integration)/HeuristicLab.Services.OKB/3.3/Query/Filters/ProblemNameFilter.cs	(revision 5502)
@@ -21,4 +21,5 @@
 
 using System;
+using System.Data.Linq.SqlClient;
 using System.Linq.Expressions;
 using HeuristicLab.Services.OKB.DataAccess;
@@ -33,11 +34,15 @@
         switch (Comparison) {
           case DataTransfer.StringComparison.Equal:
-            return x => x.Experiment.Problem.Name == Value;
+            return x => x.Problem.Name == Value;
           case DataTransfer.StringComparison.NotEqual:
-            return x => x.Experiment.Problem.Name != Value;
+            return x => x.Problem.Name != Value;
           case DataTransfer.StringComparison.Contains:
-            return x => x.Experiment.Problem.Name.Contains(Value);
+            return x => x.Problem.Name.Contains(Value);
           case DataTransfer.StringComparison.NotContains:
-            return x => !x.Experiment.Problem.Name.Contains(Value);
+            return x => !x.Problem.Name.Contains(Value);
+          case DataTransfer.StringComparison.Like:
+            return x => SqlMethods.Like(x.Problem.Name, Value);
+          case DataTransfer.StringComparison.NotLike:
+            return x => !SqlMethods.Like(x.Problem.Name, Value);
           default:
             return x => true;
@@ -50,5 +55,5 @@
       Value = value;
     }
-    public ProblemNameFilter(DataTransfer.SetComparisonStringFilter filter) {
+    public ProblemNameFilter(DataTransfer.StringComparisonFilter filter) {
       Comparison = filter.Comparison;
       Value = filter.Value;
Index: branches/OKB (trunk integration)/HeuristicLab.Services.OKB/3.3/Query/Filters/ProblemParameterBlobValueDataTypeNameFilter.cs
===================================================================
--- branches/OKB (trunk integration)/HeuristicLab.Services.OKB/3.3/Query/Filters/ProblemParameterBlobValueDataTypeNameFilter.cs	(revision 5482)
+++ 	(revision )
@@ -1,60 +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.Linq.Expressions;
-using HeuristicLab.Services.OKB.DataAccess;
-
-namespace HeuristicLab.Services.OKB.Query.Filters {
-  public class ProblemParameterBlobValueDataTypeNameFilter : IFilter {
-    public string Name { get; protected set; }
-    public DataTransfer.StringComparison Comparison { get; set; }
-    public string Value { get; set; }
-
-    public Expression<Func<Run, bool>> Expression {
-      get {
-        switch (Comparison) {
-          case DataTransfer.StringComparison.Equal:
-            return x => x.Experiment.ProblemParameterBlobValues.Any(y => ((y.ProblemParameter.Name == Name) || (y.ProblemParameter.Alias == Name)) && ((y.DataType.Name == Value) || (y.DataType.TypeName == Value)));
-          case DataTransfer.StringComparison.NotEqual:
-            return x => x.Experiment.ProblemParameterBlobValues.Any(y => ((y.ProblemParameter.Name == Name) || (y.ProblemParameter.Alias == Name)) && ((y.DataType.Name != Value) && (!(y.DataType.TypeName != Value))));
-          case DataTransfer.StringComparison.Contains:
-            return x => x.Experiment.ProblemParameterBlobValues.Any(y => ((y.ProblemParameter.Name == Name) || (y.ProblemParameter.Alias == Name)) && (y.DataType.Name.Contains(Value) || y.DataType.TypeName.Contains(Value)));
-          case DataTransfer.StringComparison.NotContains:
-            return x => x.Experiment.ProblemParameterBlobValues.Any(y => ((y.ProblemParameter.Name == Name) || (y.ProblemParameter.Alias == Name)) && (!y.DataType.Name.Contains(Value) && !y.DataType.TypeName.Contains(Value)));
-          default:
-            return x => true;
-        }
-      }
-    }
-
-    public ProblemParameterBlobValueDataTypeNameFilter(string name, DataTransfer.StringComparison comparison, string value) {
-      Name = name;
-      Comparison = comparison;
-      Value = value;
-    }
-    public ProblemParameterBlobValueDataTypeNameFilter(DataTransfer.NameSetComparisonStringFilter filter) {
-      Name = filter.Name;
-      Comparison = filter.Comparison;
-      Value = filter.Value;
-    }
-  }
-}
Index: branches/OKB (trunk integration)/HeuristicLab.Services.OKB/3.3/Query/Filters/ProblemParameterBlobValueValueFilter.cs
===================================================================
--- branches/OKB (trunk integration)/HeuristicLab.Services.OKB/3.3/Query/Filters/ProblemParameterBlobValueValueFilter.cs	(revision 5482)
+++ 	(revision )
@@ -1,57 +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.Linq;
-using System.Linq.Expressions;
-using HeuristicLab.Services.OKB.DataAccess;
-
-namespace HeuristicLab.Services.OKB {
-  public class ProblemParameterBlobValueValueFilter : IFilter {
-    public string Name { get; protected set; }
-    public DataTransfer.EqualityComparison Comparison { get; set; }
-    public byte[] Value { get; set; }
-
-    public Expression<Func<Run, bool>> Expression {
-      get {
-        switch (Comparison) {
-          case DataTransfer.EqualityComparison.Equal:
-            return x => x.Experiment.ProblemParameterBlobValues.Any(y => ((y.ProblemParameter.Name == Name) || (y.ProblemParameter.Alias == Name)) && (y.Value == Value));
-          case DataTransfer.EqualityComparison.NotEqual:
-            return x => x.Experiment.ProblemParameterBlobValues.Any(y => ((y.ProblemParameter.Name == Name) || (y.ProblemParameter.Alias == Name)) && (y.Value != Value));
-          default:
-            return x => true;
-        }
-      }
-    }
-
-    public ProblemParameterBlobValueValueFilter(string name, DataTransfer.EqualityComparison comparison, byte[] value) {
-      Name = name;
-      Comparison = comparison;
-      Value = value;
-    }
-    public ProblemParameterBlobValueValueFilter(DataTransfer.NameEqualityComparisonByteArrayFilter filter) {
-      Name = filter.Name;
-      Comparison = filter.Comparison;
-      Value = filter.Value;
-    }
-  }
-}
Index: branches/OKB (trunk integration)/HeuristicLab.Services.OKB/3.3/Query/Filters/ProblemParameterBoolValueValueFilter.cs
===================================================================
--- branches/OKB (trunk integration)/HeuristicLab.Services.OKB/3.3/Query/Filters/ProblemParameterBoolValueValueFilter.cs	(revision 5482)
+++ 	(revision )
@@ -1,57 +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.Linq;
-using System.Linq.Expressions;
-using HeuristicLab.Services.OKB.DataAccess;
-
-namespace HeuristicLab.Services.OKB {
-  public class ProblemParameterBoolValueValueFilter : IFilter {
-    public string Name { get; protected set; }
-    public DataTransfer.EqualityComparison Comparison { get; set; }
-    public bool Value { get; set; }
-
-    public Expression<Func<Run, bool>> Expression {
-      get {
-        switch (Comparison) {
-          case DataTransfer.EqualityComparison.Equal:
-            return x => x.Experiment.ProblemParameterBoolValues.Any(y => ((y.ProblemParameter.Name == Name) || (y.ProblemParameter.Alias == Name)) && (y.Value == Value));
-          case DataTransfer.EqualityComparison.NotEqual:
-            return x => x.Experiment.ProblemParameterBoolValues.Any(y => ((y.ProblemParameter.Name == Name) || (y.ProblemParameter.Alias == Name)) && (y.Value != Value));
-          default:
-            return x => true;
-        }
-      }
-    }
-
-    public ProblemParameterBoolValueValueFilter(string name, DataTransfer.EqualityComparison comparison, bool value) {
-      Name = name;
-      Comparison = comparison;
-      Value = value;
-    }
-    public ProblemParameterBoolValueValueFilter(DataTransfer.NameEqualityComparisonBoolFilter filter) {
-      Name = filter.Name;
-      Comparison = filter.Comparison;
-      Value = filter.Value;
-    }
-  }
-}
Index: branches/OKB (trunk integration)/HeuristicLab.Services.OKB/3.3/Query/Filters/ProblemParameterFloatValueValueFilter.cs
===================================================================
--- branches/OKB (trunk integration)/HeuristicLab.Services.OKB/3.3/Query/Filters/ProblemParameterFloatValueValueFilter.cs	(revision 5482)
+++ 	(revision )
@@ -1,65 +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.Linq;
-using System.Linq.Expressions;
-using HeuristicLab.Services.OKB.DataAccess;
-
-namespace HeuristicLab.Services.OKB {
-  public class ProblemParameterFloatValueValueFilter : IFilter {
-    public string Name { get; protected set; }
-    public DataTransfer.OrdinalComparison Comparison { get; set; }
-    public double Value { get; set; }
-
-    public Expression<Func<Run, bool>> Expression {
-      get {
-        switch (Comparison) {
-          case DataTransfer.OrdinalComparison.Less:
-            return x => x.Experiment.ProblemParameterFloatValues.Any(y => ((y.ProblemParameter.Name == Name) || (y.ProblemParameter.Alias == Name)) && (y.Value < Value));
-          case DataTransfer.OrdinalComparison.LessOrEqual:
-            return x => x.Experiment.ProblemParameterFloatValues.Any(y => ((y.ProblemParameter.Name == Name) || (y.ProblemParameter.Alias == Name)) && (y.Value <= Value));
-          case DataTransfer.OrdinalComparison.Equal:
-            return x => x.Experiment.ProblemParameterFloatValues.Any(y => ((y.ProblemParameter.Name == Name) || (y.ProblemParameter.Alias == Name)) && (y.Value == Value));
-          case DataTransfer.OrdinalComparison.GreaterOrEqual:
-            return x => x.Experiment.ProblemParameterFloatValues.Any(y => ((y.ProblemParameter.Name == Name) || (y.ProblemParameter.Alias == Name)) && (y.Value >= Value));
-          case DataTransfer.OrdinalComparison.Greater:
-            return x => x.Experiment.ProblemParameterFloatValues.Any(y => ((y.ProblemParameter.Name == Name) || (y.ProblemParameter.Alias == Name)) && (y.Value > Value));
-          case DataTransfer.OrdinalComparison.NotEqual:
-            return x => x.Experiment.ProblemParameterFloatValues.Any(y => ((y.ProblemParameter.Name == Name) || (y.ProblemParameter.Alias == Name)) && (y.Value != Value));
-          default:
-            return x => true;
-        }
-      }
-    }
-
-    public ProblemParameterFloatValueValueFilter(string name, DataTransfer.OrdinalComparison comparison, double value) {
-      Name = name;
-      Comparison = comparison;
-      Value = value;
-    }
-    public ProblemParameterFloatValueValueFilter(DataTransfer.NameOrdinalComparisonDoubleFilter filter) {
-      Name = filter.Name;
-      Comparison = filter.Comparison;
-      Value = filter.Value;
-    }
-  }
-}
Index: branches/OKB (trunk integration)/HeuristicLab.Services.OKB/3.3/Query/Filters/ProblemParameterIntValueValueFilter.cs
===================================================================
--- branches/OKB (trunk integration)/HeuristicLab.Services.OKB/3.3/Query/Filters/ProblemParameterIntValueValueFilter.cs	(revision 5482)
+++ 	(revision )
@@ -1,65 +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.Linq;
-using System.Linq.Expressions;
-using HeuristicLab.Services.OKB.DataAccess;
-
-namespace HeuristicLab.Services.OKB {
-  public class ProblemParameterIntValueValueFilter : IFilter {
-    public string Name { get; protected set; }
-    public DataTransfer.OrdinalComparison Comparison { get; set; }
-    public long Value { get; set; }
-
-    public Expression<Func<Run, bool>> Expression {
-      get {
-        switch (Comparison) {
-          case DataTransfer.OrdinalComparison.Less:
-            return x => x.Experiment.ProblemParameterIntValues.Any(y => ((y.ProblemParameter.Name == Name) || (y.ProblemParameter.Alias == Name)) && (y.Value < Value));
-          case DataTransfer.OrdinalComparison.LessOrEqual:
-            return x => x.Experiment.ProblemParameterIntValues.Any(y => ((y.ProblemParameter.Name == Name) || (y.ProblemParameter.Alias == Name)) && (y.Value <= Value));
-          case DataTransfer.OrdinalComparison.Equal:
-            return x => x.Experiment.ProblemParameterIntValues.Any(y => ((y.ProblemParameter.Name == Name) || (y.ProblemParameter.Alias == Name)) && (y.Value == Value));
-          case DataTransfer.OrdinalComparison.GreaterOrEqual:
-            return x => x.Experiment.ProblemParameterIntValues.Any(y => ((y.ProblemParameter.Name == Name) || (y.ProblemParameter.Alias == Name)) && (y.Value >= Value));
-          case DataTransfer.OrdinalComparison.Greater:
-            return x => x.Experiment.ProblemParameterIntValues.Any(y => ((y.ProblemParameter.Name == Name) || (y.ProblemParameter.Alias == Name)) && (y.Value > Value));
-          case DataTransfer.OrdinalComparison.NotEqual:
-            return x => x.Experiment.ProblemParameterIntValues.Any(y => ((y.ProblemParameter.Name == Name) || (y.ProblemParameter.Alias == Name)) && (y.Value != Value));
-          default:
-            return x => true;
-        }
-      }
-    }
-
-    public ProblemParameterIntValueValueFilter(string name, DataTransfer.OrdinalComparison comparison, long value) {
-      Name = name;
-      Comparison = comparison;
-      Value = value;
-    }
-    public ProblemParameterIntValueValueFilter(DataTransfer.NameOrdinalComparisonLongFilter filter) {
-      Name = filter.Name;
-      Comparison = filter.Comparison;
-      Value = filter.Value;
-    }
-  }
-}
Index: branches/OKB (trunk integration)/HeuristicLab.Services.OKB/3.3/Query/Filters/ProblemParameterNameFilter.cs
===================================================================
--- branches/OKB (trunk integration)/HeuristicLab.Services.OKB/3.3/Query/Filters/ProblemParameterNameFilter.cs	(revision 5482)
+++ 	(revision )
@@ -1,58 +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.Linq;
-using System.Linq.Expressions;
-using HeuristicLab.Services.OKB.DataAccess;
-
-namespace HeuristicLab.Services.OKB {
-  public class ProblemParameterNameFilter : IFilter {
-    public DataTransfer.StringComparison Comparison { get; set; }
-    public string Value { get; set; }
-
-    public Expression<Func<Run, bool>> Expression {
-      get {
-        switch (Comparison) {
-          case DataTransfer.StringComparison.Equal:
-            return x => x.Experiment.Problem.ProblemParameters.Any(y => (y.Name == Value) || (y.Alias == Value));
-          case DataTransfer.StringComparison.NotEqual:
-            return x => x.Experiment.Problem.ProblemParameters.All(y => (y.Name != Value) && (y.Alias != Value));
-          case DataTransfer.StringComparison.Contains:
-            return x => x.Experiment.Problem.ProblemParameters.Any(y => y.Name.Contains(Value) || y.Alias.Contains(Value));
-          case DataTransfer.StringComparison.NotContains:
-            return x => x.Experiment.Problem.ProblemParameters.All(y => !y.Name.Contains(Value) && !y.Alias.Contains(Value));
-          default:
-            return x => true;
-        }
-      }
-    }
-
-    public ProblemParameterNameFilter(DataTransfer.StringComparison comparison, string value) {
-      Comparison = comparison;
-      Value = value;
-    }
-    public ProblemParameterNameFilter(DataTransfer.SetComparisonStringFilter filter) {
-      Comparison = filter.Comparison;
-      Value = filter.Value;
-    }
-  }
-}
Index: branches/OKB (trunk integration)/HeuristicLab.Services.OKB/3.3/Query/Filters/ProblemParameterStringValueValueFilter.cs
===================================================================
--- branches/OKB (trunk integration)/HeuristicLab.Services.OKB/3.3/Query/Filters/ProblemParameterStringValueValueFilter.cs	(revision 5482)
+++ 	(revision )
@@ -1,61 +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.Linq;
-using System.Linq.Expressions;
-using HeuristicLab.Services.OKB.DataAccess;
-
-namespace HeuristicLab.Services.OKB {
-  public class ProblemParameterStringValueValueFilter : IFilter {
-    public string Name { get; protected set; }
-    public DataTransfer.StringComparison Comparison { get; set; }
-    public string Value { get; set; }
-
-    public Expression<Func<Run, bool>> Expression {
-      get {
-        switch (Comparison) {
-          case DataTransfer.StringComparison.Equal:
-            return x => x.Experiment.ProblemParameterStringValues.Any(y => ((y.ProblemParameter.Name == Name) || (y.ProblemParameter.Alias == Name)) && (y.Value == Value));
-          case DataTransfer.StringComparison.NotEqual:
-            return x => x.Experiment.ProblemParameterStringValues.Any(y => ((y.ProblemParameter.Name == Name) || (y.ProblemParameter.Alias == Name)) && (y.Value != Value));
-          case DataTransfer.StringComparison.Contains:
-            return x => x.Experiment.ProblemParameterStringValues.Any(y => ((y.ProblemParameter.Name == Name) || (y.ProblemParameter.Alias == Name)) && y.Value.Contains(Value));
-          case DataTransfer.StringComparison.NotContains:
-            return x => x.Experiment.ProblemParameterStringValues.Any(y => ((y.ProblemParameter.Name == Name) || (y.ProblemParameter.Alias == Name)) && !y.Value.Contains(Value));
-          default:
-            return x => true;
-        }
-      }
-    }
-
-    public ProblemParameterStringValueValueFilter(string name, DataTransfer.StringComparison comparison, string value) {
-      Name = name;
-      Comparison = comparison;
-      Value = value;
-    }
-    public ProblemParameterStringValueValueFilter(DataTransfer.NameSetComparisonStringFilter filter) {
-      Name = filter.Name;
-      Comparison = filter.Comparison;
-      Value = filter.Value;
-    }
-  }
-}
Index: branches/OKB (trunk integration)/HeuristicLab.Services.OKB/3.3/Query/Filters/ProblemPlatformNameFilter.cs
===================================================================
--- branches/OKB (trunk integration)/HeuristicLab.Services.OKB/3.3/Query/Filters/ProblemPlatformNameFilter.cs	(revision 5482)
+++ branches/OKB (trunk integration)/HeuristicLab.Services.OKB/3.3/Query/Filters/ProblemPlatformNameFilter.cs	(revision 5502)
@@ -21,8 +21,9 @@
 
 using System;
+using System.Data.Linq.SqlClient;
 using System.Linq.Expressions;
 using HeuristicLab.Services.OKB.DataAccess;
 
-namespace HeuristicLab.Services.OKB {
+namespace HeuristicLab.Services.OKB.Query.Filters {
   public class ProblemPlatformNameFilter : IFilter {
     public DataTransfer.StringComparison Comparison { get; set; }
@@ -33,11 +34,15 @@
         switch (Comparison) {
           case DataTransfer.StringComparison.Equal:
-            return x => x.Experiment.Problem.Platform.Name == Value;
+            return x => x.Problem.Platform.Name == Value;
           case DataTransfer.StringComparison.NotEqual:
-            return x => x.Experiment.Problem.Platform.Name != Value;
+            return x => x.Problem.Platform.Name != Value;
           case DataTransfer.StringComparison.Contains:
-            return x => x.Experiment.Problem.Platform.Name.Contains(Value);
+            return x => x.Problem.Platform.Name.Contains(Value);
           case DataTransfer.StringComparison.NotContains:
-            return x => !x.Experiment.Problem.Platform.Name.Contains(Value);
+            return x => !x.Problem.Platform.Name.Contains(Value);
+          case DataTransfer.StringComparison.Like:
+            return x => SqlMethods.Like(x.Problem.Platform.Name, Value);
+          case DataTransfer.StringComparison.NotLike:
+            return x => !SqlMethods.Like(x.Problem.Platform.Name, Value);
           default:
             return x => true;
@@ -50,5 +55,5 @@
       Value = value;
     }
-    public ProblemPlatformNameFilter(DataTransfer.SetComparisonStringFilter filter) {
+    public ProblemPlatformNameFilter(DataTransfer.StringComparisonFilter filter) {
       Comparison = filter.Comparison;
       Value = filter.Value;
Index: branches/OKB (trunk integration)/HeuristicLab.Services.OKB/3.3/Query/Filters/ResultBlobValueDataTypeNameFilter.cs
===================================================================
--- branches/OKB (trunk integration)/HeuristicLab.Services.OKB/3.3/Query/Filters/ResultBlobValueDataTypeNameFilter.cs	(revision 5482)
+++ 	(revision )
@@ -1,61 +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.Linq;
-using System.Linq.Expressions;
-using HeuristicLab.Services.OKB.DataAccess;
-
-namespace HeuristicLab.Services.OKB {
-  public class ResultBlobValueDataTypeNameFilter : IFilter {
-    public string Name { get; protected set; }
-    public DataTransfer.StringComparison Comparison { get; set; }
-    public string Value { get; set; }
-
-    public Expression<Func<Run, bool>> Expression {
-      get {
-        switch (Comparison) {
-          case DataTransfer.StringComparison.Equal:
-            return x => x.ResultBlobValues.Any(y => ((y.Result.Name == Name) || (y.Result.Alias == Name)) && ((y.DataType.Name == Value) || (y.DataType.TypeName == Value)));
-          case DataTransfer.StringComparison.NotEqual:
-            return x => x.ResultBlobValues.Any(y => ((y.Result.Name == Name) || (y.Result.Alias == Name)) && ((y.DataType.Name != Value) && (!(y.DataType.TypeName != Value))));
-          case DataTransfer.StringComparison.Contains:
-            return x => x.ResultBlobValues.Any(y => ((y.Result.Name == Name) || (y.Result.Alias == Name)) && (y.DataType.Name.Contains(Value) || y.DataType.TypeName.Contains(Value)));
-          case DataTransfer.StringComparison.NotContains:
-            return x => x.ResultBlobValues.Any(y => ((y.Result.Name == Name) || (y.Result.Alias == Name)) && (!y.DataType.Name.Contains(Value) && !y.DataType.TypeName.Contains(Value)));
-          default:
-            return x => true;
-        }
-      }
-    }
-
-    public ResultBlobValueDataTypeNameFilter(string name, DataTransfer.StringComparison comparison, string value) {
-      Name = name;
-      Comparison = comparison;
-      Value = value;
-    }
-    public ResultBlobValueDataTypeNameFilter(DataTransfer.NameSetComparisonStringFilter filter) {
-      Name = filter.Name;
-      Comparison = filter.Comparison;
-      Value = filter.Value;
-    }
-  }
-}
Index: branches/OKB (trunk integration)/HeuristicLab.Services.OKB/3.3/Query/Filters/ResultBlobValueValueFilter.cs
===================================================================
--- branches/OKB (trunk integration)/HeuristicLab.Services.OKB/3.3/Query/Filters/ResultBlobValueValueFilter.cs	(revision 5482)
+++ 	(revision )
@@ -1,57 +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.Linq;
-using System.Linq.Expressions;
-using HeuristicLab.Services.OKB.DataAccess;
-
-namespace HeuristicLab.Services.OKB {
-  public class ResultBlobValueValueFilter : IFilter {
-    public string Name { get; protected set; }
-    public DataTransfer.EqualityComparison Comparison { get; set; }
-    public byte[] Value { get; set; }
-
-    public Expression<Func<Run, bool>> Expression {
-      get {
-        switch (Comparison) {
-          case DataTransfer.EqualityComparison.Equal:
-            return x => x.ResultBlobValues.Any(y => ((y.Result.Name == Name) || (y.Result.Alias == Name)) && (y.Value == Value));
-          case DataTransfer.EqualityComparison.NotEqual:
-            return x => x.ResultBlobValues.Any(y => ((y.Result.Name == Name) || (y.Result.Alias == Name)) && (y.Value != Value));
-          default:
-            return x => true;
-        }
-      }
-    }
-
-    public ResultBlobValueValueFilter(string name, DataTransfer.EqualityComparison comparison, byte[] value) {
-      Name = name;
-      Comparison = comparison;
-      Value = value;
-    }
-    public ResultBlobValueValueFilter(DataTransfer.NameEqualityComparisonByteArrayFilter filter) {
-      Name = filter.Name;
-      Comparison = filter.Comparison;
-      Value = filter.Value;
-    }
-  }
-}
Index: branches/OKB (trunk integration)/HeuristicLab.Services.OKB/3.3/Query/Filters/ResultBoolValueValueFilter.cs
===================================================================
--- branches/OKB (trunk integration)/HeuristicLab.Services.OKB/3.3/Query/Filters/ResultBoolValueValueFilter.cs	(revision 5482)
+++ 	(revision )
@@ -1,57 +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.Linq;
-using System.Linq.Expressions;
-using HeuristicLab.Services.OKB.DataAccess;
-
-namespace HeuristicLab.Services.OKB {
-  public class ResultBoolValueValueFilter : IFilter {
-    public string Name { get; protected set; }
-    public DataTransfer.EqualityComparison Comparison { get; set; }
-    public bool Value { get; set; }
-
-    public Expression<Func<Run, bool>> Expression {
-      get {
-        switch (Comparison) {
-          case DataTransfer.EqualityComparison.Equal:
-            return x => x.ResultBoolValues.Any(y => ((y.Result.Name == Name) || (y.Result.Alias == Name)) && (y.Value == Value));
-          case DataTransfer.EqualityComparison.NotEqual:
-            return x => x.ResultBoolValues.Any(y => ((y.Result.Name == Name) || (y.Result.Alias == Name)) && (y.Value != Value));
-          default:
-            return x => true;
-        }
-      }
-    }
-
-    public ResultBoolValueValueFilter(string name, DataTransfer.EqualityComparison comparison, bool value) {
-      Name = name;
-      Comparison = comparison;
-      Value = value;
-    }
-    public ResultBoolValueValueFilter(DataTransfer.NameEqualityComparisonBoolFilter filter) {
-      Name = filter.Name;
-      Comparison = filter.Comparison;
-      Value = filter.Value;
-    }
-  }
-}
Index: branches/OKB (trunk integration)/HeuristicLab.Services.OKB/3.3/Query/Filters/ResultFloatValueValueFilter.cs
===================================================================
--- branches/OKB (trunk integration)/HeuristicLab.Services.OKB/3.3/Query/Filters/ResultFloatValueValueFilter.cs	(revision 5482)
+++ 	(revision )
@@ -1,65 +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.Linq;
-using System.Linq.Expressions;
-using HeuristicLab.Services.OKB.DataAccess;
-
-namespace HeuristicLab.Services.OKB {
-  public class ResultFloatValueValueFilter : IFilter {
-    public string Name { get; protected set; }
-    public DataTransfer.OrdinalComparison Comparison { get; set; }
-    public double Value { get; set; }
-
-    public Expression<Func<Run, bool>> Expression {
-      get {
-        switch (Comparison) {
-          case DataTransfer.OrdinalComparison.Less:
-            return x => x.ResultFloatValues.Any(y => ((y.Result.Name == Name) || (y.Result.Alias == Name)) && (y.Value < Value));
-          case DataTransfer.OrdinalComparison.LessOrEqual:
-            return x => x.ResultFloatValues.Any(y => ((y.Result.Name == Name) || (y.Result.Alias == Name)) && (y.Value <= Value));
-          case DataTransfer.OrdinalComparison.Equal:
-            return x => x.ResultFloatValues.Any(y => ((y.Result.Name == Name) || (y.Result.Alias == Name)) && (y.Value == Value));
-          case DataTransfer.OrdinalComparison.GreaterOrEqual:
-            return x => x.ResultFloatValues.Any(y => ((y.Result.Name == Name) || (y.Result.Alias == Name)) && (y.Value >= Value));
-          case DataTransfer.OrdinalComparison.Greater:
-            return x => x.ResultFloatValues.Any(y => ((y.Result.Name == Name) || (y.Result.Alias == Name)) && (y.Value > Value));
-          case DataTransfer.OrdinalComparison.NotEqual:
-            return x => x.ResultFloatValues.Any(y => ((y.Result.Name == Name) || (y.Result.Alias == Name)) && (y.Value != Value));
-          default:
-            return x => true;
-        }
-      }
-    }
-
-    public ResultFloatValueValueFilter(string name, DataTransfer.OrdinalComparison comparison, double value) {
-      Name = name;
-      Comparison = comparison;
-      Value = value;
-    }
-    public ResultFloatValueValueFilter(DataTransfer.NameOrdinalComparisonDoubleFilter filter) {
-      Name = filter.Name;
-      Comparison = filter.Comparison;
-      Value = filter.Value;
-    }
-  }
-}
Index: branches/OKB (trunk integration)/HeuristicLab.Services.OKB/3.3/Query/Filters/ResultIntValueValueFilter.cs
===================================================================
--- branches/OKB (trunk integration)/HeuristicLab.Services.OKB/3.3/Query/Filters/ResultIntValueValueFilter.cs	(revision 5482)
+++ 	(revision )
@@ -1,65 +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.Linq;
-using System.Linq.Expressions;
-using HeuristicLab.Services.OKB.DataAccess;
-
-namespace HeuristicLab.Services.OKB {
-  public class ResultIntValueValueFilter : IFilter {
-    public string Name { get; protected set; }
-    public DataTransfer.OrdinalComparison Comparison { get; set; }
-    public long Value { get; set; }
-
-    public Expression<Func<Run, bool>> Expression {
-      get {
-        switch (Comparison) {
-          case DataTransfer.OrdinalComparison.Less:
-            return x => x.ResultIntValues.Any(y => ((y.Result.Name == Name) || (y.Result.Alias == Name)) && (y.Value < Value));
-          case DataTransfer.OrdinalComparison.LessOrEqual:
-            return x => x.ResultIntValues.Any(y => ((y.Result.Name == Name) || (y.Result.Alias == Name)) && (y.Value <= Value));
-          case DataTransfer.OrdinalComparison.Equal:
-            return x => x.ResultIntValues.Any(y => ((y.Result.Name == Name) || (y.Result.Alias == Name)) && (y.Value == Value));
-          case DataTransfer.OrdinalComparison.GreaterOrEqual:
-            return x => x.ResultIntValues.Any(y => ((y.Result.Name == Name) || (y.Result.Alias == Name)) && (y.Value >= Value));
-          case DataTransfer.OrdinalComparison.Greater:
-            return x => x.ResultIntValues.Any(y => ((y.Result.Name == Name) || (y.Result.Alias == Name)) && (y.Value > Value));
-          case DataTransfer.OrdinalComparison.NotEqual:
-            return x => x.ResultIntValues.Any(y => ((y.Result.Name == Name) || (y.Result.Alias == Name)) && (y.Value != Value));
-          default:
-            return x => true;
-        }
-      }
-    }
-
-    public ResultIntValueValueFilter(string name, DataTransfer.OrdinalComparison comparison, long value) {
-      Name = name;
-      Comparison = comparison;
-      Value = value;
-    }
-    public ResultIntValueValueFilter(DataTransfer.NameOrdinalComparisonLongFilter filter) {
-      Name = filter.Name;
-      Comparison = filter.Comparison;
-      Value = filter.Value;
-    }
-  }
-}
Index: branches/OKB (trunk integration)/HeuristicLab.Services.OKB/3.3/Query/Filters/ResultNameFilter.cs
===================================================================
--- branches/OKB (trunk integration)/HeuristicLab.Services.OKB/3.3/Query/Filters/ResultNameFilter.cs	(revision 5482)
+++ 	(revision )
@@ -1,58 +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.Linq;
-using System.Linq.Expressions;
-using HeuristicLab.Services.OKB.DataAccess;
-
-namespace HeuristicLab.Services.OKB {
-  public class ResultNameFilter : IFilter {
-    public DataTransfer.StringComparison Comparison { get; set; }
-    public string Value { get; set; }
-
-    public Expression<Func<Run, bool>> Expression {
-      get {
-        switch (Comparison) {
-          case DataTransfer.StringComparison.Equal:
-            return x => x.Experiment.Algorithm.Results.Any(y => (y.Name == Value) || (y.Alias == Value));
-          case DataTransfer.StringComparison.NotEqual:
-            return x => x.Experiment.Algorithm.Results.All(y => (y.Name != Value) && (y.Alias != Value));
-          case DataTransfer.StringComparison.Contains:
-            return x => x.Experiment.Algorithm.Results.Any(y => y.Name.Contains(Value) || y.Alias.Contains(Value));
-          case DataTransfer.StringComparison.NotContains:
-            return x => x.Experiment.Algorithm.Results.All(y => !y.Name.Contains(Value) && !y.Alias.Contains(Value));
-          default:
-            return x => true;
-        }
-      }
-    }
-
-    public ResultNameFilter(DataTransfer.StringComparison comparison, string value) {
-      Comparison = comparison;
-      Value = value;
-    }
-    public ResultNameFilter(DataTransfer.SetComparisonStringFilter filter) {
-      Comparison = filter.Comparison;
-      Value = filter.Value;
-    }
-  }
-}
Index: branches/OKB (trunk integration)/HeuristicLab.Services.OKB/3.3/Query/Filters/ResultStringValueValueFilter.cs
===================================================================
--- branches/OKB (trunk integration)/HeuristicLab.Services.OKB/3.3/Query/Filters/ResultStringValueValueFilter.cs	(revision 5482)
+++ 	(revision )
@@ -1,61 +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.Linq;
-using System.Linq.Expressions;
-using HeuristicLab.Services.OKB.DataAccess;
-
-namespace HeuristicLab.Services.OKB {
-  public class ResultStringValueValueFilter : IFilter {
-    public string Name { get; protected set; }
-    public DataTransfer.StringComparison Comparison { get; set; }
-    public string Value { get; set; }
-
-    public Expression<Func<Run, bool>> Expression {
-      get {
-        switch (Comparison) {
-          case DataTransfer.StringComparison.Equal:
-            return x => x.ResultStringValues.Any(y => ((y.Result.Name == Name) || (y.Result.Alias == Name)) && (y.Value == Value));
-          case DataTransfer.StringComparison.NotEqual:
-            return x => x.ResultStringValues.Any(y => ((y.Result.Name == Name) || (y.Result.Alias == Name)) && (y.Value != Value));
-          case DataTransfer.StringComparison.Contains:
-            return x => x.ResultStringValues.Any(y => ((y.Result.Name == Name) || (y.Result.Alias == Name)) && y.Value.Contains(Value));
-          case DataTransfer.StringComparison.NotContains:
-            return x => x.ResultStringValues.Any(y => ((y.Result.Name == Name) || (y.Result.Alias == Name)) && !y.Value.Contains(Value));
-          default:
-            return x => true;
-        }
-      }
-    }
-
-    public ResultStringValueValueFilter(string name, DataTransfer.StringComparison comparison, string value) {
-      Name = name;
-      Comparison = comparison;
-      Value = value;
-    }
-    public ResultStringValueValueFilter(DataTransfer.NameSetComparisonStringFilter filter) {
-      Name = filter.Name;
-      Comparison = filter.Comparison;
-      Value = filter.Value;
-    }
-  }
-}
Index: branches/OKB (trunk integration)/HeuristicLab.Services.OKB/3.3/Query/Filters/RunClientNameFilter.cs
===================================================================
--- branches/OKB (trunk integration)/HeuristicLab.Services.OKB/3.3/Query/Filters/RunClientNameFilter.cs	(revision 5482)
+++ branches/OKB (trunk integration)/HeuristicLab.Services.OKB/3.3/Query/Filters/RunClientNameFilter.cs	(revision 5502)
@@ -24,5 +24,5 @@
 using HeuristicLab.Services.OKB.DataAccess;
 
-namespace HeuristicLab.Services.OKB {
+namespace HeuristicLab.Services.OKB.Query.Filters {
   public class RunClientNameFilter : IFilter {
     public DataTransfer.StringComparison Comparison { get; set; }
@@ -40,4 +40,8 @@
           case DataTransfer.StringComparison.NotContains:
             throw new NotSupportedException();
+          case DataTransfer.StringComparison.Like:
+            throw new NotSupportedException();
+          case DataTransfer.StringComparison.NotLike:
+            throw new NotSupportedException();
           default:
             return x => true;
@@ -50,5 +54,5 @@
       Value = value;
     }
-    public RunClientNameFilter(DataTransfer.SetComparisonStringFilter filter) {
+    public RunClientNameFilter(DataTransfer.StringComparisonFilter filter) {
       Comparison = filter.Comparison;
       Value = filter.Value;
Index: branches/OKB (trunk integration)/HeuristicLab.Services.OKB/3.3/Query/Filters/RunCreatedDateFilter.cs
===================================================================
--- branches/OKB (trunk integration)/HeuristicLab.Services.OKB/3.3/Query/Filters/RunCreatedDateFilter.cs	(revision 5482)
+++ branches/OKB (trunk integration)/HeuristicLab.Services.OKB/3.3/Query/Filters/RunCreatedDateFilter.cs	(revision 5502)
@@ -24,5 +24,5 @@
 using HeuristicLab.Services.OKB.DataAccess;
 
-namespace HeuristicLab.Services.OKB {
+namespace HeuristicLab.Services.OKB.Query.Filters {
   public class RunCreatedDateFilter : IFilter {
     public DataTransfer.OrdinalComparison Comparison { get; set; }
Index: branches/OKB (trunk integration)/HeuristicLab.Services.OKB/3.3/Query/Filters/RunRandomSeedFilter.cs
===================================================================
--- branches/OKB (trunk integration)/HeuristicLab.Services.OKB/3.3/Query/Filters/RunRandomSeedFilter.cs	(revision 5482)
+++ branches/OKB (trunk integration)/HeuristicLab.Services.OKB/3.3/Query/Filters/RunRandomSeedFilter.cs	(revision 5502)
@@ -24,5 +24,5 @@
 using HeuristicLab.Services.OKB.DataAccess;
 
-namespace HeuristicLab.Services.OKB {
+namespace HeuristicLab.Services.OKB.Query.Filters {
   public class RunRandomSeedFilter : IFilter {
     public DataTransfer.OrdinalComparison Comparison { get; set; }
Index: branches/OKB (trunk integration)/HeuristicLab.Services.OKB/3.3/Query/Filters/RunUserNameFilter.cs
===================================================================
--- branches/OKB (trunk integration)/HeuristicLab.Services.OKB/3.3/Query/Filters/RunUserNameFilter.cs	(revision 5482)
+++ branches/OKB (trunk integration)/HeuristicLab.Services.OKB/3.3/Query/Filters/RunUserNameFilter.cs	(revision 5502)
@@ -24,5 +24,5 @@
 using HeuristicLab.Services.OKB.DataAccess;
 
-namespace HeuristicLab.Services.OKB {
+namespace HeuristicLab.Services.OKB.Query.Filters {
   public class RunUserNameFilter : IFilter {
     public DataTransfer.StringComparison Comparison { get; set; }
@@ -40,4 +40,8 @@
           case DataTransfer.StringComparison.NotContains:
             throw new NotSupportedException();
+          case DataTransfer.StringComparison.Like:
+            throw new NotSupportedException();
+          case DataTransfer.StringComparison.NotLike:
+            throw new NotSupportedException();
           default:
             return x => true;
@@ -50,5 +54,5 @@
       Value = value;
     }
-    public RunUserNameFilter(DataTransfer.SetComparisonStringFilter filter) {
+    public RunUserNameFilter(DataTransfer.StringComparisonFilter filter) {
       Comparison = filter.Comparison;
       Value = filter.Value;
Index: branches/OKB (trunk integration)/HeuristicLab.Services.OKB/3.3/Query/Filters/StringValueFilter.cs
===================================================================
--- branches/OKB (trunk integration)/HeuristicLab.Services.OKB/3.3/Query/Filters/StringValueFilter.cs	(revision 5502)
+++ branches/OKB (trunk integration)/HeuristicLab.Services.OKB/3.3/Query/Filters/StringValueFilter.cs	(revision 5502)
@@ -0,0 +1,66 @@
+﻿#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.Data.Linq.SqlClient;
+using System.Linq;
+using System.Linq.Expressions;
+using HeuristicLab.Services.OKB.DataAccess;
+
+namespace HeuristicLab.Services.OKB.Query.Filters {
+  public class StringValueFilter : IFilter {
+    public string Name { get; protected set; }
+    public DataTransfer.StringComparison Comparison { get; set; }
+    public string Value { get; set; }
+
+    public Expression<Func<Run, bool>> Expression {
+      get {
+        switch (Comparison) {
+          case DataTransfer.StringComparison.Equal:
+            return x => x.Values.Any(y => (y.ValueName.Name == Name) && (y.StringValue == Value));
+          case DataTransfer.StringComparison.NotEqual:
+            return x => x.Values.Any(y => (y.ValueName.Name == Name) && (y.StringValue != Value));
+          case DataTransfer.StringComparison.Contains:
+            return x => x.Values.Any(y => (y.ValueName.Name == Name) && y.StringValue.Contains(Value));
+          case DataTransfer.StringComparison.NotContains:
+            return x => x.Values.Any(y => (y.ValueName.Name == Name) && !y.StringValue.Contains(Value));
+          case DataTransfer.StringComparison.Like:
+            return x => x.Values.Any(y => (y.ValueName.Name == Name) && SqlMethods.Like(y.StringValue, Value));
+          case DataTransfer.StringComparison.NotLike:
+            return x => x.Values.Any(y => (y.ValueName.Name == Name) && !SqlMethods.Like(y.StringValue, Value));
+          default:
+            return x => true;
+        }
+      }
+    }
+
+    public StringValueFilter(string name, DataTransfer.StringComparison comparison, string value) {
+      Name = name;
+      Comparison = comparison;
+      Value = value;
+    }
+    public StringValueFilter(DataTransfer.NameStringComparisonFilter filter) {
+      Name = filter.Name;
+      Comparison = filter.Comparison;
+      Value = filter.Value;
+    }
+  }
+}
Index: branches/OKB (trunk integration)/HeuristicLab.Services.OKB/3.3/Query/Filters/ValueDataTypeNameFilter.cs
===================================================================
--- branches/OKB (trunk integration)/HeuristicLab.Services.OKB/3.3/Query/Filters/ValueDataTypeNameFilter.cs	(revision 5502)
+++ branches/OKB (trunk integration)/HeuristicLab.Services.OKB/3.3/Query/Filters/ValueDataTypeNameFilter.cs	(revision 5502)
@@ -0,0 +1,63 @@
+﻿#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.Data.Linq.SqlClient;
+using System.Linq;
+using System.Linq.Expressions;
+using HeuristicLab.Services.OKB.DataAccess;
+
+namespace HeuristicLab.Services.OKB.Query.Filters {
+  public class ValueDataTypeNameFilter : IFilter {
+    public DataTransfer.StringComparison Comparison { get; set; }
+    public string Value { get; set; }
+
+    public Expression<Func<Run, bool>> Expression {
+      get {
+        switch (Comparison) {
+          case DataTransfer.StringComparison.Equal:
+            return x => x.Values.Any(y => y.DataType.Name == Value);
+          case DataTransfer.StringComparison.NotEqual:
+            return x => x.Values.All(y => y.DataType.Name != Value);
+          case DataTransfer.StringComparison.Contains:
+            return x => x.Values.Any(y => y.DataType.Name.Contains(Value));
+          case DataTransfer.StringComparison.NotContains:
+            return x => x.Values.All(y => !y.DataType.Name.Contains(Value));
+          case DataTransfer.StringComparison.Like:
+            return x => x.Values.Any(y => SqlMethods.Like(y.DataType.Name, Value));
+          case DataTransfer.StringComparison.NotLike:
+            return x => x.Values.All(y => !SqlMethods.Like(y.DataType.Name, Value));
+          default:
+            return x => true;
+        }
+      }
+    }
+
+    public ValueDataTypeNameFilter(DataTransfer.StringComparison comparison, string value) {
+      Comparison = comparison;
+      Value = value;
+    }
+    public ValueDataTypeNameFilter(DataTransfer.StringComparisonFilter filter) {
+      Comparison = filter.Comparison;
+      Value = filter.Value;
+    }
+  }
+}
Index: branches/OKB (trunk integration)/HeuristicLab.Services.OKB/3.3/Query/Filters/ValueNameFilter.cs
===================================================================
--- branches/OKB (trunk integration)/HeuristicLab.Services.OKB/3.3/Query/Filters/ValueNameFilter.cs	(revision 5502)
+++ branches/OKB (trunk integration)/HeuristicLab.Services.OKB/3.3/Query/Filters/ValueNameFilter.cs	(revision 5502)
@@ -0,0 +1,63 @@
+﻿#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.Data.Linq.SqlClient;
+using System.Linq;
+using System.Linq.Expressions;
+using HeuristicLab.Services.OKB.DataAccess;
+
+namespace HeuristicLab.Services.OKB.Query.Filters {
+  public class ValueNameFilter : IFilter {
+    public DataTransfer.StringComparison Comparison { get; set; }
+    public string Value { get; set; }
+
+    public Expression<Func<Run, bool>> Expression {
+      get {
+        switch (Comparison) {
+          case DataTransfer.StringComparison.Equal:
+            return x => x.Values.Any(y => y.ValueName.Name == Value);
+          case DataTransfer.StringComparison.NotEqual:
+            return x => x.Values.All(y => y.ValueName.Name != Value);
+          case DataTransfer.StringComparison.Contains:
+            return x => x.Values.Any(y => y.ValueName.Name.Contains(Value));
+          case DataTransfer.StringComparison.NotContains:
+            return x => x.Values.All(y => !y.ValueName.Name.Contains(Value));
+          case DataTransfer.StringComparison.Like:
+            return x => x.Values.Any(y => SqlMethods.Like(y.ValueName.Name, Value));
+          case DataTransfer.StringComparison.NotLike:
+            return x => x.Values.All(y => !SqlMethods.Like(y.ValueName.Name, Value));
+          default:
+            return x => true;
+        }
+      }
+    }
+
+    public ValueNameFilter(DataTransfer.StringComparison comparison, string value) {
+      Comparison = comparison;
+      Value = value;
+    }
+    public ValueNameFilter(DataTransfer.StringComparisonFilter filter) {
+      Comparison = filter.Comparison;
+      Value = filter.Value;
+    }
+  }
+}
Index: branches/OKB (trunk integration)/HeuristicLab.Services.OKB/3.3/Query/IQueryService.cs
===================================================================
--- branches/OKB (trunk integration)/HeuristicLab.Services.OKB/3.3/Query/IQueryService.cs	(revision 5482)
+++ branches/OKB (trunk integration)/HeuristicLab.Services.OKB/3.3/Query/IQueryService.cs	(revision 5502)
@@ -41,5 +41,5 @@
 
     [OperationContract]
-    IEnumerable<Run> GetRuns(IEnumerable<long> ids);
+    IEnumerable<Run> GetRuns(IEnumerable<long> ids, bool includeBinaryValues);
   }
 }
Index: branches/OKB (trunk integration)/HeuristicLab.Services.OKB/3.3/Query/QueryService.cs
===================================================================
--- branches/OKB (trunk integration)/HeuristicLab.Services.OKB/3.3/Query/QueryService.cs	(revision 5482)
+++ branches/OKB (trunk integration)/HeuristicLab.Services.OKB/3.3/Query/QueryService.cs	(revision 5502)
@@ -27,4 +27,5 @@
 using HeuristicLab.Services.OKB.DataAccess;
 using HeuristicLab.Services.OKB.Query.DataTransfer;
+using HeuristicLab.Services.OKB.Query.Filters;
 
 namespace HeuristicLab.Services.OKB.Query {
@@ -37,70 +38,175 @@
       List<Filter> filters = new List<Filter>();
       using (OKBDataContext okb = new OKBDataContext()) {
-        // run filters
+        #region Run Filters
         filters.Add(new OrdinalComparisonLongFilter(typeof(RunRandomSeedFilter).AssemblyQualifiedName, "Run Random Seed"));
         filters.Add(new OrdinalComparisonDateTimeFilter(typeof(RunCreatedDateFilter).AssemblyQualifiedName, "Run Created Date"));
-        filters.Add(new SetComparisonStringFilter(typeof(RunUserNameFilter).AssemblyQualifiedName, "Run User Name"));
-        filters.Add(new SetComparisonStringFilter(typeof(RunClientNameFilter).AssemblyQualifiedName, "Run Client Name"));
-
-        // result filters
-        filters.Add(new SetComparisonStringAvailableValuesFilter(typeof(ResultNameFilter).AssemblyQualifiedName, "Result Name", okb.Results.Select(x => x.Name).Distinct().ToArray()));
-        foreach (string name in okb.Results.Where(x => x.DataType.SqlName == "varbinary").Select(x => x.Name).Distinct())
-          filters.Add(new NameSetComparisonStringAvailableValuesFilter(typeof(ResultBlobValueDataTypeNameFilter).AssemblyQualifiedName, "Result " + name + " Value Data Type Name", name, okb.ResultBlobValues.Where(x => x.Result.Name == name).Select(x => x.DataType.Name).Distinct().ToArray()));
-        foreach (string name in okb.Results.Where(x => x.DataType.SqlName == "varbinary").Select(x => x.Name).Distinct())
-          filters.Add(new NameEqualityComparisonByteArrayFilter(typeof(ResultBlobValueValueFilter).AssemblyQualifiedName, "Result " + name + " Value", name));
-        foreach (string name in okb.Results.Where(x => x.DataType.SqlName == "bit").Select(x => x.Name).Distinct())
-          filters.Add(new NameEqualityComparisonBoolFilter(typeof(ResultBoolValueValueFilter).AssemblyQualifiedName, "Result " + name + " Value", name));
-        foreach (string name in okb.Results.Where(x => x.DataType.SqlName == "float").Select(x => x.Name).Distinct())
-          filters.Add(new NameOrdinalComparisonDoubleFilter(typeof(ResultFloatValueValueFilter).AssemblyQualifiedName, "Result " + name + " Value", name));
-        foreach (string name in okb.Results.Where(x => x.DataType.SqlName == "bigint").Select(x => x.Name).Distinct())
-          filters.Add(new NameOrdinalComparisonLongFilter(typeof(ResultIntValueValueFilter).AssemblyQualifiedName, "Result " + name + " Value", name));
-        foreach (string name in okb.Results.Where(x => x.DataType.SqlName == "nvarchar").Select(x => x.Name).Distinct())
-          filters.Add(new NameSetComparisonStringFilter(typeof(ResultStringValueValueFilter).AssemblyQualifiedName, "Result " + name + " Value", name));
-
-        // algorithm parameter filters
-        filters.Add(new SetComparisonStringAvailableValuesFilter(typeof(AlgorithmParameterNameFilter).AssemblyQualifiedName, "Algorithm Parameter Name", okb.AlgorithmParameters.Select(x => x.Name).Distinct().ToArray()));
-        foreach (string name in okb.AlgorithmParameters.Where(x => x.DataType.SqlName == "varbinary").Select(x => x.Name).Distinct())
-          filters.Add(new NameSetComparisonStringAvailableValuesFilter(typeof(AlgorithmParameterBlobValueDataTypeNameFilter).AssemblyQualifiedName, "Algorithm Parameter " + name + " Value Data Type Name", name, okb.AlgorithmParameterBlobValues.Where(x => x.AlgorithmParameter.Name == name).Select(x => x.DataType.Name).Distinct().ToArray()));
-        foreach (string name in okb.AlgorithmParameters.Where(x => x.DataType.SqlName == "varbinary").Select(x => x.Name).Distinct())
-          filters.Add(new NameEqualityComparisonByteArrayFilter(typeof(AlgorithmParameterBlobValueValueFilter).AssemblyQualifiedName, "Algorithm Parameter " + name + " Value", name));
-        foreach (string name in okb.AlgorithmParameters.Where(x => x.DataType.SqlName == "bit").Select(x => x.Name).Distinct())
-          filters.Add(new NameEqualityComparisonBoolFilter(typeof(AlgorithmParameterBoolValueValueFilter).AssemblyQualifiedName, "Algorithm Parameter " + name + " Value", name));
-        foreach (string name in okb.AlgorithmParameters.Where(x => x.DataType.SqlName == "float").Select(x => x.Name).Distinct())
-          filters.Add(new NameOrdinalComparisonDoubleFilter(typeof(AlgorithmParameterFloatValueValueFilter).AssemblyQualifiedName, "Algorithm Parameter " + name + " Value", name));
-        foreach (string name in okb.AlgorithmParameters.Where(x => x.DataType.SqlName == "bigint").Select(x => x.Name).Distinct())
-          filters.Add(new NameOrdinalComparisonLongFilter(typeof(AlgorithmParameterIntValueValueFilter).AssemblyQualifiedName, "Algorithm Parameter " + name + " Value", name));
-        foreach (string name in okb.AlgorithmParameters.Where(x => x.DataType.SqlName == "nvarchar").Select(x => x.Name).Distinct())
-          filters.Add(new NameSetComparisonStringFilter(typeof(AlgorithmParameterStringValueValueFilter).AssemblyQualifiedName, "Algorithm Parameter " + name + " Value", name));
-
-        // algorithm filters
-        filters.Add(new SetComparisonStringAvailableValuesFilter(typeof(AlgorithmNameFilter).AssemblyQualifiedName, "Algorithm Name", okb.Algorithms.Select(x => x.Name).Distinct().ToArray()));
-        filters.Add(new SetComparisonStringAvailableValuesFilter(typeof(AlgorithmClassNameFilter).AssemblyQualifiedName, "Algorithm Class Name", okb.AlgorithmClasses.Select(x => x.Name).Distinct().ToArray()));
-        filters.Add(new SetComparisonStringAvailableValuesFilter(typeof(AlgorithmPlatformNameFilter).AssemblyQualifiedName, "Algorithm Platform Name", okb.Platforms.Select(x => x.Name).Distinct().ToArray()));
-        filters.Add(new SetComparisonStringAvailableValuesFilter(typeof(AlgorithmDataDataTypeNameFilter).AssemblyQualifiedName, "Algorithm Data Type Name", okb.Algorithms.Select(x => x.AlgorithmData.DataType.Name).Distinct().ToArray()));
-
-        // problem parameter filters
-        filters.Add(new SetComparisonStringAvailableValuesFilter(typeof(ProblemParameterNameFilter).AssemblyQualifiedName, "Problem Parameter Name", okb.ProblemParameters.Select(x => x.Name).Distinct().ToArray()));
-        foreach (string name in okb.ProblemParameters.Where(x => x.DataType.SqlName == "varbinary").Select(x => x.Name).Distinct())
-          filters.Add(new NameSetComparisonStringAvailableValuesFilter(typeof(ProblemParameterBlobValueDataTypeNameFilter).AssemblyQualifiedName, "Problem Parameter " + name + " Value Data Type Name", name, okb.ProblemParameterBlobValues.Where(x => x.ProblemParameter.Name == name).Select(x => x.DataType.Name).Distinct().ToArray()));
-        foreach (string name in okb.ProblemParameters.Where(x => x.DataType.SqlName == "varbinary").Select(x => x.Name).Distinct())
-          filters.Add(new NameEqualityComparisonByteArrayFilter(typeof(ProblemParameterBlobValueValueFilter).AssemblyQualifiedName, "Problem Parameter " + name + " Value", name));
-        foreach (string name in okb.ProblemParameters.Where(x => x.DataType.SqlName == "bit").Select(x => x.Name).Distinct())
-          filters.Add(new NameEqualityComparisonBoolFilter(typeof(ProblemParameterBoolValueValueFilter).AssemblyQualifiedName, "Problem Parameter " + name + " Value", name));
-        foreach (string name in okb.ProblemParameters.Where(x => x.DataType.SqlName == "float").Select(x => x.Name).Distinct())
-          filters.Add(new NameOrdinalComparisonDoubleFilter(typeof(ProblemParameterFloatValueValueFilter).AssemblyQualifiedName, "Problem Parameter " + name + " Value", name));
-        foreach (string name in okb.ProblemParameters.Where(x => x.DataType.SqlName == "bigint").Select(x => x.Name).Distinct())
-          filters.Add(new NameOrdinalComparisonLongFilter(typeof(ProblemParameterIntValueValueFilter).AssemblyQualifiedName, "Problem Parameter " + name + " Value", name));
-        foreach (string name in okb.ProblemParameters.Where(x => x.DataType.SqlName == "nvarchar").Select(x => x.Name).Distinct())
-          filters.Add(new NameSetComparisonStringFilter(typeof(ProblemParameterStringValueValueFilter).AssemblyQualifiedName, "Problem Parameter " + name + " Value", name));
-
-        // problem filters
-        filters.Add(new SetComparisonStringAvailableValuesFilter(typeof(ProblemNameFilter).AssemblyQualifiedName, "Problem Name", okb.Problems.Select(x => x.Name).Distinct().ToArray()));
-        filters.Add(new SetComparisonStringAvailableValuesFilter(typeof(ProblemClassNameFilter).AssemblyQualifiedName, "Problem Class Name", okb.ProblemClasses.Select(x => x.Name).Distinct().ToArray()));
-        filters.Add(new SetComparisonStringAvailableValuesFilter(typeof(ProblemPlatformNameFilter).AssemblyQualifiedName, "Problem Platform Name", okb.Platforms.Select(x => x.Name).Distinct().ToArray()));
-        filters.Add(new SetComparisonStringAvailableValuesFilter(typeof(ProblemDataDataTypeNameFilter).AssemblyQualifiedName, "Problem Data Type Name", okb.Problems.Select(x => x.ProblemData.DataType.Name).Distinct().ToArray()));
-
-        // and/or filters
+        filters.Add(new StringComparisonFilter(typeof(RunUserNameFilter).AssemblyQualifiedName, "Run User Name"));
+        filters.Add(new StringComparisonFilter(typeof(RunClientNameFilter).AssemblyQualifiedName, "Run Client Name"));
+        #endregion
+
+        #region Parameter Filters
+        filters.Add(new StringComparisonAvailableValuesFilter(
+          typeof(ValueNameFilter).AssemblyQualifiedName,
+          "Parameter Name",
+          okb.ValueNames.Where(x => x.Category == ValueNameCategory.Parameter).Select(x => x.Name).Distinct().ToArray()
+        ));
+        foreach (string name in okb.ValueNames.Where(x => (x.Category == ValueNameCategory.Parameter) && (x.Type == ValueNameType.Binary)).Select(x => x.Name).Distinct())
+          filters.Add(new NameStringComparisonAvailableValuesFilter(
+            typeof(ValueDataTypeNameFilter).AssemblyQualifiedName,
+            "Parameter " + name + " Value Data Type Name",
+            name,
+            okb.Values.Where(x => (x.ValueName.Name == name) && (x.ValueName.Category == ValueNameCategory.Parameter) && (x.ValueName.Type == ValueNameType.Binary)).Select(x => x.DataType.Name).Distinct().ToArray()
+          ));
+        foreach (string name in okb.ValueNames.Where(x => (x.Category == ValueNameCategory.Parameter) && (x.Type == ValueNameType.Bool)).Select(x => x.Name).Distinct())
+          filters.Add(new NameEqualityComparisonBoolFilter(
+            typeof(BoolValueFilter).AssemblyQualifiedName,
+            "Parameter " + name + " Value",
+            name
+          ));
+        foreach (string name in okb.ValueNames.Where(x => (x.Category == ValueNameCategory.Parameter) && (x.Type == ValueNameType.Int)).Select(x => x.Name).Distinct())
+          filters.Add(new NameOrdinalComparisonIntFilter(
+            typeof(IntValueFilter).AssemblyQualifiedName,
+            "Parameter " + name + " Value",
+            name
+          ));
+        foreach (string name in okb.ValueNames.Where(x => (x.Category == ValueNameCategory.Parameter) && (x.Type == ValueNameType.Long)).Select(x => x.Name).Distinct())
+          filters.Add(new NameOrdinalComparisonLongFilter(
+            typeof(LongValueFilter).AssemblyQualifiedName,
+            "Parameter " + name + " Value",
+            name
+          ));
+        foreach (string name in okb.ValueNames.Where(x => (x.Category == ValueNameCategory.Parameter) && (x.Type == ValueNameType.Float)).Select(x => x.Name).Distinct())
+          filters.Add(new NameOrdinalComparisonFloatFilter(
+            typeof(FloatValueFilter).AssemblyQualifiedName,
+            "Parameter " + name + " Value",
+            name
+          ));
+        foreach (string name in okb.ValueNames.Where(x => (x.Category == ValueNameCategory.Parameter) && (x.Type == ValueNameType.Double)).Select(x => x.Name).Distinct())
+          filters.Add(new NameOrdinalComparisonDoubleFilter(
+            typeof(DoubleValueFilter).AssemblyQualifiedName,
+            "Parameter " + name + " Value",
+            name
+          ));
+        foreach (string name in okb.ValueNames.Where(x => (x.Category == ValueNameCategory.Parameter) && (x.Type == ValueNameType.String)).Select(x => x.Name).Distinct())
+          filters.Add(new NameStringComparisonFilter(
+            typeof(StringValueFilter).AssemblyQualifiedName,
+            "Parameter " + name + " Value",
+            name
+          ));
+        foreach (string name in okb.ValueNames.Where(x => (x.Category == ValueNameCategory.Parameter) && (x.Type == ValueNameType.Binary)).Select(x => x.Name).Distinct())
+          filters.Add(new NameEqualityComparisonByteArrayFilter(
+            typeof(BinaryValueFilter).AssemblyQualifiedName,
+            "Parameter " + name + " Value",
+            name
+          ));
+        #endregion
+
+        #region Result Filters
+        filters.Add(new StringComparisonAvailableValuesFilter(
+          typeof(ValueNameFilter).AssemblyQualifiedName,
+          "Result Name",
+          okb.ValueNames.Where(x => x.Category == ValueNameCategory.Result).Select(x => x.Name).Distinct().ToArray()
+        ));
+        foreach (string name in okb.ValueNames.Where(x => (x.Category == ValueNameCategory.Result) && (x.Type == ValueNameType.Binary)).Select(x => x.Name).Distinct())
+          filters.Add(new NameStringComparisonAvailableValuesFilter(
+            typeof(ValueDataTypeNameFilter).AssemblyQualifiedName,
+            "Result " + name + " Value Data Type Name",
+            name,
+            okb.Values.Where(x => (x.ValueName.Name == name) && (x.ValueName.Category == ValueNameCategory.Result) && (x.ValueName.Type == ValueNameType.Binary)).Select(x => x.DataType.Name).Distinct().ToArray()
+          ));
+        foreach (string name in okb.ValueNames.Where(x => (x.Category == ValueNameCategory.Result) && (x.Type == ValueNameType.Bool)).Select(x => x.Name).Distinct())
+          filters.Add(new NameEqualityComparisonBoolFilter(
+            typeof(BoolValueFilter).AssemblyQualifiedName,
+            "Result " + name + " Value",
+            name
+          ));
+        foreach (string name in okb.ValueNames.Where(x => (x.Category == ValueNameCategory.Result) && (x.Type == ValueNameType.Int)).Select(x => x.Name).Distinct())
+          filters.Add(new NameOrdinalComparisonIntFilter(
+            typeof(IntValueFilter).AssemblyQualifiedName,
+            "Result " + name + " Value",
+            name
+          ));
+        foreach (string name in okb.ValueNames.Where(x => (x.Category == ValueNameCategory.Result) && (x.Type == ValueNameType.Long)).Select(x => x.Name).Distinct())
+          filters.Add(new NameOrdinalComparisonLongFilter(
+            typeof(LongValueFilter).AssemblyQualifiedName,
+            "Result " + name + " Value",
+            name
+          ));
+        foreach (string name in okb.ValueNames.Where(x => (x.Category == ValueNameCategory.Result) && (x.Type == ValueNameType.Float)).Select(x => x.Name).Distinct())
+          filters.Add(new NameOrdinalComparisonFloatFilter(
+            typeof(FloatValueFilter).AssemblyQualifiedName,
+            "Result " + name + " Value",
+            name
+          ));
+        foreach (string name in okb.ValueNames.Where(x => (x.Category == ValueNameCategory.Result) && (x.Type == ValueNameType.Double)).Select(x => x.Name).Distinct())
+          filters.Add(new NameOrdinalComparisonDoubleFilter(
+            typeof(DoubleValueFilter).AssemblyQualifiedName,
+            "Result " + name + " Value",
+            name
+          ));
+        foreach (string name in okb.ValueNames.Where(x => (x.Category == ValueNameCategory.Result) && (x.Type == ValueNameType.String)).Select(x => x.Name).Distinct())
+          filters.Add(new NameStringComparisonFilter(
+            typeof(StringValueFilter).AssemblyQualifiedName,
+            "Result " + name + " Value",
+            name
+          ));
+        foreach (string name in okb.ValueNames.Where(x => (x.Category == ValueNameCategory.Result) && (x.Type == ValueNameType.Binary)).Select(x => x.Name).Distinct())
+          filters.Add(new NameEqualityComparisonByteArrayFilter(
+            typeof(BinaryValueFilter).AssemblyQualifiedName,
+            "Result " + name + " Value",
+            name
+          ));
+        #endregion
+
+        #region Algorithm Filters
+        filters.Add(new StringComparisonAvailableValuesFilter(
+          typeof(AlgorithmNameFilter).AssemblyQualifiedName,
+          "Algorithm Name",
+          okb.Algorithms.Select(x => x.Name).Distinct().ToArray()
+        ));
+        filters.Add(new StringComparisonAvailableValuesFilter(
+          typeof(AlgorithmClassNameFilter).AssemblyQualifiedName,
+          "Algorithm Class Name",
+          okb.AlgorithmClasses.Select(x => x.Name).Distinct().ToArray()
+        ));
+        filters.Add(new StringComparisonAvailableValuesFilter(
+          typeof(AlgorithmPlatformNameFilter).AssemblyQualifiedName,
+          "Algorithm Platform Name",
+          okb.Platforms.Select(x => x.Name).Distinct().ToArray()
+        ));
+        filters.Add(new StringComparisonAvailableValuesFilter(
+          typeof(AlgorithmDataTypeNameFilter).AssemblyQualifiedName,
+          "Algorithm Data Type Name",
+          okb.Algorithms.Select(x => x.DataType.Name).Distinct().ToArray()
+        ));
+        #endregion
+
+        #region Problem Filters
+        filters.Add(new StringComparisonAvailableValuesFilter(
+          typeof(ProblemNameFilter).AssemblyQualifiedName,
+          "Problem Name",
+          okb.Problems.Select(x => x.Name).Distinct().ToArray()
+        ));
+        filters.Add(new StringComparisonAvailableValuesFilter(
+          typeof(ProblemClassNameFilter).AssemblyQualifiedName,
+          "Problem Class Name",
+          okb.ProblemClasses.Select(x => x.Name).Distinct().ToArray()
+        ));
+        filters.Add(new StringComparisonAvailableValuesFilter(
+          typeof(ProblemPlatformNameFilter).AssemblyQualifiedName,
+          "Problem Platform Name",
+          okb.Platforms.Select(x => x.Name).Distinct().ToArray()
+        ));
+        filters.Add(new StringComparisonAvailableValuesFilter(
+          typeof(ProblemDataTypeNameFilter).AssemblyQualifiedName,
+          "Problem Data Type Name",
+          okb.Problems.Select(x => x.DataType.Name).Distinct().ToArray()
+        ));
+        #endregion
+
+        #region Combined Filters
         filters.Add(new CombinedFilter(typeof(AndFilter).AssemblyQualifiedName, "AND", BooleanOperation.And));
         filters.Add(new CombinedFilter(typeof(OrFilter).AssemblyQualifiedName, "OR", BooleanOperation.Or));
+        #endregion
       }
       return filters.OrderBy(x => x.Label);
@@ -119,52 +225,11 @@
     }
 
-    public IEnumerable<DataTransfer.Run> GetRuns(IEnumerable<long> ids) {
+    public IEnumerable<DataTransfer.Run> GetRuns(IEnumerable<long> ids, bool includeBinaryValues) {
       using (OKBDataContext okb = new OKBDataContext()) {
         DataLoadOptions dlo = new DataLoadOptions();
-        dlo.LoadWith<DataAccess.Run>(x => x.ResultBlobValues);
-        dlo.LoadWith<DataAccess.Run>(x => x.ResultBoolValues);
-        dlo.LoadWith<DataAccess.Run>(x => x.ResultFloatValues);
-        dlo.LoadWith<DataAccess.Run>(x => x.ResultIntValues);
-        dlo.LoadWith<DataAccess.Run>(x => x.ResultStringValues);
-        dlo.LoadWith<DataAccess.Run>(x => x.Experiment);
-        dlo.LoadWith<DataAccess.ResultBlobValue>(x => x.Result);
-        dlo.LoadWith<DataAccess.ResultBlobValue>(x => x.DataType);
-        dlo.LoadWith<DataAccess.ResultBoolValue>(x => x.Result);
-        dlo.LoadWith<DataAccess.ResultFloatValue>(x => x.Result);
-        dlo.LoadWith<DataAccess.ResultIntValue>(x => x.Result);
-        dlo.LoadWith<DataAccess.ResultStringValue>(x => x.Result);
-        dlo.LoadWith<DataAccess.Experiment>(x => x.AlgorithmParameterBlobValues);
-        dlo.LoadWith<DataAccess.Experiment>(x => x.AlgorithmParameterBoolValues);
-        dlo.LoadWith<DataAccess.Experiment>(x => x.AlgorithmParameterFloatValues);
-        dlo.LoadWith<DataAccess.Experiment>(x => x.AlgorithmParameterIntValues);
-        dlo.LoadWith<DataAccess.Experiment>(x => x.AlgorithmParameterStringValues);
-        dlo.LoadWith<DataAccess.Experiment>(x => x.ProblemParameterBlobValues);
-        dlo.LoadWith<DataAccess.Experiment>(x => x.ProblemParameterBoolValues);
-        dlo.LoadWith<DataAccess.Experiment>(x => x.ProblemParameterFloatValues);
-        dlo.LoadWith<DataAccess.Experiment>(x => x.ProblemParameterIntValues);
-        dlo.LoadWith<DataAccess.Experiment>(x => x.ProblemParameterStringValues);
-        //dlo.LoadWith<DataAccess.Experiment>(x => x.Algorithm);
-        //dlo.LoadWith<DataAccess.Experiment>(x => x.Problem);
-        dlo.LoadWith<DataAccess.AlgorithmParameterBlobValue>(x => x.AlgorithmParameter);
-        dlo.LoadWith<DataAccess.AlgorithmParameterBlobValue>(x => x.DataType);
-        dlo.LoadWith<DataAccess.AlgorithmParameterBoolValue>(x => x.AlgorithmParameter);
-        dlo.LoadWith<DataAccess.AlgorithmParameterFloatValue>(x => x.AlgorithmParameter);
-        dlo.LoadWith<DataAccess.AlgorithmParameterIntValue>(x => x.AlgorithmParameter);
-        dlo.LoadWith<DataAccess.AlgorithmParameterStringValue>(x => x.AlgorithmParameter);
-        dlo.LoadWith<DataAccess.ProblemParameterBlobValue>(x => x.ProblemParameter);
-        dlo.LoadWith<DataAccess.ProblemParameterBlobValue>(x => x.DataType);
-        dlo.LoadWith<DataAccess.ProblemParameterBoolValue>(x => x.ProblemParameter);
-        dlo.LoadWith<DataAccess.ProblemParameterFloatValue>(x => x.ProblemParameter);
-        dlo.LoadWith<DataAccess.ProblemParameterIntValue>(x => x.ProblemParameter);
-        dlo.LoadWith<DataAccess.ProblemParameterStringValue>(x => x.ProblemParameter);
-        //dlo.LoadWith<DataAccess.Algorithm>(x => x.AlgorithmParameters);
-        //dlo.LoadWith<DataAccess.Algorithm>(x => x.Results);
-        //dlo.LoadWith<DataAccess.Algorithm>(x => x.AlgorithmClass);
-        //dlo.LoadWith<DataAccess.Algorithm>(x => x.Platform);
-        //dlo.LoadWith<DataAccess.Problem>(x => x.ProblemParameters);
-        //dlo.LoadWith<DataAccess.Problem>(x => x.ProblemClass);
+        // TODO: specify LoadWiths
         okb.LoadOptions = dlo;
 
-        return okb.Runs.Where(x => ids.Contains(x.Id)).Select(x => ConvertToQueryResult(x)).ToArray();
+        return okb.Runs.Where(x => ids.Contains(x.Id)).Select(x => Convert.ToDto(x, includeBinaryValues)).ToArray();
       }
     }
@@ -174,50 +239,4 @@
       return runs.Where(f.Expression);
     }
-
-    private QueryResult ConvertToQueryResult(DataAccess.Run run) {
-      List<QueryValue> algorithmParameters = new List<QueryValue>();
-      List<QueryValue> problemParameters = new List<QueryValue>();
-      List<QueryValue> results = new List<QueryValue>();
-
-      foreach (DataAccess.AlgorithmParameterBlobValue value in run.Experiment.AlgorithmParameterBlobValues)
-        algorithmParameters.Add(new QueryBlobValue { Name = value.AlgorithmParameter.Name, DataTypeName = value.DataType.Name + " (" + value.DataType.TypeName + ")", Value = value.Value.ToArray() });
-      foreach (DataAccess.AlgorithmParameterBoolValue value in run.Experiment.AlgorithmParameterBoolValues)
-        algorithmParameters.Add(new QueryBoolValue { Name = value.AlgorithmParameter.Name, Value = value.Value });
-      foreach (DataAccess.AlgorithmParameterFloatValue value in run.Experiment.AlgorithmParameterFloatValues)
-        algorithmParameters.Add(new QueryFloatValue { Name = value.AlgorithmParameter.Name, Value = value.Value });
-      foreach (DataAccess.AlgorithmParameterIntValue value in run.Experiment.AlgorithmParameterIntValues)
-        algorithmParameters.Add(new QueryIntValue { Name = value.AlgorithmParameter.Name, Value = value.Value });
-      foreach (DataAccess.AlgorithmParameterStringValue value in run.Experiment.AlgorithmParameterStringValues)
-        algorithmParameters.Add(new QueryStringValue { Name = value.AlgorithmParameter.Name, Value = value.Value });
-
-      foreach (DataAccess.ProblemParameterBlobValue value in run.Experiment.ProblemParameterBlobValues)
-        problemParameters.Add(new QueryBlobValue { Name = value.ProblemParameter.Name, DataTypeName = value.DataType.Name + " (" + value.DataType.TypeName + ")", Value = value.Value.ToArray() });
-      foreach (DataAccess.ProblemParameterBoolValue value in run.Experiment.ProblemParameterBoolValues)
-        problemParameters.Add(new QueryBoolValue { Name = value.ProblemParameter.Name, Value = value.Value });
-      foreach (DataAccess.ProblemParameterFloatValue value in run.Experiment.ProblemParameterFloatValues)
-        problemParameters.Add(new QueryFloatValue { Name = value.ProblemParameter.Name, Value = value.Value });
-      foreach (DataAccess.ProblemParameterIntValue value in run.Experiment.ProblemParameterIntValues)
-        problemParameters.Add(new QueryIntValue { Name = value.ProblemParameter.Name, Value = value.Value });
-      foreach (DataAccess.ProblemParameterStringValue value in run.Experiment.ProblemParameterStringValues)
-        problemParameters.Add(new QueryStringValue { Name = value.ProblemParameter.Name, Value = value.Value });
-
-      foreach (DataAccess.ResultBlobValue value in run.ResultBlobValues)
-        results.Add(new QueryBlobValue { Name = value.Result.Name, DataTypeName = value.DataType.Name + " (" + value.DataType.TypeName + ")", Value = value.Value.ToArray() });
-      foreach (DataAccess.ResultBoolValue value in run.ResultBoolValues)
-        results.Add(new QueryBoolValue { Name = value.Result.Name, Value = value.Value });
-      foreach (DataAccess.ResultFloatValue value in run.ResultFloatValues)
-        results.Add(new QueryFloatValue { Name = value.Result.Name, Value = value.Value });
-      foreach (DataAccess.ResultIntValue value in run.ResultIntValues)
-        results.Add(new QueryIntValue { Name = value.Result.Name, Value = value.Value });
-      foreach (DataAccess.ResultStringValue value in run.ResultStringValues)
-        results.Add(new QueryStringValue { Name = value.Result.Name, Value = value.Value });
-
-      QueryResult result = new QueryResult();
-      result.Id = run.Id;
-      result.AlgorithmParameters = algorithmParameters;
-      result.ProblemParameters = problemParameters;
-      result.Results = results;
-      return result;
-    }
   }
 }
