diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml
index 799c8019a2829e7d55f3e1bf1aed0574fa37366c..5fa642182158c8864907c900e66db04199aaecf2 100644
--- a/.gitlab-ci.yml
+++ b/.gitlab-ci.yml
@@ -1,25 +1,128 @@
-image: pubsweet/pubsweet-test-base
+variables:
+  IMAGE_ORG: pubsweet
+  IMAGE_NAME: pubsweet
+  BASE_DOMAIN: gateway.ps.semioticsquares.com
+  CONFIGURATION_REPOSITORY: https://gitlab.coko.foundation/pubsweet/deployment-config.git
 
-install:
+stages:
+  - build
+  - test
+  - review
+  - staging
+  - production
+  - demo
+
+build:
+  image: docker:latest
   stage: build
-  script: yarn
-  artifacts:
-    expire_in: 1h
-    paths:
-      - node_modules
-      - packages/*/node_modules
-      - packages/components/packages/*/node_modules
+  script:
+    - docker version
+    - docker login -u $DOCKERHUB_USERNAME -p $DOCKERHUB_PASSWORD
+    - echo "Ignore warning! Cannot perform an interactive login from a non TTY device"
+    - docker build -t $IMAGE_ORG/$IMAGE_NAME:$CI_COMMIT_SHA .
+    - docker push $IMAGE_ORG/$IMAGE_NAME:$CI_COMMIT_SHA
 
 lint:style:
+  image: $IMAGE_ORG/$IMAGE_NAME:$CI_COMMIT_SHA
+  stage: test
+  variables:
+    GIT_STRATEGY: none
   script:
+    - cd ${HOME}
     - npm run lint:style
 
 lint:js:
+  image: $IMAGE_ORG/$IMAGE_NAME:$CI_COMMIT_SHA
+  stage: test
+  variables:
+    GIT_STRATEGY: none
   script:
+    - cd ${HOME}
     - npm run lint:js
 
 test:
+  image: $IMAGE_ORG/$IMAGE_NAME:$CI_COMMIT_SHA
+  stage: test
+  variables:
+    GIT_STRATEGY: none
   script:
+    - cd ${HOME}
     - npm run test
 
+# -----------------------------------------------
+# ui --------------------------------------------
+# -----------------------------------------------
+
+review:ui:
+  image: xpub/deployer:latest
+  stage: review
+  variables:
+    PACKAGE_NAME: ui
+  environment:
+    name: $PACKAGE_NAME/review/$CI_COMMIT_REF_NAME
+    # !! kube-lego will fail if domain > 63 chars
+    url: "https://${CI_ENVIRONMENT_SLUG}.${BASE_DOMAIN}"
+    on_stop: stop_review:ui
+  except:
+  - master
+  script:
+    - source deploy.sh
+    - create_deployment
+
+stop_review:ui:
+  image: xpub/deployer:latest
+  stage: review
+  variables:
+    PACKAGE_NAME: ui 
+    GIT_STRATEGY: none
+  environment:
+    name: $PACKAGE_NAME/review/$CI_COMMIT_REF_NAME
+    action: stop
+  when: manual
+  except:
+  - master
+  script:
+    - source deploy.sh
+    - delete_deployment
 
+staging:ui:
+  image: xpub/deployer:latest
+  stage: staging
+  variables:
+    PACKAGE_NAME: ui
+  environment:
+    name: $PACKAGE_NAME/staging
+    url: "https://${CI_ENVIRONMENT_SLUG}.${BASE_DOMAIN}"
+  only:
+  - master
+  script:
+    - source deploy.sh
+    - create_deployment
+
+production:ui:
+  image: xpub/deployer:latest
+  stage: production
+  variables:
+    PACKAGE_NAME: ui
+  environment:
+    name: $PACKAGE_NAME/production
+    url: "https://${CI_ENVIRONMENT_SLUG}.${BASE_DOMAIN}"
+  when: manual
+  only:
+  - master
+  script:
+    - source deploy.sh
+    - create_deployment
+
+demo:ui:
+  image: xpub/deployer:latest
+  stage: demo
+  variables:
+    PACKAGE_NAME: ui
+  environment:
+    name: $PACKAGE_NAME/demo
+    url: "https://${CI_ENVIRONMENT_SLUG}.${BASE_DOMAIN}"
+  when: manual
+  script:
+    - source deploy.sh
+    - create_deployment