diff --git a/cmake_support/CheckLSBTypes.cmake b/cmake_support/CheckLSBTypes.cmake
index 93857bfa4967fc8ff6088d0b82b130b9dacb65cd..991a08c83de9700d0b6ee03e78c8641d098b5323 100644
--- a/cmake_support/CheckLSBTypes.cmake
+++ b/cmake_support/CheckLSBTypes.cmake
@@ -23,11 +23,11 @@
 #   CoR-Lab, Research Institute for Cognition and Robotics
 #     Bielefeld University
 
-SET(LSB_DISTRIBUTOR_ID "unkown")
-SET(LSB_RELEASE "unkown")
-SET(LSB_CODENAME "unkown")
-SET(LSB_BIT_TYPE "unkown")
-SET(LSB_ARCH_TYPE "unkown")
+SET(LSB_DISTRIBUTOR_ID "unknown")
+SET(LSB_RELEASE "unknown")
+SET(LSB_CODENAME "unknown")
+SET(LSB_BIT_TYPE "unknown")
+SET(LSB_ARCH_TYPE "unknown")
 
 # ---- (mgoettin 10/17/2011) TODO: Update this to match all OS ----
 SET(LSB_PROCESSOR_ARCH ${CMAKE_SYSTEM_PROCESSOR})
diff --git a/modules/gfx/src/bitmap_io.cc b/modules/gfx/src/bitmap_io.cc
index 8437de3975fbeb601727deb904bca4659d24ace9..af47577c250f9217973dd3b1eaefa8a3b81b9689 100644
--- a/modules/gfx/src/bitmap_io.cc
+++ b/modules/gfx/src/bitmap_io.cc
@@ -152,7 +152,7 @@ Bitmap import_png(const String& filename)
   channels=png_get_channels(png_ptr,info_ptr);
 
   if(channels<1 || channels>4) {
-    LOG_ERROR("error importing bitmap: " << filename << " has " << channels << " channels, excpected 1-4");
+    LOG_ERROR("error importing bitmap: " << filename << " has " << channels << " channels, expected 1-4");
     return bm;
   }
   
diff --git a/modules/gfx/src/povray.cc b/modules/gfx/src/povray.cc
index e50c4ad6f32b233eb5ebe026e736676a845b025d..3097db3e3414db41393e3b3a7b9650096433eb18 100644
--- a/modules/gfx/src/povray.cc
+++ b/modules/gfx/src/povray.cc
@@ -82,7 +82,7 @@ void PovState::write_postamble()
     pov_ << " /*\n";
     pov_ << "  This transformation, together with\n";
     pov_ << "  the camera translation above,\n";
-    pov_ << "  mimicks the original scene view:\n";
+    pov_ << "  mimics the original scene view:\n";
     pov_ << "   1. translate to center of rotation\n";
     pov_ << "   2. apply rotation matrix\n";
     pov_ << "   3. apply xy translation (z component is in camera)\n";
diff --git a/modules/gfx/src/scene.cc b/modules/gfx/src/scene.cc
index f53323a54302e8f26325048e07cd00084f93b695..a79bee3a3e2e6ef2a0f67a519ab8216fa1395547 100644
--- a/modules/gfx/src/scene.cc
+++ b/modules/gfx/src/scene.cc
@@ -539,7 +539,7 @@ void Scene::InitGL(bool full)
   }
 
   if(full) {
-    LOG_DEBUG("Scene: initalizing textures");
+    LOG_DEBUG("Scene: initialising textures");
     glGenTextures(1,&scene_left_tex_);
     glGenTextures(1,&scene_right_tex_);
     glGenTextures(1,&bg_tex_);
diff --git a/modules/img/alg/src/conjugate.hh b/modules/img/alg/src/conjugate.hh
index 79409ecf57946d39c0095e3ec3e2fe8ce8f2279b..2e2b65bad4a488276a6fc2f9dddaa90d7d6921de 100644
--- a/modules/img/alg/src/conjugate.hh
+++ b/modules/img/alg/src/conjugate.hh
@@ -42,7 +42,7 @@ void do_conj_ip<Complex>(image_state::ValueHolder<Complex>& vh)
   }
 }
 
-// generic case - emtpy
+// generic case - empty
 template <typename V>
 void do_conj_ip(image_state::ValueHolder<V>& vh) {}
 
diff --git a/modules/img/alg/src/highest_peak_search_3d.cc b/modules/img/alg/src/highest_peak_search_3d.cc
index a4a80e78e7e066ef576545a5d9f974bdf587ccc4..99d5d917c3d073f8eb53d802880e7c2a32386c49 100644
--- a/modules/img/alg/src/highest_peak_search_3d.cc
+++ b/modules/img/alg/src/highest_peak_search_3d.cc
@@ -151,7 +151,7 @@ template <typename T, class D>
       {
         ss << " " << (*it);
       }
-      LOG_DEBUG("exluded regions:" << ss.str());
+      LOG_DEBUG("excluded regions:" << ss.str());
     }
 
     detail::PeakCollector peak_collector(max_num_peaks_,exclusion_radius_);
