diff --git a/atdb/taskdatabase/tables.py b/atdb/taskdatabase/tables.py
index b8ad9471f10a72409740e54a11b7d114e864e97d..9d40e6aff72383215dcfc0bf5bbbd2f9ce8e3896 100644
--- a/atdb/taskdatabase/tables.py
+++ b/atdb/taskdatabase/tables.py
@@ -20,15 +20,20 @@ class ResumeColumn(tables.BooleanColumn):
     def render(self, record):
         return record.resume
 
+class PurgeColumn(tables.BooleanColumn):
+    def render(self, record):
+        return record.purge_policy
+
 class TaskTable(tables.Table):
 
     class Meta:
         model = Task
         template_name = "django_tables2/bootstrap4.html"
-        fields = ("id", "workflow.id","filter","priority","status","quality","project","sas_id","resume","actions","buttons")
+        fields = ("id", "workflow.id","filter","priority","status","quality","project","sas_id","resume","purge","actions","buttons")
 
     # columns that need specific rendering
     status = StatusColumn()
+    purge = PurgeColumn()
 
     actions = tables.TemplateColumn(verbose_name='Details',
                                     template_name='taskdatabase/query/action_buttons_per_row.html',
diff --git a/atdb/taskdatabase/templates/taskdatabase/index.html b/atdb/taskdatabase/templates/taskdatabase/index.html
index c47304bc858d393279e87367aa14f355ef85f88a..cc6073b07ca5d3be6f9cd8835044bb6e8f80375e 100644
--- a/atdb/taskdatabase/templates/taskdatabase/index.html
+++ b/atdb/taskdatabase/templates/taskdatabase/index.html
@@ -31,7 +31,7 @@
             {% include 'taskdatabase/pagination.html' %}
         </div>
     </div>
-    <p class="footer"> Version 3 Aug 2023
+    <p class="footer"> Version 4 Aug 2023
 </div>
 
 {% include 'taskdatabase/refresh.html' %}
diff --git a/atdb/taskdatabase/templates/taskdatabase/query/action_buttons_per_row.html b/atdb/taskdatabase/templates/taskdatabase/query/action_buttons_per_row.html
index 8cebd0473126d486fec6877a0ff2d456764706f1..00c2324c419e4f3e461e2f6814c2bb361fb7883a 100644
--- a/atdb/taskdatabase/templates/taskdatabase/query/action_buttons_per_row.html
+++ b/atdb/taskdatabase/templates/taskdatabase/query/action_buttons_per_row.html
@@ -6,4 +6,12 @@
 
 {% if not record.resume  %}
        <a href="{% url 'query-hold-resume' record.pk 'resume' request.GET %}" class="btn btn-success btn-sm" role="button"><i class="fas fa-play"></i> start</a>
+{% endif %}
+
+{% if record.purge_policy == 'no'  %}
+       <a href="{% url 'query-purge' record.pk 'yes' request.GET %}" class="btn btn-danger btn-sm" role="button"><i class="fas fa-xmark"></i> purge: yes</a>
+{% endif %}
+
+{% if record.purge_policy == 'yes'  %}
+       <a href="{% url 'query-purge' record.pk 'no' request.GET %}" class="btn btn-success btn-sm" role="button"><i class="fas fa-check"></i> purge: no</a>
 {% endif %}
\ No newline at end of file
diff --git a/atdb/taskdatabase/templates/taskdatabase/query/set_multi_status_panel.html b/atdb/taskdatabase/templates/taskdatabase/query/set_multi_status_panel.html
index 19c8a1f167849ef0f2922c2c478fb6c159128568..4de39dac548667fd28190e677ed31aa1de5980fd 100644
--- a/atdb/taskdatabase/templates/taskdatabase/query/set_multi_status_panel.html
+++ b/atdb/taskdatabase/templates/taskdatabase/query/set_multi_status_panel.html
@@ -10,6 +10,9 @@
                     <tr>
                      <a href="{% url 'task-multi-hold' 'hold' request.GET %}" class="btn btn-danger btn-sm" role="button"><i class="fas fa-pause"></i> hold</a>&nbsp;
                      <a href="{% url 'task-multi-hold' 'resume' request.GET %}" class="btn btn-danger btn-sm" role="button"><i class="fas fa-play"></i> start</a>&nbsp;
+                     <a href="{% url 'task-multi-purge' 'yes' request.GET %}" class="btn btn-danger btn-sm" role="button"><i class="fas fa-xmark"></i> purge: yes</a>&nbsp;
+                     <a href="{% url 'task-multi-purge' 'no' request.GET %}" class="btn btn-warning btn-sm" role="button"><i class="fas fa-check"></i> purge: no</a>&nbsp;
+
                      <a href="{% url 'task-multi-setstatus' 'defined' request.GET %}" class="btn btn-danger btn-sm" role="button"><i class="fas fa-sync-alt"></i> defined</a>&nbsp;
                      <a href="{% url 'task-multi-setstatus' 'staged' request.GET %}" class="btn btn-danger btn-sm" role="button"><i class="fas fa-sync-alt"></i> staged</a>&nbsp;
                      <a href="{% url 'task-multi-setstatus' 'fetched' request.GET %}" class="btn btn-danger btn-sm" role="button"><i class="fas fa-sync-alt"></i> fetched</a>&nbsp;
diff --git a/atdb/taskdatabase/urls.py b/atdb/taskdatabase/urls.py
index 7fdc80434b54e926e3ab33a25feddd4ee79ad942..091e51c1f28c18f617606841b85346cc6e0f63b8 100644
--- a/atdb/taskdatabase/urls.py
+++ b/atdb/taskdatabase/urls.py
@@ -114,9 +114,11 @@ urlpatterns = [
     path('tasks/<int:pk>/set_status/<new_status>/<query_params>', views.TaskSetStatusTables2, name = 'task-setstatus'),
     path('tasks/set_status_multi/<new_status>/<query_params>', views.TaskMultiStatus, name='task-multi-setstatus'),
     path('tasks/set_multi_hold/<onhold>/<query_params>', views.TaskMultiHold, name='task-multi-hold'),
+    path('tasks/set_multi_purge/<purge_policy>/<query_params>', views.TaskMultiPurge, name='task-multi-purge'),
 
     path('tasks/<int:pk>/hold/<hold_it>/<page>', views.Hold, name='task-hold-resume'),
     path('tasks/<int:pk>/hold/<hold_it>', views.Hold, name='task-hold-resume'),
     path('tasks/<int:pk>/query-hold/<hold_it>/<query_params>', views.HoldQuery, name='query-hold-resume'),
     path('tasks/<int:pk>/hold/<hold_it>/<page>', views.Hold, name='service-hold-resume'),
+    path('tasks/<int:pk>/query-purge/<purge_policy>/<query_params>', views.PurgeQuery, name='query-purge'),
 ]
diff --git a/atdb/taskdatabase/views.py b/atdb/taskdatabase/views.py
index 10cca3c97e9a89f56b46893148c3a6a40da8120d..bbe98330e2d41bc89a1ee8f4c36bb0c57e48cbde 100644
--- a/atdb/taskdatabase/views.py
+++ b/atdb/taskdatabase/views.py
@@ -82,6 +82,7 @@ class TaskFilterQueryPage(filters.FilterSet):
             'quality': ['icontains', 'in'],
             'project': ['exact', 'icontains', 'in'],
             'sas_id': ['exact', 'icontains', 'in'],
+            'purge_policy': ['icontains'],
             #'sas_id_archived': ['exact', 'icontains', 'in'],
         }
 
