Index: src/Descriptors/MoleculeDescriptor.cpp
===================================================================
--- src/Descriptors/MoleculeDescriptor.cpp	(revision 270bdface47b2d970089daba2ed78dc3f90395a7)
+++ src/Descriptors/MoleculeDescriptor.cpp	(revision 97445f1edda30c6d17472c562f9832a49df3e644)
@@ -49,4 +49,5 @@
 
 typedef World::MoleculeSet::internal_iterator molecules_iter_t;
+typedef World::MoleculeSet::const_iterator const_molecules_iter_t;
 
 /************************ Forwarding object **************************************/
@@ -75,8 +76,16 @@
 }
 
+const molecule* MoleculeDescriptor::find() const {
+  return const_cast<const impl_t &>(*impl).find();
+}
+
 std::vector<molecule*> MoleculeDescriptor::findAll(){
   return impl->findAll();
 }
 
+std::vector<const molecule*> MoleculeDescriptor::findAll() const{
+  return const_cast<const impl_t &>(*impl).findAll();
+}
+
 MoleculeDescriptor::impl_ptr MoleculeDescriptor::get_impl() const{
   return impl;
@@ -100,8 +109,24 @@
 }
 
+const World::MoleculeSet& MoleculeDescriptor_impl::getMolecules() const{
+  return World::getInstance().molecules;
+}
+
 molecule* MoleculeDescriptor_impl::find() {
   World::MoleculeSet &molecules = getMolecules();
-  molecules_iter_t res = find_if(molecules.begin_internal(),molecules.end_internal(),boost::bind(&MoleculeDescriptor_impl::predicate,this,_1));
+  molecules_iter_t res = find_if(
+      molecules.begin_internal(),molecules.end_internal(),
+      boost::bind(&MoleculeDescriptor_impl::predicate,
+              this,_1));
   return (res!=molecules.end_internal())?((*res).second):0;
+}
+
+const molecule* MoleculeDescriptor_impl::find() const {
+  const World::MoleculeSet &molecules = getMolecules();
+  const_molecules_iter_t res = find_if(
+      molecules.begin(),molecules.end(),
+      boost::bind(&MoleculeDescriptor_impl::predicate,
+              this,_1));
+  return (res!=molecules.end())?((*res).second):0;
 }
 
@@ -111,10 +136,26 @@
   for_each(molecules.begin_internal(),
            molecules.end_internal(),
-           boost::bind(&MoleculeDescriptor_impl::checkAndAdd,
-                       this,&res,_1));
+           boost::bind(static_cast<void (MoleculeDescriptor_impl::*)(
+               std::vector<molecule*> *,
+               std::pair<moleculeId_t,molecule*>)>(&MoleculeDescriptor_impl::checkAndAdd),
+                       this,boost::cref(&res),_1));
   return res;
 }
 
