diff --git a/SAS/TMSS/backend/src/tmss/tmssapp/schemas/UC1-scheduling-unit-observation-strategy.json b/SAS/TMSS/backend/src/tmss/tmssapp/schemas/UC1-scheduling-unit-observation-strategy.json
index 33a51e3c0f967a083a8cd8e212f68eddfed5f3bb..7bdedc32a8c57451b9751bf30af8d6892a17fdcd 100644
--- a/SAS/TMSS/backend/src/tmss/tmssapp/schemas/UC1-scheduling-unit-observation-strategy.json
+++ b/SAS/TMSS/backend/src/tmss/tmssapp/schemas/UC1-scheduling-unit-observation-strategy.json
@@ -206,15 +206,16 @@
       "producer": "Calibrator Observation 1",
       "consumer": "Pipeline 1",
       "tags": [],
-      "input": {
-        "role": "any",
-        "datatype": "visibilities"
-      },
       "output": {
         "role": "correlator",
-        "datatype": "visibilities"
+        "datatype": "visibilities",
+        "dataformat": "MeasurementSet"
+      },
+      "input": {
+        "role": "any",
+        "datatype": "visibilities",
+        "dataformat": "MeasurementSet"
       },
-      "dataformat": "MeasurementSet",
       "selection_doc": {},
       "selection_template": "all"
     },
@@ -222,15 +223,16 @@
       "producer": "Calibrator Observation 2",
       "consumer": "Pipeline 2",
       "tags": [],
-      "input": {
-        "role": "any",
-        "datatype": "visibilities"
-      },
       "output": {
         "role": "correlator",
-        "datatype": "visibilities"
+        "datatype": "visibilities",
+        "dataformat": "MeasurementSet"
+      },
+      "input": {
+        "role": "any",
+        "datatype": "visibilities",
+        "dataformat": "MeasurementSet"
       },
-      "dataformat": "MeasurementSet",
       "selection_doc": {},
       "selection_template": "all"
     },
@@ -238,15 +240,16 @@
       "producer": "Target Observation",
       "consumer": "Pipeline target1",
       "tags": [],
-      "input": {
-        "role": "any",
-        "datatype": "visibilities"
-      },
       "output": {
         "role": "correlator",
-        "datatype": "visibilities"
+        "datatype": "visibilities",
+        "dataformat": "MeasurementSet"
+      },
+      "input": {
+        "role": "any",
+        "datatype": "visibilities",
+        "dataformat": "MeasurementSet"
       },
