Index: src/Fragmentation/Exporters/SaturatedFragment.cpp
===================================================================
--- src/Fragmentation/Exporters/SaturatedFragment.cpp	(revision c24071dff92b7e08e6bf43f2274ba053f7cd34e0)
+++ src/Fragmentation/Exporters/SaturatedFragment.cpp	(revision c6ddcb49851617a614ac989bfeae41c91886a779)
@@ -38,6 +38,10 @@
 #include "SaturatedFragment.hpp"
 
+#include <algorithm>
 #include <cmath>
 #include <iostream>
+
+#include <boost/bind.hpp>
+#include <boost/function.hpp>
 
 #include "CodePatterns/Assert.hpp"
@@ -611,2 +615,54 @@
   return AllWentWell;
 };
+
+#ifdef HAVE_INLINE
+inline
+#else
+static
+#endif
+void updateVector(Vector &_first, const Vector &_second,
+    const boost::function<const double& (const double &, const double &)> &_comparator)
+{
+  for (size_t i=0;i<NDIM;++i)
+    _first[i] = _comparator(_first[i], _second[i]);
+}
+
+std::pair<Vector, Vector> SaturatedFragment::getRoughBoundingBox() const
+{
+  typedef boost::function<const double& (const double &, const double &)> comparator_t;
+  static const comparator_t minimizer = boost::bind(&std::min<double>, _1, _2);
+  static const comparator_t maximizer = boost::bind(&std::max<double>, _1, _2);
+  // initialize return values
+  Vector minimum;
+  Vector maximum;
+  for (size_t i=0;i<NDIM;++i) {
+    minimum[i] = std::numeric_limits<double>::max();
+    maximum[i] = -std::numeric_limits<double>::max();
+  }
+
+  // go through all "core" atoms of the fragment
+  const std::vector<atom *> atoms = gatherAllAtoms(FullMolecule);
+  for (std::vector<atom *>::const_iterator iter = atoms.begin();
+      iter != atoms.end(); ++iter) {
+    const Vector &position = (*iter)->getPosition();
+    updateVector(minimum, position, minimizer);
+    updateVector(maximum, position, maximizer);
+  }
+
+  // go through each atom of the fragment and gather all cut bonds in list
+  const CutBonds_t CutBonds = gatherCutBonds(atoms, set, treatment);
+  for (CutBonds_t::const_iterator atomiter = CutBonds.begin();
+      atomiter != CutBonds.end(); ++atomiter) {
+    const atom * const walker = atomiter->first;
+    const BondList &cutbonds = atomiter->second;
+    for (BondList::const_iterator bonditer = cutbonds.begin();
+        bonditer != cutbonds.end(); ++bonditer) {
+      const atom * const OtherWalker = (*bonditer)->GetOtherAtom(walker);
+      const Vector &position = OtherWalker->getPosition();
+      updateVector(minimum, position, minimizer);
+      updateVector(maximum, position, maximizer);
+    }
+  }
+
+  return std::make_pair(minimum, maximum);
+}
Index: src/Fragmentation/Exporters/SaturatedFragment.hpp
===================================================================
--- src/Fragmentation/Exporters/SaturatedFragment.hpp	(revision c24071dff92b7e08e6bf43f2274ba053f7cd34e0)
+++ src/Fragmentation/Exporters/SaturatedFragment.hpp	(revision c6ddcb49851617a614ac989bfeae41c91886a779)
@@ -99,4 +99,11 @@
     return SaturationHydrogens;
   }
