Index: src/Atom/unittests/Makefile.am
===================================================================
--- src/Atom/unittests/Makefile.am	(revision 9ed706d2228d2edefef36a2b55322f6421480603)
+++ src/Atom/unittests/Makefile.am	(revision 99f4ee808622819ff9de4956da3988021e56d66a)
@@ -3,8 +3,10 @@
 
 ATOMTESTSSOURCES = \
-	../Atom/unittests/AtomObserverUnitTest.cpp
+	../Atom/unittests/AtomObserverUnitTest.cpp \
+	stubs/ObserverStub.cpp
 
 ATOMTESTSHEADERS = \
-	../Atom/unittests/AtomObserverUnitTest.hpp
+	../Atom/unittests/AtomObserverUnitTest.hpp \
+	stubs/ObserverStub.hpp
 
 ATOMTESTS = \
@@ -29,6 +31,6 @@
 	../Atom/unittests/AtomObserverUnitTest.cpp \
 	../Atom/unittests/AtomObserverUnitTest.hpp \
-	../Atom/unittests/stubs/ObserverStub.cpp \
-	../Atom/unittests/stubs/ObserverStub.hpp
+	stubs/ObserverStub.cpp \
+	stubs/ObserverStub.hpp
 AtomObserverUnitTest_LDADD = ${ATOMTESTLIBS}
 
Index: src/Atom/unittests/stubs/ObserverStub.cpp
===================================================================
--- src/Atom/unittests/stubs/ObserverStub.cpp	(revision 9ed706d2228d2edefef36a2b55322f6421480603)
+++ 	(revision )
@@ -1,61 +1,0 @@
-/*
- * Project: MoleCuilder
- * Description: creates and alters molecular systems
- * Copyright (C)  2011 University of Bonn. All rights reserved.
- * Please see the LICENSE file or "Copyright notice" in builder.cpp for details.
- */
-
-/*
- * ObserverStub.cpp
- *
- *  Created on: Dec 19, 2011
- *      Author: heber
- */
-
-// include config.h
-#ifdef HAVE_CONFIG_H
-#include <config.h>
-#endif
-
-#include "CodePatterns/MemDebug.hpp"
-
-#include "CodePatterns/Observer/Observer.hpp"
-
-#include <cppunit/extensions/HelperMacros.h>
-
-#include "ObserverStub.hpp"
-
-/************ UpdateCountObserver **************/
-
-UpdateCountObserver::UpdateCountObserver() :
-  Observer("UpdateCountObserver"),
-  updates(0)
-{};
-
-UpdateCountObserver::~UpdateCountObserver()
-{}
-
-void UpdateCountObserver::update(Observable *publisher){
-  updates++;
-}
-
-void UpdateCountObserver::subjectKilled(Observable *publisher) {
-}
-
-NotificationObserver::NotificationObserver(Notification_ptr notification) :
-  Observer("NotificationObserver"),
-  requestedNotification(notification),
-  wasNotified(false)
-{}
-
-/*********** NotificationObserver **************/
-
-NotificationObserver::~NotificationObserver()
-{}
-
-void NotificationObserver::update(Observable*){}
-void NotificationObserver::subjectKilled(Observable*){}
-void NotificationObserver::recieveNotification(Observable *publisher, Notification_ptr notification){
-  CPPUNIT_ASSERT(requestedNotification==notification);
-  wasNotified = true;
-}
Index: src/Atom/unittests/stubs/ObserverStub.hpp
===================================================================
--- src/Atom/unittests/stubs/ObserverStub.hpp	(revision 9ed706d2228d2edefef36a2b55322f6421480603)
+++ 	(revision )
@@ -1,44 +1,0 @@
-/*
- * ObserverStub.hpp
- *
- *  Created on: Dec 19, 2011
- *      Author: heber
- */
-
-#ifndef OBSERVERSTUB_HPP_
-#define OBSERVERSTUB_HPP_
-
-// include config.h
-#ifdef HAVE_CONFIG_H
-#include <config.h>
-#endif
-
-
-#include "CodePatterns/Observer/Observer.hpp"
-
-class UpdateCountObserver : public Observer {
-public:
-  UpdateCountObserver();
-  virtual ~UpdateCountObserver();
-
-  void update(Observable *publisher);
-  void subjectKilled(Observable *publisher);
-
-  int updates;
-};
-
-class NotificationObserver : public Observer {
-public:
-  NotificationObserver(Notification_ptr notification);
-  virtual ~NotificationObserver();
-
-  void update(Observable*);
-  void subjectKilled(Observable*);
-  void recieveNotification(Observable *publisher, Notification_ptr notification);
-
-  Notification_ptr requestedNotification;
-
-  bool wasNotified;
-};
-
-#endif /* OBSERVERSTUB_HPP_ */
Index: src/Box.cpp
===================================================================
--- src/Box.cpp	(revision 9ed706d2228d2edefef36a2b55322f6421480603)
+++ src/Box.cpp	(revision 99f4ee808622819ff9de4956da3988021e56d66a)
@@ -28,4 +28,6 @@
 #include "CodePatterns/Assert.hpp"
 #include "CodePatterns/Log.hpp"
