diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml
index 6c687220cabd6dd04eed920c789b0bd405c5e341..d4ae4cde029a2dea14786b76877699d6708c4f30 100644
--- a/.gitlab-ci.yml
+++ b/.gitlab-ci.yml
@@ -2,6 +2,8 @@ image: docker:latest
 
 variables:
   DOCKER_DRIVER: overlay
+  DOCKER_BRANCH: $CI_REGISTRY_IMAGE:$CI_COMMIT_REF_NAME
+  DOCKER_LATEST: $CI_REGISTRY_IMAGE:latest
   BRANCH: $CI_REGISTRY_IMAGE:$CI_COMMIT_REF_NAME
   COMMIT: $CI_REGISTRY_IMAGE:$CI_COMMIT_SHA
   NIGHTLY: $CI_REGISTRY_IMAGE:nightly
@@ -21,6 +23,8 @@ before_script:
   # stage. 
   - export TMPDIR=/tmp
   - export GSTLAL_FIR_WHITEN=0
+  - yum clean all
+  - yum makecache
     
 cache:
   key: $CI_JOB_NAME
@@ -36,6 +40,7 @@ stages:
     - test-burst
     - test-offline
     - docker
+    - docker-latest
     - nightly-pages
     - verify
 
@@ -104,156 +109,6 @@ level2:rpm:gstlal-burst:
     - level0:rpm:gstlal
     - level1:rpm:gstlal-ugly
 
-#level0:gstlal:
-#  image: containers.ligo.org/alexander-pace/gstlal-dev/gstlal-dev:el7-mkl-1.14
-#  stage: level0
-#  script:
-#    - cd gstlal
-#    - ./00init.sh
-#    - ./configure --prefix=${GSTLAL_DIR}
-#    - make
-#    - make install
-#  artifacts:
-#    expire_in: 3h
-#    paths:
-#      - ${GSTLAL_DIR}
-#    when: always
-#  only:
-#    - pushes
-#    - schedules
-#    
-#level1:gstlal-ugly:
-#  image: containers.ligo.org/alexander-pace/gstlal-dev/gstlal-dev:el7-mkl-1.14
-#  stage: level1
-#  dependencies:
-#    - level0:gstlal
-#  script:
-#    - cd gstlal-ugly
-#    - ./00init.sh
-#    - ./configure --prefix=${GSTLAL_DIR}
-#    - make
-#    - make install
-#  artifacts:
-#    expire_in: 3h
-#    paths:
-#      - ${GSTLAL_DIR}
-#    when: always
-#  only:
-#    - pushes
-#    - schedules
-#
-#level2:gstlal-calibration:
-#  image: containers.ligo.org/alexander-pace/gstlal-dev/gstlal-dev:el7-mkl-1.14
-#  stage: level2
-#  dependencies:
-#    - level1:gstlal-ugly
-#  script:
-#    - cd gstlal-calibration
-#    - ./00init.sh
-#    - ./configure --prefix=${GSTLAL_DIR}
-#    - make
-#    - make install
-#  artifacts:
-#    expire_in: 3h
-#    paths:
-#      - ${GSTLAL_DIR}
-#    when: always
-#  only:
-#    - pushes
-#    - schedules
-#
-#level2:gstlal-inspiral:
-#  image: containers.ligo.org/alexander-pace/gstlal-dev/gstlal-dev:el7-mkl-1.14
-#  stage: level2
-#  dependencies:
-#    - level1:gstlal-ugly
-#  script:
-#    - cd gstlal-inspiral
-#    - ./00init.sh
-#    - ./configure --prefix=${GSTLAL_DIR} --disable-massmodel
-#    - make
-#    - make install
-#  artifacts:
-#    expire_in: 3h
-#    paths:
-#      - ${GSTLAL_DIR}
-#    when: always
-#  only:
-#    - pushes
-#    - schedules
-#    
-#level2:gstlal-burst:
-#  image: containers.ligo.org/alexander-pace/gstlal-dev/gstlal-dev:el7-mkl-1.14
-#  stage: level2
-#  dependencies:
-#    - level1:gstlal-ugly
-#  script:
-#    - cd gstlal-burst
-#    - ./00init.sh
-#    - ./configure --prefix=${GSTLAL_DIR}
-#    - make
-#    - make install
-#  artifacts:
-#    expire_in: 3h
-#    paths:
-#      - ${GSTLAL_DIR}
-#    when: always
-#  only:
-#    - pushes
-#    - schedules
-#  
-#gstlal-verify:
-#  image: containers.ligo.org/alexander-pace/gstlal-dev/gstlal-dev:el7-mkl-1.14
-#  stage: verify
-#  script:
-#    # -------------------------------------------------------------------
-#    #  gstlal
-#    # -------------------------------------------------------------------
-#    #- echo "$PWD" > ./pwd_output.out
-#    - cd gstlal
-#    - ./00init.sh
-#    - ./configure --prefix=${GSTLAL_DIR}
-#    - make
-#    - make install
-#    - cd ..
-#    # -------------------------------------------------------------------
-#    #  gstlal-ugly
-#    # -------------------------------------------------------------------
-#    - cd gstlal-ugly
-#    - ./00init.sh
-#    - ./configure --prefix=${GSTLAL_DIR}
-#    - make
-#    - make install
-#    - cd ..
-#    # -------------------------------------------------------------------
-#    #  gstlal-calibration
-#    # -------------------------------------------------------------------
-#    - cd gstlal-calibration
-#    - ./00init.sh
-#    - ./configure --prefix=${GSTLAL_DIR}
-#    - make
-#    - make install
-#    - cd ..
-#    # -------------------------------------------------------------------
-#    #  gstlal-inspiral
-#    # -------------------------------------------------------------------
-#    - cd gstlal-inspiral
-#    - ./00init.sh
-#    - ./configure --prefix=${GSTLAL_DIR} --disable-massmodel
-#    - make
-#    - make install
-#    - cd ..
-#    # -------------------------------------------------------------------
-#    #  gstlal-burst
-#    # -------------------------------------------------------------------
-#    - cd gstlal-burst
-#    - ./00init.sh
-#    - ./configure --prefix=${GSTLAL_DIR}
-#    - make
-#    - make install
-#    - cd ..
-#  only:
-#    - manual
 
 test:gstlal:
   image: containers.ligo.org/alexander.pace/gstlal-dev/gstlal-dev:el7
@@ -265,7 +120,6 @@ test:gstlal:
     - level2:rpm:gstlal-inspiral
     - level2:rpm:gstlal-burst
   script:
-
     # Install RPMs and set up the test environment:
     - if [ -d rpmbuild ]; then yum -y install rpmbuild/RPMS/x86_64/*.rpm; fi
     - export GSTLAL_FIR_WHITEN=0
@@ -277,7 +131,7 @@ test:gstlal:
 
     # Run doctests
     - cd gstlal
-    - python -m pytest -v --doctest-modules --ignore gst/python --ignore port-tools --ignore tests --ignore share --ignore python/misc.py --ignore python/pipeparts/__init__.py --ignore python/matplotlibhelper.py --ignore python/dagfile.py --ignore python/httpinterface.py
+    - python3 -m pytest -v --doctest-modules --ignore gst/python --ignore port-tools --ignore tests --ignore share --ignore python/misc.py --ignore python/pipeparts/__init__.py --ignore python/matplotlibhelper.py --ignore python/dagfile.py --ignore python/httpinterface.py
   only:
     - schedules
     - pushes
@@ -292,14 +146,13 @@ test:gstlal-inspiral:
     - level2:rpm:gstlal-inspiral
     - level2:rpm:gstlal-burst
   script:
-
     # Install RPMs and set up the test environment:
     - if [ -d rpmbuild ]; then yum -y install rpmbuild/RPMS/x86_64/*.rpm; fi
     - export GSTLAL_FIR_WHITEN=0
     - gst-inspect-1.0
 
     - cd gstlal-inspiral
-    - python -m pytest -v --doctest-modules --ignore gst/python --ignore tests --ignore python/lloidplots.py --ignore python/llweb.py --ignore python/plotsegments.py --ignore python/plotsensitivity.py --ignore python/snglinspiraltable.py --ignore python/spawaveform.py --ignore python/spiirparts.py --ignore python/imr_utils.py --ignore python/stats/inspiral_extrinsics.py --ignore python/templates.py --ignore python/inspiral_pipe.py --ignore python/plotsnr.py --ignore python/p_astro_gstlal.py
+    - python3 -m pytest -v --doctest-modules --ignore gst/python --ignore tests --ignore python/lloidplots.py --ignore python/llweb.py --ignore python/plotsegments.py --ignore python/plotsensitivity.py --ignore python/snglinspiraltable.py --ignore python/spawaveform.py --ignore python/spiirparts.py --ignore python/imr_utils.py --ignore python/stats/inspiral_extrinsics.py --ignore python/templates.py --ignore python/inspiral_pipe.py --ignore python/plotsnr.py --ignore python/p_astro_gstlal.py
   only:
     - schedules
     - pushes
@@ -315,14 +168,13 @@ test:gstlal-burst:
     - level2:rpm:gstlal-inspiral
     - level2:rpm:gstlal-burst
   script:
-
     # Install RPMs and set up the test environment:
     - if [ -d rpmbuild ]; then yum -y install rpmbuild/RPMS/x86_64/*.rpm; fi
     - export GSTLAL_FIR_WHITEN=0
     - gst-inspect-1.0
 
     - cd gstlal-burst
-    - python -m pytest -v --doctest-modules --ignore python/excesspower --ignore python/string --ignore tests/trigger_test_01.py
+    - python3 -m pytest -v --doctest-modules --ignore python/excesspower --ignore python/string --ignore tests/trigger_test_01.py
   only:
     - schedules
     - pushes
@@ -338,10 +190,12 @@ test:offline:
     - level2:rpm:gstlal-inspiral
     - level2:rpm:gstlal-burst
   script:
+    # Install RPMs and set up the test environment:
+    - if [ -d rpmbuild ]; then yum -y install rpmbuild/RPMS/x86_64/*.rpm; fi
+
     # Set up directory structure and copy over built-dependencies from container:
     - mkdir public
     # Install RPMs and set up the test environment:
-    - if [ -d rpmbuild ]; then yum -y install rpmbuild/RPMS/x86_64/*.rpm; fi
     - gst-inspect-1.0
 
     # Export variables for the offline tutorial
@@ -420,8 +274,8 @@ docker:el7:
 
     # Build the container:
     - docker login -u gitlab-ci-token -p $CI_JOB_TOKEN $CI_REGISTRY
-    - docker build --pull -t $CI_REGISTRY_IMAGE/gstlal:el7 --file .gitlab-ci.Dockerfile.e7 .
-    - docker push $CI_REGISTRY_IMAGE/gstlal:el7
+    - docker build --pull -t $DOCKER_BRANCH --file .gitlab-ci.Dockerfile.e7 .
+    - docker push $DOCKER_BRANCH
   dependencies:
     - level0:rpm:gstlal
     - level1:rpm:gstlal-ugly
@@ -432,3 +286,24 @@ docker:el7:
   only:
     - schedules
 
+branch_image:
+  stage: docker
+  script:
+    - mkdir rpms 
+    - mv rpmbuild/RPMS/x86_64/*.rpm rpms
+    - rm -rf rpmbuild*
+    - docker login -u gitlab-ci-token -p $CI_JOB_TOKEN $CI_REGISTRY
+    - docker build --pull -t $DOCKER_BRANCH --file .gitlab-ci.Dockerfile.e7 .
+    - docker push $DOCKER_BRANCH
+
+latest_image:
+  stage: docker-latest
+  dependencies:
+    - branch_image
+  only:
+    refs:
+      - master
+  script:
+    - docker tag $DOCKER_BRANCH $DOCKER_LATEST
+    - docker push $DOCKER_LATEST
+