Index: src/UIElements/Qt4/InstanceBoard/QtObservedInstanceBoard.cpp
===================================================================
--- src/UIElements/Qt4/InstanceBoard/QtObservedInstanceBoard.cpp	(revision 1a58ce8105d4937e5093f614ba56c6d4688852bc)
+++ src/UIElements/Qt4/InstanceBoard/QtObservedInstanceBoard.cpp	(revision 3054f4a837e9cb89d591549c873572989e548c33)
@@ -276,7 +276,17 @@
 }
 
+QtObservedAtom::ptr QtObservedInstanceBoard::getObservedAtom(ObservedValue_Index_t _id)
+{
+  return atomObservedValues.get(_id);
+}
+
 QtObservedMolecule::ptr QtObservedInstanceBoard::getObservedMolecule(const moleculeId_t _id)
 {
   return moleculeObservedValues.get(moleculeids_lookup.left.at(_id));
+}
+
+QtObservedMolecule::ptr QtObservedInstanceBoard::getObservedMolecule(ObservedValue_Index_t _id)
+{
+  return moleculeObservedValues.get(_id);
 }
 
Index: src/UIElements/Qt4/InstanceBoard/QtObservedInstanceBoard.hpp
===================================================================
--- src/UIElements/Qt4/InstanceBoard/QtObservedInstanceBoard.hpp	(revision 1a58ce8105d4937e5093f614ba56c6d4688852bc)
+++ src/UIElements/Qt4/InstanceBoard/QtObservedInstanceBoard.hpp	(revision 3054f4a837e9cb89d591549c873572989e548c33)
@@ -84,5 +84,7 @@
 
   QtObservedAtom::ptr getObservedAtom(const atomId_t _id);
+  QtObservedAtom::ptr getObservedAtom(ObservedValue_Index_t _id);
   QtObservedMolecule::ptr getObservedMolecule(const moleculeId_t _id);
+  QtObservedMolecule::ptr getObservedMolecule(ObservedValue_Index_t _id);
   void markObservedAtomAsConnected(ObservedValue_Index_t _id);
   void markObservedAtomAsDisconnected(ObservedValue_Index_t _id);
Index: src/UIElements/Views/Qt4/ElementList/QtElementList.cpp
===================================================================
--- src/UIElements/Views/Qt4/ElementList/QtElementList.cpp	(revision 1a58ce8105d4937e5093f614ba56c6d4688852bc)
+++ src/UIElements/Views/Qt4/ElementList/QtElementList.cpp	(revision 3054f4a837e9cb89d591549c873572989e548c33)
@@ -104,6 +104,6 @@
   connect(&atomobserver, SIGNAL(AtomInserted(const QtObservedAtom::ptr)),
       this, SLOT(addAtomElement(const QtObservedAtom::ptr)));
-  connect(&atomobserver, SIGNAL(AtomRemoved(const atomId_t)),
-      this, SLOT(removeAtomElement(const atomId_t)));
+  connect(&atomobserver, SIGNAL(AtomRemoved(ObservedValue_Index_t)),
+      this, SLOT(removeAtomElement(ObservedValue_Index_t)));
   connect(this,SIGNAL(itemSelectionChanged()),this,SLOT(rowSelected()));
 //  connect(this,SIGNAL(changed()),this,SLOT(update()));
@@ -120,5 +120,5 @@
   const atomicNumber_t newelement = _atom->getAtomElement();
   atomicNumber_t oldelement = -1;
-  const atomId_t atomid = _atom->getAtomIndex();
+  const ObservedValue_Index_t atomid = _atom->getIndex();
   QTreeWidgetItem *newtreeItem = topLevelItem(newelement-1);
   ASSERT( newtreeItem != NULL,
@@ -168,11 +168,11 @@
 }
 