+#include "CodePatterns/Observer/Channels.hpp"
+#include "CodePatterns/Observer/Notification.hpp"
 #include "CodePatterns/Verbose.hpp"
 #include "Helpers/defs.hpp"
@@ -38,4 +40,5 @@
 
 Box::Box() :
+    Observable("Box"),
     M(new RealSpaceMatrix()),
     Minv(new RealSpaceMatrix())
@@ -44,4 +47,12 @@
   coords.reserve(NDIM);
   index.reserve(NDIM);
+
+  // 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);
+
   M->setIdentity();
   Minv->setIdentity();
@@ -51,14 +62,23 @@
 
 Box::Box(const Box& src) :
-  conditions(src.conditions),
-  M(new RealSpaceMatrix(*src.M)),
-  Minv(new RealSpaceMatrix(*src.Minv))
+    Observable("Box"),
+    conditions(src.conditions),
+    M(new RealSpaceMatrix(*src.M)),
+    Minv(new RealSpaceMatrix(*src.Minv))
 {
   internal_list.reserve(pow(3,3));
   coords.reserve(NDIM);
   index.reserve(NDIM);
+
+  // 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);
 }
 
 Box::Box(RealSpaceMatrix _M) :
+    Observable("Box"),
     M(new RealSpaceMatrix(_M)),
     Minv(new RealSpaceMatrix())
@@ -67,4 +87,12 @@
   coords.reserve(NDIM);
   index.reserve(NDIM);
+
+  // 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);
+
   ASSERT(M->determinant()!=0,"Matrix in Box construction was not invertible");
   *Minv = M->invert();
