diff --git a/atdb/taskdatabase/migrations/0029_auto_20230707_1135.py b/atdb/taskdatabase/migrations/0029_auto_20230707_1135.py
new file mode 100644
index 0000000000000000000000000000000000000000..5be74df1eda870d30716c68a14ee501cb1b3e0fa
--- /dev/null
+++ b/atdb/taskdatabase/migrations/0029_auto_20230707_1135.py
@@ -0,0 +1,35 @@
+# Generated by Django 3.1.4 on 2023-07-07 09:35
+
+from django.db import migrations, models
+import django.db.models.deletion
+import django.utils.timezone
+
+
+class Migration(migrations.Migration):
+
+    dependencies = [
+        ('taskdatabase', '0028_remove_task_calculated_quality'),
+    ]
+
+    operations = [
+        migrations.AddField(
+            model_name='job',
+            name='timestamp',
+            field=models.DateTimeField(blank=True, default=django.utils.timezone.now),
+        ),
+        migrations.AddField(
+            model_name='task',
+            name='joined_input_tasks',
+            field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='joined_output_task', to='taskdatabase.task'),
+        ),
+        migrations.AlterField(
+            model_name='status',
+            name='timestamp',
+            field=models.DateTimeField(blank=True, default=django.utils.timezone.now),
+        ),
+        migrations.AlterField(
+            model_name='task',
+            name='creationTime',
+            field=models.DateTimeField(blank=True, default=django.utils.timezone.now, verbose_name='CreationTime'),
+        ),
+    ]
diff --git a/atdb/taskdatabase/migrations/0030_auto_20230707_1144.py b/atdb/taskdatabase/migrations/0030_auto_20230707_1144.py
new file mode 100644
index 0000000000000000000000000000000000000000..7a1a9a579b753a60e50eec5c5bb6affc9a46b512
--- /dev/null
+++ b/atdb/taskdatabase/migrations/0030_auto_20230707_1144.py
@@ -0,0 +1,23 @@
+# Generated by Django 3.1.4 on 2023-07-07 09:44
+
+from django.db import migrations, models
+import django.db.models.deletion
+
+
+class Migration(migrations.Migration):
+
+    dependencies = [
+        ('taskdatabase', '0029_auto_20230707_1135'),
+    ]
+
+    operations = [
+        migrations.RemoveField(
+            model_name='task',
+            name='joined_input_tasks',
+        ),
+        migrations.AddField(
+            model_name='task',
+            name='joined_output_task',
+            field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='joined_input_tasks', to='taskdatabase.task'),
+        ),
+    ]
diff --git a/atdb/taskdatabase/models.py b/atdb/taskdatabase/models.py
index a5229de285189874f4487ecb35a31dc4fb5b4851..1be1e5a9eb8e2f4172af34f984543de896293d9d 100644
--- a/atdb/taskdatabase/models.py
+++ b/atdb/taskdatabase/models.py
@@ -123,6 +123,7 @@ class Task(models.Model):
     # relationships
     workflow = models.ForeignKey(Workflow, related_name='tasks', on_delete=models.CASCADE, null=True, blank=True)
     predecessor = models.ForeignKey('self', related_name='successors', on_delete=models.SET_NULL, null=True, blank=True)
+    joined_output_task = models.ForeignKey('self', related_name='joined_input_tasks', on_delete=models.SET_NULL, null=True, blank=True)
 
     def __str__(self):
         return str(self.id) + ' - (' + self.task_type + ') - ' + str(self.sas_id)
@@ -384,6 +385,7 @@ class Job(models.Model):
     type = models.CharField(db_index=True, max_length=20, default=None,null=True, blank=True)
     task_id = models.IntegerField(null=True, blank=True)
     job_id = models.IntegerField(null=True, blank=True)
+    timestamp = models.DateTimeField(default=timezone.now, blank=True)
     metadata = models.JSONField(null=True, blank=True)
 
     # the representation of the value in the REST API
diff --git a/atdb/taskdatabase/serializers.py b/atdb/taskdatabase/serializers.py
index 9253fe93ac4668045595332b031cbfe6f9b4a17e..37341fdab51f2fd5bfdfc2b1ef04b9a041634152 100644
--- a/atdb/taskdatabase/serializers.py
+++ b/atdb/taskdatabase/serializers.py
@@ -37,7 +37,7 @@ class TaskWriteSerializer(serializers.ModelSerializer):
 
     class Meta:
         model = Task
-        fields = ('id','task_type','filter','predecessor','successors',
+        fields = ('id','task_type','filter','predecessor','successors','joined_input_tasks','joined_output_task',
                   'project','sas_id','priority','purge_policy','cleanup_policy','resume',
                   'new_workflow_id','new_workflow_uri','workflow',
                   'stage_request_id',
@@ -91,7 +91,7 @@ class TaskReadSerializer(serializers.ModelSerializer):
     class Meta:
         model = Task
         fields = ['id','task_type','creationTime','filter',
-                  'predecessor','predecessor_status','successors',
+                  'predecessor','predecessor_status','successors', 'joined_input_tasks','joined_output_task',
                   'project','sas_id','priority','purge_policy','cleanup_policy','resume',
                   'workflow',
                   'stage_request_id',
@@ -123,6 +123,7 @@ class TaskReadSerializerFast(serializers.ModelSerializer):
     class Meta:
         model = Task
         fields = ['id','task_type','creationTime','filter','predecessor','predecessor_status',
+                  'joined_input_tasks', 'joined_output_task',
                   'project','sas_id','priority','purge_policy','cleanup_policy','resume',
                   'workflow',
                   'stage_request_id',
@@ -159,7 +160,7 @@ class JobSerializer(serializers.ModelSerializer):
     class Meta:
         model = Job
         fields = "__all__"
-        fields = ['id','type','task_id','job_id','metadata','webdav_url']
+        fields = ['id','type','task_id','job_id','timestamp','metadata','webdav_url']
 
 class PostProcessingRuleSerializer(serializers.ModelSerializer):