diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml
index ddc4f97c03ce287fa69309a376203b6570274f52..43a20e8c4b722945b7ae131bac45f7f636dcfa10 100644
--- a/.gitlab-ci.yml
+++ b/.gitlab-ci.yml
@@ -4,13 +4,23 @@ variables:
 before_script:
   - docker login -u "$CI_REGISTRY_USER" -p "$CI_REGISTRY_PASSWORD" $CI_REGISTRY
 
-l3d-script:
+setup:
   stage: build
-  script: sed -i -e "s/'{{ version }}'/${VERSION}/g" l3d
-  artifacts:
-    name: l3d
-    paths:
-      - l3d
+  script:
+    - docker build --pull --build-arg VERSION=${VERSION} -t ${CI_REGISTRY_IMAGE}/setup:${VERSION} ./setup
+    - docker build --pull --build-arg VERSION=${VERSION} -t ${CI_REGISTRY_IMAGE}/setup:latest ./setup
+    - docker push ${CI_REGISTRY_IMAGE}/setup:${VERSION}
+    - docker push ${CI_REGISTRY_IMAGE}/setup:latest
+  only:
+    - tags
+
+run:
+  stage: build
+  script:
+    - docker build --pull --build-arg VERSION=${VERSION} -t ${CI_REGISTRY_IMAGE}/run:${VERSION} ./run
+    - docker build --pull --build-arg VERSION=${VERSION} -t ${CI_REGISTRY_IMAGE}/run:latest ./run
+    - docker push ${CI_REGISTRY_IMAGE}/run:${VERSION}
+    - docker push ${CI_REGISTRY_IMAGE}/run:latest
   only:
     - tags
 
