Index: src/LinkedCell/LinkedCell_Controller.cpp
===================================================================
--- src/LinkedCell/LinkedCell_Controller.cpp	(revision 9ed706d2228d2edefef36a2b55322f6421480603)
+++ src/LinkedCell/LinkedCell_Controller.cpp	(revision 4a816966425096ec9bd0a17aa70a3dbfe04c7665)
@@ -20,6 +20,10 @@
 #include "CodePatterns/MemDebug.hpp"
 
+#include <set>
+
 #include "Box.hpp"
 #include "CodePatterns/Assert.hpp"
+#include "CodePatterns/Log.hpp"
+#include "CodePatterns/Observer/Notification.hpp"
 #include "CodePatterns/Range.hpp"
 #include "LinkedCell_Controller.hpp"
@@ -38,4 +42,5 @@
  */
 LinkedCell_Controller::LinkedCell_Controller(const Box &_domain) :
+    Observer("LinkedCell_Controller"),
     domain(_domain)
 {
@@ -175,2 +180,121 @@
   }
 }
+
+/** Internal function to re-create all present and used models for the new Box.
+ *
+ * The main problem are the views currently in use.
+ * We make use of LinkedCell:LinkedCell_View::RAIIMap as there all present are
+ * listed. We go through the list, create a map with old model ref as keys to
+ * just newly created ones, and finally go again through each view and exchange
+ * the model against the new ones via a simple map lookup.
+ *
+ */
+void LinkedCell_Controller::updateModelsForNewBoxMatrix()
+{
+  typedef std::map<const LinkedCell_Model *, LinkedCell_Model *>  ModelLookup;
+  ModelLookup models;
+
+  // set up map, for now with NULL pointers
+  for (LinkedCell_View::ModelInstanceMap::const_iterator iter = LinkedCell_View::RAIIMap.begin();
+      iter != LinkedCell_View::RAIIMap.end(); ++iter) {
+#ifndef NDEBUG
+    std::pair< ModelLookup::iterator, bool > inserter =
+#endif
+        models.insert( std::pair<const LinkedCell_Model *, LinkedCell_Model *>( &((*iter)->LC), NULL) );
+    ASSERT( inserter.second,
+        "LinkedCell_Controller::updateModelsForNewBoxMatrix() - failed to insert old model "
+        +toString( &((*iter)->LC))+","+toString(NULL)+" into models, is already present");
+  }
+
+  // invert MapEdgelengthModel
+  typedef std::map<const LinkedCell_Model*, double > MapEdgelengthModel_inverted;
+  MapEdgelengthModel_inverted ModelsMap_inverted;
+  for (MapEdgelengthModel::const_iterator iter = ModelsMap.begin();
+      iter != ModelsMap.end(); ++iter) {
+#ifndef NDEBUG
+    MapEdgelengthModel_inverted::const_iterator assertiter = ModelsMap_inverted.find(iter->second);
+    ASSERT( assertiter != ModelsMap_inverted.end(),
+        "LinkedCell_Controller::updateModelsForNewBoxMatrix() - ModelsMap is not invertible, value "
+        +toString(iter->second)+" is already present.");
+#endif
+    ModelsMap_inverted.insert( std::make_pair(iter->second, iter->first) );
+  }
+
+  // go through map and re-create models
+  for (ModelLookup::iterator iter = models.begin(); iter != models.end(); ++iter) {
+    // delete old model
+    const LinkedCell_Model * const oldref = iter->first;
+#ifndef NDEBUG
+    MapEdgelengthModel_inverted::const_iterator assertiter = ModelsMap_inverted.find(oldref);
+    ASSERT( assertiter != ModelsMap_inverted.end(),
+        "LinkedCell_Controller::updateModelsForNewBoxMatrix() - ModelsMap_inverted does not contain old model "
+        +toString(oldref)+".");
+#endif
+    const double distance = ModelsMap_inverted[oldref];
+    delete oldref;
+    ModelsMap.erase(distance);
+    // create new one
+    LinkedCell_Model * const newref = new LinkedCell_Model(distance, domain);
+    iter->second = newref;
+    // replace in ModelsMap
+#ifndef NDEBUG
+    std::pair< MapEdgelengthModel::iterator, bool > inserter =
+#endif
+        ModelsMap.insert( std::make_pair(distance, newref) );
+    ASSERT( inserter.second,
+        "LinkedCell_Controller::updateModelsForNewBoxMatrix() - failed to insert new model "
+        +toString(distance)+","+toString(newref)+" into ModelsMap, is already present");
+  }
+
+  // delete inverted map for safety (values are gone)
+  ModelsMap_inverted.clear();
+
+  // go through views and exchange the models
+  for (LinkedCell_View::ModelInstanceMap::const_iterator iter = LinkedCell_View::RAIIMap.begin();
+      iter != LinkedCell_View::RAIIMap.end(); ++iter) {
+    ModelLookup::const_iterator modeliter = models.find(&((*iter)->LC));
+    ASSERT( modeliter != models.end(),
+        "LinkedCell_Controller::updateModelsForNewBoxMatrix() - we miss a model "
+        +toString(&((*iter)->LC))+" in ModelLookup.");
+    // this is ugly but the only place where we have to set ourselves over the constness of the member variable
+    //if (modeliter != models.end())
+      //const_cast<LinkedCell_Model &>((*iter)->LC) = *modeliter->second;
+  }
+}
+
+/** Callback function for Observer mechanism.
+ *
+ * @param publisher reference to the Observable that calls
+ */
+void LinkedCell_Controller::update(Observable *publisher)
+{
+  ELOG(2, "LinkedCell_Model received inconclusive general update from "
+      << publisher << ".");
+}
+
+/** Callback function for the Notifications mechanism.
+ *
+ * @param publisher reference to the Observable that calls
+ * @param notification specific notification as cause of the call
+ */
+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;
+  }
+}
+
+/** Callback function when an Observer dies.
+ *
+ * @param publisher reference to the Observable that calls
+ */
+void LinkedCell_Controller::subjectKilled(Observable *publisher)
+{}
+
Index: src/LinkedCell/LinkedCell_Controller.hpp
===================================================================
--- src/LinkedCell/LinkedCell_Controller.hpp	(revision 9ed706d2228d2edefef36a2b55322f6421480603)
+++ src/LinkedCell/LinkedCell_Controller.hpp	(revision 4a816966425096ec9bd0a17aa70a3dbfe04c7665)
@@ -16,4 +16,5 @@
 #include <map>
 
