Index: src/LinkedCell/LinkedCell_Controller.cpp
===================================================================
--- src/LinkedCell/LinkedCell_Controller.cpp	(revision 5e2864ecffe7aea73c3db2304360ea66fcf192a5)
+++ src/LinkedCell/LinkedCell_Controller.cpp	(revision ce81e7643f69b7e32a3ea7b3aea0503833075ba1)
@@ -32,4 +32,5 @@
 #include "LinkedCell_View_ModelWrapper.hpp"
 #include "IPointCloud.hpp"
+#include "WorldTime.hpp"
 
 
@@ -48,4 +49,5 @@
   // sign on to specific notifications
   domain.signOn(this, Box::MatrixChanged);
+  WorldTime::getInstance().signOn(this, WorldTime::TimeChanged);
 
   /// Check that upper_threshold fits within half the box.
@@ -73,4 +75,5 @@
   // sign off
   domain.signOff(this, Box::MatrixChanged);
+  WorldTime::getInstance().signOff(this, WorldTime::TimeChanged);
 
   /// we free all LinkedCell_Model instances again.
@@ -190,4 +193,8 @@
 /** Internal function to re-create all present and used models for the new Box.
  *
+ * This is necessary in the following cases:
+ * -# the Box is changed
+ * -# we step on to a different time step, i.e. all atomic positions change
+ *
  * The main problem are the views currently in use.
  *
@@ -198,5 +205,5 @@
  *
  */
-void LinkedCell_Controller::updateModelsForNewBoxMatrix()
+void LinkedCell_Controller::updateModels()
 {
   LOG(1, "INFO: Updating all models.");
@@ -306,13 +313,31 @@
 void LinkedCell_Controller::recieveNotification(Observable *publisher, Notification_ptr notification)
 {
-  switch(notification->getChannelNo()) {
-    case Box::MatrixChanged:
-      updateModelsForNewBoxMatrix();
-      break;
-    default:
-      ASSERT(0,
-          "LinkedCell_Controller::recieveNotification() - unwanted notification "
-          +toString(notification->getChannelNo())+" received.");
-      break;
+  if (publisher == &domain) {
+    switch(notification->getChannelNo()) {
+      case Box::MatrixChanged:
+        LOG(1, "INFO: LinkedCell_Controller got update from Box.");
+        updateModels();
+        break;
+      default:
+        ASSERT(0,
+            "LinkedCell_Controller::recieveNotification() - unwanted notification from Box "
+            +toString(notification->getChannelNo())+" received.");
+        break;
+    }
+  } else if (publisher == WorldTime::getPointer()) {
+    switch(notification->getChannelNo()) {
+      case WorldTime::TimeChanged:
+        LOG(1, "INFO: LinkedCell_Controller got update from WorldTime.");
+        updateModels();
+        break;
+      default:
+        ASSERT(0,
+            "LinkedCell_Controller::recieveNotification() - unwanted notification from WorldTime "
+            +toString(notification->getChannelNo())+" received.");
+        break;
+    }
+  } else {
+    ELOG(1, "Notification " << notification->getChannelNo()
+        << " from unknown publisher " << publisher << ".");
   }
 }
Index: src/LinkedCell/LinkedCell_Controller.hpp
===================================================================
--- src/LinkedCell/LinkedCell_Controller.hpp	(revision 5e2864ecffe7aea73c3db2304360ea66fcf192a5)
+++ src/LinkedCell/LinkedCell_Controller.hpp	(revision ce81e7643f69b7e32a3ea7b3aea0503833075ba1)
@@ -59,5 +59,5 @@
     const range<double> getHeuristicRange(const double distance) const;
     void insertNewModel(const double edgelength, const LinkedCell_Model* instance);
-    void updateModelsForNewBoxMatrix();
+    void updateModels();
 
   private:
Index: src/LinkedCell/unittests/LinkedCell_ControllerUnitTest.cpp
===================================================================
--- src/LinkedCell/unittests/LinkedCell_ControllerUnitTest.cpp	(revision 5e2864ecffe7aea73c3db2304360ea66fcf192a5)
+++ src/LinkedCell/unittests/LinkedCell_ControllerUnitTest.cpp	(revision ce81e7643f69b7e32a3ea7b3aea0503833075ba1)
@@ -259,5 +259,5 @@
 }
 
-/** UnitTest for LinkedCell_Controller::updateModelsForNewBoxMatrix().
+/** UnitTest for LinkedCell_Controller::updateModels().
  */
 void LinkedCell_ControllerTest::updateBoxTest()
Index: src/LinkedCell/unittests/LinkedCell_ModelUnitTest.cpp
===================================================================
--- src/LinkedCell/unittests/LinkedCell_ModelUnitTest.cpp	(revision 5e2864ecffe7aea73c3db2304360ea66fcf192a5)
+++ src/LinkedCell/unittests/LinkedCell_ModelUnitTest.cpp	(revision ce81e7643f69b7e32a3ea7b3aea0503833075ba1)
@@ -37,4 +37,6 @@
 #include "LinkedCell/PointCloudAdaptor.hpp"
 #include "LinkedCell/unittests/defs.hpp"
+#include "World.hpp"
+#include "WorldTime.hpp"
 
 #include "LinkedCell_ModelUnitTest.hpp"
@@ -93,4 +95,8 @@
     NodeList.erase(iter);
   }