diff --git a/start-new-project b/.start
similarity index 80%
rename from start-new-project
rename to .start
index 03bc50e6450a5e9e93b76fc90063d38c128f6896..82e9903776695e1363ca4ee860c8986cc0fe0860 100755
--- a/start-new-project
+++ b/.start
@@ -1,18 +1,4 @@
-#!/usr/bin/env bash
-
-EXISTING=$(ls -1)
-if [[ -n "$EXISTING" ]]; then
-  exit
-fi
-
-echo "Lets start a new project here ..."
-echo ""
-echo "Options to start:"
-echo "    1   LakeDrops Drupal 8 project template"
-echo "    2   Drupal's community project template"
-echo "    3   Existing git repository"
-echo ""
-echo ""
+#!/bin/bash
 
 function truncateCurrentDirectory {
   if [[ -f ".env" ]]; then
@@ -22,8 +8,15 @@ function truncateCurrentDirectory {
 }
 
 function restoreEnvFile {
-  echo "PHP_VERSION=${PHP_VERSION}" >>.env
-  echo "COMPOSE_PROJECT_NAME=${COMPOSE_PROJECT_NAME}" >>.env
+  if [[ -n ${PHP_VERSION} ]]; then
+    echo "PHP_VERSION=${PHP_VERSION}" >>.env
+  fi
+  if [[ -n ${COMPOSE_PROJECT_NAME} ]]; then
+    echo "COMPOSE_PROJECT_NAME=${COMPOSE_PROJECT_NAME}" >>.env
+  fi
+  if [[ -f ".env" ]]; then
+    env -i $(cat .env | xargs) >.env
+  fi
 }
 
 function create {
@@ -32,6 +25,21 @@ function create {
   restoreEnvFile
 }
 
+EXISTING=$(ls -1)
+if [[ -n "$EXISTING" ]]; then
+  restoreEnvFile
+  exit
+fi
+
+echo "Lets start a new project here ..."
+echo ""
+echo "Options to start:"
+echo "    1   LakeDrops Drupal 8 project template"
+echo "    2   Drupal's community project template"
+echo "    3   Existing git repository"
+echo ""
+echo ""
+
 while true; do
     read -p "Choose an option: " OPTION
     case ${OPTION} in
@@ -65,4 +73,5 @@ while true; do
     esac
 done
 
+restoreEnvFile
 /usr/bin/fish
diff --git a/Dockerfile b/Dockerfile
index c0bfe30adf076b88ae686549b3e7dd7b16cd9e20..dfac647c9b587ebd7740ebebb7760aa2ace3cc0e 100644
--- a/Dockerfile
+++ b/Dockerfile
@@ -12,7 +12,7 @@ ENV LAKEDROPS_DEV_ENV 1
 ENV LAKEDROPS_DEV_DC_OPTIONS " "
 
 ADD config.fish /etc/fish/
-ADD start-new-project /usr/local/bin/
+ADD .start /usr/local/bin/
 
 RUN echo "Install dorgflow" && \
     cd /var/opt && \
diff --git a/README.md b/README.md
index 2041ba7205b13cfaaeb6f24678a5c965a2f7c300..6c56c1720aee203538d74753c29295c6c1e84e0d 100644
--- a/README.md
+++ b/README.md
@@ -4,23 +4,22 @@ Provides fully configured Docker images for local Drupal development where your
 
 ## Prerequisites
 
-Nothing else than docker and this [script](https://gitlab.lakedrops.com/docker/l3d/raw/master/l3d) being installed on your host. You don't need any other tool - none!
+Nothing else than docker being installed on your host. You don't need any other tool - none!
 
-Ideally you download that script and copy that to a directory in your search path (e.g. `/usr/local/bin`), then it will be available for all your Drupal projects.
+## Quick start
 
-You can execute the following commands:
+You can install the tool with the following command:
 
 ```bash
-sudo wget -O /usr/local/bin/l3d https://gitlab.lakedrops.com/docker/l3d/raw/master/l3d
-sudo chmod +x /usr/local/bin/l3d
+docker run -v /usr/local/bin:/setup --rm registry.lakedrops.com/docker/l3d/setup:latest
 ```
 
-## Quick start
-
-Go to the project root for which you want to use **L3D** and execute the downloaded script (simply type `l3d` at the command prompt). It will ask you for the PHP version to be used (input `7.0`, `7.1` or `7.2`) and it will download the matching L3D image and start a container for you.
+This will install the script `l3d` into the given directory `/usr/local/bin` from where it is executable everywhere on your host (assuming this path being in your search path). If you want that script to be installed elsewhere then provide that alternative path in the install command above. Also, instead of `latest` you can also start with any othe specific version number of this tool. You can find all available version string in the [tag list](https://gitlab.lakedrops.com/docker/l3d/tags) of this project.
 
 ## Usage
 
+Go to the project root for which you want to use **L3D** and execute the installed script (simply type `l3d` at the command prompt). It will ask you for the PHP version to be used (input `7.0`, `7.1` or `7.2`) and it will download the matching **L3D** image and start a container for you.
+
 Inside the container you'll find the directory `/drupal` which contains everything from your project's root. You can work from there by using these available tools:
 
 | Tool | Command | Shortcut |
@@ -34,7 +33,7 @@ Inside the container you'll find the directory `/drupal` which contains everythi
 
 ## Update the image
 
-When starting **L3D** with the script this will simply re-use the latest available image in your local docker environment. To force your docker to download the latest version of an image you can use `l3d update` which will also start the working container for you but check for an updated version of the image first.
+When starting **L3D** with the script this will simply re-use the latest available image in your local docker environment. To force your docker to download the latest version of an image you can use `l3d update` which will check for an updated version of the image and pull that to your host for subsequent commands.
 
 ## Update the start script
 
diff --git a/l3d b/l3d
index 1c285068eb33dd53f716a1da6dcbdedb65ffa53c..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 100755
--- a/l3d
+++ b/l3d
@@ -1,157 +0,0 @@
-#!/usr/bin/env bash
-
-VERSION='{{ version }}'
-
-function showHelp {
-  echo "L3D - LakeDropsDrupalDev"
-  echo "========================="
-  echo ""
-  echo "Version: ${VERSION}"
-  echo "Info and support: https://gitlab.lakedrops.com/docker/l3d"
-  echo ""
-  echo "Usage:"
-  echo "  l3d [ help | version | selfupdate | update | PROJECTNAME ]"
-  echo ""
-  echo ""
-}
-
-function showVersion {
-  echo "${VERSION}"
-}
-
-function selfUpdate {
-  NEWVERSION=$(curl -s https://gitlab.lakedrops.com/api/v4/projects/282/repository/tags | grep -o '[0-9]*\.[0-9]*\.[0-9]*' | head -1)
-  if [[ "$NEWVERSION" == "$VERSION" ]]; then
-    echo "No new version available"
-    return
-  fi
-  NEWSCRIPT="https://gitlab.lakedrops.com/docker/l3d/-/jobs/artifacts/${NEWVERSION}/raw/l3d?job=l3d-script"
-  DEST=$(which l3d)
-  WGET=$(which wget)
-  CURL=$(which curl)
-  if [[ -n "$WGET" ]]; then
-    sudo wget -O ${DEST} ${NEWSCRIPT} > /dev/null 2>&1
-  elif [[ -n "$CURL" ]]; then
-    sudo curl -L -o ${DEST} ${NEWSCRIPT} > /dev/null 2>&1
-  else
-    echo "Could't find wget or curl to perform the update!"
-    exit 1
-  fi
-  sudo chmod +x ${DEST}
-  echo "Self update succeeded!"
-}
-
-function updateImage {
-  getConfig
-  IMAGEID=$(docker image ls -q registry.lakedrops.com/docker/l3d/php-${PHP_VERSION}:${VERSION})
-  echo "Updating the image ..."
-  STATUS=$(docker pull registry.lakedrops.com/docker/l3d/php-${PHP_VERSION}:${VERSION})
-  if [[ "$STATUS" == *"Status: Image is up to date"* ]]; then
-    echo "Already up to date"
-  else
-    echo "Image updated"
-    if [[ -n "$ID" ]]; then
-      while true; do
-        ID=$(docker container ls -q -f ancestor=${IMAGEID})
-        if [[ -n "$ID" ]]; then
-          echo "Removing outdated container ..."
-          docker stop ${ID}
-          docker rm ${ID}
-        else
-          break
-        fi
-      done
-    fi
-  fi
-}
-
-function getConfig {
-  if [[ -f ".env" ]]; then
-    export $(cat .env | xargs) > /dev/null 2>&1
-  fi
-  if [[ "${PHP_VERSION}" == "" ]]; then
-    while true; do
-        read -p "Which PHP version is your project using? " PHP_VERSION
-        case ${PHP_VERSION} in
-            7.0) break;;
-            7.1) break;;
-            7.2) break;;
-
-            *) echo "Version not supported.";;
-        esac
-    done
-    echo "PHP_VERSION=${PHP_VERSION}" >>.env
-  fi
-  if [[ "${COMPOSE_PROJECT_NAME}" == "" ]]; then
-    read -p "Name your project (used as subdomain): " COMPOSE_PROJECT_NAME
-    echo "COMPOSE_PROJECT_NAME=${COMPOSE_PROJECT_NAME}" >>.env
-  fi
-}
-
-function startContainer {
-  if [[ -n "${COMPOSE_PROJECT_NAME}" ]]; then
-    ID=$(docker container ls -q -f name=${COMPOSE_PROJECT_NAME}_l3d)
-
-    if [[ -n "$ID" ]]; then
-      docker start ${COMPOSE_PROJECT_NAME}_l3d
-    else
-      docker run --name ${COMPOSE_PROJECT_NAME}_l3d -dt \
-        --hostname ${COMPOSE_PROJECT_NAME}-l3d \
-        --env COMPOSE_PROJECT_NAME=${COMPOSE_PROJECT_NAME} \
-        --env SSH_AUTH_SOCK=/ssh-agent \
-        --env-file ${PWD}/.env \
-        --volume /var/run/docker.sock:/var/run/docker.sock \
-        --volume ${PWD}:/drupal \
-        --volume ${SSH_AUTH_SOCK}:/ssh-agent \
-        --volume ${HOME}/.traefik:/root/.traefik \
-        --volume ${HOME}/.gitconfig:/root/.gitconfig \
-        --workdir /drupal \
-        --restart unless-stopped \
-        registry.lakedrops.com/docker/l3d/php-${PHP_VERSION}:${VERSION}
-    fi
-
-    EXISTING=$(ls -1)
-    if [[ -n "$EXISTING" ]]; then
-      docker exec -it ${COMPOSE_PROJECT_NAME}_l3d /usr/bin/fish
-    else
-      docker exec -it ${COMPOSE_PROJECT_NAME}_l3d /usr/local/bin/start-new-project
-    fi
-  fi
-}
-
-COMPOSE_PROJECT_NAME=
-if [[ "$VERSION" == "{{ version }}" ]]; then
-  selfUpdate
-fi
-case $1 in
-
-  help)
-    showHelp
-    ;;
-
-  version)
-    showVersion
-    ;;
-
-  selfupdate)
-    selfUpdate
-    ;;
-
-  update)
-    updateImage
-    startContainer
-    ;;
-
-  *)
-    if [[ -n "$1" ]]; then
-      ID=$(docker container ls -q -f name=$1_l3d)
-      if [[ -n "${ID}" ]]; then
-        COMPOSE_PROJECT_NAME=$1
-      fi
-    else
-      getConfig
-    fi
-    startContainer
-    ;;
-
-esac
diff --git a/run/Dockerfile b/run/Dockerfile
new file mode 100644
index 0000000000000000000000000000000000000000..56f9ff0299e207048f015a9f6ab4ca0c93cbaecd
--- /dev/null
+++ b/run/Dockerfile
@@ -0,0 +1,17 @@
+FROM docker:dind
+
+ARG VERSION
+
+LABEL com.example.vendor="LakeDrops" \
+      maintainer="juergen.haas@lakedrops.com" \
+      version="${VERSION}" \
+      description="Setup for the Drupal development environment from LakeDrops."
+
+USER root
+
+ADD scripts/* /usr/local/bin/
+
+RUN apk add bash curl jq && \
+    sed -i -e "s/'{{ version }}'/${VERSION}/g" /usr/local/bin/run
+
+ENTRYPOINT /bin/sh
diff --git a/run/scripts/help b/run/scripts/help
new file mode 100755
index 0000000000000000000000000000000000000000..5eceede59ecd790daa33d3cf9bcfff5d5ea1ae94
--- /dev/null
+++ b/run/scripts/help
@@ -0,0 +1,10 @@
+#!/bin/bash
+
+echo "L3D - LakeDropsDrupalDev"
+echo "========================="
+echo ""
+echo "Version: ${VERSION}"
+echo "Support: https://gitlab.lakedrops.com/docker/l3d"
+echo ""
+echo "Usage:   l3d [ help | version | selfupdate | update | PROJECTNAME ]"
+echo ""
diff --git a/run/scripts/run b/run/scripts/run
new file mode 100755
index 0000000000000000000000000000000000000000..4cff91d5e7bafdd662d13a5a9926473d66ae6ec7
--- /dev/null
+++ b/run/scripts/run
@@ -0,0 +1,13 @@
+#!/bin/bash
+
+export VERSION='{{ version }}'
+
+COMMAND=start
+if [[ -n "$1" ]]; then
+  if [[ -f "/usr/local/bin/$1" ]]; then
+    COMMAND=$1
+    shift
+  fi
+fi
+
+/usr/local/bin/${COMMAND} $@
diff --git a/run/scripts/selfupdate b/run/scripts/selfupdate
new file mode 100755
index 0000000000000000000000000000000000000000..68b9f99e39f6810170e7b6b1a09458ecc747450a
--- /dev/null
+++ b/run/scripts/selfupdate
@@ -0,0 +1,22 @@
+#!/bin/sh
+
+if [[ -n $1 ]]; then
+  NEWVERSION=$1
+else
+  NEWVERSION=$(curl -s https://gitlab.lakedrops.com/api/v4/projects/282/repository/tags | jq -r .[0].name)
+fi
+
+if [[ "$NEWVERSION" == "$VERSION" ]]; then
+  echo "No new version available"
+  return
+fi
+
+UPDATE=$(docker run -v ${SCRIPTPATH}:/setup --rm registry.lakedrops.com/docker/l3d/setup:${NEWVERSION})
+if [[ "$UPDATE" == *"setup:${NEWVERSION} not found"* ]]; then
+  echo "Version not found."
+  return
+fi
+
+echo "Self update succeeded!"
+echo "Cleaning old container"
+docker stop l3dsetup
diff --git a/run/scripts/start b/run/scripts/start
new file mode 100755
index 0000000000000000000000000000000000000000..1f8e4fb7c73c5e9cf4c75a28e707e211b0841eaa
--- /dev/null
+++ b/run/scripts/start
@@ -0,0 +1,54 @@
+#!/bin/bash
+
+function getConfig {
+  if [[ ! -n ${PHP_VERSION} ]]; then
+    while true; do
+        read -p "Which PHP version is your project using? " PHP_VERSION
+        case ${PHP_VERSION} in
+            7.0 ) break;;
+            7.1 ) break;;
+            7.2 ) break;;
+            * ) echo "Version not supported.";;
+        esac
+    done
+  fi
+  if [[ ! -n ${COMPOSE_PROJECT_NAME} ]]; then
+    read -p "Name your project (used as subdomain): " COMPOSE_PROJECT_NAME
+  fi
+}
+
+function startContainer {
+  if [[ -n ${COMPOSE_PROJECT_NAME} ]]; then
+    ID=$(docker container ls -q -f name=${COMPOSE_PROJECT_NAME}_l3d)
+    if [[ -n ${ID} ]]; then
+      docker start ${COMPOSE_PROJECT_NAME}_l3d
+    else
+      docker run --name ${COMPOSE_PROJECT_NAME}_l3d -dt \
+        --hostname ${COMPOSE_PROJECT_NAME}-l3d \
+        --env COMPOSE_PROJECT_NAME=${COMPOSE_PROJECT_NAME} \
+        --env PHP_VERSION=${PHP_VERSION} \
+        --env SSH_AUTH_SOCK=/ssh-agent \
+        --volume /var/run/docker.sock:/var/run/docker.sock \
+        --volume ${WORKDIR}:/drupal \
+        --volume ${SSHAUTH}:/ssh-agent \
+        --volume ${HOMEDIR}/.traefik:/root/.traefik \
+        --volume ${HOMEDIR}/.gitconfig:/root/.gitconfig \
+        --workdir /drupal \
+        --restart unless-stopped \
+        registry.lakedrops.com/docker/l3d/php-${PHP_VERSION}:${VERSION}
+    fi
+    docker exec -it \
+      ${COMPOSE_PROJECT_NAME}_l3d \
+      /usr/local/bin/.start
+  fi
+}
+
+if [[ -n $1 ]]; then
+  ID=$(docker container ls -q -f name=$1_l3d)
+  if [[ -n ${ID} ]]; then
+    PHP_VERSION=unknown
+    COMPOSE_PROJECT_NAME=$1
+  fi
+fi
+getConfig
+startContainer
diff --git a/run/scripts/update b/run/scripts/update
new file mode 100755
index 0000000000000000000000000000000000000000..1d5d3213cdbd393f90565055b8d3dd29bde3ec40
--- /dev/null
+++ b/run/scripts/update
@@ -0,0 +1,22 @@
+#!/bin/bash
+
+if [[ -n ${PHP_VERSION} ]]; then
+  IMAGEID=$(docker image ls -q registry.lakedrops.com/docker/l3d/php-${PHP_VERSION}:${VERSION})
+  echo "Updating the image ..."
+  STATUS=$(docker pull registry.lakedrops.com/docker/l3d/php-${PHP_VERSION}:${VERSION})
+  if [[ "$STATUS" == *"Status: Image is up to date"* ]]; then
+    echo "Already up to date"
+  else
+    echo "Image updated"
+    while true; do
+      ID=$(docker container ls -q -f ancestor=${IMAGEID})
+      if [[ -n ${ID} ]]; then
+        echo "Removing outdated container ..."
+        docker stop ${ID}
+        docker rm ${ID}
+      else
+        break
+      fi
+    done
+  fi
+fi
diff --git a/run/scripts/version b/run/scripts/version
new file mode 100755
index 0000000000000000000000000000000000000000..6510e0e13a25be7c118bb07c4eceb0188e46e2ba
--- /dev/null
+++ b/run/scripts/version
@@ -0,0 +1,3 @@
+#!/bin/bash
+
+echo "${VERSION}"
diff --git a/setup/Dockerfile b/setup/Dockerfile
new file mode 100644
index 0000000000000000000000000000000000000000..72cd2a823621778cd0c72543ba7327e220bb2e7d
--- /dev/null
+++ b/setup/Dockerfile
@@ -0,0 +1,16 @@
+FROM busybox
+
+ARG VERSION
+
+LABEL com.example.vendor="LakeDrops" \
+      maintainer="juergen.haas@lakedrops.com" \
+      version="${VERSION}" \
+      description="Setup for the Drupal development environment from LakeDrops."
+
+USER root
+
+ADD scripts/* /usr/local/bin/
+
+RUN sed -i -e "s/'{{ version }}'/${VERSION}/g" /usr/local/bin/l3d
+
+CMD /usr/local/bin/setup
diff --git a/setup/scripts/l3d b/setup/scripts/l3d
new file mode 100755
index 0000000000000000000000000000000000000000..56fa8fd9e111005ca6b4a457680ae9cec06baa84
--- /dev/null
+++ b/setup/scripts/l3d
@@ -0,0 +1,21 @@
+#!/bin/bash
+ID=$(docker container ls -q -f name=l3drun)
+if [[ ! -n ${ID} ]]; then
+  SCRIPTPATH="$( cd "$(dirname "$0")" ; pwd -P )"
+  docker run --name=l3drun -dt --rm \
+    --env SCRIPTPATH=${SCRIPTPATH} \
+    --volume /var/run/docker.sock:/var/run/docker.sock \
+    --volume ${SCRIPTPATH}:/setup \
+    registry.lakedrops.com/docker/l3d/run:'{{ version }}'
+fi
+if [[ -f ".env" ]]; then
+  export $(cat .env | xargs) > /dev/null 2>&1
+fi
+docker exec -it \
+  --env HOMEDIR=${HOME} \
+  --env WORKDIR=${PWD} \
+  --env SSHAUTH=${SSH_AUTH_SOCK} \
+  --env PHP_VERSION=${PHP_VERSION} \
+  --env COMPOSE_PROJECT_NAME=${COMPOSE_PROJECT_NAME} \
+  l3drun \
+  /usr/local/bin/run $@
diff --git a/setup/scripts/setup b/setup/scripts/setup
new file mode 100755
index 0000000000000000000000000000000000000000..4c6fed84af0aa18f547d8eb5d2c01a7b9df55693
--- /dev/null
+++ b/setup/scripts/setup
@@ -0,0 +1,8 @@
+#!/bin/sh
+
+cp /usr/local/bin/l3d /setup/l3d
+
+echo "L3D installed successfully!"
+echo ""
+echo "Call ===> l3d help <=== for further instructions."
+echo ""