diff --git a/atdb/atdb/static/admin/js/vendor/jquery/jquery.js b/atdb/atdb/static/admin/js/vendor/jquery/jquery.js
index 50937333b99a5e168ac9e8292b22edd7e96c3e6a..3dc5efb8857d786491e3b50bec0aefbb9e49ddfd 100644
--- a/atdb/atdb/static/admin/js/vendor/jquery/jquery.js
+++ b/atdb/atdb/static/admin/js/vendor/jquery/jquery.js
@@ -1363,7 +1363,7 @@ setDocument = Sizzle.setDocument = function( node ) {
 
 			// Webkit/Opera - :checked should return selected option elements
 			// http://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked
-			// IE8 throws error here and will not see later tests
+			// IE8 throws error here and will not see later tests_module
 			if ( !el.querySelectorAll( ":checked" ).length ) {
 				rbuggyQSA.push( ":checked" );
 			}
@@ -1398,7 +1398,7 @@ setDocument = Sizzle.setDocument = function( node ) {
 			}
 
 			// FF 3.5 - :enabled/:disabled and hidden elements (hidden elements are still enabled)
-			// IE8 throws error here and will not see later tests
+			// IE8 throws error here and will not see later tests_module
 			if ( el.querySelectorAll( ":enabled" ).length !== 2 ) {
 				rbuggyQSA.push( ":enabled", ":disabled" );
 			}
@@ -6030,7 +6030,7 @@ function cloneCopyEvent( src, dest ) {
 	}
 }
 