@@ -1045,6 +1046,16 @@ def HoldQuery(request, pk, hold_it, query_params):
     return redirect_with_params('query', '?' + current_query_params)
 
 
+def PurgeQuery(request, pk, purge_policy, query_params):
+    model = Task
+    task = Task.objects.get(pk=pk)
+    task.purge_policy = purge_policy
+    task.save()
+
+    current_query_params = convert_query_params_to_url(query_params)
+    return redirect_with_params('query', '?' + current_query_params)
+
+
 @login_required
 def ServiceHoldResume(request, name, hostname, enabled):
     model = LatestMonitor
@@ -1418,6 +1429,30 @@ def TaskMultiHold(request, onhold, query_params):
     return render(request, "taskdatabase/query/confirm_multi_change.html", {'new_value': onhold, 'count': count})
 
 
+@login_required
+def TaskMultiPurge(request, purge_policy, query_params):
+    # get the list of id's from the session
+    filtered_tasks_as_list = request.session['filtered_tasks_as_list']
+    count = len(filtered_tasks_as_list)
+
+    if request.method == "POST":
+
+        for id in filtered_tasks_as_list:
+            task = Task.objects.get(id=id)
+            task.purge_policy = purge_policy
+            task.save()
+
+        current_query_params = request.session['current_query_params']
+        return redirect_with_params('query', '?' + current_query_params)
+
+    # add the current query parameters to the session so that they survive
+    # the request/response to the confirmation page (which has other query parameters)
+    current_query_params = convert_query_params_to_url(query_params)
+    request.session['current_query_params'] = current_query_params
+
+    return render(request, "taskdatabase/query/confirm_multi_change.html", {'new_value': purge_policy, 'count': count})
+
+
 # /atdb/get_size?status__in=defined,staged
 class GetSizeView(generics.ListAPIView):
     queryset = Task.objects.all()