diff --git a/src/main/java/eu/hbp/mip/controllers/DatasetsApi.java b/src/main/java/eu/hbp/mip/controllers/DatasetsApi.java
index 3c71e92602b3e6a8569883af3987c6065817f054..e14a623cf58f50f92f8e672375a8cc278c44c6fb 100644
--- a/src/main/java/eu/hbp/mip/controllers/DatasetsApi.java
+++ b/src/main/java/eu/hbp/mip/controllers/DatasetsApi.java
@@ -19,6 +19,8 @@ import org.springframework.web.bind.annotation.RestController;
 
 import static org.springframework.http.MediaType.APPLICATION_JSON_VALUE;
 
+// TODO: deprecate this
+
 @RestController
 @RequestMapping(value = "/datasets", produces = {APPLICATION_JSON_VALUE})
 @Api(value = "/datasets", description = "the datasets API")
diff --git a/src/main/java/eu/hbp/mip/controllers/MiningApi.java b/src/main/java/eu/hbp/mip/controllers/MiningApi.java
index 6245ed42a849c38b0c223439d52af64a38ab37eb..10619819da6908b7abef15c96b6140aee5234f6b 100644
--- a/src/main/java/eu/hbp/mip/controllers/MiningApi.java
+++ b/src/main/java/eu/hbp/mip/controllers/MiningApi.java
@@ -77,25 +77,26 @@ public class MiningApi extends WokenClientController {
                 LOGGER.error("Cannot receive algorithm result from exareme" + e.getMessage(), e);
                 return ResponseEntity.status(HttpStatus.SERVICE_UNAVAILABLE).build();
             }
+        } else {
+
+            return askWokenQuery(query.prepareQuery(user.getUsername()), 120,
+                    result -> {
+                        if (result.error().nonEmpty()) {
+                            LOGGER.error(result.error().get());
+                            return ResponseEntity.status(HttpStatus.BAD_REQUEST).body("{\"error\":\"" + result.error().get() + "\"}");
+                        } else {
+                            Mining mining = new Mining(
+                                    result.jobId(),
+                                    result.node(),
+                                    result.algorithm(),
+                                    result.shape(),
+                                    Date.from(result.timestamp().toInstant()),
+                                    result.data().get().compactPrint()
+                            );
+                            return ResponseEntity.ok(gson.toJson(mining.jsonify()));
+                        }
+                    });
         }
