diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml
index 0a3f2b51f00298e436dd2d9ccd184da0e82d42a8..828c7d857d4342e3ead3f025007da8ddae4b2dd2 100644
--- a/.gitlab-ci.yml
+++ b/.gitlab-ci.yml
@@ -1,4 +1,6 @@
 variables:
+  CI_REGISTRY: ${CODE_REGISTRY}
+  CI_REGISTRY_IMAGE: ${CODE_REGISTRY_IMAGE}
   DOCKER_DIR: docker-images
   DOCKER_TAR: ${DOCKER_DIR}/app.tar
   FAULT_SECTIONS: nshm-fault-sections
@@ -9,31 +11,39 @@ variables:
   NSHMP_LIB: nshmp-lib
   NSHMP_LIB_GIT: https://gitlab-ci-token:${CI_JOB_TOKEN}@code.usgs.gov/ghsc/nshmp/${NSHMP_LIB}.git
   REPORTS_DIR: build/reports
+  # Static data in AWS S3
+  DATA_CONUS_2018A: conus-2018a
 
 stages:
   - test
   - publish
+  - deploy
 
 ####
 # Templates:
-#   - nshmp-lib: Download nshmp-lib repo
 #   - fault-sections: Download nshm-fault-sections repo. Required for nshmp-lib tests.
-#   - adjust-image-names: Update container image names
+#   - install-aws: Install aws in a Alpine environment
+#   - nshmp-lib: Download nshmp-lib repo
+#   - static-data: Array of all static data in AWS s3
 ####
 .templates:
-  nshmp-lib: &nshmp-lib |-
-    cd ..;
-    rm -rf ${NSHMP_LIB};
-    git clone ${NSHMP_LIB_GIT};
-    cd ${CI_PROJECT_NAME};
   fault-sections: &fault-sections |-
     cd ..;
     rm -rf ${FAULT_SECTIONS};
     git clone ${FAULT_SECTIONS_GIT};
     cd ${CI_PROJECT_NAME}
-  adjust-image-names: &adjust-image-names
-    IMAGE_NAME=${IMAGE_NAME/:master/:latest};
-    INTERNAL_IMAGE_NAME=${CI_REGISTRY_IMAGE}/${IMAGE_NAME};
+  install-aws: &install-aws |-
+    apk -v --update add --no-cache python py-pip groff;
+    pip install awscli;
+  nshmp-lib: &nshmp-lib |-
+    cd ..;
+    rm -rf ${NSHMP_LIB};
+    git clone ${NSHMP_LIB_GIT};
+    cd ${CI_PROJECT_NAME};
+  static-data: &static-data |-
+    STATIC_DATA="
+      ${DATA_CONUS_2018A}
+    ";
 
 ####
 # Template: Devlopment tags
@@ -55,6 +65,53 @@ stages:
   before_script:
     - *nshmp-lib
 
+####
+# Template: Deploy to Docker Swarm
+# Globals:
+#   CODE_REGISTRY: Path to container registry
+#   GENERIC_SWARM_DEPLOY_REPO: Path to swarm deploy container
+#   CI_REGISTRY_IMAGE: Path to container image
+####
+.deploy:
+  cache: {}
+  image: ${CODE_REGISTRY}/ghsc/hazdev/cloud-formation/hazdev-build-runner:latest
+  dependencies:
+  before_script:
+    - |
+      for data in ${STATIC_DATA}; do
+        IMAGE_NAME=${IMAGE_NAME/:*/:${data}};
+        INTERNAL_IMAGE_NAME=${CI_REGISTRY_IMAGE}/${IMAGE_NAME};
+        docker pull ${INTERNAL_IMAGE_NAME};
+  script:
+    - git clone ${GENERIC_SWARM_DEPLOY_REPO} generic-deploy
+    - export REGISTRY=${CI_REGISTRY_IMAGE}
+    - cp -v
+      generic-deploy/default.config.sh
+      generic-deploy/default.funcs.sh
+      generic-deploy/deploy.sh
+      scripts/.
+    - scripts/deploy.sh
+  stage: deploy
+  tags:
+    - deploy
+    - swarm
+  variables:
+    APP_NAME: nshmp-netcdf
+    STACK_NAME: nshmp-netcdf
+
+.staging:
+  only:
+    - master@ghsc/nshmp/nshmp-netcdf
+    - tags@ghsc/nshmp/nshmp-netcdf
+
+.staging01:
+  tags:
+    - staging01
+
+.staging02:
+  tags:
+    - staging02
+
 ####
 # Build jar file.
 # Globals:
@@ -115,53 +172,72 @@ Unit Tests:
 ####
 # Build Docker image.
 # Globals:
-#   DOCKER_DIR - The directory to put Docker image
-#   DOCKER_TAR - The path to the Docker image tar
 #   IMAGE_NAME - Docker image name
 ####
 Build Image:
   stage: test
-  image: docker:stable
+  image: docker:stable-git
   extends: .dev-tags
   only:
     - merge_request
     - master@ghsc/nshmp/nshmp-netcdf
     - tags@ghsc/nshmp/nshmp-netcdf
   before_script:
-    - *adjust-image-names
-    - rm -rf ${DOCKER_DIR}
-    - apk add git;
     - *nshmp-lib
     - mv ../${NSHMP_LIB} .
   script:
-    - mkdir ${DOCKER_DIR}
     - docker build -t local/${IMAGE_NAME} .
-    - docker save local/${IMAGE_NAME} > ${DOCKER_TAR}
-  artifacts:
-    paths:
-      - ${DOCKER_DIR}
 
 ####
-# Publish Docker image to GitLab registry.
+# Build and publish Docker images with data from AWS S3.
 # Globals:
-#   DOCKER_TAR - The path to the Docker image tar
-#   INTERNAL_IMAGE_NAME - GitLab registry Docker image name
-#   IMAGE_NAME - Docker image nam
+#   IMAGE_NAME - Docker image name
 ####
-Publish Image:
+Build/Publish Data Images:
   stage: publish
-  image: docker:stable
+  image: docker:stable-git
   extends: .dev-tags
   only:
     - master@ghsc/nshmp/nshmp-netcdf
     - tags@ghsc/nshmp/nshmp-netcdf
   before_script:
-    - *adjust-image-names
+    - *install-aws
+    - *nshmp-lib
+    - *static-data
+    - mv ../${NSHMP_LIB} .
+    - mkdir ${DOCKER_DIR}
   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}
+    - |
+      for data in ${STATIC_DATA}; do
+        IMAGE_NAME=${IMAGE_NAME/:*/:${data}};
+        INTERNAL_IMAGE_NAME=${CI_REGISTRY_IMAGE}/${IMAGE_NAME};
+        aws s3 cp \
+            s3://nshmp-hazard-curves/${data}.nc \
+            DATA/${data}.nc;
+        docker build \
+            --build-arg netcdf_file="${data}.nc" \
+            -t ${INTERNAL_IMAGE_NAME} .;
+        rm DATA/${data}.nc
+        docker push ${INTERNAL_IMAGE_NAME};
+        docker image rm ${INTERNAL_IMAGE_NAME};
+      done
     - rm -rf /root/.docker/config.json
+
+####
+# Deploy to stage01
+####
+Staging 01:
+  extends:
+    - .deploy
+    - .staging
+    - .staging01
+
+####
+# Deploy to stage02
+####
+Staging 02:
+  extends:
+    - .deploy
+    - .staging
+    - .staging02