Index: src/Legacy/oldmenu.cpp
===================================================================
--- src/Legacy/oldmenu.cpp	(revision 1024cbc27eef62ed70b770868d078bd3df38ada6)
+++ src/Legacy/oldmenu.cpp	(revision 1b93210482401ac84634a9154269150b34017ddf)
@@ -605,5 +605,5 @@
   Log() << Verbose(0) << "What's the desired bond order: ";
   cin >> Order1;
-  if (mol->first->next != mol->last) {  // there are bonds
+  if (mol->hasBondStructure()) {
     start = clock();
     mol->FragmentMolecule(Order1, configuration);
@@ -775,5 +775,5 @@
         }
       }
-      if (mol->first->next != mol->last) // if connect matrix is present already, redo it
+      if (mol->hasBondStructure())
         mol->CreateAdjacencyList(mol->BondDistance, configuration->GetIsAngstroem(), &BondGraph::CovalentMinMaxDistance, NULL);
       // free memory
Index: src/boundary.cpp
===================================================================
--- src/boundary.cpp	(revision 1024cbc27eef62ed70b770868d078bd3df38ada6)
+++ src/boundary.cpp	(revision 1b93210482401ac84634a9154269150b34017ddf)
@@ -817,9 +817,8 @@
   filler->Center.Zero();
   DoLog(2) && (Log() << Verbose(2) << "INFO: Filler molecule has the following bonds:" << endl);
-  Binder = filler->first;
-  while(Binder->next != filler->last) {
-    Binder = Binder->next;
-    DoLog(2) && (Log() << Verbose(2) << "  " << *Binder << endl);
-  }
+  for(molecule::iterator AtomRunner = filler->begin(); AtomRunner != filler->end(); ++AtomRunner)
+    for(BondList::iterator BondRunner = (*AtomRunner)->ListOfBonds.begin(); BondRunner != (*AtomRunner)->ListOfBonds.end(); ++BondRunner)
+      if ((*BondRunner)->leftatom == *AtomRunner)
+        DoLog(2) && (Log() << Verbose(2) << "  " << *Binder << endl);
 
   atom * CopyAtoms[filler->getAtomCount()];
@@ -909,12 +908,13 @@
         }
         // go through all bonds and add as well
-        Binder = filler->first;
-        while(Binder->next != filler->last) {
-          Binder = Binder->next;
-          if ((CopyAtoms[Binder->leftatom->nr] != NULL) && (CopyAtoms[Binder->rightatom->nr] != NULL)) {
-            Log()  << Verbose(3) << "Adding Bond between " << *CopyAtoms[Binder->leftatom->nr] << " and " << *CopyAtoms[Binder->rightatom->nr]<< "." << endl;
-            Filling->AddBond(CopyAtoms[Binder->leftatom->nr], CopyAtoms[Binder->rightatom->nr], Binder->BondDegree);
-          }
-        }
+        for(molecule::iterator AtomRunner = filler->begin(); AtomRunner != filler->end(); ++AtomRunner)
+          for(BondList::iterator BondRunner = (*AtomRunner)->ListOfBonds.begin(); BondRunner != (*AtomRunner)->ListOfBonds.end(); ++BondRunner)
+            if ((*BondRunner)->leftatom == *AtomRunner) {
+              Binder = (*BondRunner);
+              if ((CopyAtoms[Binder->leftatom->nr] != NULL) && (CopyAtoms[Binder->rightatom->nr] != NULL)) {
+                Log()  << Verbose(3) << "Adding Bond between " << *CopyAtoms[Binder->leftatom->nr] << " and " << *CopyAtoms[Binder->rightatom->nr]<< "." << endl;
+                Filling->AddBond(CopyAtoms[Binder->leftatom->nr], CopyAtoms[Binder->rightatom->nr], Binder->BondDegree);
+              }
+            }
       }
   delete[](M);
Index: src/builder.cpp
===================================================================
--- src/builder.cpp	(revision 1024cbc27eef62ed70b770868d078bd3df38ada6)
+++ src/builder.cpp	(revision 1b93210482401ac84634a9154269150b34017ddf)
@@ -2280,5 +2280,5 @@
                 mol->CreateAdjacencyList(atof(argv[argptr]), configuration.GetIsAngstroem(), &BondGraph::CovalentMinMaxDistance, NULL);
                 DoLog(0) && (Log() << Verbose(0) << "Fragmenting molecule with current connection matrix ..." << endl);
