Index: src/Fragmentation/BondsPerShortestPath.cpp
===================================================================
--- src/Fragmentation/BondsPerShortestPath.cpp	(revision 99b0dc7573c545c2d1ab699c79e875df4d992cb9)
+++ src/Fragmentation/BondsPerShortestPath.cpp	(revision 07a47e0c167bba50906b5cc3e9289ec6e7f1c6db)
@@ -101,6 +101,7 @@
  * \param _RootKeyNr index of root node
  * \param RestrictedKeySet Restricted vertex set to use in context of molecule
- */
-void BondsPerShortestPath::FillSPListandLabelVertices(int _RootKeyNr, KeySet &RestrictedKeySet)
+ * \param saturation this tells whether to treat hydrogen special or not.
+ */
+void BondsPerShortestPath::FillSPListandLabelVertices(int _RootKeyNr, KeySet &RestrictedKeySet, const enum HydrogenSaturation saturation)
 {
   // Actually, we should construct a spanning tree vom the root atom and select all edges therefrom and put them into
@@ -146,8 +147,6 @@
         OtherWalker = (*Runner)->GetOtherAtom(Walker);
         if ((RestrictedKeySet.find(OtherWalker->getNr()) != RestrictedKeySet.end())
-  #ifdef ADDHYDROGEN
-         && (OtherWalker->getType()->getAtomicNumber() != 1)
-  #endif
-                                                              ) {  // skip hydrogens and restrict to fragment
+            // skip hydrogens if desired and restrict to fragment
+            && ((saturation == DontSaturate) || (OtherWalker->getType()->getAtomicNumber() != 1))) {
           DoLog(2) && (Log() << Verbose(2) << "Current partner is " << *OtherWalker << " with nr " << OtherWalker->getNr() << " in bond " << *(*Runner) << "." << endl);
           // set the label if not set (and push on root stack as well)
Index: src/Fragmentation/BondsPerShortestPath.hpp
===================================================================
--- src/Fragmentation/BondsPerShortestPath.hpp	(revision 99b0dc7573c545c2d1ab699c79e875df4d992cb9)
+++ src/Fragmentation/BondsPerShortestPath.hpp	(revision 07a47e0c167bba50906b5cc3e9289ec6e7f1c6db)
@@ -13,4 +13,6 @@
 #include <config.h>
 #endif
+
+#include "Fragmentation/HydrogenSaturation_enum.hpp"
 
 #include <list>
@@ -31,5 +33,5 @@
   void SetSPList(atom *_Root);
   void ResetSPList();
-  void FillSPListandLabelVertices(int _RootKeyNr, KeySet &RestrictedKeySet);
+  void FillSPListandLabelVertices(int _RootKeyNr, KeySet &RestrictedKeySet, const enum HydrogenSaturation saturation);
   void OutputSPList();
   int CountNumbersInBondsList();
Index: src/Fragmentation/Fragmentation.cpp
===================================================================
--- src/Fragmentation/Fragmentation.cpp	(revision 99b0dc7573c545c2d1ab699c79e875df4d992cb9)
+++ src/Fragmentation/Fragmentation.cpp	(revision 07a47e0c167bba50906b5cc3e9289ec6e7f1c6db)
@@ -45,7 +45,10 @@
 /** Constructor of class Fragmentation.
  *
- */
-Fragmentation::Fragmentation(molecule *_mol) :
-  mol(_mol)
+ * \param _mol molecule for internal use (looking up atoms)
+ * \param _saturation whether to treat hydrogen special and saturate dangling bonds or not
+ */
+Fragmentation::Fragmentation(molecule *_mol, const enum HydrogenSaturation _saturation) :
+  mol(_mol),
+  saturation(_saturation)
 {}
 
@@ -90,9 +93,15 @@
 
   DoLog(0) && (Log() << Verbose(0) << endl);
-#ifdef ADDHYDROGEN
-  DoLog(0) && (Log() << Verbose(0) << "I will treat hydrogen special and saturate dangling bonds with it." << endl);
-#else
-  DoLog(0) && (Log() << Verbose(0) << "Hydrogen is treated just like the rest of the lot." << endl);
-#endif
+  switch (saturation) {
+    case DoSaturate:
+      DoLog(0) && (Log() << Verbose(0) << "I will treat hydrogen special and saturate dangling bonds with it." << endl);
+      break;
+    case DontSaturate:
+      DoLog(0) && (Log() << Verbose(0) << "Hydrogen is treated just like the rest of the lot." << endl);
+      break;
+    default:
+      ASSERT(0, "Fragmentation::FragmentMolecule() - there is a saturation setting which I have no idea about.");
+      break;
+  }
 
   // ++++++++++++++++++++++++++++ INITIAL STUFF: Bond structure analysis, file parsing, ... ++++++++++++++++++++++++++++++++++++++++++
@@ -151,5 +160,5 @@
     AtomMask[mol->getAtomCount()] = true;   // last plus one entry is used as marker that we have been through this loop once already in CheckOrderAtSite()
     // ===== 6b. fill RootStack for each subgraph (second adaptivity check) =====
-    Subgraphs->next->FillRootStackForSubgraphs(RootStack, AtomMask, (FragmentCounter = 0));
+    Subgraphs->next->FillRootStackForSubgraphs(RootStack, AtomMask, (FragmentCounter = 0), saturation);
 
     // ===== 7. fill the bond fragment list =====
@@ -359,5 +368,5 @@
       FragmentLowerOrdersList[RootNr][0] = new Graph;
       FragmentSearch.PrepareForPowersetGeneration(1., FragmentLowerOrdersList[RootNr][0], Walker);
-      NumMoleculesOfOrder[RootNr] = PSG(CompleteMolecule);
+      NumMoleculesOfOrder[RootNr] = PSG(CompleteMolecule, saturation);
 
       // output resulting number
@@ -487,7 +496,5 @@
       DoeLog(2) && (eLog()<< Verbose(2) << "Unable to parse file, incrementing all." << endl);
       for (molecule::const_iterator iter = mol->begin(); iter != mol->end(); ++iter) {
-    #ifdef ADDHYDROGEN
-        if ((*iter)->getType()->getAtomicNumber() != 1) // skip hydrogen
-    #endif
+        if ((saturation == DontSaturate) || ((*iter)->getType()->getAtomicNumber() != 1)) // skip hydrogen
         {
           AtomMask[(*iter)->getNr()] = true;  // include all (non-hydrogen) atoms
@@ -502,7 +509,5 @@
   } else { // global increase of Bond Order
     for(molecule::const_iterator iter = mol->begin(); iter != mol->end(); ++iter) {
-  #ifdef ADDHYDROGEN
-      if ((*iter)->getType()->getAtomicNumber() != 1) // skip hydrogen
-  #endif
+      if ((saturation == DontSaturate) || ((*iter)->getType()->getAtomicNumber() != 1)) // skip hydrogen
       {
         AtomMask[(*iter)->getNr()] = true;  // include all (non-hydrogen) atoms
@@ -670,7 +675,4 @@
   atom *FatherOfRunner = NULL;
 
-#ifdef ADDHYDROGEN
-  molecule::const_iterator runner;
-#endif
   // we increment the iter just before skipping the hydrogen
   for (molecule::const_iterator iter = Leaf->begin(); iter != Leaf->end();) {
@@ -700,9 +702,8 @@
         } else {
 //          Log() << Verbose(0) << ", who has no son in this fragment molecule." << endl;
-#ifdef ADDHYDROGEN
           //Log() << Verbose(3) << "Adding Hydrogen to " << (*iter)->Name << " and a bond in between." << endl;
-          if(!Leaf->AddHydrogenReplacementAtom((*BondRunner), (*iter), FatherOfRunner, OtherFather, IsAngstroem))
-            exit(1);
-#endif
+          if (saturation == DoSaturate)
+            if (!Leaf->AddHydrogenReplacementAtom((*BondRunner), (*iter), FatherOfRunner, OtherFather, IsAngstroem))
+              exit(1);
           //NumBonds[(*iter)->getNr()] += Binder->BondDegree;
         }
@@ -715,9 +716,9 @@
     }
     ++iter;
-#ifdef ADDHYDROGEN
-    while ((iter != Leaf->end()) && ((*iter)->getType()->getAtomicNumber() == 1)){ // skip added hydrogen
-      iter++;
-    }
-#endif
+    if (saturation == DoSaturate) {
+      while ((iter != Leaf->end()) && ((*iter)->getType()->getAtomicNumber() == 1)){ // skip added hydrogen
+        iter++;
+      }
+    }
   }
 };
Index: src/Fragmentation/Fragmentation.hpp
===================================================================
--- src/Fragmentation/Fragmentation.hpp	(revision 99b0dc7573c545c2d1ab699c79e875df4d992cb9)
+++ src/Fragmentation/Fragmentation.hpp	(revision 07a47e0c167bba50906b5cc3e9289ec6e7f1c6db)
@@ -18,4 +18,5 @@
 #include "Graph/DepthFirstSearchAnalysis.hpp"
 
+#include "Fragmentation/HydrogenSaturation_enum.hpp"
 #include "Fragmentation/fragmentation_helpers.hpp"
 
@@ -31,5 +32,5 @@
 {
 public:
-  Fragmentation(molecule *_mol);
+  Fragmentation(molecule *_mol, const enum HydrogenSaturation _saturation);
   ~Fragmentation();
 
@@ -58,4 +59,6 @@
   //!> pointer to molecule that is fragmented
   molecule *mol;
+  //!> whether to saturate dangling bonds with hydrogen and hence treat hydrogen special
+  const enum HydrogenSaturation saturation;
   //!> list of parser types for which a configuration file per fragment is stored
   std::vector<std::string> typelist;
Index: src/Fragmentation/HydrogenSaturation_enum.hpp
===================================================================
--- src/Fragmentation/HydrogenSaturation_enum.hpp	(revision 07a47e0c167bba50906b5cc3e9289ec6e7f1c6db)
+++ src/Fragmentation/HydrogenSaturation_enum.hpp	(revision 07a47e0c167bba50906b5cc3e9289ec6e7f1c6db)
@@ -0,0 +1,22 @@
+/*
+ * HydrogenSaturation_enum.hpp
+ *
+ *  Created on: Oct 26, 2011
+ *      Author: heber
+ */
+
+#ifndef HYDROGENSATURATION_ENUM_HPP_
+#define HYDROGENSATURATION_ENUM_HPP_
+
+// include config.h
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+enum HydrogenSaturation {
+  DontSaturate, //!< don't saturate and don't treat hydrogen special in any way
+  DoSaturate,   //!< do saturate dangling bonds and hence also treat hydrogen special (neglect it)
+};
+
+
+#endif /* HYDROGENSATURATION_ENUM_HPP_ */
Index: src/Fragmentation/PowerSetGenerator.cpp
===================================================================
--- src/Fragmentation/PowerSetGenerator.cpp	(revision 99b0dc7573c545c2d1ab699c79e875df4d992cb9)
+++ src/Fragmentation/PowerSetGenerator.cpp	(revision 07a47e0c167bba50906b5cc3e9289ec6e7f1c6db)
@@ -172,8 +172,9 @@
  * with SP of 2, then those with SP of 3, then those with SP of 4 and so on.
  * \param RestrictedKeySet Restricted vertex set to use in context of molecule
+ * \param saturation whether to treat hydrogen special or not
  * \return number of inserted fragments
  * \note ShortestPathList in FragmentSearch structure is probably due to NumberOfAtomsSPLevel and SP not needed anymore
  */
-int PowerSetGenerator::operator()(KeySet &RestrictedKeySet)
+int PowerSetGenerator::operator()(KeySet &RestrictedKeySet, const enum HydrogenSaturation saturation)
 {
   int Counter = FragmentSearch->FragmentCounter; // mark current value of counter
@@ -185,5 +186,5 @@
 
   // do a BFS search to fill the SP lists and label the found vertices
-  BondsPerSPList.FillSPListandLabelVertices(FragmentSearch->getRoot()->GetTrueFather()->getNr(), RestrictedKeySet);
+  BondsPerSPList.FillSPListandLabelVertices(FragmentSearch->getRoot()->GetTrueFather()->getNr(), RestrictedKeySet, saturation);
 
   // outputting all list for debugging
Index: src/Fragmentation/PowerSetGenerator.hpp
===================================================================
--- src/Fragmentation/PowerSetGenerator.hpp	(revision 99b0dc7573c545c2d1ab699c79e875df4d992cb9)
+++ src/Fragmentation/PowerSetGenerator.hpp	(revision 07a47e0c167bba50906b5cc3e9289ec6e7f1c6db)
@@ -18,4 +18,5 @@
 
 #include "Fragmentation/BondsPerShortestPath.hpp"
+#include "Fragmentation/HydrogenSaturation_enum.hpp"
 
 class bond;
@@ -29,5 +30,5 @@
 
   void SPFragmentGenerator(int RootDistance, std::vector<bond *> &BondsSet, int SetDimension, int SubOrder);
-  int operator()(KeySet &RestrictedKeySet);
+  int operator()(KeySet &RestrictedKeySet, const enum HydrogenSaturation saturation);
   void RemoveAllTouchedFromSnakeStack(int verbosity, KeySet *FragmentSet, int *&TouchedList, int &TouchedIndex);
   int FillBondsList(std::vector<bond *> &BondsList, std::list<bond *>::const_iterator SetFirst, std::list<bond *>::const_iterator SetLast, int *&TouchedList, int TouchedIndex);
