Index: /trunk/sources/HeuristicLab.Services.OKB/3.3/Query/Convert.cs
===================================================================
--- /trunk/sources/HeuristicLab.Services.OKB/3.3/Query/Convert.cs	(revision 13510)
+++ /trunk/sources/HeuristicLab.Services.OKB/3.3/Query/Convert.cs	(revision 13511)
@@ -88,27 +88,4 @@
       return new DT.ValueName() { Id = source.Id, Category = source.Category, Name = source.Name };
     }
-
-    public static DT.Value ToDto(DA.CharacteristicValue source) {
-      if (source == null) return null;
-      if (source.Characteristic.Type == DA.CharacteristicType.Bool) {
-        return new DT.BoolValue { Name = source.Characteristic.Name, DataType = Convert.ToDto(source.DataType), Value = source.BoolValue.GetValueOrDefault() };
-      } else if (source.Characteristic.Type == DA.CharacteristicType.Int) {
-        return new DT.IntValue { Name = source.Characteristic.Name, DataType = Convert.ToDto(source.DataType), Value = source.IntValue.GetValueOrDefault() };
-      } else if (source.Characteristic.Type == DA.CharacteristicType.TimeSpan) {
-        return new DT.TimeSpanValue { Name = source.Characteristic.Name, DataType = Convert.ToDto(source.DataType), Value = source.LongValue.GetValueOrDefault() };
-      } else if (source.Characteristic.Type == DA.CharacteristicType.Long) {
-        return new DT.LongValue { Name = source.Characteristic.Name, DataType = Convert.ToDto(source.DataType), Value = source.LongValue.GetValueOrDefault() };
-      } else if (source.Characteristic.Type == DA.CharacteristicType.Float) {
-        return new DT.FloatValue { Name = source.Characteristic.Name, DataType = Convert.ToDto(source.DataType), Value = source.FloatValue.GetValueOrDefault() };
-      } else if (source.Characteristic.Type == DA.CharacteristicType.Double) {
-        return new DT.DoubleValue { Name = source.Characteristic.Name, DataType = Convert.ToDto(source.DataType), Value = source.DoubleValue.GetValueOrDefault() };
-      } else if (source.Characteristic.Type == DA.CharacteristicType.Percent) {
-        return new DT.PercentValue { Name = source.Characteristic.Name, DataType = Convert.ToDto(source.DataType), Value = source.DoubleValue.GetValueOrDefault() };
-      } else if (source.Characteristic.Type == DA.CharacteristicType.String) {
-        return new DT.StringValue { Name = source.Characteristic.Name, DataType = Convert.ToDto(source.DataType), Value = source.StringValue };
-      } else {
-        throw new ArgumentException("Unknown characteristic type.", "source");
-      }
-    }
   }
 }
Index: /trunk/sources/HeuristicLab.Services.OKB/3.3/Query/IQueryService.cs
===================================================================
--- /trunk/sources/HeuristicLab.Services.OKB/3.3/Query/IQueryService.cs	(revision 13510)
+++ /trunk/sources/HeuristicLab.Services.OKB/3.3/Query/IQueryService.cs	(revision 13511)
@@ -48,7 +48,4 @@
     [OperationContract]
     IEnumerable<ValueName> GetValueNames();
-
-    [OperationContract]
-    IEnumerable<Value> GetCharacteristics(long problemId);
   }
 }
Index: /trunk/sources/HeuristicLab.Services.OKB/3.3/Query/QueryService.cs
===================================================================
--- /trunk/sources/HeuristicLab.Services.OKB/3.3/Query/QueryService.cs	(revision 13510)
+++ /trunk/sources/HeuristicLab.Services.OKB/3.3/Query/QueryService.cs	(revision 13511)
@@ -278,13 +278,4 @@
     }
 
-
-    public IEnumerable<DataTransfer.Value> GetCharacteristics(long problemId) {
-      using (OKBDataContext okb = new OKBDataContext()) {
-        var prob = okb.Problems.SingleOrDefault(x => x.Id == problemId);
-        if (prob == null) return Enumerable.Empty<DataTransfer.Value>();
-        return prob.CharacteristicValues.Select(Convert.ToDto).ToArray();
-      }
-    }
-
     private List<DataAccess.Run> FilterRuns(IQueryable<DataAccess.Run> runs, Filter filter, OKBDataContext okb) {
       IFilter f = (IFilter)Activator.CreateInstance(Type.GetType(filter.FilterTypeName), filter);
Index: /trunk/sources/HeuristicLab.Services.OKB/3.3/RunCreation/Convert.cs
===================================================================
--- /trunk/sources/HeuristicLab.Services.OKB/3.3/RunCreation/Convert.cs	(revision 13510)
+++ /trunk/sources/HeuristicLab.Services.OKB/3.3/RunCreation/Convert.cs	(revision 13511)
@@ -70,10 +70,33 @@
     }
 