-void QtElementList::removeAtomElement(const atomId_t _atomid)
+void QtElementList::removeAtomElement(ObservedValue_Index_t _id)
 {
   boost::recursive_mutex::scoped_lock lock(refill_mutex);
 
-  const AtomElementMap_t::iterator iter = AtomElementMap.find(_atomid);
+  const AtomElementMap_t::iterator iter = AtomElementMap.find(_id);
   ASSERT (iter != AtomElementMap.end(),
-      "QtElementList::addAtomElement() - atom #"+toString(_atomid)
+      "QtElementList::addAtomElement() - atom #"+toString(_id)
       +" is not present in elementlookup map.");
   if (iter != AtomElementMap.end()) {
Index: src/UIElements/Views/Qt4/ElementList/QtElementList.hpp
===================================================================
--- src/UIElements/Views/Qt4/ElementList/QtElementList.hpp	(revision 1a58ce8105d4937e5093f614ba56c6d4688852bc)
+++ src/UIElements/Views/Qt4/ElementList/QtElementList.hpp	(revision 3054f4a837e9cb89d591549c873572989e548c33)
@@ -46,9 +46,9 @@
   void changeElement(const QtObservedAtom::ptr _atom);
   void addAtomElement(const QtObservedAtom::ptr _atom);
-  void removeAtomElement(const atomId_t _atom);
+  void removeAtomElement(ObservedValue_Index_t _id);
 
 private:
   std::vector<bool> elementSelection; //!< needed to determine when a selection changes
-  typedef std::map<const atomId_t, atomicNumber_t> AtomElementMap_t;
+  typedef std::map<ObservedValue_Index_t, atomicNumber_t> AtomElementMap_t;
   AtomElementMap_t AtomElementMap;
   bool dirty;
Index: src/UIElements/Views/Qt4/ElementList/QtObservedAtomObserver.cpp
===================================================================
--- src/UIElements/Views/Qt4/ElementList/QtObservedAtomObserver.cpp	(revision 1a58ce8105d4937e5093f614ba56c6d4688852bc)
+++ src/UIElements/Views/Qt4/ElementList/QtObservedAtomObserver.cpp	(revision 3054f4a837e9cb89d591549c873572989e548c33)
@@ -47,6 +47,6 @@
     connect(_board, SIGNAL(atomInserted(QtObservedAtom::ptr)),
         this, SLOT(atomInserted(QtObservedAtom::ptr)));
-    connect(_board, SIGNAL(atomRemoved(const atomId_t)),
-        this, SLOT(atomRemoved(const atomId_t)));
+    connect(_board, SIGNAL(atomRemoved(ObservedValue_Index_t)),
+        this, SLOT(atomRemoved(ObservedValue_Index_t)));
 }
 
@@ -63,9 +63,9 @@
 }
 
-void QtObservedAtomObserver::atomRemoved(const atomId_t _atomid)
+void QtObservedAtomObserver::atomRemoved(ObservedValue_Index_t _index)
 {
-  const QtObservedAtom::ptr walker = board->getObservedAtom(_atomid);
+  const QtObservedAtom::ptr walker = board->getObservedAtom(_index);
   disconnect( walker.get(), SIGNAL(elementChanged()), this, SLOT(elementChanged()));
-  emit AtomRemoved(_atomid);
+  emit AtomRemoved(_index);
 }
 
Index: src/UIElements/Views/Qt4/ElementList/QtObservedAtomObserver.hpp
===================================================================
--- src/UIElements/Views/Qt4/ElementList/QtObservedAtomObserver.hpp	(revision 1a58ce8105d4937e5093f614ba56c6d4688852bc)
+++ src/UIElements/Views/Qt4/ElementList/QtObservedAtomObserver.hpp	(revision 3054f4a837e9cb89d591549c873572989e548c33)
@@ -44,5 +44,5 @@
   // relayed signals
   void AtomInserted(const QtObservedAtom::ptr _atom);
-  void AtomRemoved(const atomId_t _atomid);
+  void AtomRemoved(ObservedValue_Index_t _index);
 
 private slots:
@@ -51,5 +51,5 @@
 
   void atomInserted(const QtObservedAtom::ptr _atom);
-  void atomRemoved(const atomId_t _atomid);
+  void atomRemoved(ObservedValue_Index_t _index);
 
 private:
Index: src/UIElements/Views/Qt4/MoleculeList/QtMoleculeItem.hpp
===================================================================
--- src/UIElements/Views/Qt4/MoleculeList/QtMoleculeItem.hpp	(revision 1a58ce8105d4937e5093f614ba56c6d4688852bc)
+++ src/UIElements/Views/Qt4/MoleculeList/QtMoleculeItem.hpp	(revision 3054f4a837e9cb89d591549c873572989e548c33)
@@ -60,6 +60,6 @@
    * \return id of the observed molecule
    */
-  virtual const moleculeId_t getMoleculeId() const
-  { return -1; }
+  virtual ObservedValue_Index_t getMoleculeIndex() const
+  { return NULL; }
 };
 
Index: src/UIElements/Views/Qt4/MoleculeList/QtMoleculeList.cpp
===================================================================
--- src/UIElements/Views/Qt4/MoleculeList/QtMoleculeList.cpp	(revision 1a58ce8105d4937e5093f614ba56c6d4688852bc)
+++ src/UIElements/Views/Qt4/MoleculeList/QtMoleculeList.cpp	(revision 3054f4a837e9cb89d591549c873572989e548c33)
@@ -81,6 +81,6 @@
   connect(&observer, SIGNAL(MoleculeInserted(QtObservedMolecule::ptr)),
       this, SLOT(moleculeInserted(QtObservedMolecule::ptr)));
-  connect(&observer, SIGNAL(MoleculeRemoved(const moleculeId_t)),
-      this, SLOT(moleculeRemoved(const moleculeId_t)));
+  connect(&observer, SIGNAL(MoleculeRemoved(ObservedValue_Index_t)),
+      this, SLOT(moleculeRemoved(ObservedValue_Index_t)));
   connect(&observer, SIGNAL(FormulaChanged(const QtObservedMolecule::ptr)),
       this, SLOT(formulaChanged(const QtObservedMolecule::ptr)));
