diff --git a/doc/source/api/force_bdss.tests.rst b/doc/source/api/force_bdss.tests.rst
index 149a14bb7187eda808fdadcb8a5b8f59d5d73ed5..d1975c7c968cf1c9ef95987ee10c0df2ab01366c 100644
--- a/doc/source/api/force_bdss.tests.rst
+++ b/doc/source/api/force_bdss.tests.rst
@@ -27,10 +27,10 @@ force_bdss.tests.test_bundle_registry_plugin module
     :undoc-members:
     :show-inheritance:
 
-force_bdss.tests.test_id_generators module
-------------------------------------------
+force_bdss.tests.test_ids module
+--------------------------------
 
-.. automodule:: force_bdss.tests.test_id_generators
+.. automodule:: force_bdss.tests.test_ids
     :members:
     :undoc-members:
     :show-inheritance:
diff --git a/force_bdss/api.py b/force_bdss/api.py
index 418766a2a8d93d83a2e3ce724e1a4268803e6c2f..5c71f3d71284e4124ab530be23f6f5c17dcbb576 100644
--- a/force_bdss/api.py
+++ b/force_bdss/api.py
@@ -1,5 +1,5 @@
 from .base_extension_plugin import BaseExtensionPlugin  # noqa
-from .ids import bundle_id  # noqa
+from .ids import bundle_id, plugin_id  # noqa
 
 from .data_sources.base_data_source_model import BaseDataSourceModel  # noqa
 from .data_sources.data_source_result import DataSourceResult  # noqa
diff --git a/force_bdss/core_evaluation_driver.py b/force_bdss/core_evaluation_driver.py
index 61dac3e0e6bb28028fd973002dc6086d006c6ff6..d8a4fbba8d940a810f78f36904987ee718a03ba2 100644
--- a/force_bdss/core_evaluation_driver.py
+++ b/force_bdss/core_evaluation_driver.py
@@ -3,17 +3,21 @@ from __future__ import print_function
 import sys
 from traits.api import on_trait_change
 
+from .ids import plugin_id
 from .base_core_driver import BaseCoreDriver
 from .io.workflow_reader import (
     InvalidVersionException,
     InvalidFileException
 )
 
+CORE_EVALUATION_DRIVER_ID = plugin_id("core", "CoreEvaluationDriver")
+
 
 class CoreEvaluationDriver(BaseCoreDriver):
     """Main plugin that handles the execution of the MCO
     or the evaluation.
     """
+    id = CORE_EVALUATION_DRIVER_ID
 
     @on_trait_change("application:started")
     def application_started(self):
diff --git a/force_bdss/core_mco_driver.py b/force_bdss/core_mco_driver.py
index 07973ccbf329a5da5d0cd318cfe4fa623978b6e9..bf22630639377c2c42a303bba9638425b221dd24 100644
--- a/force_bdss/core_mco_driver.py
+++ b/force_bdss/core_mco_driver.py
@@ -4,17 +4,21 @@ import sys
 
 from traits.api import on_trait_change
 
+from .ids import plugin_id
 from .base_core_driver import BaseCoreDriver
 from .io.workflow_reader import (
     InvalidVersionException,
     InvalidFileException
 )
 
+CORE_MCO_DRIVER_ID = plugin_id("core", "CoreMCODriver")
+
 
 class CoreMCODriver(BaseCoreDriver):
     """Main plugin that handles the execution of the MCO
     or the evaluation.
     """
+    id = CORE_MCO_DRIVER_ID
 
     @on_trait_change("application:started")
     def application_started(self):
diff --git a/force_bdss/core_plugins/dummy/dummy_plugin.py b/force_bdss/core_plugins/dummy/dummy_plugin.py
index 3eca5b37262bfaab0416ee01c82e5287e5455a2f..f77b4dc843ff58883933f2acc89cce795703439d 100644
--- a/force_bdss/core_plugins/dummy/dummy_plugin.py
+++ b/force_bdss/core_plugins/dummy/dummy_plugin.py
@@ -1,4 +1,4 @@
-from force_bdss.api import BaseExtensionPlugin
+from force_bdss.api import BaseExtensionPlugin, plugin_id
 from .csv_extractor.csv_extractor_bundle import CSVExtractorBundle
 from .kpi_adder.kpi_adder_bundle import KPIAdderBundle
 from .dummy_dakota.dakota_bundle import DummyDakotaBundle
@@ -9,6 +9,8 @@ from .dummy_kpi_calculator.dummy_kpi_calculator_bundle import (
 
 
 class DummyPlugin(BaseExtensionPlugin):
+    id = plugin_id("enthought", "DummyPlugin")
+
     def _data_source_bundles_default(self):
         return [DummyDataSourceBundle(),
                 CSVExtractorBundle()]
diff --git a/force_bdss/ids.py b/force_bdss/ids.py
index 81ff1062170f547fc95cd90a79516781ad3848c6..2af5c0b5541a3132eb9010067cc9194e4b5fd165 100644
--- a/force_bdss/ids.py
+++ b/force_bdss/ids.py
@@ -33,9 +33,18 @@ def bundle_id(producer, identifier):
 
 
 def mco_parameter_id(producer, identifier):
+    """Creates an ID for an MCO parameter, so that it can be identified
+    uniquely."""
     return _string_id("mco_parameter", producer, identifier)
 
 
+def plugin_id(producer, identifier):
+    """Creates an ID for the plugins. These must be defined, otherwise
+    the envisage system will complain (but not break)
+    """
+    return _string_id("plugin", producer, identifier)
+
+
 def _string_id(entity_namespace, producer, identifier):
     """Creates an id for a generic entity.
 
diff --git a/force_bdss/tests/test_id_generators.py b/force_bdss/tests/test_ids.py
similarity index 52%
rename from force_bdss/tests/test_id_generators.py
rename to force_bdss/tests/test_ids.py
index 3faefeb2b208e1808f66c80d3407792f7c042639..1ebff9a8adfa40748165c75b4f467e6c4f2adb98 100644
--- a/force_bdss/tests/test_id_generators.py
+++ b/force_bdss/tests/test_ids.py
@@ -1,6 +1,6 @@
 import unittest
 
-from force_bdss.ids import bundle_id
+from force_bdss.ids import bundle_id, plugin_id
 
 
 class TestIdGenerators(unittest.TestCase):
@@ -13,3 +13,12 @@ class TestIdGenerators(unittest.TestCase):
                 bundle_id(bad_entry, "bar")
             with self.assertRaises(ValueError):
                 bundle_id("foo", bad_entry)
+
+    def test_plugin_id(self):
+        self.assertEqual(plugin_id("foo", "bar"), "force.bdss.plugin.foo.bar")
+
+        for bad_entry in ["", None, "   ", "foo bar"]:
+            with self.assertRaises(ValueError):
+                plugin_id(bad_entry, "bar")
+            with self.assertRaises(ValueError):
+                plugin_id("foo", bad_entry)