Index: src/Descriptors/AtomDescriptor.hpp
===================================================================
--- src/Descriptors/AtomDescriptor.hpp	(revision 94d5ac60852caf3933c959f8314ca0be3d3a7c51)
+++ src/Descriptors/AtomDescriptor.hpp	(revision feb5d057925ffe231be9d8cdf90678dffe4298f4)
@@ -42,4 +42,5 @@
   friend World::AtomComposite World::getAllAtoms(AtomDescriptor descriptor);
   template <class,class,class> friend class SelectiveIterator;
+  template <class,class,class> friend class SelectiveConstIterator;
 
   friend AtomDescriptor operator&&(const AtomDescriptor &lhs, const AtomDescriptor &rhs);
Index: src/Descriptors/DescriptorBase.hpp
===================================================================
--- src/Descriptors/DescriptorBase.hpp	(revision 94d5ac60852caf3933c959f8314ca0be3d3a7c51)
+++ src/Descriptors/DescriptorBase.hpp	(revision feb5d057925ffe231be9d8cdf90678dffe4298f4)
@@ -37,8 +37,13 @@
 template<class _Target,
          class _Container>
+class SelectiveConstIterator;
+
+template<class _Target,
+         class _Container>
 class DescriptorBase
 {
   friend class DescriptorBase_impl<_Target,_Container>;
   friend class SelectiveIterator<_Target,_Container>;
+  friend class SelectiveConstIterator<_Target,_Container>;
 
 
Index: src/Descriptors/MoleculeDescriptor.hpp
===================================================================
--- src/Descriptors/MoleculeDescriptor.hpp	(revision 94d5ac60852caf3933c959f8314ca0be3d3a7c51)
+++ src/Descriptors/MoleculeDescriptor.hpp	(revision feb5d057925ffe231be9d8cdf90678dffe4298f4)
@@ -43,4 +43,5 @@
   friend std::vector<molecule*> World::getAllMolecules(MoleculeDescriptor descriptor);
   template <class,class,class> friend class SelectiveIterator;
+  template <class,class,class> friend class SelectiveConstIterator;
 
   friend MoleculeDescriptor operator&&(const MoleculeDescriptor &lhs, const MoleculeDescriptor &rhs);
Index: src/Descriptors/SelectiveConstIterator.hpp
===================================================================
--- src/Descriptors/SelectiveConstIterator.hpp	(revision feb5d057925ffe231be9d8cdf90678dffe4298f4)
+++ src/Descriptors/SelectiveConstIterator.hpp	(revision feb5d057925ffe231be9d8cdf90678dffe4298f4)
@@ -0,0 +1,58 @@
+/*
+ * SelectiveConstIterator.hpp
+ *
+ *  Created on: Mar 19, 2013
+ *      Author: heber
+ */
+
+#ifndef SELECTIVECONSTITERATOR_HPP_
+#define SELECTIVECONSTITERATOR_HPP_
+
+// include config.h
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+
+#include <iterator>
+
+template<class _Target,
+         class _Container,
+         class _Descriptor>
+class SelectiveConstIterator :
+  public std::iterator<typename std::iterator_traits<typename _Container::const_iterator>::difference_type,
+                       typename std::iterator_traits<typename _Container::const_iterator>::value_type,
+                       typename std::iterator_traits<typename _Container::const_iterator>::pointer,
+                       typename std::iterator_traits<typename _Container::const_iterator>::reference>
+{
+public:
+  typedef typename _Container::const_iterator     Iter;
+  typedef          _Target                  Target;
+  typedef typename Iter::value_type         value_type;
+  typedef typename Iter::difference_type    difference_type;
+  typedef typename Iter::pointer            pointer;
+  typedef typename Iter::reference          reference;
+  typedef typename Iter::iterator_category  iterator_category;
+
+
+  SelectiveConstIterator(_Descriptor, const _Container&);
+  SelectiveConstIterator(_Descriptor, const _Container&, Iter);
+  SelectiveConstIterator(const SelectiveConstIterator&);
+  SelectiveConstIterator& operator=(const SelectiveConstIterator&);
+  SelectiveConstIterator& operator++();     // prefix
+  SelectiveConstIterator  operator++(int);  // postfix with dummy parameter
+  bool operator==(const SelectiveConstIterator&);
+  bool operator!=(const SelectiveConstIterator&);
+  Target const operator*();
+
+  int getCount();
+protected:
+  void advanceState();
+  Iter state;
+  typename _Descriptor::impl_ptr descr;
+  int index;
+
+  const _Container &content;
+};
+
+#endif /* SELECTIVECONSTITERATOR_HPP_ */
Index: src/Descriptors/SelectiveConstIterator_impl.hpp
===================================================================
--- src/Descriptors/SelectiveConstIterator_impl.hpp	(revision feb5d057925ffe231be9d8cdf90678dffe4298f4)
+++ src/Descriptors/SelectiveConstIterator_impl.hpp	(revision feb5d057925ffe231be9d8cdf90678dffe4298f4)
@@ -0,0 +1,143 @@
+/*
+ * SelectiveConstIterator_impl.hpp
+ *
+ *  Created on: Mar 19, 2013
+ *      Author: heber
+ */
+
+#ifndef SELECTIVECONSTITERATOR_IMPL_HPP_
+#define SELECTIVECONSTITERATOR_IMPL_HPP_
+
+// include config.h
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+
+#include "Helpers/helpers.hpp"
+
+template<class _Target,
+         class _Container,
+         class _Descriptor>
+SelectiveConstIterator<_Target,_Container,_Descriptor>::SelectiveConstIterator(_Descriptor _descr, const _Container &_content) :
+    descr(_descr.get_impl()),
+    index(0),
+    content(_content)
+{
+  state = content.begin();
+  advanceState();
+}
+
+template<class _Target,
+         class _Container,
+         class _Descriptor>
+SelectiveConstIterator<_Target,_Container,_Descriptor>::SelectiveConstIterator(_Descriptor _descr, const _Container &_content, SelectiveConstIterator<_Target,_Container,_Descriptor>::Iter _state) :
+    state(_state),
+    descr(_descr.get_impl()),
+    index(0),
+    content(_content)
+{
+  advanceState();
+}
+
+template<class _Target,
+         class _Container,
+         class _Descriptor>
+SelectiveConstIterator<_Target,_Container,_Descriptor>::SelectiveConstIterator(const SelectiveConstIterator<_Target,_Container,_Descriptor>& rhs) :
+    state(rhs.state),
+    descr(rhs.descr),
+    index(rhs.index),
+    content(rhs.content)
+  {}
+
+template<class _Target,
+         class _Container,
+         class _Descriptor>
+SelectiveConstIterator<_Target,_Container,_Descriptor>& SelectiveConstIterator<_Target,_Container,_Descriptor>::operator=(const SelectiveConstIterator<_Target,_Container,_Descriptor>& rhs)
+{
+  if(&rhs!=this){
+    state=rhs.state;
+    descr=rhs.descr;
+    index=rhs.index;
+  }
+  return *this;
+}
+
+template<class _Target,
+         class _Container,
+         class _Descriptor>
+SelectiveConstIterator<_Target,_Container,_Descriptor>&
+  SelectiveConstIterator<_Target,_Container,_Descriptor>::operator++(){
+    ++state;
+    ++index;
+    advanceState();
+    return *this;
+  }
+
+template<class _Target,
+         class _Container,
+         class _Descriptor>
+SelectiveConstIterator<_Target,_Container,_Descriptor> SelectiveConstIterator<_Target,_Container,_Descriptor>::operator++(int){
+    SelectiveConstIterator<_Target,_Container,_Descriptor> res = SelectiveConstIterator<_Target,_Container,_Descriptor>(*this);
+    ++(*this);
+    return res;
+  }
+
+template<class _Target,
+         class _Container,
+         class _Descriptor>
+bool
+  SelectiveConstIterator<_Target,_Container,_Descriptor>::operator==(const SelectiveConstIterator<_Target,_Container,_Descriptor>& rhs){
+    return state==rhs.state;
+  }
+
+template<class _Target,
+         class _Container,
+         class _Descriptor>
+bool
+  SelectiveConstIterator<_Target,_Container,_Descriptor>::operator!=(const SelectiveConstIterator<_Target,_Container,_Descriptor>& rhs){
+    return state!=rhs.state;
+  }
+
+template<class _Target,
+         class _Container,
+         class _Descriptor>
+typename SelectiveConstIterator<_Target,_Container,_Descriptor>::Target const
+  SelectiveConstIterator<_Target,_Container,_Descriptor>::operator*(){
+    return _take<_Target,value_type>::get(*state);
+  }
+
+template<class _Target,
+         class _Container,
+         class _Descriptor>
+void
+  SelectiveConstIterator<_Target,_Container,_Descriptor>::advanceState(){
+    // go forward until we have a matching atom or the end is reached
+    while((state!=content.end()) && (!descr->predicate(*state))){
+      ++state;
+      ++index;
+    }
+  }
+
+template<class _Target,
+         class _Container,
+         class _Descriptor>
+int
+  SelectiveConstIterator<_Target,_Container,_Descriptor>::getCount(){
+    return index;
+  }
+
+
+#define CONSTRUCT_SELECTIVE_CONST_ITERATOR(_Target,_Container,_Descriptor) \
+		template SelectiveConstIterator<_Target,_Container,_Descriptor>::SelectiveConstIterator(_Descriptor, const _Container&); \
+		template SelectiveConstIterator<_Target,_Container,_Descriptor>::SelectiveConstIterator(_Descriptor, const _Container&, SelectiveConstIterator<_Target,_Container,_Descriptor>::Iter); \
+    template SelectiveConstIterator<_Target,_Container,_Descriptor>::SelectiveConstIterator(const SelectiveConstIterator<_Target,_Container,_Descriptor>&); \
+    template SelectiveConstIterator<_Target,_Container,_Descriptor>& SelectiveConstIterator<_Target,_Container,_Descriptor>::operator=(const SelectiveConstIterator<_Target,_Container,_Descriptor>&); \
+    template SelectiveConstIterator<_Target,_Container,_Descriptor>& SelectiveConstIterator<_Target,_Container,_Descriptor>::operator++(); \
+    template SelectiveConstIterator<_Target,_Container,_Descriptor> SelectiveConstIterator<_Target,_Container,_Descriptor>::operator++(int); \
+    template bool SelectiveConstIterator<_Target,_Container,_Descriptor>::operator==(const SelectiveConstIterator<_Target,_Container,_Descriptor>&); \
+    template bool SelectiveConstIterator<_Target,_Container,_Descriptor>::operator!=(const SelectiveConstIterator<_Target,_Container,_Descriptor>&); \
+    template SelectiveConstIterator<_Target,_Container,_Descriptor>::Target const SelectiveConstIterator<_Target,_Container,_Descriptor>::operator*(); \
+    template int SelectiveConstIterator<_Target,_Container,_Descriptor>::getCount();
+
+#endif /* SELECTIVECONSTITERATOR_IMPL_HPP_ */
