diff --git a/Dockerfile b/Dockerfile
index e34a3eabc607a3acdb71efb14191b65ccd2c735e..3a600ac34e850ee3bbdde7b73b8ab90c1b51066d 100644
--- a/Dockerfile
+++ b/Dockerfile
@@ -4,13 +4,6 @@ RUN groupadd -r ics && useradd -r -g ics ics
 
 WORKDIR /app
 
-# uwsgi is currently not available on conda-forge
-# for Python 3.6 - it needs to be installed with pip
-# and that requires gcc
-RUN apt-get update && apt-get install -y \
-    gcc \
- && rm -rf /var/lib/apt/lists/*
-
 # Install CSEntry requirements
 COPY environment.yml /app/environment.yml
 RUN conda config --add channels conda-forge \
diff --git a/README.rst b/README.rst
index 6b5cc57f871238f82ba539fb05e4adedecce9602..7f015c2d0a409af267127f89e7e5f82174f803be 100644
--- a/README.rst
+++ b/README.rst
@@ -76,3 +76,16 @@ To restore the database::
 
     $ gunzip -c csentry_db.dump.g | docker run --rm --link csentry_postgres:postgres --net csentry_default
       -e PGPASSWORD="<csentry_password>" -i postgres:10 psql -h postgres -U csentry csentry_db
+
+
+Dependencies
+------------
+
+The initial dependencies were generated using::
+
+    $ docker run --rm -it -v $(pwd):/app continuumio/miniconda3:latest bash
+    $ conda config --add channels conda-forge
+    $ conda create -n csentry python=3.6 flask alembic flask-debugtoolbar flask-login flask-sqlalchemy flask-wtf pillow psycopg2 pytest pytest-cov qrcode whitenoise factory_boy flask-admin pyjwt ldap3 flask-mail flask-migrate flask-jwt-extended
+    $ source activate csentry
+    $ pip install flask-ldap3-login sqlalchemy-citext sqlalchemy-continuum pytest-factoryboy git+https://github.com/beenje/flask-bootstrap@4.0.0-beta.1.dev1
+    $ conda env export > /app/environment.yml
diff --git a/environment.yml b/environment.yml
index 9ab868a5a29217ceb16d432ca68440f01c64ad04..60f3fc3614b31c7ceed4c3eb4380c3d1db1620d7 100644
--- a/environment.yml
+++ b/environment.yml
@@ -1,69 +1,84 @@
 name: csentry
-channels: !!python/tuple
+channels:
 - conda-forge
 - defaults
 dependencies:
-- conda-forge::alembic=0.9.3=py36_0
-- conda-forge::ca-certificates=2017.4.17=0
-- conda-forge::certifi=2017.4.17=py36_0
-- conda-forge::click=6.7=py36_0
-- conda-forge::colorama=0.3.9=py36_0
-- conda-forge::coverage=4.4.1=py36_0
-- conda-forge::flask=0.12.2=py36_0
-- conda-forge::flask-debugtoolbar=0.10.1=py36_0
-- conda-forge::flask-login=0.4.0=py36_0
-- conda-forge::flask-sqlalchemy=2.2=py36_1
-- conda-forge::flask-wtf=0.14.2=py36_0
-- conda-forge::freetype=2.7=1
-- conda-forge::itsdangerous=0.24=py36_1
-- conda-forge::jinja2=2.9.5=py36_0
-- conda-forge::jpeg=9b=0
-- conda-forge::krb5=1.14.2=0
-- conda-forge::libpng=1.6.28=0
-- conda-forge::libpq=9.5.4=4
-- conda-forge::libtiff=4.0.6=7
-- conda-forge::mako=1.0.7=py36_0
-- conda-forge::markupsafe=1.0=py36_0
-- conda-forge::ncurses=5.9=10
-- conda-forge::olefile=0.44=py36_0
-- conda-forge::openssl=1.0.2l=0
-- conda-forge::pillow=4.2.1=py36_0
-- conda-forge::pip=9.0.1=py36_0
-- conda-forge::psycopg2=2.7.1=py36_0
-- conda-forge::py=1.4.34=py36_0
-- conda-forge::pytest=3.2.1=py36_0
-- conda-forge::pytest-cov=2.5.1=py36_0
-- conda-forge::python=3.6.1=3
-- conda-forge::python-dateutil=2.6.0=py36_0
-- conda-forge::python-editor=1.0.3=py36_0
-- conda-forge::qrcode=5.3=py36_0
-- conda-forge::readline=6.2=0
-- conda-forge::setuptools=33.1.1=py36_0
-- conda-forge::six=1.10.0=py36_1
-- conda-forge::sqlalchemy=1.1.11=py36_0
-- conda-forge::sqlite=3.13.0=1
-- conda-forge::tk=8.5.19=1
-- conda-forge::werkzeug=0.12.2=py36_0
-- conda-forge::wheel=0.29.0=py36_0
-- conda-forge::whitenoise=3.3.0=py36_0
-- conda-forge::wtforms=2.1=py36_0
-- conda-forge::xz=5.2.2=0
-- conda-forge::zlib=1.2.11=0
+- alembic=0.9.6=py_0
+- asn1crypto=0.22.0=py36_0
+- blinker=1.4=py36_0
+- ca-certificates=2017.11.5=0
+- certifi=2017.11.5=py36_0
+- cffi=1.10.0=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
+- email_validator=1.0.2=py_0
+- factory_boy=2.9.2=py36_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-jwt-extended=3.3.1=py_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
+- idna=2.6=py36_1
+- itsdangerous=0.24=py_2
+- 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
+- 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
+- pillow=4.3.0=py36_1
+- pip=9.0.1=py36_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
+- pyjwt=1.5.3=py_0
+- pytest=3.2.5=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
+- qrcode=5.3=py36_0
+- readline=6.2=0
+- setuptools=36.7.2=py36_0
+- six=1.11.0=py36_1
+- sqlalchemy=1.1.13=py36_0
+- sqlite=3.13.0=1
+- tk=8.5.19=2
+- werkzeug=0.12.2=py_1
+- wheel=0.30.0=py_1
+- whitenoise=3.3.1=py36_0
+- wtforms=2.1=py36_0
+- xz=5.2.3=0
+- zlib=1.2.11=0
+- ecdsa=0.13=py36_0
 - pip:
-  - blinker==1.4
   - dominate==2.3.1
-  - flask-admin==1.5.0
+  - email-validator==1.0.2
+  - factory-boy==2.9.2
   - git+https://github.com/beenje/flask-bootstrap@4.0.0-beta.1.dev1
-  - flask-jwt-extended==3.1.1
   - flask-ldap3-login==0.9.13
-  - flask-mail==0.9.1
-  - flask-migrate==2.0.4
-  - flask-script==2.0.5
-  - ldap3==2.2.4
-  - pyasn1==0.2.3
-  - pyjwt==1.4.2
+  - inflection==0.3.1
+  - pytest-factoryboy==1.3.1
   - sqlalchemy-citext==1.3.post0
-  - sqlalchemy-continuum==1.3.1
-  - sqlalchemy-utils==0.32.14
-  - uwsgi==2.0.15
+  - sqlalchemy-continuum==1.3.3
+  - sqlalchemy-utils==0.32.21
+  - ukpostcodeparser==1.1.1
   - visitor==0.1.3