diff --git a/.dockerignore b/.dockerignore
new file mode 100644
index 000000000..7534368f0
--- /dev/null
+++ b/.dockerignore
@@ -0,0 +1,3 @@
+src-ui/node_modules
+src-ui/dist
+.git
diff --git a/.env b/.env
new file mode 100644
index 000000000..511a1386d
--- /dev/null
+++ b/.env
@@ -0,0 +1 @@
+COMPOSE_PROJECT_NAME=paperless
\ No newline at end of file
diff --git a/Dockerfile b/Dockerfile
index 2b95288e6..4284b35ca 100644
--- a/Dockerfile
+++ b/Dockerfile
@@ -1,74 +1,71 @@
-FROM alpine:3.11
+###############################################################################
+### Front end                                                               ###
+###############################################################################
 
-LABEL maintainer="The Paperless Project https://github.com/the-paperless-project/paperless" \
-      contributors="Guy Addadi <addadi@gmail.com>, Pit Kleyersburg <pitkley@googlemail.com>, \
-        Sven Fischer <git-dev@linux4tw.de>"
+FROM node:current AS frontend
+
+WORKDIR /usr/src/paperless/src-ui/
+
+COPY src-ui/package* ./
+RUN npm install
+
+COPY src-ui .
+RUN node_modules/.bin/ng build --prod --output-hashing none
+
+###############################################################################
+### Back end                                                                ###
+###############################################################################
+
+FROM python:3.8-slim
+
+WORKDIR /usr/src/paperless/
+
+COPY Pipfile* ./
+
+#Dependencies
+RUN apt-get update \
+	&& apt-get -y --no-install-recommends install \
+		build-essential \
+		curl \
+		ghostscript \
+		gnupg \
+		imagemagick \
+		libmagic-dev \
+		libpoppler-cpp-dev \
+		libpq-dev \
+		optipng \
+		sudo \
+		tesseract-ocr \
+		tesseract-ocr-eng \
+		tesseract-ocr-deu \
+		tesseract-ocr-fra \
+		tesseract-ocr-ita \
+		tesseract-ocr-spa \
+		tzdata \
+		unpaper \
+	&& pip install --upgrade pipenv \
+	&& pipenv install --system --deploy \
+	&& apt-get -y purge build-essential \
+	&& apt-get -y autoremove --purge \
+	&& rm -rf /var/lib/apt/lists/*
+
+# # Copy application
+COPY scripts/gunicorn.conf.py ./
+COPY src/ ./src/
+COPY --from=frontend /usr/src/paperless/src-ui/dist/paperless-ui/ ./src/documents/static/
+
+RUN addgroup --gid 1000 paperless && \
+	  useradd --uid 1000 --gid paperless --home-dir /usr/src/paperless paperless && \
+	  chown -R paperless:paperless .
+
+WORKDIR /usr/src/paperless/src/
+
+RUN sudo -HEu paperless python3 manage.py collectstatic --clear --no-input
+
+VOLUME ["/usr/src/paperless/data", "/usr/src/paperless/consume", "/usr/src/paperless/export"]
 
-# Copy Pipfiles file, init script and gunicorn.conf
-COPY Pipfile* /usr/src/paperless/
 COPY scripts/docker-entrypoint.sh /sbin/docker-entrypoint.sh
-COPY scripts/gunicorn.conf /usr/src/paperless/
-
-# Set export and consumption directories
-ENV PAPERLESS_EXPORT_DIR=/export \
-    PAPERLESS_CONSUMPTION_DIR=/consume
-
-RUN apk add --no-cache \
-      bash \
-      curl \
-      ghostscript \
-      gnupg \
-      imagemagick \
-      libmagic \
-      libpq \
-      optipng \
-      poppler \
-      python3 \
-      shadow \
-      sudo \
-      tesseract-ocr \
-			tzdata \
-      unpaper && \
-    apk add --no-cache --virtual .build-dependencies \
-      g++ \
-      gcc \
-      jpeg-dev \
-      musl-dev \
-      poppler-dev \
-      postgresql-dev \
-      python3-dev \
-      zlib-dev && \
-# Install python dependencies
-    python3 -m ensurepip && \
-    rm -r /usr/lib/python*/ensurepip && \
-    cd /usr/src/paperless && \
-    pip3 install --upgrade pip pipenv && \
-    pipenv install --system --deploy && \
-# Remove build dependencies
-    apk del .build-dependencies && \
-# Create the consumption directory
-    mkdir -p $PAPERLESS_CONSUMPTION_DIR && \
-# Create user
-    addgroup -g 1000 paperless && \
-    adduser -D -u 1000 -G paperless -h /usr/src/paperless paperless && \
-    chown -Rh paperless:paperless /usr/src/paperless && \
-    mkdir -p $PAPERLESS_EXPORT_DIR && \
-# Avoid setrlimit warnings
-# See: https://gitlab.alpinelinux.org/alpine/aports/issues/11122
-    echo 'Set disable_coredump false' >> /etc/sudo.conf && \
-# Setup entrypoint
-    chmod 755 /sbin/docker-entrypoint.sh
-
-WORKDIR /usr/src/paperless/src
-# Mount volumes and set Entrypoint
-VOLUME ["/usr/src/paperless/data", "/usr/src/paperless/media", "/consume", "/export"]
+RUN chmod 755 /sbin/docker-entrypoint.sh
 ENTRYPOINT ["/sbin/docker-entrypoint.sh"]
