Index: src/Atom/atom_bondedparticle.cpp
===================================================================
--- src/Atom/atom_bondedparticle.cpp	(revision 88c8ec20f4a97f9685638eda1c07bca7fe46bd4e)
+++ src/Atom/atom_bondedparticle.cpp	(revision 7d82a5107dfcc03ee6f2a1b4ee8c3083515b6ff2)
@@ -114,5 +114,5 @@
   }
 
-  bond* newBond = new bond((atom*) this, (atom*) Partner, 1);
+  bond::ptr newBond(new bond((atom*) this, (atom*) Partner, 1));
   RegisterBond(_step, newBond);
   Partner->RegisterBond(_step, newBond);
@@ -121,10 +121,31 @@
 }
 
-/** Removes a bond of this atom to a given \a Partner.
- *
- * @param _step time step
- * @param Partner bond partner
- */
-void BondedParticle::removeBond(const unsigned int _step, BondedParticle * const Partner)
+/** Helper function to find the time step to a given bond in \a Binder.
+ *
+ * \param Binder bond to look for
+ * \return ListOfBonds::size() - not found, else - step containing \a Binder
+ */
+unsigned int BondedParticle::findBondsStep(bond::ptr const Binder) const
+{
+
+  size_t _step = 0;
+  for (;_step < ListOfBonds.size();++_step) {
+    const BondList& ListOfBonds = getListOfBondsAtStep(_step);
+    if (std::find(ListOfBonds.begin(), ListOfBonds.end(), Binder) != ListOfBonds.end())
+      break;
+  }
+  return _step;
+}
+
+/** Helper function to find the iterator to a bond at a given time \a step to
+ * a given bond partner in \a Partner.
+ *
+ * \param _step time step to look at
+ * \param Partner bond partner to look for
+ * \return ListOfBonds::end() - not found, else - iterator pointing \a Binder
+ */
+BondList::const_iterator BondedParticle::findBondPartnerAtStep(
+    const unsigned int _step,
+    BondedParticle * const Partner) const
 {
   const BondList& ListOfBonds = getListOfBondsAtStep(_step);
@@ -134,6 +155,21 @@
           _1,
           boost::cref(Partner)));