+
+  /** Determines the bounding box of the fragment without performing the hydrogen
+   * saturation but by simply using the atoms whose bonds are cut.
+   *
+   * \return pair of Vector with min and max coordinates
+   */
+  std::pair<Vector, Vector> getRoughBoundingBox() const;
 
   /** Prints the config of the fragment of \a _type to \a out.
Index: src/Fragmentation/Exporters/unittests/SaturatedFragmentUnitTest.cpp
===================================================================
--- src/Fragmentation/Exporters/unittests/SaturatedFragmentUnitTest.cpp	(revision c24071dff92b7e08e6bf43f2274ba053f7cd34e0)
+++ src/Fragmentation/Exporters/unittests/SaturatedFragmentUnitTest.cpp	(revision c6ddcb49851617a614ac989bfeae41c91886a779)
@@ -50,5 +50,12 @@
 #include "CodePatterns/Assert.hpp"
 
+#include "Atom/atom.hpp"
+#include "Atom/AtomObserver.hpp"
+#include "Element/element.hpp"
+#include "Element/periodentafel.hpp"
 #include "Fragmentation/HydrogenSaturation_enum.hpp"
+#include "molecule.hpp"
+#include "World.hpp"
+#include "WorldTime.hpp"
 
 #ifdef HAVE_TESTRUNNER
@@ -69,6 +76,34 @@
   ASSERT_DO(Assert::Throw);
 
+  // construct element
+  hydrogen = World::getInstance().getPeriode()->FindElement(1);
+  CPPUNIT_ASSERT(hydrogen != NULL && "could not find element hydrogen");
+  oxygen = World::getInstance().getPeriode()->FindElement(8);
+  CPPUNIT_ASSERT(oxygen != NULL && "could not find element oxygen");
+
+  // construct molecule (tetraeder of hydrogens)
+  TestMolecule = World::getInstance().createMolecule();
+  CPPUNIT_ASSERT(TestMolecule != NULL && "could not create molecule");
+  atom * Walker = World::getInstance().createAtom();
+  CPPUNIT_ASSERT(Walker != NULL && "could not create atom");
+  Walker->setType(oxygen);
+  Walker->setPosition(Vector(1., 0., 1. ));
+  TestMolecule->AddAtom(Walker);
+  Walker = World::getInstance().createAtom();
+  CPPUNIT_ASSERT(Walker != NULL && "could not create atom");
+  Walker->setType(hydrogen);
+  Walker->setPosition(Vector(0., 1., 1. ));
+  TestMolecule->AddAtom(Walker);
+  Walker = World::getInstance().createAtom();
+  CPPUNIT_ASSERT(Walker != NULL && "could not create atom");
+  Walker->setType(hydrogen);
+  Walker->setPosition(Vector(1., 1., 0. ));
+
+  // construct fragment keyset
   SaturatedFragment::GlobalSaturationPositions_t globalpositions;
   set = new KeySet;
+  set->insert(0);
+  set->insert(1);
+  set->insert(2);
   fragment = new SaturatedFragment(
       *set,
@@ -78,4 +113,5 @@
       DoSaturate,
       globalpositions);
+
 }
 
@@ -85,4 +121,14 @@
   delete fragment;
   delete set;
+
+  // remove
+  World::getInstance().destroyMolecule(TestMolecule);
+  // note that all the atoms, molecules, the tafel and the elements
+  // are all cleaned when the world is destroyed
+  World::purgeInstance();
+  AtomObserver::purgeInstance();
+  logger::purgeInstance();
+  errorLogger::purgeInstance();
+  WorldTime::purgeInstance();
 }
 
@@ -93,2 +139,13 @@
   CPPUNIT_ASSERT_EQUAL( *set, fragment->getKeySet() );
 }
+
+/** UnitTest for getRoughBoundingBox()
+ */
+void SaturatedFragmentTest::getRoughBoundingBox()
+{
+  const std::pair<Vector, Vector> minmax = fragment->getRoughBoundingBox();
+  for (size_t i=0;i<NDIM;++i) {
+    CPPUNIT_ASSERT( minmax.first[i] >= 0. );
+    CPPUNIT_ASSERT( minmax.second[i] <= 1. );
+  }
+}
Index: src/Fragmentation/Exporters/unittests/SaturatedFragmentUnitTest.hpp
===================================================================
--- src/Fragmentation/Exporters/unittests/SaturatedFragmentUnitTest.hpp	(revision c24071dff92b7e08e6bf43f2274ba053f7cd34e0)
+++ src/Fragmentation/Exporters/unittests/SaturatedFragmentUnitTest.hpp	(revision c6ddcb49851617a614ac989bfeae41c91886a779)
@@ -20,5 +20,7 @@
 #include "Fragmentation/Exporters/SaturatedFragment.hpp"
 
+class element;
 class KeySet;
+class molecule;
 
 /********************************************** Test classes **************************************/
@@ -28,4 +30,5 @@
     CPPUNIT_TEST_SUITE( SaturatedFragmentTest) ;
     CPPUNIT_TEST ( getKeySet_Test );
+    CPPUNIT_TEST ( getRoughBoundingBox );
     CPPUNIT_TEST_SUITE_END();
 
@@ -34,4 +37,5 @@
       void tearDown();
       void getKeySet_Test();
+      void getRoughBoundingBox();
 
 private:
@@ -40,4 +44,8 @@
       KeySet *set;
       SaturatedFragment *fragment;
+
+      molecule *TestMolecule;
+      const element *hydrogen;
+      const element *oxygen;
 };
 
