Index: src/UIElements/Qt4/QtMainWindow.cpp
===================================================================
--- src/UIElements/Qt4/QtMainWindow.cpp	(revision e5a47740179fa6bd45778ad5a4caea81fde92864)
+++ src/UIElements/Qt4/QtMainWindow.cpp	(revision 015f8c18d74c335a5af0741c3ff7f82dfcbfa0d1)
@@ -61,4 +61,5 @@
 #include "Views/Qt4/QtShapeController.hpp"
 #include "Views/Qt4/QtInfoBox.hpp"
+#include "Views/Qt4/QtSelectionChangedAgent.hpp"
 #include "Views/Qt4/QtStatusBar.hpp"
 #include "Views/Qt4/QtTimeLine.hpp"
@@ -101,7 +102,10 @@
   QVBoxLayout *layout = new QVBoxLayout(layoutwidget);
 
+  selectionagent = new QtSelectionChangedAgent(this);
+
   QtMoleculeListView *moleculeListView = new QtMoleculeListView(worldTab);
   moleculeList = new QtMoleculeList;
   moleculeListView->setModel(moleculeList);
+  moleculeListView->setSelectionChangedAgent(selectionagent);
 
   elementList = new QtElementList(worldTab);
@@ -119,4 +123,5 @@
 //  glWorldView->setFocus();
   glWorldView->camera()->setEye( QVector3D(0,3,10));
+  glWorldView->setSelectionChangedAgent(selectionagent);
 
   MainMenu = new QtMenu<QMenuBar>(menuBar(), "");
Index: src/UIElements/Qt4/QtMainWindow.hpp
===================================================================
--- src/UIElements/Qt4/QtMainWindow.hpp	(revision e5a47740179fa6bd45778ad5a4caea81fde92864)
+++ src/UIElements/Qt4/QtMainWindow.hpp	(revision 015f8c18d74c335a5af0741c3ff7f82dfcbfa0d1)
@@ -28,4 +28,5 @@
 class QtLogBox;
 class QtMoleculeList;
+class QtSelectionChangedAgent;
 class QtShapeController;
 class StringView;
@@ -58,4 +59,5 @@
   QtHomologyList *homologyList;
   QtFragmentList *fragmentList;
+  QtSelectionChangedAgent *selectionagent;
   QtShapeController *shapeController;
   GLWorldView *glWorldView;
Index: src/UIElements/Views/Qt4/MoleculeList/QtMoleculeList.cpp
===================================================================
--- src/UIElements/Views/Qt4/MoleculeList/QtMoleculeList.cpp	(revision e5a47740179fa6bd45778ad5a4caea81fde92864)
+++ src/UIElements/Views/Qt4/MoleculeList/QtMoleculeList.cpp	(revision 015f8c18d74c335a5af0741c3ff7f82dfcbfa0d1)
@@ -178,4 +178,13 @@
 }
 
+const QModelIndex QtMoleculeList::MoleculeIdToIndex(const moleculeId_t _id) const
+{
+  boost::recursive_mutex::scoped_lock lock(refill_mutex);
+  QtMoleculeItem * const item = MoleculeIdToItem(_id);
+  ASSERT(item != NULL,
+      "QtMoleculeList::MoleculeIdToIndex() - could not find item to "
+      +toString(_id));
+  return indexFromItem(item);
+}
 
 const moleculeId_t QtMoleculeList::IndexToMoleculeId(const QModelIndex &_index) const
Index: src/UIElements/Views/Qt4/MoleculeList/QtMoleculeList.hpp
===================================================================
--- src/UIElements/Views/Qt4/MoleculeList/QtMoleculeList.hpp	(revision e5a47740179fa6bd45778ad5a4caea81fde92864)
+++ src/UIElements/Views/Qt4/MoleculeList/QtMoleculeList.hpp	(revision 015f8c18d74c335a5af0741c3ff7f82dfcbfa0d1)
@@ -86,6 +86,7 @@
   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;