-  if (iter != ListOfBonds.end()) {
-    delete *iter; //dstor takes care of unregistering and all
+  return iter;
+}
+
+/** Removes a bond of this atom to a given \a Partner.
+ *
+ * @param _step time step
+ * @param Partner bond partner
+ */
+void BondedParticle::removeBond(const unsigned int _step, BondedParticle * const Partner)
+{
+  BondList::const_iterator iter = findBondPartnerAtStep(_step, Partner);
+  if (iter != getListOfBondsAtStep(_step).end()) {
+    // iter becomes invalid upon first unregister,
+    // hence store the bond someplace else first
+    bond::ptr const Binder = *iter;
+    UnregisterBond(_step, Binder);
+    Partner->UnregisterBond(_step, Binder);
   } else
     ELOG(1, "BondedParticle::removeBond() - I cannot find the bond in between "
@@ -145,7 +181,19 @@
  * @param Binder bond to remove
  */
-void BondedParticle::removeBond(bond::ptr binder)
-{
-  UnregisterBond(binder);
+void BondedParticle::removeBond(bond::ptr &binder)
+{
+  if (binder != NULL) {
+    atom * const Other = binder->GetOtherAtom(this);
+    ASSERT( Other != NULL,
+        "BondedParticle::removeBonds() - cannot find bond partner for "
+        +toString(*binder)+".");
+    // find bond at step
+    unsigned int step = findBondsStep(binder);
+    if (step != ListOfBonds.size()) {
+      UnregisterBond(step, binder);
+      Other->UnregisterBond(step, binder);
+      binder.reset();
+    }
+  }
 }
 
@@ -165,9 +213,15 @@
 void BondedParticle::removeAllBonds(const unsigned int _step)
 {
-  for (BondList::iterator iter = ListOfBonds[_step].begin();
-      !ListOfBonds[_step].empty();
-      iter = ListOfBonds[_step].begin()) {
-    delete (*iter);
-    // unregister/NOTIFY is done by bond::~bond()
+  //LOG(3,"INFO: Clearing all bonds of " << *this << ": " << ListOfBonds[_step]);
+  for (BondList::iterator iter = (ListOfBonds[_step]).begin();
+      !(ListOfBonds[_step]).empty();
+      iter = (ListOfBonds[_step]).begin()) {
+    //LOG(3,"INFO: Clearing bond (" << *iter << ") " << *(*iter) << " of list " << &ListOfBonds);
+    atom * const Other = (*iter)->GetOtherAtom(this);
+    ASSERT( Other != NULL,
+        "BondedParticle::removeAllBonds() - cannot find bond partner for "
+        +toString(**iter)+".");
+    Other->UnregisterBond(_step, *iter);
+    UnregisterBond(_step, *iter);
   }
 }
@@ -179,7 +233,7 @@
 bool BondedParticle::RegisterBond(const unsigned int _step, bond::ptr const Binder)
 {
-  OBSERVE;
   bool status = false;
   if (Binder != NULL) {
+    OBSERVE;
     if (Binder->Contains(this)) {
       //LOG(3,"INFO: Registering bond "<< *Binder << " with atom " << *this << " at step " << _step);
@@ -200,35 +254,39 @@
 
 /** Removes a given bond from atom::ListOfBonds.
+ *
+ * \warning This only removes this atom not its bond partner, i.e.
+ * both atoms need to call this function to fully empty a bond.
+ *
  * @param _step time step to access
  * \param *Binder bond to remove
  */
-bool BondedParticle::UnregisterBond(bond::ptr const Binder)
-{
-  OBSERVE;
+bool BondedParticle::UnregisterBond(const unsigned int _step, bond::ptr const Binder)
+{
   bool status = false;
-  ASSERT(Binder != NULL, "BondedParticle::UnregisterBond() - Binder is NULL.");
-  const int step = ContainsBondAtStep(Binder);
-  if (step != -1) {
-    //LOG(0,"INFO: Unregistering bond "<< *Binder << " from list " << &ListOfBonds << " of atom " << *this << " at step " << step);
-    ListOfBonds[step].remove(Binder);
-    if (WorldTime::getTime() == step)
-      NOTIFY(AtomObservable::BondsRemoved);
-    status = true;
+  if (Binder != NULL) {
+    if (Binder->Contains(this)) {
+      OBSERVE;
+      //LOG(0,"INFO: Unregistering bond "<< *Binder << " from list " << &ListOfBonds << " of atom " << *this << " at step " << step);
+#ifndef NDEBUG
+      BondList::const_iterator iter =
+          std::find(ListOfBonds[_step].begin(), ListOfBonds[_step].end(), Binder);
+      ASSERT( iter != ListOfBonds[_step].end(),
+          "BondedParticle::UnregisterBond() - "+toString(*Binder)+" not contained at "
+          +toString(_step));
+#endif
+      Binder->removeAtom(this);
+      ListOfBonds[_step].remove(Binder);
+      if (WorldTime::getTime() == _step)
+        NOTIFY(AtomObservable::BondsRemoved);
+      status = true;
+    } else {
+      ELOG(1, *Binder << " does not contain " << *this << ".");
+    }
   } else {
-    ELOG(1, *Binder << " does not contain " << *this << ".");
+    ELOG(1, "Binder is " << Binder << ".");
   }
   return status;
 };
 
-/** Removes all bonds from atom::ListOfBonds.
- * \note Does not do any memory de-allocation.
- */
-void BondedParticle::UnregisterAllBond(const unsigned int _step)
-{
-  OBSERVE;
-  NOTIFY(AtomObservable::BondsRemoved);
-  ListOfBonds[_step].clear();
-}
-
 /** Removes all bonds of given \a _step with freeing memory.
  *
@@ -237,13 +295,5 @@
 void BondedParticle::ClearBondsAtStep(const unsigned int _step)
 {
-  OBSERVE;
-  NOTIFY(AtomObservable::BondsRemoved);
-  //LOG(3,"INFO: Clearing all bonds of " << *this << ": " << ListOfBonds[_step]);
-  for (BondList::iterator iter = (ListOfBonds[_step]).begin();
-      !(ListOfBonds[_step]).empty();
-      iter = (ListOfBonds[_step]).begin()) {
-    //LOG(3,"INFO: Clearing bond (" << *iter << ") " << *(*iter) << " of list " << &ListOfBonds);
-    delete((*iter)); // will also unregister with us and remove from list
-  }
+  removeAllBonds(_step);
 }
 
@@ -286,5 +336,5 @@
   int FalseBondDegree = 0;
   atom *OtherWalker = NULL;
-  bond::ptr CandidateBond = NULL;
+  bond::ptr CandidateBond;
 
   NoBonds = CountBonds();
Index: src/Atom/atom_bondedparticle.hpp
===================================================================
--- src/Atom/atom_bondedparticle.hpp	(revision 88c8ec20f4a97f9685638eda1c07bca7fe46bd4e)
+++ src/Atom/atom_bondedparticle.hpp	(revision 7d82a5107dfcc03ee6f2a1b4ee8c3083515b6ff2)
@@ -24,5 +24,7 @@
 #include "atom_atominfo.hpp"
 #include "atom_bondedparticleinfo.hpp"
+#include "atom_observable.hpp"
 #include "atom_particleinfo.hpp"
+#include "atom_observable.hpp"
 
 /****************************************** forward declarations *****************************/
@@ -32,5 +34,10 @@
 /********************************************** declarations *******************************/
 
-class BondedParticle : public BondedParticleInfo, public virtual ParticleInfo, public virtual AtomInfo {
+class BondedParticle : 
+    public BondedParticleInfo, 
+    public virtual ParticleInfo, 
+    public virtual AtomInfo, 
+    public virtual AtomObservable 
+{
 public:
   BondedParticle();
@@ -39,5 +46,5 @@
   bond::ptr const addBond(const unsigned int _step, BondedParticle* Partner);
   void removeBond(const unsigned int _step, BondedParticle* Partner);
-  void removeBond(bond::ptr binder);
+  void removeBond(bond::ptr &binder);
   void removeAllBonds();
   void removeAllBonds(const unsigned int _step);
@@ -55,9 +62,13 @@
 protected:
   bool RegisterBond(const unsigned int _step, bond::ptr const Binder);
-  bool UnregisterBond(bond::ptr const Binder);
-  void UnregisterAllBond(const unsigned int _step);
+  bool UnregisterBond(const unsigned int _step, bond::ptr const Binder);
 
   int ContainsBondAtStep(bond::ptr Binder) const;
 
+private:
+  unsigned int findBondsStep(bond::ptr const Binder) const;
+  BondList::const_iterator findBondPartnerAtStep(
+      const unsigned int _step,
+      BondedParticle * const Partner) const;
 };
 
Index: src/Atom/atom_bondedparticleinfo.hpp
===================================================================
--- src/Atom/atom_bondedparticleinfo.hpp	(revision 88c8ec20f4a97f9685638eda1c07bca7fe46bd4e)
+++ src/Atom/atom_bondedparticleinfo.hpp	(revision 7d82a5107dfcc03ee6f2a1b4ee8c3083515b6ff2)
@@ -19,5 +19,5 @@
 #endif
 
-#include "atom_observable.hpp"
+//#include "atom_observable.hpp"
 #include "Bond/bond.hpp"
 
@@ -32,5 +32,6 @@
 /********************************************** declarations *******************************/
 
-class BondedParticleInfo  : public virtual AtomObservable {
+class BondedParticleInfo // : public virtual AtomObservable // must be virtual(!)
+{
   friend class BondedParticle;
 public:
