Index: src/UIElements/Views/Qt4/Qt3D/GLMoleculeObject_atom.cpp
===================================================================
--- src/UIElements/Views/Qt4/Qt3D/GLMoleculeObject_atom.cpp	(revision 8592c990d61a1b6a469219b569e217550fa13b6b)
+++ src/UIElements/Views/Qt4/Qt3D/GLMoleculeObject_atom.cpp	(revision ce4126dccd4487e1bb02f6582b75fc09fdf73408)
@@ -69,5 +69,4 @@
   }
   World::getInstance().signOn(this, World::SelectionChanged);
-  WorldTime::getInstance().signOn(this, WorldTime::TimeChanged);
 
   // set the object's id
@@ -89,5 +88,4 @@
   }
   World::getInstance().signOff(this, World::SelectionChanged);
-  WorldTime::getInstance().signOff(this, WorldTime::TimeChanged);
 }
 
@@ -230,19 +228,4 @@
         break;
     }
-  } else {
-    // notification from world
-#ifdef LOG_OBSERVER
-    observerLog().addMessage() << "++ Update of Observer "<< observerLog().getName(static_cast<Observer *>(this))
-          << " received notification from Worldtime for channel "
-          << notification->getChannelNo() << ".";
-#endif
-    switch (notification->getChannelNo()) {
-      case WorldTime::TimeChanged:
-        resetPosition();
-        emit changed();
-        break;
-      default:
-        break;
-    }
   }
 }
Index: src/UIElements/Views/Qt4/Qt3D/GLMoleculeObject_atom.hpp
===================================================================
--- src/UIElements/Views/Qt4/Qt3D/GLMoleculeObject_atom.hpp	(revision 8592c990d61a1b6a469219b569e217550fa13b6b)
+++ src/UIElements/Views/Qt4/Qt3D/GLMoleculeObject_atom.hpp	(revision ce4126dccd4487e1bb02f6582b75fc09fdf73408)
@@ -22,4 +22,6 @@
 #include "types.hpp"
 
