Index: src/UIElements/Views/Qt4/Qt3D/GLMoleculeObject.hpp
===================================================================
--- src/UIElements/Views/Qt4/Qt3D/GLMoleculeObject.hpp	(revision e638f994597de00dea35ab713ed67450ce61ec6e)
+++ src/UIElements/Views/Qt4/Qt3D/GLMoleculeObject.hpp	(revision 7188b130f196698d071c5787a688b84efdfde506)
@@ -35,5 +35,5 @@
 
    //!> Allow it to call cleanMaterialMap()
-   friend class GLMoleculeScene;
+   friend class GLWorldScene;
 public:
    explicit GLMoleculeObject(QGLSceneNode *GLMoleculeObject, QObject *parent=0);
Index: src/UIElements/Views/Qt4/Qt3D/GLMoleculeObject_atom.cpp
===================================================================
--- src/UIElements/Views/Qt4/Qt3D/GLMoleculeObject_atom.cpp	(revision e638f994597de00dea35ab713ed67450ce61ec6e)
+++ src/UIElements/Views/Qt4/Qt3D/GLMoleculeObject_atom.cpp	(revision 7188b130f196698d071c5787a688b84efdfde506)
@@ -27,8 +27,10 @@
 
 #include "CodePatterns/Assert.hpp"
+#include "CodePatterns/Log.hpp"
 
+#include "Descriptors/AtomIdDescriptor.hpp"
 #include "element.hpp"
 #include "LinearAlgebra/Vector.hpp"
-
+#include "World.hpp"
 
 static QGLSceneNode * createAtom(QObject *parent)
@@ -42,8 +44,41 @@
 
 GLMoleculeObject_atom::GLMoleculeObject_atom(QObject *parent, const atom *atomref) :
-  GLMoleculeObject(createAtom(parent), parent), _atom(atomref)
+  GLMoleculeObject(createAtom(parent), parent), Observer("GLMoleculeObject_atom"), _atom(atomref)
+{
+  // sign on as observer (obtain non-const instance before)
+  atomref->signOn(this, atomref->getChannel(AtomObservable::IndexChanged));
+  atomref->signOn(this, atomref->getChannel(AtomObservable::PositionChanged));
+  atomref->signOn(this, atomref->getChannel(AtomObservable::ElementChanged));
+
+  // set the object's id
+  resetProperties();
+
+  std::cout << "Created sphere for atom " << _atom->getId() << "." << endl;
+
+  connect( this, SIGNAL(clicked()), this, SLOT(wasClicked()));
+}
+
+void GLMoleculeObject_atom::update(Observable *publisher)
+{
+  LOG(0, "GLMoleculeObject_atom::update() - called fro atom "+toString(_atom->getId())+".");
+  resetProperties();
+}
+
+void GLMoleculeObject_atom::resetPosition()
 {
   const Vector Position = _atom->getPosition();
-  const size_t elementno = _atom->getType()->getNumber();
+  LOG(1, "GLMoleculeObject_atom::resetIndex() - new position is "+toString(Position)+".");
+  setPosition(QVector3D(Position[0], Position[1], Position[2]));
+}
+
+void GLMoleculeObject_atom::resetElement()
+{
+  size_t elementno = 0;
+  if (_atom->getType() != NULL) {
+    elementno = _atom->getType()->getNumber();
+  } else { // if no element yet, set to hydrogen
+    elementno = 1;
+  }
+  LOG(1, "GLMoleculeObject_atom::resetIndex() - new element number is "+toString(elementno)+".");
 
   // set materials
@@ -57,16 +92,54 @@
   setHoverMaterial(hovermaterial);
 
+  // set scale
+  double radius = 0.;
+  if (_atom->getType() != NULL) {
+    radius = _atom->getType()->getVanDerWaalsRadius();
+  } else {
+    radius = 0.5;
+  }
+  setScale( radius );
+}
+
+void GLMoleculeObject_atom::resetIndex()
+{
+  const size_t atomno = _atom->getId();
+  LOG(1, "GLMoleculeObject_atom::resetIndex() - new index is "+toString(atomno)+".");
+  setObjectId(atomno);
+}
+
+void GLMoleculeObject_atom::resetProperties()
+{
   // set position
-  setPosition(QVector3D(Position[0], Position[1], Position[2]));
+  resetPosition();
 
-  // set scale
-  setScale( _atom->getType()->getVanDerWaalsRadius());
+  // set element
+  resetElement();
 
   // set the object's id
-  setObjectId(_atom->getId());
+  resetIndex();
+}
 
