diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml
index b892394f3ee8718191760803f02ebc0167e6c961..84a9e93a06402777d6b8448ee23a49d31e21d8a8 100644
--- a/.gitlab-ci.yml
+++ b/.gitlab-ci.yml
@@ -2,12 +2,17 @@ stages:
     - build-dev
     - push-dev
     - deploy-dev
+    # - .post
 
 workflow:
     rules:
-        - if: $CI_COMMIT_MESSAGE =~ /\A(?i)-wip/
-          when: never
-        - if: '$CI_PIPELINE_SOURCE == "push"'
+        # - if: $CI_COMMIT_MESSAGE =~ /\A(?i)-wip/
+        #   when: never
+        # - if: '$CI_PIPELINE_SOURCE == "push"'
+        - if: $CI_MERGE_REQUEST_IID
+        - if: $CI_COMMIT_TAG
+        - if: $CI_MERGE_REQUEST_SOURCE_BRANCH_NAME == $CI_DEFAULT_BRANCH
+
 
 image: docker:19.03.12
 
@@ -25,31 +30,60 @@ image: docker:19.03.12
 build dev workflow:
     stage: build-dev
     script:
-        - docker build -t marconi.aoc.nrao.edu/workspaces/workflow:$CI_COMMIT_BRANCH -f services/workflow/Dockerfile.dev .
-        - docker tag marconi.aoc.nrao.edu/workspaces/workflow:$CI_COMMIT_BRANCH marconi.aoc.nrao.edu/workspaces/workflow:$CI_COMMIT_SHORT_SHA
+        - docker build -t marconi.aoc.nrao.edu/workspaces/workflow:$CI_MERGE_REQUEST_SOURCE_BRANCH_NAME -f services/workflow/Dockerfile.dev .
+        - docker tag marconi.aoc.nrao.edu/workspaces/workflow:$CI_MERGE_REQUEST_SOURCE_BRANCH_NAME marconi.aoc.nrao.edu/workspaces/workflow:$CI_COMMIT_SHORT_SHA
+    rules:
+        - if: $CI_COMMIT_MESSAGE =~ /\A(?i)Revert/
+          when: always
+        - if: '$CI_PIPELINE_SOURCE == "merge_request_event"'
+          changes:
+            - services/workflow/**/*
+            - apps/cli/**/*.{py,sh}
+            - shared/**/*.{py,sh}
 
 build dev capability:
     stage: build-dev
     script:
-        - docker build -t marconi.aoc.nrao.edu/workspaces/capability:$CI_COMMIT_BRANCH -f services/capability/Dockerfile.dev .
-        - docker tag marconi.aoc.nrao.edu/workspaces/capability:$CI_COMMIT_BRANCH marconi.aoc.nrao.edu/workspaces/capability:$CI_COMMIT_SHORT_SHA
+        - docker build -t marconi.aoc.nrao.edu/workspaces/capability:$CI_MERGE_REQUEST_SOURCE_BRANCH_NAME -f services/capability/Dockerfile.dev .
+        - docker tag marconi.aoc.nrao.edu/workspaces/capability:$CI_MERGE_REQUEST_SOURCE_BRANCH_NAME marconi.aoc.nrao.edu/workspaces/capability:$CI_COMMIT_SHORT_SHA
+    rules:
+        - if: $CI_COMMIT_MESSAGE =~ /\A(?i)Revert/
+          when: always
+        - if: '$CI_PIPELINE_SOURCE == "merge_request_event"'
+          changes:
+            - services/capability/**/*
+            - apps/cli/**/*.{py,sh}
+            - shared/**/*.{py,sh}
 
 # Push
 push dev workflow:
     stage: push-dev
     script:
         - echo "$HARBOR_PASSWORD" | docker login -u "$HARBOR_USER" --password-stdin $HARBOR_URL
+        - docker tag marconi.aoc.nrao.edu/workspaces/workflow:$CI_MERGE_REQUEST_SOURCE_BRANCH_NAME marconi.aoc.nrao.edu/workspaces/workflow:dev
         - docker push marconi.aoc.nrao.edu/workspaces/workflow:$CI_COMMIT_SHORT_SHA
-        - docker push marconi.aoc.nrao.edu/workspaces/workflow:$CI_COMMIT_BRANCH
-    needs: ["build dev workflow"]
+        - docker push marconi.aoc.nrao.edu/workspaces/workflow:$CI_MERGE_REQUEST_SOURCE_BRANCH_NAME
+        - docker push marconi.aoc.nrao.edu/workspaces/workflow:dev
+    rules:
+        - if: $CI_COMMIT_MESSAGE =~ /\A(?i)Merge/
+    # needs: ["build dev workflow"]
 
 push dev capability:
     stage: push-dev
     script:
         - echo "$HARBOR_PASSWORD" | docker login -u "$HARBOR_USER" --password-stdin $HARBOR_URL
+        - docker tag marconi.aoc.nrao.edu/workspaces/capability:$CI_MERGE_REQUEST_SOURCE_BRANCH_NAME marconi.aoc.nrao.edu/workspaces/capability:dev
         - docker push marconi.aoc.nrao.edu/workspaces/capability:$CI_COMMIT_SHORT_SHA
-        - docker push marconi.aoc.nrao.edu/workspaces/capability:$CI_COMMIT_BRANCH
-    needs: ["build dev capability"]
+        - docker push marconi.aoc.nrao.edu/workspaces/capability:$CI_MERGE_REQUEST_SOURCE_BRANCH_NAME
+    rules:
+        - if: $CI_COMMIT_MESSAGE =~ /\A(?i)Merge/
+    # needs: ["build dev capability"]
+
+# Cleanup
+# clean runner:
+#     stage: .post
+#     script:
+#         - docker images -q --filter=reference="marconi.aoc.nrao.edu/workspaces/*" | xargs docker rmi -f
 
 # Tests
 
@@ -62,8 +96,8 @@ push dev capability:
 #     when: manual
 
 # Deploy
-deploy dev:
-    stage: deploy-dev
-    script:
-        - env SWARM_NODE_ENV="dev" docker stack deploy --compose-file docker-compose.dev.yml workspaces-$CI_COMMIT_SHORT_SHA
-    when: manual
+# deploy dev:
+#     stage: deploy-dev
+#     script:
+#         - env SWARM_NODE_ENV="dev" docker stack deploy --compose-file docker-compose.dev.yml workspaces-dev
+#     when: manual
\ No newline at end of file
diff --git a/services/workflow/Dockerfile.dev b/services/workflow/Dockerfile.dev
index 78a6686085abb564f88959a411594fffd82bc426..3c7790e50098bb887997b81272c81ebcf30956d2 100644
--- a/services/workflow/Dockerfile.dev
+++ b/services/workflow/Dockerfile.dev
@@ -1,11 +1,12 @@
 # This is nrao:workflow
 FROM marconi.aoc.nrao.edu/ops/base:workspaces
 
+RUN pip --version
 # Get workflow code into the image
 WORKDIR /code
 COPY ./services/workflow ./
 COPY ./shared ./src/shared
-COPY ./apps ./src/apps
+COPY ./apps/cli ./src/apps/cli
 
 # Python library installation
 RUN pip install -r requirements.txt \
@@ -15,3 +16,4 @@ RUN pip install -r requirements.txt \
 ENV CAPO_PROFILE dev
 
 ENTRYPOINT pserve --reload development.ini
+