diff --git a/force_bdss/core_plugins/dummy_mco/dakota/dakota_communicator.py b/force_bdss/core_plugins/dummy_mco/dakota/dakota_communicator.py
index ee349e806571d776d49a0dfc533bd53224931322..1b816841c7a719d2e1c566cc3afacaa7a0d245b3 100644
--- a/force_bdss/core_plugins/dummy_mco/dakota/dakota_communicator.py
+++ b/force_bdss/core_plugins/dummy_mco/dakota/dakota_communicator.py
@@ -8,13 +8,20 @@ class DakotaCommunicator(BaseMCOCommunicator):
     def receive_from_mco(self):
         data = sys.stdin.read()
         values = list(map(float, data.split()))
-        value_types = self.model.value_types
-        if len(values) != len(value_types):
-            raise ValueError("Length of provided data differs from the number "
-                             "of expected types. {} {}".format(values,
-                                                               value_types))
+        parameters = self.model.parameters
+
+        if len(values) != len(parameters):
+            raise ValueError(
+                "The passed information length is {}, but the model "
+                "specifies {} values.".format(
+                    len(values), len(parameters)
+                    ))
+
+        value_types = [p.type for p in parameters]
+        value_names = [p.name for p in parameters]
 
         return DataSourceParameters(
+            value_names=value_names,
             value_types=value_types,
             values=numpy.array(values)
         )
diff --git a/force_bdss/core_plugins/dummy_mco/dakota/dakota_model.py b/force_bdss/core_plugins/dummy_mco/dakota/dakota_model.py
index b4c081a6b38bd5478f4287624411c5ce185cd01d..3c0d14a4dffbc438c267eb32121010b8fd1437f4 100644
--- a/force_bdss/core_plugins/dummy_mco/dakota/dakota_model.py
+++ b/force_bdss/core_plugins/dummy_mco/dakota/dakota_model.py
@@ -1,7 +1,5 @@
-from traits.api import List, String
-
 from force_bdss.api import BaseMCOModel
 
 
 class DakotaModel(BaseMCOModel):
-    value_types = List(String)
+    pass
diff --git a/force_bdss/core_plugins/dummy_mco/dakota/dakota_optimizer.py b/force_bdss/core_plugins/dummy_mco/dakota/dakota_optimizer.py
index 6b607cfce35432d286642465e36e90387f5a6c34..485a3d6531432c6fa89c34e47c6dc065903717d1 100644
--- a/force_bdss/core_plugins/dummy_mco/dakota/dakota_optimizer.py
+++ b/force_bdss/core_plugins/dummy_mco/dakota/dakota_optimizer.py
@@ -1,14 +1,34 @@
 import subprocess
-
 import sys
+import itertools
+import collections
 
 from force_bdss.api import BaseMultiCriteriaOptimizer
 
 
+def rotated_range(start, stop, starting_value):
+    r = list(range(start, stop))
+    start_idx = r.index(starting_value)
+    d = collections.deque(r)
+    d.rotate(-start_idx)
+    return list(d)
+
+
 class DakotaOptimizer(BaseMultiCriteriaOptimizer):
     def run(self):
-        print("Running dakota optimizer")
-        for initial_value in range(10):
+        parameters = self.model.parameters
+
+        values = []
+        for p in parameters:
+            values.append(
+                rotated_range(p.lower_bound,
+                              p.upper_bound,
+                              p.initial_value)
+            )
+
+        value_iterator = itertools.product(*values)
+
+        for value in value_iterator:
             ps = subprocess.Popen(
                 [sys.argv[0],
                  "--evaluate",
@@ -16,5 +36,7 @@ class DakotaOptimizer(BaseMultiCriteriaOptimizer):
                 stdout=subprocess.PIPE,
                 stdin=subprocess.PIPE)
 
-            out = ps.communicate("{}".format(initial_value).encode("utf-8"))
-            print("{}: {}".format(initial_value, out[0].decode("utf-8")))
+            out = ps.communicate(
+                " ".join([str(v) for v in value]).encode("utf-8"))
+            print("{}: {}".format(" ".join([str(v) for v in value]),
+                                  out[0].decode("utf-8")))
diff --git a/force_bdss/data_sources/data_source_parameters.py b/force_bdss/data_sources/data_source_parameters.py
index c45915dd1f056873e96e9e957753a90409c3d215..6e33d16c1ef6760b55a913903cc5b19444471862 100644
--- a/force_bdss/data_sources/data_source_parameters.py
+++ b/force_bdss/data_sources/data_source_parameters.py
@@ -2,5 +2,6 @@ from traits.api import HasStrictTraits, Array, List, String
 
 
 class DataSourceParameters(HasStrictTraits):
+    value_names = List(String)
     value_types = List(String)
     values = Array(shape=(None,))
diff --git a/force_bdss/mco/base_mco_model.py b/force_bdss/mco/base_mco_model.py
index e7466353e63a32edc862d744b643752f6c2f88cb..acdebfbb0ce74b0315c2056889153cad21278bd5 100644
--- a/force_bdss/mco/base_mco_model.py
+++ b/force_bdss/mco/base_mco_model.py
@@ -1,5 +1,6 @@
-from traits.api import ABCHasStrictTraits, Instance
+from traits.api import ABCHasStrictTraits, Instance, List
 
+from ..workspecs.mco_parameters import MCOParameter
 from .i_multi_criteria_optimizer_bundle import IMultiCriteriaOptimizerBundle
 
 
@@ -17,6 +18,8 @@ class BaseMCOModel(ABCHasStrictTraits):
                       visible=False,
                       transient=True)
 
+    parameters = List(MCOParameter)
+
     def __init__(self, bundle, *args, **kwargs):
         self.bundle = bundle
         super(BaseMCOModel, self).__init__(*args, **kwargs)
diff --git a/force_bdss/tests/fixtures/test_csv.json b/force_bdss/tests/fixtures/test_csv.json
index 1c15b0f07f2bdeee497b41ea655e31fb64b19dff..f061c1092201a1cb409595a1d002ea3a85d57166 100644
--- a/force_bdss/tests/fixtures/test_csv.json
+++ b/force_bdss/tests/fixtures/test_csv.json
@@ -4,7 +4,6 @@
     "multi_criteria_optimizer": {
       "id": "force.bdss.bundles.enthought.dakota",
       "model_data": {
-        "value_types": ["DUMMY"]
       }
     },
     "data_sources": [
diff --git a/force_bdss/workspecs/mco_parameters.py b/force_bdss/workspecs/mco_parameters.py
new file mode 100644
index 0000000000000000000000000000000000000000..5020117e19a8bc7d8d45d70fe2b60aa9ef77cdee
--- /dev/null
+++ b/force_bdss/workspecs/mco_parameters.py
@@ -0,0 +1,13 @@
+from traits.api import HasStrictTraits, String, Float
+
+
+class MCOParameter(HasStrictTraits):
+    pass
+
+
+class RangedMCOParameter(MCOParameter):
+    name = String()
+    value_type = String()
+    initial_value = Float()
+    upper_bound = Float()
+    lower_bound = Float()