diff --git a/modules/mol/base/src/chain_handle.cc b/modules/mol/base/src/chain_handle.cc
index b50917c1084aeabc898542f953176d64f26f33b0..842017ae4ba00bee32ec4238239f211a39786f90 100644
--- a/modules/mol/base/src/chain_handle.cc
+++ b/modules/mol/base/src/chain_handle.cc
@@ -125,23 +125,26 @@ bool ChainHandle::operator!=(const ChainHandle& ref) const
 ResidueHandleIter ChainHandle::ResiduesBegin() const {
   this->CheckValidity();
   impl::ChainImplPtr c=Impl();
-  impl::ChainImplList::iterator cc=c->GetEntity()->GetChain(this->GetName());
-  return ResidueHandleIter(cc, c->GetResidueList().begin(), 
+  return ResidueHandleIter(c->GetEntity()->GetChainIter(this->GetName()), 
+                           impl::begin(c->GetResidueList()), 
                            c->GetEntity(), true);
 }
 
 ResidueHandleIter ChainHandle::ResiduesEnd() const {
   this->CheckValidity();
   impl::ChainImplPtr c=Impl();
-  impl::ChainImplList::iterator cc=c->GetEntity()->GetChain(this->GetName());
-  impl::ChainImplList::iterator nc=cc; ++nc;
-  if (nc!=c->GetEntity()->GetChainList().end()) {
+  impl::pointer_it<impl::ChainImplPtr> cc=c->GetEntity()->GetChainIter(this->GetName());
+  /*impl::pointer_it<impl::ChainImplPtr> nc=cc; ++nc;
+  
+  if (nc!=impl::end(c->GetEntity()->GetChainList())) {
     return ResidueHandleIter(nc, (*nc)->GetResidueList().begin(), 
                              c->GetEntity(), true);    
   } else {
     return ResidueHandleIter(cc, c->GetResidueList().end(), 
                              c->GetEntity(), true);    
-  }
+  }*/
+  return ResidueHandleIter(cc, impl::end(c->GetResidueList()), 
+                           c->GetEntity(), true);
 }
 
 AtomHandleIter ChainHandle::AtomsBegin() const 
@@ -152,9 +155,9 @@ AtomHandleIter ChainHandle::AtomsBegin() const
 
     return AtomHandleIter();
   }  
-  impl::ChainImplList::iterator cc=c->GetEntity()->GetChain(this->GetName()); 
-  return AtomHandleIter(cc, c->GetResidueList().begin(),
-                        c->GetResidueList().front()->GetAtomList().begin(),
+  impl::pointer_it<impl::ChainImplPtr> cc=c->GetEntity()->GetChainIter(this->GetName()); 
+  return AtomHandleIter(cc, impl::begin(c->GetResidueList()),
+                        impl::begin(c->GetResidueList().front()->GetAtomList()),
                         c->GetEntity(), true);    
 
 }
@@ -165,15 +168,16 @@ AtomHandleIter ChainHandle::AtomsEnd() const {
   if (c->GetResidueList().empty()) {
     return AtomHandleIter();
   }  
-  impl::ChainImplList::iterator cc=c->GetEntity()->GetChain(this->GetName());
-  impl::ChainImplList::iterator nc=cc; ++nc;
+  impl::pointer_it<impl::ChainImplPtr> cc=c->GetEntity()->GetChainIter(this->GetName());
+  impl::pointer_it<impl::ChainImplPtr> nc=cc; ++nc;
   impl::ResidueImplList& rc=(*nc)->GetResidueList();
-  if (nc!=c->GetEntity()->GetChainList().end()) {  
-    return AtomHandleIter(nc, rc.begin(), rc.front()->GetAtomList().begin(),
+  if (nc!=impl::end(c->GetEntity()->GetChainList())) {  
+    return AtomHandleIter(nc, impl::begin(rc), 
+                          impl::begin(rc.front()->GetAtomList()),
                           c->GetEntity(), false);
   } else {
-    return AtomHandleIter(cc, c->GetResidueList().end(),
-                          c->GetResidueList().back()->GetAtomList().end(),
+    return AtomHandleIter(cc, impl::end(c->GetResidueList()),
+                          impl::end(c->GetResidueList().back()->GetAtomList()),
                           c->GetEntity(), false);
   }  
 }
diff --git a/modules/mol/base/src/entity_handle.cc b/modules/mol/base/src/entity_handle.cc
index 600c479ce9e6df2d578c1aa933e7756b3d6dbc8c..b7fad67139096c0e07aa5323cb0fcf1929870b72 100644
--- a/modules/mol/base/src/entity_handle.cc
+++ b/modules/mol/base/src/entity_handle.cc
@@ -262,8 +262,8 @@ ResidueHandleIter EntityHandle::ResiduesBegin() const {
   }
   impl::EntityImplPtr i=Impl();
   impl::ChainImplPtr chain=i->GetChainList().front();
-  return ResidueHandleIter(i->GetChainList().begin(),
-                           chain->GetResidueList().begin(), i, true);
+  return ResidueHandleIter(impl::begin(i->GetChainList()),
+                           impl::begin(chain->GetResidueList()), i, true);
 }
 
 ResidueHandleIter EntityHandle::ResiduesEnd() const {
@@ -273,8 +273,8 @@ ResidueHandleIter EntityHandle::ResiduesEnd() const {
   }
   impl::EntityImplPtr i=Impl();
   impl::ChainImplPtr chain=i->GetChainList().back();
-  return ResidueHandleIter(i->GetChainList().end(),
-                           chain->GetResidueList().end(), i, false);
+  return ResidueHandleIter(impl::end(i->GetChainList()),
+                           impl::end(chain->GetResidueList()), i, false);
 }
 
 ChainHandleIter EntityHandle::ChainsBegin() const {
@@ -298,8 +298,8 @@ AtomHandleIter EntityHandle::AtomsBegin() const {
   if (r.empty()) {
     return AtomHandleIter();
   }
-  return AtomHandleIter(ent->GetChainList().begin(), r.begin(),
-                        r.front()->GetAtomList().begin(), ent, true);
+  return AtomHandleIter(impl::begin(ent->GetChainList()), impl::begin(r),
+                        impl::begin(r.front()->GetAtomList()), ent, true);
 }
 
 AtomHandleIter EntityHandle::AtomsEnd() const 
@@ -313,8 +313,8 @@ AtomHandleIter EntityHandle::AtomsEnd() const
   if (r.empty()) {
     return AtomHandleIter();
   }
-  return AtomHandleIter(ent->GetChainList().end(), r.end(),
-                        r.back()->GetAtomList().end(), ent, false);
+  return AtomHandleIter(impl::end(ent->GetChainList()), impl::end(r),
+                        impl::end(r.back()->GetAtomList()), ent, false);
 }
 
 XCSEditor EntityHandle::RequestXCSEditor(EditMode mode) const
diff --git a/modules/mol/base/src/entity_view.cc b/modules/mol/base/src/entity_view.cc
index 639c1e2bd24d3040072af87e50175e3bf64007eb..b6c5deabc1defba0b2c8cf3976b449fd53d0ff4c 100644
--- a/modules/mol/base/src/entity_view.cc
+++ b/modules/mol/base/src/entity_view.cc
@@ -472,8 +472,9 @@ AtomViewIter EntityView::AtomsBegin() const
   if (rvl.empty()) {
     return AtomViewIter();
   }
-  return AtomViewIter(data_->chains.begin(), rvl.begin(),
-                      rvl.front().GetAtomList().begin(), *this, true);
+  return AtomViewIter(impl::begin(data_->chains), impl::begin(rvl),
+                      impl::begin(rvl.front().GetAtomList()), 
+                      *this, true);
 }
 
 AtomViewIter EntityView::AtomsEnd() const {
@@ -485,8 +486,8 @@ AtomViewIter EntityView::AtomsEnd() const {
   if (rvl.empty()) {
     return AtomViewIter();
   }
-  return AtomViewIter(data_->chains.end(), rvl.end(),
-                      rvl.back().GetAtomList().end(), *this, false);
+  return AtomViewIter(impl::end(data_->chains), impl::end(rvl),
+                      impl::end(rvl.back().GetAtomList()), *this, false);
 }
 
 ResidueViewIter EntityView::ResiduesBegin() const 
@@ -496,7 +497,8 @@ ResidueViewIter EntityView::ResiduesBegin() const
     return ResidueViewIter();
   }
   const ResidueViewList& rvl=data_->chains.front().GetResidueList();
-  return ResidueViewIter(data_->chains.begin(), rvl.begin(), *this, true);
+  return ResidueViewIter(impl::begin(data_->chains), 
+                         impl::begin(rvl), *this, true);
 }
 
 ResidueViewIter EntityView::ResiduesEnd() const 
@@ -506,7 +508,8 @@ ResidueViewIter EntityView::ResiduesEnd() const
       return ResidueViewIter();
     }
     const ResidueViewList& rvl=data_->chains.back().GetResidueList();