-// Fix IE bugs, see support tests
+// Fix IE bugs, see support tests_module
 function fixInput( src, dest ) {
 	var nodeName = dest.nodeName.toLowerCase();
 
@@ -6448,7 +6448,7 @@ var rboxStyle = new RegExp( cssExpand.join( "|" ), "i" );
 
 ( function() {
 
-	// Executing both pixelPosition & boxSizingReliable tests require only one layout
+	// Executing both pixelPosition & boxSizingReliable tests_module require only one layout
 	// so they're executed at the same time to save the second computation.
 	function computeStyleTests() {
 
diff --git a/atdb/atdb/static/admin/js/vendor/xregexp/xregexp.js b/atdb/atdb/static/admin/js/vendor/xregexp/xregexp.js
index ded6f6faa274657b65b444356ee78ad914595bc5..2d81d74d6ad38aaec350e17f79dfc8fc4eda31c2 100644
--- a/atdb/atdb/static/admin/js/vendor/xregexp/xregexp.js
+++ b/atdb/atdb/static/admin/js/vendor/xregexp/xregexp.js
@@ -3201,7 +3201,7 @@ function runTokens(pattern, flags, pos, scope, context) {
                 output: t.handler.call(context, match, scope, flags),
                 reparse: t.reparse
             };
-            // Finished with token tests
+            // Finished with token tests_module
             break;
         }
     }
@@ -3401,7 +3401,7 @@ XRegExp.version = '3.2.0';
 // Public methods
 // ==--------------------------==
 
-// Intentionally undocumented; used in tests and addons
+// Intentionally undocumented; used in tests_module and addons
 XRegExp._clipDuplicates = clipDuplicates;
 XRegExp._hasNativeFlag = hasNativeFlag;
 XRegExp._dec = dec;
@@ -3515,7 +3515,7 @@ XRegExp.cache = function(pattern, flags) {
     );
 };
 
-// Intentionally undocumented; used in tests
+// Intentionally undocumented; used in tests_module
 XRegExp.cache.flush = function(cacheName) {
     if (cacheName === 'patterns') {
         // Flush the pattern cache used by the `XRegExp` constructor
diff --git a/atdb/taskdatabase/models.py b/atdb/taskdatabase/models.py
index b69426a659aead5e759977d6c50337b1c1273f23..dc4511d4f732946528fdb3ace87554c9c00a5b15 100644
--- a/atdb/taskdatabase/models.py
+++ b/atdb/taskdatabase/models.py
@@ -99,7 +99,7 @@ class Task(models.Model):
     quality = models.CharField(max_length=10,blank=True, null=True)
     calculated_qualities = models.JSONField(null=True, blank=True)
     resume = models.BooleanField(verbose_name="Resume", default=True)
-    creationTime = models.DateTimeField(verbose_name="CreationTime",default=datetime.utcnow, blank=True)
+    creationTime = models.DateTimeField(verbose_name="CreationTime",default=timezone.now, blank=True)
 
     priority = models.IntegerField(default=100, null=True)
     purge_policy = models.CharField(max_length=5, default="no", blank=True, null=True)
@@ -336,7 +336,7 @@ class LogEntry(models.Model):
 
 class Status(models.Model):
     name = models.CharField(max_length=50, default="unknown")
-    timestamp = models.DateTimeField(default=datetime.utcnow, blank=True)
+    timestamp = models.DateTimeField(default=timezone.now, blank=True)
 
     # relationships
     task = models.ForeignKey(Task, related_name='status_history', on_delete=models.CASCADE, null=False)
diff --git a/atdb/taskdatabase/tests/__init__.py b/atdb/taskdatabase/tests/__init__.py
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/atdb/taskdatabase/tests.py b/atdb/taskdatabase/tests/test_calculated_qualities.py
similarity index 99%
rename from atdb/taskdatabase/tests.py
rename to atdb/taskdatabase/tests/test_calculated_qualities.py
index 5dfb825fd903f02becccc6c2e9424618da75a36b..b2b5bfa596460ea9019df750e49925a4586c7c1a 100644
--- a/atdb/taskdatabase/tests.py
+++ b/atdb/taskdatabase/tests/test_calculated_qualities.py
@@ -1,7 +1,9 @@
 from django.test import TestCase
 import json
-from .services import calculated_qualities as qualities
-from .models import Configuration, Task
+
+from taskdatabase.services import calculated_qualities as qualities
+from taskdatabase.models import Configuration, Task
+
 
 class TestCalculatedQualities(TestCase):
 
diff --git a/atdb/taskdatabase/tests/test_views_config_page.py b/atdb/taskdatabase/tests/test_views_config_page.py
new file mode 100644
index 0000000000000000000000000000000000000000..644264c80f017286b8d5d97a991f7579f6ce40bb
--- /dev/null
+++ b/atdb/taskdatabase/tests/test_views_config_page.py
@@ -0,0 +1,30 @@
+from django.test import TestCase
+from django.urls import reverse
+
+from taskdatabase.models import Task, Workflow
+class ConfigPageViewTest(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=12345, status='finished', workflow = workflow)
+        Task.objects.get_or_create(sas_id=12345, status='finished', workflow = workflow)
+        Task.objects.get_or_create(sas_id=12345, status='stored', workflow = workflow)
+
+    def test_url_exists_at_desired_location(self):
+        response = self.client.get('/atdb/config/')
+        self.assertEqual(response.status_code, 200)
+
+    def test_url_accessible_by_name(self):
+        response = self.client.get(reverse('config'))
+        self.assertEqual(response.status_code, 200)
+
+    def test_uses_correct_template(self):
+        response = self.client.get(reverse('config'))
+        self.assertEqual(response.status_code, 200)
+        self.assertTemplateUsed(response, 'taskdatabase/config.html')
\ No newline at end of file
diff --git a/atdb/taskdatabase/tests/test_views_dashboard_page.py b/atdb/taskdatabase/tests/test_views_dashboard_page.py
new file mode 100644
index 0000000000000000000000000000000000000000..ae4a59390b5599b650384ac48f8363216d2a8721
--- /dev/null
+++ b/atdb/taskdatabase/tests/test_views_dashboard_page.py
@@ -0,0 +1,30 @@
+from django.test import TestCase
+from django.urls import reverse
+
+from taskdatabase.models import Task, Workflow
+class DashboardPageViewTest(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=12345, status='finished', workflow = workflow)
+        Task.objects.get_or_create(sas_id=12345, status='finished', workflow = workflow)
+        Task.objects.get_or_create(sas_id=12345, status='stored', workflow = workflow)
+
+    def test_url_exists_at_desired_location_active_nores_nofilter(self):
+        response = self.client.get('/atdb/dashboard/active_nores_nofilter')
+        self.assertEqual(response.status_code, 200)
+
+    def test_url_exists_at_desired_location_all_resources_applyfilter(self):
+        response = self.client.get('/atdb/dashboard/all_resources_applyfilter')
+        self.assertEqual(response.status_code, 200)
+
+    def test_uses_correct_template(self):
+        response = self.client.get('/atdb/dashboard/active_nores_nofilter')
+        self.assertEqual(response.status_code, 200)
+        self.assertTemplateUsed(response, 'taskdatabase/dashboard/dashboard.html')
\ No newline at end of file
diff --git a/atdb/taskdatabase/tests/test_views_details_page.py b/atdb/taskdatabase/tests/test_views_details_page.py
new file mode 100644
index 0000000000000000000000000000000000000000..fec78527b081ac1c9e5fafca954f2fa2f967e84f
--- /dev/null
+++ b/atdb/taskdatabase/tests/test_views_details_page.py
@@ -0,0 +1,27 @@
+from django.test import TestCase
+from django.urls import reverse
+
+from taskdatabase.models import Task, Workflow
+class DetailsPageViewTest(TestCase):
+
+    @classmethod
+    def setUp(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=12345, status='finished', workflow=workflow)
+
+    def test_url_exists_at_desired_location(self):
+        # extract the task
+        task = Task.objects.all()[0]
+        response = self.client.get(f'/atdb/task_details/{task.id}/1')
+        self.assertEqual(response.status_code, 200)
+
+
+    def test_uses_correct_template(self):
+        task = Task.objects.all()[0]
+        response = self.client.get(f'/atdb/task_details/{task.id}/1')
+        self.assertEqual(response.status_code, 200)
+        self.assertTemplateUsed(response, 'taskdatabase/tasks/task_details.html')
\ No newline at end of file
diff --git a/atdb/taskdatabase/tests/test_views_diagram_page.py b/atdb/taskdatabase/tests/test_views_diagram_page.py
new file mode 100644
index 0000000000000000000000000000000000000000..aadaf8300eb0b278bc98a6a1a464359cd3a99fda
--- /dev/null
+++ b/atdb/taskdatabase/tests/test_views_diagram_page.py
@@ -0,0 +1,30 @@
+from django.test import TestCase
+from django.urls import reverse
+
+from taskdatabase.models import Task, Workflow
+class DiagramPageViewTest(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=12345, status='finished', workflow = workflow)
+        Task.objects.get_or_create(sas_id=12345, status='finished', workflow = workflow)
+        Task.objects.get_or_create(sas_id=12345, status='stored', workflow = workflow)
+
+    def test_url_exists_at_desired_location(self):
+        response = self.client.get('/atdb/diagram/')
+        self.assertEqual(response.status_code, 200)
+
+    def test_url_accessible_by_name(self):
+        response = self.client.get(reverse('diagram'))
+        self.assertEqual(response.status_code, 200)
+
+    def test_uses_correct_template(self):
+        response = self.client.get(reverse('diagram'))
+        self.assertEqual(response.status_code, 200)
+        self.assertTemplateUsed(response, 'taskdatabase/diagram.html')
\ No newline at end of file
diff --git a/atdb/taskdatabase/tests/test_views_discarded_page.py b/atdb/taskdatabase/tests/test_views_discarded_page.py
new file mode 100644
index 0000000000000000000000000000000000000000..9e79f2a6dca3ece16bec5db6fa0e6d877422bee8
--- /dev/null
+++ b/atdb/taskdatabase/tests/test_views_discarded_page.py
@@ -0,0 +1,30 @@
+from django.test import TestCase
+from django.urls import reverse
+
+from taskdatabase.models import Task, Workflow
+class DiscardedPageViewTest(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=12345, status='discarded', workflow = workflow)
+        Task.objects.get_or_create(sas_id=12345, status='discarded', workflow = workflow)
+        Task.objects.get_or_create(sas_id=12345, status='stored', workflow = workflow)
+
+    def test_url_exists_at_desired_location(self):
+        response = self.client.get('/atdb/discarded')
+        self.assertEqual(response.status_code, 200)
+
+    def test_url_accessible_by_name(self):
+        response = self.client.get(reverse('discarded'))
+        self.assertEqual(response.status_code, 200)
+
+    def test_uses_correct_template(self):
+        response = self.client.get(reverse('discarded'))
+        self.assertEqual(response.status_code, 200)
+        self.assertTemplateUsed(response, 'taskdatabase/discarded/page.html')
\ No newline at end of file
diff --git a/atdb/taskdatabase/tests/test_views_failures_page.py b/atdb/taskdatabase/tests/test_views_failures_page.py
new file mode 100644
index 0000000000000000000000000000000000000000..a2342724238963eef495229587c9d62c0e5a1851
--- /dev/null
+++ b/atdb/taskdatabase/tests/test_views_failures_page.py
@@ -0,0 +1,30 @@
+from django.test import TestCase
+from django.urls import reverse
+
+from taskdatabase.models import Task, Workflow
+class FailuresPageViewTest(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=12345, status='processed_failed', workflow = workflow)
+        Task.objects.get_or_create(sas_id=12345, status='processed_failed', workflow = workflow)
+        Task.objects.get_or_create(sas_id=12345, status='stored', workflow = workflow)
+
+    def test_url_exists_at_desired_location(self):
+        response = self.client.get('/atdb/failures')
+        self.assertEqual(response.status_code, 200)
+
+    def test_url_accessible_by_name(self):
+        response = self.client.get(reverse('failures'))
+        self.assertEqual(response.status_code, 200)
+
+    def test_uses_correct_template(self):
+        response = self.client.get(reverse('failures'))
+        self.assertEqual(response.status_code, 200)
+        self.assertTemplateUsed(response, 'taskdatabase/failures/page.html')
\ No newline at end of file
diff --git a/atdb/taskdatabase/tests/test_views_filter_page.py b/atdb/taskdatabase/tests/test_views_filter_page.py
new file mode 100644
index 0000000000000000000000000000000000000000..545c5448bf48dba8aa964c517ee02f896fb0cead
--- /dev/null
+++ b/atdb/taskdatabase/tests/test_views_filter_page.py
@@ -0,0 +1,30 @@
+from django.test import TestCase
+from django.urls import reverse
+
+from taskdatabase.models import Task, Workflow
+class FilterPageViewTest(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=12345, status='finished', workflow = workflow)
+        Task.objects.get_or_create(sas_id=12345, status='finished', workflow = workflow)
+        Task.objects.get_or_create(sas_id=12345, status='stored', workflow = workflow)
+
+    def test_url_exists_at_desired_location(self):
+        response = self.client.get('/atdb/query/')
+        self.assertEqual(response.status_code, 200)
+
+    def test_url_accessible_by_name(self):
+        response = self.client.get(reverse('query'))
+        self.assertEqual(response.status_code, 200)
+
+    def test_uses_correct_template(self):
+        response = self.client.get(reverse('query'))
+        self.assertEqual(response.status_code, 200)
+        self.assertTemplateUsed(response, 'taskdatabase/query/index.html')
\ No newline at end of file
diff --git a/atdb/taskdatabase/tests/test_views_finished_page.py b/atdb/taskdatabase/tests/test_views_finished_page.py
new file mode 100644
index 0000000000000000000000000000000000000000..3de45fa27df79bd994a2763b845408de1d62a4d7
--- /dev/null
+++ b/atdb/taskdatabase/tests/test_views_finished_page.py
@@ -0,0 +1,30 @@
+from django.test import TestCase
+from django.urls import reverse
+
+from taskdatabase.models import Task, Workflow
+class FinishedPageViewTest(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=12345, status='finished', workflow = workflow)
+        Task.objects.get_or_create(sas_id=12345, status='finished', workflow = workflow)
+        Task.objects.get_or_create(sas_id=12345, status='stored', workflow = workflow)
+
+    def test_url_exists_at_desired_location(self):
+        response = self.client.get('/atdb/finished')
+        self.assertEqual(response.status_code, 200)
+
+    def test_url_accessible_by_name(self):
+        response = self.client.get(reverse('finished'))
+        self.assertEqual(response.status_code, 200)
+
+    def test_uses_correct_template(self):
+        response = self.client.get(reverse('finished'))
+        self.assertEqual(response.status_code, 200)
+        self.assertTemplateUsed(response, 'taskdatabase/archived/page.html')
\ No newline at end of file
diff --git a/atdb/taskdatabase/tests/test_views_monitoring_page.py b/atdb/taskdatabase/tests/test_views_monitoring_page.py
new file mode 100644
index 0000000000000000000000000000000000000000..98fbb12b2a5d57503e45ccd295d000850179ef3c
--- /dev/null
+++ b/atdb/taskdatabase/tests/test_views_monitoring_page.py
@@ -0,0 +1,28 @@
+from django.test import TestCase
+from django.urls import reverse
+
+from taskdatabase.models import LatestMonitor
+class MonitoringPageViewTest(TestCase):
+
+    @classmethod
+    def setUpTestData(cls):
+        # create a list of Monitor objects
+        LatestMonitor.objects.get_or_create(name="stager", status='running')
+        LatestMonitor.objects.get_or_create(name="archiver", status='running')
+        LatestMonitor.objects.get_or_create(name="executor", status='running')
+        LatestMonitor.objects.get_or_create(name="datamanager", status='running')
+        LatestMonitor.objects.get_or_create(name="token", status='running')
+        LatestMonitor.objects.get_or_create(name="cleanup", status='running')
+        LatestMonitor.objects.get_or_create(name="cleanup-spider", status='running')
+    def test_url_exists_at_desired_location(self):
+        response = self.client.get('/atdb/monitoring/')
+        self.assertEqual(response.status_code, 200)
+
+    def test_url_accessible_by_name(self):
+        response = self.client.get(reverse('monitoring'))
+        self.assertEqual(response.status_code, 200)
+
+    def test_uses_correct_template(self):
+        response = self.client.get(reverse('monitoring'))
+        self.assertEqual(response.status_code, 200)
+        self.assertTemplateUsed(response, 'taskdatabase/monitoring_page.html')
\ No newline at end of file
diff --git a/atdb/taskdatabase/tests/test_views_quality_page.py b/atdb/taskdatabase/tests/test_views_quality_page.py
new file mode 100644
index 0000000000000000000000000000000000000000..7e01cabdac07cba3ca840baa57fc16f333ab5a47
--- /dev/null
+++ b/atdb/taskdatabase/tests/test_views_quality_page.py
@@ -0,0 +1,113 @@
+from django.test import TestCase
+from django.urls import reverse
+from django.test import RequestFactory
+from django.contrib.sessions.middleware import SessionMiddleware
+from django.core.paginator import Paginator
+
+from taskdatabase.models import Task, Workflow
+from taskdatabase.views import ShowQualityPage
+
+class QualityPageViewTest(TestCase):
+
+    @classmethod
+    def setUpTestData(cls):
+        outputs1 = {
+            "quality": {
+                "details": {},
+                "observing-conditions": "N/A",
+                "sensitivity": "N/A",
+                "summary": {
+                    "L526107_SAP002_B073_P000_bf.tar": {
+                        "added": [
+                            "stokes/SAP2/BEAM73/L526105_SAP2_BEAM73_2bit.fits",
+                            "stokes/SAP2/BEAM73/L526105_SAP2_BEAM73_2bit_ldv_psrfits_requantisation.log"
+                        ],
+                        "deleted": [
+                            "stokes/SAP2/BEAM73/L526105_SAP2_BEAM73.fits"
+                        ],
+                        "input_name": "L526107_SAP002_B073_P000_bf.tar",
+                        "input_size": 20353853440,
+                        "input_size_str": "18.96 GB",
+                        "output_name": "L526107_SAP002_B073_P000_bf.tar",
+                        "output_size": 6024990720,
+                        "output_size_str": "5.61 GB",
+                        "rfi_percent": 11.167,
+                        "size_ratio": 0.2960122876860019
+                    }
+                },
+                "uv-coverage": "N/A"
+            },
+        }
+
+        outputs2 = {
+            "quality": {
+                "details": {},
+                "observing-conditions": "N/A",
+                "sensitivity": "N/A",
+                "summary": {
+                    "L526107_SAP002_B073_P000_bf.tar": {
+                        "added": [
+                            "stokes/SAP2/BEAM73/L526105_SAP2_BEAM73_2bit.fits",
+                            "stokes/SAP2/BEAM73/L526105_SAP2_BEAM73_2bit_ldv_psrfits_requantisation.log"
+                        ],
+                        "deleted": [
+                            "stokes/SAP2/BEAM73/L526105_SAP2_BEAM73.fits"
+                        ],
+                        "input_name": "L526107_SAP002_B073_P000_bf.tar",
+                        "input_size": 20353853440,
+                        "input_size_str": "18.96 GB",
+                        "output_name": "L526107_SAP002_B073_P000_bf.tar",
+                        "output_size": 6024990720,
+                        "output_size_str": "5.61 GB",
+                        "rfi_percent": 11.167,
+                        "size_ratio": 0.2960122876860019
+                    }
+                },
+                "uv-coverage": "N/A"
+            },
+        }
+
+        # 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=123, workflow = workflow, outputs = outputs1)
+        Task.objects.get_or_create(sas_id=456, workflow = workflow, outputs = outputs2)
+        Task.objects.get_or_create(sas_id=789, workflow = workflow)
+
+    def test_url_exists_at_desired_location(self):
+        response = self.client.get('/atdb/quality')
+        self.assertEqual(response.status_code, 200)
+
+    def test_url_accessible_by_name(self):
+        response = self.client.get(reverse('quality'))
+        self.assertEqual(response.status_code, 200)
+
+    def test_uses_correct_template(self):
+        response = self.client.get(reverse('quality'))
+        self.assertEqual(response.status_code, 200)
+        self.assertTemplateUsed(response, 'taskdatabase/quality/page.html')
+
+    def test_queryset_for_tasks_with_quality(self):
+        # this builds up the request and the session
+        request = RequestFactory().get('/atdb/quality')
+        middleware = SessionMiddleware()
+        middleware.process_request(request)
+        request.session.save()
+
+        # access the class in views.py and its overridden get_queryset method
+        view = ShowQualityPage()
+        view.request = request
+        qs = view.get_queryset().object_list
+        sum_sasid_actual = 0
+        for task in qs:
+            sum_sasid_actual += task.id
+
+        # test against the list of (2) test tasks with quality information
+        tasks_with_quality = Task.objects.all().exclude(outputs__quality__isnull=True)
+        sum_sasid_test = 0
+        for task in tasks_with_quality:
+            sum_sasid_test += task.id
+
+        self.assertEqual(sum_sasid_actual, sum_sasid_test)
diff --git a/atdb/taskdatabase/tests/test_views_tasks_page.py b/atdb/taskdatabase/tests/test_views_tasks_page.py
new file mode 100644
index 0000000000000000000000000000000000000000..35ebbd0766af593e23e08ae12771bdca0fa8b1ce
--- /dev/null
+++ b/atdb/taskdatabase/tests/test_views_tasks_page.py
@@ -0,0 +1,32 @@
+from django.test import TestCase
+from django.urls import reverse
+
+from taskdatabase.models import Task, Workflow
+
+class TaskListViewTest(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=12345, workflow = workflow)
+        Task.objects.get_or_create(sas_id=12345, workflow = workflow)
+        Task.objects.get_or_create(sas_id=12345, workflow = workflow)
+
+    def test_url_exists_at_desired_location(self):
+        response = self.client.get('/atdb/')
+        self.assertEqual(response.status_code, 200)
+
+    def test_url_accessible_by_name(self):
+        response = self.client.get(reverse('index'))
+        self.assertEqual(response.status_code, 200)
+
+    def test_uses_correct_template(self):
+        response = self.client.get(reverse('index'))
+        self.assertEqual(response.status_code, 200)
+        self.assertTemplateUsed(response, 'taskdatabase/index.html')
+
diff --git a/atdb/taskdatabase/tests/test_views_validation_page.py b/atdb/taskdatabase/tests/test_views_validation_page.py
new file mode 100644
index 0000000000000000000000000000000000000000..da4283da15c74023e91966f72e6e82b05c687cbc
--- /dev/null
+++ b/atdb/taskdatabase/tests/test_views_validation_page.py
@@ -0,0 +1,30 @@
+from django.test import TestCase
+from django.urls import reverse
+
+from taskdatabase.models import Task, Workflow
+class ValidationPageViewTest(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=12345, status='stored', workflow = workflow)
+        Task.objects.get_or_create(sas_id=12345, status='stored', workflow = workflow)
+        Task.objects.get_or_create(sas_id=12345, status='stored', workflow = workflow)
+
+    def test_url_exists_at_desired_location(self):
+        response = self.client.get('/atdb/validation')
+        self.assertEqual(response.status_code, 200)
+
+    def test_url_accessible_by_name(self):
+        response = self.client.get(reverse('validation'))
+        self.assertEqual(response.status_code, 200)
+
+    def test_uses_correct_template(self):
+        response = self.client.get(reverse('validation'))
+        self.assertEqual(response.status_code, 200)
+        self.assertTemplateUsed(response, 'taskdatabase/validation/page.html')
\ No newline at end of file
diff --git a/atdb/taskdatabase/views.py b/atdb/taskdatabase/views.py
index 1842db5a031c74635c27753da6ecb2fc95737258..fd2065c182ab0444e21bd3d207be811db63c1729 100644
--- a/atdb/taskdatabase/views.py
+++ b/atdb/taskdatabase/views.py
@@ -40,10 +40,6 @@ from .services import algorithms
 
 logger = logging.getLogger(__name__)
 
-class Pages(Enum):
-    VALIDATION = "validation"
-
-
 def redirect_with_params(view_name, params):
     return redirect(reverse(view_name) + params)
 
@@ -1160,9 +1156,6 @@ def TaskRetry(request, pk, new_status, page=0):
 
 @login_required
 def TaskDiscard(request, pk, new_status, page=0):
-    # TODO: when the cleanup service in place,
-    # make a change in this line in failures\tasks.html. Change 'discard' into 'discarded'.
-    # <a href="{% url 'task-discard-view' task.pk 'discarded' my_tasks.number %}"
 
     task = Task.objects.get(pk=pk)
 
@@ -1203,9 +1196,6 @@ def TaskDiscard(request, pk, new_status, page=0):
 
 
 def TaskDiscardSasId(request, pk, new_status, page=0):
-    # TODO: when the cleanup service in place,
-    # make a change in this line in failures\tasks.html. Change 'discard' into 'discarded'.
-    # <a href="{% url 'task-discard-view' task.pk 'discarded' my_tasks.number %}"
 
     task = Task.objects.get(pk=pk)
     sas_id = task.sas_id
@@ -1479,9 +1469,6 @@ class GetMinMaxTimeView(generics.ListAPIView):
             })
 
 
-from rest_framework.serializers import ListSerializer
-
-
 # /atdb/get_unique_values_for_key/{key}
 class GetUniqueValuesForKey(generics.ListAPIView):
     queryset = Task.objects.all()