diff --git a/.gitattributes b/.gitattributes
index 3d847740f0aee742b18ba8c2e26ab4a699072366..4f4e4ad170fd7f74280945e9e41088a541d7d6ce 100644
--- a/.gitattributes
+++ b/.gitattributes
@@ -4245,7 +4245,7 @@ SAS/LSMR/src/lsmr/lsmrapp/__init__.py -text
 SAS/LSMR/src/lsmr/lsmrapp/admin.py -text
 SAS/LSMR/src/lsmr/lsmrapp/apps.py -text
 SAS/LSMR/src/lsmr/lsmrapp/migrations/0001_initial.py -text
-SAS/LSMR/src/lsmr/lsmrapp/migrations/0002_generatortemplate_runtemplate_tags_workioroles_workrelationtemplate_workrequesttemplate.py -text
+SAS/LSMR/src/lsmr/lsmrapp/migrations/0002_auto_20180704_1623.py -text
 SAS/LSMR/src/lsmr/lsmrapp/migrations/CMakeLists.txt -text
 SAS/LSMR/src/lsmr/lsmrapp/migrations/__init__.py -text
 SAS/LSMR/src/lsmr/lsmrapp/models.py -text
diff --git a/SAS/LSMR/src/lsmr/lsmrapp/migrations/0002_generatortemplate_runtemplate_tags_workioroles_workrelationtemplate_workrequesttemplate.py b/SAS/LSMR/src/lsmr/lsmrapp/migrations/0002_auto_20180704_1623.py
similarity index 78%
rename from SAS/LSMR/src/lsmr/lsmrapp/migrations/0002_generatortemplate_runtemplate_tags_workioroles_workrelationtemplate_workrequesttemplate.py
rename to SAS/LSMR/src/lsmr/lsmrapp/migrations/0002_auto_20180704_1623.py
index 76e3ae2945f9f5a275134363a4bf863c62c44600..2c04f26e11aa074d51131e618d85604b6310dc6d 100644
--- a/SAS/LSMR/src/lsmr/lsmrapp/migrations/0002_generatortemplate_runtemplate_tags_workioroles_workrelationtemplate_workrequesttemplate.py
+++ b/SAS/LSMR/src/lsmr/lsmrapp/migrations/0002_auto_20180704_1623.py
@@ -1,9 +1,9 @@
-# Generated by Django 2.0.6 on 2018-07-03 17:01
+# Generated by Django 2.0.6 on 2018-07-04 16:23
 
 import django.contrib.postgres.fields
 import django.contrib.postgres.fields.jsonb
 from django.db import migrations, models
-import lsmr.lsmrapp.models
+import django.db.models.deletion
 
 
 class Migration(migrations.Migration):
@@ -62,13 +62,13 @@ class Migration(migrations.Migration):
             name='WorkIORoles',
             fields=[
                 ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
-                ('role', models.CharField(choices=[(lsmr.lsmrapp.models.RoleChoice('correlator'), 'correlator'), (lsmr.lsmrapp.models.RoleChoice('beamformer'), 'beamformer'), (lsmr.lsmrapp.models.RoleChoice('inspection plots'), 'inspection plots'), (lsmr.lsmrapp.models.RoleChoice('calibrator'), 'calibrator'), (lsmr.lsmrapp.models.RoleChoice('target'), 'target'), (lsmr.lsmrapp.models.RoleChoice('input, output'), 'input, output')], max_length=30)),
-                ('datatype', models.CharField(choices=[(lsmr.lsmrapp.models.DatatypeChoice('visibilities'), 'visibilities'), (lsmr.lsmrapp.models.DatatypeChoice('time series'), 'time series'), (lsmr.lsmrapp.models.DatatypeChoice('instrument model'), 'instrument model'), (lsmr.lsmrapp.models.DatatypeChoice('image'), 'image'), (lsmr.lsmrapp.models.DatatypeChoice('quality'), 'quality')], max_length=30)),
-                ('dataformat', django.contrib.postgres.fields.ArrayField(base_field=models.CharField(choices=[(lsmr.lsmrapp.models.DataformatChoice('MeasurementSet'), 'MeasurementSet'), (lsmr.lsmrapp.models.DataformatChoice('HDF5'), 'HDF5')], max_length=30), blank=True, null=True, size=8)),
+                ('role', models.CharField(choices=[('CORRELATOR', 'correlator'), ('BEAMFORMER', 'beamformer'), ('INSPECTION_PLOTS', 'inspection plots'), ('CALIBRATOR', 'calibrator'), ('TARGET', 'target'), ('INPUT_OUTPUT', 'input, output')], max_length=30)),
+                ('datatype', models.CharField(choices=[('VISIBILITIES', 'visibilities'), ('TIME_SERIES', 'time series'), ('INSTRUMENT_MODEL', 'instrument model'), ('IMAGE', 'image'), ('QUALITY', 'quality')], max_length=30)),
+                ('dataformat', django.contrib.postgres.fields.ArrayField(base_field=models.CharField(choices=[('MEASUREMENTSET', 'MeasurementSet'), ('HDF5', 'HDF5')], max_length=30), blank=True, null=True, size=8)),
             ],
         ),
         migrations.CreateModel(
-            name='WorkRelationTemplate',
+            name='WorkRelationSelectionTemplate',
             fields=[
                 ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
                 ('tags', django.contrib.postgres.fields.ArrayField(base_field=models.CharField(max_length=30), blank=True, null=True, size=8)),
@@ -102,4 +102,14 @@ class Migration(migrations.Migration):
                 'abstract': False,
             },
         ),