+#include "CodePatterns/Observer/Observer.hpp"
 #include "CodePatterns/Range.hpp"
 #include "LinkedCell/LinkedCell_View.hpp"
@@ -40,5 +41,5 @@
    *
    */
-  class LinkedCell_Controller
+  class LinkedCell_Controller : public Observer
   {
     //!> grant unit tests access to internal parts
@@ -50,8 +51,13 @@
     LinkedCell_View getView(const double distance, IPointCloud &set);
 
+    void update(Observable *publisher);
+    void recieveNotification(Observable *publisher, Notification_ptr notification);
+    void subjectKilled(Observable *publisher);
+
   private:
     const LinkedCell_Model * getBestModel(const double distance) const;
     const range<double> getHeuristicRange(const double distance) const;
     void insertNewModel(const double edgelength, const LinkedCell_Model* instance);
+    void updateModelsForNewBoxMatrix();
 
   private:
Index: src/LinkedCell/unittests/LinkedCell_ControllerUnitTest.cpp
===================================================================
--- src/LinkedCell/unittests/LinkedCell_ControllerUnitTest.cpp	(revision 9ed706d2228d2edefef36a2b55322f6421480603)
+++ src/LinkedCell/unittests/LinkedCell_ControllerUnitTest.cpp	(revision 4a816966425096ec9bd0a17aa70a3dbfe04c7665)
@@ -257,2 +257,9 @@
   }
 }
+
+/** UnitTest for LinkedCell_Controller::updateModelsForNewBoxMatrix().
+ */
+void LinkedCell_ControllerTest::updateBoxTest()
+{
+  CPPUNIT_ASSERT(true);
+}
Index: src/LinkedCell/unittests/LinkedCell_ControllerUnitTest.hpp
===================================================================
--- src/LinkedCell/unittests/LinkedCell_ControllerUnitTest.hpp	(revision 9ed706d2228d2edefef36a2b55322f6421480603)
+++ src/LinkedCell/unittests/LinkedCell_ControllerUnitTest.hpp	(revision 4a816966425096ec9bd0a17aa70a3dbfe04c7665)
@@ -41,4 +41,5 @@
     CPPUNIT_TEST ( getView_LowerThresholdViewTest );
     CPPUNIT_TEST ( getView_UpperThresholdViewTest );
+    CPPUNIT_TEST ( updateBoxTest );
     CPPUNIT_TEST_SUITE_END();
 
@@ -55,4 +56,5 @@
       void getView_LowerThresholdViewTest();
       void getView_UpperThresholdViewTest();
+      void updateBoxTest();
 
 private:
