Index: src/UIElements/Qt4/InstanceBoard/ObservedValue_types.hpp
===================================================================
--- src/UIElements/Qt4/InstanceBoard/ObservedValue_types.hpp	(revision bff202c6e3d0515447a54bacfa6e9ed5ffca83cf)
+++ src/UIElements/Qt4/InstanceBoard/ObservedValue_types.hpp	(revision 59eabc83f7f01a0f2797b83aea97182aa3c14b71)
@@ -19,4 +19,6 @@
 #include <boost/any.hpp>
 
+class Observable;
+
 /** typedef for a vector of ObservedValue's (each is due to templating its
  * own type. Therefore, we need to use boost::any).
@@ -24,4 +26,11 @@
 typedef std::vector<boost::any> ObservedValues_t;
 
+/** typedef for the permanent and (for the lifetime of the object) never
+ * changing index.
+ *
+ * Note that this is slightly dangerous because two objects may get the same
+ * index if one is destroyed and another one instantiated at the same address.
+ */
+typedef const Observable * ObservedValue_Index_t;
 
 
Index: src/UIElements/Qt4/InstanceBoard/QtObservedAtom.cpp
===================================================================
--- src/UIElements/Qt4/InstanceBoard/QtObservedAtom.cpp	(revision bff202c6e3d0515447a54bacfa6e9ed5ffca83cf)
+++ src/UIElements/Qt4/InstanceBoard/QtObservedAtom.cpp	(revision 59eabc83f7f01a0f2797b83aea97182aa3c14b71)
@@ -255,6 +255,6 @@
 
     if (!BoardIsGone) {
-      board.markObservedAtomAsDisconnected(getAtomIndex());
-      board.markObservedAtomForErase(getAtomIndex());
+      board.markObservedAtomAsDisconnected(getIndex());
+      board.markObservedAtomForErase(getIndex());
     }
   }
@@ -308,5 +308,5 @@
       owner->signOn(this, *iter);
     if (!BoardIsGone)
-      board.markObservedAtomAsConnected(getAtomIndex());
+      board.markObservedAtomAsConnected(getIndex());
   } else
     signedOffChannels = AllsignedOnChannels;
@@ -324,5 +324,5 @@
     signedOffChannels = AllsignedOnChannels;
     if (!BoardIsGone)
-      board.markObservedAtomAsDisconnected(getAtomIndex());
+      board.markObservedAtomAsDisconnected(getIndex());
   }
 }
@@ -440,4 +440,11 @@
 }
 