+        migrations.AddField(
+            model_name='workioroles',
+            name='inputs',
+            field=models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, related_name='role_input', to='lsmrapp.WorkRequestTemplate'),
+        ),
+        migrations.AddField(
+            model_name='workioroles',
+            name='outputs',
+            field=models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, related_name='role_output', to='lsmrapp.WorkRequestTemplate'),
+        ),
     ]
diff --git a/SAS/LSMR/src/lsmr/lsmrapp/migrations/CMakeLists.txt b/SAS/LSMR/src/lsmr/lsmrapp/migrations/CMakeLists.txt
index 9bf4885359607da477e2a051b2b5e7e5175137a2..9915ff16653ede067d6287801550c2cf957a78a8 100644
--- a/SAS/LSMR/src/lsmr/lsmrapp/migrations/CMakeLists.txt
+++ b/SAS/LSMR/src/lsmr/lsmrapp/migrations/CMakeLists.txt
@@ -1,11 +1,8 @@
 
 include(PythonInstall)
 
-set(_py_files
-    __init__.py
-    0001_initial.py
-    0002_generatortemplate_runtemplate_tags_workioroles_workrelationtemplate_workrequesttemplate.py
-    )
+
+FILE(GLOB _py_files RELATIVE ${CMAKE_CURRENT_SOURCE_DIR} *.py)
 
 python_install(${_py_files}
     DESTINATION lofar/sas/lsmr/lsmr/lsmrapp/migrations)
\ No newline at end of file
diff --git a/SAS/LSMR/src/lsmr/lsmrapp/models.py b/SAS/LSMR/src/lsmr/lsmrapp/models.py
index 5226ccbad1cbed1895e1d6c2f4816ccf7631b121..58cff4769455abeb99d784e78be8629939a6bb10 100644
--- a/SAS/LSMR/src/lsmr/lsmrapp/models.py
+++ b/SAS/LSMR/src/lsmr/lsmrapp/models.py
@@ -84,16 +84,18 @@ class WorkIORoles(Model):
     # todo: 2. Do that in raw SQL outside Django
     role = CharField(
         max_length=30,
-        choices=[(item, item.value) for item in RoleChoice]
+        choices=[(item.name, item.value) for item in RoleChoice]
     )
     datatype = CharField(
         max_length=30,
-        choices=[(item, item.value) for item in DatatypeChoice]
+        choices=[(item.name, item.value) for item in DatatypeChoice]
     )
     dataformat = ArrayField(CharField(
         max_length=30,
-        choices=[(item, item.value) for item in DataformatChoice]
+        choices=[(item.name, item.value) for item in DataformatChoice]
     ), size=8, blank=True, null=True)
+    outputs = ForeignKey("WorkRequestTemplate", related_name='role_output', on_delete=CASCADE, null=True)
+    inputs = ForeignKey("WorkRequestTemplate", related_name='role_input', on_delete=CASCADE, null=True)
 
 
 #
@@ -126,11 +128,11 @@ class RunTemplate(Template):
 
 class WorkRequestTemplate(Template):
     validation_code_js = CharField(max_length=30)
-    #outputs = ForeignKey("WorkIORoles", related_name='role_output', on_delete=CASCADE)     # todo: removed in latest draft, delete?
-    #inputs = ForeignKey("WorkIORoles", related_name='role_input', on_delete=CASCADE)       # todo: removed in latest draft, delete?
+    # outputs = ForeignKey("WorkIORoles", related_name='role_output', on_delete=CASCADE)     # todo: removed in latest draft, delete?
+    # inputs = ForeignKey("WorkIORoles", related_name='role_input', on_delete=CASCADE)       # todo: removed in latest draft, delete?
 
 
-class WorkRelationTemplate(Template):
+class WorkRelationSelectionTemplate(Template):
     pass
 
 
