Index: src/Actions/GraphAction/CreateAdjacencyAction.cpp
===================================================================
--- src/Actions/GraphAction/CreateAdjacencyAction.cpp	(revision 37b257551a03bddeeb79df686a845ed3e736653e)
+++ src/Actions/GraphAction/CreateAdjacencyAction.cpp	(revision 5e2f80b94564cd7797be678d694bf8d3012bd825)
@@ -72,10 +72,11 @@
       ++AtomRunner) {
     AtomCount++;
-    BondList& ListOfBonds = (AtomRunner->second)->getListOfBonds();
-    for(BondList::iterator BondRunner = ListOfBonds.begin();
-        !ListOfBonds.empty();
-        BondRunner = ListOfBonds.begin())
-      if ((*BondRunner)->leftatom == AtomRunner->second)
-        delete((*BondRunner));
+    (AtomRunner->second)->removeAllBonds();
+//    BondList& ListOfBonds = (AtomRunner->second)->getListOfBonds();
+//    for(BondList::iterator BondRunner = ListOfBonds.begin();
+//        !ListOfBonds.empty();
+//        BondRunner = ListOfBonds.begin())
+//      if ((*BondRunner)->leftatom == AtomRunner->second)
+//        delete((*BondRunner));
   }
   int BondCount = 0;
Index: src/Actions/MoleculeAction/CopyAction.cpp
===================================================================
--- src/Actions/MoleculeAction/CopyAction.cpp	(revision 37b257551a03bddeeb79df686a845ed3e736653e)
+++ src/Actions/MoleculeAction/CopyAction.cpp	(revision 5e2f80b94564cd7797be678d694bf8d3012bd825)
@@ -62,10 +62,11 @@
       !state->copy->empty();
       AtomRunner = state->copy->begin()) {
-    BondList& ListOfBonds = (*AtomRunner)->getListOfBonds();
-    for(BondList::iterator BondRunner = ListOfBonds.begin();
-        !ListOfBonds.empty();
-        BondRunner = ListOfBonds.begin()) {
-      delete(*BondRunner);
-    }
+    (*AtomRunner)->removeAllBonds();
+//    BondList& ListOfBonds = (*AtomRunner)->getListOfBonds();
+//    for(BondList::iterator BondRunner = ListOfBonds.begin();
+//        !ListOfBonds.empty();
+//        BondRunner = ListOfBonds.begin()) {
+//      delete(*BondRunner);
+//    }
     atom *Walker = *AtomRunner;
     World::getInstance().destroyAtom(Walker);
Index: src/Graph/BondGraph.hpp
===================================================================
--- src/Graph/BondGraph.hpp	(revision 37b257551a03bddeeb79df686a845ed3e736653e)
+++ src/Graph/BondGraph.hpp	(revision 5e2f80b94564cd7797be678d694bf8d3012bd825)
@@ -266,14 +266,15 @@
     // remove every bond from the list
     for(iterator_type AtomRunner = Set.begin(); AtomRunner != Set.end(); ++AtomRunner) {
-      BondList& ListOfBonds = (*AtomRunner)->getListOfBonds();
-      for(BondList::iterator BondRunner = ListOfBonds.begin();
-          !ListOfBonds.empty();
-          BondRunner = ListOfBonds.begin()) {
-        ASSERT((*BondRunner)->Contains(*AtomRunner),
-            "BondGraph::cleanAdjacencyList() - "+
-            toString(*BondRunner)+" does not contain "+
-            toString(*AtomRunner)+".");
-        delete((*BondRunner));
-      }
+      (*AtomRunner)->removeAllBonds();
+//      BondList& ListOfBonds = (*AtomRunner)->getListOfBonds();
+//      for(BondList::iterator BondRunner = ListOfBonds.begin();
+//          !ListOfBonds.empty();
+//          BondRunner = ListOfBonds.begin()) {
+//        ASSERT((*BondRunner)->Contains(*AtomRunner),
+//            "BondGraph::cleanAdjacencyList() - "+
+//            toString(*BondRunner)+" does not contain "+
+//            toString(*AtomRunner)+".");
+//        delete((*BondRunner));
+//      }
     }
   }
@@ -354,9 +355,5 @@
     // reset bond degrees
     for(iterator_type AtomRunner = Set.begin(); AtomRunner != Set.end(); ++AtomRunner) {
-      BondList &ListOfBonds = (*AtomRunner)->getListOfBonds();
-      for (BondList::iterator BondIter = ListOfBonds.begin();
-          BondIter != ListOfBonds.end();
-          ++BondIter)
-        (*BondIter)->BondDegree = 1;
+      (*AtomRunner)->resetBondDegree();
     }
   }
