diff --git a/CMakeLists.txt b/CMakeLists.txt
index e438e4cb4542b2d8c0006c7c733341ba15143e73..4a46dc9b45b8d0cb4b1e0f5c87eb8dfa7811ce82 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -12,6 +12,15 @@ set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} ${PROJECT_SOURCE_DIR}/cmake_support)
 include(OST)
 
 
+if (CMAKE_COMPILER_IS_GNUCXX)  
+  exec_program(gcc ARGS --version OUTPUT_VARIABLE CMAKE_C_COMPILER_VERSION)
+  if(CMAKE_C_COMPILER_VERSION MATCHES ".*4\\.[5-9].*")
+    set(OST_GCC_45 true)
+  else()   
+    set(OST_GCC_45 false)  
+  endif()
+endif()
+
 option(USE_SHADER "whether to compile with shader support"
        OFF)
 option(USE_RPATH "embed rpath upon make install"
@@ -26,6 +35,8 @@ option(ENABLE_GFX "whether graphics support should be enabled"
       ON)
 option(ENABLE_IMG "whether the image processing module should be compiled"
        ON)
+option(ENABLE_INFO "whether openstructure should be compiled with support for the info library"
+       ON)
 option(USE_NUMPY "whether numpy support is added"
       OFF)
 option(USE_DOUBLE_PRECISION "whether to compile in double precision" 
@@ -51,6 +62,7 @@ if (FORTRAN_COMPILER)
 endif()
 
 
+
 if (PREFIX)
   set(CMAKE_INSTALL_PREFIX ${PREFIX})
 endif()
@@ -74,10 +86,20 @@ else()
   set(_DOUBLE_PREC OFF)
 endif()
 
+if (NOT ENABLE_INFO)
+  set(ENABLE_GFX OFF)
+endif()
+
 if (NOT ENABLE_GFX)
   set(ENABLE_GUI OFF)
 endif()
 
+if (ENABLE_INFO)
+  set(_INFO ON)
+else()
+  set(_INFO OFF)
+endif()
+
 if (ENABLE_GUI)
   set(_UI ON)
 else()
@@ -154,11 +176,26 @@ setup_compiler_flags()
 
 set(CMAKE_LIBRARY_OUTPUT_DIRECTORY)
 
+if (ENABLE_STATIC AND UNIX AND NOT APPLE)
+  set (CMAKE_FIND_LIBRARY_SUFFIXES .a)
+endif()
+
 setup_boost()
-        
-find_package(Qt4 4.5.0 REQUIRED)
-find_package(OpenGL REQUIRED)
-find_package(PNG REQUIRED)
+
+if (ENABLE_INFO)        
+  find_package(Qt4 4.5.0 REQUIRED)
+endif()
+
+if (ENABLE_GFX)
+  find_package(OpenGL REQUIRED)
+endif()
+
+if (ENABLE_IMG OR ENABLE_GFX)
+  find_package(PNG REQUIRED)
+else()
+  set (PNG_LIBRARY "")
+endif()
+
 find_package(Eigen 2.0.0 REQUIRED)
 find_package(Python 2.4 REQUIRED)
 
@@ -178,8 +215,14 @@ if (ENABLE_STATIC)
   find_package(Boost ${_BOOST_MIN_VERSION} 
                COMPONENTS filesystem system iostreams regex REQUIRED)
   find_package(ZLIB REQUIRED)
-  set(STATIC_LIBRARIES ${Boost_LIBRARIES} ${FFTW_LIBRARIES} ${TIFF_LIBRARIES} 
-      ${PNG_LIBRARIES} ${ZLIB_LIBRARIES})
+   
+  if (UNIX AND NOT APPLE)
+    set(STATIC_LIBRARIES ${Boost_LIBRARIES} ${FFTW_LIBRARIES} ${TIFF_LIBRARIES} 
+        ${PNG_LIBRARY} ${ZLIB_LIBRARY})
+  else ()
+    set(STATIC_LIBRARIES ${Boost_LIBRARIES} ${FFTW_LIBRARIES} ${TIFF_LIBRARIES} 
+        ${PNG_LIBRARY} ${ZLIB_LIBRARY})
+  endif()
 endif()
 
 if (ENABLE_GUI)
@@ -217,6 +260,10 @@ if (UNIX)
   endif() 
 endif()
 
+if (ENABLE_STATIC)
+  SET(CMAKE_SKIP_BUILD_RPATH TRUE)
+  SET(LINK_SEARCH_END_STATIC TRUE) 
+endif()
 
 add_subdirectory(modules)
 add_subdirectory(scripts)
@@ -231,6 +278,7 @@ message(STATUS
         "OpenStructure will be built with the following options:\n"
         "   Install Prefix                       (-DPREFIX) : ${CMAKE_INSTALL_PREFIX}\n"
         "   RPath in install                  (-DUSE_RPATH) : ${_USE_RPATH}\n"
+        "   Info support                    (-DENABLE_INFO) : ${_INFO}\n"
         "   Graphical interface              (-DENABLE_GUI) : ${_UI}\n"
         "   OpenGL support                   (-DENABLE_GFX) : ${_OPENGL}\n"
         "   Image Processing support         (-DENABLE_IMG) : ${_IMG}\n"
@@ -242,4 +290,5 @@ message(STATUS
         "   Compound Lib                   (-DCOMPOUND_LIB) : ${_COMP_LIB}\n"
         "   TMAlign and TMScore         (-DCOMPILE_TMTOOLS) : ${_TM_TOOLS}\n"
         "   Static Libraries              (-DENABLE_STATIC) : ${ENABLE_STATIC}\n"
-        "   Debian-style 'libexec' (-DDEBIAN_STYLE_LIBEXEC) : ${_DEBIAN_STYLE_LIBEXEC}")
+        "   Debian-style 'libexec' (-DDEBIAN_STYLE_LIBEXEC) : ${_DEBIAN_STYLE_LIBEXEC}" )
+
diff --git a/build_configs/buildconfig_arch b/build_configs/buildconfig_arch
new file mode 100644
index 0000000000000000000000000000000000000000..b0a6494db8715e33c8f0ae7a2f9cfb63c2f97392
--- /dev/null
+++ b/build_configs/buildconfig_arch
@@ -0,0 +1 @@
+set(PYTHON_BINARY "/usr/bin/python2"  CACHE PATH "")
diff --git a/build_configs/buildconfig_arch_static b/build_configs/buildconfig_arch_static
new file mode 100644
index 0000000000000000000000000000000000000000..15c3ef31600755c4b217e623492e06b58bb44b5e
--- /dev/null
+++ b/build_configs/buildconfig_arch_static
@@ -0,0 +1,4 @@
+set(PYTHON_BINARY "/usr/bin/python2"  CACHE PATH "")
+set(ZLIB_LIBRARY "/usr/lib/libz.a"  CACHE PATH "")
+set(PNG_LIBRARY "/usr/lib/libpng12.a"  CACHE PATH "")
+set(FFTW_LIBRARIES "/usr/lib/libfftw3f.a"  CACHE PATH "")
diff --git a/build_configs/buildconfig_bc2_locallibs b/build_configs/buildconfig_bc2_locallibs
new file mode 100644
index 0000000000000000000000000000000000000000..fbc7a614754b8fba6a35957ba4d71bbb4061380d
--- /dev/null
+++ b/build_configs/buildconfig_bc2_locallibs
@@ -0,0 +1,11 @@
+set(FFTW_INCLUDE_PATH "/import/bc2/soft/app/FFTW/current/Linux/include/" CACHE PATH "")
+set(FFTW_LIBRARIES "/import/bc2/soft/app/FFTW/current/Linux/lib/libfftw3f.so"  CACHE PATH "")
+set(Boost_COMPILER "-gcc41"  CACHE PATH "")
+set(PYTHON_ROOT "/import/bc2/soft/app/Python/current/Linux/"  CACHE PATH "")
+set(EIGEN2_INCLUDE_DIR "/import/bc2/soft/app/eigen/current/Linux/include/eigen2" CACHE PATH "")
+set(BOOST_ROOT "/import/bc2/soft/app/boost/current/Linux"  CACHE PATH "")
+set(QT_QMAKE_EXECUTABLE "/import/bc2/soft/app/Qt/current/Linux/bin/qmake" CACHE PATH "")
+set(COMPOUND_LIB "/import/bc2/home/schwede/GROUP/OpenStructure/ChemLib/compounds.chemlib" CACHE PATH "")
+set(TIFF_LIBRARY "${OST_LOCAL_LIBS}/lib/libtiff.so"  CACHE PATH "")
+set(TIFF_INCLUDE_DIR "${OST_LOCAL_LIBS}/include/" CACHE PATH "")
+set (CMAKE_BUILD_TYPE "Release" CACHE PATH "")
diff --git a/build_configs/buildconfig_bc2_static b/build_configs/buildconfig_bc2_static
new file mode 100644
index 0000000000000000000000000000000000000000..c26933d8ce996f93da782e919544f06312d57ff3
--- /dev/null
+++ b/build_configs/buildconfig_bc2_static
@@ -0,0 +1,11 @@
+set(FFTW_INCLUDE_PATH "/import/bc2/soft/app/FFTW/current/Linux/include/" CACHE PATH "")
+set(FFTW_LIBRARIES "/import/bc2/soft/app/FFTW/current/Linux/lib/libfftw3f.a"  CACHE PATH "")
+set(DL_LIBRARIES "/usr/lib64/libdl.a"  CACHE PATH "")
+set(PTHREAD_LIBRARIES "/usr/lib64/libpthread.a"  CACHE PATH "")
+set(ZLIB_LIBRARY "/usr/lib64/libz.a"  CACHE PATH "")
+set(Boost_COMPILER "-gcc41"  CACHE PATH "")
+set(PYTHON_ROOT "/import/bc2/soft/app/Python/current/Linux/"  CACHE PATH "")
+set(EIGEN2_INCLUDE_DIR "/import/bc2/soft/app/eigen/current/Linux/include/eigen2" CACHE PATH "")
+set(QT_QMAKE_EXECUTABLE "/import/bc2/soft/app/Qt/current/Linux/bin/qmake" CACHE PATH "")
+set(COMPOUND_LIB "/import/bc2/home/schwede/GROUP/OpenStructure/ChemLib/compounds.chemlib" CACHE PATH "")
+set (CMAKE_BUILD_TYPE "Release" CACHE PATH "")
diff --git a/build_configs/buildconfig_bc2_static_locallibs b/build_configs/buildconfig_bc2_static_locallibs
new file mode 100644
index 0000000000000000000000000000000000000000..c4ac3df6f76cfc58b2bfc41e5afcdb6a41edfddf
--- /dev/null
+++ b/build_configs/buildconfig_bc2_static_locallibs
@@ -0,0 +1,13 @@
+set(FFTW_INCLUDE_PATH "/import/bc2/soft/app/FFTW/current/Linux/include/" CACHE PATH "")
+set(FFTW_LIBRARIES "/import/bc2/soft/app/FFTW/current/Linux/lib/libfftw3f.a"  CACHE PATH "")
+set(DL_LIBRARIES "/usr/lib64/libdl.a"  CACHE PATH "")
+set(PTHREAD_LIBRARIES "/usr/lib64/libpthread.a"  CACHE PATH "")
+set(ZLIB_LIBRARY "/usr/lib64/libz.a"  CACHE PATH "")
+set(Boost_COMPILER "-gcc41"  CACHE PATH "")
+set(PYTHON_ROOT "/import/bc2/soft/app/Python/current/Linux/"  CACHE PATH "")
+set(EIGEN2_INCLUDE_DIR "/import/bc2/soft/app/eigen/current/Linux/include/eigen2" CACHE PATH "")
+set(QT_QMAKE_EXECUTABLE "/import/bc2/soft/app/Qt/current/Linux/bin/qmake" CACHE PATH "")
+set(COMPOUND_LIB "/import/bc2/home/schwede/GROUP/OpenStructure/ChemLib/compounds.chemlib" CACHE PATH "")
+set(TIFF_LIBRARY "${OST_LOCAL_LIBS}/lib/libtiff.a"  CACHE PATH "")
+set(TIFF_INCLUDE_DIR "${OST_LOCAL_LIBS}/include/" CACHE PATH "")
+set (CMAKE_BUILD_TYPE "Release" CACHE PATH "")
diff --git a/cmake_support/OST.cmake b/cmake_support/OST.cmake
index 6d3fff7edfd000415a2166ecb8768563779cc891..06e352919217f98e380ab796e085c3e1f77d36b7 100644
--- a/cmake_support/OST.cmake
+++ b/cmake_support/OST.cmake
@@ -142,7 +142,9 @@ macro(module)
             "invalid use of module(): a module name must be provided")
   endif()
 
-
+  if (ENABLE_STATIC AND _ARG_NO_STATIC)
+    return()
+  endif()
   if (_ARG_HEADER_OUTPUT_DIR)
     set(_HEADER_OUTPUT_DIR ${_ARG_HEADER_OUTPUT_DIR})
   else()
@@ -177,8 +179,11 @@ macro(module)
         list(APPEND _ABS_SOURCE_NAMES "${CMAKE_CURRENT_SOURCE_DIR}/${_SOURCE}")
       endif()
     endforeach()
-    add_library(${_LIB_NAME} SHARED ${_ABS_SOURCE_NAMES})
-
+    if (ENABLE_STATIC AND NOT _ARG_NO_STATIC)
+      add_library(${_LIB_NAME} STATIC ${_ABS_SOURCE_NAMES})
+    else()
+      add_library(${_LIB_NAME} SHARED ${_ABS_SOURCE_NAMES})
+    endif()
     set_target_properties(${_LIB_NAME} 
                           PROPERTIES OUTPUT_NAME ${_LIB_NAME}
                                      PROJECT_LABEL ${_ARG_NAME}
@@ -194,25 +199,6 @@ macro(module)
                           LIBRARY_OUTPUT_DIRECTORY ${LIB_STAGE_PATH}
                           ARCHIVE_OUTPUT_DIRECTORY ${LIB_STAGE_PATH}
                           RUNTIME_OUTPUT_DIRECTORY ${LIB_STAGE_PATH})
-    if (ENABLE_STATIC AND NOT _ARG_NO_STATIC)
-      add_library(${_LIB_NAME}_static STATIC ${_ABS_SOURCE_NAMES})
-      set_target_properties(${_LIB_NAME}_static
-                            PROPERTIES OUTPUT_NAME ${_LIB_NAME}
-                                       PROJECT_LABEL ${_ARG_NAME}
-                                       EchoString   ${_ARG_NAME}
-                                       MODULE_DEPS "${_ARG_DEPENDS_ON}")
-      get_target_property(_DEFS ${_LIB_NAME}_static COMPILE_DEFINITIONS)
-      set_target_properties(${_LIB_NAME}_static PROPERTIES
-                            COMPILE_DEFINITIONS OST_MODULE_${_UPPER_LIB_NAME})
-      set_target_properties(${_LIB_NAME}_static PROPERTIES
-                            LIBRARY_OUTPUT_DIRECTORY ${LIB_STAGE_PATH}
-                            ARCHIVE_OUTPUT_DIRECTORY ${LIB_STAGE_PATH}
-                            RUNTIME_OUTPUT_DIRECTORY ${LIB_STAGE_PATH})
-      foreach(_DEPENDENCY ${_ARG_DEPENDS_ON})
-        target_link_libraries(${_LIB_NAME}_static ${_DEPENDENCY}_static)
-      endforeach()
-      target_link_libraries(${_LIB_NAME}_static ${ZLIB_LIBRARIES} ${_ARG_LINK})
-    endif()
     if (APPLE)
       set_target_properties(${_LIB_NAME} PROPERTIES
                             LINK_FLAGS "-Wl,-rpath,@@loader_path"
@@ -222,7 +208,11 @@ macro(module)
       #set_target_properties(${_LIB_NAME} PROPERTIES PREFIX "../")
       install(TARGETS ${_LIB_NAME} ARCHIVE DESTINATION "${LIB_DIR}")
     else()
-      install(TARGETS ${_LIB_NAME} LIBRARY DESTINATION "${LIB_DIR}")
+      if (ENABLE_STATIC)
+        install(TARGETS ${_LIB_NAME} ARCHIVE DESTINATION "${LIB_DIR}")
+      else()
+        install(TARGETS ${_LIB_NAME} LIBRARY DESTINATION "${LIB_DIR}")
+      endif()
     endif()                          
     if (_ARG_LINK)
       target_link_libraries(${_LIB_NAME} ${_ARG_LINK})
@@ -230,6 +220,10 @@ macro(module)
     foreach(_DEPENDENCY ${_ARG_DEPENDS_ON})
       target_link_libraries(${_LIB_NAME} ${_DEPENDENCY})
     endforeach()
+    if (ENABLE_STATIC)
+      target_link_libraries(${_LIB_NAME} ${STATIC_LIBRARIES})
+    endif()
+  
   else()
     add_custom_target("${_LIB_NAME}" ALL)
     set_target_properties("${_LIB_NAME}" PROPERTIES HEADER_ONLY 1 
@@ -302,13 +296,23 @@ macro(executable)
   if (_ARG_LINK)
     target_link_libraries(${_ARG_NAME} ${_ARG_LINK})
   endif()
+  foreach(_DEP ${_ARG_DEPENDS_ON})
+    target_link_libraries(${_ARG_NAME} ${_DEP})
+  endforeach()
   if (ENABLE_STATIC AND _ARG_STATIC)
-    set(TARGET_SUFFIX _static)
     target_link_libraries(${_ARG_NAME} ${STATIC_LIBRARIES})
+    if (UNIX AND NOT APPLE)
+      if (OST_GCC_45)    
+        set_target_properties(${_ARG_NAME}
+                              PROPERTIES LINK_SEARCH_END_STATIC TRUE  
+                              LINK_FLAGS "-static-libgcc -static-libstdc++ -static -pthread")
+      else()
+        set_target_properties(${_ARG_NAME}
+                              PROPERTIES LINK_SEARCH_END_STATIC TRUE  
+                              LINK_FLAGS "-static-libgcc -static -pthread")
+      endif()        
+    endif()
   endif()
-  foreach(_DEP ${_ARG_DEPENDS_ON})
-    target_link_libraries(${_ARG_NAME} ${_DEP}${TARGET_SUFFIX})
-  endforeach()
   install(TARGETS ${_ARG_NAME} DESTINATION bin)
 endmacro()
 
@@ -338,11 +342,13 @@ macro(executable_libexec)
     target_link_libraries(${_ARG_NAME} ${_ARG_LINK})
   endif()
   if (ENABLE_STATIC AND _ARG_STATIC)
-    set(TARGET_SUFFIX _static)
     target_link_libraries(${_ARG_NAME} ${STATIC_LIBRARIES})
+    set_target_properties(${_ARG_NAME}
+                          PROPERTIES LINK_SEARCH_END_STATIC TRUE)  
+
   endif()
   foreach(_DEP ${_ARG_DEPENDS_ON})
-    target_link_libraries(${_ARG_NAME} ${_DEP}${TARGET_SUFFIX})
+    target_link_libraries(${_ARG_NAME} ${_DEP})
   endforeach()
   install(TARGETS ${_ARG_NAME} DESTINATION ${LIBEXEC_PATH})
 endmacro()
@@ -472,6 +478,9 @@ macro(pymod)
   if (NOT _ARG_NAME)
     message(FATAL_ERROR "invalid use of pymod(): a name must be provided")
   endif()
+  if (ENABLE_STATIC)
+    return()
+  endif()
   if (_ARG_OUTPUT_DIR)
     set(PYMOD_DIR "openstructure/${_ARG_OUTPUT_DIR}")
   else()
@@ -499,14 +508,18 @@ macro(pymod)
     endif()
     target_link_libraries("_${_LIB_NAME}" ${_PARENT_LIB_NAME} 
                           ${PYTHON_LIBRARIES} ${BOOST_PYTHON_LIBRARIES})
-    if (_USE_RPATH)
-      set_target_properties("_${_LIB_NAME}"
-                            PROPERTIES LIBRARY_OUTPUT_DIRECTORY ${PYMOD_STAGE_DIR}
-                            INSTALL_RPATH "${CMAKE_INSTALL_PREFIX}/${LIB_DIR}")
-    else()
-      set_target_properties("_${_LIB_NAME}"
-                            PROPERTIES LIBRARY_OUTPUT_DIRECTORY ${PYMOD_STAGE_DIR}
-                            INSTALL_RPATH "")
+
+    set_target_properties("_${_LIB_NAME}"
+                          PROPERTIES LIBRARY_OUTPUT_DIRECTORY ${PYMOD_STAGE_DIR})
+ 
+    if (NOT ENABLE_STATIC)
+      if (_USE_RPATH)
+        set_target_properties("_${_LIB_NAME}"
+                              PROPERTIES INSTALL_RPATH "${CMAKE_INSTALL_PREFIX}/${LIB_DIR}")
+      else()
+        set_target_properties("_${_LIB_NAME}"
+                              PROPERTIES INSTALL_RPATH "")
+      endif()
     endif()
     if (APPLE)
       file(RELATIVE_PATH _REL_PATH "${PYMOD_STAGE_DIR}" "${LIB_STAGE_PATH}")
@@ -582,7 +595,6 @@ macro(pymod)
        add_dependencies("_${_LIB_NAME}" "_${dep}")
     endforeach()
   endif()
-
 endmacro()
 
 add_custom_target(check)
@@ -845,7 +857,7 @@ macro(setup_compiler_flags)
     endif()
   endif()
 endmacro()
-set(_BOOST_MIN_VERSION 1.37)
+set(_BOOST_MIN_VERSION 1.31)
 
 macro(setup_boost)
   find_package(Boost ${_BOOST_MIN_VERSION} COMPONENTS python REQUIRED)
diff --git a/modules/base/pymod/CMakeLists.txt b/modules/base/pymod/CMakeLists.txt
index 0e9213ba1cb9795b86e212c36d4e0fa8cc20fe92..6a011018fb032d44e07680e214e9bfcb5c14e454 100644
--- a/modules/base/pymod/CMakeLists.txt
+++ b/modules/base/pymod/CMakeLists.txt
@@ -4,7 +4,8 @@ set(OST_BASE_PYMOD_SOURCES
   export_range.cc
   export_units.cc
 )
-
-pymod(NAME base OUTPUT_DIR ost 
-      CPP ${OST_BASE_PYMOD_SOURCES} 
-      PY __init__.py settings.py stutil.py table.py xmlrunner.py testutils.py)
+if (NOT ENABLE_STATIC)
+  pymod(NAME base OUTPUT_DIR ost 
+        CPP ${OST_BASE_PYMOD_SOURCES} 
+        PY __init__.py settings.py stutil.py table.py xmlrunner.py testutils.py)
+endif() 
diff --git a/modules/config/CMakeLists.txt b/modules/config/CMakeLists.txt
index 617aa51c5b87a2dc03b95d7a92730b097b31d371..1e637d14470c6aa77af76cdd6c58e5ad5561c180 100644
--- a/modules/config/CMakeLists.txt
+++ b/modules/config/CMakeLists.txt
@@ -21,7 +21,6 @@ if (USE_NUMPY)
 else()
   set(numpy_support 0)
 endif()
-
 if (PROFILE)
   set(profiling_enabled 1)
 else()
@@ -62,6 +61,11 @@ if (_DEBIAN_STYLE_LIBEXEC)
 else()
   set(debian_style_libexec 0)
 endif()
+if (ENABLE_INFO)
+  set(info_enabled 1)
+else()
+  set(info_enabled 0)
+endif()
 
 set(config_hh_generator "CMake")
 set(CONFIG_HH_FILE "${CMAKE_CURRENT_SOURCE_DIR}/config.hh")
diff --git a/modules/config/config.hh.in b/modules/config/config.hh.in
index a9e33adca707baed39710d3c75f63ca2b210bf0b..c2242500ee2e528294c5beb77a5c650f9adfe288 100644
--- a/modules/config/config.hh.in
+++ b/modules/config/config.hh.in
@@ -33,5 +33,6 @@
 #define OST_FFT_USE_THREADS @fftw_use_threads@
 #define OST_NUMPY_SUPPORT_ENABLED @numpy_support@
 #define OST_DEBIAN_STYLE_LIBEXEC @debian_style_libexec@
+#define OST_INFO_ENABLED @info_enabled@
 
 #endif
diff --git a/modules/conop/pymod/CMakeLists.txt b/modules/conop/pymod/CMakeLists.txt
index 650939bfd9aea21dac1925adadf6866f4db37e65..c1bf89d0e29cda36f4b4bcb9b0b357449aaa8ad7 100644
--- a/modules/conop/pymod/CMakeLists.txt
+++ b/modules/conop/pymod/CMakeLists.txt
@@ -8,4 +8,6 @@ set(OST_CONOP_PYMOD_SOURCES
   export_ring_finder.cc
 )
 
-pymod(NAME conop CPP ${OST_CONOP_PYMOD_SOURCES} PY __init__.py cleanup.py)
+if (NOT ENABLE_STATIC)
+  pymod(NAME conop CPP ${OST_CONOP_PYMOD_SOURCES} PY __init__.py cleanup.py)
+endif()
diff --git a/modules/conop/pymod/export_builder.cc b/modules/conop/pymod/export_builder.cc
index 4bd468f36b23180c726f661f34a89227ee7168c0..1897983f90b7c4065316633db738732c0ba4b93f 100644
--- a/modules/conop/pymod/export_builder.cc
+++ b/modules/conop/pymod/export_builder.cc
@@ -36,6 +36,8 @@ void export_Builder() {
     .add_property("dialect", &Builder::GetDialect, &Builder::SetDialect)
     .add_property("strict_hydrogens", &Builder::GetStrictHydrogenMode, 
                   &Builder::SetStrictHydrogenMode)
+    .add_property("bond_feasibility_check", &Builder::GetBondFeasibilityCheck, 
+                  &Builder::SetBondFeasibilityCheck)
     .def("GetDialect", &Builder::GetDialect)
     .def("SetDialect", &Builder::SetDialect)
     .def("CompleteAtoms", &Builder::CompleteAtoms)
@@ -48,6 +50,8 @@ void export_Builder() {
     .def("AssignTorsionsToResidue", &Builder::AssignTorsionsToResidue)
     .def("FillAtomProps", &Builder::FillAtomProps)
     .def("IsResidueComplete", &Builder::IsResidueComplete)
+    .def("SetBondFeasibilityFlag", &Builder::SetBondFeasibilityCheck)
+    .def("GetBondFeasibilityFlag", &Builder::GetBondFeasibilityCheck)    
   ;
 
   class_<HeuristicBuilder, bases<Builder> >("HeuristicBuilder", init<>())
@@ -56,5 +60,6 @@ void export_Builder() {
                                             init<const CompoundLibPtr&>())
      .add_property("compound_lib", &RuleBasedBuilder::GetCompoundLib)
      .def("GetUnknownAtoms", &RuleBasedBuilder::GetUnknownAtoms)
+ 
   ;
 }
diff --git a/modules/conop/src/builder.hh b/modules/conop/src/builder.hh
index f912aba702cd075768da77c1c837f558877f3fda..4b915681a51d2d47c6d36fe449424f5b189de772 100644
--- a/modules/conop/src/builder.hh
+++ b/modules/conop/src/builder.hh
@@ -54,7 +54,7 @@ typedef enum {
 class DLLEXPORT_OST_CONOP Builder {
 public:
   
-  Builder(): dialect_(PDB_DIALECT), strict_(false) { }
+  Builder(): dialect_(PDB_DIALECT), strict_(false), bond_feasibility_check_(true) { }
   virtual ~Builder();
   
   ///  \brief add any missing atoms to the residue based on its key,
@@ -143,9 +143,17 @@ public:
   /// |brief Connect \p atom with all atoms for whith IsBondFeasible() and 
   ///    AreResiduesConsecutive() returns true
   void DistanceBasedConnect(mol::AtomHandle atom);
+   
+  /// \brief Set bond feasibility check flag
+  void SetBondFeasibilityCheck(bool b_feas_flag) { bond_feasibility_check_ = b_feas_flag; }
+  
+  /// \brief Get bond feasibility check flag
+  bool GetBondFeasibilityCheck() const { return bond_feasibility_check_; }  
+  
 private:
   Dialect dialect_;
   bool    strict_;
+  bool    bond_feasibility_check_; 
 };
 
 
diff --git a/modules/conop/src/heuristic_builder.cc b/modules/conop/src/heuristic_builder.cc
index 89b8ad8e1720754b0941e8b1a7d8977e252c14fc..458370078ea9171766bee2013506a170d0ac869d 100644
--- a/modules/conop/src/heuristic_builder.cc
+++ b/modules/conop/src/heuristic_builder.cc
@@ -209,19 +209,36 @@ void HeuristicBuilder::ConnectivityFromAtomNames(const mol::ResidueHandle& res,
                 << it2->GetName() << ") in connectivity table of "
                 << res.GetKey() << "... ");
        int conn=centry.Check(it1->GetName(),it2->GetName());
-       if (conn==1 && this->IsBondFeasible(*it1, *it2)) {
-         LOG_TRACE( "found");
-         editor.Connect(*it1,*it2);
-       } else if(conn==2 && this->IsBondFeasible(*it2, *it1)) {
-         LOG_TRACE( "found (reversed)");
-         editor.Connect(*it2,*it1);
+       if (conn==1) {
+	 if (this->GetBondFeasibilityCheck()==false) {
+           LOG_TRACE( "found");
+           editor.Connect(*it1,*it2);
+	 } else {  
+	   if (this->IsBondFeasible(*it1, *it2)) {
+	     LOG_TRACE( "found");
+             editor.Connect(*it1,*it2);
+	   } else {
+             LOG_TRACE( "not found");
+	   }  
+	 }	 
+       } else if (conn==2) {
+	 if (this->GetBondFeasibilityCheck()==false) {
+             LOG_TRACE( "found (reversed)");
+             editor.Connect(*it2,*it1);
+	 } else {
+           if(this->IsBondFeasible(*it2, *it1)) {
+             LOG_TRACE( "found (reversed)");             
+             editor.Connect(*it2,*it1);
+           }
+         }  
        } else {
-         LOG_TRACE( "not found");
+          LOG_TRACE( "not found");
        }
      }
    } else {
      unknown_atoms.push_back(*it1);
-   }
+     LOG_TRACE( "atom not found, pushing it to unknown atoms");
+   }	 
  }
 }
 
diff --git a/modules/conop/src/rule_based_builder.cc b/modules/conop/src/rule_based_builder.cc
index 35709c287d61181fa0beb5c5920a48ce7e8326b3..33d33c667faebb47593eebe53f28285c448b1956 100644
--- a/modules/conop/src/rule_based_builder.cc
+++ b/modules/conop/src/rule_based_builder.cc
@@ -237,12 +237,20 @@ void RuleBasedBuilder::ConnectAtomsOfResidue(mol::ResidueHandle rh)
       const BondSpec& bond=*j;
       mol::AtomHandle a1=this->LocateAtom(atoms, bond.atom_one);
       mol::AtomHandle a2=this->LocateAtom(atoms, bond.atom_two);
-      if (a1.IsValid() && a2.IsValid() && this->IsBondFeasible(a1, a2)) {
-        if (this->GetStrictHydrogenMode() && 
-            (a1.GetElement()=="H" || a2.GetElement()=="D")) {
-          continue;
+      if (a1.IsValid() && a2.IsValid()) { 
+	if (this->GetBondFeasibilityCheck()==false) {
+          if (this->GetStrictHydrogenMode() && (a1.GetElement()=="H" || a2.GetElement()=="D")) {
+            continue;
+          }
+          e.Connect(a1, a2, bond.order);
+	} else { 
+	  if (IsBondFeasible(a1, a2)) {
+	    if (this->GetStrictHydrogenMode() && (a1.GetElement()=="H" || a2.GetElement()=="D")) {
+              continue;
+	    }
+            e.Connect(a1, a2, bond.order);
+	  }
         }
-        e.Connect(a1, a2, bond.order);
       }
   }
   for (mol::AtomHandleList::iterator i=atoms.begin(), e=atoms.end(); i!=e; ++i) {
diff --git a/modules/conop/src/rule_based_builder.hh b/modules/conop/src/rule_based_builder.hh
index 9ecc45c101cbbb2c6777ff7fb985bb2e9e921db1..71a6fd03453ba9c418a6e39d8c0e011161f13be6 100644
--- a/modules/conop/src/rule_based_builder.hh
+++ b/modules/conop/src/rule_based_builder.hh
@@ -109,7 +109,7 @@ public:
   /// by ignoring it or by inserting a dummy atom.
   virtual void OnMissingAtom(const mol::ResidueHandle& residue,
                               const String& atom_name) { }
-
+                              
   /// \brief Fill in missing information based on atom name.
   virtual void FillAtomProps(mol::AtomHandle atom, const AtomSpec& spec);
 
@@ -123,6 +123,7 @@ public:
   virtual bool IsResidueComplete(const mol::ResidueHandle& residue);
   
   CompoundLibPtr GetCompoundLib() const { return compound_lib_; }
+    
 private:
   CompoundLibPtr      compound_lib_;
   CompoundPtr         last_compound_;
@@ -139,7 +140,6 @@ private:
 
   void AssignBackBoneTorsionsToResidue(mol::ResidueHandle residue);
 
-
 };
 
 typedef boost::shared_ptr<RuleBasedBuilder> RuleBasedBuilderPtr;
diff --git a/modules/conop/tests/test_heuristic_builder.cc b/modules/conop/tests/test_heuristic_builder.cc
index 4220f3110ca1af0ecec5acc183dba6d1ad5b5f11..0e3a811ae922d0d8375fe98ab96163765f5766f4 100644
--- a/modules/conop/tests/test_heuristic_builder.cc
+++ b/modules/conop/tests/test_heuristic_builder.cc
@@ -65,6 +65,21 @@ ResidueHandle make_leu(ChainHandle chain)
   return res;
 }
 
+ResidueHandle make_defective_leu(ChainHandle chain) 
+{
+  XCSEditor e=chain.GetEntity().EditXCS();  
+  ResidueHandle res=e.AppendResidue(chain, "LEU");
+
+  e.InsertAtom(res, "N", geom::Vec3(19.003,32.473,60.366));
+  e.InsertAtom(res, "CA", geom::Vec3(18.330,32.402,61.664));
+  e.InsertAtom(res, "C", geom::Vec3(17.884,33.787,62.117));
+  e.InsertAtom(res, "O", geom::Vec3(17.853,34.091,63.308));
+  e.InsertAtom(res, "CB", geom::Vec3(19.269,31.793,102.710));
+  e.InsertAtom(res, "CG", geom::Vec3(19.695,30.340,62.501));
+  e.InsertAtom(res, "CD1", geom::Vec3(20.585,29.897,63.648));
+  e.InsertAtom(res, "CD2", geom::Vec3(18.461,29.459,62.420));
+  return res;
+}
 
 void verify_connectivity_x(const ResidueHandle& res) 
 {
@@ -154,12 +169,25 @@ BOOST_AUTO_TEST_CASE(name_based_connect)
     heuristic_builder.FillAtomProps(*i);
   }
 
+  EntityHandle de=CreateEntity();
+  ChainHandle dc=de.EditXCS().InsertChain("A");
+  ResidueHandle dile=make_defective_leu(dc);
+  HeuristicBuilder dheuristic_builder;
+  dheuristic_builder.SetBondFeasibilityCheck(false);
+  for (AtomHandleIter i=de.AtomsBegin(),x=de.AtomsEnd(); i!=x; ++i) {
+    dheuristic_builder.FillAtomProps(*i);
+  }
+   
   BOOST_MESSAGE("running distance based checks on arginine");
   heuristic_builder.ConnectAtomsOfResidue(arg);
   verify_connectivity(arg);
   BOOST_MESSAGE("running distance based checks on leu");
   heuristic_builder.ConnectAtomsOfResidue(ile);
   verify_connectivity(ile);
+  
+  BOOST_MESSAGE("running distance based checks on defective leu");
+  dheuristic_builder.ConnectAtomsOfResidue(dile);
+  verify_connectivity(dile);  
 }
 
 BOOST_AUTO_TEST_CASE(test_assign_torsions){
diff --git a/modules/conop/tests/test_rule_based_builder.cc b/modules/conop/tests/test_rule_based_builder.cc
index 0bc08d4047027a9d7895a6ae6e824b4358155ff0..50e34860a606912aa978fc3429dc1b1f87c2656a 100644
--- a/modules/conop/tests/test_rule_based_builder.cc
+++ b/modules/conop/tests/test_rule_based_builder.cc
@@ -119,6 +119,35 @@ ResidueHandle make_uracil2(ChainHandle chain)
   return res;
 }
 