@@ -89,6 +89,4 @@
   connect(&observer, SIGNAL(AtomCountChanged(const QtObservedMolecule::ptr)),
       this, SLOT(atomcountChanged(const QtObservedMolecule::ptr)));
-  connect(board, SIGNAL(moleculeIndexChanged(const moleculeId_t,const moleculeId_t)),
-      this, SLOT(moleculeIndexChanged(const moleculeId_t, const moleculeId_t)));
 }
 
@@ -116,5 +114,5 @@
 }
 
-void QtMoleculeList::moleculeRemoved(const moleculeId_t _id)
+void QtMoleculeList::moleculeRemoved(ObservedValue_Index_t _id)
 {
   LOG(1, "Removing molecule " << _id);
@@ -136,68 +134,5 @@
 }
 
-template<class T>
-void exchangeKeys(
-    T &_container,
-    const moleculeId_t _oldid,
-    const moleculeId_t _newid)
-{
-  typename T::iterator iter = _container.find(_oldid);
-  ASSERT(_container.find(_newid) == _container.end(),
-      "exchangeKeys() - new id "+toString(_newid)
-      +" already exists in container.");
-  _container.insert( std::make_pair(_newid, iter->second) );
-  _container.erase(iter);
-}
-
-template<class T>
-void exchangeKeysInSet(
-    T &_container,
-    const moleculeId_t _oldid,
-    const moleculeId_t _newid)
-{
-  typename T::iterator iter = _container.find(_oldid);
-  ASSERT(_container.find(_newid) == _container.end(),
-      "exchangeKeys() - new id "+toString(_newid)
-      +" already exists in container.");
-  _container.insert( _newid );
-  _container.erase(iter);
-}
-
-template<class T>
-void exchangeKeysOverAllColumns(
-    T &_container,
-    const moleculeId_t _oldid,
-    const moleculeId_t _newid)
-{
-  for (int i=0;i<QtMoleculeItem::COLUMNTYPES_MAX;++i) {
-    typename T::iterator iter =
-        _container.find( std::make_pair(_oldid, (enum QtMoleculeItem::COLUMNTYPES)i) );
-    if (iter == _container.end())
-      continue;
-    ASSERT(_container.find( std::make_pair(_newid,(enum QtMoleculeItem::COLUMNTYPES)i) ) == _container.end(),
-        "exchangeKeys() - new id "+toString(_newid)
-        +" already exists in container.");
-    _container.insert( std::make_pair(_newid, (enum QtMoleculeItem::COLUMNTYPES)i) );
-    _container.erase(iter);
-  }
-}
-
-void QtMoleculeList::moleculeIndexChanged(
-    const moleculeId_t _oldid,
-    const moleculeId_t _newid)
-{
-  // go through all list and change keys
-  exchangeKeys(MoleculeFormulaMap, _oldid, _newid);
-  {
-    MoleculeItemBiMap_t::left_iterator iter = MoleculeItemBiMap.left.find(_oldid);
-    ASSERT(MoleculeItemBiMap.left.count(_newid),
-        "QtMoleculeList::moleculeIndexChanged() - new id "+toString(_newid)
-        +" already exists in MoleculeItemBiMap.");
-    MoleculeItemBiMap.left.insert( std::make_pair(_newid, iter->second) );
-    MoleculeItemBiMap.left.erase(iter);
-  }
-}
-
-bool QtMoleculeList::isMoleculeItemPresent(const moleculeId_t _molid) const
+bool QtMoleculeList::isMoleculeItemPresent(ObservedValue_Index_t _molid) const
 {
   MoleculeItemBiMap_t::left_const_iterator iter =
@@ -206,5 +141,5 @@
 }
 
-QtMoleculeItem * QtMoleculeList::MoleculeIdToItem(const moleculeId_t _molid) const
+QtMoleculeItem * QtMoleculeList::MoleculeIdToItem(ObservedValue_Index_t _molid) const
 {
   MoleculeItemBiMap_t::left_const_iterator iter =
@@ -212,9 +147,9 @@
   ASSERT( iter != MoleculeItemBiMap.left.end(),
       "QtMoleculeList::MoleculeIdToItem() - could not find item to id "
-      +toString(_molid));
+      +toString(observer.getIdtoIndex(_molid)));
   return iter->second;
 }
 
-const moleculeId_t QtMoleculeList::ItemToMoleculeId(const QtMoleculeItem * const _item) const
+ObservedValue_Index_t QtMoleculeList::ItemToMoleculeId(const QtMoleculeItem * const _item) const
 {
   const MoleculeItemBiMap_t::right_const_iterator iter =
@@ -223,5 +158,5 @@
     return iter->second;
   else
-    return -1;
+    return NULL;
 }
 
@@ -271,18 +206,18 @@
 }
 
