diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml
new file mode 100644
index 0000000000000000000000000000000000000000..b258433d94ec4b89784707ea72a0af5630384a1a
--- /dev/null
+++ b/.gitlab-ci.yml
@@ -0,0 +1,204 @@
+variables:
+  CI_DEFAULT_BRANCH: legacy-ws-main
+  CI_PROJECT_NAME: nshmp-haz-ws-legacy
+  PRODUCTION_BRANCH: legacy-ws-production
+  UPSTREAM_PATH: ghsc/nshmp/nshmp-haz
+
+# Do not run for merge requests
+workflow:
+  rules:
+    - if: $CI_COMMIT_TAG
+    - if: $CI_COMMIT_BRANCH
+
+stages:
+  - build
+  - trigger
+
+default:
+  tags:
+    - nshmp
+
+####
+# Environment Templates
+####
+
+##
+# Rule for development environment
+##
+.development-env: &development-env
+  if: >
+    $CI_PROJECT_PATH != $UPSTREAM_PATH
+    || (
+      $CI_PROJECT_PATH == $UPSTREAM_PATH
+      && (
+        $CI_COMMIT_BRANCH != $CI_DEFAULT_BRANCH
+        && $CI_COMMIT_BRANCH != $PRODUCTION_BRANCH
+      )
+    )
+  variables:
+    ENVIRONMENT: development
+
+##
+# Rule for staging environment
+##
+.staging-env: &staging-env
+  if: >
+    $CI_PROJECT_PATH == $UPSTREAM_PATH
+    && $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH
+  variables:
+    ENVIRONMENT: staging
+
+##
+# Rule for production envrionment
+##
+.production-env: &production-env
+  if: >
+    $CI_PROJECT_PATH == $UPSTREAM_PATH
+    && $CI_COMMIT_BRANCH == $PRODUCTION_BRANCH
+  variables:
+    ENVIRONMENT: production
+
+####
+# Java Templates
+####
+
+##
+# General Java setup
+##
+.java:
+  image: ${DEVOPS_REGISTRY}usgs/amazoncorretto:8
+
+####
+# Docker Templates
+####
+
+##
+# Docker in Docker
+##
+.dind:
+  image: ${DEVOPS_REGISTRY}docker:19.03-git
+  services:
+    - alias: docker
+      name: ${DEVOPS_REGISTRY}docker:19.03-dind
+  variables:
+    DOCKER_DRIVER: overlay2
+
+##
+# Build Docker image and push to registry.
+#
+# Pushes to internal registry for all branches and Docker registry
+# on default upstream and production upstream branches.
+##
+.docker-build:
+  extends:
+    - .dind
+  needs: []
+  rules:
+    - *development-env
+    - *staging-env
+    - *production-env
+  script:
+    - BUILD_ARGS='';
+    - |
+      for arg in ${DOCKER_BUILD_ARGS}; do
+        BUILD_ARGS="${BUILD_ARGS} --build-arg ${arg}";
+      done
+    - env_image_name="${CODE_REGISTRY_IMAGE}/${CI_PROJECT_NAME}:${ENVIRONMENT}-latest";
+    - latest_image_name="${CODE_REGISTRY_IMAGE}/${CI_PROJECT_NAME}:latest";
+    - sha_image_name="${CODE_REGISTRY_IMAGE}/${CI_PROJECT_NAME}:${IMAGE_TAG}";
+    - |
+      docker build \
+        ${BUILD_ARGS} \
+        --pull \
+        --tag "${env_image_name}" \
+        --file "${DOCKERFILE}" \
+        .;
+    - docker push "${env_image_name}";
+    - |
+      docker tag "${env_image_name}" "${sha_image_name}";
+      docker push "${sha_image_name}";
+    - |
+      docker_latest_image="usgs/${CI_PROJECT_NAME}:latest";
+      docker_env_image="usgs/${CI_PROJECT_NAME}:${ENVIRONMENT}-latest";
+
+      docker tag "${env_image_name}" "${docker_env_image}";
+      docker push "${docker_env_image}";
+
+      if  [[ "${ENVIRONMENT}" != "development" ]]; then
+        docker tag "${env_image_name}" "${latest_image_name}";
+        docker push "${latest_image_name}";
+
+        docker tag "${env_image_name}" "${docker_latest_image}";
+        docker push "${docker_latest_image}";
+      fi
+    - |
+      printf "
+        --------
+        Image Name - %s:%s
+        --------
+      " "${CI_PROJECT_NAME}" "${IMAGE_TAG}";
+  stage: build
+  tags:
+    - build
+
+####
+# Stage: build
+####
+
+Build Image:
+  extends:
+    - .docker-build
+  variables:
+    DOCKER_BUILD_ARGS: |
+      BUILD_IMAGE=${DEVOPS_REGISTRY}usgs/amazoncorretto:8
+      FROM_IMAGE=${DEVOPS_REGISTRY}usgs/amazoncorretto:8
+    DOCKERFILE: Dockerfile
+    IMAGE_TAG: ${ENVIRONMENT}-${CI_COMMIT_SHORT_SHA}
+
+Build Project:
+  extends:
+    - .java
+  before_script:
+    - mkdir -p ${DIR}
+    - mv $(ls -1 | grep -v $(basename $(dirname ${DIR}))) ${DIR}/.
+    - pushd ${DIR}
+    - pushd ..
+    - git clone https://code.usgs.gov/ghsc/nshmp/nshmp-haz.git --branch=legacy-main nshmp-haz
+    - popd
+  script:
+    - ./gradlew assemble
+  stage: build
+  variables:
+    DIR: legacy/nshmp-haz-ws
+
+####
+# Stage: trigger
+####
+
+Trigger nshmp-haz-ws Legacy CDK:
+  rules:
+    -
+      <<: *development-env
+      when: manual
+    - *staging-env
+    - *production-env
+  script:
+    - apk add curl
+    - |
+      if [ "${ENVIRONMENT}" == 'production' ]; then
+        REF="production";
+      fi
+    - |
+      curl --request POST \
+        --form token=${NSHMP_HAZ_WS_LEGACY_CDK_TRIGGER_TOKEN} \
+        --form ref=${REF} \
+        --form "variables[description]=Triggered by nshmp-haz legacy-ws" \
+        --form "variables[ENVIRONMENT]=${ENVIRONMENT}" \
+        --form "variables[SOURCE_CODE_BRANCH]=${CI_COMMIT_REF_SLUG}" \
+        --form "variables[SOURCE_CODE_PROJECT_PATH]=${CI_PROJECT_PATH}" \
+        --form "variables[TRIGGER_PASSCODE]=${NSHMP_HAZ_WS_LEGACY_CDK_TRIGGER_TOKEN}" \
+        "https://${PRIVATE_GITLAB}/api/v4/projects/${NSHMP_HAZ_WS_LEGACY_CDK_PROJECT_ID}/trigger/pipeline"
+  stage: trigger
+  variables:
+    REF: main
+    UPSTREAM_PATH: ghsc/nshmp/nshmp-haz
diff --git a/Dockerfile b/Dockerfile
index b303578995f0f53e6846185e5406e4ebabf1e600..fa5ab6f274c908129b031b88a7dfe55367e44f58 100644
--- a/Dockerfile
+++ b/Dockerfile
@@ -37,7 +37,9 @@ ENV LANG en_US.UTF-8
 ENV PATH ${CATALINA_HOME}/bin:${PATH}
 ENV TOMCAT_SOURCE http://archive.apache.org/dist/tomcat
 ENV TOMCAT_WEBAPPS ${CATALINA_HOME}/webapps
-ENV TOMCAT_URL=${TOMCAT_SOURCE}/tomcat-8/v8.5.40/bin/apache-tomcat-8.5.40.tar.gz
+ENV TOMCAT_VERSION=8.5.85
+
+ENV TOMCAT_URL=${TOMCAT_SOURCE}/tomcat-8/v${TOMCAT_VERSION}/bin/apache-tomcat-${TOMCAT_VERSION}.tar.gz
 
 # Install Tomcat
 WORKDIR ${CATALINA_HOME}