-    return ResidueViewIter(data_->chains.end(), rvl.end(), *this, false);
+    return ResidueViewIter(impl::end(data_->chains), 
+                           impl::end(rvl), *this, false);
 }
 
 
diff --git a/modules/mol/base/src/impl/CMakeLists.txt b/modules/mol/base/src/impl/CMakeLists.txt
index 3de4864e7a11e9dd29904fd60f997bab8cec2e51..41ddeb0b5672a5081a97b63ec1a6a5c3cdc497d5 100644
--- a/modules/mol/base/src/impl/CMakeLists.txt
+++ b/modules/mol/base/src/impl/CMakeLists.txt
@@ -14,6 +14,7 @@ PARENT_SCOPE
 )
 
 set(OST_MOL_IMPL_HEADERS
+pointer_iterator.hh
 atom_group.hh
 atom_impl.hh
 atom_impl_fw.hh
diff --git a/modules/mol/base/src/impl/entity_impl.cc b/modules/mol/base/src/impl/entity_impl.cc
index c7eb101630db5e9723d848b50fa4abec29d3f2f7..e717342227cc929559b261a672fed9ea26b181f4 100644
--- a/modules/mol/base/src/impl/entity_impl.cc
+++ b/modules/mol/base/src/impl/entity_impl.cc
@@ -1191,6 +1191,18 @@ impl::ChainImplList::iterator EntityImpl::GetChain(const String& name)
   }
   return  cc.end();
 }
