diff --git a/atdb/atdb/static/taskdatabase/ATDB-LDV Workflow Diagram.png b/atdb/atdb/static/taskdatabase/ATDB-LDV Workflow Diagram.png
index 9640689bf19cd81dd6a93813f02dbad2f433ce35..32eb9a99e93f9fc7f7310005c55f7f21e14c4540 100644
Binary files a/atdb/atdb/static/taskdatabase/ATDB-LDV Workflow Diagram.png and b/atdb/atdb/static/taskdatabase/ATDB-LDV Workflow Diagram.png differ
diff --git a/atdb/docs/ATDB Context Diagram.png b/atdb/docs/ATDB Context Diagram.png
deleted file mode 100644
index 624425c3f79d6c9b909c728e61b6e687d11a1615..0000000000000000000000000000000000000000
Binary files a/atdb/docs/ATDB Context Diagram.png and /dev/null differ
diff --git a/atdb/docs/ATDB-LDV - Deployment Diagram.png b/atdb/docs/ATDB-LDV - Deployment Diagram.png
index 88d60db1f98c2ccbc2b5be45ef5b2d4609e0c6d2..94370d9e9bffe85dee25c32c1f46632f28af68ac 100644
Binary files a/atdb/docs/ATDB-LDV - Deployment Diagram.png and b/atdb/docs/ATDB-LDV - Deployment Diagram.png differ
diff --git a/atdb/docs/ATDB-LDV Workflow Diagram.png b/atdb/docs/ATDB-LDV Workflow Diagram.png
index fc44c244a6f9910638a23d0ef3a5fb25551ad835..2ef5b467bffbb3b10197899e0bcbbf8ffa66c6dc 100644
Binary files a/atdb/docs/ATDB-LDV Workflow Diagram.png and b/atdb/docs/ATDB-LDV Workflow Diagram.png differ
diff --git a/atdb/taskdatabase/migrations/0015_auto_20220401_1336.py b/atdb/taskdatabase/migrations/0015_auto_20220401_1336.py
new file mode 100644
index 0000000000000000000000000000000000000000..905a12b7c65d076f6a7e6bacc8ac9def3c106686
--- /dev/null
+++ b/atdb/taskdatabase/migrations/0015_auto_20220401_1336.py
@@ -0,0 +1,23 @@
+# Generated by Django 3.1.4 on 2022-04-01 11:36
+
+from django.db import migrations, models
+
+
+class Migration(migrations.Migration):
+
+    dependencies = [
+        ('taskdatabase', '0014_task_environment'),
+    ]
+
+    operations = [
+        migrations.AddField(
+            model_name='task',
+            name='quality',
+            field=models.CharField(blank=True, max_length=10, null=True),
+        ),
+        migrations.AddField(
+            model_name='task',
+            name='remarks',
+            field=models.JSONField(blank=True, null=True),
+        ),
+    ]
diff --git a/atdb/taskdatabase/models.py b/atdb/taskdatabase/models.py
index 4d51bcf255c5254f11551fadcc2b305fb455b43c..ddf73715b57352e0cbf76e7b3d56b1d6df1cc359 100644
--- a/atdb/taskdatabase/models.py
+++ b/atdb/taskdatabase/models.py
@@ -22,13 +22,27 @@ def convert_quality_to_list_for_template(task):
     list = []
 
     try:
-        list.append(str(task.quality['uv-coverage']))
-        list.append(str(task.quality['sensitivity']))
-        list.append(str(task.quality['observing-conditions']))
-        list.append("(link)")
-        list.append("(link)")
-        list.append("(link)")
-        list.append("(link)")
+        list.append(str(task.quality_json['uv-coverage']))
+        list.append(str(task.quality_json['sensitivity']))
+        list.append(str(task.quality_json['observing-conditions']))
+        list.append("-")
+        list.append("-")
+        list.append("-")
+        list.append("-")
+
+    except Exception as err:
+        pass
+
+    return list
+
+
+def convert_quality_to_shortlist_for_template(task):
+    list = []
+
+    try:
+        list.append(str(task.quality_json['uv-coverage']))
+        list.append(str(task.quality_json['sensitivity']))
+        list.append(str(task.quality_json['observing-conditions']))
 
     except Exception as err:
         pass