+
+  // delete in correct order
+  World::purgeInstance();
+  WorldTime::purgeInstance();
 }
 
Index: src/LinkedCell/unittests/LinkedCell_ViewUnitTest.cpp
===================================================================
--- src/LinkedCell/unittests/LinkedCell_ViewUnitTest.cpp	(revision 5e2864ecffe7aea73c3db2304360ea66fcf192a5)
+++ src/LinkedCell/unittests/LinkedCell_ViewUnitTest.cpp	(revision ce81e7643f69b7e32a3ea7b3aea0503833075ba1)
@@ -37,4 +37,6 @@
 #include "LinkedCell/PointCloudAdaptor.hpp"
 #include "LinkedCell/unittests/defs.hpp"
+#include "World.hpp"
+#include "WorldTime.hpp"
 
 #include "LinkedCell_ViewUnitTest.hpp"
@@ -98,4 +100,8 @@
     NodeList.erase(iter);
   }
+
+  // delete in correct order
+  World::purgeInstance();
+  WorldTime::purgeInstance();
 }
 
Index: src/LinkedCell/unittests/Makefile.am
===================================================================
--- src/LinkedCell/unittests/Makefile.am	(revision 5e2864ecffe7aea73c3db2304360ea66fcf192a5)
+++ src/LinkedCell/unittests/Makefile.am	(revision ce81e7643f69b7e32a3ea7b3aea0503833075ba1)
@@ -58,4 +58,5 @@
 	../LinkedCell/unittests/stubs/TesselPointStub.cpp \
 	../LinkedCell/unittests/stubs/WorldStub.cpp \
+	../LinkedCell/unittests/stubs/WorldTimeStub.cpp \
 	../LinkedCell/PointCloudAdaptor.hpp \
 	../Box_BoundaryConditions.cpp \
Index: src/LinkedCell/unittests/stubs/WorldTimeStub.cpp
===================================================================
--- src/LinkedCell/unittests/stubs/WorldTimeStub.cpp	(revision ce81e7643f69b7e32a3ea7b3aea0503833075ba1)
+++ src/LinkedCell/unittests/stubs/WorldTimeStub.cpp	(revision ce81e7643f69b7e32a3ea7b3aea0503833075ba1)
@@ -0,0 +1,69 @@
+/*
+ * Project: MoleCuilder
+ * Description: creates and alters molecular systems
+ * Copyright (C)  2012 University of Bonn. All rights reserved.
+ * Please see the LICENSE file or "Copyright notice" in builder.cpp for details.
+ */
+
+/*
+ * WorldTimeStub.cpp
+ *
+ *  Created on: Jan 5, 2012
+ *      Author: heber
+ */
+
+// include config.h
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+#include "CodePatterns/MemDebug.hpp"
+
+#include "WorldTime.hpp"
+
+#include "CodePatterns/Observer/Channels.hpp"
+#include "CodePatterns/Observer/Notification.hpp"
+#include "CodePatterns/Singleton_impl.hpp"
+
+unsigned int WorldTime::CurrentTime = 0;
+
+WorldTime::WorldTime() :
+  Observable("WorldTime"),
+  StepWidth(0.)
+{
+  // observable stuff
+  Channels *OurChannel = new Channels;
+  NotificationChannels.insert( std::make_pair(this, OurChannel) );
+  // add instance for each notification type
+  for (size_t type = 0; type < NotificationType_MAX; ++type)
+    OurChannel->addChannel(type);
+}
+
+WorldTime::~WorldTime()
+{
+  // observable stuff
+  std::map<Observable *, Channels*>::iterator iter = NotificationChannels.find(this);
+  delete iter->second;
+  NotificationChannels.erase(iter);
+}
+
+void WorldTime::setStepWidth(const double _width)
+{
+  OBSERVE;
+  NOTIFY(TimeChanged);
+  StepWidth = _width;
+}
+
+double WorldTime::getStepWidth() const
+{
+  return 0;
+}
+
+void WorldTime::setTime(const unsigned int _time)
+{
+  OBSERVE;
+  NOTIFY(TimeChanged);
+  WorldTime::CurrentTime = _time;
+}
+
+CONSTRUCT_SINGLETON(WorldTime)
