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/test_calculated_qualities.py b/atdb/taskdatabase/test_calculated_qualities.py
deleted file mode 100644
index b2b5bfa596460ea9019df750e49925a4586c7c1a..0000000000000000000000000000000000000000
--- a/atdb/taskdatabase/test_calculated_qualities.py
+++ /dev/null
@@ -1,373 +0,0 @@
-from django.test import TestCase
-import json
-
-from taskdatabase.services import calculated_qualities as qualities
-from taskdatabase.models import Configuration, Task
-
-
-class TestCalculatedQualities(TestCase):
-
-    @classmethod
-    def setUpTestData(cls):
-        print("setUpTestData: Run once to set up non-modified data for all class methods.")
-        # Set up non-modified objects used by all test methods
-        quality_thresholds = {
-            "moderate": 20,
-            "poor": 50,
-            "overall_poor": 50,
-            "overall_good": 90,
-        }
-        Configuration.objects.create(key="quality_thresholds", value=json.dumps(quality_thresholds))
-
-    def setUp(self):
-        print("setUp: Run once for every test method to setup clean data.")
-
-        outputs0 = {
-            "quality": {
-                "details": {},
-                "observing-conditions": "N/A",
-                "sensitivity": "N/A",
-                "summary": {
-                    "L526107_summaryIS.tar": {
-                        "added": [],
-                        "deleted": [],
-                        "input_name": "L526107_summaryIS.tar",
-                        "input_size": 495749120,
-                        "input_size_str": "472.78 MB",
-                        "output_name": "L526107_summaryIS.tar",
-                        "output_size": 283791360,
-                        "output_size_str": "270.64 MB",
-                        "rfi_percent": 0,
-                        "size_ratio": 0.5724495486749427
-                    }
-                },
-                "uv-coverage": "N/A"
-            },
-        }
-
-        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": 22.167,
-                        "size_ratio": 0.2960122876860019
-                    }
-                },
-                "uv-coverage": "N/A"
-            },
-        }
-
-        outputs3 = {
-            "quality": {
-                "details": {},
-                "observing-conditions": "N/A",
-                "sensitivity": "N/A",
-                "summary": {
-                    "L526107_SAP002_B072_P000_bf.tar": {
-                        "added": [
-                            "stokes/SAP2/BEAM72/L526105_SAP2_BEAM72_2bit.fits",
-                            "stokes/SAP2/BEAM72/L526105_SAP2_BEAM72_2bit_ldv_psrfits_requantisation.log"
-                        ],
-                        "deleted": [
-                            "stokes/SAP2/BEAM72/L526105_SAP2_BEAM72.fits"
-                        ],
-                        "input_name": "L526107_SAP002_B072_P000_bf.tar",
-                        "input_size": 20353843200,
-                        "input_size_str": "18.96 GB",
-                        "output_name": "L526107_SAP002_B072_P000_bf.tar",
-                        "output_size": 6024980480,
-                        "output_size_str": "5.61 GB",
-                        "rfi_percent": 31.921,
-                        "size_ratio": 0.2960119335104242
-                    }
-                },
-                "uv-coverage": "N/A"
-            },
-
-        }
-
-        outputs4 = {
-            "quality": {
-                "details": {},
-                "observing-conditions": "N/A",
-                "sensitivity": "N/A",
-                "summary": {
-                    "L526107_SAP002_B070_P000_bf.tar": {
-                        "added": [
-                            "stokes/SAP2/BEAM70/L526105_SAP2_BEAM70_2bit.fits",
-                            "stokes/SAP2/BEAM70/L526105_SAP2_BEAM70_2bit_ldv_psrfits_requantisation.log"
-                        ],
-                        "deleted": [
-                            "stokes/SAP2/BEAM70/L526105_SAP2_BEAM70.fits"
-                        ],
-                        "input_name": "L526107_SAP002_B070_P000_bf.tar",
-                        "input_size": 20353525760,
-                        "input_size_str": "18.96 GB",
-                        "output_name": "L526107_SAP002_B070_P000_bf.tar",
-                        "output_size": 6024755200,
-                        "output_size_str": "5.61 GB",
-                        "rfi_percent": 52.164,
-                        "size_ratio": 0.2960054818531843
-                    }
-                },
-                "uv-coverage": "N/A"
-            },
-        }
-
-        outputs5 = {
-            "quality": {
-                "details": {},
-                "observing-conditions": "N/A",
-                "sensitivity": "N/A",
-                "summary": {
-                    "L526107_SAP002_B072_P000_bf.tar": {
-                        "added": [
-                            "stokes/SAP2/BEAM72/L526105_SAP2_BEAM72_2bit.fits",
-                            "stokes/SAP2/BEAM72/L526105_SAP2_BEAM72_2bit_ldv_psrfits_requantisation.log"
-                        ],
-                        "deleted": [
-                            "stokes/SAP2/BEAM72/L526105_SAP2_BEAM72.fits"
-                        ],
-                        "input_name": "L526107_SAP002_B072_P000_bf.tar",
-                        "input_size": 20353843200,
-                        "input_size_str": "18.96 GB",
-                        "output_name": "L526107_SAP002_B072_P000_bf.tar",
-                        "output_size": 6024980480,
-                        "output_size_str": "5.61 GB",
-                        "size_ratio": 0.2960119335104242
-                    }
-                },
-                "uv-coverage": "N/A"
-            },
-
-        }
-
-        outputs6 = {
-            "quality": {
-                "details": {},
-                "observing-conditions": "N/A",
-                "sensitivity": "N/A",
-                "summary": {
-                    "L526107_SAP002_B070_P000_bf.tar": {
-                        "added": [
-                            "stokes/SAP2/BEAM70/L526105_SAP2_BEAM70_2bit.fits",
-                            "stokes/SAP2/BEAM70/L526105_SAP2_BEAM70_2bit_ldv_psrfits_requantisation.log"
-                        ],
-                        "deleted": [
-                            "stokes/SAP2/BEAM70/L526105_SAP2_BEAM70.fits"
-                        ],
-                        "input_name": "L526107_SAP002_B070_P000_bf.tar",
-                        "input_size": 20353525760,
-                        "input_size_str": "18.96 GB",
-                        "output_name": "L526107_SAP002_B070_P000_bf.tar",
-                        "output_size": 6024755200,
-                        "output_size_str": "5.61 GB",
-                        "size_ratio": 0.2960054818531843
-                    }
-                },
-                "uv-coverage": "N/A"
-            },
-        }
-
-        # create a list of Tasks with various values of rfi_percent to test the quality algorithms
-        # rfi_percent=0, this task should not be included in the calculates
-        Task.objects.get_or_create(sas_id=54321, status='processed', outputs=outputs0)
-
-        # rfi_percent 11,22,31,52
-        Task.objects.get_or_create(sas_id=54321, status='processed', outputs=outputs1)
-        Task.objects.get_or_create(sas_id=54321, status='processed', outputs=outputs2)
-        Task.objects.get_or_create(sas_id=54321, status='processed', outputs=outputs3)
-        Task.objects.get_or_create(sas_id=54321, status='processed', outputs=outputs4)
-        
-        # tasks without rfi_percent (so simulating a different pipeline)
-        Task.objects.get_or_create(sas_id=12345, status='processed', outputs=outputs5)
-        Task.objects.get_or_create(sas_id=12345, status='processed', outputs=outputs6)
-
-    def test_count_tasks(self):
-        actual = Task.objects
-        count = actual.count()
-        self.assertEqual(count,7)
-
-    def test_run_calculations_when_task_becomes_stored(self):
-        for task in Task.objects.all():
-            task.new_status = 'stored'
-            # this triggers the overridden save function in models.task
-            task.save()
-
-        # only 4 of the 7 tasks should now have calculated_qualities
-        count = 0
-        for task in Task.objects.all():
-            if task.calculated_qualities['per_sasid']:
-                count += 1
-
-        self.assertEqual(count,4)
-
-
-    def test_calculated_qualities(self):
-        """
-        calculate the quality per task and per sas_id based on rfi_percent values
-        The threshold values are written from a configuration jsonfield
-
-        Using this algorithm from SDCO:
-                rfi_i <= 20 % is good
-                20% <= rfi_i <= 50 is moderate
-                rfi_i > 50 is poor.
-                except when rfi_percent	= 0
-
-        Using this algorithm from SDCO:
-             if more then 90 % of all files have a good quality then the dataset has good condition.
-             If more then 50 % of all files have a poor quality then the dataset is poor
-             otherwise is moderate.
-        """
-
-        # read the quality thresholds from the test database
-        quality_thresholds = json.loads(Configuration.objects.get(key="quality_thresholds").value)
-
-        # get the tasks for sas_id 54321
-        tasks_for_this_sasid = Task.objects.filter(sas_id=54321)
-
-        # run the algorithms and gather the values
-        quality_values = {'poor': 0, 'moderate': 0, 'good': 0}
-
-        for task in tasks_for_this_sasid:
-            q = qualities.calculate_qualities(task, tasks_for_this_sasid, quality_thresholds)
-            try:
-                key = task.calculated_qualities['per_task']
-                quality_values[key] = quality_values[key] + 1
-                quality_per_sasid = task.calculated_qualities['per_sasid']
-            except:
-                # ignore the tasks that have no calculated quality.
-                pass
-
-        self.assertEqual(quality_values,{'poor': 1, 'moderate': 2, 'good': 1})
-
-        # not 90% = good, and not >50% = poor so 'moderate'
-        self.assertEqual(quality_per_sasid,'moderate')
-
-
-    def test_calculated_qualities_with_optimistic_thresholds(self):
-        """
-        calculate the quality per task and per sas_id based on rfi_percent values
-        The threshold values are extremely optimistic, simulating changes made by the user
-
-        Using this algorithm from SDCO:
-                rfi_i <= 50 % is good
-                50% <= rfi_i <= 90 is moderate
-                rfi_i > 90 is poor.
-                except when rfi_percent	= 0
-
-        Using this algorithm from SDCO:
-             if more then 50 % of all files have a good quality then the dataset has good condition.
-             If more then 10 % of all files have a poor quality then the dataset is poor
-             otherwise is moderate.
-             
-        """
-
-        # optimistic thresholds, poor data doesn't exist
-        quality_thresholds = {
-            "moderate": 50,
-            "poor": 90,
-            "overall_poor": 10,
-            "overall_good": 50,
-        }
-
-        # get the tasks for sas_id 54321
-        tasks_for_this_sasid = Task.objects.filter(sas_id=54321)
-
-        # run the algorithms and gather the values
-        quality_values = {'poor': 0, 'moderate': 0, 'good': 0}
-
-        for task in tasks_for_this_sasid:
-            q = qualities.calculate_qualities(task, tasks_for_this_sasid, quality_thresholds)
-            try:
-                key = task.calculated_qualities['per_task']
-                quality_values[key] = quality_values[key] + 1
-                quality_per_sasid = task.calculated_qualities['per_sasid']
-            except:
-                # ignore the tasks that have no calculated quality.
-                pass
-
-        # rfi_percentages are 11,22,31,52 for the tasks of this sasid
-        # with the optimistic parameters that means that the first 3 are 'good', and last one is moderate. No poor
-        self.assertEqual(quality_values,{'poor': 0, 'moderate': 1, 'good': 3})
-
-        # 3 out of 4 are 'good', 75% is above the 50% threshold, so 'good'
-        self.assertEqual(quality_per_sasid,'good')
-
-    def test_faulty_thresholds(self):
-        """
-        what happens if the user makes a typo in the threshold?
-        """
-
-        # faulty thresholds
-        quality_thresholds = {
-            "moderate": "a",
-            "poor": 50,
-            "overall_poor": 50,
-            "overall_good": 90,
-        }
-
-        # get the tasks for sas_id 54321
-        tasks_for_this_sasid = Task.objects.filter(sas_id=54321)
-
-        # run the algorithms and gather the values
-        quality_values = {'poor': 0, 'moderate': 0, 'good': 0}
-        quality_per_sasid = None
-
-        for task in tasks_for_this_sasid:
-            q = qualities.calculate_qualities(task, tasks_for_this_sasid, quality_thresholds)
-            try:
-                key = task.calculated_qualities['per_task']
-                quality_values[key] = quality_values[key] + 1
-                quality_per_sasid = task.calculated_qualities['per_sasid']
-            except:
-                # ignore the tasks that have no calculated quality.
-                pass
-
-        self.assertEqual(quality_values, {'poor': 0, 'moderate': 0, 'good': 0})
-        self.assertEqual(quality_per_sasid, None)
-
diff --git a/atdb/taskdatabase/tests/test_quality_page.py b/atdb/taskdatabase/tests/test_quality_page.py
new file mode 100644
index 0000000000000000000000000000000000000000..6e96526abd442729e77c8551e0acc4dfdb1d9e9b
--- /dev/null
+++ b/atdb/taskdatabase/tests/test_quality_page.py
@@ -0,0 +1,33 @@
+from django.test import TestCase
+from django.urls import reverse
+
+from taskdatabase.models import Task, Workflow
+
+
+class QualityPageViewTest(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/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')
+
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..516aad224817974767fc0217e1e898c67fc02ee9
--- /dev/null
+++ b/atdb/taskdatabase/tests/test_views_dashboard_page.py
@@ -0,0 +1,26 @@
+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(self):
+        response = self.client.get('/atdb/dashboard/active_nores_nofilter')
+        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_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..206b3d3a1cbc73f1420e929837620fb97eae428e 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)