-  std::cout << "Created sphere at " << Position << " with elementno " << elementno << "." << endl;
+void GLMoleculeObject_atom::subjectKilled(Observable *publisher)
+{}
 
-  connect( this, SIGNAL(clicked()), this, SLOT(wasClicked()));
+void GLMoleculeObject_atom::recieveNotification(Observable *publisher, Notification_ptr notification)
+{
+  LOG(0, "GLMoleculeObject_atom::recieveNotification() - notification type "
+      +toString(notification->getChannelNo())+".");
+  switch (notification->getChannelNo()) {
+    case AtomObservable::ElementChanged:
+      resetElement();
+      break;
+    case AtomObservable::IndexChanged:
+      resetIndex();
+      break;
+    case AtomObservable::PositionChanged:
+      resetPosition();
+      break;
+    default:
+      //setProperties();
+      break;
+  }
 }
 
Index: src/UIElements/Views/Qt4/Qt3D/GLMoleculeObject_atom.hpp
===================================================================
--- src/UIElements/Views/Qt4/Qt3D/GLMoleculeObject_atom.hpp	(revision e638f994597de00dea35ab713ed67450ce61ec6e)
+++ src/UIElements/Views/Qt4/Qt3D/GLMoleculeObject_atom.hpp	(revision 7188b130f196698d071c5787a688b84efdfde506)
@@ -16,12 +16,19 @@
 #include "GLMoleculeObject.hpp"
 
+#include "CodePatterns/Observer.hpp"
+
 #include "atom.hpp"
 
-class GLMoleculeObject_atom : public GLMoleculeObject
+class GLMoleculeObject_atom : public GLMoleculeObject, public Observer
 {
   Q_OBJECT
 public:
   GLMoleculeObject_atom(QObject *parent, const atom *atomref);
-  ~GLMoleculeObject_atom() {}
+  virtual ~GLMoleculeObject_atom() {}
+
+  // Observer functions
+  void update(Observable *publisher);
+  void subjectKilled(Observable *publisher);
+  void recieveNotification(Observable *publisher, Notification_ptr notification);
 
 private slots:
@@ -32,4 +39,9 @@
 
 private:
+  void resetPosition();
+  void resetElement();
+  void resetIndex();
+  void resetProperties();
+
   const atom *_atom;
 };
Index: src/UIElements/Views/Qt4/Qt3D/GLMoleculeObject_bond.cpp
===================================================================
--- src/UIElements/Views/Qt4/Qt3D/GLMoleculeObject_bond.cpp	(revision e638f994597de00dea35ab713ed67450ce61ec6e)
+++ src/UIElements/Views/Qt4/Qt3D/GLMoleculeObject_bond.cpp	(revision 7188b130f196698d071c5787a688b84efdfde506)
@@ -58,10 +58,19 @@
       Position = _bond->leftatom->getPosition();
       OtherPosition = _bond->rightatom->getPosition();
-      elementno = _bond->leftatom->getType()->getNumber();
+      if (_bond->leftatom->getType() != NULL) {
+        elementno = _bond->leftatom->getType()->getNumber();
+      } else { // if not element yet set, set to hydrogen
+        elementno = 1;
+      }
       break;
     case right:
       Position = _bond->rightatom->getPosition();
       OtherPosition = _bond->leftatom->getPosition();
-      elementno = _bond->rightatom->getType()->getNumber();
+      if (_bond->rightatom->getType() != NULL) {
+        elementno = _bond->rightatom->getType()->getNumber();
+      } else { // if not element yet set, set to hydrogen
+        elementno = 1;
+      }
+
       break;
     default:
Index: src/UIElements/Views/Qt4/Qt3D/GLMoleculeObject_bond.hpp
===================================================================
--- src/UIElements/Views/Qt4/Qt3D/GLMoleculeObject_bond.hpp	(revision e638f994597de00dea35ab713ed67450ce61ec6e)
+++ src/UIElements/Views/Qt4/Qt3D/GLMoleculeObject_bond.hpp	(revision 7188b130f196698d071c5787a688b84efdfde506)
@@ -25,5 +25,5 @@
 
   GLMoleculeObject_bond(QObject *parent, const bond *bondref, double distance, enum SideOfBond side);