Index: src/atom_bondedparticle.cpp
===================================================================
--- src/atom_bondedparticle.cpp	(revision 37b257551a03bddeeb79df686a845ed3e736653e)
+++ src/atom_bondedparticle.cpp	(revision 5e2f80b94564cd7797be678d694bf8d3012bd825)
@@ -40,8 +40,5 @@
 BondedParticle::~BondedParticle()
 {
-  const size_t max = ListOfBonds.size();
-  for (size_t i = 0; i < max; ++i) {
-    ClearBondsAtStep(i);
-  }
+  removeAllBonds();
 };
 
@@ -127,4 +124,22 @@
 }
 
+/** Removes all bonds and their instances, too.
+ *
+ */
+void BondedParticle::removeAllBonds()
+{
+  OBSERVE;
+  NOTIFY(BondedParticle::BondsChanged);
+  for (size_t index = 0; index < ListOfBonds.size(); ++index)
+  {
+    for (BondList::iterator iter = ListOfBonds[index].begin();
+        !ListOfBonds[index].empty();
+        iter = ListOfBonds[index].begin()) {
+      delete (*iter);
+      // erase is done by bond::~bond()
+    }
+  }
+}
+
 /** Puts a given bond into atom::ListOfBonds.
  * @param _step time step to access
@@ -140,6 +155,7 @@
         NOTIFY(AtomObservable::BondsChanged);
       //LOG(3,"INFO: Registering bond "<< *Binder << " with atom " << *this << " at step " << _step);
-      BondList& ListOfBonds = getListOfBondsAtStep(_step);
-      ListOfBonds.push_back(Binder);
+      if (ListOfBonds.size() <= _step)
+        ListOfBonds.resize(_step+1);
+      ListOfBonds[_step].push_back(Binder);
       status = true;
     } else {
@@ -164,5 +180,5 @@
   if (step != -1) {
     NOTIFY(AtomObservable::BondsChanged);
-    //LOG(3,"INFO: Unregistering bond "<< *Binder << " from list " << &ListOfBonds << " of atom " << *this << " at step " << step);
+    //LOG(0,"INFO: Unregistering bond "<< *Binder << " from list " << &ListOfBonds << " of atom " << *this << " at step " << step);
     ListOfBonds[step].remove(Binder);
     status = true;
@@ -266,4 +282,19 @@
 };
 
+/** Sets the weight of all connected bonds to one.
+ */
+void BondedParticle::resetBondDegree()
+{
+  OBSERVE;
+  NOTIFY(BondedParticle::BondsChanged);
+  for (std::vector<BondList>::iterator Runner = ListOfBonds.begin();
+      Runner != ListOfBonds.end();
+      ++Runner)
+    for (BondList::iterator BondRunner = (*Runner).begin();
+        BondRunner != (*Runner).end();
+        ++BondRunner)
+      (*BondRunner)->BondDegree = 1;
+};
+
 /** Counts the number of bonds weighted by bond::BondDegree.
    * @param _step time step to access
Index: src/atom_bondedparticle.hpp
===================================================================
--- src/atom_bondedparticle.hpp	(revision 37b257551a03bddeeb79df686a845ed3e736653e)
+++ src/atom_bondedparticle.hpp	(revision 5e2f80b94564cd7797be678d694bf8d3012bd825)
@@ -39,8 +39,10 @@
   const bond * addBond(const unsigned int _step, BondedParticle* Partner);
   void removeBond(bond *binder);
+  void removeAllBonds();
   bool IsBondedTo(const unsigned int _step, BondedParticle * const BondPartner) const;
   void ClearBondsAtStep(const unsigned int _step);
   int CountBonds() const;
   int CorrectBondDegree();
+  void resetBondDegree();
   void OutputBondOfAtom(std::ostream &ost) const;
   void OutputAdjacency(ofstream * const AdjacencyFile) const;
Index: src/atom_bondedparticleinfo.cpp
===================================================================
--- src/atom_bondedparticleinfo.cpp	(revision 37b257551a03bddeeb79df686a845ed3e736653e)
+++ src/atom_bondedparticleinfo.cpp	(revision 5e2f80b94564cd7797be678d694bf8d3012bd825)
@@ -27,4 +27,7 @@
 #include "atom_bondedparticleinfo.hpp"
 
+
+BondList BondedParticleInfo::emptyList;
+
 /** Constructor of class BondedParticleInfo.
  */
@@ -47,47 +50,45 @@
 const BondList& BondedParticleInfo::getListOfBonds() const
 {
-  ASSERT(WorldTime::getTime() < ListOfBonds.size(),
-      "BondedParticleInfo::getBondsAtStep() - Access out of range: "
-      +toString(WorldTime::getTime())
-      +" not in [0,"+toString(ListOfBonds.size())+").");
-  return ListOfBonds[WorldTime::getTime()];
+  if(WorldTime::getTime() < ListOfBonds.size())
+    return ListOfBonds[WorldTime::getTime()];
+  else
+    return emptyList;
 }
 
-BondList& BondedParticleInfo::getListOfBonds()
-{
-  // todo: here we actually need a container on whose destruction notifiy is emitted, i.e.
-  // similar or simply an ObservedContainer.
-  OBSERVE;
-  NOTIFY(AtomObservable::BondsChanged);
-  const unsigned int size = ListOfBonds.size();
-  ASSERT(WorldTime::getTime() <= size,
-      "BondedParticleInfo::getBondsAtStep() - Access out of range: "
-      +toString(WorldTime::getTime())
-      +" not in [0,"+toString(size)+"].");
-  if (WorldTime::getTime() == size) {
-    UpdateSteps();
-  }
-  return ListOfBonds[WorldTime::getTime()];
-}
+//BondList& BondedParticleInfo::getListOfBonds()
+//{
+//  // todo: here we actually need a container on whose destruction notifiy is emitted, i.e.
+//  // similar or simply an ObservedContainer.
+//  OBSERVE;
+//  NOTIFY(AtomObservable::BondsChanged);
+//  const unsigned int size = ListOfBonds.size();
+//  ASSERT(WorldTime::getTime() <= size,
+//      "BondedParticleInfo::getBondsAtStep() - Access out of range: "
+//      +toString(WorldTime::getTime())
+//      +" not in [0,"+toString(size)+"].");
+//  if (WorldTime::getTime() == size) {
+//    UpdateSteps();
+//  }
+//  return ListOfBonds[WorldTime::getTime()];
+//}
 
 const BondList& BondedParticleInfo::getListOfBondsAtStep(unsigned int _step) const
 {
-  ASSERT(_step < ListOfBonds.size(),
-      "BondedParticleInfo::getBondsAtStep() - Access out of range: "
-      +toString(_step)
-      +" not in [0,"+toString(ListOfBonds.size())+").");
-  return ListOfBonds[_step];
+  if(_step < ListOfBonds.size())
+    return ListOfBonds[_step];
+  else
+    return emptyList;
 }
 
-BondList& BondedParticleInfo::getListOfBondsAtStep(unsigned int _step)
-{
-  const unsigned int size = ListOfBonds.size();
-  ASSERT(_step <= size,
-      "BondedParticleInfo::getBondsAtStep() - Access out of range: "
-      +toString(_step)
-      +" not in [0,"+toString(size)+"].");
-  if (_step == size) {
-    UpdateSteps();
-  }
-  return ListOfBonds[_step];
-}
+//BondList& BondedParticleInfo::getListOfBondsAtStep(unsigned int _step)
+//{
+//  const unsigned int size = ListOfBonds.size();
+//  ASSERT(_step <= size,
+//      "BondedParticleInfo::getBondsAtStep() - Access out of range: "
+//      +toString(_step)
+//      +" not in [0,"+toString(size)+"].");
+//  if (_step == size) {
+//    UpdateSteps();
+//  }
+//  return ListOfBonds[_step];
+//}
Index: src/atom_bondedparticleinfo.hpp
===================================================================
--- src/atom_bondedparticleinfo.hpp	(revision 37b257551a03bddeeb79df686a845ed3e736653e)
+++ src/atom_bondedparticleinfo.hpp	(revision 5e2f80b94564cd7797be678d694bf8d3012bd825)
@@ -54,4 +54,5 @@
    */
   const BondList& getListOfBonds() const;
+
   /** Accessor to ListOfBonds of WorldTime::CurrentTime.
    *
@@ -61,5 +62,5 @@
    * @return ListOfBonds[WorldTime::CurrentTime]
    */
-  BondList& getListOfBonds();
+//  BondList& getListOfBonds();
 
   /** Const Accessor ListOfBonds of any present time step.
@@ -69,4 +70,5 @@
    */
   const BondList& getListOfBondsAtStep(unsigned int _step) const;