-  const moleculeId_t ItemToMoleculeId(const QtMoleculeItem * const _item) const;
   QtMoleculeItem * getSpecificMoleculeItem(
       const QtMoleculeItem * const _item,
Index: src/UIElements/Views/Qt4/MoleculeList/QtMoleculeListView.cpp
===================================================================
--- src/UIElements/Views/Qt4/MoleculeList/QtMoleculeListView.cpp	(revision e5a47740179fa6bd45778ad5a4caea81fde92864)
+++ src/UIElements/Views/Qt4/MoleculeList/QtMoleculeListView.cpp	(revision 015f8c18d74c335a5af0741c3ff7f82dfcbfa0d1)
@@ -37,4 +37,5 @@
 #include "UIElements/Views/Qt4/MoleculeList/QtMoleculeList.hpp"
 #include "UIElements/Views/Qt4/MoleculeList/QtMoleculeItem.hpp"
+#include "UIElements/Views/Qt4/QtSelectionChangedAgent.hpp"
 
 #include "CodePatterns/MemDebug.hpp"
@@ -53,12 +54,8 @@
 {
   setSelectionMode(QAbstractItemView::MultiSelection);
-
-  World::getInstance().signOn(this, World::SelectionChanged);
 }
 
 QtMoleculeListView::~QtMoleculeListView()
-{
-  World::getInstance().signOff(this, World::SelectionChanged);
-}
+{}
 
 void QtMoleculeListView::setModel(QtMoleculeList *_moleculelist)
@@ -69,4 +66,13 @@
       selectionModel(), SIGNAL(selectionChanged(const QItemSelection &, const QItemSelection &)),
       this, SLOT(rowsSelected(const QItemSelection &, const QItemSelection &)), Qt::DirectConnection);
+}
+
+
+void QtMoleculeListView::setSelectionChangedAgent(QtSelectionChangedAgent *agent)
+{
+  connect(agent, SIGNAL(moleculeSelected(const moleculeId_t)),
+      this, SLOT(MoleculeSelected(const moleculeId_t)));
+  connect(agent, SIGNAL(moleculeUnselected(const moleculeId_t)),
+      this, SLOT(MoleculeUnselected(const moleculeId_t)));
 }
 
@@ -148,4 +154,45 @@
   selecting = false;
 }
+
+void QtMoleculeListView::MoleculeSelected(const moleculeId_t _id)
+{
+  if (selecting)
+    return;
+
+  selecting = true;
+
+  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);
+
+  selecting = false;
+}
+
+void QtMoleculeListView::MoleculeUnselected(const moleculeId_t _id)
+{
+  if (selecting)
+    return;
+
+  selecting = true;
+
+  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);
+
+  selecting = false;
+}
+
 
 void QtMoleculeListView::recieveNotification(Observable *publisher, Notification_ptr notification)
Index: src/UIElements/Views/Qt4/MoleculeList/QtMoleculeListView.hpp
===================================================================
--- src/UIElements/Views/Qt4/MoleculeList/QtMoleculeListView.hpp	(revision e5a47740179fa6bd45778ad5a4caea81fde92864)
+++ src/UIElements/Views/Qt4/MoleculeList/QtMoleculeListView.hpp	(revision 015f8c18d74c335a5af0741c3ff7f82dfcbfa0d1)
@@ -19,5 +19,8 @@
 #include "CodePatterns/Observer/Observer.hpp"
 
+#include "types.hpp"
+
 class QtMoleculeList;
+class QtSelectionChangedAgent;
 
 class QtMoleculeListView : public QTreeView, public Observer
@@ -31,6 +34,11 @@
   void setModel(QtMoleculeList *_moleculelist);
 
+  void setSelectionChangedAgent(QtSelectionChangedAgent *agent);
+
 public slots:
   void rowsSelected(const QItemSelection&, const QItemSelection&);
+
+  void MoleculeSelected(const moleculeId_t _id);
+  void MoleculeUnselected(const moleculeId_t _id);
 
 protected:
Index: src/UIElements/Views/Qt4/Qt3D/GLMoleculeObject_atom.cpp
===================================================================
--- src/UIElements/Views/Qt4/Qt3D/GLMoleculeObject_atom.cpp	(revision e5a47740179fa6bd45778ad5a4caea81fde92864)
+++ src/UIElements/Views/Qt4/Qt3D/GLMoleculeObject_atom.cpp	(revision 015f8c18d74c335a5af0741c3ff7f82dfcbfa0d1)
@@ -75,6 +75,4 @@
 const Observable::channels_t
 GLMoleculeObject_atom::AtomBondsChannels(getAtomBondsChannels());
