diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml
index b172c74131992150a7330059361d6ef22dadc7e5..88929fb36c2cd6c19dd6e3eeb57e82542b3bf30b 100644
--- a/.gitlab-ci.yml
+++ b/.gitlab-ci.yml
@@ -66,25 +66,6 @@ docker_store_images_changes:
     refs:
       - tags
       - master
-# TODO(Corne): Remove this after first run
-docker_build_image_devices:
-  extends: .base_docker_images
-  script:
-    - bash $CI_PROJECT_DIR/sbin/tag_and_push_docker_image.sh apsct-sim latest
-    - bash $CI_PROJECT_DIR/sbin/tag_and_push_docker_image.sh apspu-sim latest
-    - bash $CI_PROJECT_DIR/sbin/tag_and_push_docker_image.sh recv-sim latest
-    - bash $CI_PROJECT_DIR/sbin/tag_and_push_docker_image.sh sdptr-sim latest
-    - bash $CI_PROJECT_DIR/sbin/tag_and_push_docker_image.sh unb2-sim latest
-    - bash $CI_PROJECT_DIR/sbin/tag_and_push_docker_image.sh device-apsct latest
-    - bash $CI_PROJECT_DIR/sbin/tag_and_push_docker_image.sh device-apspu latest
-    - bash $CI_PROJECT_DIR/sbin/tag_and_push_docker_image.sh device-boot latest
-    - bash $CI_PROJECT_DIR/sbin/tag_and_push_docker_image.sh device-docker latest
-    - bash $CI_PROJECT_DIR/sbin/tag_and_push_docker_image.sh device-observation_control latest
-    - bash $CI_PROJECT_DIR/sbin/tag_and_push_docker_image.sh device-recv latest
-    - bash $CI_PROJECT_DIR/sbin/tag_and_push_docker_image.sh device-sdp latest
-    - bash $CI_PROJECT_DIR/sbin/tag_and_push_docker_image.sh device-sst latest
-    - bash $CI_PROJECT_DIR/sbin/tag_and_push_docker_image.sh device-unb2 latest
-    - bash $CI_PROJECT_DIR/sbin/tag_and_push_docker_image.sh device-xst latest
 docker_build_image_all:
   extends: .base_docker_images
   only:
@@ -219,6 +200,96 @@ docker_build_image_unb2_sim:
   script:
 #    Do not remove 'bash' or statement will be ignored by primitive docker shell
     - bash $CI_PROJECT_DIR/sbin/tag_and_push_docker_image.sh unb2-sim $tag