-const QModelIndex QtMoleculeList::MoleculeIdToIndex(const moleculeId_t _id) const
+const QModelIndex QtMoleculeList::MoleculeIdToIndex(ObservedValue_Index_t _id) const
 {
   QtMoleculeItem * const item = MoleculeIdToItem(_id);
   ASSERT(item != NULL,
       "QtMoleculeList::MoleculeIdToIndex() - could not find item to "
-      +toString(_id));
+      +toString(observer.getIdtoIndex(_id)));
   return indexFromItem(item);
 }
 
-const moleculeId_t QtMoleculeList::IndexToMoleculeId(const QModelIndex &_index) const
+ObservedValue_Index_t QtMoleculeList::IndexToMoleculeId(const QModelIndex &_index) const
 {
   QtMoleculeItem * const item = dynamic_cast<QtMoleculeItem *>(itemFromIndex(_index));
   if (item == NULL)
-    return -1;
+    return NULL;
   else
     return ItemToMoleculeId(item);
@@ -311,5 +246,5 @@
   ASSERT( mol_item != NULL,
       "QtMoleculeList::createMoleculeItems() - item from factory was not a QtMoleculeItem?");
-  MoleculeItemBiMap.left.insert( std::make_pair(_ObservedMolecule->getMolIndex(), mol_item) );
+  MoleculeItemBiMap.left.insert( std::make_pair(_ObservedMolecule->getIndex(), mol_item) );
 
   QStandardItem *formulaitem = molItems.at(QtMoleculeItem::FORMULA);
@@ -320,5 +255,5 @@
   LOG(1, "Adding " << _molecule_formula << " for "
       << _ObservedMolecule->getMolIndex() << " to MoleculeFormulaMap.");
-  MoleculeFormulaMap.insert( std::make_pair( _ObservedMolecule->getMolIndex(), _molecule_formula) );
+  MoleculeFormulaMap.insert( std::make_pair( _ObservedMolecule->getIndex(), _molecule_formula) );
 //  LOG(1, "Inserting molecule " << _molid << ": " << _molecule_formula);
   return molItems;
@@ -375,5 +310,5 @@
       ASSERT( removeformulaiter != MoleculeFormulaMap.end(),
           "QtMoleculeList::removeMoleculeItem() - could not find id "
-          +toString(removeiter->second)+" in MoleculeFormulaMap.");
+          +toString(observer.getIdtoIndex(removeiter->second))+" in MoleculeFormulaMap.");
       LOG(1, "Removing " << removeformulaiter->second << " for "
           << removeformulaiter->first << " from MoleculeFormulaMap.");
@@ -404,5 +339,5 @@
 {
   const bool visible = _item->checkState();
-  const moleculeId_t molid = _item->getMoleculeId();
+  const ObservedValue_Index_t molid = _item->getMoleculeIndex();
   std::string molecule_formula("illegal");
   {
@@ -411,5 +346,5 @@
     ASSERT( formulaiter != MoleculeFormulaMap.end(),
         "QtMoleculeList::setVisibilityForMoleculeItem() - formula of molecule "
-        +toString(molid)+" unknown.");
+        +toString(observer.getIdtoIndex(molid))+" unknown.");
     molecule_formula = formulaiter->second;
   }
@@ -422,6 +357,6 @@
   QStandardItem *visgroupItem = getSpecificGroupItem(groupItem, QtMoleculeItem::VISIBILITY);
   ASSERT( groupItem != NULL,
-      "QtMoleculeList::setVisibilityForMoleculeItem() - item with id "
-      +toString(_item->getMoleculeId())+" has not parent?");
+      "QtMoleculeList::setVisibilityForMoleculeItem() - item to "
+      +toString(observer.getIdtoIndex(molid))+" has not parent?");
   // check whether we have to set the group item
 
@@ -439,5 +374,5 @@
   }
 
-  emit moleculesVisibilityChanged(_item->getMoleculeId(), visible);
+  emit moleculesVisibilityChanged(molid, visible);
 }
 
@@ -454,5 +389,5 @@
 
       // emit signal
-      emit moleculesVisibilityChanged(molItem->getMoleculeId(), visible);
+      emit moleculesVisibilityChanged(molItem->getMoleculeIndex(), visible);
     }
   }
@@ -505,5 +440,6 @@
     ASSERT( iter != MoleculeItemBiMap.right.end(),
         "QtMoleculeList::moleculeChanged() - name of unknown molecule changed.");
-    const moleculeId_t molid = iter->second;
+    const ObservedValue_Index_t index = iter->second;
+    const moleculeId_t molid = board->getMoleculeIdToIndex(index);
     // change the name
     std::string cellValue = item->text().toStdString();
@@ -517,6 +453,9 @@
       AQ.queueAction("change-single-molecule-name", MoleCuilder::Action::NonInteractive);
     } else {
-      board->getObservedMolecule(
-          assert_cast<QtMoleculeItem *>(item)->getMoleculeId());
+      const QtObservedMolecule::ptr mol = board->getObservedMolecule(index);
+      if (mol) {
+        QtMoleculeItem * const molitem = assert_cast<QtMoleculeItem *>(item);
+        molitem->updateState(mol);
+      }
     }
   }
