Index: src/Makefile.am
===================================================================
--- src/Makefile.am	(revision f8879dd41341e9b0285c43f7d9eec41d28414400)
+++ src/Makefile.am	(revision 57ee0d5caa59d7fc4f63f27545616746ba78b243)
@@ -20,8 +20,8 @@
 UIHEADER = ${ACTIONSHEADER} ${VIEWHEADER} ${MENUHEADER} UIElements/UIFactory.hpp UIElements/TextUIFactory.hpp UIElements/MainWindow.hpp UIElements/TextWindow.hpp UIElements/Dialog.hpp UIElements/TextDialog.hpp
 
-QTUIMOC_HEADER = UIElements/QT4/QTMainWindow.hpp UIElements/QT4/QTDialog.hpp Menu/QT4/QTMenu.hpp 
-QTUIMOC_TARGETS = QTMainWindow.moc.cpp QTMenu.moc.cpp QTDialog.moc.cpp
+QTUIMOC_HEADER = UIElements/QT4/QTMainWindow.hpp UIElements/QT4/QTDialog.hpp Menu/QT4/QTMenu.hpp  Views/QT4/QTMoleculesView.hpp
+QTUIMOC_TARGETS = QTMainWindow.moc.cpp QTMenu.moc.cpp QTDialog.moc.cpp QTMoleculesView.moc.cpp
 
-QTUISOURCE = ${QTUIMOC_TARGETS} UIElements/QT4/QTMainWindow.cpp UIElements/QT4/QTDialog.cpp UIElements/QT4/QTUIFactory.cpp Menu/QT4/QTMenu.cpp
+QTUISOURCE = ${QTUIMOC_TARGETS} UIElements/QT4/QTMainWindow.cpp UIElements/QT4/QTDialog.cpp UIElements/QT4/QTUIFactory.cpp Menu/QT4/QTMenu.cpp Views/QT4/QTMoleculesView.cpp
 QTUIHEADER = ${QTUIMOC_HEADER} UIElements/QT4/QTUIFactory.hpp
 
