Index: src/UIElements/Views/Qt4/MoleculeList/QtMoleculeItem.cpp
===================================================================
--- src/UIElements/Views/Qt4/MoleculeList/QtMoleculeItem.cpp	(revision 009e2e2d372810a555a452769338209c68591479)
+++ src/UIElements/Views/Qt4/MoleculeList/QtMoleculeItem.cpp	(revision 3e52834b600d16813f5a1e262cafdbdc7586571d)
@@ -61,5 +61,5 @@
   movetype(_movetype),
   channellist(_channellist),
-  IsSignedOn(false),
+  owner(NULL),
   dirty(true),
   emitDirtyState(_emitDirtyState)
@@ -74,9 +74,8 @@
       getMolecule(MoleculeById(molid));
   if (mol != NULL) {
-    if (!IsSignedOn)
-      for (channellist_t::const_iterator channeliter = channellist.begin();
-          channeliter != channellist.end(); ++channeliter)
-        mol->signOn(this, *channeliter);
-    IsSignedOn = true;
+    owner = static_cast<const Observable *>(mol);
+    for (channellist_t::const_iterator channeliter = channellist.begin();
+        channeliter != channellist.end(); ++channeliter)
+      owner->signOn(this, *channeliter);
   }
 }
@@ -84,13 +83,10 @@
 void QtMoleculeItem::signOffFromMolecule()
 {
-  const molecule * const mol = const_cast<const World &>(World::getInstance()).
-      getMolecule(MoleculeById(molid));
-  if (mol != NULL) {
-    if (IsSignedOn)
-      for (channellist_t::const_iterator channeliter = channellist.begin();
-          channeliter != channellist.end(); ++channeliter)
-        mol->signOff(this, *channeliter);
+  if (owner != NULL) {
+    for (channellist_t::const_iterator channeliter = channellist.begin();
+        channeliter != channellist.end(); ++channeliter)
+      owner->signOff(this, *channeliter);
+    owner = NULL;
   }
-  IsSignedOn = false;
 }
 
@@ -136,5 +132,5 @@
 void QtMoleculeItem::subjectKilled(Observable *publisher)
 {
-  IsSignedOn = false;
+  signOffFromMolecule();
   dirty = false;
 }
Index: src/UIElements/Views/Qt4/MoleculeList/QtMoleculeItem.hpp
===================================================================
--- src/UIElements/Views/Qt4/MoleculeList/QtMoleculeItem.hpp	(revision 009e2e2d372810a555a452769338209c68591479)
+++ src/UIElements/Views/Qt4/MoleculeList/QtMoleculeItem.hpp	(revision 3e52834b600d16813f5a1e262cafdbdc7586571d)
@@ -40,5 +40,5 @@
 public:
   //!> typedef for a list of notification channels required, to know when to update
-  typedef std::list<molecule::NotificationType> channellist_t;
+  typedef Observable::channels_t channellist_t;
 
   //!> enum states whether an item's formula changed or not
@@ -100,6 +100,6 @@
   const channellist_t &channellist;
 
-  //!> states whether we are still signed on to molecule
-  bool IsSignedOn;
+  //!> the Observable we are signed on, also indicates whether we are sign on (not NULL)
+  const Observable * owner;
 
   //!> states that this item needs to be updated
Index: src/UIElements/Views/Qt4/MoleculeList/SpecificItems/QtMoleculeItem_atomcount.hpp
===================================================================
--- src/UIElements/Views/Qt4/MoleculeList/SpecificItems/QtMoleculeItem_atomcount.hpp	(revision 009e2e2d372810a555a452769338209c68591479)
+++ src/UIElements/Views/Qt4/MoleculeList/SpecificItems/QtMoleculeItem_atomcount.hpp	(revision 3e52834b600d16813f5a1e262cafdbdc7586571d)
@@ -15,4 +15,6 @@
 
 #include "UIElements/Views/Qt4/MoleculeList/QtMoleculeItem.hpp"
+
+#include "CodePatterns/ObservedValue.hpp"
 
 #include "Descriptors/MoleculeIdDescriptor.hpp"
@@ -33,8 +35,24 @@
       const moleculeId_t _molid,
       emitDirtyState_t _emitDirtyState) :
-        QtMoleculeItem(_molid, channellist_atomcount, QtMoleculeItem::NeedsMove, _emitDirtyState)
+        QtMoleculeItem(_molid, channellist_atomcount, QtMoleculeItem::NeedsMove, _emitDirtyState),
+        molref(getMolecule()),
+        atomcount(
+            molref,
+            boost::bind(&QtMoleculeItem_atomcount::updateAtomCount, this),
+            "MoleculeItem_atomcount_"+toString(_molid),
+            updateAtomCount(),
+            channellist_atomcount)
   {
     // cannot call pure virtual function in QtMoleculeItem's cstor
     internal_updateState();
+  }
+
+  int updateAtomCount() const
+  {
+    const molecule * const mol = getMolecule();
+    if (mol != NULL)
+      return mol->getAtomCount();
+    else
+      return -1;
   }
 
@@ -44,14 +62,15 @@
   void internal_updateState()
   {
-    const molecule * mol = const_cast<const World &>(World::getInstance()).
-        getMolecule(MoleculeById(molid));
-    if (mol != NULL)
-      setText(QString::number(mol->getAtomCount()));
-    else
-      setText(QString::number(-1));
+    setText(QString::number(atomcount.get()));
   }
 
   //!> notification channels of molecule specific to this molecule item, required for update
   static const QtMoleculeItem::channellist_t channellist_atomcount;
+
+  //!> temporary value for molecule
+  const molecule * const molref;
+
+  //!> contains visibility state
+  ObservedValue<int> atomcount;
 };
 