@@ -578,5 +517,5 @@
 {
   // we need the id as identifier to the item
-  const moleculeId_t molid = _mol->getMolIndex();
+  const ObservedValue_Index_t molid = _mol->getIndex();
   LOG(3, "DEBUG: QtMoleculeList got formulaChanged for id " << molid);
   QtMoleculeItem *const molitem = MoleculeIdToItem(molid);
@@ -589,10 +528,10 @@
   }
 
-  LOG(3, "DEBUG: Moving item to id " << molid);
+  LOG(3, "DEBUG: Moving item to id " << observer.getIdtoIndex(molid));
   const MoleculeFormulaMap_t::iterator formulaiter =
       MoleculeFormulaMap.find(molid);
   ASSERT( formulaiter != MoleculeFormulaMap.end(),
       "QtMoleculeList::updateItemStates() - formula of molecule "
-      +toString(molid)+" unknown.");
+      +toString(observer.getIdtoIndex(molid))+" unknown.");
   // we get old formula from stored map and new formula from the ObservedMolecule
   const std::string old_formula = formulaiter->second;
@@ -625,5 +564,5 @@
 {
   // we need the id as identifier to the items
-  const moleculeId_t molid = _mol->getMolIndex();
+  const ObservedValue_Index_t molid = _mol->getIndex();
   LOG(3, "DEBUG: QtMoleculeList got atomcountChanged for id " << molid);
   QtMoleculeItem *const molitem = MoleculeIdToItem(molid);
@@ -638,5 +577,5 @@
 {
   // we need the id as identifier to the items
-  const moleculeId_t molid = _mol->getMolIndex();
+  const ObservedValue_Index_t molid = _mol->getIndex();
   LOG(3, "DEBUG: QtMoleculeList got nameChanged for id " << molid);
   QtMoleculeItem *const molitem = MoleculeIdToItem(molid);
Index: src/UIElements/Views/Qt4/MoleculeList/QtMoleculeList.hpp
===================================================================
--- src/UIElements/Views/Qt4/MoleculeList/QtMoleculeList.hpp	(revision 1a58ce8105d4937e5093f614ba56c6d4688852bc)
+++ src/UIElements/Views/Qt4/MoleculeList/QtMoleculeList.hpp	(revision 3054f4a837e9cb89d591549c873572989e548c33)
@@ -56,19 +56,18 @@
 
 signals:
-  void moleculesVisibilityChanged(const moleculeId_t, bool);
+  void moleculesVisibilityChanged(ObservedValue_Index_t, bool);
 
 private slots:
   void moleculeInserted(QtObservedMolecule::ptr _mol);
-  void moleculeRemoved(const moleculeId_t _id);
-  void moleculeIndexChanged(const moleculeId_t _oldid, const moleculeId_t _newid);
+  void moleculeRemoved(ObservedValue_Index_t _id);
 
 private:
   friend class QtMoleculeListView;
 
-  bool isMoleculeItemPresent(const moleculeId_t _molid) const;
-  QtMoleculeItem * MoleculeIdToItem(const moleculeId_t _molid) const;
-  const moleculeId_t ItemToMoleculeId(const QtMoleculeItem * const _item) const;
-  const QModelIndex MoleculeIdToIndex(const moleculeId_t _id) const;
-  const moleculeId_t IndexToMoleculeId(const QModelIndex &_index) const;
+  bool isMoleculeItemPresent(ObservedValue_Index_t _id) const;
+  QtMoleculeItem * MoleculeIdToItem(ObservedValue_Index_t _id) const;
+  ObservedValue_Index_t ItemToMoleculeId(const QtMoleculeItem * const _item) const;
+  const QModelIndex MoleculeIdToIndex(ObservedValue_Index_t _id) const;
+  ObservedValue_Index_t IndexToMoleculeId(const QModelIndex &_index) const;
   QtMoleculeItem * getSpecificMoleculeItem(
       const QtMoleculeItem * const _item,
@@ -107,14 +106,10 @@
   FormulaTreeItemBiMap_t FormulaItemBiMap;
 
-  typedef std::map<moleculeId_t, std::string> MoleculeFormulaMap_t;
+  typedef std::map<ObservedValue_Index_t, std::string> MoleculeFormulaMap_t;
   //!> map of (unique) formulas in the world
   MoleculeFormulaMap_t MoleculeFormulaMap;
 
-  typedef boost::bimap<moleculeId_t, QtMoleculeItem*> MoleculeItemBiMap_t;
+  typedef boost::bimap<ObservedValue_Index_t, QtMoleculeItem*> MoleculeItemBiMap_t;
   MoleculeItemBiMap_t MoleculeItemBiMap;
-
-  typedef std::set< moleculeId_t > list_of_molecules_t;
-  typedef std::set< std::pair<moleculeId_t, QtMoleculeItem::COLUMNTYPES> > list_of_molecule_items_t;
-  typedef std::set< std::pair<std::string, QtMoleculeItem::COLUMNTYPES> > list_of_group_items_t;
 
   //!> listens to all QtObservedMolecule and relays important events to us
Index: src/UIElements/Views/Qt4/MoleculeList/QtMoleculeListView.cpp
===================================================================
--- src/UIElements/Views/Qt4/MoleculeList/QtMoleculeListView.cpp	(revision 1a58ce8105d4937e5093f614ba56c6d4688852bc)
+++ src/UIElements/Views/Qt4/MoleculeList/QtMoleculeListView.cpp	(revision 3054f4a837e9cb89d591549c873572989e548c33)
@@ -42,9 +42,6 @@
 #include "CodePatterns/MemDebug.hpp"
 
-#include "CodePatterns/Observer/Notification.hpp"
-
 #include "Actions/SelectionAction/Molecules/MoleculeByIdAction.hpp"
 #include "Actions/SelectionAction/Molecules/NotMoleculeByIdAction.hpp"
-#include "MoleculeObserver.hpp"
 #include "molecule.hpp"
 #include "World.hpp"
@@ -52,5 +49,4 @@
 QtMoleculeListView::QtMoleculeListView(QWidget * _parent) :
   QTreeView(_parent),
-  Observer("QtMoleculeListView"),
   selecting(false)
 {
@@ -58,11 +54,8 @@
 
   qRegisterMetaType<QItemSelection>("QItemSelection");
-
-  MoleculeObserver::getInstance().signOn(this, molecule::SelectionChanged);
 }
 
 QtMoleculeListView::~QtMoleculeListView()
 {
-  MoleculeObserver::getInstance().signOff(this, molecule::SelectionChanged);
 }
 
@@ -74,8 +67,8 @@
       selectionModel(), SIGNAL(selectionChanged(const QItemSelection &, const QItemSelection &)),
       this, SLOT(rowsSelected(const QItemSelection &, const QItemSelection &)), Qt::DirectConnection);
-}
-
-void QtMoleculeListView::update(Observable *publisher)
-{}
+
+  connect(&_moleculelist->observer, SIGNAL(SelectionChanged(QtObservedMolecule::ptr)),
+      this, SLOT(selectionChanged(QtObservedMolecule::ptr)));
+}
 
 QModelIndex QtMoleculeListView::setIndexToLastColumn(const QModelIndex &_index) const