Index: src/Patterns/Observer.hpp
===================================================================
--- src/Patterns/Observer.hpp	(revision f8879dd41341e9b0285c43f7d9eec41d28414400)
+++ src/Patterns/Observer.hpp	(revision 57ee0d5caa59d7fc4f63f27545616746ba78b243)
@@ -32,8 +32,10 @@
 class Observer
 {
+  friend class Observable;
 public:
   Observer();
   virtual ~Observer();
 
+protected:
   virtual void update(Observable *publisher)=0;
   virtual void subjectKilled(Observable *publisher)=0;
@@ -48,11 +50,11 @@
   virtual void signOff(Observer *target);
 
+protected:
   virtual void update(Observable *publisher);
   virtual void subjectKilled(Observable *publisher);
 
-private:
   virtual void notifyAll();
 protected:
-// Observer mechanismen is done from a static central place
+// Observer mechanism is done from a static central place
   /**
    * Internal method.
Index: src/UIElements/QT4/QTMainWindow.cpp
===================================================================
--- src/UIElements/QT4/QTMainWindow.cpp	(revision f8879dd41341e9b0285c43f7d9eec41d28414400)
+++ src/UIElements/QT4/QTMainWindow.cpp	(revision 57ee0d5caa59d7fc4f63f27545616746ba78b243)
@@ -19,5 +19,5 @@
 #include "molecule.hpp"
 #include "Menu/QT4/QTMenu.hpp"
-#include "Views/StreamStringView.hpp"
+#include "Views/QT4/QTMoleculesView.hpp"
 
 
@@ -27,6 +27,5 @@
     theApp(_theApp)
 {
-  moleculeView = new StreamStringView(boost::bind(&MoleculeListClass::Enumerate,molecules,_1));
-  moleculeDisplay = new QLabel(QString(moleculeView->toString().c_str()));
+  moleculeDisplay = new QTMoleculesView(molecules,this);
   setCentralWidget(moleculeDisplay);
 
Index: src/UIElements/QT4/QTMainWindow.hpp
===================================================================
--- src/UIElements/QT4/QTMainWindow.hpp	(revision f8879dd41341e9b0285c43f7d9eec41d28414400)
+++ src/UIElements/QT4/QTMainWindow.hpp	(revision 57ee0d5caa59d7fc4f63f27545616746ba78b243)
@@ -12,5 +12,5 @@
 #include <Qt/qmainwindow.h>
 
-class QLabel;
+class QTMoleculesView;
 class StringView;
 class QTMenu;
@@ -30,9 +30,6 @@
   // All kinds of QTStuff used in this window
   QApplication *theApp;
-  QLabel *moleculeDisplay;
+  QTMoleculesView *moleculeDisplay;
   QTMenu *editMoleculesMenu;
-
-  // All kinds of internal stuff that is bridged to QT
-  StringView *moleculeView;
 
 };
Index: src/Views/QT4/QTMoleculesView.cpp
===================================================================
--- src/Views/QT4/QTMoleculesView.cpp	(revision 57ee0d5caa59d7fc4f63f27545616746ba78b243)
+++ src/Views/QT4/QTMoleculesView.cpp	(revision 57ee0d5caa59d7fc4f63f27545616746ba78b243)
@@ -0,0 +1,82 @@
+/*
+ * QTMoleculesView.cpp
+ *
+ *  Created on: Jan 21, 2010
+ *      Author: crueger
+ */
+
+#include "Views/QT4/QTMoleculesView.hpp"
+
+#include <iostream>
+
+#include "atom.hpp"
+#include "molecule.hpp"
+
+using namespace std;
+
+// maybe this should go with the definition of molecules
+
+// some attributes need to be easier to find for molecules
+// these attributes are skiped so far
+const int QTMoleculesView::COLUMNCOUNT = COLUMNTYPES_MAX;
+const char *QTMoleculesView::COLUMNNAMES[QTMoleculesView::COLUMNCOUNT]={"Name","Atoms"/*,"Formula"*/,"Center"/*,"Size"*/};
+
+QTMoleculesView::QTMoleculesView(MoleculeListClass *_molecules,QWidget * _parent) :
+  QTableWidget (_parent),
+  molecules(_molecules)
+{
+  setRowCount(0);
+  setColumnCount(COLUMNCOUNT);
+
+  for(int i=0; i<COLUMNCOUNT;++i) {
+    QTableWidgetItem *heading = new QTableWidgetItem();
+    heading->setText(QString(COLUMNNAMES[i]));
+    setHorizontalHeaderItem(i,heading);
+  }
+
+  molecules->signOn(this);
+  update(molecules);
+}
+
+QTMoleculesView::~QTMoleculesView()
+{
+  molecules->signOff(this);
+}
+
+void QTMoleculesView::update(Observable *publisher) {
+  int numMolecules = molecules->ListOfMolecules.size();
+  setRowCount(numMolecules);
+  int i;
+  MoleculeList::iterator iter;
+  for(iter = molecules->ListOfMolecules.begin(),i=0;
+      iter != molecules->ListOfMolecules.end();
+      ++i,++iter) {
+    const int index = (*iter)->IndexNr;
+    QTableWidgetItem *indexWidget = new QTableWidgetItem();
+    // there probably is an easier method to convert ints to QStrings... but i didn't find it
+    stringstream idxsstr;
+    idxsstr << index;
+    indexWidget->setText(QString(idxsstr.str().c_str()));
+    setVerticalHeaderItem(i,indexWidget);
+    const char *name = (*iter)->name;
+    QTableWidgetItem *nameWidget = new QTableWidgetItem();
+    nameWidget->setText(QString(name));
+    setItem(i,NAME,nameWidget);
+    const int atomCount = (*iter)->AtomCount;
+    QTableWidgetItem *countWidget= new QTableWidgetItem();
+    stringstream countsstr;
+    countsstr << atomCount;
+    countWidget->setText(QString(countsstr.str().c_str()));
+    setItem(i,ATOMS,countWidget);
+    const Vector center = (*iter)->Center;
+    QTableWidgetItem *centerWidget = new QTableWidgetItem();
+    stringstream centersstr;
+    centersstr << center;
+    centerWidget->setText(QString(centersstr.str().c_str()));
+    setItem(i,CENTER,centerWidget);
+  }
+}
+
+void QTMoleculesView::subjectKilled(Observable *publisher) {
+}
+
Index: src/Views/QT4/QTMoleculesView.hpp
===================================================================
--- src/Views/QT4/QTMoleculesView.hpp	(revision 57ee0d5caa59d7fc4f63f27545616746ba78b243)
+++ src/Views/QT4/QTMoleculesView.hpp	(revision 57ee0d5caa59d7fc4f63f27545616746ba78b243)
@@ -0,0 +1,36 @@
+/*
+ * QTMoleculesView.hpp
+ *
+ *  Created on: Jan 21, 2010
+ *      Author: crueger
+ */
+
+#ifndef QTMOLECULESVIEW_HPP_
+#define QTMOLECULESVIEW_HPP_
+
+#include <Qt/qtablewidget.h>
+#include "Patterns/Observer.hpp"
+
+class MoleculeListClass;
+
+class QTMoleculesView : public QTableWidget, public Observer
+{
+  Q_OBJECT
+
+public:
+  QTMoleculesView(MoleculeListClass *_molecules,QWidget * _parent=0);
+  virtual ~QTMoleculesView();
+
+protected:
+  virtual void update(Observable *publisher);
+  virtual void subjectKilled(Observable *publisher);
+
+  static const int COLUMNCOUNT;
+  enum {NAME,ATOMS,CENTER,COLUMNTYPES_MAX} COLUMNTYPES;
+  static const char *COLUMNNAMES[];
+
+private:
+  MoleculeListClass *molecules;
+};
+
+#endif /* QTMOLECULESVIEW_HPP_ */
Index: src/molecule.hpp
===================================================================
--- src/molecule.hpp	(revision f8879dd41341e9b0285c43f7d9eec41d28414400)
+++ src/molecule.hpp	(revision 57ee0d5caa59d7fc4f63f27545616746ba78b243)
@@ -30,4 +30,5 @@
 #include "stackclass.hpp"
 #include "tesselation.hpp"
+#include "Patterns/Observer.hpp"
 
 /****************************************** forward declarations *****************************/
@@ -308,5 +309,5 @@
 /** A list of \a molecule classes.
  */
-class MoleculeListClass {
+class MoleculeListClass : public Observable {
   public:
     MoleculeList ListOfMolecules; //!< List of the contained molecules
Index: src/moleculelist.cpp
===================================================================
--- src/moleculelist.cpp	(revision f8879dd41341e9b0285c43f7d9eec41d28414400)
+++ src/moleculelist.cpp	(revision 57ee0d5caa59d7fc4f63f27545616746ba78b243)
@@ -852,7 +852,9 @@
 
 void MoleculeListClass::createNewMolecule(periodentafel *periode) {
+  START_OBSERVER;
   molecule *mol = NULL;
   mol = new molecule(periode);
   insert(mol);
+  FINISH_OBSERVER;
 };
 
Index: src/unittests/ObserverTest.cpp
===================================================================
--- src/unittests/ObserverTest.cpp	(revision f8879dd41341e9b0285c43f7d9eec41d28414400)
+++ src/unittests/ObserverTest.cpp	(revision 57ee0d5caa59d7fc4f63f27545616746ba78b243)
@@ -86,5 +86,6 @@
 
 void ObserverTest::setUp() {
-  simpleObservable = new  SimpleObservable();
+  simpleObservable1 = new SimpleObservable();
+  simpleObservable2 = new SimpleObservable();
   callObservable = new CallObservable();
   superObservable = new SuperObservable();
@@ -93,8 +94,10 @@
   observer2 = new UpdateCountObserver();
   observer3 = new UpdateCountObserver();
+  observer4 = new UpdateCountObserver();
 }
 
 void ObserverTest::tearDown() {
-  delete simpleObservable;
+  delete simpleObservable1;
+  delete simpleObservable2;
   delete callObservable;
   delete superObservable;
@@ -103,23 +106,34 @@
   delete observer2;
   delete observer3;
+  delete observer4;
 }
 
 void ObserverTest::doesUpdateTest()
 {
-  simpleObservable->signOn(observer1);
-  simpleObservable->signOn(observer2);
-  simpleObservable->signOn(observer3);
-
-  simpleObservable->changeMethod();
+  simpleObservable1->signOn(observer1);
+  simpleObservable1->signOn(observer2);
+  simpleObservable1->signOn(observer3);
+  simpleObservable2->signOn(observer2);
+  simpleObservable2->signOn(observer4);
+
+  simpleObservable1->changeMethod();
   CPPUNIT_ASSERT_EQUAL( 1, observer1->updates );
   CPPUNIT_ASSERT_EQUAL( 1, observer2->updates );
   CPPUNIT_ASSERT_EQUAL( 1, observer3->updates );
-
-  simpleObservable->signOff(observer3);
-
-  simpleObservable->changeMethod();
+  CPPUNIT_ASSERT_EQUAL( 0, observer4->updates );
+
+  simpleObservable1->signOff(observer3);
+
+  simpleObservable1->changeMethod();
   CPPUNIT_ASSERT_EQUAL( 2, observer1->updates );
   CPPUNIT_ASSERT_EQUAL( 2, observer2->updates );
   CPPUNIT_ASSERT_EQUAL( 1, observer3->updates );
+  CPPUNIT_ASSERT_EQUAL( 0, observer4->updates );
+
+  simpleObservable2->changeMethod();
+  CPPUNIT_ASSERT_EQUAL( 2, observer1->updates );
+  CPPUNIT_ASSERT_EQUAL( 3, observer2->updates );
+  CPPUNIT_ASSERT_EQUAL( 1, observer3->updates );
+  CPPUNIT_ASSERT_EQUAL( 1, observer4->updates );
 }
 
@@ -155,9 +169,17 @@
   cout << "If this test does not complete in a few seconds, kill the test-suite and fix the Error in the circle detection mechanism" << endl;
 
-  cout << endl << endl << "The following error displayed by the observer framwork can be ignored" << endl;
+  cout << endl << endl << "The following errors displayed by the observer framework can be ignored" << endl;
 
   // make this Observable its own subject. NEVER DO THIS IN ACTUAL CODE
-  simpleObservable->signOn(simpleObservable);
-  simpleObservable->changeMethod();
+  simpleObservable1->signOn(simpleObservable1);
+  simpleObservable1->changeMethod();
+
+  // more complex test
+  simpleObservable1->signOff(simpleObservable1);
+  simpleObservable1->signOn(simpleObservable2);
+  simpleObservable2->signOn(simpleObservable1);
+  simpleObservable1->changeMethod();
+  simpleObservable1->signOff(simpleObservable2);
+  simpleObservable2->signOff(simpleObservable1);
   // when we reach this line, although we broke the DAG assumption the circle check works fine
   CPPUNIT_ASSERT(true);
Index: src/unittests/ObserverTest.hpp
===================================================================
--- src/unittests/ObserverTest.hpp	(revision f8879dd41341e9b0285c43f7d9eec41d28414400)
+++ src/unittests/ObserverTest.hpp	(revision 57ee0d5caa59d7fc4f63f27545616746ba78b243)
@@ -40,6 +40,8 @@
   UpdateCountObserver *observer2;
   UpdateCountObserver *observer3;
+  UpdateCountObserver *observer4;
 
-  SimpleObservable *simpleObservable;
+  SimpleObservable *simpleObservable1;
+  SimpleObservable *simpleObservable2;
   CallObservable *callObservable;
   SuperObservable *superObservable;
