Index: src/UIElements/Views/Qt4/QtMoleculeList.cpp
===================================================================
--- src/UIElements/Views/Qt4/QtMoleculeList.cpp	(revision 0a5beb2d06fe674eb3c4ac2eacac4d873e32ee7f)
+++ src/UIElements/Views/Qt4/QtMoleculeList.cpp	(revision 6770fae428b376912daabc349a23817dfb4f32e9)
@@ -40,4 +40,6 @@
 
 #include "CodePatterns/MemDebug.hpp"
+
+#include "CodePatterns/Observer/Notification.hpp"
 
 #include "Atom/atom.hpp"
@@ -76,4 +78,5 @@
   clearing = false;
   selecting = false;
+  changing = false;
   ChangingChildrensVisibility = false;
   refill();
@@ -96,5 +99,26 @@
 }
 
-void QtMoleculeList::recieveNotification(Observable *publisher, Notification_ptr notification) {
+void QtMoleculeList::recieveNotification(Observable *publisher, Notification_ptr notification)
+{
+  if (dynamic_cast<World *>(publisher) != NULL) {
+    switch (notification->getChannelNo()) {
+      case World::MoleculeInserted:
+      {
+        const molecule * const mol = World::getInstance().lastChanged<molecule>();
+        addItem(mol);
+        break;
+      }
+      case World::MoleculeRemoved:
+      {
+        const molecule * const mol = World::getInstance().lastChanged<molecule>();
+        removeItem(mol);
+        break;
+      }
+      default:
+        ASSERT(0, "QtMoleculeList::recieveNotification() - cannot get here, not subscribed to channel "
+            +toString(notification->getChannelNo()));
+        break;
+    }
+  }
 
   if (selecting)
@@ -104,4 +128,93 @@
 }
 
+void QtMoleculeList::addGroupItem(
+    QTreeWidgetItem *&_groupItem,
+    const std::string &_molecule_formula)
+{
+  _groupItem = new QTreeWidgetItem(this);
+  formula.insert( std::make_pair(_molecule_formula, _groupItem) );
+  // fill item
+  _groupItem->setText(NAME, QString("default"));
+  _groupItem->setFlags((_groupItem->flags() | Qt::ItemIsUserCheckable) ^ Qt::ItemIsSelectable);
+  _groupItem->setCheckState(VISIBILITY, Qt::Unchecked);
+  _groupItem->setText(ATOMCOUNT, QString::number(0));
+  _groupItem->setText(FORMULA, QString(""));
+  _groupItem->setText(OCCURRENCE, "0");
+  _groupItem->setData(0, Qt::UserRole, QVariant(-1));
+}
+
+void QtMoleculeList::addMoleculeItem(
+    QTreeWidgetItem *&_groupItem,
+    const molecule *_mol,
+    const std::string &_molecule_formula)
+{
+  QTreeWidgetItem *molItem = new QTreeWidgetItem(_groupItem);
+  molItem->setText(NAME, QString(_mol->getName().c_str()));
+  molItem->setFlags(molItem->flags() | Qt::ItemIsUserCheckable | Qt::ItemIsSelectable);
+  molItem->setCheckState(VISIBILITY, Qt::Unchecked);
+  molItem->setText(ATOMCOUNT, QString::number(_mol->getAtomCount()));
+  molItem->setText(FORMULA, QString(_molecule_formula.c_str()));
+  const int index = _mol->getId();
+  molItem->setData(0, Qt::UserRole, QVariant(index));
+  molItem->setSelected(World::getInstance().isSelected(_mol));
+}
+
+void QtMoleculeList::addItem(const molecule *_mol)
+{
+  if (changing)
+    return;
+  changing = true;
+  // find group if already in list
+  QTreeWidgetItem *groupItem = NULL;
+
+  const std::string &molecule_formula = _mol->getFormula().toString();
+  FormulaTreeItemMap_t::const_iterator formulaiter =
+      formula.find(molecule_formula);
+
+  // new molecule type -> create new group
+  if (formulaiter == formula.end()){
+    // insert new formula entry into visibility
+#ifndef NDEBUG
+    std::pair< FormulaVisibilityCountMap_t::iterator, bool> visibilityinserter =
+#endif
+        FormulaVisibilityCountMap.insert(
+            std::make_pair( molecule_formula, (unsigned int)0) );
+    ASSERT( visibilityinserter.second,
+        "QtMoleculeList::refill() - molecule with formula "
+        +molecule_formula+" already in FormulaVisibilityCountMap.");
+
+    // create item and place into Map with formula as key
+    addGroupItem(groupItem, molecule_formula);
+  } else {
+    groupItem = formulaiter->second;
+  }
+  ASSERT( groupItem != NULL,
+      "QtMoleculeList::addItem() - item with id "+toString(_mol->getId())
+      +" has not parent?");
+
+  // add molecule
+  addMoleculeItem(groupItem, _mol, molecule_formula);
+
+  // increase group occurrence
+  int count = groupItem->text(OCCURRENCE).toInt() + 1;
+  groupItem->setText(OCCURRENCE, QString::number(count));
+
+  changing = false;
+}
+
+void QtMoleculeList::removeItem(const molecule *_mol)
+{
+  if (changing)
+    return;
+  changing = true;
+
+  dirty = true;
+  // TODO: We have to get some Model into the Table in order to "find" items right
+  // away
+//  QTreeWidgetItem *molItem = itemFromIndex(mol->getId());
+//  delete molItem1;
+
+  changing = false;
+}
 
 void QtMoleculeList::refill() {
@@ -117,51 +230,5 @@
       iter++) {
 
-    // find group if already in list
-    QTreeWidgetItem *groupItem = NULL;
-    const std::string &molecule_formula = (*iter)->getFormula().toString();
-    FormulaTreeItemMap_t::const_iterator formulaiter =
-        formula.find(molecule_formula);
-
-    // new molecule type -> create new group
-    if (formulaiter == formula.end()){
-      // insert new formula entry into visibility
-#ifndef NDEBUG
-      std::pair< FormulaVisibilityCountMap_t::iterator, bool> visibilityinserter =
-#endif
-          FormulaVisibilityCountMap.insert(
-              std::make_pair( molecule_formula, (unsigned int)0) );
-      ASSERT( visibilityinserter.second,
-          "QtMoleculeList::refill() - molecule with formula "
-          +molecule_formula+" already in FormulaVisibilityCountMap.");
-
-      // create item and place into Map with formula as key
-      groupItem = new QTreeWidgetItem(this);
-      formula.insert( std::make_pair(molecule_formula, groupItem) );
-      // fill item
-      groupItem->setText(NAME, QString("default"));
-      groupItem->setFlags((groupItem->flags() | Qt::ItemIsUserCheckable) ^ Qt::ItemIsSelectable);
-      groupItem->setCheckState(VISIBILITY, Qt::Unchecked);
-      groupItem->setText(ATOMCOUNT, QString::number(0));
-      groupItem->setText(FORMULA, QString(""));
-      groupItem->setText(OCCURRENCE, "0");
-      groupItem->setData(0, Qt::UserRole, QVariant(-1));
-    } else {
-      groupItem = formulaiter->second;
-    }
-
-    // add molecule
-    QTreeWidgetItem *molItem = new QTreeWidgetItem(groupItem);
-    molItem->setText(NAME, QString((*iter)->getName().c_str()));
-    molItem->setFlags(molItem->flags() | Qt::ItemIsUserCheckable | Qt::ItemIsSelectable);
-    molItem->setCheckState(VISIBILITY, Qt::Unchecked);
-    molItem->setText(ATOMCOUNT, QString::number((*iter)->getAtomCount()));
-    molItem->setText(FORMULA, QString(molecule_formula.c_str()));
-    const int index = (*iter)->getId();
-    molItem->setData(0, Qt::UserRole, QVariant(index));
-    molItem->setSelected(World::getInstance().isSelected(*iter));
-
-    // increase group occurrence
-    int count = groupItem->text(OCCURRENCE).toInt() + 1;
-    groupItem->setText(OCCURRENCE, QString::number(count));
+    addItem(*iter);
   }
   dirty = false;
@@ -181,11 +248,12 @@
 void QtMoleculeList::visibilityChanged(QTreeWidgetItem* item, int column)
 {
-  if ((!clearing) && (!ChangingChildrensVisibility))
+  if ((!changing) && (!clearing) && (!ChangingChildrensVisibility))
     if (column == VISIBILITY) {
       const moleculeId_t molid = item->data(0, Qt::UserRole).toInt();
       const bool visible = item->checkState(VISIBILITY);
       if (molid != (unsigned int)-1) { // molecule item
-        const molecule * const _molecule =
-            World::getInstance().getMolecule(MoleculeById(molid));
+        World::MoleculeConstIterator moliter =
+            const_cast<const World &>(World::getInstance()).getMoleculeIter(MoleculeById(molid));
+        const molecule * const _molecule = *moliter;
         ASSERT( _molecule != NULL,
             "QtMoleculeList::visibilityChanged() - molecule with id "
Index: src/UIElements/Views/Qt4/QtMoleculeList.hpp
===================================================================
--- src/UIElements/Views/Qt4/QtMoleculeList.hpp	(revision 0a5beb2d06fe674eb3c4ac2eacac4d873e32ee7f)
+++ src/UIElements/Views/Qt4/QtMoleculeList.hpp	(revision 6770fae428b376912daabc349a23817dfb4f32e9)
@@ -60,5 +60,11 @@
   bool clearing;
   bool selecting;
+  bool changing;
   bool ChangingChildrensVisibility;
+
+  void addItem(const molecule *_mol);
+  void addGroupItem(QTreeWidgetItem *&_groupItem, const std::string &_molecule_formula);
+  void addMoleculeItem(QTreeWidgetItem *&_groupItem, const molecule *_mol, const std::string &molecule_formula);
+  void removeItem(const molecule *_mol);
 
   typedef std::map<std::string, unsigned int> FormulaVisibilityCountMap_t;