+
 CMD ["--help"]
-
-# Copy application
-COPY src/ /usr/src/paperless/src/
-COPY data/ /usr/src/paperless/data/
-COPY media/ /usr/src/paperless/media/
-
-# Collect static files
-RUN sudo -HEu paperless /usr/src/paperless/src/manage.py collectstatic --clear --no-input
diff --git a/docker-compose.env.example b/docker-compose.env.example
index 7117c7dad..d5339db1f 100644
--- a/docker-compose.env.example
+++ b/docker-compose.env.example
@@ -1,3 +1,11 @@
+PAPERLESS_DBENGINE="django.db.backends.postgresql_psycopg2"
+PAPERLESS_DBHOST="db"
+PAPERLESS_DBNAME="paperless"
+PAPERLESS_DBUSER="paperless"
+PAPERLESS_DBPASS="paperless"
+
+PAPERLESS_CONSUMPTION_DIR="../consume"
+
 # Environment variables to set for Paperless
 # Commented out variables will be replaced with a default within Paperless.
 #
@@ -5,24 +13,23 @@
 # paperless.conf.example here.  Values like:
 #
 # * PAPERLESS_PASSPHRASE
-# * PAPERLESS_CONSUMPTION_DIR
 # * PAPERLESS_CONSUME_MAIL_HOST
 #
 # ...are all explained in that file but can be defined here, since the Docker
 # installation doesn't make use of paperless.conf.
 
 # Use this variable to set a timezone for the Paperless Docker containers. If not specified, defaults to UTC.
-# TZ=America/Los_Angeles
+#TZ=America/Los_Angeles
 
 # Additional languages to install for text recognition.  Note that this is
 # different from PAPERLESS_OCR_LANGUAGE (default=eng), which defines the
 # default language used when guessing the language from the OCR output.
-# PAPERLESS_OCR_LANGUAGES=deu ita
+# The container installs English, German, Italian, Spanish and French by
+# default.
+#PAPERLESS_OCR_LANGUAGES=deu ita spa fra
 
-# Set Paperless to use SSL for the web interface.
-# Enabling this will require ssl.key and ssl.cert files in paperless' data directory.
-# PAPERLESS_USE_SSL=false
-
-# You can change the default user and group id to a custom one
-# USERMAP_UID=1000
-# USERMAP_GID=1000
+# The UID and GID of the user used to run paperless in the container. Set this
+# to your UID and GID on the host so that you have write access to the
+# consumption directory.
+#USERMAP_UID=1000
+#USERMAP_GID=1000
diff --git a/docker-compose.yml.example b/docker-compose.yml.example
index f8c920f95..563bec742 100644
--- a/docker-compose.yml.example
+++ b/docker-compose.yml.example
@@ -1,56 +1,44 @@
-version: '2.1'
-
+version: "3.8"
 services:
-    webserver:
-        build: ./
-        # uncomment the following line to start automatically on system boot
-        # restart: always
-        ports:
-            # You can adapt the port you want Paperless to listen on by
-            # modifying the part before the `:`.
-            - "8000:8000"
-        healthcheck:
-            test: ["CMD", "curl" , "-f", "http://localhost:8000"]
-            interval: 30s
-            timeout: 10s
-            retries: 5
-        volumes:
-            - data:/usr/src/paperless/data
-            - media:/usr/src/paperless/media
-            # You have to adapt the local path you want the consumption
-            # directory to mount to by modifying the part before the ':'.
-            - ./consume:/consume
-        env_file: docker-compose.env
-        # The reason the line is here is so that the webserver that doesn't do
-        # any text recognition and doesn't have to install unnecessary
-        # languages the user might have set in the env-file by overwriting the
-        # value with nothing.
-        environment:
-            - PAPERLESS_OCR_LANGUAGES=
-        command: ["gunicorn", "-b", "0.0.0.0:8000"]
+  db:
+    image: postgres:13
+    #restart: always
+    environment:
+      POSTGRES_DB: paperless
+      POSTGRES_USER: paperless
+      POSTGRES_PASSWORD: paperless
 
-    consumer:
-        build: ./
-        # uncomment the following line to start automatically on system boot
-        # restart: always
-        depends_on:
-            webserver:
-                condition: service_healthy
-        volumes:
-            - data:/usr/src/paperless/data
-            - media:/usr/src/paperless/media
-            # This should be set to the same value as the consume directory
-            # in the webserver service above.
-            - ./consume:/consume
-            # Likewise, you can add a local path to mount a directory for
-            # exporting. This is not strictly needed for paperless to
-            # function, only if you're exporting your files: uncomment
-            # it and fill in a local path if you know you're going to
-            # want to export your documents.
-            # - /path/to/another/arbitrary/place:/export
-        env_file: docker-compose.env
-        command: ["document_consumer"]
+  webserver:
+    build: .
+    image: paperless_app
+    #restart: always
+    depends_on:
+      - db
+    ports:
+      - "8000:8000"
+    healthcheck:
+      test: ["CMD", "curl", "-f", "http://localhost:8000"]
+      interval: 30s
+      timeout: 10s
+      retries: 5
+    volumes:
+      - data:/usr/src/paperless/data
+    env_file: docker-compose.env
+    environment:
+      - PAPERLESS_OCR_LANGUAGES=
+    command: ["gunicorn", "-b", "0.0.0.0:8000"]
+
+  consumer:
+    image: paperless_app
+    depends_on:
+      - webserver
+      - db
+    restart: on-failure:5
+    volumes:
+      - data:/usr/src/paperless/data
+      - ./consume:/usr/src/paperless/consume
+    env_file: docker-compose.env
+    command: ["document_consumer"]
 
 volumes:
-    data:
-    media:
+  data:
diff --git a/scripts/docker-entrypoint.sh b/scripts/docker-entrypoint.sh
index 2028413d1..3c9ec5c4a 100644
--- a/scripts/docker-entrypoint.sh
+++ b/scripts/docker-entrypoint.sh
@@ -1,4 +1,5 @@
 #!/bin/bash
+
 set -e
 
 # Source: https://github.com/sameersbn/docker-gitlab/
@@ -14,83 +15,72 @@ map_uidgid() {
     fi
 }
 
