Index: src/Graph/BreadthFirstSearchAdd.cpp
===================================================================
--- src/Graph/BreadthFirstSearchAdd.cpp	(revision 42127c3196b85e2b52749471ca9014640269b9fb)
+++ src/Graph/BreadthFirstSearchAdd.cpp	(revision 07a47e0c167bba50906b5cc3e9289ec6e7f1c6db)
@@ -32,7 +32,8 @@
 
 
-BreadthFirstSearchAdd::BreadthFirstSearchAdd(atom *&_Root, int _BondOrder, bool _IsAngstroem) :
+BreadthFirstSearchAdd::BreadthFirstSearchAdd(atom *&_Root, int _BondOrder, bool _IsAngstroem, const enum HydrogenSaturation _saturation) :
   BondOrder(_BondOrder),
   Root(_Root),
+  saturation(_saturation),
   IsAngstroem(_IsAngstroem)
 {
@@ -100,8 +101,7 @@
         AddedBondList[Binder] = Mol->CopyBond(AddedAtomList[Walker->getNr()], AddedAtomList[OtherAtom->getNr()], Binder);
       } else {
-#ifdef ADDHYDROGEN
-        if (!Mol->AddHydrogenReplacementAtom(Binder, AddedAtomList[Walker->getNr()], Walker, OtherAtom, IsAngstroem))
-        exit(1);
-#endif
+        if (saturation == DoSaturate)
+          if (!Mol->AddHydrogenReplacementAtom(Binder, AddedAtomList[Walker->getNr()], Walker, OtherAtom, IsAngstroem))
+            exit(1);
       }
     }
@@ -118,8 +118,7 @@
       AddedBondList[Binder] = Mol->CopyBond(AddedAtomList[Walker->getNr()], AddedAtomList[OtherAtom->getNr()], Binder);
     } else { // if it's root bond it has to broken (otherwise we would not create the fragments)
-#ifdef ADDHYDROGEN
-      if(!Mol->AddHydrogenReplacementAtom(Binder, AddedAtomList[Walker->getNr()], Walker, OtherAtom, IsAngstroem))
-      exit(1);
-#endif
+      if (saturation == DoSaturate)
+        if(!Mol->AddHydrogenReplacementAtom(Binder, AddedAtomList[Walker->getNr()], Walker, OtherAtom, IsAngstroem))
+          exit(1);
     }
   }
Index: src/Graph/BreadthFirstSearchAdd.hpp
===================================================================
--- src/Graph/BreadthFirstSearchAdd.hpp	(revision 42127c3196b85e2b52749471ca9014640269b9fb)
+++ src/Graph/BreadthFirstSearchAdd.hpp	(revision 07a47e0c167bba50906b5cc3e9289ec6e7f1c6db)
@@ -18,4 +18,5 @@
 
 #include "Bond/GraphEdge.hpp"
+#include "Fragmentation/HydrogenSaturation_enum.hpp"
 #include "Helpers/defs.hpp"
 #include "types.hpp"
@@ -28,5 +29,5 @@
 {
 public:
-  BreadthFirstSearchAdd(atom *&_Root, int _BondOrder, bool _IsAngstroem);
+  BreadthFirstSearchAdd(atom *&_Root, int _BondOrder, bool _IsAngstroem, const enum HydrogenSaturation _saturation);
   ~BreadthFirstSearchAdd();
 
@@ -71,4 +72,8 @@
   std::map<bond *, bond *> AddedBondList; //!< maps from father bond to son
 
+  //!> whether to treat hydrogen special or not
+  const enum HydrogenSaturation saturation;
+
+  //!> is angstroem our unit of length
   bool IsAngstroem;
 };
Index: src/Graph/CyclicStructureAnalysis.cpp
===================================================================
--- src/Graph/CyclicStructureAnalysis.cpp	(revision 42127c3196b85e2b52749471ca9014640269b9fb)
+++ src/Graph/CyclicStructureAnalysis.cpp	(revision 07a47e0c167bba50906b5cc3e9289ec6e7f1c6db)
@@ -31,5 +31,6 @@
 #include "molecule.hpp"
 
-CyclicStructureAnalysis::CyclicStructureAnalysis()
+CyclicStructureAnalysis::CyclicStructureAnalysis(const enum HydrogenSaturation _saturation) :
+  saturation(_saturation)
 {}
 