-const Observable::channels_t
-GLMoleculeObject_atom::AtomSelectionStatusChannels(World::SelectionChanged);
 
 GLMoleculeObject_atom::GLMoleculeObject_atom(QGLSceneNode *mesh[], QObject *parent, const atomId_t _id) :
@@ -106,10 +104,4 @@
       updateBonds(),
       AtomBondsChannels),
-  AtomSelectionStatus(
-      World::getPointer(),
-      boost::bind(&GLMoleculeObject_atom::updateSelectionStatus, this),
-      "AtomSelectionStatus_"+toString(_id),
-      updateSelectionStatus(),
-      AtomSelectionStatusChannels),
   owner(NULL)
 {
@@ -129,5 +121,4 @@
   connect( this, SIGNAL(positionChanged()), this, SLOT(resetPosition()), Qt::QueuedConnection);
   connect( this, SIGNAL(bondsChanged()), this, SLOT(resetPosition()), Qt::QueuedConnection);
-  connect( this, SIGNAL(selectionstatusChanged()), this, SLOT(resetSelectionStatus()), Qt::QueuedConnection);
 }
 
@@ -141,5 +132,4 @@
     owner->signOn(this, AtomObservable::BondsAdded);
     owner->signOn(this, AtomObservable::BondsRemoved);
-    World::getInstance().signOn(this, World::SelectionChanged);
   }
 }
@@ -155,5 +145,4 @@
     owner->signOff(this, AtomObservable::BondsAdded);
     owner->signOff(this, AtomObservable::BondsRemoved);
-    World::getInstance().signOff(this, World::SelectionChanged);
     owner = NULL;
   }
@@ -241,8 +230,22 @@
 }
 
-void GLMoleculeObject_atom::resetSelectionStatus()
-{
-  setSelected(AtomSelectionStatus.get());
-}
+void GLMoleculeObject_atom::Selected()
+{
+  ASSERT( !m_selected,
+      "GLMoleculeObject_atom::Selected() - 3D rep of atom is already selected.");
+  m_selected = true;
+
+  emit changed();
+}
+
+void GLMoleculeObject_atom::Unselected()
+{
+  ASSERT( m_selected,
+      "GLMoleculeObject_atom::Unselected() - 3D rep of atom is already unselected.");
+  m_selected = false;
+
+  emit changed();
+}
+
 
 void GLMoleculeObject_atom::draw(QGLPainter *painter, const QVector4D &cameraPlane)
@@ -315,13 +318,4 @@
 }
 
-bool GLMoleculeObject_atom::updateSelectionStatus() const
-{
-  const atom * const _atom = getAtom(AtomIndex.get());
-  if (_atom != NULL) {
-    return const_cast<const World &>(World::getInstance()).isSelected(_atom);
-  }
-  return false;
-}
-
 void GLMoleculeObject_atom::update(Observable *publisher)
 {
@@ -358,14 +352,5 @@
         break;
     }
-  } else if (publisher == static_cast<World *>(World::getPointer())) {
-    switch (notification->getChannelNo()) {
-      case World::SelectionChanged:
-        emit selectionstatusChanged();
-        break;
-      default:
-        ASSERT(0, "GLMoleculeObject_atom::recieveNotification() - we are not signed on to channel "
-            +toString(notification->getChannelNo())+" of the World.");
-        break;
-    }
-  }
-}
+  } else
+    ASSERT(0, "GLMoleculeObject_atom::recieveNotification() - received notification from unexpected source.");
+}
Index: src/UIElements/Views/Qt4/Qt3D/GLMoleculeObject_atom.hpp
===================================================================
--- src/UIElements/Views/Qt4/Qt3D/GLMoleculeObject_atom.hpp	(revision e5a47740179fa6bd45778ad5a4caea81fde92864)
+++ src/UIElements/Views/Qt4/Qt3D/GLMoleculeObject_atom.hpp	(revision 015f8c18d74c335a5af0741c3ff7f82dfcbfa0d1)
@@ -41,4 +41,8 @@
   void recieveNotification(Observable *publisher, Notification_ptr notification);
 
+public slots:
+  void Selected();
+  void Unselected();
+
 private slots:
   void wasClicked();
@@ -47,5 +51,4 @@
   void resetPosition();
   void resetBonds();
-  void resetSelectionStatus();
 
 signals:
@@ -58,5 +61,4 @@
   void elementChanged();
   void bondsChanged();
-  void selectionstatusChanged();
 
 private:
@@ -74,5 +76,4 @@
   atomicNumber_t updateElement() const;
   ListOfBonds_t updateBonds() const;
-  bool updateSelectionStatus() const;
 
   void activateObserver();
@@ -95,6 +96,4 @@
   //!> cached value of the atom's id
   ObservedValue<ListOfBonds_t> AtomBonds;
-  //!> cached value of the atom's selection status
-  ObservedValue<bool> AtomSelectionStatus;
 
   //!> list of channels when index needs to update
@@ -106,6 +105,4 @@
   //!> list of channels when bonds needs to update
   static const Observable::channels_t AtomBondsChannels;
-  //!> list of channels when selection status needs to update
-  static const Observable::channels_t AtomSelectionStatusChannels;
 
   //!> the Observable we are signed on, also indicates whether we are sign on (not NULL)
Index: src/UIElements/Views/Qt4/Qt3D/GLMoleculeObject_molecule.cpp
===================================================================
--- src/UIElements/Views/Qt4/Qt3D/GLMoleculeObject_molecule.cpp	(revision e5a47740179fa6bd45778ad5a4caea81fde92864)
+++ src/UIElements/Views/Qt4/Qt3D/GLMoleculeObject_molecule.cpp	(revision 015f8c18d74c335a5af0741c3ff7f82dfcbfa0d1)
@@ -28,7 +28,4 @@
  *      Author: ankele
  */
-
-
-
 
 
@@ -114,7 +111,4 @@
   TesselationHullUpdater(
       boost::bind(&GLMoleculeObject_molecule::updateTesselationHull, this)
-      ),
-  IsSelectedUpdater(
-      boost::bind(&GLMoleculeObject_molecule::updateIsSelected, this)
       ),
   BoundingBoxUpdater(
@@ -135,10 +129,4 @@
       "MoleculeTesselationHull_"+toString(_molid),
       HullChannels),
-  isSelected(
-      const_cast<const World * const>(World::getPointer()),
-      IsSelectedUpdater,
-      "MoleculeBoundingBox_"+toString(_molid),
-      updateIsSelected(),
-      BoundingBoxChannels),
   BoundingBox(
       molref,
@@ -189,7 +177,4 @@
   TesselationHullUpdater(
       boost::bind(&GLMoleculeObject_molecule::updateTesselationHull, this)
-      ),
-  IsSelectedUpdater(
-      boost::bind(&GLMoleculeObject_molecule::updateIsSelected, this)
       ),
   BoundingBoxUpdater(
@@ -210,10 +195,4 @@
       "MoleculeTesselationHull_"+toString(_molid),
       HullChannels),
-  isSelected(
-      const_cast<const World * const>(World::getPointer()),
-      IsSelectedUpdater,
-      "MoleculeBoundingBox_"+toString(_molid),
-      updateIsSelected(),
-      BoundingBoxChannels),
   BoundingBox(
       molref,
@@ -240,5 +219,4 @@
   connect (this, SIGNAL(TesselationHullChanged()), this, SLOT(resetTesselationHull()), Qt::QueuedConnection);
   connect (this, SIGNAL(BoundingBoxChanged()), this, SLOT(resetBoundingBox()), Qt::QueuedConnection);
-  connect (this, SIGNAL(IsSelectedChanged()), this, SLOT(resetIsSelected()), Qt::QueuedConnection);
   connect (this, SIGNAL(IdChanged()), this, SLOT(resetIndex()), Qt::QueuedConnection);
   connect (this, SIGNAL(AtomInserted(const atomId_t)), this, SLOT(atomInserted(const atomId_t)), Qt::QueuedConnection);
@@ -262,9 +240,4 @@
     owner->signOff(this, molecule::AtomMoved);
     owner->signOff(this, molecule::IndexChanged);
-    /*_atom->signOff(this, AtomObservable::IndexChanged);
-    _atom->signOff(this, AtomObservable::PositionChanged);
-    _atom->signOff(this, AtomObservable::ElementChanged);
-    _atom->signOff(this, AtomObservable::BondsAdded);*/
-    World::getInstance().signOff(this, World::SelectionChanged);
     owner = NULL;
   }
@@ -281,9 +254,4 @@
     owner->signOn(this, molecule::AtomMoved);
     owner->signOn(this, molecule::IndexChanged);
-    /*molref->signOn(this, AtomObservable::IndexChanged);
-    molref->signOn(this, AtomObservable::PositionChanged);
-    molref->signOn(this, AtomObservable::ElementChanged);
-    molref->signOn(this, AtomObservable::BondsAdded);*/
-    World::getInstance().signOn(this, World::SelectionChanged);
   } else {
     ELOG(1, "GLMoleculeObject_molecule() - added null object for not present mol id " << MolIndex.get());
@@ -407,9 +375,4 @@
 }
 
-bool GLMoleculeObject_molecule::updateIsSelected() const
-{
-  return const_cast<const World &>(World::getInstance()).isMoleculeSelected(MolIndex.get());
-}
-
 GLMoleculeObject_molecule::BoundingBoxInfo GLMoleculeObject_molecule::updateBoundingBox() const
 {
@@ -448,9 +411,4 @@
   if (!TesselationHull.isValid())
     updateMesh(createMoleculeMesh(*TesselationHull));
-}
-
-void GLMoleculeObject_molecule::resetIsSelected()
-{
-  setSelected(isSelected.get());
 }
 
@@ -496,4 +454,44 @@
 
   emit indexChanged(this, oldId, newId);
+}
+
+void GLMoleculeObject_molecule::AtomSelected(const atomId_t _id)
+{
+  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
+                            "Selected",       // member name (no parameters here)
+                            Qt::QueuedConnection);     // connection type
+}
+
+void GLMoleculeObject_molecule::AtomUnselected(const atomId_t _id)
+{
+  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
+                            "Unselected",       // member name (no parameters here)
+                            Qt::QueuedConnection);     // connection type
+}
+
+void GLMoleculeObject_molecule::Selected()
+{
+  ASSERT( !m_selected,
+      "GLMoleculeObject_molecule::Selected() - 3D rep of molecule is already selected.");
+  m_selected = true;
+
+  emit changed();
+}
+
+void GLMoleculeObject_molecule::Unselected()
+{
+  ASSERT( m_selected,
+      "GLMoleculeObject_molecule::Unselected() - 3D rep of molecule is already unselected.");
+  m_selected = false;
+
+  emit changed();
 }
 
@@ -569,19 +567,6 @@
         break;
     }
-  }else{
-    // notification from world
-#ifdef LOG_OBSERVER
-    observerLog().addMessage() << "++ Update of Observer "<< observerLog().getName(static_cast<Observer *>(this))
-          << " received notification from world for channel "
-          << notification->getChannelNo() << ".";
-#endif
-    switch (notification->getChannelNo()) {
-      case World::SelectionChanged:
-        emit IsSelectedChanged();
-        break;
-      default:
-        break;
-    }
-  }
+  } else
+    ASSERT(0, "GLMoleculeObject_molecule::recieveNotification() - received notification from unexpected source.");
 }
 
@@ -694,7 +679,6 @@
   connect (atomObject, SIGNAL(hoverChanged(GLMoleculeObject *)), this, SIGNAL(changed()));
   connect (atomObject, SIGNAL(hoverChanged(GLMoleculeObject *)), this, SLOT(hoverChangedSignalled(GLMoleculeObject *)));
-  connect (atomObject, SIGNAL(selectionChanged()), this, SIGNAL(changed()));
 //  connect (atomObject, SIGNAL(bondsChanged()), this, SLOT(bondInserted(const atomId_t, const atomId_t, const GLMoleculeObject_bond::SideOfBond)));
-  connect (atomObject, SIGNAL(BondsInserted(const atomId_t, const atomId_t, const GLMoleculeObject_bond::SideOfBond)), this, SLOT(bondInserted(const atomId_t, const atomId_t, const GLMoleculeObject_bond::SideOfBond)));
+  connect (atomObject, SIGNAL(BondsAdded(const atomId_t, const atomId_t, const GLMoleculeObject_bond::SideOfBond)), this, SLOT(bondInserted(const atomId_t, const atomId_t, const GLMoleculeObject_bond::SideOfBond)));
   connect (atomObject, SIGNAL(BondsRemoved(const atomId_t, const atomId_t)), this, SLOT(bondRemoved(const atomId_t, const atomId_t)));
   connect (atomObject, SIGNAL(indexChanged(GLMoleculeObject_atom*, const atomId_t, const atomId_t)), this, SLOT(changeAtomId(GLMoleculeObject_atom*, const atomId_t, const atomId_t)));