+docker_build_image_device_apsct:
+  extends: .base_docker_images_except
+  only:
+    changes:
+      - docker-compose/device-aspct.yml
+      - docker-compose/lofar-device-base/*
+  script:
+#    Do not remove 'bash' or statement will be ignored by primitive docker shell
+    - bash $CI_PROJECT_DIR/sbin/tag_and_push_docker_image.sh device-aspct $tag
+docker_build_image_device_apspu:
+  extends: .base_docker_images_except
+  only:
+    changes:
+      - docker-compose/device-apspu.yml
+      - docker-compose/lofar-device-base/*
+  script:
+#    Do not remove 'bash' or statement will be ignored by primitive docker shell
+    - bash $CI_PROJECT_DIR/sbin/tag_and_push_docker_image.sh device-apspu $tag
+docker_build_image_device_boot:
+  extends: .base_docker_images_except
+  only:
+    changes:
+      - docker-compose/device-boot.yml
+      - docker-compose/lofar-device-base/*
+  script:
+#    Do not remove 'bash' or statement will be ignored by primitive docker shell
+    - bash $CI_PROJECT_DIR/sbin/tag_and_push_docker_image.sh device-boot $tag
+docker_build_image_device_docker:
+  extends: .base_docker_images_except
+  only:
+    changes:
+      - docker-compose/device-docker.yml
+      - docker-compose/lofar-device-base/*
+  script:
+#    Do not remove 'bash' or statement will be ignored by primitive docker shell
+    - bash $CI_PROJECT_DIR/sbin/tag_and_push_docker_image.sh device-docker $tag
+docker_build_image_device_ovservation_control:
+  extends: .base_docker_images_except
+  only:
+    changes:
+      - docker-compose/device-observation_control.yml
+      - docker-compose/lofar-device-base/*
+  script:
+#    Do not remove 'bash' or statement will be ignored by primitive docker shell
+    - bash $CI_PROJECT_DIR/sbin/tag_and_push_docker_image.sh device-observation_control $tag
+docker_build_image_device_recv:
+  extends: .base_docker_images_except
+  only:
+    changes:
+      - docker-compose/device-recv.yml
+      - docker-compose/lofar-device-base/*
+  script:
+#    Do not remove 'bash' or statement will be ignored by primitive docker shell
+    - bash $CI_PROJECT_DIR/sbin/tag_and_push_docker_image.sh device-recv $tag
+docker_build_image_device_sdp:
+  extends: .base_docker_images_except
+  only:
+    changes:
+      - docker-compose/device-sdp.yml
+      - docker-compose/lofar-device-base/*
+  script:
+#    Do not remove 'bash' or statement will be ignored by primitive docker shell
+    - bash $CI_PROJECT_DIR/sbin/tag_and_push_docker_image.sh device-sdp $tag
+docker_build_image_device_sst:
+  extends: .base_docker_images_except
+  only:
+    changes:
+      - docker-compose/device-sst.yml
+      - docker-compose/lofar-device-base/*
+  script:
+#    Do not remove 'bash' or statement will be ignored by primitive docker shell
+    - bash $CI_PROJECT_DIR/sbin/tag_and_push_docker_image.sh device-sst $tag
+docker_build_image_device_unb2:
+  extends: .base_docker_images_except
+  only:
+    changes:
+      - docker-compose/device-unb2.yml
+      - docker-compose/lofar-device-base/*
+  script:
+#    Do not remove 'bash' or statement will be ignored by primitive docker shell
+    - bash $CI_PROJECT_DIR/sbin/tag_and_push_docker_image.sh device-unb2 $tag
+docker_build_image_device_xst:
+  extends: .base_docker_images_except
+  only:
+    changes:
+      - docker-compose/device-xst.yml
+      - docker-compose/lofar-device-base/*
+  script:
+#    Do not remove 'bash' or statement will be ignored by primitive docker shell
+    - bash $CI_PROJECT_DIR/sbin/tag_and_push_docker_image.sh device-xst $tag
 newline_at_eof:
   stage: linting
   before_script:
diff --git a/sbin/tag_and_push_docker_image.sh b/sbin/tag_and_push_docker_image.sh
index 73b7e4c450dd28b706f91d6bb19117054689c1a4..814c51649d62b502105bbef0295cb827228d4e02 100755
--- a/sbin/tag_and_push_docker_image.sh
+++ b/sbin/tag_and_push_docker_image.sh
@@ -36,30 +36,33 @@ if [ -z "${1+x}" ]; then
   exit 0
 fi
 
-# Tuple of images and queries to detect changes
+# Triple tuple of docker-compose names, image names and if necessary for
+# integration tests.
 # TODO(Corne): Have this list generated from the .yml files
 LOCAL_IMAGES=(
-  "elk elk" "elk-configure-host elk-configure-host"
-  "lofar-device-base lofar-device-base"
-
-  "apsct-sim docker-compose_apsct-sim" "apspu-sim docker-compose_apspu-sim"
-  "recv-sim docker-compose_recv-sim" "sdptr-sim docker-compose_sdptr-sim"
-  "unb2-sim docker-compose_unb2-sim"
-
-  "device-apsct device-apsct" "device-apspu device-apspu"
-  "device-boot device-boot" "device-docker device-docker"
-  "device-observation_control device-observation_control"
-  "device-recv device-recv" "device-sdp device-sdp" "device-sst device-sst"
-  "device-unb2 device-unb2" "device-xst device-xst"
-
-  "itango docker-compose_itango"
+  "elk elk y" "elk-configure-host elk-configure-host y"
+  "lofar-device-base lofar-device-base y"
+
+  "apsct-sim docker-compose_apsct-sim y" "apspu-sim docker-compose_apspu-sim y"
+  "recv-sim docker-compose_recv-sim y" "sdptr-sim docker-compose_sdptr-sim y"
+  "unb2-sim docker-compose_unb2-sim y"
+
+  "device-apsct device-apsct y" "device-apspu device-apspu y"
+  "device-boot device-boot y" "device-docker device-docker y"
+  "device-observation_control device-observation_control y"
+  "device-recv device-recv y" "device-sdp device-sdp y"
+  "device-sst device-sst y" "device-unb2 device-unb2 y"
+  "device-xst device-xst y"
+
+  "itango docker-compose_itango y"
+
+  "grafana grafana n" "prometheus prometheus n"
+  "jupyter docker-compose_jupyter n"
+  "integration-test docker-compose_integration-test n"
+  "tango-prometheus-exporter docker-compose_tango-prometheus-exporter n"
 )
 
-    # "grafana grafana"
-   # "prometheus prometheus"
-     # "jupyter docker-compose_jupyter"
-  # "integration-test docker-compose_integration-test"
-  # "tango-prometheus-exporter docker-compose_tango-prometheus-exporter"
+
 
 # If first argument set run second stage, determine LOCAL_IMAGE to build and
 # push from the argument
@@ -119,16 +122,20 @@ if [ ! -z "${1+x}" ] && [ "${1}" == "pull" ]; then
       # Set, splits tuple into $1 and $2. this shadows previous variables
     # shellcheck disable=SC2086
     set -- $image
-    local_url="${LOCAL_DOCKER_REGISTRY_HOST}/${LOCAL_DOCKER_REGISTRY_USER}/${2}"
-    # Pull images, at least one of the two images must succeed
-    echo "docker pull ${local_url}:${tag}"
-    docker pull "${local_url}:${tag}" || docker pull "${local_url}:latest" || exit 1
-    # Ensure the images will have the same tags as generated by docker-compose
-    docker tag "${local_url}:${tag}" "${2}" || docker tag "${local_url}:latest" "${2}" || exit 1
+
+    # Only download images which are needed for integration test
+    if [ "${3}" == "y" ]; then
+      local_url="${LOCAL_DOCKER_REGISTRY_HOST}/${LOCAL_DOCKER_REGISTRY_USER}/${2}"
+      # Pull images, at least one of the two images must succeed
+      echo "docker pull ${local_url}:${tag}"
+      docker pull "${local_url}:${tag}" || docker pull "${local_url}:latest" || exit 1
+      # Ensure the images will have the same tags as generated by docker-compose
+      docker tag "${local_url}:${tag}" "${2}" || docker tag "${local_url}:latest" "${2}" || exit 1
+    fi
   done
 
   exit 0
 fi
 
-# Someone nothing ran, that is an error do not fail silently
+# Somehow nothing ran, that is an error do not fail silently
 exit 1