diff --git a/examples/test_workflow.json b/examples/test_workflow.json
new file mode 100644
index 0000000000000000000000000000000000000000..49c04bc38cb56197984c04d7135c53396e7bf42b
--- /dev/null
+++ b/examples/test_workflow.json
@@ -0,0 +1,6 @@
+{
+    "multi_criteria_optimization": {
+        "type": "simple"
+    }
+}
+
diff --git a/force_bdss/application.py b/force_bdss/application.py
deleted file mode 100644
index d0fef517e0b521c07420500cb6a4d245b374316c..0000000000000000000000000000000000000000
--- a/force_bdss/application.py
+++ /dev/null
@@ -1,25 +0,0 @@
-# Enthought library imports.
-from envisage.api import Application
-
-
-# Application entry point.
-from force_bdss.multi_criteria_optimizers_plugin import \
-    MultiCriteriaOptimizersPlugin
-from force_bdss.workflow_plugin import WorkflowPlugin
-from force_bdss.key_performance_calculators_plugin import \
-    KeyPerformanceCalculatorsPlugin
-
-
-def run():
-
-    application = Application(
-        id='force',
-        plugins=[
-            WorkflowPlugin(),
-            MultiCriteriaOptimizersPlugin(),
-            KeyPerformanceCalculatorsPlugin(),
-        ]
-    )
-
-    # Run it!
-    application.run()
diff --git a/force_bdss/basic_key_performance_calculator.py b/force_bdss/basic_key_performance_calculator.py
index 30d8a7650a5945e31b2577912d2e750713bd0f6e..63fd2e4f0ca6b9ba4287e342134463fcb6644e8f 100644
--- a/force_bdss/basic_key_performance_calculator.py
+++ b/force_bdss/basic_key_performance_calculator.py
@@ -5,5 +5,5 @@ from force_bdss.i_key_performance_calculator import IKeyPerformanceCalculator
 
 @provides(IKeyPerformanceCalculator)
 class BasicKeyPerformanceCalculator(HasStrictTraits):
-    def run(self):
-        print("Computing basic key performance indicator")
+    def run(self, workflow):
+        print("Computing basic key performance indicator, {}".format(workflow))
diff --git a/force_bdss/basic_multi_criteria_optimizer.py b/force_bdss/basic_multi_criteria_optimizer.py
index 740c6aa6ee6edfb8d28d9e33b36571f0464a1a44..6cac40d1e6584b56c9562e4703b656c12202bc39 100644
--- a/force_bdss/basic_multi_criteria_optimizer.py
+++ b/force_bdss/basic_multi_criteria_optimizer.py
@@ -5,5 +5,5 @@ from force_bdss.i_multi_criteria_optimizers import IMultiCriteriaOptimizer
 
 @provides(IMultiCriteriaOptimizer)
 class BasicMultiCriteriaOptimizer(HasStrictTraits):
-    def run(self):
-        print("Basic multicriteria optimizer in action")
+    def run(self, workflow):
+        print("Basic multicriteria optimizer in action, {}".format(workflow))
diff --git a/force_bdss/bdss_application.py b/force_bdss/bdss_application.py
new file mode 100644
index 0000000000000000000000000000000000000000..62fd89c1bb4264642ebf9d0f179de45570c80f1a
--- /dev/null
+++ b/force_bdss/bdss_application.py
@@ -0,0 +1,21 @@
+import json
+
+from envisage.api import Application
+from traits.api import Unicode
+from traits.trait_types import List, Bool, Instance
+
+from force_bdss.workspecs.workflow import Workflow
+
+
+class BDSSApplication(Application):
+    id = "force_bdss.bdss_application"
+
+    workflow_filepath = Unicode()
+
+    workflow = Instance(Workflow)
+
+    evaluate = Bool()
+
+    def _workflow_default(self):
+        with open(self.workflow_filepath) as f:
+            return Workflow.from_json(json.load(f))
diff --git a/force_bdss/cli/force_bdss.py b/force_bdss/cli/force_bdss.py
new file mode 100644
index 0000000000000000000000000000000000000000..20e1a6eacfc3d0d7508ca5d11f804e9aeab9d412
--- /dev/null
+++ b/force_bdss/cli/force_bdss.py
@@ -0,0 +1,31 @@
+import click
+from envisage.core_plugin import CorePlugin
+import logging
+
+from force_bdss.bdss_application import BDSSApplication
+from force_bdss.core_mco_driver import CoreMCODriver
+from force_bdss.multi_criteria_optimizers_plugin import \
+    MultiCriteriaOptimizersPlugin
+from force_bdss.key_performance_calculators_plugin import \
+    KeyPerformanceCalculatorsPlugin
+
+
+@click.command()
+@click.option("--evaluate", is_flag=True)
+@click.argument('workflow_filepath', type=click.Path(exists=True))
+def run(evaluate, workflow_filepath):
+
+    plugins = [
+        CorePlugin(),
+        CoreMCODriver(),
+        KeyPerformanceCalculatorsPlugin(),
+        MultiCriteriaOptimizersPlugin(),
+    ]
+
+    application = BDSSApplication(
+        plugins=plugins,
+        evaluate=evaluate,
+        workflow_filepath=workflow_filepath
+    )
+
+    application.run()
diff --git a/force_bdss/workflow_plugin.py b/force_bdss/core_mco_driver.py
similarity index 61%
rename from force_bdss/workflow_plugin.py
rename to force_bdss/core_mco_driver.py
index 75e898c1737bc49d6a5a50b516de53f380686565..8e82a17c5aff59079293f7798f71ad905938fdac 100644
--- a/force_bdss/workflow_plugin.py
+++ b/force_bdss/core_mco_driver.py
@@ -1,27 +1,26 @@
 from envisage.extension_point import ExtensionPoint
-from traits.api import List
 from envisage.plugin import Plugin
-from traits.api import on_trait_change
+from traits.has_traits import on_trait_change
+from traits.trait_types import List
 
 from force_bdss.i_key_performance_calculator import IKeyPerformanceCalculator
 from force_bdss.i_multi_criteria_optimizers import IMultiCriteriaOptimizer
 
 
-class WorkflowPlugin(Plugin):
-
-    id = "force_bdss.workflow_plugin"
+class CoreMCODriver(Plugin):
+    multi_criteria_optimizers = ExtensionPoint(
+        List(IMultiCriteriaOptimizer),
+        id='force_bdss.multi_criteria_optimizers')
 
     key_performance_calculators = ExtensionPoint(
         List(IKeyPerformanceCalculator),
         id='force_bdss.key_performance_calculators')
 
-    multi_criteria_optimizers = ExtensionPoint(
-        List(IMultiCriteriaOptimizer),
-        id='force_bdss.multi_criteria_optimizers')
-
     @on_trait_change("application:started")
     def application_started(self):
-        for mco in self.multi_criteria_optimizers:
-            mco.run()
-        for kpc in self.key_performance_calculators:
-            kpc.run()
+        if self.application.evaluate:
+            for kpi in self.key_performance_calculators:
+                kpi.run(self.application.workflow)
+        else:
+            for mco in self.multi_criteria_optimizers:
+                mco.run(self.application.workflow)
diff --git a/force_bdss/multi_criteria_optimizers_plugin.py b/force_bdss/multi_criteria_optimizers_plugin.py
index a815cd1f9f3f959b6aa33f482d30c5f9a9f97be5..07a39a032f944066f86943865a28bb54f218a342 100644
--- a/force_bdss/multi_criteria_optimizers_plugin.py
+++ b/force_bdss/multi_criteria_optimizers_plugin.py
@@ -7,7 +7,6 @@ from force_bdss.i_multi_criteria_optimizers import IMultiCriteriaOptimizer
 
 
 class MultiCriteriaOptimizersPlugin(Plugin):
-
     id = "force_bdss.multi_criteria_optimizers_plugin"
 
     multi_criteria_optimizers = List(
diff --git a/force_bdss/workspecs/multi_criteria_optimization.py b/force_bdss/workspecs/multi_criteria_optimization.py
new file mode 100644
index 0000000000000000000000000000000000000000..6d0a06afa17b6869986f25ea3450b0c67939aae4
--- /dev/null
+++ b/force_bdss/workspecs/multi_criteria_optimization.py
@@ -0,0 +1,13 @@
+from traits.api import HasStrictTraits, String
+
+
+class MultiCriteriaOptimization(HasStrictTraits):
+    type = String
+
+    @classmethod
+    def from_json(cls, json_data):
+        self = cls(
+            type=json_data["type"]
+        )
+
+        return self
diff --git a/force_bdss/workspecs/workflow.py b/force_bdss/workspecs/workflow.py
new file mode 100644
index 0000000000000000000000000000000000000000..6ff7cf74430a155d5a2d004e73e9b86d067051a6
--- /dev/null
+++ b/force_bdss/workspecs/workflow.py
@@ -0,0 +1,18 @@
+from traits.api import HasStrictTraits, Instance, String
+
+from .multi_criteria_optimization import MultiCriteriaOptimization
+
+
+class Workflow(HasStrictTraits):
+    name = String()
+    multi_criteria_optimization = Instance(MultiCriteriaOptimization)
+
+    @classmethod
+    def from_json(cls, json_data):
+        self = cls(
+            multi_criteria_optimization=MultiCriteriaOptimization.from_json(
+                    json_data["multi_criteria_optimization"]
+                )
+            )
+
+        return self
diff --git a/setup.py b/setup.py
index dcce0668a7ffaef86207222a820a185662067f19..49ad67ea7bea23a9d6aedb39f9dc5f5dacaedead 100644
--- a/setup.py
+++ b/setup.py
@@ -7,9 +7,10 @@ setup(
     version=VERSION,
     entry_points={
     'console_scripts': [
-        'force_bdss = force_bdss.application:run',
+        'force_bdss = force_bdss.cli.force_bdss:run',
     ]},
     install_requires=[
-        "envisage >= 4.6.0"
+        "envisage >= 4.6.0",
+        "click >= 6.7"
     ]
 )