+
   /** Accessor ListOfBonds of any present time step.
    *
@@ -77,5 +79,5 @@
    * @return ListOfBonds[_step].
    */
-  BondList& getListOfBondsAtStep(unsigned int _step);
+//  BondList& getListOfBondsAtStep(unsigned int _step);
 
 protected:
@@ -86,5 +88,5 @@
 
   std::vector<BondList> ListOfBonds; //!< list of all bonds
-
+  static BondList emptyList;  //!< empty list to return when step is not present
 };
 
Index: src/molecule.cpp
===================================================================
--- src/molecule.cpp	(revision 37b257551a03bddeeb79df686a845ed3e736653e)
+++ src/molecule.cpp	(revision 5e2f80b94564cd7797be678d694bf8d3012bd825)
@@ -772,10 +772,5 @@
 {
   //DoeLog(1) && (eLog()<< Verbose(1) << "molecule::RemoveBond: Function not implemented yet." << endl);
-  BondList::const_iterator ForeRunner;
-  BondList& ListOfBonds = BondPartner->getListOfBonds();
-  while (!ListOfBonds.empty()) {
-    ForeRunner = ListOfBonds.begin();
-    RemoveBond(*ForeRunner);
-  }
+  BondPartner->removeAllBonds();
   return false;
 };
Index: src/molecule_graph.cpp
===================================================================
--- src/molecule_graph.cpp	(revision 37b257551a03bddeeb79df686a845ed3e736653e)
+++ src/molecule_graph.cpp	(revision 5e2f80b94564cd7797be678d694bf8d3012bd825)
@@ -104,4 +104,5 @@
 {
   for(molecule::const_iterator AtomRunner = begin(); AtomRunner != end(); ++AtomRunner) {
+    //LOG(0, "molecule::hasBondStructure() - checking bond list of atom " << (*AtomRunner)->getId() << ".");
     const BondList& ListOfBonds = (*AtomRunner)->getListOfBonds();
     if (!ListOfBonds.empty())
Index: src/moleculelist.cpp
===================================================================
--- src/moleculelist.cpp	(revision 37b257551a03bddeeb79df686a845ed3e736653e)
+++ src/moleculelist.cpp	(revision 5e2f80b94564cd7797be678d694bf8d3012bd825)
@@ -283,5 +283,5 @@
 bool MoleculeListClass::AddHydrogenCorrection(std::string &path)
 {
-  bond *Binder = NULL;
+  const bond *Binder = NULL;
   double ***FitConstant = NULL, **correction = NULL;
   int a, b;
@@ -395,5 +395,6 @@
           //Log() << Verbose(2) << "Runner: " << *(*runner) << " with first bond " << *((*iter)->getListOfBonds().begin()) << "." << endl;
           // 3. take every other hydrogen that is the not the first and not bound to same bonding partner
-          Binder = *((*runner)->getListOfBonds().begin());
+          const BondList &bondlist = (*runner)->getListOfBonds();
+          Binder = *(bondlist.begin());
           if (((*runner)->getType()->getAtomicNumber() == 1) && ((*runner)->getNr() > (*iter)->getNr()) && (Binder->GetOtherAtom((*runner)) != Binder->GetOtherAtom((*iter)))) { // (hydrogens have only one bonding partner!)
             // 4. evaluate the morse potential for each matrix component and add up
Index: src/unittests/ListOfBondsUnitTest.cpp
===================================================================
--- src/unittests/ListOfBondsUnitTest.cpp	(revision 37b257551a03bddeeb79df686a845ed3e736653e)
+++ src/unittests/ListOfBondsUnitTest.cpp	(revision 5e2f80b94564cd7797be678d694bf8d3012bd825)
@@ -51,4 +51,6 @@
 {
   atom *Walker = NULL;
+
+  WorldTime::setTime(0);
 
   // construct element
@@ -127,9 +129,11 @@
 
   // check that bond is present in both atoms
+  const BondList &bondlist1 = atom1->getListOfBonds();
   BondList::const_iterator bonditer;
-  bonditer = atom1->getListOfBonds().begin();
+  bonditer = bondlist1.begin();
   bond *TestBond1 = *bonditer;
   CPPUNIT_ASSERT_EQUAL( TestBond1, Binder );
-  bonditer = atom2->getListOfBonds().begin();
+  const BondList &bondlist2 = atom2->getListOfBonds();
+  bonditer = bondlist2.begin();
   bond *TestBond2 = *bonditer;
   CPPUNIT_ASSERT_EQUAL( TestBond2, Binder );