@@ -110,5 +103,6 @@
     foreach (index, items)
       if ((index.column() == 0) && (selectionModel()->isSelected(index))) {
-        const moleculeId_t mol_id = moleculelist->IndexToMoleculeId(index);
+        const moleculeId_t mol_id = moleculelist->observer.getIdtoIndex(
+            moleculelist->IndexToMoleculeId(index));
         const molecule * const mol = const_cast<const World &>(World::getInstance()).
             getMolecule(MoleculeById(mol_id));
@@ -134,5 +128,6 @@
     foreach (index, items)
       if ((index.column() == 0) && (!selectionModel()->isSelected(index))) {
-        const moleculeId_t mol_id = moleculelist->IndexToMoleculeId(index);
+        const moleculeId_t mol_id = moleculelist->observer.getIdtoIndex(
+            moleculelist->IndexToMoleculeId(index));
         const molecule * const mol = const_cast<const World &>(World::getInstance()).
             getMolecule(MoleculeById(mol_id));
@@ -154,5 +149,13 @@
 }
 
-void QtMoleculeListView::MoleculeSelected(const moleculeId_t _id)
+void QtMoleculeListView::selectionChanged(const QtObservedMolecule::ptr _molecule)
+{
+  if (_molecule->getMolSelected())
+    MoleculeSelected(_molecule->getIndex());
+  else
+    MoleculeUnselected(_molecule->getIndex());
+}
+
+void QtMoleculeListView::MoleculeSelected(ObservedValue_Index_t _id)
 {
   if (selecting)
@@ -166,5 +169,5 @@
 //    ASSERT( !selectionModel()->isSelected(index),
 //        "QtMoleculeListView::MoleculeSelected() - row to molecule "
-//        +toString(_id)+" is already selected.");
+//        +toString(mol->getMolIndex())+" is already selected.");
 
     // select the full row
@@ -176,5 +179,5 @@
 }
 
-void QtMoleculeListView::MoleculeUnselected(const moleculeId_t _id)
+void QtMoleculeListView::MoleculeUnselected(ObservedValue_Index_t _id)
 {
   if (selecting)
@@ -188,5 +191,5 @@
 //    ASSERT( selectionModel()->isSelected(index),
 //        "QtMoleculeListView::MoleculeSelected() - row to molecule "
-//        +toString(_id)+" is already unselected.");
+//        +toString(mol->getMolIndex())+" is already unselected.");
 
     // unselect the full row
@@ -197,75 +200,2 @@
   selecting = false;
 }
-
-
-void QtMoleculeListView::recieveNotification(Observable *publisher, Notification_ptr notification)
-{
-  if (dynamic_cast<World *>(publisher) != NULL) {
-    switch (notification->getChannelNo()) {
-      case World::SelectionChanged:
-      {
-        // obtain molecule selection from World and go through our selection step by step
-        const std::vector<const molecule *> selectedMolecules =
-            const_cast<const World &>(World::getInstance()).getSelectedMolecules();
-        QItemSelection currently_selected = selectionModel()->selection();
-        QtMoleculeList *moleculelist = static_cast<QtMoleculeList *>(model());
-        QItemSelection selected;
-        QItemSelection deselected;
-        std::set<QModelIndex> already_selected_indices;
-        for (std::vector<const molecule *>::const_iterator iter = selectedMolecules.begin();
-            iter != selectedMolecules.end(); ++iter) {
-          if (moleculelist->isMoleculeItemPresent((*iter)->getId())) {
-            QtMoleculeItem *item = moleculelist->MoleculeIdToItem((*iter)->getId());
-            QModelIndex mol_index = item->index();
-            if (!currently_selected.contains(mol_index))
-                selected.select(mol_index, setIndexToLastColumn(mol_index));
-            else
-              already_selected_indices.insert(mol_index);
-          }
-        }
-        {
-          QModelIndex mol_index;
-          foreach(mol_index, currently_selected.indexes()) {
-            std::set<QModelIndex>::const_iterator iter =
-                already_selected_indices.find(mol_index);
-            if (iter == already_selected_indices.end())
-              deselected.select(mol_index, setIndexToLastColumn(mol_index));
-          }
-        }
-        selecting = true;
-        if (!selected.indexes().empty())
-          selectionModel()->select(selected, QItemSelectionModel::Select);
-        if (!deselected.indexes().empty())
-          selectionModel()->select(deselected, QItemSelectionModel::Deselect);
-        selecting = false;
-        break;
-      }
-      default:
-        ASSERT(0, "QtMoleculeListView::recieveNotification() - cannot get here, not subscribed to World's channel "
-            +toString(notification->getChannelNo()));
-        break;
-    }
-  } else if (dynamic_cast<molecule*>(publisher) != NULL) {
-    const molecule * const mol = dynamic_cast<molecule *>(publisher);
-    switch (notification->getChannelNo()) {
-      case molecule::SelectionChanged:
-      {
-        if (mol->getSelected())
-          MoleculeSelected(mol->getId());
-        else
-          MoleculeUnselected(mol->getId());
-        break;
-      }
-      default:
-        ASSERT(0, "QtMoleculeListView::recieveNotification() - cannot get here, not subscribed to mol's channel "
-            +toString(notification->getChannelNo()));
-        break;
-    }
-  } else {
-    ASSERT(0,
-        "QtMoleculeListView::recieveNotification() - cannot get here, unknown publisher "+toString(publisher));
-  }
-}
-
-void QtMoleculeListView::subjectKilled(Observable *publisher)
-{}
Index: src/UIElements/Views/Qt4/MoleculeList/QtMoleculeListView.hpp
===================================================================
--- src/UIElements/Views/Qt4/MoleculeList/QtMoleculeListView.hpp	(revision 1a58ce8105d4937e5093f614ba56c6d4688852bc)
+++ src/UIElements/Views/Qt4/MoleculeList/QtMoleculeListView.hpp	(revision 3054f4a837e9cb89d591549c873572989e548c33)
@@ -17,11 +17,12 @@
 #include <QTreeView>
 
-#include "CodePatterns/Observer/Observer.hpp"
+#include "types.hpp"
 
-#include "types.hpp"
+#include "UIElements/Qt4/InstanceBoard/ObservedValue_types.hpp"
+#include "UIElements/Qt4/InstanceBoard/QtObservedMolecule.hpp"
 
 class QtMoleculeList;
 
-class QtMoleculeListView : public QTreeView, public Observer
+class QtMoleculeListView : public QTreeView
 {
   Q_OBJECT
@@ -35,13 +36,9 @@
 public slots:
   void rowsSelected(const QItemSelection&, const QItemSelection&);
-
-protected:
-  virtual void update(Observable *publisher);
-  virtual void recieveNotification(Observable *publisher, Notification_ptr notification);
-  virtual void subjectKilled(Observable *publisher);
+  void selectionChanged(const QtObservedMolecule::ptr _molecule);
 
 private:
-  void MoleculeSelected(const moleculeId_t _id);
-  void MoleculeUnselected(const moleculeId_t _id);
+  void MoleculeSelected(ObservedValue_Index_t _id);
+  void MoleculeUnselected(ObservedValue_Index_t _id);
 
   QModelIndex setIndexToLastColumn(const QModelIndex &_index) const;
Index: src/UIElements/Views/Qt4/MoleculeList/QtObservedMoleculeObserver.cpp
===================================================================
--- src/UIElements/Views/Qt4/MoleculeList/QtObservedMoleculeObserver.cpp	(revision 1a58ce8105d4937e5093f614ba56c6d4688852bc)
+++ src/UIElements/Views/Qt4/MoleculeList/QtObservedMoleculeObserver.cpp	(revision 3054f4a837e9cb89d591549c873572989e548c33)
@@ -47,6 +47,6 @@
     connect(_board, SIGNAL(moleculeInserted(QtObservedMolecule::ptr)),
         this, SLOT(moleculeInserted(QtObservedMolecule::ptr)));
-    connect(_board, SIGNAL(moleculeRemoved(const moleculeId_t)),
-        this, SLOT(moleculeRemoved(const moleculeId_t)));
+    connect(_board, SIGNAL(moleculeRemoved(ObservedValue_Index_t)),
+        this, SLOT(moleculeRemoved(ObservedValue_Index_t)));
 }
 
@@ -60,12 +60,12 @@
 }
 
-void QtObservedMoleculeObserver::moleculeRemoved(const moleculeId_t _moleculeid)
+void QtObservedMoleculeObserver::moleculeRemoved(ObservedValue_Index_t _index)
 {
-  const QtObservedMolecule::ptr mol = board->getObservedMolecule(_moleculeid);
+  const QtObservedMolecule::ptr mol = board->getObservedMolecule(_index);
   disconnect( mol.get(), SIGNAL(atomcountChanged()), this, SLOT(atomcountChanged()));
   disconnect( mol.get(), SIGNAL(formulaChanged()), this, SLOT(formulaChanged()));
   disconnect( mol.get(), SIGNAL(nameChanged()), this, SLOT(nameChanged()));
   disconnect( mol.get(), SIGNAL(selectedChanged()), this, SLOT(selectionChanged()));
-  emit MoleculeRemoved(_moleculeid);
+  emit MoleculeRemoved(_index);
 }
 
Index: src/UIElements/Views/Qt4/MoleculeList/QtObservedMoleculeObserver.hpp
===================================================================
--- src/UIElements/Views/Qt4/MoleculeList/QtObservedMoleculeObserver.hpp	(revision 1a58ce8105d4937e5093f614ba56c6d4688852bc)
+++ src/UIElements/Views/Qt4/MoleculeList/QtObservedMoleculeObserver.hpp	(revision 3054f4a837e9cb89d591549c873572989e548c33)
@@ -47,5 +47,5 @@
   // relayed signals
   void MoleculeInserted(const QtObservedMolecule::ptr _molecule);