Index: src/UIElements/Views/Qt4/Qt3D/GLMoleculeObject_molecule.hpp
===================================================================
--- src/UIElements/Views/Qt4/Qt3D/GLMoleculeObject_molecule.hpp	(revision e5a47740179fa6bd45778ad5a4caea81fde92864)
+++ src/UIElements/Views/Qt4/Qt3D/GLMoleculeObject_molecule.hpp	(revision 015f8c18d74c335a5af0741c3ff7f82dfcbfa0d1)
@@ -86,8 +86,12 @@
 
   void resetTesselationHull();
-  void resetIsSelected();
   void resetBoundingBox();
   void resetAtoms();
   void resetIndex();
+
+  void AtomSelected(const atomId_t _id);
+  void AtomUnselected(const atomId_t _id);
+  void Selected();
+  void Unselected();
 
 private:
@@ -121,5 +125,4 @@
 
   QGeometryData updateTesselationHull() const;
-  bool updateIsSelected() const;
   BoundingBoxInfo updateBoundingBox() const;
   atoms_t updateAtoms();
@@ -136,6 +139,4 @@
   //!> list of channels when tesselation hull needs to update
   static const Observable::channels_t HullChannels;
-  //!> list of channels when selection status needs to update
-  static const Observable::channels_t SelectionStatusChannels;
   //!> list of channels when bounding box needs to update
   static const Observable::channels_t BoundingBoxChannels;
@@ -145,5 +146,4 @@
   boost::function<moleculeId_t ()> MolIndexUpdater;
   boost::function<QGeometryData ()> TesselationHullUpdater;
-  boost::function<bool ()> IsSelectedUpdater;
   boost::function<BoundingBoxInfo ()> BoundingBoxUpdater;
   boost::function<atoms_t ()> PresentAtomsUpdater;
@@ -153,6 +153,4 @@
   //!> contains current version of the tesselation hull on request
   Cacheable<QGeometryData> TesselationHull;
-  //!> contains newest version of the selection status
-  ObservedValue<bool> isSelected;
   //!> contains newest version of the bounding box on request
   ObservedValue<BoundingBoxInfo> BoundingBox;
Index: src/UIElements/Views/Qt4/Qt3D/GLWorldScene.cpp
===================================================================
--- src/UIElements/Views/Qt4/Qt3D/GLWorldScene.cpp	(revision e5a47740179fa6bd45778ad5a4caea81fde92864)
+++ src/UIElements/Views/Qt4/Qt3D/GLWorldScene.cpp	(revision 015f8c18d74c335a5af0741c3ff7f82dfcbfa0d1)
@@ -43,9 +43,11 @@
 #include <Qt3D/qglcylinder.h>
 
-#include "GLMoleculeObject.hpp"
-#include "GLMoleculeObject_atom.hpp"
-#include "GLMoleculeObject_bond.hpp"
-#include "GLMoleculeObject_molecule.hpp"
-#include "GLMoleculeObject_shape.hpp"
+#include "UIElements/Views/Qt4/Qt3D/GLMoleculeObject.hpp"
+#include "UIElements/Views/Qt4/Qt3D/GLMoleculeObject_atom.hpp"
+#include "UIElements/Views/Qt4/Qt3D/GLMoleculeObject_bond.hpp"
+#include "UIElements/Views/Qt4/Qt3D/GLMoleculeObject_molecule.hpp"
+#include "UIElements/Views/Qt4/Qt3D/GLMoleculeObject_shape.hpp"
+
+#include "UIElements/Views/Qt4/QtSelectionChangedAgent.hpp"
 
 #include "CodePatterns/MemDebug.hpp"
@@ -417,4 +419,17 @@
 }
 
+void GLWorldScene::setSelectionChangedAgent(QtSelectionChangedAgent *agent)
+{
+  connect(agent, SIGNAL(atomSelected(const moleculeId_t, const atomId_t)),
+      this, SLOT(AtomSelected(const moleculeId_t, const atomId_t)));
+  connect(agent, SIGNAL(atomUnselected(const moleculeId_t, const atomId_t)),
+      this, SLOT(AtomUnselected(const moleculeId_t, const atomId_t)));
+
+  connect(agent, SIGNAL(moleculeSelected(const moleculeId_t)),
+      this, SLOT(MoleculeSelected(const moleculeId_t)));
+  connect(agent, SIGNAL(moleculeUnselected(const moleculeId_t)),
+      this, SLOT(MoleculeUnselected(const moleculeId_t)));
+}
+
 void GLWorldScene::setSelectionModeAtom()
 {
@@ -463,2 +478,48 @@
   }
 }
