diff --git a/atdb/taskdatabase/templates/taskdatabase/quality/tasks.html b/atdb/taskdatabase/templates/taskdatabase/quality/tasks.html
index b4bc7eeb01e5cbec86374c23354179c671fb97a2..81b85f74a2b26c5884c88102cd306a24fa4ac4b0 100644
--- a/atdb/taskdatabase/templates/taskdatabase/quality/tasks.html
+++ b/atdb/taskdatabase/templates/taskdatabase/quality/tasks.html
@@ -72,7 +72,7 @@
                 <td class="{{ task.quality }}">{{ task.quality|default_if_none:"-" }}</td>
                 <td>
                     {% if task.status == "stored" %}
-                        <a href="{% url 'task-setstatus-view' task.pk 'validated' my_tasks.number %}" class="btn btn-success btn-sm" role="button"><i class="fas fa-check"></i> validate</a>
+                        <a href="{% url 'task-validate-task' task.pk 'calculated' 'validated' my_tasks.number %}" class="btn btn-success btn-sm" role="button"><i class="fas fa-check"></i> Validate</a>
                     {% endif %}
                 </td>
                 </tr>
diff --git a/atdb/taskdatabase/templates/taskdatabase/validation/validation_buttons.html b/atdb/taskdatabase/templates/taskdatabase/validation/validation_buttons.html
index 3370f9cfb6f35b4e5027b851746cab058e4e40e1..fca15520f50b1672174bd74084783955169972c4 100644
--- a/atdb/taskdatabase/templates/taskdatabase/validation/validation_buttons.html
+++ b/atdb/taskdatabase/templates/taskdatabase/validation/validation_buttons.html
@@ -1,16 +1,16 @@
 
  {% if task.sasid_is_verified %}
-    <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> P</a>
+    <a href="{% url 'task-validate-sasid' task.pk 'poor' 'validated' my_tasks.number %}" class="btn btn-danger btn-sm" role="button"><i class="fas fa-check"></i> P</a>
  {% endif %}
 
  {% if task.sasid_is_verified %}
-    <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> M</a>
+    <a href="{% url 'task-validate-sasid' task.pk 'moderate' 'validated' my_tasks.number %}" class="btn btn-warning btn-sm" role="button"><i class="fas fa-check"></i> M</a>
  {% endif %}
 
  {% if task.sasid_is_verified %}
-    <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> G</a>
+    <a href="{% url 'task-validate-sasid' task.pk 'good' 'validated' my_tasks.number %}" class="btn btn-success btn-sm" role="button"><i class="fas fa-check"></i> G</a>
  {% endif %}
 
-  {% if task.sasid_is_verified %}
-    <a href="{% url 'task-validate-view' task.pk 'calculated' 'validated' my_tasks.number %}" class="btn btn-success btn-sm" role="button"><i class="fas fa-check"></i> Validate</a>
+ {% if task.sasid_is_verified %}
+    <a href="{% url 'task-validate-sasid' task.pk 'calculated' 'validated' my_tasks.number %}" class="btn btn-success btn-sm" role="button"><i class="fas fa-check"></i> Validate</a>
  {% endif %}
diff --git a/atdb/taskdatabase/urls.py b/atdb/taskdatabase/urls.py
index faeda24a365005247690e5bf00e5e791ac14d2b7..874b4da18ce9ef1a70525d9c84a5571ab740db46 100644
--- a/atdb/taskdatabase/urls.py
+++ b/atdb/taskdatabase/urls.py
@@ -95,7 +95,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>/validate-sasid/<quality>/<new_status>/<page>', views.TaskValidateSasId, name='task-validate-sasid'),
+    path('tasks/<int:pk>/validate-task/<quality>/<new_status>/<page>', views.TaskValidateTask, name='task-validate-task'),
     path('tasks/<int:pk>/retry/<new_status>/<page>', views.TaskRetry, name='task-retry-view'),
     path('tasks/<int:pk>/discard/<new_status>/<page>', views.TaskDiscard, name='task-discard-view'),
     path('tasks/<int:pk>/discard_sasid/<new_status>/<page>', views.TaskDiscardSasId, name='task-discard-view-sasid'),
diff --git a/atdb/taskdatabase/views.py b/atdb/taskdatabase/views.py
index b6d0e41ebdf9c760daaa8351020ecdb9df05df32..04f5d9acb607bee9795f8113a32e3f4ed11e9bb2 100644
--- a/atdb/taskdatabase/views.py
+++ b/atdb/taskdatabase/views.py
@@ -1068,7 +1068,7 @@ def TaskSetStatus(request, pk, new_status, page=0):
 
 
 @login_required
-def TaskValidate(request, pk, quality, new_status, page=0):
+def TaskValidateSasId(request, pk, quality, new_status, page=0):
     """
     find all tasks with the same SAS_ID of the given task (pk), and set its quality to all of them
     This is used by the 'P/M/G/Validate' buttons on the Validation Page
@@ -1102,6 +1102,34 @@ def TaskValidate(request, pk, quality, new_status, page=0):
         # redirect to tasks list
         return redirect_with_params('validation', '?page=' + page)
 
+@login_required
+def TaskValidateTask(request, pk, quality, new_status, page=0):
+    """
+    Find the task (pk), and set its quality to the calculated quality
+    (if present, otherwise just set the status to 'validated')
+    This is used by the 'Validate' button on the Quality Page
+
+    """
+    task = Task.objects.get(pk=pk)
+
+    if quality == 'calculated':
+        try:
+            quality = task.calculated_qualities['per_task']
+        except:
+            # no calculated quality present, just the existing quality (so no change)
+            quality = task.quality
+
+    task.quality = quality
+    task.new_status = new_status
+    task.save()
+
+    if page == 0:
+        # redirect to details screen
+        return redirect('quality')
+    else:
+        # redirect to tasks list
+        return redirect_with_params('quality', '?page=' + page)
+
 
 @login_required
 def TaskRetry(request, pk, new_status, page=0):