diff --git a/SAS/LSMR/src/lsmr/lsmrapp/serializers.py b/SAS/LSMR/src/lsmr/lsmrapp/serializers.py
index 9b41f2ef56c9c445d7a4afc19c6f268013443bfd..9b70a05d1b004a7a08724f19c54df16d6b741b94 100644
--- a/SAS/LSMR/src/lsmr/lsmrapp/serializers.py
+++ b/SAS/LSMR/src/lsmr/lsmrapp/serializers.py
@@ -30,10 +30,14 @@ class WorkRequestTemplateSerializer(serializers.HyperlinkedModelSerializer):
         fields = '__all__'
 
 
-class WorkRelationTemplateSerializer(serializers.HyperlinkedModelSerializer):
+class WorkRelationSelectionTemplateSerializer(serializers.HyperlinkedModelSerializer):
     class Meta:
-        model = models.WorkRelationTemplate
+        model = models.WorkRelationSelectionTemplate
         fields = '__all__'
 
 
+class WorkIORolesSerializer(serializers.HyperlinkedModelSerializer):
+    class Meta:
+        model = models.WorkIORoles
+        fields = '__all__'
 
diff --git a/SAS/LSMR/src/lsmr/lsmrapp/viewsets.py b/SAS/LSMR/src/lsmr/lsmrapp/viewsets.py
index 5bd60cf33a23bb46e51b74e8dc3a57578814cd36..ce4aff6ec8c51d277246783ecfe2efc21a3bf23d 100644
--- a/SAS/LSMR/src/lsmr/lsmrapp/viewsets.py
+++ b/SAS/LSMR/src/lsmr/lsmrapp/viewsets.py
@@ -26,6 +26,11 @@ class WorkRequestTemplateViewSet(viewsets.ModelViewSet):
     serializer_class = serializers.WorkRequestTemplateSerializer
 
 
-class WorkRelationTemplateViewSet(viewsets.ModelViewSet):
-    queryset = models.WorkRelationTemplate.objects.all()
-    serializer_class = serializers.WorkRelationTemplateSerializer
+class WorkRelationSelectionTemplateViewSet(viewsets.ModelViewSet):
+    queryset = models.WorkRelationSelectionTemplate.objects.all()
+    serializer_class = serializers.WorkRelationSelectionTemplateSerializer
+
+
+class WorkIORolesViewSet(viewsets.ModelViewSet):
+    queryset = models.WorkIORoles.objects.all()
+    serializer_class = serializers.WorkIORolesSerializer
diff --git a/SAS/LSMR/src/lsmr/urls.py b/SAS/LSMR/src/lsmr/urls.py
index 3f13789718c8aeabc620568567240db0dbebf8ae..0522c96bdf3b3ef9b89f1d244b662d62c9cbf914 100644
--- a/SAS/LSMR/src/lsmr/urls.py
+++ b/SAS/LSMR/src/lsmr/urls.py
@@ -40,7 +40,7 @@ router.register(r'tags', viewsets.TagsViewSet)
 router.register(r'generator_template', viewsets.GeneratorTemplateViewSet)
 router.register(r'run_template', viewsets.RunTemplateViewSet)
 router.register(r'work_request_template', viewsets.WorkRequestTemplateViewSet)
-router.register(r'work_relation_template', viewsets.WorkRelationTemplateViewSet)
-
+router.register(r'work_relation_selection_template', viewsets.WorkRelationSelectionTemplateViewSet)
+router.register(r'work_io_roles', viewsets.WorkIORolesViewSet)
 
 urlpatterns.extend(router.urls)
diff --git a/SAS/LSMR/test/t_lsmrapp_models.py b/SAS/LSMR/test/t_lsmrapp_models.py
index dac0f08415a53231f9812d3a4bb6465b02c410c8..f90acd53fb36631b1abd7e7067b4e9c7e9cd5f7e 100755
--- a/SAS/LSMR/test/t_lsmrapp_models.py
+++ b/SAS/LSMR/test/t_lsmrapp_models.py
@@ -279,7 +279,7 @@ class WorkRequestTemplateTest(rest_framework.test.APITransactionTestCase):
 
 
 
-class WorkRelationTemplateTest(rest_framework.test.APITransactionTestCase):
+class WorkRelationSelectionTemplateTest(rest_framework.test.APITransactionTestCase):
 
     reset_sequences = True
 
@@ -302,11 +302,11 @@ class WorkRelationTemplateTest(rest_framework.test.APITransactionTestCase):
         pass
 
 
-    def test_WorkRelationTemplate_gets_created_with_correct_creation_timestamp(self):
+    def test_WorkRelationSelectionTemplate_gets_created_with_correct_creation_timestamp(self):
 
         # setup
         before = timezone.now()
