Index: src/UIElements/Views/Qt4/MoleculeList/QtMoleculeList.cpp
===================================================================
--- src/UIElements/Views/Qt4/MoleculeList/QtMoleculeList.cpp	(revision 015f8c18d74c335a5af0741c3ff7f82dfcbfa0d1)
+++ src/UIElements/Views/Qt4/MoleculeList/QtMoleculeList.cpp	(revision a39d72c6d5edf5fa534720d234e4a54c6dcfc17a)
@@ -246,8 +246,7 @@
 }
 
-void QtMoleculeList::addMoleculeItem(
-    QStandardItem *_groupitem,
+QList<QStandardItem *> QtMoleculeList::createMoleculeItems(
     const moleculeId_t _molid,
-    const std::string &_molecule_formula)
+    std::string &_molecule_formula)
 {
   QList<QStandardItem *> molItems =
@@ -258,13 +257,21 @@
   QtMoleculeItem *mol_item = dynamic_cast<QtMoleculeItem *>(molItems.front());
   ASSERT( mol_item != NULL,
-      "QtMoleculeList::addMoleculeItem() - item from factory was not a QtMoleculeItem?");
+      "QtMoleculeList::createMoleculeItems() - item from factory was not a QtMoleculeItem?");
   {
     boost::recursive_mutex::scoped_lock lock(map_mutex);
     MoleculeItemBiMap.left.insert( std::make_pair(_molid, mol_item) );
-    LOG(1, "Adding" << _molecule_formula << " for " << _molid << " to MoleculeFormulaMap.");
+  }
+
+  QStandardItem *formulaitem = molItems.at(QtMoleculeItem::FORMULA);
+  ASSERT( formulaitem != NULL,
+      "QtMoleculeList::createMoleculeItems() - Formula item not created by factory?");
+  _molecule_formula = formulaitem->text().toStdString();
+  {
+    boost::recursive_mutex::scoped_lock lock(map_mutex);
+    LOG(1, "Adding " << _molecule_formula << " for " << _molid << " to MoleculeFormulaMap.");
     MoleculeFormulaMap.insert( std::make_pair( _molid, _molecule_formula) );
   }
 //  LOG(1, "Inserting molecule " << _mol->getId() << ": " << _mol);
-  _groupitem->appendRow(molItems);
+  return molItems;
 }
 
@@ -274,5 +281,7 @@
   QStandardItem *groupItem = NULL;
 
-  const std::string molecule_formula = _mol->getFormula().toString();
+  // create molecule items and obtain the molecule's formula
+  std::string molecule_formula;
+  QList<QStandardItem *> molItems = createMoleculeItems(_mol->getId(), molecule_formula);
 
   // new molecule type -> create new group
@@ -296,7 +305,5 @@
       "QtMoleculeList::addMolecule() - item with id "+toString(_mol->getId())
       +" has no parent?");
-
-  // add molecule
-  addMoleculeItem(groupItem, _mol->getId(), molecule_formula);
+  groupItem->appendRow(molItems);
 
   return molecule_formula;
@@ -552,25 +559,20 @@
       "QtMoleculeList::readdItem() - mol item at "+toString(_molitem->index().row())
       +" does not have a groupitem?");
-  const molecule * const mol = _molitem->getMolecule();
+  // get updated formula from the item
+  QStandardItem *formulaitem =
+      _molitem->parent()->child(_molitem->index().row(), QtMoleculeItem::FORMULA);
+  const std::string molecule_formula = formulaitem->text().toStdString();
   QList<QStandardItem *> mol_row = _molitem->parent()->takeRow(_molitem->index().row());
   // ..  and re-add where new formula fits
-  std::string molecule_formula;
-  if (mol != NULL) {
-    molecule_formula = mol->getFormula().toString();
-    if (!isGroupItemPresent(molecule_formula)) {
-      // add new group item and formula entry
-       addGroupItem(groupitem, molecule_formula);
-    } else {
-      groupitem = FormulaToGroupItem(molecule_formula);
-    }
-    ASSERT( groupitem != NULL,
-        "QtMoleculeList::readdItem() - failed to create a sensible new groupitem");
-    // finally add again
-    groupitem->appendRow(mol_row);
+  if (!isGroupItemPresent(molecule_formula)) {
+    // add new group item and formula entry
+     addGroupItem(groupitem, molecule_formula);
   } else {
-    for (QList<QStandardItem *>::iterator iter = mol_row.begin();
-        iter != mol_row.end(); ++iter)
-      delete *iter;
-  }
+    groupitem = FormulaToGroupItem(molecule_formula);
+  }
+  ASSERT( groupitem != NULL,
+      "QtMoleculeList::readdItem() - failed to create a sensible new groupitem");
+  // finally add again
+  groupitem->appendRow(mol_row);
 
   return molecule_formula;
Index: src/UIElements/Views/Qt4/MoleculeList/QtMoleculeList.hpp
===================================================================
--- src/UIElements/Views/Qt4/MoleculeList/QtMoleculeList.hpp	(revision 015f8c18d74c335a5af0741c3ff7f82dfcbfa0d1)
+++ src/UIElements/Views/Qt4/MoleculeList/QtMoleculeList.hpp	(revision a39d72c6d5edf5fa534720d234e4a54c6dcfc17a)
@@ -101,5 +101,5 @@
   std::string addMolecule(const molecule * const _mol);
   void addGroupItem(QStandardItem *&mainitem, const std::string &_molecule_formula);
-  void addMoleculeItem(QStandardItem *_groupitem, const moleculeId_t _molid, const std::string &molecule_formula);
+  QList<QStandardItem *> createMoleculeItems(const moleculeId_t _molid, std::string &molecule_formula);
   void removeMoleculeItem(QtMoleculeItem * const _item);
   int setOccurrence(QStandardItem * const _groupitem);
Index: src/UIElements/Views/Qt4/MoleculeList/QtMoleculeListView.cpp
===================================================================
--- src/UIElements/Views/Qt4/MoleculeList/QtMoleculeListView.cpp	(revision 015f8c18d74c335a5af0741c3ff7f82dfcbfa0d1)
+++ src/UIElements/Views/Qt4/MoleculeList/QtMoleculeListView.cpp	(revision a39d72c6d5edf5fa534720d234e4a54c6dcfc17a)
@@ -163,12 +163,14 @@
 
   const QtMoleculeList *moleculelist = dynamic_cast<const QtMoleculeList *>(model());
-  QModelIndex index = moleculelist->MoleculeIdToIndex(_id);
-  ASSERT( !selectionModel()->isSelected(index),
-      "QtMoleculeListView::MoleculeSelected() - row to molecule "
-      +toString(_id)+" is already selected.");
-
-  // select the full row
-  expand(index);
-  selectionModel()->select(index, QItemSelectionModel::Select | QItemSelectionModel::Rows);
+  if (moleculelist->isMoleculeItemPresent(_id)) {
+    QModelIndex index = moleculelist->MoleculeIdToIndex(_id);
+//    ASSERT( !selectionModel()->isSelected(index),
+//        "QtMoleculeListView::MoleculeSelected() - row to molecule "
+//        +toString(_id)+" is already selected.");
+
+    // select the full row
+    expand(index);
+    selectionModel()->select(index, QItemSelectionModel::Select | QItemSelectionModel::Rows);
+  }
 
   selecting = false;
@@ -183,12 +185,14 @@
 
   const QtMoleculeList *moleculelist = dynamic_cast<const QtMoleculeList *>(model());
