diff --git a/modules/mol/alg/src/molck.cc b/modules/mol/alg/src/molck.cc
index b3cfe016c342f9edbf87eca2a8b1d3524515c285..1eaf1988a9ac54947e639ad3615077eba5a959d0 100644
--- a/modules/mol/alg/src/molck.cc
+++ b/modules/mol/alg/src/molck.cc
@@ -5,12 +5,14 @@
 #include <ost/conop/rule_based.hh>
 #include <ost/mol/alg/molck.hh>
 #include <ost/message.hh>
+#include <ost/log.hh>
 
 using namespace ost::conop;
 using namespace ost::mol;
 
+namespace ost{ namespace mol{ namespace alg{
 
-void ost::mol::alg::MapNonStandardResidues(EntityHandle& ent, CompoundLibPtr lib) {
+void MapNonStandardResidues(EntityHandle& ent, CompoundLibPtr lib, bool log_diags) {
   // TODO: Maybe it is possible to make it in-place operation
 
   if(!lib) {
@@ -45,18 +47,17 @@ void ost::mol::alg::MapNonStandardResidues(EntityHandle& ent, CompoundLibPtr lib
            continue;
         } 
         ResidueHandle dest_res = new_edi.AppendResidue(new_chain,OneLetterCodeToResidueName(compound->GetOneLetterCode()),r->GetNumber());
-        ost::mol::alg::CopyResidue(*r,dest_res,new_edi,lib);
+        CopyResidue(*r,dest_res,new_edi,lib);
       }
     }
   }
   ent = new_ent;
   // Since we didn't do it in-place: reprocess the new entity
   RuleBasedProcessor pr(lib);
-  pr.Process(ent);
+  pr.Process(ent, log_diags);
 }
 
-void ost::mol::alg::RemoveAtoms(
-                 EntityHandle& ent,
+void RemoveAtoms(EntityHandle& ent,
                  CompoundLibPtr lib,
                  bool rm_unk_atoms,
                  bool rm_non_std,
@@ -73,29 +74,33 @@ void ost::mol::alg::RemoveAtoms(
   Diagnostics diags;
   Checker checker(lib, ent, diags);
   if (rm_zero_occ_atoms) {
-    std::cerr << "removing atoms with zero occupancy" << std::endl;
+    LOG_INFO("removing atoms with zero occupancy");
     int zremoved=0;
     AtomHandleList zero_atoms=checker.GetZeroOccupancy();
     for (AtomHandleList::const_iterator i=zero_atoms.begin(), e=zero_atoms.end(); i!=e; ++i) {
        edi.DeleteAtom(*i);
        zremoved++;   
     }
-    std::cerr << " --> removed " << zremoved << " atoms with zero occupancy" << std::endl;
+    std::stringstream ss;
+    ss << " --> removed " << zremoved << " atoms with zero occupancy";
+    LOG_INFO(ss.str());
   }
 
   if (rm_hyd_atoms) {
-    std::cerr << "removing hydrogen atoms" << std::endl;
+    LOG_INFO("removing hydrogen atoms");
     int hremoved=0;
     AtomHandleList hyd_atoms=checker.GetHydrogens();
     for (AtomHandleList::const_iterator i=hyd_atoms.begin(), e=hyd_atoms.end(); i!=e; ++i) {
        edi.DeleteAtom(*i);
        hremoved++;   
     }
-    std::cerr << " --> removed " << hremoved << " hydrogen atoms" << std::endl;
+    std::stringstream ss;
+    ss << " --> removed " << hremoved << " hydrogen atoms";
+    LOG_INFO(ss.str());
   }
   
   if (rm_oxt_atoms) {
-    std::cerr << "removing OXT atoms" << std::endl;
+    LOG_INFO("removing OXT atoms");
     int oremoved=0;
     AtomHandleList atoms=ent.GetAtomList();
     for (AtomHandleList::const_iterator i=atoms.begin(), e=atoms.end(); i!=e; ++i) {
@@ -104,7 +109,9 @@ void ost::mol::alg::RemoveAtoms(
          oremoved++;   
        }
     }
-    std::cerr << " --> removed " << oremoved << " OXT atoms" << std::endl;
+    std::stringstream ss;
+    ss << " --> removed " << oremoved << " OXT atoms";
+    LOG_INFO(ss.str());
   }
 
   checker.CheckForCompleteness();
@@ -113,28 +120,29 @@ void ost::mol::alg::RemoveAtoms(
   for (Diagnostics::const_diag_iterator 
        j = diags.diags_begin(), e = diags.diags_end(); j != e; ++j) {
     const Diag* diag=*j;
-    std::cerr << diag->Format(colored);
+    std::stringstream ss;
+    ss << diag->Format(colored);
     switch (diag->GetType()) {
       case DIAG_UNK_ATOM:
         if (rm_unk_atoms) {
           edi.DeleteAtom(diag->GetAtom(0));
-          std::cerr << " --> removed ";  
+          ss << " --> removed "; 
         }
         break;
       case DIAG_NONSTD_RESIDUE:
         if (rm_non_std) {
           edi.DeleteResidue(diag->GetResidue(0));
-          std::cerr << " --> removed ";  
+          ss << " --> removed ";
         }
         break;
       default:
         break;
     }
-    std::cerr << std::endl;
+    LOG_INFO(ss.str());
   }
 }
 
-void ost::mol::alg::CleanUpElementColumn(EntityHandle& ent, CompoundLibPtr lib){
+void CleanUpElementColumn(EntityHandle& ent, CompoundLibPtr lib){
 
   if(!lib) {
     throw ost::Error("Require valid compound library!");
@@ -164,20 +172,19 @@ void ost::mol::alg::CleanUpElementColumn(EntityHandle& ent, CompoundLibPtr lib){
   }
 }
 
-void ost::mol::alg::Molck(
-           ost::mol::EntityHandle& ent,
+void Molck(ost::mol::EntityHandle& ent,
            ost::conop::CompoundLibPtr lib,
-           const ost::mol::alg::MolckSettings& settings=ost::mol::alg::MolckSettings()){
+           const MolckSettings& settings = MolckSettings()){
 
   if(!lib) {
     throw ost::Error("Require valid compound library!");
   }
 
   if (settings.map_nonstd_res)  {
-    ost::mol::alg::MapNonStandardResidues(ent, lib);
+    MapNonStandardResidues(ent, lib, false);
   }
-  ost::mol::alg::RemoveAtoms(ent, 
-              lib, 
+
+  RemoveAtoms(ent, lib, 
               settings.rm_unk_atoms,
               settings.rm_non_std,
               settings.rm_hyd_atoms,
@@ -185,7 +192,8 @@ void ost::mol::alg::Molck(
               settings.rm_zero_occ_atoms,
               settings.colored);
   if (settings.assign_elem)  {
-    ost::mol::alg::CleanUpElementColumn(ent, lib);
+    CleanUpElementColumn(ent, lib);
   }          
 }
 
+}}} // ns
\ No newline at end of file
diff --git a/modules/mol/alg/src/molck.hh b/modules/mol/alg/src/molck.hh
index d61e0218678bd07fba0e828fdf0f901dd69977e5..b25b1b81e3a428c132af56282a771f35e9303024 100644
--- a/modules/mol/alg/src/molck.hh
+++ b/modules/mol/alg/src/molck.hh
@@ -80,7 +80,8 @@ struct MolckSettings{
 };
 
 void MapNonStandardResidues(ost::mol::EntityHandle& ent,
-                                              ost::conop::CompoundLibPtr lib);
+                            ost::conop::CompoundLibPtr lib,
+                            bool log_diags = true);
 
 void RemoveAtoms(ost::mol::EntityHandle& ent,
                  ost::conop::CompoundLibPtr lib,
diff --git a/tools/molck/main.cc b/tools/molck/main.cc
index ef2d77c207213957a20d2d2d460da74fa0280b73..8507a1895b2d6f13d2aeecec94a826a392ce0dd0 100644
--- a/tools/molck/main.cc
+++ b/tools/molck/main.cc
@@ -11,6 +11,7 @@
 #include <ost/io/mol/mmcif_reader.hh>
 #include <ost/io/io_exception.hh>
 #include <ost/mol/alg/molck.hh>
+#include <ost/log.hh>
 #if defined(__APPLE__)
 #include <mach-o/dyld.h>
 #endif
@@ -47,7 +48,7 @@ const char* USAGE=
 
 void usage()
 {
-  std::cerr << USAGE << std::endl;
+  LOG_INFO(USAGE);
   exit(0);
 }	
 
@@ -69,12 +70,14 @@ EntityHandle load_x(const String& file, const IOProfile& profile)
         reader.Import(ent);
         return ent;
       }
-      std::cerr << "ERROR: '" << file << "' does not contain any ATOM records. "
-              << "Are you sure this is a PDB file?" << std::endl;
+      std::stringstream ss;
+      ss << "ERROR: '" << file << "' does not contain any ATOM records. "
+      << "Are you sure this is a PDB file?";
+      LOG_INFO(ss.str());
       return EntityHandle();
     }
   } catch (std::exception& e) {
-    std::cerr << "ERROR: " << e.what() << std::endl;
+    LOG_ERROR("ERROR: " << e.what());
     return EntityHandle();
   }
 }
@@ -86,7 +89,7 @@ ost::conop::CompoundLibPtr load_compound_lib(const String& custom_path)
     if (fs::exists(custom_path)) {  
       return ost::conop::CompoundLib::Load(custom_path);
     } else {
-      std::cerr << "Could not find compounds.chemlib at the provided location, trying other options" << std::endl;
+      LOG_INFO("Could not find compounds.chemlib at the provided location, trying other options");
     }
   } 
   if (fs::exists("compounds.chemlib")) {
@@ -105,8 +108,8 @@ ost::conop::CompoundLibPtr load_compound_lib(const String& custom_path)
   exe_path = std::string( result, (count > 0) ? count : 0 );
   #endif
   if (exe_path.empty()) { 
-    std::cerr << "Could not determine the path of the molck executable. Will only "
-       "look for compounds.chemlib in the current working directory" << std::endl;
+    LOG_INFO("Could not determine the path of the molck executable. Will only "
+             "look for compounds.chemlib in the current working directory");
   } else {
     fs::path path_and_exe(exe_path);
     fs::path path_only=path_and_exe.branch_path();
@@ -120,7 +123,7 @@ ost::conop::CompoundLibPtr load_compound_lib(const String& custom_path)
     }  
   }
   if (!lib) {
-    std::cerr << "Could not load compounds.chemlib" << std::endl;
+    LOG_ERROR("Could not load compounds.chemlib");
     exit(-1);
   }
   return ost::conop::CompoundLibPtr();
@@ -129,6 +132,9 @@ ost::conop::CompoundLibPtr load_compound_lib(const String& custom_path)
 
 int main(int argc, char *argv[])
 {
+  // setup logging
+  ost::Logger::Instance().PushVerbosityLevel(ost::Logger::INFO);
+
   if (argc<2) {
     usage();
   }
@@ -166,7 +172,7 @@ int main(int argc, char *argv[])
                 options(desc).positional(p).run(),
               vm);
   } catch (std::exception& e) {
-    std::cerr << e.what() << std::endl;
+    LOG_ERROR(e.what());
     usage();
     exit(-1);
   }
@@ -206,7 +212,9 @@ int main(int argc, char *argv[])
     } else if (rms[i] == StringRef("zeroocc", 7)) {
       settings.rm_zero_occ_atoms = true;
     } else {
-      std::cerr << "unknown value to remove '" << rms[i] << "'" << std::endl;
+      std::stringstream ss;
+      ss << "unknown value to remove '" << rms[i] << "'";
+      LOG_ERROR(ss.str());
       usage();
       exit(-1);
     }
@@ -246,8 +254,7 @@ int main(int argc, char *argv[])
       try {
         fs::path out_path(output_blueprint_string_copy);
         if (out_path.has_parent_path() && !exists(out_path.parent_path())) {
-          std::cerr << "Output path does not exist: " 
-                    << output_blueprint_string_copy << std::endl;
+          LOG_ERROR("Output path does not exist: " + output_blueprint_string_copy);
           exit(-1);
         }
       } catch (std::exception& e) {
@@ -255,15 +262,14 @@ int main(int argc, char *argv[])
         size_t perden = String(e.what()).find("Permission denied");	
 
         if (perden != String::npos) {
-          std::cerr << "Cannot write into output directory: " 
-                    << output_blueprint_string_copy << std::endl;
+          LOG_ERROR("Cannot write into output directory: " + output_blueprint_string_copy);
           exit(-1);
         } else {
-          std::cerr << e.what() << std::endl;
+          LOG_ERROR(e.what());
           exit(-1);
         }
       }
-      std::cerr << "Writing out file: " << output_blueprint_string_copy << std::endl;
+      LOG_INFO("Writing out file: " + output_blueprint_string_copy);
       PDBWriter writer(output_blueprint_string_copy, prof);
       writer.Write(ent);
     }