-  ~GLMoleculeObject_bond() {}
+  virtual ~GLMoleculeObject_bond() {}
 
 
Index: src/UIElements/Views/Qt4/Qt3D/GLMoleculeScene.cpp
===================================================================
--- src/UIElements/Views/Qt4/Qt3D/GLMoleculeScene.cpp	(revision e638f994597de00dea35ab713ed67450ce61ec6e)
+++ 	(revision )
@@ -1,105 +1,0 @@
-/*
- * Project: MoleCuilder
- * Description: creates and alters molecular systems
- * Copyright (C)  2010 University of Bonn. All rights reserved.
- * Please see the LICENSE file or "Copyright notice" in builder.cpp for details.
- */
-
-/*
- * GLMoleculeScene.cpp
- *
- *  This is based on the Qt3D example "teaservice", specifically sceneobject.cpp.
- *
- *  Created on: Aug 17, 2011
- *      Author: heber
- */
-
-// include config.h
-#ifdef HAVE_CONFIG_H
-#include <config.h>
-#endif
-
-#include "GLMoleculeScene.hpp"
-
-#include "GLMoleculeObject.hpp"
-#include "GLMoleculeObject_atom.hpp"
-#include "GLMoleculeObject_bond.hpp"
-
-#include "CodePatterns/MemDebug.hpp"
-
-#include "atom.hpp"
-#include "Bond/bond.hpp"
-#include "molecule.hpp"
-
-
-GLMoleculeScene::GLMoleculeScene(QObject *parent, molecule *_mol) :
-   QObject(parent), mol(_mol)
-{
-  for (molecule::const_iterator atomiter = mol->begin();
-      atomiter != mol->end();
-      ++atomiter) {
-    // create atom objects in scene
-    GLMoleculeObject_atom *atomObject= new GLMoleculeObject_atom(this, *atomiter);
-    AtomsinMoleculeMap.insert( make_pair((*atomiter)->getId(), atomObject) );
-    connect (atomObject, SIGNAL(clicked(atomId_t)), this, SLOT(atomClicked(atomId_t)));
-    connect (atomObject, SIGNAL(hoverChanged()), this, SIGNAL(hoverChanged()));
-
-    // create its bonds
-    const BondList &bonds = (*atomiter)->getListOfBonds();
-    for (BondList::const_iterator bonditer = bonds.begin();
-        bonditer != bonds.end();
-        ++bonditer) {
-      if ((*bonditer)->leftatom->getId() == (*atomiter)->getId()) {
-        // create bond objects in scene
-        const double distance =
-            (*bonditer)->leftatom->getPosition().distance((*bonditer)->rightatom->getPosition())/2.;
-        GLMoleculeObject_bond *bondObject= new GLMoleculeObject_bond(this, *bonditer, distance, GLMoleculeObject_bond::left);
-        BondsinMoleculeMap.insert( make_pair(
-            make_pair(
-                (*bonditer)->leftatom->getId(),
-                (*bonditer)->rightatom->getId()
-                ),
-            bondObject) );
-        bondObject= new GLMoleculeObject_bond(this, *bonditer, distance, GLMoleculeObject_bond::right);
-        BondsinMoleculeMap.insert( make_pair(
-            make_pair(
-                (*bonditer)->rightatom->getId(),
-                (*bonditer)->leftatom->getId()
-                ),
-            bondObject) );
-      }
-    }
-  }
-}
-
-GLMoleculeScene::~GLMoleculeScene()
-{
-  // remove all elements
-  GLMoleculeObject::cleanMaterialMap();
-}
-
-void GLMoleculeScene::initialize(QGLView *view, QGLPainter *painter)
-{
-  // Initialize all of the mesh objects that we have as children.
-   foreach (QObject *obj, children()) {
-     GLMoleculeObject *meshobj = qobject_cast<GLMoleculeObject *>(obj);
-       if (meshobj)
-         meshobj->initialize(view, painter);
-   }
-}
-
-void GLMoleculeScene::draw(QGLPainter *painter)
-{
-   // Draw all of the mesh objects that we have as children.
-   foreach (QObject *obj, children()) {
-     GLMoleculeObject *meshobj = qobject_cast<GLMoleculeObject *>(obj);
-       if (meshobj)
-         meshobj->draw(painter);
-   }
-}
-
-void GLMoleculeScene::atomClicked(atomId_t no)
-{
-   qDebug("GLMoleculeScene: atom %d has been clicked inside molecule %d", no, mol->getId());
-   emit clicked(no, mol->getId());
-}
Index: src/UIElements/Views/Qt4/Qt3D/GLMoleculeScene.hpp
===================================================================
--- src/UIElements/Views/Qt4/Qt3D/GLMoleculeScene.hpp	(revision e638f994597de00dea35ab713ed67450ce61ec6e)
+++ 	(revision )
@@ -1,64 +1,0 @@
-/*
- * GLMoleculeScene.hpp
- *
- *  This is based on the Qt3D example "teaservice", specifically sceneobject.h.
- *
- *  Created on: Aug 17, 2011
- *      Author: heber
- */
-
-#ifndef GLMOLECULESCENE_HPP_
-#define GLMOLECULESCENE_HPP_
-
-// include config.h
-#ifdef HAVE_CONFIG_H
-#include <config.h>
-#endif
-
-#include <QtCore/qobject.h>
-#include <Qt3D/qglpainter.h>
-
-#include "atom.hpp"
-#include "molecule.hpp"
-
-class QGLView;
-class GLMoleculeObject_atom;
-class GLMoleculeObject_bond;
-
-/** This class represent a single molecule within the scene with all its atoms
- *  and bonds.
- *
- */
-class GLMoleculeScene : public QObject
-{
-  Q_OBJECT
-public:
-  explicit GLMoleculeScene(QObject *parent, molecule *_mol);
-  virtual ~GLMoleculeScene();
-
-  virtual void initialize(QGLView *view, QGLPainter *painter);
-  virtual void draw(QGLPainter *painter);
-
-private slots:
-  void atomClicked(atomId_t no);
-
-signals:
-  void pressed();
-  void released();
-  void clicked();
-  void clicked(atomId_t, moleculeId_t);
-  void doubleClicked();
-  void hoverChanged();
-
-private:
-   typedef std::map< size_t, GLMoleculeObject_atom* > AtomNodeMap;
-   typedef std::map< std::pair< size_t, size_t> , GLMoleculeObject_bond* > BondNodeMap;
-   AtomNodeMap AtomsinMoleculeMap;
-   BondNodeMap BondsinMoleculeMap;
-
-   molecule *mol;
-};
-
-
-
-#endif /* GLMOLECULESCENE_HPP_ */
Index: src/UIElements/Views/Qt4/Qt3D/GLWorldScene.cpp
===================================================================
--- src/UIElements/Views/Qt4/Qt3D/GLWorldScene.cpp	(revision e638f994597de00dea35ab713ed67450ce61ec6e)
+++ src/UIElements/Views/Qt4/Qt3D/GLWorldScene.cpp	(revision 7188b130f196698d071c5787a688b84efdfde506)
@@ -22,10 +22,14 @@
 #include "GLWorldScene.hpp"
 
