diff --git a/debian/create-debian-pkg.sh b/debian/create-debian-pkg.sh
index 1a6936e6fc9fa7c2cd17bd88b313eb2a8acc7a19..654df170b9de5f453019e137908583eb9650cc6b 100755
--- a/debian/create-debian-pkg.sh
+++ b/debian/create-debian-pkg.sh
@@ -9,6 +9,8 @@ versionCompLt() {
     [ "$1" = "$2" ] && return 1 || versionCompLte $1 $2
 }
 
+# file with bash code generating DB schema diffs for different versions
+dbschemadiff=management_scripts/db_schema_and_diff.sh
 
 #Where source file of the debian package should be placed
 SRC_DIR=debian/src
@@ -54,22 +56,9 @@ cp debian/scripts/common.sh $SRC_DIR/
 #copy changelog file
 cp CHANGELOG $ROOT_DIR/debian/template/changelog
 
-#this variable will contain all available versions of the package
-versions=();
-
-#this is current (latest) version of the package
-current_version=-1;
-
-#find all available versions
-
-for version in `ls $DB_SCHEMA_DIR | sort -V`;
-do
-	if [ -d "$DB_SCHEMA_DIR/$version" ]
-	then
-		versions+=($version);
-		current_version=$version;
-	fi
-done
+# set $versions and $current_version; generate upgrade scripts in SRC_DIR
+DBSCRIPT_DEST_DIR=$SRC_DIR
+source $dbschemadiff
 
 echo "Current version: " $current_version
 
@@ -81,47 +70,6 @@ then
 	exit 1;
 fi
 
-#--------------------------------------
-# GENERATE DB schemas and diff files
-#--------------------------------------
-
-#last version (used for generating db diff files)
-last_version=-1;
-for version_A in ${versions[*]}
-do
-	#main update file (used to create this version - it's a diff
-	#between base.sql and current version)
-	update_file=$SRC_DIR/db_0_to_$current_version".sql";
-
-	#now iterate through all versions
-	for file in `ls $DB_SCHEMA_DIR/$version_A | sort -V`;
-	do
-		if [ -f "$DB_SCHEMA_DIR/$version_A/$file" ]
-		then
-			#add differemce tp current db schema diff
-			printf "\n\n-- UPDATE $version_A/$file\n\n" >>$update_file;
-			cat $DB_SCHEMA_DIR/$version_A/$file >> $update_file;
-
-			#and now iterate again through all versions to add diffs 
-			#between previous versions and current one
-			for version_B in ${versions[*]}
-			do
-				#update from version_B should contain all db changes that appeard
-				#after #version_B (so version_A must be later)
-				if versionCompLt $version_B $version_A 
-				then
-					upd_file=$SRC_DIR/db_"$version_B"_to_$current_version".sql";
-					printf "\n\n-- UPDATE $version_A/$file\n\n" >>$upd_file;
-					cat $DB_SCHEMA_DIR/$version_A/$file >> $upd_file;
-					
-				fi
-			done
-		fi
-	done
-
-	last_version=$version_A
-done
-
 #------------------------------------------
 # Now we have all db schema diff files. Let's start preparing 
 # debian package