+class GLWorldScene;
+
 class GLMoleculeObject_atom : public GLMoleculeObject, public Observer
 {
@@ -42,5 +44,8 @@
   void indexChanged(GLMoleculeObject_atom *ob, int oldId, int newId);
 
-public:
+private:
+  //!> grant GLWorldScene acess to reset functions
+  friend class GLWorldScene;
+
   void resetPosition();
 
Index: src/UIElements/Views/Qt4/Qt3D/GLMoleculeObject_bond.hpp
===================================================================
--- src/UIElements/Views/Qt4/Qt3D/GLMoleculeObject_bond.hpp	(revision 8592c990d61a1b6a469219b569e217550fa13b6b)
+++ src/UIElements/Views/Qt4/Qt3D/GLMoleculeObject_bond.hpp	(revision ce4126dccd4487e1bb02f6582b75fc09fdf73408)
@@ -23,4 +23,6 @@
 class atom;
 
+class GLWorldScene;
+
 class GLMoleculeObject_bond : public GLMoleculeObject, public Observer
 {
@@ -41,4 +43,7 @@
 
 private:
+  //!> grant WorldScene access to reset functions
+  friend class GLWorldScene;
+
   /** Recalculates the position of the cylinder representing the bond.
    *
Index: src/UIElements/Views/Qt4/Qt3D/GLWorldScene.cpp
===================================================================
--- src/UIElements/Views/Qt4/Qt3D/GLWorldScene.cpp	(revision 8592c990d61a1b6a469219b569e217550fa13b6b)
+++ src/UIElements/Views/Qt4/Qt3D/GLWorldScene.cpp	(revision ce4126dccd4487e1bb02f6582b75fc09fdf73408)
@@ -94,4 +94,6 @@
   }
 
+  connect(this, SIGNAL(updated()), this, SLOT(update()));
+
   setSelectionMode(SelectAtom);
 
@@ -110,26 +112,69 @@
 void GLWorldScene::init()
 {
-  const std::vector<molecule*> &molecules = World::getInstance().getAllMolecules();
-
-  if (molecules.size() > 0) {
-    for (std::vector<molecule*>::const_iterator Runner = molecules.begin();
-        Runner != molecules.end();
-        Runner++) {
-
-      for (molecule::const_iterator atomiter = (*Runner)->begin();
-          atomiter != (*Runner)->end();
-          ++atomiter) {
-        // create atom objects in scene
+  const std::vector<atom*> &atoms = World::getInstance().getAllAtoms();
+
+  if (atoms.size() > 0) {
+    for (std::vector<atom*>::const_iterator atomiter = atoms.begin();
+        atomiter != atoms.end();
+        atomiter++) {
+      // create atom objects in scene
+      atomInserted((*atomiter)->getId());
+
+      // create bond objects in scene
+      const BondList &bondlist = (*atomiter)->getListOfBonds();
+      for (BondList::const_iterator bonditer = bondlist.begin();
+          bonditer != bondlist.end();
+          ++bonditer) {
+        const bond::ptr _bond = *bonditer;
+        const GLMoleculeObject_bond::SideOfBond side = (_bond->leftatom == *atomiter) ?
+            GLMoleculeObject_bond::left : GLMoleculeObject_bond::right;
+        bondInserted(_bond, side);
+      }
+    }
+  }
+}
+
+/** Update the WorldScene with molecules and atoms from World.
+ *
+ * This function should be called after e.g. WorldTime::TimeChanged was
+ * received or after another molecule has been loaded.
+ *
+ */
+void GLWorldScene::update()
+{
+  const std::vector<atom*> &atoms = World::getInstance().getAllAtoms();
+
+  if (atoms.size() > 0) {
+    for (std::vector<atom*>::const_iterator atomiter = atoms.begin();
+        atomiter != atoms.end();
+        atomiter++) {
+      // check whether atom already exists
+      const atomId_t atomid = (*atomiter)->getId();
+      const bool atom_present = AtomsinSceneMap.count(atomid);
+      if (!atom_present)
         atomInserted((*atomiter)->getId());
-
-        // create bond objects in scene
-        const BondList &bondlist = (*atomiter)->getListOfBonds();
-        for (BondList::const_iterator bonditer = bondlist.begin();
-            bonditer != bondlist.end();
-            ++bonditer) {
-          const bond::ptr _bond = *bonditer;
-          const GLMoleculeObject_bond::SideOfBond side = (_bond->leftatom == *atomiter) ?
-              GLMoleculeObject_bond::left : GLMoleculeObject_bond::right;
+      else
+        AtomsinSceneMap[atomid]->resetPosition();
+
+
+      // create bond objects in scene
+      const BondList &bondlist = (*atomiter)->getListOfBonds();
+      for (BondList::const_iterator bonditer = bondlist.begin();
+          bonditer != bondlist.end();
+          ++bonditer) {
+        const bond::ptr _bond = *bonditer;
+        const GLMoleculeObject_bond::SideOfBond side = (_bond->leftatom == *atomiter) ?
+            GLMoleculeObject_bond::left : GLMoleculeObject_bond::right;
+        bool bond_present = false;
+        const BondIds ids = getBondIds(_bond,side);
+        if (atom_present) {
+          // check whether bond is not present already
+          bond_present = BondsinSceneMap.count(ids);
+        }
+        if (!bond_present)
           bondInserted(_bond, side);
+        else {
+          BondsinSceneMap[ids]->resetPosition();
+          BondsinSceneMap[ids]->resetWidth();
         }
       }
@@ -246,16 +291,14 @@
 }
 
-/** Adds a bond to the scene.
- *
- * @param _bond bond to add
- * @param side which side of the bond (left or right)
- */
-void GLWorldScene::bondInserted(const bond::ptr _bond, const enum GLMoleculeObject_bond::SideOfBond side)
-{
-  LOG(3, "INFO: GLWorldScene::bondInserted() - Adding bond "+toString(*_bond)+".");
-  //LOG(4, "INFO: Currently present bonds " << BondsinSceneMap << ".");
-
+/** Helper function to get bond ids in the correct order for BondNodeMap.
+ *
+ * \return pair of ids in correct order.
+ */
+GLWorldScene::BondIds GLWorldScene::getBondIds(
+    const bond::ptr _bond,
+    const enum GLMoleculeObject_bond::SideOfBond _side) const
+{
   BondIds ids;
-  switch (side) {
+  switch (_side) {
     case GLMoleculeObject_bond::left:
       ids = std::make_pair(_bond->leftatom->getId(), _bond->rightatom->getId());
@@ -265,17 +308,32 @@
       break;
   }
-#ifndef NDEBUG
+  return ids;
+}
+
+/** Adds a bond to the scene.
+ *
+ * @param _bond bond to add
+ * @param side which side of the bond (left or right)
+ */
+void GLWorldScene::bondInserted(const bond::ptr _bond, const enum GLMoleculeObject_bond::SideOfBond _side)
+{
+  LOG(3, "INFO: GLWorldScene::bondInserted() - Adding bond "+toString(*_bond)+".");
+  //LOG(4, "INFO: Currently present bonds " << BondsinSceneMap << ".");
+
+  const BondIds ids = getBondIds(_bond, _side);
   BondNodeMap::iterator iter = BondsinSceneMap.find(ids);
-  ASSERT(iter == BondsinSceneMap.end(),
-      "GLWorldScene::bondAdded() - same left-sided bond "+toString(*_bond)+" added again.");
-#endif
-  GLMoleculeObject_bond * bondObject =
-      new GLMoleculeObject_bond(meshCylinder, this, _bond, side);
-  connect (
-      bondObject, SIGNAL(BondRemoved(const atomId_t, const atomId_t)),
-      this, SLOT(bondRemoved(const atomId_t, const atomId_t)));
-  connect (bondObject, SIGNAL(changed()), this, SIGNAL(changed()));
-  BondsinSceneMap.insert( make_pair(ids, bondObject) );
-//    BondIdsinSceneMap.insert( Leftids );
+  if (iter == BondsinSceneMap.end()) {
+    GLMoleculeObject_bond * bondObject =
+        new GLMoleculeObject_bond(meshCylinder, this, _bond, _side);
+    connect (
+        bondObject, SIGNAL(BondRemoved(const atomId_t, const atomId_t)),
+        this, SLOT(bondRemoved(const atomId_t, const atomId_t)));
+    connect (bondObject, SIGNAL(changed()), this, SIGNAL(changed()));
+    BondsinSceneMap.insert( make_pair(ids, bondObject) );
+  //    BondIdsinSceneMap.insert( Leftids );
+  } else {
+    iter->second->resetPosition();
+    iter->second->resetWidth();
+  }
   emit changeOccured();
 }
Index: src/UIElements/Views/Qt4/Qt3D/GLWorldScene.hpp
===================================================================
--- src/UIElements/Views/Qt4/Qt3D/GLWorldScene.hpp	(revision 8592c990d61a1b6a469219b569e217550fa13b6b)
+++ src/UIElements/Views/Qt4/Qt3D/GLWorldScene.hpp	(revision ce4126dccd4487e1bb02f6582b75fc09fdf73408)
@@ -68,4 +68,5 @@
 signals:
   void changed();
+  void updated();
   void changeOccured();
   void pressed();
@@ -90,4 +91,5 @@
   void addShape();
   void removeShape();
+  void update();
 
 public:
@@ -100,4 +102,8 @@
   typedef std::pair< atomId_t, atomId_t> BondIds;
   friend std::ostream &operator<<(std::ostream &ost, const BondIds &t);
+
+  BondIds getBondIds(
+      const bond::ptr _bond,
+      const enum GLMoleculeObject_bond::SideOfBond side) const;
 
   typedef std::map< atomId_t, GLMoleculeObject_atom* > AtomNodeMap;
Index: src/UIElements/Views/Qt4/Qt3D/GLWorldView.cpp
===================================================================
--- src/UIElements/Views/Qt4/Qt3D/GLWorldView.cpp	(revision 8592c990d61a1b6a469219b569e217550fa13b6b)
+++ src/UIElements/Views/Qt4/Qt3D/GLWorldView.cpp	(revision ce4126dccd4487e1bb02f6582b75fc09fdf73408)
@@ -82,4 +82,5 @@
   connect(this, SIGNAL(ShapeAdded()), worldscene, SLOT(addShape()));
   connect(this, SIGNAL(ShapeRemoved()), worldscene, SLOT(removeShape()));
+  connect(this, SIGNAL(TimeChanged()), worldscene, SIGNAL(updated()));
   connect(worldscene, SIGNAL(changeOccured()), this, SLOT(changeSignalled()));
   connect(worldscene, SIGNAL(changed()), this, SIGNAL(changed()));
@@ -393,4 +394,5 @@
 #endif
         emit changed();
+        emit TimeChanged();
         break;
       }
Index: src/UIElements/Views/Qt4/Qt3D/GLWorldView.hpp
===================================================================
--- src/UIElements/Views/Qt4/Qt3D/GLWorldView.hpp	(revision 8592c990d61a1b6a469219b569e217550fa13b6b)
+++ src/UIElements/Views/Qt4/Qt3D/GLWorldView.hpp	(revision ce4126dccd4487e1bb02f6582b75fc09fdf73408)
@@ -57,4 +57,5 @@
 signals:
   void changed();
+  void TimeChanged();
   void atomInserted(const atomicNumber_t _id);
   void atomRemoved(const atomicNumber_t _id);