+ResidueHandle make_defective_uracil2(ChainHandle chain) 
+{
+  XCSEditor e=chain.GetEntity().EditXCS();
+  ResidueHandle res = e.AppendResidue(chain, "U");
+
+  e.InsertAtom(res, "P",   geom::Vec3(16.249, 28.254, 44.759));
+  e.InsertAtom(res, "OP1", geom::Vec3(16.654, 28.055, 46.181));
+  e.InsertAtom(res, "OP2", geom::Vec3(17.115, 27.731, 43.656));
+  e.InsertAtom(res, "O5'", geom::Vec3(14.826, 27.572, 44.574));
+  e.InsertAtom(res, "C5'", geom::Vec3(14.711, 26.206, 44.216));
+  e.InsertAtom(res, "C4'", geom::Vec3(13.279, 25.889, 43.887));
+  e.InsertAtom(res, "O4'", geom::Vec3(12.832, 26.793, 42.838));
+  e.InsertAtom(res, "C3'", geom::Vec3(13.155, 24.434, 43.329));
+  e.InsertAtom(res, "O3'", geom::Vec3(12.269, 23.625, 44.098));
+  e.InsertAtom(res, "C2'", geom::Vec3(12.871, 24.595, 41.875));
+  e.InsertAtom(res, "O2'", geom::Vec3(11.811, 23.752, 41.462));
+  e.InsertAtom(res, "C1'", geom::Vec3(12.424, 26.056, 41.694));
+  e.InsertAtom(res, "N1",  geom::Vec3(13.030, 26.692, 40.497));
+  e.InsertAtom(res, "C2",  geom::Vec3(12.517, 26.365, 39.228));
+  e.InsertAtom(res, "O2",  geom::Vec3(11.579, 25.594, 39.068));
+  e.InsertAtom(res, "N3",  geom::Vec3(13.141, 26.987, 38.161));
+  e.InsertAtom(res, "C4",  geom::Vec3(14.197, 27.888, 38.210));
+  e.InsertAtom(res, "O4",  geom::Vec3(14.627, 28.368, 37.156));
+  e.InsertAtom(res, "C5",  geom::Vec3(14.671, 28.189, 39.542));
+  e.InsertAtom(res, "C6",  geom::Vec3(14.087, 27.597, 80.612));
+
+  return res;
+}
+
 void verify_nucleotide_connectivity(const ResidueHandle& res) 
 {
   BOOST_CHECK(BondExists(res.FindAtom("P"),
@@ -217,16 +246,28 @@ BOOST_AUTO_TEST_CASE(nucleotide_based_connect)
   }
   RuleBasedBuilder rb_builder = RuleBasedBuilder(compound_lib);
 
+  RuleBasedBuilder drb_builder = RuleBasedBuilder(compound_lib);
+  drb_builder.SetBondFeasibilityCheck(false);
+  
   EntityHandle e=CreateEntity();
   ChainHandle c=e.EditXCS().InsertChain("A");
   ResidueHandle c0=make_cytosine(c);
   ResidueHandle u1=make_uracil1(c);
   ResidueHandle u2=make_uracil2(c);
+  
+  EntityHandle de=CreateEntity();  
+  ChainHandle dc=de.EditXCS().InsertChain("A");
+  ResidueHandle du2=make_defective_uracil2(dc);
+
 
   for (AtomHandleIter i=e.AtomsBegin(),x=e.AtomsEnd(); i!=x; ++i) {
     rb_builder.FillAtomProps(*i);
   }
 
+  for (AtomHandleIter i=de.AtomsBegin(),x=de.AtomsEnd(); i!=x; ++i) {
+    drb_builder.FillAtomProps(*i);
+  }
+  
   // running positive test
   BOOST_MESSAGE("running distance based checks on cytosine");
   rb_builder.ConnectAtomsOfResidue(c0);
@@ -247,6 +288,12 @@ BOOST_AUTO_TEST_CASE(nucleotide_based_connect)
   BOOST_MESSAGE("connecting cytosine to second uracil");
   rb_builder.ConnectResidueToNext(c0, u2);
   verify_nucleotide_nolink(c0, u2);
+  
+  // running positive test
+  BOOST_MESSAGE("running distance based checks on defective uracil");
+  drb_builder.ConnectAtomsOfResidue(du2);
+  verify_nucleotide_connectivity(du2);
+  
 }
 
 BOOST_AUTO_TEST_SUITE_END( )
diff --git a/modules/db/src/CMakeLists.txt b/modules/db/src/CMakeLists.txt
index 7ccafdebd3bd5c0dbea2e72ebef42f05c066af08..8da34460be841e381308fcff5e6ca7e47cd59115 100644
--- a/modules/db/src/CMakeLists.txt
+++ b/modules/db/src/CMakeLists.txt
@@ -12,7 +12,8 @@ sqlite3.c
 
 module(NAME db SOURCES ${OST_DB_SOURCES} HEADERS ${OST_DB_HEADERS} 
        DEPENDS_ON ost_base)
+add_definitions(-DSQLITE_OMIT_LOAD_EXTENSION) 
 if(WIN32)
   set_target_properties(ost_db PROPERTIES LINK_FLAGS "/DEF:sqlite3.def")
   add_definitions(/DSQLITE_ENABLE_COLUMN_METADATA)
-endif(WIN32)
\ No newline at end of file
+endif(WIN32)
diff --git a/modules/geom/pymod/CMakeLists.txt b/modules/geom/pymod/CMakeLists.txt
index 240dd87a2465360ea53b669be92eb28ea8b2898a..f79aeac4c2f9c8c127e28b0071c0ef502ba0ac38 100644
--- a/modules/geom/pymod/CMakeLists.txt
+++ b/modules/geom/pymod/CMakeLists.txt
@@ -16,4 +16,6 @@ set(OST_GEOM_PYMOD_SOURCES
   export_quat.cc
 )
 
-pymod(NAME geom CPP ${OST_GEOM_PYMOD_SOURCES} PY __init__.py)
\ No newline at end of file
+if (NOT ENABLE_STATIC)
+  pymod(NAME geom CPP ${OST_GEOM_PYMOD_SOURCES} PY __init__.py)
+endif()
diff --git a/modules/img/alg/pymod/CMakeLists.txt b/modules/img/alg/pymod/CMakeLists.txt
index c257040e5f976609bd7c0c13469690c2260b758e..be68daec5e5a2446bd3a6548ae34b59cc4884332 100644
--- a/modules/img/alg/pymod/CMakeLists.txt
+++ b/modules/img/alg/pymod/CMakeLists.txt
@@ -6,5 +6,7 @@ export_transcendentals.cc
 export_polar.cc
 )
 
-pymod(NAME img_alg OUTPUT_DIR ost/img/alg CPP ${OST_IMG_ALG_PYMOD_SOURCES}
-      PY __init__.py)
+if (NOT ENABLE_STATIC)
+  pymod(NAME img_alg OUTPUT_DIR ost/img/alg CPP ${OST_IMG_ALG_PYMOD_SOURCES}
+        PY __init__.py)
+endif()
diff --git a/modules/img/alg/src/CMakeLists.txt b/modules/img/alg/src/CMakeLists.txt
index 5dc212da9f112a9eed2dafc53eb187254a550a95..a49b80125f11de0531412e7fd2929577669aa647 100644
--- a/modules/img/alg/src/CMakeLists.txt
+++ b/modules/img/alg/src/CMakeLists.txt
@@ -94,7 +94,9 @@ line_average.hh
 rscrosscorr.hh
 )
 
+if(ENABLE_INFO)
 include(${QT_USE_FILE})