-        entry = models.WorkRelationTemplate.objects.create(**self.test_data_1)
+        entry = models.WorkRelationSelectionTemplate.objects.create(**self.test_data_1)
 
         after = timezone.now()
 
@@ -314,10 +314,10 @@ class WorkRelationTemplateTest(rest_framework.test.APITransactionTestCase):
         self.assertLess(before, entry.creation)
         self.assertGreater(after, entry.creation)
 
-    def test_WorkRelationTemplate_update_timestamp_gets_changed_correctly(self):
+    def test_WorkRelationSelectionTemplate_update_timestamp_gets_changed_correctly(self):
 
         # setup
-        entry = models.WorkRelationTemplate.objects.create(**self.test_data_1)
+        entry = models.WorkRelationSelectionTemplate.objects.create(**self.test_data_1)
         before = timezone.now()
         entry.version = "0.42"
         entry.save()
@@ -327,29 +327,83 @@ class WorkRelationTemplateTest(rest_framework.test.APITransactionTestCase):
         self.assertLess(before, entry.update)
         self.assertGreater(after, entry.update)
 
-    def test_GET_WorkRelationTemplate_list_view_shows_entry(self):
+    def test_GET_WorkRelationSelectionTemplate_list_view_shows_entry(self):
 
         # setup
-        entry = models.WorkRelationTemplate.objects.create(**self.test_data_1)
+        entry = models.WorkRelationSelectionTemplate.objects.create(**self.test_data_1)
 
         # assert
-        response = client.get('/work_relation_template/', format='json', follow=True)
+        response = client.get('/work_relation_selection_template/', format='json', follow=True)
         self.assertEqual(response.status_code, 200)
         for item in self.test_data_1.items():
             self.assertIn(item, response.data[0].items())
 
-    def test_GET_WorkRelationTemplate_view_returns_correct_entry(self):
+    def test_GET_WorkRelationSelectionTemplate_view_returns_correct_entry(self):
 
         # setup
-        id1 = models.WorkRelationTemplate.objects.create(**self.test_data_1).id
-        id2 = models.WorkRelationTemplate.objects.create(**self.test_data_2).id
+        id1 = models.WorkRelationSelectionTemplate.objects.create(**self.test_data_1).id
+        id2 = models.WorkRelationSelectionTemplate.objects.create(**self.test_data_2).id
 
         # assert
-        response1 = client.get('/work_relation_template/%s/' % id1, format='json', follow=True)
-        response2 = client.get('/work_relation_template/%s/' % id2, format='json', follow=True)
+        response1 = client.get('/work_relation_selection_template/%s/' % id1, format='json', follow=True)
+        response2 = client.get('/work_relation_selection_template/%s/' % id2, format='json', follow=True)
         self.assertEqual(response1.status_code, 200)
         self.assertEqual(response2.status_code, 200)
         for item in self.test_data_1.items():
             self.assertIn(item, response1.data.items())
         for item in self.test_data_2.items():
             self.assertIn(item, response2.data.items())
+
+
+class WorkIORolesTest(rest_framework.test.APITransactionTestCase):
+
+    reset_sequences = True
+
+    # test data
+    test_data_1 = {"role": "",
+                   "datatype": "",
+                   "dataformat": [],
+                   "outputs": None,
+                   "inputs": None,
+                   }
+
+    test_data_2 = {"role": "",
+                   "datatype": "",
+                   "dataformat": [],
+                   "outputs": None,
+                   "inputs": None,
+                   }
+
+    def setUp(self):
+        pass
+
+
+    def test_GET_WorkIORoles_list_view_shows_entry(self):
+
+        # setup
+        entry = models.WorkIORoles.objects.create(**self.test_data_1)
+
+        # assert
+        response = client.get('/work_io_roles/', format='json', follow=True)
+        self.assertEqual(response.status_code, 200)
+        for item in self.test_data_1.items():
+            self.assertIn(item, response.data[0].items())
+
+    def test_GET_WorkIORoles_view_returns_correct_entry(self):
+
+        # setup
+        id1 = models.WorkIORoles.objects.create(**self.test_data_1).id
+        id2 = models.WorkIORoles.objects.create(**self.test_data_2).id
+
+        # assert
+        response1 = client.get('/work_io_roles/%s/' % id1, format='json', follow=True)
+        response2 = client.get('/work_io_roles/%s/' % id2, format='json', follow=True)
+        self.assertEqual(response1.status_code, 200)
+        self.assertEqual(response2.status_code, 200)
+        for item in self.test_data_1.items():
+            self.assertIn(item, response1.data.items())
+        for item in self.test_data_2.items():
+            self.assertIn(item, response2.data.items())
+
+
+# todo: Tags? -> Decide how to deal with them first.