diff --git a/atdb/atdb/static/taskdatabase/style.css b/atdb/atdb/static/taskdatabase/style.css
index 64ce54c15411ed5c109ca9274666e585ab23539b..ead914e1ee7b4f1a04b74ee762ad7571b1f3e761 100644
--- a/atdb/atdb/static/taskdatabase/style.css
+++ b/atdb/atdb/static/taskdatabase/style.css
@@ -96,4 +96,12 @@ p.title {
   margin-bottom: 10px;
   border-top-left-radius: 0;
   border-top-right-radius: 0;
+}
+
+.modal-body {
+    padding: 0 !important;
+}
+
+.modal-dialog .modal-lg {
+        max-width: 75% !important;
 }
\ No newline at end of file
diff --git a/atdb/taskdatabase/migrations/0008_postprocessingrule.py b/atdb/taskdatabase/migrations/0008_postprocessingrule.py
new file mode 100644
index 0000000000000000000000000000000000000000..5b79b84b3ec9caaf38037ebe5bfe0d46ac940760
--- /dev/null
+++ b/atdb/taskdatabase/migrations/0008_postprocessingrule.py
@@ -0,0 +1,24 @@
+# Generated by Django 3.1.4 on 2022-01-17 13:50
+
+from django.db import migrations, models
+import django.db.models.deletion
+
+
+class Migration(migrations.Migration):
+
+    dependencies = [
+        ('taskdatabase', '0007_auto_20211214_0941'),
+    ]
+
+    operations = [
+        migrations.CreateModel(
+            name='PostProcessingRule',
+            fields=[
+                ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
+                ('aggregation_key', models.CharField(blank=True, db_index=True, default=None, max_length=20, null=True)),
+                ('trigger_status', models.CharField(blank=True, db_index=True, default='unknown', max_length=50, null=True)),
+                ('workflow_to_apply', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='to_apply', to='taskdatabase.workflow')),
+                ('workflow_to_process', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='to_process', to='taskdatabase.workflow')),
+            ],
+        ),
+    ]
diff --git a/atdb/taskdatabase/models.py b/atdb/taskdatabase/models.py
index a514a48bf33e011e3461ef9fccd43c8f45607bce..05ac8d4beb93245e9c15683a3d1d77e1afb886dd 100644
--- a/atdb/taskdatabase/models.py
+++ b/atdb/taskdatabase/models.py
@@ -115,4 +115,13 @@ class Job(models.Model):
 
     # the representation of the value in the REST API
     def __str__(self):
-        return 'task_id:'+str(self.task_id)+', job_id:'+str(self.job_id)
\ No newline at end of file
+        return 'task_id:'+str(self.task_id)+', job_id:'+str(self.job_id)
+
+
+class PostProcessingRule(models.Model):
+    aggregation_key = models.CharField(db_index=True, max_length=20, default=None,null=True, blank=True)
+    trigger_status = models.CharField(db_index=True, default="unknown", max_length=50, blank=True, null=True)
+
+    # relationships
+    workflow_to_process = models.ForeignKey(Workflow, related_name='to_process', on_delete=models.SET_NULL, null=True, blank=True)
+    workflow_to_apply = models.ForeignKey(Workflow, related_name='to_apply',on_delete=models.SET_NULL, null=True, blank=True)
diff --git a/atdb/taskdatabase/serializers.py b/atdb/taskdatabase/serializers.py
index bc8de136dff09918df8249eb41a79fe5d1d1ceec..af0c9704cbc24d40e81054f3442eb01d73a659fe 100644
--- a/atdb/taskdatabase/serializers.py
+++ b/atdb/taskdatabase/serializers.py
@@ -1,5 +1,5 @@
 from rest_framework import serializers
-from .models import Status, Task, Workflow, LogEntry, Configuration, Job
+from .models import Status, Task, Workflow, LogEntry, Configuration, Job, PostProcessingRule
 
 
 
@@ -163,3 +163,9 @@ class JobSerializer(serializers.ModelSerializer):
     class Meta:
         model = Job
         fields = "__all__"