-      "dataformat": "MeasurementSet",
       "selection_doc": {
         "sap": [
           "target1"
@@ -258,15 +261,16 @@
       "producer": "Target Observation",
       "consumer": "Pipeline target2",
       "tags": [],
-      "input": {
-        "role": "any",
-        "datatype": "visibilities"
-      },
       "output": {
         "role": "correlator",
-        "datatype": "visibilities"
+        "datatype": "visibilities",
+        "dataformat": "MeasurementSet"
+      },
+      "input": {
+        "role": "any",
+        "datatype": "visibilities",
+        "dataformat": "MeasurementSet"
       },
-      "dataformat": "MeasurementSet",
       "selection_doc": {
         "sap": [
           "target2"
@@ -278,15 +282,16 @@
       "producer": "Pipeline 1",
       "consumer": "Ingest",
       "tags": [],
-      "input": {
+      "output": {
         "role": "any",
-        "datatype": "visibilities"
+        "datatype": "visibilities",
+        "dataformat": "MeasurementSet"
       },
-      "output": {
+      "input": {
         "role": "any",
-        "datatype": "visibilities"
+        "datatype": "visibilities",
+        "dataformat": "MeasurementSet"
       },
-      "dataformat": "MeasurementSet",
       "selection_doc": {},
       "selection_template": "all"
     },
@@ -294,15 +299,16 @@
       "producer": "Pipeline 2",
       "consumer": "Ingest",
       "tags": [],
-      "input": {
+      "output": {
         "role": "any",
-        "datatype": "visibilities"
+        "datatype": "visibilities",
+        "dataformat": "MeasurementSet"
       },
-      "output": {
+      "input": {
         "role": "any",
-        "datatype": "visibilities"
+        "datatype": "visibilities",
+        "dataformat": "MeasurementSet"
       },
-      "dataformat": "MeasurementSet",
       "selection_doc": {},
       "selection_template": "all"
     },
@@ -310,15 +316,16 @@
       "producer": "Pipeline target1",
       "consumer": "Ingest",
       "tags": [],
-      "input": {
+      "output": {
         "role": "any",
-        "datatype": "visibilities"
+        "datatype": "visibilities",
+        "dataformat": "MeasurementSet"
       },
-      "output": {
+      "input": {
         "role": "any",
-        "datatype": "visibilities"
+        "datatype": "visibilities",
+        "dataformat": "MeasurementSet"
       },
-      "dataformat": "MeasurementSet",
       "selection_doc": {},
       "selection_template": "all"
     },
@@ -326,15 +333,16 @@
       "producer": "Pipeline target2",
       "consumer": "Ingest",
       "tags": [],
-      "input": {
+      "output": {
         "role": "any",
-        "datatype": "visibilities"
+        "datatype": "visibilities",
+        "dataformat": "MeasurementSet"
       },
-      "output": {
+      "input": {
         "role": "any",
-        "datatype": "visibilities"
+        "datatype": "visibilities",
+        "dataformat": "MeasurementSet"
       },
-      "dataformat": "MeasurementSet",
       "selection_doc": {},
       "selection_template": "all"
     }
diff --git a/SAS/TMSS/backend/src/tmss/tmssapp/schemas/common_schema_template-tasks-1.json b/SAS/TMSS/backend/src/tmss/tmssapp/schemas/common_schema_template-tasks-1.json
index 01c7c91fdb8cccbc94aae63ac1539fb006d136e3..533927b66e7f5a113a664d89190ba044ac07f600 100644
--- a/SAS/TMSS/backend/src/tmss/tmssapp/schemas/common_schema_template-tasks-1.json
+++ b/SAS/TMSS/backend/src/tmss/tmssapp/schemas/common_schema_template-tasks-1.json
@@ -13,16 +13,24 @@
       "properties": {
         "role": {
           "type": "string",
-          "title": "Role"
+          "title": "Role",
+          "enum": ["correlator", "beamformer", "inspection plots", "calibrator", "target", "any"]
         },
         "datatype": {
           "type": "string",
-          "title": "Data Type"
+          "title": "Data Type",
+          "enum": ["visibilities", "time series", "instrument model", "image", "quality"]
+        },
+        "dataformat": {
+          "type": "string",
+          "title": "Data Format",
+          "enum": ["MeasurementSet", "Beamformed", "QA_HDF5", "QA_Plots"]
         }
       },
       "required": [
         "role",
-        "datatype"
+        "datatype",
+        "dataformat"
       ]
     }
   }
diff --git a/SAS/TMSS/backend/src/tmss/tmssapp/schemas/scheduling_unit_template-scheduling_unit-1.json b/SAS/TMSS/backend/src/tmss/tmssapp/schemas/scheduling_unit_template-scheduling_unit-1.json
index 00af272aa1318b9628e974edd49baed3be4ec25a..f92347892c9a0b3dcf67268e15f4b00ea85fe0c9 100644
--- a/SAS/TMSS/backend/src/tmss/tmssapp/schemas/scheduling_unit_template-scheduling_unit-1.json
+++ b/SAS/TMSS/backend/src/tmss/tmssapp/schemas/scheduling_unit_template-scheduling_unit-1.json
@@ -90,10 +90,6 @@
             "$ref": "http://tmss.lofar.org/api/schemas/commonschematemplate/tasks/1/#/definitions/task_connector",
             "default": {}
           },
-          "dataformat": {
-            "type": "string",
-            "title": "Data Format"
-          },
           "selection_doc": {
             "type": "object",
             "title": "Filter selection",
diff --git a/SAS/TMSS/backend/src/tmss/tmssapp/schemas/short-observation-pipeline-ingest-scheduling-unit-observation-strategy.json b/SAS/TMSS/backend/src/tmss/tmssapp/schemas/short-observation-pipeline-ingest-scheduling-unit-observation-strategy.json
index 2709d25e53fe61844e7c32380b500d532c4f2437..6ae834740335d9474e7351d58c3739b1bf154a2f 100644
--- a/SAS/TMSS/backend/src/tmss/tmssapp/schemas/short-observation-pipeline-ingest-scheduling-unit-observation-strategy.json
+++ b/SAS/TMSS/backend/src/tmss/tmssapp/schemas/short-observation-pipeline-ingest-scheduling-unit-observation-strategy.json
@@ -90,13 +90,14 @@
       "tags": [],
       "input": {
         "role": "any",
-        "datatype": "visibilities"
+        "datatype": "visibilities",
+        "dataformat": "MeasurementSet"
       },
       "output": {
         "role": "correlator",
-        "datatype": "visibilities"
+        "datatype": "visibilities",
+        "dataformat": "MeasurementSet"
       },
-      "dataformat": "MeasurementSet",
       "selection_doc": {},
       "selection_template": "all"
     },
@@ -106,13 +107,14 @@
       "tags": [],
       "input": {
         "role": "any",
-        "datatype": "visibilities"
+        "datatype": "visibilities",
+        "dataformat": "MeasurementSet"
       },
       "output": {
         "role": "any",
-        "datatype": "visibilities"
+        "datatype": "visibilities",
+        "dataformat": "MeasurementSet"
       },
-      "dataformat": "MeasurementSet",
       "selection_doc": {},
       "selection_template": "all"
     },
@@ -122,13 +124,14 @@
       "tags": [],
       "input": {
         "role": "any",
-        "datatype": "visibilities"
+        "datatype": "visibilities",
+        "dataformat": "MeasurementSet"
       },
       "output": {
         "role": "correlator",
-        "datatype": "visibilities"
+        "datatype": "visibilities",
+        "dataformat": "MeasurementSet"
       },
-      "dataformat": "MeasurementSet",
       "selection_doc": {},
       "selection_template": "all"
     },
@@ -138,13 +141,14 @@
       "tags": [],
       "input": {
         "role": "any",
-        "datatype": "visibilities"
+        "datatype": "visibilities",
+        "dataformat": "MeasurementSet"
       },
       "output": {
         "role": "any",
-        "datatype": "visibilities"
+        "datatype": "visibilities",
+        "dataformat": "MeasurementSet"
       },
-      "dataformat": "MeasurementSet",
       "selection_doc": {},
       "selection_template": "all"
     }
diff --git a/SAS/TMSS/backend/src/tmss/tmssapp/tasks.py b/SAS/TMSS/backend/src/tmss/tmssapp/tasks.py
index 0444241ead1b434d321b15e102d860dedbc68be3..256128032bb3aa75343dbf05d9c0442df28d471a 100644
--- a/SAS/TMSS/backend/src/tmss/tmssapp/tasks.py
+++ b/SAS/TMSS/backend/src/tmss/tmssapp/tasks.py
@@ -182,12 +182,12 @@ def create_task_drafts_from_scheduling_unit_draft(scheduling_unit_draft: models.
             input_role = models.TaskConnectorType.objects.get(task_template=consumer_task_draft.specifications_template,
                                                               role=task_relation_definition["input"]["role"],
                                                               datatype=task_relation_definition["input"]["datatype"],
-                                                              dataformat=task_relation_definition["dataformat"],
+                                                              dataformat=task_relation_definition["input"]["dataformat"],
                                                               iotype=models.IOType.Choices.INPUT.value)
             output_role = models.TaskConnectorType.objects.get(task_template=producer_task_draft.specifications_template,
                                                                role=task_relation_definition["output"]["role"],
                                                                datatype=task_relation_definition["output"]["datatype"],
-                                                               dataformat=task_relation_definition["dataformat"],
+                                                               dataformat=task_relation_definition["output"]["dataformat"],
                                                                iotype=models.IOType.Choices.OUTPUT.value)
             selection_template = models.TaskRelationSelectionTemplate.objects.get(name=task_relation_definition["selection_template"])
         except Exception as e:
diff --git a/SAS/TMSS/backend/test/t_scheduling.py b/SAS/TMSS/backend/test/t_scheduling.py
index 6a6ff816fce2866f0f34a9c07c805aac6a83bf6c..e59c6c40d5eb7922e90df2043640cc6948d11cb4 100755
--- a/SAS/TMSS/backend/test/t_scheduling.py
+++ b/SAS/TMSS/backend/test/t_scheduling.py
@@ -408,9 +408,8 @@ class SchedulingTest(unittest.TestCase):
             # connect obs to pipeline
             scheduling_unit_doc['task_relations'].append({"producer": "Observation",
                                                           "consumer": "Pipeline",
-                                                          "input": { "role": "any", "datatype": "visibilities" },
-                                                          "output": { "role": "correlator", "datatype": "visibilities" },
-                                                          "dataformat": "MeasurementSet",
+                                                          "input": { "role": "any", "datatype": "visibilities", "dataformat": "MeasurementSet"},
+                                                          "output": { "role": "correlator", "datatype": "visibilities", "dataformat": "MeasurementSet"},
                                                           "selection_doc": {},
                                                           "selection_template": "all" })
 
diff --git a/SAS/TMSS/backend/test/t_tmssapp_specification_REST_API.py b/SAS/TMSS/backend/test/t_tmssapp_specification_REST_API.py
index f0c8c331dc951757c7e98c3a3c90b467591446f7..25a535b91945c231215ec887a7ddf355d2418b21 100755
--- a/SAS/TMSS/backend/test/t_tmssapp_specification_REST_API.py
+++ b/SAS/TMSS/backend/test/t_tmssapp_specification_REST_API.py
@@ -615,9 +615,9 @@ class TaskConnectorTestCase(unittest.TestCase):
 
         # POST a new item with invalid choice
         test_data_invalid = dict(test_data_creator.TaskConnectorType(task_template_url=self.task_template_url))
-        test_data_invalid['dataformats'] = [BASE_URL + '/dataformat/forbidden/']
+        test_data_invalid['dataformat'] = BASE_URL + '/dataformat/forbidden/'
         r_dict = POST_and_assert_expected_response(self, BASE_URL + '/task_connector_type/', test_data_invalid, 400, {})
-        self.assertTrue('Invalid hyperlink' in str(r_dict['dataformats']))
+        self.assertTrue('Invalid hyperlink' in str(r_dict['dataformat']))
 
     def test_task_connector_POST_nonexistant_task_template_raises_error(self):
 
@@ -665,8 +665,7 @@ class TaskConnectorTestCase(unittest.TestCase):
         GET_OK_and_assert_equal_expected_response(self, url, tc_test_data)
 
         test_patch = {"role": BASE_URL + '/role/calibrator',
-                      "dataformats": [BASE_URL + '/dataformat/Beamformed',
-                                      BASE_URL + '/dataformat/MeasurementSet']}
+                      "dataformat": BASE_URL + '/dataformat/Beamformed'}
 
         # PATCH item and verify
         PATCH_and_assert_expected_response(self, url, test_patch, 200, test_patch)
diff --git a/SAS/TMSS/backend/test/tmss_test_data_django_models.py b/SAS/TMSS/backend/test/tmss_test_data_django_models.py
index 08c549f734feed11c0cda5fe64edd974297cb0af..5dbab3037d9ed67817dbce9d42f9a3198f49f84e 100644
--- a/SAS/TMSS/backend/test/tmss_test_data_django_models.py
+++ b/SAS/TMSS/backend/test/tmss_test_data_django_models.py
@@ -106,6 +106,7 @@ def TaskRelationSelectionTemplate_test_data(name="my_TaskRelationSelectionTempla
 def TaskConnectorType_test_data() -> dict:
     return {"role": models.Role.objects.get(value='calibrator'),
             "datatype": models.Datatype.objects.get(value='instrument model'),
+            "dataformat": models.Dataformat.objects.get(value='Beamformed'),
             "task_template": models.TaskTemplate.objects.create(**TaskTemplate_test_data()),
             "iotype": models.IOType.objects.get(value=models.IOType.Choices.OUTPUT.value),
             "tags": []}
@@ -243,7 +244,6 @@ def TaskRelationDraft_test_data(producer: models.TaskDraft = None, consumer: mod
 
     return {"tags": [],
             "selection_doc": {},
-            "dataformat": models.Dataformat.objects.get(value='Beamformed'),
             "producer": producer,
             "consumer": consumer,
             "input_role":  models.TaskConnectorType.objects.create(**TaskConnectorType_test_data()),
@@ -303,7 +303,6 @@ def TaskRelationBlueprint_test_data(producer: models.TaskBlueprint = None, consu
 
     return {"tags": [],
             "selection_doc": {},
-            "dataformat": models.Dataformat.objects.get(value='Beamformed'),
             "input_role": models.TaskConnectorType.objects.create(**TaskConnectorType_test_data()),
             "output_role": models.TaskConnectorType.objects.create(**TaskConnectorType_test_data()),
             "draft": models.TaskRelationDraft.objects.create(**TaskRelationDraft_test_data()),
diff --git a/SAS/TMSS/backend/test/tmss_test_data_rest.py b/SAS/TMSS/backend/test/tmss_test_data_rest.py
index 759885c6f84320b6f452ade940b1db2bfe8e4eb5..c7377e61e4e812909d7d0c432457d5b378319ea6 100644
--- a/SAS/TMSS/backend/test/tmss_test_data_rest.py
+++ b/SAS/TMSS/backend/test/tmss_test_data_rest.py
@@ -227,7 +227,7 @@ class TMSSRESTTestDataCreator():
     
         return {"role": self.django_api_url + '/role/%s'%role,
                 "datatype": self.django_api_url + '/datatype/image',
-                "dataformats": [self.django_api_url + '/dataformat/Beamformed'],
+                "dataformat": self.django_api_url + '/dataformat/Beamformed',
                 "task_template": task_template_url,
                 "iotype": self.django_api_url + '/iotype/%s'%iotype,
                 "tags": []}
@@ -438,7 +438,6 @@ class TMSSRESTTestDataCreator():
     
         return {"tags": [],
                 "selection_doc": selection_doc,
-                "dataformat": self.django_api_url + "/dataformat/Beamformed",
                 "producer": producer_url,
                 "consumer": consumer_url,
                 "input_role": input_role_url,
@@ -538,7 +537,6 @@ class TMSSRESTTestDataCreator():
         # test data
         return {"tags": [],
                 "selection_doc": selection_doc,
-                "dataformat": self.django_api_url + '/dataformat/MeasurementSet',
                 "input_role": input_role_url,
                 "output_role": output_role_url,
                 "draft": draft_url,