-void MoleculeDescriptor_impl::checkAndAdd(std::vector<molecule*> *v,std::pair<moleculeId_t,molecule*> p){
+vector<const molecule*> MoleculeDescriptor_impl::findAll() const {
+  vector<const molecule*> res;
+  const World::MoleculeSet &molecules = getMolecules();
+  for_each(molecules.begin(),
+           molecules.end(),
+           boost::bind(static_cast<void (MoleculeDescriptor_impl::*)(
+               std::vector<const molecule*> *,
+               std::pair<moleculeId_t,const molecule*>) const>(&MoleculeDescriptor_impl::checkAndAdd),
+                       boost::cref(this),&res,_1));
+  return res;
+}
+
+void MoleculeDescriptor_impl::checkAndAdd(
+    std::vector<molecule*> *v,
+    std::pair<moleculeId_t,molecule*> p){
   if(predicate(p)){
     v->push_back(p.second);
@@ -122,4 +163,12 @@
 }
 
+void MoleculeDescriptor_impl::checkAndAdd(
+    std::vector<const molecule*> *v,
+    std::pair<moleculeId_t,const molecule*> p) const{
+  if(predicate(p)){
+    v->push_back(p.second);
+  }
+}
+
 /************************** Universe and Emptyset *****************/
 
@@ -130,5 +179,5 @@
 {}
 
-bool MoleculeAllDescriptor_impl::predicate(std::pair<moleculeId_t,molecule*>){
+bool MoleculeAllDescriptor_impl::predicate(const std::pair<moleculeId_t,const molecule*>) const{
   return true;
 }
@@ -144,5 +193,5 @@
 {}
 
-bool MoleculeNoneDescriptor_impl::predicate(std::pair<moleculeId_t,molecule*>){
+bool MoleculeNoneDescriptor_impl::predicate(const std::pair<moleculeId_t,const molecule*>) const{
   return false;
 }
@@ -162,5 +211,5 @@
 {}
 
-bool MoleculeAndDescriptor_impl::predicate(std::pair<moleculeId_t,molecule*> molecule){
+bool MoleculeAndDescriptor_impl::predicate(const std::pair<moleculeId_t,const molecule*> molecule) const{
   return lhs->predicate(molecule) && rhs->predicate(molecule);
 }
@@ -178,5 +227,5 @@
 }
 
-bool MoleculeOrDescriptor_impl::predicate(std::pair<moleculeId_t,molecule*> molecule){
+bool MoleculeOrDescriptor_impl::predicate(const std::pair<moleculeId_t,const molecule*> molecule) const{
   return lhs->predicate(molecule) || rhs->predicate(molecule);
 }
@@ -198,5 +247,5 @@
 }
 
-bool MoleculeNotDescriptor_impl::predicate(std::pair<moleculeId_t,molecule*> molecule){
+bool MoleculeNotDescriptor_impl::predicate(const std::pair<moleculeId_t,const molecule*> molecule) const{
  return !(arg->predicate(molecule));
 }
Index: src/Descriptors/MoleculeDescriptor.hpp
===================================================================
--- src/Descriptors/MoleculeDescriptor.hpp	(revision 270bdface47b2d970089daba2ed78dc3f90395a7)
+++ src/Descriptors/MoleculeDescriptor.hpp	(revision 97445f1edda30c6d17472c562f9832a49df3e644)
@@ -41,5 +41,7 @@
   // close coupling to the world to allow access
   friend molecule* World::getMolecule(MoleculeDescriptor descriptor);
+  friend const molecule* World::getMolecule(MoleculeDescriptor descriptor) const;
   friend std::vector<molecule*> World::getAllMolecules(MoleculeDescriptor descriptor);
+  friend std::vector<const molecule*> World::getAllMolecules(MoleculeDescriptor descriptor) const;
   template <class,class,class> friend class SelectiveIterator;
   template <class,class,class> friend class SelectiveConstIterator;
@@ -79,5 +81,15 @@
    * forward Method to implementation
    */
+  const molecule* find() const;
+
+  /**
+   * forward Method to implementation
+   */
   std::vector<molecule*> findAll();
+
+  /**
+   * forward Method to implementation
+   */
+  std::vector<const molecule*> findAll() const;
 
   /**
Index: src/Descriptors/MoleculeDescriptor_impl.hpp
===================================================================
--- src/Descriptors/MoleculeDescriptor_impl.hpp	(revision 270bdface47b2d970089daba2ed78dc3f90395a7)
+++ src/Descriptors/MoleculeDescriptor_impl.hpp	(revision 97445f1edda30c6d17472c562f9832a49df3e644)
@@ -30,5 +30,5 @@
    * Implement this abstract Method to make a concrete MoleculeDescriptor pick certain Molecules
    */
-  virtual bool predicate(std::pair<moleculeId_t,molecule*>)=0;
+  virtual bool predicate(const std::pair<moleculeId_t,const molecule*>) const=0;
 
 protected:
@@ -43,4 +43,12 @@
 
   /**
+   * This method is called when the Descriptor is used to find the first matching
+   * Molecule. Walks through all Molecules and stops on the first match. Can be implemented
+   * when the searched Molecule can be found in a more efficient way. Calculated
+   * Moleculedescriptors will always use this method, so no improvement there.
+   */
+  virtual const molecule* find() const;
+
+  /**
    * This method is called when the Descriptor is used to find all matching Molecules.
    * Walks through all Molecules and tests the predicate on each one. A vector of all
@@ -48,4 +56,11 @@
    */
   virtual std::vector<molecule*> findAll();
+
+  /**
+   * This method is called when the Descriptor is used to find all matching Molecules.
+   * Walks through all Molecules and tests the predicate on each one. A vector of all
+   * matching Molecules is returned.
+   */
+  virtual std::vector<const molecule*> findAll() const;
 
   /**
@@ -57,5 +72,15 @@
   World::MoleculeSet& getMolecules();
 
+  /**
+   * This method is used internally to query the Set of Molecules from the world.
+   * By using this method derived classes can also access the Internal World Datastructre.
+   * Implemented in full in the Base Descriptor Implementation, so only this one method
+   * needs to be friend with the World class.
+   */
+  const World::MoleculeSet& getMolecules() const;
+
   void checkAndAdd(std::vector<molecule*>*,std::pair<moleculeId_t,molecule*>);
+
+  void checkAndAdd(std::vector<const molecule*>*,std::pair<moleculeId_t,const molecule*>) const;
 };
 
@@ -73,5 +98,5 @@
    * Always returns true for any Molecule
    */
-  virtual bool predicate(std::pair<moleculeId_t,molecule*>);
+  virtual bool predicate(const std::pair<moleculeId_t,const molecule*>) const;
 };
 
@@ -88,5 +113,5 @@
    * Always returns false for any Molecule
    */
-  virtual bool predicate(std::pair<moleculeId_t,molecule*>);
+  virtual bool predicate(const std::pair<moleculeId_t,const molecule*>) const;
 };
 
@@ -106,5 +131,5 @@
    * second Descriptor to decide if an Molecule should be selected.
    */
-  virtual bool predicate(std::pair<moleculeId_t,molecule*>);
+  virtual bool predicate(const std::pair<moleculeId_t,const molecule*>) const;
 
 private:
@@ -126,5 +151,5 @@
    * second Descriptor to decide if an Molecule should be selected.
    */
-  virtual bool predicate(std::pair<moleculeId_t,molecule*>);
+  virtual bool predicate(const std::pair<moleculeId_t,const molecule*>) const;
 
 private:
@@ -145,5 +170,5 @@
    * Opposite of the given descriptor predicate.
    */
-  virtual bool predicate(std::pair<moleculeId_t,molecule*>);
+  virtual bool predicate(const std::pair<moleculeId_t,const molecule*>) const;
 
 private:
Index: src/Descriptors/MoleculeFormulaDescriptor.cpp
===================================================================
--- src/Descriptors/MoleculeFormulaDescriptor.cpp	(revision 270bdface47b2d970089daba2ed78dc3f90395a7)
+++ src/Descriptors/MoleculeFormulaDescriptor.cpp	(revision 97445f1edda30c6d17472c562f9832a49df3e644)
@@ -48,5 +48,5 @@
 MoleculeFormulaDescriptor_impl::~MoleculeFormulaDescriptor_impl(){}
 
-bool MoleculeFormulaDescriptor_impl::predicate(std::pair<moleculeId_t,molecule*> molecule){
+bool MoleculeFormulaDescriptor_impl::predicate(const std::pair<moleculeId_t,const molecule*> molecule) const{
   return molecule.second->getFormula() == formula;
 }
Index: src/Descriptors/MoleculeFormulaDescriptor_impl.hpp
===================================================================
--- src/Descriptors/MoleculeFormulaDescriptor_impl.hpp	(revision 270bdface47b2d970089daba2ed78dc3f90395a7)
+++ src/Descriptors/MoleculeFormulaDescriptor_impl.hpp	(revision 97445f1edda30c6d17472c562f9832a49df3e644)
@@ -23,5 +23,5 @@
   MoleculeFormulaDescriptor_impl(const Formula &);
   virtual ~MoleculeFormulaDescriptor_impl();
-  bool predicate(std::pair<moleculeId_t,molecule*> molecule);
+  bool predicate(const std::pair<moleculeId_t,const molecule*> molecule) const;
 private:
   Formula formula;
Index: src/Descriptors/MoleculeIdDescriptor.cpp
===================================================================
--- src/Descriptors/MoleculeIdDescriptor.cpp	(revision 270bdface47b2d970089daba2ed78dc3f90395a7)
+++ src/Descriptors/MoleculeIdDescriptor.cpp	(revision 97445f1edda30c6d17472c562f9832a49df3e644)
@@ -52,5 +52,5 @@
 {}
 
-bool MoleculeIdDescriptor_impl::predicate(std::pair<moleculeId_t,molecule*> molecule) {
+bool MoleculeIdDescriptor_impl::predicate(const std::pair<moleculeId_t,const molecule*> molecule)  const{
   return molecule.first==id;
 }
@@ -66,6 +66,18 @@
 }
 
+const molecule *MoleculeIdDescriptor_impl::find() const {
+  const World::MoleculeSet &molecules = getMolecules();
+  const World::MoleculeSet::const_iterator res = molecules.find(id);
+  return (res!=molecules.end())?((*res).second):0;
+}
+
 vector<molecule*> MoleculeIdDescriptor_impl::findAll(){
   molecule *res = find();
   return (res)?(vector<molecule*>(1,res)):(vector<molecule*>());
 }
+
+vector<const molecule*> MoleculeIdDescriptor_impl::findAll() const {
+  const molecule *res = find();
+  return (res)?(vector<const molecule*>(1,res)):(vector<const molecule*>());
+}
+
Index: src/Descriptors/MoleculeIdDescriptor_impl.hpp
===================================================================
--- src/Descriptors/MoleculeIdDescriptor_impl.hpp	(revision 270bdface47b2d970089daba2ed78dc3f90395a7)
+++ src/Descriptors/MoleculeIdDescriptor_impl.hpp	(revision 97445f1edda30c6d17472c562f9832a49df3e644)
@@ -16,9 +16,11 @@
   virtual ~MoleculeIdDescriptor_impl();
 
-  bool predicate(std::pair<moleculeId_t,molecule*> molecule);
+  bool predicate(const std::pair<moleculeId_t,const molecule*> molecule) const;
 
 protected:
   virtual molecule *find();
+  virtual const molecule *find() const;
   virtual std::vector<molecule*> findAll();
+  virtual std::vector<const molecule*> findAll() const;
 private:
   moleculeId_t id;
Index: src/Descriptors/MoleculeNameDescriptor.cpp
===================================================================
--- src/Descriptors/MoleculeNameDescriptor.cpp	(revision 270bdface47b2d970089daba2ed78dc3f90395a7)
+++ src/Descriptors/MoleculeNameDescriptor.cpp	(revision 97445f1edda30c6d17472c562f9832a49df3e644)
@@ -50,5 +50,5 @@
 {}
 
-bool MoleculeNameDescriptor_impl::predicate(std::pair<moleculeId_t,molecule*> molecule) {
+bool MoleculeNameDescriptor_impl::predicate(const std::pair<moleculeId_t,const molecule*> molecule)  const{
   return molecule.second->name==name;
 }
Index: src/Descriptors/MoleculeNameDescriptor_impl.hpp
===================================================================
--- src/Descriptors/MoleculeNameDescriptor_impl.hpp	(revision 270bdface47b2d970089daba2ed78dc3f90395a7)
+++ src/Descriptors/MoleculeNameDescriptor_impl.hpp	(revision 97445f1edda30c6d17472c562f9832a49df3e644)
@@ -16,5 +16,5 @@
   virtual ~MoleculeNameDescriptor_impl();
 
-  bool predicate(std::pair<moleculeId_t,molecule*> molecule);
+  bool predicate(const std::pair<moleculeId_t,const molecule*> molecule) const;
 
 private:
Index: src/Descriptors/MoleculeOfAtomSelectionDescriptor.cpp
===================================================================
--- src/Descriptors/MoleculeOfAtomSelectionDescriptor.cpp	(revision 270bdface47b2d970089daba2ed78dc3f90395a7)
+++ src/Descriptors/MoleculeOfAtomSelectionDescriptor.cpp	(revision 97445f1edda30c6d17472c562f9832a49df3e644)
@@ -48,5 +48,5 @@
 MoleculeOfAtomSelectionDescriptor_impl::~MoleculeOfAtomSelectionDescriptor_impl(){}
 
-bool MoleculeOfAtomSelectionDescriptor_impl::predicate(std::pair<moleculeId_t,molecule*> molecule){
+bool MoleculeOfAtomSelectionDescriptor_impl::predicate(const std::pair<moleculeId_t,const molecule*> molecule) const{
   for (molecule::const_iterator iter = molecule.second->begin();
       iter != molecule.second->end();
@@ -70,4 +70,15 @@
 }
 
+const molecule* MoleculeOfAtomSelectionDescriptor_impl::find() const {
+  const World::AtomSet &set = getSelectedAtoms();
+  for (World::AtomSet::const_iterator iter = set.begin();
+      iter != set.end();
+      ++iter) {
+    if (iter->second->getMolecule())
+      return iter->second->getMolecule();
+  }
+  return 0;
+}
+
 std::vector<molecule*> MoleculeOfAtomSelectionDescriptor_impl::findAll(){
   std::vector<molecule*> res;
@@ -78,8 +89,27 @@
       iter != set.end_internal();
       ++iter) {
-    if (iter->second->getMolecule()) {
+    if (iter->second->getMolecule() != NULL) {
+      // get as non-const version
       molecule * const _mol =
           World::getInstance().getMolecule(
               MoleculeById(iter->second->getMolecule()->getId()));
+      inserter = temp.insert( _mol );
+      if (inserter.second)
+        res.push_back(_mol);
+    }
+  }
+  return res;
+}
+
+std::vector<const molecule*> MoleculeOfAtomSelectionDescriptor_impl::findAll() const {
+  std::vector<const molecule*> res;
+  std::set<const molecule*> temp;
+  std::pair< std::set<const molecule*>::iterator, bool> inserter;
+  const World::AtomSet &set = getSelectedAtoms();
+  for (World::AtomSet::const_iterator iter = set.begin();
+      iter != set.end();
+      ++iter) {
+    const molecule * const _mol = iter->second->getMolecule();
+    if ( _mol != NULL ) {
       inserter = temp.insert( _mol );
       if (inserter.second)
@@ -94,4 +124,8 @@
 }
 
+const World::AtomSet& MoleculeOfAtomSelectionDescriptor_impl::getSelectedAtoms() const{
+  return World::getInstance().selectedAtoms;
+}
+
 MoleculeDescriptor MoleculesByAtomSelection(){
   return MoleculeDescriptor(MoleculeDescriptor::impl_ptr(new MoleculeOfAtomSelectionDescriptor_impl()));
Index: src/Descriptors/MoleculeOfAtomSelectionDescriptor_impl.hpp
===================================================================
--- src/Descriptors/MoleculeOfAtomSelectionDescriptor_impl.hpp	(revision 270bdface47b2d970089daba2ed78dc3f90395a7)
+++ src/Descriptors/MoleculeOfAtomSelectionDescriptor_impl.hpp	(revision 97445f1edda30c6d17472c562f9832a49df3e644)
@@ -21,11 +21,14 @@
   MoleculeOfAtomSelectionDescriptor_impl();
   virtual ~MoleculeOfAtomSelectionDescriptor_impl();
-  bool predicate(std::pair<moleculeId_t,molecule*> molecule);
+  bool predicate(const std::pair<moleculeId_t,const molecule*> molecule) const;
 protected:
   // need to overide more than the standard methods to make this fast
-  virtual molecule* find();
+  virtual molecule *find();
+  virtual const molecule *find() const;
   virtual std::vector<molecule*> findAll();
+  virtual std::vector<const molecule*> findAll() const;
 
   World::AtomSet& getSelectedAtoms();
+  const World::AtomSet& getSelectedAtoms() const;
 };
 
Index: src/Descriptors/MoleculeOrderDescriptor.cpp
===================================================================
--- src/Descriptors/MoleculeOrderDescriptor.cpp	(revision 270bdface47b2d970089daba2ed78dc3f90395a7)
+++ src/Descriptors/MoleculeOrderDescriptor.cpp	(revision 97445f1edda30c6d17472c562f9832a49df3e644)
@@ -50,7 +50,7 @@
 {}
 
-bool MoleculeOrderDescriptor_impl::predicate(std::pair<moleculeId_t,molecule*> _molecule)
+bool MoleculeOrderDescriptor_impl::predicate(const std::pair<moleculeId_t,const molecule*> _molecule) const
 {
-  molecule *mol = find();
+  const molecule *mol = find();
   return (mol == _molecule.second);
 }
@@ -61,4 +61,9 @@
 
 World::MoleculeSet& MoleculeOrderDescriptor_impl::getMolecules()
+{
+  return World::getInstance().molecules;
+}
+
+const World::MoleculeSet& MoleculeOrderDescriptor_impl::getMolecules() const
 {
   return World::getInstance().molecules;
@@ -95,6 +100,42 @@
 }
 
+const molecule* MoleculeOrderDescriptor_impl::find() const {
+  const World::MoleculeSet &molecules = getMolecules();
+
+  int i=0;
+  const molecule *mol = NULL;
+  if (id == 0) {
+    return NULL;
+  } else if (id > 0) {
+    World::MoleculeSet::const_iterator res = molecules.begin();
+    for (; res != molecules.end(); ++res) { // when iterator is normal, ++ goes forward!
+      ++i;
+      if (id == i) {
+        mol = res->second;
+        break;
+      }
+    }
+  } else {
+    World::MoleculeSet::const_reverse_iterator res = molecules.rbegin();
+    for (; res != molecules.rend(); ++res) {  // when iterator is reverse, ++ goes backward!
+      --i;
+      if (id == i) {
+        mol = res->second;
+        break;
+      }
+    }
+  }
+
+  return mol;
+}
+
+
 vector<molecule*> MoleculeOrderDescriptor_impl::findAll(){
   molecule *res = find();
   return (res)?(vector<molecule*>(1,res)):(vector<molecule*>());
 }
+
+vector<const molecule*> MoleculeOrderDescriptor_impl::findAll() const {
+  const molecule *res = find();
+  return (res)?(vector<const molecule*>(1,res)):(vector<const molecule*>());
+}
Index: src/Descriptors/MoleculeOrderDescriptor_impl.hpp
===================================================================
--- src/Descriptors/MoleculeOrderDescriptor_impl.hpp	(revision 270bdface47b2d970089daba2ed78dc3f90395a7)
+++ src/Descriptors/MoleculeOrderDescriptor_impl.hpp	(revision 97445f1edda30c6d17472c562f9832a49df3e644)
@@ -16,11 +16,14 @@
   virtual ~MoleculeOrderDescriptor_impl();
 
-  bool predicate(std::pair<moleculeId_t,molecule*> _molecule);
+  bool predicate(const std::pair<moleculeId_t,const molecule*> _molecule) const;
 
 protected:
   virtual molecule *find();
+  virtual const molecule *find() const;
   virtual std::vector<molecule*> findAll();
+  virtual std::vector<const molecule*> findAll() const;
 
   World::MoleculeSet& getMolecules();
+  const World::MoleculeSet& getMolecules() const;
 
 private:
Index: src/Descriptors/MoleculePtrDescriptor.cpp
===================================================================
--- src/Descriptors/MoleculePtrDescriptor.cpp	(revision 270bdface47b2d970089daba2ed78dc3f90395a7)
+++ src/Descriptors/MoleculePtrDescriptor.cpp	(revision 97445f1edda30c6d17472c562f9832a49df3e644)
@@ -45,5 +45,5 @@
 
 
-MoleculePtrDescriptor_impl::MoleculePtrDescriptor_impl(molecule * _ptr) :
+MoleculePtrDescriptor_impl::MoleculePtrDescriptor_impl(const molecule * _ptr) :
   ptr(_ptr)
 {}
@@ -52,9 +52,9 @@
 {}
 
-bool MoleculePtrDescriptor_impl::predicate(std::pair<moleculeId_t,molecule*> molecule) {
+bool MoleculePtrDescriptor_impl::predicate(const std::pair<moleculeId_t,const molecule*> molecule)  const{
   return molecule.second==ptr;
 }
 
-MoleculeDescriptor MoleculeByPtr(molecule * ptr){
+MoleculeDescriptor MoleculeByPtr(const molecule * ptr){
   return MoleculeDescriptor(MoleculeDescriptor::impl_ptr(new MoleculePtrDescriptor_impl(ptr)));
 }
Index: src/Descriptors/MoleculePtrDescriptor.hpp
===================================================================
--- src/Descriptors/MoleculePtrDescriptor.hpp	(revision 270bdface47b2d970089daba2ed78dc3f90395a7)
+++ src/Descriptors/MoleculePtrDescriptor.hpp	(revision 97445f1edda30c6d17472c562f9832a49df3e644)
@@ -18,5 +18,5 @@
 #include "Descriptors/MoleculeDescriptor.hpp"
 
-MoleculeDescriptor MoleculeByPtr(molecule * ptr);
+MoleculeDescriptor MoleculeByPtr(const molecule * ptr);
 
 #endif /* MOLECULEPTRDESCRIPTOR_HPP_ */
Index: src/Descriptors/MoleculePtrDescriptor_impl.hpp
===================================================================
--- src/Descriptors/MoleculePtrDescriptor_impl.hpp	(revision 270bdface47b2d970089daba2ed78dc3f90395a7)
+++ src/Descriptors/MoleculePtrDescriptor_impl.hpp	(revision 97445f1edda30c6d17472c562f9832a49df3e644)
@@ -15,11 +15,11 @@
 {
 public:
-  MoleculePtrDescriptor_impl(molecule * ptr);
+  MoleculePtrDescriptor_impl(const molecule * ptr);
   virtual ~MoleculePtrDescriptor_impl();
 
-  bool predicate(std::pair<moleculeId_t,molecule*> molecule);
+  bool predicate(const std::pair<moleculeId_t,const molecule*> molecule) const;
 
 private:
-  molecule * ptr;
+  const molecule * ptr;
 };
 
Index: src/Descriptors/MoleculeSelectionDescriptor.cpp
===================================================================
--- src/Descriptors/MoleculeSelectionDescriptor.cpp	(revision 270bdface47b2d970089daba2ed78dc3f90395a7)
+++ src/Descriptors/MoleculeSelectionDescriptor.cpp	(revision 97445f1edda30c6d17472c562f9832a49df3e644)
@@ -44,5 +44,5 @@
 MoleculeSelectionDescriptor_impl::~MoleculeSelectionDescriptor_impl(){}
 
-bool MoleculeSelectionDescriptor_impl::predicate(std::pair<moleculeId_t,molecule*> molecule){
+bool MoleculeSelectionDescriptor_impl::predicate(const std::pair<moleculeId_t,const molecule*> molecule) const{
   return getSelectedMolecules().count(molecule.first);
 }
@@ -52,4 +52,10 @@
   World::MoleculeSet::internal_iterator begin = set.begin_internal();
   return (begin!=set.end_internal())?(begin->second):0;
+}
+
+const molecule* MoleculeSelectionDescriptor_impl::find() const {
+  const World::MoleculeSet &set = getSelectedMolecules();
+  World::MoleculeSet::const_iterator begin = set.begin();
+  return (begin!=set.end())?(begin->second):0;
 }
 
@@ -64,5 +70,19 @@
 }
 
+std::vector<const molecule*> MoleculeSelectionDescriptor_impl::findAll() const {
+  std::vector<const molecule*> res;
+  const World::MoleculeSet &set = getSelectedMolecules();
+  transform(set.begin(),
+           set.end(),
+           back_inserter(res),
+           _take<molecule*,World::MoleculeSet::value_type>::get);
+  return res;
+}
+
 World::MoleculeSet& MoleculeSelectionDescriptor_impl::getSelectedMolecules(){
+  return World::getInstance().selectedMolecules;
+}
+
+const World::MoleculeSet& MoleculeSelectionDescriptor_impl::getSelectedMolecules() const{
   return World::getInstance().selectedMolecules;
 }
Index: src/Descriptors/MoleculeSelectionDescriptor_impl.hpp
===================================================================
--- src/Descriptors/MoleculeSelectionDescriptor_impl.hpp	(revision 270bdface47b2d970089daba2ed78dc3f90395a7)
+++ src/Descriptors/MoleculeSelectionDescriptor_impl.hpp	(revision 97445f1edda30c6d17472c562f9832a49df3e644)
@@ -21,11 +21,14 @@
   MoleculeSelectionDescriptor_impl();
   virtual ~MoleculeSelectionDescriptor_impl();
-  bool predicate(std::pair<moleculeId_t,molecule*> molecule);
+  bool predicate(const std::pair<moleculeId_t,const molecule*> molecule) const;
 protected:
   // need to overide more than the standard methods to make this fast
-  virtual molecule* find();
+  virtual molecule *find();
+  virtual const molecule *find() const;
   virtual std::vector<molecule*> findAll();
+  virtual std::vector<const molecule*> findAll() const;
 
   World::MoleculeSet& getSelectedMolecules();
+  const World::MoleculeSet& getSelectedMolecules() const;
 };
 