diff --git a/management_scripts/db_schema_and_diff.sh b/management_scripts/db_schema_and_diff.sh
new file mode 100644
index 0000000000000000000000000000000000000000..c6c0783e00fec80662cdb30d86aec5ed637e53a2
--- /dev/null
+++ b/management_scripts/db_schema_and_diff.sh
@@ -0,0 +1,77 @@
+# shell snippet which extracts all available MINERVA versions from
+# subdirectories available in DB_SCHEMA_DIR (typically
+# `persist/src/db`) and generates database upgrade scripts (diff
+# files)
+
+# Precondition: the following variables have to be correctly initialised
+# * DB_SCHEMA_DIR        set to the directory containing database initialisation and upgrade sql commands
+# * DBSCRIPT_DEST_DIR    set to the directory that will be populated with database upgrade scripts
+
+# Postcondition:
+# * versions is set to the available MINERVA versions (bash array)
+# * current_version is set to the latest available version
+# * DBSCRIPT_DEST_DIR contains script to initialise the database from any version to the current version
+
+
+#this variable will contain all available versions of the package
+versions=();
+
+#this is current (latest) version of the package
+current_version=-1;
+
+#find all available versions
+
+for version in `ls "$DB_SCHEMA_DIR" | sort -V`;
+do
+	if [ -d "$DB_SCHEMA_DIR/$version" ]
+	then
+		versions+=($version);
+		current_version=$version;
+	fi
+done
+
+#--------------------------------------
+# GENERATE DB schemas and diff files
+#--------------------------------------
+
+versionCompLte() {
+    [  "$1" = "`echo -e "$1\n$2" | sort -V | head -n1`" ]
+}
+
+
+versionCompLt() {
+    [ "$1" = "$2" ] && return 1 || versionCompLte $1 $2
+}
+
+#last version (used for generating db diff files)
+for version_A in ${versions[*]}
+do
+	#main update file (used to create this version - it's a diff
+	#between base.sql and current version)
+	update_file="$DBSCRIPT_DEST_DIR/db_0_to_${current_version}.sql";
+
+	#now iterate through all versions
+	for file in `ls "$DB_SCHEMA_DIR/$version_A" | sort -V`;
+	do
+		if [ -f "$DB_SCHEMA_DIR/$version_A/$file" ]
+		then
+			#add difference to current db schema diff
+			printf "\n\n-- UPDATE $version_A/$file\n\n" >> "$update_file";
+			cat "$DB_SCHEMA_DIR/$version_A/$file" >> "$update_file";
+
+			#and now iterate again through all versions to add diffs 
+			#between previous versions and current one
+			for version_B in ${versions[*]}
+			do
+				#update from version_B should contain all db changes that appeared
+				#after #version_B (so version_A must be later)
+				if versionCompLt $version_B $version_A 
+				then
+					upd_file="$DBSCRIPT_DEST_DIR/db_${version_B}_to_${current_version}.sql";
+					printf "\n\n-- UPDATE $version_A/$file\n\n" >> "$upd_file";
+					cat "$DB_SCHEMA_DIR/$version_A/$file" >> "$upd_file";
+				fi
+			done
+		fi
+	done
+done
diff --git a/rpm/INSTALL.rst b/rpm/INSTALL.rst
new file mode 100644
index 0000000000000000000000000000000000000000..ec7de36f71d814c6093b35751b9849107f100646
--- /dev/null
+++ b/rpm/INSTALL.rst
@@ -0,0 +1,149 @@
+MINERVA installation instructions using RPM Package Manager
+===========================================================
+
+These instructions guide you through the installation process of
+`MINERVA <https://git-r3lab.uni.lu/piotr.gawron/minerva>`_ on Red Hat
+Enterprise Linux 7 or CentOS 7. The server will also host the database
+required for the functioning of MINERVA.
+
+.. note::
+
+   Content visualization of MINERVA platform is supported by Google
+   Maps API. Users of MINERVA platform are obliged to comply with the
+   `Google Maps/Google Earth APIs Terms of Service
+   <https://www.google.com/intl/en-US_US/help/terms_maps.html>`_.
+
+
+Overview
+--------
+
+The main steps are
+
+* Install `Oracle Java SE Development Kit 8 <http://www.oracle.com/technetwork/java/javase/downloads/index.html>`_.
+* Install `PostgreSQL <https://www.postgresql.org/>`_ and set up a
+  database.
+* Install and configure `Apache Tomcat <https://tomcat.apache.org/>`_.
+* Install the MINERVA RPM.
+
+
+Java SE Development Kit
+-----------------------
+
+Red Hat Enterprise Linux 7
+``````````````````````````
+
+Follow the instructions at https://access.redhat.com/solutions/732883
+to install ``java-1.8.0-oracle``.
+
+CentOS 7
+````````
+
+Follow the link for ``Java SE Development Kit 8`` at
+`<http://www.oracle.com/technetwork/java/javase/downloads/index.html>`_,
+download the latest RPM and install it with
+
+.. code:: shell
+
+    yum install -y jdk-8uXXX-linux-x64.rpm
+
+
+.. warning::
+
+    This way of installing Java does **not** ensure that security
+    updates are installed with ``yum update``, therefore you have to
+    establish a process to install such updates manually.
+
+
+PostgreSQL
+----------
+
+Install PostgreSQL and initialise it with
+
+.. code:: shell
+
+    yum install -y postgresql-server
+    postgresql-setup initdb
+
+Ensure that the database authentication on IPv4 on ``localhost`` is
+done with md5-based passwords by adding the following line to
+``/var/lib/pgsql/data/pg_hba.conf``
+
+.. code::
+
+    host    all             all             127.0.0.1/32            md5
+
+
+Enable and start postgresql
+
+.. code:: shell
+
+    systemctl enable postgresql
+    systemctl start postgresql
+
+Create the MINERVA database user and the database
+
+.. code:: shell
+
+    su - postgres -c "createuser -d -r -s map_viewer"
+    su - postgres -c "echo \"ALTER USER map_viewer WITH PASSWORD '123qweasdzxc';\"| psql"
+    su - postgres -c "createdb -O map_viewer map_viewer"
+
+.. warning::
+
+    Currently the password for the database user ``map_viewer`` is
+    hardcoded, therefore make sure the database cannot be accessed
+    from distrusted hosts.
+
+
+Apache Tomcat
+-------------
+
+Install and enable (don't start yet) Apache Tomcat with
+
+.. code:: shell
+
+    yum install -y tomcat
+    systemctl enable tomcat
+
+In ``/etc/sysconfig/tomcat``, adjust the memory settings, e.g.
+
+.. code::
+
+    JAVA_OPTS="-Xms2048M -Xmx4096M"
+
+Make sure to open the port (by default port 8080) to allow incoming
+connections, e.g. using ``firewalld`` this can be accomplished with
+
+.. code:: shell
+
+    firewall-cmd --zone=public --add-port=8080/tcp
+
+.. warning::
+
+    Currently the administrator password of MINERVA is hardcoded,
+    therefore make sure the MINERVA cannot be accessed from distrusted
+    hosts until the password was changed.
+
+MINERVA
+-------
+
+Install MINERVA using ``yum``
+
+.. code:: shell
+
+    yum install -y minerva-X.Y.Z-1.el7.centos.noarch.rpm
+
+and start tomcat
+
+.. code:: shell
+
+    systemctl start tomcat
+
+Now point your browser to the newly installed service, e.g. on a local
+network this could be `<http://192.168.0.42:8080/minerva/>`_.
+
+.. warning::
+
+    This way of installing MINERVA does **not** ensure that security
+    updates are installed with ``yum update``, therefore you have to
+    establish a process to install such updates manually.
diff --git a/rpm/buildrpm.sh b/rpm/buildrpm.sh
new file mode 100755
index 0000000000000000000000000000000000000000..eb3166272ad7a7d7dab709facd55f6340cfe7f32
--- /dev/null
+++ b/rpm/buildrpm.sh
@@ -0,0 +1,60 @@
+#!/bin/bash
+
+set -e
+
+MINERVA_SRC_DIR="$(dirname "$(dirname "$0")")"
+
+# where generated files will be written
+RPMBUILD_TEMP="${RPMBUILD_TEMP:-$MINERVA_SRC_DIR/rpm/rpmbuildtemp}"
+
+if [[ "$RPMBUILD_TEMP" =~ ' ' ]]; then
+    echo "RPMBUILD_TEMP contains whitespace: '$RPMBUILD_TEMP'"
+    echo "This is not allowed. Please provide a different directory to create the RPM with"
+    echo "    RPMBUILD_TEMP=/path/without/whitespace/ \"$0\""
+    exit 1
+fi
+
+# current date (for automatic changelog)
+CURDATE=$(date +"%a %b %d %Y")
+
+# file that should be deployed on tomcat
+TOMCAT_FILE="$MINERVA_SRC_DIR/web/target/web-1.0.war"
+
+# file with bash code generating DB schema diffs for different versions
+dbschemadiff="$MINERVA_SRC_DIR/management_scripts/db_schema_and_diff.sh"
+
+# directory with database schema
+DB_SCHEMA_DIR="$MINERVA_SRC_DIR/persist/src/db"
+
+# destination directory for database upgrade scripts
+DBSCRIPT_DEST_DIR="$RPMBUILD_TEMP/BUILD/sql"
+
+# clean build directories
+rm -rf "$RPMBUILD_TEMP"
+
+# create directory
+mkdir -p "$RPMBUILD_TEMP/"{BUILD,SPECS}
+
+# copy war file and other files
+cp "$TOMCAT_FILE" "$RPMBUILD_TEMP/BUILD/minerva.war"
+cp "$MINERVA_SRC_DIR/README.md" "$MINERVA_SRC_DIR/CHANGELOG" "$MINERVA_SRC_DIR/rpm/INSTALL.rst" "$MINERVA_SRC_DIR/rpm/logrotate_minerva" "$RPMBUILD_TEMP/BUILD"
+
+mkdir -p "$DBSCRIPT_DEST_DIR"
+# copy base sql schema
+cp "$DB_SCHEMA_DIR/base.sql" "$DBSCRIPT_DEST_DIR/db_0.sql"
+
+# set $versions and $current_version; generate upgrade scripts in DBSCRIPT_DEST_DIR
+source "$dbschemadiff"
+
+# create RPM spec file
+cp "$MINERVA_SRC_DIR/rpm/minerva.spec.in" "$RPMBUILD_TEMP/SPECS/minerva.spec"
+sed -i "s/__CURRENT_VERSION__/$current_version/g" "$RPMBUILD_TEMP/SPECS/minerva.spec"
+sed -i "s/__DATE__/$CURDATE/g" "$RPMBUILD_TEMP/SPECS/minerva.spec"
+
+# build RPM
+RPMBUILD_TEMP_ABS="$(readlink -f "$RPMBUILD_TEMP")"
+echo "****** Building miverva $current_version RPM in $RPMBUILD_TEMP_ABS ****** "
+set -x
+rpmbuild -bb --define "_topdir $RPMBUILD_TEMP_ABS" "$RPMBUILD_TEMP_ABS/SPECS/minerva.spec"
+set +x
+echo "****** Finished building RPM ****** "
diff --git a/rpm/logrotate_minerva b/rpm/logrotate_minerva
new file mode 100644
index 0000000000000000000000000000000000000000..001adf1a0734bbf445836bf465621a49565c98c2
--- /dev/null
+++ b/rpm/logrotate_minerva
@@ -0,0 +1,10 @@
+/var/log/tomcat/minerva.txt {
+  copytruncate
+  size 32k
+  weekly
+  dateext
+  rotate 52
+  compress
+  missingok
+  create 0640 tomcat tomcat
+}
diff --git a/rpm/minerva.spec.in b/rpm/minerva.spec.in
new file mode 100644
index 0000000000000000000000000000000000000000..2edcdf292154137850bb234c22e28361f72d51ac
--- /dev/null
+++ b/rpm/minerva.spec.in
@@ -0,0 +1,95 @@
+Name:           minerva
+Version:        __CURRENT_VERSION__
+Release:        1%{?dist}
+Summary:        Platform for visualization and curation of molecular interaction networks
+
+License:        AGPLv3
+URL:            http://r3lab.uni.lu/web/minerva-website/
+Source0:        https://git-r3lab.uni.lu/piotr.gawron/minerva/repository/archive.tar.gz?ref=v%{version}
+
+Requires:       tomcat, postgresql
+BuildArch:      noarch
+
+%description
+Web application for visualization, exploration and management of
+molecular networks encoded in SBGN-compliant format. The resource is
+used and managed via a webbrowser.
+
+%pre -p /bin/bash
+# check that postgres is started and tomcat is stopped, otherwise abort installation/upgrade
+if ! $(systemctl -q is-active postgresql); then
+    echo "postgresql not running, aborting installation/upgrade of minerva" >&2
+    exit -1
+fi
+if $(systemctl -q is-active tomcat); then
+    echo "tomcat is running, aborting installation/upgrade of minerva" >&2
+    exit -1
+fi
+# make sure the user `map_viewer` has the required permissions
+attributes_map_viewer=$(su - postgres -c "psql -F $'\t' --no-align -t -c '\du map_viewer'" | cut -f 2)
+if ! [[ $attributes_map_viewer == *"Superuser"* ]] || ! [[ $attributes_map_viewer == *"Create role"* ]] || ! [[ $attributes_map_viewer == *"Create DB"* ]]; then
+    echo "Postgres user map_viewer does not exist or does not have the required attributes." >&2
+    echo "Make sure to create map_viewer with the permission 'Superuser, Create role, Create DB'." >&2
+    echo "Attributes are: '$attributes_map_viewer'" >&2
+    echo "Aborting installation/upgrade of minerva." >&2
+    exit -1
+fi
+# make sure the database map_viewer exists
+if ! su - postgres -c "psql --dbname map_viewer -q -c '\q'" 2> /dev/null; then
+    echo "Database map_viewer does not exist, aborting installation/upgrade of minerva." >&2
+    exit -1
+fi
+
+%preun -p /bin/bash
+# save version information of the old package to make sure we run the correct DB-update script after installation
+if [ $1 == 1 ]; then
+    mkdir -p %{_sharedstatedir}/rpm-state/%{name}
+    echo -n %{version} > %{_sharedstatedir}/rpm-state/%{name}/OLD_VERSION
+fi
+
+%posttrans -p /bin/bash
+LOGFILE=%{_localstatedir}/log/minerva-install.log
+if [ -e %{_sharedstatedir}/rpm-state/%{name}/OLD_VERSION ]; then
+    OLD_VERSION=$(cat %{_sharedstatedir}/rpm-state/%{name}/OLD_VERSION)
+    echo $(date) "Upgrading minerva from $OLD_VERSION to %{version}" >> $LOGFILE
+    if [ ! -e %{_datadir}/%{name}/schema/db_${OLD_VERSION}_to_%{version}.sql ]; then
+        echo "ERROR: missing DB-update script %{_datadir}/%{name}/schema/db_${OLD_VERSION}_to_%{version}.sql" >&2
+        exit -1
+    fi
+    su - postgres -c "psql map_viewer -f %{_datadir}/%{name}/schema/db_${OLD_VERSION}_to_%{version}.sql" >> $LOGFILE 2>&1
+    rm -f %{_sharedstatedir}/rpm-state/%{name}/OLD_VERSION
+    rmdir %{_sharedstatedir}/rpm-state/%{name}
+else
+    echo $(date) "Installing minerva %{version}"  >> $LOGFILE
+    if [ $(su - postgres -c "psql --dbname map_viewer -F $'\t' --no-align -t -c '\dt'" | wc -l) -gt 51 ]; then
+        echo "The database map_viewer is not empty, aborting initialisation of database." >&2
+        echo "The database map_viewer is not empty, aborting initialisation of database." >> $LOGFILE
+        exit -1
+    fi
+    # install base version of the framework
+    su - postgres -c "psql map_viewer -f %{_datadir}/%{name}/schema/db_0.sql" >> $LOGFILE 2>&1
+    # install patch to current version
+    su - postgres -c "psql map_viewer -f %{_datadir}/%{name}/schema/db_0_to_%{version}.sql" >> $LOGFILE 2>&1
+fi
+
+%install
+rm -rf %{buildroot}
+mkdir -p %{buildroot}/%{_datadir}/%{name}/schema
+install -m 0644 sql/*.sql %{buildroot}/%{_datadir}/%{name}/schema
+install -m 0644 %{name}.war %{buildroot}/%{_datadir}/%{name}/%{name}.war
+mkdir -p %{buildroot}/%{_sysconfdir}/logrotate.d
+install -m 0644 logrotate_minerva %{buildroot}/%{_sysconfdir}/logrotate.d/minerva
+mkdir -p %{buildroot}/%{_sharedstatedir}/tomcat/webapps
+ln -s %{_datadir}/%{name}/%{name}.war %{buildroot}/%{_sharedstatedir}/tomcat/webapps/
+
+%files
+%defattr(-,root,root,-)
+%doc README.md CHANGELOG INSTALL.rst
+%{_datadir}/%{name}/%{name}.war
+%{_datadir}/%{name}/schema/*
+%config(noreplace) %{_sysconfdir}/logrotate.d/minerva
+%attr(-,tomcat,tomcat) %{_sharedstatedir}/tomcat/webapps/%{name}.war
+
+%changelog
+* __DATE__ - %{version}-%{release}
+- Automatically packaged