Index: src/Fragmentation/AdaptivityMap.cpp
===================================================================
--- src/Fragmentation/AdaptivityMap.cpp	(revision 2ab6b6fe93bbcbee3b2b87e40ef236d5a2c472c8)
+++ src/Fragmentation/AdaptivityMap.cpp	(revision 91207d4b79b8e46e1a50f522302e766ddeff4fb8)
@@ -199,22 +199,15 @@
 bool AdaptivityMap::MarkUpdateCandidates(AtomMask_t &AtomMask, int Order, molecule *mol) const
 {
-  atom *Walker = NULL;
-  int No = -1;
-  bool status = false;
   ASSERT( FinalRootCandidates != NULL,
       "AdaptivityMap::MarkUpdateCandidates() - FinalRootCandidates is not allocated yet.");
-  for(AdaptiveCriteriaValueMap::const_iterator runner = FinalRootCandidates->upper_bound(pow(10.,Order)); runner != FinalRootCandidates->end(); runner++) {
-    No = (*runner).second.first;
-    Walker = mol->FindAtom(No);
-    //if (Walker->AdaptiveOrder < MinimumRingSize[Walker->getNr()]) {
-      LOG(2, "Root " << No << " is still above threshold (10^{" << Order <<"}: " << runner->first << ", setting entry " << No << " of Atom mask to true.");
-      AtomMask.setTrue(No);
-      status = true;
-    //} else {
-      //AtomMask.setFalse(No);
-      //LOG(2, "Root " << No << " is still above threshold (10^{" << Order <<"}: " << runner->first << ", however MinimumRingSize of " << MinimumRingSize[Walker->getNr()] << " does not allow further adaptive increase.");
-    //}
-  }
-  return status;
+  const AdaptiveCriteriaValueMap::const_iterator enditer = FinalRootCandidates->upper_bound(pow(10.,Order));
+  for(AdaptiveCriteriaValueMap::const_iterator runner = FinalRootCandidates->begin();
+      runner != enditer; ++runner) {
+    const int No = (*runner).second.first;
+    const atom *Walker = mol->FindAtom(No);
+    LOG(2, "Root " << No << " is already below threshold (10^{" << Order <<"}: " << runner->first << ", setting entry " << No << " of Atom mask to false.");
+    AtomMask.setFalse(No);
+  }
+  return enditer != FinalRootCandidates->end();
 };
 
Index: src/Fragmentation/Fragmentation.cpp
===================================================================
--- src/Fragmentation/Fragmentation.cpp	(revision 2ab6b6fe93bbcbee3b2b87e40ef236d5a2c472c8)
+++ src/Fragmentation/Fragmentation.cpp	(revision 91207d4b79b8e46e1a50f522302e766ddeff4fb8)
@@ -91,5 +91,5 @@
  * of vertex indices: Global always means the index in "this" molecule, whereas local refers to the molecule or
  * subgraph in the MoleculeListClass.
- * \param atomids atoms to fragment, used in AtomMask
+ * \param atomids atomic ids (local to Fragmentation::mol) to fragment, used in AtomMask
  * \param Order up to how many neighbouring bonds a fragment contains in BondOrderScheme::BottumUp scheme
  * \param prefix prefix string for every fragment file name (may include path)
@@ -103,5 +103,4 @@
   bool CheckOrder = false;
   int TotalNumberOfKeySets = 0;
-  AtomMask_t AtomMask(atomids);
 
   LOG(0, std::endl);
@@ -126,4 +125,12 @@
     const std::vector<atomId_t> globalids = getGlobalIdsFromLocalIds(*mol, atomids);
     FragmentationToDo = FragmentationToDo && FileChecker(globalids);
+  }
+
+  // ===== 2. create AtomMask that takes Saturation condition into account
+  AtomMask_t AtomMask(atomids);
+  for (molecule::const_iterator iter = mol->begin(); iter != mol->end(); ++iter) {
+    // remove in hydrogen and we do saturate
+    if ((saturation == DoSaturate) && ((*iter)->getType()->getAtomicNumber() == 1)) // skip hydrogen
+      AtomMask.setFalse((*iter)->getNr());
   }
 
@@ -335,7 +342,4 @@
   bool status = false;
 
-  // initialize mask list
-  AtomMask.clear();
-
   if (Order < 0) { // adaptive increase of BondOrder per site
     if (LoopDoneAlready)  // break after one step
@@ -353,13 +357,8 @@
     if (IndexKeySetList->IsAdaptiveCriteriaListEmpty()) {
       ELOG(2, "Unable to parse file, incrementing all.");
-      for (molecule::const_iterator iter = mol->begin(); iter != mol->end(); ++iter) {
-        if ((saturation == DontSaturate) || ((*iter)->getType()->getAtomicNumber() != 1)) // skip hydrogen
-        {
-          AtomMask.setTrue((*iter)->getNr());  // include all (non-hydrogen) atoms
-          status = true;
-        }
-      }
+      status = true;
     } else {
-      IndexKeySetList->MarkUpdateCandidates(AtomMask, Order, mol);
+      // mark as false all sites that are below threshold already
+      status = IndexKeySetList->MarkUpdateCandidates(AtomMask, Order, mol);
     }
 
@@ -367,8 +366,9 @@
   } else { // global increase of Bond Order
     for(molecule::const_iterator iter = mol->begin(); iter != mol->end(); ++iter) {
-      if ((saturation == DontSaturate) || ((*iter)->getType()->getAtomicNumber() != 1)) // skip hydrogen
-      {
-        AtomMask.setTrue((*iter)->getNr());  // include all (non-hydrogen) atoms
-        if ((Order != 0) && ((*iter)->AdaptiveOrder < Order)) // && ((*iter)->AdaptiveOrder < MinimumRingSize[(*iter)->getNr()]))
+      if (AtomMask.isTrue((*iter)->getNr())) { // skip masked out
+        // remove all that have reached desired order
+        if ((Order != 0) && ((*iter)->AdaptiveOrder >= Order)) // && ((*iter)->AdaptiveOrder < MinimumRingSize[(*iter)->getNr()]))
+          AtomMask.setFalse((*iter)->getNr());
+        else
           status = true;
       }
