diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml
index c24946cd10dc69d536b2b640b315799d87ec420c..6476bce78f8fc3708d528125e9090ba470b0e0dc 100644
--- a/.gitlab-ci.yml
+++ b/.gitlab-ci.yml
@@ -6,76 +6,45 @@
 stages:
   - test
 
-# CentOS7 STAGE
-test:centos7.3:
+# Ubuntu22.04 STAGE
+test:ubuntu22.04:
   stage: test
-  image: centos:7.3.1611
+  image: ubuntu:22.04
   before_script:
-    - echo "Running centos7.3 'before_script'..."
-    - yum -y -q -e 0 install tcl
-    - yum -y -q -e 0 install glibc-common
-    - yum -y -q -e 0 install glibc-devel
-    - yum -y -q -e 0 install make
-    - yum -y -q -e 0 install libicu
-    - yum -y -q -e 0 install libjpeg-turbo
-    - yum -y -q -e 0 install freetype
-    - yum -y -q -e 0 install openssl
-    - mkdir -p /scicore/soft/modules
-    - ln -s /export/soft/apps/centos7/generic /scicore/soft/apps
-    - ln -s /export/soft/modules/centos7/generic/all /scicore/soft/modules
-    - source /export/soft/lua_lmod/centos7/lmod/lmod/init/bash
-    - module use /scicore/soft/modules/all
-    - module load foss/2021a
-    - module load wget/1.21.1-GCCcore-10.3.0
-    - module load CMake/3.23.1-GCCcore-10.3.0
-    - module load Python/3.9.5-GCCcore-10.3.0
-    - module load Eigen/3.4.0-GCCcore-10.3.0
-    - module load Boost.Python/1.76.0-GCC-10.3.0
-    - module load LibTIFF/.4.2.0-GCCcore-10.3.0
-    - module load libpng/.1.6.37-GCCcore-10.3.0
-    - module load HH-suite/3.2.0-gompi-2021a
-    - module load Perl/5.32.1-GCCcore-10.3.0
-    - module load OpenMM/7.7.0-foss-2021a
-    - module load SQLite/3.35.4-GCCcore-10.3.0
-    - module load dssp/2.2.1-foss-2021a
-    - module load msms/2.6.1-linux-x86_64 
-    - module load ClustalW2/2.1-foss-2021a
-    - module load networkx/2.5.1-foss-2021a
-    - echo "... done running centos7.3 'before_script'."
+    - echo "Running ubuntu22.04 'before_script'..."
+    - apt-get update -y
+    - apt-get install -y cmake
+    - apt-get install -y g++
+    - apt-get install -y wget
+    - apt-get install -y libsqlite3-dev
+    - apt-get install -y sip-dev
+    - apt-get install -y libtiff-dev
+    - apt-get install -y libfftw3-dev
+    - apt-get install -y libeigen3-dev
+    - apt-get install -y libboost-all-dev
+    - apt-get install -y libpng-dev
+    - apt-get install -y python3-all
+    - apt-get install -y python3-numpy
+    - apt-get install -y python3-scipy
+    - apt-get install -y python3-networkx
+    - apt-get install -y clustalw
+    - apt-get install -y voronota
+    - apt-get install -y libopenmm-dev
+    - apt-get install -y libparasail-dev
+    - echo "... done running ubuntu22.04 'before_script'."
   script:
-  - echo "Testing on CentOS 7..."
+  - echo "Testing on Ubuntu 22.04..."
   - echo "    Building OST..."
   - mkdir build-ci
   - cd build-ci
-  - cmake .. -DENABLE_MM=1
-             -DOPEN_MM_LIBRARY=$EBROOTOPENMM/lib/libOpenMM.so
-             -DOPEN_MM_PLUGIN_DIR=$EBROOTOPENMM/lib/plugins
-             -DOPEN_MM_INCLUDE_DIR=$EBROOTOPENMM/include
-             -DCOMPILE_TMTOOLS=1
-             -DENABLE_INFO=OFF
-             -DENABLE_GFX=OFF
+  - cmake .. -DOPTIMIZE=ON
+             -DENABLE_GFX=ON
              -DENABLE_GUI=OFF