@@ -75,4 +103,9 @@
 Box::~Box()
 {
+  // observable stuff
+  std::map<Observable *, Channels*>::iterator iter = NotificationChannels.find(this);
+  delete iter->second;
+  NotificationChannels.erase(iter);
+
   delete M;
   delete Minv;
@@ -88,4 +121,6 @@
 void Box::setM(RealSpaceMatrix _M){
   ASSERT(_M.determinant()!=0,"Matrix in Box construction was not invertible");
+  OBSERVE;
+  NOTIFY(MatrixChanged);
   *M    =_M;
   *Minv = M->invert();
@@ -278,5 +313,8 @@
 }
 
-void Box::setCondition(int i,Box::BoundaryCondition_t condition){
+void Box::setCondition(int i,Box::BoundaryCondition_t condition)
+{
+  OBSERVE;
+  NOTIFY(BoundaryConditionsChanged);
   conditions[i]=condition;
 }
@@ -303,5 +341,8 @@
 }
 
-void Box::setCuboid(const Vector &endpoint){
+void Box::setCuboid(const Vector &endpoint)
+{
+  OBSERVE;
+  NOTIFY(MatrixChanged);
   ASSERT(endpoint[0]>0 && endpoint[1]>0 && endpoint[2]>0,"Vector does not define a full cuboid");
   M->setIdentity();
@@ -312,10 +353,16 @@
 }
 
-Box &Box::operator=(const Box &src){
+Box &Box::operator=(const Box &src)
+{
   if(&src!=this){
+    OBSERVE;
+    // new matrix
+    NOTIFY(MatrixChanged);
     delete M;
     delete Minv;
     M    = new RealSpaceMatrix(*src.M);
     Minv = new RealSpaceMatrix(*src.Minv);
+    // new boundary conditions
+    NOTIFY(BoundaryConditionsChanged);
     conditions = src.conditions;
   }
@@ -323,5 +370,8 @@
 }
 
-Box &Box::operator=(const RealSpaceMatrix &mat){
+Box &Box::operator=(const RealSpaceMatrix &mat)
+{
+  OBSERVE;
+  NOTIFY(MatrixChanged);
   setM(mat);
   return *this;
Index: src/Box.hpp
===================================================================
--- src/Box.hpp	(revision 9ed706d2228d2edefef36a2b55322f6421480603)
+++ src/Box.hpp	(revision 99f4ee808622819ff9de4956da3988021e56d66a)
@@ -22,4 +22,5 @@
 #include <list>
 #include <vector>
+#include "CodePatterns/Observer/Observable.hpp"
 #include "LinearAlgebra/VectorSet.hpp"
 
@@ -32,7 +33,13 @@
  * translate back to that space.
  */
-class Box
+class Box : public Observable
 {
 public:
+  enum NotificationType {
+    BoundaryConditionsChanged,
+    MatrixChanged,
+    NotificationType_MAX  // denotes the maximum of available notification types
+  };
+
   typedef enum{
     Wrap,
Index: src/unittests/BoxUnitTest.cpp
===================================================================
--- src/unittests/BoxUnitTest.cpp	(revision 9ed706d2228d2edefef36a2b55322f6421480603)
+++ src/unittests/BoxUnitTest.cpp	(revision 99f4ee808622819ff9de4956da3988021e56d66a)
@@ -28,4 +28,6 @@
 
 #include "BoxUnitTest.hpp"
+
+#include "stubs/ObserverStub.hpp"
 
 #ifdef HAVE_TESTRUNNER
@@ -1617,2 +1619,42 @@
 
 }
+
+/** Unit test on whether observer is working.
+ *
+ */
+void BoxUnittest::ObserverTest()
+{
+  // create some observers
+  UpdateCountObserver *observer_general = new UpdateCountObserver();
+  NotificationObserver *observer_matrix = new NotificationObserver(
+      unitBox->getChannel(Box::MatrixChanged));
+  NotificationObserver *observer_bc = new NotificationObserver(
+      unitBox->getChannel(Box::BoundaryConditionsChanged));
+  CPPUNIT_ASSERT_EQUAL((int)0, observer_general->updates);
+  CPPUNIT_ASSERT_EQUAL(false, observer_matrix->wasNotified);
+  CPPUNIT_ASSERT_EQUAL(false, observer_bc->wasNotified);
+  unitBox->signOn(observer_general);
+  unitBox->signOn(observer_matrix, Box::MatrixChanged);
+  unitBox->signOn(observer_bc, Box::BoundaryConditionsChanged);
+
+  // create update MatrixChanged
+  unitBox->setM(*unit);
+  CPPUNIT_ASSERT_EQUAL((int)1, observer_general->updates);
+  CPPUNIT_ASSERT_EQUAL(true, observer_matrix->wasNotified);
+  CPPUNIT_ASSERT_EQUAL(false, observer_bc->wasNotified);
+  observer_matrix->wasNotified = false;
+
+  // create update BoundaryConditionsChanged
+  unitBox->setCondition(0, Box::Wrap);
+  CPPUNIT_ASSERT_EQUAL((int)2, observer_general->updates);
+  CPPUNIT_ASSERT_EQUAL(false, observer_matrix->wasNotified);
+  CPPUNIT_ASSERT_EQUAL(true, observer_bc->wasNotified);
+
+  // remove observers again
+  unitBox->signOff(observer_general);
+  unitBox->signOff(observer_matrix, Box::MatrixChanged);
+  unitBox->signOff(observer_bc, Box::BoundaryConditionsChanged);
+  delete observer_general;
+  delete observer_matrix;
+  delete observer_bc;
+}
Index: src/unittests/BoxUnitTest.hpp
===================================================================
--- src/unittests/BoxUnitTest.hpp	(revision 9ed706d2228d2edefef36a2b55322f6421480603)
+++ src/unittests/BoxUnitTest.hpp	(revision 99f4ee808622819ff9de4956da3988021e56d66a)
@@ -30,4 +30,5 @@
   CPPUNIT_TEST ( BoundaryIgnoreTest );
   CPPUNIT_TEST ( BoundaryMixedTest );
+  CPPUNIT_TEST ( ObserverTest );
   CPPUNIT_TEST_SUITE_END();
 
@@ -43,4 +44,5 @@
   void BoundaryIgnoreTest();
   void BoundaryMixedTest();
+  void ObserverTest();
 
   RealSpaceMatrix *unit;
Index: src/unittests/Makefile.am
===================================================================
--- src/unittests/Makefile.am	(revision 9ed706d2228d2edefef36a2b55322f6421480603)
+++ src/unittests/Makefile.am	(revision 99f4ee808622819ff9de4956da3988021e56d66a)
@@ -73,4 +73,5 @@
 	$(UIELEMENTSCOMMANDLINEPARSERTESTSSOURCES) \
 	${UIELEMENTSMENUTESTSSOURCES} \
+	stubs/ObserverStub.cpp \
   BoxUnitTest.cpp \
   FormulaUnitTest.cpp \
@@ -93,4 +94,5 @@
 	$(UIELEMENTSCOMMANDLINEPARSERTESTSHEADERS) \
 	${UIELEMENTSMENUTESTSHEADERS} \
+	stubs/ObserverStub.hpp \
   BoxUnitTest.hpp \
   FormulaUnitTest.hpp \
@@ -101,5 +103,7 @@
 BoxUnitTest_SOURCES = $(top_srcdir)/src/unittests/UnitTestMain.cpp \
 	BoxUnitTest.cpp \
-	BoxUnitTest.hpp
+	BoxUnitTest.hpp \
+	stubs/ObserverStub.cpp \
+	stubs/ObserverStub.hpp	
 BoxUnitTest_LDADD = \
 	../libMolecuilder.la \
Index: src/unittests/stubs/ObserverStub.cpp
===================================================================
--- src/unittests/stubs/ObserverStub.cpp	(revision 99f4ee808622819ff9de4956da3988021e56d66a)
+++ src/unittests/stubs/ObserverStub.cpp	(revision 99f4ee808622819ff9de4956da3988021e56d66a)
@@ -0,0 +1,61 @@
+/*
+ * Project: MoleCuilder
+ * Description: creates and alters molecular systems
+ * Copyright (C)  2011 University of Bonn. All rights reserved.
+ * Please see the LICENSE file or "Copyright notice" in builder.cpp for details.
+ */
+
+/*
+ * ObserverStub.cpp
+ *
+ *  Created on: Dec 19, 2011
+ *      Author: heber
+ */
+
+// include config.h
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+#include "CodePatterns/MemDebug.hpp"
+
+#include "CodePatterns/Observer/Observer.hpp"
+
+#include <cppunit/extensions/HelperMacros.h>
+
+#include "ObserverStub.hpp"
+
+/************ UpdateCountObserver **************/
+
+UpdateCountObserver::UpdateCountObserver() :
+  Observer("UpdateCountObserver"),
+  updates(0)
+{};
+
+UpdateCountObserver::~UpdateCountObserver()
+{}
+
+void UpdateCountObserver::update(Observable *publisher){
+  updates++;
+}
+
+void UpdateCountObserver::subjectKilled(Observable *publisher) {
+}
+
+/*********** NotificationObserver **************/
+
+NotificationObserver::NotificationObserver(Notification_ptr notification) :
+  Observer("NotificationObserver"),
+  requestedNotification(notification),
+  wasNotified(false)
+{}
+
+NotificationObserver::~NotificationObserver()
+{}
+
+void NotificationObserver::update(Observable*){}
+void NotificationObserver::subjectKilled(Observable*){}
+void NotificationObserver::recieveNotification(Observable *publisher, Notification_ptr notification){
+  CPPUNIT_ASSERT(requestedNotification==notification);
+  wasNotified = true;
+}
Index: src/unittests/stubs/ObserverStub.hpp
===================================================================
--- src/unittests/stubs/ObserverStub.hpp	(revision 99f4ee808622819ff9de4956da3988021e56d66a)
+++ src/unittests/stubs/ObserverStub.hpp	(revision 99f4ee808622819ff9de4956da3988021e56d66a)
@@ -0,0 +1,44 @@
+/*
+ * ObserverStub.hpp
+ *
+ *  Created on: Dec 19, 2011
+ *      Author: heber
+ */
+
+#ifndef OBSERVERSTUB_HPP_
+#define OBSERVERSTUB_HPP_
+
+// include config.h
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+
+#include "CodePatterns/Observer/Observer.hpp"
+
+class UpdateCountObserver : public Observer {
+public:
+  UpdateCountObserver();
+  virtual ~UpdateCountObserver();
+
+  void update(Observable *publisher);
+  void subjectKilled(Observable *publisher);
+
+  int updates;
+};
+
+class NotificationObserver : public Observer {
+public:
+  NotificationObserver(Notification_ptr notification);
+  virtual ~NotificationObserver();
+
+  void update(Observable*);
+  void subjectKilled(Observable*);
+  void recieveNotification(Observable *publisher, Notification_ptr notification);
+
+  Notification_ptr requestedNotification;
+
+  bool wasNotified;
+};
+
+#endif /* OBSERVERSTUB_HPP_ */
