diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml
index 6212afa871c0eccd6590a14ecb0cf3fbbdb0a546..92c662b6372cbf65311a6438b289fed62b34bf6b 100644
--- a/.gitlab-ci.yml
+++ b/.gitlab-ci.yml
@@ -1,8 +1,4 @@
 variables:
-  CI_REGISTRY: ${CODE_REGISTRY}
-  CI_REGISTRY_IMAGE: ${CODE_REGISTRY_IMAGE}
-  DOCKER_DIR: docker-images
-  DOCKER_TAR: ${DOCKER_DIR}/app.tar
   GIT_NSHMP_PASSWORD: ${GITLAB_API_TOKEN}
   GIT_NSHMP_USERNAME: ${GITLAB_USER_EMAIL}
   IMAGE_NAME_HAZ: nshmp-haz:${CI_COMMIT_REF_SLUG}
@@ -10,87 +6,55 @@ variables:
   JACOCO_HTML_DIR: build/reports/jacoco/test/html
   JUNIT_FILES: build/test-results/test/TEST-*.xml
 
+include:
+  - project: 'ghsc/hazdev/pipeline-build-template'
+    ref: '1.1.3'
+    file: 'templates/library.yml'
+
 stages:
-  - assemble
   - test
   - publish
   - deploy
 
-cache:
-  key: one-key-to-rule-them-all
-  paths:
-    - build
-    - .gradle
-
 ####
 # Templates
 ####
 
-.dev-tags:
-  tags:
-    - development
-
-.templates:
-  adjust-image-names-haz: &adjust-image-names-haz |-
-    DOCKERFILE="Dockerfile";
-    IMAGE_NAME=${IMAGE_NAME_HAZ/:master/:latest};
-    INTERNAL_IMAGE_NAME=${CI_REGISTRY_IMAGE}/${IMAGE_NAME_HAZ};
-  adjust-image-names-ws: &adjust-image-names-ws |-
-    DOCKERFILE="ws.Dockerfile";
-    IMAGE_NAME=${IMAGE_NAME_WS/:master/:latest};
-    INTERNAL_IMAGE_NAME=${CI_REGISTRY_IMAGE}/${IMAGE_NAME_WS};
+.gradle:
+  extends:
+    - .tags::development
+  stage: build
+  image: ${DEVOPS_REGISTRY}usgs/java:11
 
 .docker-build:
-  stage: test
-  image: docker:stable
-  extends: .dev-tags
-  only:
-    - branches
-    - master@ghsc/nshmp/nshmp-haz-v2
-    - tags@ghsc/nshmp/nshmp-haz-v2
-  script:
-    - apk add git
-    - mkdir ${DOCKER_DIR}
-    - |
-      docker build \
-        --build-arg ci_job_token="${CI_JOB_TOKEN}" \
-        --build-arg git_username="${GIT_NSHMP_USERNAME}" \
-        --build-arg git_password="${GIT_NSHMP_PASSWORD}" \
-        -f ${DOCKERFILE} \
-        -t local/${IMAGE_NAME} .;
-    - docker save local/${IMAGE_NAME} > ${DOCKER_TAR}
-  artifacts:
-    paths:
-      - ${DOCKER_DIR}
+  extends:
+    - .build
+  variables:
+    DOCKER_BUILD_ARGS: |
+      BUILD_IMAGE=${DEVOPS_REGISTRY}usgs/java:11
+      FROM_IMAGE=${DEVOPS_REGISTRY}usgs/java:11
+      ci_job_token: ${CI_JOB_TOKEN}
+      git_username: ${GIT_NSHMP_USERNAME}
+      git_password: ${GIT_NSHMP_PASSWORD}
 
-.docker-publish:
-  stage: publish
-  image: docker:stable
-  extends: .dev-tags
-  only:
-    - master@ghsc/nshmp/nshmp-haz-v2
-    - tags@ghsc/nshmp/nshmp-haz-v2
-  script:
-    - |
-      echo "${CHS_PASSWORD}" | \
-          docker login --username ${CHS_USERNAME} --password-stdin ${CODE_REGISTRY}
-    - docker load -i ${DOCKER_TAR}
-    - docker tag local/${IMAGE_NAME} ${INTERNAL_IMAGE_NAME}
-    - docker push ${INTERNAL_IMAGE_NAME}
-    - docker image rm local/${IMAGE_NAME}
-    - docker image rm ${INTERNAL_IMAGE_NAME}
-    - rm -rf /root/.docker/config.json
+.templates:
+  adjust-ref: &adjust-ref |
+    if [[ \
+      ${CI_COMMIT_REF_SLUG} == "master" || \
+      ${CI_COMMIT_REF_SLUG} == "production" || \
+      -n "${CI_COMMIT_TAG}" \
+    ]]; then
+      CI_COMMIT_REF_SLUG="latest";
+    fi
 
 .deploy:
   cache: {}
   image: ${CODE_REGISTRY}/ghsc/hazdev/cloud-formation/hazdev-build-runner:latest
   dependencies:
-  before_script:
-    - *adjust-image-names-ws
-    - docker pull ${INTERNAL_IMAGE_NAME}
   script:
+    - *adjust-ref
     - git clone ${GENERIC_SWARM_DEPLOY_REPO} generic-deploy
-    - export REGISTRY=${CI_REGISTRY_IMAGE}
+    - export REGISTRY=${CODE_REGISTRY_IMAGE}
     - cp -v
       generic-deploy/default.config.sh
       generic-deploy/default.funcs.sh
@@ -104,11 +68,8 @@ cache:
   variables:
     APP_NAME: nshmp-haz
     STACK_NAME: nshmp-haz
-  retry:
-    max: 2
-    when: 'always'
 
-.staging:
+.onprem-staging:
   only:
     - master@ghsc/nshmp/nshmp-haz-v2
     - tags@ghsc/nshmp/nshmp-haz-v2
@@ -122,35 +83,18 @@ cache:
     - staging02
 
 ####
-# Stage: assemble
+# Stage: build
 ####
 
 Build Project:
-  stage: assemble
-  image: gradle:jdk11
-  extends: .dev-tags
-  only:
-    - branches
-    - master@ghsc/nshmp/nshmp-haz-v2
-    - tags@ghsc/nshmp/nshmp-haz-v2
+  extends:
+    - .gradle
   script:
-    - ./gradlew --build-cache --no-daemon assemble
-  retry:
-    max: 2
-    when: 'always'
-
-####
-# Stage: Test
-####
+    - ./gradlew assemble
 
 Build Lambda:
-  stage: test
-  image: gradle:jdk11
-  extends: .dev-tags
-  only:
-    - branches
-    - master@ghsc/nshmp/nshmp-haz-v2
-    - tags@ghsc/nshmp/nshmp-haz-v2
+  extends:
+    - .gradle
   script:
     - ./gradlew --no-daemon assemble
     - ./gradlew --no-daemon libs
@@ -159,18 +103,10 @@ Build Lambda:
     paths:
       - build/libs/nshmp-haz-v2.jar
       - build/libs/nshmp-haz-dependencies.zip
-  retry:
-    max: 2
-    when: 'always'
 
 Unit Tests:
-  stage: test
-  image: gradle:jdk11
-  extends: .dev-tags
-  only:
-    - branches
-    - master@ghsc/nshmp/nshmp-haz-v2
-    - tags@ghsc/nshmp/nshmp-haz-v2
+  extends:
+    - .gradle
   coverage: '/Total.*?([0-9]{1,3})%/'
   script:
     - ./gradlew --no-daemon check
@@ -180,46 +116,29 @@ Unit Tests:
       - ${JACOCO_HTML_DIR}
     reports:
       junit: ${JUNIT_FILES}
-  retry:
-    max: 2
-    when: 'always'
 
 Build Haz Image:
-  extends: .docker-build
+  extends:
+    - .docker-build
   before_script:
-    - *adjust-image-names-haz
-  retry:
-    max: 2
-    when: 'always'
+    - apk add git
+    - *adjust-ref
 
 Build WS Image:
-  extends: .docker-build
+  extends:
+    - .docker-build
   before_script:
-    - *adjust-image-names-ws
-  retry:
-    max: 2
-    when: 'always'
+    - apk add git
+    - mv Dockerfile haz.Dockerfile
+    - mv Dockerfile ws.Dockerfile Dockerfile
+    - *adjust-ref
+  variables:
+    CI_PROJECT_NAME: nshmp-haz-ws
 
 ####
 # Stage: Publish
 ####
 
-Publish Haz Image:
-  extends: .docker-publish
-  before_script:
-    - *adjust-image-names-haz
-  retry:
-    max: 2
-    when: 'always'
-
-Publish WS Image:
-  extends: .docker-publish
-  before_script:
-    - *adjust-image-names-ws
-  retry:
-    max: 2
-    when: 'always'
-
 Maven:
   image: gradle:jdk11
   stage: publish
diff --git a/Dockerfile b/Dockerfile
index 652117b624689d9e2fd324dc892c633385061b3a..6b0e12e43f5306cf5719b93cb5a2521b48126fc7 100644
--- a/Dockerfile
+++ b/Dockerfile
@@ -17,14 +17,17 @@
 #       -t nshmp-haz .
 ####
 
+ARG BUILD_IMAGE=usgs/java:11
+ARG FROM_IMAGE=usgs/java:11
+
 ARG project=nshmp-haz-v2
 ARG builder_workdir=/app/${project}
 ARG libs_dir=${builder_workdir}/build/libs
 
 ####
-# Builder image: Build jar and war file.
+# Builder image: Build jar file.
 ####
-FROM usgs/centos:8 as builder
+FROM ${BUILD_IMAGE} as builder
 
 ARG builder_workdir
 ARG libs_dir