-    public static DA.CharacteristicValue ToEntity(DT.Value source, DA.OKBDataContext okb, DA.Problem problem, string characteristicName, DA.CharacteristicType type) {
-      if (okb == null || problem == null || string.IsNullOrEmpty(characteristicName) || source == null) throw new ArgumentNullException();
+    public static DT.Value ToDto(DA.CharacteristicValue source) {
+      if (source == null) return null;
+      if (source.Characteristic.Type == DA.CharacteristicType.Bool) {
+        return new DT.BoolValue { Name = source.Characteristic.Name, DataType = Convert.ToDto(source.DataType), Value = source.BoolValue.GetValueOrDefault() };
+      } else if (source.Characteristic.Type == DA.CharacteristicType.Int) {
+        return new DT.IntValue { Name = source.Characteristic.Name, DataType = Convert.ToDto(source.DataType), Value = source.IntValue.GetValueOrDefault() };
+      } else if (source.Characteristic.Type == DA.CharacteristicType.TimeSpan) {
+        return new DT.TimeSpanValue { Name = source.Characteristic.Name, DataType = Convert.ToDto(source.DataType), Value = source.LongValue.GetValueOrDefault() };
+      } else if (source.Characteristic.Type == DA.CharacteristicType.Long) {
+        return new DT.LongValue { Name = source.Characteristic.Name, DataType = Convert.ToDto(source.DataType), Value = source.LongValue.GetValueOrDefault() };
+      } else if (source.Characteristic.Type == DA.CharacteristicType.Float) {
+        return new DT.FloatValue { Name = source.Characteristic.Name, DataType = Convert.ToDto(source.DataType), Value = source.FloatValue.GetValueOrDefault() };
+      } else if (source.Characteristic.Type == DA.CharacteristicType.Double) {
+        return new DT.DoubleValue { Name = source.Characteristic.Name, DataType = Convert.ToDto(source.DataType), Value = source.DoubleValue.GetValueOrDefault() };
+      } else if (source.Characteristic.Type == DA.CharacteristicType.Percent) {
+        return new DT.PercentValue { Name = source.Characteristic.Name, DataType = Convert.ToDto(source.DataType), Value = source.DoubleValue.GetValueOrDefault() };
+      } else if (source.Characteristic.Type == DA.CharacteristicType.String) {
+        return new DT.StringValue { Name = source.Characteristic.Name, DataType = Convert.ToDto(source.DataType), Value = source.StringValue };
+      } else {
+        throw new ArgumentException("Unknown characteristic type.", "source");
+      }
+    }
+
+    public static DA.CharacteristicValue ToEntity(DT.Value source, DA.OKBDataContext okb, DA.Problem problem, DA.CharacteristicType type) {
+      if (okb == null || problem == null || source == null || string.IsNullOrEmpty(source.Name)) throw new ArgumentNullException();
       var entity = new DA.CharacteristicValue();
       entity.Problem = problem;
       entity.DataType = Convert.ToEntity(source.DataType, okb);
-      entity.Characteristic = Convert.ToEntity(characteristicName, type, okb);
+      entity.Characteristic = Convert.ToEntity(source.Name, type, okb);
       if (source is DT.BoolValue) {
         entity.BoolValue = ((DT.BoolValue)source).Value;
Index: /trunk/sources/HeuristicLab.Services.OKB/3.3/RunCreation/IRunCreationService.cs
===================================================================
--- /trunk/sources/HeuristicLab.Services.OKB/3.3/RunCreation/IRunCreationService.cs	(revision 13510)
+++ /trunk/sources/HeuristicLab.Services.OKB/3.3/RunCreation/IRunCreationService.cs	(revision 13511)
@@ -47,7 +47,15 @@
 
     [OperationContract]
+    IEnumerable<Value> GetCharacteristicValues(long problemId);
+
+    [OperationContract]
     [FaultContract(typeof(MissingProblem))]
     [FaultContract(typeof(UnknownCharacteristicType))]
-    void SetCharacteristicValue(long problemId, string characteristicName, Value value);
+    void SetCharacteristicValue(long problemId, Value value);
+
+    [OperationContract]
+    [FaultContract(typeof(MissingProblem))]
+    [FaultContract(typeof(UnknownCharacteristicType))]
+    void SetCharacteristicValues(long problemId, Value[] values);
   }
 }
Index: /trunk/sources/HeuristicLab.Services.OKB/3.3/RunCreation/RunCreationService.cs
===================================================================
--- /trunk/sources/HeuristicLab.Services.OKB/3.3/RunCreation/RunCreationService.cs	(revision 13510)
+++ /trunk/sources/HeuristicLab.Services.OKB/3.3/RunCreation/RunCreationService.cs	(revision 13511)
@@ -137,6 +137,13 @@
     }
 