+endif()
 module(NAME img_alg SOURCES "${OST_IMG_ALG_SOURCES}" 
        HEADERS "${OST_IMG_ALG_HEADERS}" 
        HEADER_OUTPUT_DIR ost/img/alg
diff --git a/modules/img/alg/src/fft.cc b/modules/img/alg/src/fft.cc
index 84ac57b19bed1eda916653ca4a44b355c908892f..49fc3f6260ffdb986a3cb6f91a7da890516b2405 100644
--- a/modules/img/alg/src/fft.cc
+++ b/modules/img/alg/src/fft.cc
@@ -25,8 +25,12 @@
 #include <boost/shared_ptr.hpp>
 
 #include <fftw3.h>
+#if OST_INFO_ENABLED
 #include <QThread>
-
+#define IDEAL_NUMBER_OF_THREADS() QThread::idealThreadCount()
+#else
+#define IDEAL_NUMBER_OF_THREADS() 1
+#endif
 #include <ost/message.hh>
 #include <ost/img/value_util.hh>
 #include <ost/img/image_state/image_state_def.hh>
@@ -130,7 +134,7 @@ reinterpret_cast<OST_FFTW_fftw_complex*>(out_state->Data().GetData());
   for(size_t i=0;i<block_count;i++) {
     std::copy(&in_ptr[i*src_size],&in_ptr[(i+1)*src_size],&fftw_in[i*2*dst_size]);
   }
-  OST_FFTW_fftw_plan_with_nthreads(std::max<int>(1,QThread::idealThreadCount()));
+  OST_FFTW_fftw_plan_with_nthreads(std::max<int>(1,IDEAL_NUMBER_OF_THREADS()));
   OST_FFTW_fftw_plan plan = OST_FFTW_fftw_plan_dft_r2c(rank,n,
 				     fftw_in,fftw_out,
 				     FFTW_ESTIMATE);
@@ -213,7 +217,7 @@ ImageStateBasePtr FFTFnc::VisitState<Complex,HalfFrequencyDomain>(const ComplexH
   Real* fftw_out = reinterpret_cast<Real*>(out_ptr);
   
   assert(sizeof(OST_FFTW_fftw_complex)==sizeof(Complex));
-  OST_FFTW_fftw_plan_with_nthreads(std::max<int>(1,QThread::idealThreadCount()));
+  OST_FFTW_fftw_plan_with_nthreads(std::max<int>(1,IDEAL_NUMBER_OF_THREADS()));
   OST_FFTW_fftw_complex* fftw_in =
 reinterpret_cast<OST_FFTW_fftw_complex*>(out_ptr);
 
@@ -259,7 +263,7 @@ ImageStateBasePtr FFTFnc::VisitState<Complex,SpatialDomain>(const ComplexSpatial
 reinterpret_cast<OST_FFTW_fftw_complex*>(out_state->Data().GetData());
 
   // in place transform
-  OST_FFTW_fftw_plan_with_nthreads(std::max<int>(1,QThread::idealThreadCount()));
+  OST_FFTW_fftw_plan_with_nthreads(std::max<int>(1,IDEAL_NUMBER_OF_THREADS()));
   OST_FFTW_fftw_plan plan = OST_FFTW_fftw_plan_dft(rank,n,
 				 fftw_out, fftw_out, 
 				 dir, 
@@ -297,7 +301,7 @@ ImageStateBasePtr FFTFnc::VisitState<Complex,FrequencyDomain>(const ComplexFrequ
 reinterpret_cast<OST_FFTW_fftw_complex*>(out_state->Data().GetData());
 
   // in place transform
-  OST_FFTW_fftw_plan_with_nthreads(std::max<int>(1,QThread::idealThreadCount()));
+  OST_FFTW_fftw_plan_with_nthreads(std::max<int>(1,IDEAL_NUMBER_OF_THREADS()));
   OST_FFTW_fftw_plan plan = OST_FFTW_fftw_plan_dft(rank,n,
 				 fftw_out, fftw_out, 
 				 dir, 
diff --git a/modules/img/base/pymod/CMakeLists.txt b/modules/img/base/pymod/CMakeLists.txt
index aecb5eeb9386d66c5495af54ec897e3189dd4763..de787d14064aa27fb4f0117e9f9bf3bdac06c596 100644
--- a/modules/img/base/pymod/CMakeLists.txt
+++ b/modules/img/base/pymod/CMakeLists.txt
@@ -16,5 +16,7 @@ export_map.cc
 wrap_img.cc
 )
 
-pymod(NAME img OUTPUT_DIR ost/img 
-      CPP ${OST_IMG_PYMOD_SOURCES} PY __init__.py)
+if (NOT ENABLE_STATIC) 
+  pymod(NAME img OUTPUT_DIR ost/img 
+        CPP ${OST_IMG_PYMOD_SOURCES} PY __init__.py)
+endif()
diff --git a/modules/img/base/pymod/export_mask.cc b/modules/img/base/pymod/export_mask.cc
index 3a5faacf883ec2845ba48f06f4021d8bb23d14ba..40f42e9b0f00e1ca5ac20021e8e544e72bc9fd7f 100644
--- a/modules/img/base/pymod/export_mask.cc
+++ b/modules/img/base/pymod/export_mask.cc
@@ -26,7 +26,10 @@
 using namespace boost::python;
 
 #include <ost/img/mask.hh>
+#include <ost/config.hh>
+#if(OST_INFO_ENABLED)
 #include <ost/img/mask_info_convert.hh>
+#endif
 
 namespace ost { namespace img {
 
@@ -101,7 +104,10 @@ void export_Mask()
   def("Mask",mask2);
   def("Mask",mask3);
   def("Mask",mask4);
+  
+#if(OST_INFO_ENABLED)
   def("InfoToMask",InfoToMask);
   def("MaskToInfo",MaskToInfo);
-
+#endif
+  
 }
diff --git a/modules/img/base/src/CMakeLists.txt b/modules/img/base/src/CMakeLists.txt
index d218ac2ad4f265d7dfd8098313b93b46d71f8a60..ff5191865fc22a3364106ba0980174417946742b 100644
--- a/modules/img/base/src/CMakeLists.txt
+++ b/modules/img/base/src/CMakeLists.txt
@@ -29,7 +29,6 @@ extent_mask.cc
 spherical_mask.cc
 mask_op.cc
 circle_mask.cc
-mask_info_convert.cc
 image_list.cc
 physical_units.cc
 progress.cc
@@ -86,13 +85,17 @@ spherical_mask.hh
 mask_op.hh
 mask.hh
 circle_mask.hh
-mask_info_convert.hh
 image_list.hh
 physical_units.hh
 progress.hh
 map.hh
 )
 
+if (ENABLE_INFO)
+  list(APPEND OST_IMG_SOURCES mask_info_convert.cc)
+  list(APPEND OST_IMG_HEADERS mask_info_convert.hh)
+  set(INFO_DEPS ost_info)
+endif()
 
 foreach(fname ${OST_IMG_IMAGE_STATE_SOURCES})
   set(OST_IMG_SOURCES ${OST_IMG_SOURCES} image_state/${fname})
@@ -106,4 +109,4 @@ module(NAME img SOURCES "${OST_IMG_SOURCES}"
        HEADERS ${OST_IMG_RASTER_IMAGE_HEADERS} IN_DIR raster_image
                 ${OST_IMG_IMAGE_STATE_HEADERS} IN_DIR image_state
                 ${OST_IMG_HEADERS}
-       DEPENDS_ON ost_geom ost_base ost_info)
+       DEPENDS_ON ost_geom ost_base ${INFO_DEPS})
diff --git a/modules/info/CMakeLists.txt b/modules/info/CMakeLists.txt
index 9214aaa382e2e266e1d41dc1aeab37a69d4001ca..23eb6ec6733d11d5a081328ae04865a0240f66b2 100644
--- a/modules/info/CMakeLists.txt
+++ b/modules/info/CMakeLists.txt
@@ -1,2 +1,4 @@
-add_subdirectory(src)
-add_subdirectory(pymod)
+if (ENABLE_INFO)
+  add_subdirectory(src)
+  add_subdirectory(pymod)
+endif()
\ No newline at end of file
diff --git a/modules/io/pymod/CMakeLists.txt b/modules/io/pymod/CMakeLists.txt
index 38f43cdfae0dae30f926ce679fbb0fcbeefe240b..007569fff38887504ed15d21231b2b5d4464b346 100644
--- a/modules/io/pymod/CMakeLists.txt
+++ b/modules/io/pymod/CMakeLists.txt
@@ -14,10 +14,11 @@ set(OST_IO_PYMOD_MODULES
   repository.py
 )
 
-
-pymod(NAME io CPP ${OST_IO_PYMOD_SOURCES} PY ${OST_IO_PYMOD_MODULES})
-if (STATIC_LIBRARIES)
-  message("adding zlib libraries")
-  target_link_libraries(_ost_io ${ZLIB_LIBRARIES})
+if (NOT ENABLE_STATIC)
+  pymod(NAME io CPP ${OST_IO_PYMOD_SOURCES} PY ${OST_IO_PYMOD_MODULES})
+  if (STATIC_LIBRARIES)
+    message("adding zlib libraries")
+    target_link_libraries(_ost_io ${ZLIB_LIBRARIES})
+  endif()
 endif()
 
diff --git a/modules/io/pymod/__init__.py b/modules/io/pymod/__init__.py
index 5654e22a5508f22ad2072732a2d57b8d73b2e1ce..95ea418b344a21910a925f463151d34af4a8eb22 100644
--- a/modules/io/pymod/__init__.py
+++ b/modules/io/pymod/__init__.py
@@ -86,7 +86,7 @@ def LoadPDB(filename, restrict_chains="", no_hetatms=None,
             fault_tolerant=None, load_multi=False, quack_mode=None,
             join_spread_atom_records=None, calpha_only=None,
             profile='DEFAULT', remote=False, dialect=None,
-            strict_hydrogens=None, seqres=False):
+            strict_hydrogens=None, seqres=False, bond_feasibility_check=None):
   """
   Load PDB file from disk and return one or more entities. Several options 
   allow to customize the exact behaviour of the PDB import. For more information 
@@ -147,6 +147,7 @@ def LoadPDB(filename, restrict_chains="", no_hetatms=None,
   prof.quack_mode=_override(prof.quack_mode, quack_mode)
   prof.strict_hydrogens=_override(prof.strict_hydrogens, strict_hydrogens)
   prof.fault_tolerant=_override(prof.fault_tolerant, fault_tolerant)
+  prof.bond_feasibility_check=_override(prof.bond_feasibility_check, bond_feasibility_check)
   prof.join_spread_atom_records=_override(prof.join_spread_atom_records,
                                           join_spread_atom_records)
 
@@ -164,6 +165,7 @@ def LoadPDB(filename, restrict_chains="", no_hetatms=None,
   elif prof.dialect=='CHARMM':
     builder.dialect=conop.CHARMM_DIALECT
   builder.strict_hydrogens=prof.strict_hydrogens
+  builder.bond_feasibility_check=prof.bond_feasibility_check
   reader=PDBReader(filename, prof)
   reader.read_seqres=seqres
   try:
diff --git a/modules/io/pymod/export_pdb_io.cc b/modules/io/pymod/export_pdb_io.cc
index e431239e2e7d591d508f05d01464be380f468b49..c5abad5d434ddbdf1285c854cf4a427a8d0f34b9 100644
--- a/modules/io/pymod/export_pdb_io.cc
+++ b/modules/io/pymod/export_pdb_io.cc
@@ -36,13 +36,14 @@ void (PDBWriter::*write_b)(const mol::EntityView&)=&PDBWriter::Write;
 void export_pdb_io()
 {
   class_<IOProfile>("IOProfile",
-         init<String,bool,bool,bool,bool,bool,bool>((arg("dialect")="PDB",
-                                                     arg("strict_hydrogens")=false,
-                                                     arg("quack_mode")=false,
-                                                     arg("fault_tolerant")=false,
-                                                     arg("join_spread_atom_records")=false,
-                                                     arg("no_hetatms")=false,
-                                                     arg("calpha_only")=false)))
+         init<String,bool,bool,bool,bool,bool,bool,bool>((arg("dialect")="PDB",
+                                                          arg("strict_hydrogens")=false,
+                                                          arg("quack_mode")=false,
+                                                          arg("fault_tolerant")=false,
+                                                          arg("join_spread_atom_records")=false,
+                                                          arg("no_hetatms")=false,
+                                                          arg("calpha_only")=false,
+						          arg("bond_feasibility_check")=true)))
     .def_readwrite("dialect", &IOProfile::dialect)
     .def_readwrite("fault_tolerant", &IOProfile::fault_tolerant)
     .def_readwrite("quack_mode", &IOProfile::quack_mode)
@@ -50,6 +51,7 @@ void export_pdb_io()
     .def_readwrite("no_hetatms", &IOProfile::no_hetatms)
     .def_readwrite("calpha_only", &IOProfile::calpha_only)
     .def_readwrite("join_spread_atom_records", &IOProfile::join_spread_atom_records)
+    .def_readwrite("bond_feasibility_check", &IOProfile::bond_feasibility_check)
     .def("Copy", &IOProfile::Copy)
     .def(self_ns::str(self))
   ;
diff --git a/modules/io/src/mol/io_profile.hh b/modules/io/src/mol/io_profile.hh
index 91fe27b7793350e10d29d922cf0ca501a1697da5..b4802583a838156ef5aac62048c158b50bff65d3 100644
--- a/modules/io/src/mol/io_profile.hh
+++ b/modules/io/src/mol/io_profile.hh
@@ -27,13 +27,13 @@ namespace ost { namespace io {
 
 struct DLLEXPORT IOProfile {
 public:
-  IOProfile(String d, bool sh, bool qm, bool ft, bool js, bool nh, bool co):
+  IOProfile(String d, bool sh, bool qm, bool ft, bool js, bool nh, bool co, bool bf):
     dialect(d), strict_hydrogens(sh), quack_mode(qm), fault_tolerant(ft),
-    join_spread_atom_records(js), no_hetatms(nh), calpha_only(co)
+    join_spread_atom_records(js), no_hetatms(nh), calpha_only(co), bond_feasibility_check(bf)
   { }
   IOProfile(): dialect("PDB"), strict_hydrogens(true), quack_mode(false),
     fault_tolerant(false), join_spread_atom_records(false), no_hetatms(false),
-    calpha_only(false)
+    calpha_only(false), bond_feasibility_check(true)
   { }
   virtual ~IOProfile() { }
 
@@ -44,11 +44,12 @@ public:
   bool   join_spread_atom_records;
   bool   no_hetatms;
   bool   calpha_only;
+  bool   bond_feasibility_check;
 
   IOProfile Copy()
   {
     return IOProfile(dialect, strict_hydrogens, quack_mode, fault_tolerant,
-                     join_spread_atom_records, no_hetatms, calpha_only);
+                     join_spread_atom_records, no_hetatms, calpha_only, bond_feasibility_check);
   }
   virtual void PostImport(mol::EntityHandle ent) { }
 };
@@ -61,7 +62,8 @@ inline  std::ostream& operator<<(std::ostream& stream, const IOProfile& p)
          << (p.join_spread_atom_records ? "True" : "False") << ", no_hetatms="
          << (p.no_hetatms ? "True" : "False") << ", calpha_only="
          << (p.calpha_only ? "True" : "False") << ", fault_tolerant="
-         << (p.fault_tolerant ? "True" : "False") << ")";
+         << (p.fault_tolerant ? "True" : "False") << ", bond_feasibility_check="
+	 << (p.bond_feasibility_check ? "True" : "False") << ")";
   return stream;
 }
 
diff --git a/modules/io/tests/CMakeLists.txt b/modules/io/tests/CMakeLists.txt
index c4b3486d52aeb26db1865488f61e42c750f9c67c..98f075bd9785c1c051f642e3be91dd2e125cc62f 100644
--- a/modules/io/tests/CMakeLists.txt
+++ b/modules/io/tests/CMakeLists.txt
@@ -19,6 +19,9 @@ ost_unittest(MODULE io
              SOURCES "${OST_IO_UNIT_TESTS}"
              LINK ost_mol ost_seq)
 
-add_executable(test_mae_standalone test_mae_standalone.cc)
-target_link_libraries(test_mae_standalone ost_mol)
-target_link_libraries(test_mae_standalone ost_io)
+if(NOT ENABLE_STATIC)
+  add_executable(test_mae_standalone test_mae_standalone.cc)
+  target_link_libraries(test_mae_standalone ost_mol)
+  target_link_libraries(test_mae_standalone ost_io)
+  target_link_libraries(test_mae_standalone ${Boost_REGEX_LIBRARY})
+endif()
diff --git a/modules/io/tests/test_io_pdb.cc b/modules/io/tests/test_io_pdb.cc
index cb40a2c04a0a737da86f6c83ab2e8a014e1d378c..da9efce0dcd4974f738f28d48247d6e91b2ccc32 100644
--- a/modules/io/tests/test_io_pdb.cc
+++ b/modules/io/tests/test_io_pdb.cc
@@ -913,7 +913,7 @@ BOOST_AUTO_TEST_CASE(charmm_rname)
   {
     PDBWriter writer(String("testfiles/pdb/charmm_rname-out.pdb"),
                      IOProfile("CHARMM", true, false, false,
-                               false, false, false));
+                               false, false, false, true));
 
     mol::EntityHandle ent=mol::CreateEntity();
     mol::XCSEditor edi=ent.EditXCS();
@@ -933,7 +933,7 @@ BOOST_AUTO_TEST_CASE(charmm_longcname)
   {
     PDBWriter writer(String("testfiles/pdb/charmm_longcname-out.pdb"),
                      IOProfile("CHARMM", true, false, false,
-                               false, false, false));
+                               false, false, false, true));
 
     mol::EntityHandle ent=mol::CreateEntity();
     mol::XCSEditor edi=ent.EditXCS();
@@ -953,7 +953,7 @@ BOOST_AUTO_TEST_CASE(write_charmm_ter)
   {
     PDBWriter writer(String("testfiles/pdb/charmm_ter-out.pdb"),
                      IOProfile("CHARMM", true, false, false,
-                               false, false, false));
+                               false, false, false, true));
 
     mol::EntityHandle ent=mol::CreateEntity();
     mol::XCSEditor edi=ent.EditXCS();
diff --git a/modules/io/tests/test_io_pdb.py b/modules/io/tests/test_io_pdb.py
index 873a91e155c3ea64b37623881f1ef8e4aeec177c..348fde1d929669405e612cb92d3a274ceb5636f1 100644
--- a/modules/io/tests/test_io_pdb.py
+++ b/modules/io/tests/test_io_pdb.py
@@ -11,8 +11,23 @@ class TestPDB(unittest.TestCase):
     ch = e.FindChain("A");
     self.assertEquals(ch.GetIntProp("mol_id"), 1)
 
+class TestPDB(unittest.TestCase):
+  def setUp(self):
+    pass
+
+  def test_compnd_parser(self):
+    profiles=io.IOProfiles()
+    profiles['NO_FEAS_CHECK']=io.IOProfile(bond_feasibility_check=False)
+        
+    e=io.LoadPDB('testfiles/pdb/simple_defective.pdb', restrict_chains="A",profile='NO_FEAS_CHECK')
+    
+    res=e.FindResidue('A',3)
+        
+    self.assertTrue(mol.BondExists(res.FindAtom("CA"),res.FindAtom("CB")))
+    
 if __name__== '__main__':
   from ost import testutils
   testutils.RunTests()
 
 
+ 
diff --git a/modules/io/tests/testfiles/pdb/simple_defective.pdb b/modules/io/tests/testfiles/pdb/simple_defective.pdb
new file mode 100644
index 0000000000000000000000000000000000000000..725b68dbad3e82a101122f3f301f8a254e9a4aab
--- /dev/null
+++ b/modules/io/tests/testfiles/pdb/simple_defective.pdb
@@ -0,0 +1,67 @@
+HELIX    1   1 ARG A   15  GLU A   28  1                                  14    
+HELIX    2   2 ASN A   38  GLY A   50  1                                  13    
+SHEET    1   A 7 ALA A  53  ALA A  57  0                                        
+SHEET    2   A 7 ALA A  30  ASP A  36  1  N  ILE A  34   O  CYS A  54           
+CRYST1   67.465   67.465  191.044  90.00  90.00 120.00 P 31 2 1     12          
+ATOM      1  N   MET A   1      21.609  35.384  56.705  1.00 41.48           N  
+ATOM      2  CA  MET A   1      20.601  35.494  57.793  1.00 41.58           C  
+ATOM      3  C   MET A   1      19.654  34.300  57.789  1.00 39.51           C  
+ATOM      4  O   MET A   1      18.447  34.456  57.595  1.00 38.98           O  
+ATOM      5  CB  MET A   1      19.789  36.783  57.639  1.00 45.90           C  
+ATOM      6  CG  MET A   1      20.629  38.055  57.606  1.00 51.18           C  
+ATOM      7  SD  MET A   1      21.638  38.325  59.084  1.00 55.83           S  
+ATOM      8  CE  MET A   1      23.233  37.697  58.529  1.00 54.59           C  
+ATOM      9  N   ARG A   2      20.202  33.112  58.011  1.00 36.39           N  
+ATOM     10  CA  ARG A   2      19.396  31.903  58.033  1.00 34.35           C  
+ATOM     11  C   ARG A   2      18.608  31.739  59.328  1.00 34.20           C  
+ATOM     12  O   ARG A   2      17.651  30.965  59.381  1.00 32.64           O  
+ATOM     13  CB  ARG A   2      20.284  30.681  57.801  1.00 33.48           C  
+ATOM     14  CG  ARG A   2      20.665  30.488  56.342  1.00 31.69           C  
+ATOM     15  CD  ARG A   2      21.557  29.281  56.154  1.00 29.91           C  
+ATOM     16  NE  ARG A   2      22.931  29.557  56.551  1.00 28.95           N  
+ATOM     17  CZ  ARG A   2      23.901  28.653  56.528  1.00 30.21           C  
+ATOM     18  NH1 ARG A   2      23.640  27.417  56.130  1.00 32.54           N  
+ATOM     19  NH2 ARG A   2      25.132  28.980  56.893  1.00 29.14           N  
+ATOM     20  N   LEU A   3      19.003  32.473  60.366  1.00 35.07           N  
+ATOM     21  CA  LEU A   3      18.330  32.402  61.664  1.00 34.70           C  
+ATOM     22  C   LEU A   3      17.884  33.787  62.117  1.00 35.41           C  
+ATOM     23  O   LEU A   3      17.853  34.091  63.308  1.00 35.91           O  
+ATOM     24  CB  LEU A   3      19.269  31.793 102.710  1.00 31.47           C  
+ATOM     25  CG  LEU A   3      19.695  30.340  62.501  1.00 29.10           C  
+ATOM     26  CD1 LEU A   3      20.585  29.897  63.648  1.00 26.97           C  
+ATOM     27  CD2 LEU A   3      18.461  29.459  62.420  1.00 27.95           C  
+ATOM   1881  N   MET A 255      29.709   5.069  60.642  1.00 26.34           N  
+ATOM   1882  CA  MET A 255      28.701   5.164  59.592  1.00 27.93           C  
+ATOM   1883  C   MET A 255      27.302   4.748  60.005  1.00 27.64           C  
+ATOM   1884  O   MET A 255      27.057   3.586  60.326  1.00 29.54           O  
+ATOM   1885  CB  MET A 255      29.146   4.331  58.399  1.00 28.54           C  
+ATOM   1886  CG  MET A 255      30.558   4.642  57.948  1.00 30.99           C  
+ATOM   1887  SD  MET A 255      31.116   3.394  56.790  1.00 34.74           S  
+ATOM   1888  CE  MET A 255      31.526   2.062  57.912  1.00 35.45           C  
+ATOM   1889  N   SER A 256      26.376   5.699  59.965  1.00 26.90           N  
+ATOM   1890  CA  SER A 256      24.998   5.430  60.347  1.00 28.27           C  
+ATOM   1891  C   SER A 256      24.040   5.839  59.231  1.00 28.44           C  
+ATOM   1892  O   SER A 256      24.543   6.294  58.186  1.00 28.92           O  
+ATOM   1893  CB  SER A 256      24.664   6.188  61.642  1.00 28.64           C  
+ATOM   1894  OG  SER A 256      25.569   5.836  62.681  1.00 28.28           O  
+ATOM   1895  OXT SER A 256      22.811   5.701  59.408  1.00 27.92           O  
+TER    1896      SER A 256                                                      
+ATOM   1897  N   MET B   1      22.333 -31.975  81.215  1.00 44.89           N  
+ATOM   1898  CA  MET B   1      23.104 -30.998  82.028  1.00 43.40           C  
+ATOM   1899  C   MET B   1      24.121 -30.191  81.211  1.00 40.48           C  
+ATOM   1900  O   MET B   1      25.266 -30.614  81.040  1.00 38.97           O  
+ATOM   1901  CB  MET B   1      23.828 -31.727  83.164  1.00 48.82           C  
+ATOM   1902  CG  MET B   1      23.086 -31.723  84.500  1.00 55.57           C  
+ATOM   1903  SD  MET B   1      21.607 -32.746  84.539  1.00 63.93           S  
+ATOM   1904  CE  MET B   1      21.996 -33.836  85.950  1.00 64.69           C  
+ATOM   3785  N   SER B 256      17.566  -6.734  64.432  1.00 23.90           N  
+ATOM   3786  CA  SER B 256      18.942  -6.278  64.584  1.00 23.46           C  
+ATOM   3787  C   SER B 256      19.884  -7.335  64.032  1.00 23.50           C  
+ATOM   3788  O   SER B 256      19.390  -8.439  63.723  1.00 25.09           O  
+ATOM   3789  CB  SER B 256      19.253  -6.025  66.064  1.00 22.10           C  
+ATOM   3790  OG  SER B 256      18.279  -5.173  66.635  1.00 18.70           O  
+ATOM   3791  OXT SER B 256      21.095  -7.051  63.923  1.00 22.97           O  
+TER    3792      SER B 256                                                      
+HETATM 3793  O   HOH     1      14.659   7.548  75.525  1.00  6.25           O  
+HETATM 3794  O   HOH     2      29.166   1.788  77.529  1.00 15.43           O  
+END                                                                             
diff --git a/modules/mol/alg/pymod/CMakeLists.txt b/modules/mol/alg/pymod/CMakeLists.txt
index 5ac7e71dba294b13d510a84e1c01d5d9b08654f3..004c475efdf99c095aa693c133f7a2af51e84248 100644
--- a/modules/mol/alg/pymod/CMakeLists.txt
+++ b/modules/mol/alg/pymod/CMakeLists.txt
@@ -20,7 +20,7 @@ if (ENABLE_IMG)
   )
 
 endif()
-
-pymod(NAME mol_alg OUTPUT_DIR ost/mol/alg CPP ${OST_MOL_ALG_PYMOD_SOURCES}
-      PY ${OST_MOL_ALG_PYMOD_MODULES})
-
+if (NOT ENABLE_STATIC)
+  pymod(NAME mol_alg OUTPUT_DIR ost/mol/alg CPP ${OST_MOL_ALG_PYMOD_SOURCES}
+        PY ${OST_MOL_ALG_PYMOD_MODULES})
+endif()
diff --git a/modules/mol/alg/pymod/wrap_mol_alg.cc b/modules/mol/alg/pymod/wrap_mol_alg.cc
index 4e4ccc2f56d67b196549fb5648efd39b6b2430a8..20a78f90e3ede2920d09b7d1cadc70cfc1fe65df 100644
--- a/modules/mol/alg/pymod/wrap_mol_alg.cc
+++ b/modules/mol/alg/pymod/wrap_mol_alg.cc
@@ -18,6 +18,7 @@
 //------------------------------------------------------------------------------
 
 #include <boost/python.hpp>
+#include <boost/python/suite/indexing/vector_indexing_suite.hpp>
 #include <ost/config.hh>
 #include <ost/mol/alg/local_dist_test.hh>
 #include <ost/mol/alg/superpose_frames.hh>
@@ -35,12 +36,39 @@ void export_entity_to_density();
 
 namespace {
   
-Real (*ldt_a)(const mol::EntityView&, const mol::EntityView& ref, Real, Real, const String&)=&mol::alg::LocalDistTest;
+Real (*ldt_a)(const mol::EntityView&, const mol::alg::GlobalDistanceList& glob_dist_list, Real, const String&)=&mol::alg::LocalDistTest;
 Real (*ldt_b)(const seq::AlignmentHandle&,Real, Real, int, int)=&mol::alg::LocalDistTest;
-mol::EntityView (*fc_a)(const mol::EntityView&, Real,bool)=&mol::alg::FilterClashes;
-mol::EntityView (*fc_b)(const mol::EntityHandle&, Real, bool)=&mol::alg::FilterClashes;
+mol::EntityView (*fc_a)(const mol::EntityView&, const mol::alg::ClashingDistances&,bool)=&mol::alg::FilterClashes;
+mol::EntityView (*fc_b)(const mol::EntityHandle&, const mol::alg::ClashingDistances&, bool)=&mol::alg::FilterClashes;
+mol::EntityView (*csc_a)(const mol::EntityView&, const mol::alg::StereoChemicalParams&, const mol::alg::StereoChemicalParams&, Real, Real, bool)=&mol::alg::CheckStereoChemistry;
+mol::EntityView (*csc_b)(const mol::EntityHandle&, const mol::alg::StereoChemicalParams&, const mol::alg::StereoChemicalParams&, Real, Real, bool)=&mol::alg::CheckStereoChemistry;
 mol::CoordGroupHandle (*superpose_frames1)(mol::CoordGroupHandle&, mol::EntityView&, int, int, int)=&mol::alg::SuperposeFrames;
 mol::CoordGroupHandle (*superpose_frames2)(mol::CoordGroupHandle&,  mol::EntityView&, mol::EntityView&, int, int)=&mol::alg::SuperposeFrames;
+
+ost::mol::alg::StereoChemicalParams fill_stereochemical_params_wrapper (const String& header, const list& stereo_chemical_props_file)  
+{
+  int stereo_chemical_props_file_length = boost::python::extract<int>(stereo_chemical_props_file.attr("__len__")());
+  std::vector<String> stereo_chemical_props_file_vector;
+  
+  for (int i=0; i<stereo_chemical_props_file_length; i++) {
+    String extracted_string = boost::python::extract<String>(stereo_chemical_props_file[i]);
+    stereo_chemical_props_file_vector.push_back(extracted_string);    
+  }
+  return ost::mol::alg::FillStereoChemicalParams(header,stereo_chemical_props_file_vector);
+}
+
+ost::mol::alg::ClashingDistances fill_clashing_distances_wrapper (const list& stereo_chemical_props_file, Real min_default_distance, Real min_distance_tolerance)  
+{
+  int stereo_chemical_props_file_length = boost::python::extract<int>(stereo_chemical_props_file.attr("__len__")());
+  std::vector<String> stereo_chemical_props_file_vector(stereo_chemical_props_file_length);
+  
+  for (int i=0; i<stereo_chemical_props_file_length; i++) {
+    stereo_chemical_props_file_vector[i] = boost::python::extract<char const*>(stereo_chemical_props_file[i]);
+  }
+ 
+ return ost::mol::alg::FillClashingDistances(stereo_chemical_props_file_vector,min_default_distance,min_distance_tolerance);
+}
+
 }
 
 
@@ -56,12 +84,65 @@ BOOST_PYTHON_MODULE(_ost_mol_alg)
   
   def("LocalDistTest", ldt_a, (arg("local_ldt_property_string")=""));
   def("LocalDistTest", ldt_b, (arg("ref_index")=0, arg("mdl_index")=1));
-  def("FilterClashes", fc_a, (arg("ent"), arg("tolerance")=0.1, arg("always_remove_bb")=false));
-  def("FilterClashes", fc_b, (arg("ent"), arg("tolerance")=0.1, arg("always_remove_bb")=false));
+  def("FilterClashes", fc_a, (arg("ent"), arg("clashing_distances"), arg("always_remove_bb")=false));
+  def("FilterClashes", fc_b, (arg("ent"), arg("clashing_distances"), arg("always_remove_bb")=false));
+  def("CheckStereoChemistry", csc_a, (arg("ent"), arg("bonds"), arg("angles"), arg("bond_tolerance"), arg("angle_tolerance"), arg("always_remove_bb")=false));
+  def("CheckStereoChemistry", csc_b, (arg("ent"), arg("bonds"), arg("angles"), arg("bond_tolerance"), arg("angle_tolerance"), arg("always_remove_bb")=false));
+  def("LDTHA",&mol::alg::LDTHA);
+  def("CreateDistanceList",&mol::alg::CreateDistanceList);
+    
   def("SuperposeFrames", superpose_frames1, 
       (arg("source"), arg("sel")=ost::mol::EntityView(), arg("begin")=0, 
        arg("end")=-1, arg("ref")=-1));
   def("SuperposeFrames", superpose_frames2, 
   (arg("source"), arg("sel")=ost::mol::EntityView(), arg("ref_view")=ost::mol::EntityView(),arg("begin")=0, 
    arg("end")=-1));
+
+  
+  class_<mol::alg::ClashingDistances> ("ClashingDistances" ,init<Real,Real>())
+    .def("SetClashingDistance",&mol::alg::ClashingDistances::SetClashingDistance)
+    .def("GetClashingDistance",&mol::alg::ClashingDistances::GetClashingDistance)
+    .def("GetMaxAdjustedDistance",&mol::alg::ClashingDistances::GetMaxAdjustedDistance)    
+    .def("IsEmpty",&mol::alg::ClashingDistances::IsEmpty)  
+    
+    .def("PrintAllDistances",&mol::alg::ClashingDistances::PrintAllDistances)  
+  ;
+
+  class_<mol::alg::StereoChemicalParams> ("StereoChemicalParams" ,init<>())
+    .def("SetParam",&mol::alg::StereoChemicalParams::SetParam)
+    .def("GetParam",&mol::alg::StereoChemicalParams::GetParam)
+    .def("ContainsParam",&mol::alg::StereoChemicalParams::ContainsParam)    
+    .def("IsEmpty",&mol::alg::StereoChemicalParams::IsEmpty)  
+    
+    .def("PrintAllParameters",&mol::alg::StereoChemicalParams::PrintAllParameters)  
+
+  ;
+
+  class_<mol::alg::UniqueAtomIdentifier> ("UniqueAtomIdentifier" ,init <const String&, const mol::ResNum&, const String&, const String&>())
+    .def("GetChainName",&mol::alg::UniqueAtomIdentifier::GetChainName)
+    .def("GetResNum",&mol::alg::UniqueAtomIdentifier::GetResNum)
+    .def("GetResidueName",&mol::alg::UniqueAtomIdentifier::GetResidueName)
+    .def("GetAtomName",&mol::alg::UniqueAtomIdentifier::GetAtomName)
+  ;    
+   
+  
+  class_<mol::alg::ReferenceDistance> ("ReferenceDistance", init <const mol::alg::UniqueAtomIdentifier&,const mol::alg::UniqueAtomIdentifier&, Real, Real>())
+    .def("GetFirstAtom",&mol::alg::ReferenceDistance::GetFirstAtom)
+    .def("GetSecondAtom",&mol::alg::ReferenceDistance::GetSecondAtom)
+    .def("GetMinDistance",&mol::alg::ReferenceDistance::GetMinDistance)
+    .def("GetMaxDistance",&mol::alg::ReferenceDistance::GetMaxDistance)
+  ;
+  
+  class_<std::vector<mol::alg::ReferenceDistance> >("ResidueDistanceList")
+    .def(vector_indexing_suite<std::vector<mol::alg::ReferenceDistance > >())
+  ;
+  
+  class_<std::vector<mol::alg::ResidueDistanceList> >("GlobalDistanceList")
+    .def(vector_indexing_suite<std::vector<mol::alg::ResidueDistanceList > >())
+  ;
+  
+  def("FillClashingDistances",&fill_clashing_distances_wrapper);
+  def("FillStereoChemicalParams",&fill_stereochemical_params_wrapper);
+  def("IsStandardResidue",&mol::alg::IsStandardResidue);
+  
 }
diff --git a/modules/mol/alg/src/CMakeLists.txt b/modules/mol/alg/src/CMakeLists.txt
index 259f7f7dc860c7b8f787527cd44efc9321659a02..050d4822712f8789bfac97938e18c327334f7d92 100644
--- a/modules/mol/alg/src/CMakeLists.txt
+++ b/modules/mol/alg/src/CMakeLists.txt
@@ -40,8 +40,7 @@ if (ENABLE_IMG)
 endif()
 
 executable(NAME ldt SOURCES ldt.cc 
-           DEPENDS_ON ost_io ost_mol_alg STATIC)
-target_link_libraries(ldt ${BOOST_PROGRAM_OPTIONS})
+           DEPENDS_ON  ost_mol ost_mol_alg ost_io STATIC)
 
 module(NAME mol_alg SOURCES ${OST_MOL_ALG_SOURCES}
        HEADERS ${OST_MOL_ALG_HEADERS}
@@ -54,3 +53,7 @@ copy_if_different("." "${STAGE_DIR}/share/openstructure"
                   "ost_mol_alg")
 install(FILES "atom_scattering_properties.txt" DESTINATION "share/openstructure/")
 
+copy_if_different("." "${STAGE_DIR}/share/openstructure"
+                  "stereo_chemical_props.txt" "STEREO_CHEMICAL_PROPS"
+                  "ost_mol_alg")
+install(FILES "stereo_chemical_props.txt" DESTINATION "share/openstructure/")
diff --git a/modules/mol/alg/src/filter_clashes.cc b/modules/mol/alg/src/filter_clashes.cc
index 0fbca1696e5bc3ef1196f6d2a4863a1b0d72dcef..4b81ed10b8a81e92b120a2fc51367803a9ed9be9 100644
--- a/modules/mol/alg/src/filter_clashes.cc
+++ b/modules/mol/alg/src/filter_clashes.cc
@@ -18,66 +18,445 @@
 //------------------------------------------------------------------------------
 #include <ost/log.hh>
 #include <ost/mol/mol.hh>
+#include <sstream>
+#include <math.h>
 #include "filter_clashes.hh"
+#include <ost/units.hh>
+
 
-namespace ost { namespace mol { namespace alg {
 
 namespace {
 
-Real GetThreshold(const String& ele1, const String& ele2) {
-  if (ele1.length()!=1 || ele2.length()!=1) {
-    return 1.5;
+String bond_string(const ost::mol::AtomView& atom1, const ost::mol::AtomHandle& atom2) {
+  String atom1_str = atom1.GetName();
+  String atom2_str = atom2.GetName();
+  String string1,string2;
+  if (atom1_str < atom2_str) {
+    string1 = atom1_str;
+    string2 = atom2_str;
+  } else {
+    string1 = atom2_str;
+    string2 = atom1_str;
   }
-  switch (ele1[0]) {
-    case 'C' :
-      switch (ele2[0]) {
-        case 'C' : return 2.10;
-        case 'N' : return 2.10;
-        case 'S' : return 2.45;
-        case 'O' : return 2.25;
-        default: return 1.5;
-      }
-    case 'N':
-      switch (ele2[0]) {
-        case 'C' : return 2.10;
-        case 'N' : return 2.05;
-        case 'S' : return 2.55;
-        case 'O' : return 2.10;
-        default: return 1.5;
+  std::stringstream stkey;
+  stkey << string1 << "-" << string2;
+  return stkey.str();  
+}
+
+String angle_string(const ost::mol::AtomHandle& atom1, const ost::mol::AtomView& atom, const ost::mol::AtomHandle& atom2 ) {
+  String atom1_str = atom1.GetName();
+  String atom2_str = atom2.GetName();
+  String string1,string2;
+  if (atom1_str < atom2_str) {
+    string1 = atom1_str;
+    string2 = atom2_str;
+  } else {
+    string1 = atom2_str;
+    string2 = atom1_str;
+  }
+  std::stringstream stkey;
+  stkey << string1 << "-" << atom.GetName() << "-" << string2;
+  return stkey.str();  
+}
+
+
+}  
+
+
+namespace ost { namespace mol { namespace alg {
+
+void ClashingDistances::SetClashingDistance(const String& ele1,const String& ele2, Real min_distance, Real tolerance)
+{
+  std::stringstream stkey;
+  stkey << ele1 << "--" << ele2;
+  String key=stkey.str();
+  min_distance_[key]=std::make_pair<Real,Real>(min_distance,tolerance);
+}
+
+std::pair<Real,Real> ClashingDistances::GetClashingDistance(const String& ele1,const String& ele2) const
+{
+  std::stringstream stkey;
+  if (ele1<ele2) {
+    stkey << ele1 << "--" << ele2;
+  } else {
+    stkey << ele2 << "--" << ele1;
+  }  
+  String key=stkey.str();
+  std::map <String,std::pair<float,float> >::const_iterator find_ci= min_distance_.find(key);
+  if (find_ci == min_distance_.end()) {
+    return std::make_pair<Real,Real> (default_min_distance_,default_min_distance_tolerance_);
+  }    
+  return find_ci->second;
+}
+
+void ClashingDistances::PrintAllDistances() const
+{
+   for (std::map <String,std::pair<float,float> >::const_iterator index = min_distance_.begin();index != min_distance_.end();++index) {
+     std::cout << index->first << "\t" << index->second.first << "\t" << index->second.second << std::endl;
+   }    
+}
+
+Real ClashingDistances::GetMaxAdjustedDistance() const
+{
+  Real max_adjusted_distance=0;
+  for (std::map <String,std::pair<float,float> >::const_iterator index = min_distance_.begin();index != min_distance_.end();++index) {
+    Real distance = index->second.first; 
+    Real tolerance = index->second.second; 
+    if ((distance-tolerance) > max_adjusted_distance) {
+      max_adjusted_distance=distance-tolerance;
+    }
+  }  
+  return max_adjusted_distance;  
+}
+
+bool ClashingDistances::IsEmpty() const
+{
+  if (min_distance_.size()==0) {
+    return  true;
+  }
+  return false;
+}  
+
+void StereoChemicalParams::SetParam(const String& param, const String& residue, Real value, Real st_dev)
+{
+  std::pair<String,String> key = std::make_pair<String,String>(param,residue);
+  params_[key]=std::make_pair<Real,Real>(value,st_dev);
+}
+
+std::pair<Real,Real> StereoChemicalParams::GetParam(const String& param,const String& residue) const
+{
+  std::pair<String,String> key = std::make_pair<String,String>(param,residue);
+  std::map<std::pair<String,String>,std::pair<float,float> >::const_iterator find_ci = params_.find(key);
+  if (find_ci == params_.end()) {
+      std::stringstream serr;
+      serr << "Entry " << param <<  " for residue " << residue << " not found in the parameter table";   
+      throw Error(serr.str());
+  }    
+  return find_ci->second;
+}
+
+bool StereoChemicalParams::ContainsParam(const String& param,const String& residue) const
+{
+  std::pair<String,String> key = std::make_pair<String,String>(param,residue);
+  std::map<std::pair<String,String>,std::pair<float,float> >::const_iterator find_ci = params_.find(key);
+  if (find_ci == params_.end()) {
+    return false;
+  }    
+  return true;
+}
+
+void StereoChemicalParams::PrintAllParameters() const 
+{
+   for (std::map <std::pair<String,String>,std::pair<float,float> >::const_iterator index = params_.begin();index != params_.end();++index) {
+     std::cout << index->first.first << "\t" << index->first.second << "\t" << index->second.first << "\t" << index->second.second << std::endl;
+   }    
+};
+
+bool StereoChemicalParams::IsEmpty() const
+{
+  if (params_.size()==0) {
+    return  true;
+  }
+  return false;
+}  
+
+StereoChemicalParams FillStereoChemicalParams(const String& header, std::vector<String>& stereo_chemical_props_file)
+{
+  StereoChemicalParams table;
+  bool found=false;
+  std::vector<String>::const_iterator line_iter=stereo_chemical_props_file.begin();
+  while (line_iter!=stereo_chemical_props_file.end()) {
+    if ((*line_iter).length()!=0 && (*line_iter).length()!=1) {
+      StringRef line_string_ref(line_iter->data(),(*line_iter).length());
+      std::vector<StringRef> line_str_vec = line_string_ref.split();
+      if (line_str_vec[0].str()==header) {
+        found=true;
+        line_iter++;
+        while ((*line_iter)[0]!='-') {
+          if ((*line_iter)[0]!='#') {
+            StringRef second_line_string_ref(line_iter->data(),(*line_iter).length());
+            std::vector<StringRef> second_line_str_vec = second_line_string_ref.split();
+            if (second_line_str_vec.size()!=4) {
+              std::cout << "The number of elements in one of the lines is wrong" << std::endl;
+              return StereoChemicalParams();
+            } 
+            StringRef item = second_line_str_vec[0];
+            String res = second_line_str_vec[1].str();          
+            std::pair<bool,float> parse_value = second_line_str_vec[2].to_float();
+            std::pair<bool,float> parse_stddev = second_line_str_vec[3].to_float();
+            Real value,stddev;
+            if (parse_value.first==true) {
+              value=static_cast<Real>(parse_value.second);
+            } else {
+              std::cout << "One of the values in the third column is not a number" << std::endl;
+              return StereoChemicalParams();
+            };
+            if (parse_stddev.first==true) {
+              stddev=static_cast<Real>(parse_stddev.second);
+            } else {
+              std::cout << "One of the values in the fourth column is not a number" << std::endl;
+              return StereoChemicalParams();
+            };
+            std::vector<StringRef> split_item = item.split('-');
+            String rearranged_item;
+            if (split_item.size() == 2) {
+              String atom1 = split_item[0].str();
+              String atom2 = split_item[1].str();
+              if (atom2 < atom1) {
+                 std::stringstream srearr;
+                 srearr << atom2 << "-" << atom1;
+                 rearranged_item=srearr.str();                     
+              } else {
+                 rearranged_item = item.str();
+              }          
+            } else if (split_item.size() == 3) {
+              String atom1 = split_item[0].str();
+              String atom = split_item[1].str();
+              String atom2 = split_item[2].str();
+              if (atom2 < atom1) {
+                 std::stringstream srearr;
+                 srearr << atom2 << "-" << atom << "-" << atom1;
+                 rearranged_item=srearr.str();                
+              } else {
+                 rearranged_item = item.str();
+              }                
+            } else {
+              std::cout << "One of the strings describing the parameter has the wrong format" << std::endl;
+              return StereoChemicalParams();
+            }            
+            table.SetParam(rearranged_item,res,value,stddev);
+            line_iter++;
+            }  
+        }
+      }  
+    }
+    line_iter++;    
+  }
+  if (found==false) {
+    std::cout << "Could not find the relevant section in the stereo-chemical parameter file" << std::endl;
+    return StereoChemicalParams();
+  };    
+  return table;
+};  
+
+ClashingDistances FillClashingDistances(std::vector<String>& stereo_chemical_props_file, Real min_default_distance, Real min_distance_tolerance)
+{
+  ClashingDistances table(min_default_distance,min_distance_tolerance);
+  bool found=false;
+  std::vector<String>::const_iterator line_iter=stereo_chemical_props_file.begin();
+  while (line_iter!=stereo_chemical_props_file.end()) {
+    if ((*line_iter).length()!=0 && (*line_iter).length()!=1) {
+      StringRef line_string_ref(line_iter->data(),(*line_iter).length());
+      std::vector<StringRef> line_str_vec = line_string_ref.split();
+      if (line_str_vec[0].str()=="Non-bonded") {
+        found=true;
+        line_iter++;
+        while ((*line_iter)[0]!='-') {
+          if ((*line_iter)[0]!='#') {
+            StringRef second_line_string_ref(line_iter->data(),(*line_iter).length());
+            std::vector<StringRef> second_line_str_vec = second_line_string_ref.split();
+            if (second_line_str_vec.size()!=3) {
+              std::cout << "The number of elements in one of the lines is wrong" << std::endl;
+              return ClashingDistances(min_default_distance,min_distance_tolerance);
+            } 
+            String item = second_line_str_vec[0].str();
+
+            std::pair<bool,float> parse_value = second_line_str_vec[1].to_float();
+            std::pair<bool,float> parse_stddev = second_line_str_vec[2].to_float();
+            Real value,stddev;
+            if (parse_value.first==true) {
+              value=static_cast<Real>(parse_value.second);
+            } else {
+              std::cout << "One of the distance values is not a number" << std::endl;
+              return ClashingDistances(min_default_distance,min_distance_tolerance);
+            };
+            if (parse_stddev.first==true) {
+              stddev=static_cast<Real>(parse_stddev.second);
+            } else {
+              std::cout << "One of the tolerance values is not a number" << std::endl;
+              return ClashingDistances(min_default_distance,min_distance_tolerance);
+            }
+            StringRef itemsr(item.data(),item.length());
+            std::vector<StringRef> eles = itemsr.split('-');
+            if (itemsr.size() != 3) {
+              std::cout << "One of the strings describing the interacting atoms has the wrong format" << std::endl;
+              return ClashingDistances(min_default_distance,min_distance_tolerance);
+            }  
+            String ele1=eles[0].str();
+            String ele2=eles[1].str();
+            if (ele2 < ele1) {
+              table.SetClashingDistance(ele2,ele1,value,stddev);
+            } else {
+              table.SetClashingDistance(ele1,ele2,value,stddev);
+            }  
+            line_iter++;
+          }  
+        }
+      }  
+    }
+    line_iter++;    
+  }
+  if (found==false) {
+    std::cout << "Could not find the relevant section in the stereo-chemical parameter file" << std::endl;
+    return ClashingDistances(min_default_distance,min_distance_tolerance);
+  } 
+  return table;
+}  
+
+
+EntityView CheckStereoChemistry(const EntityView& ent, const StereoChemicalParams& bond_table, const StereoChemicalParams& angle_table, Real bond_tolerance, Real angle_tolerance, bool always_remove_bb)
+{
+  LOG_INFO("Checking stereo-chemistry")
+  EntityView filtered=ent.CreateEmptyView();
+  ResidueViewList residues=ent.GetResidueList();
+  for (ResidueViewList::iterator i=residues.begin(), e=residues.end(); i!=e; ++i) {
+    bool remove_sc=false, remove_bb=false;
+    ResidueView res=*i;
+    if (res.GetOneLetterCode()=='?') {
+      filtered.AddResidue(res, ViewAddFlag::INCLUDE_ATOMS);
+      continue;
+    }  
+    String residue_str = res.GetName();
+    const AtomViewList& atoms=res.GetAtomList();
+    for (AtomViewList::const_iterator j=atoms.begin(), e2=atoms.end(); j!=e2; ++j) {
+      AtomView atom=*j;
+      String ele1=atom.GetElement();
+      if (ele1=="H" || ele1=="D") {
+        continue;
       }
-    case 'O':
-      switch (ele2[0]) {
-        case 'C' : return 2.25;
-        case 'N' : return 2.10;
-        case 'S' : return 2.45;
-        case 'O' : return 2.05;
-        default: return 1.5;
+      BondHandleList bonds = atom.GetBondList();
+      
+      for (BondHandeList::const_iterator bi = bonds.begin();bi!=bonds.end();++bi) {
+          BondHandle bond = *bi;          
+          AtomHandle other_atom = bond.GetOther(atom.GetHandle());    
+          if (other_atom.GetResidue()!=res.GetHandle()) {
+            continue;     
+          }         
+          String ele2 = other_atom.GetElement();
+          if (ele2=="H" || ele2=="D") {
+            continue;
+          }      
+          if (other_atom.GetHashCode() > atom.GetHandle().GetHashCode()) {
+            Real blength = bond.GetLength();
+            String bond_str = bond_string(atom,other_atom);
+            std::pair<Real,Real> length_stddev = bond_table.GetParam(bond_str,residue_str);
+            Real ref_length = length_stddev.first;
+            Real ref_stddev = length_stddev.second;           
+            Real min_length = ref_length - bond_tolerance*ref_stddev;
+            Real max_length = ref_length + bond_tolerance*ref_stddev;
+            Real zscore = (blength - ref_length)/ref_stddev;
+            if (blength < min_length || blength > max_length) {
+              LOG_INFO("BOND:" << " " << res.GetChain() << " " << res.GetName() << " " << res.GetNumber() << " " << bond_str << " " << min_length << " " << max_length << " " << blength << " " << zscore << " " << "FAIL")
+              remove_sc=true;
+              if (always_remove_bb==true) {
+                remove_bb=true;
+                continue;
+              }
+              String name=atom.GetName();
+              if (name=="CA" || name=="N" || name=="O" || name=="C") {
+                remove_bb=true;
+              }
+            } else {
+              LOG_VERBOSE("BOND:" << " " << res.GetChain() << " " << res.GetName() << " " << res.GetNumber() << " " << bond_str << " " << min_length << " " << max_length << " " << blength << " " << zscore << " " << "PASS")
+            }  
+          }  
       }
-    case 'S':
-      switch (ele2[0]) {
-        case 'C' : return 2.45;
-        case 'N' : return 2.55;
-        case 'S' : return 1.80;
-        case 'O' : return 2.45;
-        default: return 1.5;
+      
+      for (BondHandeList::const_iterator bond_iter1=bonds.begin(); bond_iter1!=bonds.end(); ++bond_iter1) {
+        BondHandle bond1=*bond_iter1;
+        AtomHandle atom1= bond1.GetOther(atom.GetHandle());
+        String ele_atom1=atom1.GetElement();
+        if (ele_atom1=="H" || ele_atom1=="D") {
+          continue;
+        }
+        if (atom1.GetResidue()!=res.GetHandle()) {
+          continue;        
+        }        
+        for (BondHandeList::const_iterator bond_iter2=bonds.begin(); bond_iter2!=bonds.end(); ++bond_iter2) {
+          BondHandle bond2=*bond_iter2;
+          AtomHandle atom2 = bond2.GetOther(atom.GetHandle());
+          String ele_atom2=atom2.GetElement();
+          if (ele_atom2=="H" || ele_atom2=="D") {
+            continue;
+          }
+          if (atom2.GetResidue()!=res.GetHandle()) {
+            continue;        
+          }
+          if (atom1.GetHashCode() > atom2.GetHashCode()) {
+            Real awidth;
+            if (atom1.GetName()<atom2.GetName()) {
+              awidth = ent.GetAngle(atom1,atom.GetHandle(),atom2);
+            } else {
+              awidth = ent.GetAngle(atom2,atom.GetHandle(),atom1);
+            }    
+            awidth/=(ost::Units::deg);
+            String angle_str = angle_string(atom1,atom,atom2);
+            std::pair<Real,Real> width_stddev = angle_table.GetParam(angle_str,residue_str);
+            Real ref_width = width_stddev.first;  
+            Real ref_stddev = width_stddev.second;           
+            Real min_width = ref_width - angle_tolerance*ref_stddev;
+            Real max_width = ref_width + angle_tolerance*ref_stddev;
+            Real zscore = (awidth - ref_width)/ref_stddev;
+            if (awidth < min_width || awidth > max_width) {
+              LOG_INFO("ANGLE:" << " " << res.GetChain() << " " << res.GetName() << " " << res.GetNumber() << " " << angle_str << " " << min_width << " " << max_width << " " << awidth << " " << zscore << " " << "FAIL")
+              remove_sc=true;
+              if (always_remove_bb==true) {
+                remove_bb=true;
+                continue;
+              }
+              String name=atom.GetName();
+              if (name=="CA" || name=="N" || name=="O" || name=="C") {
+                remove_bb=true;
+              }
+            } else {
+                LOG_VERBOSE("ANGLE:" << " " << res.GetChain() << " " << res.GetName() << " " << res.GetNumber() << " " << angle_str << " " << min_width << " " << max_width << " " << awidth << " " << zscore << " " << "PASS")
+            }
+          }  
+        }
+      }         
+    }
+    
+    if (remove_bb) {
+      LOG_INFO("ACTION: removing whole residue " << res);
+      continue;
+    }
+    if (remove_sc) {
+      LOG_INFO("ACTION: removing sidechain of residue " << res);
+      for (AtomViewList::const_iterator 
+           j=atoms.begin(), e2=atoms.end(); j!=e2; ++j) {
+       AtomView atom=*j;
+       String name=atom.GetName();
+       if (name=="CA" || name=="N" || name=="O" || name=="C") {
+         filtered.AddAtom(atom);
+       }
       }
-    default:
-      return 1.5;
+      continue;
+    }
+    filtered.AddResidue(res, ViewAddFlag::INCLUDE_ATOMS);
   }
+  return filtered;
 }
 
 
+EntityView CheckStereoChemistry(const EntityHandle& ent, const StereoChemicalParams& bond_table, const StereoChemicalParams& angle_table, Real bond_tolerance, Real angle_tolerance, bool always_remove_bb)
+{
+  return CheckStereoChemistry(ent.CreateFullView(), bond_table, angle_table, bond_tolerance, angle_tolerance, always_remove_bb);
 }
 
-EntityView FilterClashes(const EntityView& ent, Real tolerance, 
-                         bool always_remove_bb)
+
+EntityView FilterClashes(const EntityView& ent, const ClashingDistances& min_distances, bool always_remove_bb)
 {
+  LOG_INFO("Filtering non-bonded clashes")
   EntityView filtered=ent.CreateEmptyView();
   ResidueViewList residues=ent.GetResidueList();
   for (ResidueViewList::iterator 
        i=residues.begin(), e=residues.end(); i!=e; ++i) {
     bool remove_sc=false, remove_bb=false;
     ResidueView res=*i;
+    if (res.GetOneLetterCode()=='?') {
+      filtered.AddResidue(res, ViewAddFlag::INCLUDE_ATOMS);
+      continue;
+    }  
     const AtomViewList& atoms=res.GetAtomList();
     for (AtomViewList::const_iterator 
          j=atoms.begin(), e2=atoms.end(); j!=e2; ++j) {
@@ -86,7 +465,7 @@ EntityView FilterClashes(const EntityView& ent, Real tolerance,
       if (ele1=="H" || ele1=="D") {
         continue;
       }
-      AtomViewList within=ent.FindWithin(atom.GetPos(), 2.5-tolerance);
+      AtomViewList within=ent.FindWithin(atom.GetPos(),min_distances.GetMaxAdjustedDistance());
       for (AtomViewList::iterator 
            k=within.begin(), e3=within.end(); k!=e3; ++k) {
         AtomView atom2=*k;
@@ -97,15 +476,22 @@ EntityView FilterClashes(const EntityView& ent, Real tolerance,
         if (ele2=="H" || ele2=="D") {
           continue;
         }
+
         // In theory, this should also trigger for disulfide bonds, but 
         // since we don't detect disulfides correctly, we can't count on that 
         // and we instead allow S-S distances down to 1.8.
         if (atom.GetHandle().FindBondToAtom(atom2.GetHandle()).IsValid()) {
           continue;
         }
+
         Real d=geom::Length2(atom.GetPos()-atom2.GetPos());
-        Real threshold=GetThreshold(ele1, ele2)-tolerance;
+        std::pair <Real,Real> distance_tolerance=min_distances.GetClashingDistance(ele1, ele2);
+        Real distance=distance_tolerance.first;
+        Real tolerance=distance_tolerance.second;
+        Real threshold=distance-tolerance;
         if (d<threshold*threshold) {
+          LOG_INFO(atom.GetResidue().GetChain() << " " << atom.GetResidue().GetName() << " " << atom.GetResidue().GetNumber() << " " << atom.GetName() << " " << atom2.GetResidue().GetChain() << " " << atom2.GetResidue().GetName() << " " << atom2.GetResidue().GetNumber() << " " << atom2.GetName() << " " << threshold << " " << sqrt(d) << " " << sqrt(d)-threshold << " " << "FAIL")
+       
           remove_sc=true;
           if (always_remove_bb==true) {
             remove_bb=true;
@@ -115,15 +501,18 @@ EntityView FilterClashes(const EntityView& ent, Real tolerance,
           if (name=="CA" || name=="N" || name=="O" || name=="C") {
             remove_bb=true;
           }
-        }
+        } else {
+          LOG_VERBOSE("CLASH:" << " " << atom.GetResidue().GetChain() << " " << atom.GetResidue().GetName() << " " << atom.GetResidue().GetNumber() << " " << atom.GetName() << " " << atom2.GetResidue().GetChain() << " " << atom2.GetResidue().GetNumber() << " " << atom2.GetResidue().GetName() << " " << atom2.GetName() << " " << threshold << " " << sqrt(d) << " " << sqrt(d)-threshold << " " << "PASS")
+        }  
       }
     }
+    
     if (remove_bb) {
-      LOG_VERBOSE("removing whole residue " << res);
+      LOG_VERBOSE("ACTION: removing whole residue " << res);
       continue;
     }
     if (remove_sc) {
-      LOG_VERBOSE("removing sidechain of residue " << res);
+      LOG_VERBOSE("ACTION: removing sidechain of residue " << res);
       for (AtomViewList::const_iterator 
            j=atoms.begin(), e2=atoms.end(); j!=e2; ++j) {
        AtomView atom=*j;
@@ -140,12 +529,11 @@ EntityView FilterClashes(const EntityView& ent, Real tolerance,
 }
 
 
-EntityView FilterClashes(const EntityHandle& ent, Real tolerance, 
-                         bool always_remove_bb)
+EntityView FilterClashes(const EntityHandle& ent,  
+                         const ClashingDistances& min_distances, bool always_remove_bb)
 {
-  return FilterClashes(ent.CreateFullView(), tolerance, always_remove_bb);
+  return FilterClashes(ent.CreateFullView(), min_distances, always_remove_bb);
 }
 
 
 }}}
-
diff --git a/modules/mol/alg/src/filter_clashes.hh b/modules/mol/alg/src/filter_clashes.hh
index 052e1ce5f65efd86396de967b9ad635afee3a715..5d64fc23060cdf879c434ccf52c950444b2087d0 100644
--- a/modules/mol/alg/src/filter_clashes.hh
+++ b/modules/mol/alg/src/filter_clashes.hh
@@ -24,14 +24,70 @@
 
 namespace ost { namespace mol { namespace alg {
 
+class ClashingDistances
+{
 
+public:
+  ClashingDistances(Real default_dist, Real tolerance): default_min_distance_(default_dist), default_min_distance_tolerance_(tolerance), valid_flag_(true) {}
+  void SetClashingDistance(const String& ele1,const String& ele2, Real min_distance, Real tolerance);
+  std::pair<Real,Real> GetClashingDistance(const String& ele1,const String& ele2) const;
+  Real GetMaxAdjustedDistance() const;
+  bool IsEmpty() const;
+  
+  //DEBUG
+  void PrintAllDistances() const;
+  
+private:
+
+  std::map <String,std::pair<float,float> > min_distance_;
+  Real default_min_distance_;
+  Real default_min_distance_tolerance_;
+  bool valid_flag_;
+  
+};
+  
+class StereoChemicalParams
+{
+
+public:
+  void SetParam(const String& param, const String& residue, Real value, Real st_dev);
+  std::pair<Real,Real> GetParam(const String& element,const String& residue) const;
+  bool ContainsParam(const String& param,const String& residue) const;
+  bool IsEmpty() const;
+  
+  //DEBUG
+  void PrintAllParameters() const;
+  
+private:
+
+  std::map<std::pair<String,String>,std::pair<float,float> >  params_;
+ 
+};
+
+ClashingDistances DLLEXPORT_OST_MOL_ALG FillClashingDistances(std::vector<String>& stereo_chemical_props_file, Real min_default_distance, Real min_distance_tolerance);
+StereoChemicalParams DLLEXPORT_OST_MOL_ALG FillStereoChemicalParams(const String& header, std::vector<String>& stereo_chemical_props_file);  
+ 
 EntityView DLLEXPORT_OST_MOL_ALG FilterClashes(const EntityView& ent, 
-                                               Real tolerance=0.1,
-                                               bool always_remove_bb=false);
+                                               const ClashingDistances& min_distances, bool always_remove_bb=false);
 
 EntityView DLLEXPORT_OST_MOL_ALG FilterClashes(const EntityHandle& ent, 
-                                               Real tolerance=0.1,
-                                               bool always_remove_bb=false);
+                                               const ClashingDistances& min_distances, bool always_remove_bb=false);
+
+EntityView DLLEXPORT_OST_MOL_ALG CheckStereoChemistry(const EntityView& ent, 
+                                                      const StereoChemicalParams& bond_table, 
+                                                      const StereoChemicalParams& angle_table,
+                                                      Real bond_tolerance,
+                                                      Real angle_tolerance,
+                                                      bool always_remove_bb=false);
+
+EntityView DLLEXPORT_OST_MOL_ALG CheckStereoChemistry(const EntityHandle& ent, 
+                                                      const StereoChemicalParams& bond_table, 
+                                                      const StereoChemicalParams& angle_table,
+                                                      Real bond_tolerance,
+                                                      Real angle_tolerance,
+                                                      bool always_remove_bb=false);
+
+
 }}}
 
 
diff --git a/modules/mol/alg/src/ldt.cc b/modules/mol/alg/src/ldt.cc
index ff566e489af453c26fdc29ffacbe5c11464730eb..5dbab61cfceb3d77794dbf465447980cdfa32e54 100644
--- a/modules/mol/alg/src/ldt.cc
+++ b/modules/mol/alg/src/ldt.cc
@@ -13,22 +13,32 @@
 // details.
 //
 // You should have received a copy of the GNU Lesser General Public License
-// along with this library; if not, write to the Free Software Foundation, Inc.,
+// along with this library; if not, write to the  Free Software Foundation, Inc.,
 // 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
 //------------------------------------------------------------------------------
 #if defined (_MSC_VER)
 #define BOOST_ALL_DYN_LINK 1
 #endif
 #include <boost/program_options.hpp>
+#include <boost/filesystem/fstream.hpp>
+#include <boost/filesystem/convenience.hpp>
 #include <ost/mol/alg/local_dist_test.hh>
 #include <ost/mol/alg/filter_clashes.hh>
 #include <ost/io/mol/pdb_reader.hh>
 #include <ost/io/io_exception.hh>
 #include <ost/conop/conop.hh>
+#include <ost/conop/amino_acids.hh>
+#include <ost/mol/iterator.hh>
+#include <ost/platform.hh>
+#include <ost/log.hh>
+
+#include <ost/conop/rule_based_builder.hh>
+#include <ost/dyn_cast.hh>
 
 using namespace ost;
 using namespace ost::io;
 using namespace ost::mol;
+using namespace ost::mol::alg;
 namespace po=boost::program_options;
 
 EntityHandle load(const String& file, const IOProfile& profile)
@@ -42,7 +52,7 @@ EntityHandle load(const String& file, const IOProfile& profile)
       conop_inst.ConnectAll(conop_inst.GetBuilder(), ent);
       return ent;
     }
-    std::cerr << "ERROR: '" << file << "' does not contain any ATOM records. " 
+    std::cerr << "ERROR: '" << file << "' does not contain any ATOM records. "
               << "Are you sure this is a PDB file?" << std::endl;
     return EntityHandle();
   } catch (io::IOException& e) {
@@ -54,25 +64,70 @@ EntityHandle load(const String& file, const IOProfile& profile)
 void usage()
 {
   std::cerr << "usage: ldt [options] <mod1> [mod1 [mod2]] <ref>" << std::endl;
-  std::cerr << "   -s        selection performed on ref" << std::endl;
-  std::cerr << "   -c        use Calphas only" << std::endl;
-  std::cerr << "   -f        filter clashes (not implemented yet)" << std::endl;
-  std::cerr << "   -t        fault tolerant parsing" << std::endl;  
+  std::cerr << "   -s         selection performed on ref" << std::endl;
+  std::cerr << "   -c         use Calphas only" << std::endl;
+  std::cerr << "   -f         perform structural checks and filter input data" << std::endl;
+  std::cerr << "   -t         fault tolerant parsing" << std::endl;
+  std::cerr << "   -p <file>  use specified parmeter file. Mandatory" << std::endl;
+  std::cerr << "   -v <level> verbosity level (0=results only,1=problems reported, 2=full report)" << std::endl;
+  std::cerr << "   -b <value> tolerance in stddevs for bonds" << std::endl;
+  std::cerr << "   -a <value> tolerance in stddevs for angles" << std::endl;
+  std::cerr << "   -m <value> clashing distance for unknwon atom types" << std::endl;
+  std::cerr << "   -r <value> distance inclusion radius" << std::endl;
+  std::cerr << "   -e         print version" << std::endl;
+}
+
+std::pair<int,int> compute_coverage (const EntityView& v,const GlobalDistanceList& glob_dist_list)
+{
+  int second=0;
+  int first=0;
+  if (v.GetResidueList().size()==0) {
+    return std::make_pair<int,int>(0,1);
+  }
+  ChainView vchain=v.GetChainList()[0];
+  for (std::vector<ResidueDistanceList>::const_iterator i=glob_dist_list.begin();i!=glob_dist_list.end();++i)
+  {
+    ResNum rnum = (*i)[0].GetFirstAtom().GetResNum();
+    String rname = (*i)[0].GetFirstAtom().GetResidueName();
+    if (IsStandardResidue(rname)) {
+      second++;
+      if (vchain.FindResidue(rnum)) {
+        first++;
+      }
+    }
+  }
+  return std::make_pair<int,int>(first,second);
 }
 
 int main (int argc, char **argv)
 {
+  String version = "Beta - 2012-01-17";
+  Real min_default_distance = 1.5;
+  Real min_distance_tolerance = 0.0;
+  Real bond_tolerance = 8.0;
+  Real angle_tolerance = 8.0;
+  Real radius=8.0;
+  
   IOProfile profile;
+  profile.bond_feasibility_check=false;
   // parse options
   String sel;
-  bool filter_clashes=false;
+  bool structural_checks=false;
   po::options_description desc("Options");
   desc.add_options()
     ("calpha,c", "consider only calpha atoms")
-    ("sel,s", po::value<String>(&sel)->default_value(""), "selection for reference")
+    ("sel,s", po::value<String>(&sel)->default_value(""), "selection performed on reference structure")
     ("tolerant,t", "fault tolerant mode")
-    ("filter-clashes,f", "filter clashes")
-    ("files", po::value< std::vector<String> >(), "input file")
+    ("structural-checks,f", "perform stereo-chemical and clash checks")
+    ("version,e", "version")
+    ("parameter-file,p", po::value<String>(), "stereo-chemical parameter file")
+    ("verbosity,v", po::value<int>(), "verbosity level")
+    ("bond_tolerance,b", po::value<Real>(), "tolerance in stddev for bonds")
+    ("angle_tolerance,a", po::value<Real>(), "tolerance in stddev for angles")
+    ("default_clash,m", po::value<Real>(), "clashing distance for unknown atom types")
+    ("inclusion_radius,r", po::value<Real>(), "distance inclusion radius")
+    ("files", po::value< std::vector<String> >(), "input file(s)")
+	("reference",po::value<String>(),"reference(s)")
   ;
   po::positional_options_description p;
   p.add("files", -1);
@@ -81,48 +136,183 @@ int main (int argc, char **argv)
                 options(desc).positional(p).run(),
             vm);
   po::notify(vm);
+  if (vm.count("version")) {
+    std::cout << "Version: " << version << std::endl;
+    exit(0);
+  }
+  std::vector<String> files;
+  if (vm.count("files")) {
+    files=vm["files"].as<std::vector<String> >();
+  } else {
+    usage();
+    exit(-1);
+  }
   if (vm.count("calpha")) {
     profile.calpha_only=true;
   }
-  if (vm.count("filter-clashes")) {
-    filter_clashes=true;
+  if (vm.count("structural-checks")) {
+    structural_checks=true;
   }
   if (vm.count("tolerant")) {
     profile.fault_tolerant=true;
   }
-  std::vector<String> files;
-  if (vm.count("files")) {
-    files=vm["files"].as<std::vector<String> >();
-  } else {
-    usage();
+  String parameter_filename;
+  if (vm.count("parameter-file")) {
+    parameter_filename=vm["parameter-file"].as<String>();
+  } else if (structural_checks==true) {
+    std::cout << "Please specify a stereo-chemical parameter file" << std::endl;
     exit(-1);
   }
+  int verbosity_level=0;
+  if (vm.count("verbosity")) {
+    verbosity_level=vm["verbosity"].as<int>();
+    if (verbosity_level==0) {
+      Logger::Instance().PushVerbosityLevel(0);
+    } else if (verbosity_level==1) {
+      Logger::Instance().PushVerbosityLevel(3);
+    } else if (verbosity_level==2) {
+      Logger::Instance().PushVerbosityLevel(4);
+    } else {
+      std::cout << "Verbosity level " << verbosity_level << " is not available" << std::endl;
+      exit(-1);
+    }
+  }
+
+  if (verbosity_level>0) {
+    LOG_INFO("LDT INFO FORMAT:  Chain1  Residue1  ResNum1  Atom1  Chain2  Residue2  ResNum2  Atom2  ModelDist  TargetDist  Difference  Tolerance Status");
+  }
+
+  if (vm.count("bond_tolerance")) {
+    bond_tolerance=vm["bond_tolerance"].as<Real>();
+  }
+  if (vm.count("angle_tolerance")) {
+    angle_tolerance=vm["angle_tolerance"].as<Real>();
+  }
+  if (vm.count("default_clash")) {
+    min_default_distance=vm["default_clash"].as<Real>();
+  }
+  if (vm.count("inclusion_radius")) {
+    radius=vm["inclusion_radius"].as<Real>();
+  }
   String ref_file=files.back();
   EntityHandle ref=load(ref_file, profile);
   if (!ref) {
-    return -1;
+    exit(-1);
   }
   files.pop_back();
   EntityView ref_view=ref.Select(sel);
+  GlobalDistanceList glob_dist_list = CreateDistanceList(ref_view,radius);
+  std::cout << "Verbosity level: " << verbosity_level << std::endl;
+  if (structural_checks) {
+    std::cout << "Stereo-chemical and steric clash checks: On " << std::endl;
+  } else {
+    std::cout << "Stereo-chemical and steric clash checks: Off " << std::endl;
+  }
+  std::cout << "Inclusion Radius: " << radius << std::endl;
+  if (structural_checks) {
+    std::cout << "Parameter filename: " << parameter_filename << std::endl;
+    std::cout << "Tolerance in stddevs for bonds: " << bond_tolerance << std::endl;
+    std::cout << "Tolerance in stddevs for angles: " << angle_tolerance << std::endl;
+    std::cout << "Clashing distance for unknown atom types: " << min_default_distance << std::endl;
+    LOG_INFO("Log entries format:");
+    LOG_INFO("BOND INFO FORMAT:  Chain  Residue  ResNum  Bond  Min  Max  Observed  Z-score  Status");
+    LOG_INFO("ANGLE INFO FORMAT:  Chain  Residue  ResNum  Angle  Min  Max  Observed  Z-score  Status");
+    LOG_INFO("CLASH INFO FORMAT:  Chain1  Residue1  ResNum1  Atom1  Chain2  Residue2  ResNum2  Atom2  Observed  Difference  Status");
+    LOG_INFO("LDT INFO FORMAT:  Chain1  Residue1  ResNum1  Atom1  Chain2  Residue2  ResNum2  Atom2  ModelDist  TargetDist  Difference  Tolerance Status");
+  }
   for (size_t i=0; i<files.size(); ++i) {
     EntityHandle model=load(files[i], profile);
     if (!model) {
       if (!profile.fault_tolerant) {
-        return -1;
+        exit(-1);
       }
       continue;
     }
     EntityView v=model.CreateFullView();
-    if (filter_clashes) {
-      v=alg::FilterClashes(v);
+
+    // The code in this following block is only used to make CASP9 models load correctly and normally commented out
+    EntityView model2=model.Select("aname!=CEN,NV,OT1,OT,CAY,CY,OXT,1OCT,NT,OT2,2OCT,OVL1,OC1,O1,OC2,O2,OVU1");
+    EntityView v1=model2.Select("not (rname==GLY and aname==CB)");
+    boost::filesystem::path pathstring(files[i]);
+    
+    #if BOOST_FILESYSTEM_VERSION==3
+    String filestring=pathstring.filename().string();
+    #else
+    String filestring=pathstring.file_string();
+    #endif      
+    
+    if (filestring.substr(5,5)=="TS257" || filestring.substr(5,5)=="TS458" ) {
+      for (AtomHandleIter ait=v1.GetHandle().AtomsBegin();ait!=v1.GetHandle().AtomsEnd();++ait){
+        AtomHandle aitv = *ait;
+        String atomname=aitv.GetName();            
+        String firstletter=atomname.substr(0,1);
+        aitv.SetElement(firstletter);
+      }
+    }  
+    std::cout << "File: " << files[i] << std::endl; 
+    std::pair<int,int> cov = compute_coverage(v,glob_dist_list);
+    std::cout << "Coverage: " << (float(cov.first)/float(cov.second)) << " (" << cov.first << " out of " << cov.second << " residues)" << std::endl;
+
+    if (structural_checks) {
+      boost::filesystem::path loc(parameter_filename);
+      boost::filesystem::ifstream infile(loc);
+      if (!infile) {
+        std::cout << "Could not find " << parameter_filename << std::endl;
+        exit(-1);
+      }
+      std::vector<String> stereo_chemical_props;
+      String line;
+      while (std::getline(infile, line))
+      {
+        std::stringstream line_stream(line);
+        stereo_chemical_props.push_back(line);
+      }
+      StereoChemicalParams bond_table = FillStereoChemicalParams("Bond",stereo_chemical_props);
+      if (bond_table.IsEmpty()) {
+        std::cout << "Error reading the Bond section of the stereo-chemical parameter file." << std::endl;
+        exit(-1);
+      }
+      StereoChemicalParams angle_table = FillStereoChemicalParams("Angle",stereo_chemical_props);
+      if (angle_table.IsEmpty()) {
+        std::cout << "Error reading the Angles section of the stereo-chemical parameter file." << std::endl;
+        exit(-1);
+      }
+
+      ClashingDistances nonbonded_table = FillClashingDistances(stereo_chemical_props,min_default_distance,min_distance_tolerance);
+
+      if (nonbonded_table.IsEmpty()) {
+        std::cout << "Error reading the Clashing section of the stereo-chemical parameter file." << std::endl;
+        exit(-1);
+      }  
+      EntityView v=alg::CheckStereoChemistry(v,bond_table,angle_table,bond_tolerance,angle_tolerance);
+      cov = compute_coverage(v,glob_dist_list);
+      std::cout << "Coverage after stereo-chemical checks: " << (float(cov.first)/float(cov.second)) << " (" << cov.first << " out of " << cov.second << " residues)" << std::endl;
+      v=alg::FilterClashes(v,nonbonded_table);
+      cov = compute_coverage(v,glob_dist_list);
+      std::cout << "Coverage after clashing checks: " << (float(cov.first)/float(cov.second)) << " (" << cov.first << " out of " << cov.second << " residues)" << std::endl;
     }
-    float cutoffs[]={0.5,1,2,4};
-    float ldt=0.0;
-    for (int n=0; n<4; ++n) {
-      ldt+=alg::LocalDistTest(v, ref_view, cutoffs[n], 8.0);
+    if (cov.first==0) {
+      std::cout << "Global LDT score: 0.0" << std::endl;
+      return 0;
     }
-    ldt/=4.0;
-    std::cout << files[i] << " " << ldt << std::endl;
+    Real ldt=LDTHA(v, glob_dist_list);
+
+    std::cout << "Global LDT score: " << ldt << std::endl;
+    std::cout << "Local LDT Score:" << std::endl;
+    std::cout << "Chain\tResName\tResNum\tScore" << std::endl;
+    String labels[]={"localldt0.5","localldt1","localldt2","ldtlocal4"};
+    for (ResidueViewIter rit=v.ResiduesBegin();rit!=v.ResiduesEnd();++rit){
+      ResidueView ritv = *rit;
+      Real ldt_local_sum = 0;
+      if (ritv.HasProp("localldt0.5")) {
+        for (int n=0; n<4; ++n) {
+          ldt_local_sum+=ritv.GetFloatProp(labels[n]);
+        }
+        ldt_local_sum/=4.0;
+        std::cout << ritv.GetChain() << "\t" << ritv.GetName() << "\t" << ritv.GetNumber() << '\t' << ldt_local_sum << std::endl;
+      }
+    }
+    std::cout << std::endl;
   }
   return 0;
-}
\ No newline at end of file
+}
diff --git a/modules/mol/alg/src/local_dist_test.cc b/modules/mol/alg/src/local_dist_test.cc
index 5441f681b2349797eb6b0a38266d63285dbe7616..83d842226ac03a401796a111dcdf3334365f8a61 100644
--- a/modules/mol/alg/src/local_dist_test.cc
+++ b/modules/mol/alg/src/local_dist_test.cc
@@ -1,6 +1,7 @@
 #include <ost/log.hh>
 #include <ost/mol/mol.hh>
 #include "local_dist_test.hh"
+#include <boost/concept_check.hpp>
 
 namespace ost { namespace mol { namespace alg {
 
@@ -37,7 +38,8 @@ bool swappable(const String& rname, const String& aname)
   if (rname=="ASP") {
     return (aname=="OD1" || aname=="OD2");
   }
-  if (rname=="VAL") {
+  if (rname=="VAL") {     
+
     return (aname=="CG1" || aname=="CG2");
   }
   if (rname=="TYR" || rname=="PHE") {
@@ -49,73 +51,103 @@ bool swappable(const String& rname, const String& aname)
   return false;
 }
 
-std::pair<Real, Real> calc_overlap1(ResidueView ref_res, 
-                                    EntityView ref,
+std::pair<bool,Real> within_tolerance(Real mdl_dist, const ReferenceDistance& ref_dist, Real tol)
+{
+  Real min = ref_dist.GetMaxDistance();
+  Real max = ref_dist.GetMaxDistance();
+  bool within_tol = false;
+  Real difference = 0;
+  if (mdl_dist>=min && mdl_dist <=max) {
+    within_tol=true;
+  } else if (mdl_dist < min && std::abs(min-mdl_dist) < tol) {
+    within_tol = true;
+  } else if (mdl_dist > max && std::abs(mdl_dist-max) < tol) {
+    within_tol = true;
+  }
+  if (within_tol == false) {
+    if (mdl_dist > max) {
+      difference = mdl_dist-(max+tol);
+    } else {
+      difference = mdl_dist-(min-tol);
+    }
+  }  
+  return std::make_pair<bool,Real>(within_tol,difference);  
+}      
+
+
+std::pair<Real, Real> calc_overlap1(const ResidueDistanceList& res_distance_list, 
                                     ChainView mdl_chain, 
-                                    Real tol, Real max_dist, bool only_fixed, 
-                                    bool swap,std::vector<std::pair<Real, Real> >& overlap_list )
+                                    Real tol, bool only_fixed, 
+                                    bool swap,std::vector<std::pair<Real, Real> >& overlap_list, bool log )
 {
   std::pair<Real, Real> overlap(0.0, 0.0);
-  AtomViewList ref_atoms=ref_res.GetAtomList();
 
-  ResidueView mdl_res=mdl_chain.FindResidue(ref_res.GetNumber());
-  AtomViewList within;
-  if (max_dist<0){
-      within=ref.GetAtomList();
-  }
-  for (AtomViewList::iterator ai=ref_atoms.begin(),
-       ae=ref_atoms.end(); ai!=ae; ++ai) {
-    if (ai->GetElement()=="H") { continue; }
-    String name=swap ? swapped_name(ai->GetName()) : ai->GetName();
+  ResidueView mdl_res=mdl_chain.FindResidue(res_distance_list[0].GetFirstAtom().GetResNum()); 
+  for (ResidueDistanceList::const_iterator ai=res_distance_list.begin(),
+       ae=res_distance_list.end(); ai!=ae; ++ai) {
+    UniqueAtomIdentifier first_atom=ai->GetFirstAtom();
+    UniqueAtomIdentifier second_atom=ai->GetSecondAtom();
+    String name=swap ? swapped_name(first_atom.GetAtomName()) : first_atom.GetAtomName();
     AtomView av1=mdl_res ? mdl_res.FindAtom(name) : AtomView();
-    if (max_dist>=0){ 
-      within=ref.FindWithin(ai->GetPos(), max_dist);
-    }
-    for (AtomViewList::iterator aj=within.begin(),
-         ae2=within.end(); aj!=ae2; ++aj) {
-      if (aj->GetElement()=="H") { continue; }
-      if (only_fixed) {
-        if (aj->GetResidue().GetNumber()==ref_res.GetNumber()) {
+ 
+    if (only_fixed) {
+      if (swappable(second_atom.GetResidueName(), second_atom.GetAtomName())) {
           continue;
-        }
-        if (swappable(aj->GetResidue().GetName(), aj->GetName())) {
-          continue;
-        }
-        AtomView av2=mdl_chain.FindAtom(aj->GetResidue().GetNumber(), 
-                                        aj->GetName());
-        overlap.second+=1.0;
-        if (!(av1 && av2)) {
-          continue;
-        }
-        Real mdl_dist=geom::Length(av1.GetPos()-av2.GetPos());
-        Real ref_dist=geom::Length(ai->GetPos()-aj->GetPos());
-        if (std::abs(mdl_dist-ref_dist)<tol) {
-          overlap.first+=1;
-        }
+      }
+      AtomView av2=mdl_chain.FindAtom(second_atom.GetResNum(),second_atom.GetAtomName());
+      overlap.second+=1.0;
+      if (!(av1 && av2)) {
         continue;
       }
-      if (aj->GetResidue().GetNumber()>ref_res.GetNumber()) {
-        AtomView av2=mdl_chain.FindAtom(aj->GetResidue().GetNumber(), 
-                                             aj->GetName());
-        overlap.second+=1.0;
-        overlap_list[ref_res.GetIndex()].second+=1.0;
-        overlap_list[aj->GetResidue().GetIndex()].second+=1.0;
-        if (!(av1 && av2)) {
-          continue;
-        }
-        Real mdl_dist=geom::Length(av1.GetPos()-av2.GetPos());
-        Real ref_dist=geom::Length(ai->GetPos()-aj->GetPos());
-        if (std::abs(mdl_dist-ref_dist)<tol) {
-          overlap.first+=1;
-          overlap_list[ref_res.GetIndex()].first+=1.0;
-          overlap_list[aj->GetResidue().GetIndex()].first+=1.0;
-        }
+      Real mdl_dist=geom::Length(av1.GetPos()-av2.GetPos());
+      ReferenceDistance ref_dist=*ai;
+      if (within_tolerance(mdl_dist,ref_dist,tol).first) {
+        if (log) {
+          LOG_VERBOSE("LDT:" << " " << av1.GetResidue().GetChain() << " " << av1.GetResidue().GetName() << " " << av1.GetResidue().GetNumber() << " " << av1.GetName() 
+             << " " << av2.GetResidue().GetChain() << " " << av2.GetResidue().GetName() << " " << av2.GetResidue().GetNumber() << " " << av2.GetName() << " " 
+             << mdl_dist << " " << ref_dist.GetMinDistance() << " " << ref_dist.GetMaxDistance() << " " << tol << " " << "PASS")
+        }   
+        overlap.first+=1;
+      } else {
+        if (log) {
+          LOG_VERBOSE("LDT:" << " " << av1.GetResidue().GetChain() << " " << av1.GetResidue().GetName() << " " << av1.GetResidue().GetNumber() << " " << av1.GetName() 
+             << " " << av2.GetResidue().GetChain() << " " << av2.GetResidue().GetName() << " " << av2.GetResidue().GetNumber() << " " << av2.GetName() << " " 
+             << mdl_dist << " " << ref_dist.GetMinDistance() << " " << mdl_dist-ref_dist.GetMinDistance() << " " << tol << " " << "FAIL")
+        }  
       }
-    }      
-  }
+      continue;
+    }
+    AtomView av2=mdl_chain.FindAtom(second_atom.GetResNum(), second_atom.GetAtomName());
+    overlap.second+=1.0;
+    if (av1) {
+      overlap_list[av1.GetResidue().GetIndex()].second+=1.0;
+    }
+    if (av2) {
+      overlap_list[av2.GetResidue().GetIndex()].second+=1.0;
+     }  
+    if (!(av1 && av2)) {
+      continue;
+    }
+    
+    Real mdl_dist=geom::Length(av1.GetPos()-av2.GetPos());
+    ReferenceDistance ref_dist=*ai;
+    if (within_tolerance(mdl_dist,ref_dist,tol).first) {
+      LOG_VERBOSE("LDT:" << " " << av1.GetResidue().GetChain() << " " << av1.GetResidue().GetName() << " " << av1.GetResidue().GetNumber() << " " << av1.GetName() 
+           << " " << av2.GetResidue().GetChain() << " " << av2.GetResidue().GetName() << " " << av2.GetResidue().GetNumber() << " " << av2.GetName() << " " 
+           << mdl_dist << " " << ref_dist.GetMinDistance() << " " << mdl_dist-ref_dist.GetMinDistance() << " " << tol << " " << "PASS")
+      overlap.first+=1;
+      overlap_list[av1.GetResidue().GetIndex()].first+=1.0;
+      overlap_list[av2.GetResidue().GetIndex()].first+=1.0;
+    } else {
+      LOG_VERBOSE("LDT:" << " " << av1.GetResidue().GetChain() << " " << av1.GetResidue().GetName() << " " << av1.GetResidue().GetNumber() << " " << av1.GetName() 
+             << " " << av2.GetResidue().GetChain() << " " << av2.GetResidue().GetName() << " " << av2.GetResidue().GetNumber() << " " << av2.GetName() << " " 
+             << mdl_dist << " " << ref_dist.GetMinDistance() << " " << mdl_dist-ref_dist.GetMinDistance() << " " << tol << " " << "FAIL")
+    } 
+  }    
   return overlap;
 }
 
+
 std::pair<Real, Real> calc_overlap2(const seq::ConstSequenceHandle& ref_seq,
                                     const seq::ConstSequenceHandle& mdl_seq,
                                     int pos, Real tol, Real max_dist, 
@@ -143,7 +175,10 @@ std::pair<Real, Real> calc_overlap2(const seq::ConstSequenceHandle& ref_seq,
     }
     for (AtomViewList::iterator aj=within.begin(),
          ae2=within.end(); aj!=ae2; ++aj) {
-      if (aj->GetElement()=="H") { continue; }
+      if (aj->GetElement()=="H" || 
+          aj->GetResidue().GetChain()!=ai->GetResidue().GetChain()) { 
+          continue; 
+      }
       if (only_fixed) {
         if (aj->GetResidue().GetNumber()==ref_res.GetNumber()) {
           continue;
@@ -172,7 +207,8 @@ std::pair<Real, Real> calc_overlap2(const seq::ConstSequenceHandle& ref_seq,
         continue;
       } else {
         if (aj->GetResidue().GetNumber()>ref_res.GetNumber()) {
-          overlap.second+=1.0;
+          overlap.second+=1.0;    
+
           try {
            int aln_pos=ref_seq.GetPos(aj->GetResidue().GetIndex());
             ResidueView r2=mdl_seq.GetResidue(aln_pos);
@@ -198,81 +234,194 @@ std::pair<Real, Real> calc_overlap2(const seq::ConstSequenceHandle& ref_seq,
 
 }
 
-Real LocalDistTest(const EntityView& mdl, const EntityView& ref,
-                   Real cutoff, Real max_dist, const String& local_ldt_property_string)
+bool IsStandardResidue(String rn)
+{
+  String upper_rn=rn;
+  std::transform(rn.begin(),rn.end(),rn.begin(),toupper);
+  if (upper_rn == "ALA" ||    
+  upper_rn == "ARG" ||
+  upper_rn == "ASN" ||
+  upper_rn == "ASP" ||
+  upper_rn == "GLN" ||
+  upper_rn == "GLU" ||
+  upper_rn == "LYS" ||
+  upper_rn == "SER" ||
+  upper_rn == "CYS" ||      
+  upper_rn == "TYR" ||  
+  upper_rn == "TRP" || 
+  upper_rn == "THR" ||
+  upper_rn == "VAL" ||
+  upper_rn == "ILE" ||
+  upper_rn == "MET" ||
+  upper_rn == "LEU" ||  
+  upper_rn == "GLY" ||  
+  upper_rn == "PRO" ||  
+  upper_rn == "HIS" ||  
+  upper_rn == "PHE") {
+    return true;
+  }  
+  return false;
+}  
+
+bool UniqueAtomIdentifier::operator==(const UniqueAtomIdentifier& rhs) const
+{
+  if (chain_ == rhs.GetChainName() && 
+      residue_ == rhs.GetResNum() &&
+      residue_name_ == rhs.GetResidueName() &&
+      atom_ == rhs.GetAtomName() ) {
+    return true;
+  }
+  return false;   
+}
+
+bool ReferenceDistance::IsValid() const 
+{
+  if (mind_ == -1.0 and maxd_ == -1.0) {
+    return false;
+  } 
+  return true;
+}
+
+void ReferenceDistance::Print() const 
+{ 
+  if (this->IsValid() == true) {
+    std::cout << first_atom_.GetChainName() << " " << first_atom_.GetResNum() << " " << first_atom_.GetResidueName() << " " << first_atom_.GetAtomName() << " " <<
+                 second_atom_.GetChainName() << " " << second_atom_.GetResNum() << " " << second_atom_.GetResidueName() << " " << second_atom_.GetAtomName() << " " <<
+                 mind_ << " " << maxd_ << std::endl; 
+  } else {
+    std::cout << first_atom_.GetChainName() << " " << first_atom_.GetResNum() << " " << first_atom_.GetResidueName() << " Placeholder" << std::endl;
+  }
+}
+
+bool ReferenceDistance::operator==(const ReferenceDistance& rhs) const
+{
+  if (first_atom_ == rhs.GetFirstAtom() && 
+      second_atom_ == rhs.GetSecondAtom() &&
+      mind_ == rhs.GetMinDistance() &&
+      maxd_ == rhs.GetMaxDistance() ) {
+    return true;
+  }
+  return false;
+}
+
+
+
+
+GlobalDistanceList CreateDistanceList(const EntityView& ref,Real max_dist)
+{
+ GlobalDistanceList dist_list; 
+ ResidueViewList ref_residues=ref.GetChainList()[0].GetResidueList();
+ for (ResidueViewList::iterator i=ref_residues.begin(), e=ref_residues.end(); i!=e; ++i) {
+   ResidueView rview = (*i);
+   if (IsStandardResidue(rview.GetName())) {
+     ResidueDistanceList res_dist_list;
+     AtomViewList ref_atoms=(*i).GetAtomList();
+     AtomViewList within;
+     if (max_dist<0){
+     dist_list.push_back(res_dist_list);
+       within=ref.GetAtomList();
+     }  
+     for (AtomViewList::iterator ai=ref_atoms.begin(), ae=ref_atoms.end(); ai!=ae; ++ai) {
+       UniqueAtomIdentifier first_atom(ai->GetResidue().GetChain().GetName(),ai->GetResidue().GetNumber(),ai->GetResidue().GetName(),ai->GetName());
+       if (ai->GetElement()=="H") { continue; }
+       if (max_dist>=0){ 
+         within=ref.FindWithin(ai->GetPos(), max_dist);
+       }
+       for (AtomViewList::iterator aj=within.begin(), ae2=within.end(); aj!=ae2; ++aj) {      
+         UniqueAtomIdentifier second_atom(aj->GetResidue().GetChain().GetName(),aj->GetResidue().GetNumber(),aj->GetResidue().GetName(),aj->GetName());
+         if (aj->GetElement()=="H" ||
+             aj->GetResidue().GetChain()!=ai->GetResidue().GetChain()) {
+             continue;
+         }
+         if (aj->GetResidue().GetNumber()>i->GetNumber()) {
+           Real dist=geom::Length(ai->GetPos()-aj->GetPos());
+           ReferenceDistance ref_dist(first_atom,second_atom,dist,dist);
+           res_dist_list.push_back(ref_dist);
+         }
+       }
+     }
+     if (res_dist_list.size()==0) {
+       UniqueAtomIdentifier current_residue_fake_atom(rview.GetChain().GetName(),rview.GetNumber(),rview.GetName(),"CA");
+       ReferenceDistance fake_ref_distance(current_residue_fake_atom,current_residue_fake_atom,-1.0,-1.0);
+       res_dist_list.push_back(fake_ref_distance);
+     }  
+     dist_list.push_back(res_dist_list);
+   }
+ }  
+ return dist_list;
+} 
+
+
+Real LocalDistTest(const EntityView& mdl, const GlobalDistanceList& glob_dist_list,
+                   Real cutoff, const String& local_ldt_property_string)
 {
-    
   if (!mdl.GetResidueCount()) {
     LOG_WARNING("model structures doesn't contain any residues");
     return 0.0;
   }
-
-  if (!ref.GetResidueCount()) {
-    LOG_WARNING("reference structures doesn't contain any residues");
+  if (glob_dist_list.size()==0) {
+    LOG_WARNING("global reference list is empty");
     return 0.0;
   }
-  ResidueViewList ref_residues=ref.GetResidueList();  
-  std::vector<std::pair<Real, Real> > overlap_list(ref_residues.size(), std::pair<Real, Real>(0.0, 0.0));
+  std::vector<std::pair<Real, Real> > overlap_list(mdl.GetResidueCount(), std::pair<Real, Real>(0.0, 0.0));
   ChainView mdl_chain=mdl.GetChainList()[0];  
   // Residues with symmetric side-chains require special treatment as there are 
   // two possible ways to name the atoms. We calculate the overlap with the 
   // fixed atoms and take the solution that gives bigger scores.
-  XCSEditor edi=ref.GetHandle().EditXCS(BUFFERED_EDIT);
-  for (ResidueViewList::iterator
-       i=ref_residues.begin(), e=ref_residues.end(); i!=e; ++i) {
-    const String rname=i->GetName();
-    ResidueView mdl_res=mdl_chain.FindResidue(i->GetNumber());
-    if (!mdl_res) {
-     continue;
-    }     
-    if (!(rname=="GLU" || rname=="ASP" || rname=="VAL" || rname=="TYR" || 
-         rname=="PHE" || rname=="LYS" || rname=="ARG")) {
+  XCSEditor edi=mdl.GetHandle().EditXCS(BUFFERED_EDIT);
+  for (GlobalDistanceList::const_iterator i=glob_dist_list.begin(), e=glob_dist_list.end(); i!=e; ++i) {
+    ResidueDistanceList rdl = *i;
+    if (!rdl[0].IsValid()) {
       continue;
     }
-
-    std::pair<Real, Real> ov1=calc_overlap1(*i, ref, mdl_chain, 
-                                          cutoff, max_dist, true, 
-                                          false, overlap_list);
-    std::pair<Real, Real> ov2=calc_overlap1(*i, ref, mdl_chain, 
-                                          cutoff, max_dist, true, 
-                                          true, overlap_list); 
+    
+    ResNum rnum =  rdl[0].GetFirstAtom().GetResNum() ;
+    String rname=rdl[0].GetFirstAtom().GetResidueName();
+    ResidueView mdl_res=mdl_chain.FindResidue(rnum);  
+    if (!mdl_res) {   
+      continue;
+    }
+    if (!(rname=="GLU" || rname=="ASP" || rname=="VAL" || rname=="TYR" || rname=="PHE" || rname=="LYS" || rname=="ARG")) {
+      continue;
+    }
+    std::pair<Real, Real> ov1=calc_overlap1(*i, mdl_chain, 
+                                          cutoff, true, 
+                                          false, overlap_list,false);
+ 
+    std::pair<Real, Real> ov2=calc_overlap1(*i, mdl_chain, 
+                                          cutoff, true, 
+                                          true, overlap_list,false); 
     if (ov1.first/ov1.second<ov2.first/ov2.second) {
-     AtomViewList atoms=mdl_res.GetAtomList();
-     for (AtomViewList::iterator j=atoms.begin(), 
-          e2=atoms.end(); j!=e2; ++j) {
-       if (swappable(rname, j->GetName())) {
-         edi.RenameAtom(j->GetHandle(), swapped_name(j->GetName()));
-       }
-     }
+      AtomViewList atoms=mdl_res.GetAtomList();
+      for (AtomViewList::iterator j=atoms.begin(), e2=atoms.end(); j!=e2; ++j) {
+        if (swappable(rname, j->GetName())) {
+          edi.RenameAtom(j->GetHandle(), swapped_name(j->GetName()));
+        }
+      }
     }
   }
+  overlap_list.clear();
   std::pair<Real, Real> total_ov(0.0, 0.0);
-  for (ResidueViewList::iterator
-       i=ref_residues.begin(), e=ref_residues.end(); i!=e; ++i) {
-     std::pair<Real, Real> ov1=calc_overlap1(*i, ref, mdl_chain, cutoff, 
-                                            max_dist, false, false, overlap_list);
-     total_ov.first+=ov1.first;
-     total_ov.second+=ov1.second;
-  }
-
-  // attach local per-residue LDT as property:
-  if(local_ldt_property_string!="") {
-    for (ResidueViewList::iterator
-       i=ref_residues.begin(), e=ref_residues.end(); i!=e; ++i) {
-     std::pair<Real, Real> ov1=calc_overlap1(*i, ref, mdl_chain, cutoff, 
-                                            max_dist, false, false, overlap_list);
-     total_ov.first+=ov1.first;
-     total_ov.second+=ov1.second;
-     Real local_ldt=overlap_list[(*i).GetIndex()].first/(overlap_list[(*i).GetIndex()].second ? overlap_list[(*i).GetIndex()].second : 1);
-     if (mdl_chain.FindResidue((*i).GetNumber()).IsValid()) {
-      ResidueView mdl_res=mdl_chain.FindResidue((*i).GetNumber());
-      mdl_res.SetFloatProp(local_ldt_property_string, local_ldt);
-     }
+  for (GlobalDistanceList::const_iterator i=glob_dist_list.begin(), e=glob_dist_list.end(); i!=e; ++i) {
+    ResidueDistanceList rdl = *i;
+    if (rdl[0].IsValid()) {
+      std::pair<Real, Real> ov1=calc_overlap1(*i, mdl_chain, cutoff, 
+                                            false, false, overlap_list,true);
+      total_ov.first+=ov1.first;
+      total_ov.second+=ov1.second;       
     }
-      mdl_chain.SetFloatProp(local_ldt_property_string, total_ov.first/(total_ov.second ? total_ov.second : 1));
+    if(local_ldt_property_string!="") {
+      ResNum rn = rdl[0].GetFirstAtom().GetResNum();
+      ResidueView mdlr=mdl_chain.FindResidue(rn);  
+      if (mdlr.IsValid()) {
+        int mdl_res_index =mdlr.GetIndex();
+        Real local_ldt=overlap_list[mdl_res_index].first/(overlap_list[mdl_res_index].second ? overlap_list[mdl_res_index].second : 1);
+        ResidueView res_to_wr = mdl_chain.FindResidue((*i)[0].GetFirstAtom().GetResNum()); 
+        res_to_wr.SetFloatProp(local_ldt_property_string, local_ldt);
+      }  
+    }       
   }
   overlap_list.clear();
-
   return total_ov.first/(total_ov.second ? total_ov.second : 1);
 }
 
@@ -327,4 +476,17 @@ Real LocalDistTest(const ost::seq::AlignmentHandle& aln,
   return 0.0;
 }
 
+Real LDTHA(EntityView& v, const GlobalDistanceList& global_dist_list)
+{
+    
+    Real cutoffs[]={0.5,1,2,4};
+    String labels[]={"localldt0.5","localldt1","localldt2","ldtlocal4"};
+    Real ldt=0.0;   
+    for (int n=0; n<4; ++n) { 
+      ldt+=alg::LocalDistTest(v, global_dist_list, cutoffs[n], labels[n]);
+    }      
+    ldt/=4.0;    
+    return ldt;
+}
+
 }}}
diff --git a/modules/mol/alg/src/local_dist_test.hh b/modules/mol/alg/src/local_dist_test.hh
index 76ef238034ea095ec26eebff64e08e48b60b0e8e..74e0f4f29ca00b54340a683a036904d3eb66e596 100644
--- a/modules/mol/alg/src/local_dist_test.hh
+++ b/modules/mol/alg/src/local_dist_test.hh
@@ -25,15 +25,70 @@
 
 namespace ost { namespace mol { namespace alg {
   
+  
+class UniqueAtomIdentifier
+{
+  
+public:
+  UniqueAtomIdentifier(const String& chain,const ResNum& residue,const String& residue_name, const String& atom): chain_(chain),residue_(residue),residue_name_(residue_name),atom_(atom) {}  
+  
+  String GetChainName() const { return chain_; } 
+  ResNum GetResNum() const { return residue_; }  
+  String GetResidueName() const { return residue_name_; }
+  String GetAtomName() const { return atom_; }
+  bool operator==(const UniqueAtomIdentifier& rhs) const;
+    
+private:
+
+  String chain_;
+  ResNum residue_;
+  String residue_name_;
+  String atom_;    
+};
+
+class ReferenceDistance
+{
+  
+public:
+  
+  ReferenceDistance(const UniqueAtomIdentifier& first_atom, const UniqueAtomIdentifier& second_atom, Real mind, Real maxd):
+       first_atom_(first_atom),second_atom_(second_atom),mind_(mind),maxd_(maxd) {}
+  UniqueAtomIdentifier GetFirstAtom() const {return first_atom_;}
+  UniqueAtomIdentifier GetSecondAtom() const {return second_atom_;}
+  Real GetMinDistance() const {return mind_ ;}
+  Real GetMaxDistance() const {return maxd_ ;}
+  bool IsValid() const; 
+  void Print() const; 
+  bool operator==(const ReferenceDistance& rhs) const;
+  
+private:
+  
+  UniqueAtomIdentifier first_atom_;
+  UniqueAtomIdentifier second_atom_;
+  Real mind_;
+  Real maxd_;
+};
+
+typedef std::vector<ReferenceDistance> ResidueDistanceList;
+typedef std::vector<ResidueDistanceList> GlobalDistanceList;
+  
 Real DLLEXPORT_OST_MOL_ALG LocalDistTest(const EntityView& mdl,
-                                         const EntityView& ref,
-                                         Real cutoff, Real max_dist,
+                                         const GlobalDistanceList& dist_list,
+                                         Real cutoff, 
                                          const String& local_ldt_property_string="");
 
 Real DLLEXPORT_OST_MOL_ALG LocalDistTest(const ost::seq::AlignmentHandle& aln,
-                                         Real cutoff, Real max_dist, 
+                                         Real cutoff, Real max_dist,
                                          int ref_index=0, int mdl_index=1);
 
+
+Real DLLEXPORT_OST_MOL_ALG LDTHA(EntityView& v, const GlobalDistanceList& global_dist_list);
+
+GlobalDistanceList CreateDistanceList(const EntityView& ref,Real max_dist);
+bool IsStandardResidue(String rn);
+
+
+
 }}}
 
 #endif
diff --git a/modules/mol/alg/src/new_stereo_chemical_props.txt b/modules/mol/alg/src/new_stereo_chemical_props.txt
new file mode 100644
index 0000000000000000000000000000000000000000..25262efd7689fc76f4d6ea1a7c75e342e840ea1d
--- /dev/null
+++ b/modules/mol/alg/src/new_stereo_chemical_props.txt
@@ -0,0 +1,345 @@
+Bond			Residue		Mean		StdDev
+CA-CB			ALA		1.520		0.021
+N-CA			ALA		1.459		0.020
+CA-C			ALA		1.525		0.026
+C-O			ALA		1.229		0.019
+CA-CB			ARG		1.535		0.022
+CB-CG			ARG		1.521		0.027
+CG-CD			ARG		1.515		0.025
+CD-NE			ARG		1.460		0.017
+NE-CZ			ARG		1.326		0.013
+CZ-NH1			ARG		1.326		0.013
+CZ-NH2			ARG		1.326		0.013
+N-CA			ARG		1.459		0.020
+CA-C			ARG		1.525		0.026
+C-O			ARG		1.229		0.019
+CA-CB			ASN		1.527		0.026
+CB-CG			ASN		1.506		0.023
+CG-OD1			ASN		1.235		0.022
+CG-ND2			ASN		1.324		0.025
+N-CA			ASN		1.459		0.020
+CA-C			ASN		1.525		0.026
+C-O			ASN		1.229		0.019
+CA-CB			ASP		1.535		0.022
+CB-CG			ASP		1.513		0.021
+CG-OD1			ASP		1.249		0.023
+CG-OD2			ASP		1.249		0.023
+N-CA			ASP		1.459		0.020
+CA-C			ASP		1.525		0.026
+C-O			ASP		1.229		0.019
+CA-CB			CYS		1.526		0.013
+CB-SG			CYS		1.812		0.016
+N-CA			CYS		1.459		0.020
+CA-C			CYS		1.525		0.026
+C-O			CYS		1.229		0.019
+CA-CB			GLU		1.535		0.022
+CB-CG			GLU		1.517		0.019
+CG-CD			GLU		1.515		0.015
+CD-OE1			GLU		1.252		0.011
+CD-OE2			GLU		1.252		0.011
+N-CA			GLU		1.459		0.020
+CA-C			GLU		1.525		0.026
+C-O			GLU		1.229		0.019
+CA-CB			GLN		1.535		0.022
+CB-CG			GLN		1.521		0.027
+CG-CD			GLN		1.506		0.023
+CD-OE1			GLN		1.235		0.022
+CD-NE2			GLN		1.324		0.025
+N-CA			GLN		1.459		0.020
+CA-C			GLN		1.525		0.026
+C-O			GLN		1.229		0.019
+N-CA			GLY		1.456		0.015
+CA-C			GLY		1.514		0.016
+C-O			GLY		1.232		0.016
+CA-CB			HIS		1.535		0.022
+CB-CG			HIS		1.492		0.016
+CG-ND1			HIS		1.369		0.015
+CG-CD2			HIS		1.353		0.017
+ND1-CE1			HIS		1.343		0.025
+CD2-NE2			HIS		1.415		0.021
+CE1-NE2			HIS		1.322		0.023
+N-CA			HIS		1.459		0.020
+CA-C			HIS		1.525		0.026
+C-O			HIS		1.229		0.019
+CA-CB			ILE		1.544		0.023
+CB-CG1			ILE		1.536		0.028
+CB-CG2			ILE		1.524		0.031
+CG1-CD1			ILE		1.500		0.069
+N-CA			ILE		1.459		0.020
+CA-C			ILE		1.525		0.026
+C-O			ILE		1.229		0.019
+CA-CB			LEU		1.533		0.023
+CB-CG			LEU		1.521		0.029
+CG-CD1			LEU		1.514		0.037
+CG-CD2			LEU		1.514		0.037
+N-CA			LEU		1.459		0.020
+CA-C			LEU		1.525		0.026
+C-O			LEU		1.229		0.019
+CA-CB			LYS		1.535		0.022
+CB-CG			LYS		1.521		0.027
+CG-CD			LYS		1.520		0.034
+CD-CE			LYS		1.508		0.025
+CE-NZ			LYS		1.486		0.025
+N-CA			LYS		1.459		0.020
+CA-C			LYS		1.525		0.026
+C-O			LYS		1.229		0.019
+CA-CB			MET		1.535		0.022
+CB-CG			MET		1.509		0.032
+CG-SD			MET		1.807		0.026
+SD-CE			MET		1.774		0.056
+N-CA			MET		1.459		0.020
+CA-C			MET		1.525		0.026
+C-O			MET		1.229		0.019
+CA-CB			PHE		1.535		0.022
+CB-CG			PHE		1.509		0.017
+CG-CD1			PHE		1.383		0.015
+CG-CD2			PHE		1.383		0.015
+CD1-CE1			PHE		1.388		0.020
+CD2-CE2			PHE		1.388		0.020
+CE1-CZ			PHE		1.369		0.019
+CE2-CZ			PHE		1.369		0.019
+N-CA			PHE		1.459		0.020
+CA-C			PHE		1.525		0.026
+C-O			PHE		1.229		0.019
+CA-CB			PRO		1.531		0.020
+CB-CG			PRO		1.495		0.050
+CG-CD			PRO		1.502		0.033
+CD-N			PRO		1.474		0.014
+N-CA			PRO		1.468		0.017
+CA-C			PRO		1.524		0.020
+C-O			PRO		1.228		0.020
+CA-CB			SER		1.525		0.015
+CB-OG			SER		1.418		0.013
+N-CA			SER		1.459		0.020
+CA-C			SER		1.525		0.026
+C-O			SER		1.229		0.019
+CA-CB			THR		1.529		0.026
+CB-OG1			THR		1.428		0.020
+CB-CG2			THR		1.519		0.033
+N-CA			THR		1.459		0.020
+CA-C			THR		1.525		0.026
+C-O			THR		1.229		0.019
+CA-CB			TRP		1.535		0.022
+CB-CG			TRP		1.498		0.018
+CG-CD1			TRP		1.363		0.014
+CG-CD2			TRP		1.432		0.017
+CD1-NE1			TRP		1.375		0.017
+NE1-CE2			TRP		1.371		0.013
+CD2-CE2			TRP		1.409		0.012
+CD2-CE3			TRP		1.399		0.015
+CE2-CZ2			TRP		1.393		0.017
+CE3-CZ3			TRP		1.380		0.017
+CZ2-CH2			TRP		1.369		0.019
+CZ3-CH2			TRP		1.396		0.016
+N-CA			TRP		1.459		0.020
+CA-C			TRP		1.525		0.026
+C-O			TRP		1.229		0.019
+CA-CB			TYR		1.535		0.022
+CB-CG			TYR		1.512		0.015
+CG-CD1			TYR		1.387		0.013
+CG-CD2			TYR		1.387		0.013
+CD1-CE1			TYR		1.389		0.015
+CD2-CE2			TYR		1.389		0.015
+CE1-CZ			TYR		1.381		0.013
+CE2-CZ			TYR		1.381		0.013
+CZ-OH			TYR		1.374		0.017
+N-CA			TYR		1.459		0.020
+CA-C			TYR		1.525		0.026
+C-O			TYR		1.229		0.019
+CA-CB			VAL		1.543		0.021
+CB-CG1			VAL		1.524		0.021
+CB-CG2			VAL		1.524		0.021
+N-CA			VAL		1.459		0.020
+CA-C			VAL		1.525		0.026
+C-O			VAL		1.229		0.019
+-
+
+Angle			Residue		Mean		StdDev
+N-CA-CB			ALA		110.1		1.4
+CB-CA-C			ALA		110.1		1.5
+N-CA-C			ALA		111.0		2.7
+CA-C-O			ALA		120.1		2.1
+N-CA-CB			ARG		110.6		1.8
+CB-CA-C			ARG		110.4		2.0
+CA-CB-CG		ARG		113.4		2.2
+CB-CG-CD		ARG		111.6		2.6
+CG-CD-NE		ARG		111.8		2.1
+CD-NE-CZ		ARG		123.6		1.4
+NE-CZ-NH1		ARG		120.3		0.5
+NE-CZ-NH2		ARG		120.3		0.5
+NH1-CZ-NH2		ARG		119.4		1.1
+N-CA-C			ARG		111.0		2.7
+CA-C-O			ARG		120.1		2.1
+N-CA-CB			ASN		110.6		1.8
+CB-CA-C			ASN		110.4		2.0
+CA-CB-CG		ASN		113.4		2.2
+CB-CG-ND2		ASN		116.7		2.4
+CB-CG-OD1		ASN		121.6		2.0
+ND2-CG-OD1		ASN		121.9		2.3
+N-CA-C			ASN		111.0		2.7
+CA-C-O			ASN		120.1		2.1
+N-CA-CB			ASP		110.6		1.8
+CB-CA-C			ASP		110.4		2.0
+CA-CB-CG		ASP		113.4		2.2
+CB-CG-OD1		ASP		118.3		0.9
+CB-CG-OD2		ASP		118.3		0.9
+OD1-CG-OD2		ASP		123.3		1.9
+N-CA-C			ASP		111.0		2.7
+CA-C-O			ASP		120.1		2.1
+N-CA-CB			CYS		110.8		1.5
+CB-CA-C			CYS		111.5		1.2
+CA-CB-SG		CYS		114.2		1.1
+N-CA-C			CYS		111.0		2.7
+CA-C-O			CYS		120.1		2.1
+N-CA-CB			GLU		110.6		1.8
+CB-CA-C			GLU		110.4		2.0
+CA-CB-CG		GLU		113.4		2.2
+CB-CG-CD		GLU		114.2		2.7
+CG-CD-OE1		GLU		118.3		2.0
+CG-CD-OE2		GLU		118.3		2.0
+OE1-CD-OE2		GLU		123.3		1.2
+N-CA-C			GLU		111.0		2.7
+CA-C-O			GLU		120.1		2.1
+N-CA-CB			GLN		110.6		1.8
+CB-CA-C			GLN		110.4		2.0
+CA-CB-CG		GLN		113.4		2.2
+CB-CG-CD		GLN		111.6		2.6
+CG-CD-OE1		GLN		121.6		2.0
+CG-CD-NE2		GLN		116.7		2.4
+OE1-CD-NE2		GLN		121.9		2.3
+N-CA-C			GLN		111.0		2.7
+CA-C-O			GLN		120.1		2.1
+N-CA-C			GLY		113.1		2.5
+CA-C-O			GLY		120.6		1.8
+N-CA-CB			HIS		110.6		1.8
+CB-CA-C			HIS		110.4		2.0
+CA-CB-CG		HIS		113.6		1.7
+CB-CG-ND1		HIS		123.2		2.5
+CB-CG-CD2		HIS		130.8		3.1
+CG-ND1-CE1		HIS		108.2		1.4
+ND1-CE1-NE2		HIS		109.9		2.2
+CE1-NE2-CD2		HIS		106.6		2.5
+NE2-CD2-CG		HIS		109.2		1.9
+CD2-CG-ND1		HIS		106.0		1.4
+N-CA-C			HIS		111.0		2.7
+CA-C-O			HIS		120.1		2.1
+N-CA-CB			ILE		110.8		2.3
+CB-CA-C			ILE		111.6		2.0
+CA-CB-CG1		ILE		111.0		1.9
+CB-CG1-CD1		ILE		113.9		2.8
+CA-CB-CG2		ILE		110.9		2.0
+CG1-CB-CG2		ILE		111.4		2.2
+N-CA-C			ILE		111.0		2.7
+CA-C-O			ILE		120.1		2.1
+N-CA-CB			LEU		110.4		2.0
+CB-CA-C			LEU		110.2		1.9
+CA-CB-CG		LEU		115.3		2.3
+CB-CG-CD1		LEU		111.0		1.7
+CB-CG-CD2		LEU		111.0		1.7
+CD1-CG-CD2		LEU		110.5		3.0
+N-CA-C			LEU		111.0		2.7
+CA-C-O			LEU		120.1		2.1
+N-CA-CB			LYS		110.6		1.8
+CB-CA-C			LYS		110.4		2.0
+CA-CB-CG		LYS		113.4		2.2
+CB-CG-CD		LYS		111.6		2.6
+CG-CD-CE		LYS		111.9		3.0
+CD-CE-NZ		LYS		111.7		2.3
+N-CA-C			LYS		111.0		2.7
+CA-C-O			LYS		120.1		2.1
+N-CA-CB			MET		110.6		1.8
+CB-CA-C			MET		110.4		2.0
+CA-CB-CG		MET		113.3		1.7
+CB-CG-SD		MET		112.4		3.0
+CG-SD-CE		MET		100.2		1.6
+N-CA-C			MET		111.0		2.7
+CA-C-O			MET		120.1		2.1
+N-CA-CB			PHE		110.6		1.8
+CB-CA-C			PHE		110.4		2.0
+CA-CB-CG		PHE		113.9		2.4
+CB-CG-CD1		PHE		120.8		0.7
+CB-CG-CD2		PHE		120.8		0.7
+CD1-CG-CD2		PHE		118.3		1.3
+CG-CD1-CE1		PHE		120.8		1.1
+CG-CD2-CE2		PHE		120.8		1.1
+CD1-CE1-CZ		PHE		120.1		1.2
+CD2-CE2-CZ		PHE		120.1		1.2
+CE1-CZ-CE2		PHE		120.0		1.8
+N-CA-C			PHE		111.0		2.7
+CA-C-O			PHE		120.1		2.1
+N-CA-CB			PRO		103.3		1.2
+CB-CA-C			PRO		111.7		2.1
+CA-CB-CG		PRO		104.8		1.9
+CB-CG-CD		PRO		106.5		3.9
+CG-CD-N			PRO		103.2		1.5
+CA-N-CD			PRO		111.7		1.4
+N-CA-C			PRO		112.1		2.6
+CA-C-O			PRO		120.2		2.4
+N-CA-CB			SER		110.5		1.5
+CB-CA-C			SER		110.1		1.9
+CA-CB-OG		SER		111.2		2.7
+N-CA-C			SER		111.0		2.7
+CA-C-O			SER		120.1		2.1
+N-CA-CB			THR		110.3		1.9
+CB-CA-C			THR		111.6		2.7
+CA-CB-OG1		THR		109.0		2.1
+CA-CB-CG2		THR		112.4		1.4
+OG1-CB-CG2		THR		110.0		2.3
+N-CA-C			THR		111.0		2.7
+CA-C-O			THR		120.1		2.1
+N-CA-CB			TRP		110.6		1.8
+CB-CA-C			TRP		110.4		2.0
+CA-CB-CG		TRP		113.7		1.9
+CB-CG-CD1		TRP		127.0		1.3
+CB-CG-CD2		TRP		126.6		1.3
+CD1-CG-CD2		TRP		106.3		0.8
+CG-CD1-NE1		TRP		110.1		1.0
+CD1-NE1-CE2		TRP		109.0		0.9
+NE1-CE2-CD2		TRP		107.3		1.0
+CE2-CD2-CG		TRP		107.3		0.8
+CG-CD2-CE3		TRP		133.9		0.9
+NE1-CE2-CZ2		TRP		130.4		1.1
+CE3-CD2-CE2		TRP		118.7		1.2
+CD2-CE2-CZ2		TRP		122.3		1.2
+CE2-CZ2-CH2		TRP		117.4		1.0
+CZ2-CH2-CZ3		TRP		121.6		1.2
+CH2-CZ3-CE3		TRP		121.2		1.1
+CZ3-CE3-CD2		TRP		118.8		1.3
+N-CA-C			TRP		111.0		2.7
+CA-C-O			TRP		120.1		2.1
+N-CA-CB			TYR		110.6		1.8
+CB-CA-C			TYR		110.4		2.0
+CA-CB-CG		TYR		113.4		1.9
+CB-CG-CD1		TYR		121.0		0.6
+CB-CG-CD2		TYR		121.0		0.6
+CD1-CG-CD2		TYR		117.9		1.1
+CG-CD1-CE1		TYR		121.3		0.8
+CG-CD2-CE2		TYR		121.3		0.8
+CD1-CE1-CZ		TYR		119.8		0.9
+CD2-CE2-CZ		TYR		119.8		0.9
+CE1-CZ-CE2		TYR		119.8		1.6
+CE1-CZ-OH		TYR		120.1		2.7
+CE2-CZ-OH		TYR		120.1		2.7
+N-CA-C			TYR		111.0		2.7
+CA-C-O			TYR		120.1		2.1
+N-CA-CB			VAL		111.5		2.2
+CB-CA-C			VAL		111.4		1.9
+CA-CB-CG1		VAL		110.9		1.5
+CA-CB-CG2		VAL		110.9		1.5
+CG1-CB-CG2		VAL		110.9		1.6
+N-CA-C			VAL		111.0		2.7
+CA-C-O			VAL		120.1		2.1
+-
+
+Non-bonded distance     Minimum Dist    Tolerance
+C-C                     3.4             1.5
+C-N                     3.25            1.5
+C-S                     3.5             1.5
+C-O                     3.22            1.5
+N-N                     3.1             1.5
+N-S                     3.35            1.5
+N-O                     3.07            1.5
+O-S                     3.32            1.5
+O-O                     3.04            1.5
+S-S                     2.03            1.0
+-
diff --git a/modules/mol/alg/src/stereo_chemical_props.txt b/modules/mol/alg/src/stereo_chemical_props.txt
new file mode 100644
index 0000000000000000000000000000000000000000..f17af3cf31baf8789c648fb1d5f1eff1d882a46d
--- /dev/null
+++ b/modules/mol/alg/src/stereo_chemical_props.txt
@@ -0,0 +1,367 @@
+# This file contains stereochemical parameters used to evaluate the quality of models. 
+# Bond distances and Angles come from Engh,Huber (1991). Non bonded distances come from
+
+Bond			Residue		Mean		StdDev
+N-CA			ALA		1.458		0.019
+CA-C			ALA		1.525		0.021
+C-O			ALA		1.231		0.02
+CA-CB			ALA		1.521		0.033
+N-CA			CYS		1.458		0.019
+CA-C			CYS		1.525		0.021
+C-O			CYS		1.231		0.02
+CA-CB			CYS		1.53		0.02
+CB-SG			CYS		1.808		0.033
+N-CA			ASP		1.458		0.019
+CA-C			ASP		1.525		0.021
+C-O			ASP		1.231		0.02
+CA-CB			ASP		1.53		0.02
+CB-CG			ASP		1.516		0.025
+CG-OD1			ASP		1.249		0.019
+CG-OD2			ASP		1.249		0.019
+N-CA			GLU		1.458		0.019
+CA-C			GLU		1.525		0.021
+C-O			GLU		1.231		0.02
+CA-CB			GLU		1.53		0.02
+CB-CG			GLU		1.52		0.03
+CG-CD			GLU		1.516		0.025
+CD-OE1			GLU		1.249		0.019
+CD-OE2			GLU		1.249		0.019
+N-CA			PHE		1.458		0.019
+CA-C			PHE		1.525		0.021
+C-O			PHE		1.231		0.02
+CA-CB			PHE		1.53		0.02
+CB-CG			PHE		1.502		0.023
+CG-CD1			PHE		1.384		0.021
+CG-CD2			PHE		1.384		0.021
+CD1-CE1			PHE		1.382		0.03
+CD2-CE2			PHE		1.382		0.03
+CE1-CZ			PHE		1.382		0.03
+CE2-CZ			PHE		1.382		0.03
+N-CA			GLY		1.451		0.016
+CA-C			GLY		1.516		0.018
+C-O			GLY		1.231		0.02
+N-CA			HIS		1.458		0.019
+CA-C			HIS		1.525		0.021
+C-O			HIS		1.231		0.02
+CA-CB			HIS		1.53		0.02
+CB-CG			HIS		1.497		0.014
+CG-ND1			HIS		1.378		0.011
+CG-CD2			HIS		1.354		0.011
+ND1-CE1			HIS		1.321		0.01
+CD2-NE2			HIS		1.374		0.011
+CE1-NE2			HIS		1.321		0.01
+N-CA			ILE		1.458		0.019
+CA-C			ILE		1.525		0.021
+C-O			ILE		1.231		0.02
+CA-CB			ILE		1.54		0.027
+CB-CG1			ILE		1.53		0.02
+CB-CG2			ILE		1.521		0.033
+CG1-CD1			ILE		1.513		0.039
+N-CA			LYS		1.458		0.019
+CA-C			LYS		1.525		0.021
+C-O			LYS		1.231		0.02
+CA-CB			LYS		1.53		0.02
+CB-CG			LYS		1.52		0.03
+CG-CD			LYS		1.52		0.03
+CD-CE			LYS		1.52		0.03
+CE-NZ			LYS		1.489		0.03
+N-CA			LEU		1.458		0.019
+CA-C			LEU		1.525		0.021
+C-O			LEU		1.231		0.02
+CA-CB			LEU		1.53		0.02
+CB-CG			LEU		1.53		0.02
+CG-CD1			LEU		1.521		0.033
+CG-CD2			LEU		1.521		0.033
+N-CA			MET		1.458		0.019
+CA-C			MET		1.525		0.021
+C-O			MET		1.231		0.02
+CA-CB			MET		1.53		0.02
+CB-CG			MET		1.52		0.03
+CG-SD			MET		1.803		0.034
+SD-CE			MET		1.791		0.059
+N-CA			ASN		1.458		0.019
+CA-C			ASN		1.525		0.021
+C-O			ASN		1.231		0.02
+CA-CB			ASN		1.53		0.02
+CB-CG			ASN		1.516		0.025
+CG-OD1			ASN		1.231		0.02
+CG-ND2			ASN		1.328		0.021
+N-CA			PRO		1.466		0.015
+CA-C			PRO		1.525		0.021
+C-O			PRO		1.231		0.02
+CA-CB			PRO		1.53		0.02
+CB-CG			PRO		1.492		0.05
+CG-CD			PRO		1.503		0.034
+CD-N			PRO		1.473		0.014
+N-CA			GLN		1.458		0.019
+CA-C			GLN		1.525		0.021
+C-O			GLN		1.231		0.02
+CA-CB			GLN		1.53		0.02
+CB-CG			GLN		1.52		0.03
+CG-CD			GLN		1.516		0.025
+CD-OE1			GLN		1.231		0.02
+CD-NE2			GLN		1.328		0.021
+N-CA			ARG		1.458		0.019
+CA-C			ARG		1.525		0.021
+C-O			ARG		1.231		0.02
+CA-CB			ARG		1.53		0.02
+CB-CG			ARG		1.52		0.03
+CG-CD			ARG		1.52		0.03
+CD-NE			ARG		1.46		0.018
+NE-CZ			ARG		1.329		0.014
+CZ-NH1			ARG		1.326		0.018
+CZ-NH2			ARG		1.326		0.018
+N-CA			SER		1.458		0.019
+CA-C			SER		1.525		0.021
+C-O			SER		1.231		0.02
+CA-CB			SER		1.53		0.02
+CB-OG			SER		1.417		0.02
+N-CA			THR		1.458		0.019
+CA-C			THR		1.525		0.021
+C-O			THR		1.231		0.02
+CA-CB			THR		1.54		0.027
+CB-OG1			THR		1.433		0.016
+CB-CG2			THR		1.521		0.033
+N-CA			VAL		1.458		0.019
+CA-C			VAL		1.525		0.021
+C-O			VAL		1.231		0.02
+CA-CB			VAL		1.54		0.027
+CB-CG1			VAL		1.521		0.033
+CB-CG2			VAL		1.521		0.033
+N-CA			TRP		1.458		0.019
+CA-C			TRP		1.525		0.021
+C-O			TRP		1.231		0.02
+CA-CB			TRP		1.53		0.02
+CB-CG			TRP		1.498		0.031
+CG-CD1			TRP		1.365		0.025
+CG-CD2			TRP		1.433		0.018
+CD1-NE1			TRP		1.374		0.021
+NE1-CE2			TRP		1.37		0.011
+CD2-CE2			TRP		1.409		0.017
+CD2-CE3			TRP		1.398		0.016
+CE2-CZ2			TRP		1.394		0.021
+CE3-CZ3			TRP		1.382		0.03
+CZ2-CH2			TRP		1.368		0.019
+CZ3-CH2			TRP		1.4		0.025
+N-CA			TYR		1.458		0.019
+CA-C			TYR		1.525		0.021
+C-O			TYR		1.231		0.02
+CA-CB			TYR		1.53		0.02
+CB-CG			TYR		1.512		0.022
+CG-CD1			TYR		1.389		0.021
+CG-CD2			TYR		1.389		0.021
+CD1-CE1			TYR		1.382		0.03
+CD2-CE2			TYR		1.382		0.03
+CE1-CZ			TYR		1.378		0.024
+CE2-CZ			TYR		1.378		0.024
+CZ-OH			TYR		1.376		0.021
+-
+
+Angle			Residue		Mean		StdDev
+N-CA-C			ALA		111.2		2.8
+CA-C-O			ALA		120.8		1.7
+N-CA-CB			ALA		110.4		1.5
+C-CA-CB			ALA		110.5		1.5
+N-CA-C			CYS		111.2		2.8
+CA-C-O			CYS		120.8		1.7
+N-CA-CB			CYS		110.5		1.7
+C-CA-CB			CYS		110.1		1.9
+N-CA-C			ASP		111.2		2.8
+CA-C-O			ASP		120.8		1.7
+N-CA-CB			ASP		110.5		1.7
+C-CA-CB			ASP		110.1		1.9
+CA-CB-CG		ASP		112.6		1.0
+CB-CG-OD2		ASP		118.4		2.3
+CB-CG-OD1		ASP		118.4		2.3
+OD2-CG-OD1		ASP		122.9		2.4
+N-CA-C			GLU		111.2		2.8
+CA-C-O			GLU		120.8		1.7
+N-CA-CB			GLU		110.5		1.7
+C-CA-CB			GLU		110.1		1.9
+CA-CB-CG		GLU		114.1		2.0
+CB-CG-CD		GLU		112.6		1.7
+CG-CD-OE2		GLU		118.4		2.3
+CG-CD-OE1		GLU		118.4		2.3
+OE2-CD-OE1		GLU		122.9		2.4
+N-CA-C			PHE		111.2		2.8
+CA-C-O			PHE		120.8		1.7
+N-CA-CB			PHE		110.5		1.7
+C-CA-CB			PHE		110.1		1.9
+CA-CB-CG		PHE		113.8		1.0
+CB-CG-CD1		PHE		120.7		1.7
+CB-CG-CD2		PHE		120.7		1.7
+CG-CD1-CE1		PHE		120.7		1.7
+CG-CD2-CE2		PHE		120.7		1.7
+CD1-CE1-CZ		PHE		120.0		1.8
+CD2-CE2-CZ		PHE		120.0		1.8
+CE1-CZ-CE2		PHE		120.0		1.8
+CD1-CG-CD2		PHE		118.6		1.5
+N-CA-C			GLY		112.5		2.9
+CA-C-O			GLY		120.8		2.1
+N-CA-C			HIS		111.2		2.8
+CA-C-O			HIS		120.8		1.7
+N-CA-CB			HIS		110.5		1.7
+C-CA-CB			HIS		110.1		1.9
+CA-CB-CG		HIS		113.8		1.0
+CB-CG-ND1		HIS		122.7		1.5
+CG-ND1-CE1		HIS		109.3		1.7
+ND1-CE1-NE2		HIS		108.4		1.0
+CE1-NE2-CD2		HIS		109.0		1.0
+NE2-CD2-CG		HIS		107.2		1.0
+CD2-CG-ND1		HIS		106.1		1.0
+CB-CG-CD2		HIS		131.2		1.3
+N-CA-C			ILE		111.2		2.8
+CA-C-O			ILE		120.8		1.7
+N-CA-CB			ILE		111.5		1.7
+C-CA-CB			ILE		109.1		2.2
+CA-CB-CG2		ILE		110.5		1.7
+CA-CB-CG1		ILE		110.4		1.7
+CG2-CB-CG1		ILE		110.7		3.0
+CB-CG1-CD1		ILE		113.8		2.1
+N-CA-C			LYS		111.2		2.8
+CA-C-O			LYS		120.8		1.7
+N-CA-CB			LYS		110.5		1.7
+C-CA-CB			LYS		110.1		1.9
+CA-CB-CG		LYS		114.1		2.0
+CB-CG-CD		LYS		111.3		2.3
+CG-CD-CE		LYS		111.3		2.3
+CD-CE-NZ		LYS		111.9		3.2
+N-CA-C			LEU		111.2		2.8
+CA-C-O			LEU		120.8		1.7
+N-CA-CB			LEU		110.5		1.7
+C-CA-CB			LEU		110.1		1.9
+CA-CB-CG		LEU		116.3		3.5
+CB-CG-CD1		LEU		110.7		3.0
+CB-CG-CD2		LEU		110.7		3.0
+CD1-CG-CD2		LEU		110.8		2.2
+N-CA-C			MET		111.2		2.8
+CA-C-O			MET		120.8		1.7
+N-CA-CB			MET		110.5		1.7
+C-CA-CB			MET		110.1		1.9
+CA-CB-CG		MET		114.1		2.0
+CB-CG-SD		MET		112.7		3.0
+CG-SD-CE		MET		100.9		2.2
+N-CA-C			ASN		111.2		2.8
+CA-C-O			ASN		120.8		1.7
+N-CA-CB			ASN		110.5		1.7
+C-CA-CB			ASN		110.1		1.9
+CA-CB-CG		ASN		112.6		1.0
+CB-CG-ND2		ASN		116.4		1.5
+CB-CG-OD1		ASN		120.8		2.0
+ND2-CG-OD1		ASN		122.6		1.0
+N-CA-C			PRO		111.8		2.5
+CA-C-O			PRO		120.8		1.7
+N-CA-CB			PRO		103.0		1.1
+C-CA-CB			PRO		110.1		1.9
+CA-CB-CG		PRO		104.5		1.9
+CB-CG-CD		PRO		106.1		3.2
+CG-CD-N			PRO		103.2		1.5
+CD-N-CA			PRO		112.0		1.4
+N-CA-C			GLN		111.2		2.8
+CA-C-O			GLN		120.8		1.7
+N-CA-CB			GLN		110.5		1.7
+C-CA-CB			GLN		110.1		1.9
+CA-CB-CG		GLN		114.1		2.0
+CB-CG-CD		GLN		112.6		1.7
+CG-CD-NE2		GLN		116.4		1.5
+CG-CD-OE1		GLN		120.8		2.0
+NE2-CD-OE1		GLN		122.6		1.0
+N-CA-C			ARG		111.2		2.8
+CA-C-O			ARG		120.8		1.7
+N-CA-CB			ARG		110.5		1.7
+C-CA-CB			ARG		110.1		1.9
+CA-CB-CG		ARG		114.1		2.0
+CB-CG-CD		ARG		111.3		2.3
+CG-CD-NE		ARG		112.0		2.2
+CD-NE-CZ		ARG		124.2		1.5
+NE-CZ-NH1		ARG		120.0		1.9
+NE-CZ-NH2		ARG		120.0		1.9
+NH1-CZ-NH2		ARG		119.7		1.8
+N-CA-C			SER		111.2		2.8
+CA-C-O			SER		120.8		1.7
+N-CA-CB			SER		110.5		1.7
+C-CA-CB			SER		110.1		1.9
+CA-CB-OG		SER		111.1		2.0
+N-CA-C			THR		111.2		2.8
+CA-C-O			THR		120.8		1.7
+N-CA-CB			THR		111.5		1.7
+C-CA-CB			THR		109.1		2.2
+CA-CB-CG2		THR		110.5		1.7
+CA-CB-OG1		THR		109.6		1.5
+CG2-CB-OG1		THR		109.3		2.0
+N-CA-C			VAL		111.2		2.8
+CA-C-O			VAL		120.8		1.7
+N-CA-CB			VAL		111.5		1.7
+C-CA-CB			VAL		109.1		2.2
+CA-CB-CG1		VAL		110.5		1.7
+CA-CB-CG2		VAL		110.5		1.7
+CG1-CB-CG2		VAL		110.8		2.2
+N-CA-C			TRP		111.2		2.8
+CA-C-O			TRP		120.8		1.7
+N-CA-CB			TRP		110.5		1.7
+C-CA-CB			TRP		110.1		1.9
+CA-CB-CG		TRP		113.6		1.9
+CB-CG-CD1		TRP		126.9		1.5
+CB-CG-CD2		TRP		126.8		1.4
+CD1-CG-CD2		TRP		106.3		1.6
+CG-CD1-NE1		TRP		110.2		1.3
+CD1-NE1-CE2		TRP		108.9		1.8
+NE1-CE2-CZ2		TRP		130.1		1.5
+NE1-CE2-CD2		TRP		107.4		1.3
+CZ2-CE2-CD2		TRP		122.4		1.0
+CE2-CZ2-CH2		TRP		117.5		1.3
+CZ2-CH2-CZ3		TRP		121.5		1.3
+CH2-CZ3-CE3		TRP		121.1		1.3
+CZ3-CE3-CD2		TRP		118.6		1.3
+CE3-CD2-CG		TRP		133.9		1.0
+CE3-CD2-CE2		TRP		118.8		1.0
+CG-CD2-CE2		TRP		107.2		1.2
+N-CA-C			TYR		111.2		2.8
+CA-C-O			TYR		120.8		1.7
+N-CA-CB			TYR		110.5		1.7
+C-CA-CB			TYR		110.1		1.9
+CA-CB-CG		TYR		113.9		1.8
+CB-CG-CD1		TYR		120.8		1.5
+CB-CG-CD2		TYR		120.8		1.5
+CG-CD1-CE1		TYR		121.2		1.5
+CG-CD2-CE2		TYR		121.2		1.5
+CD1-CE1-CZ		TYR		119.6		1.8
+CD2-CE2-CZ		TYR		119.6		1.8
+CE1-CZ-CE2		TYR		120.3		2.0
+CD1-CG-CD2		TYR		118.1		1.5
+CE1-CZ-OH		TYR		119.9		3.0
+CE2-CZ-OH		TYR		119.9		3.0
+-
+
+Non-bonded distance	Minimum Dist    Tolerance
+C-C			2.10		0.5             
+C-N			2.10		0.5               
+C-S			2.45		0.5             
+C-O			2.25		0.5             
+N-N			2.05		0.5		
+N-S			2.55		0.5		
+N-O			2.10		0.5		
+O-S			2.45		0.5		
+O-O			2.05		0.5		
+S-S			1.80		0.5		
+-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/modules/mol/base/pymod/CMakeLists.txt b/modules/mol/base/pymod/CMakeLists.txt
index 87369f260e9e199fbcd107304f729f616d0d45c6..3f514b2b8afba9e8f95473898b9649da2b3afcb7 100644
--- a/modules/mol/base/pymod/CMakeLists.txt
+++ b/modules/mol/base/pymod/CMakeLists.txt
@@ -22,4 +22,6 @@ wrap_mol.cc
 export_entity_property_mapper.cc
 )
 
-pymod(NAME mol CPP ${OST_BASE_PYMOD_SOURCES} PY __init__.py)
+if (NOT ENABLE_STATIC)
+  pymod(NAME mol CPP ${OST_BASE_PYMOD_SOURCES} PY __init__.py)
+endif()
diff --git a/modules/mol/base/pymod/wrap_mol.cc b/modules/mol/base/pymod/wrap_mol.cc
index f29d1377f4bc0ccf14289b50df67e994208e99e5..33b09e2f20b4c1126f05cf501c04a599663048f9 100644
--- a/modules/mol/base/pymod/wrap_mol.cc
+++ b/modules/mol/base/pymod/wrap_mol.cc
@@ -19,7 +19,9 @@
 #include <boost/python.hpp>
 #include <ost/mol/transform.hh>
 #include <ost/mol/editor_base.hh>
+#if(OST_INFO_ENABLED)
 #include <ost/info/info.hh>
+#endif
 
 using namespace boost::python;
 using namespace ost::mol;
@@ -95,7 +97,9 @@ BOOST_PYTHON_MODULE(_ost_mol)
     .def("ApplyZAxisTranslation",&Transform::ApplyZAxisTranslation)
     .def("ApplyAxisRotation",&Transform::ApplyAxisRotation)
     ;
+#if(OST_INFO_ENABLED)
   def("TransformToInfo", &TransformToInfo);
   def("TransformFromInfo", &TransformFromInfo);
-
+#endif
+  
 }
diff --git a/modules/mol/base/src/CMakeLists.txt b/modules/mol/base/src/CMakeLists.txt
index 1c2649f70ea0230dc4c5021afd9f2a618af60dcd..134eb4e25691507a50039077bdf58099b57ae9ea 100644
--- a/modules/mol/base/src/CMakeLists.txt
+++ b/modules/mol/base/src/CMakeLists.txt
@@ -100,7 +100,13 @@ foreach(_impl_src ${OST_MOL_IMPL_SOURCES})
   list(APPEND OST_MOL_SOURCES impl/${_impl_src})
 endforeach()
 
+if(ENABLE_INFO)
+  set (INFO_DEPS ost_info)
+else()
+  list(APPEND LINK ${Boost_REGEX_LIBRARY})
+endif()
+
 module(NAME mol SOURCES ${OST_MOL_SOURCES}
        HEADERS ${OST_MOL_IMPL_HEADERS} IN_DIR impl
        ${OST_MOL_HEADERS} HEADER_OUTPUT_DIR ost/mol
-       DEPENDS_ON ost_geom ost_base ost_info)
+       DEPENDS_ON ost_geom ost_base ${INFO_DEPS})
diff --git a/modules/mol/base/src/transform.cc b/modules/mol/base/src/transform.cc
index ffee262dec1767ac26e6645ead08fb3d8bd3acf6..c1ffbff6b8a34bf6016d01fba72deeba8a2f4fdb 100644
--- a/modules/mol/base/src/transform.cc
+++ b/modules/mol/base/src/transform.cc
@@ -16,9 +16,12 @@
 // along with this library; if not, write to the Free Software Foundation, Inc.,
 // 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
 //------------------------------------------------------------------------------
+
+#include <ost/config.hh>
+#if(OST_INFO_ENABLED)
 #include <ost/info/info.hh>
 #include <ost/info/geom_info_conversion.hh>
-
+#endif
 #include "transform.hh"
 
 namespace ost { 
@@ -193,6 +196,7 @@ void Transform::update_tm()
   ttm_ = Transpose(tm_);
 }
 
+#if(OST_INFO_ENABLED)
 Transform TransformFromInfo(const info::InfoGroup& group)
 {
   if (!group.HasItem("center")) {
@@ -222,5 +226,6 @@ void TransformToInfo(const Transform& transform, info::InfoGroup& group)
   info::InfoGroup rot=group.CreateGroup("rotation");
   info::Mat3ToInfo(transform.GetRot(), rot);
 }
+#endif
 
 }} // ns
diff --git a/modules/mol/base/src/transform.hh b/modules/mol/base/src/transform.hh
index 5c9acd27605bbff805b40eaac297c83219cd5582..1ed33135e1ca1287f0e2c9debc151aeacca069cc 100644
--- a/modules/mol/base/src/transform.hh
+++ b/modules/mol/base/src/transform.hh
@@ -23,8 +23,11 @@
   Author: Ansgar Philippsen
 */
 
+#include <ost/config.hh>
 #include <ost/geom/geom.hh>
+#if(OST_INFO_ENABLED)
 #include <ost/info/info_fw.hh>
+#endif
 #include <ost/mol/module_config.hh>
 
 namespace ost { namespace mol {
@@ -81,6 +84,7 @@ private:
   void update_tm();
 };
 
+#if(OST_INFO_ENABLED)
 /// \brief read transformation from info group
 /// \relates Transform
 Transform DLLEXPORT_OST_MOL TransformFromInfo(const info::InfoGroup& group);
@@ -88,6 +92,7 @@ Transform DLLEXPORT_OST_MOL TransformFromInfo(const info::InfoGroup& group);
 /// \relates Transform
 void DLLEXPORT_OST_MOL TransformToInfo(const Transform& transform,
                                        info::InfoGroup& group);
+#endif
 }} // ns
 
 #endif
diff --git a/modules/seq/alg/pymod/CMakeLists.txt b/modules/seq/alg/pymod/CMakeLists.txt
index dfe07488ea145a451a10f6bb6a47facbc9b3cf40..0821b510a21cb8ad806b21a958a3592f24f6679f 100644
--- a/modules/seq/alg/pymod/CMakeLists.txt
+++ b/modules/seq/alg/pymod/CMakeLists.txt
@@ -1,7 +1,8 @@
 set(OST_SEQ_ALG_PYMOD_SOURCES
   wrap_seq_alg.cc
 )
-
-pymod(NAME seq_alg OUTPUT_DIR ost/seq/alg 
-      CPP ${OST_SEQ_ALG_PYMOD_SOURCES}
-      PY __init__.py mat.py renumber.py)
+if (NOT ENABLE_STATIC)
+  pymod(NAME seq_alg OUTPUT_DIR ost/seq/alg 
+        CPP ${OST_SEQ_ALG_PYMOD_SOURCES}
+        PY __init__.py mat.py renumber.py)
+endif()
diff --git a/modules/seq/alg/src/CMakeLists.txt b/modules/seq/alg/src/CMakeLists.txt
index fe23aa52cce246216e0aeb8b10c578f795e27881..ccffcacf464cc22d85f62a6d5190067b76622cb7 100644
--- a/modules/seq/alg/src/CMakeLists.txt
+++ b/modules/seq/alg/src/CMakeLists.txt
@@ -16,10 +16,13 @@ local_align.cc
 global_align.cc
 sequence_identity.cc
 ins_del.cc
-subst_weight_matrix.cc
 conservation.cc
 )
 
+if (ENABLE_INFO)
+  list (APPEND OST_SEQ_ALG_SOURCES subst_weight_matrix.cc)
+endif()
+
 module(NAME seq_alg HEADER_OUTPUT_DIR ost/seq/alg SOURCES ${OST_SEQ_ALG_SOURCES}
        HEADERS ${OST_SEQ_ALG_HEADERS} DEPENDS_ON ost_seq)
 
diff --git a/modules/seq/alg/src/subst_weight_matrix.hh b/modules/seq/alg/src/subst_weight_matrix.hh
index f310893ab6a002a830d432a0b07d0547fbb3943d..97f0ef825cb45dda7e2572558b2917498e87a353 100644
--- a/modules/seq/alg/src/subst_weight_matrix.hh
+++ b/modules/seq/alg/src/subst_weight_matrix.hh
@@ -21,7 +21,11 @@
 
 #include <ctype.h>
 #include <string.h>
+#include <boost/shared_ptr.hpp>
+#include <ost/config.hh>
+#if(OST_INFO_ENABLED)
 #include <ost/info/info_fw.hh>
+#endif
 #include <ost/seq/alg/module_config.hh>
 
 /*
@@ -86,12 +90,14 @@ private:
   WeightType weights_[ALPHABET_SIZE*ALPHABET_SIZE];
 };
 
+#if(OST_INFO_ENABLED)
 SubstWeightMatrixPtr DLLEXPORT_OST_SEQ_ALG
 SubstWeightMatrixFromInfo(const info::InfoGroup& group);
 
 void DLLEXPORT_OST_SEQ_ALG 
 SubstWeightMatrixToInfo(const SubstWeightMatrixPtr& subst_mat, 
                         info::InfoGroup& group);
+#endif
 
 }}}
 
diff --git a/modules/seq/base/pymod/CMakeLists.txt b/modules/seq/base/pymod/CMakeLists.txt
index af105daed127eca4d4bd3d0fb7e11656d6e5e05a..f2aac4ea51cb0cd57fed4d304199db0a420158fb 100644
--- a/modules/seq/base/pymod/CMakeLists.txt
+++ b/modules/seq/base/pymod/CMakeLists.txt
@@ -3,4 +3,6 @@ set(OST_SEQ_PYMOD_SOURCES
   wrap_seq.cc
 )
 
-pymod(NAME seq CPP ${OST_SEQ_PYMOD_SOURCES} PY __init__.py)
+if (NOT ENABLE_STATIC)
+  pymod(NAME seq CPP ${OST_SEQ_PYMOD_SOURCES} PY __init__.py)
+endif()
diff --git a/modules/seq/base/pymod/export_sequence.cc b/modules/seq/base/pymod/export_sequence.cc
index 5ec0f088fe1bca98b9486936faeb6041d48c236f..269ce3a7cb584704d5074505180d653ffe93539c 100644
--- a/modules/seq/base/pymod/export_sequence.cc
+++ b/modules/seq/base/pymod/export_sequence.cc
@@ -25,7 +25,10 @@
 #include <ost/export_helper/pair_to_tuple_conv.hh>
 #include <ost/generic_property.hh>
 #include <ost/export_helper/generic_property_def.hh>
+#include <ost/config.hh>
+#if(OST_INFO_ENABLED)
 #include <ost/info/info.hh>
+#endif
 #include <ost/mol/mol.hh>
 #include <ost/seq/sequence_handle.hh>
 #include <ost/seq/alignment_handle.hh>
@@ -412,13 +415,15 @@ void export_sequence()
   def("CreateSequenceList", &CreateSequenceList);
   def("SequenceFromChain", seq_from_chain_a);
   def("SequenceFromChain", seq_from_chain_b);
+#if(OST_INFO_ENABLED)
   def("SequenceToInfo", &SequenceToInfo);
+  def("SequenceListToInfo", &SequenceListToInfo);
+  def("SequenceFromInfo", &SequenceFromInfo);  
+  def("SequenceListFromInfo", &SequenceListFromInfo);
+#endif
   def("ViewsFromSequences", &ViewsFromSequences, (arg("seq1"), arg("seq2")));
   def("ViewsFromAlignment", &ViewsFromAlignment, 
       (arg("aln"), arg("index1")=0, arg("index2")=1));
-  def("SequenceListToInfo", &SequenceListToInfo);
-  def("SequenceFromInfo", &SequenceFromInfo);
   def("CreateAlignment", &CreateAlignment);
   def("AlignmentFromSequenceList", &AlignmentFromSequenceList);
-  def("SequenceListFromInfo", &SequenceListFromInfo);
 }
diff --git a/modules/seq/base/src/CMakeLists.txt b/modules/seq/base/src/CMakeLists.txt
index 6a22a5ad2a575ca7f633a6bde5c00ae31d1ed2b9..8ef75076e739e4cf90e01e97f5e9582f22cd67cf 100644
--- a/modules/seq/base/src/CMakeLists.txt
+++ b/modules/seq/base/src/CMakeLists.txt
@@ -29,8 +29,13 @@ alignment_handle.cc
 sequence_op.cc
 views_from_sequences.cc
 )
-module(NAME seq SOURCES ${OST_SEQ_SOURCES} 
-       HEADERS ${OST_SEQ_IMPL_HEADERS} IN_DIR impl
-               ${OST_SEQ_HEADERS}
-       DEPENDS_ON ost_info ost_mol)
 
+if (ENABLE_INFO)
+  set(INFO_DEPS ost_info)
+endif()
+
+
+module(NAME seq SOURCES ${OST_SEQ_SOURCES} 
+         HEADERS ${OST_SEQ_IMPL_HEADERS} IN_DIR impl
+                 ${OST_SEQ_HEADERS}
+         DEPENDS_ON ost_mol ${INFO_DEPS})
\ No newline at end of file
diff --git a/modules/seq/base/src/impl/sequence_impl.cc b/modules/seq/base/src/impl/sequence_impl.cc
index 2a0570b37e9795372f36983353b3ea7502692dc9..733eaf1b8e17f765581a4cb1e527beb2bf3483ef 100644
--- a/modules/seq/base/src/impl/sequence_impl.cc
+++ b/modules/seq/base/src/impl/sequence_impl.cc
@@ -21,8 +21,11 @@
  */
 
 #include <boost/format.hpp>
-
+#include <ost/config.hh>
+#if(OST_INFO_ENABLED)
 #include <ost/info/info.hh>
+#endif
+
 #include <ost/integrity_error.hh>
 #include <ost/mol/chain_view.hh>
 
@@ -281,6 +284,7 @@ bool SequenceImpl::HasAttachedView() const
   return attached_view_.IsValid();
 }
 
+#if(OST_INFO_ENABLED)
 void SequenceImplToInfo(const SequenceImplPtr& sequence, info::InfoGroup& group)
 {
   group.SetTextData(sequence->GetString());
@@ -301,6 +305,7 @@ SequenceImplPtr SequenceImplFromInfo(const info::InfoGroup& group)
   sequence->SetOffset(offset);
   return sequence;
 }
+#endif
 
 int SequenceImpl::GetFirstNonGap() const
 {
diff --git a/modules/seq/base/src/impl/sequence_impl.hh b/modules/seq/base/src/impl/sequence_impl.hh
index 05ba042f0b1db1ac933760eff20302618f731b23..fecad2ca921599ecd85c58ee33e6c184bdbd5a52 100644
--- a/modules/seq/base/src/impl/sequence_impl.hh
+++ b/modules/seq/base/src/impl/sequence_impl.hh
@@ -27,7 +27,10 @@
 
 #include <boost/shared_ptr.hpp>
 #include <ost/generic_property.hh>
+#include <ost/config.hh>
+#if(OST_INFO_ENABLED)
 #include <ost/info/info_fw.hh>
+#endif
 #include <ost/mol/residue_prop.hh>
 #include <ost/mol/entity_view.hh>
 #include <ost/mol/residue_view.hh>
@@ -186,14 +189,15 @@ private:
 /// \internal
 typedef std::vector<SequenceImplPtr>  SequenceList;
 
+#if(OST_INFO_ENABLED)
 /// \internal
-void DLLEXPORT_OST_SEQ SequenceImplToInfo(const SequenceImplPtr& sequence,
-                                      info::InfoGroup& group);
-/// \internal
-SequenceImplPtr DLLEXPORT_OST_SEQ 
+SequenceImplPtr DLLEXPORT_OST_SEQ SequenceImplFromInfo(const info::InfoGroup& group);
 
 /// \internal
-SequenceImplFromInfo(const info::InfoGroup& group);
+void DLLEXPORT_OST_SEQ SequenceImplToInfo(const SequenceImplPtr& sequence,
+                                     info::InfoGroup& group);
+#endif
+
 
 }}} //ns
 #endif
diff --git a/modules/seq/base/src/impl/sequence_list_impl.cc b/modules/seq/base/src/impl/sequence_list_impl.cc
index bd332872bb1c2b1d531d50a3aa820e7fb5f083ac..6580aac92bf8032f3b40de53a28a3df23670565f 100644
--- a/modules/seq/base/src/impl/sequence_list_impl.cc
+++ b/modules/seq/base/src/impl/sequence_list_impl.cc
@@ -18,7 +18,10 @@
 //------------------------------------------------------------------------------
 #include <limits>
 
+#include <ost/config.hh>
+#if(OST_INFO_ENABLED)
 #include <ost/info/info.hh>
+#endif
 #include <ost/seq/impl/sequence_list_impl.hh>
 
 namespace ost { namespace seq { namespace impl {
@@ -154,6 +157,7 @@ SequenceListImplPtr SequenceListImpl::Copy() const
   return new_ali;
 }
 
+#if(OST_INFO_ENABLED)
 void SequenceListImplToInfo(const SequenceListImplPtr& seq_list,
                             info::InfoGroup& group)
 {
@@ -175,6 +179,7 @@ SequenceListImplPtr SequenceListImplFromInfo(info::InfoGroup& group)
   }
   return seq_list;
 }
+#endif
 
 SequenceListImplPtr SequenceListImpl::Slice(int first, int n) const
 {
diff --git a/modules/seq/base/src/impl/sequence_list_impl.hh b/modules/seq/base/src/impl/sequence_list_impl.hh
index 52443dcd64178222c688918aae9ee94dd27267f7..cb69e41ead9bfbc91975b3ce5062bde00b836eef 100644
--- a/modules/seq/base/src/impl/sequence_list_impl.hh
+++ b/modules/seq/base/src/impl/sequence_list_impl.hh
@@ -94,6 +94,7 @@ private:
   std::vector<SequenceImplPtr> list_;
 };
 
+#if(OST_INFO_ENABLED)
 /// \brief export sequence list impl to info
 /// \internal
 void DLLEXPORT_OST_SEQ 
@@ -104,6 +105,7 @@ SequenceListImplToInfo(const SequenceListImplPtr& seq_list,
 /// \internal
 SequenceListImplPtr DLLEXPORT_OST_SEQ 
 SequenceListImplFromInfo(info::InfoGroup& group);
+#endif
 
 }}}
 
diff --git a/modules/seq/base/src/sequence_handle.cc b/modules/seq/base/src/sequence_handle.cc
index 8f0d6cce7cae08564d50a81d9b09dc5923a00991..627ebdc36ee0501a7ff5fcf2926af7c199dae592 100644
--- a/modules/seq/base/src/sequence_handle.cc
+++ b/modules/seq/base/src/sequence_handle.cc
@@ -226,6 +226,8 @@ void SequenceHandle::AttachView(const mol::EntityView& view,
   Impl()->AttachView(view, chain_name);   
 }
 
+#if(OST_INFO_ENABLED)
+
 /// \brief export sequence to info
 void  SequenceToInfo(const ConstSequenceHandle& sequence,
                      info::InfoGroup& group)
@@ -238,6 +240,8 @@ SequenceHandle SequenceFromInfo(info::InfoGroup& group)
 {
   return SequenceHandle(impl::SequenceImplFromInfo(group));
 }
+#endif
+
 
 
 std::ostream& operator<<(std::ostream& os, const ConstSequenceHandle& sequence)
diff --git a/modules/seq/base/src/sequence_handle.hh b/modules/seq/base/src/sequence_handle.hh
index 103c6aeb43156039960cdfd3eed8b375fe7f672f..937387c797bc42f28b0fe902f1e9af256d6fa416 100644
--- a/modules/seq/base/src/sequence_handle.hh
+++ b/modules/seq/base/src/sequence_handle.hh
@@ -25,7 +25,10 @@
 
 #include <ost/base.hh>
 #include <ost/generic_property.hh>
+#include <ost/config.hh>
+#if(OST_INFO_ENABLED)
 #include <ost/info/info_fw.hh>
+#endif
 #include <ost/seq/module_config.hh>
 
 #include <ost/mol/residue_view.hh>
@@ -302,13 +305,15 @@ private:
 SequenceHandle DLLEXPORT_OST_SEQ CreateSequence(const String& name, 
                                                 const String& seq, 
                                                 const String& role="UNKNOWN");
-                                                
+#if(OST_INFO_ENABLED)                                                
 /// \brief export sequence to info
 void DLLEXPORT_OST_SEQ SequenceToInfo(const ConstSequenceHandle& sequence,
                                       info::InfoGroup& group);
 
 /// \brief create sequence from info
 SequenceHandle DLLEXPORT_OST_SEQ SequenceFromInfo(info::InfoGroup& group);
+#endif
+
 
 DLLEXPORT_OST_SEQ std::ostream& operator<<(std::ostream& os, 
                                            const ConstSequenceHandle& sequence);
diff --git a/modules/seq/base/src/sequence_list.cc b/modules/seq/base/src/sequence_list.cc
index eb45568fdbb639c1a14eab4732f076f9d500bcee..52474a3d71b40ccb2498bcc245f4564755fda048 100644
--- a/modules/seq/base/src/sequence_list.cc
+++ b/modules/seq/base/src/sequence_list.cc
@@ -22,7 +22,10 @@
  */
 
 #include <ost/invalid_handle.hh> 
+#include <ost/config.hh>
+#if(OST_INFO_ENABLED)
 #include <ost/info/info.hh>
+#endif
 
 #include <ost/seq/impl/sequence_list_impl.hh>
 #include <ost/seq/sequence_list.hh>
@@ -180,6 +183,7 @@ int SequenceList::GetMaxLength() const
   return impl_->GetMaxLength();
 }
 
+#if(OST_INFO_ENABLED)
 /// \brief export sequence list to info
 void SequenceListToInfo(const ConstSequenceList& seq_list, 
                         info::InfoGroup& group)
@@ -192,6 +196,7 @@ SequenceList SequenceListFromInfo(info::InfoGroup& group)
 {
   return SequenceList(impl::SequenceListImplFromInfo(group));
 }
+#endif
 
 SequenceList::operator ConstSequenceList() const
 {
diff --git a/modules/seq/base/src/sequence_list.hh b/modules/seq/base/src/sequence_list.hh
index 71067438d0404a0af7c41a6138b3fb09c403433f..2e6895c6e62b19b52e31aad3cebc1d9de8904cec 100644
--- a/modules/seq/base/src/sequence_list.hh
+++ b/modules/seq/base/src/sequence_list.hh
@@ -124,12 +124,14 @@ protected:
 SequenceList DLLEXPORT_OST_SEQ CreateSequenceList();
 ConstSequenceList DLLEXPORT_OST_SEQ CreateConstSequenceList();
 
+#if(OST_INFO_ENABLED)
 /// \brief export sequence list to info
 void DLLEXPORT_OST_SEQ SequenceListToInfo(const ConstSequenceList& seq_list,
                                           info::InfoGroup& group);
 
 /// \brief create sequence list object from info
 SequenceList DLLEXPORT_OST_SEQ SequenceListFromInfo(info::InfoGroup& group);
+#endif
 }}
 
 #endif
diff --git a/scripts/CMakeLists.txt b/scripts/CMakeLists.txt
index 734e377e86e68961beddc9c96b444c6bb9cec86b..0b6b429a45beebc7c2233d65218dba89fa86f32d 100644
--- a/scripts/CMakeLists.txt
+++ b/scripts/CMakeLists.txt
@@ -12,32 +12,34 @@ else()
   add_dependencies(ost_scripts _ost_io)
 endif()
 
-if(WIN32)
-  script(NAME  dng.bat INPUT dng.bat.in SUBSTITUTE ${SUBST_DICT}
-         TARGET ost_scripts)
-  script(NAME ost.bat INPUT ost.bat.in SUBSTITUTE ${SUBST_DICT}
-         TARGET ost_scripts)
-  script(NAME gipltng.bat INPUT gipltng.bat.in SUBSTITUTE ${SUBST_DICT})
-else()
-  script(NAME ost_config INPUT ost_config.in SUBSTITUTE ${SUBST_DICT}
-         TARGET ost_scripts OUTPUT_DIR ${LIBEXEC_PATH})
-  script(NAME ost INPUT ost.in SUBSTITUTE ${SUBST_DICT} 
-         TARGET ost_scripts)
-  if (ENABLE_GUI)
-    script(NAME dng INPUT dng.in SUBSTITUTE ${SUBST_DICT}
+if (NOT ENABLE_STATIC)
+  if(WIN32)
+    script(NAME  dng.bat INPUT dng.bat.in SUBSTITUTE ${SUBST_DICT}
+           TARGET ost_scripts)
+    script(NAME ost.bat INPUT ost.bat.in SUBSTITUTE ${SUBST_DICT}
            TARGET ost_scripts)
+    script(NAME gipltng.bat INPUT gipltng.bat.in SUBSTITUTE ${SUBST_DICT})
+  else()
+    script(NAME ost_config INPUT ost_config.in SUBSTITUTE ${SUBST_DICT}
+           TARGET ost_scripts OUTPUT_DIR ${LIBEXEC_PATH})
+    script(NAME ost INPUT ost.in SUBSTITUTE ${SUBST_DICT} 
+           TARGET ost_scripts)
+    if (ENABLE_GUI)
+      script(NAME dng INPUT dng.in SUBSTITUTE ${SUBST_DICT}
+             TARGET ost_scripts)
+    endif()
   endif()
-endif()
 
-set(INIT_SCRIPTS 
-  init_cl.py
-)
+  set(INIT_SCRIPTS 
+    init_cl.py
+  )
 
-if (ENABLE_GUI)
-  list(APPEND INIT_SCRIPTS init.py)
-endif()
-copy_if_different("./" "${STAGE_DIR}/${LIB_DIR}/openstructure" 
+  if (ENABLE_GUI)
+    list(APPEND INIT_SCRIPTS init.py)
+  endif()
+  copy_if_different("./" "${STAGE_DIR}/${LIB_DIR}/openstructure" 
                   "${INIT_SCRIPTS}" "python init scripts" ost_scripts)
 
-install(FILES ${INIT_SCRIPTS} DESTINATION "${LIB_DIR}/openstructure")
+  install(FILES ${INIT_SCRIPTS} DESTINATION "${LIB_DIR}/openstructure")
 
+endif()
diff --git a/scripts/README.txt b/scripts/README.txt
new file mode 100644
index 0000000000000000000000000000000000000000..5258171c4e6d10fd9d21b7c877ddc4db7691d2cc
--- /dev/null
+++ b/scripts/README.txt
@@ -0,0 +1,10 @@
+1. Setup the rpm build environment (See guides on the web)
+2. Checkout openstructure source in a fodler called 'openstructure-1.1d'
+3. Copy the compounds.chemlib into the folder
+4. Remove '.git' and '.gitignore' from the folder 
+5. COmpress the source with 'tar -cJvf openstructuere.tar.xz openstructure-1.1d'
+6. Put the zipped source in '~/rpmbuild/SOURCES'
+7. Put the desktop file in '~/rpmbuild/SOURCES'
+8. Put the spec file in '~/rpmbuild/SPECS'
+9. Go the the 'SPECS' directory and build with 'rpmbuild -ba openstructure.spec' 
+