+ObservedValue_Index_t QtObservedAtom::getIndex() const
+{
+  ASSERT( owner != NULL,
+      "QtObservedAtom::getIndex() - index is NULL");
+  return owner;
+}
+
 const atomId_t& QtObservedAtom::getAtomIndex() const
 {
Index: src/UIElements/Qt4/InstanceBoard/QtObservedAtom.hpp
===================================================================
--- src/UIElements/Qt4/InstanceBoard/QtObservedAtom.hpp	(revision bff202c6e3d0515447a54bacfa6e9ed5ffca83cf)
+++ src/UIElements/Qt4/InstanceBoard/QtObservedAtom.hpp	(revision 59eabc83f7f01a0f2797b83aea97182aa3c14b71)
@@ -60,5 +60,5 @@
 private:
   //!> ObservedValuesContainer needs to access private cstor and dstor
-  friend class ObservedValuesContainer<QtObservedAtom, atomId_t>;
+  friend class ObservedValuesContainer<QtObservedAtom, ObservedValue_Index_t>;
   //!> QtObservedInstanceBoard needs to access private cstor and dstor
   friend class QtObservedInstanceBoard;
@@ -88,4 +88,18 @@
   void subjectKilled(Observable *publisher);
   void recieveNotification(Observable *publisher, Notification_ptr notification);
+
+  /** Getter for a permanent and unique index of this instance.
+   *
+   * \note ALWAYS use this index if you need to store and identifier to this
+   * instance which you might need to retrieve at some later date.
+   *
+   * \warning DO NOT STORE the QtObserved...:ptr directly. This will possibly
+   * prevent their eventual destruction. Only store the ObservedValue_Index_t
+   * as means to obtain the ptr from the QtObservedInstanceBoard.
+   *
+   * \return returns a unique and permanent index that can be used to retrieve this
+   * instance from the QtObservedInstanceBoard as it must not be stored.
+   */
+  ObservedValue_Index_t getIndex() const;
 
   /** Getter to atom index contained in \a ObservedValues.
Index: src/UIElements/Qt4/InstanceBoard/QtObservedInstanceBoard.cpp
===================================================================
--- src/UIElements/Qt4/InstanceBoard/QtObservedInstanceBoard.cpp	(revision bff202c6e3d0515447a54bacfa6e9ed5ffca83cf)
+++ src/UIElements/Qt4/InstanceBoard/QtObservedInstanceBoard.cpp	(revision 59eabc83f7f01a0f2797b83aea97182aa3c14b71)
@@ -67,4 +67,5 @@
       boost::bind(&QtObservedInstanceBoard::moleculecountsubjectKilled, this, _1))
 {
+  qRegisterMetaType<ObservedValue_Index_t>("ObservedValue_Index_t");
   qRegisterMetaType<QtObservedAtom::ptr>("QtObservedAtom::ptr");
   qRegisterMetaType<QtObservedMolecule::ptr>("QtObservedMolecule::ptr");
@@ -141,5 +142,7 @@
                   *this));
           observedmolecule->setSelfRef(observedmolecule);
-          moleculeObservedValues.insert(_id, observedmolecule);
+          const ObservedValue_Index_t index = static_cast<const Observable *>(_molecule);
+          moleculeObservedValues.insert(index, observedmolecule);
+          moleculeids_lookup.insert( std::make_pair(_id, index) );
           // we need to check for index changes
           LOG(3, "DEBUG: InformationBoard signOn()s to molecule " << _id);
@@ -167,5 +170,7 @@
               new QtObservedAtom(_id, _atom, *this));
           observedatom->setSelfRef(observedatom);
-          atomObservedValues.insert(_id, observedatom);
+          const ObservedValue_Index_t index = static_cast<const Observable *>(_atom);
+          atomObservedValues.insert(index, observedatom);
+          atomids_lookup.insert( std::make_pair(_id, index) );
           // we need to check for index changes
           LOG(3, "DEBUG: InformationBoard signOn()s to atom " << _id);
@@ -190,11 +195,13 @@
         const moleculeId_t newmoleculeId = dynamic_cast<molecule *>(publisher)->getId();
         LOG(3, "DEBUG: InformationBoard got IndexChanged from molecule " << molid << " to " << newmoleculeId);
-#ifndef NDEBUG
-        bool status =
-#endif
-        moleculeObservedValues.changeIdentifier(molid, newmoleculeId);
-        ASSERT( status,
-            "QtObservedInstanceBoard::recieveNotification() - cannot change molecule's id "
-            +toString(molid)+" "+toString(newmoleculeId)+" in moleculeObservedValues.");
+        {
+          typename IdtoIndex_t<moleculeId_t>::iterator iter = moleculeids_lookup.find(molid);
+          ASSERT( iter != moleculeids_lookup.end(),
+              "QtObservedInstanceBoard::recieveNotification() - mol id "
+              +toString(molid)+" unknown to lookup.");
+          const ObservedValue_Index_t index = iter->second;
+          moleculeids_lookup.erase(iter);
+          moleculeids_lookup.insert( std::pair<moleculeId_t, ObservedValue_Index_t>(newmoleculeId, index) );
+        }
         // no need update SignedOn, ref does not change
         emit moleculeIndexChanged(molid, newmoleculeId);
@@ -212,11 +219,13 @@
         const atomId_t newatomId = dynamic_cast<atom *>(publisher)->getId();
         LOG(3, "DEBUG: InformationBoard got IndexChanged from atom " << oldatomId << " to " << newatomId);
-#ifndef NDEBUG
-        bool status =
-#endif
-        atomObservedValues.changeIdentifier(oldatomId, newatomId);
-        ASSERT( status,
-            "QtObservedInstanceBoard::recieveNotification() - cannot change atom's id "
-            +toString(oldatomId)+" "+toString(newatomId)+" in atomObservedValues.");
+        {
+          typename IdtoIndex_t<atomId_t>::iterator iter = atomids_lookup.find(oldatomId);
+          ASSERT( iter != atomids_lookup.end(),
+              "QtObservedInstanceBoard::recieveNotification() - atom id "
+              +toString(oldatomId)+" unknown to lookup.");
+          const ObservedValue_Index_t index = iter->second;
+          atomids_lookup.erase(iter);
+          atomids_lookup.insert( std::pair<atomId_t, ObservedValue_Index_t>(newatomId, index) );
+        }
         // no need update SignedOn, ref does not change
         emit atomIndexChanged(oldatomId, newatomId);
@@ -232,64 +241,52 @@
 }
 
-void QtObservedInstanceBoard::atomcountsubjectKilled(const atomId_t _atomid)
-{
-  LOG(3, "DEBUG: InstanceBoard emits atomRemoved for " << _atomid);
-  emit atomRemoved(_atomid);
-}
-
-void QtObservedInstanceBoard::moleculecountsubjectKilled(const moleculeId_t _molid)
-{
-  LOG(3, "DEBUG: InstanceBoard emits moleculeRemoved for " << _molid);
-  emit moleculeRemoved(_molid);
+void QtObservedInstanceBoard::atomcountsubjectKilled(ObservedValue_Index_t _id)
+{
+  LOG(3, "DEBUG: InstanceBoard emits atomRemoved for " << _id);
+  emit atomRemoved(_id);
+}
+
+void QtObservedInstanceBoard::moleculecountsubjectKilled(ObservedValue_Index_t _id)
+{
+  LOG(3, "DEBUG: InstanceBoard emits moleculeRemoved for " << _id);
+  emit moleculeRemoved(_id);
 }
 
 QtObservedAtom::ptr QtObservedInstanceBoard::getObservedAtom(const atomId_t _id)
 {
-  return atomObservedValues.get(_id);
-}
-
-QtObservedAtom::ptr QtObservedInstanceBoard::getObservedAtom(const Observable * _obs)
-{
-  const atom * walker = dynamic_cast<const atom *>(_obs);
-  return atomObservedValues.get(walker->getId());
+  return atomObservedValues.get(atomids_lookup[_id]);
 }
 
 QtObservedMolecule::ptr QtObservedInstanceBoard::getObservedMolecule(const moleculeId_t _id)
 {
-  return moleculeObservedValues.get(_id);
-}
-
-QtObservedMolecule::ptr QtObservedInstanceBoard::getObservedMolecule(const Observable * _obs)
-{
-  const molecule * mol = dynamic_cast<const molecule *>(_obs);
-  return moleculeObservedValues.get(mol->getId());
-}
-
-void QtObservedInstanceBoard::markObservedAtomAsConnected(const atomId_t _id)
+  return moleculeObservedValues.get(moleculeids_lookup[_id]);
+}
+
+void QtObservedInstanceBoard::markObservedAtomAsConnected(ObservedValue_Index_t _id)
 {
   atomObservedValues.markObservedValuesAsConnected(_id);
 }
 
-void QtObservedInstanceBoard::markObservedAtomAsDisconnected(const atomId_t _id)
+void QtObservedInstanceBoard::markObservedAtomAsDisconnected(ObservedValue_Index_t _id)
 {
   atomObservedValues.markObservedValuesAsDisconnected(_id);
 }
 
-void QtObservedInstanceBoard::markObservedAtomForErase(const atomId_t _id)
+void QtObservedInstanceBoard::markObservedAtomForErase(ObservedValue_Index_t _id)
 {
   atomObservedValues.eraseObservedValues(_id);
 }
 
-void QtObservedInstanceBoard::markObservedMoleculeAsConnected(const moleculeId_t _id)
+void QtObservedInstanceBoard::markObservedMoleculeAsConnected(ObservedValue_Index_t _id)
 {
   moleculeObservedValues.markObservedValuesAsConnected(_id);
 }
 
-void QtObservedInstanceBoard::markObservedMoleculeAsDisconnected(const moleculeId_t _id)
+void QtObservedInstanceBoard::markObservedMoleculeAsDisconnected(ObservedValue_Index_t _id)
 {
   moleculeObservedValues.markObservedValuesAsDisconnected(_id);
 }
 
-void QtObservedInstanceBoard::markObservedMoleculeForErase(const moleculeId_t _id)
+void QtObservedInstanceBoard::markObservedMoleculeForErase(ObservedValue_Index_t _id)
 {
   moleculeObservedValues.eraseObservedValues(_id);
Index: src/UIElements/Qt4/InstanceBoard/QtObservedInstanceBoard.hpp
===================================================================
--- src/UIElements/Qt4/InstanceBoard/QtObservedInstanceBoard.hpp	(revision bff202c6e3d0515447a54bacfa6e9ed5ffca83cf)
+++ src/UIElements/Qt4/InstanceBoard/QtObservedInstanceBoard.hpp	(revision 59eabc83f7f01a0f2797b83aea97182aa3c14b71)
@@ -80,20 +80,18 @@
 
   QtObservedAtom::ptr getObservedAtom(const atomId_t _id);
-  QtObservedAtom::ptr getObservedAtom(const Observable * _obs);
   QtObservedMolecule::ptr getObservedMolecule(const moleculeId_t _id);
-  QtObservedMolecule::ptr getObservedMolecule(const Observable * _obs);
-  void markObservedAtomAsConnected(const atomId_t _id);
-  void markObservedAtomAsDisconnected(const atomId_t _id);
-  void markObservedAtomForErase(const atomId_t _id);
-  void markObservedMoleculeAsConnected(const moleculeId_t _id);
-  void markObservedMoleculeAsDisconnected(const moleculeId_t _id);
-  void markObservedMoleculeForErase(const moleculeId_t _id);
+  void markObservedAtomAsConnected(ObservedValue_Index_t _id);
+  void markObservedAtomAsDisconnected(ObservedValue_Index_t _id);
+  void markObservedAtomForErase(ObservedValue_Index_t _id);
+  void markObservedMoleculeAsConnected(ObservedValue_Index_t _id);
+  void markObservedMoleculeAsDisconnected(ObservedValue_Index_t _id);
+  void markObservedMoleculeForErase(ObservedValue_Index_t _id);
 
 signals:
   void atomInserted(QtObservedAtom::ptr _atom);
-  void atomRemoved(const atomId_t _atomid);
+  void atomRemoved(ObservedValue_Index_t _atomid);
   void atomIndexChanged(const atomId_t _oldid, const atomId_t _newid);
   void moleculeInserted(QtObservedMolecule::ptr _mol);
-  void moleculeRemoved(const moleculeId_t _molid);
+  void moleculeRemoved(ObservedValue_Index_t _molid);
   void moleculeIndexChanged(const moleculeId_t _oldid, const moleculeId_t _newid);
 
@@ -113,4 +111,10 @@
   SignedOn_t MoleculeSignedOn;
 
+  //!> "templated typedef" for an id to index map.
+  template <class id>
+  struct IdtoIndex_t : std::map<id, ObservedValue_Index_t> {};
+  IdtoIndex_t<atomId_t> atomids_lookup;
+  IdtoIndex_t<moleculeId_t> moleculeids_lookup;
+
   /** Counts how many atom's ObservedValues got subjectKilled.
    *
@@ -119,7 +123,7 @@
    * monitored Observable. Only then can we safely remove the instance.
    *
-   * \param _atomid id of the atom
+   * \param _id observable that received the subjectKilled()
    */
-  void atomcountsubjectKilled(const atomId_t _atomid);
+  void atomcountsubjectKilled(ObservedValue_Index_t _id);
 
   /** Counts how many molecule's ObservedValues got subjectKilled.
@@ -129,12 +133,12 @@
    * monitored Observable. Only then can we safely remove the instance.
    *
-   * \param _molid id of the molecule
+   * \param _id observable that received the subjectKilled()
    */
-  void moleculecountsubjectKilled(const moleculeId_t _molid);
+  void moleculecountsubjectKilled(ObservedValue_Index_t _id);
 
   //!> container with all ObservedValues for each atom, associated by id
-  ObservedValuesContainer<QtObservedAtom, atomId_t> atomObservedValues;
+  ObservedValuesContainer<QtObservedAtom, ObservedValue_Index_t> atomObservedValues;
   //!> container with all ObservedValues for each molecule, associated by id
-  ObservedValuesContainer<QtObservedMolecule, moleculeId_t> moleculeObservedValues;
+  ObservedValuesContainer<QtObservedMolecule, ObservedValue_Index_t> moleculeObservedValues;
 };
 
