diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml
index d533fc210c6882fc197e6a70ed737e35ca3b3a5b..06f7a791e4a3849380d1e5ddca7f9575a58a3a56 100644
--- a/.gitlab-ci.yml
+++ b/.gitlab-ci.yml
@@ -535,15 +535,68 @@ clean:
       if [ "$CI_PIPELINE_SOURCE" == "merge_request_event" ]; then
         ./gitlab-ci/cleanup_registry.sh -i jug_xl -r 69 ${NIGHTLY_TAG}
       fi
-    - docker images
 
-deep_clean:
+clean_unstable_mr:
   stage: finalize
   dependencies:
     - clean
   tags:
     - docker-new
-  when: manual
+  when: always
+  variables:
+    API: "https://eicweb.phy.anl.gov/api/v4"
   script:
+    - apt update -q
+    - apt install -yq jq
+    - for registry in
+        eicweb
+        eicweb.phy.anl.gov:4567/eic/juggler
+        eicweb.phy.anl.gov:4567/containers/eic_container
+      ; do 
+        docker images 
+          --filter=reference=${registry}/*:unstable-mr*
+          --format "{{.ID}} {{.Repository}} {{.Tag}}" ;
+      done | while read id repository tag ; do
+        if [[ ${tag} =~ ^unstable-mr-([0-9]+)-([0-9]+)(-nightly){0,1}$ ]] ; then
+          project_id=${BASH_REMATCH[1]} ;
+          merge_request_iid=${BASH_REMATCH[2]} ;
+          if [[ $(curl --silent -L
+                  "${API}/projects/${project_id}/merge_requests?scope=all&state=merged&per_page=100"
+                  "${API}/projects/${project_id}/merge_requests?scope=all&state=closed&per_page=100"
+                  | jq -r ".[]|select(.iid == ${merge_request_iid})|.state") =~ ^(merged|closed)$ ]] ; then
+            docker rmi $repository:$tag ;
+          else
+            echo "Image $repository:$tag still in use (project ${project_id}, idd ${merge_request_iid})." ;
+          fi ;
+        fi ;
+        if [[ ${tag} =~ ^unstable-mr-([0-9]+)(-nightly){0,1}$ ]] ; then
+          merge_request_id=${BASH_REMATCH[1]} ;
+          suffix=${BASH_REMATCH[2]} ;
+          if [[ $(curl --silent -L
+                  "${API}/projects/290/merge_requests?scope=all&state=merged&per_page=100"
+                  "${API}/projects/369/merge_requests?scope=all&state=merged&per_page=100"
+                  "${API}/projects/290/merge_requests?scope=all&state=closed&per_page=100"
+                  "${API}/projects/369/merge_requests?scope=all&state=closed&per_page=100"
+                  | jq -r ".[]|select(.id == ${merge_request_id})|.state") =~ ^(merged|closed)$ ]] ; then
+            docker rmi $repository:$tag ;
+          else
+            project_id=$(curl --silent -L
+                        "${API}/projects/290/merge_requests?scope=all&state=opened&per_page=100"
+                        "${API}/projects/369/merge_requests?scope=all&state=opened&per_page=100"
+                        | jq -r ".[]|select(.id == ${merge_request_id})|.project_id") ;
+            merge_request_iid=$(curl --silent -L 
+                        "${API}/projects/290/merge_requests?scope=all&state=opened&per_page=100"
+                        "${API}/projects/369/merge_requests?scope=all&state=opened&per_page=100"
+                        | jq -r ".[]|select(.id == ${merge_request_id})|.iid") ;
+            echo "Image $repository:$tag still in use (project ${project_id}, idd ${merge_request_iid})." ;
+            if [[ ${project_id} == "" || ${merge_request_iid} == "" ]] ; then
+              echo "$tag not found" ;
+            else
+              docker tag $repository:$tag $repository:unstable-mr-${project_id}-${merge_request_iid}${suffix} ;
+              docker rmi $repository:$tag ;
+            fi ;
+          fi ;
+        fi ;
+      done
     - docker system prune --force
     - docker images