-#include "GLMoleculeScene.hpp"
 #include "GLMoleculeObject.hpp"
+#include "GLMoleculeObject_atom.hpp"
+#include "GLMoleculeObject_bond.hpp"
 
 #include "CodePatterns/MemDebug.hpp"
 
+#include "CodePatterns/Log.hpp"
+
 #include "atom.hpp"
+#include "Bond/bond.hpp"
 #include "molecule.hpp"
 #include "World.hpp"
@@ -41,5 +45,8 @@
 
 GLWorldScene::~GLWorldScene()
-{}
+{
+  // remove all elements
+  GLMoleculeObject::cleanMaterialMap();
+}
 
 /** Initialise the WorldScene with molecules and atoms from World.
@@ -55,34 +62,149 @@
         Runner++) {
       // create molecule
-      GLMoleculeScene * const molObject = new GLMoleculeScene(this, *Runner);
-      MoleculeSceneList.push_back(molObject);
-      connect (molObject, SIGNAL(clicked(atomId_t, moleculeId_t)), this, SLOT(molClicked(atomId_t, moleculeId_t)));
-      connect (molObject, SIGNAL(hoverChanged()), this, SIGNAL(changed()));
+      for (molecule::const_iterator atomiter = (*Runner)->begin();
+          atomiter != (*Runner)->end();
+          ++atomiter) {
+        // create atom objects in scene
+        atomInserted(*atomiter);
+
+        // create its bonds
+        const BondList &bonds = (*atomiter)->getListOfBonds();
+        for (BondList::const_iterator bonditer = bonds.begin();
+            bonditer != bonds.end();
+            ++bonditer) {
+          if ((*bonditer)->leftatom->getId() == (*atomiter)->getId()) {
+            // create bond objects in scene
+            bondInserted(*bonditer);
+          }
+        }
+      }
     }
   }
 }
 
+/** Adds an atom to the scene.
+ *
+ * @param _atom atom to add
+ */
+void GLWorldScene::atomInserted(const atom *_atom)
+{
+  LOG(0, "GLWorldScene: Received signal atomInserted for atom "+toString(_atom->getId())+".");
+  GLMoleculeObject_atom *atomObject = new GLMoleculeObject_atom(this, _atom);
+  AtomNodeMap::iterator iter = AtomsinMoleculeMap.find(_atom->getId());
+  ASSERT(iter == AtomsinMoleculeMap.end(),
+      "GLWorldScene::atomAdded() - same atom "+_atom->getName()+" added again.");
+  AtomsinMoleculeMap.insert( make_pair(_atom->getId(), atomObject) );
+  connect (atomObject, SIGNAL(clicked(atomId_t)), this, SLOT(atomClicked(atomId_t)));
+  connect (atomObject, SIGNAL(hoverChanged()), this, SIGNAL(hoverChanged()));
+  emit changed();
+}
+
+/** Removes an atom from the scene.
+ *
+ * @param _atom atom to remove
+ */
+void GLWorldScene::atomRemoved(const atom *_atom)
+{
+  LOG(0, "GLWorldScene: Received signal atomRemoved for atom "+toString(_atom->getId())+".");
+  // remove all its bonds
+  const BondList& bondlist = _atom->getListOfBonds();
+  for (BondList::const_iterator iter = bondlist.begin(); iter != bondlist.end(); ++iter) {
+    bondRemoved(*iter);
+  }
+  // remove atoms
+  AtomNodeMap::iterator iter = AtomsinMoleculeMap.find(_atom->getId());
+  ASSERT(iter != AtomsinMoleculeMap.end(),
+      "GLWorldScene::atomRemoved() - atom "+_atom->getName()+" not on display.");
+  GLMoleculeObject_atom *atomObject = iter->second;
+  atomObject->disconnect();
+  AtomsinMoleculeMap.erase(iter);
+  delete atomObject;
+  emit changed();
+}
+
+/** Adds an bond to the scene.
+ *
+ * @param _bond bond to add
+ */
+void GLWorldScene::bondInserted(const bond *_bond)
+{
+  const double distance =
+      _bond->leftatom->getPosition().distance(_bond->rightatom->getPosition())/2.;
+  {
+    // left bond
+    const BondIds Leftids( make_pair(_bond->leftatom->getId(), _bond->rightatom->getId()) );
+    BondNodeMap::iterator iter = BondsinMoleculeMap.find(Leftids);
+    ASSERT(iter == BondsinMoleculeMap.end(),
+        "GLWorldScene::bondAdded() - same left-sided bond "+toString(*_bond)+" added again.");
+    GLMoleculeObject_bond *bondObject =
+        new GLMoleculeObject_bond(this, _bond, distance, GLMoleculeObject_bond::left);
+    BondsinMoleculeMap.insert( make_pair(Leftids, bondObject) );
+  }
+  {
+    // right bond
+    const BondIds Rightids( make_pair(_bond->rightatom->getId(), _bond->leftatom->getId()) );
+    BondNodeMap::iterator iter = BondsinMoleculeMap.find(Rightids);
+    ASSERT(iter == BondsinMoleculeMap.end(),
+        "GLWorldScene::bondAdded() - same right-sided bond "+toString(*_bond)+" added again.");
+    GLMoleculeObject_bond *bondObject =
+        new GLMoleculeObject_bond(this, _bond, distance, GLMoleculeObject_bond::right);
+    BondsinMoleculeMap.insert( make_pair(Rightids, bondObject) );
+  }
+  emit changed();
+}
+
+/** Removes an bond from the scene.
+ *
+ * @param _bond bond to remove
+ */
+void GLWorldScene::bondRemoved(const bond *_bond)
+{
+  {
+    // left bond
+    const BondIds Leftids( make_pair(_bond->leftatom->getId(), _bond->rightatom->getId()) );
+    BondNodeMap::iterator leftiter = BondsinMoleculeMap.find( Leftids );
+    ASSERT(leftiter != BondsinMoleculeMap.end(),
+        "GLWorldScene::bondRemoved() - bond "+toString(*_bond)+" not on display.");
+    GLMoleculeObject_bond *bondObject = leftiter->second;
+    BondsinMoleculeMap.erase(leftiter);
+    delete bondObject;
+  }
+  {
+    // right bond
+    const BondIds Rightids( make_pair(_bond->rightatom->getId(), _bond->leftatom->getId()) );
+    BondNodeMap::iterator rightiter = BondsinMoleculeMap.find( Rightids );
+    ASSERT(rightiter != BondsinMoleculeMap.end(),
+        "GLWorldScene::bondRemoved() - bond "+toString(*_bond)+" not on display.");
+    GLMoleculeObject_bond *bondObject = rightiter->second;
+    BondsinMoleculeMap.erase(rightiter);
+    delete bondObject;
+  }
+  emit changed();
+}
+
 void GLWorldScene::initialize(QGLView *view, QGLPainter *painter) const
 {
-  for (List_MoleculeScene::const_iterator iter = MoleculeSceneList.begin();
-      iter != MoleculeSceneList.end();
-      ++iter) {
-    (*iter)->initialize(view, painter);
-  }
-}
-
+  // Initialize all of the mesh objects that we have as children.
+   foreach (QObject *obj, children()) {
+     GLMoleculeObject *meshobj = qobject_cast<GLMoleculeObject *>(obj);
+       if (meshobj)
+         meshobj->initialize(view, painter);
+   }
+}
 
 void GLWorldScene::draw(QGLPainter *painter) const
 {
-  for (List_MoleculeScene::const_iterator iter = MoleculeSceneList.begin();
-      iter != MoleculeSceneList.end();
-      ++iter) {
-    (*iter)->draw(painter);
-  }
-}
-
-void GLWorldScene::molClicked(atomId_t atom_no, moleculeId_t mol_no)
-{
-   qDebug("WorldScene: atom %d of molecule %d has been clicked", atom_no, mol_no);
-}
-
+   // Draw all of the mesh objects that we have as children.
+   foreach (QObject *obj, children()) {
+     GLMoleculeObject *meshobj = qobject_cast<GLMoleculeObject *>(obj);
+       if (meshobj)
+         meshobj->draw(painter);
+   }
+}
+
+void GLWorldScene::atomClicked(atomId_t no)
+{
+   qDebug("GLWorldScene: atom %d has been clicked.", no);
+   emit clicked(no);
+}
+
Index: src/UIElements/Views/Qt4/Qt3D/GLWorldScene.hpp
===================================================================
--- src/UIElements/Views/Qt4/Qt3D/GLWorldScene.hpp	(revision e638f994597de00dea35ab713ed67450ce61ec6e)
+++ src/UIElements/Views/Qt4/Qt3D/GLWorldScene.hpp	(revision 7188b130f196698d071c5787a688b84efdfde506)
@@ -18,6 +18,7 @@
 #include <Qt/qobject.h>
 