@@ -45,6 +59,7 @@ class Task(models.Model):
     environment = models.CharField(max_length=255, blank=True, null=True)
     new_status = models.CharField(max_length=50, default="defining", null=True)
     status = models.CharField(db_index=True, default="unknown", max_length=50,blank=True, null=True)
+    quality = models.CharField(max_length=10,blank=True, null=True)
 
     resume = models.BooleanField(verbose_name="Resume", default=True)
     creationTime = models.DateTimeField(verbose_name="CreationTime",default=datetime.utcnow, blank=True)
@@ -59,7 +74,7 @@ class Task(models.Model):
     inputs = models.JSONField(null=True, blank=True)
     outputs = models.JSONField(null=True, blank=True)
     metrics = models.JSONField(null=True, blank=True)
-
+    remarks = models.JSONField(null=True, blank=True)
     meta_scheduling = models.JSONField(null=True, blank=True)
 
     size_to_process = models.PositiveBigIntegerField(default=0, null=True, blank=True)
@@ -90,20 +105,27 @@ class Task(models.Model):
 
     @property
     def has_quality(self):
-        # todo: check if there is a 'quality' structure in the 'task.outputs'
+        # todo: check if there is a 'quality' structure in the 'task.outputs'?
         try:
-            quality = self.outputs[0]['quality']
+            quality = self.outputs['quality']
             return True
         except:
-            return False
+            try:
+                quality = self.outputs[0]['quality']
+                return True
+            except:
+                return False
 
     @property
-    def quality(self):
-        # todo: check if there is a 'quality' structure in the 'task.outputs'
+    def quality_json(self):
+        # todo: check if there is a 'quality' structure in the 'task.outputs'?
         try:
-            return self.outputs[0]['quality']
+            return self.outputs['quality']
         except:
-            return None
+            try:
+                return self.outputs[0]['quality']
+            except:
+                return None
 
     @property
     def quality_as_list(self):
@@ -113,6 +135,14 @@ class Task(models.Model):
         except:
             return None
 
+    @property
+    def quality_as_shortlist(self):
+        try:
+            q = convert_quality_to_shortlist_for_template(self)
+            return q
+        except:
+            return None
+
 class LogEntry(models.Model):
     cpu_cycles = models.IntegerField(null=True,blank=True)
     wall_clock_time = models.IntegerField(null=True,blank=True)
diff --git a/atdb/taskdatabase/serializers.py b/atdb/taskdatabase/serializers.py
index 238477988d78718c97b40874b50ff9b9414be2f8..45bbd2823f400d25956676c681fc5fbaff4b5e61 100644
--- a/atdb/taskdatabase/serializers.py
+++ b/atdb/taskdatabase/serializers.py
@@ -42,8 +42,8 @@ class TaskWriteSerializer(serializers.ModelSerializer):
                   'project','sas_id','priority','purge_policy','resume',
                   'new_workflow_id','new_workflow_uri','workflow',
                   'stage_request_id',
-                  'status','new_status',
-                  'inputs','outputs','metrics','status_history',
+                  'status','new_status','quality',
+                  'inputs','outputs','metrics','status_history','remarks',
                   'size_to_process','size_processed','total_processing_time',
                   'log_entries','meta_scheduling','environment'
                   )
@@ -97,7 +97,7 @@ class TaskReadSerializer(serializers.ModelSerializer):
                   'project','sas_id','priority','purge_policy','resume',
                   'workflow',
                   'stage_request_id',
-                  'status','new_status',
+                  'status','new_status','quality',
                   'inputs','outputs','metrics','status_history',
                   'size_to_process', 'size_processed', 'total_processing_time',
                   'log_entries','meta_scheduling','environment'
@@ -128,7 +128,7 @@ class TaskReadSerializerFast(serializers.ModelSerializer):
                   'project','sas_id','priority','purge_policy','resume',
                   'workflow',
                   'stage_request_id',
-                  'status','new_status',
+                  'status','new_status','quality',
                   'inputs','outputs','metrics',
                   'size_to_process', 'size_processed', 'total_processing_time',
 
