Index: src/Fragmentation/Summation/Containers/FragmentationResultContainer.cpp
===================================================================
--- src/Fragmentation/Summation/Containers/FragmentationResultContainer.cpp	(revision c792e0b77a078d009c7339990afeeb01b61b3d9e)
+++ src/Fragmentation/Summation/Containers/FragmentationResultContainer.cpp	(revision d20ded7412ff5458245e32f83417cae5ab4a04c9)
@@ -49,4 +49,5 @@
     )
 {
+  OBSERVE;
   ASSERT( ResultsType == BothRanges,
       "FragmentationResultContainer::getLongRangeResults() - mixing full and short range is not in the cards.");
@@ -77,4 +78,5 @@
     )
 {
+  OBSERVE;
   ASSERT( (ResultsType == ShortRangeOnly) || (keysets.KeySets.empty()) ,
       "FragmentationResultContainer::getLongRangeResults() - mixing full and short range is not in the cards.");
Index: src/Fragmentation/Summation/Containers/FragmentationResultContainer.hpp
===================================================================
--- src/Fragmentation/Summation/Containers/FragmentationResultContainer.hpp	(revision c792e0b77a078d009c7339990afeeb01b61b3d9e)
+++ src/Fragmentation/Summation/Containers/FragmentationResultContainer.hpp	(revision d20ded7412ff5458245e32f83417cae5ab4a04c9)
@@ -20,4 +20,6 @@
 #include <map>
 
+#include "CodePatterns/Observer/Observable.hpp"
+
 #ifdef HAVE_JOBMARKET
 #include "JobMarket/types.hpp"
@@ -39,5 +41,7 @@
  * full serialize.
  */
-class FragmentationResultContainer: public Singleton<FragmentationResultContainer>
+class FragmentationResultContainer :
+    public Singleton<FragmentationResultContainer>,
+    public Observable
 {
   //!> Singleton patterns needs access to private cstor/dtor.
@@ -45,4 +49,5 @@
 private:
   FragmentationResultContainer() :
+    Observable("FragmentationResultContainer"),
     ResultsType(BothRanges)
   {}
@@ -95,4 +100,5 @@
   void clear()
   {
+    OBSERVE;
     keysets.clear();
     forcekeysets.clear();
Index: src/UIElements/Makefile.am
===================================================================
--- src/UIElements/Makefile.am	(revision c792e0b77a078d009c7339990afeeb01b61b3d9e)
+++ src/UIElements/Makefile.am	(revision d20ded7412ff5458245e32f83417cae5ab4a04c9)
@@ -167,4 +167,5 @@
   UIElements/Menu/Qt4/QtMenuPipe.cpp \
   UIElements/Views/Qt4/QtElementList.cpp \
+  UIElements/Views/Qt4/QtFragmentList.cpp \
   UIElements/Views/Qt4/QtHomologyList.cpp \
   UIElements/Views/Qt4/QtInfoBox.cpp \
@@ -190,4 +191,5 @@
   UIElements/Menu/Qt4/QtMenuPipe.hpp \
   UIElements/Views/Qt4/QtElementList.hpp \
+  UIElements/Views/Qt4/QtFragmentList.hpp \
   UIElements/Views/Qt4/QtHomologyList.hpp \
   UIElements/Views/Qt4/QtInfoBox.hpp \
Index: src/UIElements/Qt4/QtMainWindow.cpp
===================================================================
--- src/UIElements/Qt4/QtMainWindow.cpp	(revision c792e0b77a078d009c7339990afeeb01b61b3d9e)
+++ src/UIElements/Qt4/QtMainWindow.cpp	(revision d20ded7412ff5458245e32f83417cae5ab4a04c9)
@@ -55,4 +55,5 @@
 #include "Views/Qt4/QtMoleculeList.hpp"
 #include "Views/Qt4/QtElementList.hpp"
+#include "Views/Qt4/QtFragmentList.hpp"
 #include "Views/Qt4/QtHomologyList.hpp"
 #include "Views/Qt4/QtShapeController.hpp"
@@ -96,4 +97,5 @@
   elementList = new QtElementList(worldTab);
   homologyList = new QtHomologyList(worldTab);
+  fragmentList = new QtFragmentList(worldTab);
   shapeController = new QtShapeController(worldTab);
 
@@ -126,4 +128,5 @@
   worldTab->addTab(moleculeList, "Molecules");
   worldTab->addTab(elementList, "All Elements");
+  worldTab->addTab(fragmentList, "All Fragments");
   worldTab->addTab(homologyList, "All Homologies");
 
Index: src/UIElements/Qt4/QtMainWindow.hpp
===================================================================
--- src/UIElements/Qt4/QtMainWindow.hpp	(revision c792e0b77a078d009c7339990afeeb01b61b3d9e)
+++ src/UIElements/Qt4/QtMainWindow.hpp	(revision d20ded7412ff5458245e32f83417cae5ab4a04c9)
@@ -26,4 +26,5 @@
 class QtElementList;
 class QtHomologyList;
+class QtFragmentList;
 class QtShapeController;
 class StringView;
@@ -55,4 +56,5 @@
   QtElementList *elementList;
   QtHomologyList *homologyList;
+  QtFragmentList *fragmentList;
   QtShapeController *shapeController;
   GLWorldView *glWorldView;
Index: src/UIElements/Views/Qt4/QtFragmentList.cpp
===================================================================
--- src/UIElements/Views/Qt4/QtFragmentList.cpp	(revision d20ded7412ff5458245e32f83417cae5ab4a04c9)
+++ src/UIElements/Views/Qt4/QtFragmentList.cpp	(revision d20ded7412ff5458245e32f83417cae5ab4a04c9)
@@ -0,0 +1,187 @@
+/*
+ * Project: MoleCuilder
+ * Description: creates and alters molecular systems
+ * Copyright (C)  2013 Frederik Heber. All rights reserved.
+ * 
+ *
+ *   This file is part of MoleCuilder.
+ *
+ *    MoleCuilder is free software: you can redistribute it and/or modify
+ *    it under the terms of the GNU General Public License as published by
+ *    the Free Software Foundation, either version 2 of the License, or
+ *    (at your option) any later version.
+ *
+ *    MoleCuilder is distributed in the hope that it will be useful,
+ *    but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *    GNU General Public License for more details.
+ *
+ *    You should have received a copy of the GNU General Public License
+ *    along with MoleCuilder.  If not, see <http://www.gnu.org/licenses/>.
+ */
+
+/*
+ * QtFragmentList.cpp
+ *
+ *  Created on: Sep 03, 2013
+ *      Author: heber
+ */
+
+// include config.h
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+#include "Views/Qt4/QtFragmentList.hpp"
+
+#include <iterator>
+#include <iostream>
+
+#include <QAbstractItemView>
+
+#include "CodePatterns/MemDebug.hpp"
+
+#include "Descriptors/AtomIdDescriptor.hpp"
+#include "Formula.hpp"
+#include "Fragmentation/KeySetsContainer.hpp"
+#include "Fragmentation/Summation/IndexSetContainer.hpp"
+#include "Fragmentation/Summation/Containers/FragmentationResultContainer.hpp"
+#include "Fragmentation/Summation/Containers/MPQCData.hpp"
+#include "World.hpp"
+
+using namespace std;
+
+const int QtFragmentList::COLUMNCOUNT = COLUMNTYPES_MAX;
+const char *QtFragmentList::COLUMNNAMES[QtFragmentList::COLUMNCOUNT]={"Number","KeySet","Formula","Energy"};
+
+QtFragmentList::QtFragmentList(QWidget * _parent) :
+    QTreeWidget (_parent),
+    Observer("QtFragmentList")
+{
+  setColumnCount(COLUMNCOUNT);
+  setSelectionMode(QAbstractItemView::MultiSelection);
+
+  QStringList header;
+	for(int i=0; i<COLUMNCOUNT;++i)
+	  header << COLUMNNAMES[i];
+	setHeaderLabels(header);
+
+	setSelectionMode( SingleSelection );
+
+	dirty = true;
+  clearing = false;
+
+  refill();
+
+  FragmentationResultContainer &fragments =
+      FragmentationResultContainer::getInstance();
+	fragments.signOn(this);
+
+  connect(this,SIGNAL(itemSelectionChanged()),this,SLOT(rowSelected()));
+  connect(this,SIGNAL(changed()),this,SLOT(update()));
+}
+
+QtFragmentList::~QtFragmentList()
+{
+  FragmentationResultContainer &fragments =
+      FragmentationResultContainer::getInstance();
+  fragments.signOff(this);
+}
+
+void QtFragmentList::update(Observable *publisher) {
+
+  dirty = true;
+
+  // force an update from Qt...
+  clearing = true;
+  clear();
+  clearing = false;
+  //emit changed(); doesn't work!?!
+}
+
+void QtFragmentList::refill()
+{
+  clearing = true;
+  FragmentationResultContainer &fragments =
+      FragmentationResultContainer::getInstance();
+
+  // clear everything
+  FragmentSelection.clear();
+  indexsets.clear();
+  clear();
+
+  size_t count = 0;
+  const IndexSetContainer keysets(fragments.getKeySets());
+  const FragmentationResultContainer::shortrangedata_t &shortrange = fragments.getShortRangeResults();
+  IndexSetContainer::Container_t::const_iterator keyiter = keysets.getContainer().begin();
+  FragmentationResultContainer::shortrangedata_t::const_iterator resultiter = shortrange.begin();
+  for (;(keyiter != keysets.getContainer().end()) && (resultiter != shortrange.end());
+      ++keyiter,++resultiter,++count) {
+
+    QTreeWidgetItem *treeItem = new QTreeWidgetItem(this);
+    treeItem->setText(NUMBER, QString::number(count));
+    {
+      std::stringstream output;
+      output << **keyiter;
+      treeItem->setText(KEYSET, QString(output.str().c_str()));
+    }
+    {
+      std::stringstream output;
+      Formula formula;
+      for (IndexSet::const_iterator indexiter = (*keyiter)->begin();
+          indexiter != (*keyiter)->end();
+          ++indexiter) {
+        const atom *_atom = World::getInstance().getAtom(AtomById(*indexiter));
+        formula.addElements(_atom->getElementNo(), 1);
+      }
+      output << formula.toString();
+      treeItem->setText(FORMULA, QString(output.str().c_str()));
+    }
+    {
+      std::stringstream output;
+      output << resultiter->second.energies.total;
+      treeItem->setText(ENERGY, QString(output.str().c_str()));
+    }
+    FragmentSelection.push_back(treeItem->isSelected());
+    indexsets.push_back( **keyiter );
+  }
+  dirty = false;
+  clearing = false;
+}
+
+void QtFragmentList::paintEvent(QPaintEvent * event)
+{
+  if (dirty)
+    refill();
+  QTreeWidget::paintEvent(event);
+}
+
+void QtFragmentList::subjectKilled(Observable *publisher)
+{
+  // as a new instance should always already be present ... just sign on
+  FragmentationResultContainer &fragments =
+      FragmentationResultContainer::getInstance();
+  fragments.signOn(this);
+}
+
+
+void QtFragmentList::rowSelected()
+{
+  //std::cout << "rowSelected\n";
+  for (int i=0;i<topLevelItemCount();++i) {
+    QTreeWidgetItem *item = topLevelItem(i);
+    bool newSelection = item->isSelected();
+    if (newSelection != FragmentSelection[i]){
+      FragmentSelection[i] = newSelection;
+      // get the keyset and select the specific atoms
+      for (IndexSet::const_iterator iter = indexsets[i].begin();
+          iter != indexsets[i].end();
+          ++iter)
+        if (newSelection)
+          World::getInstance().selectAtom(*iter);
+        else
+          World::getInstance().unselectAtom(*iter);
+    }
+  }
+}
+
Index: src/UIElements/Views/Qt4/QtFragmentList.hpp
===================================================================
--- src/UIElements/Views/Qt4/QtFragmentList.hpp	(revision d20ded7412ff5458245e32f83417cae5ab4a04c9)
+++ src/UIElements/Views/Qt4/QtFragmentList.hpp	(revision d20ded7412ff5458245e32f83417cae5ab4a04c9)
@@ -0,0 +1,61 @@
+/*
+ * QtFragmentList.hpp
+ *
+ *  Created on: Sep 03, 2013
+ *      Author: heber
+ */
+
+#ifndef QTFRAGMENTLIST_H_
+#define QTFRAGMENTLIST_H_
+
+// include config.h
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+
+#include <QtGui/QTreeWidget>
+#include "CodePatterns/Observer/Observer.hpp"
+
+#include "Fragmentation/Summation/IndexSet.hpp"
+
+class FragmentGraph;
+
+class QtFragmentList: public QTreeWidget, public Observer
+{
+  Q_OBJECT
+
+public:
+  QtFragmentList(QWidget * _parent=0);
+  virtual ~QtFragmentList();
+
+protected:
+  virtual void update(Observable *publisher);
+  virtual void subjectKilled(Observable *publisher);
+  virtual void paintEvent(QPaintEvent * event);
+  void refill();
+
+  static const int COLUMNCOUNT;
+  enum {NUMBER,KEYSET,FORMULA,ENERGY,COLUMNTYPES_MAX} COLUMNTYPES;
+  static const char *COLUMNNAMES[];
+
+private slots:
+  void rowSelected();
+
+signals:
+  void FragmentSelected(FragmentGraph const *);
+  void FragmentUnSelected(FragmentGraph const *);
+  void changed();
+
+private:
+  //!> needed to determine when a selection changes
+  std::vector<bool> FragmentSelection;
+  //!> index set of the fragment
+  std::vector<IndexSet> indexsets;
+  //!> flag to indicate that we got an update
+  bool dirty;
+  //!> flag to indicate that we currently clear the view, avoids thread collisions
+  bool clearing;
+};
+
+#endif /* QTFRAGMENTLIST_H_ */
Index: src/UIElements/Views/Qt4/QtHomologyList.cpp
===================================================================
--- src/UIElements/Views/Qt4/QtHomologyList.cpp	(revision c792e0b77a078d009c7339990afeeb01b61b3d9e)
+++ src/UIElements/Views/Qt4/QtHomologyList.cpp	(revision d20ded7412ff5458245e32f83417cae5ab4a04c9)
@@ -24,5 +24,5 @@
  * QtHomologyList.cpp
  *
- *  Created on: Jun 24, 2014
+ *  Created on: Jun 24, 2013
  *      Author: heber
  */