-set_permissions() {
-    # Set permissions for consumption and export directory
-    for dir in PAPERLESS_CONSUMPTION_DIR PAPERLESS_EXPORT_DIR; do
-      # Extract the name of the current directory from $dir for the error message
-      cur_dir_name=$(echo "$dir" | awk -F'_' '{ print tolower($2); }')
-      chgrp paperless "${!dir}" || {
-          echo "Changing group of ${cur_dir_name} directory:"
-          echo "  ${!dir}"
-          echo "failed."
-          echo ""
-          echo "Either try to set it on your host-mounted directory"
-          echo "directly, or make sure that the directory has \`g+wx\`"
-          echo "permissions and the files in it at least \`o+r\`."
-      } >&2
-      chmod g+wx "${!dir}" || {
-          echo "Changing group permissions of ${cur_dir_name} directory:"
-          echo "  ${!dir}"
-          echo "failed."
-          echo ""
-          echo "Either try to set it on your host-mounted directory"
-          echo "directly, or make sure that the directory has \`g+wx\`"
-          echo "permissions and the files in it at least \`o+r\`."
-      } >&2
-    done
-    # Set permissions for application directory
-    chown -Rh paperless:paperless /usr/src/paperless
-}
-
 migrations() {
     # A simple lock file in case other containers use this startup
     LOCKFILE="/usr/src/paperless/data/db.sqlite3.migration"
 
-    # check for and create lock file in one command 
+    # check for and create lock file in one command
     if (set -o noclobber; echo "$$" > "${LOCKFILE}") 2> /dev/null
     then
         trap 'rm -f "${LOCKFILE}"; exit $?' INT TERM EXIT
-        sudo -HEu paperless "/usr/src/paperless/src/manage.py" "migrate"
+        sudo -HEu paperless python3 manage.py migrate
         rm ${LOCKFILE}
     fi
 }
 
 initialize() {
-    map_uidgid
-    set_permissions
-    migrations
+	map_uidgid
+
+	for data_dir in index media media/documents media/thumbnails; do
+		if [[ ! -d "../data/$data_dir" ]]
+		then
+			echo "creating directory ../data/$data_dir"
+			mkdir ../data/$data_dir
+		fi
+	done
+
+	chown -R paperless:paperless ../
+
+	migrations
+
 }
 
 install_languages() {
-    local langs="$1"
-    read -ra langs <<<"$langs"
+	echo "TEST"
+	local langs="$1"
+	read -ra langs <<<"$langs"
 
-    # Check that it is not empty
-    if [ ${#langs[@]} -eq 0 ]; then
-        return
-    fi
-
-    # Loop over languages to be installed
-    for lang in "${langs[@]}"; do
-        pkg="tesseract-ocr-data-$lang"
+	# Check that it is not empty
+	if [ ${#langs[@]} -eq 0 ]; then
+		return
+	fi
+	apt-get update
 
+	for lang in "${langs[@]}"; do
+        pkg="tesseract-ocr-$lang"
         # English is installed by default
-        if [[ "$lang" ==  "eng" ]]; then
-            continue
+        #if [[ "$lang" ==  "eng" ]]; then
+        #    continue
+        #fi
+
+        if dpkg -s $pkg &> /dev/null; then
+        	echo "package $pkg already installed!"
+        	continue
         fi
 
-        if apk info -e "$pkg" > /dev/null 2>&1; then
-            continue
-        fi
-        if ! apk --no-cache info "$pkg" > /dev/null 2>&1; then
-            continue
+        if ! apt-cache show $pkg &> /dev/null; then
+        	echo "package $pkg not found! :("
+        	continue
         fi
 
-        apk --no-cache --update add "$pkg"
+				echo "Installing package $pkg..."
+				if ! apt-get -y install "$pkg" &> /dev/null; then
+					echo "Could not install $pkg"
+					exit 1
+				fi
     done
 }
 
-
 if [[ "$1" != "/"* ]]; then
     initialize
 
@@ -101,21 +91,12 @@ if [[ "$1" != "/"* ]]; then
 
     if [[ "$1" = "gunicorn" ]]; then
         shift
-        EXTRA_PARAMS=""
-        SSL_KEY_PATH="/usr/src/paperless/data/ssl.key"
-        SSL_CERT_PATH="/usr/src/paperless/data/ssl.cert"
-        if [ "${PAPERLESS_USE_SSL}" = "true" ]; then
-            if [ -f "${SSL_KEY_PATH}" ] && [ -f "${SSL_CERT_PATH}" ]; then
-                EXTRA_PARAMS="--certfile=${SSL_CERT_PATH} --keyfile=${SSL_KEY_PATH}"
-            else
-                echo "Error: Could not find certfile in ${SSL_CERT_PATH} or keyfile in ${SSL_KEY_PATH}, but \$PAPERLESS_USE_SSL is true. Starting without SSL enabled."
-            fi
-        fi
         cd /usr/src/paperless/src/ && \
-            exec sudo -HEu paperless /usr/bin/gunicorn -c /usr/src/paperless/gunicorn.conf ${EXTRA_PARAMS} "$@" paperless.wsgi
-    else
-        exec sudo -HEu paperless "/usr/src/paperless/src/manage.py" "$@"
+            exec sudo -HEu paperless gunicorn -c /usr/src/paperless/gunicorn.conf.py "$@" paperless.wsgi
     fi
+
+		exec sudo -HEu paperless python3 manage.py "$@"
+
 fi
 
 exec "$@"