diff --git a/atdb/taskdatabase/services/algorithms.py b/atdb/taskdatabase/services/algorithms.py
index 60c8445f96d0c6f8e51eb0310385f45781c9dfc0..0016fef157a24d96f30930f6f352246ee5e29c53 100644
--- a/atdb/taskdatabase/services/algorithms.py
+++ b/atdb/taskdatabase/services/algorithms.py
@@ -117,13 +117,13 @@ def convert_quality_to_html(task):
         results += "<tr><td><b>ATDB Filter</b></td><td>" + str(task.filter) + "</td></tr>"
         results += "<tr><td><b>Input Type</b></td><td>" + "???" + "</td></tr>"
         results += "<tr><td><b>NrJobs (MSs)</b></td><td>" + "???" + "</td></tr>"
-        results += "<tr><td><b>QA uv-coverage</b></td><td>" + str(task.quality['uv-coverage']) + "</td></tr>"
-        results += "<tr><td><b>QA sensitivity</b></td><td>" + str(task.quality['sensitivity']) + "</td></tr>"
-        results += "<tr><td><b>QA observing-conditions</b></td><td>" + str(task.quality['observing-conditions']) + "</td></tr>"
-        results += "<tr><td><b>QA diagnostic plots</b></td><td>" + "(link)" + "</td></tr>"
-        results += "<tr><td><b>Workflow summary parset</b></td><td>" + "(link)" + "</td></tr>"
-        results += "<tr><td><b>Summary logs</b></td><td>" + "(link)" + "</td></tr>"
-        results += "<tr><td><b>QA summary.hf5</b></td><td>" + "(link)" + "</td></tr>"
+        results += "<tr><td><b>QA uv-coverage</b></td><td>" + str(task.quality_json['uv-coverage']) + "</td></tr>"
+        results += "<tr><td><b>QA sensitivity</b></td><td>" + str(task.quality_json['sensitivity']) + "</td></tr>"
+        results += "<tr><td><b>QA observing-conditions</b></td><td>" + str(task.quality_json['observing-conditions']) + "</td></tr>"
+        results += "<tr><td><b>QA diagnostic plots</b></td><td>" + "-" + "</td></tr>"
+        results += "<tr><td><b>Workflow summary parset</b></td><td>" + "-" + "</td></tr>"
+        results += "<tr><td><b>Summary logs</b></td><td>" + "-" + "</td></tr>"
+        results += "<tr><td><b>QA summary.hf5</b></td><td>" + "-" + "</td></tr>"
 
     except Exception as err:
         results = "<tr><td>" + str(err) + "</td></tr>"
diff --git a/atdb/taskdatabase/static/taskdatabase/ATDB-LDV Workflow Diagram.png b/atdb/taskdatabase/static/taskdatabase/ATDB-LDV Workflow Diagram.png
index 9640689bf19cd81dd6a93813f02dbad2f433ce35..32eb9a99e93f9fc7f7310005c55f7f21e14c4540 100644
Binary files a/atdb/taskdatabase/static/taskdatabase/ATDB-LDV Workflow Diagram.png and b/atdb/taskdatabase/static/taskdatabase/ATDB-LDV Workflow Diagram.png differ
diff --git a/atdb/taskdatabase/templates/taskdatabase/base.html b/atdb/taskdatabase/templates/taskdatabase/base.html
index f16ec634befd882d8302cbd2e955e0c62bf2fa07..25e84e89d43eba11b909f17da0df436b233e6455 100644
--- a/atdb/taskdatabase/templates/taskdatabase/base.html
+++ b/atdb/taskdatabase/templates/taskdatabase/base.html
@@ -49,7 +49,6 @@
 
                 {% if user.is_authenticated %}
                     <li><a class="nav-link" href="{% url 'task-details'%}">Task Details</a></li>
-                    <li><a class="nav-link" href="{% url 'quality' %}">Quality</a></li>
                 {% endif %}
 
                 <li><a class="nav-link" href="{% url 'dashboard' 'active_nores_nofilter' %}">Dashboard</a></li>
@@ -58,6 +57,11 @@
 {% comment %}
                 <li><a class="nav-link" href="{% url 'query2' request|current_query_params %}">Filter2</a></li>
 {% endcomment %}
+
+                <li><a class="nav-link" href="{% url 'quality' %}">Quality</a></li>
+                <li><a class="nav-link" href="{% url 'validation' %}">Validation</a></li>
+                <li><a class="nav-link" href="{% url 'failures' %}">Failures</a></li>
+
                 <li><a class="nav-link" href="{% url 'monitoring' %}">Monitoring</a></li>
 
                 <li><a class="nav-link" href="{% url 'diagram' %}">Diagram</a></li>