Index: src/UIElements/Qt4/InstanceBoard/QtObservedMolecule.cpp
===================================================================
--- src/UIElements/Qt4/InstanceBoard/QtObservedMolecule.cpp	(revision bff202c6e3d0515447a54bacfa6e9ed5ffca83cf)
+++ src/UIElements/Qt4/InstanceBoard/QtObservedMolecule.cpp	(revision 59eabc83f7f01a0f2797b83aea97182aa3c14b71)
@@ -151,5 +151,5 @@
     signedOffChannels = AllsignedOnChannels;
     if (!BoardIsGone)
-      board.markObservedMoleculeAsDisconnected(getMolIndex());
+      board.markObservedMoleculeAsDisconnected(getIndex());
   }
 }
@@ -166,5 +166,5 @@
       owner->signOn(this, *iter);
     if (!BoardIsGone)
-      board.markObservedMoleculeAsConnected(getMolIndex());
+      board.markObservedMoleculeAsConnected(getIndex());
   } else
     signedOffChannels = AllsignedOnChannels;
@@ -204,6 +204,6 @@
 
     if (!BoardIsGone) {
-      board.markObservedMoleculeAsDisconnected(getMolIndex());
-      board.markObservedMoleculeForErase(getMolIndex());
+      board.markObservedMoleculeAsDisconnected(getIndex());
+      board.markObservedMoleculeForErase(getIndex());
     }
   }