-
-    public void SetCharacteristicValue(long problemId, string characteristicName, DataTransfer.Value value) {
+    public IEnumerable<DataTransfer.Value> GetCharacteristicValues(long problemId) {
+      using (OKBDataContext okb = new OKBDataContext()) {
+        var prob = okb.Problems.SingleOrDefault(x => x.Id == problemId);
+        if (prob == null) return Enumerable.Empty<DataTransfer.Value>();
+        return prob.CharacteristicValues.Select(Convert.ToDto).ToArray();
+      }
+    }
+
+    public void SetCharacteristicValue(long problemId, DataTransfer.Value value) {
       roleVerifier.AuthenticateForAnyRole(OKBRoles.OKBAdministrator, OKBRoles.OKBUser);
 
@@ -144,31 +151,51 @@
         var problem = okb.Problems.SingleOrDefault(x => x.Id == problemId);
         if (problem == null) throw new FaultException<MissingProblem>(new MissingProblem("Problem with id {0} cannot be found", problemId));
-        CharacteristicType characteristicType;
-        try {
-          characteristicType = GetCharacteristicType(value);
-        } catch (ArgumentException ex) {
-          throw new FaultException<UnknownCharacteristicType>(new UnknownCharacteristicType(ex.Message));
-        }
-
-        var entity = okb.CharacteristicValues.SingleOrDefault(x => x.Characteristic.Name == characteristicName && x.Characteristic.Type == characteristicType);
-        if (entity != null) {
-          // Update
-          switch (characteristicType) {
-            case CharacteristicType.Bool: entity.BoolValue = ((DataTransfer.BoolValue)value).Value; break;
-            case CharacteristicType.Int: entity.IntValue = ((DataTransfer.IntValue)value).Value; break;
-            case CharacteristicType.Long: entity.LongValue = ((DataTransfer.LongValue)value).Value; break;
-            case CharacteristicType.Float: entity.FloatValue = ((DataTransfer.FloatValue)value).Value; break;
-            case CharacteristicType.Double: entity.DoubleValue = ((DataTransfer.DoubleValue)value).Value; break;
-            case CharacteristicType.Percent: entity.DoubleValue = ((DataTransfer.PercentValue)value).Value; break;
-            case CharacteristicType.String: entity.StringValue = ((DataTransfer.StringValue)value).Value; break;
-            case CharacteristicType.TimeSpan: entity.LongValue = ((DataTransfer.TimeSpanValue)value).Value; break;
-          }
-        } else {
-          // Insert
-          entity = Convert.ToEntity(value, okb, problem, characteristicName, characteristicType);
-          okb.CharacteristicValues.InsertOnSubmit(entity);
-        }
+
+        DoSetCharacteristicValue(okb, problem, value);
         okb.SubmitChanges();
       }
+    }
+
+    public void SetCharacteristicValues(long problemId, DataTransfer.Value[] values) {
+      roleVerifier.AuthenticateForAnyRole(OKBRoles.OKBAdministrator, OKBRoles.OKBUser);
+
+      using (OKBDataContext okb = new OKBDataContext()) {
+        var problem = okb.Problems.SingleOrDefault(x => x.Id == problemId);
+        if (problem == null) throw new FaultException<MissingProblem>(new MissingProblem("Problem with id {0} cannot be found", problemId));
+
+        foreach (var v in values) {
+          DoSetCharacteristicValue(okb, problem, v);
+        }
+        okb.SubmitChanges();
+      }
+    }
+
+    private void DoSetCharacteristicValue(OKBDataContext okb, Problem problem, DataTransfer.Value value) {
+      CharacteristicType characteristicType;
+      try {
+        characteristicType = GetCharacteristicType(value);
+      } catch (ArgumentException ex) {
+        throw new FaultException<UnknownCharacteristicType>(new UnknownCharacteristicType(ex.Message));
+      }
+
+      var entity = okb.CharacteristicValues.SingleOrDefault(x => x.Characteristic.Name == value.Name && x.Characteristic.Type == characteristicType);
+      if (entity != null) {
+        // Update
+        switch (characteristicType) {
+          case CharacteristicType.Bool: entity.BoolValue = ((DataTransfer.BoolValue)value).Value; break;
+          case CharacteristicType.Int: entity.IntValue = ((DataTransfer.IntValue)value).Value; break;
+          case CharacteristicType.Long: entity.LongValue = ((DataTransfer.LongValue)value).Value; break;
+          case CharacteristicType.Float: entity.FloatValue = ((DataTransfer.FloatValue)value).Value; break;
+          case CharacteristicType.Double: entity.DoubleValue = ((DataTransfer.DoubleValue)value).Value; break;
+          case CharacteristicType.Percent: entity.DoubleValue = ((DataTransfer.PercentValue)value).Value; break;
+          case CharacteristicType.String: entity.StringValue = ((DataTransfer.StringValue)value).Value; break;
+          case CharacteristicType.TimeSpan: entity.LongValue = ((DataTransfer.TimeSpanValue)value).Value; break;
+        }
+      } else {
+        // Insert
+        entity = Convert.ToEntity(value, okb, problem, characteristicType);
+        okb.CharacteristicValues.InsertOnSubmit(entity);
+      }
+
     }
 
