diff --git a/modules/conop/pymod/export_processor.cc b/modules/conop/pymod/export_processor.cc
index 00c72521b07a6218f60b811ef6c7bb4b5a0dcc30..27317133e9eee11d724045b77d31ba5a1296e607 100644
--- a/modules/conop/pymod/export_processor.cc
+++ b/modules/conop/pymod/export_processor.cc
@@ -39,6 +39,10 @@ struct WrappedProcessor : public PyProcessor, public wrapper<WrappedProcessor> {
   ProcessorPtr Copy() const { 
     return call_method<ProcessorPtr>(self_, "Copy"); 
   }
+  virtual String ToString() const {
+    return call_method<String>(self_, "ToString");
+  }
+  String ToStringDefault() const { return ""; }
   ProcessorPtr CopyDefault() const { return ProcessorPtr(); }
   
   PyObject* self_;
@@ -78,6 +82,7 @@ void export_processor() {
          bases<Processor> >("Processor")
     .def("Copy", &WrappedProcessor::CopyDefault)
     .def("DoProcess", &WrappedProcessor::DoProcessDefault)
+    .def("ToString", &WrappedProcessor::ToStringDefault)
   ;
   def("IsBondFeasible", &IsBondFeasible);
 }
diff --git a/modules/conop/src/heuristic.cc b/modules/conop/src/heuristic.cc
index d21c13fd513e816ade98b96787616593c2f7ec56..cecf6dcb2df8996a41b7685877e5c40518bac4b5 100644
--- a/modules/conop/src/heuristic.cc
+++ b/modules/conop/src/heuristic.cc
@@ -89,4 +89,10 @@ void HeuristicProcessor::DoProcess(DiagnosticsPtr diags,
   }
 }
 
+String HeuristicProcessor::ToString() const {
+  std::stringstream ss;
+  ss << "HeuristicProcessor(" << this->OptionsToString() << ")";
+  return ss.str();
+}
+
 }}
diff --git a/modules/conop/src/heuristic.hh b/modules/conop/src/heuristic.hh
index 6fb8a7877c50ad6f83e8f02da1b464a8da7fa141..a0a7b60ff626b9e72c10f41b09237d14e00f8a6d 100644
--- a/modules/conop/src/heuristic.hh
+++ b/modules/conop/src/heuristic.hh
@@ -40,6 +40,8 @@ public:
   }
   HeuristicProcessor(bool bf, bool at, bool cn, bool aa, ConopAction zo): 
     Processor(bf, at, cn, aa, zo) {}
+
+  virtual String ToString() const;
 protected:
   void ProcessUnkResidue(DiagnosticsPtr diags, mol::ResidueHandle res) const;
   virtual void DoProcess(DiagnosticsPtr diags, 
diff --git a/modules/conop/src/processor.cc b/modules/conop/src/processor.cc
index 80eec1fb3f01fb6734ed7e6e6fe7fd1b256019c1..a1d6a6cfb2c844ee03159901abbf00953d551792 100644
--- a/modules/conop/src/processor.cc
+++ b/modules/conop/src/processor.cc
@@ -412,6 +412,23 @@ void Processor::DistanceBasedConnect(mol::AtomHandle atom) const
   }
 }
 
+String StringFromConopAction(ConopAction action) {
+  switch (action) {
+    case CONOP_FATAL:
+      return "fatal";
+    case CONOP_SILENT:
+      return "silent";
+    case CONOP_REMOVE:
+      return "rm";
+    case CONOP_REMOVE_RESIDUE:
+      return "rm_residue";
+    case CONOP_REMOVE_ATOM:
+      return "rm_atom";
+    case CONOP_WARN:
+      return "warn";
+  }
+}
+
 bool Processor::AreResiduesConsecutive(mol::ResidueHandle r1, 
                                        mol::ResidueHandle r2)
 {
@@ -422,4 +439,15 @@ bool Processor::AreResiduesConsecutive(mol::ResidueHandle r1,
 }
 
 
+String Processor::OptionsToString() const {
+  std::stringstream ss;
+  ss << "check_bond_feasibility=" << (check_bond_feasibility_ ? "True" : "False") << ", "
+     << "assign_torsions=" << (assign_torsions_ ? "True" : "False") << ", "
+     << "connect=" << (connect_ ? "True" : "False") << ", "
+     << "connect_peptides=" << (connect_aa_ ? "True" : "False")  << ", "
+     << "zero_occ_treatment='" << StringFromConopAction(zero_occ_treatment_) << "'";
+  return ss.str();
+}
+
+
 }}
diff --git a/modules/conop/src/processor.hh b/modules/conop/src/processor.hh
index 01435123366e496c41d649bdd209fea6b9a6b51f..6001b5cbfa32b8610ef73753256515276f583f43 100644
--- a/modules/conop/src/processor.hh
+++ b/modules/conop/src/processor.hh
@@ -109,6 +109,9 @@ public:
   void SetZeroOccTreatment(ConopAction action) {
     zero_occ_treatment_ = action;
   }