@@ -523,4 +523,11 @@
 }
 
+ObservedValue_Index_t QtObservedMolecule::getIndex() const
+{
+  ASSERT( owner != NULL,
+      "QtObservedMolecule::getIndex() - index is NULL");
+  return owner;
+}
+
 const int& QtObservedMolecule::getAtomCount() const
 {
Index: src/UIElements/Qt4/InstanceBoard/QtObservedMolecule.hpp
===================================================================
--- src/UIElements/Qt4/InstanceBoard/QtObservedMolecule.hpp	(revision bff202c6e3d0515447a54bacfa6e9ed5ffca83cf)
+++ src/UIElements/Qt4/InstanceBoard/QtObservedMolecule.hpp	(revision 59eabc83f7f01a0f2797b83aea97182aa3c14b71)
@@ -57,5 +57,5 @@
 private:
   //!> ObservedValuesContainer needs to access private cstor and dstor
-  friend class ObservedValuesContainer<QtObservedMolecule, moleculeId_t>;
+  friend class ObservedValuesContainer<QtObservedMolecule, ObservedValue_Index_t>;
   //!> QtObservedInstanceBoard needs to access private cstor and dstor
   friend class QtObservedInstanceBoard;
@@ -85,4 +85,18 @@
   void subjectKilled(Observable *publisher);
   void recieveNotification(Observable *publisher, Notification_ptr notification);
+
+  /** Getter for a permanent and unique index of this instance.
+   *
+   * \note ALWAYS use this index if you need to store and identifier to this
+   * instance which you might need to retrieve at some later date.
+   *
+   * \warning DO NOT STORE the QtObserved...:ptr directly. This will possibly
+   * prevent their eventual destruction. Only store the ObservedValue_Index_t
+   * as means to obtain the ptr from the QtObservedInstanceBoard.
+   *
+   * \return returns a unique and permanent index that can be used to retrieve this
+   * instance from the QtObservedInstanceBoard as it must not be stored.
+   */
+  ObservedValue_Index_t getIndex() const;
 
   /** Getter to molecule atom count contained in \a ObservedValues.