-             -DUSE_RPATH=1
-             -DPython_ROOT_DIR=$EBROOTPYTHON
-             -DEIGEN3_INCLUDE_DIR=$EBROOTEIGEN/include
-             -DFFTW_LIBRARY=$EBROOTFFTW/lib/libfftw3f.a
-             -DFFTW_INCLUDE_DIR=$EBROOTFFTW/include
-             -DSQLITE3_LIBRARY=$EBROOTSQLITE/lib/libsqlite3.so
-             -DSQLITE3_INCLUDE_DIR=$EBROOTSQLITE/include
-             -DBOOST_ROOT=$EBROOTBOOST
-             -DPNG_LIBRARY=$EBROOTLIBPNG/lib/libpng.so
-             -DPNG_PNG_INCLUDE_DIR=$EBROOTLIBPNG/include
-             -DZLIB_LIBRARY=$EBROOTZLIB/lib/libz.so
-             -DZLIB_INCLUDE_DIR=$EBROOTZLIB/include
-             -DTIFF_INCLUDE_DIR=$EBROOTLIBTIFF/include
-             -DTIFF_LIBRARY=$EBROOTLIBTIFF/lib/libtiff.so
-             -DZLIB_INCLUDE_DIR=$EBROOTZLIB/include
-             -DZLIB_LIBRARY=$EBROOTZLIB/lib/libz.so
-             -DOPTIMIZE=1
-             -DCMAKE_C_FLAGS='-L${EBROOTLIBPNG}/lib/ -L${EBROOTLIBTIFF}/lib/ -L${EBROOTZLIB}/lib/ -isystem ${EBROOTBOOST}/include -isystem ${EBROOTOPENMM}/include'
-             -DCMAKE_CXX_FLAGS='-L${EBROOTLIBPNG}/lib/ -L${EBROOTLIBTIFF}/lib/ -L${EBROOTZLIB}/lib/ -isystem ${EBROOTBOOST}/include -isystem ${EBROOTOPENMM}/include'
-             -DCMAKE_EXE_LINKER_FLAGS=" -pthread"
-  - make -j 2 chemdict_tool
+             -DENABLE_INFO=OFF
+             -DENABLE_MM=1
+             -DOPEN_MM_PLUGIN_DIR=/usr/lib/x86_64-linux-gnu/openmm
+             -DENABLE_PARASAIL=1
+  - make -j 2
   - echo "    ... done building OST."
   - echo "    Downloading chemical compounds..."
   - wget ftp://ftp.wwpdb.org/pub/pdb/data/monomers/components.cif.gz
@@ -91,4 +60,5 @@ test:centos7.3:
   - echo "    Running unit tests for OST..."
   - make check
   - echo "    ... done running unit tests for OST..." 
-  - echo "... done testing on CentOS 7."
+  - echo "... done testing on Ubuntu 22.04."
+ 
diff --git a/CHANGELOG.txt b/CHANGELOG.txt
index 406518a8eb0617e93ffde7a289536b271900c5e4..ef6d7297c4ad593b5988e81ecbd21a7e2c58ca3e 100644
--- a/CHANGELOG.txt
+++ b/CHANGELOG.txt
@@ -1,4 +1,4 @@
-Changes in Release x.x.x
+Changes in Release 2.8.0
 --------------------------------------------------------------------------------
 
  * heavy water (DOD) is now recognised as 'water' instead of 'non-polymer' by
diff --git a/CMakeLists.txt b/CMakeLists.txt
index c5a7f82a84892190623d18f200922d01fa694ae6..1ff94f97da8a9eced92f710db9139ef91150ea2e 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -14,7 +14,7 @@ cmake_policy(SET CMP0060 NEW)
 project(OpenStructure CXX C)
 set (CMAKE_EXPORT_COMPILE_COMMANDS 1)
 set (OST_VERSION_MAJOR 2)