diff --git a/modules/img/alg/src/histogram.hh b/modules/img/alg/src/histogram.hh
index 619a9f845cfc4b825cb55758c24a32e10eb7ac96..4fe930bf4844d03670fb89f6910e8bfa6e4858c7 100644
--- a/modules/img/alg/src/histogram.hh
+++ b/modules/img/alg/src/histogram.hh
@@ -36,7 +36,7 @@ namespace ost { namespace img { namespace alg {
 class DLLEXPORT HistogramError: public Error {
 public:
     HistogramError(const String& s):
-    Error(String("A histogram error occured: ") + s)
+    Error(String("A histogram error occurred: ") + s)
   {}
 };
 
diff --git a/modules/img/alg/tests/test_fft.cc b/modules/img/alg/tests/test_fft.cc
index 18f25b236effdd8df370dcc804f998f8e745270e..835dbbbde3ff9f68f9f1deca0d7da315d82e2023 100644
--- a/modules/img/alg/tests/test_fft.cc
+++ b/modules/img/alg/tests/test_fft.cc
@@ -388,7 +388,7 @@ void Test_DFT(DataType TYPE)
 
   std::ostringstream msg;
 
-  msg << "fi1 fi2 Extent missmatch: " << fi1.GetExtent() << "!=" << fi2.GetExtent();
+  msg << "fi1 fi2 Extent mismatch: " << fi1.GetExtent() << "!=" << fi2.GetExtent();
   BOOST_REQUIRE_MESSAGE(fi1.GetExtent()==fi2.GetExtent(),msg.str());
 
   for(ExtentIterator it(fi1.GetExtent());!it.AtEnd();++it) {
@@ -401,7 +401,7 @@ void Test_DFT(DataType TYPE)
   ImageHandle ri3 = fi1.Apply(alg::DFT());
 
   msg.str("");
-  msg << "ri1 ri3 Extent missmatch: " << ri3.GetExtent() << "!=" << ri1.GetExtent();
+  msg << "ri1 ri3 Extent mismatch: " << ri3.GetExtent() << "!=" << ri1.GetExtent();
   BOOST_REQUIRE_MESSAGE(ri3.GetExtent()==ri1.GetExtent(),msg.str());
 
   for(ExtentIterator it(ri3.GetExtent());!it.AtEnd();++it) {
diff --git a/modules/img/base/pymod/export_data_algorithm.cc b/modules/img/base/pymod/export_data_algorithm.cc
index 167f5c78964deb231f4c9aee3550d9e815e0abec..c984c6d7dfe089e8a101a7e59a77ef49ba8123c1 100644
--- a/modules/img/base/pymod/export_data_algorithm.cc
+++ b/modules/img/base/pymod/export_data_algorithm.cc
@@ -70,7 +70,7 @@ public:
 
   virtual void Visit(ImageHandle& ih) {VisitImage(ih);}
   virtual void VisitImage(ImageHandle&) {
-    throw(Error("ModIPAlgorithm Base: VisitImage not overidden"));
+    throw(Error("ModIPAlgorithm Base: VisitImage not overridden"));
   }
 };
 
@@ -99,7 +99,7 @@ public:
 
   virtual void Visit(ImageHandle& ih) const {VisitImage(ih);}
   virtual void VisitImage(ImageHandle&) const {
-    throw(Error("ConstModIPAlgorithm Base: VisitImage not overidden"));
+    throw(Error("ConstModIPAlgorithm Base: VisitImage not overridden"));
   }
 };
 
@@ -129,7 +129,7 @@ public:
 
   virtual ImageHandle Visit(const ConstImageHandle& ih) {return VisitImage(ih);}
   virtual ImageHandle VisitImage(const ConstImageHandle& ih) {
-    throw(Error("ModOPAlgorithm Base: VisitImage not overidden"));
+    throw(Error("ModOPAlgorithm Base: VisitImage not overridden"));
   }
 };
 
@@ -158,7 +158,7 @@ public:
 
   virtual ImageHandle Visit(const ConstImageHandle& ih) const {return VisitImage(ih);}
   virtual ImageHandle VisitImage(const ConstImageHandle& ih) const {
-    throw(Error("ConstModOPAlgorithm Base: VisitImage not overidden"));
+    throw(Error("ConstModOPAlgorithm Base: VisitImage not overridden"));
   }
 };
 
diff --git a/modules/img/base/src/data_observer.hh b/modules/img/base/src/data_observer.hh
index c061a97c3158b5e3facd4c37b2eb65ed0440a6cc..c3f06dc842114898f548ef302dea8a4ca4444aea 100644
--- a/modules/img/base/src/data_observer.hh
+++ b/modules/img/base/src/data_observer.hh
@@ -36,7 +36,7 @@ namespace ost { namespace img {
 class DLLEXPORT InvalidObserver: public Error {
 public:
   InvalidObserver(const String& s = String("unknown")):
-    Error(String("InvalidObserver exception occured: ") + s)
+    Error(String("InvalidObserver exception occurred: ") + s)
   {}
 };
 
diff --git a/modules/img/base/src/extent.hh b/modules/img/base/src/extent.hh
index 16978d96ef627ce10328c20f68448549e90844c1..fdff69b7228173ad0c920aa8c6e1c331c2a88824 100644
--- a/modules/img/base/src/extent.hh
+++ b/modules/img/base/src/extent.hh
@@ -47,7 +47,7 @@ namespace ost { namespace img {
 struct DLLEXPORT InvalidExtentException: public Error
 {
   InvalidExtentException(const String& m= String("") ):
-    Error(String("an invalid extent occured ("+m+String(")")))
+    Error(String("an invalid extent occurred ("+m+String(")")))
   {}
 };
 
diff --git a/modules/img/base/src/image_handle.hh b/modules/img/base/src/image_handle.hh
index 3d7261f9ceafc45b6cdb8b3b044d6ed52bb53fff..c984bc39dbab1bf89b5188124f5caa27053428df 100644
--- a/modules/img/base/src/image_handle.hh
+++ b/modules/img/base/src/image_handle.hh
@@ -126,7 +126,7 @@ public:
   //! Creates an empty, ie invalid handle
   /*!
     The default ctor is provided for e.g. using ImageHandle in STL containers. Any
-    attempt to use the interface of an emtpy ImageHandle will throw an 
+    attempt to use the interface of an empty ImageHandle will throw an 
     InvalidImageHandle exception.
   */
   ImageHandle();
diff --git a/modules/io/doc/io.rst b/modules/io/doc/io.rst
index 10be9a05532493ccaf23afa06cd49be89a8887a1..39a713dc980ad887052418b4d4b4667fdf83bd4e 100644
--- a/modules/io/doc/io.rst
+++ b/modules/io/doc/io.rst
@@ -89,12 +89,37 @@ behaviour.
   To get an entity equivalent to one loaded with :func:`LoadPDB`, set the
   `profile` and `process` arguments as follows:
 
+  .. code-block:: python
+
+    with open('protein.pdb') as pdb_fd:
+        pdb_str = pdb.read()
+        ent = io.PDBStrToEntity(pdb_str, ost.io.profiles['DEFAULT'], True)
+
+Loading Molecular Structures From Remote Repositories
+^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+
+:func:`LoadPDB` already provides access to selected structural databases in 
+the internet when enabling the *remote* flag. Predefined 
+:class:`ost.io.remote.RemoteRepository` objects are available as
+
 .. code-block:: python
 
-  with open('protein.pdb') as pdb_fd:
-      pdb_str = pdb.read()
-      ent = io.PDBStrToEntity(pdb_str, ost.io.profiles['DEFAULT'], True)
+  from ost.io import remote
+  repo_name = 'smtl'
+  repo = remote.REMOTE_REPOSITORIES.get(repo_name)
+
+  # url for entry with id 1ake.1
+  print(repo.URLForID('1ake.1'))
+
+where *repo_name* can be one of ['pdb', 'cif', 'pdb_redo', 'smtl'].
+Instead of explicit access, you can directly fetch data using:
+
+.. autofunction:: ost.io.remote.RemoteGet
+ 
+.. autofunction:: ost.io.remote.RemoteLoad
 
+.. autoclass:: ost.io.remote.RemoteRepository
+  :members:
 
 Saving Molecular Structures
 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
diff --git a/modules/io/pymod/remote.py b/modules/io/pymod/remote.py
index 42fee8bc76b9fe5a04e9ddac45f6f0fc071128cf..74617994f8a279d63348ced4596b4a48da8d87cb 100644
--- a/modules/io/pymod/remote.py
+++ b/modules/io/pymod/remote.py
@@ -26,6 +26,19 @@ class RemoteRepository:
   """
   A remote repository represents a structural database accessible through the 
   internet, e.g. the PDB or SWISS-MODEL template library.
+
+  :param name:        Name of the repository
+  :param url_pattern: URL pattern for repository. Required format is described
+                      in :func:`URLForID`
+  :param type:        Data format to expect at resolved URL must be in 
+                      ('pdb', 'cif')
+  :param id_transform: Transformation to apply to ID before resolving URL
+                       in :func:`URLForID`. Must be in ('lower', 'upper')
+
+  :type name:         :class:`str`
+  :type url_pattern:  :class:`str`
+  :type type:         :class:`str`
+  :type id_transform: :class:`str`
   """
   def __init__(self, name, url_pattern, type, id_transform='upper'):
     self.name = name
@@ -36,6 +49,15 @@ class RemoteRepository:
     self.id_transform = id_transform
 
   def URLForID(self, id):
+    """
+    Resolves URL given *url_pattern* and *id_transform* provided at object 
+    initialization.
+    The *url_pattern* must contain substring '$ID'. Given *id*, the URL to 
+    the structure gets constructed by applying *id_transform* and inserting it
+    at the location of '$ID'. e.g. 'https://files.rcsb.org/view/$ID.pdb' given 
+    1ake as *id* and 'upper' as *id_transform* resolves to:
+    'https://files.rcsb.org/view/1AKE.pdb'
+    """
     if self.id_transform == 'upper':
       id = id.upper()
     if self.id_transform == 'lower':
@@ -43,6 +65,13 @@ class RemoteRepository:
     return self.url_pattern.replace('$ID', id)
 
   def Get(self, id):
+    """
+    Resolves URL with :func:`URLForID`, dumps the content in a temporary file 
+    and returns its path.
+    
+    :param id:          ID to resolve
+    :type id:           :class:`str`
+    """
     remote_url = self.URLForID(id)
     tmp_file_suffix = '.%s' % self.type
     if remote_url.endswith('.gz'):
@@ -65,6 +94,16 @@ class RemoteRepository:
     return tmp_file
 
   def Load(self, id):
+    """
+    Resolves URL with :func:`URLForID` and directly loads/returns the according 
+    :class:`ost.mol.EntityHandle`. Loading invokes the 
+    :func:`ost.io.LoadPDB`/:func:`ost.io.LoadMMCIF` with default parameterization. If you need
+    custom settings, you might want to consider to call :func:`Get` and do the
+    loading manually.
+    
+    :param id:          ID to resolve
+    :type id:           :class:`str`
+    """
     tmp_file = self.Get(id)
     if self.type == 'pdb':
       return LoadPDB(tmp_file.name)
@@ -83,12 +122,26 @@ REMOTE_REPOSITORIES = {
 }
 
 def RemoteGet(id, from_repo='pdb'):
+  """
+  Invokes :func:`RemoteRepository.Get` on predefined repositories 
+  ('pdb', 'smtl', 'cif', 'pdb_redo')
+
+  :param from_repo:    One of the predefined repositories
+  :type from_repo:     :class:`str`
+  """
   remote_repo = REMOTE_REPOSITORIES.get(from_repo, None) 
   if not remote_repo:
     raise ValueError('%s is not a valid repository' % from_repo)
   return remote_repo.Get(id)
 
 def RemoteLoad(id, from_repo='pdb'):
+  """
+  Invokes :func:`RemoteRepository.Load` on predefined repositories 
+  ('pdb', 'smtl', 'cif', 'pdb_redo')
+
+  :param from_repo:    One of the predefined repositories
+  :type from_repo:     :class:`str`
+  """
   remote_repo = REMOTE_REPOSITORIES.get(from_repo, None) 
   if not remote_repo:
     raise ValueError('%s is not a valid repository' % from_repo)
diff --git a/modules/io/src/img/map_io_dm3_handler.cc b/modules/io/src/img/map_io_dm3_handler.cc
index c7b3351ec81e7eb84f3e58a373dbe653e417d8e8..bfae05eb8af54ef29f8c8bb8628f1d8e22dc312a 100644
--- a/modules/io/src/img/map_io_dm3_handler.cc
+++ b/modules/io/src/img/map_io_dm3_handler.cc
@@ -320,7 +320,7 @@ void DM3Collector::check_image()
 
       image_handle_list_.push_back(ih);
     } else {
-      LOG_ERROR("missmatch in byte size of data (" 
+      LOG_ERROR("mismatch in byte size of data (" 
                 << data_size*type_sizeof(image_number_type_) << " != " 
                 << image_data_byte_size_ << "), ignoring this image entry");
     }
diff --git a/modules/io/src/img/map_io_spi_handler.cc b/modules/io/src/img/map_io_spi_handler.cc
index 36a08bb3ae383ec53999f9878ff795ca5d36f3c2..d5b47181e4c8b14a436cef7c0161056260cb686e 100644
--- a/modules/io/src/img/map_io_spi_handler.cc
+++ b/modules/io/src/img/map_io_spi_handler.cc
@@ -482,7 +482,7 @@ void MapIOSpiHandler::Import(img::MapHandle& mh, std::istream& infile,const Imag
     detail::header_filler<OST_LITTLE_ENDIAN>(infile, header);
     break;
   default:
-    throw(IOException("unkown byte order"));
+    throw(IOException("unknown byte order"));
     break;
   }
 
@@ -506,7 +506,7 @@ void MapIOSpiHandler::Import(img::MapHandle& mh, std::istream& infile,const Imag
     detail::real_filler<OST_LITTLE_ENDIAN,float>(infile,header,mh,1.0);
     break;
   default:
-    throw(IOException("unkown byte order"));
+    throw(IOException("unknown byte order"));
     break;
   }
 
diff --git a/modules/io/src/img/map_io_tiff_handler.cc b/modules/io/src/img/map_io_tiff_handler.cc
index 5de5b240fb5d0293508ea850044783084bfde6c3..d88fc01d7d55b3b6227da0f8d18054fad3b54d2d 100644
--- a/modules/io/src/img/map_io_tiff_handler.cc
+++ b/modules/io/src/img/map_io_tiff_handler.cc
@@ -629,7 +629,7 @@ void MapIOTiffHandler::load_image_data(TIFF* tfile, img::ImageHandle& image,  co
   buf = _TIFFmalloc(stripsize);
 
   if(image.GetType()==img::WORD) {
-    LOG_INFO("I/O Tiff: " << "reseting target image to WORD " << image_extent);
+    LOG_INFO("I/O Tiff: " << "resetting target image to WORD " << image_extent);
     image.Reset(image_extent, img::WORD, img::SPATIAL);
 
     img::image_state::WordSpatialImageState *is =
@@ -676,14 +676,14 @@ void MapIOTiffHandler::load_image_data(TIFF* tfile, img::ImageHandle& image,  co
     img::image_state::RealSpatialImageState *isr=0;
     img::image_state::ComplexSpatialImageState *isc=0;
     if(fmt==SAMPLEFORMAT_COMPLEXINT || fmt==SAMPLEFORMAT_COMPLEXIEEEFP){
-      LOG_INFO("I/O Tiff: " << "reseting target image to complex spatial " << image_extent);
+      LOG_INFO("I/O Tiff: " << "resetting target image to complex spatial " << image_extent);
       image.Reset(image_extent,img::COMPLEX,img::SPATIAL);
       isc = dynamic_cast<img::image_state::ComplexSpatialImageState*>(image.ImageStatePtr().get());
       if(!isc) {
         throw IOException("unexpected failure of dynamic_cast in tiff io");
       }
     }else{
-      LOG_INFO("I/O Tiff: " << "reseting target image to Real img::SPATIAL" << image_extent);
+      LOG_INFO("I/O Tiff: " << "resetting target image to Real img::SPATIAL" << image_extent);
       image.Reset(image_extent, img::REAL, img::SPATIAL);
 
       isr= dynamic_cast<img::image_state::RealSpatialImageState*>(image.ImageStatePtr().get());
diff --git a/modules/io/src/mol/dcd_io.cc b/modules/io/src/mol/dcd_io.cc
index ec31b4bbf88694f714854645845557c42485a1e2..d70074433c734815669a84c178d4168b1f7b2e0d 100644
--- a/modules/io/src/mol/dcd_io.cc
+++ b/modules/io/src/mol/dcd_io.cc
@@ -267,7 +267,7 @@ mol::CoordGroupHandle load_dcd(const mol::AtomHandleList& alist, // this atom li
   bool swap_flag=false, ucell_flag=false, gap_flag=false;
   read_dcd_header(istream, header, swap_flag, ucell_flag, gap_flag, detect_swap, byte_swap);
   if(alist.size() != static_cast<size_t>(header.t_atom_count)) {
-    LOG_ERROR("LoadCHARMMTraj: atom count missmatch: " << alist.size() 
+    LOG_ERROR("LoadCHARMMTraj: atom count mismatch: " << alist.size() 
                << " in coordinate file, " << header.t_atom_count 
                << " in each traj frame");
     throw(IOException("invalid trajectory"));
diff --git a/modules/io/src/mol/load_entity.cc b/modules/io/src/mol/load_entity.cc
index a9d34c3eb26030bd00a7facf485d70423056af8d..c35010927ca7bf14f3eb85e3ba6bcea9f6c8d871 100644
--- a/modules/io/src/mol/load_entity.cc
+++ b/modules/io/src/mol/load_entity.cc
@@ -55,7 +55,7 @@ void Import(mol::EntityHandle& eh, const String& filename, const String& format)
 
 mol::EntityHandle LoadEntity(const String& filename, const String& format)
 {
-  LOG_DEBUG("creating emtpy entity");
+  LOG_DEBUG("creating empty entity");
   mol::EntityHandle eh=mol::CreateEntity();
   mol::XCSEditor xcs_lock=eh.EditXCS(mol::BUFFERED_EDIT);
   Import(eh, filename, format);
diff --git a/modules/io/src/mol/mmcif_reader.hh b/modules/io/src/mol/mmcif_reader.hh
index 925dfde23b3362612a3fe63d5e0f04e6ff6c2df7..9147a234c4f4966b4ac861f45c48f0a2e7bee829 100644
--- a/modules/io/src/mol/mmcif_reader.hh
+++ b/modules/io/src/mol/mmcif_reader.hh
@@ -232,7 +232,7 @@ protected:
 	const MMCifInfoStructRefs& GetStructRefs() const { return struct_refs_; }
   /// \brief convert the seqres data item to canonical form. 
   /// 
-  /// The seqres sequence lists non-standard residues in paranthesis. For 
+  /// The seqres sequence lists non-standard residues in parenthesis. For 
   /// proper handling of our sequence classes, these need to be converted to 
   /// one-letter-codes. Ideally, we would use the canonical SEQRES. This is 
   /// not possible, however, since the PDB assigns multiple one letter codes 
diff --git a/modules/mol/alg/pymod/wrap_mol_alg.cc b/modules/mol/alg/pymod/wrap_mol_alg.cc
index f00a537c59bd0e9a360b005ca66f19efda0367f7..fd5b6d94de273dc57317e270d58596534fb5131f 100644
--- a/modules/mol/alg/pymod/wrap_mol_alg.cc
+++ b/modules/mol/alg/pymod/wrap_mol_alg.cc
@@ -30,6 +30,7 @@
 #include <ost/mol/alg/consistency_checks.hh>
 #include <ost/mol/alg/pdbize.hh>
 #include <ost/mol/alg/contact_overlap.hh>
+#include <ost/mol/alg/construct_cbeta.hh>
 #include <ost/export_helper/pair_to_tuple_conv.hh>
 #include <ost/export_helper/vec_to_list_conv.hh>
 
@@ -294,6 +295,15 @@ void print_lddt_per_residue_stats_wrapper(list& scores, bool structural_checks,
  
  return mol::alg::PrintlDDTPerResidueStats(scores_vector, structural_checks, cutoffs_size);
 }
+
+geom::Vec3 cbeta_vectors(const geom::Vec3& n_pos, const geom::Vec3& ca_pos, 
+                         const geom::Vec3& c_pos, Real l) {
+  return mol::alg::CBetaPosition(n_pos, ca_pos, c_pos, l);
+}
+
+geom::Vec3 cbeta_residue(const ost::mol::ResidueHandle& r, Real l) {
+  return mol::alg::CBetaPosition(r, l);
+}
   
 }
 
@@ -529,4 +539,10 @@ BOOST_PYTHON_MODULE(_ost_mol_alg)
   def("DRMSD",&mol::alg::DRMSD,(arg("view"),arg("distance_list"),
                                 arg("cap_distance")=5.0,arg("sequence_separation")=0));
 
+  def("CBetaPosition", &cbeta_vectors, (arg("n_pos"), arg("ca_pos"), 
+                                        arg("c_pos"), arg("l")=1.5));
+  def("CBetaPosition", &cbeta_residue, (arg("r"), arg("l") = 1.5));
+
+  def("ConstructCBetas", &mol::alg::ConstructCBetas, (arg("ent"), 
+                                                      arg("include_gly")=false));
 }
diff --git a/modules/mol/alg/src/local_dist_diff_test.hh b/modules/mol/alg/src/local_dist_diff_test.hh
index 794c671e06039c132f3f20bdeac9cc2e564a44a6..41ebf09ac800acf8242295361a6cb877a85315f7 100644
--- a/modules/mol/alg/src/local_dist_diff_test.hh
+++ b/modules/mol/alg/src/local_dist_diff_test.hh
@@ -214,7 +214,7 @@ GlobalRDMap DLLEXPORT_OST_MOL_ALG CreateDistanceList(const EntityView& ref,Real
 ///
 /// If a distance between two atoms is shorter than the inclusion radius in all structures in which the two atoms are 
 /// present, it is included in the list. However, if the distance is longer than the inclusion radius in at least one 
-/// of the structures, it is not be considered a local interaction and is exluded from the list
+/// of the structures, it is not be considered a local interaction and is excluded from the list
 ///
 /// The function takes care of residues with ambigous symmetric sidechains. To decide which naming convention to use, the functions
 /// computes a local distance score of each reference structure with the first reference structure in the list, using only non ambigously-named atoms. 
diff --git a/modules/mol/base/pymod/export_editors.cc b/modules/mol/base/pymod/export_editors.cc
index 3c5ab790008016ce376da1f353ea9a5fbd4b71c9..e20ee4d4e11b5b8e7b658926667cb85005c2c5e2 100644
--- a/modules/mol/base/pymod/export_editors.cc
+++ b/modules/mol/base/pymod/export_editors.cc
@@ -123,7 +123,7 @@ void set_pos2_t(XCSEditor& e, const AtomHandleList& alist, object pyobj)
   PyArrayObject* na=reinterpret_cast<PyArrayObject*>(pyobj.ptr());
   
   if(PyArray_NDIM(na)!=2 || PyArray_DIM(na,0)!=int(acount) || PyArray_DIM(na,1)!=3) {
-    throw Error("excpected a numpy array of shape (NAtoms, 3)");
+    throw Error("expected a numpy array of shape (NAtoms, 3)");
     return;
   }
   
diff --git a/modules/mol/base/src/coord_frame.cc b/modules/mol/base/src/coord_frame.cc
index 8fb7a39cfcecaab0c161c76ec2dbd671077c97c3..582e6711012dcbb7f1569a9e1cb4c649ba363a0e 100644
--- a/modules/mol/base/src/coord_frame.cc
+++ b/modules/mol/base/src/coord_frame.cc
@@ -289,7 +289,7 @@ namespace ost { namespace mol {
       throw Error("not same numbers of CA, C, O and N atoms in the selection");
     }
     if (n_atoms<=5){
-      throw Error("At least five residues are needed to calulate an alpha helix similarity");
+      throw Error("At least five residues are needed to calculate an alpha helix similarity");
     }
     c=(*this)[indices_c[0]];
     n_next=(*this)[indices_n[1]];
diff --git a/modules/mol/base/src/impl/entity_impl.cc b/modules/mol/base/src/impl/entity_impl.cc
index db0731f27583d9bc499183e56c65464188a4037d..c15489bed172612a51904f1061e9b4ba009ee576 100644
--- a/modules/mol/base/src/impl/entity_impl.cc
+++ b/modules/mol/base/src/impl/entity_impl.cc
@@ -544,7 +544,7 @@ void EntityImpl::TraceDirectionality()
 {
   fragment_list_.clear();
   Profile profile_trace("trace directionality");
-  // some reseting on the atom level
+  // some resetting on the atom level
   for(AtomImplMap::iterator it=atom_map_.begin();it!=atom_map_.end();++it) {
     it->second->ClearDirectionality();
     it->second->SetVisited(false);
diff --git a/modules/mol/base/src/impl/query_impl.cc b/modules/mol/base/src/impl/query_impl.cc
index a7c2cfb95c495362e1e04b104499fb109ef90263..f5842a7492cddc841c2685dc1ed9c4413da3d760 100644
--- a/modules/mol/base/src/impl/query_impl.cc
+++ b/modules/mol/base/src/impl/query_impl.cc
@@ -797,7 +797,7 @@ Node* QueryImpl::ParseParenSubExpr(QueryLexer& lexer) {
     QueryToken end_paren=lexer.CurrentToken();
     if (end_paren.GetType()!=tok::RightParen) {
       delete n;      
-      error_desc_.msg="unmatched paranthesis in query string";
+      error_desc_.msg="unmatched parenthesis in query string";
       error_desc_.range=paren_token.GetRange();
       return NULL;
     } else {
diff --git a/modules/mol/base/src/query_error.hh b/modules/mol/base/src/query_error.hh
index c8a092cc9c073cf5f217db4294b51cc32bf46f45..56cfb21db1b516ae227387f3d70c8fc5722c90e8 100644
--- a/modules/mol/base/src/query_error.hh
+++ b/modules/mol/base/src/query_error.hh
@@ -45,7 +45,7 @@ public:
   //! Get error description.
   const String& GetMessage()const throw();
   
-  // Get range of where the error occured
+  // Get range of where the error occurred
   const Range& GetRange() const;
 
   //! Get nicely formatted error message
diff --git a/modules/seq/alg/src/data/BLOSUM100 b/modules/seq/alg/src/data/BLOSUM100
new file mode 100644
index 0000000000000000000000000000000000000000..46e9e851608adcec2ccd8906f5c10b8555714959
--- /dev/null
+++ b/modules/seq/alg/src/data/BLOSUM100
@@ -0,0 +1,31 @@
+#  Matrix made by matblas from blosum100_3.iij
+#  * column uses minimum score
+#  BLOSUM Clustered Scoring Matrix in 1/3 Bit Units
+#  Blocks Database = /data/blocks_5.0/blocks.dat
+#  Cluster Percentage: >= 100
+#  Entropy =   1.4516, Expected =  -1.0948
+   A  R  N  D  C  Q  E  G  H  I  L  K  M  F  P  S  T  W  Y  V  B  Z  X  *
+A  8 -3 -4 -5 -2 -2 -3 -1 -4 -4 -4 -2 -3 -5 -2  1 -1 -6 -5 -2 -4 -2 -2 -10 
+R -3 10 -2 -5 -8  0 -2 -6 -1 -7 -6  3 -4 -6 -5 -3 -3 -7 -5 -6 -4 -1 -3 -10 
+N -4 -2 11  1 -5 -1 -2 -2  0 -7 -7 -1 -5 -7 -5  0 -1 -8 -5 -7  5 -2 -3 -10 
+D -5 -5  1 10 -8 -2  2 -4 -3 -8 -8 -3 -8 -8 -5 -2 -4 -10 -7 -8  6  0 -4 -10 
+C -2 -8 -5 -8 14 -7 -9 -7 -8 -3 -5 -8 -4 -4 -8 -3 -3 -7 -6 -3 -7 -8 -5 -10 
+Q -2  0 -1 -2 -7 11  2 -5  1 -6 -5  2 -2 -6 -4 -2 -3 -5 -4 -5 -2  5 -2 -10 
+E -3 -2 -2  2 -9  2 10 -6 -2 -7 -7  0 -5 -8 -4 -2 -3 -8 -7 -5  0  7 -3 -10 
+G -1 -6 -2 -4 -7 -5 -6  9 -6 -9 -8 -5 -7 -8 -6 -2 -5 -7 -8 -8 -3 -5 -4 -10 
+H -4 -1  0 -3 -8  1 -2 -6 13 -7 -6 -3 -5 -4 -5 -3 -4 -5  1 -7 -2 -1 -4 -10 
+I -4 -7 -7 -8 -3 -6 -7 -9 -7  8  2 -6  1 -2 -7 -5 -3 -6 -4  4 -8 -7 -3 -10 
+L -4 -6 -7 -8 -5 -5 -7 -8 -6  2  8 -6  3  0 -7 -6 -4 -5 -4  0 -8 -6 -3 -10 
+K -2  3 -1 -3 -8  2  0 -5 -3 -6 -6 10 -4 -6 -3 -2 -3 -8 -5 -5 -2  0 -3 -10 
+M -3 -4 -5 -8 -4 -2 -5 -7 -5  1  3 -4 12 -1 -5 -4 -2 -4 -5  0 -7 -4 -3 -10 
+F -5 -6 -7 -8 -4 -6 -8 -8 -4 -2  0 -6 -1 11 -7 -5 -5  0  4 -3 -7 -7 -4 -10 
+P -2 -5 -5 -5 -8 -4 -4 -6 -5 -7 -7 -3 -5 -7 12 -3 -4 -8 -7 -6 -5 -4 -4 -10 
+S  1 -3  0 -2 -3 -2 -2 -2 -3 -5 -6 -2 -4 -5 -3  9  2 -7 -5 -4 -1 -2 -2 -10 
+T -1 -3 -1 -4 -3 -3 -3 -5 -4 -3 -4 -3 -2 -5 -4  2  9 -7 -5 -1 -2 -3 -2 -10 
+W -6 -7 -8 -10 -7 -5 -8 -7 -5 -6 -5 -8 -4  0 -8 -7 -7 17  2 -5 -9 -7 -6 -10 
+Y -5 -5 -5 -7 -6 -4 -7 -8  1 -4 -4 -5 -5  4 -7 -5 -5  2 12 -5 -6 -6 -4 -10 
+V -2 -6 -7 -8 -3 -5 -5 -8 -7  4  0 -5  0 -3 -6 -4 -1 -5 -5  8 -7 -5 -3 -10 
+B -4 -4  5  6 -7 -2  0 -3 -2 -8 -8 -2 -7 -7 -5 -1 -2 -9 -6 -7  6  0 -4 -10 
+Z -2 -1 -2  0 -8  5  7 -5 -1 -7 -6  0 -4 -7 -4 -2 -3 -7 -6 -5  0  6 -2 -10 
+X -2 -3 -3 -4 -5 -2 -3 -4 -4 -3 -3 -3 -3 -4 -4 -2 -2 -6 -4 -3 -4 -2 -3 -10 
+* -10 -10 -10 -10 -10 -10 -10 -10 -10 -10 -10 -10 -10 -10 -10 -10 -10 -10 -10 -10 -10 -10 -10  1 
diff --git a/modules/seq/alg/src/data/BLOSUM45 b/modules/seq/alg/src/data/BLOSUM45
new file mode 100644
index 0000000000000000000000000000000000000000..18c3323896f4f802558e6eda688f467a582a3d5e
--- /dev/null
+++ b/modules/seq/alg/src/data/BLOSUM45
@@ -0,0 +1,31 @@
+#  Matrix made by matblas from blosum45.iij
+#  * column uses minimum score
+#  BLOSUM Clustered Scoring Matrix in 1/3 Bit Units
+#  Blocks Database = /data/blocks_5.0/blocks.dat
+#  Cluster Percentage: >= 45
+#  Entropy =   0.3795, Expected =  -0.2789
+   A  R  N  D  C  Q  E  G  H  I  L  K  M  F  P  S  T  W  Y  V  B  Z  X  *
+A  5 -2 -1 -2 -1 -1 -1  0 -2 -1 -1 -1 -1 -2 -1  1  0 -2 -2  0 -1 -1  0 -5 
+R -2  7  0 -1 -3  1  0 -2  0 -3 -2  3 -1 -2 -2 -1 -1 -2 -1 -2 -1  0 -1 -5 
+N -1  0  6  2 -2  0  0  0  1 -2 -3  0 -2 -2 -2  1  0 -4 -2 -3  4  0 -1 -5 
+D -2 -1  2  7 -3  0  2 -1  0 -4 -3  0 -3 -4 -1  0 -1 -4 -2 -3  5  1 -1 -5 
+C -1 -3 -2 -3 12 -3 -3 -3 -3 -3 -2 -3 -2 -2 -4 -1 -1 -5 -3 -1 -2 -3 -2 -5 
+Q -1  1  0  0 -3  6  2 -2  1 -2 -2  1  0 -4 -1  0 -1 -2 -1 -3  0  4 -1 -5 
+E -1  0  0  2 -3  2  6 -2  0 -3 -2  1 -2 -3  0  0 -1 -3 -2 -3  1  4 -1 -5 
+G  0 -2  0 -1 -3 -2 -2  7 -2 -4 -3 -2 -2 -3 -2  0 -2 -2 -3 -3 -1 -2 -1 -5 
+H -2  0  1  0 -3  1  0 -2 10 -3 -2 -1  0 -2 -2 -1 -2 -3  2 -3  0  0 -1 -5 
+I -1 -3 -2 -4 -3 -2 -3 -4 -3  5  2 -3  2  0 -2 -2 -1 -2  0  3 -3 -3 -1 -5 
+L -1 -2 -3 -3 -2 -2 -2 -3 -2  2  5 -3  2  1 -3 -3 -1 -2  0  1 -3 -2 -1 -5 
+K -1  3  0  0 -3  1  1 -2 -1 -3 -3  5 -1 -3 -1 -1 -1 -2 -1 -2  0  1 -1 -5 
+M -1 -1 -2 -3 -2  0 -2 -2  0  2  2 -1  6  0 -2 -2 -1 -2  0  1 -2 -1 -1 -5 
+F -2 -2 -2 -4 -2 -4 -3 -3 -2  0  1 -3  0  8 -3 -2 -1  1  3  0 -3 -3 -1 -5 
+P -1 -2 -2 -1 -4 -1  0 -2 -2 -2 -3 -1 -2 -3  9 -1 -1 -3 -3 -3 -2 -1 -1 -5 
+S  1 -1  1  0 -1  0  0  0 -1 -2 -3 -1 -2 -2 -1  4  2 -4 -2 -1  0  0  0 -5 
+T  0 -1  0 -1 -1 -1 -1 -2 -2 -1 -1 -1 -1 -1 -1  2  5 -3 -1  0  0 -1  0 -5 
+W -2 -2 -4 -4 -5 -2 -3 -2 -3 -2 -2 -2 -2  1 -3 -4 -3 15  3 -3 -4 -2 -2 -5 
+Y -2 -1 -2 -2 -3 -1 -2 -3  2  0  0 -1  0  3 -3 -2 -1  3  8 -1 -2 -2 -1 -5 
+V  0 -2 -3 -3 -1 -3 -3 -3 -3  3  1 -2  1  0 -3 -1  0 -3 -1  5 -3 -3 -1 -5 
+B -1 -1  4  5 -2  0  1 -1  0 -3 -3  0 -2 -3 -2  0  0 -4 -2 -3  4  2 -1 -5 
+Z -1  0  0  1 -3  4  4 -2  0 -3 -2  1 -1 -3 -1  0 -1 -2 -2 -3  2  4 -1 -5 
+X  0 -1 -1 -1 -2 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1  0  0 -2 -1 -1 -1 -1 -1 -5 
+* -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5  1 
diff --git a/modules/seq/alg/src/data/BLOSUM62 b/modules/seq/alg/src/data/BLOSUM62
new file mode 100644
index 0000000000000000000000000000000000000000..205f139aa2f8c879f6426708fe316be8bf55f771
--- /dev/null
+++ b/modules/seq/alg/src/data/BLOSUM62
@@ -0,0 +1,31 @@
+#  Matrix made by matblas from blosum62.iij
+#  * column uses minimum score
+#  BLOSUM Clustered Scoring Matrix in 1/2 Bit Units
+#  Blocks Database = /data/blocks_5.0/blocks.dat
+#  Cluster Percentage: >= 62
+#  Entropy =   0.6979, Expected =  -0.5209
+   A  R  N  D  C  Q  E  G  H  I  L  K  M  F  P  S  T  W  Y  V  B  Z  X  *
+A  4 -1 -2 -2  0 -1 -1  0 -2 -1 -1 -1 -1 -2 -1  1  0 -3 -2  0 -2 -1  0 -4 
+R -1  5  0 -2 -3  1  0 -2  0 -3 -2  2 -1 -3 -2 -1 -1 -3 -2 -3 -1  0 -1 -4 
+N -2  0  6  1 -3  0  0  0  1 -3 -3  0 -2 -3 -2  1  0 -4 -2 -3  3  0 -1 -4 
+D -2 -2  1  6 -3  0  2 -1 -1 -3 -4 -1 -3 -3 -1  0 -1 -4 -3 -3  4  1 -1 -4 
+C  0 -3 -3 -3  9 -3 -4 -3 -3 -1 -1 -3 -1 -2 -3 -1 -1 -2 -2 -1 -3 -3 -2 -4 
+Q -1  1  0  0 -3  5  2 -2  0 -3 -2  1  0 -3 -1  0 -1 -2 -1 -2  0  3 -1 -4 
+E -1  0  0  2 -4  2  5 -2  0 -3 -3  1 -2 -3 -1  0 -1 -3 -2 -2  1  4 -1 -4 
+G  0 -2  0 -1 -3 -2 -2  6 -2 -4 -4 -2 -3 -3 -2  0 -2 -2 -3 -3 -1 -2 -1 -4 
+H -2  0  1 -1 -3  0  0 -2  8 -3 -3 -1 -2 -1 -2 -1 -2 -2  2 -3  0  0 -1 -4 
+I -1 -3 -3 -3 -1 -3 -3 -4 -3  4  2 -3  1  0 -3 -2 -1 -3 -1  3 -3 -3 -1 -4 
+L -1 -2 -3 -4 -1 -2 -3 -4 -3  2  4 -2  2  0 -3 -2 -1 -2 -1  1 -4 -3 -1 -4 
+K -1  2  0 -1 -3  1  1 -2 -1 -3 -2  5 -1 -3 -1  0 -1 -3 -2 -2  0  1 -1 -4 
+M -1 -1 -2 -3 -1  0 -2 -3 -2  1  2 -1  5  0 -2 -1 -1 -1 -1  1 -3 -1 -1 -4 
+F -2 -3 -3 -3 -2 -3 -3 -3 -1  0  0 -3  0  6 -4 -2 -2  1  3 -1 -3 -3 -1 -4 
+P -1 -2 -2 -1 -3 -1 -1 -2 -2 -3 -3 -1 -2 -4  7 -1 -1 -4 -3 -2 -2 -1 -2 -4 
+S  1 -1  1  0 -1  0  0  0 -1 -2 -2  0 -1 -2 -1  4  1 -3 -2 -2  0  0  0 -4 
+T  0 -1  0 -1 -1 -1 -1 -2 -2 -1 -1 -1 -1 -2 -1  1  5 -2 -2  0 -1 -1  0 -4 
+W -3 -3 -4 -4 -2 -2 -3 -2 -2 -3 -2 -3 -1  1 -4 -3 -2 11  2 -3 -4 -3 -2 -4 
+Y -2 -2 -2 -3 -2 -1 -2 -3  2 -1 -1 -2 -1  3 -3 -2 -2  2  7 -1 -3 -2 -1 -4 
+V  0 -3 -3 -3 -1 -2 -2 -3 -3  3  1 -2  1 -1 -2 -2  0 -3 -1  4 -3 -2 -1 -4 
+B -2 -1  3  4 -3  0  1 -1  0 -3 -4  0 -3 -3 -2  0 -1 -4 -3 -3  4  1 -1 -4 
+Z -1  0  0  1 -3  3  4 -2  0 -3 -3  1 -1 -3 -1  0 -1 -3 -2 -2  1  4 -1 -4 
+X  0 -1 -1 -1 -2 -1 -1 -1 -1 -1 -1 -1 -1 -1 -2  0  0 -2 -1 -1 -1 -1 -1 -4 
+* -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4  1 
diff --git a/modules/seq/alg/src/data/BLOSUM80 b/modules/seq/alg/src/data/BLOSUM80
new file mode 100644
index 0000000000000000000000000000000000000000..78172a3592b5322c5e9429e2e4661dc5c374d9eb
--- /dev/null
+++ b/modules/seq/alg/src/data/BLOSUM80
@@ -0,0 +1,31 @@
+#  Matrix made by matblas from blosum80_3.iij
+#  * column uses minimum score
+#  BLOSUM Clustered Scoring Matrix in 1/3 Bit Units
+#  Blocks Database = /data/blocks_5.0/blocks.dat
+#  Cluster Percentage: >= 80
+#  Entropy =   0.9868, Expected =  -0.7442
+   A  R  N  D  C  Q  E  G  H  I  L  K  M  F  P  S  T  W  Y  V  B  Z  X  *
+A  7 -3 -3 -3 -1 -2 -2  0 -3 -3 -3 -1 -2 -4 -1  2  0 -5 -4 -1 -3 -2 -1 -8 
+R -3  9 -1 -3 -6  1 -1 -4  0 -5 -4  3 -3 -5 -3 -2 -2 -5 -4 -4 -2  0 -2 -8 
+N -3 -1  9  2 -5  0 -1 -1  1 -6 -6  0 -4 -6 -4  1  0 -7 -4 -5  5 -1 -2 -8 
+D -3 -3  2 10 -7 -1  2 -3 -2 -7 -7 -2 -6 -6 -3 -1 -2 -8 -6 -6  6  1 -3 -8 
+C -1 -6 -5 -7 13 -5 -7 -6 -7 -2 -3 -6 -3 -4 -6 -2 -2 -5 -5 -2 -6 -7 -4 -8 
+Q -2  1  0 -1 -5  9  3 -4  1 -5 -4  2 -1 -5 -3 -1 -1 -4 -3 -4 -1  5 -2 -8 
+E -2 -1 -1  2 -7  3  8 -4  0 -6 -6  1 -4 -6 -2 -1 -2 -6 -5 -4  1  6 -2 -8 
+G  0 -4 -1 -3 -6 -4 -4  9 -4 -7 -7 -3 -5 -6 -5 -1 -3 -6 -6 -6 -2 -4 -3 -8 
+H -3  0  1 -2 -7  1  0 -4 12 -6 -5 -1 -4 -2 -4 -2 -3 -4  3 -5 -1  0 -2 -8 
+I -3 -5 -6 -7 -2 -5 -6 -7 -6  7  2 -5  2 -1 -5 -4 -2 -5 -3  4 -6 -6 -2 -8 
+L -3 -4 -6 -7 -3 -4 -6 -7 -5  2  6 -4  3  0 -5 -4 -3 -4 -2  1 -7 -5 -2 -8 
+K -1  3  0 -2 -6  2  1 -3 -1 -5 -4  8 -3 -5 -2 -1 -1 -6 -4 -4 -1  1 -2 -8 
+M -2 -3 -4 -6 -3 -1 -4 -5 -4  2  3 -3  9  0 -4 -3 -1 -3 -3  1 -5 -3 -2 -8 
+F -4 -5 -6 -6 -4 -5 -6 -6 -2 -1  0 -5  0 10 -6 -4 -4  0  4 -2 -6 -6 -3 -8 
+P -1 -3 -4 -3 -6 -3 -2 -5 -4 -5 -5 -2 -4 -6 12 -2 -3 -7 -6 -4 -4 -2 -3 -8 
+S  2 -2  1 -1 -2 -1 -1 -1 -2 -4 -4 -1 -3 -4 -2  7  2 -6 -3 -3  0 -1 -1 -8 
+T  0 -2  0 -2 -2 -1 -2 -3 -3 -2 -3 -1 -1 -4 -3  2  8 -5 -3  0 -1 -2 -1 -8 
+W -5 -5 -7 -8 -5 -4 -6 -6 -4 -5 -4 -6 -3  0 -7 -6 -5 16  3 -5 -8 -5 -5 -8 
+Y -4 -4 -4 -6 -5 -3 -5 -6  3 -3 -2 -4 -3  4 -6 -3 -3  3 11 -3 -5 -4 -3 -8 
+V -1 -4 -5 -6 -2 -4 -4 -6 -5  4  1 -4  1 -2 -4 -3  0 -5 -3  7 -6 -4 -2 -8 
+B -3 -2  5  6 -6 -1  1 -2 -1 -6 -7 -1 -5 -6 -4  0 -1 -8 -5 -6  6  0 -3 -8 
+Z -2  0 -1  1 -7  5  6 -4  0 -6 -5  1 -3 -6 -2 -1 -2 -5 -4 -4  0  6 -1 -8 
+X -1 -2 -2 -3 -4 -2 -2 -3 -2 -2 -2 -2 -2 -3 -3 -1 -1 -5 -3 -2 -3 -1 -2 -8 
+* -8 -8 -8 -8 -8 -8 -8 -8 -8 -8 -8 -8 -8 -8 -8 -8 -8 -8 -8 -8 -8 -8 -8  1 
diff --git a/modules/seq/alg/src/data/generate_blosum_data.py b/modules/seq/alg/src/data/generate_blosum_data.py
new file mode 100644
index 0000000000000000000000000000000000000000..cb0dc1f607826ee223dd63b9b02d914dc9c317ff
--- /dev/null
+++ b/modules/seq/alg/src/data/generate_blosum_data.py
@@ -0,0 +1,47 @@
+# code generation for subst_weight_matrix.cc
+# loads BLOSUM substitution matrices from files provided by NCBI at:
+# ftp://ftp.ncbi.nlm.nih.gov/blast/matrices/
+
+def Generate(filename, matrix_name):
+
+    with open(filename) as f:
+        data = f.readlines()
+
+    scores = dict()
+    olcs = None    
+    for line in data:
+        if line.startswith('#'):
+            continue
+        if olcs is None:
+            if " A " in line and " R " in line and " N " in line:
+                # very high likelihood that this line contains the olcs
+                olcs = line.strip().split()
+            continue
+        split_line = line.strip().split()
+        if split_line[0] in olcs:
+            olc = split_line[0]
+            for score_idx, score in enumerate(split_line[1:]):
+                scores[(olc, olcs[score_idx])] = score
+
+    ost_olcs = "ABCDEFGHIKLMNPQRSTVWXYZ"
+    print("short %s[23][23]={"%(matrix_name))
+    for a in ost_olcs:
+        score_string = "" 
+        for b in ost_olcs:
+            score = scores[(a,b)]
+            if len(score_string) == 0:
+                entry = [' ', ' ']
+            else:
+                entry = [',', ' ', ' ', ' ']
+            for i in range(len(score)):
+                entry[-1-i] = score[-1-i]
+            score_string += ''.join(entry)
+        print("  {%s},"%(score_string))
+    print("};")
+    print()
+
+Generate("BLOSUM45", "RAW_BLOSUM45_DATA")
+Generate("BLOSUM62", "RAW_BLOSUM62_DATA")
+Generate("BLOSUM80", "RAW_BLOSUM80_DATA")
+Generate("BLOSUM100", "RAW_BLOSUM100_DATA")
+
diff --git a/modules/seq/alg/src/subst_weight_matrix.cc b/modules/seq/alg/src/subst_weight_matrix.cc
index 8f05ba92c28a2b5732dc73e4a514b052c953662e..f382e4f8edeb423938d6b3b4a0f9c6dcef629efe 100644
--- a/modules/seq/alg/src/subst_weight_matrix.cc
+++ b/modules/seq/alg/src/subst_weight_matrix.cc
@@ -23,6 +23,9 @@
 
 namespace{
 
+// The data for the following matrices can be reproduced by running generate_blosum_data.py
+// in OST_SOURCE/modules/seq/alg/src/data
+
 short RAW_BLOSUM45_DATA[23][23]={
   { 5, -1, -1, -2, -1, -2,  0, -2, -1, -1, -1, -1, -1, -1, -1, -2,  1,  0,  0, -2,  0, -2, -1},
   {-1,  4, -2,  5,  1, -3, -1,  0, -3,  0, -3, -2,  4, -2,  0, -1,  0,  0, -3, -4, -1, -2,  2},
@@ -48,7 +51,7 @@ short RAW_BLOSUM45_DATA[23][23]={
   {-2, -2, -3, -2, -2,  3, -3,  2,  0, -1,  0,  0, -2, -3, -1, -1, -2, -1, -1,  3, -1,  8, -2},
   {-1,  2, -3,  1,  4, -3, -2,  0, -3,  1, -2, -1,  0, -1,  4,  0,  0, -1, -3, -2, -1, -2,  4},
 };
-      
+
 short RAW_BLOSUM62_DATA[23][23]={
   { 4, -2,  0, -2, -1, -2,  0, -2, -1, -1, -1, -1, -2, -1, -1, -1,  1,  0,  0, -3,  0, -2, -1},
   {-2,  4, -3,  4,  1, -3, -1,  0, -3,  0, -4, -3,  3, -2,  0, -1,  0, -1, -3, -4, -1, -3,  1},
@@ -121,7 +124,7 @@ short RAW_BLOSUM100_DATA[23][23]={
   { 1, -1, -3, -2, -2, -5, -2, -3, -5, -2, -6, -4,  0, -3, -2, -3,  9,  2, -4, -7, -2, -5, -2},
   {-1, -2, -3, -4, -3, -5, -5, -4, -3, -3, -4, -2, -1, -4, -3, -3,  2,  9, -1, -7, -2, -5, -3},
   {-2, -7, -3, -8, -5, -3, -8, -7,  4, -5,  0,  0, -7, -6, -5, -6, -4, -1,  8, -5, -3, -5, -5},
-  {-6, -9, -7, 10, -8,  0, -7, -5, -6, -8, -5, -4, -8, -8, -5, -7, -7, -7, -5, 17, -6,  2, -7},
+  {-6, -9, -7,-10, -8,  0, -7, -5, -6, -8, -5, -4, -8, -8, -5, -7, -7, -7, -5, 17, -6,  2, -7},
   {-2, -4, -5, -4, -3, -4, -4, -4, -3, -3, -3, -3, -3, -4, -2, -3, -2, -2, -3, -6, -3, -4, -2},
   {-5, -6, -6, -7, -7,  4, -8,  1, -4, -5, -4, -5, -5, -7, -4, -5, -5, -5, -5,  2, -4, 12, -6},
   {-2,  0, -8,  0,  7, -7, -5, -1, -7,  0, -6, -4, -2, -4,  5, -1, -2, -3, -5, -7, -2, -6,  6},
diff --git a/scripts/bump-version.py b/scripts/bump-version.py
index 361e7877258e6954c7f267931908d6016ff8f216..25873539b389ad80b481086c7f23e50751e637ce 100755
--- a/scripts/bump-version.py
+++ b/scripts/bump-version.py
@@ -42,6 +42,6 @@ lines = open(vfile).readlines()
 for i, line in enumerate(lines):
   if line.startswith("From: registry.scicore.unibas.ch/schwede/openstructure:"):
     lines[i] = 'From: registry.scicore.unibas.ch/schwede/openstructure:'+\
-      '"%s"' % version_string
+      '%s' % version_string
     break
 open(vfile, "w").writelines(lines)
diff --git a/scripts/ost_config.in b/scripts/ost_config.in
index c8a170a32867eca70cac323aaf723f38f9d0a49a..b3e253c5c5e24fe424851d9ab7a5e68cc73237d4 100644
--- a/scripts/ost_config.in
+++ b/scripts/ost_config.in
@@ -69,7 +69,7 @@ if [ -n "$DNG_PROFILE" ]; then
     echo "Profiling activated using cProfile"
     pyexec="$pyexec#-m#cProfile#-s#cumulative#--"
   else 
-    echo "Profiling deactivated due to unkown profiler"
+    echo "Profiling deactivated due to unknown profiler"
   fi
 fi
 
diff --git a/singularity/Singularity b/singularity/Singularity
index 222fe694ea6657a943ed386ba0e8e078653c589f..9e445f865b89d6e3e1501eb2847720ca868b8005 100644
--- a/singularity/Singularity
+++ b/singularity/Singularity
@@ -1,5 +1,5 @@
 BootStrap: docker
-From: registry.scicore.unibas.ch/schwede/openstructure:"2.0.0"
+From: registry.scicore.unibas.ch/schwede/openstructure:2.0.0-bionic
 
 %post
 ##############################################################################