-
-        return askWokenQuery(query.prepareQuery(user.getUsername()), 120,
-                result -> {
-                    if (result.error().nonEmpty()) {
-                        LOGGER.error(result.error().get());
-                        return ResponseEntity.status(HttpStatus.BAD_REQUEST).body("{\"error\":\"" + result.error().get() + "\"}");
-                    } else {
-                        Mining mining = new Mining(
-                                result.jobId(),
-                                result.node(),
-                                result.algorithm(),
-                                result.shape(),
-                                Date.from(result.timestamp().toInstant()),
-                                result.data().get().compactPrint()
-                        );
-                        return ResponseEntity.ok(gson.toJson(mining.jsonify()));
-                    }
-                });
     }
 
     private static boolean isExaremeAlgo(eu.hbp.mip.model.MiningQuery query) {
diff --git a/src/main/java/eu/hbp/mip/model/Dataset.java b/src/main/java/eu/hbp/mip/model/Dataset.java
index 69fc5ed9902450a5bb03c84f7304311a1a21fdb7..d7d1e486a42ffebfadcdeead915652747ce52e74 100644
--- a/src/main/java/eu/hbp/mip/model/Dataset.java
+++ b/src/main/java/eu/hbp/mip/model/Dataset.java
@@ -13,6 +13,8 @@ import java.util.Date;
 import java.util.LinkedList;
 import java.util.List;
 
+// TODO: deprecate
+
 @Entity
 @Table(name = "`dataset`")
 @ApiModel
@@ -24,6 +26,7 @@ public class Dataset {
 
     private Date date = null;
 
+    // Aka covariables
     @ElementCollection
     @CollectionTable(name = "dataset_header", joinColumns = @JoinColumn(name = "dataset_code"))
     private List<String> header = new LinkedList<>();
@@ -36,6 +39,7 @@ public class Dataset {
     @CollectionTable(name = "dataset_variable", joinColumns = @JoinColumn(name = "dataset_code"))
     private List<String> variable = new LinkedList<>();
 
+    // TODO:
     @Transient
     @JsonProperty(access = JsonProperty.Access.READ_ONLY)
     private Object data = null;
diff --git a/src/main/java/eu/hbp/mip/model/Experiment.java b/src/main/java/eu/hbp/mip/model/Experiment.java
index c84c21b1a6983549e2a13c13b8edba5b4001bf67..fff0611d7f94321d5842c9fdd3ed9eb55a5a6349 100644
--- a/src/main/java/eu/hbp/mip/model/Experiment.java
+++ b/src/main/java/eu/hbp/mip/model/Experiment.java
@@ -119,11 +119,10 @@ public class Experiment {
         scala.collection.immutable.List<AlgorithmSpec> algorithmsSeq = JavaConversions.asScalaBuffer(algorithms).toList();
         scala.collection.immutable.List<ValidationSpec> validationsSeq = JavaConversions.asScalaBuffer(validations).toList();
 
-        // TODO - set values
         WokenConversions conv = new WokenConversions();
-        scala.collection.immutable.Set<DatasetId> trainingDatasets = conv.toDatasets("");
-        scala.collection.immutable.Set<DatasetId> testingDatasets = conv.toDatasets("");
-        scala.collection.immutable.Set<DatasetId> validationDatasets = conv.toDatasets("");
+        scala.collection.immutable.Set<DatasetId> trainingDatasets = conv.toDatasets(model.getQuery().getTrainingDatasets());
+        scala.collection.immutable.Set<DatasetId> testingDatasets = conv.toDatasets(model.getQuery().getTestingDatasets());
+        scala.collection.immutable.Set<DatasetId> validationDatasets = conv.toDatasets(model.getQuery().getValidationDatasets());
 
         String filtersJson = model.getQuery().getFilters();
         Option<FilterRule> filters = conv.toFilterRule(filtersJson);
diff --git a/src/main/java/eu/hbp/mip/model/MiningQuery.java b/src/main/java/eu/hbp/mip/model/MiningQuery.java
index 0b0c9a76fa4ab979267777bde4305974e05a3b70..49d8cadb2b743ebe532726ca208808d01d458b8d 100644
--- a/src/main/java/eu/hbp/mip/model/MiningQuery.java
+++ b/src/main/java/eu/hbp/mip/model/MiningQuery.java
@@ -29,6 +29,7 @@ public class MiningQuery {
         this.variables = new LinkedList<>();
         this.covariables = new LinkedList<>();
         this.grouping = new LinkedList<>();
+        this.datasets = new LinkedList<>();
         this.filters = "";
     }
 
@@ -99,9 +100,8 @@ public class MiningQuery {
                 TypesConvert.variablesToIdentifiers(getGrouping());
         UserId userId = new UserId(user);
 
-        // TODO - set values
         WokenConversions conv = new WokenConversions();
-        scala.collection.immutable.Set<DatasetId> datasets = conv.toDatasets("");
+        scala.collection.immutable.Set<DatasetId> datasets = conv.toDatasets(getDatasets());
         String filtersJson = getFilters();
         Option<FilterRule> filters = conv.toFilterRule(filtersJson);
 
diff --git a/src/main/java/eu/hbp/mip/model/Query.java b/src/main/java/eu/hbp/mip/model/Query.java
index fd12294288b8fa50149ecb603f4bd1acb3d8715d..5d372447da74b2194b4b6605795ee015c816112c 100644
--- a/src/main/java/eu/hbp/mip/model/Query.java
+++ b/src/main/java/eu/hbp/mip/model/Query.java
@@ -24,8 +24,6 @@ public class Query {
     @GeneratedValue(strategy = GenerationType.SEQUENCE)
     private Long id = null;
 
-    private String request = null;
-
     @ManyToMany
     @JoinTable(name = "query_variable", joinColumns = {
             @JoinColumn(name = "id", nullable = false, updatable = false) },
@@ -47,6 +45,27 @@ public class Query {
                     nullable = false, updatable = false) })
     private List<Variable> grouping = new LinkedList<>();
 
+    @ManyToMany
+    @JoinTable(name = "query_training_datasets", joinColumns = {
+            @JoinColumn(name = "id", nullable = false, updatable = false) },
+            inverseJoinColumns = { @JoinColumn(name = "code",
+                    nullable = false, updatable = false) })
+    private List<Variable> trainingDatasets = new LinkedList<>();
+
+    @ManyToMany
+    @JoinTable(name = "query_testing_datasets", joinColumns = {
+            @JoinColumn(name = "id", nullable = false, updatable = false) },
+            inverseJoinColumns = { @JoinColumn(name = "code",
+                    nullable = false, updatable = false) })
+    private List<Variable> testingDatasets = new LinkedList<>();
+
+    @ManyToMany
+    @JoinTable(name = "query_validation_datasets", joinColumns = {
+            @JoinColumn(name = "id", nullable = false, updatable = false) },
+            inverseJoinColumns = { @JoinColumn(name = "code",
+                    nullable = false, updatable = false) })
+    private List<Variable> validationDatasets = new LinkedList<>();
+
     @Column(columnDefinition = "text")
     private String filters = "";
 
@@ -67,6 +86,7 @@ public class Query {
     }
 
 
+    @JsonProperty("variables")
     public List<Variable> getVariables() {
         return variables;
     }
@@ -95,21 +115,39 @@ public class Query {
         this.grouping = grouping;
     }
 
+    @JsonProperty("trainingDatasets")
+    public List<Variable> getTrainingDatasets() {
+        return trainingDatasets;
+    }
 
-    public String getFilters() {
-        return filters;
+    public void setTrainingDatasets(List<Variable> trainingDatasets) {
+        this.trainingDatasets = trainingDatasets;
     }
 
-    public void setFilters(String filters) {
-        this.filters = filters;
+    @JsonProperty("testingDatasets")
+    public List<Variable> getTestingDatasets() {
+        return testingDatasets;
+    }
+
+    public void setTestingDatasets(List<Variable> testingDatasets) {
+        this.testingDatasets = testingDatasets;
     }
 
-    public String getRequest() {
-        return request;
+    @JsonProperty("validationDatasets")
+    public List<Variable> getValidationDatasets() {
+        return validationDatasets;
     }
 
-    public void setRequest(String request) {
-        this.request = request;
+    public void setValidationDatasets(List<Variable> validationDatasets) {
+        this.validationDatasets = validationDatasets;
+    }
+
+    public String getFilters() {
+        return filters;
+    }
+
+    public void setFilters(String filters) {
+        this.filters = filters;
     }
 
 }
diff --git a/src/main/scala/ch.chuv.lren/mip/portal/WokenConversions.scala b/src/main/scala/ch.chuv.lren/mip/portal/WokenConversions.scala
index 5960326ec8df4f3596aacdcc7cf60ef14e138726..abdaa5d66f52446e5bcadb6d7e8fd99c09ef896b 100644
--- a/src/main/scala/ch.chuv.lren/mip/portal/WokenConversions.scala
+++ b/src/main/scala/ch.chuv.lren/mip/portal/WokenConversions.scala
@@ -1,11 +1,14 @@
 package ch.chuv.lren.mip.portal
 
+import eu.hbp.mip.model.Variable
 import eu.hbp.mip.woken.messages.datasets.DatasetId
 import eu.hbp.mip.woken.messages.query.filters.FilterRule
 import eu.hbp.mip.woken.messages.query.filters.queryFiltersProtocol._
 import org.springframework.stereotype.Component
 import spray.json._
 
+import scala.collection.JavaConverters._
+
 @Component
 class WokenConversions {
 
@@ -14,9 +17,7 @@ class WokenConversions {
     case _ => Some(json).map(_.parseJson.convertTo[FilterRule])
   }
 
-  def toDatasets(commaSeparatedSets: String): Set[DatasetId] = commaSeparatedSets match {
-    case "" => Set()
-    case _  => commaSeparatedSets.split(",").map(DatasetId).toSet
-  }
+  def toDatasets(datasets: java.util.List[Variable]): Set[DatasetId] =
+    datasets.asScala.map(v => DatasetId(v.getCode)).toSet
 
 }