diff --git a/atdb/taskdatabase/templates/taskdatabase/failures/failures_page.html b/atdb/taskdatabase/templates/taskdatabase/failures/failures_page.html
new file mode 100644
index 0000000000000000000000000000000000000000..6f67507a5f61f7580aa9088f0217dec20ea09d5b
--- /dev/null
+++ b/atdb/taskdatabase/templates/taskdatabase/failures/failures_page.html
@@ -0,0 +1,52 @@
+{% extends 'taskdatabase/base.html' %}
+{% load static %}
+
+{% block myBlock %}
+
+<div class="container-fluid details-container">
+      <div class="card">
+       <div class="card-body">
+        <div class="row">
+            <div class="col-8">
+                <h3>Failures</h3>
+                These are all the tasks that failed.
+                Click 'Retry' to restart a specific step in the workflow.
+                <a class="nav-link" href="{% url 'diagram' %}">See workflow diagram</a>
+                <hr>
+            </div>
+        </div>
+        <div class="row">
+        <div class="col-sm-12 col-md-12 col-lg-12">
+            {% include 'taskdatabase/pagination.html' %}
+            &nbsp;
+            {% if my_tasks %}
+            <div class="panel panel-success">
+
+                <div class="panel-body">
+
+                    <table class="table table-striped table-bordered table-sm">
+                        <thead>
+                        {% include 'taskdatabase/failures/tasks_failures_headers.html' %}
+                        </thead>
+                        <tbody>
+                        {% include 'taskdatabase/failures/tasks_failures.html' %}
+                        </tbody>
+                    </table>
+                    {% else %}
+                    <p>No recent Tasks.</p>
+                    {% endif %}
+
+                </div>
+            </div>
+            {% include 'taskdatabase/pagination.html' %}
+           </div>
+        </div>
+       </div>
+      </div>
+</div>
+
+{% include 'taskdatabase/localstorage_scripts.html' %}
+
+
+{% endblock %}
+
diff --git a/atdb/taskdatabase/templates/taskdatabase/failures/tasks_failures.html b/atdb/taskdatabase/templates/taskdatabase/failures/tasks_failures.html
new file mode 100644
index 0000000000000000000000000000000000000000..796d6e526453ec0dacf15db6dbc9a6735d539c20
--- /dev/null
+++ b/atdb/taskdatabase/templates/taskdatabase/failures/tasks_failures.html
@@ -0,0 +1,46 @@
+{% load static %}
+{% for task in my_tasks %}
+
+        {% if task.status != "removed_invisible" %}
+        <div class="row">
+            <tr class="{{ task.status }}">
+
+                <td>
+                    <a href="{{ task.get_absolute_url }}" target="_blank">{{ task.id }} </a>
+                </td>
+                <td>
+                    {% if user.is_authenticated %}
+                        <a class="btn btn-primary btn-sm"
+                           href="{% url 'task-details' task.id my_tasks.number %}"
+                           data-popup-url="{% url 'task-details' task.id my_tasks.number %}"
+                           ><i class="fas fa-list"></i> Details
+                        </a>&nbsp;
+                    {% endif %}
+                </td>
+
+                {% if task.resume  %}
+                    <td class="bigger">{{ task.status }}</td>
+                {% endif %}
+                {% if not task.resume  %}
+                    <td class="bigger">{{ task.status }} (holding)</td>
+                {% endif %}
+
+                <td>{{ task.project }}</td>
+                <td>{{ task.sas_id }}</td>
+
+                <td>{{ task.filter }} </td>
+                {% if task.status == "processed_failed" %}
+                    <td>
+                        <a href="{% url 'task-setstatus-view' task.pk 'fetched' my_tasks.number %}" class="btn btn-warning btn-sm" role="button"><b><i class="fas fa-sync-alt"></i> Retry</b></a>
+                    </td>
+                {% endif %}
+                <td>
+
+                </tr>
+            </div>
+        {% endif %}
+
+{% endfor %}
+
+{% include "taskdatabase/modal/modal_script.html" %}
+{% include "taskdatabase/modal/modal.html" %}
\ No newline at end of file
diff --git a/atdb/taskdatabase/templates/taskdatabase/failures/tasks_failures_headers.html b/atdb/taskdatabase/templates/taskdatabase/failures/tasks_failures_headers.html
new file mode 100644
index 0000000000000000000000000000000000000000..5bf48b688419c58da166d4d53495647c43c4726c
--- /dev/null
+++ b/atdb/taskdatabase/templates/taskdatabase/failures/tasks_failures_headers.html
@@ -0,0 +1,10 @@
+<tr>
+    <th>ID</th>
+    <th>Details</th>
+
+    <th>Status</th>
+    <th>Project</th>
+    <th>SAS_ID</th>
+    <th>filter</th>
+    <th>Actions</th>
+</tr>
\ No newline at end of file
diff --git a/atdb/taskdatabase/templates/taskdatabase/index.html b/atdb/taskdatabase/templates/taskdatabase/index.html
index 096baa9294dcdeca33762e90bf41de489a39495a..0e2c23da9e97ddd297c95589df15a6642e7f2eb8 100644
--- a/atdb/taskdatabase/templates/taskdatabase/index.html
+++ b/atdb/taskdatabase/templates/taskdatabase/index.html
@@ -34,7 +34,7 @@
         {% include 'taskdatabase/pagination.html' %}
        </div>
     </div>
