Index: src/UIElements/Views/Qt4/Qt3D/GLMoleculeObject_shape.cpp
===================================================================
--- src/UIElements/Views/Qt4/Qt3D/GLMoleculeObject_shape.cpp	(revision 70e9eb61d4629017938dd5719f7e63a90e269e8b)
+++ src/UIElements/Views/Qt4/Qt3D/GLMoleculeObject_shape.cpp	(revision 85c36d18bc07088784b26e3f1c1031fd38b98dfb)
@@ -61,5 +61,5 @@
 typedef QGLSceneNode *MeshList[GLMoleculeObject::DETAILTYPES_MAX];
 
-QGLSceneNode *createShapeMesh(const Shape &shape, QObject *parent)
+QGLSceneNode *createShapeMesh(Shape &shape, QObject *parent)
 {
   // Create some points on our shape.
@@ -104,5 +104,5 @@
 }
 
-GLMoleculeObject_shape::GLMoleculeObject_shape(const Shape &shape, QObject *parent) :
+GLMoleculeObject_shape::GLMoleculeObject_shape(Shape &shape, QObject *parent) :
     GLMoleculeObject(createShapeMesh(shape, parent), parent),
     m_shape(shape)
@@ -115,4 +115,6 @@
   material->setShininess( 128 );
   setMaterial(material);
+
+  m_enabled = false;
 }
 
@@ -121,7 +123,14 @@
 }
 
+void GLMoleculeObject_shape::enable(bool enabled)
+{
+  m_enabled = enabled;
+}
+
 
 void GLMoleculeObject_shape::draw(QGLPainter *painter, const QVector4D &cameraPlane)
 {
+  if (!m_enabled)
+    return;
   painter->modelViewMatrix().push();
 
Index: src/UIElements/Views/Qt4/Qt3D/GLMoleculeObject_shape.hpp
===================================================================
--- src/UIElements/Views/Qt4/Qt3D/GLMoleculeObject_shape.hpp	(revision 70e9eb61d4629017938dd5719f7e63a90e269e8b)
+++ src/UIElements/Views/Qt4/Qt3D/GLMoleculeObject_shape.hpp	(revision 85c36d18bc07088784b26e3f1c1031fd38b98dfb)
@@ -32,12 +32,15 @@
    Q_OBJECT
 public:
-   explicit GLMoleculeObject_shape(const Shape &shape, QObject *parent=0);
+   explicit GLMoleculeObject_shape(Shape &shape, QObject *parent=0);
    virtual ~GLMoleculeObject_shape();
 
    virtual void draw(QGLPainter *painter, const QVector4D &cameraPlane);
+   void enable(bool enabled);
+   Shape *getShape(){ return &m_shape;  }
 
 private:
 
-   const Shape &m_shape;
+   Shape &m_shape;
+   bool m_enabled;
 };
 
Index: src/UIElements/Views/Qt4/Qt3D/GLWorldScene.cpp
===================================================================
--- src/UIElements/Views/Qt4/Qt3D/GLWorldScene.cpp	(revision 70e9eb61d4629017938dd5719f7e63a90e269e8b)
+++ src/UIElements/Views/Qt4/Qt3D/GLWorldScene.cpp	(revision 85c36d18bc07088784b26e3f1c1031fd38b98dfb)
@@ -60,4 +60,5 @@
 #include "Descriptors/AtomIdDescriptor.hpp"
 #include "Helpers/helpers.hpp"
+#include "Shapes/ShapeRegistry.hpp"
 #include "molecule.hpp"
 #include "World.hpp"
@@ -300,5 +301,5 @@
  * @param shape shape to be added
  */
-void GLWorldScene::addShape(const Shape &shape)
+void GLWorldScene::addShape(Shape &shape)
 {
   GLMoleculeObject_shape *shapeObject = new GLMoleculeObject_shape(shape, this);
@@ -309,12 +310,20 @@
 }
 
