Index: src/molecule.cpp
===================================================================
--- src/molecule.cpp	(revision 8e1f9015fa26331d074f80396b4d0f473847dc93)
+++ src/molecule.cpp	(revision c67ff9c421296109fd402e1c2e1890d090d2777f)
@@ -44,4 +44,5 @@
 #include "LinkedCell/linkedcell.hpp"
 #include "IdPool_impl.hpp"
+#include "Shapes/BaseShapes.hpp"
 #include "Tesselation/tesselation.hpp"
 #include "World.hpp"
@@ -548,7 +549,8 @@
 
 /** Creates a copy of this molecule.
+ * \param offset translation Vector for the new molecule relative to old one
  * \return copy of molecule
  */
-molecule *molecule::CopyMolecule() const
+molecule *molecule::CopyMolecule(const Vector &offset) const
 {
   molecule *copy = World::getInstance().createMolecule();
@@ -558,4 +560,5 @@
   for (iterator iter = begin(); iter != end(); ++iter) {
     atom * const copy_atom = copy->AddCopyAtom(*iter);
+    copy_atom->setPosition(copy_atom->getPosition() + offset);
     FatherFinder.insert( std::make_pair( *iter, copy_atom ) );
   }
@@ -1022,4 +1025,33 @@
 }
 
+Shape molecule::getBoundingShape() const
+{
+  // get center and radius
+  Vector center;
+  double radius = 0.;
+  {
+    center.Zero();
+    for(const_iterator iter = begin(); iter != end(); ++iter)
+      center += (*iter)->getPosition();
+    center *= 1./(double)size();
+    for(const_iterator iter = begin(); iter != end(); ++iter) {
+      const Vector &position = (*iter)->getPosition();
+      const double temp_distance = position.DistanceSquared(center);
+      if (temp_distance > radius)
+        radius = temp_distance;
+    }
+  }
+  // convert radius to true value and add some small boundary
+  radius = sqrt(radius) + 1e+6*std::numeric_limits<double>::epsilon();
+  LOG(1, "INFO: The " << size() << " atoms of the molecule are contained in a sphere at "
+      << center << " with radius " << radius << ".");
+
+  Shape BoundingShape(Sphere(center, radius));
+  LOG(1, "INFO: Created sphere at " << BoundingShape.getCenter() << " and radius "
+      << BoundingShape.getRadius() << ".");
+  return BoundingShape;
+}
+
 // construct idpool
 CONSTRUCT_IDPOOL(atomId_t, continuousId)
+
Index: src/molecule.hpp
===================================================================
--- src/molecule.hpp	(revision 8e1f9015fa26331d074f80396b4d0f473847dc93)
+++ src/molecule.hpp	(revision c67ff9c421296109fd402e1c2e1890d090d2777f)
@@ -33,4 +33,5 @@
 #include "IdPool_policy.hpp"
 #include "IdPool.hpp"
+#include "Shapes/Shape.hpp"
 #include "types.hpp"
 
@@ -49,8 +50,7 @@
 class MoleculeLeafClass;
 class MoleculeListClass;
-class periodentafel;
+class MoleculeUnittest;
 class RealSpaceMatrix;
 class Vector;
-class Shape;
 
 /************************************* Class definitions ****************************************/
@@ -61,5 +61,9 @@
 class molecule : public Observable
 {
+  //!> grant unit test access
+  friend class MoleculeUnittest;
+  //!> function may access cstor
   friend molecule *NewMolecule();
+  //!> function may access dstor
   friend void DeleteMolecule(molecule *);
 
@@ -138,4 +142,9 @@
     return atomIds.find(key);
   }
+
+  /** Returns the set of atomic ids contained in this molecule.
+   *
+   * @return set of atomic ids
+   */
   const atomIdSet & getAtomIds() const {
     return atomIds.getAtomIds();
@@ -189,4 +198,9 @@
 
 public:
+
+  /** Function to create a bounding spherical shape for the currently associated atoms.
+   *
+   */
+  Shape getBoundingShape() const;
 
   /// remove atoms from molecule.
@@ -241,5 +255,5 @@
   bond * CopyBond(atom *left, atom *right, bond *CopyBond);
 
-  molecule *CopyMolecule() const;
+  molecule *CopyMolecule(const Vector &offset = zeroVec) const;
   molecule* CopyMoleculeFromSubRegion(const Shape&) const;
 
Index: src/unittests/Makefile.am
===================================================================
--- src/unittests/Makefile.am	(revision 8e1f9015fa26331d074f80396b4d0f473847dc93)
+++ src/unittests/Makefile.am	(revision c67ff9c421296109fd402e1c2e1890d090d2777f)
@@ -33,4 +33,5 @@
   FormulaUnittest \
   ListOfBondsUnitTest \
+  MoleculeUnitTest \
   WorldTimeUnitTest
 
@@ -87,4 +88,5 @@
   FormulaUnitTest.cpp \
   ListOfBondsUnitTest.cpp \
+  MoleculeUnitTest.cpp \
   WorldTimeUnitTest.cpp
 
@@ -110,4 +112,5 @@
   FormulaUnitTest.hpp \
   ListOfBondsUnitTest.hpp \
+  MoleculeUnitTest.hpp \
   WorldTimeUnitTest.hpp
   
@@ -148,4 +151,12 @@
 ListOfBondsUnitTest_LDADD = $(ALLLIBS)
 
+MoleculeUnitTest_SOURCES = $(top_srcdir)/src/unittests/UnitTestMain.cpp \
+	MoleculeUnitTest.cpp \
+	MoleculeUnitTest.hpp
+MoleculeUnitTest_LDADD = \
+	../libMolecuilderUI.la \
+	../libMolecuilder.la \
+	$(top_builddir)/LinearAlgebra/src/LinearAlgebra/libLinearAlgebra.la
+
 WorldTimeUnitTest_SOURCES = $(top_srcdir)/src/unittests/UnitTestMain.cpp \
 	WorldTimeUnitTest.cpp \
Index: src/unittests/MoleculeUnitTest.cpp
===================================================================
--- src/unittests/MoleculeUnitTest.cpp	(revision c67ff9c421296109fd402e1c2e1890d090d2777f)
+++ src/unittests/MoleculeUnitTest.cpp	(revision c67ff9c421296109fd402e1c2e1890d090d2777f)
@@ -0,0 +1,116 @@
+/*
+ * Project: MoleCuilder
+ * Description: creates and alters molecular systems
+ * Copyright (C)  2012 University of Bonn. All rights reserved.
+ * Please see the LICENSE file or "Copyright notice" in builder.cpp for details.
+ */
+
+/*
+ * MoleculeUnitTest.cpp
+ *
+ *  Created on: Mar 19, 2012
+ *      Author: heber
+ */
+
+// include config.h
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+#include <cppunit/CompilerOutputter.h>
+#include <cppunit/extensions/TestFactoryRegistry.h>
+#include <cppunit/ui/text/TestRunner.h>
+
+#include <algorithm>
+
+#include "Atom/atom.hpp"
+#include "CodePatterns/Assert.hpp"
+#include "Element/element.hpp"
+#include "Element/periodentafel.hpp"
+#include "molecule.hpp"
+
+#include "MoleculeUnitTest.hpp"
+
+
+#ifdef HAVE_TESTRUNNER
+#include "UnitTestMain.hpp"
+#endif /*HAVE_TESTRUNNER*/
+
+/********************************************** Test classes **************************************/
+
+// Registers the fixture into the 'registry'
+CPPUNIT_TEST_SUITE_REGISTRATION( MoleculeUnittest );
+
+size_t MoleculeUnittest::MaxAtoms = 6;
+
+void MoleculeUnittest::setUp(){
+  // failing asserts should be thrown
+  ASSERT_DO(Assert::Throw);
+
+  atomVector.resize((size_t)MaxAtoms);
+  std::generate_n(atomVector.begin(), MaxAtoms,
+      boost::bind(&World::createAtom, boost::ref(World::getInstance())));
+  std::for_each(atomVector.begin(), atomVector.end(),
+      boost::bind(static_cast<void (AtomInfo::*)(int)>(&AtomInfo::setType), _1, (atomicNumber_t)1));
+
+  mol = new molecule;
+  std::for_each(atomVector.begin(), atomVector.end(),
+      boost::bind(&molecule::AddAtom, boost::ref(mol), _1));
+}
+
+void MoleculeUnittest::tearDown()
+{
+  delete mol;
+  World::purgeInstance();
+}
+
+/** Unit test for molecule::getBoundingShape() with a linear chain
+ *
+ */
+void MoleculeUnittest::getBoundingShapeTest_linearchain()
+{
+  // prepare a chain of atoms
+  double offset = 0.;
+  BOOST_FOREACH(atom *_atom, atomVector) {
+    _atom->setPosition( Vector(offset, 0., 0.) );
+    offset += 1.;
+  }
+
+  {
+    // get bounding shape
+    Shape s = mol->getBoundingShape();
+
+    // check that each atom is truely inside the shape
+    BOOST_FOREACH(atom *_atom, atomVector) {
+      CPPUNIT_ASSERT( s.isInside(_atom->getPosition()) );
+    }
+  }
+}
+
+/** Unit test for molecule::getBoundingShape() with a v-shaped molecule.
+ *
+ */
+void MoleculeUnittest::getBoundingShapeTest_vshaped()
+{
+  double xoffset = -2.5;
+  double yoffset = -2.5;
+  double yadder = -1;
+  BOOST_FOREACH(atom *_atom, atomVector) {
+    _atom->setPosition( Vector(xoffset, yoffset, 0.) );
+    xoffset += 1.;
+    yoffset -= yadder;
+    if (yoffset <= 0) {
+      yadder = 1.;
+    }
+  }
+
+  {
+    // get bounding shape
+    Shape s = mol->getBoundingShape();
+
+    // check that each atom is truely inside the shape
+    BOOST_FOREACH(atom *_atom, atomVector) {
+      CPPUNIT_ASSERT( s.isInside(_atom->getPosition()) );
+    }
+  }
+}
Index: src/unittests/MoleculeUnitTest.hpp
===================================================================
--- src/unittests/MoleculeUnitTest.hpp	(revision c67ff9c421296109fd402e1c2e1890d090d2777f)
+++ src/unittests/MoleculeUnitTest.hpp	(revision c67ff9c421296109fd402e1c2e1890d090d2777f)
@@ -0,0 +1,45 @@
+/*
+ * MoleculeUnitTest.hpp
+ *
+ *  Created on: Mar 19, 2012
+ *      Author: heber
+ */
+
+#ifndef MOLECULEUNITTEST_HPP_
+#define MOLECULEUNITTEST_HPP_
+
+// include config.h
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+
+#include <cppunit/extensions/HelperMacros.h>
+
+#include <vector>
+
+class atom;
+class molecule;
+
+class MoleculeUnittest : public CppUnit::TestFixture
+{
+  CPPUNIT_TEST_SUITE( MoleculeUnittest );
+  CPPUNIT_TEST ( getBoundingShapeTest_linearchain );
+  CPPUNIT_TEST ( getBoundingShapeTest_vshaped );
+  CPPUNIT_TEST_SUITE_END();
+
+public:
+  void setUp();
+  void tearDown();
+
+  void getBoundingShapeTest_linearchain();
+  void getBoundingShapeTest_vshaped();
+
+private:
+  std::vector<atom *> atomVector;
+  molecule *mol;
+
+  static size_t MaxAtoms;
+};
+
+#endif /* MOLECULEUNITTEST_HPP_ */