-  void MoleculeRemoved(const moleculeId_t _molid);
+  void MoleculeRemoved(ObservedValue_Index_t _index);
 
 private slots:
@@ -57,5 +57,5 @@
 
   void moleculeInserted(const QtObservedMolecule::ptr _molecule);
-  void moleculeRemoved(const moleculeId_t _molid);
+  void moleculeRemoved(ObservedValue_Index_t _index);
 
 private:
Index: src/UIElements/Views/Qt4/MoleculeList/SpecificItems/QtMoleculeItem_name.hpp
===================================================================
--- src/UIElements/Views/Qt4/MoleculeList/SpecificItems/QtMoleculeItem_name.hpp	(revision 1a58ce8105d4937e5093f614ba56c6d4688852bc)
+++ src/UIElements/Views/Qt4/MoleculeList/SpecificItems/QtMoleculeItem_name.hpp	(revision 3054f4a837e9cb89d591549c873572989e548c33)
@@ -28,5 +28,5 @@
   QtMoleculeItem_name(
       QtObservedMolecule::ptr &_ObservedMolecule) :
-        id(_ObservedMolecule->getMolIndex())
+        id(_ObservedMolecule->getIndex())
   {
     // cannot call pure virtual function in QtMoleculeItem's cstor
@@ -50,9 +50,9 @@
    * \return id of the observed molecule
    */
-  const moleculeId_t getMoleculeId() const
+  ObservedValue_Index_t getMoleculeIndex() const
   { return id; }
 
 private:
-  const moleculeId_t id;
+  const ObservedValue_Index_t id;
 };
 
Index: src/UIElements/Views/Qt4/MoleculeList/SpecificItems/QtMoleculeItem_visibility.hpp
===================================================================
--- src/UIElements/Views/Qt4/MoleculeList/SpecificItems/QtMoleculeItem_visibility.hpp	(revision 1a58ce8105d4937e5093f614ba56c6d4688852bc)
+++ src/UIElements/Views/Qt4/MoleculeList/SpecificItems/QtMoleculeItem_visibility.hpp	(revision 3054f4a837e9cb89d591549c873572989e548c33)
@@ -28,5 +28,5 @@
   QtMoleculeItem_visibility(
       QtObservedMolecule::ptr &_ObservedMolecule) :
-        id(_ObservedMolecule->getMolIndex())
+        id(_ObservedMolecule->getIndex())
   {
     setFlags(flags() | Qt::ItemIsUserCheckable);
@@ -50,9 +50,9 @@
    * \return id of the observed molecule
    */
-  const moleculeId_t getMoleculeId() const
+  ObservedValue_Index_t getMoleculeIndex() const
   { return id; }
 
 private:
-  const moleculeId_t id;
+  const ObservedValue_Index_t id;
 };
 