+
+pointer_it<ChainImplPtr> EntityImpl::GetChainIter(const String& name)
+{
+  impl::ChainImplList& cc=this->GetChainList();
+  for (size_t i=0; i<cc.size(); ++i) {
+    if (cc[i]->GetName()==name) {
+      return &cc.front()+i;
+    }
+  }
+  return  pointer_it<ChainImplPtr>(NULL);
+}
+
 void EntityImpl::RenameChain(ChainImplPtr chain, const String& new_name)
 {
   ChainImplList::iterator i;
diff --git a/modules/mol/base/src/impl/entity_impl.hh b/modules/mol/base/src/impl/entity_impl.hh
index 81f533bf0a9f3c696276b7e5e487e14a7125bfaa..ca83cf254b3b0c6c8315260a719261105c488a1f 100644
--- a/modules/mol/base/src/impl/entity_impl.hh
+++ b/modules/mol/base/src/impl/entity_impl.hh
@@ -39,7 +39,7 @@
 #include <ost/mol/impl/connector_impl_fw.hh>
 #include <ost/mol/impl/torsion_impl_fw.hh>
 #include <ost/mol/impl/fragment_impl_fw.hh>
-
+#include <ost/mol/impl/pointer_iterator.hh>
 #include <ost/mol/entity_visitor_fw.hh>
 #include <ost/mol/entity_observer_fw.hh>
 #include <ost/mol/entity_view.hh>
@@ -242,6 +242,7 @@ public:
 
   impl::ChainImplList::iterator GetChain(const String& name);
 
+  pointer_it<ChainImplPtr> GetChainIter(const String& name);
   void SetName(const String& ent_name);
 
 private:
diff --git a/modules/mol/base/src/impl/pointer_iterator.hh b/modules/mol/base/src/impl/pointer_iterator.hh
new file mode 100644
index 0000000000000000000000000000000000000000..63a5676ca6f22381e5edcf9f2325d2a778718c06
--- /dev/null
+++ b/modules/mol/base/src/impl/pointer_iterator.hh
@@ -0,0 +1,79 @@
+//------------------------------------------------------------------------------
+// This file is part of the OpenStructure project <www.openstructure.org>
+//
+// Copyright (C) 2008-2010 by the OpenStructure authors
+//
+// This library is free software; you can redistribute it and/or modify it under
+// the terms of the GNU Lesser General Public License as published by the Free
+// Software Foundation; either version 3.0 of the License, or (at your option)
+// any later version.
+// This library 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 Lesser General Public License for more
+// details.
+//
+// You should have received a copy of the GNU Lesser General Public License
+// along with this library; if not, write to the Free Software Foundation, Inc.,
+// 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+//------------------------------------------------------------------------------
+#ifndef OST_MOL_IMPL_POINTER_ITERATOR_HH
+#define OST_MOL_IMPL_POINTER_ITERATOR_HH
+
+#include <vector>
+
+namespace ost { namespace mol { namespace impl {
+
+template <typename T>
+class pointer_it :  public std::iterator<std::forward_iterator_tag, T>{
+public:
+  pointer_it(T* s): s_(s) { }
+  
+  pointer_it<T>& operator++()
+  {
+    ++s_;
+    return *this;
+  }
+  pointer_it<T>& operator+(int rhs)
+  {
+    s_+=rhs;
+    return *this;
+  }
+  
+  bool operator==(const pointer_it<T>& rhs) const
+  {
+    return rhs.s_==s_;
+  }
+  
+  bool operator!=(const pointer_it<T>&rhs) const
+  {
+    return !(*this==rhs);
+  }
+
+  T& operator*()
+  {
+    return *s_;
+  }
+
+  T* operator->()
+  {
+    return s_;
+  }
+private:
+  T* s_;
+};
+
+template <typename T>
+inline pointer_it<T> begin(const std::vector<T>& values)
+{
+  return pointer_it<T>(values.empty() ? NULL : const_cast<T*>(&values.front()));
+}
+
+template <typename T>
+inline pointer_it<T> end(const std::vector<T>& values)
+{
+  return pointer_it<T>(values.empty() ? NULL : const_cast<T*>(&values.back()+1));
+}
+
+}}}
+
+#endif
diff --git a/modules/mol/base/src/iterator.cc b/modules/mol/base/src/iterator.cc
index c5df5394482a7853ec207b67b94e31088c38baa2..05fc8f59e981cd6f7867e60bbbd76b44374dbdc6 100644
--- a/modules/mol/base/src/iterator.cc
+++ b/modules/mol/base/src/iterator.cc
@@ -27,18 +27,19 @@ namespace ost { namespace mol {
 
 void ResidueHandleIter::SkipEmpty()
 {
-  if (cur_res_==(*cur_chain_)->GetResidueList().end()) {
+  if (cur_res_==impl::end((*cur_chain_)->GetResidueList())) {
     // we have to skip over empty chains otherwise we end up pointing to an 
     // invalid residue.
     do {
       ++cur_chain_;
-      if (ent_->GetChainList().end()==cur_chain_) {
+      if (impl::end(ent_->GetChainList())==cur_chain_) {
         break;        
       }
-      cur_res_=(*cur_chain_)->GetResidueList().begin();
+      cur_res_=impl::begin((*cur_chain_)->GetResidueList());
     } while ((*cur_chain_)->GetResidueList().empty());
   }
 }
+
 ResidueHandleIter& ResidueHandleIter::operator++() 
 {
   ++cur_res_;
@@ -46,8 +47,8 @@ ResidueHandleIter& ResidueHandleIter::operator++()
   return *this;
 }
 
-ResidueHandleIter::ResidueHandleIter(impl::ChainImplList::iterator chain_it, 
-                                     impl::ResidueImplList::iterator res_it,
+ResidueHandleIter::ResidueHandleIter(impl::pointer_it<impl::ChainImplPtr> chain_it, 
+                                     impl::pointer_it<impl::ResidueImplPtr> res_it,
                                      impl::EntityImplPtr ent, bool skip_empty) 
  : cur_chain_(chain_it), cur_res_(res_it),
    ent_(ent) {
@@ -68,15 +69,15 @@ ResidueView ResidueViewIter::operator*() {
 
 void ResidueViewIter::SkipEmpty()
 {
-  if (cur_res_==cur_chain_->GetResidueList().end()) {
+  if (cur_res_==impl::end(cur_chain_->GetResidueList())) {
     // we have to skip over empty chains otherwise we end up pointing to an 
     // invalid residue.
     do {
       ++cur_chain_;
-      if (ent_.GetChainList().end()==cur_chain_) {
+      if (impl::end(ent_.GetChainList())==cur_chain_) {
         break;        
       }
-      cur_res_=cur_chain_->GetResidueList().begin();
+      cur_res_=impl::begin(cur_chain_->GetResidueList());
     } while (cur_chain_->GetResidueList().empty());
   }  
 }
@@ -86,16 +87,8 @@ ResidueViewIter& ResidueViewIter::operator++() {
   return *this;
 }
 
-ResidueViewIter::ResidueViewIter() 
-#ifdef _MSC_VER
-    : cur_res_() 
-#else
-    : cur_res_(NULL) 
-#endif
-{}
-
-ResidueViewIter::ResidueViewIter(ChainViewList::const_iterator chain_it,
-                                 ResidueViewList::const_iterator res_it,
+ResidueViewIter::ResidueViewIter(impl::pointer_it<ChainView>   chain_it,
+                                 impl::pointer_it<ResidueView> res_it,
                                  EntityView ent, bool skip_empty) 
  : cur_chain_(chain_it), cur_res_(res_it),
    ent_(ent) {
@@ -104,17 +97,9 @@ ResidueViewIter::ResidueViewIter(ChainViewList::const_iterator chain_it,
   }
 }
 
-AtomHandleIter::AtomHandleIter() 
-#ifdef _MSC_VER
-    : cur_atom_() 
-#else
-    : cur_atom_(NULL) 
-#endif
-{}  
-
-AtomHandleIter::AtomHandleIter(impl::ChainImplList::iterator chain_it,
-                               impl::ResidueImplList::iterator res_it,
-                               impl::AtomImplList::iterator atom_it,
+AtomHandleIter::AtomHandleIter(impl::pointer_it<impl::ChainImplPtr> chain_it,
+                               impl::pointer_it<impl::ResidueImplPtr> res_it,
+                               impl::pointer_it<impl::AtomImplPtr> atom_it,
                                impl::EntityImplPtr ent, bool skip_empty)
  : cur_chain_(chain_it), cur_res_(res_it), cur_atom_(atom_it),
    ent_(ent) 
@@ -130,26 +115,26 @@ AtomHandle AtomHandleIter::operator*() {
 
 void AtomHandleIter::SkipEmpty()
 {
-  if ((*cur_res_)->GetAtomList().end()==cur_atom_) {
+  if (impl::end((*cur_res_)->GetAtomList())==cur_atom_) {
     // we have to skip over empty chains and residues otherwise we end up 
     // pointing to an invalid atom.
     do {
       ++cur_res_;
-      if ((*cur_chain_)->GetResidueList().end()==cur_res_) {
+      if (impl::end((*cur_chain_)->GetResidueList())==cur_res_) {
         do {
           ++cur_chain_;
-          if (ent_->GetChainList().end()==cur_chain_) {
+          if (impl::end(ent_->GetChainList())==cur_chain_) {
             return;
           }
 
-          cur_res_=(*cur_chain_)->GetResidueList().begin();
+          cur_res_=impl::begin((*cur_chain_)->GetResidueList());
           if (!(*cur_chain_)->GetResidueList().empty())          
-            cur_atom_=(*cur_res_)->GetAtomList().begin();
+            cur_atom_=impl::begin((*cur_res_)->GetAtomList());
           else
-            cur_atom_=impl::AtomImplList::iterator();
+            cur_atom_=impl::pointer_it<impl::AtomImplPtr>(NULL);
         } while ((*cur_chain_)->GetResidueList().empty());
       } else {
-        cur_atom_=(*cur_res_)->GetAtomList().begin();
+        cur_atom_=impl::begin((*cur_res_)->GetAtomList());
       }
     } while ((*cur_res_)->GetAtomList().empty());
   }
@@ -162,17 +147,9 @@ AtomHandleIter& AtomHandleIter::operator++()
   return *this;
 }
 
-AtomViewIter::AtomViewIter()
-#ifdef _MSC_VER
-    : cur_atom_() 
-#else
-    : cur_atom_(NULL) 
-#endif
-{}  
-
-AtomViewIter::AtomViewIter(ChainViewList::const_iterator chain_it,
-                           ResidueViewList::const_iterator res_it,
-                           AtomViewList::const_iterator atom_it,
+AtomViewIter::AtomViewIter(impl::pointer_it<ChainView> chain_it,
+                           impl::pointer_it<ResidueView> res_it,
+                           impl::pointer_it<AtomView> atom_it,
                            EntityView ent, bool skip_empty)
   : cur_chain_(chain_it), cur_res_(res_it), cur_atom_(atom_it),
     ent_(ent) {
@@ -183,23 +160,24 @@ AtomViewIter::AtomViewIter(ChainViewList::const_iterator chain_it,
 
 void AtomViewIter::SkipEmpty()
 {
-  if (cur_res_->GetAtomList().end()==cur_atom_) {
+  if (impl::end(cur_res_->GetAtomList())==cur_atom_) {
     do {
       ++cur_res_;      
-      if (cur_chain_->GetResidueList().end()==cur_res_) {
+      if (impl::end(cur_chain_->GetResidueList())==cur_res_) {
         do {
           ++cur_chain_;
-          if (ent_.GetChainList().end()==cur_chain_) {
+          if (impl::end(ent_.GetChainList())==cur_chain_) {
             return;
           }          
-          cur_res_=cur_chain_->GetResidueList().begin();
-          if (!cur_chain_->GetResidueList().empty())          
-            cur_atom_=cur_res_->GetAtomList().begin();
-          else
-            cur_atom_=AtomViewList::const_iterator();
+          cur_res_=impl::begin(cur_chain_->GetResidueList());
+          if (!cur_chain_->GetResidueList().empty()) {
+            cur_atom_=impl::begin(cur_res_->GetAtomList());
+          } else {
+            cur_atom_=impl::pointer_it<AtomView>(NULL);
+          }
         } while (cur_chain_->GetResidueList().empty());
       } else {
-        cur_atom_=cur_res_->GetAtomList().begin();
+        cur_atom_=impl::begin(cur_res_->GetAtomList());
       }
     } while (cur_res_->GetAtomList().empty());
   }
diff --git a/modules/mol/base/src/iterator.hh b/modules/mol/base/src/iterator.hh
index 04b4387f9b445171555b516bc6eb50f8220cb7f1..d127985538c923ff3cfac08e80485989f84da085 100644
--- a/modules/mol/base/src/iterator.hh
+++ b/modules/mol/base/src/iterator.hh
@@ -21,9 +21,7 @@
 
 #include <map>
 
-#include <ost/mol/impl/entity_impl_fw.hh>
-#include <ost/mol/impl/chain_impl_fw.hh>
-#include <ost/mol/impl/residue_impl_fw.hh>
+
 #include <ost/mol/chain_handle.hh>
 #include <ost/mol/chain_view.hh>
 #include <ost/mol/residue_handle.hh>
@@ -32,6 +30,10 @@
 #include <ost/mol/atom_view.hh>
 #include <ost/mol/entity_handle.hh>
 #include <ost/mol/entity_view.hh>
+#include <ost/mol/impl/entity_impl_fw.hh>
+#include <ost/mol/impl/chain_impl_fw.hh>
+#include <ost/mol/impl/residue_impl_fw.hh>
+#include <ost/mol/impl/pointer_iterator.hh>
 
 namespace ost { namespace mol {
 
@@ -78,10 +80,12 @@ private:
   I cur_;
 };
 
+
 namespace impl {
-  // forward declearation of chain impl map.
+  // forward declearation of chain impl list.
   typedef std::vector<ChainImplPtr> ChainImplList;
 }
+
 class DLLEXPORT_OST_MOL ChainHandleIter : public std::iterator<std::forward_iterator_tag, 
                                              ChainHandle> {
 public: // internally used constructors
@@ -112,20 +116,20 @@ private:
 class DLLEXPORT_OST_MOL ResidueHandleIter : public std::iterator<std::forward_iterator_tag,
                                                ResidueHandle> {
 public:
-  ResidueHandleIter() {    
-  }
-  ResidueHandleIter(impl::ChainImplList::iterator chain_it, 
-                    impl::ResidueImplList::iterator res_it,
+  ResidueHandleIter(): cur_chain_(NULL), cur_res_(NULL) { }
+  ResidueHandleIter(impl::pointer_it<impl::ChainImplPtr> chain_it, 
+                    impl::pointer_it<impl::ResidueImplPtr> res_it,
                     impl::EntityImplPtr ent, bool skip_empty);
-  bool operator==(const ResidueHandleIter& rhs) const {
-#if defined(_MSC_VER)    
-    return cur_chain_==rhs.cur_chain_ && cur_res_==rhs.cur_res_;
-#else
+  
+  bool operator==(const ResidueHandleIter& rhs) const 
+  {
     return cur_res_==rhs.cur_res_;
-#endif
   }
+  
   void SkipEmpty();
-  bool operator!=(const ResidueHandleIter& rhs) const {
+  
+  bool operator!=(const ResidueHandleIter& rhs) const 
+  {
     return !this->operator==(rhs);
   }
   ResidueHandleIter& operator++();
@@ -133,28 +137,25 @@ public:
   ResidueHandle operator*();
   
 private:
-  impl::ChainImplList::iterator cur_chain_;
-  impl::ResidueImplList::iterator cur_res_;
+  impl::pointer_it<impl::ChainImplPtr> cur_chain_;
+  impl::pointer_it<impl::ResidueImplPtr> cur_res_;
   impl::EntityImplPtr  ent_;
 };
 
 class DLLEXPORT_OST_MOL ResidueViewIter : public std::iterator<std::forward_iterator_tag,
                                              ResidueView> {
 public:
-  ResidueViewIter();
+  ResidueViewIter(): cur_chain_(NULL), cur_res_(NULL) { }
 
-  ResidueViewIter(ChainViewList::const_iterator chain_it,
-                  ResidueViewList::const_iterator res_it,
+  ResidueViewIter(impl::pointer_it<ChainView> chain_it,
+                  impl::pointer_it<ResidueView> res_it,
                   EntityView ent, bool skip_empty);
 
   bool operator==(const ResidueViewIter& rhs) const {
-#if defined(_MSC_VER)    
-    return cur_chain_==rhs.cur_chain_ && cur_res_==rhs.cur_res_;
-#else
     return cur_res_==rhs.cur_res_;
-#endif
   }
   void SkipEmpty();
+  
   bool operator!=(const ResidueViewIter& rhs) const {
     return !this->operator==(rhs);
   }
@@ -163,72 +164,70 @@ public:
   ResidueView operator*();
   
 private:
-  ChainViewList::const_iterator    cur_chain_;
-  ResidueViewList::const_iterator  cur_res_;
-  EntityView                       ent_;
+  impl::pointer_it<ChainView>    cur_chain_;
+  impl::pointer_it<ResidueView>  cur_res_;
+  EntityView                     ent_;
 };
 
 class DLLEXPORT_OST_MOL AtomHandleIter : public std::iterator<std::forward_iterator_tag,
                                             AtomHandle> {
 public:
-  AtomHandleIter(); 
+  AtomHandleIter(): cur_chain_(NULL), cur_res_(NULL), cur_atom_(NULL) { }
 
-  AtomHandleIter(impl::ChainImplList::iterator chain_it,
-                 impl::ResidueImplList::iterator res_it,
-                 impl::AtomImplList::iterator atom_it,
+  AtomHandleIter(impl::pointer_it<impl::ChainImplPtr> chain_it,
+                 impl::pointer_it<impl::ResidueImplPtr> res_it,
+                 impl::pointer_it<impl::AtomImplPtr> atom_it,
                  impl::EntityImplPtr ent, bool skip_empty);
                  
-  bool operator==(const AtomHandleIter& rhs) const {
-#if defined(_MSC_VER)    
-    return cur_chain_==rhs.cur_chain_ && cur_res_==rhs.cur_res_ &&
-           cur_atom_==rhs.cur_atom_;
-#else
+  bool operator==(const AtomHandleIter& rhs) const 
+  {
    return cur_atom_==rhs.cur_atom_;
-#endif
   }
-  bool operator!=(const AtomHandleIter& rhs) const {
-  return !this->operator==(rhs);
+  
+  bool operator!=(const AtomHandleIter& rhs) const 
+  {
+    return !this->operator==(rhs);
   }
+  
   AtomHandleIter& operator++();
 
   AtomHandle operator*();
 private:
   void SkipEmpty();
-  impl::ChainImplList::iterator cur_chain_;
-  impl::ResidueImplList::iterator cur_res_;
-  impl::AtomImplList::iterator cur_atom_;
+  impl::pointer_it<impl::ChainImplPtr> cur_chain_;
+  impl::pointer_it<impl::ResidueImplPtr> cur_res_;
+  impl::pointer_it<impl::AtomImplPtr> cur_atom_;
   impl::EntityImplPtr  ent_;
 };
 
 class DLLEXPORT_OST_MOL AtomViewIter : public std::iterator<std::forward_iterator_tag,
                                           AtomView> {
 public:
-  AtomViewIter();
+  AtomViewIter(): cur_chain_(NULL), cur_res_(NULL), cur_atom_(NULL) { }
 
-  AtomViewIter(ChainViewList::const_iterator chain_it,
-               ResidueViewList::const_iterator res_it,
-               AtomViewList::const_iterator atom_it,
+  AtomViewIter(impl::pointer_it<ChainView> chain_it,
+               impl::pointer_it<ResidueView> res_it,
+               impl::pointer_it<AtomView> atom_it,
                EntityView ent, bool skip_empty);
                  
-  bool operator==(const AtomViewIter& rhs) const {
-#if defined(_MSC_VER)    
-    return cur_chain_==rhs.cur_chain_ && cur_res_==rhs.cur_res_ &&
-           cur_atom_==rhs.cur_atom_;
-#else
+  bool operator==(const AtomViewIter& rhs) const 
+  {
    return cur_atom_==rhs.cur_atom_;
-#endif
   }
-  bool operator!=(const AtomViewIter& rhs) const {
+  
+  bool operator!=(const AtomViewIter& rhs) const 
+  {
     return !this->operator==(rhs);
   }
+  
   AtomViewIter& operator++();
 
   AtomView operator*();
 private:
   void SkipEmpty();
-  ChainViewList::const_iterator    cur_chain_;
-  ResidueViewList::const_iterator  cur_res_;
-  AtomViewList::const_iterator     cur_atom_;
+  impl::pointer_it<ChainView>    cur_chain_;
+  impl::pointer_it<ResidueView>  cur_res_;
+  impl::pointer_it<AtomView>     cur_atom_;
   EntityView                       ent_;
 };
 
diff --git a/modules/mol/base/src/residue_handle.cc b/modules/mol/base/src/residue_handle.cc
index bfc57c1949c209f753e0592730669f82f179c020..1719708c9a0e52b9a6892bfc9b8b3560150547d0 100644
--- a/modules/mol/base/src/residue_handle.cc
+++ b/modules/mol/base/src/residue_handle.cc
@@ -181,9 +181,9 @@ AtomHandleIter ResidueHandle::AtomsBegin() const
   impl::ResidueImplPtr r=Impl();
   int index=this->GetIndex();
   impl::ChainImplPtr c=r->GetChain();
-  impl::ChainImplList::iterator cc=r->GetEntity()->GetChain(c->GetName());
-  return AtomHandleIter(cc, c->GetResidueList().begin()+index,
-                        r->GetAtomList().begin(), r->GetEntity(), true);
+  impl::pointer_it<impl::ChainImplPtr> cc=r->GetEntity()->GetChainIter(c->GetName());
+  return AtomHandleIter(cc, impl::begin(c->GetResidueList())+index,
+                        impl::begin(r->GetAtomList()), r->GetEntity(), true);
 }
 
 AtomHandleIter ResidueHandle::AtomsEnd() const 
@@ -192,14 +192,15 @@ AtomHandleIter ResidueHandle::AtomsEnd() const
   impl::ResidueImplPtr r=Impl();
   int index=this->GetIndex();
   impl::ChainImplPtr c=r->GetChain();
-  impl::ChainImplList::iterator cc=r->GetEntity()->GetChain(c->GetName());
+  impl::pointer_it<impl::ChainImplPtr> cc=r->GetEntity()->GetChainIter(c->GetName());
   if (c->GetResidueList().begin()+index+1==c->GetResidueList().end()) {
-    return AtomHandleIter(cc, c->GetResidueList().begin()+index,
-                          r->GetAtomList().end(), r->GetEntity(), false);
+    return AtomHandleIter(cc, impl::begin(c->GetResidueList())+index,
+                          impl::begin(r->GetAtomList()), r->GetEntity(), false);
   } else {
-    impl::ResidueImplList::iterator x=(c->GetResidueList().begin()+index+1);
-    return AtomHandleIter(cc, c->GetResidueList().begin()+index+1,
-                          (*x)->GetAtomList().begin(), r->GetEntity(), false);
+    impl::pointer_it<impl::ResidueImplPtr> x=(impl::begin(c->GetResidueList())+index+1);
+    return AtomHandleIter(cc, impl::begin(c->GetResidueList())+index+1,
+                          impl::begin((*x)->GetAtomList()), 
+                          r->GetEntity(), false);
   }
 
 }