-#include "atom.hpp"
 #include "molecule.hpp"
+
+class atom;
 
 class QGLPainter;
@@ -28,5 +29,4 @@
 class GLMoleculeObject_atom;
 class GLMoleculeObject_bond;
-class GLMoleculeScene;
 
 /** This class contains a list of all molecules in the world.
@@ -53,14 +53,26 @@
 signals:
   void changed();
+  void pressed();
+  void released();
+  void clicked();
+  void clicked(atomId_t);
+  void doubleClicked();
+  void hoverChanged();
 
 private slots:
-  void molClicked(atomId_t atom_no, moleculeId_t mol_no);
+  void atomClicked(atomId_t no);
+  void atomInserted(const atom *_atom);
+  void atomRemoved(const atom *_atom);
+  void bondInserted(const bond *_bond);
+  void bondRemoved(const bond *_bond);
 
 private:
   void init();
 
-  typedef std::list< GLMoleculeScene * > List_MoleculeScene;
-
-  List_MoleculeScene MoleculeSceneList;
+  typedef std::pair< size_t, size_t> BondIds;
+  typedef std::map< size_t, GLMoleculeObject_atom* > AtomNodeMap;
+  typedef std::map< BondIds , GLMoleculeObject_bond* > BondNodeMap;
+  AtomNodeMap AtomsinMoleculeMap;
+  BondNodeMap BondsinMoleculeMap;
 };
 
Index: src/UIElements/Views/Qt4/Qt3D/GLWorldView.cpp
===================================================================
--- src/UIElements/Views/Qt4/Qt3D/GLWorldView.cpp	(revision e638f994597de00dea35ab713ed67450ce61ec6e)
+++ src/UIElements/Views/Qt4/Qt3D/GLWorldView.cpp	(revision 7188b130f196698d071c5787a688b84efdfde506)
@@ -26,6 +26,10 @@
 #include "CodePatterns/MemDebug.hpp"
 
+#include "CodePatterns/Log.hpp"
+
+#include "World.hpp"
+
 GLWorldView::GLWorldView(QWidget *parent)
-   : QGLView(parent), worldscene(NULL)
+   : QGLView(parent), Observer("GLWorldView"), worldscene(NULL)
 {
    worldscene = new GLWorldScene(this);
@@ -34,4 +38,12 @@
 
    connect(worldscene, SIGNAL(changed()), this, SLOT(updateGL()));
+   connect(this, SIGNAL(atomInserted(const atom *)), worldscene, SLOT(atomInserted(const atom *)));
+   connect(this, SIGNAL(atomRemoved(const atom *)), worldscene, SLOT(atomRemoved(const atom *)));
+   connect(this, SIGNAL(changed()), this, SLOT(updateGL()));
+
+   // sign on to changes in the world
+   World::getInstance().signOn(this);
+   World::getInstance().signOn(this, World::getInstance().getChannel(World::AtomInserted));
+   World::getInstance().signOn(this, World::getInstance().getChannel(World::AtomRemoved));
 }
 
@@ -41,4 +53,45 @@
 }
 
+/**
+ * Update operation which can be invoked by the observable (which should be the
+ * change tracker here).
+ */
+void GLWorldView::update(Observable *publisher)
+{
+  emit changed();
+}
+
+/**
+ * The observable can tell when it dies.
+ */
+void GLWorldView::subjectKilled(Observable *publisher) {}
+
+/** Listen to specific changes to the world.
+ *
+ * @param publisher ref to observable.
+ * @param notification type of notification
+ */
+void GLWorldView::recieveNotification(Observable *publisher, Notification_ptr notification)
+{
+  switch (notification->getChannelNo()) {
+    case World::AtomInserted:
+    {
+      const atom *_atom = World::getInstance().lastChanged<atom>();
+      LOG(0, "GLWorldView: Received notification that atom "+toString(_atom->getId())+" has been inserted.");
+      emit atomInserted(_atom);
+      break;
+    }
+    case World::AtomRemoved:
+    {
+      const atom *_atom = World::getInstance().lastChanged<atom>();
+      LOG(0, "GLWorldView: Received notification that atom "+toString(_atom->getId())+" has been removed.");
+      emit atomRemoved(_atom);
+      break;
+    }
+    default:
+      ASSERT(0, "GLWorldView::recieveNotification() - we cannot get here.");
+      break;
+  }
+}
 
 void GLWorldView::initializeGL(QGLPainter *painter)
