diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml
index de49373..10e939f 100644
--- a/.gitlab-ci.yml
+++ b/.gitlab-ci.yml
@@ -3,6 +3,7 @@ image: docker:latest
 
 variables:
   DOCKER_DRIVER: overlay2
+  DOCKER_BUILDKIT: 1
 
 # Docker in Docker Service
 services:
@@ -14,8 +15,21 @@ before_script:
 
 build-main:
   script:
-    - docker pull $CI_REGISTRY_IMAGE || true
-    - docker build --cache-from $CI_REGISTRY_IMAGE --pull -t "$CI_REGISTRY_IMAGE" -t "$CI_REGISTRY_IMAGE:branch-$CI_COMMIT_REF_SLUG" .
+    - docker build --cache-from $CI_REGISTRY_IMAGE:stage-src \
+      --target src \
+      --build-arg BUILDKIT_INLINE_CACHE=1 --pull \
+      -t "$CI_REGISTRY_IMAGE:stage-src" \
+      -t "$CI_REGISTRY_IMAGE:stage-src-branch-$CI_COMMIT_REF_SLUG" .
+    - docker build --cache-from $CI_REGISTRY_IMAGE:stage-texlive-update \
+      --target texlive-update \
+      --build-arg BUILDKIT_INLINE_CACHE=1 --pull \
+      -t "$CI_REGISTRY_IMAGE:stage-texlive-update" \
+      -t "$CI_REGISTRY_IMAGE:stage-texlive-update-branch-$CI_COMMIT_REF_SLUG" .
+    - docker build --cache-from $CI_REGISTRY_IMAGE \
+      --target app --squash \
+      --build-arg BUILDKIT_INLINE_CACHE=1 --pull \
+      -t "$CI_REGISTRY_IMAGE" \
+      -t "$CI_REGISTRY_IMAGE:branch-$CI_COMMIT_REF_SLUG" .
     - docker push "$CI_REGISTRY_IMAGE"
     - docker push "$CI_REGISTRY_IMAGE:branch-$CI_COMMIT_REF_SLUG"
   only:
@@ -23,8 +37,7 @@ build-main:
 
 build:
   script:
-    - docker pull $CI_REGISTRY_IMAGE || true
-    - docker build --cache-from $CI_REGISTRY_IMAGE --pull -t "$CI_REGISTRY_IMAGE:$CI_COMMIT_REF_SLUG" .
+    - docker build --cache-from $CI_REGISTRY_IMAGE --build-arg BUILDKIT_INLINE_CACHE=1 --pull -t "$CI_REGISTRY_IMAGE:$CI_COMMIT_REF_SLUG" .
     - docker push "$CI_REGISTRY_IMAGE:$CI_COMMIT_REF_SLUG"
   except:
     - main
diff --git a/Dockerfile b/Dockerfile
index cfa0185..b0a53f5 100644
--- a/Dockerfile
+++ b/Dockerfile
@@ -6,7 +6,11 @@ RUN mkdir /src && cd /src && curl "$LDAP_PLUGIN_URL" | tar -xzf - --strip-compon
 RUN ls /src
 RUN sysctl fs.file-max && lsof |wc -l && ulimit -n
 
-FROM $BASE
+FROM $BASE as texlive-update
+
+RUN tlmgr update --self --all && tlmgr install scheme-full
+
+FROM texlive-update as app
 
 # passed from .env (via make)
 ARG collab_text
@@ -15,23 +19,12 @@ ARG login_text
 # set workdir (might solve issue #2 - see https://stackoverflow.com/questions/57534295/)
 WORKDIR /var/www/sharelatex/web
 
-RUN tlmgr update --self --all && tlmgr install scheme-full
-
 # install latest npm
 RUN npm install -g npm
-# clean cache (might solve issue #2)
-#RUN npm cache clean --force
-RUN npm install ldapts-search
-RUN npm install ldapts
-RUN npm install ldap-escape
-#RUN npm install bcrypt@5.0.0
+RUN npm install ldapts-search ldapts ldap-escape
 
-# This variant of updateing texlive does not work
-#RUN  bash -c tlmgr install scheme-full
-# try this one:
 RUN apt-get update
 RUN apt-get -y install python-pygments
-#RUN apt-get -y install texlive texlive-lang-german texlive-latex-extra
 
 # overwrite some files
 COPY --from=src /src/ldap-overleaf-sl/sharelatex/AuthenticationManager.js /var/www/sharelatex/web/app/src/Features/Authentication/