+
+class PostProcessingRuleSerializer(serializers.ModelSerializer):
+
+    class Meta:
+        model = PostProcessingRule
+        fields = "__all__"
\ No newline at end of file
diff --git a/atdb/taskdatabase/static/css/sb-admin.css b/atdb/taskdatabase/static/css/sb-admin.css
index 88836d67e87a5d649855576a359c7073447c85eb..549ed4d6e7aa85bc03605bc2c5ef1f498a5bb776 100644
--- a/atdb/taskdatabase/static/css/sb-admin.css
+++ b/atdb/taskdatabase/static/css/sb-admin.css
@@ -6322,7 +6322,7 @@ a.close.disabled {
 @media (min-width: 992px) {
   .modal-lg,
   .modal-xl {
-    max-width: 800px;
+    max-width: 75%;
   }
 }
 
diff --git a/atdb/taskdatabase/static/taskdatabase/style.css b/atdb/taskdatabase/static/taskdatabase/style.css
index d6a2ebd6f283896fa520d87f903a026827777558..9fd5dc514df6ef8c3f2f09cdb63eacee32ff84c0 100644
--- a/atdb/taskdatabase/static/taskdatabase/style.css
+++ b/atdb/taskdatabase/static/taskdatabase/style.css
@@ -96,4 +96,12 @@ p.title {
   margin-bottom: 10px;
   border-top-left-radius: 0;
   border-top-right-radius: 0;
+}
+
+.modal-body {
+    padding: 0 !important;
+}
+
+.modal-dialog .modal-lg {
+         max-width: 75% !important;
 }
\ No newline at end of file
diff --git a/atdb/taskdatabase/templates/taskdatabase/index.html b/atdb/taskdatabase/templates/taskdatabase/index.html
index a9720c18c39f5476fb1d7d474028924fefd6474d..aca28baaf862e006415126026c5fb5aaa9360f7a 100644
--- a/atdb/taskdatabase/templates/taskdatabase/index.html
+++ b/atdb/taskdatabase/templates/taskdatabase/index.html
@@ -80,7 +80,7 @@
         {% include 'taskdatabase/pagination.html' %}
        </div>
     </div>
-    <p class="footer"> Version 1.0.0 (3 jan 2021 - 17:00)
+    <p class="footer"> Version 1.0.0 (17 jan 2021 - 15:00)
 
 </div>
 
diff --git a/atdb/taskdatabase/urls.py b/atdb/taskdatabase/urls.py
index 6728fe0eaaa9634995356901ec2bbed89fc1a26f..236a3a1e50c2d9ded38aae7d99cbcd8711509578 100644
--- a/atdb/taskdatabase/urls.py
+++ b/atdb/taskdatabase/urls.py
@@ -46,6 +46,9 @@ urlpatterns = [
     path('jobs/', views.JobListViewAPI.as_view()),
     path('jobs/<int:pk>/', views.JobDetailsViewAPI.as_view(), name='job-detail-view-api'),
 
+    path('postprocessing/', views.PostProcessingRuleListViewAPI.as_view()),
+    path('postprocessing/<int:pk>/', views.PostProcessingRuleDetailsViewAPI.as_view(), name='postprocessing-detail-view-api'),
+
     # --- custom requests ---
     # /atdb/get_size?status__in=defined,staged
     path('tasks/get_size/', views.GetSizeView.as_view(), name='get-size-view'),
diff --git a/atdb/taskdatabase/views.py b/atdb/taskdatabase/views.py
index 33840c274d7cf6b70fb02a69d3d71415e7ad2319..42c60a8347954267475e417555f80c385ba8a19e 100644
--- a/atdb/taskdatabase/views.py
+++ b/atdb/taskdatabase/views.py
@@ -22,7 +22,7 @@ from django.shortcuts import render, redirect
 from django.core.paginator import Paginator, EmptyPage, PageNotAnInteger
 
 from django.conf import settings
-from .models import Task, Status, Workflow, LogEntry, Configuration, Job
+from .models import Task, Status, Workflow, LogEntry, Configuration, Job, PostProcessingRule
 from .tables import TaskTable
 
 from django.db.models import Q
@@ -33,7 +33,7 @@ from .serializers import \
     WorkflowSerializer,\
     LogEntrySerializer,\
     ConfigurationSerializer,\
-    JobSerializer
+    JobSerializer, PostProcessingRuleSerializer
 
 from .services import algorithms
 
@@ -123,6 +123,18 @@ class JobFilter(filters.FilterSet):
             'job_id': ['exact'],
         }
 
+class PostProcessingFilter(filters.FilterSet):
+
+    class Meta:
+        model = PostProcessingRule
+
+        fields = {
+            'aggregation_key': ['exact', 'icontains', 'in'],
+            'trigger_status': ['exact', 'icontains', 'in'],
+            'workflow_to_process__id': ['exact'],
+            'workflow_to_apply__id': ['exact'],
+        }
+
 # ---------- Tables2 Views (experimental) -----------
 # implementation with tables2: http://localhost:8000/atdb/tables2
 class QueryView(SingleTableMixin, FilterView):
@@ -444,6 +456,7 @@ class ConfigurationDetailsViewAPI(generics.RetrieveUpdateDestroyAPIView):
     queryset = Configuration.objects.all()
     serializer_class = ConfigurationSerializer
 
+
 # example: /atdb/job/
 class JobListViewAPI(generics.ListCreateAPIView):
     model = Job
@@ -460,6 +473,23 @@ class JobDetailsViewAPI(generics.RetrieveUpdateDestroyAPIView):
     queryset = Job.objects.all()
     serializer_class = JobSerializer
 
+
+# example: /atdb/job/
+class PostProcessingRuleListViewAPI(generics.ListCreateAPIView):
+    model = PostProcessingRule
+    queryset = PostProcessingRule.objects.all()
+    serializer_class = PostProcessingRuleSerializer
+
+    filter_backends = (filters.DjangoFilterBackend,)
+    filter_class = PostProcessingFilter
+
+
+# example: /atdb/job/5/
+class PostProcessingRuleDetailsViewAPI(generics.RetrieveUpdateDestroyAPIView):
+    model = PostProcessingRule
+    queryset = PostProcessingRule.objects.all()
+    serializer_class = PostProcessingRuleSerializer
+
 # --- controller resources, triggered by a button in the GUI or directoy with a URL ---
 # set task status to 'new_status' - called from the GUI