+  virtual String ToString() const = 0;
+protected:
+  String OptionsToString() const; 
 private:
   bool check_bond_feasibility_;
   bool assign_torsions_;
@@ -119,6 +122,8 @@ private:
 
 ConopAction DLLEXPORT_OST_CONOP ConopActionFromString(const String& name);
 
+String DLLEXPORT_OST_CONOP StringFromConopAction(ConopAction action);
+
 
 /// \brief guess element of atom based on name and hetatm flag
 String DLLEXPORT_OST_CONOP GuessAtomElement(const String& atom_name, bool hetatm);
diff --git a/modules/conop/src/rule_based.cc b/modules/conop/src/rule_based.cc
index 7bbf25f2e3f048f27368ad59d971e20bfb47d340..11dac390e7cec4d3a773a6080ff0852040a6944d 100644
--- a/modules/conop/src/rule_based.cc
+++ b/modules/conop/src/rule_based.cc
@@ -177,6 +177,16 @@ void RuleBasedProcessor::ProcessUnkAtoms(DiagnosticsPtr diags,
   }
 }
 
+String RuleBasedProcessor::ToString() const {
+  std::stringstream ss;
+  ss << "RuleBasedProcesor(" << this->OptionsToString() 
+     << ", fix_element=" << (fix_element_ ? "True" : "False")
+     << ", strict_hydrogens=" << (strict_hydrogens_ ? "True" : "False")
+     << ", unk_res_treatment='" << StringFromConopAction(unk_res_treatment_)
+     << ", unk_atom_treatment'=" << StringFromConopAction(unk_atom_treatment_)
+     << "')";
+  return ss.str();
+}
 
 
 
diff --git a/modules/conop/src/rule_based.hh b/modules/conop/src/rule_based.hh
index 6fa83490c5a2b065f071a5cf2eaf98b0e5a711e9..2fde776130686becad978adf8bc34a3b1a38bba1 100644
--- a/modules/conop/src/rule_based.hh
+++ b/modules/conop/src/rule_based.hh
@@ -77,6 +77,8 @@ public:
   virtual ProcessorPtr Copy() const {
     return ProcessorPtr(new RuleBasedProcessor(*this));
   }
+
+  virtual String ToString() const;
 protected:
   void ProcessUnkResidue(DiagnosticsPtr diags,
                          mol::ResidueHandle res, 
diff --git a/modules/io/src/mol/io_profile.hh b/modules/io/src/mol/io_profile.hh
index f2214c2807ae4ca16898d81cbd0b0335c8c2e66b..abf37a6b22a2c1e389b9d58d1179e858ca9fe14a 100644
--- a/modules/io/src/mol/io_profile.hh
+++ b/modules/io/src/mol/io_profile.hh
@@ -61,17 +61,13 @@ public:
 
 inline  std::ostream& operator<<(std::ostream& stream, const IOProfile& p)
 {
-#if 0
-  stream << "IOProfile(dialect='" << p.dialect << "', strict_hydrogens="
-         << (p.strict_hydrogens ? "True" : "False") << ", quack_mode="
-         << (p.quack_mode ? "True" : "False") << ", join_spread_atom_records="
-         << (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") << ", bond_feasibility_check="
-	 << (p.bond_feasibility_check ? "True" : "False") << ")";
-#endif
-#warning implement me
+  stream << "IOProfile(dialect='" << p.dialect
+         << "', quack_mode=" << (p.quack_mode ? "True" : "False") << ", "
+         << "join_spread_atom_records=" << (p.join_spread_atom_records ? "True" : "False") << ", "
+         << "calpha_only=" << (p.calpha_only ? "True" : "False") << ", "
+         << "fault_tolerant=" << (p.fault_tolerant ? "True" : "False") << ", "
+         << "no_hetatms=" << (p.no_hetatms ? "True" : "False") << ", "
+         << "processor=" << (p.processor ? p.processor->ToString() : "None") << ")";
   return stream;
 }
 
diff --git a/modules/mol/alg/src/lddt.cc b/modules/mol/alg/src/lddt.cc
index 4a82818dc47e1aa5850bc0b5791a71498dbac9f4..ef291041dfde41ce93c15cab603258540f0d3fe4 100644
--- a/modules/mol/alg/src/lddt.cc
+++ b/modules/mol/alg/src/lddt.cc
@@ -186,9 +186,6 @@ int main (int argc, char **argv)
 
   // creates the required loading profile
   IOProfile profile;
-#warning implement me
-  //profile.bond_feasibility_check=false;
-
   // parses options
   String sel;
   String custom_path;
@@ -229,6 +226,7 @@ int main (int argc, char **argv)
     exit(0);
   }
   profile.processor = conop::RuleBasedProcessorPtr(new conop::RuleBasedProcessor(lib));
+  profile.processor->SetCheckBondFeasibility(false);
   po::notify(vm);
   if (vm.count("version")) {
     std::cout << "Version: " << version << std::endl;