diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml
index 0a2dfe803e5aa20c91c9bdbca4a183d895b13e44..9874c1eb3e8a00f0198d1da661c742e396358ebe 100644
--- a/.gitlab-ci.yml
+++ b/.gitlab-ci.yml
@@ -46,7 +46,8 @@ test:
   services:
     - postgres:10
     - redis:4.0
-  before_script: []
+  before_script:
+    - pip install -r requirements-dev.txt
   script:
     - pytest --junitxml=junit.xml --cov-report xml:coverage.xml --cov=app -v
   artifacts:
@@ -97,7 +98,8 @@ pages:
   <<: *runner_tags
   stage: deploy
   image: "$CONTAINER_RELEASE_IMAGE"
-  before_script: []
+  before_script:
+    - pip install -r requirements-dev.txt
   script:
     - sphinx-build -M html docs docs/_build
     - mv docs/_build/html public
diff --git a/Dockerfile b/Dockerfile
index a313d757a6017484bce977669a0bb48f350e4e51..5e08a1291bc08e8cc72b8f3fd07180e693bbddf2 100644
--- a/Dockerfile
+++ b/Dockerfile
@@ -1,18 +1,64 @@
-FROM registry.esss.lu.se/ics-docker/miniconda:4.5
+FROM python:3.6-slim as base
 
-USER root
-WORKDIR /app
-RUN chown conda:users /app
+# Install Python dependencies in an intermediate image
+# as some requires a compiler (uwsgi)
+FROM base as builder
+
+# Install dependencies required to compile some Python packages
+# Taken from https://github.com/docker-library/python/blob/master/3.6/stretch/slim/Dockerfile
+# For psycopg2: libpq-dev
+# For pillow: libjpeg-dev libpng-dev libtiff-dev
+RUN apt-get update \
+  && apt-get install -yq --no-install-recommends \
+    gcc \
+    libbz2-dev \
+    libc6-dev \
+    libexpat1-dev \
+    libffi-dev \
+    libjpeg-dev \
+    libgdbm-dev \
+    liblzma-dev \
+    libncursesw5-dev \
+    libpng-dev \
+    libpq-dev \
+    libreadline-dev \
+    libsqlite3-dev \
+    libssl-dev \
+    libtiff-dev \
+    make \
+    tk-dev \
+    wget \
+    xz-utils \
+    zlib1g-dev \
+  && apt-get clean \
+  && rm -rf /var/lib/apt/lists/*
+
+COPY requirements.txt /requirements.txt
+RUN python -m venv /venv \
+  && . /venv/bin/activate \
+  && pip install --no-cache-dir -r /requirements.txt
+
+FROM base
 
-USER conda
+RUN groupadd -r -g 1000 csi \
+  && useradd --no-log-init -r -g csi -u 1000 csi
 
-# Install CSEntry requirements
-COPY environment.yml /app/environment.yml
-RUN conda env create -n csentry -f environment.yml \
-    && rm -rf /opt/conda/pkgs/*
+COPY --chown=csi:csi --from=builder /venv /venv
+
+# Install libraries for psycopg2 and pillow
+# Shall be the same as the one linked to when compiling in builder image!
+RUN apt-get update \
+  && apt-get install -yq --no-install-recommends \
+    libjpeg62-turbo \
+    libpng16-16 \
+    libtiff5 \
+    libpq5 \
+  && apt-get clean \
+  && rm -rf /var/lib/apt/lists/*
+
+COPY --chown=csi:csi . /app/
+WORKDIR /app
 
-# Install the app
-COPY . /app/
+ENV PATH /venv/bin:$PATH
 
-# activate the csentry environment
-ENV PATH /opt/conda/envs/csentry/bin:$PATH
+USER csi
diff --git a/environment.yml b/environment.yml
deleted file mode 100644
index b5880c8f1e7215faa13461d2c012116f2fb063b5..0000000000000000000000000000000000000000
--- a/environment.yml
+++ /dev/null
@@ -1,115 +0,0 @@
-name: csentry
-channels:
-  - conda-forge
-  - defaults
-dependencies:
-  - alabaster=0.7.10=py36_1
-  - alembic=0.9.6=py_0
-  - asn1crypto=0.22.0=py36_0
-  - attrs=17.4.0=py_0
-  - babel=2.5.1=py36_0
-  - blinker=1.4=py_0
-  - ca-certificates=2017.11.5=0
-  - certifi=2017.11.5=py36_0
-  - cffi=1.10.0=py36_0
-  - chardet=3.0.4=py36_0
-  - click=6.7=py36_0
-  - colorama=0.3.9=py36_0
-  - coverage=4.4.2=py36_0
-  - cryptography=2.0.3=py36_0
-  - dnspython=1.15.0=py_0
-  - docutils=0.14=py36_0
-  - email_validator=1.0.2=py_0
-  - factory_boy=2.10.0=py_0
-  - faker=0.8.1=py_0
-  - flask=0.12.2=py36_0
-  - flask-admin=1.5.0=py36_0
-  - flask-debugtoolbar=0.10.1=py36_0
-  - flask-login=0.4.0=py36_0
-  - flask-mail=0.9.1=py36_1
-  - flask-migrate=2.1.1=py36_0
-  - flask-sqlalchemy=2.3.2=py_0
-  - flask-wtf=0.14.2=py36_0
-  - freetype=2.7=2
-  - icu=58.2=0
-  - idna=2.6=py36_1
-  - imagesize=0.7.1=py36_0
-  - itsdangerous=0.24=py_2
-  - jansson=2.7=0
-  - jinja2=2.9.6=py36_0
-  - jpeg=9b=2
-  - krb5=1.14.2=0
-  - ldap3=2.3=py36_0
-  - libffi=3.2.1=3
-  - libpng=1.6.28=2
-  - libpq=9.6.3=0
-  - libtiff=4.0.7=1
-  - libxml2=2.9.5=2
-  - mako=1.0.7=py36_0
-  - markupsafe=1.0=py36_0
-  - ncurses=5.9=10
-  - olefile=0.44=py36_0
-  - openssl=1.0.2l=0
-  - pcre=8.39=0
-  - pillow=4.3.0=py36_1
-  - pip=9.0.1=py36_0
-  - pluggy=0.6.0=py_0
-  - psycopg2=2.7.3.2=py36_0
-  - py=1.5.2=py_0
-  - pyasn1=0.3.7=py_0
-  - pycparser=2.18=py36_0
-  - pycrypto=2.6.1=py36_1
-  - pygments=2.2.0=py36_0
-  - pyjwt=1.5.3=py_0
-  - pyopenssl=17.4.0=py36_0
-  - pysocks=1.6.8=py36_1
-  - pytest=3.4.2=py36_0
-  - pytest-cov=2.5.1=py36_0
-  - python=3.6.3=1
-  - python-dateutil=2.6.1=py36_0
-  - python-editor=1.0.3=py36_0
-  - pytz=2017.3=py_2
-  - pyyaml=3.12=py36_1
-  - qrcode=5.3=py36_0
-  - readline=6.2=0
-  - redis-py=2.10.6=py_0
-  - requests=2.18.4=py36_1
-  - setuptools=36.7.2=py36_0
-  - six=1.11.0=py36_1
-  - snowballstemmer=1.2.1=py36_0
-  - sphinx=1.6.7=py36_0
-  - sphinxcontrib-websupport=1.0.1=py36_0
-  - sqlalchemy=1.1.13=py36_0
-  - sqlite=3.13.0=1
-  - tk=8.5.19=2
-  - typing=3.6.2=py36_0
-  - urllib3=1.22=py36_0
-  - uwsgi=2.0.15=py36_2
-  - werkzeug=0.12.2=py_1
-  - wheel=0.30.0=py36_2
-  - whitenoise=3.3.1=py36_0
-  - wtforms=2.1=py36_0
-  - xz=5.2.3=0
-  - yaml=0.1.6=0
-  - zlib=1.2.11=0
-  - ecdsa=0.13=py36_0
-  - pip:
-      - ansible-tower-cli==3.2.1
-      - arrow==0.12.1
-      - dominate==2.3.1
-      - email-validator==1.0.2
-      - flask-caching==1.3.3
-      - flask-jwt-extended==3.4.0
-      - flask-ldap3-login==0.9.13
-      - flask-redis==0.3.0
-      - flask-session==0.3.1
-      - inflection==0.3.1
-      - pytest-factoryboy==2.0.1
-      - rq==0.10.0
-      - rq-dashboard==0.3.10
-      - sphinxcontrib-httpdomain==1.6.0
-      - sqlalchemy-citext==1.3.post0
-      - sqlalchemy-continuum==1.3.3
-      - sqlalchemy-utils==0.32.21
-      - ukpostcodeparser==1.1.1
-      - visitor==0.1.3
diff --git a/requirements-dev.txt b/requirements-dev.txt
new file mode 100644
index 0000000000000000000000000000000000000000..7c3da6715b063e41adcd4aa5d333ca8e069f0fa4
--- /dev/null
+++ b/requirements-dev.txt
@@ -0,0 +1,7 @@
+sphinx
+sphinxcontrib-httpdomain
+coverage
+factory_boy
+pytest
+pytest-cov
+pytest-factoryboy
diff --git a/requirements-to-freeze.txt b/requirements-to-freeze.txt
new file mode 100644
index 0000000000000000000000000000000000000000..735bbf46c003a760733105bd5ebab9fd1ab4bbfb
--- /dev/null
+++ b/requirements-to-freeze.txt
@@ -0,0 +1,26 @@
+flask>=1.0.0
+flask-admin
+flask-caching
+flask-debugtoolbar
+flask-jwt-extended
+flask-ldap3-login
+flask-login
+flask-mail
+flask-migrate
+flask-redis
+flask-session
+flask-sqlalchemy
+flask-wtf
+pillow
+psycopg2
+pyjwt
+python-dateutil
+pyyaml
+qrcode
+uwsgi
+whitenoise
+ansible-tower-cli
+rq
+rq-dashboard
+sqlalchemy-citext
+sqlalchemy-continuum
diff --git a/requirements.txt b/requirements.txt
new file mode 100644
index 0000000000000000000000000000000000000000..c142d14fe3aa22c3a5f660404c149326ed2d260b
--- /dev/null
+++ b/requirements.txt
@@ -0,0 +1,49 @@
+alembic==1.0.0
+ansible-tower-cli==3.3.0
+arrow==0.12.1
+blinker==1.4
+certifi==2018.4.16
+chardet==3.0.4
+click==6.7
+colorama==0.3.9
+Flask==1.0.2
+Flask-Admin==1.5.1
+Flask-Caching==1.4.0
+Flask-DebugToolbar==0.10.1
+Flask-JWT-Extended==3.12.0
+flask-ldap3-login==0.9.14
+Flask-Login==0.4.1
+Flask-Mail==0.9.1
+Flask-Migrate==2.2.1
+Flask-Redis==0.3.0
+Flask-Session==0.3.1
+Flask-SQLAlchemy==2.3.2
+Flask-WTF==0.14.2
+idna==2.7
+itsdangerous==0.24
+Jinja2==2.10
+ldap3==2.5.1
+Mako==1.0.7
+MarkupSafe==1.0
+Pillow==5.2.0
+psycopg2==2.7.5
+pyasn1==0.4.4
+PyJWT==1.6.4
+python-dateutil==2.7.3
+python-editor==1.0.3
+PyYAML==3.13
+qrcode==6.0
+redis==2.10.6
+requests==2.19.1
+rq==0.12.0
+rq-dashboard==0.3.12
+six==1.11.0
+SQLAlchemy==1.2.10
+sqlalchemy-citext==1.3.post0
+SQLAlchemy-Continuum==1.3.6
+SQLAlchemy-Utils==0.33.3
+urllib3==1.23
+uWSGI==2.0.17.1
+Werkzeug==0.14.1
+whitenoise==3.3.1
+WTForms==2.2.1