diff --git a/.circleci/config.yml b/.circleci/config.yml
new file mode 100644
index 0000000000000000000000000000000000000000..7495d3b4bd715b98af8e69351833c23c8cada72e
--- /dev/null
+++ b/.circleci/config.yml
@@ -0,0 +1,35 @@
+---
+
+version: 2
+jobs:
+  build:
+    working_directory: ~/src
+    docker:
+      - image: hbpmip/docker-compose-for-ci:17.06-0
+    environment:
+       - CIRCLECI: true
+    steps:
+      - setup_remote_docker:
+          version: 17.06.0-ce
+      - checkout
+      - run:
+          name: "Install requirements"
+          command: |
+            docker --version
+            pre-commit install
+      - run:
+          name: "Validate code quality"
+          command: |
+            pre-commit run --all-files
+      - run:
+          name: "Build project"
+          command: |
+            PATH=$PATH:/$HOME/.captain/bin/ ./build.sh
+      - run:
+          name: "Test project"
+          command: |
+            PATH=$PATH:/$HOME/.captain/bin/ ./test.sh
+
+    notify:
+      webhooks:
+      - url: 'https://webhook.atomist.com/atomist/circle'
diff --git a/Dockerfile b/Dockerfile
index fab13fb44a326a76f630640d2199fa62f4bfb86c..f830e1efe25463c8db60341e7bd86a1e60812fc7 100644
--- a/Dockerfile
+++ b/Dockerfile
@@ -1,3 +1,13 @@
+# Build stage for Java classes
+FROM hbpmip/java-base-build:3.5.0-jdk-8-6 as java-build-env
+
+COPY pom.xml /project/
+COPY src/ /project/src/
+
+# Repeating the file copy works better. I dunno why.
+RUN cp /usr/share/maven/ref/settings-docker.xml /root/.m2/settings.xml \
+    && mvn clean package
+
 FROM openjdk:8u131-jre-alpine
 MAINTAINER Mirco Nasuti <mirco.nasuti@chuv.ch>
 
@@ -13,10 +23,10 @@ RUN apk add --no-cache --update ca-certificates wget \
     && tar -C /usr/local/bin -xzvf /tmp/dockerize.tar.gz \
     && rm -rf /var/cache/apk/* /tmp/*
 
-COPY docker/runner/config/application.tmpl /config/application.tmpl
-COPY docker/runner/README.md docker/runner/run.sh /
+COPY docker/config/application.tmpl /config/application.tmpl
+COPY docker/README.md docker/run.sh /
 
-COPY target/portal-backend.jar backend.jar
+COPY --from=java-build-env /project/target/portal-backend.jar /usr/share/jars/
 
 EXPOSE 8080
 
diff --git a/Dockerfile.builder b/Dockerfile.builder
deleted file mode 100644
index 8297a68b8ffd1eb974b07fda04cf79c32e883ee3..0000000000000000000000000000000000000000
--- a/Dockerfile.builder
+++ /dev/null
@@ -1,17 +0,0 @@
-# Pull base image
-FROM maven:3.5.0-jdk-8-alpine
-
-MAINTAINER mirco.nasuti@chuv.ch
-
-# Create a user with id 1000, with some luck it should match your user on the host machine.
-RUN adduser --quiet --uid 1000 build
-USER build
-
-COPY ./docker/builder/build-in-docker.sh /
-
-# Volume
-VOLUME /build
-# Define working directory
-WORKDIR /build
-
-ENTRYPOINT ["/build-in-docker.sh"]
diff --git a/captain.yml b/captain.yml
index 20d2f6aa6c6d10b6edb34aab0893f13bf980322c..bc8842887ca1b3effbdaabba3ba9c493cd05815a 100644
--- a/captain.yml
+++ b/captain.yml
@@ -1,18 +1,4 @@
-# Builder image
-# Creates a portable environemnt to build this project.
-# Do not push this image to Docker hub.
-builder:
-  build: Dockerfile.builder
-  image: portal-backend-builder
-  pre:
-    - echo "Building portal backend builder image"
-  post:
-    - echo "Finished building portal backend builder image"
-    - echo "Building project..."
-    - docker run --rm -v $WORKSPACE:/build/ -v $HOME/.m2:/home/build/.m2/ portal-backend-builder:latest
-    - echo "Finished building project"
-
-portal-backend:
+target_image:
   build: Dockerfile
   image: hbpmip/portal-backend
   pre:
diff --git a/circle.yml b/circle.yml
deleted file mode 100644
index fcb5a4e3b1c7b95bc30fcc51e68f62e5168207c2..0000000000000000000000000000000000000000
--- a/circle.yml
+++ /dev/null
@@ -1,26 +0,0 @@
-machine:
-  services:
-    - docker
-dependencies:
-  cache_directories:
-    - "~/.m2"
-  override:
-    - docker info
-    - docker build -f Dockerfile.builder -t portal-backend-builder .
-    - docker run --rm -v $HOME/portal-backend:/build/ -v $HOME/.m2:/home/build/.m2/ portal-backend-builder:latest
-    - docker build -t hbpmip/portal-backend .
-test:
-  pre:
-    - ./tests/pre-test-run.sh
-  override:
-    - ./tests/test-run.sh
-# deployment:
-#   hub:
-#     branch: master
-#     commands:
-#       - docker login -u $DOCKER_HUB_USER -p $DOCKER_HUB_PASS -e $DOCKER_HUB_EMAIL
-#       - docker push --branch-tags=false --commit-tags=true
-#       - mvn sonar:sonar -Dsonar.login=$SONAR_KEY  # Need SonarQube back on a public URL
-notify:
-  webhooks:
-  - url: 'https://webhook.atomist.com/atomist/circle'
diff --git a/docker/runner/README.md b/docker/README.md
similarity index 100%
rename from docker/runner/README.md
rename to docker/README.md
diff --git a/docker/builder/build-in-docker.sh b/docker/builder/build-in-docker.sh
deleted file mode 100755
index 62c4795108afaf68fbb1cf0cdf15909e5e147dc6..0000000000000000000000000000000000000000
--- a/docker/builder/build-in-docker.sh
+++ /dev/null
@@ -1,11 +0,0 @@
-#!/usr/bin/env bash
-
-echo ">>> Building inside Docker"
-
-echo "Removing old target folder..."
-rm -rf target/
-
-echo "Packaging..."
-mvn package
-
-echo ">>> Backend build is complete"
diff --git a/docker/runner/config/application.tmpl b/docker/config/application.tmpl
similarity index 100%
rename from docker/runner/config/application.tmpl
rename to docker/config/application.tmpl
diff --git a/docker/runner/run.sh b/docker/run.sh
similarity index 85%
rename from docker/runner/run.sh
rename to docker/run.sh
index 3654d5cbef1ebb1137dedcf5f5abf00c8958649a..2b1ca22d1c42ceccd4d8d6fe9ac40e363f729a43 100755
--- a/docker/runner/run.sh
+++ b/docker/run.sh
@@ -10,4 +10,4 @@ fi
 if [ ! -z "$FEATURES_DB_SERVER" ]; then
   OPTS="$OPTS -wait tcp://$FEATURES_DB_SERVER -timeout 60s"
 fi
-dockerize $OPTS java -jar backend.jar
+dockerize $OPTS java -jar /usr/share/jars/portal-backend.jar