-void GLWorldScene::clearShapes()
+void GLWorldScene::removeShape(Shape &shape)
+{
+  ShapeNodeMap::iterator iter = ShapesinSceneMap.find(shape.getName());
+  ASSERT(iter == ShapesinSceneMap.end(),
+      "GLWorldScene::removeShape() - shape "+shape.getName()+" not in scene.");
+  delete(iter->second);
+}
+
+void GLWorldScene::updateSelectedShapes()
 {
   foreach (QObject *obj, children()) {
     GLMoleculeObject_shape *shapeobj = qobject_cast<GLMoleculeObject_shape *>(obj);
-      if (shapeobj)
-        delete(shapeobj);
-  }
-  ShapesinSceneMap.clear();
+      if (shapeobj){
+        shapeobj->enable(ShapeRegistry::getInstance().isSelected(shapeobj->getShape()));
+      }
+  }
 }
 
Index: src/UIElements/Views/Qt4/Qt3D/GLWorldScene.hpp
===================================================================
--- src/UIElements/Views/Qt4/Qt3D/GLWorldScene.hpp	(revision 70e9eb61d4629017938dd5719f7e63a90e269e8b)
+++ src/UIElements/Views/Qt4/Qt3D/GLWorldScene.hpp	(revision 85c36d18bc07088784b26e3f1c1031fd38b98dfb)
@@ -89,6 +89,7 @@
 
 public:
-  void addShape(const Shape &shape);
-  void clearShapes();
+  void addShape(Shape &shape);
+  void removeShape(Shape &shape);
+  void updateSelectedShapes();
 
 private:
Index: src/UIElements/Views/Qt4/Qt3D/GLWorldView.cpp
===================================================================
--- src/UIElements/Views/Qt4/Qt3D/GLWorldView.cpp	(revision 70e9eb61d4629017938dd5719f7e63a90e269e8b)
+++ src/UIElements/Views/Qt4/Qt3D/GLWorldView.cpp	(revision 85c36d18bc07088784b26e3f1c1031fd38b98dfb)
@@ -96,4 +96,5 @@
 
   ShapeRegistry::getInstance().signOn(this);
+  ShapeRegistry::getInstance().signOn(this, ShapeRegistry::ShapeInserted);
   ShapeRegistry::getInstance().signOn(this, ShapeRegistry::ShapeRemoved);
   ShapeRegistry::getInstance().signOn(this, ShapeRegistry::SelectionChanged);
@@ -112,4 +113,5 @@
   AtomObserver::getInstance().signOff(this, AtomObservable::PositionChanged);
   ShapeRegistry::getInstance().signOff(this);
+  ShapeRegistry::getInstance().signOff(this, ShapeRegistry::ShapeInserted);
   ShapeRegistry::getInstance().signOff(this, ShapeRegistry::ShapeRemoved);
   ShapeRegistry::getInstance().signOff(this, ShapeRegistry::SelectionChanged);
@@ -367,12 +369,17 @@
   } else if (static_cast<ShapeRegistry*>(publisher) == ShapeRegistry::getPointer()) {
     switch (notification->getChannelNo()) {
+      case ShapeRegistry::ShapeInserted:
+      {
+        worldscene->addShape(*ShapeRegistry::getInstance().lastChanged());
+        break;
+      }
       case ShapeRegistry::ShapeRemoved:
       {
-        updateSelectedShapes();
+        worldscene->removeShape(*ShapeRegistry::getInstance().lastChanged());
         break;
       }
       case ShapeRegistry::SelectionChanged:
       {
-        updateSelectedShapes();
+        worldscene->updateSelectedShapes();
         break;
       }
@@ -659,12 +666,4 @@
 {
   emit hoverChanged(_atom);
-}
-
-void GLWorldView::updateSelectedShapes()
-{
-  worldscene->clearShapes();
-  std::vector<Shape*> selectedShapes = ShapeRegistry::getInstance().getSelectedShapes();
-  for (unsigned int i=0; i<selectedShapes.size(); i++)
-    worldscene->addShape(*selectedShapes[i]);
 }
 
Index: src/UIElements/Views/Qt4/Qt3D/GLWorldView.hpp
===================================================================
--- src/UIElements/Views/Qt4/Qt3D/GLWorldView.hpp	(revision 70e9eb61d4629017938dd5719f7e63a90e269e8b)
+++ src/UIElements/Views/Qt4/Qt3D/GLWorldView.hpp	(revision 85c36d18bc07088784b26e3f1c1031fd38b98dfb)
@@ -98,5 +98,4 @@
 
 private:
-  void updateSelectedShapes();
 
   GLWorldScene *worldscene;
Index: src/UIElements/Views/Qt4/QtShapeList.cpp
===================================================================
--- src/UIElements/Views/Qt4/QtShapeList.cpp	(revision 70e9eb61d4629017938dd5719f7e63a90e269e8b)
+++ src/UIElements/Views/Qt4/QtShapeList.cpp	(revision 85c36d18bc07088784b26e3f1c1031fd38b98dfb)
@@ -39,4 +39,6 @@
 #include "CodePatterns/MemDebug.hpp"
 
+#include "CodePatterns/Observer/Notification.hpp"
+
 #include "Shapes/ShapeFactory.hpp"
 #include "Shapes/ShapeRegistry.hpp"
@@ -66,7 +68,10 @@
 	selecting = false;
 
-	refill();
+	refill(NULL);
 
 	ShapeRegistry::getInstance().signOn(this);
+  ShapeRegistry::getInstance().signOn(this, ShapeRegistry::ShapeInserted);
+  ShapeRegistry::getInstance().signOn(this, ShapeRegistry::ShapeRemoved);
+  ShapeRegistry::getInstance().signOn(this, ShapeRegistry::SelectionChanged);
 
   connect(this,SIGNAL(itemSelectionChanged()),this,SLOT(rowSelected()));
@@ -76,12 +81,39 @@
 {
   ShapeRegistry::getInstance().signOff(this);
+  ShapeRegistry::getInstance().signOff(this, ShapeRegistry::ShapeInserted);
+  ShapeRegistry::getInstance().signOff(this, ShapeRegistry::ShapeRemoved);
+  ShapeRegistry::getInstance().signOff(this, ShapeRegistry::SelectionChanged);
 }
 
-void QtShapeList::update(Observable *publisher) {
+void QtShapeList::update(Observable *publisher) {}
 
-  refill();
+void QtShapeList::recieveNotification(Observable *publisher, Notification_ptr notification)
+{
+  if (static_cast<ShapeRegistry*>(publisher) == ShapeRegistry::getPointer()) {
+    switch (notification->getChannelNo()) {
+      case ShapeRegistry::ShapeInserted:
+      {
+        refill(NULL);
+        break;
+      }
+      case ShapeRegistry::ShapeRemoved:
+      {
+        refill(ShapeRegistry::getInstance().lastChanged());
+        break;
+      }
+      case ShapeRegistry::SelectionChanged:
+      {
+        refill(NULL);
+        break;
+      }
+      default:
+        ASSERT(0, "QtShapeList::recieveNotification() - we cannot get here.");
+        break;
+    }
+  } else
+    ASSERT(0, "QtShapeList::recieveNotification() - received notification from unknown source.");
 }
 
-void QtShapeList::refill() {
+void QtShapeList::refill(::Shape *ignore) {
 
   clearing = true;
@@ -95,4 +127,6 @@
   for (iter = reg.getBeginIter(); iter != reg.getEndIter(); iter ++){
     ::Shape *s = iter->second;
+    if (s == ignore)
+      continue;
 
     QTreeWidgetItem *treeItem = new QTreeWidgetItem(this);
Index: src/UIElements/Views/Qt4/QtShapeList.hpp
===================================================================
--- src/UIElements/Views/Qt4/QtShapeList.hpp	(revision 70e9eb61d4629017938dd5719f7e63a90e269e8b)
+++ src/UIElements/Views/Qt4/QtShapeList.hpp	(revision 85c36d18bc07088784b26e3f1c1031fd38b98dfb)
@@ -31,6 +31,7 @@
   virtual void update(Observable *publisher);
   virtual void subjectKilled(Observable *publisher);
+  virtual void recieveNotification(Observable *publisher, Notification_ptr notification);
   //virtual void paintEvent(QPaintEvent * event);
-  void refill();
+  void refill(::Shape *ignore);
 
   static const int COLUMNCOUNT;