@@ -33,7 +36,6 @@ ARG git_password
 ARG gitlab_token=null
 ARG ci_job_token=nul
 
-ENV LANG "en_US.UTF-8"
 ENV GIT_NSHMP_USERNAME ${git_username}
 ENV GIT_NSHMP_PASSWORD ${git_password}
 ENV GITLAB_TOKEN ${gitlab_token}
@@ -43,15 +45,12 @@ WORKDIR ${builder_workdir}
 
 COPY . .
 
-RUN yum install -y glibc-langpack-en java-11-openjdk-devel which git \
-    && ./gradlew --no-daemon assemble
-
-RUN locale
+RUN ./gradlew assemble
 
 ####
-# Application image: Run jar or war file.
+# Application image: Run jar file.
 ####
-FROM usgs/centos:8
+FROM ${FROM_IMAGE}
 
 LABEL maintainer="Peter Powers <pmpowers@usgs.gov>, Brandon Clayton <bclayton@usgs.gov>"
 
@@ -64,7 +63,6 @@ ENV CONFIG_FILE ""
 ENV DEBUG false
 ENV IML ""
 ENV JAVA_XMX "8g"
-ENV LANG "en_US.UTF-8"
 ENV MODEL ""
 ENV MOUNT_MODEL false
 ENV NSHM_VERSION master
@@ -79,8 +77,7 @@ WORKDIR /app
 COPY --from=builder ${libs_dir}/* ./
 COPY scripts scripts
 
-RUN yum update -y \
-    && yum install -y jq git java-11-openjdk-headless
+RUN yum install -y jq
 
 EXPOSE 8080
 ENTRYPOINT [ "bash", "scripts/docker-entrypoint.sh" ]
diff --git a/scripts/nshmp-haz.yml b/scripts/nshmp-haz.yml
index 8b44c6c4e5f468b2eec3932d86784fa269be49cf..b4bfef1830fa9845882644f75947360469199522 100644
--- a/scripts/nshmp-haz.yml
+++ b/scripts/nshmp-haz.yml
@@ -2,7 +2,7 @@ version: "3.7"
 
 # General deployment config
 x-app: &app
-  image: ${REGISTRY}/${IMAGE_NAME}
+  image: ${REGISTRY}/${CI_PROJECT_NAME}:${CI_COMMIT_REF_SLUG}
   deploy:
     restart_policy:
       condition: any
diff --git a/ws.Dockerfile b/ws.Dockerfile
index 085eb23bfeb5a389ec82a3f3fb565d743c1398b1..6bcd629dbdef5131dbe5017e279403ee5b320699 100644
--- a/ws.Dockerfile
+++ b/ws.Dockerfile
@@ -6,18 +6,20 @@
 #       -f ws.Dockerfile
 #       --build-arg gitlab_token=<git-api-token>
 #       -t nshmp-haz-ws .
-
 ####
 
+ARG BUILD_IMAGE=usgs/java:11
+ARG FROM_IMAGE=usgs/java:11
+
 ARG project=nshmp-haz-v2
 ARG builder_workdir=/app/${project}
 ARG libs_dir=${builder_workdir}/build/libs
 ARG jar_file=${libs_dir}/${project}.jar
 
 ####
-# Builder image: Build jar and war file.
+# Builder image: Build war file.
 ####
-FROM usgs/centos:8 as builder
+FROM ${BUILD_IMAGE} as builder
 
 ARG builder_workdir
 ARG libs_dir
@@ -27,7 +29,6 @@ ARG git_password
 ARG gitlab_token=null
 ARG ci_job_token=nul
 
-ENV LANG="en_US.UTF-8"
 ENV GIT_NSHMP_USERNAME ${git_username}
 ENV GIT_NSHMP_PASSWORD ${git_password}
 ENV GITLAB_TOKEN ${gitlab_token}
@@ -36,18 +37,15 @@ ENV CI_JOB_TOKEN ${ci_job_token}
 WORKDIR ${builder_workdir}
 
 COPY . .
-RUN yum install -y glibc-langpack-en java-11-openjdk-devel which git \
-    && ./gradlew --no-daemon assemble
+RUN ./gradlew assemble
 
 ####
-# Application image: Run jar or war file.
+# Application image: Run war file.
 ####
-FROM usgs/centos:8
+FROM ${FROM_IMAGE}
 
 LABEL maintainer="Peter Powers <pmpowers@usgs.gov>, Brandon Clayton <bclayton@usgs.gov>"
 
-ENV LANG="en_US.UTF-8"
-
 ARG libs_dir
 ARG builder_workdir
 ARG project
@@ -61,8 +59,5 @@ WORKDIR /app
 COPY --from=builder ${libs_dir}/* ./
 COPY scripts scripts
 
-RUN yum update -y \
-    && yum install -y git java-11-openjdk-headless
-
 EXPOSE 8080
 ENTRYPOINT [ "bash", "scripts/docker-entrypoint.ws.sh" ]