Index: src/UIElements/Views/Qt4/MoleculeList/SpecificItems/QtMoleculeItem_formula.hpp
===================================================================
--- src/UIElements/Views/Qt4/MoleculeList/SpecificItems/QtMoleculeItem_formula.hpp	(revision 009e2e2d372810a555a452769338209c68591479)
+++ src/UIElements/Views/Qt4/MoleculeList/SpecificItems/QtMoleculeItem_formula.hpp	(revision 3e52834b600d16813f5a1e262cafdbdc7586571d)
@@ -18,4 +18,6 @@
 #include <string>
 
+#include "CodePatterns/ObservedValue.hpp"
+
 #include "Descriptors/MoleculeIdDescriptor.hpp"
 #include "Formula.hpp"
@@ -36,8 +38,24 @@
       const moleculeId_t _molid,
       emitDirtyState_t _emitDirtyState) :
-        QtMoleculeItem(_molid, channellist_formula, QtMoleculeItem::NeedsMove, _emitDirtyState)
+        QtMoleculeItem(_molid, channellist_formula, QtMoleculeItem::NeedsMove, _emitDirtyState),
+        molref(getMolecule()),
+        formula(
+            molref,
+            boost::bind(&QtMoleculeItem_formula::updateFormula, this),
+            "MoleculeItem_formula_"+toString(_molid),
+            updateFormula(),
+            channellist_formula)
   {
     // cannot call pure virtual function in QtMoleculeItem's cstor
     internal_updateState();
+  }
+
+  std::string updateFormula() const
+  {
+    const molecule * const mol = getMolecule();
+    if (mol != NULL)
+      return mol->getFormula().toString();
+    else
+      return std::string();
   }
 
@@ -47,14 +65,15 @@
   void internal_updateState()
   {
-    const molecule * mol = const_cast<const World &>(World::getInstance()).
-        getMolecule(MoleculeById(molid));
-    if (mol != NULL)
-      setText(QString(mol->getFormula().toString().c_str()));
-    else
-      setText(QString(""));
+    setText(QString(formula.get().c_str()));
   }
 
   //!> notification channels of molecule specific to this molecule item, required for update
   static const QtMoleculeItem::channellist_t channellist_formula;
+
+  //!> temporary value for molecule
+  const molecule * const molref;
+
+  //!> contains visibility state
+  ObservedValue<std::string> formula;
 };
 
Index: src/UIElements/Views/Qt4/MoleculeList/SpecificItems/QtMoleculeItem_name.hpp
===================================================================
--- src/UIElements/Views/Qt4/MoleculeList/SpecificItems/QtMoleculeItem_name.hpp	(revision 009e2e2d372810a555a452769338209c68591479)
+++ src/UIElements/Views/Qt4/MoleculeList/SpecificItems/QtMoleculeItem_name.hpp	(revision 3e52834b600d16813f5a1e262cafdbdc7586571d)
@@ -15,4 +15,6 @@
 
 #include "UIElements/Views/Qt4/MoleculeList/QtMoleculeItem.hpp"
+
+#include "CodePatterns/ObservedValue.hpp"
 
 #include "Descriptors/MoleculeIdDescriptor.hpp"
@@ -33,8 +35,24 @@
       const moleculeId_t _molid,
       emitDirtyState_t _emitDirtyState) :
-        QtMoleculeItem(_molid, channellist_name, QtMoleculeItem::DoesNotMove, _emitDirtyState)
+        QtMoleculeItem(_molid, channellist_name, QtMoleculeItem::DoesNotMove, _emitDirtyState),
+        molref(getMolecule()),
+        name(
+            molref,
+            boost::bind(&QtMoleculeItem_name::updateName, this),
+            "MoleculeItem_name_"+toString(_molid),
+            updateName(),
+            channellist_name)
   {
     // cannot call pure virtual function in QtMoleculeItem's cstor
     internal_updateState();
+  }
+
+  std::string updateName() const
+  {
+    const molecule * const mol = getMolecule();
+    if (mol != NULL)
+      return mol->getName();
+    else
+      return std::string();
   }
 
@@ -44,14 +62,15 @@
   void internal_updateState()
   {
-    const molecule * mol = const_cast<const World &>(World::getInstance()).
-        getMolecule(MoleculeById(molid));
-    if (mol != NULL)
-      setText(QString(mol->getName().c_str()));
-    else
-      setText(QString("to be removed"));
+    setText(QString(name.get().c_str()));
   }
 
   //!> notification channels of molecule specific to this molecule item, required for update
   static const QtMoleculeItem::channellist_t channellist_name;
+
+  //!> temporary value for molecule
+  const molecule * const molref;
+
+  //!> contains visibility state
+  ObservedValue<std::string> name;
 };
 
Index: src/UIElements/Views/Qt4/MoleculeList/SpecificItems/QtMoleculeItem_visibility.hpp
===================================================================
--- src/UIElements/Views/Qt4/MoleculeList/SpecificItems/QtMoleculeItem_visibility.hpp	(revision 009e2e2d372810a555a452769338209c68591479)
+++ src/UIElements/Views/Qt4/MoleculeList/SpecificItems/QtMoleculeItem_visibility.hpp	(revision 3e52834b600d16813f5a1e262cafdbdc7586571d)
@@ -29,6 +29,5 @@
       const moleculeId_t _molid,
       emitDirtyState_t _emitDirtyState) :
-        QtMoleculeItem(_molid, channellist_visibility, QtMoleculeItem::DoesNotMove, _emitDirtyState)
-  {
+        QtMoleculeItem(_molid, channellist_visibility, QtMoleculeItem::DoesNotMove, _emitDirtyState)  {
     setFlags(flags() | Qt::ItemIsUserCheckable);
     setCheckState(Qt::Unchecked);