-set (OST_VERSION_MINOR 7)
+set (OST_VERSION_MINOR 8)
 set (OST_VERSION_PATCH 0)
 set (OST_VERSION_STRING ${OST_VERSION_MAJOR}.${OST_VERSION_MINOR}.${OST_VERSION_PATCH} )
 set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} ${PROJECT_SOURCE_DIR}/cmake_support)
diff --git a/docker/Dockerfile b/docker/Dockerfile
index 075735de67f94fa7207ed4ff6bfd69377bdaa500..b7bbf68ab362aed955d0279f68455b31aadcc90a 100644
--- a/docker/Dockerfile
+++ b/docker/Dockerfile
@@ -2,7 +2,7 @@ FROM ubuntu:22.04
 
 # ARGUMENTS
 ###########
-ARG OPENSTRUCTURE_VERSION="2.7.0"
+ARG OPENSTRUCTURE_VERSION="2.8.0"
 ARG SRC_FOLDER="/usr/local/src"
 ARG CPUS_FOR_MAKE=2
 ARG OPENMM_VERSION="7.7.0"
diff --git a/modules/mol/mm/src/topology_creator.cc b/modules/mol/mm/src/topology_creator.cc
index 00ba0738d68f5730d362097d0eee446d4ccef39b..9f0222b9c43edd72db0290fe1670b241315615ec 100644
--- a/modules/mol/mm/src/topology_creator.cc
+++ b/modules/mol/mm/src/topology_creator.cc
@@ -88,7 +88,8 @@ TopologyPtr TopologyCreator::Create(ost::mol::EntityHandle& ent,
   //this should be enough for most needs
 
   ost::mol::ResidueHandle next,prev;
-  bool n_ter,c_ter; 
+  bool n_ter, c_ter;
+  std::set<unsigned long> n_ter_residues, c_ter_residues;
   ost::mol::AtomHandle peptide_n,peptide_c,nucleotide_p,nucleotide_o; 
 
   for(ost::mol::ResidueHandleList::iterator i = res_list.begin(); 
@@ -133,8 +134,8 @@ TopologyPtr TopologyCreator::Create(ost::mol::EntityHandle& ent,
       }
     }
 
-    if(n_ter) i->SetBoolProp("n_ter",true);
-    if(c_ter) i->SetBoolProp("c_ter",true);
+    if(n_ter) n_ter_residues.insert(i->GetHashCode());
+    if(c_ter) c_ter_residues.insert(i->GetHashCode());
   }
 
 
@@ -181,7 +182,7 @@ TopologyPtr TopologyCreator::Create(ost::mol::EntityHandle& ent,
       }
     }
     //check for n terminus
-    if(i->HasProp("n_ter")){
+    if(n_ter_residues.find(i->GetHashCode()) != n_ter_residues.end()){
       String exception_name = "";
       if(settings->termini_exceptions->HasException(*i)){
         exception_name = settings->termini_exceptions->GetException(*i);
@@ -193,7 +194,7 @@ TopologyPtr TopologyCreator::Create(ost::mol::EntityHandle& ent,
         block->RemoveInteractionsToPrev();
       }
     }
-    if(i->HasProp("c_ter")){
+    if(c_ter_residues.find(i->GetHashCode()) != c_ter_residues.end()){
       String exception_name = "";
       if(settings->termini_exceptions->HasException(*i)){
         exception_name = settings->termini_exceptions->GetException(*i);
diff --git a/singularity/Singularity b/singularity/Singularity
index e16d4ad5491baf7aa034de4153c0726800dbfbe3..395c512ca3289341613932f39e24ae9aed0fc264 100644
--- a/singularity/Singularity
+++ b/singularity/Singularity
@@ -1,5 +1,5 @@
 BootStrap: docker
-From: registry.scicore.unibas.ch/schwede/openstructure:2.7.0-jammy
+From: registry.scicore.unibas.ch/schwede/openstructure:2.8.0
 %post
 ##############################################################################
 # POST