Index: src/UIElements/Views/Qt4/ElementList/QtElementList.cpp
===================================================================
--- src/UIElements/Views/Qt4/ElementList/QtElementList.cpp	(revision 6a7353e36c3512675d0e16c1907644a20941cc39)
+++ src/UIElements/Views/Qt4/ElementList/QtElementList.cpp	(revision d316ad175d80f2441d92437f76c6c09371a17998)
@@ -32,4 +32,6 @@
 #include <config.h>
 #endif
+
+#include <QtCore/QMetaType>
 
 #include "Views/Qt4/ElementList/QtElementList.hpp"
@@ -57,7 +59,8 @@
 QtElementList::QtElementList(QtObservedInstanceBoard *_board, QWidget * _parent) :
     QTreeWidget (_parent),
-    Observer("QtElementList"),
-    board(_board)
-{
+    atomobserver(_board)
+{
+  qRegisterMetaType<QtObservedAtom::ptr>("QtObservedAtom::ptr");
+
   setColumnCount(COLUMNCOUNT);
   setSelectionMode(QAbstractItemView::MultiSelection);
@@ -97,8 +100,11 @@
 	dirty = true;
 
-	AtomObserver::getInstance().signOn(this, atom::ElementChanged);
-
+	connect(&atomobserver, SIGNAL(ElementChanged(const QtObservedAtom::ptr)),
+	    this, SLOT(changeElement(const QtObservedAtom::ptr)));
+  connect(&atomobserver, SIGNAL(AtomInserted(const QtObservedAtom::ptr)),
+      this, SLOT(addAtomElement(const QtObservedAtom::ptr)));
+  connect(&atomobserver, SIGNAL(AtomRemoved(const atomId_t)),
+      this, SLOT(removeAtomElement(const atomId_t)));
   connect(this,SIGNAL(itemSelectionChanged()),this,SLOT(rowSelected()));
-  connect(this,SIGNAL(needsRefill(const atomId_t)),this,SLOT(refill(const atomId_t)), Qt::QueuedConnection);
 //  connect(this,SIGNAL(changed()),this,SLOT(update()));
 
@@ -107,25 +113,9 @@
 QtElementList::~QtElementList()
 {
-  AtomObserver::getInstance().signOff(this, atom::ElementChanged);
-}
-
-void QtElementList::update(Observable *publisher)
-{
-  ASSERT(0, "QtElementList::update() - is not enlisted to any general update.");
-}
-
-
-void QtElementList::recieveNotification(Observable *publisher, Notification_ptr notification)
-{
-  if (notification->getChannelNo() == atom::ElementChanged) {
-    dirty = true;
-
-    emit needsRefill(dynamic_cast<atom *>(publisher)->getId());
-  } else
-    ASSERT(0, "QtElementList::recieveNotification() - we are not enlisted to any other instance's channel.");
-}
-
-void QtElementList::updateElement(const QtObservedAtom::ptr &_atom)
-{
+}
+void QtElementList::changeElement(const QtObservedAtom::ptr _atom)
+{
+  boost::recursive_mutex::scoped_lock lock(refill_mutex);
+
   const atomicNumber_t newelement = _atom->getAtomElement();
   atomicNumber_t oldelement = -1;
@@ -134,16 +124,4 @@
   ASSERT( newtreeItem != NULL,
       "QtElementList::updateElement() - new element item not present.");
-//  if (newtreeItem == NULL) {
-//    // add new item
-//    const element& e = _atom.getElement();
-//    newtreeItem = new QTreeWidgetItem();
-//    newtreeItem->setText(NUMBER, QString::number(e.getAtomicNumber()));
-//    newtreeItem->setText(NAME, QString(e.getName().c_str()));
-//    newtreeItem->setText(SYMBOL, QString(e.getSymbol().c_str()));
-//    newtreeItem->setText(MASS, QString::number(e.getMass()));
-//    setOccurrence(*newtreeItem, 0);
-//    elementSelection.push_back(newtreeItem->isSelected());
-//    insertTopLevelItem(newelement-1, newtreeItem);
-//  }
   AtomElementMap_t::iterator iter = AtomElementMap.find(atomid);
   if (iter == AtomElementMap.end()) {
@@ -182,23 +160,27 @@
 }
 
-void QtElementList::refill(const atomId_t _atomid)
-{
-  refill_mutex.lock();
-
-  const QtObservedAtom::ptr walker = board->getObservedAtom(_atomid);
-  if (walker)
-    updateElement(walker);
-  else {
-    AtomElementMap_t::iterator iter = AtomElementMap.find(_atomid);
-    if (iter != AtomElementMap.end()) {
-      QTreeWidgetItem *oldtreeItem = topLevelItem(iter->second-1);
-      const int count_old = oldtreeItem->text(OCCURRENCE).toInt();
-      setOccurrence(*oldtreeItem, count_old-1);
-
-      AtomElementMap.erase(iter);
-    }
-  }
-
-  refill_mutex.unlock();
+void QtElementList::addAtomElement(const QtObservedAtom::ptr _atom)
+{
+  boost::recursive_mutex::scoped_lock lock(refill_mutex);
+
+  changeElement(_atom);
+
+}
+
+void QtElementList::removeAtomElement(const atomId_t _atomid)
+{
+  boost::recursive_mutex::scoped_lock lock(refill_mutex);
+
+  const AtomElementMap_t::iterator iter = AtomElementMap.find(_atomid);
+  ASSERT (iter != AtomElementMap.end(),
+      "QtElementList::addAtomElement() - atom #"+toString(_atomid)
+      +" is not present in elementlookup map.");
+  if (iter != AtomElementMap.end()) {
+    QTreeWidgetItem *oldtreeItem = topLevelItem(iter->second-1);
+    const int count_old = oldtreeItem->text(OCCURRENCE).toInt();
+    setOccurrence(*oldtreeItem, count_old-1);
+
+    AtomElementMap.erase(iter);
+  }
 }
 
@@ -208,7 +190,4 @@
 //    refill();
   QTreeWidget::paintEvent(event);
-}
-
-void QtElementList::subjectKilled(Observable *publisher) {
 }
 
Index: src/UIElements/Views/Qt4/ElementList/QtElementList.hpp
===================================================================
--- src/UIElements/Views/Qt4/ElementList/QtElementList.hpp	(revision 6a7353e36c3512675d0e16c1907644a20941cc39)
+++ src/UIElements/Views/Qt4/ElementList/QtElementList.hpp	(revision d316ad175d80f2441d92437f76c6c09371a17998)
@@ -14,18 +14,16 @@
 #endif
 
+#include <QtGui/QTreeWidget>
 
-#include <QtGui/QTreeWidget>
-#include <QMutex>
-
-#include "CodePatterns/Observer/Observer.hpp"
-#include "CodePatterns/Observer/Notification.hpp"
+#include <boost/thread/recursive_mutex.hpp>
 
 #include "types.hpp"
 
 #include "UIElements/Qt4/InstanceBoard/QtObservedAtom.hpp"
+#include "UIElements/Views/Qt4/ElementList/QtObservedAtomObserver.hpp"
 
 class QtObservedInstanceBoard;
 
-class QtElementList: public QTreeWidget, public Observer
+class QtElementList: public QTreeWidget
 {
   Q_OBJECT
@@ -36,11 +34,7 @@
 
 protected:
-  virtual void update(Observable *publisher);
-  virtual void recieveNotification(Observable *publisher, Notification_ptr notification);
-  virtual void subjectKilled(Observable *publisher);
   virtual void paintEvent(QPaintEvent * event);
 
   void setOccurrence(QTreeWidgetItem &_item, const int count);
-  void updateElement(const QtObservedAtom::ptr &_atom);
 
   static const int COLUMNCOUNT;
@@ -48,21 +42,20 @@
   static const char *COLUMNNAMES[];
 
-signals:
-  void needsRefill(const atomId_t);
-
 private slots:
   void rowSelected();
-  void refill(const atomId_t);
+  void changeElement(const QtObservedAtom::ptr _atom);
+  void addAtomElement(const QtObservedAtom::ptr _atom);
+  void removeAtomElement(const atomId_t _atom);
 
 private:
   std::vector<bool> elementSelection; //!< needed to determine when a selection changes
-  typedef std::map<atomId_t, atomicNumber_t> AtomElementMap_t;
+  typedef std::map<const atomId_t, atomicNumber_t> AtomElementMap_t;
   AtomElementMap_t AtomElementMap;
   bool dirty;
 
-  //!> ptr to instance board to obtain observed atoms
-  QtObservedInstanceBoard * const board;
+  //!> observed all QtObservedAtoms for ElementChanged signals
+  QtObservedAtomObserver atomobserver;
 
-  QMutex refill_mutex;
+  mutable boost::recursive_mutex refill_mutex;
 };
 
