Index: src/UIElements/Qt4/InstanceBoard/ObservedValuesContainer.hpp
===================================================================
--- src/UIElements/Qt4/InstanceBoard/ObservedValuesContainer.hpp	(revision b4358580663f9c1c016fb856bc7bb23862101215)
+++ src/UIElements/Qt4/InstanceBoard/ObservedValuesContainer.hpp	(revision 0af22d62caf516e8c8477d17013633d973652fad)
@@ -17,4 +17,5 @@
 #include "ObservedValue_types.hpp"
 
+#include <deque>
 #include <map>
 #include <string>
@@ -92,6 +93,15 @@
 
 private:
-  typedef std::pair<typename T::ptr, size_t> RefCountedObservedValues_t;
-  typedef std::map<id, RefCountedObservedValues_t> CountedObservedValues_t;
+  /** \note CountedObservedValues_t needs to contain a list in the second argument
+   * as the ObservedValuesContainer may fall behind when a single atom is created
+   * and destroyed a number of times in a row (e.g. in the undo/redo cases). This
+   * problem is inherent because on the one hand we keep the QtObservedAtom alive
+   * till the last moment, i.e. till the GUI does not need it anymore where the
+   * original instance may long have been removed from the World. On the other hand
+   * we instantiate the e.g. QtObservedAtom as soon as the observed atom is created.
+   */
+
+  typedef std::deque<std::pair<typename T::ptr, size_t> > RefCountedObservedValues_t;
+  typedef std::map<id, RefCountedObservedValues_t > CountedObservedValues_t;
   //!> internal vector of observed values
   CountedObservedValues_t ObservedValues;
@@ -154,7 +164,6 @@
    * \param _id identifier of instance associated with observed values
    * \param _obsvalues vector of observed values of instance
-   * \return true - insertion successful, false - else
    */
-  bool insert(const id _id, const typename T::ptr &_obsvalues);
+  void insert(const id _id, const typename T::ptr &_obsvalues);
 
   /** Use to change the identifier associated with a vector of observed values.
@@ -165,11 +174,4 @@
    */
   bool changeIdentifier(const id _oldid, const id _newid);