-  QModelIndex index = moleculelist->MoleculeIdToIndex(_id);
-  ASSERT( selectionModel()->isSelected(index),
-      "QtMoleculeListView::MoleculeSelected() - row to molecule "
-      +toString(_id)+" is already unselected.");
-
-  // unselect the full row
-  expand(index);
-  selectionModel()->select(index, QItemSelectionModel::Deselect | QItemSelectionModel::Rows);
+  if (moleculelist->isMoleculeItemPresent(_id)) {
+    QModelIndex index = moleculelist->MoleculeIdToIndex(_id);
+//    ASSERT( selectionModel()->isSelected(index),
+//        "QtMoleculeListView::MoleculeSelected() - row to molecule "
+//        +toString(_id)+" is already unselected.");
+
+    // unselect the full row
+    expand(index);
+    selectionModel()->select(index, QItemSelectionModel::Deselect | QItemSelectionModel::Rows);
+  }
 
   selecting = false;
Index: src/UIElements/Views/Qt4/Qt3D/GLMoleculeObject_atom.cpp
===================================================================
--- src/UIElements/Views/Qt4/Qt3D/GLMoleculeObject_atom.cpp	(revision 015f8c18d74c335a5af0741c3ff7f82dfcbfa0d1)
+++ src/UIElements/Views/Qt4/Qt3D/GLMoleculeObject_atom.cpp	(revision a39d72c6d5edf5fa534720d234e4a54c6dcfc17a)
@@ -110,4 +110,6 @@
   resetElement();
 
+  m_selected = const_cast<const World &>(World::getInstance()).isAtomSelected(_id);
+
   // sign On
   activateObserver();
Index: src/UIElements/Views/Qt4/Qt3D/GLMoleculeObject_molecule.cpp
===================================================================
--- src/UIElements/Views/Qt4/Qt3D/GLMoleculeObject_molecule.cpp	(revision 015f8c18d74c335a5af0741c3ff7f82dfcbfa0d1)
+++ src/UIElements/Views/Qt4/Qt3D/GLMoleculeObject_molecule.cpp	(revision a39d72c6d5edf5fa534720d234e4a54c6dcfc17a)
@@ -146,4 +146,6 @@
   setMaterial(getMaterial(1));
 
+  m_selected = const_cast<const World &>(World::getInstance()).isMoleculeSelected(_molid);
+
   // initially, atoms and bonds should be visible
   m_visible = false;
@@ -212,4 +214,6 @@
   setMaterial(getMaterial(1));
 
+  m_selected = const_cast<const World &>(World::getInstance()).isMoleculeSelected(_molid);
+
   // initially, atoms and bonds should be visible
   m_visible = false;
@@ -459,10 +463,11 @@
 {
   AtomNodeMap::iterator iter = AtomsinSceneMap.find(_id);
-  ASSERT( iter != AtomsinSceneMap.end(),
-      "GLMoleculeObject_molecule::AtomSelected() - atom "+toString(_id)
-      +" unknown to GLMoleculeObject_molecule.");
-  QMetaObject::invokeMethod(iter->second,        // pointer to a QObject
+  if (iter != AtomsinSceneMap.end())
+    QMetaObject::invokeMethod(iter->second,        // pointer to a QObject
                             "Selected",       // member name (no parameters here)
                             Qt::QueuedConnection);     // connection type
+  else
+    ELOG(2, "GLMoleculeObject_molecule::AtomSelected() - atom "
+        << _id << " unknown to GLMoleculeObject_molecule.");
 }
 
@@ -470,10 +475,10 @@
 {
   AtomNodeMap::iterator iter = AtomsinSceneMap.find(_id);
-  ASSERT( iter != AtomsinSceneMap.end(),
-      "GLMoleculeObject_molecule::AtomUnselected() - atom "+toString(_id)
-      +" unknown to GLMoleculeObject_molecule.");
-  QMetaObject::invokeMethod(iter->second,        // pointer to a QObject
+  if (iter != AtomsinSceneMap.end())
+    QMetaObject::invokeMethod(iter->second,        // pointer to a QObject
                             "Unselected",       // member name (no parameters here)
                             Qt::QueuedConnection);     // connection type
+  else ELOG(2,  "GLMoleculeObject_molecule::AtomUnselected() - atom "
+      << _id << " unknown to GLMoleculeObject_molecule.");
 }
 
@@ -567,6 +572,5 @@
         break;
     }
-  } else
-    ASSERT(0, "GLMoleculeObject_molecule::recieveNotification() - received notification from unexpected source.");
+  }
 }
 
Index: src/UIElements/Views/Qt4/Qt3D/GLWorldScene.cpp
===================================================================
--- src/UIElements/Views/Qt4/Qt3D/GLWorldScene.cpp	(revision 015f8c18d74c335a5af0741c3ff7f82dfcbfa0d1)
+++ src/UIElements/Views/Qt4/Qt3D/GLWorldScene.cpp	(revision a39d72c6d5edf5fa534720d234e4a54c6dcfc17a)
@@ -482,11 +482,12 @@
 {
   MoleculeNodeMap::iterator iter = MoleculesinSceneMap.find(_molid);
-  ASSERT( iter != MoleculesinSceneMap.end(),
-      "GLWorldScene::AtomSelected() - molecule "+toString(_molid)
-      +" unknown to GLWorldScene.");
-  QMetaObject::invokeMethod(iter->second,        // pointer to a QObject
+  if (iter != MoleculesinSceneMap.end())
+    QMetaObject::invokeMethod(iter->second,        // pointer to a QObject
                             "AtomSelected",       // member name (no parameters here)
                             Qt::QueuedConnection,     // connection type
                             Q_ARG(const atomId_t, _id));     // parameters
+  else
+    ELOG(2, "DEBUG: GLWorldScene::AtomSelected() - molecule " <<
+        _molid << " unknown to GLWorldScene.");
 }
 
@@ -494,11 +495,12 @@
 {
   MoleculeNodeMap::iterator iter = MoleculesinSceneMap.find(_molid);
-  ASSERT( iter != MoleculesinSceneMap.end(),
-      "GLWorldScene::AtomUnselected() - molecule "+toString(_molid)
-      +" unknown to GLWorldScene.");
-  QMetaObject::invokeMethod(iter->second,        // pointer to a QObject
+  if (iter != MoleculesinSceneMap.end())
+    QMetaObject::invokeMethod(iter->second,        // pointer to a QObject
                             "AtomUnselected",       // member name (no parameters here)
                             Qt::QueuedConnection,     // connection type
                             Q_ARG(const atomId_t, _id));     // parameters
+  else
+    ELOG(2, "GLWorldScene::AtomUnselected() - molecule "
+        << _molid << " unknown to GLWorldScene.");
 }
 
@@ -506,10 +508,11 @@
 {
   MoleculeNodeMap::iterator iter = MoleculesinSceneMap.find(_molid);
-  ASSERT( iter != MoleculesinSceneMap.end(),
-      "GLWorldScene::MoleculeSelected() - molecule "+toString(_molid)
-      +" unknown to GLWorldScene.");
-  QMetaObject::invokeMethod(iter->second,        // pointer to a QObject
+  if (iter != MoleculesinSceneMap.end())
+    QMetaObject::invokeMethod(iter->second,        // pointer to a QObject
                             "Selected",       // member name (no parameters here)
                             Qt::QueuedConnection);     // connection type
+  else
+    ELOG(2, "GLWorldScene::MoleculeSelected() - molecule "
+        << _molid << " unknown to GLWorldScene.");
 }
 
@@ -517,9 +520,10 @@
 {
   MoleculeNodeMap::iterator iter = MoleculesinSceneMap.find(_molid);
-  ASSERT( iter != MoleculesinSceneMap.end(),
-      "GLWorldScene::MoleculeUnselected() - molecule "+toString(_molid)
-      +" unknown to GLWorldScene.");
-  QMetaObject::invokeMethod(iter->second,        // pointer to a QObject
+  if (iter != MoleculesinSceneMap.end())
+    QMetaObject::invokeMethod(iter->second,        // pointer to a QObject
                             "Unselected",       // member name (no parameters here)
                             Qt::QueuedConnection);     // connection type
-}
+  else
+    ELOG(2, "GLWorldScene::MoleculeUnselected() - molecule "
+        << _molid << " unknown to GLWorldScene.");
+}