+
+void GLWorldScene::AtomSelected(const moleculeId_t _molid, const atomId_t _id)
+{
+  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
+                            "AtomSelected",       // member name (no parameters here)
+                            Qt::QueuedConnection,     // connection type
+                            Q_ARG(const atomId_t, _id));     // parameters
+}
+
+void GLWorldScene::AtomUnselected(const moleculeId_t _molid, const atomId_t _id)
+{
+  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
+                            "AtomUnselected",       // member name (no parameters here)
+                            Qt::QueuedConnection,     // connection type
+                            Q_ARG(const atomId_t, _id));     // parameters
+}
+
+void GLWorldScene::MoleculeSelected(const moleculeId_t _molid)
+{
+  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
+                            "Selected",       // member name (no parameters here)
+                            Qt::QueuedConnection);     // connection type
+}
+
+void GLWorldScene::MoleculeUnselected(const moleculeId_t _molid)
+{
+  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
+                            "Unselected",       // member name (no parameters here)
+                            Qt::QueuedConnection);     // connection type
+}
Index: src/UIElements/Views/Qt4/Qt3D/GLWorldScene.hpp
===================================================================
--- src/UIElements/Views/Qt4/Qt3D/GLWorldScene.hpp	(revision e5a47740179fa6bd45778ad5a4caea81fde92864)
+++ src/UIElements/Views/Qt4/Qt3D/GLWorldScene.hpp	(revision 015f8c18d74c335a5af0741c3ff7f82dfcbfa0d1)
@@ -39,4 +39,5 @@
 class GLMoleculeObject_molecule;
 class GLMoleculeObject_shape;
+class QtSelectionChangedAgent;
 
 /** This class contains a list of all molecules in the world.
@@ -68,4 +69,6 @@
   void setSelectionMode(SelectionModeType mode);
 
+  void setSelectionChangedAgent(QtSelectionChangedAgent *agent);
+
 signals:
   void changed();
@@ -94,4 +97,9 @@
   void moleculesVisibilityChanged(const moleculeId_t _id, bool _visible);
   void changeMoleculeId(GLMoleculeObject_molecule *, const moleculeId_t, const moleculeId_t);
+
+  void AtomSelected(const moleculeId_t _molid, const atomId_t);
+  void AtomUnselected(const moleculeId_t _molid, const atomId_t);
+  void MoleculeSelected(const moleculeId_t);
+  void MoleculeUnselected(const moleculeId_t);
 
 public:
Index: src/UIElements/Views/Qt4/Qt3D/GLWorldView.cpp
===================================================================
--- src/UIElements/Views/Qt4/Qt3D/GLWorldView.cpp	(revision e5a47740179fa6bd45778ad5a4caea81fde92864)
+++ src/UIElements/Views/Qt4/Qt3D/GLWorldView.cpp	(revision 015f8c18d74c335a5af0741c3ff7f82dfcbfa0d1)
@@ -317,4 +317,9 @@
 
   setdreiBeinStatus( status );
+}
+
+void GLWorldView::setSelectionChangedAgent(QtSelectionChangedAgent *agent)
+{
+  worldscene->setSelectionChangedAgent(agent);
 }
 
Index: src/UIElements/Views/Qt4/Qt3D/GLWorldView.hpp
===================================================================
--- src/UIElements/Views/Qt4/Qt3D/GLWorldView.hpp	(revision e5a47740179fa6bd45778ad5a4caea81fde92864)
+++ src/UIElements/Views/Qt4/Qt3D/GLWorldView.hpp	(revision 015f8c18d74c335a5af0741c3ff7f82dfcbfa0d1)
@@ -26,4 +26,5 @@
 class QToolBar;
 class QTimer;
+class QtSelectionChangedAgent;
 
 /** This class is the view on the 3D representation of the World, i.e. the whole
@@ -41,4 +42,6 @@
   void createDomainBox();
   void createDreiBein();
+
+  void setSelectionChangedAgent(QtSelectionChangedAgent *agent);
 
   // Observer functions
