Index: /branches/OKB/HeuristicLab.OKB.sln
===================================================================
--- /branches/OKB/HeuristicLab.OKB.sln	(revision 4479)
+++ /branches/OKB/HeuristicLab.OKB.sln	(revision 4480)
@@ -28,4 +28,14 @@
 EndProject
 Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "HeuristicLab.Clients.OKB-3.3", "HeuristicLab.Clients.OKB-3.3\HeuristicLab.Clients.OKB-3.3.csproj", "{73857A9C-9706-4B72-8D9C-210B5B6A5691}"
+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}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "HeuristicLab.Services.OKB.AttributeSelection-3.3", "HeuristicLab.Services.OKB.AttributeSelection\3.3\HeuristicLab.Services.OKB.AttributeSelection-3.3.csproj", "{E80A68DB-D6E1-4395-ABF0-AFE09E4DEF8B}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "HeuristicLab.Services.OKB-3.3", "HeuristicLab.Services.OKB\3.3\HeuristicLab.Services.OKB-3.3.csproj", "{766DA4B7-2A0E-4CDE-8F90-93D8B1AD62CF}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "HeuristicLab.Services.OKB.DataAccess-3.3.Tests", "HeuristicLab.Services.OKB.DataAccess\3.3\Tests\HeuristicLab.Services.OKB.DataAccess-3.3.Tests.csproj", "{89234006-FE1B-4A15-AFEC-91CB3526F0A5}"
 EndProject
 Global
@@ -167,4 +177,56 @@
 		{73857A9C-9706-4B72-8D9C-210B5B6A5691}.Release|x64.ActiveCfg = Release|Any CPU
 		{73857A9C-9706-4B72-8D9C-210B5B6A5691}.Release|x86.ActiveCfg = Release|Any CPU
+		{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
+		{E36BE58F-F3CE-40BB-9AB3-9F9E30AD5CCF}.Debug|x64.ActiveCfg = Debug|x64
+		{E36BE58F-F3CE-40BB-9AB3-9F9E30AD5CCF}.Debug|x64.Build.0 = Debug|x64
+		{E36BE58F-F3CE-40BB-9AB3-9F9E30AD5CCF}.Debug|x86.ActiveCfg = Debug|x86
+		{E36BE58F-F3CE-40BB-9AB3-9F9E30AD5CCF}.Debug|x86.Build.0 = Debug|x86
+		{E36BE58F-F3CE-40BB-9AB3-9F9E30AD5CCF}.Release|Any CPU.ActiveCfg = Release|Any CPU
+		{E36BE58F-F3CE-40BB-9AB3-9F9E30AD5CCF}.Release|Any CPU.Build.0 = Release|Any CPU
+		{E36BE58F-F3CE-40BB-9AB3-9F9E30AD5CCF}.Release|x64.ActiveCfg = Release|x64
+		{E36BE58F-F3CE-40BB-9AB3-9F9E30AD5CCF}.Release|x64.Build.0 = Release|x64
+		{E36BE58F-F3CE-40BB-9AB3-9F9E30AD5CCF}.Release|x86.ActiveCfg = Release|x86
+		{E36BE58F-F3CE-40BB-9AB3-9F9E30AD5CCF}.Release|x86.Build.0 = Release|x86
+		{E80A68DB-D6E1-4395-ABF0-AFE09E4DEF8B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{E80A68DB-D6E1-4395-ABF0-AFE09E4DEF8B}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{E80A68DB-D6E1-4395-ABF0-AFE09E4DEF8B}.Debug|x64.ActiveCfg = Debug|x64
+		{E80A68DB-D6E1-4395-ABF0-AFE09E4DEF8B}.Debug|x64.Build.0 = Debug|x64
+		{E80A68DB-D6E1-4395-ABF0-AFE09E4DEF8B}.Debug|x86.ActiveCfg = Debug|x86
+		{E80A68DB-D6E1-4395-ABF0-AFE09E4DEF8B}.Debug|x86.Build.0 = Debug|x86
+		{E80A68DB-D6E1-4395-ABF0-AFE09E4DEF8B}.Release|Any CPU.ActiveCfg = Release|Any CPU
+		{E80A68DB-D6E1-4395-ABF0-AFE09E4DEF8B}.Release|Any CPU.Build.0 = Release|Any CPU
+		{E80A68DB-D6E1-4395-ABF0-AFE09E4DEF8B}.Release|x64.ActiveCfg = Release|x64
+		{E80A68DB-D6E1-4395-ABF0-AFE09E4DEF8B}.Release|x64.Build.0 = Release|x64
+		{E80A68DB-D6E1-4395-ABF0-AFE09E4DEF8B}.Release|x86.ActiveCfg = Release|x86
+		{E80A68DB-D6E1-4395-ABF0-AFE09E4DEF8B}.Release|x86.Build.0 = Release|x86
+		{766DA4B7-2A0E-4CDE-8F90-93D8B1AD62CF}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{766DA4B7-2A0E-4CDE-8F90-93D8B1AD62CF}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{766DA4B7-2A0E-4CDE-8F90-93D8B1AD62CF}.Debug|x64.ActiveCfg = Debug|x64
+		{766DA4B7-2A0E-4CDE-8F90-93D8B1AD62CF}.Debug|x64.Build.0 = Debug|x64
+		{766DA4B7-2A0E-4CDE-8F90-93D8B1AD62CF}.Debug|x86.ActiveCfg = Debug|x86
+		{766DA4B7-2A0E-4CDE-8F90-93D8B1AD62CF}.Debug|x86.Build.0 = Debug|x86
+		{766DA4B7-2A0E-4CDE-8F90-93D8B1AD62CF}.Release|Any CPU.ActiveCfg = Release|Any CPU
+		{766DA4B7-2A0E-4CDE-8F90-93D8B1AD62CF}.Release|Any CPU.Build.0 = Release|Any CPU
+		{766DA4B7-2A0E-4CDE-8F90-93D8B1AD62CF}.Release|x64.ActiveCfg = Release|x64
+		{766DA4B7-2A0E-4CDE-8F90-93D8B1AD62CF}.Release|x64.Build.0 = Release|x64
+		{766DA4B7-2A0E-4CDE-8F90-93D8B1AD62CF}.Release|x86.ActiveCfg = Release|x86
+		{766DA4B7-2A0E-4CDE-8F90-93D8B1AD62CF}.Release|x86.Build.0 = Release|x86
+		{89234006-FE1B-4A15-AFEC-91CB3526F0A5}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{89234006-FE1B-4A15-AFEC-91CB3526F0A5}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{89234006-FE1B-4A15-AFEC-91CB3526F0A5}.Debug|x64.ActiveCfg = Debug|Any CPU
+		{89234006-FE1B-4A15-AFEC-91CB3526F0A5}.Debug|x86.ActiveCfg = Debug|Any CPU
+		{89234006-FE1B-4A15-AFEC-91CB3526F0A5}.Release|Any CPU.ActiveCfg = Release|Any CPU
+		{89234006-FE1B-4A15-AFEC-91CB3526F0A5}.Release|Any CPU.Build.0 = Release|Any CPU
+		{89234006-FE1B-4A15-AFEC-91CB3526F0A5}.Release|x64.ActiveCfg = Release|Any CPU
+		{89234006-FE1B-4A15-AFEC-91CB3526F0A5}.Release|x86.ActiveCfg = Release|Any CPU
 	EndGlobalSection
 	GlobalSection(SolutionProperties) = preSolution
Index: /branches/OKB/HeuristicLab.Services.OKB.AttributeSelection/3.3/AttributeSelector.cs
===================================================================
--- /branches/OKB/HeuristicLab.Services.OKB.AttributeSelection/3.3/AttributeSelector.cs	(revision 4480)
+++ /branches/OKB/HeuristicLab.Services.OKB.AttributeSelection/3.3/AttributeSelector.cs	(revision 4480)
@@ -0,0 +1,185 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2010 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.Collections.Generic;
+using System.Data.Linq;
+using System.Linq;
+using System.Linq.Expressions;
+using System.Text;
+using HeuristicLab.Services.OKB.DataAccess;
+
+namespace HeuristicLab.Services.OKB.AttributeSelection {
+
+  public class AttributeSelector : IAttributeSelector {
+
+    public string TableName { get; private set; }
+    public string FieldName { get; private set; }
+    public bool IsHidden { get; set; }
+    public object MinValue { get; set; }
+    public object MaxValue { get; set; }
+    public ICollection<object> AllowedValues { get; set; }
+
+    public Type TableType { get; private set; }
+    public bool IsDynamic { get; private set; }
+    public Type DataType { get; private set; }
+    public int ParentId { get; private set; }
+
+    protected static readonly List<string> staticTables = new List<string>() {
+      typeof(AlgorithmClass).Name,
+      typeof(Algorithm).Name,
+      typeof(ProblemClass).Name,
+      typeof(Problem).Name,
+      typeof(Experiment).Name,
+      typeof(Platform).Name,
+      typeof(SolutionRepresentation).Name,
+      typeof(Project).Name,
+      typeof(Run).Name,
+      typeof(Client).Name,
+      typeof(User).Name,
+    };
+
+    protected static readonly List<string> dynamicTables = new List<string>() {
+      typeof(ProblemCharacteristic).Name,
+      typeof(Parameter).Name,
+      typeof(Result).Name,
+    };
+
+    protected AttributeSelector(Type tableType, string fieldName, bool isDynamic, Type dataType, int parentId) {
+      TableName = tableType.Name;
+      FieldName = fieldName;
+      TableType = tableType;
+      IsDynamic = isDynamic;
+      DataType = dataType;
+      ParentId = parentId;
+    }
+
+    public AttributeSelector(OKBDataContext okb, string tableName, string fieldName) {
+      TableName = tableName;
+      FieldName = fieldName;
+      TableType = GetTableType(tableName);
+      ITable Table = GetTable(okb, tableName);
+      if (staticTables.Contains(tableName)) {
+        IsDynamic = false;
+        try {
+          DataType = TableType.GetProperty(fieldName).PropertyType;
+        }
+        catch (Exception x) {
+          throw new ArgumentException(String.Format(
+            "Invalid field name {0} in table {1}", fieldName, tableName),
+            x);
+        }
+      } else if (dynamicTables.Contains(tableName)) {
+        IsDynamic = true;
+        try {
+          IDynamicParent parent =
+            Table
+            .Cast<IDynamicParent>()
+            .Single(t => t.Name == fieldName);
+          ParentId = parent.Id;
+          DataType = parent.DataType.Type;
+        }
+        catch (Exception x) {
+          throw new ArgumentException(String.Format(
+            "Invalid field name {0} in table {1}", fieldName, tableName),
+            x);
+        }
+      } else {
+        throw new ArgumentException(String.Format("Invalid table name {0}", tableName));
+      }
+    }
+
+    protected static Type GetTableType(string name) {
+      try {
+        return typeof(Run).Assembly.GetType(typeof(Run).Namespace + "." + name, true);
+      }
+      catch {
+        return null;
+      }
+    }
+
+    protected static ITable GetTable(OKBDataContext okb, string name) {
+      return okb.GetTable(GetTableType(name));
+    }
+
+    public string FullName {
+      get {
+        return new StringBuilder().Append(TableName).Append('_').Append(FieldName).ToString();
+      }
+    }
+
+    protected static void LoadWith(DataLoadOptions dlo, Type parentType, Type type) {
+      ParameterExpression parent = Expression.Parameter(parentType, parentType.Name.ToLower());
+      LambdaExpression expr = Expression.Lambda(Expression.PropertyOrField(parent, type.Name), parent);
+      try {
+        dlo.LoadWith(expr);
+      }
+      catch (ArgumentException) {
+        Console.WriteLine(String.Format("Info: dlo.LoadWith<{0}>({1}) has already been added", parent.Type.Name, expr));
+      }
+    }
+
+    protected LambdaExpression GetDynamicSelector<T>(
+      Type masterType,
+      Expression<Func<Run, T>> parentSelector,
+      Expression<Func<T, int>> intSelector,
+      Expression<Func<T, double>> doubleSelector,
+      Expression<Func<T, string>> stringSelector,
+      Expression<Func<T, object>> operatorNameSelector) {
+      if (TableType != masterType)
+        return null;
+      ParameterExpression run = Expression.Parameter(typeof(Run), "run");
+      switch (Type.GetTypeCode(DataType)) {
+        case TypeCode.Int32:
+          return ExpressionTools.CallAfter<Run>(intSelector, parentSelector);
+        case TypeCode.Double:
+          return ExpressionTools.CallAfter<Run>(doubleSelector, parentSelector);
+        case TypeCode.String:
+          return ExpressionTools.CallAfter<Run>(stringSelector, parentSelector);
+        case TypeCode.Object:
+          return ExpressionTools.CallAfter<Run>(operatorNameSelector, parentSelector);
+      };
+      return null;
+    }
+
+    public override string ToString() {
+      StringBuilder sb = new StringBuilder()
+        .Append(TableName)
+        .Append('.')
+        .Append(FieldName);
+      if (MinValue != null)
+        sb.Append(" >").Append(MinValue);
+      if (MaxValue != null)
+        sb.Append(" <").Append(MaxValue);
+      if (AllowedValues != null)
+        sb.Append(" in [")
+          .Append(string.Join(", ",
+                    AllowedValues
+                    .Select(v => v.ToString())
+                    .ToArray()))
+          .Append(']');
+      if (IsHidden)
+        return String.Format("({0})", sb.ToString());
+      else
+        return sb.ToString();
+    }
+  }
+}
Index: /branches/OKB/HeuristicLab.Services.OKB.AttributeSelection/3.3/DataSetBuilder.cs
===================================================================
--- /branches/OKB/HeuristicLab.Services.OKB.AttributeSelection/3.3/DataSetBuilder.cs	(revision 4480)
+++ /branches/OKB/HeuristicLab.Services.OKB.AttributeSelection/3.3/DataSetBuilder.cs	(revision 4480)
@@ -0,0 +1,152 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2010 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.Collections;
+using System.Collections.Generic;
+using System.Data;
+using System.Data.Linq;
+using System.Linq;
+using System.Linq.Expressions;
+using HeuristicLab.Services.OKB.DataAccess;
+
+
+namespace HeuristicLab.Services.OKB.AttributeSelection {
+  public class DataSetBuilder : IEnumerable<DataRow> {
+
+    public static DataSet GetDataSet(OKBDataContext okb, IEnumerable<RunAttributeSelector> selectors) {
+      DataSetBuilder builder = new DataSetBuilder(okb, selectors);
+      DataTable runs = new DataTable("Runs");
+      foreach (DataRow row in builder) {
+        runs.Rows.Add(row);
+      }
+      DataSet dataSet = new DataSet();
+      dataSet.Tables.Add(runs);
+      return dataSet;
+    }
+
+    private IQueryable<Run> query;
+    public DataTable Runs { get; private set; }
+    private IEnumerable<RunAttributeSelector> selectors;
+
+    public DataSetBuilder(OKBDataContext okb, IEnumerable<RunAttributeSelector> selectors) {
+      DataLoadOptions dlo = new DataLoadOptions();
+      query = okb.Runs.AsQueryable();
+      Runs = new DataTable("Runs");
+      this.selectors = selectors;
+
+      foreach (var selector in selectors) {
+        query = query.Where(selector.GetWhereExpression());
+        selector.ConfigureDataLoadOptions(dlo);
+        if (!selector.IsHidden) {
+          AddColumn(selector);
+        }
+      }
+
+      okb.LoadOptions = dlo;
+      Console.WriteLine(query);
+    }
+
+    private void AddColumn(RunAttributeSelector selector) {
+      Type type = selector.DataType;
+      if (type == typeof(object))
+        type = typeof(string);
+      if (type.IsGenericType && type.GetGenericTypeDefinition() == typeof(Nullable<>))
+        type = type.GetGenericArguments()[0];
+      int i = 0;
+      string columnName = selector.FullName;
+      while (Runs.Columns.Contains(columnName)) {
+        i++;
+        columnName = string.Format("{0}({1})", selector.FullName, i);
+      }
+      Runs.Columns.Add(columnName, type);
+    }
+
+    public IEnumerator<DataRow> GetEnumerator() {
+      foreach (var run in query) {
+        DataRow row = Runs.NewRow();
+        int columnNr = 0;
+        foreach (var selector in selectors.Where(s => !s.IsHidden)) {
+          object value = selector.CompiledSelector(run);
+          row[columnNr] = selector.CompiledSelector(run) ?? DBNull.Value;
+          columnNr++;
+        }
+        yield return row;
+      }
+    }
+
+    IEnumerator IEnumerable.GetEnumerator() {
+      return GetEnumerator();
+    }
+
+
+    public int GetCount() {
+      return query.Count();
+    }
+
+    public static IEnumerable<object> GetEntities(OKBDataContext okb, Type tableType, IEnumerable<int> ids) {
+      ITable table = okb.GetTable(tableType);
+
+      // idFilter = element => ids.Contains(element.Id)
+      ParameterExpression param = Expression.Parameter(table.ElementType, "element");
+      LambdaExpression idFilter = Expression.Lambda(
+        Expression.Call(
+          null,
+          ExpressionTools.Enumerable_Contains.MakeGenericMethod(typeof(int)),
+          Expression.Constant(ids),
+          Expression.Property(param, "Id")), param);
+
+      // idSelector = element => element.Id
+      ParameterExpression param2 = Expression.Parameter(table.ElementType, "element");
+      LambdaExpression idSelector = Expression.Lambda(
+        Expression.Property(param2, "Id"), param2);
+
+      // selector = () => okb.<tableType>.Where(idFilter).OrderBy(idSelector).Cast<object>()
+      LambdaExpression selector =
+        Expression.Lambda(
+          Expression.Call(
+            null,
+            ExpressionTools.Enumerable_Cast.MakeGenericMethod(typeof(object)),
+            Expression.Call(
+              null,
+              ExpressionTools.Enumerable_OrderBy.MakeGenericMethod(table.ElementType, typeof(int)),
+              Expression.Call(
+                null,
+                ExpressionTools.Enumerable_Where.MakeGenericMethod(table.ElementType),
+                table.Expression,
+                idFilter),
+             idSelector)));
+      return (IEnumerable<object>)selector.Compile().DynamicInvoke();
+    }
+
+    public static int CountEntities(OKBDataContext okb, Type tableType) {
+      ITable table = okb.GetTable(tableType);
+      // okb.<tableType>.Count();
+      LambdaExpression counter =
+        Expression.Lambda(
+          Expression.Call(
+            null,
+            ExpressionTools.Enumerable_Count.MakeGenericMethod(table.ElementType),
+            table.Expression));
+      return (int)counter.Compile().DynamicInvoke();
+    }
+  }
+}
Index: /branches/OKB/HeuristicLab.Services.OKB.AttributeSelection/3.3/ExpressionTools.cs
===================================================================
--- /branches/OKB/HeuristicLab.Services.OKB.AttributeSelection/3.3/ExpressionTools.cs	(revision 4480)
+++ /branches/OKB/HeuristicLab.Services.OKB.AttributeSelection/3.3/ExpressionTools.cs	(revision 4480)
@@ -0,0 +1,107 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2010 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Linq.Expressions;
+using System.Reflection;
+using HeuristicLab.Services.OKB.DataAccess;
+
+namespace HeuristicLab.Services.OKB.AttributeSelection {
+
+  public static class ExpressionTools {
+
+    /// <summary>
+    /// p => f(g(p)) where p : T
+    /// </summary>
+    public static LambdaExpression CallAfter<T>(Expression f, Expression g) {
+      ParameterExpression p = Expression.Parameter(typeof(T), "p");
+      return Expression.Lambda(Expression.Invoke(f, Expression.Invoke(g, p)), p);
+    }
+
+    public static Selector GetSelector<T, D>(Expression<Func<Run, T>> tableSelector, Expression<Func<T, D>> fieldSelector) {
+      Expression member = fieldSelector.Body;
+      while (member is UnaryExpression)
+        member = ((UnaryExpression)member).Operand;
+      if (!(member is MemberExpression))
+        throw new ArgumentException("cannot determine field name");
+      string fieldName = ((MemberExpression)member).Member.Name;
+      return new Selector() {
+        Table = tableSelector.Body.Type,
+        Field = fieldName,
+        Expression = ExpressionTools.CallAfter<Run>(fieldSelector, tableSelector),
+      };
+    }
+
+    public static readonly List<Type> SupportedTypes = new List<Type>() {
+      typeof(int), typeof(double), typeof(DateTime), typeof(Guid) };
+
+    public static BinaryExpression GetLessThanOrEqualExpression<T>(Expression left, Expression right) {
+      if (SupportedTypes.Contains(typeof(T)))
+        return Expression.LessThanOrEqual(left, right);
+      else if (typeof(T) == typeof(string))
+        return Expression.LessThanOrEqual(
+          GetStringComparisonExpression(left, right), Expression.Constant(0));
+      else throw new ArgumentException("Unsupported comparison for types of " + typeof(T));
+    }
+
+    public static BinaryExpression GetGreaterOrEqualExpression<T>(Expression left, Expression right) {
+      if (SupportedTypes.Contains(typeof(T)))
+        return Expression.GreaterThanOrEqual(left, right);
+      else if (typeof(T) == typeof(string))
+        return Expression.GreaterThanOrEqual(
+          GetStringComparisonExpression(left, right), Expression.Constant(0));
+      else throw new ArgumentException("Unsupported comparison for types of " + typeof(T));
+    }
+
+    public static MethodCallExpression GetStringComparisonExpression(Expression left, Expression right) {
+      return Expression.Call(null, String_Compare, left, right);
+    }
+
+    public static readonly MethodInfo String_Compare =
+      typeof(string).GetMethod("Compare", new[] { typeof(string), typeof(string) });
+
+    public static readonly MethodInfo Enumerable_Contains =
+      typeof(Enumerable).GetMethods().Single(mi => mi.Name == "Contains" && mi.GetParameters().Count() == 2);
+
+    public static readonly MethodInfo Enumerable_Single =
+      typeof(Enumerable).GetMethods().Single(mi => mi.Name == "Single" && mi.GetParameters().Count() == 2);
+
+    public static readonly MethodInfo Enumerable_Where =
+      (from mi in typeof(Enumerable).GetMethods()
+       where mi.Name == "Where"
+       let p = mi.GetParameters()
+       where p.Count() == 2
+       let pt = p[1].ParameterType
+       where pt.IsGenericType
+       where pt.GetGenericArguments().Count() == 2
+       select mi).Single();
+
+    public static readonly MethodInfo Enumerable_Cast = typeof(Enumerable).GetMethod("Cast");
+
+    public static readonly MethodInfo Enumerable_OrderBy =
+      typeof(Enumerable).GetMethods().Single(mi => mi.Name == "OrderBy" && mi.GetParameters().Count() == 2);
+
+    public static readonly MethodInfo Enumerable_Count =
+      typeof(Enumerable).GetMethods().Single(mi => mi.Name == "Count" && mi.GetParameters().Count() == 1);
+  }
+}
Index: /branches/OKB/HeuristicLab.Services.OKB.AttributeSelection/3.3/HeuristicLab.Services.OKB.AttributeSelection-3.3.csproj
===================================================================
--- /branches/OKB/HeuristicLab.Services.OKB.AttributeSelection/3.3/HeuristicLab.Services.OKB.AttributeSelection-3.3.csproj	(revision 4480)
+++ /branches/OKB/HeuristicLab.Services.OKB.AttributeSelection/3.3/HeuristicLab.Services.OKB.AttributeSelection-3.3.csproj	(revision 4480)
@@ -0,0 +1,167 @@
+﻿<?xml version="1.0" encoding="utf-8"?>
+<Project ToolsVersion="4.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+  <PropertyGroup>
+    <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
+    <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
+    <ProductVersion>9.0.30729</ProductVersion>
+    <SchemaVersion>2.0</SchemaVersion>
+    <ProjectGuid>{E80A68DB-D6E1-4395-ABF0-AFE09E4DEF8B}</ProjectGuid>
+    <OutputType>Library</OutputType>
+    <AppDesignerFolder>Properties</AppDesignerFolder>
+    <RootNamespace>HeuristicLab.Services.OKB.AttributeSelection</RootNamespace>
+    <AssemblyName>HeuristicLab.Services.OKB.AttributeSelection-3.3</AssemblyName>
+    <TargetFrameworkVersion>v4.0</TargetFrameworkVersion>
+    <FileAlignment>512</FileAlignment>
+    <FileUpgradeFlags>
+    </FileUpgradeFlags>
+    <OldToolsVersion>3.5</OldToolsVersion>
+    <UpgradeBackupLocation />
+    <PublishUrl>publish\</PublishUrl>
+    <Install>true</Install>
+    <InstallFrom>Disk</InstallFrom>
+    <UpdateEnabled>false</UpdateEnabled>
+    <UpdateMode>Foreground</UpdateMode>
+    <UpdateInterval>7</UpdateInterval>
+    <UpdateIntervalUnits>Days</UpdateIntervalUnits>
+    <UpdatePeriodically>false</UpdatePeriodically>
+    <UpdateRequired>false</UpdateRequired>
+    <MapFileExtensions>true</MapFileExtensions>
+    <ApplicationRevision>0</ApplicationRevision>
+    <ApplicationVersion>1.0.0.%2a</ApplicationVersion>
+    <IsWebBootstrapper>false</IsWebBootstrapper>
+    <UseApplicationTrust>false</UseApplicationTrust>
+    <BootstrapperEnabled>true</BootstrapperEnabled>
+    <TargetFrameworkProfile />
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
+    <DebugSymbols>true</DebugSymbols>
+    <DebugType>full</DebugType>
+    <Optimize>false</Optimize>
+    <OutputPath>bin\Debug\</OutputPath>
+    <DefineConstants>DEBUG;TRACE</DefineConstants>
+    <ErrorReport>prompt</ErrorReport>
+    <WarningLevel>4</WarningLevel>
+    <CodeAnalysisRuleSet>AllRules.ruleset</CodeAnalysisRuleSet>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
+    <DebugType>pdbonly</DebugType>
+    <Optimize>true</Optimize>
+    <OutputPath>bin\Release\</OutputPath>
+    <DefineConstants>TRACE</DefineConstants>
+    <ErrorReport>prompt</ErrorReport>
+    <WarningLevel>4</WarningLevel>
+    <DocumentationFile>bin\Release\HeuristicLab.Services.OKB.AttributeSelection-3.3.xml</DocumentationFile>
+    <CodeAnalysisRuleSet>AllRules.ruleset</CodeAnalysisRuleSet>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|x64' ">
+    <DebugSymbols>true</DebugSymbols>
+    <OutputPath>bin\x64\Debug\</OutputPath>
+    <DefineConstants>DEBUG;TRACE</DefineConstants>
+    <DebugType>full</DebugType>
+    <PlatformTarget>x64</PlatformTarget>
+    <ErrorReport>prompt</ErrorReport>
+    <CodeAnalysisRuleSet>AllRules.ruleset</CodeAnalysisRuleSet>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|x64' ">
+    <OutputPath>bin\x64\Release\</OutputPath>
+    <DefineConstants>TRACE</DefineConstants>
+    <Optimize>true</Optimize>
+    <DebugType>pdbonly</DebugType>
+    <PlatformTarget>x64</PlatformTarget>
+    <ErrorReport>prompt</ErrorReport>
+    <DocumentationFile>bin\x64\Release\HeuristicLab.Services.OKB.AttributeSelection-3.3.xml</DocumentationFile>
+    <CodeAnalysisRuleSet>AllRules.ruleset</CodeAnalysisRuleSet>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|x86' ">
+    <DebugSymbols>true</DebugSymbols>
+    <OutputPath>bin\x86\Debug\</OutputPath>
+    <DefineConstants>DEBUG;TRACE</DefineConstants>
+    <DebugType>full</DebugType>
+    <PlatformTarget>x86</PlatformTarget>
+    <ErrorReport>prompt</ErrorReport>
+    <CodeAnalysisRuleSet>AllRules.ruleset</CodeAnalysisRuleSet>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|x86' ">
+    <OutputPath>bin\x86\Release\</OutputPath>
+    <DefineConstants>TRACE</DefineConstants>
+    <Optimize>true</Optimize>
+    <DebugType>pdbonly</DebugType>
+    <PlatformTarget>x86</PlatformTarget>
+    <ErrorReport>prompt</ErrorReport>
+    <DocumentationFile>bin\x86\Release\HeuristicLab.Services.OKB.AttributeSelection-3.3.xml</DocumentationFile>
+    <CodeAnalysisRuleSet>AllRules.ruleset</CodeAnalysisRuleSet>
+  </PropertyGroup>
+  <PropertyGroup>
+    <SignAssembly>true</SignAssembly>
+  </PropertyGroup>
+  <PropertyGroup>
+    <AssemblyOriginatorKeyFile>HeuristicLab.snk</AssemblyOriginatorKeyFile>
+  </PropertyGroup>
+  <ItemGroup>
+    <Reference Include="System" />
+    <Reference Include="System.Core">
+      <RequiredTargetFramework>3.5</RequiredTargetFramework>
+    </Reference>
+    <Reference Include="System.Data.Linq">
+      <RequiredTargetFramework>3.5</RequiredTargetFramework>
+    </Reference>
+    <Reference Include="System.Xml.Linq">
+      <RequiredTargetFramework>3.5</RequiredTargetFramework>
+    </Reference>
+    <Reference Include="System.Data.DataSetExtensions">
+      <RequiredTargetFramework>3.5</RequiredTargetFramework>
+    </Reference>
+    <Reference Include="System.Data" />
+    <Reference Include="System.Xml" />
+  </ItemGroup>
+  <ItemGroup>
+    <Compile Include="AttributeSelector.cs" />
+    <Compile Include="DataSetBuilder.cs" />
+    <Compile Include="ExpressionTools.cs" />
+    <Compile Include="IAttributeSelector.cs" />
+    <Compile Include="Properties\AssemblyInfo.cs" />
+    <None Include="HeuristicLab.snk" />
+    <None Include="Properties\AssemblyInfo.frame" />
+    <Compile Include="RunAttributeSelector.cs" />
+    <Compile Include="Selector.cs" />
+  </ItemGroup>
+  <ItemGroup>
+    <BootstrapperPackage Include="Microsoft.Net.Client.3.5">
+      <Visible>False</Visible>
+      <ProductName>.NET Framework 3.5 SP1 Client Profile</ProductName>
+      <Install>false</Install>
+    </BootstrapperPackage>
+    <BootstrapperPackage Include="Microsoft.Net.Framework.3.5.SP1">
+      <Visible>False</Visible>
+      <ProductName>.NET Framework 3.5 SP1</ProductName>
+      <Install>true</Install>
+    </BootstrapperPackage>
+    <BootstrapperPackage Include="Microsoft.Windows.Installer.3.1">
+      <Visible>False</Visible>
+      <ProductName>Windows Installer 3.1</ProductName>
+      <Install>true</Install>
+    </BootstrapperPackage>
+  </ItemGroup>
+  <ItemGroup>
+    <ProjectReference Include="..\..\HeuristicLab.Services.OKB.DataAccess\3.3\HeuristicLab.Services.OKB.DataAccess-3.3.csproj">
+      <Project>{E36BE58F-F3CE-40BB-9AB3-9F9E30AD5CCF}</Project>
+      <Name>HeuristicLab.Services.OKB.DataAccess-3.3</Name>
+    </ProjectReference>
+  </ItemGroup>
+  <Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
+  <PropertyGroup>
+    <PreBuildEvent>set Path=%25Path%25;$(ProjectDir);$(SolutionDir)
+set ProjectDir=$(ProjectDir)
+set SolutionDir=$(SolutionDir)
+set Outdir=$(Outdir)
+
+call PreBuildEvent.cmd</PreBuildEvent>
+  </PropertyGroup>
+  <!-- To modify your build process, add your task inside one of the targets below and uncomment it. 
+       Other similar extension points exist, see Microsoft.Common.targets.
+  <Target Name="BeforeBuild">
+  </Target>
+  <Target Name="AfterBuild">
+  </Target>
+  -->
+</Project>
Index: /branches/OKB/HeuristicLab.Services.OKB.AttributeSelection/3.3/IAttributeSelector.cs
===================================================================
--- /branches/OKB/HeuristicLab.Services.OKB.AttributeSelection/3.3/IAttributeSelector.cs	(revision 4480)
+++ /branches/OKB/HeuristicLab.Services.OKB.AttributeSelection/3.3/IAttributeSelector.cs	(revision 4480)
@@ -0,0 +1,35 @@
+﻿#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;
+
+namespace HeuristicLab.Services.OKB.AttributeSelection {
+
+  public interface IAttributeSelector {
+    string TableName { get; }
+    string FieldName { get; }
+    bool IsHidden { get; }
+    object MinValue { get; }
+    object MaxValue { get; }
+    ICollection<object> AllowedValues { get; }
+  }
+
+}
Index: /branches/OKB/HeuristicLab.Services.OKB.AttributeSelection/3.3/Properties/AssemblyInfo.frame
===================================================================
--- /branches/OKB/HeuristicLab.Services.OKB.AttributeSelection/3.3/Properties/AssemblyInfo.frame	(revision 4480)
+++ /branches/OKB/HeuristicLab.Services.OKB.AttributeSelection/3.3/Properties/AssemblyInfo.frame	(revision 4480)
@@ -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.Reflection;
+using System.Runtime.CompilerServices;
+using System.Runtime.InteropServices;
+
+// General Information about an assembly is controlled through the following
+// set of attributes. Change these attribute values to modify the information
+// associated with an assembly.
+[assembly: AssemblyTitle("HeuristicLab.Services.OKB.AttributeSelection")]
+[assembly: AssemblyDescription("Attribute selection for HeuristicLab OKB services")]
+[assembly: AssemblyConfiguration("")]
+[assembly: AssemblyCompany("")]
+[assembly: AssemblyProduct("HeuristicLab")]
+[assembly: AssemblyCopyright("(c) 2002-2010 HEAL")]
+[assembly: AssemblyTrademark("")]
+[assembly: AssemblyCulture("")]
+
+// Setting ComVisible to false makes the types in this assembly not visible
+// to COM components.  If you need to access a type in this assembly from
+// COM, set the ComVisible attribute to true on that type.
+[assembly: ComVisible(false)]
+
+// The following GUID is for the ID of the typelib if this project is exposed to COM
+[assembly: Guid("3cbb2cba-f4e7-4e4a-9cb2-1eed8b7e2a24")]
+
+// Version information for an assembly consists of the following four values:
+//
+//      Major Version
+//      Minor Version
+//      Build Number
+//      Revision
+//
+// You can specify all the values or you can default the Build and Revision Numbers
+// by using the '*' as shown below:
+// [assembly: AssemblyVersion("1.0.*")]
+[assembly: AssemblyVersion("3.3.0.0")]
+[assembly: AssemblyFileVersion("3.3.0.$WCREV$")]
Index: /branches/OKB/HeuristicLab.Services.OKB.AttributeSelection/3.3/RunAttributeSelector.cs
===================================================================
--- /branches/OKB/HeuristicLab.Services.OKB.AttributeSelection/3.3/RunAttributeSelector.cs	(revision 4480)
+++ /branches/OKB/HeuristicLab.Services.OKB.AttributeSelection/3.3/RunAttributeSelector.cs	(revision 4480)
@@ -0,0 +1,323 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2010 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.Collections;
+using System.Collections.Generic;
+using System.Data.Linq;
+using System.Linq;
+using System.Linq.Expressions;
+using System.Reflection;
+using HeuristicLab.Services.OKB.DataAccess;
+
+namespace HeuristicLab.Services.OKB.AttributeSelection {
+
+  public class AttributeSpecifier {
+    public string TableName { get; set; }
+    public string FieldName { get; set; }
+    public Type DataType { get; set; }
+  }
+
+  public class RunAttributeSelector : AttributeSelector {
+
+    public RunAttributeSelector(OKBDataContext okb, string table, string field)
+      : base(okb, table, field) { }
+
+    public RunAttributeSelector(OKBDataContext okb, IAttributeSelector selector)
+      : base(okb, selector.TableName, selector.FieldName) {
+      IsHidden = selector.IsHidden;
+      MinValue = selector.MinValue;
+      MaxValue = selector.MaxValue;
+      AllowedValues = selector.AllowedValues;
+    }
+
+    protected RunAttributeSelector(Type tableType, string fieldName, bool isDynamic, Type dataType, int parentId)
+      : base(tableType, fieldName, isDynamic, dataType, parentId) { }
+
+    public static IEnumerable<RunAttributeSelector> GetAllAttributeSelectors(OKBDataContext okb) {
+      OKBDataContext o = new OKBDataContext(okb.Connection.ConnectionString);
+      DataLoadOptions dlo = new DataLoadOptions();
+      dlo.LoadWith<Result>(r => r.DataType);
+      dlo.LoadWith<Parameter>(p => p.DataType);
+      dlo.LoadWith<ProblemCharacteristic>(pc => pc.DataType);
+      o.LoadOptions = dlo;
+      foreach (Selector selector in Selectors) {
+        yield return new RunAttributeSelector(o, selector.Table.Name, selector.Field);
+      }
+      foreach (Result result in okb.Results) {
+        yield return new RunAttributeSelector(typeof(Result), result.Name, true, result.DataType.Type, result.Id);
+      }
+      foreach (Parameter p in okb.Parameters) {
+        yield return new RunAttributeSelector(typeof(Parameter), p.Name, true, p.DataType.Type, p.Id);
+      }
+      foreach (ProblemCharacteristic pc in okb.ProblemCharacteristics) {
+        yield return new RunAttributeSelector(typeof(ProblemCharacteristic), pc.Name, true, pc.DataType.Type, pc.Id);
+      }
+    }
+
+    public void ConfigureDataLoadOptions(DataLoadOptions dlo) {
+      if (IsHidden)
+        return;
+      Include(TableType, dlo);
+    }
+
+    private static readonly Dictionary<Type, Type> parents = new Dictionary<Type, Type>() {
+      { typeof(Run), null },
+      { typeof(Client), typeof(Run) },
+      { typeof(User), typeof(Run) },
+      { typeof(Experiment), typeof(Run) },
+      { typeof(Project), typeof(Experiment) },
+      { typeof(Algorithm), typeof(Experiment) },
+      { typeof(AlgorithmClass), typeof(Algorithm) },
+      { typeof(Platform), typeof(Algorithm) },
+      { typeof(Problem), typeof(Experiment) },
+      { typeof(ProblemClass), typeof(Problem) },
+      { typeof(SolutionRepresentation), typeof(Problem) },
+    };
+
+    public static MethodInfo Enumerable_Where =
+      typeof(Enumerable).GetMethods().Single(mi =>
+        mi.Name == "Where" &&
+        mi.GetParameters().Count() == 2 &&
+        mi.GetParameters()[1].ParameterType.GetGenericArguments().Count() == 2);
+
+    public static MethodInfo Enumerable_Cast = typeof(Enumerable).GetMethod("Cast");
+
+    private void AssociateWith<T, V>(DataLoadOptions dlo,
+      Expression<Func<T, IEnumerable>> intSelector,
+      Expression<Func<T, IEnumerable>> doubleSelector,
+      Expression<Func<T, IEnumerable>> charSelector,
+      Expression<Func<T, IEnumerable>> blobSelector,
+      Expression<Func<V, bool>> filterPredicate) {
+      Expression<Func<T, IEnumerable>> selector;
+      switch (Type.GetTypeCode(DataType)) {
+        case TypeCode.Int32: selector = intSelector; break;
+        case TypeCode.Double: selector = doubleSelector; break;
+        case TypeCode.String: selector = charSelector; break;
+        default:
+          if (blobSelector != null)
+            selector = blobSelector;
+          else
+            throw new ArgumentException("DataType");
+          break;
+      }
+      ParameterExpression param = Expression.Parameter(typeof(T), "param");
+      dlo.AssociateWith<T>((Expression<Func<T, object>>)
+        Expression.Lambda(
+          Expression.Convert(
+            Expression.Call(
+              null,
+              Enumerable_Where.MakeGenericMethod(typeof(V)),
+              Expression.Convert(Expression.Invoke(selector, param), typeof(IEnumerable<V>)),
+              filterPredicate),
+          typeof(object)), param));
+      try {
+        dlo.LoadWith(selector);
+      }
+      catch (ArgumentException) {
+        Console.WriteLine("INFO: not adding (duplicate) load option: dlo.LoadWith<{0}>({1})", typeof(T).Name, selector.ToString());
+        Console.WriteLine("INFO: clearing association filters to allow multiple associations");
+        dlo.AssociateWith<T>((Expression<Func<T, object>>)
+          Expression.Lambda(
+            Expression.Convert(
+            Expression.Invoke(selector, param),
+            typeof(object)),
+          param));
+      }
+    }
+
+    private void Include(Type type, DataLoadOptions dlo) {
+      if (parents.ContainsKey(type)) {
+        Type parentType = parents[type];
+        if (parentType == null)
+          return;
+        LoadWith(dlo, parentType, type);
+        Include(parentType, dlo);
+      } else if (type == typeof(ProblemCharacteristic)) {
+        AssociateWith<Problem, IProblemCharacteristicValue>(dlo,
+          p => p.IntProblemCharacteristicValues,
+          p => p.FloatProblemCharacteristicValues,
+          p => p.CharProblemCharacteristicValues,
+          null,
+          pc => pc.ProblemId == ParentId);
+        Include(typeof(Problem), dlo);
+      } else if (type == typeof(Parameter)) {
+        AssociateWith<Experiment, IParameterValue>(dlo,
+          x => x.IntParameterValues,
+          x => x.FloatParameterValues,
+          x => x.CharParameterValues,
+          x => x.OperatorParameterValues,
+          ipv => ipv.ParameterId == ParentId);
+        try {
+          dlo.LoadWith<OperatorParameterValue>(opv => opv.DataType);
+        }
+        catch (ArgumentException) {
+          Console.WriteLine("INFO: not adding (duplicate) load option for OperatorParameterValue.DataType");
+        }
+        Include(typeof(Experiment), dlo);
+      } else if (type == typeof(Result)) {
+        AssociateWith<Run, IResultValue>(dlo,
+          r => r.IntResultValues,
+          r => r.FloatResultValues,
+          r => r.CharResultValues,
+          r => r.BlobResultValues,
+          irv => irv.ResultId == ParentId);
+      } else
+        throw new ArgumentException("type");
+    }
+
+    protected static List<Selector> Selectors = new List<Selector>() {
+        ExpressionTools.GetSelector(run => run, r => r.Id),
+        ExpressionTools.GetSelector(run => run, r => r.FinishedDate),
+
+        ExpressionTools.GetSelector(run => run.Client, c => c.Id),
+        ExpressionTools.GetSelector(run => run.Client, c => c.Name),
+
+        ExpressionTools.GetSelector(run => run.User, u => u.Id),
+        ExpressionTools.GetSelector(run => run.User, u => u.Name),
+
+        ExpressionTools.GetSelector(run => run.Experiment, x => x.Id),
+
+        ExpressionTools.GetSelector(run => run.Experiment.Project, p => p.Id),
+        ExpressionTools.GetSelector(run => run.Experiment.Project, p => p.Name),
+        ExpressionTools.GetSelector(run => run.Experiment.Project, p => p.Description),
+
+        ExpressionTools.GetSelector(run => run.Experiment.Algorithm, a => a.Id),
+        ExpressionTools.GetSelector(run => run.Experiment.Algorithm, a => a.Name),
+        ExpressionTools.GetSelector(run => run.Experiment.Algorithm, a => a.Description),
+
+        ExpressionTools.GetSelector(run => run.Experiment.Algorithm.AlgorithmClass, ac => ac.Id),
+        ExpressionTools.GetSelector(run => run.Experiment.Algorithm.AlgorithmClass, ac => ac.Name),
+        ExpressionTools.GetSelector(run => run.Experiment.Algorithm.AlgorithmClass, ac => ac.Description),
+
+        ExpressionTools.GetSelector(run => run.Experiment.Algorithm.Platform, p => p.Id),
+        ExpressionTools.GetSelector(run => run.Experiment.Algorithm.Platform, p => p.Name),
+        ExpressionTools.GetSelector(run => run.Experiment.Algorithm.Platform, p => p.Description),
+
+        ExpressionTools.GetSelector(run => run.Experiment.Problem, p => p.Id),
+        ExpressionTools.GetSelector(run => run.Experiment.Problem, p => p.Name),
+        ExpressionTools.GetSelector(run => run.Experiment.Problem, p => p.Description),
+
+        ExpressionTools.GetSelector(run => run.Experiment.Problem.ProblemClass, pc => pc.Id),
+        ExpressionTools.GetSelector(run => run.Experiment.Problem.ProblemClass, pc => pc.Name),
+        ExpressionTools.GetSelector(run => run.Experiment.Problem.ProblemClass, pc => pc.Description),
+
+        ExpressionTools.GetSelector(run => run.Experiment.Problem.SolutionRepresentation, sr => sr.Id),
+        ExpressionTools.GetSelector(run => run.Experiment.Problem.SolutionRepresentation, sr => sr.Name),
+        ExpressionTools.GetSelector(run => run.Experiment.Problem.SolutionRepresentation, sr => sr.Description)
+    };
+
+    private Func<Run, object> compiledSelector;
+
+    protected void CreateCompiledSelector<T>() {
+      var genericCompiledSelector = ((Expression<Func<Run, T>>)GetSelectorExpression()).Compile();
+      compiledSelector = run => {
+        try {
+          return (object)genericCompiledSelector(run);
+        }
+        catch (InvalidOperationException x) {
+          if (x.TargetSite == ExpressionTools.Enumerable_Single)
+            return null;
+          else
+            throw;
+        }
+      };
+    }
+
+    public Func<Run, object> CompiledSelector {
+      get {
+        if (compiledSelector == null) {
+          typeof(RunAttributeSelector)
+            .GetMethod("CreateCompiledSelector", BindingFlags.Instance | BindingFlags.NonPublic)
+            .MakeGenericMethod(DataType).Invoke(this, new object[0]);
+        }
+        return compiledSelector;
+      }
+    }
+
+    public LambdaExpression GetSelectorExpression() {
+      if (TableType == typeof(Parameter))
+        return
+          GetDynamicSelector(typeof(Parameter), run => run.Experiment,
+            x => x.IntParameterValues.Single(ipv => ipv.ParameterId == ParentId).Value,
+            x => x.FloatParameterValues.Single(fpv => fpv.ParameterId == ParentId).Value,
+            x => x.CharParameterValues.Single(cpv => cpv.ParameterId == ParentId).Value,
+            x => x.OperatorParameterValues.Single(opv => opv.ParameterId == ParentId).DataType.ClrName);
+      else if (TableType == typeof(Result))
+        return
+          GetDynamicSelector(typeof(Result), run => run,
+            r => r.IntResultValues.Single(irv => irv.ResultId == ParentId).Value,
+            r => r.FloatResultValues.Single(frv => frv.ResultId == ParentId).Value,
+            r => r.CharResultValues.Single(crv => crv.ResultId == ParentId).Value,
+            null);
+      else if (TableType == typeof(ProblemCharacteristic))
+        return
+          GetDynamicSelector(typeof(ProblemCharacteristic), run => run.Experiment.Problem,
+            p => p.IntProblemCharacteristicValues.Single(ipcv => ipcv.ProblemCharacteristicId == ParentId).Value,
+            p => p.FloatProblemCharacteristicValues.Single(fpcv => fpcv.ProblemCharacteristicId == ParentId).Value,
+            p => p.CharProblemCharacteristicValues.Single(cpcv => cpcv.ProblemCharacteristicId == ParentId).Value,
+            null);
+      else
+        return Selectors.Single(s => s.Table == TableType && s.Field == FieldName).Expression;
+    }
+
+    public Expression<Func<Run, bool>> GetWhereExpression() {
+      return GetWhereExpression(GetSelectorExpression());
+    }
+
+    protected Expression<Func<Run, bool>> GetWhereExpression(Expression selector) {
+      try {
+        return (Expression<Func<Run, bool>>)typeof(RunAttributeSelector)
+          .GetMethod("GenericGetWhereExpression", BindingFlags.Instance | BindingFlags.NonPublic)
+          .MakeGenericMethod(selector.Type.GetGenericArguments()[1])
+          .Invoke(this, new[] { selector });
+      }
+      catch (TargetInvocationException x) {
+        throw x.InnerException;
+      }
+    }
+
+    protected Expression<Func<Run, bool>> GenericGetWhereExpression<T>(Expression<Func<Run, T>> selector) {
+      ParameterExpression parameter = Expression.Parameter(typeof(Run), "run");
+      Expression testExpression = Expression.Constant(true);
+      if (AllowedValues != null) {
+        testExpression = Expression.AndAlso(testExpression,
+          Expression.Call(
+            null,
+            ExpressionTools.Enumerable_Contains.MakeGenericMethod(typeof(T)),
+            Expression.Constant(AllowedValues.Cast<T>().ToArray()),
+            Expression.Invoke(selector, parameter)));
+      }
+      if (MinValue != null) {
+        testExpression = Expression.AndAlso(testExpression,
+          ExpressionTools.GetLessThanOrEqualExpression<T>(Expression.Constant(MinValue),
+          Expression.Invoke(selector, parameter)));
+      }
+      if (MaxValue != null) {
+        testExpression = Expression.AndAlso(testExpression,
+          ExpressionTools.GetGreaterOrEqualExpression<T>(Expression.Constant(MaxValue),
+          Expression.Invoke(selector, parameter)));
+      }
+      return (Expression<Func<Run, bool>>)
+        Expression.Lambda(testExpression, parameter);
+    }
+  }
+}
Index: /branches/OKB/HeuristicLab.Services.OKB.AttributeSelection/3.3/Selector.cs
===================================================================
--- /branches/OKB/HeuristicLab.Services.OKB.AttributeSelection/3.3/Selector.cs	(revision 4480)
+++ /branches/OKB/HeuristicLab.Services.OKB.AttributeSelection/3.3/Selector.cs	(revision 4480)
@@ -0,0 +1,32 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2010 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.Linq.Expressions;
+
+namespace HeuristicLab.Services.OKB.AttributeSelection {
+
+  public class Selector {
+    public Type Table { get; set; }
+    public string Field { get; set; }
+    public LambdaExpression Expression { get; set; }
+  }
+}
Index: /branches/OKB/HeuristicLab.Services.OKB.DataAccess/3.3/Extensions.cs
===================================================================
--- /branches/OKB/HeuristicLab.Services.OKB.DataAccess/3.3/Extensions.cs	(revision 4480)
+++ /branches/OKB/HeuristicLab.Services.OKB.DataAccess/3.3/Extensions.cs	(revision 4480)
@@ -0,0 +1,536 @@
+#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;
+using System.Linq;
+
+namespace HeuristicLab.Services.OKB.DataAccess {
+  #region Value Management
+  #region Interfaces
+  public interface IParameterValue {
+    Experiment Experiment { get; set; }
+    object Value { get; set; }
+  }
+  public interface IAlgorithmParameterValue : IParameterValue {
+    AlgorithmParameter AlgorithmParameter { get; set; }
+  }
+  public interface IProblemParameterValue : IParameterValue {
+    ProblemParameter ProblemParameter { get; set; }
+  }
+  public interface IResultValue {
+    Result Result { get; set; }
+    Run Run { get; set; }
+    object Value { get; set; }
+  }
+  public interface IProblemCharacteristicValue {
+    Problem Problem { get; set; }
+    ProblemCharacteristic ProblemCharacteristic { get; set; }
+    object Value { get; set; }
+  }
+  #endregion
+
+  #region Algorithm Parameters
+  public partial class AlgorithmParameterBlobValue : IAlgorithmParameterValue {
+    object IAlgorithmParameterValue.Value {
+      get { return this.Value; }
+      set { this.Value = (Binary)value; }
+    }
+  }
+  public partial class AlgorithmParameterBoolValue : IAlgorithmParameterValue {
+    object IAlgorithmParameterValue.Value {
+      get { return this.Value; }
+      set { this.Value = (bool)value; }
+    }
+  }
+  public partial class AlgorithmParameterFloatValue : IAlgorithmParameterValue {
+    object IAlgorithmParameterValue.Value {
+      get { return this.Value; }
+      set { this.Value = (double)value; }
+    }
+  }
+  public partial class AlgorithmParameterIntValue : IAlgorithmParameterValue {
+    object IAlgorithmParameterValue.Value {
+      get { return this.Value; }
+      set { this.Value = (int)value; }
+    }
+  }
+  public partial class AlgorithmParameterStringValue : IAlgorithmParameterValue {
+    object IAlgorithmParameterValue.Value {
+      get { return this.Value; }
+      set { this.Value = (string)value; }
+    }
+  }
+  #endregion
+
+  #region Problem Parameters
+  public partial class ProblemParameterBlobValue : IProblemParameterValue {
+    object IProblemParameterValue.Value {
+      get { return this.Value; }
+      set { this.Value = (Binary)value; }
+    }
+  }
+  public partial class ProblemParameterBoolValue : IProblemParameterValue {
+    object IProblemParameterValue.Value {
+      get { return this.Value; }
+      set { this.Value = (bool)value; }
+    }
+  }
+  public partial class ProblemParameterFloatValue : IProblemParameterValue {
+    object IProblemParameterValue.Value {
+      get { return this.Value; }
+      set { this.Value = (double)value; }
+    }
+  }
+  public partial class ProblemParameterIntValue : IProblemParameterValue {
+    object IProblemParameterValue.Value {
+      get { return this.Value; }
+      set { this.Value = (int)value; }
+    }
+  }
+  public partial class ProblemParameterStringValue : IProblemParameterValue {
+    object IProblemParameterValue.Value {
+      get { return this.Value; }
+      set { this.Value = (string)value; }
+    }
+  }
+  #endregion
+
+  #region Results
+  public partial class ResultBlobValue : IResultValue {
+    object IResultValue.Value {
+      get { return this.Value; }
+      set { this.Value = (Binary)value; }
+    }
+  }
+  public partial class ResultBoolValue : IResultValue {
+    object IResultValue.Value {
+      get { return this.Value; }
+      set { this.Value = (bool)value; }
+    }
+  }
+  public partial class ResultFloatValue : IResultValue {
+    object IResultValue.Value {
+      get { return this.Value; }
+      set { this.Value = (double)value; }
+    }
+  }
+  public partial class ResultIntValue : IResultValue {
+    object IResultValue.Value {
+      get { return this.Value; }
+      set { this.Value = (int)value; }
+    }
+  }
+  public partial class ResultStringValue : IResultValue {
+    object IResultValue.Value {
+      get { return this.Value; }
+      set { this.Value = (string)value; }
+    }
+  }
+  #endregion
+
+  #region Problem Characteristics
+  public partial class ProblemCharacteristicIntValue : IProblemCharacteristicValue {
+    object IProblemCharacteristicValue.Value {
+      get { return this.Value; }
+      set { this.Value = (int)value; }
+    }
+  }
+  public partial class ProblemCharacteristicFloatValue : IProblemCharacteristicValue {
+    object IProblemCharacteristicValue.Value {
+      get { return this.Value; }
+      set { this.Value = (double)value; }
+    }
+  }
+  public partial class ProblemCharacteristicStringValue : IProblemCharacteristicValue {
+    object IProblemCharacteristicValue.Value {
+      get { return this.Value; }
+      set { this.Value = (string)value; }
+    }
+  }
+  #endregion
+
+  public partial class Experiment {
+    public IQueryable<IAlgorithmParameterValue> AlgorithmParameterValues {
+      get {
+        return AlgorithmParameterBlobValues
+          .AsQueryable()
+          .Cast<IAlgorithmParameterValue>()
+          .Concat(AlgorithmParameterBoolValues.Cast<IAlgorithmParameterValue>())
+          .Concat(AlgorithmParameterFloatValues.Cast<IAlgorithmParameterValue>())
+          .Concat(AlgorithmParameterIntValues.Cast<IAlgorithmParameterValue>())
+          .Concat(AlgorithmParameterStringValues.Cast<IAlgorithmParameterValue>());
+      }
+      set {
+
+
+        if (value == null) return;
+        foreach (IParameterValue pv in value) {
+          if (pv == null) continue;
+          if (pv is IntParameterValue) {
+            IntParameterValues.Add(new IntParameterValue() { ParameterId = pv.ParameterId, Value = (int)pv.Value });
+          } else if (pv is FloatParameterValue) {
+            FloatParameterValues.Add(new FloatParameterValue() { ParameterId = pv.ParameterId, Value = (double)pv.Value });
+          } else if (pv is CharParameterValue) {
+            CharParameterValues.Add(new CharParameterValue() { ParameterId = pv.ParameterId, Value = (string)pv.Value });
+          } else if (pv is OperatorParameterValue) {
+            OperatorParameterValues.Add(new OperatorParameterValue() {
+              ParameterId = pv.ParameterId,
+              Value = (Binary)pv.Value,
+              DataTypeId = ((OperatorParameterValue)pv).DataTypeId,
+            });
+          } else {
+            throw new ArgumentException("Invalid Parameter type" + pv.GetType());
+          }
+        }
+      }
+    }
+  }
+
+  public partial class Run {
+    public IQueryable<IResultValue> ResultValues {
+      get {
+        return IntResultValues
+          .AsQueryable()
+          .Cast<IResultValue>()
+          .Concat(FloatResultValues.Cast<IResultValue>())
+          .Concat(CharResultValues.Cast<IResultValue>())
+          .Concat(BlobResultValues.Cast<IResultValue>());
+      }
+      set {
+        foreach (IResultValue rv in value) {
+          if (rv == null) continue;
+          if (rv is IntResultValue) {
+            IntResultValues.Add(new IntResultValue() { ResultId = rv.ResultId, Value = (int)rv.Value });
+          } else if (rv is FloatResultValue) {
+            FloatResultValues.Add(new FloatResultValue() { ResultId = rv.ResultId, Value = (double)rv.Value });
+          } else if (rv is CharResultValue) {
+            CharResultValues.Add(new CharResultValue() { ResultId = rv.ResultId, Value = (string)rv.Value });
+          } else if (rv is BlobResultValue) {
+            BlobResultValues.Add(new BlobResultValue() { ResultId = rv.ResultId, Value = (Binary)rv.Value });
+          } else {
+            throw new ArgumentException("Invalid result value type " + rv.GetType());
+          }
+        }
+      }
+    }
+  }
+  public partial class Result {
+    public IQueryable<IResultValue> ResultValues {
+      get {
+        return IntResultValues
+          .AsQueryable()
+          .Cast<IResultValue>()
+          .Concat(FloatResultValues.Cast<IResultValue>())
+          .Concat(CharResultValues.Cast<IResultValue>())
+          .Concat(BlobResultValues.Cast<IResultValue>());
+      }
+    }
+  }
+
+  public partial class Problem {
+    public IQueryable<IProblemCharacteristicValue> ProblemCharacteristicValues {
+      get {
+        return IntProblemCharacteristicValues
+          .AsQueryable()
+          .Cast<IProblemCharacteristicValue>()
+          .Concat(FloatProblemCharacteristicValues.Cast<IProblemCharacteristicValue>())
+          .Concat(CharProblemCharacteristicValues.Cast<IProblemCharacteristicValue>());
+      }
+    }
+  }
+  public partial class ProblemCharacteristic {
+    public IQueryable<IProblemCharacteristicValue> ProblemCharacteristicValues {
+      get {
+        return IntProblemCharacteristicValues
+          .AsQueryable()
+          .Cast<IProblemCharacteristicValue>()
+          .Concat(FloatProblemCharacteristicValues.Cast<IProblemCharacteristicValue>())
+          .Concat(CharProblemCharacteristicValues.Cast<IProblemCharacteristicValue>());
+      }
+    }
+  }
+  #endregion
+
+  #region Abuse entities to store parameter values for a single (not yet existing experiment)
+  public partial class Parameter {
+    public IParameterValue ParameterValue {
+      get {
+        try {
+          return IntParameterValues
+            .AsQueryable()
+            .Cast<IParameterValue>()
+            .Concat(FloatParameterValues.Cast<IParameterValue>())
+            .Concat(CharParameterValues.Cast<IParameterValue>())
+            .Concat(OperatorParameterValues.Cast<IParameterValue>())
+            .ToList().Single();
+        }
+        catch {
+          return null;
+        }
+      }
+      set {
+        if (value == ParameterValue) // access to ParameterValue ensures that there is a single value
+          return;
+        if (value == null)
+          throw new ArgumentNullException("ParameterValue");
+        IParameterValue oldValue = ParameterValue;
+        Type t = value.GetType();
+        if (oldValue.GetType() != t)
+          throw new ArgumentException("cannot assign value with different type");
+        if (t == typeof(IntParameterValue)) {
+          IntParameterValues.Clear();
+          IntParameterValues.Add((IntParameterValue)value);
+        } else if (t == typeof(FloatParameterValue)) {
+          FloatParameterValues.Clear();
+          FloatParameterValues.Add((FloatParameterValue)value);
+        } else if (t == typeof(CharParameterValue)) {
+          CharParameterValues.Clear();
+          CharParameterValues.Add((CharParameterValue)value);
+        } else if (t == typeof(OperatorParameterValue)) {
+          OperatorParameterValues.Clear();
+          OperatorParameterValues.Add((OperatorParameterValue)value);
+        } else throw new ArgumentException("invalid parameter value type " + t.Name);
+      }
+    }
+  }
+  public partial class Result {
+    public IResultValue ResultValue {
+      get {
+        try {
+          return IntResultValues
+            .AsQueryable()
+            .Cast<IResultValue>()
+            .Concat(FloatResultValues.Cast<IResultValue>())
+            .Concat(CharResultValues.Cast<IResultValue>())
+            .Concat(BlobResultValues.Cast<IResultValue>()).ToList().Single();
+        }
+        catch {
+          return null;
+        }
+      }
+      set {
+        if (value == ResultValue)
+          return;
+        if (value == null)
+          throw new ArgumentNullException("ResultValue");
+        IResultValue oldValue = ResultValue;
+        Type t = value.GetType();
+        if (oldValue.GetType() != t)
+          throw new ArgumentException("cannot assign value with different type");
+        if (t == typeof(IntResultValue)) {
+          IntResultValues.Clear();
+          IntResultValues.Add((IntResultValue)value);
+        } else if (t == typeof(FloatResultValue)) {
+          FloatResultValues.Clear();
+          FloatResultValues.Add((FloatResultValue)value);
+        } else if (t == typeof(CharResultValue)) {
+          CharResultValues.Clear();
+          CharResultValues.Add((CharResultValue)value);
+        } else if (t == typeof(BlobResultValue)) {
+          BlobResultValues.Clear();
+          BlobResultValues.Add((BlobResultValue)value);
+        } else throw new ArgumentException("invalid result value type " + t.Name);
+      }
+    }
+  }
+  public partial class Algorithm {
+    public IQueryable<Parameter> Parameters {
+      get {
+        return Algorithm_Parameters.AsQueryable().Select(ap => ap.Parameter);
+      }
+    }
+    public IQueryable<IntParameterValue> IntParameterValues {
+      get {
+        return Parameters.AsQueryable()
+          .Where(p => p.IntParameterValues.Count > 0)
+          .Select(p => p.IntParameterValues.Single());
+      }
+    }
+    public IQueryable<FloatParameterValue> FloatParameterValues {
+      get {
+        return Parameters.AsQueryable()
+          .Where(p => p.FloatParameterValues.Count > 0)
+          .Select(p => p.FloatParameterValues.Single());
+      }
+    }
+    public IQueryable<CharParameterValue> CharParameterValues {
+      get {
+        return Parameters.AsQueryable()
+          .Where(p => p.CharParameterValues.Count > 0)
+          .Select(p => p.CharParameterValues.Single());
+      }
+    }
+    public IQueryable<OperatorParameterValue> OperatorParameterValues {
+      get {
+        return Parameters.AsQueryable()
+          .Where(p => p.OperatorParameterValues.Count > 0)
+          .Select(p => p.OperatorParameterValues.Single());
+      }
+    }
+    public IQueryable<IParameterValue> ParameterValues {
+      get {
+        return Parameters.AsQueryable().Select(p => p.ParameterValue);
+      }
+    }
+
+    public IQueryable<Result> Results {
+      get {
+        return Algorithm_Results.AsQueryable().Select(ar => ar.Result);
+      }
+    }
+    public IQueryable<IntResultValue> IntResultValues {
+      get {
+        return Results.AsQueryable()
+          .Where(r => r.IntResultValues.Count > 0)
+          .Select(r => r.IntResultValues.Single());
+      }
+    }
+    public IQueryable<FloatResultValue> FloatResultValues {
+      get {
+        return Results.AsQueryable()
+          .Where(r => r.FloatResultValues.Count > 0)
+          .Select(r => r.FloatResultValues.Single());
+      }
+    }
+    public IQueryable<CharResultValue> CharResultValues {
+      get {
+
+        return Results.AsQueryable()
+          .Where(r => r.CharResultValues.Count > 0)
+          .Select(r => r.CharResultValues.Single());
+      }
+    }
+    public IQueryable<BlobResultValue> BlobResultValues {
+      get {
+        return Results.AsQueryable()
+          .Where(r => r.BlobResultValues.Count > 0)
+          .Select(r => r.BlobResultValues.Single());
+      }
+    }
+    public IQueryable<IResultValue> ResultValues {
+      get {
+        return Results.AsQueryable().Select(r => r.ResultValue);
+      }
+    }
+  }
+  #endregion
+
+  #region Type access
+  public partial class DataType {
+    public Type Type {
+      get {
+        return Type.GetType(ClrName, false) ?? typeof(object);
+      }
+    }
+  }
+  #endregion
+
+  #region NamedEntities
+  public interface INamedEntity {
+    int Id { get; }
+    string Name { get; }
+    string Description { get; }
+  }
+  public partial class AlgorithmClass : INamedEntity { }
+  public partial class Algorithm : INamedEntity { }
+  public partial class ProblemClass : INamedEntity { }
+  public partial class Problem : INamedEntity { }
+  public partial class SolutionRepresentation : INamedEntity { }
+  public partial class ProblemCharacteristic : INamedEntity { }
+  public partial class Parameter : INamedEntity { }
+  public partial class Result : INamedEntity { }
+  public partial class Project : INamedEntity { }
+  public partial class Platform : INamedValue { }
+  #endregion
+
+  #region DataTypes
+  public interface IIntValue {
+    int Value { get; }
+  }
+  public partial class IntResultValue : IIntValue { }
+  public partial class IntParameterValue : IIntValue { }
+  public partial class IntProblemCharacteristicValue : IIntValue { }
+  public interface IFloatValue {
+    double Value { get; }
+  }
+  public partial class FloatResultValue : IFloatValue { }
+  public partial class FloatParameterValue : IFloatValue { }
+  public partial class FloatProblemCharacteristicValue : IFloatValue { }
+  public interface ICharValue {
+    string Value { get; }
+  }
+  public partial class CharResultValue : ICharValue { }
+  public partial class CharParameterValue : ICharValue { }
+  public partial class CharProblemCharacteristicValue : ICharValue { }
+  #endregion
+
+  #region NamedValues
+  public interface INamedValue {
+    string Name { get; }
+  }
+  public interface IValue<T> : INamedValue {
+    T Value { get; }
+  }
+  public partial class IntResultValue : IValue<int> {
+    public string Name { get { return Result.Name; } }
+  }
+  public partial class FloatResultValue : IValue<double> {
+    public string Name { get { return Result.Name; } }
+  }
+  public partial class CharResultValue : IValue<string> {
+    public string Name { get { return Result.Name; } }
+  }
+  public partial class BlobResultValue : IValue<Binary> {
+    public string Name { get { return Result.Name; } }
+  }
+  public partial class IntParameterValue : IValue<int> {
+    public string Name { get { return Parameter.Name; } }
+  }
+  public partial class FloatParameterValue : IValue<double> {
+    public string Name { get { return Parameter.Name; } }
+  }
+  public partial class CharParameterValue : IValue<string> {
+    public string Name { get { return Parameter.Name; } }
+  }
+  public partial class OperatorParameterValue : IValue<Binary> {
+    public string Name { get { return Parameter.Name; } }
+  }
+  public partial class IntProblemCharacteristicValue : IValue<int> {
+    public string Name { get { return ProblemCharacteristic.Name; } }
+  }
+  public partial class FloatProblemCharacteristicValue : IValue<double> {
+    public string Name { get { return ProblemCharacteristic.Name; } }
+  }
+  public partial class CharProblemCharacteristicValue : IValue<string> {
+    public string Name { get { return ProblemCharacteristic.Name; } }
+  }
+  #endregion
+
+  #region DynamicTypeInformation
+  public interface IDynamicParent : INamedEntity {
+    DataType DataType { get; }
+  }
+  public partial class ProblemCharacteristic : IDynamicParent { }
+  public partial class Parameter : IDynamicParent { }
+  public partial class Result : IDynamicParent { }
+  #endregion
+}
Index: /branches/OKB/HeuristicLab.Services.OKB.DataAccess/3.3/HeuristicLab.Services.OKB.DataAccess-3.3.csproj
===================================================================
--- /branches/OKB/HeuristicLab.Services.OKB.DataAccess/3.3/HeuristicLab.Services.OKB.DataAccess-3.3.csproj	(revision 4480)
+++ /branches/OKB/HeuristicLab.Services.OKB.DataAccess/3.3/HeuristicLab.Services.OKB.DataAccess-3.3.csproj	(revision 4480)
@@ -0,0 +1,206 @@
+﻿<?xml version="1.0" encoding="utf-8"?>
+<Project ToolsVersion="4.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+  <PropertyGroup>
+    <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
+    <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
+    <ProductVersion>9.0.30729</ProductVersion>
+    <SchemaVersion>2.0</SchemaVersion>
+    <ProjectGuid>{E36BE58F-F3CE-40BB-9AB3-9F9E30AD5CCF}</ProjectGuid>
+    <OutputType>Library</OutputType>
+    <AppDesignerFolder>Properties</AppDesignerFolder>
+    <RootNamespace>HeuristicLab.Services.OKB.DataAccess</RootNamespace>
+    <AssemblyName>HeuristicLab.Services.OKB.DataAccess-3.3</AssemblyName>
+    <TargetFrameworkVersion>v4.0</TargetFrameworkVersion>
+    <FileAlignment>512</FileAlignment>
+    <FileUpgradeFlags>
+    </FileUpgradeFlags>
+    <OldToolsVersion>3.5</OldToolsVersion>
+    <UpgradeBackupLocation />
+    <PublishUrl>publish\</PublishUrl>
+    <Install>true</Install>
+    <InstallFrom>Disk</InstallFrom>
+    <UpdateEnabled>false</UpdateEnabled>
+    <UpdateMode>Foreground</UpdateMode>
+    <UpdateInterval>7</UpdateInterval>
+    <UpdateIntervalUnits>Days</UpdateIntervalUnits>
+    <UpdatePeriodically>false</UpdatePeriodically>
+    <UpdateRequired>false</UpdateRequired>
+    <MapFileExtensions>true</MapFileExtensions>
+    <ApplicationRevision>0</ApplicationRevision>
+    <ApplicationVersion>1.0.0.%2a</ApplicationVersion>
+    <IsWebBootstrapper>false</IsWebBootstrapper>
+    <UseApplicationTrust>false</UseApplicationTrust>
+    <BootstrapperEnabled>true</BootstrapperEnabled>
+    <TargetFrameworkProfile />
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
+    <DebugSymbols>true</DebugSymbols>
+    <DebugType>full</DebugType>
+    <Optimize>false</Optimize>
+    <OutputPath>bin\Debug\</OutputPath>
+    <DefineConstants>DEBUG;TRACE</DefineConstants>
+    <ErrorReport>prompt</ErrorReport>
+    <WarningLevel>4</WarningLevel>
+    <CodeAnalysisRuleSet>AllRules.ruleset</CodeAnalysisRuleSet>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
+    <DebugType>pdbonly</DebugType>
+    <Optimize>true</Optimize>
+    <OutputPath>bin\Release\</OutputPath>
+    <DefineConstants>TRACE</DefineConstants>
+    <ErrorReport>prompt</ErrorReport>
+    <WarningLevel>4</WarningLevel>
+    <DocumentationFile>bin\Release\HeuristicLab.Services.OKB.DataAccess-3.3.xml</DocumentationFile>
+    <CodeAnalysisRuleSet>AllRules.ruleset</CodeAnalysisRuleSet>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|x64' ">
+    <DebugSymbols>true</DebugSymbols>
+    <OutputPath>bin\x64\Debug\</OutputPath>
+    <DefineConstants>DEBUG;TRACE</DefineConstants>
+    <DebugType>full</DebugType>
+    <PlatformTarget>x64</PlatformTarget>
+    <ErrorReport>prompt</ErrorReport>
+    <DocumentationFile>
+    </DocumentationFile>
+    <CodeAnalysisRuleSet>AllRules.ruleset</CodeAnalysisRuleSet>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|x64' ">
+    <OutputPath>bin\x64\Release\</OutputPath>
+    <DefineConstants>TRACE</DefineConstants>
+    <Optimize>true</Optimize>
+    <DebugType>pdbonly</DebugType>
+    <PlatformTarget>x64</PlatformTarget>
+    <ErrorReport>prompt</ErrorReport>
+    <DocumentationFile>bin\x64\Release\HeuristicLab.Services.OKB.DataAccess-3.3.xml</DocumentationFile>
+    <CodeAnalysisRuleSet>AllRules.ruleset</CodeAnalysisRuleSet>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|x86' ">
+    <DebugSymbols>true</DebugSymbols>
+    <OutputPath>bin\x86\Debug\</OutputPath>
+    <DefineConstants>DEBUG;TRACE</DefineConstants>
+    <DebugType>full</DebugType>
+    <PlatformTarget>x86</PlatformTarget>
+    <ErrorReport>prompt</ErrorReport>
+    <CodeAnalysisRuleSet>AllRules.ruleset</CodeAnalysisRuleSet>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|x86' ">
+    <OutputPath>bin\x86\Release\</OutputPath>
+    <DefineConstants>TRACE</DefineConstants>
+    <Optimize>true</Optimize>
+    <DebugType>pdbonly</DebugType>
+    <PlatformTarget>x86</PlatformTarget>
+    <ErrorReport>prompt</ErrorReport>
+    <DocumentationFile>bin\x86\Release\HeuristicLab.Services.OKB.DataAccess-3.3.xml</DocumentationFile>
+    <CodeAnalysisRuleSet>AllRules.ruleset</CodeAnalysisRuleSet>
+  </PropertyGroup>
+  <PropertyGroup>
+    <SignAssembly>true</SignAssembly>
+  </PropertyGroup>
+  <PropertyGroup>
+    <AssemblyOriginatorKeyFile>HeuristicLab.snk</AssemblyOriginatorKeyFile>
+  </PropertyGroup>
+  <ItemGroup>
+    <Reference Include="System" />
+    <Reference Include="System.Core">
+      <RequiredTargetFramework>3.5</RequiredTargetFramework>
+    </Reference>
+    <Reference Include="System.Data.Linq">
+      <RequiredTargetFramework>3.5</RequiredTargetFramework>
+    </Reference>
+    <Reference Include="System.Runtime.Serialization">
+      <RequiredTargetFramework>3.0</RequiredTargetFramework>
+    </Reference>
+    <Reference Include="System.Xml.Linq">
+      <RequiredTargetFramework>3.5</RequiredTargetFramework>
+    </Reference>
+    <Reference Include="System.Data.DataSetExtensions">
+      <RequiredTargetFramework>3.5</RequiredTargetFramework>
+    </Reference>
+    <Reference Include="System.Data" />
+    <Reference Include="System.Xml" />
+  </ItemGroup>
+  <ItemGroup>
+    <Compile Include="OKB.designer.cs">
+      <AutoGen>True</AutoGen>
+      <DesignTime>True</DesignTime>
+      <DependentUpon>OKB.dbml</DependentUpon>
+    </Compile>
+    <Compile Include="Properties\AssemblyInfo.cs" />
+    <None Include="Properties\AssemblyInfo.frame" />
+    <Compile Include="Properties\Settings.Designer.cs">
+      <DependentUpon>Settings.settings</DependentUpon>
+      <AutoGen>True</AutoGen>
+      <DesignTimeSharedInput>True</DesignTimeSharedInput>
+    </Compile>
+  </ItemGroup>
+  <ItemGroup>
+    <None Include="app.config">
+      <SubType>Designer</SubType>
+    </None>
+    <None Include="HeuristicLab.snk" />
+    <None Include="OKB.dbml">
+      <Generator>MSLinqToSQLGenerator</Generator>
+      <LastGenOutput>OKB.designer.cs</LastGenOutput>
+      <SubType>Designer</SubType>
+    </None>
+  </ItemGroup>
+  <ItemGroup>
+    <None Include="OKB.dbml.layout">
+      <DependentUpon>OKB.dbml</DependentUpon>
+    </None>
+    <None Include="Properties\Settings.settings">
+      <Generator>PublicSettingsSingleFileGenerator</Generator>
+      <LastGenOutput>Settings.Designer.cs</LastGenOutput>
+    </None>
+  </ItemGroup>
+  <ItemGroup>
+    <Service Include="{3259AA49-8AA1-44D3-9025-A0B520596A8C}" />
+    <Service Include="{508349B6-6B84-4DF5-91F0-309BEEBAD82D}" />
+    <Service Include="{B4F97281-0DBD-4835-9ED8-7DFB966E87FF}" />
+  </ItemGroup>
+  <ItemGroup>
+    <BootstrapperPackage Include="Microsoft.Net.Client.3.5">
+      <Visible>False</Visible>
+      <ProductName>.NET Framework 3.5 SP1 Client Profile</ProductName>
+      <Install>false</Install>
+    </BootstrapperPackage>
+    <BootstrapperPackage Include="Microsoft.Net.Framework.3.5.SP1">
+      <Visible>False</Visible>
+      <ProductName>.NET Framework 3.5 SP1</ProductName>
+      <Install>true</Install>
+    </BootstrapperPackage>
+    <BootstrapperPackage Include="Microsoft.Windows.Installer.3.1">
+      <Visible>False</Visible>
+      <ProductName>Windows Installer 3.1</ProductName>
+      <Install>true</Install>
+    </BootstrapperPackage>
+  </ItemGroup>
+  <ItemGroup>
+    <None Include="SQL Scripts\Initialize OKB.sql" />
+  </ItemGroup>
+  <ItemGroup>
+    <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>
+    <PreBuildEvent>set Path=%25Path%25;$(ProjectDir);$(SolutionDir)
+set ProjectDir=$(ProjectDir)
+set SolutionDir=$(SolutionDir)
+set Outdir=$(Outdir)
+
+call PreBuildEvent.cmd</PreBuildEvent>
+  </PropertyGroup>
+  <!-- To modify your build process, add your task inside one of the targets below and uncomment it. 
+       Other similar extension points exist, see Microsoft.Common.targets.
+  <Target Name="BeforeBuild">
+  </Target>
+  <Target Name="AfterBuild">
+  </Target>
+  -->
+</Project>
Index: /branches/OKB/HeuristicLab.Services.OKB.DataAccess/3.3/L2ST4.ttinclude
===================================================================
--- /branches/OKB/HeuristicLab.Services.OKB.DataAccess/3.3/L2ST4.ttinclude	(revision 4480)
+++ /branches/OKB/HeuristicLab.Services.OKB.DataAccess/3.3/L2ST4.ttinclude	(revision 4480)
@@ -0,0 +1,853 @@
+﻿<#@ assembly name="System.Core"
+#><#@ assembly name="System.Data.Linq"
+#><#@ assembly name="EnvDTE"
+#><#@ assembly name="System.Xml"
+#><#@ assembly name="System.Xml.Linq"
+#><#@ import namespace="System"
+#><#@ import namespace="System.CodeDom"
+#><#@ import namespace="System.CodeDom.Compiler"
+#><#@ import namespace="System.Collections.Generic"
+#><#@ import namespace="System.Data.Linq"
+#><#@ import namespace="System.Data.Linq.Mapping"
+#><#@ import namespace="System.IO"
+#><#@ import namespace="System.Linq"
+#><#@ import namespace="System.Reflection"
+#><#@ import namespace="System.Text"
+#><#@ import namespace="System.Xml.Linq"
+#><#@ import namespace="Microsoft.VisualStudio.TextTemplating"
+#><#+
+// L2ST4 - LINQ to SQL templates for T4 v0.82 - http://www.codeplex.com/l2st4
+// Copyright (c) Microsoft Corporation.  All rights reserved.
+// This source code is made available under the terms of the Microsoft Public License (MS-PL)
+
+// DBML Database element > code DataContext class
+class Data
+{
+	public XNamespace NS = "http://schemas.microsoft.com/linqtosql/dbml/2007";
+	public String BaseClassName { get; private set; }
+	public String ConnectSettingsObject { get; private set; }
+	public String ConnectSettingsProperty { get; private set; }
+	public String ContextName { get; private set; }
+	public String ContextNamespace { get; set; }
+	public String DatabaseName { get; private set; }
+	public String DbmlFileName { get; private set; }
+	public String EntityBase { get; private set; }
+	public String EntityNamespace { get; set; }
+	public List<Function> Functions { get; private set; }
+	public List<FunctionClass> FunctionClasses { get; private set; }
+	public bool Serialization { get; private set; }
+	public string SpecifiedContextNamespace { get; private set; }
+	public string SpecifiedEntityNamespace { get; private set; }
+	public TypeAttributes TypeAttributes { get; private set; }
+	public List<Table> Tables { get; private set; }
+	public List<TableClass> TableClasses { get; private set; }
+	
+	public Data(String dbmlFileName) {
+		DbmlFileName = dbmlFileName;
+		if (!File.Exists(DbmlFileName))
+			throw new Exception(String.Format("DBML file '{0}' could not be found.", DbmlFileName));
+		XElement xe = XDocument.Load(DbmlFileName).Root;
+		TableClasses = new List<TableClass>();
+		FunctionClasses = new List<FunctionClass>();
+		
+		foreach(XElement connection in xe.Elements(NS + "Connection")) {
+			ConnectSettingsObject = (String) connection.Attribute("SettingsObjectName");
+			ConnectSettingsProperty = (String) connection.Attribute("SettingsPropertyName");
+		}
+		BaseClassName = (String) xe.Attribute("BaseType") ?? "DataContext";
+		ContextName = (String) xe.Attribute("Class");
+		ContextNamespace = SpecifiedContextNamespace = (String) xe.Attribute("ContextNamespace");
+		DatabaseName = (String) xe.Attribute("Name") ?? "";
+		EntityBase = (String) xe.Attribute("EntityBase");
+		EntityNamespace = SpecifiedEntityNamespace = (String) xe.Attribute("EntityNamespace");
+		Serialization = (String) xe.Attribute("Serialization") == "Unidirectional";
+		TypeAttributes = Class.DecodeAccess((String) xe.Attribute("AccessModifier")) | Class.DecodeModifier((String) xe.Attribute("Modifier"));
+		Tables = (from t in xe.Elements(NS + "Table")
+			select new Table(this, t)).ToList();
+		Functions = (from f in xe.Elements(NS + "Function")
+			select new Function(this, f)).ToList();
+	}
+		
+	static internal Type GetType(String typeName, bool canBeNull) {
+		Type type = null;
+		switch(typeName) {
+			case "System.Xml.Linq.XElement": type = typeof(System.Xml.Linq.XElement); break;
+			case "System.Data.Linq.Binary": type = typeof(System.Data.Linq.Binary); break;
+			default: type = Type.GetType(typeName); break;
+		}
+		if (type == null)
+			type = new TypeStub(typeName);
+		if (type.IsValueType && canBeNull)
+			type = typeof(Nullable<>).MakeGenericType(type);
+		return type;
+	}
+}
+
+// DBML Table element > Base entity class, events & property on DataContext class
+class Table
+{
+	public TableClass BaseClass {
+		get { return Classes.First(); }
+	}
+	public IEnumerable<TableClass> Classes {
+		get { return Data.TableClasses.Where(c => c.Table == this); }
+	}
+	public Data Data { get; private set; }
+	private String member;
+	public String Member {
+		get { return member ?? Name; }
+		set { member = value; }
+	}
+	public String Name { get; set; }
+	public List<TableOperation> Operations { get; private set; }
+
+	public Table(Data data, XElement xe) {
+		Data = data;
+		Name = (String) xe.Attribute("Name");
+		Member = (String) xe.Attribute("Member");
+		Data.TableClasses.AddRange(from c in xe.Elements(Data.NS + "Type")
+			select new TableClass(this, c));
+		Operations = new List<TableOperation>();
+		foreach(OperationType operationType in Enum.GetValues(typeof(OperationType)))
+			Operations.AddRange((from o in xe.Elements(Data.NS + operationType.ToString() + "Function")
+				select new TableOperation(this, o)).ToList());
+	}
+}
+
+// DBML Type element > Entity class, subclasses or stored procedure return type
+class Class
+{
+	public Class SuperClass { get; protected set; }
+	public List<Column> Columns { get; private set; }
+	public Data Data {get; private set; }
+	public String Id { get; private set; }
+	public String InheritanceCode { get; private set; }
+	public Boolean IsInheritanceDefault { get; private set; }
+	public Boolean IsSerializable {
+		get { return (TypeAttributes & TypeAttributes.VisibilityMask) == TypeAttributes.Public; }
+	}
+	protected String name;
+	public virtual String Name {
+		get { return name; }
+		set { name = value; }
+	}
+	public String QualifiedName {
+		get { return (String.IsNullOrEmpty(Data.EntityNamespace) || (Data.EntityNamespace == Data.ContextNamespace))
+				? Name : Data.EntityNamespace + '.' + Name; }
+	}
+	public TypeAttributes TypeAttributes { get; private set; }
+	
+	public Class(Data data, XElement xe) {
+		Data = data;
+		Id = (String) xe.Attribute("Id");
+		InheritanceCode = (String) xe.Attribute("InheritanceCode");
+		IsInheritanceDefault = (Boolean ?) xe.Attribute("IsInheritanceDefault") ?? false;
+		Name = (String) xe.Attribute("Name");
+		TypeAttributes = DecodeAccess((String) xe.Attribute("AccessModifier")) | DecodeModifier((String) xe.Attribute("Modifier"));
+		Columns = (from c in xe.Elements(Data.NS + "Column")
+			select new Column(this, c)).ToList();
+	}
+	
+	internal static TypeAttributes DecodeAccess(String access) {
+		switch(access) {
+			case "Private": return TypeAttributes.NestedPrivate;
+			case "Internal": return TypeAttributes.NestedAssembly;
+			case "Protected": return TypeAttributes.NestedFamily;
+			case "ProtectedInternal": return TypeAttributes.NestedFamORAssem;
+			default: return TypeAttributes.Public;
+		}
+	}
+	
+	internal static TypeAttributes DecodeModifier(String modifier) {
+		switch(modifier) {
+			case "Abstract": return TypeAttributes.Abstract;
+			case "Sealed": return TypeAttributes.Sealed;
+			default: return TypeAttributes.Class;
+		}
+	}
+}
+
+// DBML Type element > Classes and subclasses that map to tables
+class TableClass : Class
+{
+	public List<Association> Associations { get; private set; }
+	public Boolean HasPrimaryKey {
+		get { return Columns.Any(c => c.IsPrimaryKey); }
+	}
+	public override String Name { get; set; }
+	public IList<Column> PrimaryKey {
+		get { return Columns.Where(c => c.IsPrimaryKey).ToList(); }
+	}
+	public MemberAttributes PropertyChangeAccess {
+		get { return ((TypeAttributes & TypeAttributes.Sealed) != 0) ? MemberAttributes.Private | MemberAttributes.Final : MemberAttributes.Public; }
+	}
+	public IEnumerable<TableClass> Subclasses {
+		get { return Table.Data.TableClasses.Where(c => c.SuperClass == this); }
+	}
+	public Table Table { get; private set; }
+
+	public TableClass(TableClass superClass, XElement xe) : this(superClass.Table, xe) {
+		SuperClass = superClass;
+	}
+
+	public TableClass(Table table, XElement xe) : base(table.Data, xe) {
+		Table = table;
+		Associations = (from a in xe.Elements(Data.NS + "Association")
+			select new Association(this, a)).ToList();
+		Table.Data.TableClasses.AddRange(from c in xe.Elements(Data.NS + "Type")
+			select new TableClass(this, c));
+	}
+}
+
+// DBML Type > Classes that map to stored procedure return types
+class FunctionClass : Class
+{
+	public Function Function { get; set; }
+	
+	public FunctionClass(Function function, XElement xe) : base(function.Data, xe) {
+		Function = function;
+	}
+}
+
+// DBML type Column > Properties on a class
+class Column
+{
+	private String member, typeName, storage;
+
+	private AutoSync autoSync;
+	public AutoSync AutoSync {
+		get {
+			if (IsDbGenerated)
+				if (IsPrimaryKey)
+					return AutoSync.OnInsert;
+				else
+					return AutoSync.Always;
+			return autoSync;
+		}
+		private set { autoSync = value; }
+	}
+	public Boolean CanBeNull { get; private set; }
+	public Class Class { get; private set; }
+	public String DbType { get; private set; }
+	public String Expression { get; private set; }
+	private Boolean isDbGenerated;
+	public Boolean IsDbGenerated {
+		get { return (!String.IsNullOrEmpty(Expression) || IsVersion) ? true : isDbGenerated;  }
+		private set { isDbGenerated = value; }
+	}
+	public Boolean IsDelayLoaded { get; private set; }
+	public Boolean IsDiscriminator { get; private set; }
+	public List<Association> ForeignKeyAssociations {
+		get {
+			if (Class is TableClass) {
+				return ((TableClass)Class).Associations.Where(a => a.ThisKey.Contains(this) && a.IsForeignKey).ToList();
+			}
+			else
+				return new List<Association>();
+		}
+	}
+	public Boolean IsPrimaryKey { get; private set; }
+	private Boolean isReadOnly;
+	public Boolean IsReadOnly {
+		get { return (Class.Data.Serialization) ? false : isReadOnly; }
+		private set { isReadOnly = value; }
+	}
+	public Boolean IsVersion { get; private set; }
+	public String Member {
+		get { return member + ((member == Class.Name) ? "1" : ""); }
+		set { member = value; }
+	}
+	public MemberAttributes MemberAttributes { get; private set; }
+	public String Name { get; private set; }
+	public String Storage {
+		get { return String.IsNullOrEmpty(storage) ? "_" + Member : storage; }
+		set { storage = value; }
+	}
+	public Type StorageType {
+		get { return (IsDelayLoaded) ? typeof(Link<>).MakeGenericType(Type) : Type; }
+	}
+	public String StorageValue {
+		get { return (IsDelayLoaded) ? Storage + ".Value" : Storage; }
+	}
+	public Type Type {
+		get { return Data.GetType(typeName, CanBeNull); }
+	}
+	private UpdateCheck updateCheck;
+	public UpdateCheck UpdateCheck {
+		get { return (IsReadOnly) ? UpdateCheck.Never : updateCheck; }
+		private set { updateCheck = value; }
+	}
+	
+	public Column(Class class1, XElement xe) {
+		Class = class1;
+		Name = (String) xe.Attribute("Name") ?? "";
+		Member = (String) xe.Attribute("Member") ?? Name;
+		typeName = xe.Attribute("Type").Value;
+		CanBeNull = (Boolean?) xe.Attribute("CanBeNull") ?? false;
+		DbType = (String) xe.Attribute("DbType") ?? "";
+		Expression = (String) xe.Attribute("Expression") ?? "";
+		IsDbGenerated = (Boolean?) xe.Attribute("IsDbGenerated") ?? (IsVersion);
+		IsDelayLoaded = (Boolean?) xe.Attribute("IsDelayLoaded") ?? false;
+		IsDiscriminator = (Boolean?) xe.Attribute("IsDiscriminator") ?? false;
+		IsPrimaryKey = (Boolean?) xe.Attribute("IsPrimaryKey") ?? false;
+		IsReadOnly = (Boolean?) xe.Attribute("IsReadOnly") ?? false;
+		IsVersion = (Boolean?) xe.Attribute("IsVersion") ?? false;
+		Storage = (String) xe.Attribute("Storage") ?? "";
+		AutoSync autoSyncDefault = (IsDbGenerated) ? AutoSync.OnInsert : AutoSync.Default;
+		AutoSync = Util.ParseEnum((String) xe.Attribute("AutoSync"), (IsVersion) ? AutoSync.Always : autoSyncDefault);
+		UpdateCheck = Util.ParseEnum((String) xe.Attribute("UpdateCheck"), (IsVersion || IsPrimaryKey) ? UpdateCheck.Never : UpdateCheck.Always);
+		MemberAttributes = Util.DecodeMemberAccess((String) xe.Attribute("AccessModifier")) | Util.DecodeMemberModifier((String) xe.Attribute("Modifier"));
+	}
+}
+
+// DBML Association element > EntitySet or EntityRef between two table-mapped classes
+class Association
+{
+	private TableClass thisClass;
+	private String typeName, storage;
+
+	public Association OtherSide {
+		get { return Type.Associations.Find(a => a.Name == Name && a != this); }
+	}
+	public Boolean DeleteOnNull { get; private set; }
+	public String DeleteRule { get; private set; }
+	public Boolean IsForeignKey { get; private set; }
+	public Boolean IsMany { get; private set; }
+	public Boolean IsSerializable {
+		get { return ((MemberAttributes & MemberAttributes.AccessMask) == MemberAttributes.Public); }
+	}
+	public Boolean IsUnique {
+		get { return (!IsMany && !IsForeignKey); }
+	}
+	public Boolean ManagesKeys {
+		get { return !(IsMany || (OtherSide == null) || !IsForeignKey); }
+	}
+	public String Member { get; private set; }
+	public MemberAttributes MemberAttributes { get; private set; }
+	public String Name { get; private set; }
+	public IList<Column> OtherKey {
+		get { return OtherKeyMembers.Select(o => Type.Columns.Single(c => c.Member == o)).ToList(); }
+	}
+	private String[] otherKeyMembers;
+	public String[] OtherKeyMembers {
+		get { return (otherKeyMembers != null) ? otherKeyMembers : Type.PrimaryKey.Select(p => p.Member).ToArray(); }
+		set { otherKeyMembers = value; }
+	}
+	public String Storage { get { return storage ?? "_" + Member; } }
+	public IList<Column> ThisKey {
+		get { return ThisKeyMembers.Select(o => thisClass.Columns.Single(c => c.Member == o)).ToList(); }
+	}
+	private String[] thisKeyMembers;
+	public String[] ThisKeyMembers {
+		get { return (thisKeyMembers != null) ? thisKeyMembers : thisClass.PrimaryKey.Select(p => p.Member).ToArray(); }
+		set { thisKeyMembers = value; }
+	}
+	public TableClass Type {
+		get { return thisClass.Table.Data.TableClasses.Find(c => c.Name == typeName); }
+	}
+	
+	public Association(TableClass thisClass, XElement xe) {
+		this.thisClass = thisClass;
+		typeName = (String) xe.Attribute("Type");
+		String thisKey = ((String) xe.Attribute("ThisKey"));
+		if (thisKey != null)
+			thisKeyMembers = thisKey.Split(',');
+		storage = (String) xe.Attribute("Storage");
+		String otherKey = ((String) xe.Attribute("OtherKey"));
+		if (otherKey != null)
+			otherKeyMembers = otherKey.Split(',');
+		DeleteOnNull = (Boolean?) xe.Attribute("DeleteOnNull") ?? false;
+		DeleteRule = (String) xe.Attribute("DeleteRule");
+		IsForeignKey = (xe.Attribute("IsForeignKey") != null);
+		Member = (String) xe.Attribute("Member");
+		MemberAttributes = Util.DecodeMemberAccess((String) xe.Attribute("AccessModifier")) | Util.DecodeMemberModifier((String) xe.Attribute("Modifier"));
+		Name = (String) xe.Attribute("Name");
+		String cardinality = (String) xe.Attribute("Cardinality");
+		IsMany = (cardinality == null) ? !IsForeignKey : (cardinality.Equals("Many"));
+	}
+}
+
+// DBML Function element (stored procedure) > Method on DataContext
+class Function
+{
+	public List<Class> Classes { get; private set; }
+	public Data Data { get; private set; }
+	private Boolean? hasMultipleResults = null;
+	public Boolean HasMultipleResults {
+		get { return (hasMultipleResults.HasValue) ? hasMultipleResults.Value : Classes.Count() > 1; }
+	}
+	public String ID { get; private set; }
+	public Boolean IsComposable { get; private set; }
+	public MemberAttributes MemberAttributes { get; private set; }
+	public String Method { get; private set; }
+	public String Name { get; private set; }
+	public List<Parameter> Parameters { get; private set; }
+	public Return Return { get; private set; }
+	public CodeTypeReference ReturnType {
+		get {
+			if (Return != null)
+				return new CodeTypeReference(Return.Type);
+			else
+				if (HasMultipleResults)
+					return new CodeTypeReference(typeof(IMultipleResults));
+				else {
+					CodeTypeReference typeRef = new CodeTypeReference(typeof(ISingleResult<>));
+					typeRef.TypeArguments.Add(new CodeTypeReference(Classes[0].QualifiedName));
+					return typeRef;
+				}
+		}
+	}
+	
+	public Function(Data data, XElement xe) {
+		Data = data;
+		String hasMultiResultsElement = (String) xe.Attribute("HasMultipleResults");
+		if (hasMultiResultsElement != null)
+			hasMultipleResults = Boolean.Parse(hasMultiResultsElement);
+		ID = (String) xe.Attribute("Id");
+		IsComposable = (Boolean ?) xe.Attribute("IsComposable") ?? false;
+		Name = (String) xe.Attribute("Name");
+		Method = (String) xe.Attribute("Method");
+		MemberAttributes = Util.DecodeMemberAccess((String) xe.Attribute("AccessModifier")) | Util.DecodeMemberModifier((String) xe.Attribute("Modifier"));
+		Parameters = (from p in xe.Elements(Data.NS + "Parameter")
+			select new Parameter(this, p)).ToList();
+		Return = (from r in xe.Elements(Data.NS + "Return")
+			select new Return(this, r)).SingleOrDefault();
+		Classes = new List<Class>();
+		foreach(XElement fxe in xe.Elements(Data.NS + "ElementType")) {
+			String idRef = (String) fxe.Attribute("IdRef");
+			if (idRef == null) {
+				var functionClass = new FunctionClass(this, fxe);
+				Classes.Add(functionClass);
+				Data.FunctionClasses.Add(functionClass);
+			}
+			else
+				Classes.Add(Data.TableClasses.Single(c => c.Id == idRef));
+		}
+	}
+}
+
+// Function return type -> Method return type
+class Return
+{
+	private String typeName;
+	public String DbType { get; private set; }
+	public Function Function { get; private set; }
+	public Type Type {
+		get { return Data.GetType(typeName, false); }
+	}
+	
+	public Return(Function function, XElement xe) {
+		Function = function;
+		DbType = (String) xe.Attribute("DbType");
+		typeName = (String) xe.Attribute("Type");
+	}
+}
+
+public enum ParameterDirection { In, Out, InOut };
+public enum OperationType { Insert, Update, Delete };
+public enum ArgumentVersion { Original, New };
+
+// Function parameter -> Method parameter
+class Parameter
+{
+	private String typeName;
+	public String DbType { get; private set; }
+	public Function Function { get; private set; }
+	public String Name { get; private set; }
+	public String DbName { get; private set; }
+	public ParameterDirection Direction { get; private set; }
+	public Type Type {
+		get { return Data.GetType(typeName, true); }
+	}
+	
+	public Parameter(Function function, XElement xe) {
+		Function = function;
+		DbName = (String) xe.Attribute("Name");
+		Name = (String) xe.Attribute("Parameter") ?? DbName;
+		DbType = (String) xe.Attribute("DbType");
+		typeName = (String) xe.Attribute("Type");
+		Direction = Util.ParseEnum((String) xe.Attribute("Direction"), ParameterDirection.In);
+	}
+}
+
+// Functions associated with a table's CUD operations
+class TableOperation
+{
+	private String functionID;
+	private Function function;
+	public List<Argument> Arguments { get; private set; }
+	public OperationType Type { get; private set; }
+	public Function Function {
+		get {
+			if ((function == null) && (!String.IsNullOrEmpty(functionID)))
+				function = Table.Data.Functions.Where(f => f.ID == functionID).SingleOrDefault();
+			return function;
+		}
+		set {
+			function = value;
+			functionID = null;
+		}
+	}
+	public Table Table { get; private set; }
+	public TableOperation(Table table, XElement xe) {
+		Table = table;
+		functionID = (String) xe.Attribute("FunctionId");
+		Type = (OperationType) Enum.Parse(typeof(OperationType), xe.Name.LocalName.Replace("Function",""));
+		Arguments = (from a in xe.Elements(Table.Data.NS + "Argument") select new Argument(this, a)).ToList();
+	}
+}
+
+// Argument to a function
+class Argument
+{
+	private String parameterName;
+	private Parameter parameter;
+	public TableOperation TableOperation;
+	public Parameter Parameter {
+		get {
+			if ((parameter == null) && (!String.IsNullOrEmpty(parameterName)))
+				parameter = TableOperation.Function.Parameters.Single(p => p.Name == parameterName);
+			return parameter;
+		}
+		set {
+			parameter = value;
+			parameterName = null;
+		}
+	}
+	public String Member { get; private set; }
+	public ArgumentVersion Version { get; private set; }
+	
+	public Argument(TableOperation tableOperation, XElement xe) {
+		TableOperation = tableOperation;
+		parameterName = (String) xe.Attribute("Parameter");
+		Member = (String) xe.Attribute("Member");
+		Version = Util.ParseEnum((String) xe.Attribute("Version"), ArgumentVersion.New);
+	}
+}
+
+abstract class CodeLanguage
+{
+	public CodeDomProvider CodeDomProvider { get; protected set; }
+	public abstract String GetAccess(MemberAttributes memberAttributes);
+	public abstract String GetAccess(TypeAttributes typeAttributes);
+	public abstract String GetModifier(MemberAttributes memberAttributes);
+	public abstract String GetModifier(TypeAttributes typeAttributes);
+	
+	public String Format(Type type) {
+		return Format(new CodeTypeReference(type));
+	}
+	
+	public virtual String ShortenTypeRef(String typeRef) {
+		return (typeRef.LastIndexOf('.') != 6) ? typeRef.Replace("System.Data.Linq.","") : typeRef.Replace("System.","");
+	}
+	
+	public String Format(CodeTypeReference codeTypeRef) {
+		return ShortenTypeRef(CodeDomProvider.GetTypeOutput(codeTypeRef));
+	}
+	
+	public abstract String Format(ParameterDirection direction);
+	
+	public String Format(MemberAttributes memberAttributes) {
+		return GetAccess(memberAttributes) + GetModifier(memberAttributes);
+	}
+
+	public String Format(TypeAttributes typeAttributes) {
+		return GetAccess(typeAttributes) + GetModifier(typeAttributes);
+	}
+}
+
+class CSharpCodeLanguage : CodeLanguage
+{
+	public CSharpCodeLanguage() {
+		CodeDomProvider = new Microsoft.CSharp.CSharpCodeProvider();
+	}
+	
+	public override String Format(ParameterDirection direction) {
+		switch(direction) {
+			case ParameterDirection.InOut: return "ref ";
+			case ParameterDirection.Out: return "out ";
+			default: return "";
+		}
+	}
+
+	public override String ShortenTypeRef(String typeRef) {
+		if (typeRef.StartsWith("System.Nullable<"))
+			typeRef = typeRef.Replace("System.Nullable<","").Replace(">","?");
+		return base.ShortenTypeRef(typeRef);
+	}
+
+	public override String GetAccess(MemberAttributes memberAttributes) {
+		switch(memberAttributes & MemberAttributes.AccessMask) {
+			case MemberAttributes.Private: return "private ";
+			case MemberAttributes.Public: return "public ";
+			case MemberAttributes.Family: return "protected ";
+			case MemberAttributes.Assembly: return "internal ";
+			case MemberAttributes.FamilyAndAssembly: return "protected internal ";
+			default: return memberAttributes.ToString();
+		}
+	}
+
+	public override String GetAccess(TypeAttributes typeAttributes) {
+		switch(typeAttributes & TypeAttributes.VisibilityMask) {
+			case TypeAttributes.NestedPrivate: return "private ";
+			case TypeAttributes.NestedAssembly: return "internal ";
+			case TypeAttributes.NestedFamily: return "protected ";
+			case TypeAttributes.NestedFamORAssem: return "protected internal ";
+			default: return "public ";
+		}
+	}
+
+	public override String GetModifier(MemberAttributes memberAttributes) {
+		switch(memberAttributes & MemberAttributes.ScopeMask) {
+			case MemberAttributes.Final: return "";
+			case MemberAttributes.Abstract: return "abstract ";
+			case MemberAttributes.Override: return "override ";
+			default: return "virtual ";
+		}
+	}
+	
+	public override String GetModifier(TypeAttributes typeAttributes) {
+		if ((typeAttributes & TypeAttributes.Abstract) != 0) return "abstract ";
+		if ((typeAttributes & TypeAttributes.Sealed) != 0) return "sealed ";
+		return "";
+	}
+}
+
+class VBCodeLanguage : CodeLanguage
+{
+	public VBCodeLanguage() {
+		CodeDomProvider = new Microsoft.VisualBasic.VBCodeProvider();
+	}
+	
+	public override String Format(ParameterDirection direction) {
+		switch(direction) {
+			case ParameterDirection.InOut: return "ByRef ";
+			case ParameterDirection.Out: return "ByRef ";
+			default: return "";
+		}
+	}
+
+	public override String GetAccess(MemberAttributes memberAttributes) {
+		switch(memberAttributes & MemberAttributes.AccessMask) {
+			case MemberAttributes.Private: return "Private ";
+			case MemberAttributes.Public: return "Public ";
+			case MemberAttributes.Family: return "Protected ";
+			case MemberAttributes.Assembly: return "Friend ";
+			case MemberAttributes.FamilyAndAssembly: return "Protected Friend ";
+			default: return memberAttributes.ToString();
+		}
+	}
+	
+	public override String GetAccess(TypeAttributes typeAttributes) {
+		switch(typeAttributes & TypeAttributes.VisibilityMask) {
+			case TypeAttributes.NestedPrivate: return "Private ";
+			case TypeAttributes.NestedAssembly: return "Friend ";
+			case TypeAttributes.NestedFamily: return "Protected ";
+			case TypeAttributes.NestedFamORAssem: return "protected internal ";
+			default: return "Public ";
+		}
+	}
+
+	public override String GetModifier(MemberAttributes memberAttributes) {
+		switch(memberAttributes & MemberAttributes.ScopeMask) {
+			case MemberAttributes.Final: return "";
+			case MemberAttributes.Abstract: return "MustOverride ";
+			case MemberAttributes.Override: return "Override ";
+			default: return "Overridable ";
+		}
+	}
+	
+	public override String GetModifier(TypeAttributes typeAttributes) {
+		if ((typeAttributes & TypeAttributes.Abstract) != 0) return "MustInherit ";
+		if ((typeAttributes & TypeAttributes.Sealed) != 0) return "NotInheritable ";
+		return "";
+	}
+}
+
+// Manager class records the various blocks so it can split them up
+class Manager
+{
+	private struct Block {
+		public String Name;
+		public int Start, Length;
+	}
+	
+	private List<Block> blocks = new List<Block>();
+	private Block currentBlock;
+	private Block footerBlock = new Block();
+	private Block headerBlock = new Block();
+	private ITextTemplatingEngineHost host;
+	private ManagementStrategy strategy;
+	private StringBuilder template;
+	public String OutputPath { get; set; }
+	
+	public Manager(ITextTemplatingEngineHost host, StringBuilder template, bool commonHeader) {
+		this.host = host;
+		this.template = template;
+		OutputPath = String.Empty;
+		strategy = ManagementStrategy.Create(host);		
+	}
+		
+	public void StartBlock(String name) {
+		currentBlock = new Block { Name = name, Start = template.Length };
+	}
+
+	public void StartFooter() {
+		footerBlock.Start = template.Length;
+	}
+	
+	public void EndFooter() {
+		footerBlock.Length = template.Length - footerBlock.Start;
+	}
+	
+	public void StartHeader() {
+		headerBlock.Start = template.Length;
+	}
+	
+	public void EndHeader() {
+		headerBlock.Length = template.Length - headerBlock.Start;
+	}	
+
+	public void EndBlock() {
+		currentBlock.Length = template.Length - currentBlock.Start;
+		blocks.Add(currentBlock);
+	}
+		
+	public void Process(bool split) {
+		String header = template.ToString(headerBlock.Start, headerBlock.Length);
+		String footer = template.ToString(footerBlock.Start, footerBlock.Length);
+		blocks.Reverse();		
+		foreach(Block block in blocks) {
+			String fileName = Path.Combine(OutputPath, block.Name);
+			if (split) {
+				String content = header + template.ToString(block.Start, block.Length) + footer;
+				strategy.CreateFile(fileName, content);
+				template.Remove(block.Start, block.Length);
+			} else {
+				strategy.DeleteFile(fileName);
+			}
+		}
+	}
+
+	public string GetCustomToolNamespace(string fileName) {
+		return strategy.GetCustomToolNamespace(fileName);
+	}
+	
+	public string DefaultProjectNamespace {
+		get { return strategy.DefaultProjectNamespace; }
+	}
+}
+
+class ManagementStrategy
+{
+	internal static ManagementStrategy Create(ITextTemplatingEngineHost host) {
+		return (host is IServiceProvider) ? new VSManagementStrategy(host) : new ManagementStrategy(host);
+	}
+
+	internal ManagementStrategy(ITextTemplatingEngineHost host) { }
+
+	internal virtual void CreateFile(String fileName, String content) {
+		File.WriteAllText(fileName, content);
+	}
+	
+	internal virtual void DeleteFile(String fileName) {
+		if (File.Exists(fileName))
+			File.Delete(fileName);
+	}
+	
+	internal virtual string DefaultProjectNamespace {
+		get { return null; }
+	}
+		
+	internal virtual string GetCustomToolNamespace(string fileName) {
+		return null;
+	}
+}
+
+class VSManagementStrategy : ManagementStrategy
+{
+	private EnvDTE.ProjectItem templateProjectItem;
+	private EnvDTE.DTE dte;
+	
+	internal VSManagementStrategy(ITextTemplatingEngineHost host) : base(host) {
+		IServiceProvider hostServiceProvider = (IServiceProvider)host;
+		if(hostServiceProvider == null)
+			throw new ArgumentNullException("Could not obtain hostServiceProvider");
+		
+		dte = (EnvDTE.DTE)hostServiceProvider.GetService(typeof(EnvDTE.DTE));
+		if(dte == null)
+			throw new ArgumentNullException("Could not obtain DTE from host");
+		
+		templateProjectItem = dte.Solution.FindProjectItem(host.TemplateFile);			
+	}
+	
+	internal override void CreateFile(String fileName, String content) {
+		base.CreateFile(fileName, content);
+		((EventHandler)delegate { templateProjectItem.ProjectItems.AddFromFile(fileName); }).BeginInvoke(null, null, null, null);
+	}
+	
+	internal override void DeleteFile(String fileName) {
+		((EventHandler)delegate { FindAndDeleteFile(fileName); }).BeginInvoke(null, null, null, null);
+	}
+	
+	private void FindAndDeleteFile(String fileName) {	
+		foreach(EnvDTE.ProjectItem projectItem in templateProjectItem.ProjectItems) {
+			if (projectItem.get_FileNames(0) == fileName) {
+				projectItem.Delete();
+				return;
+			}
+		}
+	}
+
+	internal override string DefaultProjectNamespace {
+		get { return templateProjectItem.ContainingProject.Properties.Item("DefaultNamespace").Value.ToString(); }
+	}
+	
+	internal override string GetCustomToolNamespace(string fileName) {
+		return dte.Solution.FindProjectItem(fileName).Properties.Item("CustomToolNamespace").Value.ToString();
+	}
+}
+
+// Methods that deserve a better home
+public static class Util
+{
+	public static T ParseEnum<T>(String value, T defaultValue) where T:struct {
+		try { return (T)Enum.Parse(typeof(T), value); }
+		catch { return defaultValue; }
+	}
+	
+	public static MemberAttributes DecodeMemberAccess(String access) {
+		switch(access) {
+			case "Private": return MemberAttributes.Private;
+			case "Internal": return MemberAttributes.Assembly;
+			case "Protected": return MemberAttributes.Family;
+			case "ProtectedInternal": return MemberAttributes.FamilyAndAssembly;
+			default: return MemberAttributes.Public;
+		}
+	}
+	
+	public static MemberAttributes DecodeMemberModifier(String modifier) {
+		switch(modifier) {
+			case "Virtual": return 0;
+			case "Override": return MemberAttributes.Override;
+			default: return MemberAttributes.Final;
+		}
+	}
+}
+
+class TypeStub : System.Reflection.TypeDelegator
+{
+	private String name;
+	
+	public TypeStub(String name) : base(typeof(System.Enum)) {
+		this.name = name;
+	}
+	
+	public override String Name {
+		get { return name; }
+	}
+	
+	public override String FullName {
+		get { return name; }
+	}
+}#>
Index: /branches/OKB/HeuristicLab.Services.OKB.DataAccess/3.3/OKB.dbml
===================================================================
--- /branches/OKB/HeuristicLab.Services.OKB.DataAccess/3.3/OKB.dbml	(revision 4480)
+++ /branches/OKB/HeuristicLab.Services.OKB.DataAccess/3.3/OKB.dbml	(revision 4480)
@@ -0,0 +1,382 @@
+﻿<?xml version="1.0" encoding="utf-8"?><Database Name="HeuristicLab.OKB" EntityNamespace="HeuristicLab.Services.OKB.DataAccess" ContextNamespace="HeuristicLab.Services.OKB.DataAccess" Class="OKBDataContext" xmlns="http://schemas.microsoft.com/linqtosql/dbml/2007">
+  <Connection Mode="AppSettings" ConnectionString="Data Source=.\SQLEXPRESS;Initial Catalog=HeuristicLab.OKB;Integrated Security=True" SettingsObjectName="HeuristicLab.Services.OKB.DataAccess.Properties.Settings" SettingsPropertyName="OKBConnectionString" Provider="System.Data.SqlClient" />
+  <Table Name="dbo.AlgorithmClass" Member="AlgorithmClasses">
+    <Type Name="AlgorithmClass">
+      <Column Name="Id" Type="System.Int64" DbType="BigInt NOT NULL IDENTITY" IsPrimaryKey="true" IsDbGenerated="true" CanBeNull="false" />
+      <Column Name="Name" Type="System.String" DbType="NVarChar(200) NOT NULL" CanBeNull="false" />
+      <Column Name="Description" Type="System.String" DbType="NVarChar(MAX)" CanBeNull="true" />
+      <Association Name="AlgorithmClass_Algorithm" Member="Algorithms" ThisKey="Id" OtherKey="AlgorithmClassId" Type="Algorithm" />
+    </Type>
+  </Table>
+  <Table Name="dbo.Algorithm" Member="Algorithms">
+    <Type Name="Algorithm">
+      <Column Name="Id" Type="System.Int64" DbType="BigInt NOT NULL IDENTITY" IsPrimaryKey="true" IsDbGenerated="true" CanBeNull="false" />
+      <Column Name="AlgorithmClassId" Type="System.Int64" DbType="BigInt NOT NULL" CanBeNull="false" />
+      <Column Name="PlatformId" Type="System.Int64" DbType="BigInt NOT NULL" CanBeNull="false" />
+      <Column Name="Name" Type="System.String" DbType="NVarChar(200) NOT NULL" CanBeNull="false" />
+      <Column Name="Description" Type="System.String" DbType="NVarChar(MAX)" CanBeNull="true" />
+      <Association Name="Algorithm_Experiment" Member="Experiments" ThisKey="Id" OtherKey="AlgorithmId" Type="Experiment" />
+      <Association Name="Algorithm_AlgorithmParameter" Member="AlgorithmParameters" ThisKey="Id" OtherKey="AlgorithmId" Type="AlgorithmParameter" />
+      <Association Name="Algorithm_AlgorithmUser" Member="AlgorithmUsers" ThisKey="Id" OtherKey="AlgorithmId" Type="AlgorithmUser" />
+      <Association Name="Algorithm_Result" Member="Results" ThisKey="Id" OtherKey="AlgorithmId" Type="Result" />
+      <Association Name="Algorithm_AlgorithmData" Member="AlgorithmData" ThisKey="Id" OtherKey="AlgorithmId" Type="AlgorithmData" Cardinality="One" />
+      <Association Name="AlgorithmClass_Algorithm" Member="AlgorithmClass" ThisKey="AlgorithmClassId" OtherKey="Id" Type="AlgorithmClass" IsForeignKey="true" />
+      <Association Name="Platform_Algorithm" Member="Platform" ThisKey="PlatformId" OtherKey="Id" Type="Platform" IsForeignKey="true" />
+    </Type>
+  </Table>
+  <Table Name="dbo.Problem" Member="Problems">
+    <Type Name="Problem">
+      <Column Name="Id" Type="System.Int64" DbType="BigInt NOT NULL IDENTITY" IsPrimaryKey="true" IsDbGenerated="true" CanBeNull="false" />
+      <Column Name="ProblemClassId" Type="System.Int64" DbType="BigInt NOT NULL" CanBeNull="false" />
+      <Column Name="PlatformId" Type="System.Int64" DbType="BigInt NOT NULL" CanBeNull="false" />
+      <Column Name="SolutionRepresentationId" Storage="_SolutionRepresentationid" Type="System.Int64" DbType="BigInt NOT NULL" CanBeNull="false" />
+      <Column Name="Name" Type="System.String" DbType="NVarChar(200) NOT NULL" CanBeNull="false" />
+      <Column Name="Description" Type="System.String" DbType="NVarChar(MAX)" CanBeNull="true" />
+      <Association Name="Problem_Experiment" Member="Experiments" ThisKey="Id" OtherKey="ProblemId" Type="Experiment" />
+      <Association Name="Problem_ProblemParameter" Member="ProblemParameters" ThisKey="Id" OtherKey="ProblemId" Type="ProblemParameter" />
+      <Association Name="Problem_ProblemUser" Member="ProblemUsers" ThisKey="Id" OtherKey="ProblemId" Type="ProblemUser" />
+      <Association Name="Problem_ProblemData" Member="ProblemData" ThisKey="Id" OtherKey="ProblemId" Type="ProblemData" Cardinality="One" />
+      <Association Name="ProblemClass_Problem" Member="ProblemClass" ThisKey="ProblemClassId" OtherKey="Id" Type="ProblemClass" IsForeignKey="true" />
+      <Association Name="Platform_Problem" Member="Platform" ThisKey="PlatformId" OtherKey="Id" Type="Platform" IsForeignKey="true" />
+    </Type>
+  </Table>
+  <Table Name="dbo.ProblemClass" Member="ProblemClasses">
+    <Type Name="ProblemClass">
+      <Column Name="Id" Type="System.Int64" DbType="BigInt NOT NULL IDENTITY" IsPrimaryKey="true" IsDbGenerated="true" CanBeNull="false" />
+      <Column Name="Name" Type="System.String" DbType="NVarChar(200) NOT NULL" CanBeNull="false" />
+      <Column Name="Description" Type="System.String" DbType="NVarChar(MAX)" CanBeNull="true" />
+      <Association Name="ProblemClass_Problem" Member="Problems" ThisKey="Id" OtherKey="ProblemClassId" Type="Problem" />
+    </Type>
+  </Table>
+  <Table Name="dbo.Experiment" Member="Experiments">
+    <Type Name="Experiment">
+      <Column Name="Id" Type="System.Int64" DbType="BigInt NOT NULL IDENTITY" IsPrimaryKey="true" IsDbGenerated="true" CanBeNull="false" />
+      <Column Name="AlgorithmId" Type="System.Int64" DbType="BigInt NOT NULL" CanBeNull="false" />
+      <Column Name="ProblemId" Type="System.Int64" DbType="BigInt NOT NULL" CanBeNull="false" />
+      <Association Name="Experiment_Run" Member="Runs" ThisKey="Id" OtherKey="ExperimentId" Type="Run" />
+      <Association Name="Experiment_AlgorithmParameterBlobValue" Member="AlgorithmParameterBlobValues" ThisKey="Id" OtherKey="ExperimentId" Type="AlgorithmParameterBlobValue" />
+      <Association Name="Experiment_AlgorithmParameterBoolValue" Member="AlgorithmParameterBoolValues" ThisKey="Id" OtherKey="ExperimentId" Type="AlgorithmParameterBoolValue" />
+      <Association Name="Experiment_AlgorithmParameterFloatValue" Member="AlgorithmParameterFloatValues" ThisKey="Id" OtherKey="ExperimentId" Type="AlgorithmParameterFloatValue" />
+      <Association Name="Experiment_AlgorithmParameterIntValue" Member="AlgorithmParameterIntValues" ThisKey="Id" OtherKey="ExperimentId" Type="AlgorithmParameterIntValue" />
+      <Association Name="Experiment_AlgorithmParameterStringValue" Member="AlgorithmParameterStringValues" ThisKey="Id" OtherKey="ExperimentId" Type="AlgorithmParameterStringValue" />
+      <Association Name="Experiment_ProblemParameterBlobValue" Member="ProblemParameterBlobValues" ThisKey="Id" OtherKey="ExperimentId" Type="ProblemParameterBlobValue" />
+      <Association Name="Experiment_ProblemParameterBoolValue" Member="ProblemParameterBoolValues" ThisKey="Id" OtherKey="ExperimentId" Type="ProblemParameterBoolValue" />
+      <Association Name="Experiment_ProblemParameterFloatValue" Member="ProblemParameterFloatValues" ThisKey="Id" OtherKey="ExperimentId" Type="ProblemParameterFloatValue" />
+      <Association Name="Experiment_ProblemParameterIntValue" Member="ProblemParameterIntValues" ThisKey="Id" OtherKey="ExperimentId" Type="ProblemParameterIntValue" />
+      <Association Name="Experiment_ProblemParameterStringValue" Member="ProblemParameterStringValues" ThisKey="Id" OtherKey="ExperimentId" Type="ProblemParameterStringValue" />
+      <Association Name="Problem_Experiment" Member="Problem" ThisKey="ProblemId" OtherKey="Id" Type="Problem" IsForeignKey="true" />
+      <Association Name="Algorithm_Experiment" Member="Algorithm" ThisKey="AlgorithmId" OtherKey="Id" Type="Algorithm" IsForeignKey="true" />
+    </Type>
+  </Table>
+  <Table Name="dbo.AlgorithmParameter" Member="AlgorithmParameters">
+    <Type Name="AlgorithmParameter">
+      <Column Name="Id" Type="System.Int64" DbType="BigInt NOT NULL IDENTITY" IsPrimaryKey="true" IsDbGenerated="true" CanBeNull="false" />
+      <Column Name="AlgorithmId" Type="System.Int64" DbType="BigInt NOT NULL" CanBeNull="false" />
+      <Column Name="Name" Type="System.String" DbType="NVarChar(200) NOT NULL" CanBeNull="false" />
+      <Column Name="Alias" Type="System.String" DbType="NVarChar(200)" CanBeNull="true" />
+      <Column Name="Description" Type="System.String" DbType="NVarChar(MAX)" CanBeNull="true" />
+      <Column Name="DataTypeId" Type="System.Int64" DbType="BigInt NOT NULL" CanBeNull="false" />
+      <Association Name="AlgorithmParameter_AlgorithmParameterBlobValue" Member="AlgorithmParameterBlobValues" ThisKey="Id" OtherKey="AlgorithmParameterId" Type="AlgorithmParameterBlobValue" />
+      <Association Name="AlgorithmParameter_AlgorithmParameterBoolValue" Member="AlgorithmParameterBoolValues" ThisKey="Id" OtherKey="AlgorithmParameterId" Type="AlgorithmParameterBoolValue" />
+      <Association Name="AlgorithmParameter_AlgorithmParameterFloatValue" Member="AlgorithmParameterFloatValues" ThisKey="Id" OtherKey="AlgorithmParameterId" Type="AlgorithmParameterFloatValue" />
+      <Association Name="AlgorithmParameter_AlgorithmParameterIntValue" Member="AlgorithmParameterIntValues" ThisKey="Id" OtherKey="AlgorithmParameterId" Type="AlgorithmParameterIntValue" />
+      <Association Name="AlgorithmParameter_AlgorithmParameterStringValue" Member="AlgorithmParameterStringValues" ThisKey="Id" OtherKey="AlgorithmParameterId" Type="AlgorithmParameterStringValue" />
+      <Association Name="Algorithm_AlgorithmParameter" Member="Algorithm" ThisKey="AlgorithmId" OtherKey="Id" Type="Algorithm" IsForeignKey="true" />
+      <Association Name="DataType_AlgorithmParameter" Member="DataType" ThisKey="DataTypeId" OtherKey="Id" Type="DataType" IsForeignKey="true" />
+    </Type>
+  </Table>
+  <Table Name="dbo.ProblemParameter" Member="ProblemParameters">
+    <Type Name="ProblemParameter">
+      <Column Name="Id" Type="System.Int64" DbType="BigInt NOT NULL IDENTITY" IsPrimaryKey="true" IsDbGenerated="true" CanBeNull="false" />
+      <Column Name="ProblemId" Type="System.Int64" DbType="BigInt NOT NULL" CanBeNull="false" />
+      <Column Name="Name" Type="System.String" DbType="NVarChar(200) NOT NULL" CanBeNull="false" />
+      <Column Name="Alias" Type="System.String" DbType="NVarChar(200)" CanBeNull="true" />
+      <Column Name="Description" Type="System.String" DbType="NVarChar(MAX)" CanBeNull="true" />
+      <Column Name="DataTypeId" Type="System.Int64" DbType="BigInt NOT NULL" CanBeNull="false" />
+      <Association Name="ProblemParameter_ProblemParameterBlobValue" Member="ProblemParameterBlobValues" ThisKey="Id" OtherKey="ProblemParameterId" Type="ProblemParameterBlobValue" />
+      <Association Name="ProblemParameter_ProblemParameterBoolValue" Member="ProblemParameterBoolValues" ThisKey="Id" OtherKey="ProblemParameterId" Type="ProblemParameterBoolValue" />
+      <Association Name="ProblemParameter_ProblemParameterFloatValue" Member="ProblemParameterFloatValues" ThisKey="Id" OtherKey="ProblemParameterId" Type="ProblemParameterFloatValue" />
+      <Association Name="ProblemParameter_ProblemParameterIntValue" Member="ProblemParameterIntValues" ThisKey="Id" OtherKey="ProblemParameterId" Type="ProblemParameterIntValue" />
+      <Association Name="ProblemParameter_ProblemParameterStringValue" Member="ProblemParameterStringValues" ThisKey="Id" OtherKey="ProblemParameterId" Type="ProblemParameterStringValue" />
+      <Association Name="Problem_ProblemParameter" Member="Problem" ThisKey="ProblemId" OtherKey="Id" Type="Problem" IsForeignKey="true" />
+      <Association Name="DataType_ProblemParameter" Member="DataType" ThisKey="DataTypeId" OtherKey="Id" Type="DataType" IsForeignKey="true" />
+    </Type>
+  </Table>
+  <Table Name="dbo.AlgorithmUser" Member="AlgorithmUsers">
+    <Type Name="AlgorithmUser">
+      <Column Name="AlgorithmId" Type="System.Int64" DbType="BigInt NOT NULL" IsPrimaryKey="true" CanBeNull="false" />
+      <Column Name="UserId" Type="System.Guid" DbType="UniqueIdentifier NOT NULL" IsPrimaryKey="true" CanBeNull="false" />
+      <Association Name="Algorithm_AlgorithmUser" Member="Algorithm" ThisKey="AlgorithmId" OtherKey="Id" Type="Algorithm" IsForeignKey="true" />
+    </Type>
+  </Table>
+  <Table Name="dbo.ProblemUser" Member="ProblemUsers">
+    <Type Name="ProblemUser">
+      <Column Name="ProblemId" Type="System.Int64" DbType="BigInt NOT NULL" IsPrimaryKey="true" CanBeNull="false" />
+      <Column Name="UserId" Type="System.Guid" DbType="UniqueIdentifier NOT NULL" IsPrimaryKey="true" CanBeNull="false" />
+      <Association Name="Problem_ProblemUser" Member="Problem" ThisKey="ProblemId" OtherKey="Id" Type="Problem" IsForeignKey="true" />
+    </Type>
+  </Table>
+  <Table Name="dbo.Platform" Member="Platforms">
+    <Type Name="Platform">
+      <Column Name="Id" Type="System.Int64" DbType="BigInt NOT NULL IDENTITY" IsPrimaryKey="true" IsDbGenerated="true" CanBeNull="false" />
+      <Column Name="Name" Type="System.String" DbType="NVarChar(200) NOT NULL" CanBeNull="false" />
+      <Column Name="Description" Type="System.String" DbType="NVarChar(MAX)" CanBeNull="true" />
+      <Association Name="Platform_Algorithm" Member="Algorithms" ThisKey="Id" OtherKey="PlatformId" Type="Algorithm" />
+      <Association Name="Platform_Problem" Member="Problems" ThisKey="Id" OtherKey="PlatformId" Type="Problem" />
+      <Association Name="Platform_DataType" Member="DataTypes" ThisKey="Id" OtherKey="PlatformId" Type="DataType" />
+    </Type>
+  </Table>
+  <Table Name="dbo.Run" Member="Runs">
+    <Type Name="Run">
+      <Column Name="Id" Type="System.Int64" DbType="BigInt NOT NULL IDENTITY" IsPrimaryKey="true" IsDbGenerated="true" CanBeNull="false" />
+      <Column Name="ExperimentId" Type="System.Int64" DbType="BigInt NOT NULL" CanBeNull="false" />
+      <Column Name="RandomSeed" Type="System.Int32" DbType="Int NOT NULL" CanBeNull="false" />
+      <Column Name="FinishedDate" Type="System.DateTime" DbType="DateTime2" CanBeNull="true" />
+      <Column Name="UserId" Type="System.Guid" DbType="UniqueIdentifier NOT NULL" CanBeNull="false" />
+      <Column Name="ClientId" Type="System.Guid" DbType="UniqueIdentifier NOT NULL" CanBeNull="false" />
+      <Association Name="Run_ResultBlobValue" Member="ResultBlobValues" ThisKey="Id" OtherKey="RunId" Type="ResultBlobValue" />
+      <Association Name="Run_ResultBoolValue" Member="ResultBoolValues" ThisKey="Id" OtherKey="RunId" Type="ResultBoolValue" />
+      <Association Name="Run_ResultFloatValue" Member="ResultFloatValues" ThisKey="Id" OtherKey="RunId" Type="ResultFloatValue" />
+      <Association Name="Run_ResultIntValue" Member="ResultIntValues" ThisKey="Id" OtherKey="RunId" Type="ResultIntValue" />
+      <Association Name="Run_ResultStringValue" Member="ResultStringValues" ThisKey="Id" OtherKey="RunId" Type="ResultStringValue" />
+      <Association Name="Experiment_Run" Member="Experiment" ThisKey="ExperimentId" OtherKey="Id" Type="Experiment" IsForeignKey="true" />
+      <Association Name="Client_Run" Member="Client" ThisKey="ClientId" OtherKey="Id" Type="Client" IsForeignKey="true" />
+    </Type>
+  </Table>
+  <Table Name="dbo.Result" Member="Results">
+    <Type Name="Result">
+      <Column Name="Id" Type="System.Int64" DbType="BigInt NOT NULL IDENTITY" IsPrimaryKey="true" IsDbGenerated="true" CanBeNull="false" />
+      <Column Name="AlgorithmId" Type="System.Int64" DbType="BigInt NOT NULL" CanBeNull="false" />
+      <Column Name="Name" Type="System.String" DbType="NVarChar(200) NOT NULL" CanBeNull="false" />
+      <Column Name="Alias" Type="System.String" DbType="NVarChar(200)" CanBeNull="true" />
+      <Column Name="Description" Type="System.String" DbType="NVarChar(MAX)" CanBeNull="true" />
+      <Column Name="DataTypeId" Type="System.Int64" DbType="BigInt NOT NULL" CanBeNull="false" />
+      <Association Name="Result_ResultBlobValue" Member="ResultBlobValues" ThisKey="Id" OtherKey="ResultId" Type="ResultBlobValue" />
+      <Association Name="Result_ResultBoolValue" Member="ResultBoolValues" ThisKey="Id" OtherKey="ResultId" Type="ResultBoolValue" />
+      <Association Name="Result_ResultFloatValue" Member="ResultFloatValues" ThisKey="Id" OtherKey="ResultId" Type="ResultFloatValue" />
+      <Association Name="Result_ResultIntValue" Member="ResultIntValues" ThisKey="Id" OtherKey="ResultId" Type="ResultIntValue" />
+      <Association Name="Result_ResultStringValue" Member="ResultStringValues" ThisKey="Id" OtherKey="ResultId" Type="ResultStringValue" />
+      <Association Name="Algorithm_Result" Member="Algorithm" ThisKey="AlgorithmId" OtherKey="Id" Type="Algorithm" IsForeignKey="true" />
+      <Association Name="DataType_Result" Member="DataType" ThisKey="DataTypeId" OtherKey="Id" Type="DataType" IsForeignKey="true" />
+    </Type>
+  </Table>
+  <Table Name="dbo.Client" Member="Clients">
+    <Type Name="Client">
+      <Column Name="Id" Type="System.Guid" DbType="UniqueIdentifier NOT NULL" IsPrimaryKey="true" CanBeNull="false" />
+      <Column Name="Name" Type="System.String" DbType="NVarChar(200) NOT NULL" CanBeNull="false" />
+      <Association Name="Client_Run" Member="Runs" ThisKey="Id" OtherKey="ClientId" Type="Run" />
+    </Type>
+  </Table>
+  <Table Name="dbo.AlgorithmParameterBlobValue" Member="AlgorithmParameterBlobValues">
+    <Type Name="AlgorithmParameterBlobValue">
+      <Column Name="AlgorithmParameterId" Type="System.Int64" DbType="BigInt NOT NULL" IsPrimaryKey="true" CanBeNull="false" />
+      <Column Name="ExperimentId" Type="System.Int64" DbType="BigInt NOT NULL" IsPrimaryKey="true" CanBeNull="false" />
+      <Column Name="DataTypeId" Type="System.Int64" DbType="BigInt NOT NULL" CanBeNull="false" />
+      <Column Name="Value" Type="System.Data.Linq.Binary" DbType="VarBinary(MAX) NOT NULL" CanBeNull="false" UpdateCheck="Never" />
+      <Association Name="AlgorithmParameter_AlgorithmParameterBlobValue" Member="AlgorithmParameter" ThisKey="AlgorithmParameterId" OtherKey="Id" Type="AlgorithmParameter" IsForeignKey="true" />
+      <Association Name="Experiment_AlgorithmParameterBlobValue" Member="Experiment" ThisKey="ExperimentId" OtherKey="Id" Type="Experiment" IsForeignKey="true" />
+      <Association Name="DataType_AlgorithmParameterBlobValue" Member="DataType" ThisKey="DataTypeId" OtherKey="Id" Type="DataType" IsForeignKey="true" />
+    </Type>
+  </Table>
+  <Table Name="dbo.DataType" Member="DataTypes">
+    <Type Name="DataType">
+      <Column Name="Id" Type="System.Int64" DbType="BigInt NOT NULL IDENTITY" IsPrimaryKey="true" IsDbGenerated="true" CanBeNull="false" />
+      <Column Name="PlatformId" Type="System.Int64" DbType="BigInt NOT NULL" CanBeNull="false" />
+      <Column Name="Name" Type="System.String" DbType="NVarChar(MAX) NOT NULL" CanBeNull="false" />
+      <Column Name="SqlName" Type="System.String" DbType="NVarChar(200) NOT NULL" CanBeNull="false" />
+      <Association Name="DataType_AlgorithmParameter" Member="AlgorithmParameters" ThisKey="Id" OtherKey="DataTypeId" Type="AlgorithmParameter" />
+      <Association Name="DataType_ProblemParameter" Member="ProblemParameters" ThisKey="Id" OtherKey="DataTypeId" Type="ProblemParameter" />
+      <Association Name="DataType_Result" Member="Results" ThisKey="Id" OtherKey="DataTypeId" Type="Result" />
+      <Association Name="DataType_AlgorithmParameterBlobValue" Member="AlgorithmParameterBlobValues" ThisKey="Id" OtherKey="DataTypeId" Type="AlgorithmParameterBlobValue" />
+      <Association Name="DataType_AlgorithmParameterBoolValue" Member="AlgorithmParameterBoolValues" ThisKey="Id" OtherKey="DataTypeId" Type="AlgorithmParameterBoolValue" />
+      <Association Name="DataType_AlgorithmParameterFloatValue" Member="AlgorithmParameterFloatValues" ThisKey="Id" OtherKey="DataTypeId" Type="AlgorithmParameterFloatValue" />
+      <Association Name="DataType_AlgorithmParameterIntValue" Member="AlgorithmParameterIntValues" ThisKey="Id" OtherKey="DataTypeId" Type="AlgorithmParameterIntValue" />
+      <Association Name="DataType_AlgorithmParameterStringValue" Member="AlgorithmParameterStringValues" ThisKey="Id" OtherKey="DataTypeId" Type="AlgorithmParameterStringValue" />
+      <Association Name="DataType_ProblemParameterBlobValue" Member="ProblemParameterBlobValues" ThisKey="Id" OtherKey="DataTypeId" Type="ProblemParameterBlobValue" />
+      <Association Name="DataType_ProblemParameterBoolValue" Member="ProblemParameterBoolValues" ThisKey="Id" OtherKey="DataTypeId" Type="ProblemParameterBoolValue" />
+      <Association Name="DataType_ProblemParameterFloatValue" Member="ProblemParameterFloatValues" ThisKey="Id" OtherKey="DataTypeId" Type="ProblemParameterFloatValue" />
+      <Association Name="DataType_ProblemParameterIntValue" Member="ProblemParameterIntValues" ThisKey="Id" OtherKey="DataTypeId" Type="ProblemParameterIntValue" />
+      <Association Name="DataType_ProblemParameterStringValue" Member="ProblemParameterStringValues" ThisKey="Id" OtherKey="DataTypeId" Type="ProblemParameterStringValue" />
+      <Association Name="DataType_ResultBlobValue" Member="ResultBlobValues" ThisKey="Id" OtherKey="DataTypeId" Type="ResultBlobValue" />
+      <Association Name="DataType_ResultBoolValue" Member="ResultBoolValues" ThisKey="Id" OtherKey="DataTypeId" Type="ResultBoolValue" />
+      <Association Name="DataType_ResultFloatValue" Member="ResultFloatValues" ThisKey="Id" OtherKey="DataTypeId" Type="ResultFloatValue" />
+      <Association Name="DataType_ResultIntValue" Member="ResultIntValues" ThisKey="Id" OtherKey="DataTypeId" Type="ResultIntValue" />
+      <Association Name="DataType_ResultStringValue" Member="ResultStringValues" ThisKey="Id" OtherKey="DataTypeId" Type="ResultStringValue" />
+      <Association Name="DataType_AlgorithmData" Member="AlgorithmDatas" ThisKey="Id" OtherKey="DataTypeId" Type="AlgorithmData" />
+      <Association Name="DataType_ProblemData" Member="ProblemDatas" ThisKey="Id" OtherKey="DataTypeId" Type="ProblemData" />
+      <Association Name="Platform_DataType" Member="Platform" ThisKey="PlatformId" OtherKey="Id" Type="Platform" IsForeignKey="true" />
+    </Type>
+  </Table>
+  <Table Name="dbo.AlgorithmParameterBoolValue" Member="AlgorithmParameterBoolValues">
+    <Type Name="AlgorithmParameterBoolValue">
+      <Column Name="AlgorithmParameterId" Type="System.Int64" DbType="BigInt NOT NULL" IsPrimaryKey="true" CanBeNull="false" />
+      <Column Name="ExperimentId" Type="System.Int64" DbType="BigInt NOT NULL" IsPrimaryKey="true" CanBeNull="false" />
+      <Column Name="DataTypeId" Type="System.Int64" DbType="BigInt NOT NULL" CanBeNull="false" />
+      <Column Name="Value" Type="System.Boolean" DbType="Bit NOT NULL" CanBeNull="false" />
+      <Association Name="AlgorithmParameter_AlgorithmParameterBoolValue" Member="AlgorithmParameter" ThisKey="AlgorithmParameterId" OtherKey="Id" Type="AlgorithmParameter" IsForeignKey="true" />
+      <Association Name="DataType_AlgorithmParameterBoolValue" Member="DataType" ThisKey="DataTypeId" OtherKey="Id" Type="DataType" IsForeignKey="true" />
+      <Association Name="Experiment_AlgorithmParameterBoolValue" Member="Experiment" ThisKey="ExperimentId" OtherKey="Id" Type="Experiment" IsForeignKey="true" />
+    </Type>
+  </Table>
+  <Table Name="dbo.AlgorithmParameterFloatValue" Member="AlgorithmParameterFloatValues">
+    <Type Name="AlgorithmParameterFloatValue">
+      <Column Name="AlgorithmParameterId" Type="System.Int64" DbType="BigInt NOT NULL" IsPrimaryKey="true" CanBeNull="false" />
+      <Column Name="ExperimentId" Type="System.Int64" DbType="BigInt NOT NULL" IsPrimaryKey="true" CanBeNull="false" />
+      <Column Name="DataTypeId" Type="System.Int64" DbType="BigInt NOT NULL" CanBeNull="false" />
+      <Column Name="Value" Type="System.Double" DbType="Float NOT NULL" CanBeNull="false" />
+      <Association Name="AlgorithmParameter_AlgorithmParameterFloatValue" Member="AlgorithmParameter" ThisKey="AlgorithmParameterId" OtherKey="Id" Type="AlgorithmParameter" IsForeignKey="true" />
+      <Association Name="DataType_AlgorithmParameterFloatValue" Member="DataType" ThisKey="DataTypeId" OtherKey="Id" Type="DataType" IsForeignKey="true" />
+      <Association Name="Experiment_AlgorithmParameterFloatValue" Member="Experiment" ThisKey="ExperimentId" OtherKey="Id" Type="Experiment" IsForeignKey="true" />
+    </Type>
+  </Table>
+  <Table Name="dbo.AlgorithmParameterIntValue" Member="AlgorithmParameterIntValues">
+    <Type Name="AlgorithmParameterIntValue">
+      <Column Name="AlgorithmParameterId" Type="System.Int64" DbType="BigInt NOT NULL" IsPrimaryKey="true" CanBeNull="false" />
+      <Column Name="ExperimentId" Type="System.Int64" DbType="BigInt NOT NULL" IsPrimaryKey="true" CanBeNull="false" />
+      <Column Name="DataTypeId" Type="System.Int64" DbType="BigInt NOT NULL" CanBeNull="false" />
+      <Column Name="Value" Type="System.Int64" DbType="BigInt NOT NULL" CanBeNull="false" />
+      <Association Name="AlgorithmParameter_AlgorithmParameterIntValue" Member="AlgorithmParameter" ThisKey="AlgorithmParameterId" OtherKey="Id" Type="AlgorithmParameter" IsForeignKey="true" />
+      <Association Name="DataType_AlgorithmParameterIntValue" Member="DataType" ThisKey="DataTypeId" OtherKey="Id" Type="DataType" IsForeignKey="true" />
+      <Association Name="Experiment_AlgorithmParameterIntValue" Member="Experiment" ThisKey="ExperimentId" OtherKey="Id" Type="Experiment" IsForeignKey="true" />
+    </Type>
+  </Table>
+  <Table Name="dbo.AlgorithmParameterStringValue" Member="AlgorithmParameterStringValues">
+    <Type Name="AlgorithmParameterStringValue">
+      <Column Name="AlgorithmParameterId" Type="System.Int64" DbType="BigInt NOT NULL" IsPrimaryKey="true" CanBeNull="false" />
+      <Column Name="ExperimentId" Type="System.Int64" DbType="BigInt NOT NULL" IsPrimaryKey="true" CanBeNull="false" />
+      <Column Name="DataTypeId" Type="System.Int64" DbType="BigInt NOT NULL" CanBeNull="false" />
+      <Column Name="Value" Type="System.String" DbType="NVarChar(MAX) NOT NULL" CanBeNull="false" />
+      <Association Name="AlgorithmParameter_AlgorithmParameterStringValue" Member="AlgorithmParameter" ThisKey="AlgorithmParameterId" OtherKey="Id" Type="AlgorithmParameter" IsForeignKey="true" />
+      <Association Name="DataType_AlgorithmParameterStringValue" Member="DataType" ThisKey="DataTypeId" OtherKey="Id" Type="DataType" IsForeignKey="true" />
+      <Association Name="Experiment_AlgorithmParameterStringValue" Member="Experiment" ThisKey="ExperimentId" OtherKey="Id" Type="Experiment" IsForeignKey="true" />
+    </Type>
+  </Table>
+  <Table Name="dbo.ProblemParameterBlobValue" Member="ProblemParameterBlobValues">
+    <Type Name="ProblemParameterBlobValue">
+      <Column Name="ProblemParameterId" Type="System.Int64" DbType="BigInt NOT NULL" IsPrimaryKey="true" CanBeNull="false" />
+      <Column Name="ExperimentId" Type="System.Int64" DbType="BigInt NOT NULL" IsPrimaryKey="true" CanBeNull="false" />
+      <Column Name="DataTypeId" Type="System.Int64" DbType="BigInt NOT NULL" CanBeNull="false" />
+      <Column Name="Value" Type="System.Data.Linq.Binary" DbType="VarBinary(MAX) NOT NULL" CanBeNull="false" UpdateCheck="Never" />
+      <Association Name="DataType_ProblemParameterBlobValue" Member="DataType" ThisKey="DataTypeId" OtherKey="Id" Type="DataType" IsForeignKey="true" />
+      <Association Name="Experiment_ProblemParameterBlobValue" Member="Experiment" ThisKey="ExperimentId" OtherKey="Id" Type="Experiment" IsForeignKey="true" />
+      <Association Name="ProblemParameter_ProblemParameterBlobValue" Member="ProblemParameter" ThisKey="ProblemParameterId" OtherKey="Id" Type="ProblemParameter" IsForeignKey="true" />
+    </Type>
+  </Table>
+  <Table Name="dbo.ProblemParameterBoolValue" Member="ProblemParameterBoolValues">
+    <Type Name="ProblemParameterBoolValue">
+      <Column Name="ProblemParameterId" Type="System.Int64" DbType="BigInt NOT NULL" IsPrimaryKey="true" CanBeNull="false" />
+      <Column Name="ExperimentId" Type="System.Int64" DbType="BigInt NOT NULL" IsPrimaryKey="true" CanBeNull="false" />
+      <Column Name="DataTypeId" Type="System.Int64" DbType="BigInt NOT NULL" CanBeNull="false" />
+      <Column Name="Value" Type="System.Boolean" DbType="Bit NOT NULL" CanBeNull="false" />
+      <Association Name="DataType_ProblemParameterBoolValue" Member="DataType" ThisKey="DataTypeId" OtherKey="Id" Type="DataType" IsForeignKey="true" />
+      <Association Name="Experiment_ProblemParameterBoolValue" Member="Experiment" ThisKey="ExperimentId" OtherKey="Id" Type="Experiment" IsForeignKey="true" />
+      <Association Name="ProblemParameter_ProblemParameterBoolValue" Member="ProblemParameter" ThisKey="ProblemParameterId" OtherKey="Id" Type="ProblemParameter" IsForeignKey="true" />
+    </Type>
+  </Table>
+  <Table Name="dbo.ProblemParameterFloatValue" Member="ProblemParameterFloatValues">
+    <Type Name="ProblemParameterFloatValue">
+      <Column Name="ProblemParameterId" Type="System.Int64" DbType="BigInt NOT NULL" IsPrimaryKey="true" CanBeNull="false" />
+      <Column Name="ExperimentId" Type="System.Int64" DbType="BigInt NOT NULL" IsPrimaryKey="true" CanBeNull="false" />
+      <Column Name="DataTypeId" Type="System.Int64" DbType="BigInt NOT NULL" CanBeNull="false" />
+      <Column Name="Value" Type="System.Double" DbType="Float NOT NULL" CanBeNull="false" />
+      <Association Name="DataType_ProblemParameterFloatValue" Member="DataType" ThisKey="DataTypeId" OtherKey="Id" Type="DataType" IsForeignKey="true" />
+      <Association Name="Experiment_ProblemParameterFloatValue" Member="Experiment" ThisKey="ExperimentId" OtherKey="Id" Type="Experiment" IsForeignKey="true" />
+      <Association Name="ProblemParameter_ProblemParameterFloatValue" Member="ProblemParameter" ThisKey="ProblemParameterId" OtherKey="Id" Type="ProblemParameter" IsForeignKey="true" />
+    </Type>
+  </Table>
+  <Table Name="dbo.ProblemParameterIntValue" Member="ProblemParameterIntValues">
+    <Type Name="ProblemParameterIntValue">
+      <Column Name="ProblemParameterId" Type="System.Int64" DbType="BigInt NOT NULL" IsPrimaryKey="true" CanBeNull="false" />
+      <Column Name="ExperimentId" Type="System.Int64" DbType="BigInt NOT NULL" IsPrimaryKey="true" CanBeNull="false" />
+      <Column Name="DataTypeId" Type="System.Int64" DbType="BigInt NOT NULL" CanBeNull="false" />
+      <Column Name="Value" Type="System.Int64" DbType="BigInt NOT NULL" CanBeNull="false" />
+      <Association Name="DataType_ProblemParameterIntValue" Member="DataType" ThisKey="DataTypeId" OtherKey="Id" Type="DataType" IsForeignKey="true" />
+      <Association Name="Experiment_ProblemParameterIntValue" Member="Experiment" ThisKey="ExperimentId" OtherKey="Id" Type="Experiment" IsForeignKey="true" />
+      <Association Name="ProblemParameter_ProblemParameterIntValue" Member="ProblemParameter" ThisKey="ProblemParameterId" OtherKey="Id" Type="ProblemParameter" IsForeignKey="true" />
+    </Type>
+  </Table>
+  <Table Name="dbo.ProblemParameterStringValue" Member="ProblemParameterStringValues">
+    <Type Name="ProblemParameterStringValue">
+      <Column Name="ProblemParameterId" Type="System.Int64" DbType="BigInt NOT NULL" IsPrimaryKey="true" CanBeNull="false" />
+      <Column Name="ExperimentId" Type="System.Int64" DbType="BigInt NOT NULL" IsPrimaryKey="true" CanBeNull="false" />
+      <Column Name="DataTypeId" Type="System.Int64" DbType="BigInt NOT NULL" CanBeNull="false" />
+      <Column Name="Value" Type="System.String" DbType="NVarChar(MAX) NOT NULL" CanBeNull="false" />
+      <Association Name="DataType_ProblemParameterStringValue" Member="DataType" ThisKey="DataTypeId" OtherKey="Id" Type="DataType" IsForeignKey="true" />
+      <Association Name="Experiment_ProblemParameterStringValue" Member="Experiment" ThisKey="ExperimentId" OtherKey="Id" Type="Experiment" IsForeignKey="true" />
+      <Association Name="ProblemParameter_ProblemParameterStringValue" Member="ProblemParameter" ThisKey="ProblemParameterId" OtherKey="Id" Type="ProblemParameter" IsForeignKey="true" />
+    </Type>
+  </Table>
+  <Table Name="dbo.ResultBlobValue" Member="ResultBlobValues">
+    <Type Name="ResultBlobValue">
+      <Column Name="ResultId" Type="System.Int64" DbType="BigInt NOT NULL" IsPrimaryKey="true" CanBeNull="false" />
+      <Column Name="RunId" Type="System.Int64" DbType="BigInt NOT NULL" IsPrimaryKey="true" CanBeNull="false" />
+      <Column Name="DataTypeId" Type="System.Int64" DbType="BigInt NOT NULL" CanBeNull="false" />
+      <Column Name="Value" Type="System.Data.Linq.Binary" DbType="VarBinary(MAX) NOT NULL" CanBeNull="false" UpdateCheck="Never" />
+      <Association Name="DataType_ResultBlobValue" Member="DataType" ThisKey="DataTypeId" OtherKey="Id" Type="DataType" IsForeignKey="true" />
+      <Association Name="Result_ResultBlobValue" Member="Result" ThisKey="ResultId" OtherKey="Id" Type="Result" IsForeignKey="true" />
+      <Association Name="Run_ResultBlobValue" Member="Run" ThisKey="RunId" OtherKey="Id" Type="Run" IsForeignKey="true" />
+    </Type>
+  </Table>
+  <Table Name="dbo.ResultBoolValue" Member="ResultBoolValues">
+    <Type Name="ResultBoolValue">
+      <Column Name="ResultId" Type="System.Int64" DbType="BigInt NOT NULL" IsPrimaryKey="true" CanBeNull="false" />
+      <Column Name="RunId" Type="System.Int64" DbType="BigInt NOT NULL" IsPrimaryKey="true" CanBeNull="false" />
+      <Column Name="DataTypeId" Type="System.Int64" DbType="BigInt NOT NULL" CanBeNull="false" />
+      <Column Name="Value" Type="System.Boolean" DbType="Bit NOT NULL" CanBeNull="false" />
+      <Association Name="DataType_ResultBoolValue" Member="DataType" ThisKey="DataTypeId" OtherKey="Id" Type="DataType" IsForeignKey="true" />
+      <Association Name="Result_ResultBoolValue" Member="Result" ThisKey="ResultId" OtherKey="Id" Type="Result" IsForeignKey="true" />
+      <Association Name="Run_ResultBoolValue" Member="Run" ThisKey="RunId" OtherKey="Id" Type="Run" IsForeignKey="true" />
+    </Type>
+  </Table>
+  <Table Name="dbo.ResultFloatValue" Member="ResultFloatValues">
+    <Type Name="ResultFloatValue">
+      <Column Name="ResultId" Type="System.Int64" DbType="BigInt NOT NULL" IsPrimaryKey="true" CanBeNull="false" />
+      <Column Name="RunId" Type="System.Int64" DbType="BigInt NOT NULL" IsPrimaryKey="true" CanBeNull="false" />
+      <Column Name="DataTypeId" Type="System.Int64" DbType="BigInt NOT NULL" CanBeNull="false" />
+      <Column Name="Value" Type="System.Double" DbType="Float NOT NULL" CanBeNull="false" />
+      <Association Name="DataType_ResultFloatValue" Member="DataType" ThisKey="DataTypeId" OtherKey="Id" Type="DataType" IsForeignKey="true" />
+      <Association Name="Result_ResultFloatValue" Member="Result" ThisKey="ResultId" OtherKey="Id" Type="Result" IsForeignKey="true" />
+      <Association Name="Run_ResultFloatValue" Member="Run" ThisKey="RunId" OtherKey="Id" Type="Run" IsForeignKey="true" />
+    </Type>
+  </Table>
+  <Table Name="dbo.ResultIntValue" Member="ResultIntValues">
+    <Type Name="ResultIntValue">
+      <Column Name="ResultId" Type="System.Int64" DbType="BigInt NOT NULL" IsPrimaryKey="true" CanBeNull="false" />
+      <Column Name="RunId" Type="System.Int64" DbType="BigInt NOT NULL" IsPrimaryKey="true" CanBeNull="false" />
+      <Column Name="DataTypeId" Type="System.Int64" DbType="BigInt NOT NULL" CanBeNull="false" />
+      <Column Name="Value" Type="System.Int64" DbType="BigInt NOT NULL" CanBeNull="false" />
+      <Association Name="DataType_ResultIntValue" Member="DataType" ThisKey="DataTypeId" OtherKey="Id" Type="DataType" IsForeignKey="true" />
+      <Association Name="Result_ResultIntValue" Member="Result" ThisKey="ResultId" OtherKey="Id" Type="Result" IsForeignKey="true" />
+      <Association Name="Run_ResultIntValue" Member="Run" ThisKey="RunId" OtherKey="Id" Type="Run" IsForeignKey="true" />
+    </Type>
+  </Table>
+  <Table Name="dbo.ResultStringValue" Member="ResultStringValues">
+    <Type Name="ResultStringValue">
+      <Column Name="ResultId" Type="System.Int64" DbType="BigInt NOT NULL" IsPrimaryKey="true" CanBeNull="false" />
+      <Column Name="RunId" Type="System.Int64" DbType="BigInt NOT NULL" IsPrimaryKey="true" CanBeNull="false" />
+      <Column Name="DataTypeId" Type="System.Int64" DbType="BigInt NOT NULL" CanBeNull="false" />
+      <Column Name="Value" Type="System.String" DbType="NVarChar(MAX) NOT NULL" CanBeNull="false" />
+      <Association Name="DataType_ResultStringValue" Member="DataType" ThisKey="DataTypeId" OtherKey="Id" Type="DataType" IsForeignKey="true" />
+      <Association Name="Result_ResultStringValue" Member="Result" ThisKey="ResultId" OtherKey="Id" Type="Result" IsForeignKey="true" />
+      <Association Name="Run_ResultStringValue" Member="Run" ThisKey="RunId" OtherKey="Id" Type="Run" IsForeignKey="true" />
+    </Type>
+  </Table>
+  <Table Name="dbo.AlgorithmData" Member="AlgorithmDatas">
+    <Type Name="AlgorithmData">
+      <Column Name="AlgorithmId" Type="System.Int64" DbType="BigInt NOT NULL" IsPrimaryKey="true" CanBeNull="false" />
+      <Column Name="DataTypeId" Type="System.Int64" DbType="BigInt NOT NULL" CanBeNull="false" />
+      <Column Name="Data" Type="System.Data.Linq.Binary" DbType="VarBinary(MAX) NOT NULL" CanBeNull="false" UpdateCheck="Never" />
+      <Association Name="Algorithm_AlgorithmData" Member="Algorithm" ThisKey="AlgorithmId" OtherKey="Id" Type="Algorithm" IsForeignKey="true" />
+      <Association Name="DataType_AlgorithmData" Member="DataType" ThisKey="DataTypeId" OtherKey="Id" Type="DataType" IsForeignKey="true" />
+    </Type>
+  </Table>
+  <Table Name="dbo.ProblemData" Member="ProblemDatas">
+    <Type Name="ProblemData">
+      <Column Name="ProblemId" Type="System.Int64" DbType="BigInt NOT NULL" IsPrimaryKey="true" CanBeNull="false" />
+      <Column Name="DataTypeId" Type="System.Int64" DbType="BigInt NOT NULL" CanBeNull="false" />
+      <Column Name="Data" Type="System.Data.Linq.Binary" DbType="VarBinary(MAX) NOT NULL" CanBeNull="false" UpdateCheck="Never" />
+      <Association Name="DataType_ProblemData" Member="DataType" ThisKey="DataTypeId" OtherKey="Id" Type="DataType" IsForeignKey="true" />
+      <Association Name="Problem_ProblemData" Member="Problem" ThisKey="ProblemId" OtherKey="Id" Type="Problem" IsForeignKey="true" />
+    </Type>
+  </Table>
+</Database>
Index: /branches/OKB/HeuristicLab.Services.OKB.DataAccess/3.3/OKB.dbml.layout
===================================================================
--- /branches/OKB/HeuristicLab.Services.OKB.DataAccess/3.3/OKB.dbml.layout	(revision 4480)
+++ /branches/OKB/HeuristicLab.Services.OKB.DataAccess/3.3/OKB.dbml.layout	(revision 4480)
@@ -0,0 +1,654 @@
+﻿<?xml version="1.0" encoding="utf-8"?>
+<ordesignerObjectsDiagram dslVersion="1.0.0.0" absoluteBounds="0, 0, 15.5, 12.75" name="OKB">
+  <DataContextMoniker Name="/OKBDataContext" />
+  <nestedChildShapes>
+    <classShape Id="ec288562-8ef9-46b8-a2dc-a471fec7afb8" absoluteBounds="2.75, 0.5, 2, 1.3862939453125">
+      <DataClassMoniker Name="/OKBDataContext/AlgorithmClass" />
+      <nestedChildShapes>
+        <elementListCompartment Id="fbed452c-662c-42d5-b89f-2b122b63aecc" absoluteBounds="2.765, 0.96, 1.9700000000000002, 0.8262939453125" name="DataPropertiesCompartment" titleTextColor="Black" itemTextColor="Black" />
+      </nestedChildShapes>
+    </classShape>
+    <classShape Id="6395cc20-e99d-4d78-868d-4401004ef90f" absoluteBounds="2.75, 2.125, 2, 1.7708968098958331">
+      <DataClassMoniker Name="/OKBDataContext/Algorithm" />
+      <nestedChildShapes>
+        <elementListCompartment Id="4dca152f-be31-4dd7-ba65-e6b1177eda3c" absoluteBounds="2.765, 2.585, 1.9700000000000002, 1.2108968098958333" name="DataPropertiesCompartment" titleTextColor="Black" itemTextColor="Black" />
+      </nestedChildShapes>
+    </classShape>
+    <associationConnector edgePoints="[(3.75 : 1.8862939453125); (3.75 : 2.125)]" fixedFrom="NotFixed" fixedTo="NotFixed">
+      <AssociationMoniker Name="/OKBDataContext/AlgorithmClass/AlgorithmClass_Algorithm" />
+      <nodes>
+        <classShapeMoniker Id="ec288562-8ef9-46b8-a2dc-a471fec7afb8" />
+        <classShapeMoniker Id="6395cc20-e99d-4d78-868d-4401004ef90f" />
+      </nodes>
+    </associationConnector>
+    <classShape Id="27d0903a-8f45-4b0b-8d0e-8d632bffc702" absoluteBounds="13.25, 2.125, 2, 1.9631982421875">
+      <DataClassMoniker Name="/OKBDataContext/Problem" />
+      <nestedChildShapes>
+        <elementListCompartment Id="9038b68e-8013-42c0-bba9-60a0b75fffd1" absoluteBounds="13.265, 2.585, 1.9700000000000002, 1.4031982421875" name="DataPropertiesCompartment" titleTextColor="Black" itemTextColor="Black" />
+      </nestedChildShapes>
+    </classShape>
+    <classShape Id="018aceac-7bd0-4fdd-8cca-d219aa08a5b5" absoluteBounds="13.25, 0.5, 2, 1.3862939453125">
+      <DataClassMoniker Name="/OKBDataContext/ProblemClass" />
+      <nestedChildShapes>
+        <elementListCompartment Id="2958536f-012b-4eb7-8bc7-453edcda1493" absoluteBounds="13.265, 0.96, 1.9700000000000002, 0.8262939453125" name="DataPropertiesCompartment" titleTextColor="Black" itemTextColor="Black" />
+      </nestedChildShapes>
+    </classShape>
+    <associationConnector edgePoints="[(14.25 : 1.8862939453125); (14.25 : 2.125)]" fixedFrom="NotFixed" fixedTo="NotFixed">
+      <AssociationMoniker Name="/OKBDataContext/ProblemClass/ProblemClass_Problem" />
+      <nodes>
+        <classShapeMoniker Id="018aceac-7bd0-4fdd-8cca-d219aa08a5b5" />
+        <classShapeMoniker Id="27d0903a-8f45-4b0b-8d0e-8d632bffc702" />
+      </nodes>
+    </associationConnector>
+    <classShape Id="c250fb1a-b448-499e-b8eb-d1d0c38521a0" absoluteBounds="8, 4.375, 2, 1.3862939453125">
+      <DataClassMoniker Name="/OKBDataContext/Experiment" />
+      <nestedChildShapes>
+        <elementListCompartment Id="75b7e6ac-33fa-45bf-9832-b5bf0c2c0db5" absoluteBounds="8.015, 4.835, 1.9700000000000002, 0.8262939453125" name="DataPropertiesCompartment" titleTextColor="Black" itemTextColor="Black" />
+      </nestedChildShapes>
+    </classShape>
+    <associationConnector edgePoints="[(13.25 : 3.70933229417067); (10.3177083333333 : 3.70933229417067 : JumpStart); (10.0755208333334 : 3.70933229417067 : JumpEnd); (9.39129711009978 : 3.70933229417067); (9.39129711009978 : 4.375)]" manuallyRouted="true" fixedFrom="NotFixed" fixedTo="NotFixed">
+      <AssociationMoniker Name="/OKBDataContext/Problem/Problem_Experiment" />
+      <nodes>
+        <classShapeMoniker Id="27d0903a-8f45-4b0b-8d0e-8d632bffc702" />
+        <classShapeMoniker Id="c250fb1a-b448-499e-b8eb-d1d0c38521a0" />
+      </nodes>
+    </associationConnector>
+    <classShape Id="533939e3-1d76-4e1b-a562-4bb7a30cc432" absoluteBounds="2.75, 4.375, 2, 1.9631982421875">
+      <DataClassMoniker Name="/OKBDataContext/AlgorithmParameter" />
+      <nestedChildShapes>
+        <elementListCompartment Id="c642f03e-8fe9-4e69-af3e-0976f4f275da" absoluteBounds="2.765, 4.835, 1.9700000000000002, 1.4031982421875" name="DataPropertiesCompartment" titleTextColor="Black" itemTextColor="Black" />
+      </nestedChildShapes>
+    </classShape>
+    <associationConnector edgePoints="[(3.75 : 3.89589680989583); (3.75 : 4.375)]" fixedFrom="NotFixed" fixedTo="NotFixed">
+      <AssociationMoniker Name="/OKBDataContext/Algorithm/Algorithm_AlgorithmParameter" />
+      <nodes>
+        <classShapeMoniker Id="6395cc20-e99d-4d78-868d-4401004ef90f" />
+        <classShapeMoniker Id="533939e3-1d76-4e1b-a562-4bb7a30cc432" />
+      </nodes>
+    </associationConnector>
+    <classShape Id="8b17f420-0cf1-402a-aaec-d2372f039661" absoluteBounds="13.25, 4.375, 2, 1.9631982421875">
+      <DataClassMoniker Name="/OKBDataContext/ProblemParameter" />
+      <nestedChildShapes>
+        <elementListCompartment Id="75441838-346f-41f0-9651-419532edd47d" absoluteBounds="13.265, 4.835, 1.9700000000000002, 1.4031982421875" name="DataPropertiesCompartment" titleTextColor="Black" itemTextColor="Black" />
+      </nestedChildShapes>
+    </classShape>
+    <associationConnector edgePoints="[(14.25 : 4.0881982421875); (14.25 : 4.375)]" fixedFrom="NotFixed" fixedTo="NotFixed">
+      <AssociationMoniker Name="/OKBDataContext/Problem/Problem_ProblemParameter" />
+      <nodes>
+        <classShapeMoniker Id="27d0903a-8f45-4b0b-8d0e-8d632bffc702" />
+        <classShapeMoniker Id="8b17f420-0cf1-402a-aaec-d2372f039661" />
+      </nodes>
+    </associationConnector>
+    <classShape Id="aa997e47-0162-4fc2-aa8d-e237c50c46fe" isExpanded="false" absoluteBounds="5, 2.125, 2, 0.45">
+      <DataClassMoniker Name="/OKBDataContext/AlgorithmUser" />
+      <nestedChildShapes>
+        <elementListCompartment Id="f81c31a9-84c5-40b1-b817-6dccbe77227d" absoluteBounds="5.0150000000000006, 2.5850000000000009, 1.9700000000000002, 0.63399251302083326" name="DataPropertiesCompartment" titleTextColor="Black" itemTextColor="Black" />
+      </nestedChildShapes>
+    </classShape>
+    <associationConnector edgePoints="[(4.75 : 2.35); (5 : 2.35)]" manuallyRouted="true" fixedFrom="Algorithm" fixedTo="Algorithm">
+      <AssociationMoniker Name="/OKBDataContext/Algorithm/Algorithm_AlgorithmUser" />
+      <nodes>
+        <classShapeMoniker Id="6395cc20-e99d-4d78-868d-4401004ef90f" />
+        <classShapeMoniker Id="aa997e47-0162-4fc2-aa8d-e237c50c46fe" />
+      </nodes>
+    </associationConnector>
+    <classShape Id="8d911be4-13c4-4abd-85de-4f93f280dd50" isExpanded="false" absoluteBounds="11, 2.125, 2, 0.45">
+      <DataClassMoniker Name="/OKBDataContext/ProblemUser" />
+      <nestedChildShapes>
+        <elementListCompartment Id="bdf4bd9d-405f-4582-99ff-036459c86748" absoluteBounds="11.015, 2.5850000000000009, 1.9700000000000002, 0.63399251302083326" name="DataPropertiesCompartment" titleTextColor="Black" itemTextColor="Black" />
+      </nestedChildShapes>
+    </classShape>
+    <associationConnector edgePoints="[(13.25 : 2.35); (13 : 2.35)]" manuallyRouted="true" fixedFrom="Algorithm" fixedTo="Algorithm">
+      <AssociationMoniker Name="/OKBDataContext/Problem/Problem_ProblemUser" />
+      <nodes>
+        <classShapeMoniker Id="27d0903a-8f45-4b0b-8d0e-8d632bffc702" />
+        <classShapeMoniker Id="8d911be4-13c4-4abd-85de-4f93f280dd50" />
+      </nodes>
+    </associationConnector>
+    <classShape Id="42a9e8c0-3168-43f0-a31f-54d1558bd4c2" absoluteBounds="8, 2.125, 2, 1.3862939453125">
+      <DataClassMoniker Name="/OKBDataContext/Platform" />
+      <nestedChildShapes>
+        <elementListCompartment Id="83ab4fa2-80aa-4c36-9596-bc4d9a0c6daf" absoluteBounds="8.015, 2.585, 1.9700000000000002, 0.8262939453125" name="DataPropertiesCompartment" titleTextColor="Black" itemTextColor="Black" />
+      </nestedChildShapes>
+    </classShape>
+    <associationConnector edgePoints="[(8 : 2.85); (4.75 : 2.85)]" fixedFrom="Algorithm" fixedTo="Algorithm">
+      <AssociationMoniker Name="/OKBDataContext/Platform/Platform_Algorithm" />
+      <nodes>
+        <classShapeMoniker Id="42a9e8c0-3168-43f0-a31f-54d1558bd4c2" />
+        <classShapeMoniker Id="6395cc20-e99d-4d78-868d-4401004ef90f" />
+      </nodes>
+    </associationConnector>
+    <associationConnector edgePoints="[(10 : 2.85); (13.25 : 2.85)]" fixedFrom="Algorithm" fixedTo="Algorithm">
+      <AssociationMoniker Name="/OKBDataContext/Platform/Platform_Problem" />
+      <nodes>
+        <classShapeMoniker Id="42a9e8c0-3168-43f0-a31f-54d1558bd4c2" />
+        <classShapeMoniker Id="27d0903a-8f45-4b0b-8d0e-8d632bffc702" />
+      </nodes>
+    </associationConnector>
+    <associationConnector edgePoints="[(4.75 : 3.73206647840153); (7.58333333333334 : 3.73206647840152 : JumpStart); (7.75 : 3.73206647840153 : JumpEnd); (8.66439605504989 : 3.73206647840153); (8.66439605504989 : 4.375)]" fixedFrom="Caller" fixedTo="Algorithm">
+      <AssociationMoniker Name="/OKBDataContext/Algorithm/Algorithm_Experiment" />
+      <nodes>
+        <classShapeMoniker Id="6395cc20-e99d-4d78-868d-4401004ef90f" />
+        <classShapeMoniker Id="c250fb1a-b448-499e-b8eb-d1d0c38521a0" />
+      </nodes>
+    </associationConnector>
+    <classShape Id="83a5f628-defe-486f-bc6a-4ab430293368" absoluteBounds="8, 9.875, 2, 1.9631982421875">
+      <DataClassMoniker Name="/OKBDataContext/Run" />
+      <nestedChildShapes>
+        <elementListCompartment Id="649f10a6-6047-4f4e-b76a-9da90591bbec" absoluteBounds="8.015, 10.335, 1.9700000000000002, 1.4031982421875" name="DataPropertiesCompartment" titleTextColor="Black" itemTextColor="Black" />
+      </nestedChildShapes>
+    </classShape>
+    <associationConnector edgePoints="[(8.97294619299704 : 5.7612939453125); (8.97294619299704 : 7.07715027669271); (10.0755208333334 : 7.07715027669271 : JumpStart); (10.3177083333333 : 7.07715027669271 : JumpEnd); (10.4169255432508 : 7.07715027669271); (10.4169255432508 : 9.43414366861979); (9.35898824036419 : 9.43414366861979); (9.35898824036419 : 9.875)]" manuallyRouted="true" fixedFrom="NotFixed" fixedTo="NotFixed">
+      <AssociationMoniker Name="/OKBDataContext/Experiment/Experiment_Run" />
+      <nodes>
+        <classShapeMoniker Id="c250fb1a-b448-499e-b8eb-d1d0c38521a0" />
+        <classShapeMoniker Id="83a5f628-defe-486f-bc6a-4ab430293368" />
+      </nodes>
+    </associationConnector>
+    <classShape Id="1cb9bad0-d19c-43d7-97f8-a26cf3e2d7a0" absoluteBounds="2.75, 9.875, 2, 1.9631982421875">
+      <DataClassMoniker Name="/OKBDataContext/Result" />
+      <nestedChildShapes>
+        <elementListCompartment Id="f9654c1a-11ad-49a5-869d-09139f6e950f" absoluteBounds="2.765, 10.335, 1.9700000000000002, 1.4031982421875" name="DataPropertiesCompartment" titleTextColor="Black" itemTextColor="Black" />
+      </nestedChildShapes>
+    </classShape>
+    <associationConnector edgePoints="[(2.75 : 3.57753182566939); (2.48611111111111 : 3.57753182566939); (2.48611111111111 : 10.8349145033753); (2.75 : 10.8349145033753)]" manuallyRouted="true" fixedFrom="NotFixed" fixedTo="NotFixed">
+      <AssociationMoniker Name="/OKBDataContext/Algorithm/Algorithm_Result" />
+      <nodes>
+        <classShapeMoniker Id="6395cc20-e99d-4d78-868d-4401004ef90f" />
+        <classShapeMoniker Id="1cb9bad0-d19c-43d7-97f8-a26cf3e2d7a0" />
+      </nodes>
+    </associationConnector>
+    <classShape Id="8b301cad-7a91-46f5-9c49-75b17bac7a67" absoluteBounds="11.75, 10.25, 2, 1.1939925130208344">
+      <DataClassMoniker Name="/OKBDataContext/Client" />
+      <nestedChildShapes>
+        <elementListCompartment Id="aacc92af-97a1-46b2-8614-a54b03736b54" absoluteBounds="11.765, 10.71, 1.9700000000000002, 0.63399251302083326" name="DataPropertiesCompartment" titleTextColor="Black" itemTextColor="Black" />
+      </nestedChildShapes>
+    </classShape>
+    <associationConnector edgePoints="[(11.75 : 10.8469962565104); (10 : 10.8469962565104)]" fixedFrom="NotFixed" fixedTo="NotFixed">
+      <AssociationMoniker Name="/OKBDataContext/Client/Client_Run" />
+      <nodes>
+        <classShapeMoniker Id="8b301cad-7a91-46f5-9c49-75b17bac7a67" />
+        <classShapeMoniker Id="83a5f628-defe-486f-bc6a-4ab430293368" />
+      </nodes>
+    </associationConnector>
+    <classShape Id="06cdd7a7-aece-4230-94df-523959acef3f" isExpanded="false" absoluteBounds="5, 4.375, 2, 0.45">
+      <DataClassMoniker Name="/OKBDataContext/AlgorithmParameterBlobValue" />
+      <nestedChildShapes>
+        <elementListCompartment Id="b48d7763-2c2a-4795-a2a0-632148a87992" absoluteBounds="5.015, 4.835, 1.9700000000000002, 1.0185953776041665" name="DataPropertiesCompartment" titleTextColor="Black" itemTextColor="Black" />
+      </nestedChildShapes>
+    </classShape>
+    <associationConnector edgePoints="[(4.75 : 4.6); (5 : 4.6)]" fixedFrom="NotFixed" fixedTo="NotFixed">
+      <AssociationMoniker Name="/OKBDataContext/AlgorithmParameter/AlgorithmParameter_AlgorithmParameterBlobValue" />
+      <nodes>
+        <classShapeMoniker Id="533939e3-1d76-4e1b-a562-4bb7a30cc432" />
+        <classShapeMoniker Id="06cdd7a7-aece-4230-94df-523959acef3f" />
+      </nodes>
+    </associationConnector>
+    <associationConnector edgePoints="[(8 : 4.474343832021); (7.75 : 4.474343832021 : JumpStart); (7.58333333333334 : 4.474343832021 : JumpEnd); (7 : 4.474343832021)]" fixedFrom="NotFixed" fixedTo="NotFixed">
+      <AssociationMoniker Name="/OKBDataContext/Experiment/Experiment_AlgorithmParameterBlobValue" />
+      <nodes>
+        <classShapeMoniker Id="c250fb1a-b448-499e-b8eb-d1d0c38521a0" />
+        <classShapeMoniker Id="06cdd7a7-aece-4230-94df-523959acef3f" />
+      </nodes>
+    </associationConnector>
+    <classShape Id="fd56e6c2-86ec-4a3e-b5b4-3fc7da52b28c" absoluteBounds="8, 7.375, 2, 1.5785953776041666">
+      <DataClassMoniker Name="/OKBDataContext/DataType" />
+      <nestedChildShapes>
+        <elementListCompartment Id="ce12818a-3944-434b-8219-a290382fdcbc" absoluteBounds="8.015, 7.835, 1.9700000000000002, 1.0185953776041665" name="DataPropertiesCompartment" titleTextColor="Black" itemTextColor="Black" />
+      </nestedChildShapes>
+    </classShape>
+    <associationConnector edgePoints="[(8 : 8.59359245906078); (3.75523427495249 : 8.59359245906078); (3.75523427495249 : 6.3381982421875)]" fixedFrom="NotFixed" fixedTo="NotFixed">
+      <AssociationMoniker Name="/OKBDataContext/DataType/DataType_AlgorithmParameter" />
+      <nodes>
+        <classShapeMoniker Id="fd56e6c2-86ec-4a3e-b5b4-3fc7da52b28c" />
+        <classShapeMoniker Id="533939e3-1d76-4e1b-a562-4bb7a30cc432" />
+      </nodes>
+    </associationConnector>
+    <associationConnector edgePoints="[(10 : 8.8332272596976); (10.3335922099175 : 8.8332272596976 : JumpStart); (10.5002588765841 : 8.8332272596976 : JumpEnd); (14.2812525 : 8.8332272596976); (14.2812525 : 6.3381982421875)]" fixedFrom="NotFixed" fixedTo="NotFixed">
+      <AssociationMoniker Name="/OKBDataContext/DataType/DataType_ProblemParameter" />
+      <nodes>
+        <classShapeMoniker Id="fd56e6c2-86ec-4a3e-b5b4-3fc7da52b28c" />
+        <classShapeMoniker Id="8b17f420-0cf1-402a-aaec-d2372f039661" />
+      </nodes>
+    </associationConnector>
+    <associationConnector edgePoints="[(8 : 8.84709721018681); (3.73775859657604 : 8.84709721018681); (3.73775859657604 : 9.875)]" manuallyRouted="true" fixedFrom="NotFixed" fixedTo="NotFixed">
+      <AssociationMoniker Name="/OKBDataContext/DataType/DataType_Result" />
+      <nodes>
+        <classShapeMoniker Id="fd56e6c2-86ec-4a3e-b5b4-3fc7da52b28c" />
+        <classShapeMoniker Id="1cb9bad0-d19c-43d7-97f8-a26cf3e2d7a0" />
+      </nodes>
+    </associationConnector>
+    <associationConnector edgePoints="[(8 : 7.64868451067789); (7.53385416666667 : 7.64868451067789); (7.53385416666667 : 4.69868766404199); (7 : 4.69868766404199)]" manuallyRouted="true" fixedFrom="NotFixed" fixedTo="NotFixed">
+      <AssociationMoniker Name="/OKBDataContext/DataType/DataType_AlgorithmParameterBlobValue" />
+      <nodes>
+        <classShapeMoniker Id="fd56e6c2-86ec-4a3e-b5b4-3fc7da52b28c" />
+        <classShapeMoniker Id="06cdd7a7-aece-4230-94df-523959acef3f" />
+      </nodes>
+    </associationConnector>
+    <associationConnector edgePoints="[(10 : 3.24965968229986); (10.1588541666667 : 3.24965968229986); (10.1588541666667 : 7.51797277441852); (10 : 7.51797277441852)]" manuallyRouted="true" fixedFrom="NotFixed" fixedTo="NotFixed">
+      <AssociationMoniker Name="/OKBDataContext/Platform/Platform_DataType" />
+      <nodes>
+        <classShapeMoniker Id="42a9e8c0-3168-43f0-a31f-54d1558bd4c2" />
+        <classShapeMoniker Id="fd56e6c2-86ec-4a3e-b5b4-3fc7da52b28c" />
+      </nodes>
+    </associationConnector>
+    <classShape Id="26374887-8257-4278-aab5-42acd8160d99" isExpanded="false" absoluteBounds="5, 4.875, 2, 0.45">
+      <DataClassMoniker Name="/OKBDataContext/AlgorithmParameterBoolValue" />
+      <nestedChildShapes>
+        <elementListCompartment Id="674d80df-63fd-44ab-85f1-326e2e32ebca" absoluteBounds="5.015, 5.335, 1.9700000000000002, 1.0185953776041665" name="DataPropertiesCompartment" titleTextColor="Black" itemTextColor="Black" />
+      </nestedChildShapes>
+    </classShape>
+    <associationConnector edgePoints="[(4.75 : 5.1); (5 : 5.1)]" fixedFrom="NotFixed" fixedTo="NotFixed">
+      <AssociationMoniker Name="/OKBDataContext/AlgorithmParameter/AlgorithmParameter_AlgorithmParameterBoolValue" />
+      <nodes>
+        <classShapeMoniker Id="533939e3-1d76-4e1b-a562-4bb7a30cc432" />
+        <classShapeMoniker Id="26374887-8257-4278-aab5-42acd8160d99" />
+      </nodes>
+    </associationConnector>
+    <associationConnector edgePoints="[(8 : 7.84101029413916); (7.45052083333333 : 7.84101029413916); (7.45052083333333 : 5.18549618320611); (7 : 5.18549618320611)]" manuallyRouted="true" fixedFrom="NotFixed" fixedTo="NotFixed">
+      <AssociationMoniker Name="/OKBDataContext/DataType/DataType_AlgorithmParameterBoolValue" />
+      <nodes>
+        <classShapeMoniker Id="fd56e6c2-86ec-4a3e-b5b4-3fc7da52b28c" />
+        <classShapeMoniker Id="26374887-8257-4278-aab5-42acd8160d99" />
+      </nodes>
+    </associationConnector>
+    <associationConnector edgePoints="[(8 : 4.96774809160306); (7.75 : 4.96774809160306 : JumpStart); (7.45052083333334 : 4.96774809160306 : JumpEnd); (7 : 4.96774809160306)]" fixedFrom="NotFixed" fixedTo="NotFixed">
+      <AssociationMoniker Name="/OKBDataContext/Experiment/Experiment_AlgorithmParameterBoolValue" />
+      <nodes>
+        <classShapeMoniker Id="c250fb1a-b448-499e-b8eb-d1d0c38521a0" />
+        <classShapeMoniker Id="26374887-8257-4278-aab5-42acd8160d99" />
+      </nodes>
+    </associationConnector>
+    <classShape Id="057a5dc9-97f1-4752-98b1-7e34502a121d" isExpanded="false" absoluteBounds="5, 5.375, 2, 0.45">
+      <DataClassMoniker Name="/OKBDataContext/AlgorithmParameterFloatValue" />
+      <nestedChildShapes>
+        <elementListCompartment Id="816b5043-a0c5-4633-96b3-f37d5e57a76d" absoluteBounds="5.015, 5.835, 1.9700000000000002, 1.0185953776041665" name="DataPropertiesCompartment" titleTextColor="Black" itemTextColor="Black" />
+      </nestedChildShapes>
+    </classShape>
+    <associationConnector edgePoints="[(4.75 : 5.6); (5 : 5.6)]" fixedFrom="NotFixed" fixedTo="NotFixed">
+      <AssociationMoniker Name="/OKBDataContext/AlgorithmParameter/AlgorithmParameter_AlgorithmParameterFloatValue" />
+      <nodes>
+        <classShapeMoniker Id="533939e3-1d76-4e1b-a562-4bb7a30cc432" />
+        <classShapeMoniker Id="057a5dc9-97f1-4752-98b1-7e34502a121d" />
+      </nodes>
+    </associationConnector>
+    <associationConnector edgePoints="[(8 : 8.01620545089886); (7.36677083333333 : 8.01620545089886); (7.36677083333333 : 5.67187575); (7 : 5.67187575)]" manuallyRouted="true" fixedFrom="NotFixed" fixedTo="NotFixed">
+      <AssociationMoniker Name="/OKBDataContext/DataType/DataType_AlgorithmParameterFloatValue" />
+      <nodes>
+        <classShapeMoniker Id="fd56e6c2-86ec-4a3e-b5b4-3fc7da52b28c" />
+        <classShapeMoniker Id="057a5dc9-97f1-4752-98b1-7e34502a121d" />
+      </nodes>
+    </associationConnector>
+    <associationConnector edgePoints="[(8 : 5.460937875); (7.75 : 5.460937875 : JumpStart); (7.3671875 : 5.460937875 : JumpEnd); (7 : 5.460937875)]" fixedFrom="NotFixed" fixedTo="NotFixed">
+      <AssociationMoniker Name="/OKBDataContext/Experiment/Experiment_AlgorithmParameterFloatValue" />
+      <nodes>
+        <classShapeMoniker Id="c250fb1a-b448-499e-b8eb-d1d0c38521a0" />
+        <classShapeMoniker Id="057a5dc9-97f1-4752-98b1-7e34502a121d" />
+      </nodes>
+    </associationConnector>
+    <classShape Id="2f5e14b0-a1c2-4ff8-85e9-8be6dd6d1a3c" isExpanded="false" absoluteBounds="5, 5.875, 2, 0.45">
+      <DataClassMoniker Name="/OKBDataContext/AlgorithmParameterIntValue" />
+      <nestedChildShapes>
+        <elementListCompartment Id="752cb331-8b80-4e3d-bf2b-cf3e5f7969dd" absoluteBounds="5.015, 6.335, 1.9700000000000002, 1.0185953776041665" name="DataPropertiesCompartment" titleTextColor="Black" itemTextColor="Black" />
+      </nestedChildShapes>
+    </classShape>
+    <associationConnector edgePoints="[(4.75 : 6.1); (5 : 6.1)]" fixedFrom="NotFixed" fixedTo="NotFixed">
+      <AssociationMoniker Name="/OKBDataContext/AlgorithmParameter/AlgorithmParameter_AlgorithmParameterIntValue" />
+      <nodes>
+        <classShapeMoniker Id="533939e3-1d76-4e1b-a562-4bb7a30cc432" />
+        <classShapeMoniker Id="2f5e14b0-a1c2-4ff8-85e9-8be6dd6d1a3c" />
+      </nodes>
+    </associationConnector>
+    <associationConnector edgePoints="[(8 : 8.17682240181229); (7.28645833333333 : 8.17682240181229); (7.28645833333333 : 6.14022346368715); (7 : 6.14022346368715)]" manuallyRouted="true" fixedFrom="NotFixed" fixedTo="NotFixed">
+      <AssociationMoniker Name="/OKBDataContext/DataType/DataType_AlgorithmParameterIntValue" />
+      <nodes>
+        <classShapeMoniker Id="fd56e6c2-86ec-4a3e-b5b4-3fc7da52b28c" />
+        <classShapeMoniker Id="2f5e14b0-a1c2-4ff8-85e9-8be6dd6d1a3c" />
+      </nodes>
+    </associationConnector>
+    <associationConnector edgePoints="[(8.12469232196825 : 5.7612939453125); (8.12469232196825 : 6.26386423184357); (7.75 : 6.26386423184357 : JumpStart); (7.203125 : 6.26386423184357 : JumpEnd); (7 : 6.26386423184357)]" fixedFrom="NotFixed" fixedTo="NotFixed">
+      <AssociationMoniker Name="/OKBDataContext/Experiment/Experiment_AlgorithmParameterIntValue" />
+      <nodes>
+        <classShapeMoniker Id="c250fb1a-b448-499e-b8eb-d1d0c38521a0" />
+        <classShapeMoniker Id="2f5e14b0-a1c2-4ff8-85e9-8be6dd6d1a3c" />
+      </nodes>
+    </associationConnector>
+    <classShape Id="eea47e09-6cec-4cb3-9d45-7b9004038e54" isExpanded="false" absoluteBounds="5, 6.375, 2, 0.45">
+      <DataClassMoniker Name="/OKBDataContext/AlgorithmParameterStringValue" />
+      <nestedChildShapes>
+        <elementListCompartment Id="c80917ed-7a25-4278-bdef-8dc9ab7ce3eb" absoluteBounds="5.015, 6.835, 1.9700000000000002, 1.0185953776041665" name="DataPropertiesCompartment" titleTextColor="Black" itemTextColor="Black" />
+      </nestedChildShapes>
+    </classShape>
+    <associationConnector edgePoints="[(4.75 : 6.3381982421875); (5 : 6.375)]" fixedFrom="NotFixed" fixedTo="NotFixed">
+      <AssociationMoniker Name="/OKBDataContext/AlgorithmParameter/AlgorithmParameter_AlgorithmParameterStringValue" />
+      <nodes>
+        <classShapeMoniker Id="533939e3-1d76-4e1b-a562-4bb7a30cc432" />
+        <classShapeMoniker Id="eea47e09-6cec-4cb3-9d45-7b9004038e54" />
+      </nodes>
+    </associationConnector>
+    <associationConnector edgePoints="[(8 : 8.34008770793474); (7.22395833333333 : 8.34008770793474); (7.22395833333333 : 6.68727272727273); (7 : 6.68727272727273)]" manuallyRouted="true" fixedFrom="NotFixed" fixedTo="NotFixed">
+      <AssociationMoniker Name="/OKBDataContext/DataType/DataType_AlgorithmParameterStringValue" />
+      <nodes>
+        <classShapeMoniker Id="fd56e6c2-86ec-4a3e-b5b4-3fc7da52b28c" />
+        <classShapeMoniker Id="eea47e09-6cec-4cb3-9d45-7b9004038e54" />
+      </nodes>
+    </associationConnector>
+    <associationConnector edgePoints="[(8.32275220480378 : 5.7612939453125); (8.32275220480378 : 6.52913752913753); (7.75 : 6.52913752913753 : JumpStart); (7.203125 : 6.52913752913753 : JumpEnd); (7 : 6.52913752913753)]" manuallyRouted="true" fixedFrom="NotFixed" fixedTo="NotFixed">
+      <AssociationMoniker Name="/OKBDataContext/Experiment/Experiment_AlgorithmParameterStringValue" />
+      <nodes>
+        <classShapeMoniker Id="c250fb1a-b448-499e-b8eb-d1d0c38521a0" />
+        <classShapeMoniker Id="eea47e09-6cec-4cb3-9d45-7b9004038e54" />
+      </nodes>
+    </associationConnector>
+    <classShape Id="3a7d54f6-474c-4e4d-b1ef-db12741c57a7" isExpanded="false" absoluteBounds="11, 4.375, 2, 0.45">
+      <DataClassMoniker Name="/OKBDataContext/ProblemParameterBlobValue" />
+      <nestedChildShapes>
+        <elementListCompartment Id="661a54eb-030c-441f-b081-ff5fb5f56029" absoluteBounds="11.015, 4.835, 1.9700000000000002, 1.0185953776041665" name="DataPropertiesCompartment" titleTextColor="Black" itemTextColor="Black" />
+      </nestedChildShapes>
+    </classShape>
+    <associationConnector edgePoints="[(10 : 7.9786396782387); (10.3335922099175 : 7.9786396782387 : JumpStart); (10.5002588765841 : 7.9786396782387 : JumpEnd); (10.5625 : 7.9786396782387); (10.5625 : 4.6994708994709); (11 : 4.6994708994709)]" manuallyRouted="true" fixedFrom="NotFixed" fixedTo="NotFixed">
+      <AssociationMoniker Name="/OKBDataContext/DataType/DataType_ProblemParameterBlobValue" />
+      <nodes>
+        <classShapeMoniker Id="fd56e6c2-86ec-4a3e-b5b4-3fc7da52b28c" />
+        <classShapeMoniker Id="3a7d54f6-474c-4e4d-b1ef-db12741c57a7" />
+      </nodes>
+    </associationConnector>
+    <associationConnector edgePoints="[(10 : 4.55926455740201); (10.0755208981321 : 4.55917037795654 : JumpStart); (10.3177082685346 : 4.5588683546384 : JumpEnd); (11 : 4.55801749271137)]" manuallyRouted="true" fixedFrom="NotFixed" fixedTo="NotFixed">
+      <AssociationMoniker Name="/OKBDataContext/Experiment/Experiment_ProblemParameterBlobValue" />
+      <nodes>
+        <classShapeMoniker Id="c250fb1a-b448-499e-b8eb-d1d0c38521a0" />
+        <classShapeMoniker Id="3a7d54f6-474c-4e4d-b1ef-db12741c57a7" />
+      </nodes>
+    </associationConnector>
+    <associationConnector edgePoints="[(13.25 : 4.6); (13 : 4.6)]" fixedFrom="NotFixed" fixedTo="NotFixed">
+      <AssociationMoniker Name="/OKBDataContext/ProblemParameter/ProblemParameter_ProblemParameterBlobValue" />
+      <nodes>
+        <classShapeMoniker Id="8b17f420-0cf1-402a-aaec-d2372f039661" />
+        <classShapeMoniker Id="3a7d54f6-474c-4e4d-b1ef-db12741c57a7" />
+      </nodes>
+    </associationConnector>
+    <classShape Id="17eed903-551f-4855-bec6-9766e172358a" isExpanded="false" absoluteBounds="11, 4.875, 2, 0.45">
+      <DataClassMoniker Name="/OKBDataContext/ProblemParameterBoolValue" />
+      <nestedChildShapes>
+        <elementListCompartment Id="4e4b3cfc-c0b8-4792-a6f6-69eca72be5e9" absoluteBounds="11.015, 5.335, 1.9700000000000002, 1.0185953776041665" name="DataPropertiesCompartment" titleTextColor="Black" itemTextColor="Black" />
+      </nestedChildShapes>
+    </classShape>
+    <associationConnector edgePoints="[(10 : 8.10809372095976); (10.3335922099175 : 8.10809372095976 : JumpStart); (10.5002588765841 : 8.10809372095976 : JumpEnd); (10.625 : 8.10809372095976); (10.625 : 5.16632124352332); (11 : 5.16632124352332)]" manuallyRouted="true" fixedFrom="NotFixed" fixedTo="NotFixed">
+      <AssociationMoniker Name="/OKBDataContext/DataType/DataType_ProblemParameterBoolValue" />
+      <nodes>
+        <classShapeMoniker Id="fd56e6c2-86ec-4a3e-b5b4-3fc7da52b28c" />
+        <classShapeMoniker Id="17eed903-551f-4855-bec6-9766e172358a" />
+      </nodes>
+    </associationConnector>
+    <associationConnector edgePoints="[(10 : 5.01957671957672); (10.0755208333334 : 5.01957671957672 : JumpStart); (10.3177083333333 : 5.01957671957672 : JumpEnd); (10.4791666666667 : 5.01957671957672 : JumpStart); (10.6458333333333 : 5.01957671957672 : JumpEnd); (11 : 5.01957671957672)]" fixedFrom="NotFixed" fixedTo="NotFixed">
+      <AssociationMoniker Name="/OKBDataContext/Experiment/Experiment_ProblemParameterBoolValue" />
+      <nodes>
+        <classShapeMoniker Id="c250fb1a-b448-499e-b8eb-d1d0c38521a0" />
+        <classShapeMoniker Id="17eed903-551f-4855-bec6-9766e172358a" />
+      </nodes>
+    </associationConnector>
+    <associationConnector edgePoints="[(13.25 : 5.1); (13 : 5.1)]" fixedFrom="NotFixed" fixedTo="NotFixed">
+      <AssociationMoniker Name="/OKBDataContext/ProblemParameter/ProblemParameter_ProblemParameterBoolValue" />
+      <nodes>
+        <classShapeMoniker Id="8b17f420-0cf1-402a-aaec-d2372f039661" />
+        <classShapeMoniker Id="17eed903-551f-4855-bec6-9766e172358a" />
+      </nodes>
+    </associationConnector>
+    <classShape Id="efb685e2-26e6-42b4-af33-25d0a261a8e4" isExpanded="false" absoluteBounds="11, 5.375, 2, 0.45">
+      <DataClassMoniker Name="/OKBDataContext/ProblemParameterFloatValue" />
+      <nestedChildShapes>
+        <elementListCompartment Id="e4fc9f1f-c248-4dc4-92d8-251dabb0e892" absoluteBounds="11.015, 5.835, 1.9700000000000002, 1.0185953776041665" name="DataPropertiesCompartment" titleTextColor="Black" itemTextColor="Black" />
+      </nestedChildShapes>
+    </classShape>
+    <associationConnector edgePoints="[(10 : 8.28358960953379); (10.3335922099175 : 8.28358960953379 : JumpStart); (10.5002588765841 : 8.28358960953379 : JumpEnd); (10.6848958333333 : 8.28358960953379); (10.6848958333333 : 5.65482233502538); (11 : 5.65482233502538)]" manuallyRouted="true" fixedFrom="NotFixed" fixedTo="NotFixed">
+      <AssociationMoniker Name="/OKBDataContext/DataType/DataType_ProblemParameterFloatValue" />
+      <nodes>
+        <classShapeMoniker Id="fd56e6c2-86ec-4a3e-b5b4-3fc7da52b28c" />
+        <classShapeMoniker Id="efb685e2-26e6-42b4-af33-25d0a261a8e4" />
+      </nodes>
+    </associationConnector>
+    <associationConnector edgePoints="[(10 : 5.52361809045226); (10.0755208333334 : 5.52361809045226 : JumpStart); (10.3177083333333 : 5.52361809045226 : JumpEnd); (10.4791666666667 : 5.52361809045226 : JumpStart); (10.7083333333333 : 5.52361809045226 : JumpEnd); (11 : 5.52361809045226)]" fixedFrom="NotFixed" fixedTo="NotFixed">
+      <AssociationMoniker Name="/OKBDataContext/Experiment/Experiment_ProblemParameterFloatValue" />
+      <nodes>
+        <classShapeMoniker Id="c250fb1a-b448-499e-b8eb-d1d0c38521a0" />
+        <classShapeMoniker Id="efb685e2-26e6-42b4-af33-25d0a261a8e4" />
+      </nodes>
+    </associationConnector>
+    <associationConnector edgePoints="[(13.25 : 5.6); (13 : 5.6)]" fixedFrom="NotFixed" fixedTo="NotFixed">
+      <AssociationMoniker Name="/OKBDataContext/ProblemParameter/ProblemParameter_ProblemParameterFloatValue" />
+      <nodes>
+        <classShapeMoniker Id="8b17f420-0cf1-402a-aaec-d2372f039661" />
+        <classShapeMoniker Id="efb685e2-26e6-42b4-af33-25d0a261a8e4" />
+      </nodes>
+    </associationConnector>
+    <classShape Id="b27bcaf0-a671-4840-b8d0-3b0b9a75e521" isExpanded="false" absoluteBounds="11, 5.875, 2, 0.45">
+      <DataClassMoniker Name="/OKBDataContext/ProblemParameterIntValue" />
+      <nestedChildShapes>
+        <elementListCompartment Id="8d19f7b7-2edd-4c58-b478-8c9e82f8dd8e" absoluteBounds="11.015, 6.335, 1.9700000000000002, 1.0185953776041665" name="DataPropertiesCompartment" titleTextColor="Black" itemTextColor="Black" />
+      </nestedChildShapes>
+    </classShape>
+    <associationConnector edgePoints="[(10 : 8.41284371712721); (10.3335922099175 : 8.41284371712721 : JumpStart); (10.5002588765841 : 8.41284371712721 : JumpEnd); (10.796875 : 8.41284371712721); (10.796875 : 6.18442211055276); (11 : 6.18442211055276)]" manuallyRouted="true" fixedFrom="NotFixed" fixedTo="NotFixed">
+      <AssociationMoniker Name="/OKBDataContext/DataType/DataType_ProblemParameterIntValue" />
+      <nodes>
+        <classShapeMoniker Id="fd56e6c2-86ec-4a3e-b5b4-3fc7da52b28c" />
+        <classShapeMoniker Id="b27bcaf0-a671-4840-b8d0-3b0b9a75e521" />
+      </nodes>
+    </associationConnector>
+    <associationConnector edgePoints="[(9.90313426539349 : 5.7612939453125); (9.90313426539349 : 5.99845855527638); (10.0755208333334 : 5.99845855527638 : JumpStart); (10.3177083333333 : 5.99845855527638 : JumpEnd); (10.4791666666667 : 5.99845855527638 : JumpStart); (10.7682291666666 : 5.99845855527638 : JumpEnd); (11 : 5.99845855527638)]" fixedFrom="NotFixed" fixedTo="NotFixed">
+      <AssociationMoniker Name="/OKBDataContext/Experiment/Experiment_ProblemParameterIntValue" />
+      <nodes>
+        <classShapeMoniker Id="c250fb1a-b448-499e-b8eb-d1d0c38521a0" />
+        <classShapeMoniker Id="b27bcaf0-a671-4840-b8d0-3b0b9a75e521" />
+      </nodes>
+    </associationConnector>
+    <associationConnector edgePoints="[(13.25 : 6.1); (13 : 6.1)]" fixedFrom="NotFixed" fixedTo="NotFixed">
+      <AssociationMoniker Name="/OKBDataContext/ProblemParameter/ProblemParameter_ProblemParameterIntValue" />
+      <nodes>
+        <classShapeMoniker Id="8b17f420-0cf1-402a-aaec-d2372f039661" />
+        <classShapeMoniker Id="b27bcaf0-a671-4840-b8d0-3b0b9a75e521" />
+      </nodes>
+    </associationConnector>
+    <classShape Id="b7bc30b4-f687-4b26-8033-3a45f55ba3d0" isExpanded="false" absoluteBounds="11, 6.375, 2, 0.45">
+      <DataClassMoniker Name="/OKBDataContext/ProblemParameterStringValue" />
+      <nestedChildShapes>
+        <elementListCompartment Id="3f3ddbbc-2bdc-4b62-8af7-c764c9cb3d23" absoluteBounds="11.015, 6.835, 1.9700000000000002, 1.0185953776041665" name="DataPropertiesCompartment" titleTextColor="Black" itemTextColor="Black" />
+      </nestedChildShapes>
+    </classShape>
+    <associationConnector edgePoints="[(10 : 8.58033140185627); (10.3335922099175 : 8.58033140185627 : JumpStart); (10.5002588765841 : 8.58033140185627 : JumpEnd); (10.8333333333334 : 8.58033140185627); (10.8333333333334 : 6.67728459530026); (11 : 6.67728459530026)]" manuallyRouted="true" fixedFrom="NotFixed" fixedTo="NotFixed">
+      <AssociationMoniker Name="/OKBDataContext/DataType/DataType_ProblemParameterStringValue" />
+      <nodes>
+        <classShapeMoniker Id="fd56e6c2-86ec-4a3e-b5b4-3fc7da52b28c" />
+        <classShapeMoniker Id="b7bc30b4-f687-4b26-8033-3a45f55ba3d0" />
+      </nodes>
+    </associationConnector>
+    <associationConnector edgePoints="[(9.7239488113416 : 5.7612939453125); (9.7239488113416 : 6.52284263959391); (10.0755208333334 : 6.52284263959391 : JumpStart); (10.3177083333333 : 6.52284263959391 : JumpEnd); (10.4791666666667 : 6.52284263959391 : JumpStart); (10.8802083333333 : 6.52284263959391 : JumpEnd); (11 : 6.52284263959391)]" fixedFrom="NotFixed" fixedTo="NotFixed">
+      <AssociationMoniker Name="/OKBDataContext/Experiment/Experiment_ProblemParameterStringValue" />
+      <nodes>
+        <classShapeMoniker Id="c250fb1a-b448-499e-b8eb-d1d0c38521a0" />
+        <classShapeMoniker Id="b7bc30b4-f687-4b26-8033-3a45f55ba3d0" />
+      </nodes>
+    </associationConnector>
+    <associationConnector edgePoints="[(13.25 : 6.3381982421875); (13 : 6.375)]" fixedFrom="NotFixed" fixedTo="NotFixed">
+      <AssociationMoniker Name="/OKBDataContext/ProblemParameter/ProblemParameter_ProblemParameterStringValue" />
+      <nodes>
+        <classShapeMoniker Id="8b17f420-0cf1-402a-aaec-d2372f039661" />
+        <classShapeMoniker Id="b7bc30b4-f687-4b26-8033-3a45f55ba3d0" />
+      </nodes>
+    </associationConnector>
+    <classShape Id="ee200851-595b-4ee2-b49c-05a55a37599f" isExpanded="false" absoluteBounds="5, 9.875, 2, 0.45">
+      <DataClassMoniker Name="/OKBDataContext/ResultBlobValue" />
+      <nestedChildShapes>
+        <elementListCompartment Id="0ac0d616-ed46-4b7b-9cc5-2603a9b9ec47" absoluteBounds="5.015, 10.335, 1.9700000000000002, 1.0185953776041665" name="DataPropertiesCompartment" titleTextColor="Black" itemTextColor="Black" />
+      </nestedChildShapes>
+    </classShape>
+    <associationConnector edgePoints="[(8.25347949158136 : 8.95359537760417); (8.25347949158136 : 9.10416666666667); (7.234375 : 9.10416666666667); (7.234375 : 9.956248); (7 : 9.956248)]" manuallyRouted="true" fixedFrom="NotFixed" fixedTo="NotFixed">
+      <AssociationMoniker Name="/OKBDataContext/DataType/DataType_ResultBlobValue" />
+      <nodes>
+        <classShapeMoniker Id="fd56e6c2-86ec-4a3e-b5b4-3fc7da52b28c" />
+        <classShapeMoniker Id="ee200851-595b-4ee2-b49c-05a55a37599f" />
+      </nodes>
+    </associationConnector>
+    <associationConnector edgePoints="[(4.75 : 10.1); (5 : 10.1)]" fixedFrom="NotFixed" fixedTo="NotFixed">
+      <AssociationMoniker Name="/OKBDataContext/Result/Result_ResultBlobValue" />
+      <nodes>
+        <classShapeMoniker Id="1cb9bad0-d19c-43d7-97f8-a26cf3e2d7a0" />
+        <classShapeMoniker Id="ee200851-595b-4ee2-b49c-05a55a37599f" />
+      </nodes>
+    </associationConnector>
+    <associationConnector edgePoints="[(8 : 10.203124); (7.640625 : 10.203124 : JumpStart); (7.25520833333334 : 10.203124 : JumpEnd); (7 : 10.203124)]" fixedFrom="NotFixed" fixedTo="NotFixed">
+      <AssociationMoniker Name="/OKBDataContext/Run/Run_ResultBlobValue" />
+      <nodes>
+        <classShapeMoniker Id="83a5f628-defe-486f-bc6a-4ab430293368" />
+        <classShapeMoniker Id="ee200851-595b-4ee2-b49c-05a55a37599f" />
+      </nodes>
+    </associationConnector>
+    <classShape Id="d9962bb9-5e85-4440-ba70-52dee5597bb5" isExpanded="false" absoluteBounds="5, 10.375, 2, 0.45">
+      <DataClassMoniker Name="/OKBDataContext/ResultBoolValue" />
+      <nestedChildShapes>
+        <elementListCompartment Id="df41447b-8550-49a9-ae8a-ce5fdde5f39e" absoluteBounds="5.015, 10.835, 1.9700000000000002, 1.0185953776041665" name="DataPropertiesCompartment" titleTextColor="Black" itemTextColor="Black" />
+      </nestedChildShapes>
+    </classShape>
+    <associationConnector edgePoints="[(8.40008105657562 : 8.95359537760417); (8.40008105657562 : 9.19791666666667); (7.33854166666667 : 9.19791666666667); (7.33854166666667 : 10.5251231527094); (7 : 10.5251231527094)]" manuallyRouted="true" fixedFrom="NotFixed" fixedTo="NotFixed">
+      <AssociationMoniker Name="/OKBDataContext/DataType/DataType_ResultBoolValue" />
+      <nodes>
+        <classShapeMoniker Id="fd56e6c2-86ec-4a3e-b5b4-3fc7da52b28c" />
+        <classShapeMoniker Id="d9962bb9-5e85-4440-ba70-52dee5597bb5" />
+      </nodes>
+    </associationConnector>
+    <associationConnector edgePoints="[(4.75 : 10.6); (5 : 10.6)]" fixedFrom="NotFixed" fixedTo="NotFixed">
+      <AssociationMoniker Name="/OKBDataContext/Result/Result_ResultBoolValue" />
+      <nodes>
+        <classShapeMoniker Id="1cb9bad0-d19c-43d7-97f8-a26cf3e2d7a0" />
+        <classShapeMoniker Id="d9962bb9-5e85-4440-ba70-52dee5597bb5" />
+      </nodes>
+    </associationConnector>
+    <associationConnector edgePoints="[(8 : 10.7375615763547); (7.640625 : 10.7375615763547 : JumpStart); (7.31770833333334 : 10.7375615763547 : JumpEnd); (7 : 10.7375615763547)]" fixedFrom="NotFixed" fixedTo="NotFixed">
+      <AssociationMoniker Name="/OKBDataContext/Run/Run_ResultBoolValue" />
+      <nodes>
+        <classShapeMoniker Id="83a5f628-defe-486f-bc6a-4ab430293368" />
+        <classShapeMoniker Id="d9962bb9-5e85-4440-ba70-52dee5597bb5" />
+      </nodes>
+    </associationConnector>
+    <classShape Id="87722e82-0ed2-4367-970a-de15813bccf4" isExpanded="false" absoluteBounds="5, 10.875, 2, 0.45">
+      <DataClassMoniker Name="/OKBDataContext/ResultFloatValue" />
+      <nestedChildShapes>
+        <elementListCompartment Id="7da0329a-6d27-48f9-9681-3218a4f30693" absoluteBounds="5.015, 11.335, 1.9700000000000002, 1.0185953776041665" name="DataPropertiesCompartment" titleTextColor="Black" itemTextColor="Black" />
+      </nestedChildShapes>
+    </classShape>
+    <associationConnector edgePoints="[(8.50949690409837 : 8.95359537760417); (8.50949690409837 : 9.34375); (7.40104166666667 : 9.34375); (7.40104166666667 : 11.0431472081218); (7 : 11.0431472081218)]" manuallyRouted="true" fixedFrom="NotFixed" fixedTo="NotFixed">
+      <AssociationMoniker Name="/OKBDataContext/DataType/DataType_ResultFloatValue" />
+      <nodes>
+        <classShapeMoniker Id="fd56e6c2-86ec-4a3e-b5b4-3fc7da52b28c" />
+        <classShapeMoniker Id="87722e82-0ed2-4367-970a-de15813bccf4" />
+      </nodes>
+    </associationConnector>
+    <associationConnector edgePoints="[(4.75 : 11.1); (5 : 11.1)]" fixedFrom="NotFixed" fixedTo="NotFixed">
+      <AssociationMoniker Name="/OKBDataContext/Result/Result_ResultFloatValue" />
+      <nodes>
+        <classShapeMoniker Id="1cb9bad0-d19c-43d7-97f8-a26cf3e2d7a0" />
+        <classShapeMoniker Id="87722e82-0ed2-4367-970a-de15813bccf4" />
+      </nodes>
+    </associationConnector>
+    <associationConnector edgePoints="[(8 : 11.2465736040609); (7.640625 : 11.2465736040609 : JumpStart); (7.390625 : 11.2465736040609 : JumpEnd); (7 : 11.2465736040609)]" fixedFrom="NotFixed" fixedTo="NotFixed">
+      <AssociationMoniker Name="/OKBDataContext/Run/Run_ResultFloatValue" />
+      <nodes>
+        <classShapeMoniker Id="83a5f628-defe-486f-bc6a-4ab430293368" />
+        <classShapeMoniker Id="87722e82-0ed2-4367-970a-de15813bccf4" />
+      </nodes>
+    </associationConnector>
+    <classShape Id="51114ffd-aaac-4a08-b313-992d55fb1998" isExpanded="false" absoluteBounds="5, 11.375, 2, 0.45">
+      <DataClassMoniker Name="/OKBDataContext/ResultIntValue" />
+      <nestedChildShapes>
+        <elementListCompartment Id="c0d4b94f-c6a1-4143-866a-11e138a128b2" absoluteBounds="5.015, 11.835, 1.9700000000000002, 1.0185953776041665" name="DataPropertiesCompartment" titleTextColor="Black" itemTextColor="Black" />
+      </nestedChildShapes>
+    </classShape>
+    <associationConnector edgePoints="[(8.64347373456605 : 8.95359537760417); (8.64347373456605 : 9.48958333333333); (7.47395833333333 : 9.48958333333333); (7.47395833333333 : 11.5523316062176); (7 : 11.5523316062176)]" manuallyRouted="true" fixedFrom="NotFixed" fixedTo="NotFixed">
+      <AssociationMoniker Name="/OKBDataContext/DataType/DataType_ResultIntValue" />
+      <nodes>
+        <classShapeMoniker Id="fd56e6c2-86ec-4a3e-b5b4-3fc7da52b28c" />
+        <classShapeMoniker Id="51114ffd-aaac-4a08-b313-992d55fb1998" />
+      </nodes>
+    </associationConnector>
+    <associationConnector edgePoints="[(4.75 : 11.6); (5 : 11.6)]" fixedFrom="NotFixed" fixedTo="NotFixed">
+      <AssociationMoniker Name="/OKBDataContext/Result/Result_ResultIntValue" />
+      <nodes>
+        <classShapeMoniker Id="1cb9bad0-d19c-43d7-97f8-a26cf3e2d7a0" />
+        <classShapeMoniker Id="51114ffd-aaac-4a08-b313-992d55fb1998" />
+      </nodes>
+    </associationConnector>
+    <associationConnector edgePoints="[(8 : 11.7511658031088); (7.640625 : 11.7511658031088 : JumpStart); (7.47395833333334 : 11.7511658031088 : JumpEnd); (7 : 11.7511658031088)]" fixedFrom="NotFixed" fixedTo="NotFixed">
+      <AssociationMoniker Name="/OKBDataContext/Run/Run_ResultIntValue" />
+      <nodes>
+        <classShapeMoniker Id="83a5f628-defe-486f-bc6a-4ab430293368" />
+        <classShapeMoniker Id="51114ffd-aaac-4a08-b313-992d55fb1998" />
+      </nodes>
+    </associationConnector>
+    <classShape Id="88d442c4-1dd1-4cbf-ab9f-0ab5be88bde3" isExpanded="false" absoluteBounds="5, 11.875, 2, 0.45">
+      <DataClassMoniker Name="/OKBDataContext/ResultStringValue" />
+      <nestedChildShapes>
+        <elementListCompartment Id="e1b83e78-6822-4fc3-ad73-406604736b80" absoluteBounds="5.015, 12.335, 1.9700000000000002, 1.0185953776041665" name="DataPropertiesCompartment" titleTextColor="Black" itemTextColor="Black" />
+      </nestedChildShapes>
+    </classShape>
+    <associationConnector edgePoints="[(8.76594671358473 : 8.95359537760417); (8.76594671358473 : 9.625); (7.55729166666667 : 9.625); (7.55729166666667 : 12.0117948717949); (7 : 12.0117948717949)]" manuallyRouted="true" fixedFrom="NotFixed" fixedTo="NotFixed">
+      <AssociationMoniker Name="/OKBDataContext/DataType/DataType_ResultStringValue" />
+      <nodes>
+        <classShapeMoniker Id="fd56e6c2-86ec-4a3e-b5b4-3fc7da52b28c" />
+        <classShapeMoniker Id="88d442c4-1dd1-4cbf-ab9f-0ab5be88bde3" />
+      </nodes>
+    </associationConnector>
+    <associationConnector edgePoints="[(4.75000000000001 : 11.8381982421875); (5 : 11.875)]" fixedFrom="NotFixed" fixedTo="NotFixed">
+      <AssociationMoniker Name="/OKBDataContext/Result/Result_ResultStringValue" />
+      <nodes>
+        <classShapeMoniker Id="1cb9bad0-d19c-43d7-97f8-a26cf3e2d7a0" />
+        <classShapeMoniker Id="88d442c4-1dd1-4cbf-ab9f-0ab5be88bde3" />
+      </nodes>
+    </associationConnector>
+    <associationConnector edgePoints="[(8.19174036349966 : 11.8381982421875); (8.19174036349966 : 12.1996499358974); (7 : 12.1996499358974)]" fixedFrom="NotFixed" fixedTo="NotFixed">
+      <AssociationMoniker Name="/OKBDataContext/Run/Run_ResultStringValue" />
+      <nodes>
+        <classShapeMoniker Id="83a5f628-defe-486f-bc6a-4ab430293368" />
+        <classShapeMoniker Id="88d442c4-1dd1-4cbf-ab9f-0ab5be88bde3" />
+      </nodes>
+    </associationConnector>
+    <classShape Id="6a694570-7fd3-46f5-8972-d67f230df83e" isExpanded="false" absoluteBounds="5, 3.125, 2, 0.45">
+      <DataClassMoniker Name="/OKBDataContext/AlgorithmData" />
+      <nestedChildShapes>
+        <elementListCompartment Id="528e0b3e-4609-41e5-931d-60e5165e8fcf" absoluteBounds="5.015, 3.585, 1.9700000000000002, 0.8262939453125" name="DataPropertiesCompartment" titleTextColor="Black" itemTextColor="Black" />
+      </nestedChildShapes>
+    </classShape>
+    <associationConnector edgePoints="[(4.75 : 3.35); (5 : 3.35)]" fixedFrom="Algorithm" fixedTo="Algorithm">
+      <AssociationMoniker Name="/OKBDataContext/Algorithm/Algorithm_AlgorithmData" />
+      <nodes>
+        <classShapeMoniker Id="6395cc20-e99d-4d78-868d-4401004ef90f" />
+        <classShapeMoniker Id="6a694570-7fd3-46f5-8972-d67f230df83e" />
+      </nodes>
+    </associationConnector>
+    <associationConnector edgePoints="[(8 : 7.48059025533894); (7.66666666666667 : 7.48059025533894); (7.66666666666667 : 3.35402010050251); (7 : 3.35402010050251)]" manuallyRouted="true" fixedFrom="NotFixed" fixedTo="NotFixed">
+      <AssociationMoniker Name="/OKBDataContext/DataType/DataType_AlgorithmData" />
+      <nodes>
+        <classShapeMoniker Id="fd56e6c2-86ec-4a3e-b5b4-3fc7da52b28c" />
+        <classShapeMoniker Id="6a694570-7fd3-46f5-8972-d67f230df83e" />
+      </nodes>
+    </associationConnector>
+    <classShape Id="76c463bf-aada-4bb3-8fee-36e85d08bebf" isExpanded="false" absoluteBounds="11, 3.125, 2, 0.45">
+      <DataClassMoniker Name="/OKBDataContext/ProblemData" />
+      <nestedChildShapes>
+        <elementListCompartment Id="f0041206-64f7-482e-bc89-1fc4ae5a29ec" absoluteBounds="11.015, 3.585, 1.9700000000000002, 0.8262939453125" name="DataPropertiesCompartment" titleTextColor="Black" itemTextColor="Black" />
+      </nestedChildShapes>
+    </classShape>
+    <associationConnector edgePoints="[(10 : 7.74641638736175); (10.234375 : 7.74641638736175); (10.234375 : 3.34351351351351); (11 : 3.34351351351351)]" manuallyRouted="true" fixedFrom="NotFixed" fixedTo="NotFixed">
+      <AssociationMoniker Name="/OKBDataContext/DataType/DataType_ProblemData" />
+      <nodes>
+        <classShapeMoniker Id="fd56e6c2-86ec-4a3e-b5b4-3fc7da52b28c" />
+        <classShapeMoniker Id="76c463bf-aada-4bb3-8fee-36e85d08bebf" />
+      </nodes>
+    </associationConnector>
+    <associationConnector edgePoints="[(13.25 : 3.35); (13 : 3.35)]" fixedFrom="Algorithm" fixedTo="Algorithm">
+      <AssociationMoniker Name="/OKBDataContext/Problem/Problem_ProblemData" />
+      <nodes>
+        <classShapeMoniker Id="27d0903a-8f45-4b0b-8d0e-8d632bffc702" />
+        <classShapeMoniker Id="76c463bf-aada-4bb3-8fee-36e85d08bebf" />
+      </nodes>
+    </associationConnector>
+  </nestedChildShapes>
+</ordesignerObjectsDiagram>
Index: /branches/OKB/HeuristicLab.Services.OKB.DataAccess/3.3/OKB.generated.cs
===================================================================
--- /branches/OKB/HeuristicLab.Services.OKB.DataAccess/3.3/OKB.generated.cs	(revision 4480)
+++ /branches/OKB/HeuristicLab.Services.OKB.DataAccess/3.3/OKB.generated.cs	(revision 4480)
@@ -0,0 +1,8986 @@
+﻿#pragma warning disable 1591
+//------------------------------------------------------------------------------
+// <auto-generated>
+//     This code was generated by LINQ to SQL template for T4 C#
+//     Generated at 09/16/2010 02:21:16
+//
+//     Changes to this file may cause incorrect behavior and will be lost if
+//     the code is regenerated.
+// </auto-generated>
+//------------------------------------------------------------------------------
+using System;
+using System.ComponentModel;
+using System.Data.Linq;
+using System.Data.Linq.Mapping;
+using System.Runtime.Serialization;
+
+namespace HeuristicLab.Services.OKB.DataAccess
+{
+	[DatabaseAttribute(Name=@"HeuristicLab.OKB")]
+	public partial class OKBDataContext : DataContext
+	{
+		private static MappingSource mappingSource = new AttributeMappingSource();
+		
+		#region Extensibility Method Definitions
+		partial void OnCreated();
+		partial void InsertAlgorithmClass(AlgorithmClass instance);
+		partial void UpdateAlgorithmClass(AlgorithmClass instance);
+		partial void DeleteAlgorithmClass(AlgorithmClass instance);
+		partial void InsertAlgorithm(Algorithm instance);
+		partial void UpdateAlgorithm(Algorithm instance);
+		partial void DeleteAlgorithm(Algorithm instance);
+		partial void InsertProblem(Problem instance);
+		partial void UpdateProblem(Problem instance);
+		partial void DeleteProblem(Problem instance);
+		partial void InsertProblemClass(ProblemClass instance);
+		partial void UpdateProblemClass(ProblemClass instance);
+		partial void DeleteProblemClass(ProblemClass instance);
+		partial void InsertExperiment(Experiment instance);
+		partial void UpdateExperiment(Experiment instance);
+		partial void DeleteExperiment(Experiment instance);
+		partial void InsertAlgorithmParameter(AlgorithmParameter instance);
+		partial void UpdateAlgorithmParameter(AlgorithmParameter instance);
+		partial void DeleteAlgorithmParameter(AlgorithmParameter instance);
+		partial void InsertProblemParameter(ProblemParameter instance);
+		partial void UpdateProblemParameter(ProblemParameter instance);
+		partial void DeleteProblemParameter(ProblemParameter instance);
+		partial void InsertAlgorithmData(AlgorithmData instance);
+		partial void UpdateAlgorithmData(AlgorithmData instance);
+		partial void DeleteAlgorithmData(AlgorithmData instance);
+		partial void InsertUser(User instance);
+		partial void UpdateUser(User instance);
+		partial void DeleteUser(User instance);
+		partial void InsertProblemData(ProblemData instance);
+		partial void UpdateProblemData(ProblemData instance);
+		partial void DeleteProblemData(ProblemData instance);
+		partial void InsertAlgorithmUser(AlgorithmUser instance);
+		partial void UpdateAlgorithmUser(AlgorithmUser instance);
+		partial void DeleteAlgorithmUser(AlgorithmUser instance);
+		partial void InsertProblemUser(ProblemUser instance);
+		partial void UpdateProblemUser(ProblemUser instance);
+		partial void DeleteProblemUser(ProblemUser instance);
+		partial void InsertPlatform(Platform instance);
+		partial void UpdatePlatform(Platform instance);
+		partial void DeletePlatform(Platform instance);
+		partial void InsertRun(Run instance);
+		partial void UpdateRun(Run instance);
+		partial void DeleteRun(Run instance);
+		partial void InsertResult(Result instance);
+		partial void UpdateResult(Result instance);
+		partial void DeleteResult(Result instance);
+		partial void InsertClient(Client instance);
+		partial void UpdateClient(Client instance);
+		partial void DeleteClient(Client instance);
+		partial void InsertAlgorithmParameterBlobValue(AlgorithmParameterBlobValue instance);
+		partial void UpdateAlgorithmParameterBlobValue(AlgorithmParameterBlobValue instance);
+		partial void DeleteAlgorithmParameterBlobValue(AlgorithmParameterBlobValue instance);
+		partial void InsertDataType(DataType instance);
+		partial void UpdateDataType(DataType instance);
+		partial void DeleteDataType(DataType instance);
+		partial void InsertAlgorithmParameterBoolValue(AlgorithmParameterBoolValue instance);
+		partial void UpdateAlgorithmParameterBoolValue(AlgorithmParameterBoolValue instance);
+		partial void DeleteAlgorithmParameterBoolValue(AlgorithmParameterBoolValue instance);
+		partial void InsertAlgorithmParameterFloatValue(AlgorithmParameterFloatValue instance);
+		partial void UpdateAlgorithmParameterFloatValue(AlgorithmParameterFloatValue instance);
+		partial void DeleteAlgorithmParameterFloatValue(AlgorithmParameterFloatValue instance);
+		partial void InsertAlgorithmParameterIntValue(AlgorithmParameterIntValue instance);
+		partial void UpdateAlgorithmParameterIntValue(AlgorithmParameterIntValue instance);
+		partial void DeleteAlgorithmParameterIntValue(AlgorithmParameterIntValue instance);
+		partial void InsertAlgorithmParameterStringValue(AlgorithmParameterStringValue instance);
+		partial void UpdateAlgorithmParameterStringValue(AlgorithmParameterStringValue instance);
+		partial void DeleteAlgorithmParameterStringValue(AlgorithmParameterStringValue instance);
+		partial void InsertProblemParameterBlobValue(ProblemParameterBlobValue instance);
+		partial void UpdateProblemParameterBlobValue(ProblemParameterBlobValue instance);
+		partial void DeleteProblemParameterBlobValue(ProblemParameterBlobValue instance);
+		partial void InsertProblemParameterBoolValue(ProblemParameterBoolValue instance);
+		partial void UpdateProblemParameterBoolValue(ProblemParameterBoolValue instance);
+		partial void DeleteProblemParameterBoolValue(ProblemParameterBoolValue instance);
+		partial void InsertProblemParameterFloatValue(ProblemParameterFloatValue instance);
+		partial void UpdateProblemParameterFloatValue(ProblemParameterFloatValue instance);
+		partial void DeleteProblemParameterFloatValue(ProblemParameterFloatValue instance);
+		partial void InsertProblemParameterIntValue(ProblemParameterIntValue instance);
+		partial void UpdateProblemParameterIntValue(ProblemParameterIntValue instance);
+		partial void DeleteProblemParameterIntValue(ProblemParameterIntValue instance);
+		partial void InsertProblemParameterStringValue(ProblemParameterStringValue instance);
+		partial void UpdateProblemParameterStringValue(ProblemParameterStringValue instance);
+		partial void DeleteProblemParameterStringValue(ProblemParameterStringValue instance);
+		partial void InsertResultBlobValue(ResultBlobValue instance);
+		partial void UpdateResultBlobValue(ResultBlobValue instance);
+		partial void DeleteResultBlobValue(ResultBlobValue instance);
+		partial void InsertResultBoolValue(ResultBoolValue instance);
+		partial void UpdateResultBoolValue(ResultBoolValue instance);
+		partial void DeleteResultBoolValue(ResultBoolValue instance);
+		partial void InsertResultFloatValue(ResultFloatValue instance);
+		partial void UpdateResultFloatValue(ResultFloatValue instance);
+		partial void DeleteResultFloatValue(ResultFloatValue instance);
+		partial void InsertResultIntValue(ResultIntValue instance);
+		partial void UpdateResultIntValue(ResultIntValue instance);
+		partial void DeleteResultIntValue(ResultIntValue instance);
+		partial void InsertResultStringValue(ResultStringValue instance);
+		partial void UpdateResultStringValue(ResultStringValue instance);
+		partial void DeleteResultStringValue(ResultStringValue instance);
+		#endregion
+		
+		#region Construction
+		public OKBDataContext() :
+			base(global::HeuristicLab.Services.OKB.DataAccess.Properties.Settings.Default.OKBConnectionString, mappingSource)
+		{
+			OnCreated();
+		}
+	
+		public OKBDataContext(string connection) :
+			base(connection, mappingSource)
+		{
+			OnCreated();
+		}
+		
+		public OKBDataContext(System.Data.IDbConnection connection) :
+			base(connection, mappingSource)
+		{
+			OnCreated();
+		}
+		
+		public OKBDataContext(string connection, MappingSource mappingSource) :
+			base(connection, mappingSource)
+		{
+			OnCreated();
+		}
+		
+		public OKBDataContext(System.Data.IDbConnection connection, MappingSource mappingSource) :
+			base(connection, mappingSource)
+		{
+			OnCreated();
+		}
+		#endregion
+		
+		#region Tables
+		public Table<AlgorithmClass> AlgorithmClasses
+		{
+			get { return GetTable<AlgorithmClass>(); }
+		}
+		
+		public Table<Algorithm> Algorithms
+		{
+			get { return GetTable<Algorithm>(); }
+		}
+		
+		public Table<Problem> Problems
+		{
+			get { return GetTable<Problem>(); }
+		}
+		
+		public Table<ProblemClass> ProblemClasses
+		{
+			get { return GetTable<ProblemClass>(); }
+		}
+		
+		public Table<Experiment> Experiments
+		{
+			get { return GetTable<Experiment>(); }
+		}
+		
+		public Table<AlgorithmParameter> AlgorithmParameters
+		{
+			get { return GetTable<AlgorithmParameter>(); }
+		}
+		
+		public Table<ProblemParameter> ProblemParameters
+		{
+			get { return GetTable<ProblemParameter>(); }
+		}
+		
+		public Table<AlgorithmData> AlgorithmDatas
+		{
+			get { return GetTable<AlgorithmData>(); }
+		}
+		
+		public Table<User> Users
+		{
+			get { return GetTable<User>(); }
+		}
+		
+		public Table<ProblemData> ProblemDatas
+		{
+			get { return GetTable<ProblemData>(); }
+		}
+		
+		public Table<AlgorithmUser> AlgorithmUsers
+		{
+			get { return GetTable<AlgorithmUser>(); }
+		}
+		
+		public Table<ProblemUser> ProblemUsers
+		{
+			get { return GetTable<ProblemUser>(); }
+		}
+		
+		public Table<Platform> Platforms
+		{
+			get { return GetTable<Platform>(); }
+		}
+		
+		public Table<Run> Runs
+		{
+			get { return GetTable<Run>(); }
+		}
+		
+		public Table<Result> Results
+		{
+			get { return GetTable<Result>(); }
+		}
+		
+		public Table<Client> Clients
+		{
+			get { return GetTable<Client>(); }
+		}
+		
+		public Table<AlgorithmParameterBlobValue> AlgorithmParameterBlobValues
+		{
+			get { return GetTable<AlgorithmParameterBlobValue>(); }
+		}
+		
+		public Table<DataType> DataTypes
+		{
+			get { return GetTable<DataType>(); }
+		}
+		
+		public Table<AlgorithmParameterBoolValue> AlgorithmParameterBoolValues
+		{
+			get { return GetTable<AlgorithmParameterBoolValue>(); }
+		}
+		
+		public Table<AlgorithmParameterFloatValue> AlgorithmParameterFloatValues
+		{
+			get { return GetTable<AlgorithmParameterFloatValue>(); }
+		}
+		
+		public Table<AlgorithmParameterIntValue> AlgorithmParameterIntValues
+		{
+			get { return GetTable<AlgorithmParameterIntValue>(); }
+		}
+		
+		public Table<AlgorithmParameterStringValue> AlgorithmParameterStringValues
+		{
+			get { return GetTable<AlgorithmParameterStringValue>(); }
+		}
+		
+		public Table<ProblemParameterBlobValue> ProblemParameterBlobValues
+		{
+			get { return GetTable<ProblemParameterBlobValue>(); }
+		}
+		
+		public Table<ProblemParameterBoolValue> ProblemParameterBoolValues
+		{
+			get { return GetTable<ProblemParameterBoolValue>(); }
+		}
+		
+		public Table<ProblemParameterFloatValue> ProblemParameterFloatValues
+		{
+			get { return GetTable<ProblemParameterFloatValue>(); }
+		}
+		
+		public Table<ProblemParameterIntValue> ProblemParameterIntValues
+		{
+			get { return GetTable<ProblemParameterIntValue>(); }
+		}
+		
+		public Table<ProblemParameterStringValue> ProblemParameterStringValues
+		{
+			get { return GetTable<ProblemParameterStringValue>(); }
+		}
+		
+		public Table<ResultBlobValue> ResultBlobValues
+		{
+			get { return GetTable<ResultBlobValue>(); }
+		}
+		
+		public Table<ResultBoolValue> ResultBoolValues
+		{
+			get { return GetTable<ResultBoolValue>(); }
+		}
+		
+		public Table<ResultFloatValue> ResultFloatValues
+		{
+			get { return GetTable<ResultFloatValue>(); }
+		}
+		
+		public Table<ResultIntValue> ResultIntValues
+		{
+			get { return GetTable<ResultIntValue>(); }
+		}
+		
+		public Table<ResultStringValue> ResultStringValues
+		{
+			get { return GetTable<ResultStringValue>(); }
+		}
+		
+		#endregion
+	}
+}
+
+namespace HeuristicLab.Services.OKB.DataAccess
+{	
+	[DataContract(IsReference=true)]
+	[Table(Name=@"dbo.AlgorithmClass")]
+[KnownType(typeof(AlgorithmClass))]	public partial class AlgorithmClass : INotifyPropertyChanging, INotifyPropertyChanged
+	{
+		#region Property Change Event Handling
+		private static PropertyChangingEventArgs emptyChangingEventArgs = new PropertyChangingEventArgs(String.Empty);
+		
+		public event PropertyChangingEventHandler PropertyChanging;
+		public event PropertyChangedEventHandler PropertyChanged;
+		
+		public virtual void SendPropertyChanging()
+		{
+			if (PropertyChanging != null) {
+				PropertyChanging(this, emptyChangingEventArgs);
+			}
+		}
+			
+		public virtual void SendPropertyChanged(String propertyName)
+		{
+			if (PropertyChanged != null) {
+				PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
+			}
+		}
+		#endregion
+		
+		#region Extensibility Method Definitions
+		partial void OnLoaded();
+		partial void OnValidate(ChangeAction action);
+		partial void OnCreated();
+		#endregion
+
+		#region Construction
+		public AlgorithmClass()
+		{
+			Initialize();
+		}
+		
+		private void Initialize()
+		{
+			_Algorithms = new EntitySet<Algorithm>(attach_Algorithms, detach_Algorithms);
+			OnCreated();
+		}
+		#endregion
+
+		#region Column Mappings
+		partial void OnIdChanging(long value);
+		partial void OnIdChanged();
+		private long _Id;
+		[Column(Storage=@"_Id", AutoSync=AutoSync.OnInsert, DbType=@"BigInt NOT NULL IDENTITY", IsPrimaryKey=true, IsDbGenerated=true, UpdateCheck=UpdateCheck.Never)]
+		[DataMember(Order=1)]
+		public long Id
+		{
+			get { return _Id; }
+			set {
+				if (_Id != value) {
+					OnIdChanging(value);
+					SendPropertyChanging();
+					_Id = value;
+					SendPropertyChanged("Id");
+					OnIdChanged();
+				}
+			}
+		}
+		
+		partial void OnNameChanging(string value);
+		partial void OnNameChanged();
+		private string _Name;
+		[Column(Storage=@"_Name", DbType=@"NVarChar(200) NOT NULL", CanBeNull=false)]
+		[DataMember(Order=2)]
+		public string Name
+		{
+			get { return _Name; }
+			set {
+				if (_Name != value) {
+					OnNameChanging(value);
+					SendPropertyChanging();
+					_Name = value;
+					SendPropertyChanged("Name");
+					OnNameChanged();
+				}
+			}
+		}
+		
+		partial void OnDescriptionChanging(string value);
+		partial void OnDescriptionChanged();
+		private string _Description;
+		[Column(Storage=@"_Description", DbType=@"NVarChar(MAX)")]
+		[DataMember(Order=3)]
+		public string Description
+		{
+			get { return _Description; }
+			set {
+				if (_Description != value) {
+					OnDescriptionChanging(value);
+					SendPropertyChanging();
+					_Description = value;
+					SendPropertyChanged("Description");
+					OnDescriptionChanged();
+				}
+			}
+		}
+		
+		#endregion
+		
+		#region Associations
+		private EntitySet<Algorithm> _Algorithms;
+		[Association(Name=@"AlgorithmClass_Algorithm", Storage=@"_Algorithms", ThisKey=@"Id", OtherKey=@"AlgorithmClassId")]
+		[DataMember(Order=4, EmitDefaultValue=false)]
+		public EntitySet<Algorithm> Algorithms
+		{
+			get {
+				if (serializing && !_Algorithms.HasLoadedOrAssignedValues) {
+					return null;
+				}
+				return _Algorithms;
+			}
+			set {
+				_Algorithms.Assign(value);
+			}
+		}
+
+		private void attach_Algorithms(Algorithm entity)
+		{
+			SendPropertyChanging();
+			entity.AlgorithmClass = this;
+		}
+		
+		private void detach_Algorithms(Algorithm entity)
+		{
+			SendPropertyChanging();
+			entity.AlgorithmClass = null;
+		}
+		#endregion
+		
+		#region Serialization
+		private bool serializing;
+		
+		[OnSerializing()]
+		[EditorBrowsableAttribute(EditorBrowsableState.Never)]
+		public void OnSerializing(StreamingContext context)
+		{
+			serializing = true;
+		}
+		
+		[OnSerialized()]
+		[EditorBrowsableAttribute(EditorBrowsableState.Never)]
+		public void OnSerialized(StreamingContext context)
+		{
+			serializing = false;
+		}
+		
+		[OnDeserializing()]
+		[EditorBrowsableAttribute(EditorBrowsableState.Never)]
+		public  void OnDeserializing(StreamingContext context)
+		{
+			Initialize();
+		}
+		#endregion
+	}
+}
+
+namespace HeuristicLab.Services.OKB.DataAccess
+{	
+	[DataContract(IsReference=true)]
+	[Table(Name=@"dbo.Algorithm")]
+[KnownType(typeof(Algorithm))]	public partial class Algorithm : INotifyPropertyChanging, INotifyPropertyChanged
+	{
+		#region Property Change Event Handling
+		private static PropertyChangingEventArgs emptyChangingEventArgs = new PropertyChangingEventArgs(String.Empty);
+		
+		public event PropertyChangingEventHandler PropertyChanging;
+		public event PropertyChangedEventHandler PropertyChanged;
+		
+		public virtual void SendPropertyChanging()
+		{
+			if (PropertyChanging != null) {
+				PropertyChanging(this, emptyChangingEventArgs);
+			}
+		}
+			
+		public virtual void SendPropertyChanged(String propertyName)
+		{
+			if (PropertyChanged != null) {
+				PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
+			}
+		}
+		#endregion
+		
+		#region Extensibility Method Definitions
+		partial void OnLoaded();
+		partial void OnValidate(ChangeAction action);
+		partial void OnCreated();
+		#endregion
+
+		#region Construction
+		public Algorithm()
+		{
+			Initialize();
+		}
+		
+		private void Initialize()
+		{
+			_Experiments = new EntitySet<Experiment>(attach_Experiments, detach_Experiments);
+			_AlgorithmParameters = new EntitySet<AlgorithmParameter>(attach_AlgorithmParameters, detach_AlgorithmParameters);
+			_AlgorithmData = default(EntityRef<AlgorithmData>);
+			_AlgorithmUsers = new EntitySet<AlgorithmUser>(attach_AlgorithmUsers, detach_AlgorithmUsers);
+			_Results = new EntitySet<Result>(attach_Results, detach_Results);
+			_AlgorithmClass = default(EntityRef<AlgorithmClass>);
+			_Platform = default(EntityRef<Platform>);
+			OnCreated();
+		}
+		#endregion
+
+		#region Column Mappings
+		partial void OnIdChanging(long value);
+		partial void OnIdChanged();
+		private long _Id;
+		[Column(Storage=@"_Id", AutoSync=AutoSync.OnInsert, DbType=@"BigInt NOT NULL IDENTITY", IsPrimaryKey=true, IsDbGenerated=true, UpdateCheck=UpdateCheck.Never)]
+		[DataMember(Order=1)]
+		public long Id
+		{
+			get { return _Id; }
+			set {
+				if (_Id != value) {
+					OnIdChanging(value);
+					SendPropertyChanging();
+					_Id = value;
+					SendPropertyChanged("Id");
+					OnIdChanged();
+				}
+			}
+		}
+		
+		partial void OnAlgorithmClassIdChanging(long value);
+		partial void OnAlgorithmClassIdChanged();
+		private long _AlgorithmClassId;
+		[Column(Storage=@"_AlgorithmClassId", DbType=@"BigInt NOT NULL", CanBeNull=false)]
+		[DataMember(Order=2)]
+		public long AlgorithmClassId
+		{
+			get { return _AlgorithmClassId; }
+			set {
+				if (_AlgorithmClassId != value) {
+					if (_AlgorithmClass.HasLoadedOrAssignedValue) {
+						throw new ForeignKeyReferenceAlreadyHasValueException();
+					}
+					OnAlgorithmClassIdChanging(value);
+					SendPropertyChanging();
+					_AlgorithmClassId = value;
+					SendPropertyChanged("AlgorithmClassId");
+					OnAlgorithmClassIdChanged();
+				}
+			}
+		}
+		
+		partial void OnPlatformIdChanging(long value);
+		partial void OnPlatformIdChanged();
+		private long _PlatformId;
+		[Column(Storage=@"_PlatformId", DbType=@"BigInt NOT NULL", CanBeNull=false)]
+		[DataMember(Order=3)]
+		public long PlatformId
+		{
+			get { return _PlatformId; }
+			set {
+				if (_PlatformId != value) {
+					if (_Platform.HasLoadedOrAssignedValue) {
+						throw new ForeignKeyReferenceAlreadyHasValueException();
+					}
+					OnPlatformIdChanging(value);
+					SendPropertyChanging();
+					_PlatformId = value;
+					SendPropertyChanged("PlatformId");
+					OnPlatformIdChanged();
+				}
+			}
+		}
+		
+		partial void OnNameChanging(string value);
+		partial void OnNameChanged();
+		private string _Name;
+		[Column(Storage=@"_Name", DbType=@"NVarChar(200) NOT NULL", CanBeNull=false)]
+		[DataMember(Order=4)]
+		public string Name
+		{
+			get { return _Name; }
+			set {
+				if (_Name != value) {
+					OnNameChanging(value);
+					SendPropertyChanging();
+					_Name = value;
+					SendPropertyChanged("Name");
+					OnNameChanged();
+				}
+			}
+		}
+		
+		partial void OnDescriptionChanging(string value);
+		partial void OnDescriptionChanged();
+		private string _Description;
+		[Column(Storage=@"_Description", DbType=@"NVarChar(MAX)")]
+		[DataMember(Order=5)]
+		public string Description
+		{
+			get { return _Description; }
+			set {
+				if (_Description != value) {
+					OnDescriptionChanging(value);
+					SendPropertyChanging();
+					_Description = value;
+					SendPropertyChanged("Description");
+					OnDescriptionChanged();
+				}
+			}
+		}
+		
+		#endregion
+		
+		#region Associations
+		private EntitySet<Experiment> _Experiments;
+		[Association(Name=@"Algorithm_Experiment", Storage=@"_Experiments", ThisKey=@"Id", OtherKey=@"AlgorithmId")]
+		[DataMember(Order=6, EmitDefaultValue=false)]
+		public EntitySet<Experiment> Experiments
+		{
+			get {
+				if (serializing && !_Experiments.HasLoadedOrAssignedValues) {
+					return null;
+				}
+				return _Experiments;
+			}
+			set {
+				_Experiments.Assign(value);
+			}
+		}
+
+		private void attach_Experiments(Experiment entity)
+		{
+			SendPropertyChanging();
+			entity.Algorithm = this;
+		}
+		
+		private void detach_Experiments(Experiment entity)
+		{
+			SendPropertyChanging();
+			entity.Algorithm = null;
+		}
+		private EntitySet<AlgorithmParameter> _AlgorithmParameters;
+		[Association(Name=@"Algorithm_AlgorithmParameter", Storage=@"_AlgorithmParameters", ThisKey=@"Id", OtherKey=@"AlgorithmId")]
+		[DataMember(Order=7, EmitDefaultValue=false)]
+		public EntitySet<AlgorithmParameter> AlgorithmParameters
+		{
+			get {
+				if (serializing && !_AlgorithmParameters.HasLoadedOrAssignedValues) {
+					return null;
+				}
+				return _AlgorithmParameters;
+			}
+			set {
+				_AlgorithmParameters.Assign(value);
+			}
+		}
+
+		private void attach_AlgorithmParameters(AlgorithmParameter entity)
+		{
+			SendPropertyChanging();
+			entity.Algorithm = this;
+		}
+		
+		private void detach_AlgorithmParameters(AlgorithmParameter entity)
+		{
+			SendPropertyChanging();
+			entity.Algorithm = null;
+		}
+		private EntityRef<AlgorithmData> _AlgorithmData;
+		[Association(Name=@"Algorithm_AlgorithmData", Storage=@"_AlgorithmData", ThisKey=@"Id", OtherKey=@"AlgorithmId", IsUnique=true, IsForeignKey=false)]
+		[DataMember(Order=8, EmitDefaultValue=false)]
+		public AlgorithmData AlgorithmData
+		{
+			get {
+				if (serializing && !_AlgorithmData.HasLoadedOrAssignedValue) {
+					return null;
+				}
+				return _AlgorithmData.Entity;
+			}
+			set {
+				AlgorithmData previousValue = _AlgorithmData.Entity;
+				if ((previousValue != value) || (!_AlgorithmData.HasLoadedOrAssignedValue)) {
+					SendPropertyChanging();
+					if (previousValue != null) {
+						_AlgorithmData.Entity = null;
+						previousValue.Algorithm = null;
+					}
+					_AlgorithmData.Entity = value;
+					if (value != null) {
+						value.Algorithm = this;
+					}
+					SendPropertyChanged("AlgorithmData");
+				}
+			}
+		}
+
+		private EntitySet<AlgorithmUser> _AlgorithmUsers;
+		[Association(Name=@"Algorithm_AlgorithmUser", Storage=@"_AlgorithmUsers", ThisKey=@"Id", OtherKey=@"AlgorithmId")]
+		[DataMember(Order=9, EmitDefaultValue=false)]
+		public EntitySet<AlgorithmUser> AlgorithmUsers
+		{
+			get {
+				if (serializing && !_AlgorithmUsers.HasLoadedOrAssignedValues) {
+					return null;
+				}
+				return _AlgorithmUsers;
+			}
+			set {
+				_AlgorithmUsers.Assign(value);
+			}
+		}
+
+		private void attach_AlgorithmUsers(AlgorithmUser entity)
+		{
+			SendPropertyChanging();
+			entity.Algorithm = this;
+		}
+		
+		private void detach_AlgorithmUsers(AlgorithmUser entity)
+		{
+			SendPropertyChanging();
+			entity.Algorithm = null;
+		}
+		private EntitySet<Result> _Results;
+		[Association(Name=@"Algorithm_Result", Storage=@"_Results", ThisKey=@"Id", OtherKey=@"AlgorithmId")]
+		[DataMember(Order=10, EmitDefaultValue=false)]
+		public EntitySet<Result> Results
+		{
+			get {
+				if (serializing && !_Results.HasLoadedOrAssignedValues) {
+					return null;
+				}
+				return _Results;
+			}
+			set {
+				_Results.Assign(value);
+			}
+		}
+
+		private void attach_Results(Result entity)
+		{
+			SendPropertyChanging();
+			entity.Algorithm = this;
+		}
+		
+		private void detach_Results(Result entity)
+		{
+			SendPropertyChanging();
+			entity.Algorithm = null;
+		}
+		private EntityRef<AlgorithmClass> _AlgorithmClass;
+		[Association(Name=@"AlgorithmClass_Algorithm", Storage=@"_AlgorithmClass", ThisKey=@"AlgorithmClassId", OtherKey=@"Id", IsForeignKey=true)]
+		[DataMember(Order=11, EmitDefaultValue=false)]
+		public AlgorithmClass AlgorithmClass
+		{
+			get {
+				if (serializing && !_AlgorithmClass.HasLoadedOrAssignedValue) {
+					return null;
+				}
+				return _AlgorithmClass.Entity;
+			}
+			set {
+				AlgorithmClass previousValue = _AlgorithmClass.Entity;
+				if ((previousValue != value) || (!_AlgorithmClass.HasLoadedOrAssignedValue)) {
+					SendPropertyChanging();
+					if (previousValue != null) {
+						_AlgorithmClass.Entity = null;
+						previousValue.Algorithms.Remove(this);
+					}
+					_AlgorithmClass.Entity = value;
+					if (value != null) {
+						value.Algorithms.Add(this);
+						_AlgorithmClassId = value.Id;
+					}
+					else {
+						_AlgorithmClassId = default(long);
+					}
+					SendPropertyChanged("AlgorithmClass");
+				}
+			}
+		}
+
+		private EntityRef<Platform> _Platform;
+		[Association(Name=@"Platform_Algorithm", Storage=@"_Platform", ThisKey=@"PlatformId", OtherKey=@"Id", IsForeignKey=true)]
+		[DataMember(Order=12, EmitDefaultValue=false)]
+		public Platform Platform
+		{
+			get {
+				if (serializing && !_Platform.HasLoadedOrAssignedValue) {
+					return null;
+				}
+				return _Platform.Entity;
+			}
+			set {
+				Platform previousValue = _Platform.Entity;
+				if ((previousValue != value) || (!_Platform.HasLoadedOrAssignedValue)) {
+					SendPropertyChanging();
+					if (previousValue != null) {
+						_Platform.Entity = null;
+						previousValue.Algorithms.Remove(this);
+					}
+					_Platform.Entity = value;
+					if (value != null) {
+						value.Algorithms.Add(this);
+						_PlatformId = value.Id;
+					}
+					else {
+						_PlatformId = default(long);
+					}
+					SendPropertyChanged("Platform");
+				}
+			}
+		}
+
+		#endregion
+		
+		#region Serialization
+		private bool serializing;
+		
+		[OnSerializing()]
+		[EditorBrowsableAttribute(EditorBrowsableState.Never)]
+		public void OnSerializing(StreamingContext context)
+		{
+			serializing = true;
+		}
+		
+		[OnSerialized()]
+		[EditorBrowsableAttribute(EditorBrowsableState.Never)]
+		public void OnSerialized(StreamingContext context)
+		{
+			serializing = false;
+		}
+		
+		[OnDeserializing()]
+		[EditorBrowsableAttribute(EditorBrowsableState.Never)]
+		public  void OnDeserializing(StreamingContext context)
+		{
+			Initialize();
+		}
+		#endregion
+	}
+}
+
+namespace HeuristicLab.Services.OKB.DataAccess
+{	
+	[DataContract(IsReference=true)]
+	[Table(Name=@"dbo.Problem")]
+[KnownType(typeof(Problem))]	public partial class Problem : INotifyPropertyChanging, INotifyPropertyChanged
+	{
+		#region Property Change Event Handling
+		private static PropertyChangingEventArgs emptyChangingEventArgs = new PropertyChangingEventArgs(String.Empty);
+		
+		public event PropertyChangingEventHandler PropertyChanging;
+		public event PropertyChangedEventHandler PropertyChanged;
+		
+		public virtual void SendPropertyChanging()
+		{
+			if (PropertyChanging != null) {
+				PropertyChanging(this, emptyChangingEventArgs);
+			}
+		}
+			
+		public virtual void SendPropertyChanged(String propertyName)
+		{
+			if (PropertyChanged != null) {
+				PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
+			}
+		}
+		#endregion
+		
+		#region Extensibility Method Definitions
+		partial void OnLoaded();
+		partial void OnValidate(ChangeAction action);
+		partial void OnCreated();
+		#endregion
+
+		#region Construction
+		public Problem()
+		{
+			Initialize();
+		}
+		
+		private void Initialize()
+		{
+			_Experiments = new EntitySet<Experiment>(attach_Experiments, detach_Experiments);
+			_ProblemParameters = new EntitySet<ProblemParameter>(attach_ProblemParameters, detach_ProblemParameters);
+			_ProblemData = default(EntityRef<ProblemData>);
+			_ProblemUsers = new EntitySet<ProblemUser>(attach_ProblemUsers, detach_ProblemUsers);
+			_ProblemClass = default(EntityRef<ProblemClass>);
+			_Platform = default(EntityRef<Platform>);
+			OnCreated();
+		}
+		#endregion
+
+		#region Column Mappings
+		partial void OnIdChanging(long value);
+		partial void OnIdChanged();
+		private long _Id;
+		[Column(Storage=@"_Id", AutoSync=AutoSync.OnInsert, DbType=@"BigInt NOT NULL IDENTITY", IsPrimaryKey=true, IsDbGenerated=true, UpdateCheck=UpdateCheck.Never)]
+		[DataMember(Order=1)]
+		public long Id
+		{
+			get { return _Id; }
+			set {
+				if (_Id != value) {
+					OnIdChanging(value);
+					SendPropertyChanging();
+					_Id = value;
+					SendPropertyChanged("Id");
+					OnIdChanged();
+				}
+			}
+		}
+		
+		partial void OnProblemClassIdChanging(long value);
+		partial void OnProblemClassIdChanged();
+		private long _ProblemClassId;
+		[Column(Storage=@"_ProblemClassId", DbType=@"BigInt NOT NULL", CanBeNull=false)]
+		[DataMember(Order=2)]
+		public long ProblemClassId
+		{
+			get { return _ProblemClassId; }
+			set {
+				if (_ProblemClassId != value) {
+					if (_ProblemClass.HasLoadedOrAssignedValue) {
+						throw new ForeignKeyReferenceAlreadyHasValueException();
+					}
+					OnProblemClassIdChanging(value);
+					SendPropertyChanging();
+					_ProblemClassId = value;
+					SendPropertyChanged("ProblemClassId");
+					OnProblemClassIdChanged();
+				}
+			}
+		}
+		
+		partial void OnPlatformIdChanging(long value);
+		partial void OnPlatformIdChanged();
+		private long _PlatformId;
+		[Column(Storage=@"_PlatformId", DbType=@"BigInt NOT NULL", CanBeNull=false)]
+		[DataMember(Order=3)]
+		public long PlatformId
+		{
+			get { return _PlatformId; }
+			set {
+				if (_PlatformId != value) {
+					if (_Platform.HasLoadedOrAssignedValue) {
+						throw new ForeignKeyReferenceAlreadyHasValueException();
+					}
+					OnPlatformIdChanging(value);
+					SendPropertyChanging();
+					_PlatformId = value;
+					SendPropertyChanged("PlatformId");
+					OnPlatformIdChanged();
+				}
+			}
+		}
+		
+		partial void OnSolutionRepresentationIdChanging(long value);
+		partial void OnSolutionRepresentationIdChanged();
+		private long _SolutionRepresentationid;
+		[Column(Storage=@"_SolutionRepresentationid", DbType=@"BigInt NOT NULL", CanBeNull=false)]
+		[DataMember(Order=4)]
+		public long SolutionRepresentationId
+		{
+			get { return _SolutionRepresentationid; }
+			set {
+				if (_SolutionRepresentationid != value) {
+					OnSolutionRepresentationIdChanging(value);
+					SendPropertyChanging();
+					_SolutionRepresentationid = value;
+					SendPropertyChanged("SolutionRepresentationId");
+					OnSolutionRepresentationIdChanged();
+				}
+			}
+		}
+		
+		partial void OnNameChanging(string value);
+		partial void OnNameChanged();
+		private string _Name;
+		[Column(Storage=@"_Name", DbType=@"NVarChar(200) NOT NULL", CanBeNull=false)]
+		[DataMember(Order=5)]
+		public string Name
+		{
+			get { return _Name; }
+			set {
+				if (_Name != value) {
+					OnNameChanging(value);
+					SendPropertyChanging();
+					_Name = value;
+					SendPropertyChanged("Name");
+					OnNameChanged();
+				}
+			}
+		}
+		
+		partial void OnDescriptionChanging(string value);
+		partial void OnDescriptionChanged();
+		private string _Description;
+		[Column(Storage=@"_Description", DbType=@"NVarChar(MAX)")]
+		[DataMember(Order=6)]
+		public string Description
+		{
+			get { return _Description; }
+			set {
+				if (_Description != value) {
+					OnDescriptionChanging(value);
+					SendPropertyChanging();
+					_Description = value;
+					SendPropertyChanged("Description");
+					OnDescriptionChanged();
+				}
+			}
+		}
+		
+		#endregion
+		
+		#region Associations
+		private EntitySet<Experiment> _Experiments;
+		[Association(Name=@"Problem_Experiment", Storage=@"_Experiments", ThisKey=@"Id", OtherKey=@"ProblemId")]
+		[DataMember(Order=7, EmitDefaultValue=false)]
+		public EntitySet<Experiment> Experiments
+		{
+			get {
+				if (serializing && !_Experiments.HasLoadedOrAssignedValues) {
+					return null;
+				}
+				return _Experiments;
+			}
+			set {
+				_Experiments.Assign(value);
+			}
+		}
+
+		private void attach_Experiments(Experiment entity)
+		{
+			SendPropertyChanging();
+			entity.Problem = this;
+		}
+		
+		private void detach_Experiments(Experiment entity)
+		{
+			SendPropertyChanging();
+			entity.Problem = null;
+		}
+		private EntitySet<ProblemParameter> _ProblemParameters;
+		[Association(Name=@"Problem_ProblemParameter", Storage=@"_ProblemParameters", ThisKey=@"Id", OtherKey=@"ProblemId")]
+		[DataMember(Order=8, EmitDefaultValue=false)]
+		public EntitySet<ProblemParameter> ProblemParameters
+		{
+			get {
+				if (serializing && !_ProblemParameters.HasLoadedOrAssignedValues) {
+					return null;
+				}
+				return _ProblemParameters;
+			}
+			set {
+				_ProblemParameters.Assign(value);
+			}
+		}
+
+		private void attach_ProblemParameters(ProblemParameter entity)
+		{
+			SendPropertyChanging();
+			entity.Problem = this;
+		}
+		
+		private void detach_ProblemParameters(ProblemParameter entity)
+		{
+			SendPropertyChanging();
+			entity.Problem = null;
+		}
+		private EntityRef<ProblemData> _ProblemData;
+		[Association(Name=@"Problem_ProblemData", Storage=@"_ProblemData", ThisKey=@"Id", OtherKey=@"ProblemId", IsUnique=true, IsForeignKey=false)]
+		[DataMember(Order=9, EmitDefaultValue=false)]
+		public ProblemData ProblemData
+		{
+			get {
+				if (serializing && !_ProblemData.HasLoadedOrAssignedValue) {
+					return null;
+				}
+				return _ProblemData.Entity;
+			}
+			set {
+				ProblemData previousValue = _ProblemData.Entity;
+				if ((previousValue != value) || (!_ProblemData.HasLoadedOrAssignedValue)) {
+					SendPropertyChanging();
+					if (previousValue != null) {
+						_ProblemData.Entity = null;
+						previousValue.Problem = null;
+					}
+					_ProblemData.Entity = value;
+					if (value != null) {
+						value.Problem = this;
+					}
+					SendPropertyChanged("ProblemData");
+				}
+			}
+		}
+
+		private EntitySet<ProblemUser> _ProblemUsers;
+		[Association(Name=@"Problem_ProblemUser", Storage=@"_ProblemUsers", ThisKey=@"Id", OtherKey=@"ProblemId")]
+		[DataMember(Order=10, EmitDefaultValue=false)]
+		public EntitySet<ProblemUser> ProblemUsers
+		{
+			get {
+				if (serializing && !_ProblemUsers.HasLoadedOrAssignedValues) {
+					return null;
+				}
+				return _ProblemUsers;
+			}
+			set {
+				_ProblemUsers.Assign(value);
+			}
+		}
+
+		private void attach_ProblemUsers(ProblemUser entity)
+		{
+			SendPropertyChanging();
+			entity.Problem = this;
+		}
+		
+		private void detach_ProblemUsers(ProblemUser entity)
+		{
+			SendPropertyChanging();
+			entity.Problem = null;
+		}
+		private EntityRef<ProblemClass> _ProblemClass;
+		[Association(Name=@"ProblemClass_Problem", Storage=@"_ProblemClass", ThisKey=@"ProblemClassId", OtherKey=@"Id", IsForeignKey=true)]
+		[DataMember(Order=11, EmitDefaultValue=false)]
+		public ProblemClass ProblemClass
+		{
+			get {
+				if (serializing && !_ProblemClass.HasLoadedOrAssignedValue) {
+					return null;
+				}
+				return _ProblemClass.Entity;
+			}
+			set {
+				ProblemClass previousValue = _ProblemClass.Entity;
+				if ((previousValue != value) || (!_ProblemClass.HasLoadedOrAssignedValue)) {
+					SendPropertyChanging();
+					if (previousValue != null) {
+						_ProblemClass.Entity = null;
+						previousValue.Problems.Remove(this);
+					}
+					_ProblemClass.Entity = value;
+					if (value != null) {
+						value.Problems.Add(this);
+						_ProblemClassId = value.Id;
+					}
+					else {
+						_ProblemClassId = default(long);
+					}
+					SendPropertyChanged("ProblemClass");
+				}
+			}
+		}
+
+		private EntityRef<Platform> _Platform;
+		[Association(Name=@"Platform_Problem", Storage=@"_Platform", ThisKey=@"PlatformId", OtherKey=@"Id", IsForeignKey=true)]
+		[DataMember(Order=12, EmitDefaultValue=false)]
+		public Platform Platform
+		{
+			get {
+				if (serializing && !_Platform.HasLoadedOrAssignedValue) {
+					return null;
+				}
+				return _Platform.Entity;
+			}
+			set {
+				Platform previousValue = _Platform.Entity;
+				if ((previousValue != value) || (!_Platform.HasLoadedOrAssignedValue)) {
+					SendPropertyChanging();
+					if (previousValue != null) {
+						_Platform.Entity = null;
+						previousValue.Problems.Remove(this);
+					}
+					_Platform.Entity = value;
+					if (value != null) {
+						value.Problems.Add(this);
+						_PlatformId = value.Id;
+					}
+					else {
+						_PlatformId = default(long);
+					}
+					SendPropertyChanged("Platform");
+				}
+			}
+		}
+
+		#endregion
+		
+		#region Serialization
+		private bool serializing;
+		
+		[OnSerializing()]
+		[EditorBrowsableAttribute(EditorBrowsableState.Never)]
+		public void OnSerializing(StreamingContext context)
+		{
+			serializing = true;
+		}
+		
+		[OnSerialized()]
+		[EditorBrowsableAttribute(EditorBrowsableState.Never)]
+		public void OnSerialized(StreamingContext context)
+		{
+			serializing = false;
+		}
+		
+		[OnDeserializing()]
+		[EditorBrowsableAttribute(EditorBrowsableState.Never)]
+		public  void OnDeserializing(StreamingContext context)
+		{
+			Initialize();
+		}
+		#endregion
+	}
+}
+
+namespace HeuristicLab.Services.OKB.DataAccess
+{	
+	[DataContract(IsReference=true)]
+	[Table(Name=@"dbo.ProblemClass")]
+[KnownType(typeof(ProblemClass))]	public partial class ProblemClass : INotifyPropertyChanging, INotifyPropertyChanged
+	{
+		#region Property Change Event Handling
+		private static PropertyChangingEventArgs emptyChangingEventArgs = new PropertyChangingEventArgs(String.Empty);
+		
+		public event PropertyChangingEventHandler PropertyChanging;
+		public event PropertyChangedEventHandler PropertyChanged;
+		
+		public virtual void SendPropertyChanging()
+		{
+			if (PropertyChanging != null) {
+				PropertyChanging(this, emptyChangingEventArgs);
+			}
+		}
+			
+		public virtual void SendPropertyChanged(String propertyName)
+		{
+			if (PropertyChanged != null) {
+				PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
+			}
+		}
+		#endregion
+		
+		#region Extensibility Method Definitions
+		partial void OnLoaded();
+		partial void OnValidate(ChangeAction action);
+		partial void OnCreated();
+		#endregion
+
+		#region Construction
+		public ProblemClass()
+		{
+			Initialize();
+		}
+		
+		private void Initialize()
+		{
+			_Problems = new EntitySet<Problem>(attach_Problems, detach_Problems);
+			OnCreated();
+		}
+		#endregion
+
+		#region Column Mappings
+		partial void OnIdChanging(long value);
+		partial void OnIdChanged();
+		private long _Id;
+		[Column(Storage=@"_Id", AutoSync=AutoSync.OnInsert, DbType=@"BigInt NOT NULL IDENTITY", IsPrimaryKey=true, IsDbGenerated=true, UpdateCheck=UpdateCheck.Never)]
+		[DataMember(Order=1)]
+		public long Id
+		{
+			get { return _Id; }
+			set {
+				if (_Id != value) {
+					OnIdChanging(value);
+					SendPropertyChanging();
+					_Id = value;
+					SendPropertyChanged("Id");
+					OnIdChanged();
+				}
+			}
+		}
+		
+		partial void OnNameChanging(string value);
+		partial void OnNameChanged();
+		private string _Name;
+		[Column(Storage=@"_Name", DbType=@"NVarChar(200) NOT NULL", CanBeNull=false)]
+		[DataMember(Order=2)]
+		public string Name
+		{
+			get { return _Name; }
+			set {
+				if (_Name != value) {
+					OnNameChanging(value);
+					SendPropertyChanging();
+					_Name = value;
+					SendPropertyChanged("Name");
+					OnNameChanged();
+				}
+			}
+		}
+		
+		partial void OnDescriptionChanging(string value);
+		partial void OnDescriptionChanged();
+		private string _Description;
+		[Column(Storage=@"_Description", DbType=@"NVarChar(MAX)")]
+		[DataMember(Order=3)]
+		public string Description
+		{
+			get { return _Description; }
+			set {
+				if (_Description != value) {
+					OnDescriptionChanging(value);
+					SendPropertyChanging();
+					_Description = value;
+					SendPropertyChanged("Description");
+					OnDescriptionChanged();
+				}
+			}
+		}
+		
+		#endregion
+		
+		#region Associations
+		private EntitySet<Problem> _Problems;
+		[Association(Name=@"ProblemClass_Problem", Storage=@"_Problems", ThisKey=@"Id", OtherKey=@"ProblemClassId")]
+		[DataMember(Order=4, EmitDefaultValue=false)]
+		public EntitySet<Problem> Problems
+		{
+			get {
+				if (serializing && !_Problems.HasLoadedOrAssignedValues) {
+					return null;
+				}
+				return _Problems;
+			}
+			set {
+				_Problems.Assign(value);
+			}
+		}
+
+		private void attach_Problems(Problem entity)
+		{
+			SendPropertyChanging();
+			entity.ProblemClass = this;
+		}
+		
+		private void detach_Problems(Problem entity)
+		{
+			SendPropertyChanging();
+			entity.ProblemClass = null;
+		}
+		#endregion
+		
+		#region Serialization
+		private bool serializing;
+		
+		[OnSerializing()]
+		[EditorBrowsableAttribute(EditorBrowsableState.Never)]
+		public void OnSerializing(StreamingContext context)
+		{
+			serializing = true;
+		}
+		
+		[OnSerialized()]
+		[EditorBrowsableAttribute(EditorBrowsableState.Never)]
+		public void OnSerialized(StreamingContext context)
+		{
+			serializing = false;
+		}
+		
+		[OnDeserializing()]
+		[EditorBrowsableAttribute(EditorBrowsableState.Never)]
+		public  void OnDeserializing(StreamingContext context)
+		{
+			Initialize();
+		}
+		#endregion
+	}
+}
+
+namespace HeuristicLab.Services.OKB.DataAccess
+{	
+	[DataContract(IsReference=true)]
+	[Table(Name=@"dbo.Experiment")]
+[KnownType(typeof(Experiment))]	public partial class Experiment : INotifyPropertyChanging, INotifyPropertyChanged
+	{
+		#region Property Change Event Handling
+		private static PropertyChangingEventArgs emptyChangingEventArgs = new PropertyChangingEventArgs(String.Empty);
+		
+		public event PropertyChangingEventHandler PropertyChanging;
+		public event PropertyChangedEventHandler PropertyChanged;
+		
+		public virtual void SendPropertyChanging()
+		{
+			if (PropertyChanging != null) {
+				PropertyChanging(this, emptyChangingEventArgs);
+			}
+		}
+			
+		public virtual void SendPropertyChanged(String propertyName)
+		{
+			if (PropertyChanged != null) {
+				PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
+			}
+		}
+		#endregion
+		
+		#region Extensibility Method Definitions
+		partial void OnLoaded();
+		partial void OnValidate(ChangeAction action);
+		partial void OnCreated();
+		#endregion
+
+		#region Construction
+		public Experiment()
+		{
+			Initialize();
+		}
+		
+		private void Initialize()
+		{
+			_Runs = new EntitySet<Run>(attach_Runs, detach_Runs);
+			_AlgorithmParameterBlobValues = new EntitySet<AlgorithmParameterBlobValue>(attach_AlgorithmParameterBlobValues, detach_AlgorithmParameterBlobValues);
+			_AlgorithmParameterBoolValues = new EntitySet<AlgorithmParameterBoolValue>(attach_AlgorithmParameterBoolValues, detach_AlgorithmParameterBoolValues);
+			_AlgorithmParameterFloatValues = new EntitySet<AlgorithmParameterFloatValue>(attach_AlgorithmParameterFloatValues, detach_AlgorithmParameterFloatValues);
+			_AlgorithmParameterIntValues = new EntitySet<AlgorithmParameterIntValue>(attach_AlgorithmParameterIntValues, detach_AlgorithmParameterIntValues);
+			_AlgorithmParameterStringValues = new EntitySet<AlgorithmParameterStringValue>(attach_AlgorithmParameterStringValues, detach_AlgorithmParameterStringValues);
+			_ProblemParameterBlobValues = new EntitySet<ProblemParameterBlobValue>(attach_ProblemParameterBlobValues, detach_ProblemParameterBlobValues);
+			_ProblemParameterBoolValues = new EntitySet<ProblemParameterBoolValue>(attach_ProblemParameterBoolValues, detach_ProblemParameterBoolValues);
+			_ProblemParameterFloatValues = new EntitySet<ProblemParameterFloatValue>(attach_ProblemParameterFloatValues, detach_ProblemParameterFloatValues);
+			_ProblemParameterIntValues = new EntitySet<ProblemParameterIntValue>(attach_ProblemParameterIntValues, detach_ProblemParameterIntValues);
+			_ProblemParameterStringValues = new EntitySet<ProblemParameterStringValue>(attach_ProblemParameterStringValues, detach_ProblemParameterStringValues);
+			_Problem = default(EntityRef<Problem>);
+			_Algorithm = default(EntityRef<Algorithm>);
+			OnCreated();
+		}
+		#endregion
+
+		#region Column Mappings
+		partial void OnIdChanging(long value);
+		partial void OnIdChanged();
+		private long _Id;
+		[Column(Storage=@"_Id", AutoSync=AutoSync.OnInsert, DbType=@"BigInt NOT NULL IDENTITY", IsPrimaryKey=true, IsDbGenerated=true, UpdateCheck=UpdateCheck.Never)]
+		[DataMember(Order=1)]
+		public long Id
+		{
+			get { return _Id; }
+			set {
+				if (_Id != value) {
+					OnIdChanging(value);
+					SendPropertyChanging();
+					_Id = value;
+					SendPropertyChanged("Id");
+					OnIdChanged();
+				}
+			}
+		}
+		
+		partial void OnAlgorithmIdChanging(long value);
+		partial void OnAlgorithmIdChanged();
+		private long _AlgorithmId;
+		[Column(Storage=@"_AlgorithmId", DbType=@"BigInt NOT NULL", CanBeNull=false)]
+		[DataMember(Order=2)]
+		public long AlgorithmId
+		{
+			get { return _AlgorithmId; }
+			set {
+				if (_AlgorithmId != value) {
+					if (_Algorithm.HasLoadedOrAssignedValue) {
+						throw new ForeignKeyReferenceAlreadyHasValueException();
+					}
+					OnAlgorithmIdChanging(value);
+					SendPropertyChanging();
+					_AlgorithmId = value;
+					SendPropertyChanged("AlgorithmId");
+					OnAlgorithmIdChanged();
+				}
+			}
+		}
+		
+		partial void OnProblemIdChanging(long value);
+		partial void OnProblemIdChanged();
+		private long _ProblemId;
+		[Column(Storage=@"_ProblemId", DbType=@"BigInt NOT NULL", CanBeNull=false)]
+		[DataMember(Order=3)]
+		public long ProblemId
+		{
+			get { return _ProblemId; }
+			set {
+				if (_ProblemId != value) {
+					if (_Problem.HasLoadedOrAssignedValue) {
+						throw new ForeignKeyReferenceAlreadyHasValueException();
+					}
+					OnProblemIdChanging(value);
+					SendPropertyChanging();
+					_ProblemId = value;
+					SendPropertyChanged("ProblemId");
+					OnProblemIdChanged();
+				}
+			}
+		}
+		
+		#endregion
+		
+		#region Associations
+		private EntitySet<Run> _Runs;
+		[Association(Name=@"Experiment_Run", Storage=@"_Runs", ThisKey=@"Id", OtherKey=@"ExperimentId")]
+		[DataMember(Order=4, EmitDefaultValue=false)]
+		public EntitySet<Run> Runs
+		{
+			get {
+				if (serializing && !_Runs.HasLoadedOrAssignedValues) {
+					return null;
+				}
+				return _Runs;
+			}
+			set {
+				_Runs.Assign(value);
+			}
+		}
+
+		private void attach_Runs(Run entity)
+		{
+			SendPropertyChanging();
+			entity.Experiment = this;
+		}
+		
+		private void detach_Runs(Run entity)
+		{
+			SendPropertyChanging();
+			entity.Experiment = null;
+		}
+		private EntitySet<AlgorithmParameterBlobValue> _AlgorithmParameterBlobValues;
+		[Association(Name=@"Experiment_AlgorithmParameterBlobValue", Storage=@"_AlgorithmParameterBlobValues", ThisKey=@"Id", OtherKey=@"ExperimentId")]
+		[DataMember(Order=5, EmitDefaultValue=false)]
+		public EntitySet<AlgorithmParameterBlobValue> AlgorithmParameterBlobValues
+		{
+			get {
+				if (serializing && !_AlgorithmParameterBlobValues.HasLoadedOrAssignedValues) {
+					return null;
+				}
+				return _AlgorithmParameterBlobValues;
+			}
+			set {
+				_AlgorithmParameterBlobValues.Assign(value);
+			}
+		}
+
+		private void attach_AlgorithmParameterBlobValues(AlgorithmParameterBlobValue entity)
+		{
+			SendPropertyChanging();
+			entity.Experiment = this;
+		}
+		
+		private void detach_AlgorithmParameterBlobValues(AlgorithmParameterBlobValue entity)
+		{
+			SendPropertyChanging();
+			entity.Experiment = null;
+		}
+		private EntitySet<AlgorithmParameterBoolValue> _AlgorithmParameterBoolValues;
+		[Association(Name=@"Experiment_AlgorithmParameterBoolValue", Storage=@"_AlgorithmParameterBoolValues", ThisKey=@"Id", OtherKey=@"ExperimentId")]
+		[DataMember(Order=6, EmitDefaultValue=false)]
+		public EntitySet<AlgorithmParameterBoolValue> AlgorithmParameterBoolValues
+		{
+			get {
+				if (serializing && !_AlgorithmParameterBoolValues.HasLoadedOrAssignedValues) {
+					return null;
+				}
+				return _AlgorithmParameterBoolValues;
+			}
+			set {
+				_AlgorithmParameterBoolValues.Assign(value);
+			}
+		}
+
+		private void attach_AlgorithmParameterBoolValues(AlgorithmParameterBoolValue entity)
+		{
+			SendPropertyChanging();
+			entity.Experiment = this;
+		}
+		
+		private void detach_AlgorithmParameterBoolValues(AlgorithmParameterBoolValue entity)
+		{
+			SendPropertyChanging();
+			entity.Experiment = null;
+		}
+		private EntitySet<AlgorithmParameterFloatValue> _AlgorithmParameterFloatValues;
+		[Association(Name=@"Experiment_AlgorithmParameterFloatValue", Storage=@"_AlgorithmParameterFloatValues", ThisKey=@"Id", OtherKey=@"ExperimentId")]
+		[DataMember(Order=7, EmitDefaultValue=false)]
+		public EntitySet<AlgorithmParameterFloatValue> AlgorithmParameterFloatValues
+		{
+			get {
+				if (serializing && !_AlgorithmParameterFloatValues.HasLoadedOrAssignedValues) {
+					return null;
+				}
+				return _AlgorithmParameterFloatValues;
+			}
+			set {
+				_AlgorithmParameterFloatValues.Assign(value);
+			}
+		}
+
+		private void attach_AlgorithmParameterFloatValues(AlgorithmParameterFloatValue entity)
+		{
+			SendPropertyChanging();
+			entity.Experiment = this;
+		}
+		
+		private void detach_AlgorithmParameterFloatValues(AlgorithmParameterFloatValue entity)
+		{
+			SendPropertyChanging();
+			entity.Experiment = null;
+		}
+		private EntitySet<AlgorithmParameterIntValue> _AlgorithmParameterIntValues;
+		[Association(Name=@"Experiment_AlgorithmParameterIntValue", Storage=@"_AlgorithmParameterIntValues", ThisKey=@"Id", OtherKey=@"ExperimentId")]
+		[DataMember(Order=8, EmitDefaultValue=false)]
+		public EntitySet<AlgorithmParameterIntValue> AlgorithmParameterIntValues
+		{
+			get {
+				if (serializing && !_AlgorithmParameterIntValues.HasLoadedOrAssignedValues) {
+					return null;
+				}
+				return _AlgorithmParameterIntValues;
+			}
+			set {
+				_AlgorithmParameterIntValues.Assign(value);
+			}
+		}
+
+		private void attach_AlgorithmParameterIntValues(AlgorithmParameterIntValue entity)
+		{
+			SendPropertyChanging();
+			entity.Experiment = this;
+		}
+		
+		private void detach_AlgorithmParameterIntValues(AlgorithmParameterIntValue entity)
+		{
+			SendPropertyChanging();
+			entity.Experiment = null;
+		}
+		private EntitySet<AlgorithmParameterStringValue> _AlgorithmParameterStringValues;
+		[Association(Name=@"Experiment_AlgorithmParameterStringValue", Storage=@"_AlgorithmParameterStringValues", ThisKey=@"Id", OtherKey=@"ExperimentId")]
+		[DataMember(Order=9, EmitDefaultValue=false)]
+		public EntitySet<AlgorithmParameterStringValue> AlgorithmParameterStringValues
+		{
+			get {
+				if (serializing && !_AlgorithmParameterStringValues.HasLoadedOrAssignedValues) {
+					return null;
+				}
+				return _AlgorithmParameterStringValues;
+			}
+			set {
+				_AlgorithmParameterStringValues.Assign(value);
+			}
+		}
+
+		private void attach_AlgorithmParameterStringValues(AlgorithmParameterStringValue entity)
+		{
+			SendPropertyChanging();
+			entity.Experiment = this;
+		}
+		
+		private void detach_AlgorithmParameterStringValues(AlgorithmParameterStringValue entity)
+		{
+			SendPropertyChanging();
+			entity.Experiment = null;
+		}
+		private EntitySet<ProblemParameterBlobValue> _ProblemParameterBlobValues;
+		[Association(Name=@"Experiment_ProblemParameterBlobValue", Storage=@"_ProblemParameterBlobValues", ThisKey=@"Id", OtherKey=@"ExperimentId")]
+		[DataMember(Order=10, EmitDefaultValue=false)]
+		public EntitySet<ProblemParameterBlobValue> ProblemParameterBlobValues
+		{
+			get {
+				if (serializing && !_ProblemParameterBlobValues.HasLoadedOrAssignedValues) {
+					return null;
+				}
+				return _ProblemParameterBlobValues;
+			}
+			set {
+				_ProblemParameterBlobValues.Assign(value);
+			}
+		}
+
+		private void attach_ProblemParameterBlobValues(ProblemParameterBlobValue entity)
+		{
+			SendPropertyChanging();
+			entity.Experiment = this;
+		}
+		
+		private void detach_ProblemParameterBlobValues(ProblemParameterBlobValue entity)
+		{
+			SendPropertyChanging();
+			entity.Experiment = null;
+		}
+		private EntitySet<ProblemParameterBoolValue> _ProblemParameterBoolValues;
+		[Association(Name=@"Experiment_ProblemParameterBoolValue", Storage=@"_ProblemParameterBoolValues", ThisKey=@"Id", OtherKey=@"ExperimentId")]
+		[DataMember(Order=11, EmitDefaultValue=false)]
+		public EntitySet<ProblemParameterBoolValue> ProblemParameterBoolValues
+		{
+			get {
+				if (serializing && !_ProblemParameterBoolValues.HasLoadedOrAssignedValues) {
+					return null;
+				}
+				return _ProblemParameterBoolValues;
+			}
+			set {
+				_ProblemParameterBoolValues.Assign(value);
+			}
+		}
+
+		private void attach_ProblemParameterBoolValues(ProblemParameterBoolValue entity)
+		{
+			SendPropertyChanging();
+			entity.Experiment = this;
+		}
+		
+		private void detach_ProblemParameterBoolValues(ProblemParameterBoolValue entity)
+		{
+			SendPropertyChanging();
+			entity.Experiment = null;
+		}
+		private EntitySet<ProblemParameterFloatValue> _ProblemParameterFloatValues;
+		[Association(Name=@"Experiment_ProblemParameterFloatValue", Storage=@"_ProblemParameterFloatValues", ThisKey=@"Id", OtherKey=@"ExperimentId")]
+		[DataMember(Order=12, EmitDefaultValue=false)]
+		public EntitySet<ProblemParameterFloatValue> ProblemParameterFloatValues
+		{
+			get {
+				if (serializing && !_ProblemParameterFloatValues.HasLoadedOrAssignedValues) {
+					return null;
+				}
+				return _ProblemParameterFloatValues;
+			}
+			set {
+				_ProblemParameterFloatValues.Assign(value);
+			}
+		}
+
+		private void attach_ProblemParameterFloatValues(ProblemParameterFloatValue entity)
+		{
+			SendPropertyChanging();
+			entity.Experiment = this;
+		}
+		
+		private void detach_ProblemParameterFloatValues(ProblemParameterFloatValue entity)
+		{
+			SendPropertyChanging();
+			entity.Experiment = null;
+		}
+		private EntitySet<ProblemParameterIntValue> _ProblemParameterIntValues;
+		[Association(Name=@"Experiment_ProblemParameterIntValue", Storage=@"_ProblemParameterIntValues", ThisKey=@"Id", OtherKey=@"ExperimentId")]
+		[DataMember(Order=13, EmitDefaultValue=false)]
+		public EntitySet<ProblemParameterIntValue> ProblemParameterIntValues
+		{
+			get {
+				if (serializing && !_ProblemParameterIntValues.HasLoadedOrAssignedValues) {
+					return null;
+				}
+				return _ProblemParameterIntValues;
+			}
+			set {
+				_ProblemParameterIntValues.Assign(value);
+			}
+		}
+
+		private void attach_ProblemParameterIntValues(ProblemParameterIntValue entity)
+		{
+			SendPropertyChanging();
+			entity.Experiment = this;
+		}
+		
+		private void detach_ProblemParameterIntValues(ProblemParameterIntValue entity)
+		{
+			SendPropertyChanging();
+			entity.Experiment = null;
+		}
+		private EntitySet<ProblemParameterStringValue> _ProblemParameterStringValues;
+		[Association(Name=@"Experiment_ProblemParameterStringValue", Storage=@"_ProblemParameterStringValues", ThisKey=@"Id", OtherKey=@"ExperimentId")]
+		[DataMember(Order=14, EmitDefaultValue=false)]
+		public EntitySet<ProblemParameterStringValue> ProblemParameterStringValues
+		{
+			get {
+				if (serializing && !_ProblemParameterStringValues.HasLoadedOrAssignedValues) {
+					return null;
+				}
+				return _ProblemParameterStringValues;
+			}
+			set {
+				_ProblemParameterStringValues.Assign(value);
+			}
+		}
+
+		private void attach_ProblemParameterStringValues(ProblemParameterStringValue entity)
+		{
+			SendPropertyChanging();
+			entity.Experiment = this;
+		}
+		
+		private void detach_ProblemParameterStringValues(ProblemParameterStringValue entity)
+		{
+			SendPropertyChanging();
+			entity.Experiment = null;
+		}
+		private EntityRef<Problem> _Problem;
+		[Association(Name=@"Problem_Experiment", Storage=@"_Problem", ThisKey=@"ProblemId", OtherKey=@"Id", IsForeignKey=true)]
+		[DataMember(Order=15, EmitDefaultValue=false)]
+		public Problem Problem
+		{
+			get {
+				if (serializing && !_Problem.HasLoadedOrAssignedValue) {
+					return null;
+				}
+				return _Problem.Entity;
+			}
+			set {
+				Problem previousValue = _Problem.Entity;
+				if ((previousValue != value) || (!_Problem.HasLoadedOrAssignedValue)) {
+					SendPropertyChanging();
+					if (previousValue != null) {
+						_Problem.Entity = null;
+						previousValue.Experiments.Remove(this);
+					}
+					_Problem.Entity = value;
+					if (value != null) {
+						value.Experiments.Add(this);
+						_ProblemId = value.Id;
+					}
+					else {
+						_ProblemId = default(long);
+					}
+					SendPropertyChanged("Problem");
+				}
+			}
+		}
+
+		private EntityRef<Algorithm> _Algorithm;
+		[Association(Name=@"Algorithm_Experiment", Storage=@"_Algorithm", ThisKey=@"AlgorithmId", OtherKey=@"Id", IsForeignKey=true)]
+		[DataMember(Order=16, EmitDefaultValue=false)]
+		public Algorithm Algorithm
+		{
+			get {
+				if (serializing && !_Algorithm.HasLoadedOrAssignedValue) {
+					return null;
+				}
+				return _Algorithm.Entity;
+			}
+			set {
+				Algorithm previousValue = _Algorithm.Entity;
+				if ((previousValue != value) || (!_Algorithm.HasLoadedOrAssignedValue)) {
+					SendPropertyChanging();
+					if (previousValue != null) {
+						_Algorithm.Entity = null;
+						previousValue.Experiments.Remove(this);
+					}
+					_Algorithm.Entity = value;
+					if (value != null) {
+						value.Experiments.Add(this);
+						_AlgorithmId = value.Id;
+					}
+					else {
+						_AlgorithmId = default(long);
+					}
+					SendPropertyChanged("Algorithm");
+				}
+			}
+		}
+
+		#endregion
+		
+		#region Serialization
+		private bool serializing;
+		
+		[OnSerializing()]
+		[EditorBrowsableAttribute(EditorBrowsableState.Never)]
+		public void OnSerializing(StreamingContext context)
+		{
+			serializing = true;
+		}
+		
+		[OnSerialized()]
+		[EditorBrowsableAttribute(EditorBrowsableState.Never)]
+		public void OnSerialized(StreamingContext context)
+		{
+			serializing = false;
+		}
+		
+		[OnDeserializing()]
+		[EditorBrowsableAttribute(EditorBrowsableState.Never)]
+		public  void OnDeserializing(StreamingContext context)
+		{
+			Initialize();
+		}
+		#endregion
+	}
+}
+
+namespace HeuristicLab.Services.OKB.DataAccess
+{	
+	[DataContract(IsReference=true)]
+	[Table(Name=@"dbo.AlgorithmParameter")]
+[KnownType(typeof(AlgorithmParameter))]	public partial class AlgorithmParameter : INotifyPropertyChanging, INotifyPropertyChanged
+	{
+		#region Property Change Event Handling
+		private static PropertyChangingEventArgs emptyChangingEventArgs = new PropertyChangingEventArgs(String.Empty);
+		
+		public event PropertyChangingEventHandler PropertyChanging;
+		public event PropertyChangedEventHandler PropertyChanged;
+		
+		public virtual void SendPropertyChanging()
+		{
+			if (PropertyChanging != null) {
+				PropertyChanging(this, emptyChangingEventArgs);
+			}
+		}
+			
+		public virtual void SendPropertyChanged(String propertyName)
+		{
+			if (PropertyChanged != null) {
+				PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
+			}
+		}
+		#endregion
+		
+		#region Extensibility Method Definitions
+		partial void OnLoaded();
+		partial void OnValidate(ChangeAction action);
+		partial void OnCreated();
+		#endregion
+
+		#region Construction
+		public AlgorithmParameter()
+		{
+			Initialize();
+		}
+		
+		private void Initialize()
+		{
+			_AlgorithmParameterBlobValues = new EntitySet<AlgorithmParameterBlobValue>(attach_AlgorithmParameterBlobValues, detach_AlgorithmParameterBlobValues);
+			_AlgorithmParameterBoolValues = new EntitySet<AlgorithmParameterBoolValue>(attach_AlgorithmParameterBoolValues, detach_AlgorithmParameterBoolValues);
+			_AlgorithmParameterFloatValues = new EntitySet<AlgorithmParameterFloatValue>(attach_AlgorithmParameterFloatValues, detach_AlgorithmParameterFloatValues);
+			_AlgorithmParameterIntValues = new EntitySet<AlgorithmParameterIntValue>(attach_AlgorithmParameterIntValues, detach_AlgorithmParameterIntValues);
+			_AlgorithmParameterStringValues = new EntitySet<AlgorithmParameterStringValue>(attach_AlgorithmParameterStringValues, detach_AlgorithmParameterStringValues);
+			_Algorithm = default(EntityRef<Algorithm>);
+			_DataType = default(EntityRef<DataType>);
+			OnCreated();
+		}
+		#endregion
+
+		#region Column Mappings
+		partial void OnIdChanging(long value);
+		partial void OnIdChanged();
+		private long _Id;
+		[Column(Storage=@"_Id", AutoSync=AutoSync.OnInsert, DbType=@"BigInt NOT NULL IDENTITY", IsPrimaryKey=true, IsDbGenerated=true, UpdateCheck=UpdateCheck.Never)]
+		[DataMember(Order=1)]
+		public long Id
+		{
+			get { return _Id; }
+			set {
+				if (_Id != value) {
+					OnIdChanging(value);
+					SendPropertyChanging();
+					_Id = value;
+					SendPropertyChanged("Id");
+					OnIdChanged();
+				}
+			}
+		}
+		
+		partial void OnAlgorithmIdChanging(long value);
+		partial void OnAlgorithmIdChanged();
+		private long _AlgorithmId;
+		[Column(Storage=@"_AlgorithmId", DbType=@"BigInt NOT NULL", CanBeNull=false)]
+		[DataMember(Order=2)]
+		public long AlgorithmId
+		{
+			get { return _AlgorithmId; }
+			set {
+				if (_AlgorithmId != value) {
+					if (_Algorithm.HasLoadedOrAssignedValue) {
+						throw new ForeignKeyReferenceAlreadyHasValueException();
+					}
+					OnAlgorithmIdChanging(value);
+					SendPropertyChanging();
+					_AlgorithmId = value;
+					SendPropertyChanged("AlgorithmId");
+					OnAlgorithmIdChanged();
+				}
+			}
+		}
+		
+		partial void OnNameChanging(string value);
+		partial void OnNameChanged();
+		private string _Name;
+		[Column(Storage=@"_Name", DbType=@"NVarChar(200) NOT NULL", CanBeNull=false)]
+		[DataMember(Order=3)]
+		public string Name
+		{
+			get { return _Name; }
+			set {
+				if (_Name != value) {
+					OnNameChanging(value);
+					SendPropertyChanging();
+					_Name = value;
+					SendPropertyChanged("Name");
+					OnNameChanged();
+				}
+			}
+		}
+		
+		partial void OnAliasChanging(string value);
+		partial void OnAliasChanged();
+		private string _Alias;
+		[Column(Storage=@"_Alias", DbType=@"NVarChar(200)")]
+		[DataMember(Order=4)]
+		public string Alias
+		{
+			get { return _Alias; }
+			set {
+				if (_Alias != value) {
+					OnAliasChanging(value);
+					SendPropertyChanging();
+					_Alias = value;
+					SendPropertyChanged("Alias");
+					OnAliasChanged();
+				}
+			}
+		}
+		
+		partial void OnDescriptionChanging(string value);
+		partial void OnDescriptionChanged();
+		private string _Description;
+		[Column(Storage=@"_Description", DbType=@"NVarChar(MAX)")]
+		[DataMember(Order=5)]
+		public string Description
+		{
+			get { return _Description; }
+			set {
+				if (_Description != value) {
+					OnDescriptionChanging(value);
+					SendPropertyChanging();
+					_Description = value;
+					SendPropertyChanged("Description");
+					OnDescriptionChanged();
+				}
+			}
+		}
+		
+		partial void OnDataTypeIdChanging(long value);
+		partial void OnDataTypeIdChanged();
+		private long _DataTypeId;
+		[Column(Storage=@"_DataTypeId", DbType=@"BigInt NOT NULL", CanBeNull=false)]
+		[DataMember(Order=6)]
+		public long DataTypeId
+		{
+			get { return _DataTypeId; }
+			set {
+				if (_DataTypeId != value) {
+					if (_DataType.HasLoadedOrAssignedValue) {
+						throw new ForeignKeyReferenceAlreadyHasValueException();
+					}
+					OnDataTypeIdChanging(value);
+					SendPropertyChanging();
+					_DataTypeId = value;
+					SendPropertyChanged("DataTypeId");
+					OnDataTypeIdChanged();
+				}
+			}
+		}
+		
+		#endregion
+		
+		#region Associations
+		private EntitySet<AlgorithmParameterBlobValue> _AlgorithmParameterBlobValues;
+		[Association(Name=@"AlgorithmParameter_AlgorithmParameterBlobValue", Storage=@"_AlgorithmParameterBlobValues", ThisKey=@"Id", OtherKey=@"AlgorithmParameterId")]
+		[DataMember(Order=7, EmitDefaultValue=false)]
+		public EntitySet<AlgorithmParameterBlobValue> AlgorithmParameterBlobValues
+		{
+			get {
+				if (serializing && !_AlgorithmParameterBlobValues.HasLoadedOrAssignedValues) {
+					return null;
+				}
+				return _AlgorithmParameterBlobValues;
+			}
+			set {
+				_AlgorithmParameterBlobValues.Assign(value);
+			}
+		}
+
+		private void attach_AlgorithmParameterBlobValues(AlgorithmParameterBlobValue entity)
+		{
+			SendPropertyChanging();
+			entity.AlgorithmParameter = this;
+		}
+		
+		private void detach_AlgorithmParameterBlobValues(AlgorithmParameterBlobValue entity)
+		{
+			SendPropertyChanging();
+			entity.AlgorithmParameter = null;
+		}
+		private EntitySet<AlgorithmParameterBoolValue> _AlgorithmParameterBoolValues;
+		[Association(Name=@"AlgorithmParameter_AlgorithmParameterBoolValue", Storage=@"_AlgorithmParameterBoolValues", ThisKey=@"Id", OtherKey=@"AlgorithmParameterId")]
+		[DataMember(Order=8, EmitDefaultValue=false)]
+		public EntitySet<AlgorithmParameterBoolValue> AlgorithmParameterBoolValues
+		{
+			get {
+				if (serializing && !_AlgorithmParameterBoolValues.HasLoadedOrAssignedValues) {
+					return null;
+				}
+				return _AlgorithmParameterBoolValues;
+			}
+			set {
+				_AlgorithmParameterBoolValues.Assign(value);
+			}
+		}
+
+		private void attach_AlgorithmParameterBoolValues(AlgorithmParameterBoolValue entity)
+		{
+			SendPropertyChanging();
+			entity.AlgorithmParameter = this;
+		}
+		
+		private void detach_AlgorithmParameterBoolValues(AlgorithmParameterBoolValue entity)
+		{
+			SendPropertyChanging();
+			entity.AlgorithmParameter = null;
+		}
+		private EntitySet<AlgorithmParameterFloatValue> _AlgorithmParameterFloatValues;
+		[Association(Name=@"AlgorithmParameter_AlgorithmParameterFloatValue", Storage=@"_AlgorithmParameterFloatValues", ThisKey=@"Id", OtherKey=@"AlgorithmParameterId")]
+		[DataMember(Order=9, EmitDefaultValue=false)]
+		public EntitySet<AlgorithmParameterFloatValue> AlgorithmParameterFloatValues
+		{
+			get {
+				if (serializing && !_AlgorithmParameterFloatValues.HasLoadedOrAssignedValues) {
+					return null;
+				}
+				return _AlgorithmParameterFloatValues;
+			}
+			set {
+				_AlgorithmParameterFloatValues.Assign(value);
+			}
+		}
+
+		private void attach_AlgorithmParameterFloatValues(AlgorithmParameterFloatValue entity)
+		{
+			SendPropertyChanging();
+			entity.AlgorithmParameter = this;
+		}
+		
+		private void detach_AlgorithmParameterFloatValues(AlgorithmParameterFloatValue entity)
+		{
+			SendPropertyChanging();
+			entity.AlgorithmParameter = null;
+		}
+		private EntitySet<AlgorithmParameterIntValue> _AlgorithmParameterIntValues;
+		[Association(Name=@"AlgorithmParameter_AlgorithmParameterIntValue", Storage=@"_AlgorithmParameterIntValues", ThisKey=@"Id", OtherKey=@"AlgorithmParameterId")]
+		[DataMember(Order=10, EmitDefaultValue=false)]
+		public EntitySet<AlgorithmParameterIntValue> AlgorithmParameterIntValues
+		{
+			get {
+				if (serializing && !_AlgorithmParameterIntValues.HasLoadedOrAssignedValues) {
+					return null;
+				}
+				return _AlgorithmParameterIntValues;
+			}
+			set {
+				_AlgorithmParameterIntValues.Assign(value);
+			}
+		}
+
+		private void attach_AlgorithmParameterIntValues(AlgorithmParameterIntValue entity)
+		{
+			SendPropertyChanging();
+			entity.AlgorithmParameter = this;
+		}
+		
+		private void detach_AlgorithmParameterIntValues(AlgorithmParameterIntValue entity)
+		{
+			SendPropertyChanging();
+			entity.AlgorithmParameter = null;
+		}
+		private EntitySet<AlgorithmParameterStringValue> _AlgorithmParameterStringValues;
+		[Association(Name=@"AlgorithmParameter_AlgorithmParameterStringValue", Storage=@"_AlgorithmParameterStringValues", ThisKey=@"Id", OtherKey=@"AlgorithmParameterId")]
+		[DataMember(Order=11, EmitDefaultValue=false)]
+		public EntitySet<AlgorithmParameterStringValue> AlgorithmParameterStringValues
+		{
+			get {
+				if (serializing && !_AlgorithmParameterStringValues.HasLoadedOrAssignedValues) {
+					return null;
+				}
+				return _AlgorithmParameterStringValues;
+			}
+			set {
+				_AlgorithmParameterStringValues.Assign(value);
+			}
+		}
+
+		private void attach_AlgorithmParameterStringValues(AlgorithmParameterStringValue entity)
+		{
+			SendPropertyChanging();
+			entity.AlgorithmParameter = this;
+		}
+		
+		private void detach_AlgorithmParameterStringValues(AlgorithmParameterStringValue entity)
+		{
+			SendPropertyChanging();
+			entity.AlgorithmParameter = null;
+		}
+		private EntityRef<Algorithm> _Algorithm;
+		[Association(Name=@"Algorithm_AlgorithmParameter", Storage=@"_Algorithm", ThisKey=@"AlgorithmId", OtherKey=@"Id", IsForeignKey=true)]
+		[DataMember(Order=12, EmitDefaultValue=false)]
+		public Algorithm Algorithm
+		{
+			get {
+				if (serializing && !_Algorithm.HasLoadedOrAssignedValue) {
+					return null;
+				}
+				return _Algorithm.Entity;
+			}
+			set {
+				Algorithm previousValue = _Algorithm.Entity;
+				if ((previousValue != value) || (!_Algorithm.HasLoadedOrAssignedValue)) {
+					SendPropertyChanging();
+					if (previousValue != null) {
+						_Algorithm.Entity = null;
+						previousValue.AlgorithmParameters.Remove(this);
+					}
+					_Algorithm.Entity = value;
+					if (value != null) {
+						value.AlgorithmParameters.Add(this);
+						_AlgorithmId = value.Id;
+					}
+					else {
+						_AlgorithmId = default(long);
+					}
+					SendPropertyChanged("Algorithm");
+				}
+			}
+		}
+
+		private EntityRef<DataType> _DataType;
+		[Association(Name=@"DataType_AlgorithmParameter", Storage=@"_DataType", ThisKey=@"DataTypeId", OtherKey=@"Id", IsForeignKey=true)]
+		[DataMember(Order=13, EmitDefaultValue=false)]
+		public DataType DataType
+		{
+			get {
+				if (serializing && !_DataType.HasLoadedOrAssignedValue) {
+					return null;
+				}
+				return _DataType.Entity;
+			}
+			set {
+				DataType previousValue = _DataType.Entity;
+				if ((previousValue != value) || (!_DataType.HasLoadedOrAssignedValue)) {
+					SendPropertyChanging();
+					if (previousValue != null) {
+						_DataType.Entity = null;
+						previousValue.AlgorithmParameters.Remove(this);
+					}
+					_DataType.Entity = value;
+					if (value != null) {
+						value.AlgorithmParameters.Add(this);
+						_DataTypeId = value.Id;
+					}
+					else {
+						_DataTypeId = default(long);
+					}
+					SendPropertyChanged("DataType");
+				}
+			}
+		}
+
+		#endregion
+		
+		#region Serialization
+		private bool serializing;
+		
+		[OnSerializing()]
+		[EditorBrowsableAttribute(EditorBrowsableState.Never)]
+		public void OnSerializing(StreamingContext context)
+		{
+			serializing = true;
+		}
+		
+		[OnSerialized()]
+		[EditorBrowsableAttribute(EditorBrowsableState.Never)]
+		public void OnSerialized(StreamingContext context)
+		{
+			serializing = false;
+		}
+		
+		[OnDeserializing()]
+		[EditorBrowsableAttribute(EditorBrowsableState.Never)]
+		public  void OnDeserializing(StreamingContext context)
+		{
+			Initialize();
+		}
+		#endregion
+	}
+}
+
+namespace HeuristicLab.Services.OKB.DataAccess
+{	
+	[DataContract(IsReference=true)]
+	[Table(Name=@"dbo.ProblemParameter")]
+[KnownType(typeof(ProblemParameter))]	public partial class ProblemParameter : INotifyPropertyChanging, INotifyPropertyChanged
+	{
+		#region Property Change Event Handling
+		private static PropertyChangingEventArgs emptyChangingEventArgs = new PropertyChangingEventArgs(String.Empty);
+		
+		public event PropertyChangingEventHandler PropertyChanging;
+		public event PropertyChangedEventHandler PropertyChanged;
+		
+		public virtual void SendPropertyChanging()
+		{
+			if (PropertyChanging != null) {
+				PropertyChanging(this, emptyChangingEventArgs);
+			}
+		}
+			
+		public virtual void SendPropertyChanged(String propertyName)
+		{
+			if (PropertyChanged != null) {
+				PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
+			}
+		}
+		#endregion
+		
+		#region Extensibility Method Definitions
+		partial void OnLoaded();
+		partial void OnValidate(ChangeAction action);
+		partial void OnCreated();
+		#endregion
+
+		#region Construction
+		public ProblemParameter()
+		{
+			Initialize();
+		}
+		
+		private void Initialize()
+		{
+			_ProblemParameterBlobValues = new EntitySet<ProblemParameterBlobValue>(attach_ProblemParameterBlobValues, detach_ProblemParameterBlobValues);
+			_ProblemParameterBoolValues = new EntitySet<ProblemParameterBoolValue>(attach_ProblemParameterBoolValues, detach_ProblemParameterBoolValues);
+			_ProblemParameterFloatValues = new EntitySet<ProblemParameterFloatValue>(attach_ProblemParameterFloatValues, detach_ProblemParameterFloatValues);
+			_ProblemParameterIntValues = new EntitySet<ProblemParameterIntValue>(attach_ProblemParameterIntValues, detach_ProblemParameterIntValues);
+			_ProblemParameterStringValues = new EntitySet<ProblemParameterStringValue>(attach_ProblemParameterStringValues, detach_ProblemParameterStringValues);
+			_Problem = default(EntityRef<Problem>);
+			_DataType = default(EntityRef<DataType>);
+			OnCreated();
+		}
+		#endregion
+
+		#region Column Mappings
+		partial void OnIdChanging(long value);
+		partial void OnIdChanged();
+		private long _Id;
+		[Column(Storage=@"_Id", AutoSync=AutoSync.OnInsert, DbType=@"BigInt NOT NULL IDENTITY", IsPrimaryKey=true, IsDbGenerated=true, UpdateCheck=UpdateCheck.Never)]
+		[DataMember(Order=1)]
+		public long Id
+		{
+			get { return _Id; }
+			set {
+				if (_Id != value) {
+					OnIdChanging(value);
+					SendPropertyChanging();
+					_Id = value;
+					SendPropertyChanged("Id");
+					OnIdChanged();
+				}
+			}
+		}
+		
+		partial void OnProblemIdChanging(long value);
+		partial void OnProblemIdChanged();
+		private long _ProblemId;
+		[Column(Storage=@"_ProblemId", DbType=@"BigInt NOT NULL", CanBeNull=false)]
+		[DataMember(Order=2)]
+		public long ProblemId
+		{
+			get { return _ProblemId; }
+			set {
+				if (_ProblemId != value) {
+					if (_Problem.HasLoadedOrAssignedValue) {
+						throw new ForeignKeyReferenceAlreadyHasValueException();
+					}
+					OnProblemIdChanging(value);
+					SendPropertyChanging();
+					_ProblemId = value;
+					SendPropertyChanged("ProblemId");
+					OnProblemIdChanged();
+				}
+			}
+		}
+		
+		partial void OnNameChanging(string value);
+		partial void OnNameChanged();
+		private string _Name;
+		[Column(Storage=@"_Name", DbType=@"NVarChar(200) NOT NULL", CanBeNull=false)]
+		[DataMember(Order=3)]
+		public string Name
+		{
+			get { return _Name; }
+			set {
+				if (_Name != value) {
+					OnNameChanging(value);
+					SendPropertyChanging();
+					_Name = value;
+					SendPropertyChanged("Name");
+					OnNameChanged();
+				}
+			}
+		}
+		
+		partial void OnAliasChanging(string value);
+		partial void OnAliasChanged();
+		private string _Alias;
+		[Column(Storage=@"_Alias", DbType=@"NVarChar(200)")]
+		[DataMember(Order=4)]
+		public string Alias
+		{
+			get { return _Alias; }
+			set {
+				if (_Alias != value) {
+					OnAliasChanging(value);
+					SendPropertyChanging();
+					_Alias = value;
+					SendPropertyChanged("Alias");
+					OnAliasChanged();
+				}
+			}
+		}
+		
+		partial void OnDescriptionChanging(string value);
+		partial void OnDescriptionChanged();
+		private string _Description;
+		[Column(Storage=@"_Description", DbType=@"NVarChar(MAX)")]
+		[DataMember(Order=5)]
+		public string Description
+		{
+			get { return _Description; }
+			set {
+				if (_Description != value) {
+					OnDescriptionChanging(value);
+					SendPropertyChanging();
+					_Description = value;
+					SendPropertyChanged("Description");
+					OnDescriptionChanged();
+				}
+			}
+		}
+		
+		partial void OnDataTypeIdChanging(long value);
+		partial void OnDataTypeIdChanged();
+		private long _DataTypeId;
+		[Column(Storage=@"_DataTypeId", DbType=@"BigInt NOT NULL", CanBeNull=false)]
+		[DataMember(Order=6)]
+		public long DataTypeId
+		{
+			get { return _DataTypeId; }
+			set {
+				if (_DataTypeId != value) {
+					if (_DataType.HasLoadedOrAssignedValue) {
+						throw new ForeignKeyReferenceAlreadyHasValueException();
+					}
+					OnDataTypeIdChanging(value);
+					SendPropertyChanging();
+					_DataTypeId = value;
+					SendPropertyChanged("DataTypeId");
+					OnDataTypeIdChanged();
+				}
+			}
+		}
+		
+		#endregion
+		
+		#region Associations
+		private EntitySet<ProblemParameterBlobValue> _ProblemParameterBlobValues;
+		[Association(Name=@"ProblemParameter_ProblemParameterBlobValue", Storage=@"_ProblemParameterBlobValues", ThisKey=@"Id", OtherKey=@"ProblemParameterId")]
+		[DataMember(Order=7, EmitDefaultValue=false)]
+		public EntitySet<ProblemParameterBlobValue> ProblemParameterBlobValues
+		{
+			get {
+				if (serializing && !_ProblemParameterBlobValues.HasLoadedOrAssignedValues) {
+					return null;
+				}
+				return _ProblemParameterBlobValues;
+			}
+			set {
+				_ProblemParameterBlobValues.Assign(value);
+			}
+		}
+
+		private void attach_ProblemParameterBlobValues(ProblemParameterBlobValue entity)
+		{
+			SendPropertyChanging();
+			entity.ProblemParameter = this;
+		}
+		
+		private void detach_ProblemParameterBlobValues(ProblemParameterBlobValue entity)
+		{
+			SendPropertyChanging();
+			entity.ProblemParameter = null;
+		}
+		private EntitySet<ProblemParameterBoolValue> _ProblemParameterBoolValues;
+		[Association(Name=@"ProblemParameter_ProblemParameterBoolValue", Storage=@"_ProblemParameterBoolValues", ThisKey=@"Id", OtherKey=@"ProblemParameterId")]
+		[DataMember(Order=8, EmitDefaultValue=false)]
+		public EntitySet<ProblemParameterBoolValue> ProblemParameterBoolValues
+		{
+			get {
+				if (serializing && !_ProblemParameterBoolValues.HasLoadedOrAssignedValues) {
+					return null;
+				}
+				return _ProblemParameterBoolValues;
+			}
+			set {
+				_ProblemParameterBoolValues.Assign(value);
+			}
+		}
+
+		private void attach_ProblemParameterBoolValues(ProblemParameterBoolValue entity)
+		{
+			SendPropertyChanging();
+			entity.ProblemParameter = this;
+		}
+		
+		private void detach_ProblemParameterBoolValues(ProblemParameterBoolValue entity)
+		{
+			SendPropertyChanging();
+			entity.ProblemParameter = null;
+		}
+		private EntitySet<ProblemParameterFloatValue> _ProblemParameterFloatValues;
+		[Association(Name=@"ProblemParameter_ProblemParameterFloatValue", Storage=@"_ProblemParameterFloatValues", ThisKey=@"Id", OtherKey=@"ProblemParameterId")]
+		[DataMember(Order=9, EmitDefaultValue=false)]
+		public EntitySet<ProblemParameterFloatValue> ProblemParameterFloatValues
+		{
+			get {
+				if (serializing && !_ProblemParameterFloatValues.HasLoadedOrAssignedValues) {
+					return null;
+				}
+				return _ProblemParameterFloatValues;
+			}
+			set {
+				_ProblemParameterFloatValues.Assign(value);
+			}
+		}
+
+		private void attach_ProblemParameterFloatValues(ProblemParameterFloatValue entity)
+		{
+			SendPropertyChanging();
+			entity.ProblemParameter = this;
+		}
+		
+		private void detach_ProblemParameterFloatValues(ProblemParameterFloatValue entity)
+		{
+			SendPropertyChanging();
+			entity.ProblemParameter = null;
+		}
+		private EntitySet<ProblemParameterIntValue> _ProblemParameterIntValues;
+		[Association(Name=@"ProblemParameter_ProblemParameterIntValue", Storage=@"_ProblemParameterIntValues", ThisKey=@"Id", OtherKey=@"ProblemParameterId")]
+		[DataMember(Order=10, EmitDefaultValue=false)]
+		public EntitySet<ProblemParameterIntValue> ProblemParameterIntValues
+		{
+			get {
+				if (serializing && !_ProblemParameterIntValues.HasLoadedOrAssignedValues) {
+					return null;
+				}
+				return _ProblemParameterIntValues;
+			}
+			set {
+				_ProblemParameterIntValues.Assign(value);
+			}
+		}
+
+		private void attach_ProblemParameterIntValues(ProblemParameterIntValue entity)
+		{
+			SendPropertyChanging();
+			entity.ProblemParameter = this;
+		}
+		
+		private void detach_ProblemParameterIntValues(ProblemParameterIntValue entity)
+		{
+			SendPropertyChanging();
+			entity.ProblemParameter = null;
+		}
+		private EntitySet<ProblemParameterStringValue> _ProblemParameterStringValues;
+		[Association(Name=@"ProblemParameter_ProblemParameterStringValue", Storage=@"_ProblemParameterStringValues", ThisKey=@"Id", OtherKey=@"ProblemParameterId")]
+		[DataMember(Order=11, EmitDefaultValue=false)]
+		public EntitySet<ProblemParameterStringValue> ProblemParameterStringValues
+		{
+			get {
+				if (serializing && !_ProblemParameterStringValues.HasLoadedOrAssignedValues) {
+					return null;
+				}
+				return _ProblemParameterStringValues;
+			}
+			set {
+				_ProblemParameterStringValues.Assign(value);
+			}
+		}
+
+		private void attach_ProblemParameterStringValues(ProblemParameterStringValue entity)
+		{
+			SendPropertyChanging();
+			entity.ProblemParameter = this;
+		}
+		
+		private void detach_ProblemParameterStringValues(ProblemParameterStringValue entity)
+		{
+			SendPropertyChanging();
+			entity.ProblemParameter = null;
+		}
+		private EntityRef<Problem> _Problem;
+		[Association(Name=@"Problem_ProblemParameter", Storage=@"_Problem", ThisKey=@"ProblemId", OtherKey=@"Id", IsForeignKey=true)]
+		[DataMember(Order=12, EmitDefaultValue=false)]
+		public Problem Problem
+		{
+			get {
+				if (serializing && !_Problem.HasLoadedOrAssignedValue) {
+					return null;
+				}
+				return _Problem.Entity;
+			}
+			set {
+				Problem previousValue = _Problem.Entity;
+				if ((previousValue != value) || (!_Problem.HasLoadedOrAssignedValue)) {
+					SendPropertyChanging();
+					if (previousValue != null) {
+						_Problem.Entity = null;
+						previousValue.ProblemParameters.Remove(this);
+					}
+					_Problem.Entity = value;
+					if (value != null) {
+						value.ProblemParameters.Add(this);
+						_ProblemId = value.Id;
+					}
+					else {
+						_ProblemId = default(long);
+					}
+					SendPropertyChanged("Problem");
+				}
+			}
+		}
+
+		private EntityRef<DataType> _DataType;
+		[Association(Name=@"DataType_ProblemParameter", Storage=@"_DataType", ThisKey=@"DataTypeId", OtherKey=@"Id", IsForeignKey=true)]
+		[DataMember(Order=13, EmitDefaultValue=false)]
+		public DataType DataType
+		{
+			get {
+				if (serializing && !_DataType.HasLoadedOrAssignedValue) {
+					return null;
+				}
+				return _DataType.Entity;
+			}
+			set {
+				DataType previousValue = _DataType.Entity;
+				if ((previousValue != value) || (!_DataType.HasLoadedOrAssignedValue)) {
+					SendPropertyChanging();
+					if (previousValue != null) {
+						_DataType.Entity = null;
+						previousValue.ProblemParameters.Remove(this);
+					}
+					_DataType.Entity = value;
+					if (value != null) {
+						value.ProblemParameters.Add(this);
+						_DataTypeId = value.Id;
+					}
+					else {
+						_DataTypeId = default(long);
+					}
+					SendPropertyChanged("DataType");
+				}
+			}
+		}
+
+		#endregion
+		
+		#region Serialization
+		private bool serializing;
+		
+		[OnSerializing()]
+		[EditorBrowsableAttribute(EditorBrowsableState.Never)]
+		public void OnSerializing(StreamingContext context)
+		{
+			serializing = true;
+		}
+		
+		[OnSerialized()]
+		[EditorBrowsableAttribute(EditorBrowsableState.Never)]
+		public void OnSerialized(StreamingContext context)
+		{
+			serializing = false;
+		}
+		
+		[OnDeserializing()]
+		[EditorBrowsableAttribute(EditorBrowsableState.Never)]
+		public  void OnDeserializing(StreamingContext context)
+		{
+			Initialize();
+		}
+		#endregion
+	}
+}
+
+namespace HeuristicLab.Services.OKB.DataAccess
+{	
+	[DataContract(IsReference=true)]
+	[Table(Name=@"dbo.AlgorithmData")]
+[KnownType(typeof(AlgorithmData))]	public partial class AlgorithmData : INotifyPropertyChanging, INotifyPropertyChanged
+	{
+		#region Property Change Event Handling
+		private static PropertyChangingEventArgs emptyChangingEventArgs = new PropertyChangingEventArgs(String.Empty);
+		
+		public event PropertyChangingEventHandler PropertyChanging;
+		public event PropertyChangedEventHandler PropertyChanged;
+		
+		public virtual void SendPropertyChanging()
+		{
+			if (PropertyChanging != null) {
+				PropertyChanging(this, emptyChangingEventArgs);
+			}
+		}
+			
+		public virtual void SendPropertyChanged(String propertyName)
+		{
+			if (PropertyChanged != null) {
+				PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
+			}
+		}
+		#endregion
+		
+		#region Extensibility Method Definitions
+		partial void OnLoaded();
+		partial void OnValidate(ChangeAction action);
+		partial void OnCreated();
+		#endregion
+
+		#region Construction
+		public AlgorithmData()
+		{
+			Initialize();
+		}
+		
+		private void Initialize()
+		{
+			_Algorithm = default(EntityRef<Algorithm>);
+			OnCreated();
+		}
+		#endregion
+
+		#region Column Mappings
+		partial void OnAlgorithmIdChanging(long value);
+		partial void OnAlgorithmIdChanged();
+		private long _AlgorithmId;
+		[Column(Storage=@"_AlgorithmId", DbType=@"BigInt NOT NULL", IsPrimaryKey=true, UpdateCheck=UpdateCheck.Never)]
+		[DataMember(Order=1)]
+		public long AlgorithmId
+		{
+			get { return _AlgorithmId; }
+			set {
+				if (_AlgorithmId != value) {
+					if (_Algorithm.HasLoadedOrAssignedValue) {
+						throw new ForeignKeyReferenceAlreadyHasValueException();
+					}
+					OnAlgorithmIdChanging(value);
+					SendPropertyChanging();
+					_AlgorithmId = value;
+					SendPropertyChanged("AlgorithmId");
+					OnAlgorithmIdChanged();
+				}
+			}
+		}
+		
+		partial void OnDataChanging(Binary value);
+		partial void OnDataChanged();
+		private Binary _Data;
+		[Column(Storage=@"_Data", DbType=@"VarBinary(MAX) NOT NULL", CanBeNull=false, UpdateCheck=UpdateCheck.Never)]
+		[DataMember(Order=2)]
+		public Binary Data
+		{
+			get { return _Data; }
+			set {
+				if (_Data != value) {
+					OnDataChanging(value);
+					SendPropertyChanging();
+					_Data = value;
+					SendPropertyChanged("Data");
+					OnDataChanged();
+				}
+			}
+		}
+		
+		#endregion
+		
+		#region Associations
+		private EntityRef<Algorithm> _Algorithm;
+		[Association(Name=@"Algorithm_AlgorithmData", Storage=@"_Algorithm", ThisKey=@"AlgorithmId", OtherKey=@"Id", IsForeignKey=true)]
+		[DataMember(Order=3, EmitDefaultValue=false)]
+		public Algorithm Algorithm
+		{
+			get {
+				return _Algorithm.Entity;
+			}
+			set {
+				Algorithm previousValue = _Algorithm.Entity;
+				if ((previousValue != value) || (!_Algorithm.HasLoadedOrAssignedValue)) {
+					SendPropertyChanging();
+					if (previousValue != null) {
+						_Algorithm.Entity = null;
+						previousValue.AlgorithmData = null;
+					}
+					_Algorithm.Entity = value;
+					if (value != null) {
+						value.AlgorithmData = this;
+						_AlgorithmId = value.Id;
+					}
+					else {
+						_AlgorithmId = default(long);
+					}
+					SendPropertyChanged("Algorithm");
+				}
+			}
+		}
+
+		#endregion
+		
+		#region Serialization
+		[OnDeserializing()]
+		[EditorBrowsableAttribute(EditorBrowsableState.Never)]
+		public  void OnDeserializing(StreamingContext context)
+		{
+			Initialize();
+		}
+		#endregion
+	}
+}
+
+namespace HeuristicLab.Services.OKB.DataAccess
+{	
+	[DataContract(IsReference=true)]
+	[Table(Name=@"dbo.[User]")]
+[KnownType(typeof(User))]	public partial class User : INotifyPropertyChanging, INotifyPropertyChanged
+	{
+		#region Property Change Event Handling
+		private static PropertyChangingEventArgs emptyChangingEventArgs = new PropertyChangingEventArgs(String.Empty);
+		
+		public event PropertyChangingEventHandler PropertyChanging;
+		public event PropertyChangedEventHandler PropertyChanged;
+		
+		public virtual void SendPropertyChanging()
+		{
+			if (PropertyChanging != null) {
+				PropertyChanging(this, emptyChangingEventArgs);
+			}
+		}
+			
+		public virtual void SendPropertyChanged(String propertyName)
+		{
+			if (PropertyChanged != null) {
+				PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
+			}
+		}
+		#endregion
+		
+		#region Extensibility Method Definitions
+		partial void OnLoaded();
+		partial void OnValidate(ChangeAction action);
+		partial void OnCreated();
+		#endregion
+
+		#region Construction
+		public User()
+		{
+			Initialize();
+		}
+		
+		private void Initialize()
+		{
+			_AlgorithmUsers = new EntitySet<AlgorithmUser>(attach_AlgorithmUsers, detach_AlgorithmUsers);
+			_ProblemUsers = new EntitySet<ProblemUser>(attach_ProblemUsers, detach_ProblemUsers);
+			_Runs = new EntitySet<Run>(attach_Runs, detach_Runs);
+			OnCreated();
+		}
+		#endregion
+
+		#region Column Mappings
+		partial void OnIdChanging(Guid value);
+		partial void OnIdChanged();
+		private Guid _Id;
+		[Column(Storage=@"_Id", DbType=@"UniqueIdentifier NOT NULL", IsPrimaryKey=true, UpdateCheck=UpdateCheck.Never)]
+		[DataMember(Order=1)]
+		public Guid Id
+		{
+			get { return _Id; }
+			set {
+				if (_Id != value) {
+					OnIdChanging(value);
+					SendPropertyChanging();
+					_Id = value;
+					SendPropertyChanged("Id");
+					OnIdChanged();
+				}
+			}
+		}
+		
+		partial void OnNameChanging(string value);
+		partial void OnNameChanged();
+		private string _Name;
+		[Column(Storage=@"_Name", DbType=@"NVarChar(200) NOT NULL", CanBeNull=false)]
+		[DataMember(Order=2)]
+		public string Name
+		{
+			get { return _Name; }
+			set {
+				if (_Name != value) {
+					OnNameChanging(value);
+					SendPropertyChanging();
+					_Name = value;
+					SendPropertyChanged("Name");
+					OnNameChanged();
+				}
+			}
+		}
+		
+		#endregion
+		
+		#region Associations
+		private EntitySet<AlgorithmUser> _AlgorithmUsers;
+		[Association(Name=@"User_AlgorithmUser", Storage=@"_AlgorithmUsers", ThisKey=@"Id", OtherKey=@"UserId")]
+		[DataMember(Order=3, EmitDefaultValue=false)]
+		public EntitySet<AlgorithmUser> AlgorithmUsers
+		{
+			get {
+				if (serializing && !_AlgorithmUsers.HasLoadedOrAssignedValues) {
+					return null;
+				}
+				return _AlgorithmUsers;
+			}
+			set {
+				_AlgorithmUsers.Assign(value);
+			}
+		}
+
+		private void attach_AlgorithmUsers(AlgorithmUser entity)
+		{
+			SendPropertyChanging();
+			entity.User = this;
+		}
+		
+		private void detach_AlgorithmUsers(AlgorithmUser entity)
+		{
+			SendPropertyChanging();
+			entity.User = null;
+		}
+		private EntitySet<ProblemUser> _ProblemUsers;
+		[Association(Name=@"User_ProblemUser", Storage=@"_ProblemUsers", ThisKey=@"Id", OtherKey=@"UserId")]
+		[DataMember(Order=4, EmitDefaultValue=false)]
+		public EntitySet<ProblemUser> ProblemUsers
+		{
+			get {
+				if (serializing && !_ProblemUsers.HasLoadedOrAssignedValues) {
+					return null;
+				}
+				return _ProblemUsers;
+			}
+			set {
+				_ProblemUsers.Assign(value);
+			}
+		}
+
+		private void attach_ProblemUsers(ProblemUser entity)
+		{
+			SendPropertyChanging();
+			entity.User = this;
+		}
+		
+		private void detach_ProblemUsers(ProblemUser entity)
+		{
+			SendPropertyChanging();
+			entity.User = null;
+		}
+		private EntitySet<Run> _Runs;
+		[Association(Name=@"User_Run", Storage=@"_Runs", ThisKey=@"Id", OtherKey=@"UserId")]
+		[DataMember(Order=5, EmitDefaultValue=false)]
+		public EntitySet<Run> Runs
+		{
+			get {
+				if (serializing && !_Runs.HasLoadedOrAssignedValues) {
+					return null;
+				}
+				return _Runs;
+			}
+			set {
+				_Runs.Assign(value);
+			}
+		}
+
+		private void attach_Runs(Run entity)
+		{
+			SendPropertyChanging();
+			entity.User = this;
+		}
+		
+		private void detach_Runs(Run entity)
+		{
+			SendPropertyChanging();
+			entity.User = null;
+		}
+		#endregion
+		
+		#region Serialization
+		private bool serializing;
+		
+		[OnSerializing()]
+		[EditorBrowsableAttribute(EditorBrowsableState.Never)]
+		public void OnSerializing(StreamingContext context)
+		{
+			serializing = true;
+		}
+		
+		[OnSerialized()]
+		[EditorBrowsableAttribute(EditorBrowsableState.Never)]
+		public void OnSerialized(StreamingContext context)
+		{
+			serializing = false;
+		}
+		
+		[OnDeserializing()]
+		[EditorBrowsableAttribute(EditorBrowsableState.Never)]
+		public  void OnDeserializing(StreamingContext context)
+		{
+			Initialize();
+		}
+		#endregion
+	}
+}
+
+namespace HeuristicLab.Services.OKB.DataAccess
+{	
+	[DataContract(IsReference=true)]
+	[Table(Name=@"dbo.ProblemData")]
+[KnownType(typeof(ProblemData))]	public partial class ProblemData : INotifyPropertyChanging, INotifyPropertyChanged
+	{
+		#region Property Change Event Handling
+		private static PropertyChangingEventArgs emptyChangingEventArgs = new PropertyChangingEventArgs(String.Empty);
+		
+		public event PropertyChangingEventHandler PropertyChanging;
+		public event PropertyChangedEventHandler PropertyChanged;
+		
+		public virtual void SendPropertyChanging()
+		{
+			if (PropertyChanging != null) {
+				PropertyChanging(this, emptyChangingEventArgs);
+			}
+		}
+			
+		public virtual void SendPropertyChanged(String propertyName)
+		{
+			if (PropertyChanged != null) {
+				PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
+			}
+		}
+		#endregion
+		
+		#region Extensibility Method Definitions
+		partial void OnLoaded();
+		partial void OnValidate(ChangeAction action);
+		partial void OnCreated();
+		#endregion
+
+		#region Construction
+		public ProblemData()
+		{
+			Initialize();
+		}
+		
+		private void Initialize()
+		{
+			_Problem = default(EntityRef<Problem>);
+			OnCreated();
+		}
+		#endregion
+
+		#region Column Mappings
+		partial void OnProblemIdChanging(long value);
+		partial void OnProblemIdChanged();
+		private long _ProblemId;
+		[Column(Storage=@"_ProblemId", DbType=@"BigInt NOT NULL", IsPrimaryKey=true, UpdateCheck=UpdateCheck.Never)]
+		[DataMember(Order=1)]
+		public long ProblemId
+		{
+			get { return _ProblemId; }
+			set {
+				if (_ProblemId != value) {
+					if (_Problem.HasLoadedOrAssignedValue) {
+						throw new ForeignKeyReferenceAlreadyHasValueException();
+					}
+					OnProblemIdChanging(value);
+					SendPropertyChanging();
+					_ProblemId = value;
+					SendPropertyChanged("ProblemId");
+					OnProblemIdChanged();
+				}
+			}
+		}
+		
+		partial void OnDataChanging(Binary value);
+		partial void OnDataChanged();
+		private Binary _Data;
+		[Column(Storage=@"_Data", DbType=@"VarBinary(MAX) NOT NULL", CanBeNull=false, UpdateCheck=UpdateCheck.Never)]
+		[DataMember(Order=2)]
+		public Binary Data
+		{
+			get { return _Data; }
+			set {
+				if (_Data != value) {
+					OnDataChanging(value);
+					SendPropertyChanging();
+					_Data = value;
+					SendPropertyChanged("Data");
+					OnDataChanged();
+				}
+			}
+		}
+		
+		#endregion
+		
+		#region Associations
+		private EntityRef<Problem> _Problem;
+		[Association(Name=@"Problem_ProblemData", Storage=@"_Problem", ThisKey=@"ProblemId", OtherKey=@"Id", IsForeignKey=true)]
+		[DataMember(Order=3, EmitDefaultValue=false)]
+		public Problem Problem
+		{
+			get {
+				return _Problem.Entity;
+			}
+			set {
+				Problem previousValue = _Problem.Entity;
+				if ((previousValue != value) || (!_Problem.HasLoadedOrAssignedValue)) {
+					SendPropertyChanging();
+					if (previousValue != null) {
+						_Problem.Entity = null;
+						previousValue.ProblemData = null;
+					}
+					_Problem.Entity = value;
+					if (value != null) {
+						value.ProblemData = this;
+						_ProblemId = value.Id;
+					}
+					else {
+						_ProblemId = default(long);
+					}
+					SendPropertyChanged("Problem");
+				}
+			}
+		}
+
+		#endregion
+		
+		#region Serialization
+		[OnDeserializing()]
+		[EditorBrowsableAttribute(EditorBrowsableState.Never)]
+		public  void OnDeserializing(StreamingContext context)
+		{
+			Initialize();
+		}
+		#endregion
+	}
+}
+
+namespace HeuristicLab.Services.OKB.DataAccess
+{	
+	[DataContract(IsReference=true)]
+	[Table(Name=@"dbo.AlgorithmUser")]
+[KnownType(typeof(AlgorithmUser))]	public partial class AlgorithmUser : INotifyPropertyChanging, INotifyPropertyChanged
+	{
+		#region Property Change Event Handling
+		private static PropertyChangingEventArgs emptyChangingEventArgs = new PropertyChangingEventArgs(String.Empty);
+		
+		public event PropertyChangingEventHandler PropertyChanging;
+		public event PropertyChangedEventHandler PropertyChanged;
+		
+		public virtual void SendPropertyChanging()
+		{
+			if (PropertyChanging != null) {
+				PropertyChanging(this, emptyChangingEventArgs);
+			}
+		}
+			
+		public virtual void SendPropertyChanged(String propertyName)
+		{
+			if (PropertyChanged != null) {
+				PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
+			}
+		}
+		#endregion
+		
+		#region Extensibility Method Definitions
+		partial void OnLoaded();
+		partial void OnValidate(ChangeAction action);
+		partial void OnCreated();
+		#endregion
+
+		#region Construction
+		public AlgorithmUser()
+		{
+			Initialize();
+		}
+		
+		private void Initialize()
+		{
+			_Algorithm = default(EntityRef<Algorithm>);
+			_User = default(EntityRef<User>);
+			OnCreated();
+		}
+		#endregion
+
+		#region Column Mappings
+		partial void OnAlgorithmIdChanging(long value);
+		partial void OnAlgorithmIdChanged();
+		private long _AlgorithmId;
+		[Column(Storage=@"_AlgorithmId", DbType=@"BigInt NOT NULL", IsPrimaryKey=true, UpdateCheck=UpdateCheck.Never)]
+		[DataMember(Order=1)]
+		public long AlgorithmId
+		{
+			get { return _AlgorithmId; }
+			set {
+				if (_AlgorithmId != value) {
+					if (_Algorithm.HasLoadedOrAssignedValue) {
+						throw new ForeignKeyReferenceAlreadyHasValueException();
+					}
+					OnAlgorithmIdChanging(value);
+					SendPropertyChanging();
+					_AlgorithmId = value;
+					SendPropertyChanged("AlgorithmId");
+					OnAlgorithmIdChanged();
+				}
+			}
+		}
+		
+		partial void OnUserIdChanging(Guid value);
+		partial void OnUserIdChanged();
+		private Guid _UserId;
+		[Column(Storage=@"_UserId", DbType=@"UniqueIdentifier NOT NULL", IsPrimaryKey=true, UpdateCheck=UpdateCheck.Never)]
+		[DataMember(Order=2)]
+		public Guid UserId
+		{
+			get { return _UserId; }
+			set {
+				if (_UserId != value) {
+					if (_User.HasLoadedOrAssignedValue) {
+						throw new ForeignKeyReferenceAlreadyHasValueException();
+					}
+					OnUserIdChanging(value);
+					SendPropertyChanging();
+					_UserId = value;
+					SendPropertyChanged("UserId");
+					OnUserIdChanged();
+				}
+			}
+		}
+		
+		#endregion
+		
+		#region Associations
+		private EntityRef<Algorithm> _Algorithm;
+		[Association(Name=@"Algorithm_AlgorithmUser", Storage=@"_Algorithm", ThisKey=@"AlgorithmId", OtherKey=@"Id", IsForeignKey=true)]
+		[DataMember(Order=3, EmitDefaultValue=false)]
+		public Algorithm Algorithm
+		{
+			get {
+				return _Algorithm.Entity;
+			}
+			set {
+				Algorithm previousValue = _Algorithm.Entity;
+				if ((previousValue != value) || (!_Algorithm.HasLoadedOrAssignedValue)) {
+					SendPropertyChanging();
+					if (previousValue != null) {
+						_Algorithm.Entity = null;
+						previousValue.AlgorithmUsers.Remove(this);
+					}
+					_Algorithm.Entity = value;
+					if (value != null) {
+						value.AlgorithmUsers.Add(this);
+						_AlgorithmId = value.Id;
+					}
+					else {
+						_AlgorithmId = default(long);
+					}
+					SendPropertyChanged("Algorithm");
+				}
+			}
+		}
+
+		private EntityRef<User> _User;
+		[Association(Name=@"User_AlgorithmUser", Storage=@"_User", ThisKey=@"UserId", OtherKey=@"Id", IsForeignKey=true)]
+		[DataMember(Order=4, EmitDefaultValue=false)]
+		public User User
+		{
+			get {
+				return _User.Entity;
+			}
+			set {
+				User previousValue = _User.Entity;
+				if ((previousValue != value) || (!_User.HasLoadedOrAssignedValue)) {
+					SendPropertyChanging();
+					if (previousValue != null) {
+						_User.Entity = null;
+						previousValue.AlgorithmUsers.Remove(this);
+					}
+					_User.Entity = value;
+					if (value != null) {
+						value.AlgorithmUsers.Add(this);
+						_UserId = value.Id;
+					}
+					else {
+						_UserId = default(Guid);
+					}
+					SendPropertyChanged("User");
+				}
+			}
+		}
+
+		#endregion
+		
+		#region Serialization
+		[OnDeserializing()]
+		[EditorBrowsableAttribute(EditorBrowsableState.Never)]
+		public  void OnDeserializing(StreamingContext context)
+		{
+			Initialize();
+		}
+		#endregion
+	}
+}
+
+namespace HeuristicLab.Services.OKB.DataAccess
+{	
+	[DataContract(IsReference=true)]
+	[Table(Name=@"dbo.ProblemUser")]
+[KnownType(typeof(ProblemUser))]	public partial class ProblemUser : INotifyPropertyChanging, INotifyPropertyChanged
+	{
+		#region Property Change Event Handling
+		private static PropertyChangingEventArgs emptyChangingEventArgs = new PropertyChangingEventArgs(String.Empty);
+		
+		public event PropertyChangingEventHandler PropertyChanging;
+		public event PropertyChangedEventHandler PropertyChanged;
+		
+		public virtual void SendPropertyChanging()
+		{
+			if (PropertyChanging != null) {
+				PropertyChanging(this, emptyChangingEventArgs);
+			}
+		}
+			
+		public virtual void SendPropertyChanged(String propertyName)
+		{
+			if (PropertyChanged != null) {
+				PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
+			}
+		}
+		#endregion
+		
+		#region Extensibility Method Definitions
+		partial void OnLoaded();
+		partial void OnValidate(ChangeAction action);
+		partial void OnCreated();
+		#endregion
+
+		#region Construction
+		public ProblemUser()
+		{
+			Initialize();
+		}
+		
+		private void Initialize()
+		{
+			_Problem = default(EntityRef<Problem>);
+			_User = default(EntityRef<User>);
+			OnCreated();
+		}
+		#endregion
+
+		#region Column Mappings
+		partial void OnProblemIdChanging(long value);
+		partial void OnProblemIdChanged();
+		private long _ProblemId;
+		[Column(Storage=@"_ProblemId", DbType=@"BigInt NOT NULL", IsPrimaryKey=true, UpdateCheck=UpdateCheck.Never)]
+		[DataMember(Order=1)]
+		public long ProblemId
+		{
+			get { return _ProblemId; }
+			set {
+				if (_ProblemId != value) {
+					if (_Problem.HasLoadedOrAssignedValue) {
+						throw new ForeignKeyReferenceAlreadyHasValueException();
+					}
+					OnProblemIdChanging(value);
+					SendPropertyChanging();
+					_ProblemId = value;
+					SendPropertyChanged("ProblemId");
+					OnProblemIdChanged();
+				}
+			}
+		}
+		
+		partial void OnUserIdChanging(Guid value);
+		partial void OnUserIdChanged();
+		private Guid _UserId;
+		[Column(Storage=@"_UserId", DbType=@"UniqueIdentifier NOT NULL", IsPrimaryKey=true, UpdateCheck=UpdateCheck.Never)]
+		[DataMember(Order=2)]
+		public Guid UserId
+		{
+			get { return _UserId; }
+			set {
+				if (_UserId != value) {
+					if (_User.HasLoadedOrAssignedValue) {
+						throw new ForeignKeyReferenceAlreadyHasValueException();
+					}
+					OnUserIdChanging(value);
+					SendPropertyChanging();
+					_UserId = value;
+					SendPropertyChanged("UserId");
+					OnUserIdChanged();
+				}
+			}
+		}
+		
+		#endregion
+		
+		#region Associations
+		private EntityRef<Problem> _Problem;
+		[Association(Name=@"Problem_ProblemUser", Storage=@"_Problem", ThisKey=@"ProblemId", OtherKey=@"Id", IsForeignKey=true)]
+		[DataMember(Order=3, EmitDefaultValue=false)]
+		public Problem Problem
+		{
+			get {
+				return _Problem.Entity;
+			}
+			set {
+				Problem previousValue = _Problem.Entity;
+				if ((previousValue != value) || (!_Problem.HasLoadedOrAssignedValue)) {
+					SendPropertyChanging();
+					if (previousValue != null) {
+						_Problem.Entity = null;
+						previousValue.ProblemUsers.Remove(this);
+					}
+					_Problem.Entity = value;
+					if (value != null) {
+						value.ProblemUsers.Add(this);
+						_ProblemId = value.Id;
+					}
+					else {
+						_ProblemId = default(long);
+					}
+					SendPropertyChanged("Problem");
+				}
+			}
+		}
+
+		private EntityRef<User> _User;
+		[Association(Name=@"User_ProblemUser", Storage=@"_User", ThisKey=@"UserId", OtherKey=@"Id", IsForeignKey=true)]
+		[DataMember(Order=4, EmitDefaultValue=false)]
+		public User User
+		{
+			get {
+				return _User.Entity;
+			}
+			set {
+				User previousValue = _User.Entity;
+				if ((previousValue != value) || (!_User.HasLoadedOrAssignedValue)) {
+					SendPropertyChanging();
+					if (previousValue != null) {
+						_User.Entity = null;
+						previousValue.ProblemUsers.Remove(this);
+					}
+					_User.Entity = value;
+					if (value != null) {
+						value.ProblemUsers.Add(this);
+						_UserId = value.Id;
+					}
+					else {
+						_UserId = default(Guid);
+					}
+					SendPropertyChanged("User");
+				}
+			}
+		}
+
+		#endregion
+		
+		#region Serialization
+		[OnDeserializing()]
+		[EditorBrowsableAttribute(EditorBrowsableState.Never)]
+		public  void OnDeserializing(StreamingContext context)
+		{
+			Initialize();
+		}
+		#endregion
+	}
+}
+
+namespace HeuristicLab.Services.OKB.DataAccess
+{	
+	[DataContract(IsReference=true)]
+	[Table(Name=@"dbo.Platform")]
+[KnownType(typeof(Platform))]	public partial class Platform : INotifyPropertyChanging, INotifyPropertyChanged
+	{
+		#region Property Change Event Handling
+		private static PropertyChangingEventArgs emptyChangingEventArgs = new PropertyChangingEventArgs(String.Empty);
+		
+		public event PropertyChangingEventHandler PropertyChanging;
+		public event PropertyChangedEventHandler PropertyChanged;
+		
+		public virtual void SendPropertyChanging()
+		{
+			if (PropertyChanging != null) {
+				PropertyChanging(this, emptyChangingEventArgs);
+			}
+		}
+			
+		public virtual void SendPropertyChanged(String propertyName)
+		{
+			if (PropertyChanged != null) {
+				PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
+			}
+		}
+		#endregion
+		
+		#region Extensibility Method Definitions
+		partial void OnLoaded();
+		partial void OnValidate(ChangeAction action);
+		partial void OnCreated();
+		#endregion
+
+		#region Construction
+		public Platform()
+		{
+			Initialize();
+		}
+		
+		private void Initialize()
+		{
+			_Algorithms = new EntitySet<Algorithm>(attach_Algorithms, detach_Algorithms);
+			_Problems = new EntitySet<Problem>(attach_Problems, detach_Problems);
+			_DataTypes = new EntitySet<DataType>(attach_DataTypes, detach_DataTypes);
+			OnCreated();
+		}
+		#endregion
+
+		#region Column Mappings
+		partial void OnIdChanging(long value);
+		partial void OnIdChanged();
+		private long _Id;
+		[Column(Storage=@"_Id", AutoSync=AutoSync.OnInsert, DbType=@"BigInt NOT NULL IDENTITY", IsPrimaryKey=true, IsDbGenerated=true, UpdateCheck=UpdateCheck.Never)]
+		[DataMember(Order=1)]
+		public long Id
+		{
+			get { return _Id; }
+			set {
+				if (_Id != value) {
+					OnIdChanging(value);
+					SendPropertyChanging();
+					_Id = value;
+					SendPropertyChanged("Id");
+					OnIdChanged();
+				}
+			}
+		}
+		
+		partial void OnNameChanging(string value);
+		partial void OnNameChanged();
+		private string _Name;
+		[Column(Storage=@"_Name", DbType=@"NVarChar(200) NOT NULL", CanBeNull=false)]
+		[DataMember(Order=2)]
+		public string Name
+		{
+			get { return _Name; }
+			set {
+				if (_Name != value) {
+					OnNameChanging(value);
+					SendPropertyChanging();
+					_Name = value;
+					SendPropertyChanged("Name");
+					OnNameChanged();
+				}
+			}
+		}
+		
+		partial void OnDescriptionChanging(string value);
+		partial void OnDescriptionChanged();
+		private string _Description;
+		[Column(Storage=@"_Description", DbType=@"NVarChar(MAX)")]
+		[DataMember(Order=3)]
+		public string Description
+		{
+			get { return _Description; }
+			set {
+				if (_Description != value) {
+					OnDescriptionChanging(value);
+					SendPropertyChanging();
+					_Description = value;
+					SendPropertyChanged("Description");
+					OnDescriptionChanged();
+				}
+			}
+		}
+		
+		#endregion
+		
+		#region Associations
+		private EntitySet<Algorithm> _Algorithms;
+		[Association(Name=@"Platform_Algorithm", Storage=@"_Algorithms", ThisKey=@"Id", OtherKey=@"PlatformId")]
+		[DataMember(Order=4, EmitDefaultValue=false)]
+		public EntitySet<Algorithm> Algorithms
+		{
+			get {
+				if (serializing && !_Algorithms.HasLoadedOrAssignedValues) {
+					return null;
+				}
+				return _Algorithms;
+			}
+			set {
+				_Algorithms.Assign(value);
+			}
+		}
+
+		private void attach_Algorithms(Algorithm entity)
+		{
+			SendPropertyChanging();
+			entity.Platform = this;
+		}
+		
+		private void detach_Algorithms(Algorithm entity)
+		{
+			SendPropertyChanging();
+			entity.Platform = null;
+		}
+		private EntitySet<Problem> _Problems;
+		[Association(Name=@"Platform_Problem", Storage=@"_Problems", ThisKey=@"Id", OtherKey=@"PlatformId")]
+		[DataMember(Order=5, EmitDefaultValue=false)]
+		public EntitySet<Problem> Problems
+		{
+			get {
+				if (serializing && !_Problems.HasLoadedOrAssignedValues) {
+					return null;
+				}
+				return _Problems;
+			}
+			set {
+				_Problems.Assign(value);
+			}
+		}
+
+		private void attach_Problems(Problem entity)
+		{
+			SendPropertyChanging();
+			entity.Platform = this;
+		}
+		
+		private void detach_Problems(Problem entity)
+		{
+			SendPropertyChanging();
+			entity.Platform = null;
+		}
+		private EntitySet<DataType> _DataTypes;
+		[Association(Name=@"Platform_DataType", Storage=@"_DataTypes", ThisKey=@"Id", OtherKey=@"PlatformId")]
+		[DataMember(Order=6, EmitDefaultValue=false)]
+		public EntitySet<DataType> DataTypes
+		{
+			get {
+				if (serializing && !_DataTypes.HasLoadedOrAssignedValues) {
+					return null;
+				}
+				return _DataTypes;
+			}
+			set {
+				_DataTypes.Assign(value);
+			}
+		}
+
+		private void attach_DataTypes(DataType entity)
+		{
+			SendPropertyChanging();
+			entity.Platform = this;
+		}
+		
+		private void detach_DataTypes(DataType entity)
+		{
+			SendPropertyChanging();
+			entity.Platform = null;
+		}
+		#endregion
+		
+		#region Serialization
+		private bool serializing;
+		
+		[OnSerializing()]
+		[EditorBrowsableAttribute(EditorBrowsableState.Never)]
+		public void OnSerializing(StreamingContext context)
+		{
+			serializing = true;
+		}
+		
+		[OnSerialized()]
+		[EditorBrowsableAttribute(EditorBrowsableState.Never)]
+		public void OnSerialized(StreamingContext context)
+		{
+			serializing = false;
+		}
+		
+		[OnDeserializing()]
+		[EditorBrowsableAttribute(EditorBrowsableState.Never)]
+		public  void OnDeserializing(StreamingContext context)
+		{
+			Initialize();
+		}
+		#endregion
+	}
+}
+
+namespace HeuristicLab.Services.OKB.DataAccess
+{	
+	[DataContract(IsReference=true)]
+	[Table(Name=@"dbo.Run")]
+[KnownType(typeof(Run))]	public partial class Run : INotifyPropertyChanging, INotifyPropertyChanged
+	{
+		#region Property Change Event Handling
+		private static PropertyChangingEventArgs emptyChangingEventArgs = new PropertyChangingEventArgs(String.Empty);
+		
+		public event PropertyChangingEventHandler PropertyChanging;
+		public event PropertyChangedEventHandler PropertyChanged;
+		
+		public virtual void SendPropertyChanging()
+		{
+			if (PropertyChanging != null) {
+				PropertyChanging(this, emptyChangingEventArgs);
+			}
+		}
+			
+		public virtual void SendPropertyChanged(String propertyName)
+		{
+			if (PropertyChanged != null) {
+				PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
+			}
+		}
+		#endregion
+		
+		#region Extensibility Method Definitions
+		partial void OnLoaded();
+		partial void OnValidate(ChangeAction action);
+		partial void OnCreated();
+		#endregion
+
+		#region Construction
+		public Run()
+		{
+			Initialize();
+		}
+		
+		private void Initialize()
+		{
+			_ResultBlobValues = new EntitySet<ResultBlobValue>(attach_ResultBlobValues, detach_ResultBlobValues);
+			_ResultBoolValues = new EntitySet<ResultBoolValue>(attach_ResultBoolValues, detach_ResultBoolValues);
+			_ResultFloatValues = new EntitySet<ResultFloatValue>(attach_ResultFloatValues, detach_ResultFloatValues);
+			_ResultIntValues = new EntitySet<ResultIntValue>(attach_ResultIntValues, detach_ResultIntValues);
+			_ResultStringValues = new EntitySet<ResultStringValue>(attach_ResultStringValues, detach_ResultStringValues);
+			_Experiment = default(EntityRef<Experiment>);
+			_User = default(EntityRef<User>);
+			_Client = default(EntityRef<Client>);
+			OnCreated();
+		}
+		#endregion
+
+		#region Column Mappings
+		partial void OnIdChanging(long value);
+		partial void OnIdChanged();
+		private long _Id;
+		[Column(Storage=@"_Id", AutoSync=AutoSync.OnInsert, DbType=@"BigInt NOT NULL IDENTITY", IsPrimaryKey=true, IsDbGenerated=true, UpdateCheck=UpdateCheck.Never)]
+		[DataMember(Order=1)]
+		public long Id
+		{
+			get { return _Id; }
+			set {
+				if (_Id != value) {
+					OnIdChanging(value);
+					SendPropertyChanging();
+					_Id = value;
+					SendPropertyChanged("Id");
+					OnIdChanged();
+				}
+			}
+		}
+		
+		partial void OnExperimentIdChanging(long value);
+		partial void OnExperimentIdChanged();
+		private long _ExperimentId;
+		[Column(Storage=@"_ExperimentId", DbType=@"BigInt NOT NULL", CanBeNull=false)]
+		[DataMember(Order=2)]
+		public long ExperimentId
+		{
+			get { return _ExperimentId; }
+			set {
+				if (_ExperimentId != value) {
+					if (_Experiment.HasLoadedOrAssignedValue) {
+						throw new ForeignKeyReferenceAlreadyHasValueException();
+					}
+					OnExperimentIdChanging(value);
+					SendPropertyChanging();
+					_ExperimentId = value;
+					SendPropertyChanged("ExperimentId");
+					OnExperimentIdChanged();
+				}
+			}
+		}
+		
+		partial void OnRandomSeedChanging(int value);
+		partial void OnRandomSeedChanged();
+		private int _RandomSeed;
+		[Column(Storage=@"_RandomSeed", DbType=@"Int NOT NULL", CanBeNull=false)]
+		[DataMember(Order=3)]
+		public int RandomSeed
+		{
+			get { return _RandomSeed; }
+			set {
+				if (_RandomSeed != value) {
+					OnRandomSeedChanging(value);
+					SendPropertyChanging();
+					_RandomSeed = value;
+					SendPropertyChanged("RandomSeed");
+					OnRandomSeedChanged();
+				}
+			}
+		}
+		
+		partial void OnFinishedDateChanging(DateTime? value);
+		partial void OnFinishedDateChanged();
+		private DateTime? _FinishedDate;
+		[Column(Storage=@"_FinishedDate", DbType=@"DateTime2")]
+		[DataMember(Order=4)]
+		public DateTime? FinishedDate
+		{
+			get { return _FinishedDate; }
+			set {
+				if (_FinishedDate != value) {
+					OnFinishedDateChanging(value);
+					SendPropertyChanging();
+					_FinishedDate = value;
+					SendPropertyChanged("FinishedDate");
+					OnFinishedDateChanged();
+				}
+			}
+		}
+		
+		partial void OnUserIdChanging(Guid value);
+		partial void OnUserIdChanged();
+		private Guid _UserId;
+		[Column(Storage=@"_UserId", DbType=@"UniqueIdentifier NOT NULL", CanBeNull=false)]
+		[DataMember(Order=5)]
+		public Guid UserId
+		{
+			get { return _UserId; }
+			set {
+				if (_UserId != value) {
+					if (_User.HasLoadedOrAssignedValue) {
+						throw new ForeignKeyReferenceAlreadyHasValueException();
+					}
+					OnUserIdChanging(value);
+					SendPropertyChanging();
+					_UserId = value;
+					SendPropertyChanged("UserId");
+					OnUserIdChanged();
+				}
+			}
+		}
+		
+		partial void OnClientIdChanging(Guid value);
+		partial void OnClientIdChanged();
+		private Guid _ClientId;
+		[Column(Storage=@"_ClientId", DbType=@"UniqueIdentifier NOT NULL", CanBeNull=false)]
+		[DataMember(Order=6)]
+		public Guid ClientId
+		{
+			get { return _ClientId; }
+			set {
+				if (_ClientId != value) {
+					if (_Client.HasLoadedOrAssignedValue) {
+						throw new ForeignKeyReferenceAlreadyHasValueException();
+					}
+					OnClientIdChanging(value);
+					SendPropertyChanging();
+					_ClientId = value;
+					SendPropertyChanged("ClientId");
+					OnClientIdChanged();
+				}
+			}
+		}
+		
+		#endregion
+		
+		#region Associations
+		private EntitySet<ResultBlobValue> _ResultBlobValues;
+		[Association(Name=@"Run_ResultBlobValue", Storage=@"_ResultBlobValues", ThisKey=@"Id", OtherKey=@"RunId")]
+		[DataMember(Order=7, EmitDefaultValue=false)]
+		public EntitySet<ResultBlobValue> ResultBlobValues
+		{
+			get {
+				if (serializing && !_ResultBlobValues.HasLoadedOrAssignedValues) {
+					return null;
+				}
+				return _ResultBlobValues;
+			}
+			set {
+				_ResultBlobValues.Assign(value);
+			}
+		}
+
+		private void attach_ResultBlobValues(ResultBlobValue entity)
+		{
+			SendPropertyChanging();
+			entity.Run = this;
+		}
+		
+		private void detach_ResultBlobValues(ResultBlobValue entity)
+		{
+			SendPropertyChanging();
+			entity.Run = null;
+		}
+		private EntitySet<ResultBoolValue> _ResultBoolValues;
+		[Association(Name=@"Run_ResultBoolValue", Storage=@"_ResultBoolValues", ThisKey=@"Id", OtherKey=@"RunId")]
+		[DataMember(Order=8, EmitDefaultValue=false)]
+		public EntitySet<ResultBoolValue> ResultBoolValues
+		{
+			get {
+				if (serializing && !_ResultBoolValues.HasLoadedOrAssignedValues) {
+					return null;
+				}
+				return _ResultBoolValues;
+			}
+			set {
+				_ResultBoolValues.Assign(value);
+			}
+		}
+
+		private void attach_ResultBoolValues(ResultBoolValue entity)
+		{
+			SendPropertyChanging();
+			entity.Run = this;
+		}
+		
+		private void detach_ResultBoolValues(ResultBoolValue entity)
+		{
+			SendPropertyChanging();
+			entity.Run = null;
+		}
+		private EntitySet<ResultFloatValue> _ResultFloatValues;
+		[Association(Name=@"Run_ResultFloatValue", Storage=@"_ResultFloatValues", ThisKey=@"Id", OtherKey=@"RunId")]
+		[DataMember(Order=9, EmitDefaultValue=false)]
+		public EntitySet<ResultFloatValue> ResultFloatValues
+		{
+			get {
+				if (serializing && !_ResultFloatValues.HasLoadedOrAssignedValues) {
+					return null;
+				}
+				return _ResultFloatValues;
+			}
+			set {
+				_ResultFloatValues.Assign(value);
+			}
+		}
+
+		private void attach_ResultFloatValues(ResultFloatValue entity)
+		{
+			SendPropertyChanging();
+			entity.Run = this;
+		}
+		
+		private void detach_ResultFloatValues(ResultFloatValue entity)
+		{
+			SendPropertyChanging();
+			entity.Run = null;
+		}
+		private EntitySet<ResultIntValue> _ResultIntValues;
+		[Association(Name=@"Run_ResultIntValue", Storage=@"_ResultIntValues", ThisKey=@"Id", OtherKey=@"RunId")]
+		[DataMember(Order=10, EmitDefaultValue=false)]
+		public EntitySet<ResultIntValue> ResultIntValues
+		{
+			get {
+				if (serializing && !_ResultIntValues.HasLoadedOrAssignedValues) {
+					return null;
+				}
+				return _ResultIntValues;
+			}
+			set {
+				_ResultIntValues.Assign(value);
+			}
+		}
+
+		private void attach_ResultIntValues(ResultIntValue entity)
+		{
+			SendPropertyChanging();
+			entity.Run = this;
+		}
+		
+		private void detach_ResultIntValues(ResultIntValue entity)
+		{
+			SendPropertyChanging();
+			entity.Run = null;
+		}
+		private EntitySet<ResultStringValue> _ResultStringValues;
+		[Association(Name=@"Run_ResultStringValue", Storage=@"_ResultStringValues", ThisKey=@"Id", OtherKey=@"RunId")]
+		[DataMember(Order=11, EmitDefaultValue=false)]
+		public EntitySet<ResultStringValue> ResultStringValues
+		{
+			get {
+				if (serializing && !_ResultStringValues.HasLoadedOrAssignedValues) {
+					return null;
+				}
+				return _ResultStringValues;
+			}
+			set {
+				_ResultStringValues.Assign(value);
+			}
+		}
+
+		private void attach_ResultStringValues(ResultStringValue entity)
+		{
+			SendPropertyChanging();
+			entity.Run = this;
+		}
+		
+		private void detach_ResultStringValues(ResultStringValue entity)
+		{
+			SendPropertyChanging();
+			entity.Run = null;
+		}
+		private EntityRef<Experiment> _Experiment;
+		[Association(Name=@"Experiment_Run", Storage=@"_Experiment", ThisKey=@"ExperimentId", OtherKey=@"Id", IsForeignKey=true)]
+		[DataMember(Order=12, EmitDefaultValue=false)]
+		public Experiment Experiment
+		{
+			get {
+				if (serializing && !_Experiment.HasLoadedOrAssignedValue) {
+					return null;
+				}
+				return _Experiment.Entity;
+			}
+			set {
+				Experiment previousValue = _Experiment.Entity;
+				if ((previousValue != value) || (!_Experiment.HasLoadedOrAssignedValue)) {
+					SendPropertyChanging();
+					if (previousValue != null) {
+						_Experiment.Entity = null;
+						previousValue.Runs.Remove(this);
+					}
+					_Experiment.Entity = value;
+					if (value != null) {
+						value.Runs.Add(this);
+						_ExperimentId = value.Id;
+					}
+					else {
+						_ExperimentId = default(long);
+					}
+					SendPropertyChanged("Experiment");
+				}
+			}
+		}
+
+		private EntityRef<User> _User;
+		[Association(Name=@"User_Run", Storage=@"_User", ThisKey=@"UserId", OtherKey=@"Id", IsForeignKey=true)]
+		[DataMember(Order=13, EmitDefaultValue=false)]
+		public User User
+		{
+			get {
+				if (serializing && !_User.HasLoadedOrAssignedValue) {
+					return null;
+				}
+				return _User.Entity;
+			}
+			set {
+				User previousValue = _User.Entity;
+				if ((previousValue != value) || (!_User.HasLoadedOrAssignedValue)) {
+					SendPropertyChanging();
+					if (previousValue != null) {
+						_User.Entity = null;
+						previousValue.Runs.Remove(this);
+					}
+					_User.Entity = value;
+					if (value != null) {
+						value.Runs.Add(this);
+						_UserId = value.Id;
+					}
+					else {
+						_UserId = default(Guid);
+					}
+					SendPropertyChanged("User");
+				}
+			}
+		}
+
+		private EntityRef<Client> _Client;
+		[Association(Name=@"Client_Run", Storage=@"_Client", ThisKey=@"ClientId", OtherKey=@"Id", IsForeignKey=true)]
+		[DataMember(Order=14, EmitDefaultValue=false)]
+		public Client Client
+		{
+			get {
+				if (serializing && !_Client.HasLoadedOrAssignedValue) {
+					return null;
+				}
+				return _Client.Entity;
+			}
+			set {
+				Client previousValue = _Client.Entity;
+				if ((previousValue != value) || (!_Client.HasLoadedOrAssignedValue)) {
+					SendPropertyChanging();
+					if (previousValue != null) {
+						_Client.Entity = null;
+						previousValue.Runs.Remove(this);
+					}
+					_Client.Entity = value;
+					if (value != null) {
+						value.Runs.Add(this);
+						_ClientId = value.Id;
+					}
+					else {
+						_ClientId = default(Guid);
+					}
+					SendPropertyChanged("Client");
+				}
+			}
+		}
+
+		#endregion
+		
+		#region Serialization
+		private bool serializing;
+		
+		[OnSerializing()]
+		[EditorBrowsableAttribute(EditorBrowsableState.Never)]
+		public void OnSerializing(StreamingContext context)
+		{
+			serializing = true;
+		}
+		
+		[OnSerialized()]
+		[EditorBrowsableAttribute(EditorBrowsableState.Never)]
+		public void OnSerialized(StreamingContext context)
+		{
+			serializing = false;
+		}
+		
+		[OnDeserializing()]
+		[EditorBrowsableAttribute(EditorBrowsableState.Never)]
+		public  void OnDeserializing(StreamingContext context)
+		{
+			Initialize();
+		}
+		#endregion
+	}
+}
+
+namespace HeuristicLab.Services.OKB.DataAccess
+{	
+	[DataContract(IsReference=true)]
+	[Table(Name=@"dbo.Result")]
+[KnownType(typeof(Result))]	public partial class Result : INotifyPropertyChanging, INotifyPropertyChanged
+	{
+		#region Property Change Event Handling
+		private static PropertyChangingEventArgs emptyChangingEventArgs = new PropertyChangingEventArgs(String.Empty);
+		
+		public event PropertyChangingEventHandler PropertyChanging;
+		public event PropertyChangedEventHandler PropertyChanged;
+		
+		public virtual void SendPropertyChanging()
+		{
+			if (PropertyChanging != null) {
+				PropertyChanging(this, emptyChangingEventArgs);
+			}
+		}
+			
+		public virtual void SendPropertyChanged(String propertyName)
+		{
+			if (PropertyChanged != null) {
+				PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
+			}
+		}
+		#endregion
+		
+		#region Extensibility Method Definitions
+		partial void OnLoaded();
+		partial void OnValidate(ChangeAction action);
+		partial void OnCreated();
+		#endregion
+
+		#region Construction
+		public Result()
+		{
+			Initialize();
+		}
+		
+		private void Initialize()
+		{
+			_ResultBlobValues = new EntitySet<ResultBlobValue>(attach_ResultBlobValues, detach_ResultBlobValues);
+			_ResultBoolValues = new EntitySet<ResultBoolValue>(attach_ResultBoolValues, detach_ResultBoolValues);
+			_ResultFloatValues = new EntitySet<ResultFloatValue>(attach_ResultFloatValues, detach_ResultFloatValues);
+			_ResultIntValues = new EntitySet<ResultIntValue>(attach_ResultIntValues, detach_ResultIntValues);
+			_ResultStringValues = new EntitySet<ResultStringValue>(attach_ResultStringValues, detach_ResultStringValues);
+			_Algorithm = default(EntityRef<Algorithm>);
+			_DataType = default(EntityRef<DataType>);
+			OnCreated();
+		}
+		#endregion
+
+		#region Column Mappings
+		partial void OnIdChanging(long value);
+		partial void OnIdChanged();
+		private long _Id;
+		[Column(Storage=@"_Id", AutoSync=AutoSync.OnInsert, DbType=@"BigInt NOT NULL IDENTITY", IsPrimaryKey=true, IsDbGenerated=true, UpdateCheck=UpdateCheck.Never)]
+		[DataMember(Order=1)]
+		public long Id
+		{
+			get { return _Id; }
+			set {
+				if (_Id != value) {
+					OnIdChanging(value);
+					SendPropertyChanging();
+					_Id = value;
+					SendPropertyChanged("Id");
+					OnIdChanged();
+				}
+			}
+		}
+		
+		partial void OnAlgorithmIdChanging(long value);
+		partial void OnAlgorithmIdChanged();
+		private long _AlgorithmId;
+		[Column(Storage=@"_AlgorithmId", DbType=@"BigInt NOT NULL", CanBeNull=false)]
+		[DataMember(Order=2)]
+		public long AlgorithmId
+		{
+			get { return _AlgorithmId; }
+			set {
+				if (_AlgorithmId != value) {
+					if (_Algorithm.HasLoadedOrAssignedValue) {
+						throw new ForeignKeyReferenceAlreadyHasValueException();
+					}
+					OnAlgorithmIdChanging(value);
+					SendPropertyChanging();
+					_AlgorithmId = value;
+					SendPropertyChanged("AlgorithmId");
+					OnAlgorithmIdChanged();
+				}
+			}
+		}
+		
+		partial void OnNameChanging(string value);
+		partial void OnNameChanged();
+		private string _Name;
+		[Column(Storage=@"_Name", DbType=@"NVarChar(200) NOT NULL", CanBeNull=false)]
+		[DataMember(Order=3)]
+		public string Name
+		{
+			get { return _Name; }
+			set {
+				if (_Name != value) {
+					OnNameChanging(value);
+					SendPropertyChanging();
+					_Name = value;
+					SendPropertyChanged("Name");
+					OnNameChanged();
+				}
+			}
+		}
+		
+		partial void OnAliasChanging(string value);
+		partial void OnAliasChanged();
+		private string _Alias;
+		[Column(Storage=@"_Alias", DbType=@"NVarChar(200)")]
+		[DataMember(Order=4)]
+		public string Alias
+		{
+			get { return _Alias; }
+			set {
+				if (_Alias != value) {
+					OnAliasChanging(value);
+					SendPropertyChanging();
+					_Alias = value;
+					SendPropertyChanged("Alias");
+					OnAliasChanged();
+				}
+			}
+		}
+		
+		partial void OnDescriptionChanging(string value);
+		partial void OnDescriptionChanged();
+		private string _Description;
+		[Column(Storage=@"_Description", DbType=@"NVarChar(MAX)")]
+		[DataMember(Order=5)]
+		public string Description
+		{
+			get { return _Description; }
+			set {
+				if (_Description != value) {
+					OnDescriptionChanging(value);
+					SendPropertyChanging();
+					_Description = value;
+					SendPropertyChanged("Description");
+					OnDescriptionChanged();
+				}
+			}
+		}
+		
+		partial void OnDataTypeIdChanging(long value);
+		partial void OnDataTypeIdChanged();
+		private long _DataTypeId;
+		[Column(Storage=@"_DataTypeId", DbType=@"BigInt NOT NULL", CanBeNull=false)]
+		[DataMember(Order=6)]
+		public long DataTypeId
+		{
+			get { return _DataTypeId; }
+			set {
+				if (_DataTypeId != value) {
+					if (_DataType.HasLoadedOrAssignedValue) {
+						throw new ForeignKeyReferenceAlreadyHasValueException();
+					}
+					OnDataTypeIdChanging(value);
+					SendPropertyChanging();
+					_DataTypeId = value;
+					SendPropertyChanged("DataTypeId");
+					OnDataTypeIdChanged();
+				}
+			}
+		}
+		
+		#endregion
+		
+		#region Associations
+		private EntitySet<ResultBlobValue> _ResultBlobValues;
+		[Association(Name=@"Result_ResultBlobValue", Storage=@"_ResultBlobValues", ThisKey=@"Id", OtherKey=@"ResultId")]
+		[DataMember(Order=7, EmitDefaultValue=false)]
+		public EntitySet<ResultBlobValue> ResultBlobValues
+		{
+			get {
+				if (serializing && !_ResultBlobValues.HasLoadedOrAssignedValues) {
+					return null;
+				}
+				return _ResultBlobValues;
+			}
+			set {
+				_ResultBlobValues.Assign(value);
+			}
+		}
+
+		private void attach_ResultBlobValues(ResultBlobValue entity)
+		{
+			SendPropertyChanging();
+			entity.Result = this;
+		}
+		
+		private void detach_ResultBlobValues(ResultBlobValue entity)
+		{
+			SendPropertyChanging();
+			entity.Result = null;
+		}
+		private EntitySet<ResultBoolValue> _ResultBoolValues;
+		[Association(Name=@"Result_ResultBoolValue", Storage=@"_ResultBoolValues", ThisKey=@"Id", OtherKey=@"ResultId")]
+		[DataMember(Order=8, EmitDefaultValue=false)]
+		public EntitySet<ResultBoolValue> ResultBoolValues
+		{
+			get {
+				if (serializing && !_ResultBoolValues.HasLoadedOrAssignedValues) {
+					return null;
+				}
+				return _ResultBoolValues;
+			}
+			set {
+				_ResultBoolValues.Assign(value);
+			}
+		}
+
+		private void attach_ResultBoolValues(ResultBoolValue entity)
+		{
+			SendPropertyChanging();
+			entity.Result = this;
+		}
+		
+		private void detach_ResultBoolValues(ResultBoolValue entity)
+		{
+			SendPropertyChanging();
+			entity.Result = null;
+		}
+		private EntitySet<ResultFloatValue> _ResultFloatValues;
+		[Association(Name=@"Result_ResultFloatValue", Storage=@"_ResultFloatValues", ThisKey=@"Id", OtherKey=@"ResultId")]
+		[DataMember(Order=9, EmitDefaultValue=false)]
+		public EntitySet<ResultFloatValue> ResultFloatValues
+		{
+			get {
+				if (serializing && !_ResultFloatValues.HasLoadedOrAssignedValues) {
+					return null;
+				}
+				return _ResultFloatValues;
+			}
+			set {
+				_ResultFloatValues.Assign(value);
+			}
+		}
+
+		private void attach_ResultFloatValues(ResultFloatValue entity)
+		{
+			SendPropertyChanging();
+			entity.Result = this;
+		}
+		
+		private void detach_ResultFloatValues(ResultFloatValue entity)
+		{
+			SendPropertyChanging();
+			entity.Result = null;
+		}
+		private EntitySet<ResultIntValue> _ResultIntValues;
+		[Association(Name=@"Result_ResultIntValue", Storage=@"_ResultIntValues", ThisKey=@"Id", OtherKey=@"ResultId")]
+		[DataMember(Order=10, EmitDefaultValue=false)]
+		public EntitySet<ResultIntValue> ResultIntValues
+		{
+			get {
+				if (serializing && !_ResultIntValues.HasLoadedOrAssignedValues) {
+					return null;
+				}
+				return _ResultIntValues;
+			}
+			set {
+				_ResultIntValues.Assign(value);
+			}
+		}
+
+		private void attach_ResultIntValues(ResultIntValue entity)
+		{
+			SendPropertyChanging();
+			entity.Result = this;
+		}
+		
+		private void detach_ResultIntValues(ResultIntValue entity)
+		{
+			SendPropertyChanging();
+			entity.Result = null;
+		}
+		private EntitySet<ResultStringValue> _ResultStringValues;
+		[Association(Name=@"Result_ResultStringValue", Storage=@"_ResultStringValues", ThisKey=@"Id", OtherKey=@"ResultId")]
+		[DataMember(Order=11, EmitDefaultValue=false)]
+		public EntitySet<ResultStringValue> ResultStringValues
+		{
+			get {
+				if (serializing && !_ResultStringValues.HasLoadedOrAssignedValues) {
+					return null;
+				}
+				return _ResultStringValues;
+			}
+			set {
+				_ResultStringValues.Assign(value);
+			}
+		}
+
+		private void attach_ResultStringValues(ResultStringValue entity)
+		{
+			SendPropertyChanging();
+			entity.Result = this;
+		}
+		
+		private void detach_ResultStringValues(ResultStringValue entity)
+		{
+			SendPropertyChanging();
+			entity.Result = null;
+		}
+		private EntityRef<Algorithm> _Algorithm;
+		[Association(Name=@"Algorithm_Result", Storage=@"_Algorithm", ThisKey=@"AlgorithmId", OtherKey=@"Id", IsForeignKey=true)]
+		[DataMember(Order=12, EmitDefaultValue=false)]
+		public Algorithm Algorithm
+		{
+			get {
+				if (serializing && !_Algorithm.HasLoadedOrAssignedValue) {
+					return null;
+				}
+				return _Algorithm.Entity;
+			}
+			set {
+				Algorithm previousValue = _Algorithm.Entity;
+				if ((previousValue != value) || (!_Algorithm.HasLoadedOrAssignedValue)) {
+					SendPropertyChanging();
+					if (previousValue != null) {
+						_Algorithm.Entity = null;
+						previousValue.Results.Remove(this);
+					}
+					_Algorithm.Entity = value;
+					if (value != null) {
+						value.Results.Add(this);
+						_AlgorithmId = value.Id;
+					}
+					else {
+						_AlgorithmId = default(long);
+					}
+					SendPropertyChanged("Algorithm");
+				}
+			}
+		}
+
+		private EntityRef<DataType> _DataType;
+		[Association(Name=@"DataType_Result", Storage=@"_DataType", ThisKey=@"DataTypeId", OtherKey=@"Id", IsForeignKey=true)]
+		[DataMember(Order=13, EmitDefaultValue=false)]
+		public DataType DataType
+		{
+			get {
+				if (serializing && !_DataType.HasLoadedOrAssignedValue) {
+					return null;
+				}
+				return _DataType.Entity;
+			}
+			set {
+				DataType previousValue = _DataType.Entity;
+				if ((previousValue != value) || (!_DataType.HasLoadedOrAssignedValue)) {
+					SendPropertyChanging();
+					if (previousValue != null) {
+						_DataType.Entity = null;
+						previousValue.Results.Remove(this);
+					}
+					_DataType.Entity = value;
+					if (value != null) {
+						value.Results.Add(this);
+						_DataTypeId = value.Id;
+					}
+					else {
+						_DataTypeId = default(long);
+					}
+					SendPropertyChanged("DataType");
+				}
+			}
+		}
+
+		#endregion
+		
+		#region Serialization
+		private bool serializing;
+		
+		[OnSerializing()]
+		[EditorBrowsableAttribute(EditorBrowsableState.Never)]
+		public void OnSerializing(StreamingContext context)
+		{
+			serializing = true;
+		}
+		
+		[OnSerialized()]
+		[EditorBrowsableAttribute(EditorBrowsableState.Never)]
+		public void OnSerialized(StreamingContext context)
+		{
+			serializing = false;
+		}
+		
+		[OnDeserializing()]
+		[EditorBrowsableAttribute(EditorBrowsableState.Never)]
+		public  void OnDeserializing(StreamingContext context)
+		{
+			Initialize();
+		}
+		#endregion
+	}
+}
+
+namespace HeuristicLab.Services.OKB.DataAccess
+{	
+	[DataContract(IsReference=true)]
+	[Table(Name=@"dbo.Client")]
+[KnownType(typeof(Client))]	public partial class Client : INotifyPropertyChanging, INotifyPropertyChanged
+	{
+		#region Property Change Event Handling
+		private static PropertyChangingEventArgs emptyChangingEventArgs = new PropertyChangingEventArgs(String.Empty);
+		
+		public event PropertyChangingEventHandler PropertyChanging;
+		public event PropertyChangedEventHandler PropertyChanged;
+		
+		public virtual void SendPropertyChanging()
+		{
+			if (PropertyChanging != null) {
+				PropertyChanging(this, emptyChangingEventArgs);
+			}
+		}
+			
+		public virtual void SendPropertyChanged(String propertyName)
+		{
+			if (PropertyChanged != null) {
+				PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
+			}
+		}
+		#endregion
+		
+		#region Extensibility Method Definitions
+		partial void OnLoaded();
+		partial void OnValidate(ChangeAction action);
+		partial void OnCreated();
+		#endregion
+
+		#region Construction
+		public Client()
+		{
+			Initialize();
+		}
+		
+		private void Initialize()
+		{
+			_Runs = new EntitySet<Run>(attach_Runs, detach_Runs);
+			OnCreated();
+		}
+		#endregion
+
+		#region Column Mappings
+		partial void OnIdChanging(Guid value);
+		partial void OnIdChanged();
+		private Guid _Id;
+		[Column(Storage=@"_Id", DbType=@"UniqueIdentifier NOT NULL", IsPrimaryKey=true, UpdateCheck=UpdateCheck.Never)]
+		[DataMember(Order=1)]
+		public Guid Id
+		{
+			get { return _Id; }
+			set {
+				if (_Id != value) {
+					OnIdChanging(value);
+					SendPropertyChanging();
+					_Id = value;
+					SendPropertyChanged("Id");
+					OnIdChanged();
+				}
+			}
+		}
+		
+		partial void OnNameChanging(string value);
+		partial void OnNameChanged();
+		private string _Name;
+		[Column(Storage=@"_Name", DbType=@"NVarChar(200) NOT NULL", CanBeNull=false)]
+		[DataMember(Order=2)]
+		public string Name
+		{
+			get { return _Name; }
+			set {
+				if (_Name != value) {
+					OnNameChanging(value);
+					SendPropertyChanging();
+					_Name = value;
+					SendPropertyChanged("Name");
+					OnNameChanged();
+				}
+			}
+		}
+		
+		#endregion
+		
+		#region Associations
+		private EntitySet<Run> _Runs;
+		[Association(Name=@"Client_Run", Storage=@"_Runs", ThisKey=@"Id", OtherKey=@"ClientId")]
+		[DataMember(Order=3, EmitDefaultValue=false)]
+		public EntitySet<Run> Runs
+		{
+			get {
+				if (serializing && !_Runs.HasLoadedOrAssignedValues) {
+					return null;
+				}
+				return _Runs;
+			}
+			set {
+				_Runs.Assign(value);
+			}
+		}
+
+		private void attach_Runs(Run entity)
+		{
+			SendPropertyChanging();
+			entity.Client = this;
+		}
+		
+		private void detach_Runs(Run entity)
+		{
+			SendPropertyChanging();
+			entity.Client = null;
+		}
+		#endregion
+		
+		#region Serialization
+		private bool serializing;
+		
+		[OnSerializing()]
+		[EditorBrowsableAttribute(EditorBrowsableState.Never)]
+		public void OnSerializing(StreamingContext context)
+		{
+			serializing = true;
+		}
+		
+		[OnSerialized()]
+		[EditorBrowsableAttribute(EditorBrowsableState.Never)]
+		public void OnSerialized(StreamingContext context)
+		{
+			serializing = false;
+		}
+		
+		[OnDeserializing()]
+		[EditorBrowsableAttribute(EditorBrowsableState.Never)]
+		public  void OnDeserializing(StreamingContext context)
+		{
+			Initialize();
+		}
+		#endregion
+	}
+}
+
+namespace HeuristicLab.Services.OKB.DataAccess
+{	
+	[DataContract(IsReference=true)]
+	[Table(Name=@"dbo.AlgorithmParameterBlobValue")]
+[KnownType(typeof(AlgorithmParameterBlobValue))]	public partial class AlgorithmParameterBlobValue : INotifyPropertyChanging, INotifyPropertyChanged
+	{
+		#region Property Change Event Handling
+		private static PropertyChangingEventArgs emptyChangingEventArgs = new PropertyChangingEventArgs(String.Empty);
+		
+		public event PropertyChangingEventHandler PropertyChanging;
+		public event PropertyChangedEventHandler PropertyChanged;
+		
+		public virtual void SendPropertyChanging()
+		{
+			if (PropertyChanging != null) {
+				PropertyChanging(this, emptyChangingEventArgs);
+			}
+		}
+			
+		public virtual void SendPropertyChanged(String propertyName)
+		{
+			if (PropertyChanged != null) {
+				PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
+			}
+		}
+		#endregion
+		
+		#region Extensibility Method Definitions
+		partial void OnLoaded();
+		partial void OnValidate(ChangeAction action);
+		partial void OnCreated();
+		#endregion
+
+		#region Construction
+		public AlgorithmParameterBlobValue()
+		{
+			Initialize();
+		}
+		
+		private void Initialize()
+		{
+			_AlgorithmParameter = default(EntityRef<AlgorithmParameter>);
+			_Experiment = default(EntityRef<Experiment>);
+			_DataType = default(EntityRef<DataType>);
+			OnCreated();
+		}
+		#endregion
+
+		#region Column Mappings
+		partial void OnAlgorithmParameterIdChanging(long value);
+		partial void OnAlgorithmParameterIdChanged();
+		private long _AlgorithmParameterId;
+		[Column(Storage=@"_AlgorithmParameterId", DbType=@"BigInt NOT NULL", IsPrimaryKey=true, UpdateCheck=UpdateCheck.Never)]
+		[DataMember(Order=1)]
+		public long AlgorithmParameterId
+		{
+			get { return _AlgorithmParameterId; }
+			set {
+				if (_AlgorithmParameterId != value) {
+					if (_AlgorithmParameter.HasLoadedOrAssignedValue) {
+						throw new ForeignKeyReferenceAlreadyHasValueException();
+					}
+					OnAlgorithmParameterIdChanging(value);
+					SendPropertyChanging();
+					_AlgorithmParameterId = value;
+					SendPropertyChanged("AlgorithmParameterId");
+					OnAlgorithmParameterIdChanged();
+				}
+			}
+		}
+		
+		partial void OnExperimentIdChanging(long value);
+		partial void OnExperimentIdChanged();
+		private long _ExperimentId;
+		[Column(Storage=@"_ExperimentId", DbType=@"BigInt NOT NULL", IsPrimaryKey=true, UpdateCheck=UpdateCheck.Never)]
+		[DataMember(Order=2)]
+		public long ExperimentId
+		{
+			get { return _ExperimentId; }
+			set {
+				if (_ExperimentId != value) {
+					if (_Experiment.HasLoadedOrAssignedValue) {
+						throw new ForeignKeyReferenceAlreadyHasValueException();
+					}
+					OnExperimentIdChanging(value);
+					SendPropertyChanging();
+					_ExperimentId = value;
+					SendPropertyChanged("ExperimentId");
+					OnExperimentIdChanged();
+				}
+			}
+		}
+		
+		partial void OnDataTypeIdChanging(long value);
+		partial void OnDataTypeIdChanged();
+		private long _DataTypeId;
+		[Column(Storage=@"_DataTypeId", DbType=@"BigInt NOT NULL", CanBeNull=false)]
+		[DataMember(Order=3)]
+		public long DataTypeId
+		{
+			get { return _DataTypeId; }
+			set {
+				if (_DataTypeId != value) {
+					if (_DataType.HasLoadedOrAssignedValue) {
+						throw new ForeignKeyReferenceAlreadyHasValueException();
+					}
+					OnDataTypeIdChanging(value);
+					SendPropertyChanging();
+					_DataTypeId = value;
+					SendPropertyChanged("DataTypeId");
+					OnDataTypeIdChanged();
+				}
+			}
+		}
+		
+		partial void OnValueChanging(Binary value);
+		partial void OnValueChanged();
+		private Binary _Value;
+		[Column(Storage=@"_Value", DbType=@"VarBinary(MAX) NOT NULL", CanBeNull=false, UpdateCheck=UpdateCheck.Never)]
+		[DataMember(Order=4)]
+		public Binary Value
+		{
+			get { return _Value; }
+			set {
+				if (_Value != value) {
+					OnValueChanging(value);
+					SendPropertyChanging();
+					_Value = value;
+					SendPropertyChanged("Value");
+					OnValueChanged();
+				}
+			}
+		}
+		
+		#endregion
+		
+		#region Associations
+		private EntityRef<AlgorithmParameter> _AlgorithmParameter;
+		[Association(Name=@"AlgorithmParameter_AlgorithmParameterBlobValue", Storage=@"_AlgorithmParameter", ThisKey=@"AlgorithmParameterId", OtherKey=@"Id", IsForeignKey=true)]
+		[DataMember(Order=5, EmitDefaultValue=false)]
+		public AlgorithmParameter AlgorithmParameter
+		{
+			get {
+				return _AlgorithmParameter.Entity;
+			}
+			set {
+				AlgorithmParameter previousValue = _AlgorithmParameter.Entity;
+				if ((previousValue != value) || (!_AlgorithmParameter.HasLoadedOrAssignedValue)) {
+					SendPropertyChanging();
+					if (previousValue != null) {
+						_AlgorithmParameter.Entity = null;
+						previousValue.AlgorithmParameterBlobValues.Remove(this);
+					}
+					_AlgorithmParameter.Entity = value;
+					if (value != null) {
+						value.AlgorithmParameterBlobValues.Add(this);
+						_AlgorithmParameterId = value.Id;
+					}
+					else {
+						_AlgorithmParameterId = default(long);
+					}
+					SendPropertyChanged("AlgorithmParameter");
+				}
+			}
+		}
+
+		private EntityRef<Experiment> _Experiment;
+		[Association(Name=@"Experiment_AlgorithmParameterBlobValue", Storage=@"_Experiment", ThisKey=@"ExperimentId", OtherKey=@"Id", IsForeignKey=true)]
+		[DataMember(Order=6, EmitDefaultValue=false)]
+		public Experiment Experiment
+		{
+			get {
+				return _Experiment.Entity;
+			}
+			set {
+				Experiment previousValue = _Experiment.Entity;
+				if ((previousValue != value) || (!_Experiment.HasLoadedOrAssignedValue)) {
+					SendPropertyChanging();
+					if (previousValue != null) {
+						_Experiment.Entity = null;
+						previousValue.AlgorithmParameterBlobValues.Remove(this);
+					}
+					_Experiment.Entity = value;
+					if (value != null) {
+						value.AlgorithmParameterBlobValues.Add(this);
+						_ExperimentId = value.Id;
+					}
+					else {
+						_ExperimentId = default(long);
+					}
+					SendPropertyChanged("Experiment");
+				}
+			}
+		}
+
+		private EntityRef<DataType> _DataType;
+		[Association(Name=@"DataType_AlgorithmParameterBlobValue", Storage=@"_DataType", ThisKey=@"DataTypeId", OtherKey=@"Id", IsForeignKey=true)]
+		[DataMember(Order=7, EmitDefaultValue=false)]
+		public DataType DataType
+		{
+			get {
+				return _DataType.Entity;
+			}
+			set {
+				DataType previousValue = _DataType.Entity;
+				if ((previousValue != value) || (!_DataType.HasLoadedOrAssignedValue)) {
+					SendPropertyChanging();
+					if (previousValue != null) {
+						_DataType.Entity = null;
+						previousValue.AlgorithmParameterBlobValues.Remove(this);
+					}
+					_DataType.Entity = value;
+					if (value != null) {
+						value.AlgorithmParameterBlobValues.Add(this);
+						_DataTypeId = value.Id;
+					}
+					else {
+						_DataTypeId = default(long);
+					}
+					SendPropertyChanged("DataType");
+				}
+			}
+		}
+
+		#endregion
+		
+		#region Serialization
+		[OnDeserializing()]
+		[EditorBrowsableAttribute(EditorBrowsableState.Never)]
+		public  void OnDeserializing(StreamingContext context)
+		{
+			Initialize();
+		}
+		#endregion
+	}
+}
+
+namespace HeuristicLab.Services.OKB.DataAccess
+{	
+	[DataContract(IsReference=true)]
+	[Table(Name=@"dbo.DataType")]
+[KnownType(typeof(DataType))]	public partial class DataType : INotifyPropertyChanging, INotifyPropertyChanged
+	{
+		#region Property Change Event Handling
+		private static PropertyChangingEventArgs emptyChangingEventArgs = new PropertyChangingEventArgs(String.Empty);
+		
+		public event PropertyChangingEventHandler PropertyChanging;
+		public event PropertyChangedEventHandler PropertyChanged;
+		
+		public virtual void SendPropertyChanging()
+		{
+			if (PropertyChanging != null) {
+				PropertyChanging(this, emptyChangingEventArgs);
+			}
+		}
+			
+		public virtual void SendPropertyChanged(String propertyName)
+		{
+			if (PropertyChanged != null) {
+				PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
+			}
+		}
+		#endregion
+		
+		#region Extensibility Method Definitions
+		partial void OnLoaded();
+		partial void OnValidate(ChangeAction action);
+		partial void OnCreated();
+		#endregion
+
+		#region Construction
+		public DataType()
+		{
+			Initialize();
+		}
+		
+		private void Initialize()
+		{
+			_AlgorithmParameters = new EntitySet<AlgorithmParameter>(attach_AlgorithmParameters, detach_AlgorithmParameters);
+			_ProblemParameters = new EntitySet<ProblemParameter>(attach_ProblemParameters, detach_ProblemParameters);
+			_Results = new EntitySet<Result>(attach_Results, detach_Results);
+			_AlgorithmParameterBlobValues = new EntitySet<AlgorithmParameterBlobValue>(attach_AlgorithmParameterBlobValues, detach_AlgorithmParameterBlobValues);
+			_AlgorithmParameterBoolValues = new EntitySet<AlgorithmParameterBoolValue>(attach_AlgorithmParameterBoolValues, detach_AlgorithmParameterBoolValues);
+			_AlgorithmParameterFloatValues = new EntitySet<AlgorithmParameterFloatValue>(attach_AlgorithmParameterFloatValues, detach_AlgorithmParameterFloatValues);
+			_AlgorithmParameterIntValues = new EntitySet<AlgorithmParameterIntValue>(attach_AlgorithmParameterIntValues, detach_AlgorithmParameterIntValues);
+			_AlgorithmParameterStringValues = new EntitySet<AlgorithmParameterStringValue>(attach_AlgorithmParameterStringValues, detach_AlgorithmParameterStringValues);
+			_ProblemParameterBlobValues = new EntitySet<ProblemParameterBlobValue>(attach_ProblemParameterBlobValues, detach_ProblemParameterBlobValues);
+			_ProblemParameterBoolValues = new EntitySet<ProblemParameterBoolValue>(attach_ProblemParameterBoolValues, detach_ProblemParameterBoolValues);
+			_ProblemParameterFloatValues = new EntitySet<ProblemParameterFloatValue>(attach_ProblemParameterFloatValues, detach_ProblemParameterFloatValues);
+			_ProblemParameterIntValues = new EntitySet<ProblemParameterIntValue>(attach_ProblemParameterIntValues, detach_ProblemParameterIntValues);
+			_ProblemParameterStringValues = new EntitySet<ProblemParameterStringValue>(attach_ProblemParameterStringValues, detach_ProblemParameterStringValues);
+			_ResultBlobValues = new EntitySet<ResultBlobValue>(attach_ResultBlobValues, detach_ResultBlobValues);
+			_ResultBoolValues = new EntitySet<ResultBoolValue>(attach_ResultBoolValues, detach_ResultBoolValues);
+			_ResultFloatValues = new EntitySet<ResultFloatValue>(attach_ResultFloatValues, detach_ResultFloatValues);
+			_ResultIntValues = new EntitySet<ResultIntValue>(attach_ResultIntValues, detach_ResultIntValues);
+			_ResultStringValues = new EntitySet<ResultStringValue>(attach_ResultStringValues, detach_ResultStringValues);
+			_Platform = default(EntityRef<Platform>);
+			OnCreated();
+		}
+		#endregion
+
+		#region Column Mappings
+		partial void OnIdChanging(long value);
+		partial void OnIdChanged();
+		private long _Id;
+		[Column(Storage=@"_Id", AutoSync=AutoSync.OnInsert, DbType=@"BigInt NOT NULL IDENTITY", IsPrimaryKey=true, IsDbGenerated=true, UpdateCheck=UpdateCheck.Never)]
+		[DataMember(Order=1)]
+		public long Id
+		{
+			get { return _Id; }
+			set {
+				if (_Id != value) {
+					OnIdChanging(value);
+					SendPropertyChanging();
+					_Id = value;
+					SendPropertyChanged("Id");
+					OnIdChanged();
+				}
+			}
+		}
+		
+		partial void OnPlatformIdChanging(long value);
+		partial void OnPlatformIdChanged();
+		private long _PlatformId;
+		[Column(Storage=@"_PlatformId", DbType=@"BigInt NOT NULL", CanBeNull=false)]
+		[DataMember(Order=2)]
+		public long PlatformId
+		{
+			get { return _PlatformId; }
+			set {
+				if (_PlatformId != value) {
+					if (_Platform.HasLoadedOrAssignedValue) {
+						throw new ForeignKeyReferenceAlreadyHasValueException();
+					}
+					OnPlatformIdChanging(value);
+					SendPropertyChanging();
+					_PlatformId = value;
+					SendPropertyChanged("PlatformId");
+					OnPlatformIdChanged();
+				}
+			}
+		}
+		
+		partial void OnNameChanging(string value);
+		partial void OnNameChanged();
+		private string _Name;
+		[Column(Storage=@"_Name", DbType=@"NVarChar(MAX) NOT NULL", CanBeNull=false)]
+		[DataMember(Order=3)]
+		public string Name
+		{
+			get { return _Name; }
+			set {
+				if (_Name != value) {
+					OnNameChanging(value);
+					SendPropertyChanging();
+					_Name = value;
+					SendPropertyChanged("Name");
+					OnNameChanged();
+				}
+			}
+		}
+		
+		partial void OnSqlNameChanging(string value);
+		partial void OnSqlNameChanged();
+		private string _SqlName;
+		[Column(Storage=@"_SqlName", DbType=@"NVarChar(200) NOT NULL", CanBeNull=false)]
+		[DataMember(Order=4)]
+		public string SqlName
+		{
+			get { return _SqlName; }
+			set {
+				if (_SqlName != value) {
+					OnSqlNameChanging(value);
+					SendPropertyChanging();
+					_SqlName = value;
+					SendPropertyChanged("SqlName");
+					OnSqlNameChanged();
+				}
+			}
+		}
+		
+		#endregion
+		
+		#region Associations
+		private EntitySet<AlgorithmParameter> _AlgorithmParameters;
+		[Association(Name=@"DataType_AlgorithmParameter", Storage=@"_AlgorithmParameters", ThisKey=@"Id", OtherKey=@"DataTypeId")]
+		[DataMember(Order=5, EmitDefaultValue=false)]
+		public EntitySet<AlgorithmParameter> AlgorithmParameters
+		{
+			get {
+				if (serializing && !_AlgorithmParameters.HasLoadedOrAssignedValues) {
+					return null;
+				}
+				return _AlgorithmParameters;
+			}
+			set {
+				_AlgorithmParameters.Assign(value);
+			}
+		}
+
+		private void attach_AlgorithmParameters(AlgorithmParameter entity)
+		{
+			SendPropertyChanging();
+			entity.DataType = this;
+		}
+		
+		private void detach_AlgorithmParameters(AlgorithmParameter entity)
+		{
+			SendPropertyChanging();
+			entity.DataType = null;
+		}
+		private EntitySet<ProblemParameter> _ProblemParameters;
+		[Association(Name=@"DataType_ProblemParameter", Storage=@"_ProblemParameters", ThisKey=@"Id", OtherKey=@"DataTypeId")]
+		[DataMember(Order=6, EmitDefaultValue=false)]
+		public EntitySet<ProblemParameter> ProblemParameters
+		{
+			get {
+				if (serializing && !_ProblemParameters.HasLoadedOrAssignedValues) {
+					return null;
+				}
+				return _ProblemParameters;
+			}
+			set {
+				_ProblemParameters.Assign(value);
+			}
+		}
+
+		private void attach_ProblemParameters(ProblemParameter entity)
+		{
+			SendPropertyChanging();
+			entity.DataType = this;
+		}
+		
+		private void detach_ProblemParameters(ProblemParameter entity)
+		{
+			SendPropertyChanging();
+			entity.DataType = null;
+		}
+		private EntitySet<Result> _Results;
+		[Association(Name=@"DataType_Result", Storage=@"_Results", ThisKey=@"Id", OtherKey=@"DataTypeId")]
+		[DataMember(Order=7, EmitDefaultValue=false)]
+		public EntitySet<Result> Results
+		{
+			get {
+				if (serializing && !_Results.HasLoadedOrAssignedValues) {
+					return null;
+				}
+				return _Results;
+			}
+			set {
+				_Results.Assign(value);
+			}
+		}
+
+		private void attach_Results(Result entity)
+		{
+			SendPropertyChanging();
+			entity.DataType = this;
+		}
+		
+		private void detach_Results(Result entity)
+		{
+			SendPropertyChanging();
+			entity.DataType = null;
+		}
+		private EntitySet<AlgorithmParameterBlobValue> _AlgorithmParameterBlobValues;
+		[Association(Name=@"DataType_AlgorithmParameterBlobValue", Storage=@"_AlgorithmParameterBlobValues", ThisKey=@"Id", OtherKey=@"DataTypeId")]
+		[DataMember(Order=8, EmitDefaultValue=false)]
+		public EntitySet<AlgorithmParameterBlobValue> AlgorithmParameterBlobValues
+		{
+			get {
+				if (serializing && !_AlgorithmParameterBlobValues.HasLoadedOrAssignedValues) {
+					return null;
+				}
+				return _AlgorithmParameterBlobValues;
+			}
+			set {
+				_AlgorithmParameterBlobValues.Assign(value);
+			}
+		}
+
+		private void attach_AlgorithmParameterBlobValues(AlgorithmParameterBlobValue entity)
+		{
+			SendPropertyChanging();
+			entity.DataType = this;
+		}
+		
+		private void detach_AlgorithmParameterBlobValues(AlgorithmParameterBlobValue entity)
+		{
+			SendPropertyChanging();
+			entity.DataType = null;
+		}
+		private EntitySet<AlgorithmParameterBoolValue> _AlgorithmParameterBoolValues;
+		[Association(Name=@"DataType_AlgorithmParameterBoolValue", Storage=@"_AlgorithmParameterBoolValues", ThisKey=@"Id", OtherKey=@"DataTypeId")]
+		[DataMember(Order=9, EmitDefaultValue=false)]
+		public EntitySet<AlgorithmParameterBoolValue> AlgorithmParameterBoolValues
+		{
+			get {
+				if (serializing && !_AlgorithmParameterBoolValues.HasLoadedOrAssignedValues) {
+					return null;
+				}
+				return _AlgorithmParameterBoolValues;
+			}
+			set {
+				_AlgorithmParameterBoolValues.Assign(value);
+			}
+		}
+
+		private void attach_AlgorithmParameterBoolValues(AlgorithmParameterBoolValue entity)
+		{
+			SendPropertyChanging();
+			entity.DataType = this;
+		}
+		
+		private void detach_AlgorithmParameterBoolValues(AlgorithmParameterBoolValue entity)
+		{
+			SendPropertyChanging();
+			entity.DataType = null;
+		}
+		private EntitySet<AlgorithmParameterFloatValue> _AlgorithmParameterFloatValues;
+		[Association(Name=@"DataType_AlgorithmParameterFloatValue", Storage=@"_AlgorithmParameterFloatValues", ThisKey=@"Id", OtherKey=@"DataTypeId")]
+		[DataMember(Order=10, EmitDefaultValue=false)]
+		public EntitySet<AlgorithmParameterFloatValue> AlgorithmParameterFloatValues
+		{
+			get {
+				if (serializing && !_AlgorithmParameterFloatValues.HasLoadedOrAssignedValues) {
+					return null;
+				}
+				return _AlgorithmParameterFloatValues;
+			}
+			set {
+				_AlgorithmParameterFloatValues.Assign(value);
+			}
+		}
+
+		private void attach_AlgorithmParameterFloatValues(AlgorithmParameterFloatValue entity)
+		{
+			SendPropertyChanging();
+			entity.DataType = this;
+		}
+		
+		private void detach_AlgorithmParameterFloatValues(AlgorithmParameterFloatValue entity)
+		{
+			SendPropertyChanging();
+			entity.DataType = null;
+		}
+		private EntitySet<AlgorithmParameterIntValue> _AlgorithmParameterIntValues;
+		[Association(Name=@"DataType_AlgorithmParameterIntValue", Storage=@"_AlgorithmParameterIntValues", ThisKey=@"Id", OtherKey=@"DataTypeId")]
+		[DataMember(Order=11, EmitDefaultValue=false)]
+		public EntitySet<AlgorithmParameterIntValue> AlgorithmParameterIntValues
+		{
+			get {
+				if (serializing && !_AlgorithmParameterIntValues.HasLoadedOrAssignedValues) {
+					return null;
+				}
+				return _AlgorithmParameterIntValues;
+			}
+			set {
+				_AlgorithmParameterIntValues.Assign(value);
+			}
+		}
+
+		private void attach_AlgorithmParameterIntValues(AlgorithmParameterIntValue entity)
+		{
+			SendPropertyChanging();
+			entity.DataType = this;
+		}
+		
+		private void detach_AlgorithmParameterIntValues(AlgorithmParameterIntValue entity)
+		{
+			SendPropertyChanging();
+			entity.DataType = null;
+		}
+		private EntitySet<AlgorithmParameterStringValue> _AlgorithmParameterStringValues;
+		[Association(Name=@"DataType_AlgorithmParameterStringValue", Storage=@"_AlgorithmParameterStringValues", ThisKey=@"Id", OtherKey=@"DataTypeId")]
+		[DataMember(Order=12, EmitDefaultValue=false)]
+		public EntitySet<AlgorithmParameterStringValue> AlgorithmParameterStringValues
+		{
+			get {
+				if (serializing && !_AlgorithmParameterStringValues.HasLoadedOrAssignedValues) {
+					return null;
+				}
+				return _AlgorithmParameterStringValues;
+			}
+			set {
+				_AlgorithmParameterStringValues.Assign(value);
+			}
+		}
+
+		private void attach_AlgorithmParameterStringValues(AlgorithmParameterStringValue entity)
+		{
+			SendPropertyChanging();
+			entity.DataType = this;
+		}
+		
+		private void detach_AlgorithmParameterStringValues(AlgorithmParameterStringValue entity)
+		{
+			SendPropertyChanging();
+			entity.DataType = null;
+		}
+		private EntitySet<ProblemParameterBlobValue> _ProblemParameterBlobValues;
+		[Association(Name=@"DataType_ProblemParameterBlobValue", Storage=@"_ProblemParameterBlobValues", ThisKey=@"Id", OtherKey=@"DataTypeId")]
+		[DataMember(Order=13, EmitDefaultValue=false)]
+		public EntitySet<ProblemParameterBlobValue> ProblemParameterBlobValues
+		{
+			get {
+				if (serializing && !_ProblemParameterBlobValues.HasLoadedOrAssignedValues) {
+					return null;
+				}
+				return _ProblemParameterBlobValues;
+			}
+			set {
+				_ProblemParameterBlobValues.Assign(value);
+			}
+		}
+
+		private void attach_ProblemParameterBlobValues(ProblemParameterBlobValue entity)
+		{
+			SendPropertyChanging();
+			entity.DataType = this;
+		}
+		
+		private void detach_ProblemParameterBlobValues(ProblemParameterBlobValue entity)
+		{
+			SendPropertyChanging();
+			entity.DataType = null;
+		}
+		private EntitySet<ProblemParameterBoolValue> _ProblemParameterBoolValues;
+		[Association(Name=@"DataType_ProblemParameterBoolValue", Storage=@"_ProblemParameterBoolValues", ThisKey=@"Id", OtherKey=@"DataTypeId")]
+		[DataMember(Order=14, EmitDefaultValue=false)]
+		public EntitySet<ProblemParameterBoolValue> ProblemParameterBoolValues
+		{
+			get {
+				if (serializing && !_ProblemParameterBoolValues.HasLoadedOrAssignedValues) {
+					return null;
+				}
+				return _ProblemParameterBoolValues;
+			}
+			set {
+				_ProblemParameterBoolValues.Assign(value);
+			}
+		}
+
+		private void attach_ProblemParameterBoolValues(ProblemParameterBoolValue entity)
+		{
+			SendPropertyChanging();
+			entity.DataType = this;
+		}
+		
+		private void detach_ProblemParameterBoolValues(ProblemParameterBoolValue entity)
+		{
+			SendPropertyChanging();
+			entity.DataType = null;
+		}
+		private EntitySet<ProblemParameterFloatValue> _ProblemParameterFloatValues;
+		[Association(Name=@"DataType_ProblemParameterFloatValue", Storage=@"_ProblemParameterFloatValues", ThisKey=@"Id", OtherKey=@"DataTypeId")]
+		[DataMember(Order=15, EmitDefaultValue=false)]
+		public EntitySet<ProblemParameterFloatValue> ProblemParameterFloatValues
+		{
+			get {
+				if (serializing && !_ProblemParameterFloatValues.HasLoadedOrAssignedValues) {
+					return null;
+				}
+				return _ProblemParameterFloatValues;
+			}
+			set {
+				_ProblemParameterFloatValues.Assign(value);
+			}
+		}
+
+		private void attach_ProblemParameterFloatValues(ProblemParameterFloatValue entity)
+		{
+			SendPropertyChanging();
+			entity.DataType = this;
+		}
+		
+		private void detach_ProblemParameterFloatValues(ProblemParameterFloatValue entity)
+		{
+			SendPropertyChanging();
+			entity.DataType = null;
+		}
+		private EntitySet<ProblemParameterIntValue> _ProblemParameterIntValues;
+		[Association(Name=@"DataType_ProblemParameterIntValue", Storage=@"_ProblemParameterIntValues", ThisKey=@"Id", OtherKey=@"DataTypeId")]
+		[DataMember(Order=16, EmitDefaultValue=false)]
+		public EntitySet<ProblemParameterIntValue> ProblemParameterIntValues
+		{
+			get {
+				if (serializing && !_ProblemParameterIntValues.HasLoadedOrAssignedValues) {
+					return null;
+				}
+				return _ProblemParameterIntValues;
+			}
+			set {
+				_ProblemParameterIntValues.Assign(value);
+			}
+		}
+
+		private void attach_ProblemParameterIntValues(ProblemParameterIntValue entity)
+		{
+			SendPropertyChanging();
+			entity.DataType = this;
+		}
+		
+		private void detach_ProblemParameterIntValues(ProblemParameterIntValue entity)
+		{
+			SendPropertyChanging();
+			entity.DataType = null;
+		}
+		private EntitySet<ProblemParameterStringValue> _ProblemParameterStringValues;
+		[Association(Name=@"DataType_ProblemParameterStringValue", Storage=@"_ProblemParameterStringValues", ThisKey=@"Id", OtherKey=@"DataTypeId")]
+		[DataMember(Order=17, EmitDefaultValue=false)]
+		public EntitySet<ProblemParameterStringValue> ProblemParameterStringValues
+		{
+			get {
+				if (serializing && !_ProblemParameterStringValues.HasLoadedOrAssignedValues) {
+					return null;
+				}
+				return _ProblemParameterStringValues;
+			}
+			set {
+				_ProblemParameterStringValues.Assign(value);
+			}
+		}
+
+		private void attach_ProblemParameterStringValues(ProblemParameterStringValue entity)
+		{
+			SendPropertyChanging();
+			entity.DataType = this;
+		}
+		
+		private void detach_ProblemParameterStringValues(ProblemParameterStringValue entity)
+		{
+			SendPropertyChanging();
+			entity.DataType = null;
+		}
+		private EntitySet<ResultBlobValue> _ResultBlobValues;
+		[Association(Name=@"DataType_ResultBlobValue", Storage=@"_ResultBlobValues", ThisKey=@"Id", OtherKey=@"DataTypeId")]
+		[DataMember(Order=18, EmitDefaultValue=false)]
+		public EntitySet<ResultBlobValue> ResultBlobValues
+		{
+			get {
+				if (serializing && !_ResultBlobValues.HasLoadedOrAssignedValues) {
+					return null;
+				}
+				return _ResultBlobValues;
+			}
+			set {
+				_ResultBlobValues.Assign(value);
+			}
+		}
+
+		private void attach_ResultBlobValues(ResultBlobValue entity)
+		{
+			SendPropertyChanging();
+			entity.DataType = this;
+		}
+		
+		private void detach_ResultBlobValues(ResultBlobValue entity)
+		{
+			SendPropertyChanging();
+			entity.DataType = null;
+		}
+		private EntitySet<ResultBoolValue> _ResultBoolValues;
+		[Association(Name=@"DataType_ResultBoolValue", Storage=@"_ResultBoolValues", ThisKey=@"Id", OtherKey=@"DataTypeId")]
+		[DataMember(Order=19, EmitDefaultValue=false)]
+		public EntitySet<ResultBoolValue> ResultBoolValues
+		{
+			get {
+				if (serializing && !_ResultBoolValues.HasLoadedOrAssignedValues) {
+					return null;
+				}
+				return _ResultBoolValues;
+			}
+			set {
+				_ResultBoolValues.Assign(value);
+			}
+		}
+
+		private void attach_ResultBoolValues(ResultBoolValue entity)
+		{
+			SendPropertyChanging();
+			entity.DataType = this;
+		}
+		
+		private void detach_ResultBoolValues(ResultBoolValue entity)
+		{
+			SendPropertyChanging();
+			entity.DataType = null;
+		}
+		private EntitySet<ResultFloatValue> _ResultFloatValues;
+		[Association(Name=@"DataType_ResultFloatValue", Storage=@"_ResultFloatValues", ThisKey=@"Id", OtherKey=@"DataTypeId")]
+		[DataMember(Order=20, EmitDefaultValue=false)]
+		public EntitySet<ResultFloatValue> ResultFloatValues
+		{
+			get {
+				if (serializing && !_ResultFloatValues.HasLoadedOrAssignedValues) {
+					return null;
+				}
+				return _ResultFloatValues;
+			}
+			set {
+				_ResultFloatValues.Assign(value);
+			}
+		}
+
+		private void attach_ResultFloatValues(ResultFloatValue entity)
+		{
+			SendPropertyChanging();
+			entity.DataType = this;
+		}
+		
+		private void detach_ResultFloatValues(ResultFloatValue entity)
+		{
+			SendPropertyChanging();
+			entity.DataType = null;
+		}
+		private EntitySet<ResultIntValue> _ResultIntValues;
+		[Association(Name=@"DataType_ResultIntValue", Storage=@"_ResultIntValues", ThisKey=@"Id", OtherKey=@"DataTypeId")]
+		[DataMember(Order=21, EmitDefaultValue=false)]
+		public EntitySet<ResultIntValue> ResultIntValues
+		{
+			get {
+				if (serializing && !_ResultIntValues.HasLoadedOrAssignedValues) {
+					return null;
+				}
+				return _ResultIntValues;
+			}
+			set {
+				_ResultIntValues.Assign(value);
+			}
+		}
+
+		private void attach_ResultIntValues(ResultIntValue entity)
+		{
+			SendPropertyChanging();
+			entity.DataType = this;
+		}
+		
+		private void detach_ResultIntValues(ResultIntValue entity)
+		{
+			SendPropertyChanging();
+			entity.DataType = null;
+		}
+		private EntitySet<ResultStringValue> _ResultStringValues;
+		[Association(Name=@"DataType_ResultStringValue", Storage=@"_ResultStringValues", ThisKey=@"Id", OtherKey=@"DataTypeId")]
+		[DataMember(Order=22, EmitDefaultValue=false)]
+		public EntitySet<ResultStringValue> ResultStringValues
+		{
+			get {
+				if (serializing && !_ResultStringValues.HasLoadedOrAssignedValues) {
+					return null;
+				}
+				return _ResultStringValues;
+			}
+			set {
+				_ResultStringValues.Assign(value);
+			}
+		}
+
+		private void attach_ResultStringValues(ResultStringValue entity)
+		{
+			SendPropertyChanging();
+			entity.DataType = this;
+		}
+		
+		private void detach_ResultStringValues(ResultStringValue entity)
+		{
+			SendPropertyChanging();
+			entity.DataType = null;
+		}
+		private EntityRef<Platform> _Platform;
+		[Association(Name=@"Platform_DataType", Storage=@"_Platform", ThisKey=@"PlatformId", OtherKey=@"Id", IsForeignKey=true)]
+		[DataMember(Order=23, EmitDefaultValue=false)]
+		public Platform Platform
+		{
+			get {
+				if (serializing && !_Platform.HasLoadedOrAssignedValue) {
+					return null;
+				}
+				return _Platform.Entity;
+			}
+			set {
+				Platform previousValue = _Platform.Entity;
+				if ((previousValue != value) || (!_Platform.HasLoadedOrAssignedValue)) {
+					SendPropertyChanging();
+					if (previousValue != null) {
+						_Platform.Entity = null;
+						previousValue.DataTypes.Remove(this);
+					}
+					_Platform.Entity = value;
+					if (value != null) {
+						value.DataTypes.Add(this);
+						_PlatformId = value.Id;
+					}
+					else {
+						_PlatformId = default(long);
+					}
+					SendPropertyChanged("Platform");
+				}
+			}
+		}
+
+		#endregion
+		
+		#region Serialization
+		private bool serializing;
+		
+		[OnSerializing()]
+		[EditorBrowsableAttribute(EditorBrowsableState.Never)]
+		public void OnSerializing(StreamingContext context)
+		{
+			serializing = true;
+		}
+		
+		[OnSerialized()]
+		[EditorBrowsableAttribute(EditorBrowsableState.Never)]
+		public void OnSerialized(StreamingContext context)
+		{
+			serializing = false;
+		}
+		
+		[OnDeserializing()]
+		[EditorBrowsableAttribute(EditorBrowsableState.Never)]
+		public  void OnDeserializing(StreamingContext context)
+		{
+			Initialize();
+		}
+		#endregion
+	}
+}
+
+namespace HeuristicLab.Services.OKB.DataAccess
+{	
+	[DataContract(IsReference=true)]
+	[Table(Name=@"dbo.AlgorithmParameterBoolValue")]
+[KnownType(typeof(AlgorithmParameterBoolValue))]	public partial class AlgorithmParameterBoolValue : INotifyPropertyChanging, INotifyPropertyChanged
+	{
+		#region Property Change Event Handling
+		private static PropertyChangingEventArgs emptyChangingEventArgs = new PropertyChangingEventArgs(String.Empty);
+		
+		public event PropertyChangingEventHandler PropertyChanging;
+		public event PropertyChangedEventHandler PropertyChanged;
+		
+		public virtual void SendPropertyChanging()
+		{
+			if (PropertyChanging != null) {
+				PropertyChanging(this, emptyChangingEventArgs);
+			}
+		}
+			
+		public virtual void SendPropertyChanged(String propertyName)
+		{
+			if (PropertyChanged != null) {
+				PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
+			}
+		}
+		#endregion
+		
+		#region Extensibility Method Definitions
+		partial void OnLoaded();
+		partial void OnValidate(ChangeAction action);
+		partial void OnCreated();
+		#endregion
+
+		#region Construction
+		public AlgorithmParameterBoolValue()
+		{
+			Initialize();
+		}
+		
+		private void Initialize()
+		{
+			_AlgorithmParameter = default(EntityRef<AlgorithmParameter>);
+			_DataType = default(EntityRef<DataType>);
+			_Experiment = default(EntityRef<Experiment>);
+			OnCreated();
+		}
+		#endregion
+
+		#region Column Mappings
+		partial void OnAlgorithmParameterIdChanging(long value);
+		partial void OnAlgorithmParameterIdChanged();
+		private long _AlgorithmParameterId;
+		[Column(Storage=@"_AlgorithmParameterId", DbType=@"BigInt NOT NULL", IsPrimaryKey=true, UpdateCheck=UpdateCheck.Never)]
+		[DataMember(Order=1)]
+		public long AlgorithmParameterId
+		{
+			get { return _AlgorithmParameterId; }
+			set {
+				if (_AlgorithmParameterId != value) {
+					if (_AlgorithmParameter.HasLoadedOrAssignedValue) {
+						throw new ForeignKeyReferenceAlreadyHasValueException();
+					}
+					OnAlgorithmParameterIdChanging(value);
+					SendPropertyChanging();
+					_AlgorithmParameterId = value;
+					SendPropertyChanged("AlgorithmParameterId");
+					OnAlgorithmParameterIdChanged();
+				}
+			}
+		}
+		
+		partial void OnExperimentIdChanging(long value);
+		partial void OnExperimentIdChanged();
+		private long _ExperimentId;
+		[Column(Storage=@"_ExperimentId", DbType=@"BigInt NOT NULL", IsPrimaryKey=true, UpdateCheck=UpdateCheck.Never)]
+		[DataMember(Order=2)]
+		public long ExperimentId
+		{
+			get { return _ExperimentId; }
+			set {
+				if (_ExperimentId != value) {
+					if (_Experiment.HasLoadedOrAssignedValue) {
+						throw new ForeignKeyReferenceAlreadyHasValueException();
+					}
+					OnExperimentIdChanging(value);
+					SendPropertyChanging();
+					_ExperimentId = value;
+					SendPropertyChanged("ExperimentId");
+					OnExperimentIdChanged();
+				}
+			}
+		}
+		
+		partial void OnDataTypeIdChanging(long value);
+		partial void OnDataTypeIdChanged();
+		private long _DataTypeId;
+		[Column(Storage=@"_DataTypeId", DbType=@"BigInt NOT NULL", CanBeNull=false)]
+		[DataMember(Order=3)]
+		public long DataTypeId
+		{
+			get { return _DataTypeId; }
+			set {
+				if (_DataTypeId != value) {
+					if (_DataType.HasLoadedOrAssignedValue) {
+						throw new ForeignKeyReferenceAlreadyHasValueException();
+					}
+					OnDataTypeIdChanging(value);
+					SendPropertyChanging();
+					_DataTypeId = value;
+					SendPropertyChanged("DataTypeId");
+					OnDataTypeIdChanged();
+				}
+			}
+		}
+		
+		partial void OnValueChanging(bool value);
+		partial void OnValueChanged();
+		private bool _Value;
+		[Column(Storage=@"_Value", DbType=@"Bit NOT NULL", CanBeNull=false)]
+		[DataMember(Order=4)]
+		public bool Value
+		{
+			get { return _Value; }
+			set {
+				if (_Value != value) {
+					OnValueChanging(value);
+					SendPropertyChanging();
+					_Value = value;
+					SendPropertyChanged("Value");
+					OnValueChanged();
+				}
+			}
+		}
+		
+		#endregion
+		
+		#region Associations
+		private EntityRef<AlgorithmParameter> _AlgorithmParameter;
+		[Association(Name=@"AlgorithmParameter_AlgorithmParameterBoolValue", Storage=@"_AlgorithmParameter", ThisKey=@"AlgorithmParameterId", OtherKey=@"Id", IsForeignKey=true)]
+		[DataMember(Order=5, EmitDefaultValue=false)]
+		public AlgorithmParameter AlgorithmParameter
+		{
+			get {
+				return _AlgorithmParameter.Entity;
+			}
+			set {
+				AlgorithmParameter previousValue = _AlgorithmParameter.Entity;
+				if ((previousValue != value) || (!_AlgorithmParameter.HasLoadedOrAssignedValue)) {
+					SendPropertyChanging();
+					if (previousValue != null) {
+						_AlgorithmParameter.Entity = null;
+						previousValue.AlgorithmParameterBoolValues.Remove(this);
+					}
+					_AlgorithmParameter.Entity = value;
+					if (value != null) {
+						value.AlgorithmParameterBoolValues.Add(this);
+						_AlgorithmParameterId = value.Id;
+					}
+					else {
+						_AlgorithmParameterId = default(long);
+					}
+					SendPropertyChanged("AlgorithmParameter");
+				}
+			}
+		}
+
+		private EntityRef<DataType> _DataType;
+		[Association(Name=@"DataType_AlgorithmParameterBoolValue", Storage=@"_DataType", ThisKey=@"DataTypeId", OtherKey=@"Id", IsForeignKey=true)]
+		[DataMember(Order=6, EmitDefaultValue=false)]
+		public DataType DataType
+		{
+			get {
+				return _DataType.Entity;
+			}
+			set {
+				DataType previousValue = _DataType.Entity;
+				if ((previousValue != value) || (!_DataType.HasLoadedOrAssignedValue)) {
+					SendPropertyChanging();
+					if (previousValue != null) {
+						_DataType.Entity = null;
+						previousValue.AlgorithmParameterBoolValues.Remove(this);
+					}
+					_DataType.Entity = value;
+					if (value != null) {
+						value.AlgorithmParameterBoolValues.Add(this);
+						_DataTypeId = value.Id;
+					}
+					else {
+						_DataTypeId = default(long);
+					}
+					SendPropertyChanged("DataType");
+				}
+			}
+		}
+
+		private EntityRef<Experiment> _Experiment;
+		[Association(Name=@"Experiment_AlgorithmParameterBoolValue", Storage=@"_Experiment", ThisKey=@"ExperimentId", OtherKey=@"Id", IsForeignKey=true)]
+		[DataMember(Order=7, EmitDefaultValue=false)]
+		public Experiment Experiment
+		{
+			get {
+				return _Experiment.Entity;
+			}
+			set {
+				Experiment previousValue = _Experiment.Entity;
+				if ((previousValue != value) || (!_Experiment.HasLoadedOrAssignedValue)) {
+					SendPropertyChanging();
+					if (previousValue != null) {
+						_Experiment.Entity = null;
+						previousValue.AlgorithmParameterBoolValues.Remove(this);
+					}
+					_Experiment.Entity = value;
+					if (value != null) {
+						value.AlgorithmParameterBoolValues.Add(this);
+						_ExperimentId = value.Id;
+					}
+					else {
+						_ExperimentId = default(long);
+					}
+					SendPropertyChanged("Experiment");
+				}
+			}
+		}
+
+		#endregion
+		
+		#region Serialization
+		[OnDeserializing()]
+		[EditorBrowsableAttribute(EditorBrowsableState.Never)]
+		public  void OnDeserializing(StreamingContext context)
+		{
+			Initialize();
+		}
+		#endregion
+	}
+}
+
+namespace HeuristicLab.Services.OKB.DataAccess
+{	
+	[DataContract(IsReference=true)]
+	[Table(Name=@"dbo.AlgorithmParameterFloatValue")]
+[KnownType(typeof(AlgorithmParameterFloatValue))]	public partial class AlgorithmParameterFloatValue : INotifyPropertyChanging, INotifyPropertyChanged
+	{
+		#region Property Change Event Handling
+		private static PropertyChangingEventArgs emptyChangingEventArgs = new PropertyChangingEventArgs(String.Empty);
+		
+		public event PropertyChangingEventHandler PropertyChanging;
+		public event PropertyChangedEventHandler PropertyChanged;
+		
+		public virtual void SendPropertyChanging()
+		{
+			if (PropertyChanging != null) {
+				PropertyChanging(this, emptyChangingEventArgs);
+			}
+		}
+			
+		public virtual void SendPropertyChanged(String propertyName)
+		{
+			if (PropertyChanged != null) {
+				PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
+			}
+		}
+		#endregion
+		
+		#region Extensibility Method Definitions
+		partial void OnLoaded();
+		partial void OnValidate(ChangeAction action);
+		partial void OnCreated();
+		#endregion
+
+		#region Construction
+		public AlgorithmParameterFloatValue()
+		{
+			Initialize();
+		}
+		
+		private void Initialize()
+		{
+			_AlgorithmParameter = default(EntityRef<AlgorithmParameter>);
+			_DataType = default(EntityRef<DataType>);
+			_Experiment = default(EntityRef<Experiment>);
+			OnCreated();
+		}
+		#endregion
+
+		#region Column Mappings
+		partial void OnAlgorithmParameterIdChanging(long value);
+		partial void OnAlgorithmParameterIdChanged();
+		private long _AlgorithmParameterId;
+		[Column(Storage=@"_AlgorithmParameterId", DbType=@"BigInt NOT NULL", IsPrimaryKey=true, UpdateCheck=UpdateCheck.Never)]
+		[DataMember(Order=1)]
+		public long AlgorithmParameterId
+		{
+			get { return _AlgorithmParameterId; }
+			set {
+				if (_AlgorithmParameterId != value) {
+					if (_AlgorithmParameter.HasLoadedOrAssignedValue) {
+						throw new ForeignKeyReferenceAlreadyHasValueException();
+					}
+					OnAlgorithmParameterIdChanging(value);
+					SendPropertyChanging();
+					_AlgorithmParameterId = value;
+					SendPropertyChanged("AlgorithmParameterId");
+					OnAlgorithmParameterIdChanged();
+				}
+			}
+		}
+		
+		partial void OnExperimentIdChanging(long value);
+		partial void OnExperimentIdChanged();
+		private long _ExperimentId;
+		[Column(Storage=@"_ExperimentId", DbType=@"BigInt NOT NULL", IsPrimaryKey=true, UpdateCheck=UpdateCheck.Never)]
+		[DataMember(Order=2)]
+		public long ExperimentId
+		{
+			get { return _ExperimentId; }
+			set {
+				if (_ExperimentId != value) {
+					if (_Experiment.HasLoadedOrAssignedValue) {
+						throw new ForeignKeyReferenceAlreadyHasValueException();
+					}
+					OnExperimentIdChanging(value);
+					SendPropertyChanging();
+					_ExperimentId = value;
+					SendPropertyChanged("ExperimentId");
+					OnExperimentIdChanged();
+				}
+			}
+		}
+		
+		partial void OnDataTypeIdChanging(long value);
+		partial void OnDataTypeIdChanged();
+		private long _DataTypeId;
+		[Column(Storage=@"_DataTypeId", DbType=@"BigInt NOT NULL", CanBeNull=false)]
+		[DataMember(Order=3)]
+		public long DataTypeId
+		{
+			get { return _DataTypeId; }
+			set {
+				if (_DataTypeId != value) {
+					if (_DataType.HasLoadedOrAssignedValue) {
+						throw new ForeignKeyReferenceAlreadyHasValueException();
+					}
+					OnDataTypeIdChanging(value);
+					SendPropertyChanging();
+					_DataTypeId = value;
+					SendPropertyChanged("DataTypeId");
+					OnDataTypeIdChanged();
+				}
+			}
+		}
+		
+		partial void OnValueChanging(double value);
+		partial void OnValueChanged();
+		private double _Value;
+		[Column(Storage=@"_Value", DbType=@"Float NOT NULL", CanBeNull=false)]
+		[DataMember(Order=4)]
+		public double Value
+		{
+			get { return _Value; }
+			set {
+				if (_Value != value) {
+					OnValueChanging(value);
+					SendPropertyChanging();
+					_Value = value;
+					SendPropertyChanged("Value");
+					OnValueChanged();
+				}
+			}
+		}
+		
+		#endregion
+		
+		#region Associations
+		private EntityRef<AlgorithmParameter> _AlgorithmParameter;
+		[Association(Name=@"AlgorithmParameter_AlgorithmParameterFloatValue", Storage=@"_AlgorithmParameter", ThisKey=@"AlgorithmParameterId", OtherKey=@"Id", IsForeignKey=true)]
+		[DataMember(Order=5, EmitDefaultValue=false)]
+		public AlgorithmParameter AlgorithmParameter
+		{
+			get {
+				return _AlgorithmParameter.Entity;
+			}
+			set {
+				AlgorithmParameter previousValue = _AlgorithmParameter.Entity;
+				if ((previousValue != value) || (!_AlgorithmParameter.HasLoadedOrAssignedValue)) {
+					SendPropertyChanging();
+					if (previousValue != null) {
+						_AlgorithmParameter.Entity = null;
+						previousValue.AlgorithmParameterFloatValues.Remove(this);
+					}
+					_AlgorithmParameter.Entity = value;
+					if (value != null) {
+						value.AlgorithmParameterFloatValues.Add(this);
+						_AlgorithmParameterId = value.Id;
+					}
+					else {
+						_AlgorithmParameterId = default(long);
+					}
+					SendPropertyChanged("AlgorithmParameter");
+				}
+			}
+		}
+
+		private EntityRef<DataType> _DataType;
+		[Association(Name=@"DataType_AlgorithmParameterFloatValue", Storage=@"_DataType", ThisKey=@"DataTypeId", OtherKey=@"Id", IsForeignKey=true)]
+		[DataMember(Order=6, EmitDefaultValue=false)]
+		public DataType DataType
+		{
+			get {
+				return _DataType.Entity;
+			}
+			set {
+				DataType previousValue = _DataType.Entity;
+				if ((previousValue != value) || (!_DataType.HasLoadedOrAssignedValue)) {
+					SendPropertyChanging();
+					if (previousValue != null) {
+						_DataType.Entity = null;
+						previousValue.AlgorithmParameterFloatValues.Remove(this);
+					}
+					_DataType.Entity = value;
+					if (value != null) {
+						value.AlgorithmParameterFloatValues.Add(this);
+						_DataTypeId = value.Id;
+					}
+					else {
+						_DataTypeId = default(long);
+					}
+					SendPropertyChanged("DataType");
+				}
+			}
+		}
+
+		private EntityRef<Experiment> _Experiment;
+		[Association(Name=@"Experiment_AlgorithmParameterFloatValue", Storage=@"_Experiment", ThisKey=@"ExperimentId", OtherKey=@"Id", IsForeignKey=true)]
+		[DataMember(Order=7, EmitDefaultValue=false)]
+		public Experiment Experiment
+		{
+			get {
+				return _Experiment.Entity;
+			}
+			set {
+				Experiment previousValue = _Experiment.Entity;
+				if ((previousValue != value) || (!_Experiment.HasLoadedOrAssignedValue)) {
+					SendPropertyChanging();
+					if (previousValue != null) {
+						_Experiment.Entity = null;
+						previousValue.AlgorithmParameterFloatValues.Remove(this);
+					}
+					_Experiment.Entity = value;
+					if (value != null) {
+						value.AlgorithmParameterFloatValues.Add(this);
+						_ExperimentId = value.Id;
+					}
+					else {
+						_ExperimentId = default(long);
+					}
+					SendPropertyChanged("Experiment");
+				}
+			}
+		}
+
+		#endregion
+		
+		#region Serialization
+		[OnDeserializing()]
+		[EditorBrowsableAttribute(EditorBrowsableState.Never)]
+		public  void OnDeserializing(StreamingContext context)
+		{
+			Initialize();
+		}
+		#endregion
+	}
+}
+
+namespace HeuristicLab.Services.OKB.DataAccess
+{	
+	[DataContract(IsReference=true)]
+	[Table(Name=@"dbo.AlgorithmParameterIntValue")]
+[KnownType(typeof(AlgorithmParameterIntValue))]	public partial class AlgorithmParameterIntValue : INotifyPropertyChanging, INotifyPropertyChanged
+	{
+		#region Property Change Event Handling
+		private static PropertyChangingEventArgs emptyChangingEventArgs = new PropertyChangingEventArgs(String.Empty);
+		
+		public event PropertyChangingEventHandler PropertyChanging;
+		public event PropertyChangedEventHandler PropertyChanged;
+		
+		public virtual void SendPropertyChanging()
+		{
+			if (PropertyChanging != null) {
+				PropertyChanging(this, emptyChangingEventArgs);
+			}
+		}
+			
+		public virtual void SendPropertyChanged(String propertyName)
+		{
+			if (PropertyChanged != null) {
+				PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
+			}
+		}
+		#endregion
+		
+		#region Extensibility Method Definitions
+		partial void OnLoaded();
+		partial void OnValidate(ChangeAction action);
+		partial void OnCreated();
+		#endregion
+
+		#region Construction
+		public AlgorithmParameterIntValue()
+		{
+			Initialize();
+		}
+		
+		private void Initialize()
+		{
+			_AlgorithmParameter = default(EntityRef<AlgorithmParameter>);
+			_DataType = default(EntityRef<DataType>);
+			_Experiment = default(EntityRef<Experiment>);
+			OnCreated();
+		}
+		#endregion
+
+		#region Column Mappings
+		partial void OnAlgorithmParameterIdChanging(long value);
+		partial void OnAlgorithmParameterIdChanged();
+		private long _AlgorithmParameterId;
+		[Column(Storage=@"_AlgorithmParameterId", DbType=@"BigInt NOT NULL", IsPrimaryKey=true, UpdateCheck=UpdateCheck.Never)]
+		[DataMember(Order=1)]
+		public long AlgorithmParameterId
+		{
+			get { return _AlgorithmParameterId; }
+			set {
+				if (_AlgorithmParameterId != value) {
+					if (_AlgorithmParameter.HasLoadedOrAssignedValue) {
+						throw new ForeignKeyReferenceAlreadyHasValueException();
+					}
+					OnAlgorithmParameterIdChanging(value);
+					SendPropertyChanging();
+					_AlgorithmParameterId = value;
+					SendPropertyChanged("AlgorithmParameterId");
+					OnAlgorithmParameterIdChanged();
+				}
+			}
+		}
+		
+		partial void OnExperimentIdChanging(long value);
+		partial void OnExperimentIdChanged();
+		private long _ExperimentId;
+		[Column(Storage=@"_ExperimentId", DbType=@"BigInt NOT NULL", IsPrimaryKey=true, UpdateCheck=UpdateCheck.Never)]
+		[DataMember(Order=2)]
+		public long ExperimentId
+		{
+			get { return _ExperimentId; }
+			set {
+				if (_ExperimentId != value) {
+					if (_Experiment.HasLoadedOrAssignedValue) {
+						throw new ForeignKeyReferenceAlreadyHasValueException();
+					}
+					OnExperimentIdChanging(value);
+					SendPropertyChanging();
+					_ExperimentId = value;
+					SendPropertyChanged("ExperimentId");
+					OnExperimentIdChanged();
+				}
+			}
+		}
+		
+		partial void OnDataTypeIdChanging(long value);
+		partial void OnDataTypeIdChanged();
+		private long _DataTypeId;
+		[Column(Storage=@"_DataTypeId", DbType=@"BigInt NOT NULL", CanBeNull=false)]
+		[DataMember(Order=3)]
+		public long DataTypeId
+		{
+			get { return _DataTypeId; }
+			set {
+				if (_DataTypeId != value) {
+					if (_DataType.HasLoadedOrAssignedValue) {
+						throw new ForeignKeyReferenceAlreadyHasValueException();
+					}
+					OnDataTypeIdChanging(value);
+					SendPropertyChanging();
+					_DataTypeId = value;
+					SendPropertyChanged("DataTypeId");
+					OnDataTypeIdChanged();
+				}
+			}
+		}
+		
+		partial void OnValueChanging(long value);
+		partial void OnValueChanged();
+		private long _Value;
+		[Column(Storage=@"_Value", DbType=@"BigInt NOT NULL", CanBeNull=false)]
+		[DataMember(Order=4)]
+		public long Value
+		{
+			get { return _Value; }
+			set {
+				if (_Value != value) {
+					OnValueChanging(value);
+					SendPropertyChanging();
+					_Value = value;
+					SendPropertyChanged("Value");
+					OnValueChanged();
+				}
+			}
+		}
+		
+		#endregion
+		
+		#region Associations
+		private EntityRef<AlgorithmParameter> _AlgorithmParameter;
+		[Association(Name=@"AlgorithmParameter_AlgorithmParameterIntValue", Storage=@"_AlgorithmParameter", ThisKey=@"AlgorithmParameterId", OtherKey=@"Id", IsForeignKey=true)]
+		[DataMember(Order=5, EmitDefaultValue=false)]
+		public AlgorithmParameter AlgorithmParameter
+		{
+			get {
+				return _AlgorithmParameter.Entity;
+			}
+			set {
+				AlgorithmParameter previousValue = _AlgorithmParameter.Entity;
+				if ((previousValue != value) || (!_AlgorithmParameter.HasLoadedOrAssignedValue)) {
+					SendPropertyChanging();
+					if (previousValue != null) {
+						_AlgorithmParameter.Entity = null;
+						previousValue.AlgorithmParameterIntValues.Remove(this);
+					}
+					_AlgorithmParameter.Entity = value;
+					if (value != null) {
+						value.AlgorithmParameterIntValues.Add(this);
+						_AlgorithmParameterId = value.Id;
+					}
+					else {
+						_AlgorithmParameterId = default(long);
+					}
+					SendPropertyChanged("AlgorithmParameter");
+				}
+			}
+		}
+
+		private EntityRef<DataType> _DataType;
+		[Association(Name=@"DataType_AlgorithmParameterIntValue", Storage=@"_DataType", ThisKey=@"DataTypeId", OtherKey=@"Id", IsForeignKey=true)]
+		[DataMember(Order=6, EmitDefaultValue=false)]
+		public DataType DataType
+		{
+			get {
+				return _DataType.Entity;
+			}
+			set {
+				DataType previousValue = _DataType.Entity;
+				if ((previousValue != value) || (!_DataType.HasLoadedOrAssignedValue)) {
+					SendPropertyChanging();
+					if (previousValue != null) {
+						_DataType.Entity = null;
+						previousValue.AlgorithmParameterIntValues.Remove(this);
+					}
+					_DataType.Entity = value;
+					if (value != null) {
+						value.AlgorithmParameterIntValues.Add(this);
+						_DataTypeId = value.Id;
+					}
+					else {
+						_DataTypeId = default(long);
+					}
+					SendPropertyChanged("DataType");
+				}
+			}
+		}
+
+		private EntityRef<Experiment> _Experiment;
+		[Association(Name=@"Experiment_AlgorithmParameterIntValue", Storage=@"_Experiment", ThisKey=@"ExperimentId", OtherKey=@"Id", IsForeignKey=true)]
+		[DataMember(Order=7, EmitDefaultValue=false)]
+		public Experiment Experiment
+		{
+			get {
+				return _Experiment.Entity;
+			}
+			set {
+				Experiment previousValue = _Experiment.Entity;
+				if ((previousValue != value) || (!_Experiment.HasLoadedOrAssignedValue)) {
+					SendPropertyChanging();
+					if (previousValue != null) {
+						_Experiment.Entity = null;
+						previousValue.AlgorithmParameterIntValues.Remove(this);
+					}
+					_Experiment.Entity = value;
+					if (value != null) {
+						value.AlgorithmParameterIntValues.Add(this);
+						_ExperimentId = value.Id;
+					}
+					else {
+						_ExperimentId = default(long);
+					}
+					SendPropertyChanged("Experiment");
+				}
+			}
+		}
+
+		#endregion
+		
+		#region Serialization
+		[OnDeserializing()]
+		[EditorBrowsableAttribute(EditorBrowsableState.Never)]
+		public  void OnDeserializing(StreamingContext context)
+		{
+			Initialize();
+		}
+		#endregion
+	}
+}
+
+namespace HeuristicLab.Services.OKB.DataAccess
+{	
+	[DataContract(IsReference=true)]
+	[Table(Name=@"dbo.AlgorithmParameterStringValue")]
+[KnownType(typeof(AlgorithmParameterStringValue))]	public partial class AlgorithmParameterStringValue : INotifyPropertyChanging, INotifyPropertyChanged
+	{
+		#region Property Change Event Handling
+		private static PropertyChangingEventArgs emptyChangingEventArgs = new PropertyChangingEventArgs(String.Empty);
+		
+		public event PropertyChangingEventHandler PropertyChanging;
+		public event PropertyChangedEventHandler PropertyChanged;
+		
+		public virtual void SendPropertyChanging()
+		{
+			if (PropertyChanging != null) {
+				PropertyChanging(this, emptyChangingEventArgs);
+			}
+		}
+			
+		public virtual void SendPropertyChanged(String propertyName)
+		{
+			if (PropertyChanged != null) {
+				PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
+			}
+		}
+		#endregion
+		
+		#region Extensibility Method Definitions
+		partial void OnLoaded();
+		partial void OnValidate(ChangeAction action);
+		partial void OnCreated();
+		#endregion
+
+		#region Construction
+		public AlgorithmParameterStringValue()
+		{
+			Initialize();
+		}
+		
+		private void Initialize()
+		{
+			_AlgorithmParameter = default(EntityRef<AlgorithmParameter>);
+			_DataType = default(EntityRef<DataType>);
+			_Experiment = default(EntityRef<Experiment>);
+			OnCreated();
+		}
+		#endregion
+
+		#region Column Mappings
+		partial void OnAlgorithmParameterIdChanging(long value);
+		partial void OnAlgorithmParameterIdChanged();
+		private long _AlgorithmParameterId;
+		[Column(Storage=@"_AlgorithmParameterId", DbType=@"BigInt NOT NULL", IsPrimaryKey=true, UpdateCheck=UpdateCheck.Never)]
+		[DataMember(Order=1)]
+		public long AlgorithmParameterId
+		{
+			get { return _AlgorithmParameterId; }
+			set {
+				if (_AlgorithmParameterId != value) {
+					if (_AlgorithmParameter.HasLoadedOrAssignedValue) {
+						throw new ForeignKeyReferenceAlreadyHasValueException();
+					}
+					OnAlgorithmParameterIdChanging(value);
+					SendPropertyChanging();
+					_AlgorithmParameterId = value;
+					SendPropertyChanged("AlgorithmParameterId");
+					OnAlgorithmParameterIdChanged();
+				}
+			}
+		}
+		
+		partial void OnExperimentIdChanging(long value);
+		partial void OnExperimentIdChanged();
+		private long _ExperimentId;
+		[Column(Storage=@"_ExperimentId", DbType=@"BigInt NOT NULL", IsPrimaryKey=true, UpdateCheck=UpdateCheck.Never)]
+		[DataMember(Order=2)]
+		public long ExperimentId
+		{
+			get { return _ExperimentId; }
+			set {
+				if (_ExperimentId != value) {
+					if (_Experiment.HasLoadedOrAssignedValue) {
+						throw new ForeignKeyReferenceAlreadyHasValueException();
+					}
+					OnExperimentIdChanging(value);
+					SendPropertyChanging();
+					_ExperimentId = value;
+					SendPropertyChanged("ExperimentId");
+					OnExperimentIdChanged();
+				}
+			}
+		}
+		
+		partial void OnDataTypeIdChanging(long value);
+		partial void OnDataTypeIdChanged();
+		private long _DataTypeId;
+		[Column(Storage=@"_DataTypeId", DbType=@"BigInt NOT NULL", CanBeNull=false)]
+		[DataMember(Order=3)]
+		public long DataTypeId
+		{
+			get { return _DataTypeId; }
+			set {
+				if (_DataTypeId != value) {
+					if (_DataType.HasLoadedOrAssignedValue) {
+						throw new ForeignKeyReferenceAlreadyHasValueException();
+					}
+					OnDataTypeIdChanging(value);
+					SendPropertyChanging();
+					_DataTypeId = value;
+					SendPropertyChanged("DataTypeId");
+					OnDataTypeIdChanged();
+				}
+			}
+		}
+		
+		partial void OnValueChanging(string value);
+		partial void OnValueChanged();
+		private string _Value;
+		[Column(Storage=@"_Value", DbType=@"NVarChar(MAX) NOT NULL", CanBeNull=false)]
+		[DataMember(Order=4)]
+		public string Value
+		{
+			get { return _Value; }
+			set {
+				if (_Value != value) {
+					OnValueChanging(value);
+					SendPropertyChanging();
+					_Value = value;
+					SendPropertyChanged("Value");
+					OnValueChanged();
+				}
+			}
+		}
+		
+		#endregion
+		
+		#region Associations
+		private EntityRef<AlgorithmParameter> _AlgorithmParameter;
+		[Association(Name=@"AlgorithmParameter_AlgorithmParameterStringValue", Storage=@"_AlgorithmParameter", ThisKey=@"AlgorithmParameterId", OtherKey=@"Id", IsForeignKey=true)]
+		[DataMember(Order=5, EmitDefaultValue=false)]
+		public AlgorithmParameter AlgorithmParameter
+		{
+			get {
+				return _AlgorithmParameter.Entity;
+			}
+			set {
+				AlgorithmParameter previousValue = _AlgorithmParameter.Entity;
+				if ((previousValue != value) || (!_AlgorithmParameter.HasLoadedOrAssignedValue)) {
+					SendPropertyChanging();
+					if (previousValue != null) {
+						_AlgorithmParameter.Entity = null;
+						previousValue.AlgorithmParameterStringValues.Remove(this);
+					}
+					_AlgorithmParameter.Entity = value;
+					if (value != null) {
+						value.AlgorithmParameterStringValues.Add(this);
+						_AlgorithmParameterId = value.Id;
+					}
+					else {
+						_AlgorithmParameterId = default(long);
+					}
+					SendPropertyChanged("AlgorithmParameter");
+				}
+			}
+		}
+
+		private EntityRef<DataType> _DataType;
+		[Association(Name=@"DataType_AlgorithmParameterStringValue", Storage=@"_DataType", ThisKey=@"DataTypeId", OtherKey=@"Id", IsForeignKey=true)]
+		[DataMember(Order=6, EmitDefaultValue=false)]
+		public DataType DataType
+		{
+			get {
+				return _DataType.Entity;
+			}
+			set {
+				DataType previousValue = _DataType.Entity;
+				if ((previousValue != value) || (!_DataType.HasLoadedOrAssignedValue)) {
+					SendPropertyChanging();
+					if (previousValue != null) {
+						_DataType.Entity = null;
+						previousValue.AlgorithmParameterStringValues.Remove(this);
+					}
+					_DataType.Entity = value;
+					if (value != null) {
+						value.AlgorithmParameterStringValues.Add(this);
+						_DataTypeId = value.Id;
+					}
+					else {
+						_DataTypeId = default(long);
+					}
+					SendPropertyChanged("DataType");
+				}
+			}
+		}
+
+		private EntityRef<Experiment> _Experiment;
+		[Association(Name=@"Experiment_AlgorithmParameterStringValue", Storage=@"_Experiment", ThisKey=@"ExperimentId", OtherKey=@"Id", IsForeignKey=true)]
+		[DataMember(Order=7, EmitDefaultValue=false)]
+		public Experiment Experiment
+		{
+			get {
+				return _Experiment.Entity;
+			}
+			set {
+				Experiment previousValue = _Experiment.Entity;
+				if ((previousValue != value) || (!_Experiment.HasLoadedOrAssignedValue)) {
+					SendPropertyChanging();
+					if (previousValue != null) {
+						_Experiment.Entity = null;
+						previousValue.AlgorithmParameterStringValues.Remove(this);
+					}
+					_Experiment.Entity = value;
+					if (value != null) {
+						value.AlgorithmParameterStringValues.Add(this);
+						_ExperimentId = value.Id;
+					}
+					else {
+						_ExperimentId = default(long);
+					}
+					SendPropertyChanged("Experiment");
+				}
+			}
+		}
+
+		#endregion
+		
+		#region Serialization
+		[OnDeserializing()]
+		[EditorBrowsableAttribute(EditorBrowsableState.Never)]
+		public  void OnDeserializing(StreamingContext context)
+		{
+			Initialize();
+		}
+		#endregion
+	}
+}
+
+namespace HeuristicLab.Services.OKB.DataAccess
+{	
+	[DataContract(IsReference=true)]
+	[Table(Name=@"dbo.ProblemParameterBlobValue")]
+[KnownType(typeof(ProblemParameterBlobValue))]	public partial class ProblemParameterBlobValue : INotifyPropertyChanging, INotifyPropertyChanged
+	{
+		#region Property Change Event Handling
+		private static PropertyChangingEventArgs emptyChangingEventArgs = new PropertyChangingEventArgs(String.Empty);
+		
+		public event PropertyChangingEventHandler PropertyChanging;
+		public event PropertyChangedEventHandler PropertyChanged;
+		
+		public virtual void SendPropertyChanging()
+		{
+			if (PropertyChanging != null) {
+				PropertyChanging(this, emptyChangingEventArgs);
+			}
+		}
+			
+		public virtual void SendPropertyChanged(String propertyName)
+		{
+			if (PropertyChanged != null) {
+				PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
+			}
+		}
+		#endregion
+		
+		#region Extensibility Method Definitions
+		partial void OnLoaded();
+		partial void OnValidate(ChangeAction action);
+		partial void OnCreated();
+		#endregion
+
+		#region Construction
+		public ProblemParameterBlobValue()
+		{
+			Initialize();
+		}
+		
+		private void Initialize()
+		{
+			_DataType = default(EntityRef<DataType>);
+			_Experiment = default(EntityRef<Experiment>);
+			_ProblemParameter = default(EntityRef<ProblemParameter>);
+			OnCreated();
+		}
+		#endregion
+
+		#region Column Mappings
+		partial void OnProblemParameterIdChanging(long value);
+		partial void OnProblemParameterIdChanged();
+		private long _ProblemParameterId;
+		[Column(Storage=@"_ProblemParameterId", DbType=@"BigInt NOT NULL", IsPrimaryKey=true, UpdateCheck=UpdateCheck.Never)]
+		[DataMember(Order=1)]
+		public long ProblemParameterId
+		{
+			get { return _ProblemParameterId; }
+			set {
+				if (_ProblemParameterId != value) {
+					if (_ProblemParameter.HasLoadedOrAssignedValue) {
+						throw new ForeignKeyReferenceAlreadyHasValueException();
+					}
+					OnProblemParameterIdChanging(value);
+					SendPropertyChanging();
+					_ProblemParameterId = value;
+					SendPropertyChanged("ProblemParameterId");
+					OnProblemParameterIdChanged();
+				}
+			}
+		}
+		
+		partial void OnExperimentIdChanging(long value);
+		partial void OnExperimentIdChanged();
+		private long _ExperimentId;
+		[Column(Storage=@"_ExperimentId", DbType=@"BigInt NOT NULL", IsPrimaryKey=true, UpdateCheck=UpdateCheck.Never)]
+		[DataMember(Order=2)]
+		public long ExperimentId
+		{
+			get { return _ExperimentId; }
+			set {
+				if (_ExperimentId != value) {
+					if (_Experiment.HasLoadedOrAssignedValue) {
+						throw new ForeignKeyReferenceAlreadyHasValueException();
+					}
+					OnExperimentIdChanging(value);
+					SendPropertyChanging();
+					_ExperimentId = value;
+					SendPropertyChanged("ExperimentId");
+					OnExperimentIdChanged();
+				}
+			}
+		}
+		
+		partial void OnDataTypeIdChanging(long value);
+		partial void OnDataTypeIdChanged();
+		private long _DataTypeId;
+		[Column(Storage=@"_DataTypeId", DbType=@"BigInt NOT NULL", CanBeNull=false)]
+		[DataMember(Order=3)]
+		public long DataTypeId
+		{
+			get { return _DataTypeId; }
+			set {
+				if (_DataTypeId != value) {
+					if (_DataType.HasLoadedOrAssignedValue) {
+						throw new ForeignKeyReferenceAlreadyHasValueException();
+					}
+					OnDataTypeIdChanging(value);
+					SendPropertyChanging();
+					_DataTypeId = value;
+					SendPropertyChanged("DataTypeId");
+					OnDataTypeIdChanged();
+				}
+			}
+		}
+		
+		partial void OnValueChanging(Binary value);
+		partial void OnValueChanged();
+		private Binary _Value;
+		[Column(Storage=@"_Value", DbType=@"VarBinary(MAX) NOT NULL", CanBeNull=false, UpdateCheck=UpdateCheck.Never)]
+		[DataMember(Order=4)]
+		public Binary Value
+		{
+			get { return _Value; }
+			set {
+				if (_Value != value) {
+					OnValueChanging(value);
+					SendPropertyChanging();
+					_Value = value;
+					SendPropertyChanged("Value");
+					OnValueChanged();
+				}
+			}
+		}
+		
+		#endregion
+		
+		#region Associations
+		private EntityRef<DataType> _DataType;
+		[Association(Name=@"DataType_ProblemParameterBlobValue", Storage=@"_DataType", ThisKey=@"DataTypeId", OtherKey=@"Id", IsForeignKey=true)]
+		[DataMember(Order=5, EmitDefaultValue=false)]
+		public DataType DataType
+		{
+			get {
+				return _DataType.Entity;
+			}
+			set {
+				DataType previousValue = _DataType.Entity;
+				if ((previousValue != value) || (!_DataType.HasLoadedOrAssignedValue)) {
+					SendPropertyChanging();
+					if (previousValue != null) {
+						_DataType.Entity = null;
+						previousValue.ProblemParameterBlobValues.Remove(this);
+					}
+					_DataType.Entity = value;
+					if (value != null) {
+						value.ProblemParameterBlobValues.Add(this);
+						_DataTypeId = value.Id;
+					}
+					else {
+						_DataTypeId = default(long);
+					}
+					SendPropertyChanged("DataType");
+				}
+			}
+		}
+
+		private EntityRef<Experiment> _Experiment;
+		[Association(Name=@"Experiment_ProblemParameterBlobValue", Storage=@"_Experiment", ThisKey=@"ExperimentId", OtherKey=@"Id", IsForeignKey=true)]
+		[DataMember(Order=6, EmitDefaultValue=false)]
+		public Experiment Experiment
+		{
+			get {
+				return _Experiment.Entity;
+			}
+			set {
+				Experiment previousValue = _Experiment.Entity;
+				if ((previousValue != value) || (!_Experiment.HasLoadedOrAssignedValue)) {
+					SendPropertyChanging();
+					if (previousValue != null) {
+						_Experiment.Entity = null;
+						previousValue.ProblemParameterBlobValues.Remove(this);
+					}
+					_Experiment.Entity = value;
+					if (value != null) {
+						value.ProblemParameterBlobValues.Add(this);
+						_ExperimentId = value.Id;
+					}
+					else {
+						_ExperimentId = default(long);
+					}
+					SendPropertyChanged("Experiment");
+				}
+			}
+		}
+
+		private EntityRef<ProblemParameter> _ProblemParameter;
+		[Association(Name=@"ProblemParameter_ProblemParameterBlobValue", Storage=@"_ProblemParameter", ThisKey=@"ProblemParameterId", OtherKey=@"Id", IsForeignKey=true)]
+		[DataMember(Order=7, EmitDefaultValue=false)]
+		public ProblemParameter ProblemParameter
+		{
+			get {
+				return _ProblemParameter.Entity;
+			}
+			set {
+				ProblemParameter previousValue = _ProblemParameter.Entity;
+				if ((previousValue != value) || (!_ProblemParameter.HasLoadedOrAssignedValue)) {
+					SendPropertyChanging();
+					if (previousValue != null) {
+						_ProblemParameter.Entity = null;
+						previousValue.ProblemParameterBlobValues.Remove(this);
+					}
+					_ProblemParameter.Entity = value;
+					if (value != null) {
+						value.ProblemParameterBlobValues.Add(this);
+						_ProblemParameterId = value.Id;
+					}
+					else {
+						_ProblemParameterId = default(long);
+					}
+					SendPropertyChanged("ProblemParameter");
+				}
+			}
+		}
+
+		#endregion
+		
+		#region Serialization
+		[OnDeserializing()]
+		[EditorBrowsableAttribute(EditorBrowsableState.Never)]
+		public  void OnDeserializing(StreamingContext context)
+		{
+			Initialize();
+		}
+		#endregion
+	}
+}
+
+namespace HeuristicLab.Services.OKB.DataAccess
+{	
+	[DataContract(IsReference=true)]
+	[Table(Name=@"dbo.ProblemParameterBoolValue")]
+[KnownType(typeof(ProblemParameterBoolValue))]	public partial class ProblemParameterBoolValue : INotifyPropertyChanging, INotifyPropertyChanged
+	{
+		#region Property Change Event Handling
+		private static PropertyChangingEventArgs emptyChangingEventArgs = new PropertyChangingEventArgs(String.Empty);
+		
+		public event PropertyChangingEventHandler PropertyChanging;
+		public event PropertyChangedEventHandler PropertyChanged;
+		
+		public virtual void SendPropertyChanging()
+		{
+			if (PropertyChanging != null) {
+				PropertyChanging(this, emptyChangingEventArgs);
+			}
+		}
+			
+		public virtual void SendPropertyChanged(String propertyName)
+		{
+			if (PropertyChanged != null) {
+				PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
+			}
+		}
+		#endregion
+		
+		#region Extensibility Method Definitions
+		partial void OnLoaded();
+		partial void OnValidate(ChangeAction action);
+		partial void OnCreated();
+		#endregion
+
+		#region Construction
+		public ProblemParameterBoolValue()
+		{
+			Initialize();
+		}
+		
+		private void Initialize()
+		{
+			_DataType = default(EntityRef<DataType>);
+			_Experiment = default(EntityRef<Experiment>);
+			_ProblemParameter = default(EntityRef<ProblemParameter>);
+			OnCreated();
+		}
+		#endregion
+
+		#region Column Mappings
+		partial void OnProblemParameterIdChanging(long value);
+		partial void OnProblemParameterIdChanged();
+		private long _ProblemParameterId;
+		[Column(Storage=@"_ProblemParameterId", DbType=@"BigInt NOT NULL", IsPrimaryKey=true, UpdateCheck=UpdateCheck.Never)]
+		[DataMember(Order=1)]
+		public long ProblemParameterId
+		{
+			get { return _ProblemParameterId; }
+			set {
+				if (_ProblemParameterId != value) {
+					if (_ProblemParameter.HasLoadedOrAssignedValue) {
+						throw new ForeignKeyReferenceAlreadyHasValueException();
+					}
+					OnProblemParameterIdChanging(value);
+					SendPropertyChanging();
+					_ProblemParameterId = value;
+					SendPropertyChanged("ProblemParameterId");
+					OnProblemParameterIdChanged();
+				}
+			}
+		}
+		
+		partial void OnExperimentIdChanging(long value);
+		partial void OnExperimentIdChanged();
+		private long _ExperimentId;
+		[Column(Storage=@"_ExperimentId", DbType=@"BigInt NOT NULL", IsPrimaryKey=true, UpdateCheck=UpdateCheck.Never)]
+		[DataMember(Order=2)]
+		public long ExperimentId
+		{
+			get { return _ExperimentId; }
+			set {
+				if (_ExperimentId != value) {
+					if (_Experiment.HasLoadedOrAssignedValue) {
+						throw new ForeignKeyReferenceAlreadyHasValueException();
+					}
+					OnExperimentIdChanging(value);
+					SendPropertyChanging();
+					_ExperimentId = value;
+					SendPropertyChanged("ExperimentId");
+					OnExperimentIdChanged();
+				}
+			}
+		}
+		
+		partial void OnDataTypeIdChanging(long value);
+		partial void OnDataTypeIdChanged();
+		private long _DataTypeId;
+		[Column(Storage=@"_DataTypeId", DbType=@"BigInt NOT NULL", CanBeNull=false)]
+		[DataMember(Order=3)]
+		public long DataTypeId
+		{
+			get { return _DataTypeId; }
+			set {
+				if (_DataTypeId != value) {
+					if (_DataType.HasLoadedOrAssignedValue) {
+						throw new ForeignKeyReferenceAlreadyHasValueException();
+					}
+					OnDataTypeIdChanging(value);
+					SendPropertyChanging();
+					_DataTypeId = value;
+					SendPropertyChanged("DataTypeId");
+					OnDataTypeIdChanged();
+				}
+			}
+		}
+		
+		partial void OnValueChanging(bool value);
+		partial void OnValueChanged();
+		private bool _Value;
+		[Column(Storage=@"_Value", DbType=@"Bit NOT NULL", CanBeNull=false)]
+		[DataMember(Order=4)]
+		public bool Value
+		{
+			get { return _Value; }
+			set {
+				if (_Value != value) {
+					OnValueChanging(value);
+					SendPropertyChanging();
+					_Value = value;
+					SendPropertyChanged("Value");
+					OnValueChanged();
+				}
+			}
+		}
+		
+		#endregion
+		
+		#region Associations
+		private EntityRef<DataType> _DataType;
+		[Association(Name=@"DataType_ProblemParameterBoolValue", Storage=@"_DataType", ThisKey=@"DataTypeId", OtherKey=@"Id", IsForeignKey=true)]
+		[DataMember(Order=5, EmitDefaultValue=false)]
+		public DataType DataType
+		{
+			get {
+				return _DataType.Entity;
+			}
+			set {
+				DataType previousValue = _DataType.Entity;
+				if ((previousValue != value) || (!_DataType.HasLoadedOrAssignedValue)) {
+					SendPropertyChanging();
+					if (previousValue != null) {
+						_DataType.Entity = null;
+						previousValue.ProblemParameterBoolValues.Remove(this);
+					}
+					_DataType.Entity = value;
+					if (value != null) {
+						value.ProblemParameterBoolValues.Add(this);
+						_DataTypeId = value.Id;
+					}
+					else {
+						_DataTypeId = default(long);
+					}
+					SendPropertyChanged("DataType");
+				}
+			}
+		}
+
+		private EntityRef<Experiment> _Experiment;
+		[Association(Name=@"Experiment_ProblemParameterBoolValue", Storage=@"_Experiment", ThisKey=@"ExperimentId", OtherKey=@"Id", IsForeignKey=true)]
+		[DataMember(Order=6, EmitDefaultValue=false)]
+		public Experiment Experiment
+		{
+			get {
+				return _Experiment.Entity;
+			}
+			set {
+				Experiment previousValue = _Experiment.Entity;
+				if ((previousValue != value) || (!_Experiment.HasLoadedOrAssignedValue)) {
+					SendPropertyChanging();
+					if (previousValue != null) {
+						_Experiment.Entity = null;
+						previousValue.ProblemParameterBoolValues.Remove(this);
+					}
+					_Experiment.Entity = value;
+					if (value != null) {
+						value.ProblemParameterBoolValues.Add(this);
+						_ExperimentId = value.Id;
+					}
+					else {
+						_ExperimentId = default(long);
+					}
+					SendPropertyChanged("Experiment");
+				}
+			}
+		}
+
+		private EntityRef<ProblemParameter> _ProblemParameter;
+		[Association(Name=@"ProblemParameter_ProblemParameterBoolValue", Storage=@"_ProblemParameter", ThisKey=@"ProblemParameterId", OtherKey=@"Id", IsForeignKey=true)]
+		[DataMember(Order=7, EmitDefaultValue=false)]
+		public ProblemParameter ProblemParameter
+		{
+			get {
+				return _ProblemParameter.Entity;
+			}
+			set {
+				ProblemParameter previousValue = _ProblemParameter.Entity;
+				if ((previousValue != value) || (!_ProblemParameter.HasLoadedOrAssignedValue)) {
+					SendPropertyChanging();
+					if (previousValue != null) {
+						_ProblemParameter.Entity = null;
+						previousValue.ProblemParameterBoolValues.Remove(this);
+					}
+					_ProblemParameter.Entity = value;
+					if (value != null) {
+						value.ProblemParameterBoolValues.Add(this);
+						_ProblemParameterId = value.Id;
+					}
+					else {
+						_ProblemParameterId = default(long);
+					}
+					SendPropertyChanged("ProblemParameter");
+				}
+			}
+		}
+
+		#endregion
+		
+		#region Serialization
+		[OnDeserializing()]
+		[EditorBrowsableAttribute(EditorBrowsableState.Never)]
+		public  void OnDeserializing(StreamingContext context)
+		{
+			Initialize();
+		}
+		#endregion
+	}
+}
+
+namespace HeuristicLab.Services.OKB.DataAccess
+{	
+	[DataContract(IsReference=true)]
+	[Table(Name=@"dbo.ProblemParameterFloatValue")]
+[KnownType(typeof(ProblemParameterFloatValue))]	public partial class ProblemParameterFloatValue : INotifyPropertyChanging, INotifyPropertyChanged
+	{
+		#region Property Change Event Handling
+		private static PropertyChangingEventArgs emptyChangingEventArgs = new PropertyChangingEventArgs(String.Empty);
+		
+		public event PropertyChangingEventHandler PropertyChanging;
+		public event PropertyChangedEventHandler PropertyChanged;
+		
+		public virtual void SendPropertyChanging()
+		{
+			if (PropertyChanging != null) {
+				PropertyChanging(this, emptyChangingEventArgs);
+			}
+		}
+			
+		public virtual void SendPropertyChanged(String propertyName)
+		{
+			if (PropertyChanged != null) {
+				PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
+			}
+		}
+		#endregion
+		
+		#region Extensibility Method Definitions
+		partial void OnLoaded();
+		partial void OnValidate(ChangeAction action);
+		partial void OnCreated();
+		#endregion
+
+		#region Construction
+		public ProblemParameterFloatValue()
+		{
+			Initialize();
+		}
+		
+		private void Initialize()
+		{
+			_DataType = default(EntityRef<DataType>);
+			_Experiment = default(EntityRef<Experiment>);
+			_ProblemParameter = default(EntityRef<ProblemParameter>);
+			OnCreated();
+		}
+		#endregion
+
+		#region Column Mappings
+		partial void OnProblemParameterIdChanging(long value);
+		partial void OnProblemParameterIdChanged();
+		private long _ProblemParameterId;
+		[Column(Storage=@"_ProblemParameterId", DbType=@"BigInt NOT NULL", IsPrimaryKey=true, UpdateCheck=UpdateCheck.Never)]
+		[DataMember(Order=1)]
+		public long ProblemParameterId
+		{
+			get { return _ProblemParameterId; }
+			set {
+				if (_ProblemParameterId != value) {
+					if (_ProblemParameter.HasLoadedOrAssignedValue) {
+						throw new ForeignKeyReferenceAlreadyHasValueException();
+					}
+					OnProblemParameterIdChanging(value);
+					SendPropertyChanging();
+					_ProblemParameterId = value;
+					SendPropertyChanged("ProblemParameterId");
+					OnProblemParameterIdChanged();
+				}
+			}
+		}
+		
+		partial void OnExperimentIdChanging(long value);
+		partial void OnExperimentIdChanged();
+		private long _ExperimentId;
+		[Column(Storage=@"_ExperimentId", DbType=@"BigInt NOT NULL", IsPrimaryKey=true, UpdateCheck=UpdateCheck.Never)]
+		[DataMember(Order=2)]
+		public long ExperimentId
+		{
+			get { return _ExperimentId; }
+			set {
+				if (_ExperimentId != value) {
+					if (_Experiment.HasLoadedOrAssignedValue) {
+						throw new ForeignKeyReferenceAlreadyHasValueException();
+					}
+					OnExperimentIdChanging(value);
+					SendPropertyChanging();
+					_ExperimentId = value;
+					SendPropertyChanged("ExperimentId");
+					OnExperimentIdChanged();
+				}
+			}
+		}
+		
+		partial void OnDataTypeIdChanging(long value);
+		partial void OnDataTypeIdChanged();
+		private long _DataTypeId;
+		[Column(Storage=@"_DataTypeId", DbType=@"BigInt NOT NULL", CanBeNull=false)]
+		[DataMember(Order=3)]
+		public long DataTypeId
+		{
+			get { return _DataTypeId; }
+			set {
+				if (_DataTypeId != value) {
+					if (_DataType.HasLoadedOrAssignedValue) {
+						throw new ForeignKeyReferenceAlreadyHasValueException();
+					}
+					OnDataTypeIdChanging(value);
+					SendPropertyChanging();
+					_DataTypeId = value;
+					SendPropertyChanged("DataTypeId");
+					OnDataTypeIdChanged();
+				}
+			}
+		}
+		
+		partial void OnValueChanging(double value);
+		partial void OnValueChanged();
+		private double _Value;
+		[Column(Storage=@"_Value", DbType=@"Float NOT NULL", CanBeNull=false)]
+		[DataMember(Order=4)]
+		public double Value
+		{
+			get { return _Value; }
+			set {
+				if (_Value != value) {
+					OnValueChanging(value);
+					SendPropertyChanging();
+					_Value = value;
+					SendPropertyChanged("Value");
+					OnValueChanged();
+				}
+			}
+		}
+		
+		#endregion
+		
+		#region Associations
+		private EntityRef<DataType> _DataType;
+		[Association(Name=@"DataType_ProblemParameterFloatValue", Storage=@"_DataType", ThisKey=@"DataTypeId", OtherKey=@"Id", IsForeignKey=true)]
+		[DataMember(Order=5, EmitDefaultValue=false)]
+		public DataType DataType
+		{
+			get {
+				return _DataType.Entity;
+			}
+			set {
+				DataType previousValue = _DataType.Entity;
+				if ((previousValue != value) || (!_DataType.HasLoadedOrAssignedValue)) {
+					SendPropertyChanging();
+					if (previousValue != null) {
+						_DataType.Entity = null;
+						previousValue.ProblemParameterFloatValues.Remove(this);
+					}
+					_DataType.Entity = value;
+					if (value != null) {
+						value.ProblemParameterFloatValues.Add(this);
+						_DataTypeId = value.Id;
+					}
+					else {
+						_DataTypeId = default(long);
+					}
+					SendPropertyChanged("DataType");
+				}
+			}
+		}
+
+		private EntityRef<Experiment> _Experiment;
+		[Association(Name=@"Experiment_ProblemParameterFloatValue", Storage=@"_Experiment", ThisKey=@"ExperimentId", OtherKey=@"Id", IsForeignKey=true)]
+		[DataMember(Order=6, EmitDefaultValue=false)]
+		public Experiment Experiment
+		{
+			get {
+				return _Experiment.Entity;
+			}
+			set {
+				Experiment previousValue = _Experiment.Entity;
+				if ((previousValue != value) || (!_Experiment.HasLoadedOrAssignedValue)) {
+					SendPropertyChanging();
+					if (previousValue != null) {
+						_Experiment.Entity = null;
+						previousValue.ProblemParameterFloatValues.Remove(this);
+					}
+					_Experiment.Entity = value;
+					if (value != null) {
+						value.ProblemParameterFloatValues.Add(this);
+						_ExperimentId = value.Id;
+					}
+					else {
+						_ExperimentId = default(long);
+					}
+					SendPropertyChanged("Experiment");
+				}
+			}
+		}
+
+		private EntityRef<ProblemParameter> _ProblemParameter;
+		[Association(Name=@"ProblemParameter_ProblemParameterFloatValue", Storage=@"_ProblemParameter", ThisKey=@"ProblemParameterId", OtherKey=@"Id", IsForeignKey=true)]
+		[DataMember(Order=7, EmitDefaultValue=false)]
+		public ProblemParameter ProblemParameter
+		{
+			get {
+				return _ProblemParameter.Entity;
+			}
+			set {
+				ProblemParameter previousValue = _ProblemParameter.Entity;
+				if ((previousValue != value) || (!_ProblemParameter.HasLoadedOrAssignedValue)) {
+					SendPropertyChanging();
+					if (previousValue != null) {
+						_ProblemParameter.Entity = null;
+						previousValue.ProblemParameterFloatValues.Remove(this);
+					}
+					_ProblemParameter.Entity = value;
+					if (value != null) {
+						value.ProblemParameterFloatValues.Add(this);
+						_ProblemParameterId = value.Id;
+					}
+					else {
+						_ProblemParameterId = default(long);
+					}
+					SendPropertyChanged("ProblemParameter");
+				}
+			}
+		}
+
+		#endregion
+		
+		#region Serialization
+		[OnDeserializing()]
+		[EditorBrowsableAttribute(EditorBrowsableState.Never)]
+		public  void OnDeserializing(StreamingContext context)
+		{
+			Initialize();
+		}
+		#endregion
+	}
+}
+
+namespace HeuristicLab.Services.OKB.DataAccess
+{	
+	[DataContract(IsReference=true)]
+	[Table(Name=@"dbo.ProblemParameterIntValue")]
+[KnownType(typeof(ProblemParameterIntValue))]	public partial class ProblemParameterIntValue : INotifyPropertyChanging, INotifyPropertyChanged
+	{
+		#region Property Change Event Handling
+		private static PropertyChangingEventArgs emptyChangingEventArgs = new PropertyChangingEventArgs(String.Empty);
+		
+		public event PropertyChangingEventHandler PropertyChanging;
+		public event PropertyChangedEventHandler PropertyChanged;
+		
+		public virtual void SendPropertyChanging()
+		{
+			if (PropertyChanging != null) {
+				PropertyChanging(this, emptyChangingEventArgs);
+			}
+		}
+			
+		public virtual void SendPropertyChanged(String propertyName)
+		{
+			if (PropertyChanged != null) {
+				PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
+			}
+		}
+		#endregion
+		
+		#region Extensibility Method Definitions
+		partial void OnLoaded();
+		partial void OnValidate(ChangeAction action);
+		partial void OnCreated();
+		#endregion
+
+		#region Construction
+		public ProblemParameterIntValue()
+		{
+			Initialize();
+		}
+		
+		private void Initialize()
+		{
+			_DataType = default(EntityRef<DataType>);
+			_Experiment = default(EntityRef<Experiment>);
+			_ProblemParameter = default(EntityRef<ProblemParameter>);
+			OnCreated();
+		}
+		#endregion
+
+		#region Column Mappings
+		partial void OnProblemParameterIdChanging(long value);
+		partial void OnProblemParameterIdChanged();
+		private long _ProblemParameterId;
+		[Column(Storage=@"_ProblemParameterId", DbType=@"BigInt NOT NULL", IsPrimaryKey=true, UpdateCheck=UpdateCheck.Never)]
+		[DataMember(Order=1)]
+		public long ProblemParameterId
+		{
+			get { return _ProblemParameterId; }
+			set {
+				if (_ProblemParameterId != value) {
+					if (_ProblemParameter.HasLoadedOrAssignedValue) {
+						throw new ForeignKeyReferenceAlreadyHasValueException();
+					}
+					OnProblemParameterIdChanging(value);
+					SendPropertyChanging();
+					_ProblemParameterId = value;
+					SendPropertyChanged("ProblemParameterId");
+					OnProblemParameterIdChanged();
+				}
+			}
+		}
+		
+		partial void OnExperimentIdChanging(long value);
+		partial void OnExperimentIdChanged();
+		private long _ExperimentId;
+		[Column(Storage=@"_ExperimentId", DbType=@"BigInt NOT NULL", IsPrimaryKey=true, UpdateCheck=UpdateCheck.Never)]
+		[DataMember(Order=2)]
+		public long ExperimentId
+		{
+			get { return _ExperimentId; }
+			set {
+				if (_ExperimentId != value) {
+					if (_Experiment.HasLoadedOrAssignedValue) {
+						throw new ForeignKeyReferenceAlreadyHasValueException();
+					}
+					OnExperimentIdChanging(value);
+					SendPropertyChanging();
+					_ExperimentId = value;
+					SendPropertyChanged("ExperimentId");
+					OnExperimentIdChanged();
+				}
+			}
+		}
+		
+		partial void OnDataTypeIdChanging(long value);
+		partial void OnDataTypeIdChanged();
+		private long _DataTypeId;
+		[Column(Storage=@"_DataTypeId", DbType=@"BigInt NOT NULL", CanBeNull=false)]
+		[DataMember(Order=3)]
+		public long DataTypeId
+		{
+			get { return _DataTypeId; }
+			set {
+				if (_DataTypeId != value) {
+					if (_DataType.HasLoadedOrAssignedValue) {
+						throw new ForeignKeyReferenceAlreadyHasValueException();
+					}
+					OnDataTypeIdChanging(value);
+					SendPropertyChanging();
+					_DataTypeId = value;
+					SendPropertyChanged("DataTypeId");
+					OnDataTypeIdChanged();
+				}
+			}
+		}
+		
+		partial void OnValueChanging(long value);
+		partial void OnValueChanged();
+		private long _Value;
+		[Column(Storage=@"_Value", DbType=@"BigInt NOT NULL", CanBeNull=false)]
+		[DataMember(Order=4)]
+		public long Value
+		{
+			get { return _Value; }
+			set {
+				if (_Value != value) {
+					OnValueChanging(value);
+					SendPropertyChanging();
+					_Value = value;
+					SendPropertyChanged("Value");
+					OnValueChanged();
+				}
+			}
+		}
+		
+		#endregion
+		
+		#region Associations
+		private EntityRef<DataType> _DataType;
+		[Association(Name=@"DataType_ProblemParameterIntValue", Storage=@"_DataType", ThisKey=@"DataTypeId", OtherKey=@"Id", IsForeignKey=true)]
+		[DataMember(Order=5, EmitDefaultValue=false)]
+		public DataType DataType
+		{
+			get {
+				return _DataType.Entity;
+			}
+			set {
+				DataType previousValue = _DataType.Entity;
+				if ((previousValue != value) || (!_DataType.HasLoadedOrAssignedValue)) {
+					SendPropertyChanging();
+					if (previousValue != null) {
+						_DataType.Entity = null;
+						previousValue.ProblemParameterIntValues.Remove(this);
+					}
+					_DataType.Entity = value;
+					if (value != null) {
+						value.ProblemParameterIntValues.Add(this);
+						_DataTypeId = value.Id;
+					}
+					else {
+						_DataTypeId = default(long);
+					}
+					SendPropertyChanged("DataType");
+				}
+			}
+		}
+
+		private EntityRef<Experiment> _Experiment;
+		[Association(Name=@"Experiment_ProblemParameterIntValue", Storage=@"_Experiment", ThisKey=@"ExperimentId", OtherKey=@"Id", IsForeignKey=true)]
+		[DataMember(Order=6, EmitDefaultValue=false)]
+		public Experiment Experiment
+		{
+			get {
+				return _Experiment.Entity;
+			}
+			set {
+				Experiment previousValue = _Experiment.Entity;
+				if ((previousValue != value) || (!_Experiment.HasLoadedOrAssignedValue)) {
+					SendPropertyChanging();
+					if (previousValue != null) {
+						_Experiment.Entity = null;
+						previousValue.ProblemParameterIntValues.Remove(this);
+					}
+					_Experiment.Entity = value;
+					if (value != null) {
+						value.ProblemParameterIntValues.Add(this);
+						_ExperimentId = value.Id;
+					}
+					else {
+						_ExperimentId = default(long);
+					}
+					SendPropertyChanged("Experiment");
+				}
+			}
+		}
+
+		private EntityRef<ProblemParameter> _ProblemParameter;
+		[Association(Name=@"ProblemParameter_ProblemParameterIntValue", Storage=@"_ProblemParameter", ThisKey=@"ProblemParameterId", OtherKey=@"Id", IsForeignKey=true)]
+		[DataMember(Order=7, EmitDefaultValue=false)]
+		public ProblemParameter ProblemParameter
+		{
+			get {
+				return _ProblemParameter.Entity;
+			}
+			set {
+				ProblemParameter previousValue = _ProblemParameter.Entity;
+				if ((previousValue != value) || (!_ProblemParameter.HasLoadedOrAssignedValue)) {
+					SendPropertyChanging();
+					if (previousValue != null) {
+						_ProblemParameter.Entity = null;
+						previousValue.ProblemParameterIntValues.Remove(this);
+					}
+					_ProblemParameter.Entity = value;
+					if (value != null) {
+						value.ProblemParameterIntValues.Add(this);
+						_ProblemParameterId = value.Id;
+					}
+					else {
+						_ProblemParameterId = default(long);
+					}
+					SendPropertyChanged("ProblemParameter");
+				}
+			}
+		}
+
+		#endregion
+		
+		#region Serialization
+		[OnDeserializing()]
+		[EditorBrowsableAttribute(EditorBrowsableState.Never)]
+		public  void OnDeserializing(StreamingContext context)
+		{
+			Initialize();
+		}
+		#endregion
+	}
+}
+
+namespace HeuristicLab.Services.OKB.DataAccess
+{	
+	[DataContract(IsReference=true)]
+	[Table(Name=@"dbo.ProblemParameterStringValue")]
+[KnownType(typeof(ProblemParameterStringValue))]	public partial class ProblemParameterStringValue : INotifyPropertyChanging, INotifyPropertyChanged
+	{
+		#region Property Change Event Handling
+		private static PropertyChangingEventArgs emptyChangingEventArgs = new PropertyChangingEventArgs(String.Empty);
+		
+		public event PropertyChangingEventHandler PropertyChanging;
+		public event PropertyChangedEventHandler PropertyChanged;
+		
+		public virtual void SendPropertyChanging()
+		{
+			if (PropertyChanging != null) {
+				PropertyChanging(this, emptyChangingEventArgs);
+			}
+		}
+			
+		public virtual void SendPropertyChanged(String propertyName)
+		{
+			if (PropertyChanged != null) {
+				PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
+			}
+		}
+		#endregion
+		
+		#region Extensibility Method Definitions
+		partial void OnLoaded();
+		partial void OnValidate(ChangeAction action);
+		partial void OnCreated();
+		#endregion
+
+		#region Construction
+		public ProblemParameterStringValue()
+		{
+			Initialize();
+		}
+		
+		private void Initialize()
+		{
+			_DataType = default(EntityRef<DataType>);
+			_Experiment = default(EntityRef<Experiment>);
+			_ProblemParameter = default(EntityRef<ProblemParameter>);
+			OnCreated();
+		}
+		#endregion
+
+		#region Column Mappings
+		partial void OnProblemParameterIdChanging(long value);
+		partial void OnProblemParameterIdChanged();
+		private long _ProblemParameterId;
+		[Column(Storage=@"_ProblemParameterId", DbType=@"BigInt NOT NULL", IsPrimaryKey=true, UpdateCheck=UpdateCheck.Never)]
+		[DataMember(Order=1)]
+		public long ProblemParameterId
+		{
+			get { return _ProblemParameterId; }
+			set {
+				if (_ProblemParameterId != value) {
+					if (_ProblemParameter.HasLoadedOrAssignedValue) {
+						throw new ForeignKeyReferenceAlreadyHasValueException();
+					}
+					OnProblemParameterIdChanging(value);
+					SendPropertyChanging();
+					_ProblemParameterId = value;
+					SendPropertyChanged("ProblemParameterId");
+					OnProblemParameterIdChanged();
+				}
+			}
+		}
+		
+		partial void OnExperimentIdChanging(long value);
+		partial void OnExperimentIdChanged();
+		private long _ExperimentId;
+		[Column(Storage=@"_ExperimentId", DbType=@"BigInt NOT NULL", IsPrimaryKey=true, UpdateCheck=UpdateCheck.Never)]
+		[DataMember(Order=2)]
+		public long ExperimentId
+		{
+			get { return _ExperimentId; }
+			set {
+				if (_ExperimentId != value) {
+					if (_Experiment.HasLoadedOrAssignedValue) {
+						throw new ForeignKeyReferenceAlreadyHasValueException();
+					}
+					OnExperimentIdChanging(value);
+					SendPropertyChanging();
+					_ExperimentId = value;
+					SendPropertyChanged("ExperimentId");
+					OnExperimentIdChanged();
+				}
+			}
+		}
+		
+		partial void OnDataTypeIdChanging(long value);
+		partial void OnDataTypeIdChanged();
+		private long _DataTypeId;
+		[Column(Storage=@"_DataTypeId", DbType=@"BigInt NOT NULL", CanBeNull=false)]
+		[DataMember(Order=3)]
+		public long DataTypeId
+		{
+			get { return _DataTypeId; }
+			set {
+				if (_DataTypeId != value) {
+					if (_DataType.HasLoadedOrAssignedValue) {
+						throw new ForeignKeyReferenceAlreadyHasValueException();
+					}
+					OnDataTypeIdChanging(value);
+					SendPropertyChanging();
+					_DataTypeId = value;
+					SendPropertyChanged("DataTypeId");
+					OnDataTypeIdChanged();
+				}
+			}
+		}
+		
+		partial void OnValueChanging(string value);
+		partial void OnValueChanged();
+		private string _Value;
+		[Column(Storage=@"_Value", DbType=@"NVarChar(MAX) NOT NULL", CanBeNull=false)]
+		[DataMember(Order=4)]
+		public string Value
+		{
+			get { return _Value; }
+			set {
+				if (_Value != value) {
+					OnValueChanging(value);
+					SendPropertyChanging();
+					_Value = value;
+					SendPropertyChanged("Value");
+					OnValueChanged();
+				}
+			}
+		}
+		
+		#endregion
+		
+		#region Associations
+		private EntityRef<DataType> _DataType;
+		[Association(Name=@"DataType_ProblemParameterStringValue", Storage=@"_DataType", ThisKey=@"DataTypeId", OtherKey=@"Id", IsForeignKey=true)]
+		[DataMember(Order=5, EmitDefaultValue=false)]
+		public DataType DataType
+		{
+			get {
+				return _DataType.Entity;
+			}
+			set {
+				DataType previousValue = _DataType.Entity;
+				if ((previousValue != value) || (!_DataType.HasLoadedOrAssignedValue)) {
+					SendPropertyChanging();
+					if (previousValue != null) {
+						_DataType.Entity = null;
+						previousValue.ProblemParameterStringValues.Remove(this);
+					}
+					_DataType.Entity = value;
+					if (value != null) {
+						value.ProblemParameterStringValues.Add(this);
+						_DataTypeId = value.Id;
+					}
+					else {
+						_DataTypeId = default(long);
+					}
+					SendPropertyChanged("DataType");
+				}
+			}
+		}
+
+		private EntityRef<Experiment> _Experiment;
+		[Association(Name=@"Experiment_ProblemParameterStringValue", Storage=@"_Experiment", ThisKey=@"ExperimentId", OtherKey=@"Id", IsForeignKey=true)]
+		[DataMember(Order=6, EmitDefaultValue=false)]
+		public Experiment Experiment
+		{
+			get {
+				return _Experiment.Entity;
+			}
+			set {
+				Experiment previousValue = _Experiment.Entity;
+				if ((previousValue != value) || (!_Experiment.HasLoadedOrAssignedValue)) {
+					SendPropertyChanging();
+					if (previousValue != null) {
+						_Experiment.Entity = null;
+						previousValue.ProblemParameterStringValues.Remove(this);
+					}
+					_Experiment.Entity = value;
+					if (value != null) {
+						value.ProblemParameterStringValues.Add(this);
+						_ExperimentId = value.Id;
+					}
+					else {
+						_ExperimentId = default(long);
+					}
+					SendPropertyChanged("Experiment");
+				}
+			}
+		}
+
+		private EntityRef<ProblemParameter> _ProblemParameter;
+		[Association(Name=@"ProblemParameter_ProblemParameterStringValue", Storage=@"_ProblemParameter", ThisKey=@"ProblemParameterId", OtherKey=@"Id", IsForeignKey=true)]
+		[DataMember(Order=7, EmitDefaultValue=false)]
+		public ProblemParameter ProblemParameter
+		{
+			get {
+				return _ProblemParameter.Entity;
+			}
+			set {
+				ProblemParameter previousValue = _ProblemParameter.Entity;
+				if ((previousValue != value) || (!_ProblemParameter.HasLoadedOrAssignedValue)) {
+					SendPropertyChanging();
+					if (previousValue != null) {
+						_ProblemParameter.Entity = null;
+						previousValue.ProblemParameterStringValues.Remove(this);
+					}
+					_ProblemParameter.Entity = value;
+					if (value != null) {
+						value.ProblemParameterStringValues.Add(this);
+						_ProblemParameterId = value.Id;
+					}
+					else {
+						_ProblemParameterId = default(long);
+					}
+					SendPropertyChanged("ProblemParameter");
+				}
+			}
+		}
+
+		#endregion
+		
+		#region Serialization
+		[OnDeserializing()]
+		[EditorBrowsableAttribute(EditorBrowsableState.Never)]
+		public  void OnDeserializing(StreamingContext context)
+		{
+			Initialize();
+		}
+		#endregion
+	}
+}
+
+namespace HeuristicLab.Services.OKB.DataAccess
+{	
+	[DataContract(IsReference=true)]
+	[Table(Name=@"dbo.ResultBlobValue")]
+[KnownType(typeof(ResultBlobValue))]	public partial class ResultBlobValue : INotifyPropertyChanging, INotifyPropertyChanged
+	{
+		#region Property Change Event Handling
+		private static PropertyChangingEventArgs emptyChangingEventArgs = new PropertyChangingEventArgs(String.Empty);
+		
+		public event PropertyChangingEventHandler PropertyChanging;
+		public event PropertyChangedEventHandler PropertyChanged;
+		
+		public virtual void SendPropertyChanging()
+		{
+			if (PropertyChanging != null) {
+				PropertyChanging(this, emptyChangingEventArgs);
+			}
+		}
+			
+		public virtual void SendPropertyChanged(String propertyName)
+		{
+			if (PropertyChanged != null) {
+				PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
+			}
+		}
+		#endregion
+		
+		#region Extensibility Method Definitions
+		partial void OnLoaded();
+		partial void OnValidate(ChangeAction action);
+		partial void OnCreated();
+		#endregion
+
+		#region Construction
+		public ResultBlobValue()
+		{
+			Initialize();
+		}
+		
+		private void Initialize()
+		{
+			_DataType = default(EntityRef<DataType>);
+			_Result = default(EntityRef<Result>);
+			_Run = default(EntityRef<Run>);
+			OnCreated();
+		}
+		#endregion
+
+		#region Column Mappings
+		partial void OnResultIdChanging(long value);
+		partial void OnResultIdChanged();
+		private long _ResultId;
+		[Column(Storage=@"_ResultId", DbType=@"BigInt NOT NULL", IsPrimaryKey=true, UpdateCheck=UpdateCheck.Never)]
+		[DataMember(Order=1)]
+		public long ResultId
+		{
+			get { return _ResultId; }
+			set {
+				if (_ResultId != value) {
+					if (_Result.HasLoadedOrAssignedValue) {
+						throw new ForeignKeyReferenceAlreadyHasValueException();
+					}
+					OnResultIdChanging(value);
+					SendPropertyChanging();
+					_ResultId = value;
+					SendPropertyChanged("ResultId");
+					OnResultIdChanged();
+				}
+			}
+		}
+		
+		partial void OnRunIdChanging(long value);
+		partial void OnRunIdChanged();
+		private long _RunId;
+		[Column(Storage=@"_RunId", DbType=@"BigInt NOT NULL", IsPrimaryKey=true, UpdateCheck=UpdateCheck.Never)]
+		[DataMember(Order=2)]
+		public long RunId
+		{
+			get { return _RunId; }
+			set {
+				if (_RunId != value) {
+					if (_Run.HasLoadedOrAssignedValue) {
+						throw new ForeignKeyReferenceAlreadyHasValueException();
+					}
+					OnRunIdChanging(value);
+					SendPropertyChanging();
+					_RunId = value;
+					SendPropertyChanged("RunId");
+					OnRunIdChanged();
+				}
+			}
+		}
+		
+		partial void OnDataTypeIdChanging(long value);
+		partial void OnDataTypeIdChanged();
+		private long _DataTypeId;
+		[Column(Storage=@"_DataTypeId", DbType=@"BigInt NOT NULL", CanBeNull=false)]
+		[DataMember(Order=3)]
+		public long DataTypeId
+		{
+			get { return _DataTypeId; }
+			set {
+				if (_DataTypeId != value) {
+					if (_DataType.HasLoadedOrAssignedValue) {
+						throw new ForeignKeyReferenceAlreadyHasValueException();
+					}
+					OnDataTypeIdChanging(value);
+					SendPropertyChanging();
+					_DataTypeId = value;
+					SendPropertyChanged("DataTypeId");
+					OnDataTypeIdChanged();
+				}
+			}
+		}
+		
+		partial void OnValueChanging(Binary value);
+		partial void OnValueChanged();
+		private Binary _Value;
+		[Column(Storage=@"_Value", DbType=@"VarBinary(MAX) NOT NULL", CanBeNull=false, UpdateCheck=UpdateCheck.Never)]
+		[DataMember(Order=4)]
+		public Binary Value
+		{
+			get { return _Value; }
+			set {
+				if (_Value != value) {
+					OnValueChanging(value);
+					SendPropertyChanging();
+					_Value = value;
+					SendPropertyChanged("Value");
+					OnValueChanged();
+				}
+			}
+		}
+		
+		#endregion
+		
+		#region Associations
+		private EntityRef<DataType> _DataType;
+		[Association(Name=@"DataType_ResultBlobValue", Storage=@"_DataType", ThisKey=@"DataTypeId", OtherKey=@"Id", IsForeignKey=true)]
+		[DataMember(Order=5, EmitDefaultValue=false)]
+		public DataType DataType
+		{
+			get {
+				return _DataType.Entity;
+			}
+			set {
+				DataType previousValue = _DataType.Entity;
+				if ((previousValue != value) || (!_DataType.HasLoadedOrAssignedValue)) {
+					SendPropertyChanging();
+					if (previousValue != null) {
+						_DataType.Entity = null;
+						previousValue.ResultBlobValues.Remove(this);
+					}
+					_DataType.Entity = value;
+					if (value != null) {
+						value.ResultBlobValues.Add(this);
+						_DataTypeId = value.Id;
+					}
+					else {
+						_DataTypeId = default(long);
+					}
+					SendPropertyChanged("DataType");
+				}
+			}
+		}
+
+		private EntityRef<Result> _Result;
+		[Association(Name=@"Result_ResultBlobValue", Storage=@"_Result", ThisKey=@"ResultId", OtherKey=@"Id", IsForeignKey=true)]
+		[DataMember(Order=6, EmitDefaultValue=false)]
+		public Result Result
+		{
+			get {
+				return _Result.Entity;
+			}
+			set {
+				Result previousValue = _Result.Entity;
+				if ((previousValue != value) || (!_Result.HasLoadedOrAssignedValue)) {
+					SendPropertyChanging();
+					if (previousValue != null) {
+						_Result.Entity = null;
+						previousValue.ResultBlobValues.Remove(this);
+					}
+					_Result.Entity = value;
+					if (value != null) {
+						value.ResultBlobValues.Add(this);
+						_ResultId = value.Id;
+					}
+					else {
+						_ResultId = default(long);
+					}
+					SendPropertyChanged("Result");
+				}
+			}
+		}
+
+		private EntityRef<Run> _Run;
+		[Association(Name=@"Run_ResultBlobValue", Storage=@"_Run", ThisKey=@"RunId", OtherKey=@"Id", IsForeignKey=true)]
+		[DataMember(Order=7, EmitDefaultValue=false)]
+		public Run Run
+		{
+			get {
+				return _Run.Entity;
+			}
+			set {
+				Run previousValue = _Run.Entity;
+				if ((previousValue != value) || (!_Run.HasLoadedOrAssignedValue)) {
+					SendPropertyChanging();
+					if (previousValue != null) {
+						_Run.Entity = null;
+						previousValue.ResultBlobValues.Remove(this);
+					}
+					_Run.Entity = value;
+					if (value != null) {
+						value.ResultBlobValues.Add(this);
+						_RunId = value.Id;
+					}
+					else {
+						_RunId = default(long);
+					}
+					SendPropertyChanged("Run");
+				}
+			}
+		}
+
+		#endregion
+		
+		#region Serialization
+		[OnDeserializing()]
+		[EditorBrowsableAttribute(EditorBrowsableState.Never)]
+		public  void OnDeserializing(StreamingContext context)
+		{
+			Initialize();
+		}
+		#endregion
+	}
+}
+
+namespace HeuristicLab.Services.OKB.DataAccess
+{	
+	[DataContract(IsReference=true)]
+	[Table(Name=@"dbo.ResultBoolValue")]
+[KnownType(typeof(ResultBoolValue))]	public partial class ResultBoolValue : INotifyPropertyChanging, INotifyPropertyChanged
+	{
+		#region Property Change Event Handling
+		private static PropertyChangingEventArgs emptyChangingEventArgs = new PropertyChangingEventArgs(String.Empty);
+		
+		public event PropertyChangingEventHandler PropertyChanging;
+		public event PropertyChangedEventHandler PropertyChanged;
+		
+		public virtual void SendPropertyChanging()
+		{
+			if (PropertyChanging != null) {
+				PropertyChanging(this, emptyChangingEventArgs);
+			}
+		}
+			
+		public virtual void SendPropertyChanged(String propertyName)
+		{
+			if (PropertyChanged != null) {
+				PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
+			}
+		}
+		#endregion
+		
+		#region Extensibility Method Definitions
+		partial void OnLoaded();
+		partial void OnValidate(ChangeAction action);
+		partial void OnCreated();
+		#endregion
+
+		#region Construction
+		public ResultBoolValue()
+		{
+			Initialize();
+		}
+		
+		private void Initialize()
+		{
+			_DataType = default(EntityRef<DataType>);
+			_Result = default(EntityRef<Result>);
+			_Run = default(EntityRef<Run>);
+			OnCreated();
+		}
+		#endregion
+
+		#region Column Mappings
+		partial void OnResultIdChanging(long value);
+		partial void OnResultIdChanged();
+		private long _ResultId;
+		[Column(Storage=@"_ResultId", DbType=@"BigInt NOT NULL", IsPrimaryKey=true, UpdateCheck=UpdateCheck.Never)]
+		[DataMember(Order=1)]
+		public long ResultId
+		{
+			get { return _ResultId; }
+			set {
+				if (_ResultId != value) {
+					if (_Result.HasLoadedOrAssignedValue) {
+						throw new ForeignKeyReferenceAlreadyHasValueException();
+					}
+					OnResultIdChanging(value);
+					SendPropertyChanging();
+					_ResultId = value;
+					SendPropertyChanged("ResultId");
+					OnResultIdChanged();
+				}
+			}
+		}
+		
+		partial void OnRunIdChanging(long value);
+		partial void OnRunIdChanged();
+		private long _RunId;
+		[Column(Storage=@"_RunId", DbType=@"BigInt NOT NULL", IsPrimaryKey=true, UpdateCheck=UpdateCheck.Never)]
+		[DataMember(Order=2)]
+		public long RunId
+		{
+			get { return _RunId; }
+			set {
+				if (_RunId != value) {
+					if (_Run.HasLoadedOrAssignedValue) {
+						throw new ForeignKeyReferenceAlreadyHasValueException();
+					}
+					OnRunIdChanging(value);
+					SendPropertyChanging();
+					_RunId = value;
+					SendPropertyChanged("RunId");
+					OnRunIdChanged();
+				}
+			}
+		}
+		
+		partial void OnDataTypeIdChanging(long value);
+		partial void OnDataTypeIdChanged();
+		private long _DataTypeId;
+		[Column(Storage=@"_DataTypeId", DbType=@"BigInt NOT NULL", CanBeNull=false)]
+		[DataMember(Order=3)]
+		public long DataTypeId
+		{
+			get { return _DataTypeId; }
+			set {
+				if (_DataTypeId != value) {
+					if (_DataType.HasLoadedOrAssignedValue) {
+						throw new ForeignKeyReferenceAlreadyHasValueException();
+					}
+					OnDataTypeIdChanging(value);
+					SendPropertyChanging();
+					_DataTypeId = value;
+					SendPropertyChanged("DataTypeId");
+					OnDataTypeIdChanged();
+				}
+			}
+		}
+		
+		partial void OnValueChanging(bool value);
+		partial void OnValueChanged();
+		private bool _Value;
+		[Column(Storage=@"_Value", DbType=@"Bit NOT NULL", CanBeNull=false)]
+		[DataMember(Order=4)]
+		public bool Value
+		{
+			get { return _Value; }
+			set {
+				if (_Value != value) {
+					OnValueChanging(value);
+					SendPropertyChanging();
+					_Value = value;
+					SendPropertyChanged("Value");
+					OnValueChanged();
+				}
+			}
+		}
+		
+		#endregion
+		
+		#region Associations
+		private EntityRef<DataType> _DataType;
+		[Association(Name=@"DataType_ResultBoolValue", Storage=@"_DataType", ThisKey=@"DataTypeId", OtherKey=@"Id", IsForeignKey=true)]
+		[DataMember(Order=5, EmitDefaultValue=false)]
+		public DataType DataType
+		{
+			get {
+				return _DataType.Entity;
+			}
+			set {
+				DataType previousValue = _DataType.Entity;
+				if ((previousValue != value) || (!_DataType.HasLoadedOrAssignedValue)) {
+					SendPropertyChanging();
+					if (previousValue != null) {
+						_DataType.Entity = null;
+						previousValue.ResultBoolValues.Remove(this);
+					}
+					_DataType.Entity = value;
+					if (value != null) {
+						value.ResultBoolValues.Add(this);
+						_DataTypeId = value.Id;
+					}
+					else {
+						_DataTypeId = default(long);
+					}
+					SendPropertyChanged("DataType");
+				}
+			}
+		}
+
+		private EntityRef<Result> _Result;
+		[Association(Name=@"Result_ResultBoolValue", Storage=@"_Result", ThisKey=@"ResultId", OtherKey=@"Id", IsForeignKey=true)]
+		[DataMember(Order=6, EmitDefaultValue=false)]
+		public Result Result
+		{
+			get {
+				return _Result.Entity;
+			}
+			set {
+				Result previousValue = _Result.Entity;
+				if ((previousValue != value) || (!_Result.HasLoadedOrAssignedValue)) {
+					SendPropertyChanging();
+					if (previousValue != null) {
+						_Result.Entity = null;
+						previousValue.ResultBoolValues.Remove(this);
+					}
+					_Result.Entity = value;
+					if (value != null) {
+						value.ResultBoolValues.Add(this);
+						_ResultId = value.Id;
+					}
+					else {
+						_ResultId = default(long);
+					}
+					SendPropertyChanged("Result");
+				}
+			}
+		}
+
+		private EntityRef<Run> _Run;
+		[Association(Name=@"Run_ResultBoolValue", Storage=@"_Run", ThisKey=@"RunId", OtherKey=@"Id", IsForeignKey=true)]
+		[DataMember(Order=7, EmitDefaultValue=false)]
+		public Run Run
+		{
+			get {
+				return _Run.Entity;
+			}
+			set {
+				Run previousValue = _Run.Entity;
+				if ((previousValue != value) || (!_Run.HasLoadedOrAssignedValue)) {
+					SendPropertyChanging();
+					if (previousValue != null) {
+						_Run.Entity = null;
+						previousValue.ResultBoolValues.Remove(this);
+					}
+					_Run.Entity = value;
+					if (value != null) {
+						value.ResultBoolValues.Add(this);
+						_RunId = value.Id;
+					}
+					else {
+						_RunId = default(long);
+					}
+					SendPropertyChanged("Run");
+				}
+			}
+		}
+
+		#endregion
+		
+		#region Serialization
+		[OnDeserializing()]
+		[EditorBrowsableAttribute(EditorBrowsableState.Never)]
+		public  void OnDeserializing(StreamingContext context)
+		{
+			Initialize();
+		}
+		#endregion
+	}
+}
+
+namespace HeuristicLab.Services.OKB.DataAccess
+{	
+	[DataContract(IsReference=true)]
+	[Table(Name=@"dbo.ResultFloatValue")]
+[KnownType(typeof(ResultFloatValue))]	public partial class ResultFloatValue : INotifyPropertyChanging, INotifyPropertyChanged
+	{
+		#region Property Change Event Handling
+		private static PropertyChangingEventArgs emptyChangingEventArgs = new PropertyChangingEventArgs(String.Empty);
+		
+		public event PropertyChangingEventHandler PropertyChanging;
+		public event PropertyChangedEventHandler PropertyChanged;
+		
+		public virtual void SendPropertyChanging()
+		{
+			if (PropertyChanging != null) {
+				PropertyChanging(this, emptyChangingEventArgs);
+			}
+		}
+			
+		public virtual void SendPropertyChanged(String propertyName)
+		{
+			if (PropertyChanged != null) {
+				PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
+			}
+		}
+		#endregion
+		
+		#region Extensibility Method Definitions
+		partial void OnLoaded();
+		partial void OnValidate(ChangeAction action);
+		partial void OnCreated();
+		#endregion
+
+		#region Construction
+		public ResultFloatValue()
+		{
+			Initialize();
+		}
+		
+		private void Initialize()
+		{
+			_DataType = default(EntityRef<DataType>);
+			_Result = default(EntityRef<Result>);
+			_Run = default(EntityRef<Run>);
+			OnCreated();
+		}
+		#endregion
+
+		#region Column Mappings
+		partial void OnResultIdChanging(long value);
+		partial void OnResultIdChanged();
+		private long _ResultId;
+		[Column(Storage=@"_ResultId", DbType=@"BigInt NOT NULL", IsPrimaryKey=true, UpdateCheck=UpdateCheck.Never)]
+		[DataMember(Order=1)]
+		public long ResultId
+		{
+			get { return _ResultId; }
+			set {
+				if (_ResultId != value) {
+					if (_Result.HasLoadedOrAssignedValue) {
+						throw new ForeignKeyReferenceAlreadyHasValueException();
+					}
+					OnResultIdChanging(value);
+					SendPropertyChanging();
+					_ResultId = value;
+					SendPropertyChanged("ResultId");
+					OnResultIdChanged();
+				}
+			}
+		}
+		
+		partial void OnRunIdChanging(long value);
+		partial void OnRunIdChanged();
+		private long _RunId;
+		[Column(Storage=@"_RunId", DbType=@"BigInt NOT NULL", IsPrimaryKey=true, UpdateCheck=UpdateCheck.Never)]
+		[DataMember(Order=2)]
+		public long RunId
+		{
+			get { return _RunId; }
+			set {
+				if (_RunId != value) {
+					if (_Run.HasLoadedOrAssignedValue) {
+						throw new ForeignKeyReferenceAlreadyHasValueException();
+					}
+					OnRunIdChanging(value);
+					SendPropertyChanging();
+					_RunId = value;
+					SendPropertyChanged("RunId");
+					OnRunIdChanged();
+				}
+			}
+		}
+		
+		partial void OnDataTypeIdChanging(long value);
+		partial void OnDataTypeIdChanged();
+		private long _DataTypeId;
+		[Column(Storage=@"_DataTypeId", DbType=@"BigInt NOT NULL", CanBeNull=false)]
+		[DataMember(Order=3)]
+		public long DataTypeId
+		{
+			get { return _DataTypeId; }
+			set {
+				if (_DataTypeId != value) {
+					if (_DataType.HasLoadedOrAssignedValue) {
+						throw new ForeignKeyReferenceAlreadyHasValueException();
+					}
+					OnDataTypeIdChanging(value);
+					SendPropertyChanging();
+					_DataTypeId = value;
+					SendPropertyChanged("DataTypeId");
+					OnDataTypeIdChanged();
+				}
+			}
+		}
+		
+		partial void OnValueChanging(double value);
+		partial void OnValueChanged();
+		private double _Value;
+		[Column(Storage=@"_Value", DbType=@"Float NOT NULL", CanBeNull=false)]
+		[DataMember(Order=4)]
+		public double Value
+		{
+			get { return _Value; }
+			set {
+				if (_Value != value) {
+					OnValueChanging(value);
+					SendPropertyChanging();
+					_Value = value;
+					SendPropertyChanged("Value");
+					OnValueChanged();
+				}
+			}
+		}
+		
+		#endregion
+		
+		#region Associations
+		private EntityRef<DataType> _DataType;
+		[Association(Name=@"DataType_ResultFloatValue", Storage=@"_DataType", ThisKey=@"DataTypeId", OtherKey=@"Id", IsForeignKey=true)]
+		[DataMember(Order=5, EmitDefaultValue=false)]
+		public DataType DataType
+		{
+			get {
+				return _DataType.Entity;
+			}
+			set {
+				DataType previousValue = _DataType.Entity;
+				if ((previousValue != value) || (!_DataType.HasLoadedOrAssignedValue)) {
+					SendPropertyChanging();
+					if (previousValue != null) {
+						_DataType.Entity = null;
+						previousValue.ResultFloatValues.Remove(this);
+					}
+					_DataType.Entity = value;
+					if (value != null) {
+						value.ResultFloatValues.Add(this);
+						_DataTypeId = value.Id;
+					}
+					else {
+						_DataTypeId = default(long);
+					}
+					SendPropertyChanged("DataType");
+				}
+			}
+		}
+
+		private EntityRef<Result> _Result;
+		[Association(Name=@"Result_ResultFloatValue", Storage=@"_Result", ThisKey=@"ResultId", OtherKey=@"Id", IsForeignKey=true)]
+		[DataMember(Order=6, EmitDefaultValue=false)]
+		public Result Result
+		{
+			get {
+				return _Result.Entity;
+			}
+			set {
+				Result previousValue = _Result.Entity;
+				if ((previousValue != value) || (!_Result.HasLoadedOrAssignedValue)) {
+					SendPropertyChanging();
+					if (previousValue != null) {
+						_Result.Entity = null;
+						previousValue.ResultFloatValues.Remove(this);
+					}
+					_Result.Entity = value;
+					if (value != null) {
+						value.ResultFloatValues.Add(this);
+						_ResultId = value.Id;
+					}
+					else {
+						_ResultId = default(long);
+					}
+					SendPropertyChanged("Result");
+				}
+			}
+		}
+
+		private EntityRef<Run> _Run;
+		[Association(Name=@"Run_ResultFloatValue", Storage=@"_Run", ThisKey=@"RunId", OtherKey=@"Id", IsForeignKey=true)]
+		[DataMember(Order=7, EmitDefaultValue=false)]
+		public Run Run
+		{
+			get {
+				return _Run.Entity;
+			}
+			set {
+				Run previousValue = _Run.Entity;
+				if ((previousValue != value) || (!_Run.HasLoadedOrAssignedValue)) {
+					SendPropertyChanging();
+					if (previousValue != null) {
+						_Run.Entity = null;
+						previousValue.ResultFloatValues.Remove(this);
+					}
+					_Run.Entity = value;
+					if (value != null) {
+						value.ResultFloatValues.Add(this);
+						_RunId = value.Id;
+					}
+					else {
+						_RunId = default(long);
+					}
+					SendPropertyChanged("Run");
+				}
+			}
+		}
+
+		#endregion
+		
+		#region Serialization
+		[OnDeserializing()]
+		[EditorBrowsableAttribute(EditorBrowsableState.Never)]
+		public  void OnDeserializing(StreamingContext context)
+		{
+			Initialize();
+		}
+		#endregion
+	}
+}
+
+namespace HeuristicLab.Services.OKB.DataAccess
+{	
+	[DataContract(IsReference=true)]
+	[Table(Name=@"dbo.ResultIntValue")]
+[KnownType(typeof(ResultIntValue))]	public partial class ResultIntValue : INotifyPropertyChanging, INotifyPropertyChanged
+	{
+		#region Property Change Event Handling
+		private static PropertyChangingEventArgs emptyChangingEventArgs = new PropertyChangingEventArgs(String.Empty);
+		
+		public event PropertyChangingEventHandler PropertyChanging;
+		public event PropertyChangedEventHandler PropertyChanged;
+		
+		public virtual void SendPropertyChanging()
+		{
+			if (PropertyChanging != null) {
+				PropertyChanging(this, emptyChangingEventArgs);
+			}
+		}
+			
+		public virtual void SendPropertyChanged(String propertyName)
+		{
+			if (PropertyChanged != null) {
+				PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
+			}
+		}
+		#endregion
+		
+		#region Extensibility Method Definitions
+		partial void OnLoaded();
+		partial void OnValidate(ChangeAction action);
+		partial void OnCreated();
+		#endregion
+
+		#region Construction
+		public ResultIntValue()
+		{
+			Initialize();
+		}
+		
+		private void Initialize()
+		{
+			_DataType = default(EntityRef<DataType>);
+			_Result = default(EntityRef<Result>);
+			_Run = default(EntityRef<Run>);
+			OnCreated();
+		}
+		#endregion
+
+		#region Column Mappings
+		partial void OnResultIdChanging(long value);
+		partial void OnResultIdChanged();
+		private long _ResultId;
+		[Column(Storage=@"_ResultId", DbType=@"BigInt NOT NULL", IsPrimaryKey=true, UpdateCheck=UpdateCheck.Never)]
+		[DataMember(Order=1)]
+		public long ResultId
+		{
+			get { return _ResultId; }
+			set {
+				if (_ResultId != value) {
+					if (_Result.HasLoadedOrAssignedValue) {
+						throw new ForeignKeyReferenceAlreadyHasValueException();
+					}
+					OnResultIdChanging(value);
+					SendPropertyChanging();
+					_ResultId = value;
+					SendPropertyChanged("ResultId");
+					OnResultIdChanged();
+				}
+			}
+		}
+		
+		partial void OnRunIdChanging(long value);
+		partial void OnRunIdChanged();
+		private long _RunId;
+		[Column(Storage=@"_RunId", DbType=@"BigInt NOT NULL", IsPrimaryKey=true, UpdateCheck=UpdateCheck.Never)]
+		[DataMember(Order=2)]
+		public long RunId
+		{
+			get { return _RunId; }
+			set {
+				if (_RunId != value) {
+					if (_Run.HasLoadedOrAssignedValue) {
+						throw new ForeignKeyReferenceAlreadyHasValueException();
+					}
+					OnRunIdChanging(value);
+					SendPropertyChanging();
+					_RunId = value;
+					SendPropertyChanged("RunId");
+					OnRunIdChanged();
+				}
+			}
+		}
+		
+		partial void OnDataTypeIdChanging(long value);
+		partial void OnDataTypeIdChanged();
+		private long _DataTypeId;
+		[Column(Storage=@"_DataTypeId", DbType=@"BigInt NOT NULL", CanBeNull=false)]
+		[DataMember(Order=3)]
+		public long DataTypeId
+		{
+			get { return _DataTypeId; }
+			set {
+				if (_DataTypeId != value) {
+					if (_DataType.HasLoadedOrAssignedValue) {
+						throw new ForeignKeyReferenceAlreadyHasValueException();
+					}
+					OnDataTypeIdChanging(value);
+					SendPropertyChanging();
+					_DataTypeId = value;
+					SendPropertyChanged("DataTypeId");
+					OnDataTypeIdChanged();
+				}
+			}
+		}
+		
+		partial void OnValueChanging(long value);
+		partial void OnValueChanged();
+		private long _Value;
+		[Column(Storage=@"_Value", DbType=@"BigInt NOT NULL", CanBeNull=false)]
+		[DataMember(Order=4)]
+		public long Value
+		{
+			get { return _Value; }
+			set {
+				if (_Value != value) {
+					OnValueChanging(value);
+					SendPropertyChanging();
+					_Value = value;
+					SendPropertyChanged("Value");
+					OnValueChanged();
+				}
+			}
+		}
+		
+		#endregion
+		
+		#region Associations
+		private EntityRef<DataType> _DataType;
+		[Association(Name=@"DataType_ResultIntValue", Storage=@"_DataType", ThisKey=@"DataTypeId", OtherKey=@"Id", IsForeignKey=true)]
+		[DataMember(Order=5, EmitDefaultValue=false)]
+		public DataType DataType
+		{
+			get {
+				return _DataType.Entity;
+			}
+			set {
+				DataType previousValue = _DataType.Entity;
+				if ((previousValue != value) || (!_DataType.HasLoadedOrAssignedValue)) {
+					SendPropertyChanging();
+					if (previousValue != null) {
+						_DataType.Entity = null;
+						previousValue.ResultIntValues.Remove(this);
+					}
+					_DataType.Entity = value;
+					if (value != null) {
+						value.ResultIntValues.Add(this);
+						_DataTypeId = value.Id;
+					}
+					else {
+						_DataTypeId = default(long);
+					}
+					SendPropertyChanged("DataType");
+				}
+			}
+		}
+
+		private EntityRef<Result> _Result;
+		[Association(Name=@"Result_ResultIntValue", Storage=@"_Result", ThisKey=@"ResultId", OtherKey=@"Id", IsForeignKey=true)]
+		[DataMember(Order=6, EmitDefaultValue=false)]
+		public Result Result
+		{
+			get {
+				return _Result.Entity;
+			}
+			set {
+				Result previousValue = _Result.Entity;
+				if ((previousValue != value) || (!_Result.HasLoadedOrAssignedValue)) {
+					SendPropertyChanging();
+					if (previousValue != null) {
+						_Result.Entity = null;
+						previousValue.ResultIntValues.Remove(this);
+					}
+					_Result.Entity = value;
+					if (value != null) {
+						value.ResultIntValues.Add(this);
+						_ResultId = value.Id;
+					}
+					else {
+						_ResultId = default(long);
+					}
+					SendPropertyChanged("Result");
+				}
+			}
+		}
+
+		private EntityRef<Run> _Run;
+		[Association(Name=@"Run_ResultIntValue", Storage=@"_Run", ThisKey=@"RunId", OtherKey=@"Id", IsForeignKey=true)]
+		[DataMember(Order=7, EmitDefaultValue=false)]
+		public Run Run
+		{
+			get {
+				return _Run.Entity;
+			}
+			set {
+				Run previousValue = _Run.Entity;
+				if ((previousValue != value) || (!_Run.HasLoadedOrAssignedValue)) {
+					SendPropertyChanging();
+					if (previousValue != null) {
+						_Run.Entity = null;
+						previousValue.ResultIntValues.Remove(this);
+					}
+					_Run.Entity = value;
+					if (value != null) {
+						value.ResultIntValues.Add(this);
+						_RunId = value.Id;
+					}
+					else {
+						_RunId = default(long);
+					}
+					SendPropertyChanged("Run");
+				}
+			}
+		}
+
+		#endregion
+		
+		#region Serialization
+		[OnDeserializing()]
+		[EditorBrowsableAttribute(EditorBrowsableState.Never)]
+		public  void OnDeserializing(StreamingContext context)
+		{
+			Initialize();
+		}
+		#endregion
+	}
+}
+
+namespace HeuristicLab.Services.OKB.DataAccess
+{	
+	[DataContract(IsReference=true)]
+	[Table(Name=@"dbo.ResultStringValue")]
+[KnownType(typeof(ResultStringValue))]	public partial class ResultStringValue : INotifyPropertyChanging, INotifyPropertyChanged
+	{
+		#region Property Change Event Handling
+		private static PropertyChangingEventArgs emptyChangingEventArgs = new PropertyChangingEventArgs(String.Empty);
+		
+		public event PropertyChangingEventHandler PropertyChanging;
+		public event PropertyChangedEventHandler PropertyChanged;
+		
+		public virtual void SendPropertyChanging()
+		{
+			if (PropertyChanging != null) {
+				PropertyChanging(this, emptyChangingEventArgs);
+			}
+		}
+			
+		public virtual void SendPropertyChanged(String propertyName)
+		{
+			if (PropertyChanged != null) {
+				PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
+			}
+		}
+		#endregion
+		
+		#region Extensibility Method Definitions
+		partial void OnLoaded();
+		partial void OnValidate(ChangeAction action);
+		partial void OnCreated();
+		#endregion
+
+		#region Construction
+		public ResultStringValue()
+		{
+			Initialize();
+		}
+		
+		private void Initialize()
+		{
+			_DataType = default(EntityRef<DataType>);
+			_Result = default(EntityRef<Result>);
+			_Run = default(EntityRef<Run>);
+			OnCreated();
+		}
+		#endregion
+
+		#region Column Mappings
+		partial void OnResultIdChanging(long value);
+		partial void OnResultIdChanged();
+		private long _ResultId;
+		[Column(Storage=@"_ResultId", DbType=@"BigInt NOT NULL", IsPrimaryKey=true, UpdateCheck=UpdateCheck.Never)]
+		[DataMember(Order=1)]
+		public long ResultId
+		{
+			get { return _ResultId; }
+			set {
+				if (_ResultId != value) {
+					if (_Result.HasLoadedOrAssignedValue) {
+						throw new ForeignKeyReferenceAlreadyHasValueException();
+					}
+					OnResultIdChanging(value);
+					SendPropertyChanging();
+					_ResultId = value;
+					SendPropertyChanged("ResultId");
+					OnResultIdChanged();
+				}
+			}
+		}
+		
+		partial void OnRunIdChanging(long value);
+		partial void OnRunIdChanged();
+		private long _RunId;
+		[Column(Storage=@"_RunId", DbType=@"BigInt NOT NULL", IsPrimaryKey=true, UpdateCheck=UpdateCheck.Never)]
+		[DataMember(Order=2)]
+		public long RunId
+		{
+			get { return _RunId; }
+			set {
+				if (_RunId != value) {
+					if (_Run.HasLoadedOrAssignedValue) {
+						throw new ForeignKeyReferenceAlreadyHasValueException();
+					}
+					OnRunIdChanging(value);
+					SendPropertyChanging();
+					_RunId = value;
+					SendPropertyChanged("RunId");
+					OnRunIdChanged();
+				}
+			}
+		}
+		
+		partial void OnDataTypeIdChanging(long value);
+		partial void OnDataTypeIdChanged();
+		private long _DataTypeId;
+		[Column(Storage=@"_DataTypeId", DbType=@"BigInt NOT NULL", CanBeNull=false)]
+		[DataMember(Order=3)]
+		public long DataTypeId
+		{
+			get { return _DataTypeId; }
+			set {
+				if (_DataTypeId != value) {
+					if (_DataType.HasLoadedOrAssignedValue) {
+						throw new ForeignKeyReferenceAlreadyHasValueException();
+					}
+					OnDataTypeIdChanging(value);
+					SendPropertyChanging();
+					_DataTypeId = value;
+					SendPropertyChanged("DataTypeId");
+					OnDataTypeIdChanged();
+				}
+			}
+		}
+		
+		partial void OnValueChanging(string value);
+		partial void OnValueChanged();
+		private string _Value;
+		[Column(Storage=@"_Value", DbType=@"NVarChar(MAX) NOT NULL", CanBeNull=false)]
+		[DataMember(Order=4)]
+		public string Value
+		{
+			get { return _Value; }
+			set {
+				if (_Value != value) {
+					OnValueChanging(value);
+					SendPropertyChanging();
+					_Value = value;
+					SendPropertyChanged("Value");
+					OnValueChanged();
+				}
+			}
+		}
+		
+		#endregion
+		
+		#region Associations
+		private EntityRef<DataType> _DataType;
+		[Association(Name=@"DataType_ResultStringValue", Storage=@"_DataType", ThisKey=@"DataTypeId", OtherKey=@"Id", IsForeignKey=true)]
+		[DataMember(Order=5, EmitDefaultValue=false)]
+		public DataType DataType
+		{
+			get {
+				return _DataType.Entity;
+			}
+			set {
+				DataType previousValue = _DataType.Entity;
+				if ((previousValue != value) || (!_DataType.HasLoadedOrAssignedValue)) {
+					SendPropertyChanging();
+					if (previousValue != null) {
+						_DataType.Entity = null;
+						previousValue.ResultStringValues.Remove(this);
+					}
+					_DataType.Entity = value;
+					if (value != null) {
+						value.ResultStringValues.Add(this);
+						_DataTypeId = value.Id;
+					}
+					else {
+						_DataTypeId = default(long);
+					}
+					SendPropertyChanged("DataType");
+				}
+			}
+		}
+
+		private EntityRef<Result> _Result;
+		[Association(Name=@"Result_ResultStringValue", Storage=@"_Result", ThisKey=@"ResultId", OtherKey=@"Id", IsForeignKey=true)]
+		[DataMember(Order=6, EmitDefaultValue=false)]
+		public Result Result
+		{
+			get {
+				return _Result.Entity;
+			}
+			set {
+				Result previousValue = _Result.Entity;
+				if ((previousValue != value) || (!_Result.HasLoadedOrAssignedValue)) {
+					SendPropertyChanging();
+					if (previousValue != null) {
+						_Result.Entity = null;
+						previousValue.ResultStringValues.Remove(this);
+					}
+					_Result.Entity = value;
+					if (value != null) {
+						value.ResultStringValues.Add(this);
+						_ResultId = value.Id;
+					}
+					else {
+						_ResultId = default(long);
+					}
+					SendPropertyChanged("Result");
+				}
+			}
+		}
+
+		private EntityRef<Run> _Run;
+		[Association(Name=@"Run_ResultStringValue", Storage=@"_Run", ThisKey=@"RunId", OtherKey=@"Id", IsForeignKey=true)]
+		[DataMember(Order=7, EmitDefaultValue=false)]
+		public Run Run
+		{
+			get {
+				return _Run.Entity;
+			}
+			set {
+				Run previousValue = _Run.Entity;
+				if ((previousValue != value) || (!_Run.HasLoadedOrAssignedValue)) {
+					SendPropertyChanging();
+					if (previousValue != null) {
+						_Run.Entity = null;
+						previousValue.ResultStringValues.Remove(this);
+					}
+					_Run.Entity = value;
+					if (value != null) {
+						value.ResultStringValues.Add(this);
+						_RunId = value.Id;
+					}
+					else {
+						_RunId = default(long);
+					}
+					SendPropertyChanged("Run");
+				}
+			}
+		}
+
+		#endregion
+		
+		#region Serialization
+		[OnDeserializing()]
+		[EditorBrowsableAttribute(EditorBrowsableState.Never)]
+		public  void OnDeserializing(StreamingContext context)
+		{
+			Initialize();
+		}
+		#endregion
+	}
+}
+#pragma warning restore 1591
Index: /branches/OKB/HeuristicLab.Services.OKB.DataAccess/3.3/OKB.tt
===================================================================
--- /branches/OKB/HeuristicLab.Services.OKB.DataAccess/3.3/OKB.tt	(revision 4480)
+++ /branches/OKB/HeuristicLab.Services.OKB.DataAccess/3.3/OKB.tt	(revision 4480)
@@ -0,0 +1,488 @@
+﻿<# // L2ST4 - LINQ to SQL templates for T4 v0.82 - http://www.codeplex.com/l2st4
+// Copyright (c) Microsoft Corporation.  All rights reserved.
+// This source code is made available under the terms of the Microsoft Public License (MS-PL)
+#><#@ template language="C#" hostspecific="True"
+#><#@ include file="L2ST4.ttinclude"
+#><#@ output extension=".generated.cs"
+#><# // Set options here
+var options = new {
+	DbmlFileName = Host.TemplateFile.Replace(".tt",".dbml"), // Which DBML file to operate on (same filename as template)
+	SerializeDataContractSP1 = true, // Emit SP1 DataContract serializer attributes
+	FilePerEntity = false, // Put each class into a separate file
+	StoredProcedureConcurrency = false, // Table updates via an SP require @@rowcount to be returned to enable concurrency
+	EntityFilePath = Path.GetDirectoryName(Host.TemplateFile) // Where to put the files	
+};
+var code = new CSharpCodeLanguage();
+var data = new Data(options.DbmlFileName);
+var manager = new Manager(Host, GenerationEnvironment, true) { OutputPath = options.EntityFilePath };
+data.ContextNamespace = (new string[] { manager.GetCustomToolNamespace(data.DbmlFileName), data.SpecifiedContextNamespace, manager.DefaultProjectNamespace }).FirstOrDefault(s => !String.IsNullOrEmpty(s));
+data.EntityNamespace = (new string[] { manager.GetCustomToolNamespace(data.DbmlFileName), data.SpecifiedEntityNamespace, manager.DefaultProjectNamespace }).FirstOrDefault(s => !String.IsNullOrEmpty(s));
+manager.StartHeader();
+#>#pragma warning disable 1591
+//------------------------------------------------------------------------------
+// <auto-generated>
+//     This code was generated by LINQ to SQL template for T4 C#
+//     Generated at <#=DateTime.Now#>
+//
+//     Changes to this file may cause incorrect behavior and will be lost if
+//     the code is regenerated.
+// </auto-generated>
+//------------------------------------------------------------------------------
+using System;
+using System.ComponentModel;
+using System.Data.Linq;
+using System.Data.Linq.Mapping;
+<#if (data.Functions.Count > 0) {#>
+using System.Reflection;
+<#}
+string dataContractAttributes = (options.SerializeDataContractSP1) ? "IsReference=true" : "";
+if (data.Serialization) {#>
+using System.Runtime.Serialization;
+<#}#>
+
+<# manager.EndHeader();
+if(!String.IsNullOrEmpty(data.ContextNamespace)){#>
+namespace <#=data.ContextNamespace#>
+{
+<#}#>
+	[DatabaseAttribute(Name=@"<#=data.DatabaseName#>")]
+	<#=code.Format(data.TypeAttributes)#>partial class <#=data.ContextName#> : <#=data.BaseClassName#>
+	{
+		private static MappingSource mappingSource = new AttributeMappingSource();
+		
+		#region Extensibility Method Definitions
+		partial void OnCreated();
+<#	var tableOperations = new List<TableOperation>();
+	foreach(var table in data.Tables)
+		tableOperations.AddRange(table.Operations);
+	foreach(Table table in data.Tables)
+		foreach(OperationType operationType in Enum.GetValues(typeof(OperationType)))
+			if (!tableOperations.Any(o => (o.Table == table) && (o.Type == operationType))) {#>
+		partial void <#=operationType#><#=table.BaseClass.Name#>(<#=table.BaseClass.QualifiedName#> instance);
+<#}#>
+		#endregion
+		
+		#region Construction
+<#if (data.ConnectSettingsObject != null) {#>
+		public <#=data.ContextName#>() :
+			base(global::<#=data.ConnectSettingsObject#>.Default.<#=data.ConnectSettingsProperty#>, mappingSource)
+		{
+			OnCreated();
+		}
+<#}#>	
+		public <#=data.ContextName#>(string connection) :
+			base(connection, mappingSource)
+		{
+			OnCreated();
+		}
+		
+		public <#=data.ContextName#>(System.Data.IDbConnection connection) :
+			base(connection, mappingSource)
+		{
+			OnCreated();
+		}
+		
+		public <#=data.ContextName#>(string connection, MappingSource mappingSource) :
+			base(connection, mappingSource)
+		{
+			OnCreated();
+		}
+		
+		public <#=data.ContextName#>(System.Data.IDbConnection connection, MappingSource mappingSource) :
+			base(connection, mappingSource)
+		{
+			OnCreated();
+		}
+		#endregion
+<#if(data.Tables.Count > 0) {#>
+		
+		#region Tables
+<#	foreach(Table table in data.Tables) {
+#>		<#=code.GetAccess(table.BaseClass.TypeAttributes)#>Table<<#=table.BaseClass.QualifiedName#>> <#=table.Member#>
+		{
+			get { return GetTable<<#=table.BaseClass.QualifiedName#>>(); }
+		}
+		
+<#	}
+#>		#endregion
+<#}
+if (data.Functions.Count > 0) {#>
+		
+		#region Functions
+<#	foreach(Function function in data.Functions) {
+#>
+		[Function(Name=@"<#=function.Name#>"<#
+		if (function.IsComposable) {#>, IsComposable=true<#}
+		#>)]
+<#		if (function.Return != null && function.Return.DbType != null) {
+#>		[return: Parameter(DbType=@"<#=function.Return.DbType#>")]
+<#		}
+		if (function.HasMultipleResults) {
+			foreach(Class class1 in function.Classes) {#>
+		[ResultType(typeof(<#=class1.QualifiedName#>))]
+<#			}
+		}#>
+		<#=code.Format(function.MemberAttributes)#><#=code.Format(function.ReturnType)#> <#=function.Method#>(<#
+		foreach(Parameter parameter in function.Parameters) {#>
+
+					[Parameter(Name=@"<#=parameter.DbName#>", DbType=@"<#=parameter.DbType#>")] <#=code.Format(parameter.Direction)#><#=code.Format(parameter.Type)#> <#=parameter.Name#><#
+			if (parameter != function.Parameters.Last()) {#>,<# }
+		}
+		#>) {
+<#		foreach(Parameter outParameter in function.Parameters.Where(p => p.Direction == ParameterDirection.Out)) {#>
+			<#=outParameter.Name#> = default(<#=code.Format(outParameter.Type)#>);
+<#		}#>
+			IExecuteResult result = ExecuteMethodCall(this, (MethodInfo) MethodInfo.GetCurrentMethod()<#=String.Join("", function.Parameters.Select(p => ", " + p.Name).ToArray())#>);
+<#		int paramIdx = 0;
+		foreach(Parameter parameter in function.Parameters) {
+			if (parameter.Direction != ParameterDirection.In) {#>
+			<#=parameter.Name#> = (<#=code.Format(parameter.Type)#>) result.GetParameterValue(<#=paramIdx#>);
+<#			}
+			paramIdx++;
+		}
+#>			return (<#=code.Format(function.ReturnType)#>) result.ReturnValue;
+		}
+		
+<#	}#>
+		#endregion
+		
+<#	if (tableOperations.Count > 0) { #>
+		#region Table Operations
+<#		foreach(var operation in tableOperations) { #>
+		private void <#=operation.Type#><#=operation.Table.BaseClass.Name#>(<#=operation.Table.BaseClass.QualifiedName#> obj) {
+<#			if (operation.Arguments.Any(a => a.Version == ArgumentVersion.Original)) {
+#>			var original = <#=operation.Table.Member#>.GetOriginalEntityState(obj);
+<#			}
+			int paramIdx = 1;
+			foreach(var argument in operation.Arguments.Where(a => a.Parameter.Direction != ParameterDirection.In)) {
+#>			<#=code.Format(argument.Parameter.Type)#> p<#=paramIdx++#> = obj.<#=argument.Member#>;
+<#			}#>
+			<# if (options.StoredProcedureConcurrency) {#>var rowCount = <#}#><#=operation.Function.Method#>(<#
+			paramIdx = 1;
+			foreach(var argument in operation.Arguments) {
+				switch(argument.Parameter.Direction) {
+					case ParameterDirection.InOut: #>ref p<#=paramIdx++#><# break;
+					case ParameterDirection.Out: #>out p<#=paramIdx++#><# break;
+					default: #><#=(argument.Version == ArgumentVersion.New) ? "obj" : "original"#>.<#=argument.Member#><# break;
+				}
+			if (argument != operation.Arguments.Last()) {#>, <#}
+			}
+			#>);
+<#			if (options.StoredProcedureConcurrency) {#>
+			if (rowCount != 1) {
+				throw new ChangeConflictException();
+			}
+<#			}
+			paramIdx = 1;
+			foreach(var argument in operation.Arguments.Where(a => a.Parameter.Direction != ParameterDirection.In)) {
+#>			obj.<#=argument.Member#> = p<#=paramIdx++#>.GetValueOrDefault();
+<#			}#>
+		}
+		
+<#
+		}
+#>
+		#endregion
+<#	}
+}#>
+	}
+<#if (!String.IsNullOrEmpty(data.ContextNamespace)) {
+#>}
+<#}
+foreach(Table table in data.Tables) {
+	foreach(TableClass class1 in table.Classes) {
+		manager.StartBlock(Path.ChangeExtension(class1.Name,".generated.cs"));
+		if (!String.IsNullOrEmpty(data.EntityNamespace)) {#>
+
+namespace <#=data.EntityNamespace#>
+{	
+<#		}
+		if (data.Serialization && class1.IsSerializable) {
+#>	[DataContract(<#=dataContractAttributes#>)]
+<#		}
+		if (class1 == table.BaseClass) {#>
+	[Table(Name=@"<#=table.Name#>")]
+<#			foreach(TableClass subclass in data.TableClasses.Where(c => c.Table == table)) {
+				if (!String.IsNullOrEmpty(subclass.InheritanceCode)) {#>
+	[InheritanceMapping(Code=@"<#=subclass.InheritanceCode#>", Type=typeof(<#=subclass.Name#>)<# if (subclass.IsInheritanceDefault) {#>, IsDefault=true<#}#>)]
+<#				}
+				if (data.Serialization && subclass.IsSerializable) {#>[KnownType(typeof(<#=subclass.Name#>))]<#}
+			}
+#>	<#=code.Format(class1.TypeAttributes)#>partial class <#=class1.Name#> :<#if (!String.IsNullOrEmpty(data.EntityBase)) {#> <#=data.EntityBase#>, <#}#> INotifyPropertyChanging, INotifyPropertyChanged
+	{
+		#region Property Change Event Handling
+		private static PropertyChangingEventArgs emptyChangingEventArgs = new PropertyChangingEventArgs(String.Empty);
+		
+		public event PropertyChangingEventHandler PropertyChanging;
+		public event PropertyChangedEventHandler PropertyChanged;
+		
+		<#=code.Format(class1.PropertyChangeAccess)#>void SendPropertyChanging()
+		{
+			if (PropertyChanging != null) {
+				PropertyChanging(this, emptyChangingEventArgs);
+			}
+		}
+			
+		<#=code.Format(class1.PropertyChangeAccess)#>void SendPropertyChanged(String propertyName)
+		{
+			if (PropertyChanged != null) {
+				PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
+			}
+		}
+		#endregion
+		
+<#		} else {
+#>	<#=code.Format(class1.TypeAttributes)#>partial class <#=class1.Name#> : <#=class1.SuperClass.Name#>
+	{
+<#		}#>
+		#region Extensibility Method Definitions
+		partial void OnLoaded();
+		partial void OnValidate(ChangeAction action);
+<#		if (class1.HasPrimaryKey) {#>
+		partial void OnCreated();
+<#		}#>
+		#endregion
+
+		#region Construction
+		public <#=class1.Name#>()
+		{
+<#		if (data.Serialization) {
+#>			Initialize();
+		}
+		
+		private void Initialize()
+		{
+<#		}
+		foreach(Association association in class1.Associations) {
+#>			<#=association.Storage#> = <#
+			if (association.IsMany) {
+				#>new EntitySet<<#=association.Type.Name#>>(attach_<#=association.Member#>, detach_<#=association.Member#>);
+<#			} else {
+				#>default(EntityRef<<#=association.Type.Name#>>);
+<#			}
+		}
+		if (class1.HasPrimaryKey) {#>
+			OnCreated();
+<#		}#>
+		}
+		#endregion
+
+<#		int dataMemberIndex = 1;
+		if (class1.Columns.Count > 0) {
+#>		#region Column Mappings
+<#			foreach(Column column in class1.Columns) {#>
+		partial void On<#=column.Member#>Changing(<#=code.Format(column.Type)#> value);
+		partial void On<#=column.Member#>Changed();
+		private <#=code.Format(column.StorageType)#> <#=column.Storage#><# if (column.IsReadOnly) {#> = default(<#=code.Format(column.StorageType)#>)<#}#>;
+		[Column(Storage=@"<#=column.Storage#>"<#
+				if (column.Name != column.Member) {#>, Name=@"<#=column.Name#>"<#}
+				if (column.AutoSync != AutoSync.Default) {#>, AutoSync=AutoSync.<#=column.AutoSync.ToString()#><#}
+				if (!String.IsNullOrEmpty(column.DbType)) {#>, DbType=@"<#=column.DbType#>"<#}
+				if (column.IsPrimaryKey) {#>, IsPrimaryKey=true<#}
+				if (column.IsDiscriminator) {#>, IsDiscriminator=true<#}
+				if (column.IsDbGenerated) {#>, IsDbGenerated=true<#}
+				if (column.IsVersion) {#>, IsVersion=true<#}
+				if (!column.CanBeNull && !column.IsPrimaryKey) {#>, CanBeNull=false<#}
+				if (column.UpdateCheck != UpdateCheck.Always) {#>, UpdateCheck=UpdateCheck.<#=column.UpdateCheck.ToString()#><#}
+				if (!String.IsNullOrEmpty(column.Expression)) {#>, Expression=@"<#=column.Expression#>"<#}
+		#>)]
+<#				if (data.Serialization && ((column.MemberAttributes & MemberAttributes.AccessMask) == MemberAttributes.Public)) {
+#>		[DataMember(Order=<#=dataMemberIndex++#>)]
+<#				}
+#>		<#=code.Format(column.MemberAttributes)#><#=code.Format(column.Type)#> <#=column.Member#>
+		{
+			get { return <#=column.StorageValue#>; }
+<#				if (!column.IsReadOnly) { #>
+			set {
+				if (<#=column.StorageValue#> != value) {
+<#					if (column.ForeignKeyAssociations.Count > 0) {#>
+					if (<#=String.Join(" || ", column.ForeignKeyAssociations.Select(a => a.Storage + ".HasLoadedOrAssignedValue").ToArray())#>) {
+						throw new ForeignKeyReferenceAlreadyHasValueException();
+					}
+<#					}#>
+					On<#=column.Member#>Changing(value);
+					SendPropertyChanging();
+					<#=column.StorageValue#> = value;
+					SendPropertyChanged("<#=column.Member#>");
+					On<#=column.Member#>Changed();
+				}
+			}
+<#				}#>
+		}
+		
+<#			}#>
+		#endregion
+<#		}
+		bool needsSerializationFlag = class1.IsSerializable && class1.Associations.Any(a => !a.ManagesKeys);
+		if (class1.Associations.Count > 0) {
+#>		
+		#region Associations
+<#			foreach(Association association in class1.Associations) {#>
+		private Entity<#=(association.IsMany) ? "Set" : "Ref"#><<#=association.Type.Name#>> <#=association.Storage#>;
+		[Association(Name=@"<#=association.Name#>"<#
+			#>, Storage=@"<#=association.Storage#>"<#
+				if (association.ThisKeyMembers != null) {#>, ThisKey=@"<#=String.Join(",", association.ThisKeyMembers)#>"<#}
+				if (association.OtherKeyMembers != null) {#>, OtherKey=@"<#=String.Join(",", association.OtherKeyMembers)#>"<#}
+				if (association.IsForeignKey) {#>, IsForeignKey=true<#}
+				if (association.IsUnique) {#>, IsUnique=true, IsForeignKey=false<#}
+				if (association.DeleteOnNull) {#>, DeleteOnNull=true<#}
+				if (association.DeleteRule != null) {#>, DeleteRule=@"<#=association.DeleteRule #>"<#}
+		#>)]
+<#				bool serialization = association.IsSerializable && data.Serialization &&
+					(options.SerializeDataContractSP1 || !association.ManagesKeys);
+				if (serialization) {
+#>		[DataMember(Order=<#=dataMemberIndex++#>, EmitDefaultValue=false)]
+<#				}
+				if (!association.IsMany) {#>
+		<#=code.Format(association.MemberAttributes)#><#=association.Type.Name#> <#=association.Member#>
+		{
+			get {
+<#					if (needsSerializationFlag && serialization) {#>
+				if (serializing && !<#=association.Storage#>.HasLoadedOrAssignedValue) {
+					return null;
+				}
+<#					}#>
+				return <#=association.Storage#>.Entity;
+			}
+			set {
+				<#=association.Type.Name#> previousValue = <#=association.Storage#>.Entity;
+				if ((previousValue != value)<#if (association.OtherSide != null) {#> || (!<#=association.Storage#>.HasLoadedOrAssignedValue)<#}#>) {
+					SendPropertyChanging();
+<#					if (association.OtherSide != null) {#>
+					if (previousValue != null) {
+						<#=association.Storage#>.Entity = null;
+						previousValue.<#=association.OtherSide.Member#><#if (!association.OtherSide.IsMany) {#> = null<#} else {#>.Remove(this)<#}#>;
+					}
+<#					}
+#>					<#=association.Storage#>.Entity = value;
+<#					if (association.OtherSide != null) {#>
+					if (value != null) {
+						value.<#=association.OtherSide.Member#><#if (!association.OtherSide.IsMany) {#> = this<#} else {#>.Add(this)<#}#>;
+<#						if (association.ManagesKeys) {
+							for(int keyIdx=0;keyIdx<association.ThisKey.Count();keyIdx++) {#>
+						<#=association.ThisKey[keyIdx].Storage#> = value.<#=association.OtherKey[keyIdx].Member#>;
+<#							}#>
+					}
+					else {
+<#							for(int keyIdx=0;keyIdx<association.ThisKey.Count();keyIdx++) {
+#>						<#=association.ThisKey[keyIdx].Storage#> = default(<#=code.Format(association.ThisKey[keyIdx].Type)#>);
+<#							}
+						}
+#>					}
+<#					}#>
+					SendPropertyChanged("<#=association.Member#>");
+				}
+			}
+		}
+
+<#				} else {#>
+		<#=code.Format(association.MemberAttributes)#>EntitySet<<#=association.Type.Name#>> <#=association.Member#>
+		{
+			get {
+<#					if (needsSerializationFlag && serialization) {#>
+				if (serializing && !<#=association.Storage#>.HasLoadedOrAssignedValues) {
+					return null;
+				}
+<#					} #>
+				return <#=association.Storage#>;
+			}
+			set {
+				<#=association.Storage#>.Assign(value);
+			}
+		}
+
+		private void attach_<#=association.Member#>(<#=association.Type.Name#> entity)
+		{
+			SendPropertyChanging();
+			entity.<#=association.OtherSide.Member#> = this;
+		}
+		
+		private void detach_<#=association.Member#>(<#=association.Type.Name#> entity)
+		{
+			SendPropertyChanging();
+			entity.<#=association.OtherSide.Member#> = null;
+		}
+<#				}
+			}#>
+		#endregion
+<#		}
+		if (data.Serialization) {#>
+		
+		#region Serialization
+<#			if (needsSerializationFlag) {#>
+		private bool serializing;
+		
+		[OnSerializing()]
+		[EditorBrowsableAttribute(EditorBrowsableState.Never)]
+		public void OnSerializing(StreamingContext context)
+		{
+			serializing = true;
+		}
+		
+		[OnSerialized()]
+		[EditorBrowsableAttribute(EditorBrowsableState.Never)]
+		public void OnSerialized(StreamingContext context)
+		{
+			serializing = false;
+		}
+		
+<#			}#>
+		[OnDeserializing()]
+		[EditorBrowsableAttribute(EditorBrowsableState.Never)]
+		public <#if (class1 != table.BaseClass) {#>new<#}#> void OnDeserializing(StreamingContext context)
+		{
+			Initialize();
+		}
+		#endregion
+<#		}
+#>	}
+<#		if (!String.IsNullOrEmpty(data.EntityNamespace)) {#>
+}
+<#		}
+		manager.EndBlock();
+	}
+}
+if (data.FunctionClasses.Count > 0) {
+	foreach(FunctionClass class1 in data.FunctionClasses) {
+		manager.StartBlock(Path.ChangeExtension(class1.Name,".generated.cs"));
+		if(!String.IsNullOrEmpty(data.EntityNamespace)){#>
+
+namespace <#=data.EntityNamespace#>
+{
+<#		}
+		if (data.Serialization) {
+#>	[DataContract(<#=dataContractAttributes#>)]
+<#		} #>
+	<#=code.Format(class1.TypeAttributes)#>partial class <#=class1.Name#>
+	{
+<#		int dataMemberIndex = 1;
+		foreach(Column column in class1.Columns) {#>
+		private <#=code.Format(column.Type)#> <#=column.Storage#>;
+		[Column(Storage=@"<#=column.Storage#>"<#
+				if (column.Name != column.Member) {#>, Name=@"<#=column.Name#>"<#}
+				if (!String.IsNullOrEmpty(column.DbType)) {#>, DbType=@"<#=column.DbType#>"<#}
+				if (!column.CanBeNull && !column.IsPrimaryKey) {#>, CanBeNull=false<#}
+		#>)]
+<#			if (data.Serialization && ((column.MemberAttributes & MemberAttributes.AccessMask) == MemberAttributes.Public)) {
+#>		[DataMember(Order=<#=dataMemberIndex++#>)]
+<#			}
+#>		<#=code.Format(column.MemberAttributes)#><#=code.Format(column.Type)#> <#=column.Member#> {
+			get { return <#=column.Storage#>; }
+			set {
+				if (<#=column.Storage#> != value) {
+					<#=column.Storage#> = value;
+				}
+			}
+		}
+<#		} #>
+	}
+<#		if (!String.IsNullOrEmpty(data.EntityNamespace)) {#>
+}
+<#		}
+		manager.EndBlock();
+	}
+}
+manager.StartFooter();#>
+#pragma warning restore 1591<#
+manager.EndFooter();
+manager.Process(options.FilePerEntity);#>
Index: /branches/OKB/HeuristicLab.Services.OKB.DataAccess/3.3/OKB_Methods.cs
===================================================================
--- /branches/OKB/HeuristicLab.Services.OKB.DataAccess/3.3/OKB_Methods.cs	(revision 4480)
+++ /branches/OKB/HeuristicLab.Services.OKB.DataAccess/3.3/OKB_Methods.cs	(revision 4480)
@@ -0,0 +1,478 @@
+#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;
+using System.Linq;
+
+namespace HeuristicLab.Services.OKB.DataAccess {
+
+  #region TypeAbstraction
+  public interface IParameterValue {
+    int ParameterId { get; set; }
+    Parameter Parameter { get; set; }
+    int ExperimentId { get; set; }
+    Experiment Experiment { get; set; }
+    object Value { get; set; }
+  }
+  public partial class IntParameterValue : IParameterValue {
+    object IParameterValue.Value {
+      get { return this.Value; }
+      set { this.Value = (int)value; }
+    }
+  }
+  public partial class FloatParameterValue : IParameterValue {
+    object IParameterValue.Value {
+      get { return this.Value; }
+      set { this.Value = (double)value; }
+    }
+  }
+  public partial class CharParameterValue : IParameterValue {
+    object IParameterValue.Value {
+      get { return this.Value; }
+      set { this.Value = (string)value; }
+    }
+  }
+  public partial class OperatorParameterValue : IParameterValue {
+    object IParameterValue.Value {
+      get { return this.Value; }
+      set { this.Value = (Binary)value; }
+    }
+  }
+  public partial class Experiment {
+    public IQueryable<IParameterValue> ParameterValues {
+      get {
+        return IntParameterValues
+          .AsQueryable()
+          .Cast<IParameterValue>()
+          .Concat(FloatParameterValues.Cast<IParameterValue>())
+          .Concat(CharParameterValues.Cast<IParameterValue>())
+          .Concat(OperatorParameterValues.Cast<IParameterValue>());
+      }
+      set {
+        if (value == null) return;
+        foreach (IParameterValue pv in value) {
+          if (pv == null) continue;
+          if (pv is IntParameterValue) {
+            IntParameterValues.Add(new IntParameterValue() { ParameterId = pv.ParameterId, Value = (int)pv.Value });
+          } else if (pv is FloatParameterValue) {
+            FloatParameterValues.Add(new FloatParameterValue() { ParameterId = pv.ParameterId, Value = (double)pv.Value });
+          } else if (pv is CharParameterValue) {
+            CharParameterValues.Add(new CharParameterValue() { ParameterId = pv.ParameterId, Value = (string)pv.Value });
+          } else if (pv is OperatorParameterValue) {
+            OperatorParameterValues.Add(new OperatorParameterValue() {
+              ParameterId = pv.ParameterId,
+              Value = (Binary)pv.Value,
+              DataTypeId = ((OperatorParameterValue)pv).DataTypeId,
+            });
+          } else {
+            throw new ArgumentException("Invalid Parameter type" + pv.GetType());
+          }
+        }
+      }
+    }
+  }
+
+  public interface IResultValue {
+    int ResultId { get; set; }
+    Result Result { get; set; }
+    int RunId { get; set; }
+    Run Run { get; set; }
+    object Value { get; set; }
+  }
+  public partial class IntResultValue : IResultValue {
+    object IResultValue.Value {
+      get { return this.Value; }
+      set { this.Value = (int)value; }
+    }
+  }
+  public partial class FloatResultValue : IResultValue {
+    object IResultValue.Value {
+      get { return this.Value; }
+      set { this.Value = (double)value; }
+    }
+  }
+  public partial class CharResultValue : IResultValue {
+    object IResultValue.Value {
+      get { return this.Value; }
+      set { this.Value = (string)value; }
+    }
+  }
+  public partial class BlobResultValue : IResultValue {
+    object IResultValue.Value {
+      get { return this.Value; }
+      set { this.Value = (Binary)value; }
+    }
+  }
+  public partial class Run {
+    public IQueryable<IResultValue> ResultValues {
+      get {
+        return IntResultValues
+          .AsQueryable()
+          .Cast<IResultValue>()
+          .Concat(FloatResultValues.Cast<IResultValue>())
+          .Concat(CharResultValues.Cast<IResultValue>())
+          .Concat(BlobResultValues.Cast<IResultValue>());
+      }
+      set {
+        foreach (IResultValue rv in value) {
+          if (rv == null) continue;
+          if (rv is IntResultValue) {
+            IntResultValues.Add(new IntResultValue() { ResultId = rv.ResultId, Value = (int)rv.Value });
+          } else if (rv is FloatResultValue) {
+            FloatResultValues.Add(new FloatResultValue() { ResultId = rv.ResultId, Value = (double)rv.Value });
+          } else if (rv is CharResultValue) {
+            CharResultValues.Add(new CharResultValue() { ResultId = rv.ResultId, Value = (string)rv.Value });
+          } else if (rv is BlobResultValue) {
+            BlobResultValues.Add(new BlobResultValue() { ResultId = rv.ResultId, Value = (Binary)rv.Value });
+          } else {
+            throw new ArgumentException("Invalid result value type " + rv.GetType());
+          }
+        }
+      }
+    }
+  }
+  public partial class Result {
+    public IQueryable<IResultValue> ResultValues {
+      get {
+        return IntResultValues
+          .AsQueryable()
+          .Cast<IResultValue>()
+          .Concat(FloatResultValues.Cast<IResultValue>())
+          .Concat(CharResultValues.Cast<IResultValue>())
+          .Concat(BlobResultValues.Cast<IResultValue>());
+      }
+    }
+  }
+
+  public interface IProblemCharacteristicValue {
+    int ProblemId { get; set; }
+    Problem Problem { get; set; }
+    int ProblemCharacteristicId { get; set; }
+    ProblemCharacteristic ProblemCharacteristic { get; set; }
+    object Value { get; set; }
+  }
+  public partial class IntProblemCharacteristicValue : IProblemCharacteristicValue {
+    object IProblemCharacteristicValue.Value {
+      get { return this.Value; }
+      set { this.Value = (int)value; }
+    }
+  }
+  public partial class FloatProblemCharacteristicValue : IProblemCharacteristicValue {
+    object IProblemCharacteristicValue.Value {
+      get { return this.Value; }
+      set { this.Value = (double)value; }
+    }
+  }
+  public partial class CharProblemCharacteristicValue : IProblemCharacteristicValue {
+    object IProblemCharacteristicValue.Value {
+      get { return this.Value; }
+      set { this.Value = (string)value; }
+    }
+  }
+  public partial class Problem {
+    public IQueryable<IProblemCharacteristicValue> ProblemCharacteristicValues {
+      get {
+        return IntProblemCharacteristicValues
+          .AsQueryable()
+          .Cast<IProblemCharacteristicValue>()
+          .Concat(FloatProblemCharacteristicValues.Cast<IProblemCharacteristicValue>())
+          .Concat(CharProblemCharacteristicValues.Cast<IProblemCharacteristicValue>());
+      }
+    }
+  }
+  public partial class ProblemCharacteristic {
+    public IQueryable<IProblemCharacteristicValue> ProblemCharacteristicValues {
+      get {
+        return IntProblemCharacteristicValues
+          .AsQueryable()
+          .Cast<IProblemCharacteristicValue>()
+          .Concat(FloatProblemCharacteristicValues.Cast<IProblemCharacteristicValue>())
+          .Concat(CharProblemCharacteristicValues.Cast<IProblemCharacteristicValue>());
+      }
+    }
+  }
+  #endregion
+
+  #region Abuse entities to store parameter values for a single (not yet existing experiment)
+  public partial class Parameter {
+    public IParameterValue ParameterValue {
+      get {
+        try {
+          return IntParameterValues
+            .AsQueryable()
+            .Cast<IParameterValue>()
+            .Concat(FloatParameterValues.Cast<IParameterValue>())
+            .Concat(CharParameterValues.Cast<IParameterValue>())
+            .Concat(OperatorParameterValues.Cast<IParameterValue>())
+            .ToList().Single();
+        }
+        catch {
+          return null;
+        }
+      }
+      set {
+        if (value == ParameterValue) // access to ParameterValue ensures that there is a single value
+          return;
+        if (value == null)
+          throw new ArgumentNullException("ParameterValue");
+        IParameterValue oldValue = ParameterValue;
+        Type t = value.GetType();
+        if (oldValue.GetType() != t)
+          throw new ArgumentException("cannot assign value with different type");
+        if (t == typeof(IntParameterValue)) {
+          IntParameterValues.Clear();
+          IntParameterValues.Add((IntParameterValue)value);
+        } else if (t == typeof(FloatParameterValue)) {
+          FloatParameterValues.Clear();
+          FloatParameterValues.Add((FloatParameterValue)value);
+        } else if (t == typeof(CharParameterValue)) {
+          CharParameterValues.Clear();
+          CharParameterValues.Add((CharParameterValue)value);
+        } else if (t == typeof(OperatorParameterValue)) {
+          OperatorParameterValues.Clear();
+          OperatorParameterValues.Add((OperatorParameterValue)value);
+        } else throw new ArgumentException("invalid parameter value type " + t.Name);
+      }
+    }
+  }
+  public partial class Result {
+    public IResultValue ResultValue {
+      get {
+        try {
+          return IntResultValues
+            .AsQueryable()
+            .Cast<IResultValue>()
+            .Concat(FloatResultValues.Cast<IResultValue>())
+            .Concat(CharResultValues.Cast<IResultValue>())
+            .Concat(BlobResultValues.Cast<IResultValue>()).ToList().Single();
+        }
+        catch {
+          return null;
+        }
+      }
+      set {
+        if (value == ResultValue)
+          return;
+        if (value == null)
+          throw new ArgumentNullException("ResultValue");
+        IResultValue oldValue = ResultValue;
+        Type t = value.GetType();
+        if (oldValue.GetType() != t)
+          throw new ArgumentException("cannot assign value with different type");
+        if (t == typeof(IntResultValue)) {
+          IntResultValues.Clear();
+          IntResultValues.Add((IntResultValue)value);
+        } else if (t == typeof(FloatResultValue)) {
+          FloatResultValues.Clear();
+          FloatResultValues.Add((FloatResultValue)value);
+        } else if (t == typeof(CharResultValue)) {
+          CharResultValues.Clear();
+          CharResultValues.Add((CharResultValue)value);
+        } else if (t == typeof(BlobResultValue)) {
+          BlobResultValues.Clear();
+          BlobResultValues.Add((BlobResultValue)value);
+        } else throw new ArgumentException("invalid result value type " + t.Name);
+      }
+    }
+  }
+  public partial class Algorithm {
+    public IQueryable<Parameter> Parameters {
+      get {
+        return Algorithm_Parameters.AsQueryable().Select(ap => ap.Parameter);
+      }
+    }
+    public IQueryable<IntParameterValue> IntParameterValues {
+      get {
+        return Parameters.AsQueryable()
+          .Where(p => p.IntParameterValues.Count > 0)
+          .Select(p => p.IntParameterValues.Single());
+      }
+    }
+    public IQueryable<FloatParameterValue> FloatParameterValues {
+      get {
+        return Parameters.AsQueryable()
+          .Where(p => p.FloatParameterValues.Count > 0)
+          .Select(p => p.FloatParameterValues.Single());
+      }
+    }
+    public IQueryable<CharParameterValue> CharParameterValues {
+      get {
+        return Parameters.AsQueryable()
+          .Where(p => p.CharParameterValues.Count > 0)
+          .Select(p => p.CharParameterValues.Single());
+      }
+    }
+    public IQueryable<OperatorParameterValue> OperatorParameterValues {
+      get {
+        return Parameters.AsQueryable()
+          .Where(p => p.OperatorParameterValues.Count > 0)
+          .Select(p => p.OperatorParameterValues.Single());
+      }
+    }
+    public IQueryable<IParameterValue> ParameterValues {
+      get {
+        return Parameters.AsQueryable().Select(p => p.ParameterValue);
+      }
+    }
+
+    public IQueryable<Result> Results {
+      get {
+        return Algorithm_Results.AsQueryable().Select(ar => ar.Result);
+      }
+    }
+    public IQueryable<IntResultValue> IntResultValues {
+      get {
+        return Results.AsQueryable()
+          .Where(r => r.IntResultValues.Count > 0)
+          .Select(r => r.IntResultValues.Single());
+      }
+    }
+    public IQueryable<FloatResultValue> FloatResultValues {
+      get {
+        return Results.AsQueryable()
+          .Where(r => r.FloatResultValues.Count > 0)
+          .Select(r => r.FloatResultValues.Single());
+      }
+    }
+    public IQueryable<CharResultValue> CharResultValues {
+      get {
+
+        return Results.AsQueryable()
+          .Where(r => r.CharResultValues.Count > 0)
+          .Select(r => r.CharResultValues.Single());
+      }
+    }
+    public IQueryable<BlobResultValue> BlobResultValues {
+      get {
+        return Results.AsQueryable()
+          .Where(r => r.BlobResultValues.Count > 0)
+          .Select(r => r.BlobResultValues.Single());
+      }
+    }
+    public IQueryable<IResultValue> ResultValues {
+      get {
+        return Results.AsQueryable().Select(r => r.ResultValue);
+      }
+    }
+  }
+  #endregion
+
+  #region Type access
+  public partial class DataType {
+    public Type Type {
+      get {
+        return Type.GetType(ClrName, false) ?? typeof(object);
+      }
+    }
+  }
+  #endregion
+
+  #region NamedEntities
+  public interface INamedEntity {
+    int Id { get; }
+    string Name { get; }
+    string Description { get; }
+  }
+  public partial class AlgorithmClass : INamedEntity { }
+  public partial class Algorithm : INamedEntity { }
+  public partial class ProblemClass : INamedEntity { }
+  public partial class Problem : INamedEntity { }
+  public partial class SolutionRepresentation : INamedEntity { }
+  public partial class ProblemCharacteristic : INamedEntity { }
+  public partial class Parameter : INamedEntity { }
+  public partial class Result : INamedEntity { }
+  public partial class Project : INamedEntity { }
+  public partial class Platform : INamedValue { }
+  #endregion
+
+  #region DataTypes
+  public interface IIntValue {
+    int Value { get; }
+  }
+  public partial class IntResultValue : IIntValue { }
+  public partial class IntParameterValue : IIntValue { }
+  public partial class IntProblemCharacteristicValue : IIntValue { }
+  public interface IFloatValue {
+    double Value { get; }
+  }
+  public partial class FloatResultValue : IFloatValue { }
+  public partial class FloatParameterValue : IFloatValue { }
+  public partial class FloatProblemCharacteristicValue : IFloatValue { }
+  public interface ICharValue {
+    string Value { get; }
+  }
+  public partial class CharResultValue : ICharValue { }
+  public partial class CharParameterValue : ICharValue { }
+  public partial class CharProblemCharacteristicValue : ICharValue { }
+  #endregion
+
+  #region NamedValues
+  public interface INamedValue {
+    string Name { get; }
+  }
+  public interface IValue<T> : INamedValue {
+    T Value { get; }
+  }
+  public partial class IntResultValue : IValue<int> {
+    public string Name { get { return Result.Name; } }
+  }
+  public partial class FloatResultValue : IValue<double> {
+    public string Name { get { return Result.Name; } }
+  }
+  public partial class CharResultValue : IValue<string> {
+    public string Name { get { return Result.Name; } }
+  }
+  public partial class BlobResultValue : IValue<Binary> {
+    public string Name { get { return Result.Name; } }
+  }
+  public partial class IntParameterValue : IValue<int> {
+    public string Name { get { return Parameter.Name; } }
+  }
+  public partial class FloatParameterValue : IValue<double> {
+    public string Name { get { return Parameter.Name; } }
+  }
+  public partial class CharParameterValue : IValue<string> {
+    public string Name { get { return Parameter.Name; } }
+  }
+  public partial class OperatorParameterValue : IValue<Binary> {
+    public string Name { get { return Parameter.Name; } }
+  }
+  public partial class IntProblemCharacteristicValue : IValue<int> {
+    public string Name { get { return ProblemCharacteristic.Name; } }
+  }
+  public partial class FloatProblemCharacteristicValue : IValue<double> {
+    public string Name { get { return ProblemCharacteristic.Name; } }
+  }
+  public partial class CharProblemCharacteristicValue : IValue<string> {
+    public string Name { get { return ProblemCharacteristic.Name; } }
+  }
+  #endregion
+
+  #region DynamicTypeInformation
+  public interface IDynamicParent : INamedEntity {
+    DataType DataType { get; }
+  }
+  public partial class ProblemCharacteristic : IDynamicParent { }
+  public partial class Parameter : IDynamicParent { }
+  public partial class Result : IDynamicParent { }
+  #endregion
+}
Index: /branches/OKB/HeuristicLab.Services.OKB.DataAccess/3.3/Properties/AssemblyInfo.frame
===================================================================
--- /branches/OKB/HeuristicLab.Services.OKB.DataAccess/3.3/Properties/AssemblyInfo.frame	(revision 4480)
+++ /branches/OKB/HeuristicLab.Services.OKB.DataAccess/3.3/Properties/AssemblyInfo.frame	(revision 4480)
@@ -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.Reflection;
+using System.Runtime.CompilerServices;
+using System.Runtime.InteropServices;
+
+// General Information about an assembly is controlled through the following
+// set of attributes. Change these attribute values to modify the information
+// associated with an assembly.
+[assembly: AssemblyTitle("HeuristicLab.Services.OKB.DataAccess")]
+[assembly: AssemblyDescription("Data access layer for HeuristicLab OKB services")]
+[assembly: AssemblyConfiguration("")]
+[assembly: AssemblyCompany("")]
+[assembly: AssemblyProduct("HeuristicLab")]
+[assembly: AssemblyCopyright("(c) 2002-2010 HEAL")]
+[assembly: AssemblyTrademark("")]
+[assembly: AssemblyCulture("")]
+
+// Setting ComVisible to false makes the types in this assembly not visible
+// to COM components.  If you need to access a type in this assembly from
+// COM, set the ComVisible attribute to true on that type.
+[assembly: ComVisible(false)]
+
+// The following GUID is for the ID of the typelib if this project is exposed to COM
+[assembly: Guid("8a145a17-ce73-47da-b520-b4194835fb49")]
+
+// Version information for an assembly consists of the following four values:
+//
+//      Major Version
+//      Minor Version
+//      Build Number
+//      Revision
+//
+// You can specify all the values or you can default the Build and Revision Numbers
+// by using the '*' as shown below:
+// [assembly: AssemblyVersion("1.0.*")]
+[assembly: AssemblyVersion("3.3.0.0")]
+[assembly: AssemblyFileVersion("3.3.0.$WCREV$")]
Index: /branches/OKB/HeuristicLab.Services.OKB.DataAccess/3.3/Properties/Settings.Designer.cs
===================================================================
--- /branches/OKB/HeuristicLab.Services.OKB.DataAccess/3.3/Properties/Settings.Designer.cs	(revision 4480)
+++ /branches/OKB/HeuristicLab.Services.OKB.DataAccess/3.3/Properties/Settings.Designer.cs	(revision 4480)
@@ -0,0 +1,37 @@
+﻿//------------------------------------------------------------------------------
+// <auto-generated>
+//     This code was generated by a tool.
+//     Runtime Version:4.0.30319.1
+//
+//     Changes to this file may cause incorrect behavior and will be lost if
+//     the code is regenerated.
+// </auto-generated>
+//------------------------------------------------------------------------------
+
+namespace HeuristicLab.Services.OKB.DataAccess.Properties {
+    
+    
+    [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
+    [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "10.0.0.0")]
+    public sealed partial class Settings : global::System.Configuration.ApplicationSettingsBase {
+        
+        private static Settings defaultInstance = ((Settings)(global::System.Configuration.ApplicationSettingsBase.Synchronized(new Settings())));
+        
+        public static Settings Default {
+            get {
+                return defaultInstance;
+            }
+        }
+        
+        [global::System.Configuration.ApplicationScopedSettingAttribute()]
+        [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+        [global::System.Configuration.SpecialSettingAttribute(global::System.Configuration.SpecialSetting.ConnectionString)]
+        [global::System.Configuration.DefaultSettingValueAttribute("Data Source=.\\SQLEXPRESS;Integrated Security=SSPI;Initial Catalog=HeuristicLab.OK" +
+            "B")]
+        public string OKBConnectionString {
+            get {
+                return ((string)(this["OKBConnectionString"]));
+            }
+        }
+    }
+}
Index: /branches/OKB/HeuristicLab.Services.OKB.DataAccess/3.3/Properties/Settings.settings
===================================================================
--- /branches/OKB/HeuristicLab.Services.OKB.DataAccess/3.3/Properties/Settings.settings	(revision 4480)
+++ /branches/OKB/HeuristicLab.Services.OKB.DataAccess/3.3/Properties/Settings.settings	(revision 4480)
@@ -0,0 +1,14 @@
+﻿<?xml version='1.0' encoding='utf-8'?>
+<SettingsFile xmlns="http://schemas.microsoft.com/VisualStudio/2004/01/settings" CurrentProfile="(Default)" GeneratedClassNamespace="HeuristicLab.Services.OKB.DataAccess.Properties" GeneratedClassName="Settings">
+  <Profiles />
+  <Settings>
+    <Setting Name="OKBConnectionString" Type="(Connection string)" Scope="Application">
+      <DesignTimeValue Profile="(Default)">&lt;?xml version="1.0" encoding="utf-16"?&gt;
+&lt;SerializableConnectionString xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"&gt;
+  &lt;ConnectionString&gt;Data Source=.\SQLEXPRESS;Integrated Security=SSPI;Initial Catalog=HeuristicLab.OKB&lt;/ConnectionString&gt;
+  &lt;ProviderName&gt;System.Data.SqlClient&lt;/ProviderName&gt;
+&lt;/SerializableConnectionString&gt;</DesignTimeValue>
+      <Value Profile="(Default)">Data Source=.\SQLEXPRESS;Integrated Security=SSPI;Initial Catalog=HeuristicLab.OKB</Value>
+    </Setting>
+  </Settings>
+</SettingsFile>
Index: /branches/OKB/HeuristicLab.Services.OKB.DataAccess/3.3/SQL Scripts/Create OKB.sql
===================================================================
--- /branches/OKB/HeuristicLab.Services.OKB.DataAccess/3.3/SQL Scripts/Create OKB.sql	(revision 4480)
+++ /branches/OKB/HeuristicLab.Services.OKB.DataAccess/3.3/SQL Scripts/Create OKB.sql	(revision 4480)
@@ -0,0 +1,112 @@
+USE [master]
+GO
+
+/****** Object:  Database [HeuristicLab.OKB]    Script Date: 09/12/2010 00:57:17 ******/
+IF  EXISTS (SELECT name FROM sys.databases WHERE name = N'HeuristicLab.OKB')
+DROP DATABASE [HeuristicLab.OKB]
+GO
+
+USE [master]
+GO
+
+/****** Object:  Database [HeuristicLab.OKB]    Script Date: 09/12/2010 00:57:17 ******/
+CREATE DATABASE [HeuristicLab.OKB] ON  PRIMARY 
+( NAME = N'HeuristicLab.OKB', FILENAME = N'c:\Program Files\Microsoft SQL Server\MSSQL.1\MSSQL\DATA\HeuristicLab.OKB.mdf' , SIZE = 3072KB , MAXSIZE = UNLIMITED, FILEGROWTH = 1024KB )
+ LOG ON 
+( NAME = N'HeuristicLab.OKB_log', FILENAME = N'c:\Program Files\Microsoft SQL Server\MSSQL.1\MSSQL\DATA\HeuristicLab.OKB_log.ldf' , SIZE = 1024KB , MAXSIZE = 2048GB , FILEGROWTH = 10%)
+GO
+
+ALTER DATABASE [HeuristicLab.OKB] SET COMPATIBILITY_LEVEL = 100
+GO
+
+IF (1 = FULLTEXTSERVICEPROPERTY('IsFullTextInstalled'))
+begin
+EXEC [HeuristicLab.OKB].[dbo].[sp_fulltext_database] @action = 'enable'
+end
+GO
+
+ALTER DATABASE [HeuristicLab.OKB] SET ANSI_NULL_DEFAULT OFF 
+GO
+
+ALTER DATABASE [HeuristicLab.OKB] SET ANSI_NULLS OFF 
+GO
+
+ALTER DATABASE [HeuristicLab.OKB] SET ANSI_PADDING OFF 
+GO
+
+ALTER DATABASE [HeuristicLab.OKB] SET ANSI_WARNINGS OFF 
+GO
+
+ALTER DATABASE [HeuristicLab.OKB] SET ARITHABORT OFF 
+GO
+
+ALTER DATABASE [HeuristicLab.OKB] SET AUTO_CLOSE OFF 
+GO
+
+ALTER DATABASE [HeuristicLab.OKB] SET AUTO_CREATE_STATISTICS ON 
+GO
+
+ALTER DATABASE [HeuristicLab.OKB] SET AUTO_SHRINK OFF 
+GO
+
+ALTER DATABASE [HeuristicLab.OKB] SET AUTO_UPDATE_STATISTICS ON 
+GO
+
+ALTER DATABASE [HeuristicLab.OKB] SET CURSOR_CLOSE_ON_COMMIT OFF 
+GO
+
+ALTER DATABASE [HeuristicLab.OKB] SET CURSOR_DEFAULT  GLOBAL 
+GO
+
+ALTER DATABASE [HeuristicLab.OKB] SET CONCAT_NULL_YIELDS_NULL OFF 
+GO
+
+ALTER DATABASE [HeuristicLab.OKB] SET NUMERIC_ROUNDABORT OFF 
+GO
+
+ALTER DATABASE [HeuristicLab.OKB] SET QUOTED_IDENTIFIER OFF 
+GO
+
+ALTER DATABASE [HeuristicLab.OKB] SET RECURSIVE_TRIGGERS OFF 
+GO
+
+ALTER DATABASE [HeuristicLab.OKB] SET  DISABLE_BROKER 
+GO
+
+ALTER DATABASE [HeuristicLab.OKB] SET AUTO_UPDATE_STATISTICS_ASYNC OFF 
+GO
+
+ALTER DATABASE [HeuristicLab.OKB] SET DATE_CORRELATION_OPTIMIZATION OFF 
+GO
+
+ALTER DATABASE [HeuristicLab.OKB] SET TRUSTWORTHY OFF 
+GO
+
+ALTER DATABASE [HeuristicLab.OKB] SET ALLOW_SNAPSHOT_ISOLATION OFF 
+GO
+
+ALTER DATABASE [HeuristicLab.OKB] SET PARAMETERIZATION SIMPLE 
+GO
+
+ALTER DATABASE [HeuristicLab.OKB] SET READ_COMMITTED_SNAPSHOT OFF 
+GO
+
+ALTER DATABASE [HeuristicLab.OKB] SET HONOR_BROKER_PRIORITY OFF 
+GO
+
+ALTER DATABASE [HeuristicLab.OKB] SET  READ_WRITE 
+GO
+
+ALTER DATABASE [HeuristicLab.OKB] SET RECOVERY SIMPLE 
+GO
+
+ALTER DATABASE [HeuristicLab.OKB] SET  MULTI_USER 
+GO
+
+ALTER DATABASE [HeuristicLab.OKB] SET PAGE_VERIFY CHECKSUM  
+GO
+
+ALTER DATABASE [HeuristicLab.OKB] SET DB_CHAINING OFF 
+GO
+
+
Index: /branches/OKB/HeuristicLab.Services.OKB.DataAccess/3.3/Tests/HeuristicLab.Services.OKB.DataAccess-3.3.Tests.csproj
===================================================================
--- /branches/OKB/HeuristicLab.Services.OKB.DataAccess/3.3/Tests/HeuristicLab.Services.OKB.DataAccess-3.3.Tests.csproj	(revision 4480)
+++ /branches/OKB/HeuristicLab.Services.OKB.DataAccess/3.3/Tests/HeuristicLab.Services.OKB.DataAccess-3.3.Tests.csproj	(revision 4480)
@@ -0,0 +1,66 @@
+﻿<?xml version="1.0" encoding="utf-8"?>
+<Project ToolsVersion="4.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+  <PropertyGroup>
+    <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
+    <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
+    <ProductVersion>
+    </ProductVersion>
+    <SchemaVersion>2.0</SchemaVersion>
+    <ProjectGuid>{89234006-FE1B-4A15-AFEC-91CB3526F0A5}</ProjectGuid>
+    <OutputType>Library</OutputType>
+    <AppDesignerFolder>Properties</AppDesignerFolder>
+    <RootNamespace>HeuristicLab.Services.OKB.DataAccess_33.Tests</RootNamespace>
+    <AssemblyName>HeuristicLab.Services.OKB.DataAccess-3.3.Tests</AssemblyName>
+    <TargetFrameworkVersion>v4.0</TargetFrameworkVersion>
+    <FileAlignment>512</FileAlignment>
+    <ProjectTypeGuids>{3AC096D0-A1C2-E12C-1390-A8335801FDAB};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}</ProjectTypeGuids>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
+    <DebugSymbols>true</DebugSymbols>
+    <DebugType>full</DebugType>
+    <Optimize>false</Optimize>
+    <OutputPath>bin\Debug\</OutputPath>
+    <DefineConstants>DEBUG;TRACE</DefineConstants>
+    <ErrorReport>prompt</ErrorReport>
+    <WarningLevel>4</WarningLevel>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
+    <DebugType>pdbonly</DebugType>
+    <Optimize>true</Optimize>
+    <OutputPath>bin\Release\</OutputPath>
+    <DefineConstants>TRACE</DefineConstants>
+    <ErrorReport>prompt</ErrorReport>
+    <WarningLevel>4</WarningLevel>
+  </PropertyGroup>
+  <ItemGroup>
+    <Reference Include="Microsoft.VisualStudio.QualityTools.UnitTestFramework, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL" />
+    <Reference Include="System" />
+    <Reference Include="System.Core">
+      <RequiredTargetFramework>3.5</RequiredTargetFramework>
+    </Reference>
+    <Reference Include="System.Data.Linq" />
+  </ItemGroup>
+  <ItemGroup>
+    <CodeAnalysisDependentAssemblyPaths Condition=" '$(VS100COMNTOOLS)' != '' " Include="$(VS100COMNTOOLS)..\IDE\PrivateAssemblies">
+      <Visible>False</Visible>
+    </CodeAnalysisDependentAssemblyPaths>
+  </ItemGroup>
+  <ItemGroup>
+    <Compile Include="Properties\AssemblyInfo.cs" />
+    <Compile Include="UnitTest.cs" />
+  </ItemGroup>
+  <ItemGroup>
+    <ProjectReference Include="..\HeuristicLab.Services.OKB.DataAccess-3.3.csproj">
+      <Project>{E36BE58F-F3CE-40BB-9AB3-9F9E30AD5CCF}</Project>
+      <Name>HeuristicLab.Services.OKB.DataAccess-3.3</Name>
+    </ProjectReference>
+  </ItemGroup>
+  <Import Project="$(MSBuildBinPath)\Microsoft.CSharp.targets" />
+  <!-- To modify your build process, add your task inside one of the targets below and uncomment it. 
+       Other similar extension points exist, see Microsoft.Common.targets.
+  <Target Name="BeforeBuild">
+  </Target>
+  <Target Name="AfterBuild">
+  </Target>
+  -->
+</Project>
Index: /branches/OKB/HeuristicLab.Services.OKB.DataAccess/3.3/Tests/Properties/AssemblyInfo.cs
===================================================================
--- /branches/OKB/HeuristicLab.Services.OKB.DataAccess/3.3/Tests/Properties/AssemblyInfo.cs	(revision 4480)
+++ /branches/OKB/HeuristicLab.Services.OKB.DataAccess/3.3/Tests/Properties/AssemblyInfo.cs	(revision 4480)
@@ -0,0 +1,56 @@
+﻿#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.Reflection;
+using System.Runtime.CompilerServices;
+using System.Runtime.InteropServices;
+
+// General Information about an assembly is controlled through the following 
+// set of attributes. Change these attribute values to modify the information
+// associated with an assembly.
+[assembly: AssemblyTitle("HeuristicLab.Services.OKB.DataAccess-3.3.Tests")]
+[assembly: AssemblyDescription("Unit tests for the HeuristicLab OKB services data access layer.")]
+[assembly: AssemblyConfiguration("")]
+[assembly: AssemblyCompany("")]
+[assembly: AssemblyProduct("HeuristicLab")]
+[assembly: AssemblyCopyright("(c) 2002-2010 HEAL")]
+[assembly: AssemblyTrademark("")]
+[assembly: AssemblyCulture("")]
+
+// Setting ComVisible to false makes the types in this assembly not visible 
+// to COM components.  If you need to access a type in this assembly from 
+// COM, set the ComVisible attribute to true on that type.
+[assembly: ComVisible(false)]
+
+// The following GUID is for the ID of the typelib if this project is exposed to COM
+[assembly: Guid("50ee0006-ea13-4495-8136-d62565b6f013")]
+
+// Version information for an assembly consists of the following four values:
+//
+//      Major Version
+//      Minor Version 
+//      Build Number
+//      Revision
+//
+// You can specify all the values or you can default the Build and Revision Numbers 
+// by using the '*' as shown below:
+[assembly: AssemblyVersion("3.3.0.0")]
+[assembly: AssemblyFileVersion("3.3.0.0")]
Index: /branches/OKB/HeuristicLab.Services.OKB.DataAccess/3.3/Tests/UnitTest.cs
===================================================================
--- /branches/OKB/HeuristicLab.Services.OKB.DataAccess/3.3/Tests/UnitTest.cs	(revision 4480)
+++ /branches/OKB/HeuristicLab.Services.OKB.DataAccess/3.3/Tests/UnitTest.cs	(revision 4480)
@@ -0,0 +1,104 @@
+﻿#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.Text;
+using System.Collections.Generic;
+using System.Linq;
+using System.Data.Linq;
+using Microsoft.VisualStudio.TestTools.UnitTesting;
+using HeuristicLab.Services.OKB.DataAccess;
+
+namespace HeuristicLab.Services.OKB.DataAccess_33.Tests {
+  /// <summary>
+  /// Summary description for UnitTest1
+  /// </summary>
+  [TestClass]
+  public class UnitTest {
+    public UnitTest() {
+      //
+      // TODO: Add constructor logic here
+      //
+    }
+
+    private TestContext testContextInstance;
+
+    /// <summary>
+    ///Gets or sets the test context which provides
+    ///information about and functionality for the current test run.
+    ///</summary>
+    public TestContext TestContext {
+      get {
+        return testContextInstance;
+      }
+      set {
+        testContextInstance = value;
+      }
+    }
+
+    #region Additional test attributes
+    //
+    // You can use the following additional attributes as you write your tests:
+    //
+    // Use ClassInitialize to run code before running the first test in the class
+    // [ClassInitialize()]
+    // public static void MyClassInitialize(TestContext testContext) { }
+    //
+    // Use ClassCleanup to run code after all tests in a class have run
+    // [ClassCleanup()]
+    // public static void MyClassCleanup() { }
+    //
+    // Use TestInitialize to run code before running each test 
+    // [TestInitialize()]
+    // public void MyTestInitialize() { }
+    //
+    // Use TestCleanup to run code after each test has run
+    // [TestCleanup()]
+    // public void MyTestCleanup() { }
+    //
+    #endregion
+
+    [TestMethod]
+    public void TestMethod1() {
+      using (OKBDataContext okb = new OKBDataContext()) {
+        okb.AlgorithmParameterIntValues.DeleteAllOnSubmit(okb.AlgorithmParameterIntValues);
+        okb.AlgorithmParameters.DeleteAllOnSubmit(okb.AlgorithmParameters);
+        okb.Experiments.DeleteAllOnSubmit(okb.Experiments);
+        okb.Algorithms.DeleteAllOnSubmit(okb.Algorithms);
+        okb.Problems.DeleteAllOnSubmit(okb.Problems);
+        okb.SolutionRepresentations.DeleteAllOnSubmit(okb.SolutionRepresentations);
+        okb.ProblemClasses.DeleteAllOnSubmit(okb.ProblemClasses);
+        okb.AlgorithmClasses.DeleteAllOnSubmit(okb.AlgorithmClasses);
+        okb.SubmitChanges();
+        AlgorithmClass ac = new AlgorithmClass() { Name = "AlgorithmClass" };
+        ProblemClass pc = new ProblemClass() { Name = "ProblemClass" };
+        SolutionRepresentation sr = new SolutionRepresentation() { Name = "SolutionRepresentation" };
+        Algorithm a = new Algorithm() { Name = "Alg", AlgorithmClass = ac, PlatformId = 1 };
+        Problem p = new Problem() { Name = "Prb", ProblemClass = pc, SolutionRepresentation = sr, PlatformId = 1 };
+        Experiment e = new Experiment() { Algorithm = a, Problem = p };
+        AlgorithmParameter ap = new AlgorithmParameter() { Name = "Param", Algorithm = a, DataTypeId = 1 };
+        ap.AlgorithmParameterIntValues.Add(new AlgorithmParameterIntValue() { AlgorithmParameterId = 0, Experiment = e, Value = 23 });
+        okb.AlgorithmClasses.InsertOnSubmit(ac);
+        okb.SubmitChanges();
+      }
+    }
+  }
+}
Index: /branches/OKB/HeuristicLab.Services.OKB.DataAccess/3.3/app.config
===================================================================
--- /branches/OKB/HeuristicLab.Services.OKB.DataAccess/3.3/app.config	(revision 4480)
+++ /branches/OKB/HeuristicLab.Services.OKB.DataAccess/3.3/app.config	(revision 4480)
@@ -0,0 +1,10 @@
+<?xml version="1.0"?>
+<configuration>
+  <configSections>
+  </configSections>
+  <connectionStrings>
+    <add name="HeuristicLab.Services.OKB.DataAccess.Properties.Settings.OKBConnectionString"
+         connectionString="Data Source=.\SQLEXPRESS;Integrated Security=SSPI;Initial Catalog=HeuristicLab.OKB"
+         providerName="System.Data.SqlClient" />
+  </connectionStrings>
+<startup><supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.0"/></startup></configuration>
Index: /branches/OKB/HeuristicLab.Services.OKB.DataTransfer/3.3/Algorithm.cs
===================================================================
--- /branches/OKB/HeuristicLab.Services.OKB.DataTransfer/3.3/Algorithm.cs	(revision 4480)
+++ /branches/OKB/HeuristicLab.Services.OKB.DataTransfer/3.3/Algorithm.cs	(revision 4480)
@@ -0,0 +1,32 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2010 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System.Runtime.Serialization;
+
+namespace HeuristicLab.Services.OKB.DataTransfer {
+  [DataContract]
+  public class Algorithm : NamedOKBItem {
+    [DataMember]
+    public long PlatformId { get; set; }
+    [DataMember]
+    public long AlgorithmClassId { get; set; }
+  }
+}
Index: /branches/OKB/HeuristicLab.Services.OKB.DataTransfer/3.3/AlgorithmClass.cs
===================================================================
--- /branches/OKB/HeuristicLab.Services.OKB.DataTransfer/3.3/AlgorithmClass.cs	(revision 4480)
+++ /branches/OKB/HeuristicLab.Services.OKB.DataTransfer/3.3/AlgorithmClass.cs	(revision 4480)
@@ -0,0 +1,27 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2010 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System.Runtime.Serialization;
+
+namespace HeuristicLab.Services.OKB.DataTransfer {
+  [DataContract]
+  public class AlgorithmClass : NamedOKBItem { }
+}
Index: /branches/OKB/HeuristicLab.Services.OKB.DataTransfer/3.3/AlgorithmData.cs
===================================================================
--- /branches/OKB/HeuristicLab.Services.OKB.DataTransfer/3.3/AlgorithmData.cs	(revision 4480)
+++ /branches/OKB/HeuristicLab.Services.OKB.DataTransfer/3.3/AlgorithmData.cs	(revision 4480)
@@ -0,0 +1,34 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2010 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System.Runtime.Serialization;
+
+namespace HeuristicLab.Services.OKB.DataTransfer {
+  [DataContract]
+  public class AlgorithmData {
+    [DataMember]
+    public long AlgorithmId { get; set; }
+    [DataMember]
+    public long DataTypeId { get; set; }
+    [DataMember]
+    public byte[] Data { get; set; }
+  }
+}
Index: /branches/OKB/HeuristicLab.Services.OKB.DataTransfer/3.3/DataType.cs
===================================================================
--- /branches/OKB/HeuristicLab.Services.OKB.DataTransfer/3.3/DataType.cs	(revision 4480)
+++ /branches/OKB/HeuristicLab.Services.OKB.DataTransfer/3.3/DataType.cs	(revision 4480)
@@ -0,0 +1,34 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2010 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System.Runtime.Serialization;
+
+namespace HeuristicLab.Services.OKB.DataTransfer {
+  [DataContract]
+  public class DataType : OKBItem {
+    [DataMember]
+    public string Name { get; set; }
+    [DataMember]
+    public string SqlName { get; set; }
+    [DataMember]
+    public long PlatformId { get; set; }
+  }
+}
Index: /branches/OKB/HeuristicLab.Services.OKB.DataTransfer/3.3/HeuristicLab.Services.OKB.DataTransfer-3.3.csproj
===================================================================
--- /branches/OKB/HeuristicLab.Services.OKB.DataTransfer/3.3/HeuristicLab.Services.OKB.DataTransfer-3.3.csproj	(revision 4480)
+++ /branches/OKB/HeuristicLab.Services.OKB.DataTransfer/3.3/HeuristicLab.Services.OKB.DataTransfer-3.3.csproj	(revision 4480)
@@ -0,0 +1,80 @@
+﻿<?xml version="1.0" encoding="utf-8"?>
+<Project ToolsVersion="4.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+  <PropertyGroup>
+    <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
+    <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
+    <ProductVersion>8.0.30703</ProductVersion>
+    <SchemaVersion>2.0</SchemaVersion>
+    <ProjectGuid>{209FD7A1-DFB2-4B9F-9268-B95E886B2F7A}</ProjectGuid>
+    <OutputType>Library</OutputType>
+    <AppDesignerFolder>Properties</AppDesignerFolder>
+    <RootNamespace>HeuristicLab.Services.OKB.DataTransfer</RootNamespace>
+    <AssemblyName>HeuristicLab.Services.OKB.DataTransfer-3.3</AssemblyName>
+    <TargetFrameworkVersion>v3.5</TargetFrameworkVersion>
+    <FileAlignment>512</FileAlignment>
+    <TargetFrameworkProfile />
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
+    <DebugSymbols>true</DebugSymbols>
+    <DebugType>full</DebugType>
+    <Optimize>false</Optimize>
+    <OutputPath>bin\Debug\</OutputPath>
+    <DefineConstants>DEBUG;TRACE</DefineConstants>
+    <ErrorReport>prompt</ErrorReport>
+    <WarningLevel>4</WarningLevel>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
+    <DebugType>pdbonly</DebugType>
+    <Optimize>true</Optimize>
+    <OutputPath>bin\Release\</OutputPath>
+    <DefineConstants>TRACE</DefineConstants>
+    <ErrorReport>prompt</ErrorReport>
+    <WarningLevel>4</WarningLevel>
+  </PropertyGroup>
+  <PropertyGroup>
+    <SignAssembly>true</SignAssembly>
+  </PropertyGroup>
+  <PropertyGroup>
+    <AssemblyOriginatorKeyFile>HeuristicLab.snk</AssemblyOriginatorKeyFile>
+  </PropertyGroup>
+  <ItemGroup>
+    <Reference Include="System" />
+    <Reference Include="System.Core" />
+    <Reference Include="System.Runtime.Serialization" />
+    <Reference Include="System.Xml.Linq" />
+    <Reference Include="System.Data.DataSetExtensions" />
+    <Reference Include="System.Data" />
+    <Reference Include="System.Xml" />
+  </ItemGroup>
+  <ItemGroup>
+    <Compile Include="AlgorithmClass.cs" />
+    <Compile Include="Algorithm.cs" />
+    <Compile Include="AlgorithmData.cs" />
+    <Compile Include="DataType.cs" />
+    <Compile Include="User.cs" />
+    <Compile Include="NamedOKBItem.cs" />
+    <Compile Include="OKBItem.cs" />
+    <Compile Include="Platform.cs" />
+    <Compile Include="Properties\AssemblyInfo.cs" />
+    <None Include="Properties\AssemblyInfo.frame" />
+  </ItemGroup>
+  <ItemGroup>
+    <None Include="HeuristicLab.snk" />
+  </ItemGroup>
+  <Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
+  <PropertyGroup>
+    <PreBuildEvent>set Path=%25Path%25;$(ProjectDir);$(SolutionDir)
+set ProjectDir=$(ProjectDir)
+set SolutionDir=$(SolutionDir)
+set Outdir=$(Outdir)
+
+call PreBuildEvent.cmd</PreBuildEvent>
+  </PropertyGroup>
+  <!-- To modify your build process, add your task inside one of the targets below and uncomment it. 
+       Other similar extension points exist, see Microsoft.Common.targets.
+  <Target Name="BeforeBuild">
+  </Target>
+  <Target Name="AfterBuild">
+  </Target>
+  -->
+</Project>
Index: /branches/OKB/HeuristicLab.Services.OKB.DataTransfer/3.3/NamedOKBItem.cs
===================================================================
--- /branches/OKB/HeuristicLab.Services.OKB.DataTransfer/3.3/NamedOKBItem.cs	(revision 4480)
+++ /branches/OKB/HeuristicLab.Services.OKB.DataTransfer/3.3/NamedOKBItem.cs	(revision 4480)
@@ -0,0 +1,32 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2010 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System.Runtime.Serialization;
+
+namespace HeuristicLab.Services.OKB.DataTransfer {
+  [DataContract]
+  public abstract class NamedOKBItem : OKBItem {
+    [DataMember]
+    public string Name { get; set; }
+    [DataMember]
+    public string Description { get; set; }
+  }
+}
Index: /branches/OKB/HeuristicLab.Services.OKB.DataTransfer/3.3/OKBItem.cs
===================================================================
--- /branches/OKB/HeuristicLab.Services.OKB.DataTransfer/3.3/OKBItem.cs	(revision 4480)
+++ /branches/OKB/HeuristicLab.Services.OKB.DataTransfer/3.3/OKBItem.cs	(revision 4480)
@@ -0,0 +1,30 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2010 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System.Runtime.Serialization;
+
+namespace HeuristicLab.Services.OKB.DataTransfer {
+  [DataContract]
+  public abstract class OKBItem {
+    [DataMember]
+    public long Id { get; set; }
+  }
+}
Index: /branches/OKB/HeuristicLab.Services.OKB.DataTransfer/3.3/Platform.cs
===================================================================
--- /branches/OKB/HeuristicLab.Services.OKB.DataTransfer/3.3/Platform.cs	(revision 4480)
+++ /branches/OKB/HeuristicLab.Services.OKB.DataTransfer/3.3/Platform.cs	(revision 4480)
@@ -0,0 +1,27 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2010 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System.Runtime.Serialization;
+
+namespace HeuristicLab.Services.OKB.DataTransfer {
+  [DataContract]
+  public class Platform : NamedOKBItem { }
+}
Index: /branches/OKB/HeuristicLab.Services.OKB.DataTransfer/3.3/Properties/AssemblyInfo.frame
===================================================================
--- /branches/OKB/HeuristicLab.Services.OKB.DataTransfer/3.3/Properties/AssemblyInfo.frame	(revision 4480)
+++ /branches/OKB/HeuristicLab.Services.OKB.DataTransfer/3.3/Properties/AssemblyInfo.frame	(revision 4480)
@@ -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.Reflection;
+using System.Runtime.CompilerServices;
+using System.Runtime.InteropServices;
+
+// General Information about an assembly is controlled through the following 
+// set of attributes. Change these attribute values to modify the information
+// associated with an assembly.
+[assembly: AssemblyTitle("HeuristicLab.Services.OKB.DataTransfer")]
+[assembly: AssemblyDescription("Data transfer objects for HeuristicLab OKB services")]
+[assembly: AssemblyConfiguration("")]
+[assembly: AssemblyCompany("")]
+[assembly: AssemblyProduct("HeuristicLab")]
+[assembly: AssemblyCopyright("(c) 2002-2010 HEAL")]
+[assembly: AssemblyTrademark("")]
+[assembly: AssemblyCulture("")]
+
+// Setting ComVisible to false makes the types in this assembly not visible 
+// to COM components.  If you need to access a type in this assembly from 
+// COM, set the ComVisible attribute to true on that type.
+[assembly: ComVisible(false)]
+
+// The following GUID is for the ID of the typelib if this project is exposed to COM
+[assembly: Guid("73fea41e-7023-483f-abc1-0c1a6894a1fb")]
+
+// Version information for an assembly consists of the following four values:
+//
+//      Major Version
+//      Minor Version 
+//      Build Number
+//      Revision
+//
+// You can specify all the values or you can default the Build and Revision Numbers 
+// by using the '*' as shown below:
+// [assembly: AssemblyVersion("1.0.*")]
+[assembly: AssemblyVersion("3.3.0.0")]
+[assembly: AssemblyFileVersion("3.3.0.$WCREV$")]
Index: /branches/OKB/HeuristicLab.Services.OKB.DataTransfer/3.3/User.cs
===================================================================
--- /branches/OKB/HeuristicLab.Services.OKB.DataTransfer/3.3/User.cs	(revision 4480)
+++ /branches/OKB/HeuristicLab.Services.OKB.DataTransfer/3.3/User.cs	(revision 4480)
@@ -0,0 +1,33 @@
+﻿#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.Runtime.Serialization;
+
+namespace HeuristicLab.Services.OKB.DataTransfer {
+  [DataContract]
+  public class User {
+    [DataMember]
+    public Guid Id { get; set; }
+    [DataMember]
+    public string Name { get; set; }
+  }
+}
Index: /branches/OKB/HeuristicLab.Services.OKB/3.3/AdminService.cs
===================================================================
--- /branches/OKB/HeuristicLab.Services.OKB/3.3/AdminService.cs	(revision 4480)
+++ /branches/OKB/HeuristicLab.Services.OKB/3.3/AdminService.cs	(revision 4480)
@@ -0,0 +1,305 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2010 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.ServiceModel;
+using HeuristicLab.Services.OKB.DataAccess;
+
+namespace HeuristicLab.Services.OKB {
+  /// <summary>
+  /// Implementation of the OKB administration service (interface <see cref="IAdminService"/>).
+  /// </summary>
+  [ServiceBehavior(IncludeExceptionDetailInFaults = true)]
+  public class AdminService : IAdminService {
+    #region Platform Methods
+    public DataTransfer.Platform GetPlatform(long id) {
+      using (OKBDataContext okb = new OKBDataContext()) {
+        return Convert.ToDto(okb.Platforms.FirstOrDefault(x => x.Id == id));
+      }
+    }
+    public IEnumerable<DataTransfer.Platform> GetPlatforms() {
+      using (OKBDataContext okb = new OKBDataContext()) {
+        return okb.Platforms.Select(x => Convert.ToDto(x)).ToArray();
+      }
+    }
+    public void StorePlatform(DataTransfer.Platform dto) {
+      using (OKBDataContext okb = new OKBDataContext()) {
+        DataAccess.Platform entity = okb.Platforms.FirstOrDefault(x => x.Id == dto.Id);
+        if (entity == null) okb.Platforms.InsertOnSubmit(Convert.ToEntity(dto));
+        else Convert.ToEntity(dto, entity);
+        okb.SubmitChanges();
+      }
+    }
+    public void DeletePlatform(long id) {
+      using (OKBDataContext okb = new OKBDataContext()) {
+        DataAccess.Platform entity = okb.Platforms.FirstOrDefault(x => x.Id == id);
+        if (entity != null) okb.Platforms.DeleteOnSubmit(entity);
+        okb.SubmitChanges();
+      }
+    }
+    #endregion
+
+    #region AlgorithmClass Methods
+    public DataTransfer.AlgorithmClass GetAlgorithmClass(long id) {
+      using (OKBDataContext okb = new OKBDataContext()) {
+        return Convert.ToDto(okb.AlgorithmClasses.FirstOrDefault(x => x.Id == id));
+      }
+    }
+    public IEnumerable<DataTransfer.AlgorithmClass> GetAlgorithmClasses() {
+      using (OKBDataContext okb = new OKBDataContext()) {
+        return okb.AlgorithmClasses.Select(x => Convert.ToDto(x)).ToArray();
+      }
+    }
+    public void StoreAlgorithmClass(DataTransfer.AlgorithmClass dto) {
+      using (OKBDataContext okb = new OKBDataContext()) {
+        DataAccess.AlgorithmClass entity = okb.AlgorithmClasses.FirstOrDefault(x => x.Id == dto.Id);
+        if (entity == null) okb.AlgorithmClasses.InsertOnSubmit(Convert.ToEntity(dto));
+        else Convert.ToEntity(dto, entity);
+        okb.SubmitChanges();
+      }
+    }
+    public void DeleteAlgorithmClass(long id) {
+      using (OKBDataContext okb = new OKBDataContext()) {
+        DataAccess.AlgorithmClass entity = okb.AlgorithmClasses.FirstOrDefault(x => x.Id == id);
+        if (entity != null) okb.AlgorithmClasses.DeleteOnSubmit(entity);
+        okb.SubmitChanges();
+      }
+    }
+    #endregion
+
+    #region Algorithm Methods
+    public DataTransfer.Algorithm GetAlgorithm(long id) {
+      using (OKBDataContext okb = new OKBDataContext()) {
+        return Convert.ToDto(okb.Algorithms.FirstOrDefault(x => x.Id == id));
+      }
+    }
+    public IEnumerable<DataTransfer.Algorithm> GetAlgorithms() {
+      using (OKBDataContext okb = new OKBDataContext()) {
+        return okb.Algorithms.Select(x => Convert.ToDto(x)).ToArray();
+      }
+    }
+    public void StoreAlgorithm(DataTransfer.Algorithm dto) {
+      using (OKBDataContext okb = new OKBDataContext()) {
+        DataAccess.Algorithm entity = okb.Algorithms.FirstOrDefault(x => x.Id == dto.Id);
+        if (entity == null) okb.Algorithms.InsertOnSubmit(Convert.ToEntity(dto));
+        else Convert.ToEntity(dto, entity);
+        okb.SubmitChanges();
+      }
+    }
+    public void DeleteAlgorithm(long id) {
+      using (OKBDataContext okb = new OKBDataContext()) {
+        DataAccess.Algorithm entity = okb.Algorithms.FirstOrDefault(x => x.Id == id);
+        if (entity != null) okb.Algorithms.DeleteOnSubmit(entity);
+        okb.SubmitChanges();
+      }
+    }
+    public IEnumerable<Guid> GetAlgorithmUsers(long algorithmId) {
+      using (OKBDataContext okb = new OKBDataContext()) {
+        return okb.AlgorithmUsers.Where(x => x.AlgorithmId == algorithmId).Select(x => x.UserId).ToArray();
+      }
+    }
+    public void StoreAlgorithmUsers(long algorithmId, IEnumerable<Guid> users) {
+      using (OKBDataContext okb = new OKBDataContext()) {
+        okb.AlgorithmUsers.DeleteAllOnSubmit(okb.AlgorithmUsers.Where(x => x.AlgorithmId == algorithmId));
+        okb.AlgorithmUsers.InsertAllOnSubmit(users.Select(x => new DataAccess.AlgorithmUser { AlgorithmId = algorithmId, UserId = x }));
+        okb.SubmitChanges();
+      }
+    }
+    #endregion
+
+    #region AlgorithmData Methods
+    public DataTransfer.AlgorithmData GetAlgorithmData(long algorithmId) {
+      using (OKBDataContext okb = new OKBDataContext()) {
+        return Convert.ToDto(okb.AlgorithmDatas.FirstOrDefault(x => x.AlgorithmId == algorithmId));
+      }
+    }
+    public void StoreAlgorithmData(DataTransfer.AlgorithmData dto) {
+      using (OKBDataContext okb = new OKBDataContext()) {
+        DataAccess.AlgorithmData entity = okb.AlgorithmDatas.FirstOrDefault(x => x.AlgorithmId == dto.AlgorithmId);
+        if (entity == null) okb.AlgorithmDatas.InsertOnSubmit(Convert.ToEntity(dto));
+        else Convert.ToEntity(dto, entity);
+        okb.SubmitChanges();
+      }
+    }
+    #endregion
+
+    #region DataType Methods
+    public DataTransfer.DataType GetDataType(long id) {
+      using (OKBDataContext okb = new OKBDataContext()) {
+        return Convert.ToDto(okb.DataTypes.FirstOrDefault(x => x.Id == id));
+      }
+    }
+    public IEnumerable<DataTransfer.DataType> GetDataTypes() {
+      using (OKBDataContext okb = new OKBDataContext()) {
+        return okb.DataTypes.Select(x => Convert.ToDto(x)).ToArray();
+      }
+    }
+    public void StoreDataType(DataTransfer.DataType dto) {
+      using (OKBDataContext okb = new OKBDataContext()) {
+        DataAccess.DataType entity = okb.DataTypes.FirstOrDefault(x => x.Id == dto.Id);
+        if (entity == null) okb.DataTypes.InsertOnSubmit(Convert.ToEntity(dto));
+        else Convert.ToEntity(dto, entity);
+        okb.SubmitChanges();
+      }
+    }
+    public void DeleteDataType(long id) {
+      using (OKBDataContext okb = new OKBDataContext()) {
+        DataAccess.DataType entity = okb.DataTypes.FirstOrDefault(x => x.Id == id);
+        if (entity != null) okb.DataTypes.DeleteOnSubmit(entity);
+        okb.SubmitChanges();
+      }
+    }
+    #endregion
+
+    /*
+
+    /// <summary>
+    /// Gets the complete algorithm object graph up to the following entities:
+    /// <list type="bullet">
+    ///   <item>Parameter</item>
+    ///   <item>Algorithm_Paramters.Parameter.DataType</item>
+    ///   <item>Algorithm_Results.Result.DataType</item>
+    /// </list>
+    /// </summary>
+    /// <param name="id">The algorithm id.</param>
+    /// <returns>An <see cref="Algorithm"/></returns>
+    public Algorithm GetCompleteAlgorithm(int id) {
+      using (OKBDataContext okb = new OKBDataContext()) {
+        var dlo = new DataLoadOptions();
+        dlo.LoadWith<Algorithm>(a => a.AlgorithmClass);
+        dlo.LoadWith<Algorithm>(a => a.Platform);
+        dlo.LoadWith<Algorithm>(a => a.AlgorithmUsers);
+        dlo.LoadWith<AlgorithmUser>(u => u.User);
+        okb.LoadOptions = dlo;
+        return okb.Algorithms.Single(a => a.Id == id);
+      }
+    }
+
+    /// <summary>
+    /// Gets the complete problem object graph up to the following entities:
+    /// <list type="bullet">
+    ///   <item>Platform</item>
+    ///   <item>SolutionRepresentation</item>
+    ///   <item>Problem_Parameters.Parameter</item>
+    ///   <item>IntProblemCharacteristicValues.ProblemCharacteristic.DataType</item>
+    ///   <item>FloatProblemCharacteristicValues.ProblemCharacteristic.DataType</item>
+    ///   <item>CharProblemCharacteristicValues.ProblemCharacteristic.DataType</item>
+    /// </list>
+    /// </summary>
+    /// <param name="id">The problem id.</param>
+    /// <returns>A <see cref="Problem"/></returns>
+    public Problem GetCompleteProblem(int id) {
+      using (OKBDataContext okb = new OKBDataContext()) {
+        var dlo = new DataLoadOptions();
+        dlo.LoadWith<Problem>(p => p.ProblemClass);
+        dlo.LoadWith<Problem>(p => p.Platform);
+        dlo.LoadWith<Problem>(p => p.ProblemUsers);
+        dlo.LoadWith<ProblemUser>(u => u.User);
+        okb.LoadOptions = dlo;
+        return okb.Problems.Single(p => p.Id == id);
+      }
+    }
+
+    /// <summary>
+    /// Updates the algorithm object graph including the following properties and linked entitites:
+    /// <list type="bullet">
+    ///   <item>Name</item>
+    ///   <item>Description</item>
+    ///   <item>AlgorithmClassId</item>
+    ///   <item>PlatformId</item>
+    ///   <item>Algorithm_Parameters</item>
+    ///   <item>Algorithm_Results</item>
+    /// </list>
+    /// <remarks>
+    /// New <see cref="Parameter"/>s or <see cref="Result"/>s will not be
+    /// created but have to be pre-existing.
+    /// </remarks>
+    /// </summary>
+    /// <param name="algorithm">The algorithm.</param>
+    public void UpdateCompleteAlgorithm(Algorithm algorithm) {
+      using (OKBDataContext okb = new OKBDataContext()) {
+        Algorithm original = okb.Algorithms.Single(a => a.Id == algorithm.Id);
+        UpdateAlgorithmData(algorithm, original, okb);
+        okb.SubmitChanges();
+      }
+    }
+
+    /// <summary>
+    /// Updates the problem object graph including the following properties and linked entities:
+    /// <list type="bullet">
+    ///   <item>Name</item>
+    ///   <item>Description</item>
+    ///   <item>ProblemClassId</item>
+    ///   <item>PlatformId</item>
+    ///   <item>SolutionRepresentationId</item>
+    ///   <item>IntProblemCharacteristicValues.Value</item>
+    ///   <item>FloatProblemCharacteristicValues.Value</item>
+    ///   <item>CharProblemCharacteristicValues.Value</item>
+    ///   <item>Problem_Parameters</item>
+    /// </list>
+    /// <remarks>
+    /// New <see cref="ProblemCharacteristic"/>s or <see cref="Parameter"/>s will
+    /// not be created but have to be pre-existing.
+    /// </remarks>
+    /// </summary>
+    /// <param name="problem">The problem.</param>
+    public void UpdateCompleteProblem(Problem problem) {
+      using (OKBDataContext okb = new OKBDataContext()) {
+        Problem originalProblem = okb.Problems.Single(p => p.Id == problem.Id);
+        UpdateProblemData(problem, originalProblem, okb);
+        okb.SubmitChanges();
+      }
+    }
+
+    private static void UpdateAlgorithmData(Algorithm algorithm, Algorithm original, OKBDataContext okb) {
+      original.Name = algorithm.Name;
+      original.Description = algorithm.Description;
+      original.AlgorithmClassId = algorithm.AlgorithmClassId;
+      original.PlatformId = algorithm.PlatformId;
+      okb.AlgorithmUsers.DeleteAllOnSubmit(original.AlgorithmUsers);
+      original.AlgorithmUsers.Clear();
+      foreach (var u in algorithm.AlgorithmUsers) {
+        original.AlgorithmUsers.Add(new AlgorithmUser() {
+          AlgorithmId = original.Id,
+          UserId = u.UserId
+        });
+      }
+    }
+
+    private static void UpdateProblemData(Problem problem, Problem original, OKBDataContext okb) {
+      original.Name = problem.Name;
+      original.Description = problem.Description;
+      original.ProblemClassId = problem.ProblemClassId;
+      original.SolutionRepresentationId = problem.SolutionRepresentationId;
+      original.PlatformId = problem.PlatformId;
+      okb.ProblemUsers.DeleteAllOnSubmit(original.ProblemUsers);
+      original.ProblemUsers.Clear();
+      foreach (var u in problem.ProblemUsers) {
+        original.ProblemUsers.Add(new ProblemUser() {
+          ProblemId = original.Id,
+          UserId = u.UserId
+        });
+      }
+    }*/
+  }
+}
Index: /branches/OKB/HeuristicLab.Services.OKB/3.3/AttributeSelector.cs
===================================================================
--- /branches/OKB/HeuristicLab.Services.OKB/3.3/AttributeSelector.cs	(revision 4480)
+++ /branches/OKB/HeuristicLab.Services.OKB/3.3/AttributeSelector.cs	(revision 4480)
@@ -0,0 +1,118 @@
+﻿#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.Runtime.Serialization;
+using HeuristicLab.Services.OKB.AttributeSelection;
+using HeuristicLab.Services.OKB.DataAccess;
+
+namespace HeuristicLab.Services.OKB {
+
+  /// <summary>
+  /// Data capsule for describing data base fields and
+  /// restrictions. This is the basis for building complex queries.
+  /// </summary>
+  [DataContract]
+  public class AttributeSelector : IAttributeSelector {
+
+    /// <summary>
+    /// Gets or sets the name of the table.
+    /// </summary>
+    /// <value>The name of the table.</value>
+    [DataMember]
+    public string TableName { get; set; }
+
+    /// <summary>
+    /// Gets or sets the name of the field.
+    /// </summary>
+    /// <value>The name of the field.</value>
+    [DataMember]
+    public string FieldName { get; set; }
+
+    /// <summary>
+    /// Gets or sets a value indicating whether this instance is hidden.
+    /// </summary>
+    /// <value><c>true</c> if this instance is hidden; otherwise, <c>false</c>.</value>
+    [DataMember]
+    public bool IsHidden { get; set; }
+
+    /// <summary>
+    /// Gets or sets the min value.
+    /// </summary>
+    /// <value>The min value.</value>
+    [DataMember]
+    public object MinValue { get; set; }
+
+    /// <summary>
+    /// Gets or sets the max value.
+    /// </summary>
+    /// <value>The max value.</value>
+    [DataMember]
+    public object MaxValue { get; set; }
+
+    /// <summary>
+    /// Gets or sets the allowed values.
+    /// </summary>
+    /// <value>The allowed values.</value>
+    [DataMember]
+    public ICollection<object> AllowedValues { get; set; }
+
+    /// <summary>
+    /// Gets or sets the name of the data type.
+    /// </summary>
+    /// <value>The name of the data type.</value>
+    [DataMember]
+    public string DataTypeName { get; set; }
+
+    /// <summary>
+    /// Gets an actual implementations linked to the database.
+    /// </summary>
+    /// <param name="okb">The okb data context.</param>
+    /// <returns>A <see cref="RunAttributeSelector"/></returns>
+    public RunAttributeSelector GetImpl(OKBDataContext okb) {
+      return new RunAttributeSelector(okb, TableName, FieldName) {
+        IsHidden = IsHidden,
+        MinValue = MinValue,
+        MaxValue = MaxValue,
+        AllowedValues = AllowedValues,
+      };
+    }
+
+    /// <summary>
+    /// Initializes a new instance of the <see cref="AttributeSelector"/> class.
+    /// </summary>
+    public AttributeSelector() { }
+
+    /// <summary>
+    /// Initializes a new instance of the <see cref="AttributeSelector"/> class.
+    /// </summary>
+    /// <param name="selector">The selector.</param>
+    public AttributeSelector(RunAttributeSelector selector) {
+      TableName = selector.TableName;
+      FieldName = selector.FieldName;
+      IsHidden = selector.IsHidden;
+      MinValue = selector.MinValue;
+      MaxValue = selector.MaxValue;
+      AllowedValues = selector.AllowedValues;
+      DataTypeName = selector.DataType.FullName;
+    }
+  }
+}
Index: /branches/OKB/HeuristicLab.Services.OKB/3.3/AuthenticationService.cs
===================================================================
--- /branches/OKB/HeuristicLab.Services.OKB/3.3/AuthenticationService.cs	(revision 4480)
+++ /branches/OKB/HeuristicLab.Services.OKB/3.3/AuthenticationService.cs	(revision 4480)
@@ -0,0 +1,45 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2010 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.Collections.Generic;
+using System.ServiceModel;
+using System.Web.Security;
+
+namespace HeuristicLab.Services.OKB {
+  /// <summary>
+  /// Implementation of the OKB authentication service (interface <see cref="IAuthenticationService"/>).
+  /// </summary>
+  [ServiceBehavior(IncludeExceptionDetailInFaults = true)]
+  public class AuthenticationService : IAuthenticationService {
+    public DataTransfer.User GetUser(Guid id) {
+      MembershipUser user = Membership.GetUser(id);
+      if (user != null) return new DataTransfer.User { Id = id, Name = user.UserName };
+      else return null;
+    }
+    public IEnumerable<DataTransfer.User> GetUsers() {
+      List<DataTransfer.User> users = new List<DataTransfer.User>();
+      foreach (MembershipUser user in Membership.GetAllUsers())
+        users.Add(new DataTransfer.User { Id = (Guid)user.ProviderUserKey, Name = user.UserName });
+      return users;
+    }
+  }
+}
Index: /branches/OKB/HeuristicLab.Services.OKB/3.3/Convert.cs
===================================================================
--- /branches/OKB/HeuristicLab.Services.OKB/3.3/Convert.cs	(revision 4480)
+++ /branches/OKB/HeuristicLab.Services.OKB/3.3/Convert.cs	(revision 4480)
@@ -0,0 +1,88 @@
+﻿#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.Data.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) {
+      return new DT.Platform { Id = source.Id, Name = source.Name, Description = source.Description };
+    }
+    public static DA.Platform ToEntity(DT.Platform source) {
+      return new DA.Platform { Id = source.Id, Name = source.Name, Description = source.Description };
+    }
+    public static void ToEntity(DT.Platform source, DA.Platform target) {
+      target.Id = source.Id; target.Name = source.Name; target.Description = source.Description;
+    }
+    #endregion
+
+    #region AlgorithmClass
+    public static DT.AlgorithmClass ToDto(DA.AlgorithmClass source) {
+      return new DT.AlgorithmClass { Id = source.Id, Name = source.Name, Description = source.Description };
+    }
+    public static DA.AlgorithmClass ToEntity(DT.AlgorithmClass source) {
+      return new DA.AlgorithmClass { Id = source.Id, Name = source.Name, Description = source.Description };
+    }
+    public static void ToEntity(DT.AlgorithmClass source, DA.AlgorithmClass target) {
+      target.Id = source.Id; target.Name = source.Name; target.Description = source.Description;
+    }
+    #endregion
+
+    #region Algorithm
+    public static DT.Algorithm ToDto(DA.Algorithm source) {
+      return new DT.Algorithm { Id = source.Id, Name = source.Name, Description = source.Description, PlatformId = source.PlatformId, AlgorithmClassId = source.AlgorithmClassId };
+    }
+    public static DA.Algorithm ToEntity(DT.Algorithm source) {
+      return new DA.Algorithm { Id = source.Id, Name = source.Name, Description = source.Description, PlatformId = source.PlatformId, AlgorithmClassId = source.AlgorithmClassId };
+    }
+    public static void ToEntity(DT.Algorithm source, DA.Algorithm target) {
+      target.Id = source.Id; target.Name = source.Name; target.Description = source.Description; target.PlatformId = source.PlatformId; target.AlgorithmClassId = source.AlgorithmClassId;
+    }
+    #endregion
+
+    #region AlgorithmData
+    public static DT.AlgorithmData ToDto(DA.AlgorithmData source) {
+      return new DT.AlgorithmData { AlgorithmId = source.AlgorithmId, DataTypeId = source.DataTypeId, Data = source.Data.ToArray() };
+    }
+    public static DA.AlgorithmData ToEntity(DT.AlgorithmData source) {
+      return new DA.AlgorithmData { AlgorithmId = source.AlgorithmId, DataTypeId = source.DataTypeId, Data = new Binary(source.Data) };
+    }
+    public static void ToEntity(DT.AlgorithmData source, DA.AlgorithmData target) {
+      target.AlgorithmId = source.AlgorithmId; target.DataTypeId = source.DataTypeId; target.Data = new Binary(source.Data);
+    }
+    #endregion
+
+    #region DataType
+    public static DT.DataType ToDto(DA.DataType source) {
+      return new DT.DataType { Id = source.Id, Name = source.Name, SqlName = source.SqlName, PlatformId = source.PlatformId };
+    }
+    public static DA.DataType ToEntity(DT.DataType source) {
+      return new DA.DataType { Id = source.Id, Name = source.Name, SqlName = source.SqlName, PlatformId = source.PlatformId };
+    }
+    public static void ToEntity(DT.DataType source, DA.DataType target) {
+      target.Id = source.Id; target.Name = source.Name; target.SqlName = source.SqlName; target.PlatformId = source.PlatformId;
+    }
+    #endregion
+  }
+}
Index: /branches/OKB/HeuristicLab.Services.OKB/3.3/DataService.cs
===================================================================
--- /branches/OKB/HeuristicLab.Services.OKB/3.3/DataService.cs	(revision 4480)
+++ /branches/OKB/HeuristicLab.Services.OKB/3.3/DataService.cs	(revision 4480)
@@ -0,0 +1,183 @@
+﻿#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;
+using System.IO;
+using System.Linq;
+using System.ServiceModel;
+using HeuristicLab.Services.OKB.DataAccess;
+
+namespace HeuristicLab.Services.OKB {
+  /// <summary>
+  /// Implementation of the <see cref="IDataService"/>.
+  /// </summary>
+  [ServiceBehavior(InstanceContextMode = InstanceContextMode.PerSession, IncludeExceptionDetailInFaults = true)]
+  class DataService : IDisposable, IDataService {
+    private enum Mode { Request, Submit, None };
+
+    private Mode mode = Mode.None;
+    private EntityType type;
+    private int id = -1;
+    private MemoryStream dataStream;
+
+    private void EnsureInit() {
+      if (mode != Mode.None)
+        throw new FaultException(String.Format("Cannot service new request while processing another {0}-Operation.", mode));
+    }
+
+    private byte[] GetData(EntityType type, int id) {
+      using (OKBDataContext okb = new OKBDataContext()) {
+        switch (type) {
+          case EntityType.Algorithm:
+            Algorithm algorithm = okb.Algorithms.Single(a => a.Id == id);
+            if (algorithm.AlgorithmData == null) {
+              algorithm.AlgorithmData = new AlgorithmData() {
+                AlgorithmId = algorithm.Id,
+                Data = new Binary(new byte[0])
+              };
+              okb.SubmitChanges();
+            }
+            return algorithm.AlgorithmData.Data.ToArray();
+          case EntityType.Problem:
+            Problem problem = okb.Problems.Single(p => p.Id == id);
+            if (problem.ProblemData == null) {
+              problem.ProblemData = new ProblemData() {
+                ProblemId = problem.Id,
+                Data = new Binary(new byte[0])
+              };
+              okb.SubmitChanges();
+            }
+            return problem.ProblemData.Data.ToArray();
+          default:
+            throw new FaultException("Unsupported EntityType.");
+        }
+      }
+    }
+
+    private void SetData(EntityType type, int id, byte[] data) {
+      using (OKBDataContext okb = new OKBDataContext()) {
+        switch (type) {
+          case EntityType.Algorithm:
+            Algorithm algorithm = okb.Algorithms.Single(a => a.Id == id);
+            if (algorithm.AlgorithmData == null)
+              algorithm.AlgorithmData = new AlgorithmData() {
+                AlgorithmId = algorithm.Id,
+                Data = new Binary(new byte[0])
+              };
+            algorithm.AlgorithmData.Data = new Binary(data);
+            okb.SubmitChanges();
+            break;
+          case EntityType.Problem:
+            Problem problem = okb.Problems.Single(p => p.Id == id);
+            if (problem.ProblemData == null)
+              problem.ProblemData = new ProblemData() {
+                ProblemId = problem.Id,
+                Data = new Binary(new byte[0])
+              };
+            problem.ProblemData.Data = new Binary(data);
+            okb.SubmitChanges();
+            break;
+          default:
+            throw new FaultException("Unsupported EntityType.");
+        }
+      }
+    }
+
+    #region IDataService Members
+    /// <summary>
+    /// Request the specified <see cref="Algorithm"/> or <see cref="Problem"/>.
+    /// </summary>
+    /// <param name="type">The entity type.</param>
+    /// <param name="id">The entity id.</param>
+    /// <returns>The size of the data blob.</returns>
+    public int Request(EntityType type, int id) {
+      EnsureInit();
+      dataStream = new MemoryStream(GetData(type, id));
+      mode = Mode.Request;
+      return (int)dataStream.Length;
+    }
+
+    /// <summary>
+    /// Gets the next chunk of bytes.
+    /// </summary>
+    /// <param name="size">The maximum number of bytes to transfer.</param>
+    /// <returns>An array of bytes.</returns>
+    public byte[] GetNextChunk(int size) {
+      if (dataStream == null || mode != Mode.Request)
+        throw new FaultException("No data has been prepared, call Request first.");
+      byte[] chunk = new byte[Math.Min(size, dataStream.Length - dataStream.Position)];
+      dataStream.Read(chunk, 0, chunk.Length);
+      return chunk;
+    }
+
+    /// <summary>
+    /// Prepare submission of the specified <see cref="Algorithm"/> or <see cref="Problem"/>.
+    /// </summary>
+    /// <param name="type">The entity type.</param>
+    /// <param name="id">The entity id.</param>
+    public void Submit(EntityType type, int id) {
+      EnsureInit();
+      GetData(type, id);
+      this.type = type;
+      this.id = id;
+      mode = Mode.Submit;
+      dataStream = new MemoryStream();
+    }
+
+    /// <summary>
+    /// Sets the next chunk of bytes.
+    /// </summary>
+    /// <param name="data">The data.</param>
+    public void SetNextChunk(byte[] data) {
+      dataStream.Write(data, 0, data.Length);
+    }
+
+    /// <summary>
+    /// Commits the transaction in case of an upload and closes
+    /// the connection.
+    /// </summary>
+    public void TransferDone() {
+      if (mode == Mode.Submit)
+        SetData(type, id, dataStream.ToArray());
+      Dispose();
+    }
+
+    /// <summary>
+    /// Aborts the transfer.
+    /// </summary>
+    public void AbortTransfer() {
+      Dispose();
+    }
+    #endregion
+
+    #region IDisposable Members
+    /// <summary>
+    /// Performs application-defined tasks associated with freeing, releasing, or resetting unmanaged resources.
+    /// </summary>
+    public void Dispose() {
+      mode = Mode.None;
+      if (dataStream != null)
+        dataStream.Dispose();
+    }
+    #endregion
+  }
+}
Index: /branches/OKB/HeuristicLab.Services.OKB/3.3/ExperimentKit.cs
===================================================================
--- /branches/OKB/HeuristicLab.Services.OKB/3.3/ExperimentKit.cs	(revision 4480)
+++ /branches/OKB/HeuristicLab.Services.OKB/3.3/ExperimentKit.cs	(revision 4480)
@@ -0,0 +1,49 @@
+﻿#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;
+using HeuristicLab.Services.OKB.DataAccess;
+
+namespace HeuristicLab.Services.OKB {
+  /// <summary>
+  /// Contains an <see cref="Algorithm"/> and a <see cref="Problem"/> populated with all
+  /// required data to execute experiments.
+  /// </summary>
+  [DataContract]
+  public class ExperimentKit {
+    /// <summary>
+    /// Gets an <see cref="Algorithm"/> populated with all required data to execute
+    /// experiments.
+    /// </summary>
+    /// <value>An <see cref="Algorithm"/>.</value>
+    [DataMember]
+    public Algorithm Algorithm { get; set; }
+
+    /// <summary>
+    /// Gets a <see cref="Problem"/> populated with all required data to execute
+    /// experiments.
+    /// </summary>
+    /// <value>A <see cref="Problem"/>.</value>
+    [DataMember]
+    public Problem Problem { get; set; }
+  }
+
+}
Index: /branches/OKB/HeuristicLab.Services.OKB/3.3/HeuristicLab.Services.OKB-3.3.csproj
===================================================================
--- /branches/OKB/HeuristicLab.Services.OKB/3.3/HeuristicLab.Services.OKB-3.3.csproj	(revision 4480)
+++ /branches/OKB/HeuristicLab.Services.OKB/3.3/HeuristicLab.Services.OKB-3.3.csproj	(revision 4480)
@@ -0,0 +1,171 @@
+﻿<?xml version="1.0" encoding="utf-8"?>
+<Project ToolsVersion="4.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+  <PropertyGroup>
+    <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
+    <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
+    <ProductVersion>8.0.50727</ProductVersion>
+    <SchemaVersion>2.0</SchemaVersion>
+    <ProjectGuid>{766DA4B7-2A0E-4CDE-8F90-93D8B1AD62CF}</ProjectGuid>
+    <OutputType>Library</OutputType>
+    <AppDesignerFolder>Properties</AppDesignerFolder>
+    <RootNamespace>HeuristicLab.Services.OKB</RootNamespace>
+    <AssemblyName>HeuristicLab.Services.OKB-3.3</AssemblyName>
+    <ProjectTypeGuids>{3D9AD99F-2412-4246-B90B-4EAA41C64699};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}</ProjectTypeGuids>
+    <StartArguments>/client:"WcfTestClient.exe"</StartArguments>
+    <TargetFrameworkVersion>v4.0</TargetFrameworkVersion>
+    <TargetFrameworkProfile>
+    </TargetFrameworkProfile>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
+    <DebugSymbols>true</DebugSymbols>
+    <DebugType>full</DebugType>
+    <Optimize>false</Optimize>
+    <OutputPath>bin\Debug\</OutputPath>
+    <DefineConstants>DEBUG;TRACE</DefineConstants>
+    <ErrorReport>prompt</ErrorReport>
+    <WarningLevel>4</WarningLevel>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
+    <DebugType>pdbonly</DebugType>
+    <Optimize>true</Optimize>
+    <OutputPath>bin\Release\</OutputPath>
+    <DefineConstants>TRACE</DefineConstants>
+    <ErrorReport>prompt</ErrorReport>
+    <WarningLevel>4</WarningLevel>
+  </PropertyGroup>
+  <PropertyGroup>
+    <SignAssembly>true</SignAssembly>
+  </PropertyGroup>
+  <PropertyGroup>
+    <AssemblyOriginatorKeyFile>HeuristicLab.snk</AssemblyOriginatorKeyFile>
+  </PropertyGroup>
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Debug|x64'">
+    <DebugSymbols>true</DebugSymbols>
+    <OutputPath>bin\x64\Debug\</OutputPath>
+    <DefineConstants>DEBUG;TRACE</DefineConstants>
+    <DebugType>full</DebugType>
+    <PlatformTarget>x64</PlatformTarget>
+    <CodeAnalysisLogFile>bin\Debug\HeuristicLab.Services.OKB-3.3.dll.CodeAnalysisLog.xml</CodeAnalysisLogFile>
+    <CodeAnalysisUseTypeNameInSuppression>true</CodeAnalysisUseTypeNameInSuppression>
+    <CodeAnalysisModuleSuppressionsFile>GlobalSuppressions.cs</CodeAnalysisModuleSuppressionsFile>
+    <ErrorReport>prompt</ErrorReport>
+    <CodeAnalysisRuleSet>MinimumRecommendedRules.ruleset</CodeAnalysisRuleSet>
+    <CodeAnalysisRuleSetDirectories>;C:\Program Files\Microsoft Visual Studio 10.0\Team Tools\Static Analysis Tools\\Rule Sets</CodeAnalysisRuleSetDirectories>
+    <CodeAnalysisIgnoreBuiltInRuleSets>false</CodeAnalysisIgnoreBuiltInRuleSets>
+    <CodeAnalysisRuleDirectories>;C:\Program Files\Microsoft Visual Studio 10.0\Team Tools\Static Analysis Tools\FxCop\\Rules</CodeAnalysisRuleDirectories>
+    <CodeAnalysisIgnoreBuiltInRules>false</CodeAnalysisIgnoreBuiltInRules>
+  </PropertyGroup>
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Release|x64'">
+    <OutputPath>bin\x64\Release\</OutputPath>
+    <DefineConstants>TRACE</DefineConstants>
+    <Optimize>true</Optimize>
+    <DebugType>pdbonly</DebugType>
+    <PlatformTarget>x64</PlatformTarget>
+    <CodeAnalysisLogFile>bin\Release\HeuristicLab.Services.OKB-3.3.dll.CodeAnalysisLog.xml</CodeAnalysisLogFile>
+    <CodeAnalysisUseTypeNameInSuppression>true</CodeAnalysisUseTypeNameInSuppression>
+    <CodeAnalysisModuleSuppressionsFile>GlobalSuppressions.cs</CodeAnalysisModuleSuppressionsFile>
+    <ErrorReport>prompt</ErrorReport>
+    <CodeAnalysisRuleSet>MinimumRecommendedRules.ruleset</CodeAnalysisRuleSet>
+    <CodeAnalysisRuleSetDirectories>;C:\Program Files\Microsoft Visual Studio 10.0\Team Tools\Static Analysis Tools\\Rule Sets</CodeAnalysisRuleSetDirectories>
+    <CodeAnalysisIgnoreBuiltInRuleSets>false</CodeAnalysisIgnoreBuiltInRuleSets>
+    <CodeAnalysisRuleDirectories>;C:\Program Files\Microsoft Visual Studio 10.0\Team Tools\Static Analysis Tools\FxCop\\Rules</CodeAnalysisRuleDirectories>
+    <CodeAnalysisIgnoreBuiltInRules>false</CodeAnalysisIgnoreBuiltInRules>
+    <CodeAnalysisFailOnMissingRules>false</CodeAnalysisFailOnMissingRules>
+  </PropertyGroup>
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Debug|x86'">
+    <DebugSymbols>true</DebugSymbols>
+    <OutputPath>bin\x86\Debug\</OutputPath>
+    <DefineConstants>DEBUG;TRACE</DefineConstants>
+    <DebugType>full</DebugType>
+    <PlatformTarget>x86</PlatformTarget>
+    <CodeAnalysisLogFile>bin\Debug\HeuristicLab.Services.OKB-3.3.dll.CodeAnalysisLog.xml</CodeAnalysisLogFile>
+    <CodeAnalysisUseTypeNameInSuppression>true</CodeAnalysisUseTypeNameInSuppression>
+    <CodeAnalysisModuleSuppressionsFile>GlobalSuppressions.cs</CodeAnalysisModuleSuppressionsFile>
+    <ErrorReport>prompt</ErrorReport>
+    <CodeAnalysisRuleSet>MinimumRecommendedRules.ruleset</CodeAnalysisRuleSet>
+    <CodeAnalysisRuleSetDirectories>;C:\Program Files\Microsoft Visual Studio 10.0\Team Tools\Static Analysis Tools\\Rule Sets</CodeAnalysisRuleSetDirectories>
+    <CodeAnalysisIgnoreBuiltInRuleSets>false</CodeAnalysisIgnoreBuiltInRuleSets>
+    <CodeAnalysisRuleDirectories>;C:\Program Files\Microsoft Visual Studio 10.0\Team Tools\Static Analysis Tools\FxCop\\Rules</CodeAnalysisRuleDirectories>
+    <CodeAnalysisIgnoreBuiltInRules>false</CodeAnalysisIgnoreBuiltInRules>
+  </PropertyGroup>
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Release|x86'">
+    <OutputPath>bin\x86\Release\</OutputPath>
+    <DefineConstants>TRACE</DefineConstants>
+    <Optimize>true</Optimize>
+    <DebugType>pdbonly</DebugType>
+    <PlatformTarget>x86</PlatformTarget>
+    <CodeAnalysisLogFile>bin\Release\HeuristicLab.Services.OKB-3.3.dll.CodeAnalysisLog.xml</CodeAnalysisLogFile>
+    <CodeAnalysisUseTypeNameInSuppression>true</CodeAnalysisUseTypeNameInSuppression>
+    <CodeAnalysisModuleSuppressionsFile>GlobalSuppressions.cs</CodeAnalysisModuleSuppressionsFile>
+    <ErrorReport>prompt</ErrorReport>
+    <CodeAnalysisRuleSet>MinimumRecommendedRules.ruleset</CodeAnalysisRuleSet>
+    <CodeAnalysisRuleSetDirectories>;C:\Program Files\Microsoft Visual Studio 10.0\Team Tools\Static Analysis Tools\\Rule Sets</CodeAnalysisRuleSetDirectories>
+    <CodeAnalysisIgnoreBuiltInRuleSets>false</CodeAnalysisIgnoreBuiltInRuleSets>
+    <CodeAnalysisRuleDirectories>;C:\Program Files\Microsoft Visual Studio 10.0\Team Tools\Static Analysis Tools\FxCop\\Rules</CodeAnalysisRuleDirectories>
+    <CodeAnalysisIgnoreBuiltInRules>false</CodeAnalysisIgnoreBuiltInRules>
+  </PropertyGroup>
+  <ItemGroup>
+    <Reference Include="Microsoft.CSharp" />
+    <Reference Include="System" />
+    <Reference Include="System.Configuration" />
+    <Reference Include="System.Core" />
+    <Reference Include="System.Data" />
+    <Reference Include="System.Data.Linq" />
+    <Reference Include="System.Runtime.Serialization" />
+    <Reference Include="System.ServiceModel" />
+    <Reference Include="System.Web" />
+    <Reference Include="System.Web.ApplicationServices" />
+    <Reference Include="System.Xml" />
+    <Reference Include="System.Xml.Linq" />
+  </ItemGroup>
+  <ItemGroup>
+    <Compile Include="AdminService.cs" />
+    <Compile Include="Convert.cs" />
+    <Compile Include="AuthenticationService.cs" />
+    <Compile Include="Interfaces\IAuthenticationService.cs" />
+    <Compile Include="Interfaces\IAdminService.cs" />
+    <Compile Include="Properties\AssemblyInfo.cs" />
+  </ItemGroup>
+  <ItemGroup>
+    <None Include="app.config">
+      <SubType>Designer</SubType>
+    </None>
+    <None Include="HeuristicLab.snk" />
+    <None Include="Properties\AssemblyInfo.frame" />
+  </ItemGroup>
+  <ItemGroup>
+    <ProjectReference Include="..\..\HeuristicLab.Services.OKB.DataAccess\3.3\HeuristicLab.Services.OKB.DataAccess-3.3.csproj">
+      <Project>{E36BE58F-F3CE-40BB-9AB3-9F9E30AD5CCF}</Project>
+      <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>
+  <Import Project="$(MSBuildBinPath)\Microsoft.CSharp.targets" />
+  <ProjectExtensions>
+    <VisualStudio>
+      <FlavorProperties GUID="{3D9AD99F-2412-4246-B90B-4EAA41C64699}">
+        <WcfProjectProperties>
+          <AutoStart>True</AutoStart>
+        </WcfProjectProperties>
+      </FlavorProperties>
+    </VisualStudio>
+  </ProjectExtensions>
+  <PropertyGroup>
+    <PreBuildEvent>set Path=%25Path%25;$(ProjectDir);$(SolutionDir)
+set ProjectDir=$(ProjectDir)
+set SolutionDir=$(SolutionDir)
+set Outdir=$(Outdir)
+
+call PreBuildEvent.cmd</PreBuildEvent>
+  </PropertyGroup>
+  <!-- To modify your build process, add your task inside one of the targets below and uncomment it. 
+       Other similar extension points exist, see Microsoft.Common.targets.
+  <Target Name="BeforeBuild">
+  </Target>
+  <Target Name="AfterBuild">
+  </Target>
+  -->
+</Project>
Index: /branches/OKB/HeuristicLab.Services.OKB/3.3/Interfaces/IAdminService.cs
===================================================================
--- /branches/OKB/HeuristicLab.Services.OKB/3.3/Interfaces/IAdminService.cs	(revision 4480)
+++ /branches/OKB/HeuristicLab.Services.OKB/3.3/Interfaces/IAdminService.cs	(revision 4480)
@@ -0,0 +1,89 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2010 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.Collections.Generic;
+using System.Net.Security;
+using System.ServiceModel;
+using HeuristicLab.Services.OKB.DataTransfer;
+
+namespace HeuristicLab.Services.OKB {
+  /// <summary>
+  /// Interface of the OKB administration service.
+  /// </summary>
+  [ServiceContract(ProtectionLevel = ProtectionLevel.EncryptAndSign)]
+  public interface IAdminService {
+    #region Platform Methods
+    [OperationContract]
+    Platform GetPlatform(long id);
+    [OperationContract]
+    IEnumerable<Platform> GetPlatforms();
+    [OperationContract]
+    void StorePlatform(Platform dto);
+    [OperationContract]
+    void DeletePlatform(long id);
+    #endregion
+
+    #region AlgorithmClass Methods
+    [OperationContract]
+    AlgorithmClass GetAlgorithmClass(long id);
+    [OperationContract]
+    IEnumerable<AlgorithmClass> GetAlgorithmClasses();
+    [OperationContract]
+    void StoreAlgorithmClass(AlgorithmClass dto);
+    [OperationContract]
+    void DeleteAlgorithmClass(long id);
+    #endregion
+
+    #region Algorithm Methods
+    [OperationContract]
+    Algorithm GetAlgorithm(long id);
+    [OperationContract]
+    IEnumerable<Algorithm> GetAlgorithms();
+    [OperationContract]
+    void StoreAlgorithm(Algorithm dto);
+    [OperationContract]
+    void DeleteAlgorithm(long id);
+    [OperationContract]
+    IEnumerable<Guid> GetAlgorithmUsers(long algorithmId);
+    [OperationContract]
+    void StoreAlgorithmUsers(long algorithmId, IEnumerable<Guid> users);
+    #endregion
+
+    #region AlgorithmData Methods
+    [OperationContract]
+    AlgorithmData GetAlgorithmData(long algorithmId);
+    [OperationContract]
+    void StoreAlgorithmData(AlgorithmData dto);
+    #endregion
+
+    #region DataType Methods
+    [OperationContract]
+    DataType GetDataType(long id);
+    [OperationContract]
+    IEnumerable<DataType> GetDataTypes();
+    [OperationContract]
+    void StoreDataType(DataType dto);
+    [OperationContract]
+    void DeleteDataType(long id);
+    #endregion
+  }
+}
Index: /branches/OKB/HeuristicLab.Services.OKB/3.3/Interfaces/IAuthenticationService.cs
===================================================================
--- /branches/OKB/HeuristicLab.Services.OKB/3.3/Interfaces/IAuthenticationService.cs	(revision 4480)
+++ /branches/OKB/HeuristicLab.Services.OKB/3.3/Interfaces/IAuthenticationService.cs	(revision 4480)
@@ -0,0 +1,39 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2010 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.Collections.Generic;
+using System.Net.Security;
+using System.ServiceModel;
+using HeuristicLab.Services.OKB.DataTransfer;
+
+namespace HeuristicLab.Services.OKB {
+  /// <summary>
+  /// Interface of the OKB authentication service.
+  /// </summary>
+  [ServiceContract(ProtectionLevel = ProtectionLevel.EncryptAndSign)]
+  public interface IAuthenticationService {
+    [OperationContract]
+    User GetUser(Guid id);
+    [OperationContract]
+    IEnumerable<User> GetUsers();
+  }
+}
Index: /branches/OKB/HeuristicLab.Services.OKB/3.3/Interfaces/IDataService.cs
===================================================================
--- /branches/OKB/HeuristicLab.Services.OKB/3.3/Interfaces/IDataService.cs	(revision 4480)
+++ /branches/OKB/HeuristicLab.Services.OKB/3.3/Interfaces/IDataService.cs	(revision 4480)
@@ -0,0 +1,94 @@
+﻿#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.Net.Security;
+using System.ServiceModel;
+
+namespace HeuristicLab.Services.OKB {
+  /// <summary>
+  /// Choose between <see cref="Algorithm"/> or <see cref="Problem"/>.
+  /// </summary>
+  public enum EntityType {
+    /// <summary>
+    /// Use <see cref="Algorithm"/> as entity type.
+    /// </summary>
+    Algorithm,
+    /// <summary>
+    /// Use <see cref="Problem"/> as entity type.
+    /// </summary>
+    Problem
+  };
+
+  /// <summary>
+  /// Download and upload serialized implementations of <see cref="Algorithm"/>s and <see cref="Problem"/>s.
+  /// The transfer has to be initiate through either <see cref="IDataService.Request"/> or <see cref="IDataService.Submit"/>
+  /// followed by either <see cref="IDataService.GetNextChunk"/> or <see cref="IDataService.SetNextChunk"/> and terminated
+  /// with either <see cref="IDataService.TransferDone"/> or <see cref="IDataService.AbortTransfer"/>.
+  /// </summary>
+  [ServiceContract(SessionMode = SessionMode.Required, ProtectionLevel = ProtectionLevel.EncryptAndSign)]
+  public interface IDataService {
+
+    /// <summary>
+    /// Request the specified <see cref="Algorithm"/> or <see cref="Problem"/>.
+    /// </summary>
+    /// <param name="type">The entity type.</param>
+    /// <param name="id">The entity id.</param>
+    /// <returns>The size of the data blob.</returns>
+    [OperationContract(IsInitiating = true, IsTerminating = false)]
+    int Request(EntityType type, int id);
+
+    /// <summary>
+    /// Prepare submission of the specified <see cref="Algorithm"/> or <see cref="Problem"/>.
+    /// </summary>
+    /// <param name="type">The entity type.</param>
+    /// <param name="id">The entity id.</param>
+    [OperationContract(IsInitiating = true, IsTerminating = false)]
+    void Submit(EntityType type, int id);
+
+    /// <summary>
+    /// Gets the next chunk of bytes.
+    /// </summary>
+    /// <param name="size">The maximum number of bytes to transfer.</param>
+    /// <returns>An array of bytes.</returns>
+    [OperationContract(IsInitiating = false, IsTerminating = false)]
+    byte[] GetNextChunk(int size);
+
+    /// <summary>
+    /// Sets the next chunk of bytes.
+    /// </summary>
+    /// <param name="data">The data.</param>
+    [OperationContract(IsInitiating = false, IsTerminating = false)]
+    void SetNextChunk(byte[] data);
+
+    /// <summary>
+    /// Commits the transaction in case of an upload and closes
+    /// the connection.
+    /// </summary>
+    [OperationContract(IsInitiating = false, IsTerminating = true)]
+    void TransferDone();
+
+    /// <summary>
+    /// Aborts the transfer.
+    /// </summary>
+    [OperationContract(IsInitiating = false, IsTerminating = true)]
+    void AbortTransfer();
+  }
+}
Index: /branches/OKB/HeuristicLab.Services.OKB/3.3/Interfaces/IQueryService.cs
===================================================================
--- /branches/OKB/HeuristicLab.Services.OKB/3.3/Interfaces/IQueryService.cs	(revision 4480)
+++ /branches/OKB/HeuristicLab.Services.OKB/3.3/Interfaces/IQueryService.cs	(revision 4480)
@@ -0,0 +1,71 @@
+﻿#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.Data;
+using System.Net.Security;
+using System.ServiceModel;
+
+namespace HeuristicLab.Services.OKB {
+  /// <summary>
+  /// Service interface for downloading selected information about <see cref="Experiment"/> <see cref="Run"/>s.
+  /// </summary>
+  [ServiceContract(SessionMode = SessionMode.Required, ProtectionLevel = ProtectionLevel.EncryptAndSign)]
+  public interface IQueryService {
+    /// <summary>
+    /// Gets a list of all possible attribute selectors.
+    /// </summary>
+    /// <returns>An array of <see cref="Server.AttributeSelector"/>s</returns>
+    [OperationContract(IsInitiating = true, IsTerminating = true)]
+    AttributeSelector[] GetAllAttributeSelectors();
+
+    /// <summary>
+    /// Prepares the a query using the specified selection criteria.
+    /// </summary>
+    /// <param name="selectors">The list of <see cref="Server.AttributeSelector"/>s.</param>
+    /// <returns>An empty <see cref="DataTable"/> containing only the column headers.</returns>
+    [OperationContract(IsInitiating = true, IsTerminating = false)]
+    DataTable PrepareQuery(AttributeSelector[] selectors);
+
+    /// <summary>
+    /// Gets the number of matching rows for the prepared query
+    /// (see <see cref="IQueryService.PrepareQuery"/>).
+    /// </summary>
+    /// <returns>The number of matching rows.</returns>
+    [OperationContract(IsInitiating = false, IsTerminating = false)]
+    int GetCount();
+
+    /// <summary>
+    /// Fetches the next <paramref name="nRows"/> rows for the 
+    /// prepared query (see <see cref="IQueryService.PrepareQuery"/>).
+    /// </summary>
+    /// <param name="nRows">The maximum number of rows to return.</param>
+    /// <returns>A <see cref="DataTable"/> containing only the next
+    /// <paramref name="nRows"/> rows.</returns>
+    [OperationContract(IsInitiating = false, IsTerminating = false)]
+    DataTable GetNextRows(int nRows);
+
+    /// <summary>
+    /// Terminates the session and closes the connection.
+    /// </summary>
+    [OperationContract(IsInitiating = false, IsTerminating = true)]
+    void Terminate();
+  }
+}
Index: /branches/OKB/HeuristicLab.Services.OKB/3.3/Interfaces/IRunnerService.cs
===================================================================
--- /branches/OKB/HeuristicLab.Services.OKB/3.3/Interfaces/IRunnerService.cs	(revision 4480)
+++ /branches/OKB/HeuristicLab.Services.OKB/3.3/Interfaces/IRunnerService.cs	(revision 4480)
@@ -0,0 +1,104 @@
+﻿#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.Net.Security;
+using System.ServiceModel;
+using HeuristicLab.Services.OKB.DataAccess;
+
+namespace HeuristicLab.Services.OKB {
+
+  /// <summary>
+  /// Service interface for submitting new <see cref="Experiment"/> <see cref="Run"/>s.
+  /// </summary>
+  [ServiceContract(SessionMode = SessionMode.Required, ProtectionLevel = ProtectionLevel.EncryptAndSign)]
+  public interface IRunnerService {
+    /// <summary>
+    /// Logs the current user in. In case the user or client
+    /// does not exist yet, they are created on the server. This
+    /// method is currently not used for authentication but merely
+    /// for auditing.
+    /// </summary>
+    /// <param name="clientname">The clientname.</param>
+    /// <returns><c>true</c> if the login was successful; <c>false</c> otherwise.</returns>
+    [OperationContract(IsInitiating = true)]
+    bool Login(string clientname);
+
+    /// <summary>
+    /// Gets a <see cref="StarterKit"/>: A partially populated object
+    /// graph to enable selection of algorithm and problem for a certain
+    /// platofrm.
+    /// </summary>
+    /// <param name="platformName">Name of the platform.</param>
+    /// <returns>A <see cref="StarterKit"/>.</returns>
+    [OperationContract(IsInitiating = false)]
+    StarterKit GetStarterKit(string platformName);
+
+    /// <summary>
+    /// Get all necessary information to conduct an experiment. This retrieves the
+    /// <see cref="Algorithm"/>'s:
+    /// <list type="bullet">
+    /// <item><see cref="Parameter"/>s</item>
+    /// <item><see cref="Result"/>s</item>
+    /// <item>and their respective <see cref="DataType"/>s</item>
+    /// </list>
+    /// as well as the <see cref="Problem"/>'s:
+    /// <list>
+    /// <item><see cref="SolutionRepresentation"/></item>
+    /// <item><see cref="Parameter"/>s</item>
+    /// </list>
+    /// </summary>
+    /// <param name="algorithm">The algorithm.</param>
+    /// <param name="problem">The problem.</param>
+    /// <returns>A more complete object graph contained in an
+    /// <see cref="ExperimentKit"/>.</returns>
+    [OperationContract(IsInitiating = false)]
+    ExperimentKit PrepareExperiment(Algorithm algorithm, Problem problem);
+
+    /// <summary>
+    /// Adds the a new <see cref="Experiment"/> <see cref="Run"/>.
+    /// 
+    /// The <see cref="Experiment"/> is created if necessary as well as
+    /// all <see cref="Parameter"/>s and <see cref="Result"/>s. If an
+    /// identical experiment has been conducted before the new run is
+    /// linked to this previous experiment instead.
+    /// </summary>
+    /// <param name="algorithm">The algorithm.</param>
+    /// <param name="problem">The problem.</param>
+    /// <param name="project">The project.</param>
+    [OperationContract(IsInitiating = false)]
+    void AddRun(Algorithm algorithm, Problem problem);
+
+    /// <summary>
+    /// Determines whether this instance is connected.
+    /// </summary>
+    /// <returns>
+    /// 	<c>true</c> if this instance is connected; otherwise, <c>false</c>.
+    /// </returns>
+    [OperationContract(IsInitiating = false)]
+    bool IsConnected();
+
+    /// <summary>
+    /// Logout out and closes the connection.
+    /// </summary>
+    [OperationContract(IsInitiating = false, IsTerminating = true, IsOneWay = true)]
+    void Logout();
+  }
+}
Index: /branches/OKB/HeuristicLab.Services.OKB/3.3/Interfaces/ITableService.cs
===================================================================
--- /branches/OKB/HeuristicLab.Services.OKB/3.3/Interfaces/ITableService.cs	(revision 4480)
+++ /branches/OKB/HeuristicLab.Services.OKB/3.3/Interfaces/ITableService.cs	(revision 4480)
@@ -0,0 +1,76 @@
+﻿#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.Data;
+using System.Net.Security;
+using System.ServiceModel;
+
+namespace HeuristicLab.Services.OKB {
+  /// <summary>
+  /// Service interface for downloading and uploading data tables.
+  /// </summary>
+  [ServiceContract(SessionMode = SessionMode.Required, ProtectionLevel = ProtectionLevel.EncryptAndSign)]
+  public interface ITableService {
+    /// <summary>
+    /// Prepares the data table to be downloaded.
+    /// </summary>
+    /// <param name="tableName">Name of the table.</param>
+    /// <param name="count">The number of rows.</param>
+    /// <returns>An empyt <see cref="DataType"/> that contains just
+    /// the column headers.</returns>
+    [OperationContract(IsInitiating = true)]
+    DataTable PrepareDataTable(string tableName, out int count);
+
+    /// <summary>
+    /// Gets the next few rows.
+    /// </summary>
+    /// <param name="count">The maximum number of rows to return.</param>
+    /// <returns>A partial <see cref="DataTable"/> with the
+    /// next few rows.</returns>
+    [OperationContract(IsInitiating = false, IsTerminating = false)]
+    DataTable GetNextRows(int count);
+
+    /// <summary>
+    /// Finishes fetching rows and closes the connection.
+    /// </summary>
+    [OperationContract(IsTerminating = true)]
+    void FinishFetchingRows();
+
+    /// <summary>
+    /// Updates the data table using the partial <see cref="DataTable"/>
+    /// with changed rows.
+    /// </summary>
+    /// <param name="changedRows">The <see cref="DataTable"/> with
+    /// changed rows.</param>
+    /// <param name="tableName">Name of the table.</param>
+    [OperationContract(IsInitiating = true, IsTerminating = true)]
+    void UpdateDataTable(DataTable changedRows, string tableName);
+
+    /// <summary>
+    /// Deletes the selected table rows using the value of the
+    /// "Id" column.
+    /// </summary>
+    /// <param name="ids">The ids.</param>
+    /// <param name="tableName">Name of the table.</param>
+    [OperationContract(IsInitiating = true, IsTerminating = true)]
+    void DeleteTableRows(int[] ids, string tableName);
+  }
+}
Index: /branches/OKB/HeuristicLab.Services.OKB/3.3/Properties/AssemblyInfo.frame
===================================================================
--- /branches/OKB/HeuristicLab.Services.OKB/3.3/Properties/AssemblyInfo.frame	(revision 4480)
+++ /branches/OKB/HeuristicLab.Services.OKB/3.3/Properties/AssemblyInfo.frame	(revision 4480)
@@ -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.Reflection;
+using System.Runtime.CompilerServices;
+using System.Runtime.InteropServices;
+
+// General Information about an assembly is controlled through the following
+// set of attributes. Change these attribute values to modify the information
+// associated with an assembly.
+[assembly: AssemblyTitle("HeuristicLab.Services.OKB")]
+[assembly: AssemblyDescription("HeuristicLab OKB services")]
+[assembly: AssemblyConfiguration("")]
+[assembly: AssemblyCompany("")]
+[assembly: AssemblyProduct("HeuristicLab")]
+[assembly: AssemblyCopyright("(c) 2002-2010 HEAL")]
+[assembly: AssemblyTrademark("")]
+[assembly: AssemblyCulture("")]
+
+// Setting ComVisible to false makes the types in this assembly not visible
+// to COM components.  If you need to access a type in this assembly from
+// COM, set the ComVisible attribute to true on that type.
+[assembly: ComVisible(false)]
+
+// The following GUID is for the ID of the typelib if this project is exposed to COM
+[assembly: Guid("029c79a0-8bf0-460d-9499-3b3b9c7f1a93")]
+
+// Version information for an assembly consists of the following four values:
+//
+//      Major Version
+//      Minor Version
+//      Build Number
+//      Revision
+//
+// You can specify all the values or you can default the Build and Revision Numbers
+// by using the '*' as shown below:
+// [assembly: AssemblyVersion("1.0.*")]
+[assembly: AssemblyVersion("3.3.0.0")]
+[assembly: AssemblyFileVersion("3.3.0.$WCREV$")]
Index: /branches/OKB/HeuristicLab.Services.OKB/3.3/QueryService.cs
===================================================================
--- /branches/OKB/HeuristicLab.Services.OKB/3.3/QueryService.cs	(revision 4480)
+++ /branches/OKB/HeuristicLab.Services.OKB/3.3/QueryService.cs	(revision 4480)
@@ -0,0 +1,119 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2010 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.Collections.Generic;
+using System.Data;
+using System.Linq;
+using System.ServiceModel;
+using HeuristicLab.Services.OKB.AttributeSelection;
+using HeuristicLab.Services.OKB.DataAccess;
+
+namespace HeuristicLab.Services.OKB {
+  /// <summary>
+  /// Implementation of the <see cref="IQueryService"/>.
+  /// </summary>
+  [ServiceBehavior(InstanceContextMode = InstanceContextMode.PerSession, IncludeExceptionDetailInFaults = true)]
+  public class QueryService : IQueryService, IDisposable {
+    /// <summary>
+    /// Performs application-defined tasks associated with freeing, releasing, or resetting unmanaged resources.
+    /// </summary>
+    public void Dispose() {
+      Terminate();
+    }
+
+    private DataSetBuilder dataSetBuilder;
+    private OKBDataContext okb;
+    private IEnumerator<DataRow> dataEnumerator;
+
+    /// <summary>
+    /// Gets a list of all possible attribute selectors.
+    /// </summary>
+    /// <returns>
+    /// An array of <see cref="Server.AttributeSelector"/>s
+    /// </returns>
+    public AttributeSelector[] GetAllAttributeSelectors() {
+      using (OKBDataContext okb = new OKBDataContext()) {
+        return RunAttributeSelector.GetAllAttributeSelectors(okb).Select(s => new AttributeSelector(s)).ToArray();
+      }
+    }
+
+    /// <summary>
+    /// Prepares the a query using the specified selection criteria.
+    /// </summary>
+    /// <param name="selectors">The list of <see cref="Server.AttributeSelector"/>s.</param>
+    /// <returns>
+    /// An empty <see cref="DataTable"/> containing only the column headers.
+    /// </returns>
+    public DataTable PrepareQuery(AttributeSelector[] selectors) {
+      using (OKBDataContext okb = new OKBDataContext()) {
+        if (selectors.Length == 0)
+          throw new FaultException("No columns selected");
+        IEnumerable<RunAttributeSelector> checkedSelectors =
+          selectors.Select(s => new RunAttributeSelector(new OKBDataContext(okb.Connection.ConnectionString), s)).ToList();
+        dataSetBuilder = new DataSetBuilder(okb, checkedSelectors);
+        dataEnumerator = dataSetBuilder.GetEnumerator();
+        return dataSetBuilder.Runs;
+      }
+    }
+
+    /// <summary>
+    /// Gets the number of matching rows for the prepared query
+    /// (see <see cref="IQueryService.PrepareQuery"/>).
+    /// </summary>
+    /// <returns>The number of matching rows.</returns>
+    public int GetCount() {
+      return dataSetBuilder.GetCount();
+    }
+
+    /// <summary>
+    /// Gets the next rows.
+    /// </summary>
+    /// <param name="maxNRows">The max N rows.</param>
+    /// <returns></returns>
+    public DataTable GetNextRows(int maxNRows) {
+      DataTable runs = dataSetBuilder.Runs.Clone();
+      for (int i = 0; i < maxNRows; i++) {
+        if (!dataEnumerator.MoveNext())
+          break;
+        DataRow row = runs.NewRow();
+        row.ItemArray = (object[])dataEnumerator.Current.ItemArray.Clone();
+        runs.Rows.Add(row);
+      }
+      return runs;
+    }
+
+    /// <summary>
+    /// Terminates the session and closes the connection.
+    /// </summary>
+    public void Terminate() {
+      dataSetBuilder = null;
+      if (dataEnumerator != null) {
+        dataEnumerator.Dispose();
+        dataEnumerator = null;
+      }
+      if (okb != null) {
+        okb.Dispose();
+        okb = null;
+      }
+    }
+  }
+}
Index: /branches/OKB/HeuristicLab.Services.OKB/3.3/RunnerService.cs
===================================================================
--- /branches/OKB/HeuristicLab.Services.OKB/3.3/RunnerService.cs	(revision 4480)
+++ /branches/OKB/HeuristicLab.Services.OKB/3.3/RunnerService.cs	(revision 4480)
@@ -0,0 +1,336 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2010 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.Collections.Generic;
+using System.Data.Linq;
+using System.Linq;
+using System.ServiceModel;
+using System.Web.Security;
+using HeuristicLab.Services.OKB.DataAccess;
+
+namespace HeuristicLab.Services.OKB {
+  /// <summary>
+  /// Implementation of the <see cref="IRunnerService"/>.
+  /// </summary>
+  [ServiceBehavior(InstanceContextMode = InstanceContextMode.PerSession)]
+  public class RunnerService : IRunnerService, IDisposable {
+    /// <summary>
+    /// Obtain a "starter kit" of information, containing:
+    /// <list>
+    /// <item>algorithm classes including algorithms</item>
+    /// <item>problem classes including problems</item>
+    /// <item>projects</item>
+    /// </list>
+    /// </summary>
+    public StarterKit GetStarterKit(string platformName) {
+      Platform platform;
+      using (OKBDataContext okb = new OKBDataContext()) {
+        try {
+          platform = okb.Platforms.Single(p => p.Name == platformName);
+        }
+        catch (InvalidOperationException) {
+          throw new FaultException(String.Format(
+            "Invalid platform name \"{0}\" available platforms are: \"{1}\"",
+            platformName,
+            string.Join("\", \"", okb.Platforms.Select(p => p.Name).ToArray())));
+        }
+      }
+      using (OKBDataContext okb = new OKBDataContext()) {
+        DataLoadOptions dlo = new DataLoadOptions();
+        dlo.LoadWith<AlgorithmClass>(ac => ac.Algorithms);
+        dlo.AssociateWith<AlgorithmClass>(ac => ac.Algorithms.Where(a => a.Platform == platform));
+        dlo.LoadWith<ProblemClass>(p => p.Problems);
+        dlo.AssociateWith<ProblemClass>(pc => pc.Problems.Where(p => p.Platform == platform));
+        okb.LoadOptions = dlo;
+        var StarterKit = new StarterKit() {
+          AlgorithmClasses = okb.AlgorithmClasses.ToList(),
+          ProblemClasses = okb.ProblemClasses.ToList()
+        };
+        return StarterKit;
+      }
+    }
+
+    /// <summary>
+    /// Augument the given algorithm and problem entities with information
+    /// to conduct an experiment. This will add algorithm parameters and results and
+    /// problem characteristic values and solution representation as well as data
+    /// necessary for deserialization.
+    /// </summary>
+    public ExperimentKit PrepareExperiment(Algorithm algorithm, Problem problem) {
+      OKBDataContext okb = new OKBDataContext();
+      try {
+        DataLoadOptions dlo = new DataLoadOptions();
+        dlo.LoadWith<Problem>(p => p.SolutionRepresentation);
+        dlo.LoadWith<AlgorithmParameter>(p => p.DataType);
+        dlo.LoadWith<ProblemParameter>(p => p.DataType);
+        dlo.LoadWith<Result>(r => r.DataType);
+        okb.LoadOptions = dlo;
+        algorithm = okb.Algorithms.Single(a => a.Id == algorithm.Id);
+        problem = okb.Problems.Single(p => p.Id == problem.Id);
+        algorithm.AlgorithmParameters.Load();
+        algorithm.Results.Load();
+        problem.ProblemCharacteristicIntValues.Load();
+        problem.ProblemCharacteristicFloatValues.Load();
+        problem.ProblemCharacteristicStringValues.Load();
+        problem.ProblemParameters.Load();
+        return new ExperimentKit() {
+          Algorithm = algorithm,
+          Problem = problem
+        };
+      }
+      catch (Exception x) {
+        throw new FaultException("Excaption caught: " + x.ToString());
+      }
+    }
+
+    /// <summary>
+    /// Adds the a new <see cref="Experiment"/>
+    /// 	<see cref="Run"/>.
+    /// The <see cref="Experiment"/> is created if necessary as well as
+    /// all <see cref="Parameter"/>s and <see cref="Result"/>s. If an
+    /// identical experiment has been conducted before the new run is
+    /// linked to this previous experiment instead.
+    /// </summary>
+    /// <param name="algorithm">The algorithm.</param>
+    /// <param name="problem">The problem.</param>
+    /// <param name="project">The project.</param>
+    public void AddRun(Algorithm algorithm, Problem problem) {
+      try {
+        using (OKBDataContext okb = new OKBDataContext()) {
+          Experiment experiment = GetOrCreateExperiment(algorithm, problem, currentUser, okb);
+          Run run = new Run() {
+            Experiment = experiment,
+            UserId = currentUser.Id,
+            ClientId = currentClient.Id,
+            FinishedDate = DateTime.Now,
+            ResultValues = algorithm.ResultValues
+          };
+          okb.Runs.InsertOnSubmit(run);
+          okb.SubmitChanges();
+        }
+      }
+      catch (Exception x) {
+        throw new FaultException("Could not add run: " + x.ToString());
+      }
+    }
+
+    private Experiment GetOrCreateExperiment(Algorithm algorithm, Problem problem, User user, OKBDataContext okb) {
+      MatchResults(algorithm.Results, okb);
+      EnsureParametersExist(algorithm.Parameters, okb);
+      var experimentQuery = CreateExperimentQuery(algorithm, problem, okb);
+      if (experimentQuery.Count() > 0) {
+        Experiment experiment = experimentQuery.First();
+        return experiment;
+      } else {
+        Experiment experiment = new Experiment() {
+          AlgorithmId = algorithm.Id,
+          ProblemId = problem.Id,
+          ParameterValues = algorithm.ParameterValues
+        };
+        okb.Experiments.InsertOnSubmit(experiment);
+        return experiment;
+      }
+    }
+
+    private void MatchResults(IQueryable<Result> results, OKBDataContext okb) {
+      foreach (var result in results.Where(r => r.Name != null)) {
+        result.Id = okb.Results.Single(r => r.Name == result.Name).Id;
+        var value = result.ResultValue;
+        if (value != null) {
+          result.ResultValue = (IResultValue)Activator.CreateInstance(value.GetType());
+          result.ResultValue.Result = result;
+          result.ResultValue.Value = value.Value;
+        }
+      }
+    }
+
+    private void EnsureParametersExist(IQueryable<Parameter> parameters, OKBDataContext okb) {
+      foreach (var param in parameters.Where(p => p.DataType != null && p.DataType.ClrName != null)) {
+        DataType dataType = GetOrCreateDataType(okb, param.DataType.ClrName);
+        param.DataType = new DataType() { Id = dataType.Id };
+      }
+      okb.SubmitChanges();
+      var namedParams = parameters.Where(p => p.Name != null);
+      var newParams = namedParams.Except(okb.Parameters, new NameComprarer());
+      foreach (var p in newParams) {
+        okb.Parameters.InsertOnSubmit(new Parameter() {
+          Name = p.Name,
+          DataTypeId = p.DataTypeId,
+        });
+      }
+      okb.SubmitChanges();
+      foreach (var np in namedParams) {
+        np.Id = okb.Parameters.Single(p => p.Name == np.Name).Id;
+        var value = np.ParameterValue;
+        if (value != null) {
+          OperatorParameterValue opVal = value as OperatorParameterValue;
+          np.ParameterValue = (IParameterValue)Activator.CreateInstance(value.GetType());
+          np.ParameterValue.Parameter = np;
+          np.ParameterValue.Value = value.Value;
+          if (opVal != null) {
+            OperatorParameterValue newVal = np.ParameterValue as OperatorParameterValue;
+            DataType dataType = GetOrCreateDataType(okb, opVal.DataType.ClrName);
+            newVal.DataType = new DataType() { Id = dataType.Id };
+          }
+        }
+      }
+    }
+
+    private DataType GetOrCreateDataType(OKBDataContext okb, string clrName) {
+      DataType dataType = okb.DataTypes.SingleOrDefault(dt => dt.ClrName == clrName);
+      if (dataType == null) {
+        dataType = new DataType() {
+          ClrName = clrName,
+          SqlName = "BLOB",
+        };
+        okb.DataTypes.InsertOnSubmit(dataType);
+        okb.SubmitChanges();
+      }
+      return dataType;
+    }
+
+    private IQueryable<Experiment> CreateExperimentQuery(Algorithm algorithm, Problem problem, OKBDataContext okb) {
+      var experimentQuery =
+        from x in okb.Experiments
+        where x.Algorithm == algorithm
+        where x.Problem == problem
+        select x;
+      foreach (IntParameterValue ipv in algorithm.IntParameterValues) {
+        experimentQuery = experimentQuery
+          .Where(x => x.IntParameterValues.Any(p =>
+            p.ParameterId == ipv.ParameterId && p.Value == ipv.Value));
+      }
+      foreach (FloatParameterValue fpv in algorithm.FloatParameterValues) {
+        experimentQuery = experimentQuery
+          .Where(x => x.FloatParameterValues.Any(p =>
+            p.ParameterId == fpv.ParameterId && p.Value == fpv.Value));
+      }
+      foreach (CharParameterValue cpv in algorithm.CharParameterValues) {
+        experimentQuery = experimentQuery
+          .Where(x => x.CharParameterValues.Any(p =>
+            p.ParameterId == cpv.ParameterId && p.Value == cpv.Value));
+      }
+      foreach (OperatorParameterValue opv in algorithm.OperatorParameterValues) {
+        experimentQuery = experimentQuery
+          .Where(x => x.OperatorParameterValues.Any(p =>
+            p.ParameterId == opv.ParameterId && p.DataTypeId == opv.DataTypeId));
+      }
+      return experimentQuery;
+    }
+
+    /// <summary>
+    /// Determines whether this instance is connected.
+    /// </summary>
+    /// <returns>
+    ///   <c>true</c> if this instance is connected; otherwise, <c>false</c>.
+    /// </returns>
+    public bool IsConnected() {
+      return currentUser != null;
+    }
+
+    User currentUser = null;
+    Client currentClient = null;
+
+    /// <summary>
+    /// Logs the specified username in. In case the user or client
+    /// does not exist yet, they are created on the server. This
+    /// method is currently not used for authentication but merely
+    /// for auditing.
+    /// </summary>
+    /// <param name="username">The username.</param>
+    /// <param name="clientname">The clientname.</param>
+    /// <returns>
+    ///   <c>true</c> if the login was successful; <c>false</c> otherwise.
+    /// </returns>
+    public bool Login(string clientname) {
+      MembershipUser user = Membership.GetUser();
+
+      if (user == null ||
+          string.IsNullOrEmpty(clientname) ||
+          ServiceSecurityContext.Current.IsAnonymous) {
+        return false;
+      }
+      using (OKBDataContext okb = new OKBDataContext()) {
+        currentUser = okb.Users.SingleOrDefault(u => u.Id == (Guid)user.ProviderUserKey);
+        currentClient = okb.Clients.SingleOrDefault(c => c.Name == clientname);
+        if (currentUser == null) {
+          currentUser = new User() { Name = user.UserName, Id = (Guid)user.ProviderUserKey };
+          okb.Users.InsertOnSubmit(currentUser);
+          okb.SubmitChanges();
+        }
+        if (currentClient == null) {
+          currentClient = new Client() { Name = clientname, Id = Guid.NewGuid() };
+          okb.Clients.InsertOnSubmit(currentClient);
+          okb.SubmitChanges();
+        }
+        return true;
+      }
+    }
+
+    /// <summary>
+    /// Logout out and closes the connection.
+    /// </summary>
+    public void Logout() {
+      currentUser = null;
+      currentClient = null;
+    }
+
+    /// <summary>
+    /// Performs application-defined tasks associated with freeing, releasing, or resetting unmanaged resources.
+    /// </summary>
+    public void Dispose() {
+      Logout();
+    }
+  }
+
+  /// <summary>
+  /// Compares two parameters by name.
+  /// </summary>
+  internal class NameComprarer : IEqualityComparer<Parameter> {
+
+    /// <summary>
+    /// Determines whether the specified objects are equal.
+    /// </summary>
+    /// <param name="x">The first object of type <paramref name="T"/> to compare.</param>
+    /// <param name="y">The second object of type <paramref name="T"/> to compare.</param>
+    /// <returns>
+    /// true if the specified objects are equal; otherwise, false.
+    /// </returns>
+    public bool Equals(Parameter x, Parameter y) {
+      return x.Name == y.Name;
+    }
+
+    /// <summary>
+    /// Returns a hash code for this instance.
+    /// </summary>
+    /// <param name="obj">The obj.</param>
+    /// <returns>
+    /// A hash code for this instance, suitable for use in hashing algorithms and data structures like a hash table. 
+    /// </returns>
+    /// <exception cref="T:System.ArgumentNullException">
+    /// The type of <paramref name="obj"/> is a reference type and <paramref name="obj"/> is null.
+    /// </exception>
+    public int GetHashCode(Parameter obj) {
+      return obj.Name.GetHashCode();
+    }
+  }
+}
Index: /branches/OKB/HeuristicLab.Services.OKB/3.3/StarterKit.cs
===================================================================
--- /branches/OKB/HeuristicLab.Services.OKB/3.3/StarterKit.cs	(revision 4480)
+++ /branches/OKB/HeuristicLab.Services.OKB/3.3/StarterKit.cs	(revision 4480)
@@ -0,0 +1,54 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2010 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System.Collections.Generic;
+using System.Runtime.Serialization;
+using HeuristicLab.Services.OKB.DataAccess;
+
+namespace HeuristicLab.Services.OKB {
+
+  /// <summary>
+  /// Initial portion of object graph to enable selection of <see cref="AlgorithmClass"/>,
+  /// <see cref="Algorithm"/>, <see cref="ProblemClass"/>, <see cref="Problem"/> and
+  /// <see cref="Project"/>.
+  /// </summary>
+  [DataContract]
+  public class StarterKit {
+    /// <summary>
+    /// Gets the list of algorithm classes. Every
+    /// <see cref="AlgorithmClass"/> also contains all its
+    /// <see cref="Algorithm"/>s.
+    /// </summary>
+    /// <value>The algorithm classes.</value>
+    [DataMember]
+    public IEnumerable<AlgorithmClass> AlgorithmClasses { get; set; }
+
+    /// <summary>
+    /// Gets the list of problem classes. Every
+    /// <see cref="ProblemClass"/> also contains all tis
+    /// <see cref="Problem"/>s.
+    /// </summary>
+    /// <value>The problem classes.</value>
+    [DataMember]
+    public IEnumerable<ProblemClass> ProblemClasses { get; set; }
+  }
+
+}
Index: /branches/OKB/HeuristicLab.Services.OKB/3.3/TableService.cs
===================================================================
--- /branches/OKB/HeuristicLab.Services.OKB/3.3/TableService.cs	(revision 4480)
+++ /branches/OKB/HeuristicLab.Services.OKB/3.3/TableService.cs	(revision 4480)
@@ -0,0 +1,201 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2010 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.Collections;
+using System.Collections.Generic;
+using System.Data;
+using System.Data.Linq;
+using System.Diagnostics;
+using System.Linq;
+using System.Reflection;
+using System.ServiceModel;
+using HeuristicLab.Services.OKB.AttributeSelection;
+using HeuristicLab.Services.OKB.DataAccess;
+
+namespace HeuristicLab.Services.OKB {
+
+  /// <summary>
+  /// Implementation of the <see cref="ITableService"/>.
+  /// </summary>
+  [ServiceBehavior(InstanceContextMode = InstanceContextMode.PerSession, IncludeExceptionDetailInFaults = true)]
+  public class TableService : ITableService, IDisposable {
+    private static List<Type> SupportedTypes = new List<Type>() {
+      typeof(int),
+      typeof(long),
+      typeof(double),
+      typeof(string),
+      typeof(Guid),
+      typeof(DateTime?)
+    };
+
+    private DataTable tableTemplate;
+    private IEnumerable<PropertyInfo> properties;
+    private IEnumerator rowEnumerator;
+
+    #region ITableService Members
+    /// <summary>
+    /// Updates the data table.
+    /// </summary>
+    /// <param name="updatedRows">The updated rows.</param>
+    /// <param name="tableName">Name of the table.</param>
+    public void UpdateDataTable(DataTable updatedRows, string tableName) {
+      Type tableType = Assembly.GetAssembly(typeof(Run)).GetType("HeuristicLab.Services.OKB.DataAccess." + tableName, true);
+      var properties = from p in tableType.GetProperties()
+                       where SupportedTypes.Contains(p.PropertyType)
+                       select p;
+      using (OKBDataContext okb = new OKBDataContext()) {
+        ITable table = okb.GetTable(tableType);
+        foreach (DataRow row in updatedRows.Rows) {
+          if (row["Id"] == DBNull.Value)
+            table.InsertOnSubmit(CreateEntity(tableType, properties, row));
+        }
+        var updated = updatedRows.Rows.Cast<DataRow>().Where(row => row["Id"] != DBNull.Value).OrderBy(row => row["Id"]);
+        var entities = DataSetBuilder.GetEntities(okb, tableType, updated.Select(u => (int)u["Id"]));
+        var updateEnum = updated.GetEnumerator();
+        var entityEnum = entities.GetEnumerator();
+        while (updateEnum.MoveNext() && entityEnum.MoveNext()) {
+          bool idChecked = false;
+          foreach (var property in properties) {
+            Console.WriteLine("{0}.{1} = '{2}' -> '{3}'",
+              tableName, property.Name,
+              property.GetGetMethod().Invoke(entityEnum.Current, new object[0]),
+              updateEnum.Current[property.Name]);
+            if (property.Name == "Id") {
+              int entityId = (int)property.GetGetMethod().Invoke(entityEnum.Current, new object[0]);
+              int updateId = (int)updateEnum.Current["Id"];
+              Debug.Assert(entityId == updateId);
+              idChecked = true;
+            }
+            object newValue = updateEnum.Current[property.Name];
+            if (newValue != DBNull.Value)
+              property.GetSetMethod().Invoke(entityEnum.Current, new object[] { newValue });
+          }
+          Debug.Assert(idChecked);
+        }
+        okb.SubmitChanges();
+      }
+    }
+
+    private object CreateEntity(Type tableType, IEnumerable<PropertyInfo> properties, DataRow row) {
+      object instance = Activator.CreateInstance(tableType);
+      bool empty = true;
+      foreach (var property in properties) {
+        if (row[property.Name] != DBNull.Value) {
+          property.GetSetMethod().Invoke(instance, new object[] { row[property.Name] });
+          Console.WriteLine("{0}.{1} = '{2}'", tableType.Name, property.Name, row[property.Name]);
+          empty = false;
+        }
+      }
+      if (empty)
+        throw new ArgumentException("cannot create completely empty entity");
+      return instance;
+    }
+
+    /// <summary>
+    /// Deletes the selected table rows using the value of the
+    /// "Id" column.
+    /// </summary>
+    /// <param name="ids">The ids.</param>
+    /// <param name="tableName">Name of the table.</param>
+    public void DeleteTableRows(int[] ids, string tableName) {
+      Type tableType = Assembly.GetAssembly(typeof(Run)).GetType("HeuristicLab.Services.OKB.DataAccess" + tableName, true);
+      using (OKBDataContext okb = new OKBDataContext()) {
+        ITable table = okb.GetTable(tableType);
+        table.DeleteAllOnSubmit(DataSetBuilder.GetEntities(okb, tableType, ids));
+        okb.SubmitChanges();
+      }
+    }
+
+    /// <summary>
+    /// Prepares the data table to be downloaded.
+    /// </summary>
+    /// <param name="tableName">Name of the table.</param>
+    /// <param name="count">The number of rows.</param>
+    /// <returns>
+    /// An empyt <see cref="DataType"/> that contains just
+    /// the column headers.
+    /// </returns>
+    public DataTable PrepareDataTable(string tableName, out int count) {
+      Type tableType = Assembly.GetAssembly(typeof(Run)).GetType("HeuristicLab.Services.OKB.DataAccess." + tableName, true);
+      properties = from p in tableType.GetProperties()
+                   where SupportedTypes.Contains(p.PropertyType)
+                   select p;
+      tableTemplate = new DataTable(tableName);
+      foreach (var property in properties) {
+        Type type = property.PropertyType;
+        if (type.IsGenericType && type.GetGenericTypeDefinition() == typeof(Nullable<>))
+          type = type.GetGenericArguments()[0];
+        DataColumn column = new DataColumn(property.Name, type);
+        if (type.Name == "Id") {
+          column.ReadOnly = true;
+        }
+        tableTemplate.Columns.Add(column);
+      }
+      using (OKBDataContext okb = new OKBDataContext()) {
+        ITable table = okb.GetTable(tableType);
+        rowEnumerator = table.GetEnumerator();
+        count = DataSetBuilder.CountEntities(new OKBDataContext(), tableType);
+        return tableTemplate;
+      }
+    }
+
+    /// <summary>
+    /// Gets the next few rows.
+    /// </summary>
+    /// <param name="count">The maximum number of rows to return.</param>
+    /// <returns>
+    /// A partial <see cref="DataTable"/> with the
+    /// next few rows.
+    /// </returns>
+    public DataTable GetNextRows(int count) {
+      DataTable dataTable = tableTemplate.Clone();
+      int i = 0;
+      while (i < count && rowEnumerator.MoveNext()) {
+        i++;
+        DataRow row = dataTable.NewRow();
+        foreach (var property in properties) {
+          row[property.Name] = property.GetGetMethod().Invoke(rowEnumerator.Current, new object[0]) ?? DBNull.Value;
+        }
+        dataTable.Rows.Add(row);
+      }
+      return dataTable;
+    }
+
+    /// <summary>
+    /// Finishes fetching rows and closes the connection.
+    /// </summary>
+    public void FinishFetchingRows() {
+      Dispose();
+    }
+    #endregion
+
+    #region IDisposable Members
+    /// <summary>
+    /// Performs application-defined tasks associated with freeing, releasing, or resetting unmanaged resources.
+    /// </summary>
+    public void Dispose() {
+      tableTemplate = null;
+      properties = null;
+    }
+    #endregion
+  }
+}
Index: /branches/OKB/HeuristicLab.Services.OKB/3.3/app.config
===================================================================
--- /branches/OKB/HeuristicLab.Services.OKB/3.3/app.config	(revision 4480)
+++ /branches/OKB/HeuristicLab.Services.OKB/3.3/app.config	(revision 4480)
@@ -0,0 +1,137 @@
+<?xml version="1.0"?>
+<configuration>
+  <connectionStrings>
+    <add name="HeuristicLab.Authentication"
+         connectionString="data source=.\SQLEXPRESS;Integrated Security=SSPI;Initial Catalog=HeuristicLab.Authentication" />
+    <add name="HeuristicLab.Services.OKB.DataAccess.Properties.Settings.OKBConnectionString"
+         connectionString="Data Source=.\SQLEXPRESS;Integrated Security=SSPI;Initial Catalog=HeuristicLab.OKB" />
+  </connectionStrings>
+
+  <system.web>
+    <membership>
+      <providers>
+        <clear />
+        <add name="AspNetSqlMembershipProvider" type="System.Web.Security.SqlMembershipProvider" connectionStringName="HeuristicLab.Authentication"
+             enablePasswordRetrieval="false" enablePasswordReset="true" requiresQuestionAndAnswer="false" requiresUniqueEmail="false"
+             maxInvalidPasswordAttempts="5" minRequiredPasswordLength="6" minRequiredNonalphanumericCharacters="0" passwordAttemptWindow="10"
+             applicationName="HeuristicLab.Authentication" />
+      </providers>
+    </membership>
+    <roleManager enabled="true">
+      <providers>
+        <clear />
+        <add name="AspNetSqlRoleProvider" type="System.Web.Security.SqlRoleProvider" connectionStringName="HeuristicLab.Authentication"
+             applicationName="HeuristicLab.Authentication" />
+      </providers>
+    </roleManager>
+  </system.web>
+
+  <system.serviceModel>
+    <bindings>
+      <mexHttpBinding>
+        <binding name="DefaultMexHttpBinding" />
+      </mexHttpBinding>
+      <wsHttpBinding>
+        <binding name="DefaultWsHttpBinding" maxReceivedMessageSize="200000000">
+          <readerQuotas maxArrayLength="200000000" maxBytesPerRead="200000000" />
+          <security mode="Message">
+            <message clientCredentialType="UserName" />
+          </security>
+        </binding>
+      </wsHttpBinding>
+      <netTcpBinding>
+        <binding name="DefaultNetTcpBinding" openTimeout="00:00:30" receiveTimeout="00:00:30" sendTimeout="00:00:30" maxBufferSize="2147483647" maxReceivedMessageSize="2147483647">
+          <security mode="Message">
+            <message clientCredentialType="UserName" />
+          </security>
+          <readerQuotas maxArrayLength="2147483647" />
+          <reliableSession inactivityTimeout="00:00:30" enabled="false" />
+        </binding>
+      </netTcpBinding>
+    </bindings>
+
+    <behaviors>
+      <serviceBehaviors>
+        <behavior name="DefaultServiceBehavior">
+          <serviceMetadata httpGetEnabled="true" />
+          <serviceDebug includeExceptionDetailInFaults="true" />
+          <serviceAuthorization principalPermissionMode="UseAspNetRoles" roleProviderName="AspNetSqlRoleProvider" />
+          <serviceCredentials>
+            <serviceCertificate findValue="localhost" x509FindType="FindBySubjectName" />
+            <userNameAuthentication userNamePasswordValidationMode="MembershipProvider" membershipProviderName="AspNetSqlMembershipProvider" />
+          </serviceCredentials>
+        </behavior>
+      </serviceBehaviors>
+    </behaviors>
+
+    <services>
+      <service name="HeuristicLab.Services.OKB.AdminService" behaviorConfiguration="DefaultServiceBehavior">
+        <endpoint address="mex" binding="mexHttpBinding" bindingConfiguration="DefaultMexHttpBinding" contract="IMetadataExchange" />
+        <endpoint binding="wsHttpBinding" bindingConfiguration="DefaultWsHttpBinding" contract="HeuristicLab.Services.OKB.IAdminService" />
+        <host>
+          <baseAddresses>
+            <add baseAddress="http://localhost:8732/Design_Time_Addresses/OKB-3.3/AdminService" />
+          </baseAddresses>
+        </host>
+      </service>
+
+      <service name="HeuristicLab.Services.OKB.AuthenticationService" behaviorConfiguration="DefaultServiceBehavior">
+        <endpoint address="mex" binding="mexHttpBinding" bindingConfiguration="DefaultMexHttpBinding" contract="IMetadataExchange" />
+        <endpoint binding="wsHttpBinding" bindingConfiguration="DefaultWsHttpBinding" contract="HeuristicLab.Services.OKB.IAuthenticationService" />
+        <host>
+          <baseAddresses>
+            <add baseAddress="http://localhost:8732/Design_Time_Addresses/OKB-3.3/AuthenticationService" />
+          </baseAddresses>
+        </host>
+      </service>
+
+      <service name="HeuristicLab.Services.OKB.TableService" behaviorConfiguration="DefaultServiceBehavior">
+        <endpoint address="mex" binding="mexHttpBinding" bindingConfiguration="DefaultMexHttpBinding" contract="IMetadataExchange" />
+        <endpoint binding="netTcpBinding" bindingConfiguration="DefaultNetTcpBinding" contract="HeuristicLab.Services.OKB.ITableService" />
+        <host>
+          <baseAddresses>
+            <add baseAddress="http://localhost:8732/Design_Time_Addresses/OKB-3.3/TableService" />
+            <add baseAddress="net.tcp://localhost:8733/OKB-3.3/TableService" />
+          </baseAddresses>
+        </host>
+      </service>
+
+      <service name="HeuristicLab.Services.OKB.DataService" behaviorConfiguration="DefaultServiceBehavior">
+        <endpoint address="mex" binding="mexHttpBinding" bindingConfiguration="DefaultMexHttpBinding" contract="IMetadataExchange" />
+        <endpoint binding="netTcpBinding" bindingConfiguration="DefaultNetTcpBinding" contract="HeuristicLab.Services.OKB.IDataService" />
+        <host>
+          <baseAddresses>
+            <add baseAddress="http://localhost:8732/Design_Time_Addresses/OKB-3.3/DataService" />
+            <add baseAddress="net.tcp://localhost:8733/OKB-3.3/DataService" />
+          </baseAddresses>
+        </host>
+      </service>
+
+      <service name="HeuristicLab.Services.OKB.RunnerService" behaviorConfiguration="DefaultServiceBehavior">
+        <endpoint address="mex" binding="mexHttpBinding" bindingConfiguration="DefaultMexHttpBinding" contract="IMetadataExchange" />
+        <endpoint binding="netTcpBinding" bindingConfiguration="DefaultNetTcpBinding" contract="HeuristicLab.Services.OKB.IRunnerService" />
+        <host>
+          <baseAddresses>
+            <add baseAddress="http://localhost:8732/Design_Time_Addresses/OKB-3.3/RunnerService" />
+            <add baseAddress="net.tcp://localhost:8733/OKB-3.3/RunnerService" />
+          </baseAddresses>
+        </host>
+      </service>
+
+      <service name="HeuristicLab.Services.OKB.QueryService" behaviorConfiguration="DefaultServiceBehavior">
+        <endpoint address="mex" binding="mexHttpBinding" bindingConfiguration="DefaultMexHttpBinding" contract="IMetadataExchange" />
+        <endpoint binding="netTcpBinding" bindingConfiguration="DefaultNetTcpBinding" contract="HeuristicLab.Services.OKB.IQueryService" />
+        <host>
+          <baseAddresses>
+            <add baseAddress="http://localhost:8732/Design_Time_Addresses/OKB-3.3/QueryService" />
+            <add baseAddress="net.tcp://localhost:8733/OKB-3.3/QueryService" />
+          </baseAddresses>
+        </host>
+      </service>
+    </services>
+  </system.serviceModel>
+
+  <startup>
+    <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.0" />
+  </startup>
+</configuration>
Index: /trunk/sources/HeuristicLab 3.3 Services.sln
===================================================================
--- /trunk/sources/HeuristicLab 3.3 Services.sln	(revision 4479)
+++ /trunk/sources/HeuristicLab 3.3 Services.sln	(revision 4480)
@@ -17,14 +17,4 @@
 EndProject
 Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "HeuristicLab.Services.Deployment-3.3.Tests", "HeuristicLab.Services.Deployment\3.3\Tests\HeuristicLab.Services.Deployment-3.3.Tests.csproj", "{421D9CCA-5A48-4813-AB9C-ED7025F9CC35}"
-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}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "HeuristicLab.Services.OKB.AttributeSelection-3.3", "HeuristicLab.Services.OKB.AttributeSelection\3.3\HeuristicLab.Services.OKB.AttributeSelection-3.3.csproj", "{E80A68DB-D6E1-4395-ABF0-AFE09E4DEF8B}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "HeuristicLab.Services.OKB-3.3", "HeuristicLab.Services.OKB\3.3\HeuristicLab.Services.OKB-3.3.csproj", "{766DA4B7-2A0E-4CDE-8F90-93D8B1AD62CF}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "HeuristicLab.Services.OKB.DataAccess-3.3.Tests", "HeuristicLab.Services.OKB.DataAccess\3.3\Tests\HeuristicLab.Services.OKB.DataAccess-3.3.Tests.csproj", "{89234006-FE1B-4A15-AFEC-91CB3526F0A5}"
-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
 Global
@@ -77,56 +67,4 @@
 		{421D9CCA-5A48-4813-AB9C-ED7025F9CC35}.Release|x86.ActiveCfg = Release|x86
 		{421D9CCA-5A48-4813-AB9C-ED7025F9CC35}.Release|x86.Build.0 = Release|x86
-		{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
-		{E36BE58F-F3CE-40BB-9AB3-9F9E30AD5CCF}.Debug|x64.ActiveCfg = Debug|x64
-		{E36BE58F-F3CE-40BB-9AB3-9F9E30AD5CCF}.Debug|x64.Build.0 = Debug|x64
-		{E36BE58F-F3CE-40BB-9AB3-9F9E30AD5CCF}.Debug|x86.ActiveCfg = Debug|x86
-		{E36BE58F-F3CE-40BB-9AB3-9F9E30AD5CCF}.Debug|x86.Build.0 = Debug|x86
-		{E36BE58F-F3CE-40BB-9AB3-9F9E30AD5CCF}.Release|Any CPU.ActiveCfg = Release|Any CPU
-		{E36BE58F-F3CE-40BB-9AB3-9F9E30AD5CCF}.Release|Any CPU.Build.0 = Release|Any CPU
-		{E36BE58F-F3CE-40BB-9AB3-9F9E30AD5CCF}.Release|x64.ActiveCfg = Release|x64
-		{E36BE58F-F3CE-40BB-9AB3-9F9E30AD5CCF}.Release|x64.Build.0 = Release|x64
-		{E36BE58F-F3CE-40BB-9AB3-9F9E30AD5CCF}.Release|x86.ActiveCfg = Release|x86
-		{E36BE58F-F3CE-40BB-9AB3-9F9E30AD5CCF}.Release|x86.Build.0 = Release|x86
-		{E80A68DB-D6E1-4395-ABF0-AFE09E4DEF8B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
-		{E80A68DB-D6E1-4395-ABF0-AFE09E4DEF8B}.Debug|Any CPU.Build.0 = Debug|Any CPU
-		{E80A68DB-D6E1-4395-ABF0-AFE09E4DEF8B}.Debug|x64.ActiveCfg = Debug|x64
-		{E80A68DB-D6E1-4395-ABF0-AFE09E4DEF8B}.Debug|x64.Build.0 = Debug|x64
-		{E80A68DB-D6E1-4395-ABF0-AFE09E4DEF8B}.Debug|x86.ActiveCfg = Debug|x86
-		{E80A68DB-D6E1-4395-ABF0-AFE09E4DEF8B}.Debug|x86.Build.0 = Debug|x86
-		{E80A68DB-D6E1-4395-ABF0-AFE09E4DEF8B}.Release|Any CPU.ActiveCfg = Release|Any CPU
-		{E80A68DB-D6E1-4395-ABF0-AFE09E4DEF8B}.Release|Any CPU.Build.0 = Release|Any CPU
-		{E80A68DB-D6E1-4395-ABF0-AFE09E4DEF8B}.Release|x64.ActiveCfg = Release|x64
-		{E80A68DB-D6E1-4395-ABF0-AFE09E4DEF8B}.Release|x64.Build.0 = Release|x64
-		{E80A68DB-D6E1-4395-ABF0-AFE09E4DEF8B}.Release|x86.ActiveCfg = Release|x86
-		{E80A68DB-D6E1-4395-ABF0-AFE09E4DEF8B}.Release|x86.Build.0 = Release|x86
-		{766DA4B7-2A0E-4CDE-8F90-93D8B1AD62CF}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
-		{766DA4B7-2A0E-4CDE-8F90-93D8B1AD62CF}.Debug|Any CPU.Build.0 = Debug|Any CPU
-		{766DA4B7-2A0E-4CDE-8F90-93D8B1AD62CF}.Debug|x64.ActiveCfg = Debug|x64
-		{766DA4B7-2A0E-4CDE-8F90-93D8B1AD62CF}.Debug|x64.Build.0 = Debug|x64
-		{766DA4B7-2A0E-4CDE-8F90-93D8B1AD62CF}.Debug|x86.ActiveCfg = Debug|x86
-		{766DA4B7-2A0E-4CDE-8F90-93D8B1AD62CF}.Debug|x86.Build.0 = Debug|x86
-		{766DA4B7-2A0E-4CDE-8F90-93D8B1AD62CF}.Release|Any CPU.ActiveCfg = Release|Any CPU
-		{766DA4B7-2A0E-4CDE-8F90-93D8B1AD62CF}.Release|Any CPU.Build.0 = Release|Any CPU
-		{766DA4B7-2A0E-4CDE-8F90-93D8B1AD62CF}.Release|x64.ActiveCfg = Release|x64
-		{766DA4B7-2A0E-4CDE-8F90-93D8B1AD62CF}.Release|x64.Build.0 = Release|x64
-		{766DA4B7-2A0E-4CDE-8F90-93D8B1AD62CF}.Release|x86.ActiveCfg = Release|x86
-		{766DA4B7-2A0E-4CDE-8F90-93D8B1AD62CF}.Release|x86.Build.0 = Release|x86
-		{89234006-FE1B-4A15-AFEC-91CB3526F0A5}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
-		{89234006-FE1B-4A15-AFEC-91CB3526F0A5}.Debug|Any CPU.Build.0 = Debug|Any CPU
-		{89234006-FE1B-4A15-AFEC-91CB3526F0A5}.Debug|x64.ActiveCfg = Debug|Any CPU
-		{89234006-FE1B-4A15-AFEC-91CB3526F0A5}.Debug|x86.ActiveCfg = Debug|Any CPU
-		{89234006-FE1B-4A15-AFEC-91CB3526F0A5}.Release|Any CPU.ActiveCfg = Release|Any CPU
-		{89234006-FE1B-4A15-AFEC-91CB3526F0A5}.Release|Any CPU.Build.0 = Release|Any CPU
-		{89234006-FE1B-4A15-AFEC-91CB3526F0A5}.Release|x64.ActiveCfg = Release|Any CPU
-		{89234006-FE1B-4A15-AFEC-91CB3526F0A5}.Release|x86.ActiveCfg = Release|Any CPU
-		{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
 	EndGlobalSection
 	GlobalSection(SolutionProperties) = preSolution