Index: src/UIElements/Views/Qt4/Qt3D/GLWorldView.hpp
===================================================================
--- src/UIElements/Views/Qt4/Qt3D/GLWorldView.hpp	(revision e638f994597de00dea35ab713ed67450ce61ec6e)
+++ src/UIElements/Views/Qt4/Qt3D/GLWorldView.hpp	(revision 7188b130f196698d071c5787a688b84efdfde506)
@@ -16,4 +16,8 @@
 #include "qglview.h"
 
+#include "CodePatterns/Observer.hpp"
+
+#include "World.hpp"
+
 class QKeyEvent;
 class GLWorldScene;
@@ -24,5 +28,5 @@
  *
  */
-class GLWorldView : public QGLView
+class GLWorldView : public QGLView, public Observer
 {
   Q_OBJECT
@@ -31,5 +35,17 @@
   virtual ~GLWorldView();
 
+  // Observer functions
+  void update(Observable *publisher);
+  void subjectKilled(Observable *publisher);
+  void recieveNotification(Observable *publisher, Notification_ptr notification);
+
 public slots:
+
+signals:
+  void changed();
+  void atomInserted(const atom *_atom);
+  void atomRemoved(const atom *_atom);
+  void moleculeInserted(const molecule *_mol);
+  void moleculeRemoved(const molecule *_mol);
 
 protected:
