diff --git a/docker/Dockerfile b/docker/Dockerfile
new file mode 100644
index 0000000000000000000000000000000000000000..c3fa238362271d281a3416bac646b77ea1ea6be5
--- /dev/null
+++ b/docker/Dockerfile
@@ -0,0 +1,177 @@
+FROM ubuntu:16.04
+
+# ARGUMENTS
+###########
+
+# OBLIGATORY
+ARG OPENSTRUCTURE_VERSION
+RUN if [ -z "${OPENSTRUCTURE_VERSION}" ]; then \
+        echo "OPENSTRUCTURE_VERSION argument is obligatory. Run with --build-arg OPENSTRUCTURE_VERSION=<VERSION>"; \
+        exit 1; \
+    else : ; fi
+
+# OPTIONAL
+ARG SRC_FOLDER="/usr/local/src"
+ARG CPUS_FOR_MAKE=8
+ARG PYTHONPATH="/usr/local/lib64/python2.7/site-packages:${PYTHONPATH}"
+ARG OPENSTRUCTURE_SHARE="/usr/local/share/ost"
+ARG MSMS_VERSION="2.6.1"
+ARG OPENMM_VERSION="7.1.1"
+ARG DSSP_VERSION="2.2.1"
+ARG OPENMM_INCLUDE_PATH="/usr/local/openmm/include/"
+ARG OPENMM_LIB_PATH="/usr/local/openmm/lib/"
+
+# INSTALL SYSTEM DEPS
+#####################
+RUN apt-get update -y && apt-get install -y cmake \
+                                            sip-dev \
+                                            libtiff-dev \
+                                            libfftw3-dev \
+                                            libeigen3-dev \
+                                            libboost-all-dev \
+                                            libpng-dev \
+                                            python-all \
+                                            python2.7 \
+                                            python-qt4 \
+                                            qt4-qtconfig \
+                                            qt4-qmake \
+                                            libqt4-dev \
+                                            libpng-dev \
+                                            wget \
+                                            git \
+                                            gfortran \
+                                            python-pip \
+                                            tar \
+                                            libbz2-dev \
+                                            doxygen \
+                                            swig \
+                                            clustalw \
+                                            python-virtualenv \
+                                            locales && \
+                      # CLEANUP
+                      rm -rf /var/lib/apt/lists/*
+# INSTALL SOME PYTHON PACKAGES GLOBALY
+######################################
+RUN pip install -U pip==9.0.3 && \
+    pip install -U setuptools==39.0.1 && \
+    pip install --no-cache-dir numpy==1.10.4 \
+                         scipy==1.0.0 \
+                         pandas==0.22.0
+
+# SET LOCALE
+############
+# RUN echo "LC_ALL=en_US.UTF-8" >> /etc/environment
+# RUN echo "en_US.UTF-8 UTF-8" >> /etc/locale.gen
+# RUN echo "LANG=en_US.UTF-8" > /etc/locale.conf
+# RUN locale-gen en_US.UTF-8
+
+# DOWNLOAD AND INSTALL MSMS
+###########################
+RUN cd ${SRC_FOLDER} && \
+    mkdir -p msms && \
+    cd ${SRC_FOLDER}/msms && \
+    wget http://mgltools.scripps.edu/downloads/tars/releases/MSMSRELEASE/REL${MSMS_VERSION}/msms_i86_64Linux2_${MSMS_VERSION}.tar.gz && \
+    tar -xvzf msms_i86_64Linux2_${MSMS_VERSION}.tar.gz && \
+    cp -v ${SRC_FOLDER}/msms/msms.x86_64Linux2.${MSMS_VERSION} /usr/local/bin/msms && \
+    cp -v ${SRC_FOLDER}/msms/pdb_to_xyzr /usr/local/bin/pdb_to_xyzr && \
+    cp -v ${SRC_FOLDER}/msms/pdb_to_xyzrn /usr/local/bin/pdb_to_xyzrn && \
+    rm -rf ${SRC_FOLDER}/msms
+
+# COMPILE OPENMM FROM SOURCES. INSTALL TO /usr/local
+####################################################
+RUN cd ${SRC_FOLDER} && \
+    wget -O openmm-${OPENMM_VERSION}.tar.gz -nc https://github.com/pandegroup/openmm/archive/${OPENMM_VERSION}.tar.gz && \
+    mkdir ${SRC_FOLDER}/openmm-${OPENMM_VERSION} && \
+    tar xf openmm-${OPENMM_VERSION}.tar.gz -C ${SRC_FOLDER}/openmm-${OPENMM_VERSION} --strip-components=1 && \
+    mkdir -p ${SRC_FOLDER}/openmm-${OPENMM_VERSION}/build && \
+    cd ${SRC_FOLDER}/openmm-${OPENMM_VERSION}/build && \
+    cmake .. && make -j $CPUS_FOR_MAKE && make install && \
+    cd ${SRC_FOLDER}/openmm-${OPENMM_VERSION}/build/python && \
+    python setup.py build && python setup.py install && \
+    rm -rf ${SRC_FOLDER}/openmm-${OPENMM_VERSION}.tar.gz && \
+    rm -rf ${SRC_FOLDER}/openmm-${OPENMM_VERSION}
+
+
+# COMPILE AND INSTALL DSSP
+##########################
+RUN cd ${SRC_FOLDER} && \
+    wget ftp://ftp.cmbi.ru.nl/pub/software/dssp/dssp-${DSSP_VERSION}.tgz && \
+    tar -xvzf dssp-${DSSP_VERSION}.tgz && \
+    cd dssp-${DSSP_VERSION} && \
+    make -j ${CPUS_FOR_MAKE} && \
+    make install && \
+    rm -rf ${SRC_FOLDER}/dssp-${DSSP_VERSION}.tgz && \
+    rm -rf ${SRC_FOLDER}/dssp-${DSSP_VERSION}
+
+# INSTALL OST
+#############
+RUN cd ${SRC_FOLDER} && \
+# copy ost release
+    wget -O openstructure-${OPENSTRUCTURE_VERSION}.tar.gz -nc https://git.scicore.unibas.ch/schwede/openstructure/repository/${OPENSTRUCTURE_VERSION}/archive.tar.gz && \
+    mkdir openstructure-${OPENSTRUCTURE_VERSION} && \
+    tar xf openstructure-${OPENSTRUCTURE_VERSION}.tar.gz -C ${SRC_FOLDER}/openstructure-${OPENSTRUCTURE_VERSION} --strip-components=1 && \
+    mkdir -p ${SRC_FOLDER}/openstructure-${OPENSTRUCTURE_VERSION}/build
+WORKDIR ${SRC_FOLDER}/openstructure-${OPENSTRUCTURE_VERSION}/build
+
+# cmake ost
+RUN cmake .. -DPYTHON_LIBRARIES=/usr/lib/x86_64-linux-gnu/libpython2.7.so \
+             -DOPTIMIZE=ON \
+             -DENABLE_MM=ON \
+             -DCOMPILE_TMTOOLS=1 \
+             -DUSE_NUMPY=1 \
+             -DOPEN_MM_LIBRARY=$OPENMM_LIB_PATH/libOpenMM.so \
+             -DOPEN_MM_INCLUDE_DIR=$OPENMM_INCLUDE_PATH \
+             -DOPEN_MM_PLUGIN_DIR=$OPENMM_LIB_PATH/plugins \
+             -DENABLE_GFX=ON \
+             -DENABLE_GUI=ON && \
+             # Build chemdict_tool
+             make -j ${CPUS_FOR_MAKE} chemdict_tool
+
+# get the compound library
+RUN wget ftp://ftp.wwpdb.org/pub/pdb/data/monomers/components.cif.gz
+RUN stage/bin/chemdict_tool create components.cif.gz compounds.chemlib pdb && stage/bin/chemdict_tool update modules/conop/data/charmm.cif compounds.chemlib charmm
+RUN mkdir -p $OPENSTRUCTURE_SHARE && chmod a+rw -R $OPENSTRUCTURE_SHARE && mv compounds.chemlib $OPENSTRUCTURE_SHARE
+
+# Build and install OST
+RUN cmake .. -DPYTHON_LIBRARIES=/usr/lib/x86_64-linux-gnu/libpython2.7.so \
+             -DOPTIMIZE=ON \
+             -DENABLE_MM=ON \
+             -DCOMPILE_TMTOOLS=1 \
+             -DUSE_NUMPY=1 \
+             -DOPEN_MM_LIBRARY=$OPENMM_LIB_PATH/libOpenMM.so \
+             -DOPEN_MM_INCLUDE_DIR=$OPENMM_INCLUDE_PATH \
+             -DOPEN_MM_PLUGIN_DIR=$OPENMM_LIB_PATH/plugins \
+             -DENABLE_GFX=ON \
+             -DENABLE_GUI=ON \
+             -DCOMPOUND_LIB=$OPENSTRUCTURE_SHARE/compounds.chemlib && \
+             # Build OST with compound library
+             make -j ${CPUS_FOR_MAKE} && make check && make install
+
+# GO HOME AND CLEANUP
+#####################
+# RUN apt-get purge -y cmake \
+#                      wget \
+#                      git \
+#                      gfortran \
+#                      python-pip \
+#                      libbz2-dev \
+#                      doxygen \
+#                      swig
+# RUN apt-get clean
+# RUN apt-get autoremove -y
+# 
+# WORKDIR $SRC_FOLDER
+# RUN rm -rf $SRC_FOLDER/*
+
+WORKDIR /home
+
+# ENVIRONMENT
+##############################################################################
+ENV OST_ROOT="/usr/local"
+ENV OPENSTRUCTURE_VERSION="1.7.1"
+ENV PYTHONPATH="/usr/local/lib64/python2.7/site-packages:${PYTHONPATH}"
+ENV LD_LIBRARY_PATH="$LD_LIBRARY_PATH:/usr/local/lib64"
+ENV QT_X11_NO_MITSHM=1
+
+ENTRYPOINT ["ost"]
+CMD ["-i"]
diff --git a/docker/README.rst b/docker/README.rst
new file mode 100644
index 0000000000000000000000000000000000000000..4700eb156cad0663893a957ff0eb42aafbffac7e
--- /dev/null
+++ b/docker/README.rst
@@ -0,0 +1,183 @@
+OST Docker
+==========
+
+.. note::
+
+  For many docker installations it is required to run docker commands as root. As
+  this depends on set up, we skip the `sudo` in all commands.
+
+Build Docker image
+------------------
+
+
+In order to build OST image:
+
+.. code-block:: bash
+
+  cd <PATH TO OST>/docker
+  docker build --tag <IMAGE NAME> --build-arg OPENSTRUCTURE_VERSION=<VERSION> -f Dockerfile .
+
+or if you downloaded the Dockerfile directly:
+
+.. code-block:: bash
+
+  docker build --tag <IMAGE NAME> --build-arg OPENSTRUCTURE_VERSION=<VERSION> -f <DOCKERFILE NAME> <PATH TO DOCKERFILE DIR>
+
+You can chose any image name (tag) eg. ost. The `OPENSTRUCTURE_VERSION`
+build argument is mandatory and image will not built without it. See
+`CHANGELOG <https://git.scicore.unibas.ch/schwede/openstructure/blob/master/CHANGELOG.txt>`_
+for current list of available releases.
+
+Testing the image
+-----------------
+
+One can find a exemplary script (`test_docker.py`) in the downloaded directory.
+To run it do:
+
+.. code-block::
+
+  cd <PATH TO OST>/docker
+  docker run --rm -v $(pwd):/home <IMAGE NAME> test_docker.py
+
+As the last line you should see `OST is working!`.
+
+Run script and action with OST
+------------------------------
+
+.. note::
+
+  If script or action requires some external files eg. PDBs, they have to be located in the
+  path accessible via mounted volume and should be accessed via docker (NOT LOCAL)
+  path. Eg. assuming that we have a struc.pdb file in /home/user/pdbs directory and
+  a script.py in /home/user we could mount the /home/user to /home in docker as
+  above by specifying -v /home/user:/home. To run the script we thus need to
+  provide the (relative) path to the script and (relative) path to the file eg:
+
+  .. code-block:: bash
+
+    docker run --rm -v /home/user:/home <IMAGE NAME> script.py pdbs/struct.pdb
+
+  or with absolute paths:
+
+  .. code-block:: bash
+
+    docker run --rm -v /home/user:/home <IMAGE NAME> home/script.py /home/pdbs/struct.pdb
+  
+  An easy solution to mount a CWD is to use $(pwd) command in the -v option
+  of the Docker. For an example see the action exemplary run.
+  The same reasoning is valid for the output files.
+
+Actions
+#######
+
+To see the list of available actions do:
+
+  .. code-block::
+
+    docker run --rm <IMAGE NAME> -h
+
+To run chosen action do:
+
+  .. code-block::
+
+    docker run --rm <IMAGE NAME> <ACTION NAME>
+
+ 
+Here is an example run of compare-structures action mimicking CAMEO evaluation:
+
+.. code-block::
+
+  docker run --rm -v $(pwd):/home <IMAGE NAME> compare-structures \
+      --model model.pdb \
+      --reference reference.pdb \
+      --output output.json \
+      --qs-score \
+      --residue-number-alignment \
+      --lddt \
+      --structural-checks \
+      --consistency-checks \
+      --inclusion-radius 15.0 \
+      --bond-tolerance 15.0 \
+      --angle-tolerance 15.0 \
+      --molck \
+      --remove oxt hyd unk \
+      --clean-element-column \
+      --map-nonstandard-residues
+
+
+In order to see all available options for this action run:
+
+.. code-block::
+
+  docker run --rm <IMAGE NAME> compare-structures -h
+
+Scripts
+#######
+
+In order to run OST script do:
+
+.. code-block:: bash
+
+  docker run [DOCKER OPTIONS] --rm -v <PATH TO SCRIPT DIR>:/home <IMAGE NAME> /home/<SCRIPT NAME> [SCRIPT OPTIONS]
+
+Run ost with utility command
+###############################
+
+One can also use provided utility bash script `run_docker_ost` to run basic
+scripts and actions:
+
+.. code-block:: bash
+
+  <PATH TO OST>/docker/run_docker_ost <IMAGE_NAME> [<SCRIPT_PATH>] [SCRIPT OPTIONS]
+
+One just needs to provide image name and optionally a script/action and its
+options. It is useful to link the command to the binary directory eg. in linux:
+
+.. code-block:: bash
+
+  ln -s <PATH TO OST>/docker/run_docker_ost /usr/bin/run_docker_ost
+
+In order to run an exemplary script (`test_docker.py`) do:
+
+.. code-block::
+
+  cd <PATH TO OST>/docker
+  ./run_docker_ost <IMAGE NAME> test_docker.py
+
+To see the help for compare-structures action run:
+
+.. code-block::
+
+  cd <PATH TO OST>/docker
+  ./run_docker_ost <IMAGE NAME> compare-structures
+
+Run GUI
+-------
+
+In order to run GUI do (tested on linux machine):
+
+.. code-block:: bash
+
+  xhost +local:docker
+  docker run -ti --rm -e DISPLAY=$DISPLAY -v /tmp/.X11-unix:/tmp/.X11-unix --entrypoint dng <IMAGE NAME>
+
+Running other commands
+----------------------
+
+The default entrypoint of the Docker image is "ost" thus in order to run other
+available commands (or other commands in general) one need to override
+the entrypoint:
+
+.. code-block::
+
+  sudo docker run --rm -ti --entrypoint <COMMAND> <IMAGE NAME> [COMMAND OPTIONS]
+
+Eg. to run molck type:
+
+.. code-block::
+
+  sudo docker run --rm -ti --entrypoint molck <IMAGE NAME> --help
+
+.. note::
+
+  Note how the options to the command are specified after the image name.
diff --git a/docker/run_docker_ost b/docker/run_docker_ost
new file mode 100755
index 0000000000000000000000000000000000000000..9930329a2a6b6d8f0ebf381287c2c38deda8925d
--- /dev/null
+++ b/docker/run_docker_ost
@@ -0,0 +1,28 @@
+#!/bin/bash
+
+# end when error
+set -e
+
+image_name=$1
+script_path=$2
+
+if [[ ${#@} -lt 1 ]]; then
+    echo "Usage: run_docker_ost <IMAGE_NAME> [<SCRIPT_PATH>]"
+    exit 1
+fi
+
+if [[ -z ${script_path} ]]; then
+    docker run -ti --rm -v $(pwd):/home ${image_name}
+else
+    if [[ -e $script_path ]]; then
+        abspath=$(readlink -f $script_path)
+        dirpath=$(dirname $abspath)
+        name=$(basename $script_path)
+        docker run --rm -v ${dirpath}:/home ${image_name} /home/${name} ${@:3}
+    else
+        # it is maybe an action if it does not exist
+        docker run --rm -v $(pwd):/home ${image_name} ${script_path} ${@:3}
+    fi
+fi
+
+
diff --git a/docker/test_docker.py b/docker/test_docker.py
new file mode 100644
index 0000000000000000000000000000000000000000..e191217e63f9f8de3ff979e54c787a422428394f
--- /dev/null
+++ b/docker/test_docker.py
@@ -0,0 +1,19 @@
+import ost
+from ost.mol.alg import qsscoring
+
+# load two biounits to compare
+ent_full = ost.io.LoadPDB('3ia3', remote=True)
+ent_1 = ent_full.Select('cname=A,D')
+ent_2 = ent_full.Select('cname=B,C')
+# get score
+ost.PushVerbosityLevel(3)
+try:
+    qs_scorer = qsscoring.QSscorer(ent_1, ent_2)
+    ost.LogScript('QSscore:', str(qs_scorer.global_score))
+    ost.LogScript('Chain mapping used:', str(qs_scorer.chain_mapping))
+except qsscoring.QSscoreError as ex:
+    # default handling: report failure and set score to 0
+    ost.LogError('QSscore failed:', str(ex))
+    qs_score = 0
+
+print "OST is working!"
diff --git a/singularity/README.rst b/singularity/README.rst
new file mode 100644
index 0000000000000000000000000000000000000000..f3e57b7760263c762341e99cf562e21593bf132f
--- /dev/null
+++ b/singularity/README.rst
@@ -0,0 +1,62 @@
+OST Singularity
+===============
+
+Building Singularity image
+--------------------------
+
+In order to build OST Singularity image:
+
+.. code-block:: bash
+
+  cd <OST ROOT>/singularity
+  sudo singularity build ost.img Singularity.1.7.1
+
+.. note::
+
+  Running singularity build command requires root permissions (sudo).
+
+One can chose any name for an image. For the purose of this file we will assume
+that the image name is `ost.img`.
+
+Available apps
+--------------
+
+This container includes the following apps:
+ * **OST** - OpenStructure binary
+ * **IPython** - OST-powered iPython shell
+ * **Notebook** - A Jupyter notebook palyground with OST and nglview
+ * **lDDT** - The Local Distance Difference Test
+ * **Molck** - Molecular checker
+ * **ChemdictTool** - Creating or update a compound library
+
+To see the help for each individual app run:
+
+.. code-block:: bash
+
+    singularity help --app <APP NAME> <PATH TO OST IMAGE>
+
+Eg.:
+
+.. code-block:: bash
+
+    singularity help --app OST ost.img
+
+
+Facilitating the usage
+----------------------
+
+For each of these apps it is useful to create an alias if they will be
+frequently used. Eg. to create an alias for IPython app one can run:
+
+.. code-block::
+
+  alias ost_ipython="singularity run --app IPython <PATH TO OST IMAGE>"
+
+Then (in the same terminal window) to invoke IPython app one can just type:
+
+.. code-block::
+
+  ost_ipython
+
+To make the alias permanent put it into your `.bashrc` file or whatever file you
+use to store the aliases.
\ No newline at end of file
diff --git a/singularity/Singularity.1.7.1 b/singularity/Singularity.1.7.1
new file mode 100644
index 0000000000000000000000000000000000000000..8a96d0a8f0ed575e5b2a5c0ad007076cddd03a4b
--- /dev/null
+++ b/singularity/Singularity.1.7.1
@@ -0,0 +1,431 @@
+BootStrap: docker
+From: ubuntu:16.04
+
+%post
+##############################################################################
+# POST
+##############################################################################
+
+# CHANGE DASH TO BASH
+rm /bin/sh
+ln -sf /bin/bash /bin/sh
+
+# DEFINE SOME ENV VARS USED DURING THE IMAGE BUILD
+##########################
+export SRC_FOLDER="/usr/local/src"
+export CPUS_FOR_MAKE=8
+export PYTHONPATH="/usr/local/lib64/python2.7/site-packages:${PYTHONPATH}"
+export OPENSTRUCTURE_VERSION="1.7.1"
+export OPENSTRUCTURE_SHARE="/usr/local/share/ost"
+export MSMS_VERSION="2.6.1"
+export OPENMM_VERSION="7.1.1"
+export DSSP_VERSION="2.2.1"
+export OPENMM_INCLUDE_PATH=/usr/local/openmm/include/
+export OPENMM_LIB_PATH=/usr/local/openmm/lib/
+export JUPYTER_CONFIG_DIR="/usr/local/etc/jupyter"
+export JUPYTER_PATH="/usr/local/share/jupyter"
+export JUPYTER_RUNTIME_DIR="$JUPYTER_PATH/runtime"
+export VIRTUALENV_DIR="/usr/local/share/ost_venv"
+
+
+# INSTALL SYSTEM DEPS
+#####################
+apt-get update -y && apt-get install -y cmake \
+										sip-dev \
+										libtiff-dev \
+										libfftw3-dev \
+										libeigen3-dev \
+										libboost-all-dev \
+										libpng-dev \
+										python-all \
+										python2.7 \
+										python-qt4 \
+										qt4-qtconfig \
+										qt4-qmake \
+										libqt4-dev \
+										libpng-dev \
+										wget \
+										git \
+										gfortran \
+										python-pip \
+										tar \
+										libbz2-dev \
+										doxygen \
+										swig \
+										clustalw \
+                                        python-virtualenv \
+                                        locales
+
+# SET LOCALE
+############
+echo "LC_ALL=en_US.UTF-8" >> /etc/environment
+echo "en_US.UTF-8 UTF-8" >> /etc/locale.gen
+echo "LANG=en_US.UTF-8" > /etc/locale.conf
+locale-gen en_US.UTF-8
+
+# INSTALL SOME PYTHON PACKAGES GLOBALY
+######################################
+pip install --upgrade pip && pip install --no-cache-dir numpy==1.10.4 \
+                                                        scipy==1.0.0 \
+                                                        pandas==0.22.0
+
+
+# SET UP VIRTUALENV
+###################
+virtualenv --system-site-packages $VIRTUALENV_DIR
+. $VIRTUALENV_DIR/bin/activate
+
+
+# INSTALL REQUIRED PYTHON PACKAGES
+##################################
+pip install jupyter==1.0.0 \
+            nglview==1.0
+
+# DOWNLOAD AND INSTALL MSMS
+##############
+cd ${SRC_FOLDER}
+if [ ! -f msms_i86_64Linux2_${MSMS_VERSION}.tar.gz ]; then
+    mkdir -p msms
+    cd msms
+    wget http://mgltools.scripps.edu/downloads/tars/releases/MSMSRELEASE/REL${MSMS_VERSION}/msms_i86_64Linux2_${MSMS_VERSION}.tar.gz
+    tar -xvzf msms_i86_64Linux2_${MSMS_VERSION}.tar.gz
+    cp -v ${SRC_FOLDER}/msms/msms.x86_64Linux2.${MSMS_VERSION} /usr/local/bin/msms
+    cp -v ${SRC_FOLDER}/msms/pdb_to_xyzr /usr/local/bin/pdb_to_xyzr
+    cp -v ${SRC_FOLDER}/msms/pdb_to_xyzrn /usr/local/bin/pdb_to_xyzrn
+fi
+
+# COMPILE OPENMM FROM SOURCES. INSTALL TO /usr/local
+############################ 
+cd ${SRC_FOLDER}
+if [ ! -f openmm-${OPENMM_VERSION}.tar.gz ]; then
+    wget -O openmm-${OPENMM_VERSION}.tar.gz -nc https://github.com/pandegroup/openmm/archive/${OPENMM_VERSION}.tar.gz
+    mkdir ${SRC_FOLDER}/openmm-${OPENMM_VERSION}
+    tar xf openmm-${OPENMM_VERSION}.tar.gz -C ${SRC_FOLDER}/openmm-${OPENMM_VERSION} --strip-components=1
+    mkdir -p ${SRC_FOLDER}/openmm-${OPENMM_VERSION}/build && cd ${SRC_FOLDER}/openmm-${OPENMM_VERSION}/build
+    cmake .. && make -j $CPUS_FOR_MAKE && make install
+    cd ${SRC_FOLDER}/openmm-${OPENMM_VERSION}/build/python && python setup.py build && python setup.py install
+fi
+
+# COMPILE AND INSTALL DSSP
+##############
+cd ${SRC_FOLDER}
+if [ ! -f dssp-${DSSP_VERSION}.tgz ]; then
+    wget ftp://ftp.cmbi.ru.nl/pub/software/dssp/dssp-${DSSP_VERSION}.tgz
+    tar -xvzf dssp-${DSSP_VERSION}.tgz
+    cd dssp-${DSSP_VERSION}
+    make -j ${CPUS_FOR_MAKE}
+    make install
+fi
+
+# INSTALL OST
+#############
+
+cd ${SRC_FOLDER}
+if [ ! -f openstructure-${OPENSTRUCTURE_VERSION}.tar.gz ]; then
+    # copy ost release
+    wget -O openstructure-${OPENSTRUCTURE_VERSION}.tar.gz -nc https://git.scicore.unibas.ch/schwede/openstructure/repository/${OPENSTRUCTURE_VERSION}/archive.tar.gz
+    mkdir openstructure-${OPENSTRUCTURE_VERSION}
+    tar xf openstructure-${OPENSTRUCTURE_VERSION}.tar.gz -C ${SRC_FOLDER}/openstructure-${OPENSTRUCTURE_VERSION} --strip-components=1
+    mkdir -p ${SRC_FOLDER}/openstructure-${OPENSTRUCTURE_VERSION}/build && cd ${SRC_FOLDER}/openstructure-${OPENSTRUCTURE_VERSION}/build
+
+    # cmake ost
+    cmake .. -DPYTHON_LIBRARIES=/usr/lib/x86_64-linux-gnu/libpython2.7.so \
+            -DOPTIMIZE=ON \
+            -DENABLE_MM=ON \
+            -DCOMPILE_TMTOOLS=1 \
+            -DUSE_NUMPY=1 \
+            -DOPEN_MM_LIBRARY=$OPENMM_LIB_PATH/libOpenMM.so \
+            -DOPEN_MM_INCLUDE_DIR=$OPENMM_INCLUDE_PATH \
+            -DOPEN_MM_PLUGIN_DIR=$OPENMM_LIB_PATH/plugins \
+            -DENABLE_GFX=ON \
+            -DENABLE_GUI=ON
+
+    # Build chemdict_tool
+    make -j ${CPUS_FOR_MAKE} chemdict_tool
+
+    # get the compound library
+    wget ftp://ftp.wwpdb.org/pub/pdb/data/monomers/components.cif.gz
+    stage/bin/chemdict_tool create components.cif.gz compounds.chemlib pdb
+    stage/bin/chemdict_tool update modules/conop/data/charmm.cif compounds.chemlib charmm
+    mkdir -p $OPENSTRUCTURE_SHARE
+    chmod a+rw -R $OPENSTRUCTURE_SHARE
+    mv compounds.chemlib $OPENSTRUCTURE_SHARE
+
+    # Build and install OST
+    cmake .. -DPYTHON_LIBRARIES=/usr/lib/x86_64-linux-gnu/libpython2.7.so \
+            -DOPTIMIZE=ON \
+            -DENABLE_MM=ON \
+            -DCOMPILE_TMTOOLS=1 \
+            -DUSE_NUMPY=1 \
+            -DOPEN_MM_LIBRARY=$OPENMM_LIB_PATH/libOpenMM.so \
+            -DOPEN_MM_INCLUDE_DIR=$OPENMM_INCLUDE_PATH \
+            -DOPEN_MM_PLUGIN_DIR=$OPENMM_LIB_PATH/plugins \
+            -DENABLE_GFX=ON \
+            -DENABLE_GUI=ON \
+            -DCOMPOUND_LIB=$OPENSTRUCTURE_SHARE/compounds.chemlib
+
+    # Build chemdict_tool
+    make -j ${CPUS_FOR_MAKE}
+    make check
+    make install
+fi
+
+# SETUP JUPYTER
+###############
+mkdir -p /usr/local/share/ipython
+mkdir -p $JUPYTER_PATH
+mkdir -p $JUPYTER_RUNTIME_DIR
+mkdir -p $JUPYTER_CONFIG_DIR
+mkdir -p $JUPYTER_PATH/kernels/ost-kernel
+chmod a+rw -R /usr/local/share/ipython
+chmod a+rw -R $JUPYTER_PATH
+chmod a+rw -R $JUPYTER_CONFIG_DIR
+chmod a+rw -R $JUPYTER_RUNTIME_DIR
+cat > $JUPYTER_PATH/kernels/ost-kernel/kernel.json <<EOF
+{
+	"display_name": "OST",
+	"language": "python",
+	"argv": [
+		"python",
+		"-m", "ipykernel",
+        "-f", "{connection_file}",
+		"--InteractiveShellApp.exec_PYTHONSTARTUP=False",
+		"--InteractiveShellApp.exec_files=['/usr/local/lib64/python2.7/site-packages/ost/ost_startup.py']"
+	],
+	"env": {
+	}
+}
+EOF
+
+jupyter nbextension enable nglview --py --sys-prefix
+
+# GO HOME AND CLEANUP
+#####################
+apt-get purge -y cmake \
+                 wget \
+                 git \
+                 gfortran \
+                 python-pip \
+                 libbz2-dev \
+                 doxygen \
+                 swig
+apt-get clean
+apt-get autoremove -y
+
+cd $SRC_FOLDER && rm -rf $SRC_FOLDER/*
+
+cd /home
+
+%environment
+##############################################################################
+# ENVIRONMENT
+##############################################################################
+export OST_ROOT="/usr/local"
+export OPENSTRUCTURE_VERSION="1.7.1"
+export PYTHONPATH="/usr/local/lib64/python2.7/site-packages:${PYTHONPATH}"
+export LD_LIBRARY_PATH="$LD_LIBRARY_PATH:/usr/local/lib64"
+export QT_X11_NO_MITSHM=1
+export IPYTHONDIR="/usr/local/share/ipython"
+export JUPYTER_CONFIG_DIR="/usr/local/etc/jupyter"
+export JUPYTER_PATH="/usr/local/share/jupyter"
+export JUPYTER_RUNTIME_DIR="$JUPYTER_PATH/runtime"
+export VIRTUALENV_DIR="/usr/local/share/ost_venv"
+
+%apprun ChemdictTool
+##############################################################################
+# CHEMDICT TOOL APP
+##############################################################################
+$OST_ROOT/bin/chemdict_tool "$@"
+
+%apprun lDDT
+##############################################################################
+# lDDT APP
+##############################################################################
+$OST_ROOT/bin/lddt "$@"
+
+%apphelp lDDT
+The Local Distance Difference Test.
+
+Usage:
+
+    singularity run --app lDDT <IMAGE> [options] <mod1> [mod1 [mod2]] <re1>[,ref2,ref3]
+
+Options:
+   -s         selection performed on ref
+   -c         use Calphas only
+   -f         perform structural checks and filter input data
+   -t         fault tolerant parsing
+   -p <file>  use specified parmeter file. Mandatory
+   -v <level> verbosity level (0=results only,1=problems reported, 2=full report)
+   -b <value> tolerance in stddevs for bonds
+   -a <value> tolerance in stddevs for angles
+   -r <value> distance inclusion radius
+   -i <value> sequence separation
+   -e         print version
+   -x         ignore residue name consistency checks
+
+%apprun Molck
+##############################################################################
+# MOLCK APP
+##############################################################################
+$OST_ROOT/bin/molck "$@"
+
+%apphelp Molck
+This is molck - the molecule checker
+
+Usage:
+    singularity run --app Molck <IMAGE> [options] file1.pdb [file2.pdb [...]]
+
+Options:
+  --complib=path    location of the compound library file. If not provided, the 
+    following locations are searched in this order: 
+    1. Working directory, 2. OpenStructure standard library location (if the 
+    executable is part of a standard OpenStructure installation) 
+  --rm=<a>,<b>      remove atoms and residues matching some criteria 
+    zeroocc - Remove atoms with zero occupancy 
+    hyd - Remove hydrogen atoms 
+    oxt - Remove terminal oxygens 
+    nonstd - Remove all residues not one of the 20 standard amino acids 
+    unk - Remove unknown and atoms not following the nomenclature
+  --fix-ele         clean up element column
+  --stdout          write cleaned file(s) to stdout 
+  --out=filename    write cleaned file(s) to disk. % characters in the filename are 
+    replaced with the basename of the input file without extension. 
+    Default: %-molcked.pdb 
+  --color=auto|on|off 
+    whether output should be colored
+  --map-nonstd   maps modified residues back to the parent amino acid, for example
+    MSE -> MET, SEP -> SER.
+
+%apprun OST
+##############################################################################
+# OST APP
+##############################################################################
+$OST_ROOT/bin/ost "$@"
+
+%apphelp OST
+The OST app exposes OpenStructure binary and can be used to run interactive shell
+and scripts.
+
+Usage:
+    singularity run --app OST <IMAGE> [ost options] [script to execute] [script parameters]
+
+Options:
+  -i, --interactive     start interpreter interactively (must be first
+                        parameter, ignored otherwise)
+  -h, --help            show this help message and exit
+  -v VLEVEL, --verbosity_level=VLEVEL
+                        sets the verbosity level [default: 2]
+
+If script requires some external files eg. PDBs, they have to be located in the
+path accessible via mounted volumes. By default Singularity mounts $HOME and
+goes to CWD. Thus this sould work as expected out of the box.
+
+
+%appenv IPython
+##############################################################################
+# NOTEBOOK ENV
+##############################################################################
+export DNG_ROOT=$OST_ROOT
+export DNG_INITDIR=${DNG_ROOT}/lib64/python2.7/site-packages/ost
+
+%apprun IPython
+##############################################################################
+# OST IPYTON APP
+##############################################################################
+. $VIRTUALENV_DIR/bin/activate && ipython -i $DNG_INITDIR/ost_startup.py "$@"
+
+%apphelp IPython
+OST-powered iPython shell.
+
+Usage:
+    
+    singularity run --app IPython <IMAGE> [options]
+
+Detailed help:
+
+    singularity run --app IPython <IMAGE> --help
+
+%appenv Notebook
+##############################################################################
+# NOTEBOOK ENV
+##############################################################################
+export BIN_DIR=$OST_ROOT/bin
+export XDG_RUNTIME_DIR=""
+. $OST_ROOT/libexec/openstructure/ost_config
+
+%apprun Notebook
+##############################################################################
+# NOTEBOOK APP
+##############################################################################
+. $VIRTUALENV_DIR/bin/activate && jupyter notebook --NotebookApp.iopub_data_rate_limit=10000000 --no-browser "$@"
+
+%apphelp Notebook
+A Jupyter notebook palyground with OST and nglview.
+
+Usage:
+
+    singularity run --app Notebook <IMAGE> [options]
+
+The Jupyter notebook is run by default with `--NotebookApp.iopub_data_rate_limit=10000000`
+and `--no-browser` options.
+
+Useful options when running on remote server:
+    --ip=<Unicode> (NotebookApp.ip)
+        Default: 'localhost'
+        The IP address the notebook server will listen on.
+    --port=<Integer> (NotebookApp.port)
+        Default: 8888
+        The port the notebook server will listen on.
+
+Copy the URL to the browser and launch the notebook with OST kernel. This will
+load all necessary OST components just like in the OST shell. We also enabled
+the nglview widget to interactively view molecular structures and trajectories.
+For more details on how to use nglview see http://nglviewer.org/nglview/latest/.
+
+As the Singularity mounts $HOME by default Jupyter and Ipython config files
+are moved to separate directories. Proper environmental variables are also set.
+In addition, Jupyter is run in a separate virtualenv to not interact with possibly
+installed host version.
+
+To list of all available options:
+
+    singularity run --app Notebook <IMAGE> --help
+
+
+%runscript
+##############################################################################
+# RUNSCRIPT
+##############################################################################
+cat << EOF
+Singularity container for OST $OPENSTRUCTURE_VERSION.
+
+This container includes the following apps:
+ * OST - OpenStructure binary
+ * IPython - OST-powered iPython shell
+ * Notebook - A Jupyter notebook palyground with OST and nglview
+ * lDDT - The Local Distance Difference Test
+ * Molck - Molecular checker
+ * ChemdictTool - Creating or update a compound library
+
+To see the help for each individual app run:
+
+    singularity help --app <APP NAME> <IMAGE NAME>
+EOF
+
+%help
+Singularity container for OST.
+
+This container includes the following apps:
+ * OST - OpenStructure binary
+ * IPython - OST-powered iPython shell
+ * Notebook - A Jupyter notebook palyground with OST and nglview
+ * lDDT - The Local Distance Difference Test
+ * Molck - Molecular checker
+ * ChemdictTool - Creating or update a compound library
+
+To see the help for each individual app run:
+
+    singularity help --app <APP NAME> <IMAGE NAME>
+
+