diff --git a/atdb/docs/ATDB-LDV Data Model.png b/atdb/docs/ATDB-LDV Data Model.png
index 2cb5d5ba14cc4cb74d94a9bb26ee581ee8a90e3b..357a6ea1859098a01ff2d7c195bc379c165a2496 100644
Binary files a/atdb/docs/ATDB-LDV Data Model.png and b/atdb/docs/ATDB-LDV Data Model.png differ
diff --git a/atdb/taskdatabase/models.py b/atdb/taskdatabase/models.py
index 1be1e5a9eb8e2f4172af34f984543de896293d9d..35ac5ff9c6c71c90a76d1906ca13847bc51e6d6c 100644
--- a/atdb/taskdatabase/models.py
+++ b/atdb/taskdatabase/models.py
@@ -292,6 +292,24 @@ class Task(models.Model):
                return False
         return True
 
+    @property
+    def joined_status(self):
+        # if a task has joined_input_tasks, then check their status
+        try:
+            joined_input_tasks = self.joined_input_tasks.all()
+            status = None
+            for task in joined_input_tasks:
+                if status and task.status != status:
+                    return None
+                status = task.status
+
+            # all statusses are the same, return it
+            return status
+        except Exception as e:
+            print(e)
+
+        return "unknown"
+
     # NV: this shows the latest status change, but because it is a derived property it cannot be sorted.
     # This functionality was not requested, and to avoid additional requests about 'sort' functionalty
     # it is currently commented out. Could be of use later though, so I leave it in for now.
diff --git a/atdb/taskdatabase/serializers.py b/atdb/taskdatabase/serializers.py
index 37341fdab51f2fd5bfdfc2b1ef04b9a041634152..a233c9162d7a7db700aeaa479e49ef4994dbb14d 100644
--- a/atdb/taskdatabase/serializers.py
+++ b/atdb/taskdatabase/serializers.py
@@ -91,7 +91,8 @@ class TaskReadSerializer(serializers.ModelSerializer):
     class Meta:
         model = Task
         fields = ['id','task_type','creationTime','filter',
-                  'predecessor','predecessor_status','successors', 'joined_input_tasks','joined_output_task',
+                  'predecessor','predecessor_status','successors',
+                  'joined_input_tasks','joined_output_task','joined_status',
                   'project','sas_id','priority','purge_policy','cleanup_policy','resume',
                   'workflow',
                   'stage_request_id',
@@ -123,7 +124,7 @@ class TaskReadSerializerFast(serializers.ModelSerializer):
     class Meta:
         model = Task
         fields = ['id','task_type','creationTime','filter','predecessor','predecessor_status',
-                  'joined_input_tasks', 'joined_output_task',
+                  'joined_input_tasks', 'joined_output_task', 'joined_status'
                   'project','sas_id','priority','purge_policy','cleanup_policy','resume',
                   'workflow',
                   'stage_request_id',
diff --git a/atdb/taskdatabase/tests/test_models_joins.py b/atdb/taskdatabase/tests/test_models_joins.py
new file mode 100644
index 0000000000000000000000000000000000000000..a540ab527d0d2107d481e3e13e71ba99e8d54c8f
--- /dev/null
+++ b/atdb/taskdatabase/tests/test_models_joins.py
@@ -0,0 +1,54 @@
+from django.test import TestCase
+import json
+
+from taskdatabase.models import Workflow,Task
+
+
+class TestJoinedTasks(TestCase):
+
+    @classmethod
+    def setUpTestData(cls):
+
+        # Set up non-modified objects used by all test methods
+        workflow = Workflow()
+        workflow.save()
+
+        # create a list of Tasks
+        Task.objects.get_or_create(sas_id=1, status='stored')
+        Task.objects.get_or_create(sas_id=2, status='stored')
+        Task.objects.get_or_create(sas_id=3, status='defined')
+
+
+    def test_add_input_tasks_to_task(self):
+        output_task = Task.objects.get(sas_id=1)
+        input_task_1 = Task.objects.get(sas_id=2)
+        input_task_2 = Task.objects.get(sas_id=3)
+        output_task.joined_input_tasks.set([input_task_1,input_task_2])
+        output_task.save()
+
+        # count number of input asks
+        count_input_tasks = output_task.joined_input_tasks.count()
+        self.assertEqual(count_input_tasks,2)
+
+
+    def test_join_status_none(self):
+        output_task = Task.objects.get(sas_id=1)
+        input_task_1 = Task.objects.get(sas_id=2) # stored
+        input_task_2 = Task.objects.get(sas_id=3) # defined
+        output_task.joined_input_tasks.set([input_task_1,input_task_2])
+        output_task.save()
+
+        # one input task on stored, and on on defined, should give: None
+
+        self.assertEqual(output_task.joined_status,None)
+
+
+    def test_join_status_stored(self):
+        output_task = Task.objects.get(sas_id=3)
+        input_task_1 = Task.objects.get(sas_id=2)  # stored
+        input_task_2 = Task.objects.get(sas_id=1)  # stored
+        output_task.joined_input_tasks.set([input_task_1, input_task_2])
+        output_task.save()
+
+        # two input tasks 'stored', should give: 'stored'
+        self.assertEqual(output_task.joined_status, "stored")
\ No newline at end of file