-                if (mol->first->next != mol->last) {
+                if (mol->hasBondStructure()) {
                   ExitFlag = mol->FragmentMolecule(atoi(argv[argptr+1]), &configuration);
                 }
Index: src/molecule.cpp
===================================================================
--- src/molecule.cpp	(revision 1024cbc27eef62ed70b770868d078bd3df38ada6)
+++ src/molecule.cpp	(revision 1b93210482401ac84634a9154269150b34017ddf)
@@ -36,5 +36,5 @@
  */
 molecule::molecule(const periodentafel * const teil) : elemente(teil),
-  first(new bond(0, 0, 1, -1)), last(new bond(0, 0, 1, -1)), MDSteps(0),
+  MDSteps(0),
   BondCount(0), ElementCount(0), NoNonHydrogen(0), NoNonBonds(0), NoCyclicBonds(0), BondDistance(0.), 
   ActiveFlag(false), IndexNr(-1),
@@ -42,6 +42,4 @@
   AtomCount(this,boost::bind(&molecule::doCountAtoms,this)), last_atom(0),  InternalPointer(begin())
 {
-  // init bond chain list
-  link(first,last);
 
   // other stuff
@@ -61,6 +59,4 @@
 {
   CleanupMolecule();
-  delete(first);
-  delete(last);
 };
 
@@ -607,19 +603,21 @@
 
   // copy all bonds
-  bond *Binder = first;
+  bond *Binder = NULL;
   bond *NewBond = NULL;
-  while(Binder->next != last) {
-    Binder = Binder->next;
-
-    // get the pendant atoms of current bond in the copy molecule
-    copy->ActOnAllAtoms( &atom::EqualsFather, (const atom *)Binder->leftatom, (const atom **)&LeftAtom );
-    copy->ActOnAllAtoms( &atom::EqualsFather, (const atom *)Binder->rightatom, (const atom **)&RightAtom );
-
-    NewBond = copy->AddBond(LeftAtom, RightAtom, Binder->BondDegree);
-    NewBond->Cyclic = Binder->Cyclic;
-    if (Binder->Cyclic)
-      copy->NoCyclicBonds++;
-    NewBond->Type = Binder->Type;
-  }
+  for(molecule::iterator AtomRunner = begin(); AtomRunner != end(); ++AtomRunner)
+    for(BondList::iterator BondRunner = (*AtomRunner)->ListOfBonds.begin(); !(*AtomRunner)->ListOfBonds.empty(); BondRunner = (*AtomRunner)->ListOfBonds.begin())
+      if ((*BondRunner)->leftatom == *AtomRunner) {
+        Binder = (*BondRunner);
+
+        // get the pendant atoms of current bond in the copy molecule
+        copy->ActOnAllAtoms( &atom::EqualsFather, (const atom *)Binder->leftatom, (const atom **)&LeftAtom );
+        copy->ActOnAllAtoms( &atom::EqualsFather, (const atom *)Binder->rightatom, (const atom **)&RightAtom );
+
+        NewBond = copy->AddBond(LeftAtom, RightAtom, Binder->BondDegree);
+        NewBond->Cyclic = Binder->Cyclic;
+        if (Binder->Cyclic)
+          copy->NoCyclicBonds++;
+        NewBond->Type = Binder->Type;
+      }
   // correct fathers
   ActOnAllAtoms( &atom::CorrectFather );
@@ -627,5 +625,5 @@
   // copy values
   copy->CountElements();
-  if (first->next != last) {  // if adjaceny list is present
+  if (hasBondStructure()) {  // if adjaceny list is present
     copy->BondDistance = BondDistance;
   }
@@ -672,5 +670,4 @@
   if ((atom1->type != NULL) && (atom1->type->Z != 1) && (atom2->type != NULL) && (atom2->type->Z != 1))
     NoNonBonds++;
-  add(Binder, last);
 
   return Binder;
@@ -685,7 +682,5 @@
 {
   //DoeLog(1) && (eLog()<< Verbose(1) << "molecule::RemoveBond: Function not implemented yet." << endl);
-  pointer->leftatom->RegisterBond(pointer);
-  pointer->rightatom->RegisterBond(pointer);
-  removewithoutcheck(pointer);
+  delete(pointer);
   return true;
 };
@@ -785,5 +780,4 @@
   for (molecule::iterator iter = begin(); !empty(); iter = begin())
       erase(iter);
-  return (cleanup(first,last));
 };
 
Index: src/molecule.hpp
===================================================================
--- src/molecule.hpp	(revision 1024cbc27eef62ed70b770868d078bd3df38ada6)
+++ src/molecule.hpp	(revision 1b93210482401ac84634a9154269150b34017ddf)
@@ -101,6 +101,6 @@
     //atom *start;        //!< start of atom list
     //atom *end;          //!< end of atom list
-    bond *first;        //!< start of bond list
-    bond *last;         //!< end of bond list
+    //bond *first;        //!< start of bond list
+    //bond *last;         //!< end of bond list
     int MDSteps;        //!< The number of MD steps in Trajectories
     //int AtomCount;          //!< number of atoms, brought up-to-date by CountAtoms()
@@ -253,4 +253,6 @@
   bool RemoveBond(bond *pointer);
   bool RemoveBonds(atom *BondPartner);
+  bool hasBondStructure();
+  unsigned int CountBonds() const;
 
   /// Find atoms.
Index: src/molecule_fragmentation.cpp
===================================================================
--- src/molecule_fragmentation.cpp	(revision 1024cbc27eef62ed70b770868d078bd3df38ada6)
+++ src/molecule_fragmentation.cpp	(revision 1b93210482401ac84634a9154269150b34017ddf)
@@ -683,5 +683,5 @@
       DoLog(1) && (Log() << Verbose(1) << "Fragmenting subgraph " << MolecularWalker << "." << endl);
       //MolecularWalker->Leaf->OutputListOfBonds(out);  // output atom::ListOfBonds for debugging
-      if (MolecularWalker->Leaf->first->next != MolecularWalker->Leaf->last) {
+      if (MolecularWalker->Leaf->hasBondStructure()) {
         // call BOSSANOVA method
         DoLog(0) && (Log() << Verbose(0) << endl << " ========== BOND ENERGY of subgraph " << FragmentCounter << " ========================= " << endl);
@@ -1141,5 +1141,4 @@
   int SpaceLeft;
   int *TouchedList = new int[SubOrder + 1];
-  bond **BondsList = NULL;
   KeySetTestPair TestKeySetInsert;
 
@@ -1424,5 +1423,4 @@
 int molecule::PowerSetGenerator(int Order, struct UniqueFragments &FragmentSearch, KeySet RestrictedKeySet)
 {
-  bond **BondsList = NULL;
   int Counter = FragmentSearch.FragmentCounter; // mark current value of counter
 
@@ -1735,20 +1733,20 @@
     Translationvector.Zero();
     // scan all bonds
-    Binder = first;
     flag = false;
-    while ((!flag) && (Binder->next != last)) {
-      Binder = Binder->next;
-      for (int i=NDIM;i--;) {
-        tmp = fabs(Binder->leftatom->x[i] - Binder->rightatom->x[i]);
-        //Log() << Verbose(3) << "Checking " << i << "th distance of " << *Binder->leftatom << " to " << *Binder->rightatom << ": " << tmp << "." << endl;
-        if (tmp > BondDistance) {
-          OtherBinder = Binder->next; // note down binding partner for later re-insertion
-          unlink(Binder);   // unlink bond
-          DoLog(2) && (Log() << Verbose(2) << "Correcting at bond " << *Binder << "." << endl);
-          flag = true;
-          break;
+    for(molecule::iterator AtomRunner = begin(); (!flag) && (AtomRunner != end()); ++AtomRunner)
+      for(BondList::iterator BondRunner = (*AtomRunner)->ListOfBonds.begin(); (!flag) && (BondRunner != (*AtomRunner)->ListOfBonds.end()); ++BondRunner) {
+        Binder = (*BondRunner);
+        for (int i=NDIM;i--;) {
+          tmp = fabs(Binder->leftatom->x[i] - Binder->rightatom->x[i]);
+          //Log() << Verbose(3) << "Checking " << i << "th distance of " << *Binder->leftatom << " to " << *Binder->rightatom << ": " << tmp << "." << endl;
+          if (tmp > BondDistance) {
+            OtherBinder = Binder->next; // note down binding partner for later re-insertion
+            unlink(Binder);   // unlink bond
+            DoLog(2) && (Log() << Verbose(2) << "Correcting at bond " << *Binder << "." << endl);
+            flag = true;
+            break;
+          }
         }
       }
-    }
     if (flag) {
       // create translation vector from their periodically modified distance
Index: src/molecule_graph.cpp
===================================================================
--- src/molecule_graph.cpp	(revision 1024cbc27eef62ed70b770868d078bd3df38ada6)
+++ src/molecule_graph.cpp	(revision 1b93210482401ac84634a9154269150b34017ddf)
@@ -127,11 +127,8 @@
   DoLog(0) && (Log() << Verbose(0) << "Begin of CreateAdjacencyList." << endl);
   // remove every bond from the list
-  bond *Binder = NULL;
-  while (last->previous != first) {
-    Binder = last->previous;
-    Binder->leftatom->UnregisterBond(Binder);
-    Binder->rightatom->UnregisterBond(Binder);
-    removewithoutcheck(Binder);
-  }
+  for(molecule::iterator AtomRunner = begin(); AtomRunner != end(); ++AtomRunner)
+    for(BondList::iterator BondRunner = (*AtomRunner)->ListOfBonds.begin(); !(*AtomRunner)->ListOfBonds.empty(); BondRunner = (*AtomRunner)->ListOfBonds.begin())
+      if ((*BondRunner)->leftatom == *AtomRunner)
+        delete((*BondRunner));
   BondCount = 0;
 
@@ -214,4 +211,29 @@
 ;
 
+/** Checks for presence of bonds within atom list.
+ * TODO: more sophisticated check for bond structure (e.g. connected subgraph, ...)
+ * \return true - bonds present, false - no bonds
+ */
+bool molecule::hasBondStructure()
+{
+  for(molecule::iterator AtomRunner = begin(); AtomRunner != end(); ++AtomRunner)
+    if (!(*AtomRunner)->ListOfBonds.empty())
+      return true;
+  return false;
+}
+
+/** Counts the number of present bonds.
+ * \return number of bonds
+ */
+unsigned int molecule::CountBonds() const
+{
+  unsigned int counter = 0;
+  for(molecule::const_iterator AtomRunner = begin(); AtomRunner != end(); ++AtomRunner)
+    for(BondList::const_iterator BondRunner = (*AtomRunner)->ListOfBonds.begin(); BondRunner != (*AtomRunner)->ListOfBonds.end(); ++BondRunner)
+      if ((*BondRunner)->leftatom == *AtomRunner)
+        counter++;
+  return counter;
+}
+
 /** Prints a list of all bonds to \a *out.
  * \param output stream
@@ -220,9 +242,9 @@
 {
   DoLog(1) && (Log() << Verbose(1) << endl << "From contents of bond chain list:");
-  bond *Binder = first;
-  while (Binder->next != last) {
-    Binder = Binder->next;
-    DoLog(0) && (Log() << Verbose(0) << *Binder << "\t" << endl);
-  }
+  for(molecule::const_iterator AtomRunner = molecule::begin(); AtomRunner != molecule::end(); ++AtomRunner)
+    for(BondList::const_iterator BondRunner = (*AtomRunner)->ListOfBonds.begin(); BondRunner != (*AtomRunner)->ListOfBonds.end(); ++BondRunner)
+      if ((*BondRunner)->leftatom == *AtomRunner) {
+        DoLog(0) && (Log() << Verbose(0) << *(*BondRunner) << "\t" << endl);
+      }
   DoLog(0) && (Log() << Verbose(0) << endl);
 }
@@ -268,20 +290,21 @@
   MoleculeLeafClass *Subgraphs = NULL;
   class StackClass<bond *> *BackEdgeStack = NULL;
-  bond *Binder = first;
-  if ((Binder->next != last) && (Binder->next->Type == Undetermined)) {
-    DoLog(0) && (Log() << Verbose(0) << "No Depth-First-Search analysis performed so far, calling ..." << endl);
-    Subgraphs = DepthFirstSearchAnalysis(BackEdgeStack);
-    while (Subgraphs->next != NULL) {
-      Subgraphs = Subgraphs->next;
-      delete (Subgraphs->previous);
-    }
-    delete (Subgraphs);
-    delete[] (MinimumRingSize);
-  }
-  while (Binder->next != last) {
-    Binder = Binder->next;
-    if (Binder->Cyclic)
-      NoCyclicBonds++;
-  }
+  for(molecule::iterator AtomRunner = begin(); AtomRunner != end(); ++AtomRunner)
+    if ((!(*AtomRunner)->ListOfBonds.empty()) && ((*(*AtomRunner)->ListOfBonds.begin())->Type == Undetermined)) {
+      DoLog(0) && (Log() << Verbose(0) << "No Depth-First-Search analysis performed so far, calling ..." << endl);
+      Subgraphs = DepthFirstSearchAnalysis(BackEdgeStack);
+      while (Subgraphs->next != NULL) {
+        Subgraphs = Subgraphs->next;
+        delete (Subgraphs->previous);
+      }
+      delete (Subgraphs);
+      delete[] (MinimumRingSize);
+      break;
+    }
+  for(molecule::iterator AtomRunner = begin(); AtomRunner != end(); ++AtomRunner)
+    for(BondList::iterator BondRunner = (*AtomRunner)->ListOfBonds.begin(); BondRunner != (*AtomRunner)->ListOfBonds.end(); ++BondRunner)
+      if ((*BondRunner)->leftatom == *AtomRunner)
+        if ((*BondRunner)->Cyclic)
+          NoCyclicBonds++;
   delete (BackEdgeStack);
   return NoCyclicBonds;
@@ -581,12 +604,11 @@
 {
   NoCyclicBonds = 0;
-  bond *Binder = first;
-  while (Binder->next != last) {
-    Binder = Binder->next;
-    if (Binder->rightatom->LowpointNr == Binder->leftatom->LowpointNr) { // cyclic ??
-      Binder->Cyclic = true;
-      NoCyclicBonds++;
-    }
-  }
+  for(molecule::const_iterator AtomRunner = begin(); AtomRunner != end(); ++AtomRunner)
+    for(BondList::const_iterator BondRunner = (*AtomRunner)->ListOfBonds.begin(); BondRunner != (*AtomRunner)->ListOfBonds.end(); ++BondRunner)
+      if ((*BondRunner)->leftatom == *AtomRunner)
+        if ((*BondRunner)->rightatom->LowpointNr == (*BondRunner)->leftatom->LowpointNr) { // cyclic ??
+          (*BondRunner)->Cyclic = true;
+          NoCyclicBonds++;
+        }
 }
 ;
@@ -607,18 +629,20 @@
 void molecule::OutputGraphInfoPerBond() const
 {
+  bond *Binder = NULL;
   DoLog(1) && (Log() << Verbose(1) << "Final graph info for each bond is:" << endl);
-  bond *Binder = first;
-  while (Binder->next != last) {
-    Binder = Binder->next;
-    DoLog(2) && (Log() << Verbose(2) << ((Binder->Type == TreeEdge) ? "TreeEdge " : "BackEdge ") << *Binder << ": <");
-    DoLog(0) && (Log() << Verbose(0) << ((Binder->leftatom->SeparationVertex) ? "SP," : "") << "L" << Binder->leftatom->LowpointNr << " G" << Binder->leftatom->GraphNr << " Comp.");
-    Binder->leftatom->OutputComponentNumber();
-    DoLog(0) && (Log() << Verbose(0) << " ===  ");
-    DoLog(0) && (Log() << Verbose(0) << ((Binder->rightatom->SeparationVertex) ? "SP," : "") << "L" << Binder->rightatom->LowpointNr << " G" << Binder->rightatom->GraphNr << " Comp.");
-    Binder->rightatom->OutputComponentNumber();
-    DoLog(0) && (Log() << Verbose(0) << ">." << endl);
-    if (Binder->Cyclic) // cyclic ??
-      DoLog(3) && (Log() << Verbose(3) << "Lowpoint at each side are equal: CYCLIC!" << endl);
-  }
+  for(molecule::const_iterator AtomRunner = begin(); AtomRunner != end(); ++AtomRunner)
+    for(BondList::const_iterator BondRunner = (*AtomRunner)->ListOfBonds.begin(); !(*AtomRunner)->ListOfBonds.empty(); BondRunner = (*AtomRunner)->ListOfBonds.begin())
+      if ((*BondRunner)->leftatom == *AtomRunner) {
+        Binder = *BondRunner;
+        DoLog(2) && (Log() << Verbose(2) << ((Binder->Type == TreeEdge) ? "TreeEdge " : "BackEdge ") << *Binder << ": <");
+        DoLog(0) && (Log() << Verbose(0) << ((Binder->leftatom->SeparationVertex) ? "SP," : "") << "L" << Binder->leftatom->LowpointNr << " G" << Binder->leftatom->GraphNr << " Comp.");
+        Binder->leftatom->OutputComponentNumber();
+        DoLog(0) && (Log() << Verbose(0) << " ===  ");
+        DoLog(0) && (Log() << Verbose(0) << ((Binder->rightatom->SeparationVertex) ? "SP," : "") << "L" << Binder->rightatom->LowpointNr << " G" << Binder->rightatom->GraphNr << " Comp.");
+        Binder->rightatom->OutputComponentNumber();
+        DoLog(0) && (Log() << Verbose(0) << ">." << endl);
+        if (Binder->Cyclic) // cyclic ??
+          DoLog(3) && (Log() << Verbose(3) << "Lowpoint at each side are equal: CYCLIC!" << endl);
+      }
 }
 ;
@@ -975,9 +999,8 @@
 void molecule::ResetAllBondsToUnused() const
 {
-  bond *Binder = first;
-  while (Binder->next != last) {
-    Binder = Binder->next;
-    Binder->ResetUsed();
-  }
+  for(molecule::const_iterator AtomRunner = begin(); AtomRunner != end(); ++AtomRunner)
+    for(BondList::const_iterator BondRunner = (*AtomRunner)->ListOfBonds.begin(); BondRunner != (*AtomRunner)->ListOfBonds.end(); ++BondRunner)
+      if ((*BondRunner)->leftatom == *AtomRunner)
+        (*BondRunner)->ResetUsed();
 }
 ;
Index: src/moleculelist.cpp
===================================================================
--- src/moleculelist.cpp	(revision 1024cbc27eef62ed70b770868d078bd3df38ada6)
+++ src/moleculelist.cpp	(revision 1b93210482401ac84634a9154269150b34017ddf)
@@ -345,10 +345,10 @@
 
   // go through all bonds and add as well
-  bond *Binder = srcmol->first;
-  while(Binder->next != srcmol->last) {
-    Binder = Binder->next;
-    DoLog(3) && (Log() << Verbose(3) << "Adding Bond between " << *CopyAtoms[Binder->leftatom->nr] << " and " << *CopyAtoms[Binder->rightatom->nr]<< "." << endl);
-    mol->AddBond(CopyAtoms[Binder->leftatom->nr], CopyAtoms[Binder->rightatom->nr], Binder->BondDegree);
-  }
+  for(molecule::iterator AtomRunner = srcmol->begin(); AtomRunner != srcmol->end(); ++AtomRunner)
+    for(BondList::iterator BondRunner = (*AtomRunner)->ListOfBonds.begin(); BondRunner != (*AtomRunner)->ListOfBonds.end(); ++BondRunner)
+      if ((*BondRunner)->leftatom == *AtomRunner) {
+        DoLog(3) && (Log() << Verbose(3) << "Adding Bond between " << *CopyAtoms[(*BondRunner)->leftatom->nr] << " and " << *CopyAtoms[(*BondRunner)->rightatom->nr]<< "." << endl);
+        mol->AddBond(CopyAtoms[(*BondRunner)->leftatom->nr], CopyAtoms[(*BondRunner)->rightatom->nr], (*BondRunner)->BondDegree);
+      }
   delete(LCList);
   return true;
@@ -744,5 +744,4 @@
   molecule *mol = World::getInstance().createMolecule();
   bond *Binder = NULL;
-  bond *Stepper = NULL;
   // 0. gather all atoms into single molecule
   for (MoleculeList::iterator MolRunner = ListOfMolecules.begin(); !ListOfMolecules.empty(); MolRunner = ListOfMolecules.begin()) {
@@ -755,10 +754,7 @@
     }
     // remove all bonds
-    Stepper = (*MolRunner)->first->next;
-    while (Stepper != (*MolRunner)->last) {
-      Binder = Stepper;
-      Stepper = Stepper->next;
-      delete(Binder);
-    }
+    for(molecule::iterator AtomRunner = (*MolRunner)->begin(); AtomRunner != (*MolRunner)->end(); ++AtomRunner)
+      for(BondList::iterator BondRunner = (*AtomRunner)->ListOfBonds.begin(); !(*AtomRunner)->ListOfBonds.empty(); BondRunner = (*AtomRunner)->ListOfBonds.begin())
+        delete(*BondRunner);
     // remove the molecule
     World::getInstance().destroyMolecule(*MolRunner);
@@ -835,11 +831,5 @@
   }
   // 4d. we don't need to redo bonds, as they are connected subgraphs and still maintain their ListOfBonds, but we have to remove them from first..last list
-  Binder = mol->first;
-  while (mol->first->next != mol->last) {
-    Binder = mol->first->next;
-    const atom * const Walker = Binder->leftatom;
-    unlink(Binder);
-    link(Binder,molecules[MolMap[Walker->nr]-1]->last);   // counting starts at 1
-  }
+  // TODO: check whether this is really not needed anymore
   // 4e. free Leafs
   MolecularWalker = Subgraphs;
@@ -1052,11 +1042,8 @@
     DoLog(1) && (Log() << Verbose(1) << "Creating adjacency list for subgraph " << Leaf << "." << endl);
     // remove every bond from the list
-    bond *Binder = NULL;
-    while (Leaf->last->previous != Leaf->first) {
-      Binder = Leaf->last->previous;
-      Binder->leftatom->UnregisterBond(Binder);
-      Binder->rightatom->UnregisterBond(Binder);
-      removewithoutcheck(Binder);
-    }
+    for(molecule::iterator AtomRunner = Leaf->begin(); AtomRunner != Leaf->end(); ++AtomRunner)
+      for(BondList::iterator BondRunner = (*AtomRunner)->ListOfBonds.begin(); !(*AtomRunner)->ListOfBonds.empty(); BondRunner = (*AtomRunner)->ListOfBonds.begin())
+        if ((*BondRunner)->leftatom == *AtomRunner)
+          delete((*BondRunner));
 
     for(molecule::const_iterator iter = Leaf->begin(); iter != Leaf->end(); ++iter) {
Index: src/unittests/listofbondsunittest.cpp
===================================================================
--- src/unittests/listofbondsunittest.cpp	(revision 1024cbc27eef62ed70b770868d078bd3df38ada6)
+++ src/unittests/listofbondsunittest.cpp	(revision 1b93210482401ac84634a9154269150b34017ddf)
@@ -106,6 +106,5 @@
   Binder = TestMolecule->AddBond(atom1, atom2, 1);
   CPPUNIT_ASSERT( Binder != NULL );
-  bond *TestBond = TestMolecule->first->next;
-  CPPUNIT_ASSERT_EQUAL ( TestBond, Binder );
+  CPPUNIT_ASSERT_EQUAL ( true, TestMolecule->hasBondStructure() );
 
   // check that bond contains the two atoms
@@ -145,5 +144,5 @@
 
   // check if removed from molecule
-  CPPUNIT_ASSERT_EQUAL( TestMolecule->first->next, TestMolecule->last );
+  CPPUNIT_ASSERT_EQUAL( false, TestMolecule->hasBondStructure() );
 };
 
@@ -186,6 +185,6 @@
 
   // check if removed from molecule
-  CPPUNIT_ASSERT_EQUAL( TestMolecule->first->next, Binder );
-  CPPUNIT_ASSERT_EQUAL( Binder->next, TestMolecule->last );
+  CPPUNIT_ASSERT_EQUAL( true, TestMolecule->hasBondStructure() );
+  CPPUNIT_ASSERT_EQUAL( (unsigned int)1, TestMolecule->CountBonds() );
 };
 
@@ -215,5 +214,5 @@
 
   // check if removed from molecule
-  CPPUNIT_ASSERT_EQUAL( TestMolecule->first->next, TestMolecule->last );
+  CPPUNIT_ASSERT_EQUAL( false, TestMolecule->hasBondStructure() );
 };
 
@@ -242,5 +241,5 @@
 
   // check if removed from molecule
-  CPPUNIT_ASSERT_EQUAL( TestMolecule->first->next, TestMolecule->last );
+  CPPUNIT_ASSERT_EQUAL( false, TestMolecule->hasBondStructure() );
 };
 
@@ -269,4 +268,4 @@
 
   // check if removed from molecule
-  CPPUNIT_ASSERT_EQUAL( TestMolecule->first->next, TestMolecule->last );
-};
+  CPPUNIT_ASSERT_EQUAL( true, TestMolecule->hasBondStructure() );
+};