-    <p class="footer"> Version 1.0.0 (8 mar 2021 - 17:00)
+    <p class="footer"> Version 1.0.0 (1 apr 2021 - 12:00)
 
 </div>
 
diff --git a/atdb/taskdatabase/templates/taskdatabase/quality_page.html b/atdb/taskdatabase/templates/taskdatabase/quality/quality_page.html
similarity index 80%
rename from atdb/taskdatabase/templates/taskdatabase/quality_page.html
rename to atdb/taskdatabase/templates/taskdatabase/quality/quality_page.html
index f837b06804ea32d38242d10b5d7b9f7c887b2743..6d3b8881cef4dc1a1a301f1dd9ad9e1609b3543c 100644
--- a/atdb/taskdatabase/templates/taskdatabase/quality_page.html
+++ b/atdb/taskdatabase/templates/taskdatabase/quality/quality_page.html
@@ -9,6 +9,8 @@
         <div class="row">
             <div class="col-8">
                 <h3>Quality Diagnostics</h3>
+                This overview shows the Quality Diagnostics of all the task that have this information.
+                <hr>
             </div>
         </div>
         <div class="row">
@@ -22,10 +24,10 @@
 
                     <table class="table table-striped table-bordered table-sm">
                         <thead>
-                        {% include 'taskdatabase/tasks_quality_headers.html' %}
+                        {% include 'taskdatabase/quality/tasks_quality_headers.html' %}
                         </thead>
                         <tbody>
-                        {% include 'taskdatabase/tasks_quality.html' %}
+                        {% include 'taskdatabase/quality/tasks_quality.html' %}
                         </tbody>
                     </table>
                     {% else %}