@@ -101,29 +102,25 @@
       if ((*Runner) != BackEdge) { // only walk along DFS spanning tree (otherwise we always find SP of one being backedge Binder)
         OtherAtom = (*Runner)->GetOtherAtom(Walker);
-#ifdef ADDHYDROGEN
-        if (OtherAtom->getType()->getAtomicNumber() != 1) {
-#endif
-        LOG(2, "INFO: Current OtherAtom is: " << OtherAtom->getName() << " for bond " << *(*Runner) << "." << endl);
-        if (ColorList[OtherAtom->getNr()] == GraphEdge::white) {
-          TouchedStack.push_front(OtherAtom);
-          ColorList[OtherAtom->getNr()] = GraphEdge::lightgray;
-          PredecessorList[OtherAtom->getNr()] = Walker; // Walker is the predecessor
-          ShortestPathList[OtherAtom->getNr()] = ShortestPathList[Walker->getNr()] + 1;
-          LOG(2, "INFO: Coloring OtherAtom " << OtherAtom->getName() << " lightgray, its predecessor is " << Walker->getName() << " and its Shortest Path is " << ShortestPathList[OtherAtom->getNr()] << " egde(s) long." << endl);
-          //if (ShortestPathList[OtherAtom->getNr()] < MinimumRingSize[Walker->GetTrueFather()->getNr()]) { // Check for maximum distance
-          LOG(3, "ACCEPT: Putting OtherAtom into queue." << endl);
-          BFSStack.push_front(OtherAtom);
-          //}
+        if ((saturation == DontSaturate) || (OtherAtom->getType()->getAtomicNumber() != 1)) {
+          LOG(2, "INFO: Current OtherAtom is: " << OtherAtom->getName() << " for bond " << *(*Runner) << "." << endl);
+          if (ColorList[OtherAtom->getNr()] == GraphEdge::white) {
+            TouchedStack.push_front(OtherAtom);
+            ColorList[OtherAtom->getNr()] = GraphEdge::lightgray;
+            PredecessorList[OtherAtom->getNr()] = Walker; // Walker is the predecessor
+            ShortestPathList[OtherAtom->getNr()] = ShortestPathList[Walker->getNr()] + 1;
+            LOG(2, "INFO: Coloring OtherAtom " << OtherAtom->getName() << " lightgray, its predecessor is " << Walker->getName() << " and its Shortest Path is " << ShortestPathList[OtherAtom->getNr()] << " egde(s) long." << endl);
+            //if (ShortestPathList[OtherAtom->getNr()] < MinimumRingSize[Walker->GetTrueFather()->getNr()]) { // Check for maximum distance
+            LOG(3, "ACCEPT: Putting OtherAtom into queue." << endl);
+            BFSStack.push_front(OtherAtom);
+            //}
+          } else {
+            LOG(3, "REJECT: Not Adding, has already been visited." << endl);
+          }
+          if (OtherAtom == Root)
+            break;
         } else {
-          LOG(3, "REJECT: Not Adding, has already been visited." << endl);
+          LOG(2, "INFO: Skipping hydrogen atom " << *OtherAtom << "." << endl);
+          ColorList[OtherAtom->getNr()] = GraphEdge::black;
         }
-        if (OtherAtom == Root)
-          break;
-#ifdef ADDHYDROGEN
-      } else {
-        LOG(2, "INFO: Skipping hydrogen atom " << *OtherAtom << "." << endl);
-        ColorList[OtherAtom->getNr()] = GraphEdge::black;
-      }
-#endif
       } else {
         LOG(2, "REJECT: Bond " << *(*Runner) << " not Visiting, is the back edge." << endl);
Index: src/Graph/CyclicStructureAnalysis.hpp
===================================================================
--- src/Graph/CyclicStructureAnalysis.hpp	(revision 42127c3196b85e2b52749471ca9014640269b9fb)
+++ src/Graph/CyclicStructureAnalysis.hpp	(revision 07a47e0c167bba50906b5cc3e9289ec6e7f1c6db)
@@ -18,4 +18,5 @@
 
 #include "Bond/GraphEdge.hpp"
+#include "Fragmentation/HydrogenSaturation_enum.hpp"
 #include "Helpers/defs.hpp"
 #include "types.hpp"
@@ -28,5 +29,5 @@
 {
 public:
-  CyclicStructureAnalysis();
+  explicit CyclicStructureAnalysis(const enum HydrogenSaturation _saturation);
   ~CyclicStructureAnalysis();
 
@@ -58,4 +59,7 @@
   atom *Root;
 
+  //!> whether to treat hydrogen special or not
+  const enum HydrogenSaturation saturation;
+
   bool BackStepping;
   int CurrentGraphNr;
