diff --git a/SAS/TMSS/src/tmss/tmssapp/models/specification.py b/SAS/TMSS/src/tmss/tmssapp/models/specification.py
index 2956c3e09c58785fe0948e66f72a0cce770d5ad0..225dde5cefcf7e9b2118ad68d047fac1c10df8a2 100644
--- a/SAS/TMSS/src/tmss/tmssapp/models/specification.py
+++ b/SAS/TMSS/src/tmss/tmssapp/models/specification.py
@@ -131,6 +131,15 @@ class CopyReason(AbstractChoice):
         REPEATED = "repeated"
 
 
+class SchedulingRelationPlacement(AbstractChoice):
+    """Defines how "first" must be places with respect to "second". One of BEFORE, AFTER, PARALLEL."""
+    class Choices(Enum):
+        BEFORE = "before"
+        AFTER = "after"
+        PARALLEL = "paralle"
+       
+
+
 # concrete models
 
 class TaskConnector(BasicCommon):
@@ -382,3 +391,16 @@ class TaskRelationBlueprint(BasicCommon):
 
         super().save(force_insert, force_update, using, update_fields)
 
+
+class TaskSchedulingRelationBlueprint(BasicCommon):
+    first = ForeignKey('TaskBlueprint', related_name='first_to_connect', on_delete=CASCADE, help_text='First Task Blueprint to connect.')
+    second = ForeignKey('TaskBlueprint', related_name='second_to_connect', on_delete=CASCADE, help_text='Second Task Blueprint to connect.')
+    placement = ForeignKey('SchedulingRelationPlacement', null=False, on_delete=PROTECT, help_text='Task scheduling relation placement.')
+    time_offset = IntegerField(default=0, help_text='Time offset of start of second task with respect to start of first task.')  
+    
+class TaskSchedulingRelationDraft(BasicCommon):
+    fist = ForeignKey('TaskDraft', related_name='first_to_connect', on_delete=CASCADE, help_text='First Task Draft to connect.')
+    second = ForeignKey('TaskDraft', related_name='second_to_connect', on_delete=CASCADE, help_text='Secind Task Draftto connect.')
+    placement = ForeignKey('SchedulingRelationPlacement', null=False, on_delete=PROTECT, help_text='Task scheduling relation placement.')
+
+    time_offset = IntegerField(default=0, help_text='Time offset of start of second task with respect to start of first task.')  
\ No newline at end of file
diff --git a/SAS/TMSS/src/tmss/tmssapp/serializers/specification.py b/SAS/TMSS/src/tmss/tmssapp/serializers/specification.py
index a745c8e18e36f4995e1e2a75020b5d4142010258..6c02a2680173bc4047a34645bebbd6035e4da2df 100644
--- a/SAS/TMSS/src/tmss/tmssapp/serializers/specification.py
+++ b/SAS/TMSS/src/tmss/tmssapp/serializers/specification.py
@@ -267,3 +267,24 @@ class TaskRelationBlueprintSerializer(serializers.HyperlinkedModelSerializer):
 
 
 
+class TaskSchedulingRelationDraftSerializer(RelationalHyperlinkedModelSerializer):
+    pass
+
+class TaskSchedulingRelationBlueprintSerializer(RelationalHyperlinkedModelSerializer):
+    # Create a JSON editor form to replace the simple text field based on the schema in the template that this
+    # draft refers to. If that fails, the JSONField remains a standard text input.
+    def __init__(self, *args, **kwargs):
+        super().__init__(*args, **kwargs)
+        try:
+            self.fields['first'] = JSONEditorField(self.instance.selection_template.schema)
+        except Exception as e:
+            pass
+
+    class Meta:
+        model = models.TaskSchedulingRelationBlueprint
+        fields = '__all__'
+
+
+
+
+
diff --git a/SAS/TMSS/src/tmss/tmssapp/viewsets/specification.py b/SAS/TMSS/src/tmss/tmssapp/viewsets/specification.py
index 4516d434acbf9e031a0c6daad5d01a019668cea2..f84917c922c6e077f229290644b9ee0dc408846b 100644
--- a/SAS/TMSS/src/tmss/tmssapp/viewsets/specification.py
+++ b/SAS/TMSS/src/tmss/tmssapp/viewsets/specification.py
@@ -401,6 +401,15 @@ class TaskRelationBlueprintViewSet(LOFARViewSet):
     serializer_class = serializers.TaskRelationBlueprintSerializer
 
 
+class TaskSchedulingRelationBlueprintViewSet(LOFARViewSet):
+    queryset = models.TaskSchedulingRelationBlueprint.objects.all()
+    serializer_class = serializers.TaskSchedulingRelationBlueprintSerializer
+
+class TaskSchedulingRelationDraftViewSet(LOFARViewSet):
+    queryset = models.TaskSchedulingRelationDraft.objects.all()
+    serializer_class = serializers.TaskSchedulingRelationDraftSerializer
+
+
 
 class TaskRelationBlueprintNestedViewSet(LOFARNestedViewSet):
     queryset = models.TaskRelationBlueprint.objects.all()
@@ -416,4 +425,3 @@ class TaskRelationBlueprintNestedViewSet(LOFARNestedViewSet):
             return task_relation_draft.related_task_relation_blueprint.all()
         else:
             return models.TaskRelationBlueprint.objects.all()
-
diff --git a/SAS/TMSS/src/tmss/urls.py b/SAS/TMSS/src/tmss/urls.py
index 364d521a0b15de2aabcef524a0d8d840ab77809d..a10c90d99c03835317b3555b9c9e42673b9703c7 100644
--- a/SAS/TMSS/src/tmss/urls.py
+++ b/SAS/TMSS/src/tmss/urls.py
@@ -97,6 +97,8 @@ router.register(r'task_draft', viewsets.TaskDraftViewSet)
 router.register(r'task_blueprint', viewsets.TaskBlueprintViewSet)
 router.register(r'task_relation_draft', viewsets.TaskRelationDraftViewSet)
 router.register(r'task_relation_blueprint', viewsets.TaskRelationBlueprintViewSet)
+router.register(r'task_scheduling_relation_draft', viewsets.TaskSchedulingRelationDraftViewSet)
+router.register(r'task_scheduling_relation_blueprint', viewsets.TaskSchedulingRelationBlueprintViewSet)
 
 # nested
 router.register(r'cycle/(?P<cycle_id>[\w\-]+)/project', viewsets.ProjectNestedViewSet)