diff --git a/atdb/taskdatabase/templates/taskdatabase/tasks_quality.html b/atdb/taskdatabase/templates/taskdatabase/quality/tasks_quality.html
similarity index 100%
rename from atdb/taskdatabase/templates/taskdatabase/tasks_quality.html
rename to atdb/taskdatabase/templates/taskdatabase/quality/tasks_quality.html
diff --git a/atdb/taskdatabase/templates/taskdatabase/tasks_quality_headers.html b/atdb/taskdatabase/templates/taskdatabase/quality/tasks_quality_headers.html
similarity index 100%
rename from atdb/taskdatabase/templates/taskdatabase/tasks_quality_headers.html
rename to atdb/taskdatabase/templates/taskdatabase/quality/tasks_quality_headers.html
diff --git a/atdb/taskdatabase/templates/taskdatabase/validation/tasks_validation.html b/atdb/taskdatabase/templates/taskdatabase/validation/tasks_validation.html
new file mode 100644
index 0000000000000000000000000000000000000000..e589a047527954e808536924de8af1ec615e0e1e
--- /dev/null
+++ b/atdb/taskdatabase/templates/taskdatabase/validation/tasks_validation.html
@@ -0,0 +1,55 @@
+{% load static %}
+{% for task in my_tasks %}
+
+        {% if task.status != "removed_invisible" %}
+        <div class="row">
+            <tr class="{{ task.status }}">
+
+                <td>
+                    <a href="{{ task.get_absolute_url }}" target="_blank">{{ task.id }} </a>
+                </td>
+                <td>
+                    {% if user.is_authenticated %}
+                        <a class="btn btn-primary btn-sm"
+                           href="{% url 'task-details' task.id my_tasks.number %}"
+                           data-popup-url="{% url 'task-details' task.id my_tasks.number %}"
+                           ><i class="fas fa-list"></i> Details
+                        </a>&nbsp;
+                        {% if task.has_quality %}
+                            <a class="open-modal btn btn-primary btn-sm"
+                               href="{% url 'task-quality' task.id my_tasks.number %}"
+                               data-popup-url="{% url 'task-quality' task.id my_tasks.number %}"
+                               ><i class="fas fa-balance-scale-right"></i> Quality
+                            </a>&nbsp;
+                        {% endif %}
+                    {% endif %}
+                </td>
+
+                <td>{{ task.project }}</td>
+                <td>{{ task.sas_id }}</td>
+
+                <td>{{ task.filter }} </td>
+
+                {% if task.has_quality %}
+                    {% for value in task.quality_as_shortlist %}
+                        <td>{{value}}</td>
+                     {% endfor %}
+                {% else %}
+                        <td>-</td><td>-</td><td>-</td>
+                {% endif %}
+
+                <td>
+                    <a href="{% url 'task-validate-view' task.pk 'poor' 'validated' my_tasks.number %}" class="btn btn-danger btn-sm" role="button"><i class="fas fa-check"></i> Poor</a>
+                    <a href="{% url 'task-validate-view' task.pk 'moderate' 'validated' my_tasks.number %}" class="btn btn-warning btn-sm" role="button"><i class="fas fa-check"></i> Moderate</a>
+                    <a href="{% url 'task-validate-view' task.pk 'good' 'validated' my_tasks.number %}" class="btn btn-success btn-sm" role="button"><i class="fas fa-check"></i> Good</a>
+
+                </td>
+
+                </tr>
+            </div>
+        {% endif %}
+
+{% endfor %}
+
+{% include "taskdatabase/modal/modal_script.html" %}
+{% include "taskdatabase/modal/modal.html" %}
\ No newline at end of file
diff --git a/atdb/taskdatabase/templates/taskdatabase/validation/tasks_validation_headers.html b/atdb/taskdatabase/templates/taskdatabase/validation/tasks_validation_headers.html
new file mode 100644
index 0000000000000000000000000000000000000000..bb346737bf9c7a53182045cb295e7ce74b87df17
--- /dev/null
+++ b/atdb/taskdatabase/templates/taskdatabase/validation/tasks_validation_headers.html
@@ -0,0 +1,12 @@
+<tr>
+    <th>ID</th>
+    <th>Details</th>
+
+    <th>Project</th>
+    <th>SAS_ID</th>
+    <th>filter</th>
+    <th>uv-coverage</th>
+    <th>Sensitivity</th>
+    <th>Conditions</th>
+    <th>Choose a Quality</th>
+</tr>
\ No newline at end of file
diff --git a/atdb/taskdatabase/templates/taskdatabase/validation/validation_page.html b/atdb/taskdatabase/templates/taskdatabase/validation/validation_page.html
new file mode 100644
index 0000000000000000000000000000000000000000..ad60380d51bacdc879330f0e43bf1f68582ee9ea
--- /dev/null
+++ b/atdb/taskdatabase/templates/taskdatabase/validation/validation_page.html
@@ -0,0 +1,53 @@
+{% extends 'taskdatabase/base.html' %}
+{% load static %}
+
+{% block myBlock %}
+
+<div class="container-fluid details-container">
+      <div class="card">
+       <div class="card-body">
+        <div class="row">
+            <div class="col-8">
+                <h3>Validation</h3>
+                These are the tasks in status 'stored' that can be validated. Click one of the quality buttons to validate.
+                <td>
+                     {% include 'taskdatabase/filter/search.html' %}
+                 </td>
+                <hr>
+            </div>
+        </div>
+        <div class="row">
+        <div class="col-sm-12 col-md-12 col-lg-12">
+            {% include 'taskdatabase/pagination.html' %}
+            &nbsp;
+            {% if my_tasks %}
+            <div class="panel panel-success">
+
+                <div class="panel-body">
+
+                    <table class="table table-striped table-bordered table-sm">
+                        <thead>
+                        {% include 'taskdatabase/validation/tasks_validation_headers.html' %}
+                        </thead>
+                        <tbody>
+                        {% include 'taskdatabase/validation/tasks_validation.html' %}
+                        </tbody>
+                    </table>
+                    {% else %}
+                    <p>No recent Tasks.</p>
+                    {% endif %}
+
+                </div>
+            </div>
+            {% include 'taskdatabase/pagination.html' %}
+           </div>
+        </div>
+       </div>
+      </div>
+</div>
+
+{% include 'taskdatabase/localstorage_scripts.html' %}
+
+
+{% endblock %}
+
diff --git a/atdb/taskdatabase/urls.py b/atdb/taskdatabase/urls.py
index 622bf459fedf36af6799beaa441c93d340fcdebd..ad825a43387d0a773a0659b8a3691ee5c5a266ac 100644
--- a/atdb/taskdatabase/urls.py
+++ b/atdb/taskdatabase/urls.py
@@ -16,6 +16,8 @@ urlpatterns = [
     path('', views.IndexView.as_view(), name='index'),
     path('postprocessing-tasks', views.PostProcessingTasksView.as_view(), name='postprocessing-tasks'),
     path('quality', views.ShowQualityPage.as_view(), name='quality'),
+    path('validation', views.ShowValidationPage.as_view(), name='validation'),
+    path('failures', views.ShowFailuresPage.as_view(), name='failures'),
 
     path('task_details/<int:id>/<page>', views.TaskDetails, name='task-details'),
     path('task_details/', views.TaskDetails, name='task-details'),
@@ -79,6 +81,8 @@ urlpatterns = [
     path('tasks/<int:pk>/setstatus/<new_status>/<page>', views.TaskSetStatus, name='task-setstatus-view'),
     path('tasks/<int:pk>/setstatus/<new_status>', views.TaskSetStatus, name='task-details-setstatus'),
 
+    path('tasks/<int:pk>/validate/<quality>/<new_status>/<page>', views.TaskValidate, name='task-validate-view'),
+
     path('tasks/<int:pk>/change_priority/<priority_change>/<page>', views.ChangePriority, name='task-change-priority'),
     path('tasks/<int:pk>/change_priority/<priority_change>', views.ChangePriority, name='task-change-priority'),
     path('tasks/sort-tasks/<sort>', views.SortTasks, name='sort-tasks'),
diff --git a/atdb/taskdatabase/views.py b/atdb/taskdatabase/views.py
index 37456f44e39dfc305fb18cfb8cf17d593cca9d53..f3ccb8cafb601b5121f12cbe912f543e23941fbe 100644
--- a/atdb/taskdatabase/views.py
+++ b/atdb/taskdatabase/views.py
@@ -327,16 +327,16 @@ class PostProcessingTasksView(ListView):
 
 class ShowQualityPage(ListView):
     """
-    This is the main view of ATDB. It shows a pagination list of tasks, sorted by creationTime.
+    This shows the tasks that have a quality statistics in its outputs[0]['quality'].
+    Not that the global filter is also applied
     """
-    template_name = 'taskdatabase/quality_page.html'
+    template_name = 'taskdatabase/quality/quality_page.html'
 
     # by default this returns the list in an object called object_list, so use 'object_list' in the html page.
     # but if 'context_object_name' is defined, then this returned list is named and can be accessed that way in html.
     context_object_name = 'my_tasks'
 
     def get_queryset(self):
-        status = self.request.GET.get('status')
         search_box = self.request.GET.get('search_box', None)
 
         # get the sort variable from the session or use default
@@ -359,9 +359,68 @@ class ShowQualityPage(ListView):
             tasks = get_searched_tasks(search_box, sort)
 
         # exclude the tasks without quality information
-        tasks = tasks.exclude(outputs__isnull=True)
-        tasks = tasks.exclude(outputs__0__quality__isnull=True)
+        #tasks = tasks.exclude(outputs__isnull=True)
+        tasks = tasks.exclude(outputs__quality__isnull=True)
+        #tasks = tasks.exclude(outputs__0__quality__isnull=True)
+
+        paginator = Paginator(tasks, config.TASKS_PER_PAGE)  # Show 50 tasks per page
+        page = self.request.GET.get('page')
+
+        try:
+            # check if there was a page on the session, if so, use it.
+            if page == None:
+                page = self.request.session['page']
+                self.request.session['page'] = None
+        except:
+            pass
 
+        try:
+            tasks = paginator.page(page)
+        except PageNotAnInteger:
+            # If page is not an integer, deliver first page.
+            tasks = paginator.page(1)
+        except EmptyPage:
+            # If page is out of range (e.g. 9999), deliver last page of results.
+            tasks = paginator.page(paginator.num_pages)
+
+        return tasks
+
+
+class ShowValidationPage(ListView):
+    """
+    This shows the tasks that are ready for validation
+    Not that the global filter is also applied
+    """
+    template_name = 'taskdatabase/validation/validation_page.html'
+
+    # by default this returns the list in an object called object_list, so use 'object_list' in the html page.
+    # but if 'context_object_name' is defined, then this returned list is named and can be accessed that way in html.
+    context_object_name = 'my_tasks'
+
+    def get_queryset(self):
+        search_box = self.request.GET.get('search_box', None)
+
+        # get the sort variable from the session or use default
+        try:
+            sort = self.request.session['sort']
+        except:
+            sort = '-creationTime'
+
+        tasks = Task.objects.filter(status__icontains='stored').order_by(sort)
+
+        # check if there is a 'task_filter' put on the session
+        try:
+            filter = self.request.session['task_filter']
+            if filter != 'all':
+                tasks = get_searched_tasks(filter, sort)
+        except:
+            pass
+
+        if (search_box is not None):
+            tasks = get_searched_tasks(search_box, sort)
+
+        # exclude the tasks without quality information
+        tasks = tasks.exclude(status__icontains="failed")
 
         paginator = Paginator(tasks, config.TASKS_PER_PAGE)  # Show 50 tasks per page
         page = self.request.GET.get('page')
@@ -386,6 +445,64 @@ class ShowQualityPage(ListView):
         return tasks
 
 
+class ShowFailuresPage(ListView):
+    """
+    This shows the tasks that are ready for validation
+    Not that the global filter is also applied
+    """
+    template_name = 'taskdatabase/failures/failures_page.html'
+
+    # by default this returns the list in an object called object_list, so use 'object_list' in the html page.
+    # but if 'context_object_name' is defined, then this returned list is named and can be accessed that way in html.
+    context_object_name = 'my_tasks'
+
+    def get_queryset(self):
+        status = self.request.GET.get('status')
+        search_box = self.request.GET.get('search_box', None)
+
+        # get the sort variable from the session or use default
+        try:
+            sort = self.request.session['sort']
+        except:
+            sort = '-creationTime'
+
+        tasks = Task.objects.filter(status__icontains='failed').order_by(sort)
+
+        # check if there is a 'task_filter' put on the session
+        try:
+            filter = self.request.session['task_filter']
+            if filter != 'all':
+                tasks = get_searched_tasks(filter, sort)
+        except:
+            pass
+
+        if (search_box is not None):
+            tasks = get_searched_tasks(search_box, sort)
+
+        paginator = Paginator(tasks, config.TASKS_PER_PAGE)  # Show 50 tasks per page
+        page = self.request.GET.get('page')
+
+        try:
+            # check if there was a page on the session, if so, use it.
+            if page == None:
+                page = self.request.session['page']
+                self.request.session['page'] = None
+        except:
+            pass
+
+        try:
+            tasks = paginator.page(page)
+        except PageNotAnInteger:
+            # If page is not an integer, deliver first page.
+            tasks = paginator.page(1)
+        except EmptyPage:
+            # If page is out of range (e.g. 9999), deliver last page of results.
+            tasks = paginator.page(paginator.num_pages)
+
+        return tasks
+
+
+
 def get_searched_tasks(search, sort):
     tasks = Task.objects.filter(
         Q(id__contains=search) |
@@ -790,6 +907,25 @@ def TaskSetStatus(request, pk, new_status, page=0):
         return redirect('/atdb/?page=' + page)
 
 
+@login_required
+def TaskValidate(request, pk, quality, new_status, page=0):
+    model = Task
+    task = Task.objects.get(pk=pk)
+    task.new_status = new_status
+
+    #todo: database change
+    #task.quality = quality
+
+    task.save()
+
+    if page == 0:
+        # redirect to details screen
+        return redirect('/atdb/validation')
+    else:
+        # redirect to tasks list
+        return redirect('/atdb/validation?page=' + page)
+
+
 # set a filter value in the session, used later by the 'get_searched_tasks' mechanism
 def TaskSetFilter(request, filter):
     request.session['task_filter'] = filter