-
-  /** Returns the number of reference delivered for this instance identified by \a _id.
-   *
-   * \param _id identifier of instance
-   * \return reference count
-   */
-  size_t getRefCount(const id _id) const;
 
   /** Checks whether a vector of observed values of an instance  identified by \a _id
Index: src/UIElements/Qt4/InstanceBoard/ObservedValuesContainer_impl.hpp
===================================================================
--- src/UIElements/Qt4/InstanceBoard/ObservedValuesContainer_impl.hpp	(revision b4358580663f9c1c016fb856bc7bb23862101215)
+++ src/UIElements/Qt4/InstanceBoard/ObservedValuesContainer_impl.hpp	(revision 0af22d62caf516e8c8477d17013633d973652fad)
@@ -33,6 +33,13 @@
 {
   for (typename CountedObservedValues_t::iterator iter = ObservedValues.begin();
-      iter != ObservedValues.end(); ++iter)
-    iter->second.first->noteBoardIsGone();
+      iter != ObservedValues.end(); ++iter) {
+    ASSERT( !iter->second.empty(),
+        "~ObservedValuesContainer() of "+NameOfType+" "+toString(iter->first)
+        +" has an empty list in ObservedValues.");
+    for (typename RefCountedObservedValues_t::iterator listiter = iter->second.begin();
+        listiter != iter->second.end(); ++listiter) {
+      listiter->first->noteBoardIsGone();
+    }
+  }
 }
 
@@ -44,5 +51,8 @@
       "ObservedValuesContainer::getObservedValues() - no observed values present for "
       +NameOfType+" "+toString(_id));
-  const typename T::ptr &obsvalues = iter->second.first;
+  ASSERT( !iter->second.empty(),
+      "ObservedValuesContainer<T,id>::get() of "+NameOfType+" "+toString(_id)
+      +" has an empty list in ObservedValues.");
+  const typename T::ptr &obsvalues = iter->second.back().first;
 
   return obsvalues;
@@ -59,5 +69,8 @@
       "ObservedValuesContainer<T,id>::markObservedValuesAsConnected() - Observed value of "
       +NameOfType+" "+toString(_id)+" is not present yet.");
-  ++(iter->second.second);
+  ASSERT( !iter->second.empty(),
+      "ObservedValuesContainer<T,id>::markObservedValuesAsConnected() of "+NameOfType
+      +" "+toString(_id)+" has an empty list in ObservedValues.");
+  ++(iter->second.back().second);
 }
 
@@ -67,5 +80,8 @@
 {
   typename CountedObservedValues_t::const_iterator iter = ObservedValues.find(_id);
-  return ((iter != ObservedValues.end()) && (iter->second.second == 0));
+  ASSERT( !iter->second.empty(),
+      "ObservedValuesContainer<T,id>::checkRefCount() of "+NameOfType
+      +" "+toString(_id)+" has an empty list in ObservedValues.");
+  return ((iter != ObservedValues.end()) && (iter->second.front().second == 0));
 }
 
@@ -80,8 +96,11 @@
       "ObservedValuesContainer<T,id>::markObservedValuesAsDisconnected() - Observed value of "
       +NameOfType+" "+toString(_id)+" is not present yet.");
-  ASSERT (iter->second.second != 0,
+  ASSERT( !iter->second.empty(),
+      "ObservedValuesContainer<T,id>::markObservedValuesAsDisconnected() of "+NameOfType
+      +" "+toString(_id)+" has an empty list in ObservedValues.");
+  ASSERT (iter->second.front().second != 0,
       "ObservedValuesContainer<T,id>::markObservedValuesAsDisconnected() - Observed value of "
       +NameOfType+" "+toString(_id)+" is already signOff() from all.");
-  --(iter->second.second);
+  --(iter->second.front().second);
 
   if (checkRefCount(_id) && checksubjectKilled(_id) && checkMarkedForErase(_id))
@@ -124,5 +143,14 @@
   onDestroy(_id);
   subjectKilledCount.erase(_id);
-  ObservedValues.erase(_id);
+  typename CountedObservedValues_t::iterator iter = ObservedValues.find(_id);
+  ASSERT( !iter->second.empty(),
+      "ObservedValuesContainer<T,id>::removeObservedValues() of "+NameOfType
+      +" for "+toString(_id)+" has an empty list in ObservedValues.");
+  if (iter->second.size() == 1)
+    ObservedValues.erase(iter);
+  else {
+    //if more than one, erase always the first one
+    iter->second.pop_front();
+  }
   MarkedForErase.erase(_id);
 }
@@ -150,11 +178,14 @@
 
 template <class T, typename id>
-bool ObservedValuesContainer<T,id>::insert(const id _id, const typename T::ptr &_obsvalues)
+void ObservedValuesContainer<T,id>::insert(const id _id, const typename T::ptr &_obsvalues)
 {
   std::pair<typename CountedObservedValues_t::iterator, bool> inserter =
       ObservedValues.insert(
-          std::make_pair( _id, std::make_pair(_obsvalues,0) ) );
+          std::make_pair( _id, RefCountedObservedValues_t(1,std::make_pair(_obsvalues,0)) ) );
+  if (!inserter.second) {
+    // already an entry present? add to deque
+    inserter.first->second.push_back( std::make_pair(_obsvalues,0) );
+  }
   _obsvalues->activateObserver();
-  return inserter.second;
 }
 
@@ -174,4 +205,9 @@
   if (status) {
     {
+      // TODO: Actually, we need to think whether we do not have to to split the
+      // deque in two parts: the last entry having the newid, while all other
+      // ones retain the old one until they get removed. But we need to check
+      // whether changing ids "there" is possible when the QtObserved... is under
+      // removal.
       RefCountedObservedValues_t obsvalues = Colditer->second;
       ObservedValues.erase(Colditer);
@@ -193,11 +229,4 @@
 
 template <class T, typename id>
-size_t ObservedValuesContainer<T,id>::getRefCount(const id _id) const
-{
-  typename CountedObservedValues_t::const_iterator iter = ObservedValues.find(_id);
-  return iter->second.second;
-}
-
-template <class T, typename id>
 bool ObservedValuesContainer<T,id>::isPresent(const id _id) const
 {
Index: src/UIElements/Qt4/InstanceBoard/QtObservedInstanceBoard.cpp
===================================================================
--- src/UIElements/Qt4/InstanceBoard/QtObservedInstanceBoard.cpp	(revision b4358580663f9c1c016fb856bc7bb23862101215)
+++ src/UIElements/Qt4/InstanceBoard/QtObservedInstanceBoard.cpp	(revision 0af22d62caf516e8c8477d17013633d973652fad)
@@ -159,11 +159,5 @@
               moleculeSubjectKilled);
           QtObservedMolecule::ptr observedmolecule(new QtObservedMolecule(ObservedValues, *this));
-#ifndef NDEBUG
-          bool status =
-#endif
-              moleculeObservedValues.insert(_id, observedmolecule);
-          ASSERT( status,
-              "QtObservedInstanceBoard::recieveNotification() - could not insert ObservedMolecule for"
-              +toString(_id)+".");
+          moleculeObservedValues.insert(_id, observedmolecule);
           // we need to check for index changes
           LOG(3, "DEBUG: InformationBoard signOn()s to molecule " << _id);
@@ -207,11 +201,5 @@
               atomSubjectKilled);
           QtObservedAtom::ptr observedatom(new QtObservedAtom(ObservedValues, *this));
-#ifndef NDEBUG
-          bool status  =
-#endif
-              atomObservedValues.insert(_id, observedatom);
-          ASSERT( status,
-              "QtObservedInstanceBoard::recieveNotification() - could not insert ObservedValues for"
-              +toString(_id)+".");
+          atomObservedValues.insert(_id, observedatom);
           // we need to check for index changes
           LOG(3, "DEBUG: InformationBoard signOn()s to atom " << _id);
