diff --git a/modules/mol/base/src/chain_handle.cc b/modules/mol/base/src/chain_handle.cc
index 156eca176a4d4b8b54a120e56f1f384bb87e78f2..4581eb7806890f1a12da761cfd6ac18ba906857e 100644
--- a/modules/mol/base/src/chain_handle.cc
+++ b/modules/mol/base/src/chain_handle.cc
@@ -125,17 +125,18 @@ bool ChainHandle::operator!=(const ChainHandle& ref) const
 ResidueHandleIter ChainHandle::ResiduesBegin() const {
   this->CheckValidity();
   impl::ChainImplPtr c=Impl();
-  impl::ChainImplMap::iterator cc=c->GetEntity()->GetChainMap().find(c->GetName());
-  return ResidueHandleIter(cc, c->GetResidueList().begin(), c->GetEntity());
+  impl::ChainImplList::iterator cc=c->GetEntity()->GetChain(this->GetName());
+  return ResidueHandleIter(cc, c->GetResidueList().begin(), 
+                           c->GetEntity());
 }
 
 ResidueHandleIter ChainHandle::ResiduesEnd() const {
   this->CheckValidity();
   impl::ChainImplPtr c=Impl();
-  impl::ChainImplMap::iterator cc=c->GetEntity()->GetChainMap().find(c->GetName());  
-  impl::ChainImplMap::iterator nc=cc; ++nc;
-  if (nc!=c->GetEntity()->GetChainMap().end()) {
-    return ResidueHandleIter(nc, nc->second->GetResidueList().begin(), 
+  impl::ChainImplList::iterator cc=c->GetEntity()->GetChain(this->GetName());
+  impl::ChainImplList::iterator nc=cc; ++nc;
+  if (nc!=c->GetEntity()->GetChainList().end()) {
+    return ResidueHandleIter(nc, (*nc)->GetResidueList().begin(), 
                              c->GetEntity());    
   } else {
     return ResidueHandleIter(cc, c->GetResidueList().end(), 
@@ -151,7 +152,7 @@ AtomHandleIter ChainHandle::AtomsBegin() const
 
     return AtomHandleIter();
   }  
-  impl::ChainImplMap::iterator cc=c->GetEntity()->GetChainMap().find(c->GetName());    
+  impl::ChainImplList::iterator cc=c->GetEntity()->GetChain(this->GetName()); 
   return AtomHandleIter(cc, c->GetResidueList().begin(),
                         c->GetResidueList().front()->GetAtomList().begin(),
                         c->GetEntity(), true);    
@@ -164,10 +165,10 @@ AtomHandleIter ChainHandle::AtomsEnd() const {
   if (c->GetResidueList().empty()) {
     return AtomHandleIter();
   }  
-  impl::ChainImplMap::iterator cc=c->GetEntity()->GetChainMap().find(c->GetName());
-  impl::ChainImplMap::iterator nc=cc; ++nc;
-  impl::ResidueImplList& rc=nc->second->GetResidueList();
-  if (nc!=c->GetEntity()->GetChainMap().end()) {  
+  impl::ChainImplList::iterator cc=c->GetEntity()->GetChain(this->GetName());
+  impl::ChainImplList::iterator nc=cc; ++nc;
+  impl::ResidueImplList& rc=(*nc)->GetResidueList();
+  if (nc!=c->GetEntity()->GetChainList().end()) {  
     return AtomHandleIter(nc, rc.begin(), rc.front()->GetAtomList().begin(),
                           c->GetEntity(), false);
   } else {
diff --git a/modules/mol/base/src/entity_handle.cc b/modules/mol/base/src/entity_handle.cc
index b0ac01f09e135c5110bf970af372b13ebbf14590..8686df88c286c726648bad9abec259514414a9c2 100644
--- a/modules/mol/base/src/entity_handle.cc
+++ b/modules/mol/base/src/entity_handle.cc
@@ -257,48 +257,48 @@ AtomHandle EntityHandle::FindAtom(const String& chain_name,
 
 ResidueHandleIter EntityHandle::ResiduesBegin() const {
   this->CheckValidity();
-  if (Impl()->GetChainMap().empty()) {
+  if (Impl()->GetChainList().empty()) {
     return ResidueHandleIter();
   }
   impl::EntityImplPtr i=Impl();
-  impl::ChainImplPtr chain=i->GetChainMap().begin()->second;
-  return ResidueHandleIter(i->GetChainMap().begin(),
+  impl::ChainImplPtr chain=i->GetChainList().front();
+  return ResidueHandleIter(i->GetChainList().begin(),
                            chain->GetResidueList().begin(), i);
 }
 
 ResidueHandleIter EntityHandle::ResiduesEnd() const {
   this->CheckValidity();
-  if (Impl()->GetChainMap().empty()) {
+  if (Impl()->GetChainList().empty()) {
     return ResidueHandleIter();
   }
   impl::EntityImplPtr i=Impl();
-  impl::ChainImplPtr chain=i->GetChainMap().rbegin()->second;
-  return ResidueHandleIter(i->GetChainMap().end(),
+  impl::ChainImplPtr chain=i->GetChainList().back();
+  return ResidueHandleIter(i->GetChainList().end(),
                            chain->GetResidueList().end(), i);
 }
 
 ChainHandleIter EntityHandle::ChainsBegin() const {
   this->CheckValidity();
-  return ChainHandleIter(Impl()->GetChainMap().begin());
+  return ChainHandleIter(Impl()->GetChainList().begin());
 }
 
 
 ChainHandleIter EntityHandle::ChainsEnd() const {
-  return ChainHandleIter(Impl()->GetChainMap().end());
+  return ChainHandleIter(Impl()->GetChainList().end());
 }
 
 
 AtomHandleIter EntityHandle::AtomsBegin() const {
   this->CheckValidity();
   impl::EntityImplPtr ent=Impl();
-  if (ent->GetChainMap().empty()) {
+  if (ent->GetChainList().empty()) {
     return AtomHandleIter();
   }
-  impl::ResidueImplList& r=ent->GetChainMap().begin()->second->GetResidueList();
+  impl::ResidueImplList& r=ent->GetChainList().front()->GetResidueList();
   if (r.empty()) {
     return AtomHandleIter();
   }
-  return AtomHandleIter(ent->GetChainMap().begin(), r.begin(),
+  return AtomHandleIter(ent->GetChainList().begin(), r.begin(),
                         r.front()->GetAtomList().begin(), ent, true);
 }
 
@@ -306,14 +306,14 @@ AtomHandleIter EntityHandle::AtomsEnd() const
 {
   this->CheckValidity();
   impl::EntityImplPtr ent=Impl();
-  if (ent->GetChainMap().empty()) {
+  if (ent->GetChainList().empty()) {
     return AtomHandleIter();
   }
-  impl::ResidueImplList& r=ent->GetChainMap().rbegin()->second->GetResidueList();
+  impl::ResidueImplList& r=ent->GetChainList().back()->GetResidueList();
   if (r.empty()) {
     return AtomHandleIter();
   }
-  return AtomHandleIter(ent->GetChainMap().end(), r.end(),
+  return AtomHandleIter(ent->GetChainList().end(), r.end(),
                         r.back()->GetAtomList().end(), ent, false);
 }
 
diff --git a/modules/mol/base/src/entity_view.cc b/modules/mol/base/src/entity_view.cc
index 34f7d506421cef9b32aeaec3c46a0470d89c3f2c..a3819e1020d4c8dd975f9b2e799d4bf248092a34 100644
--- a/modules/mol/base/src/entity_view.cc
+++ b/modules/mol/base/src/entity_view.cc
@@ -76,9 +76,9 @@ EntityView::EntityView(const EntityHandle& entity,
                        ViewAddFlags flags)
   : EntityBase(entity.Impl()), data_(new EntityViewData()) {
   if (flags & ViewAddFlag::INCLUDE_CHAINS) {
-    impl::ChainImplMap::const_iterator i=entity.Impl()->GetChainMap().begin();
-    for (; i!=entity.Impl()->GetChainMap().end(); ++i) {
-      this->AddChain(ChainHandle(i->second), flags);
+    impl::ChainImplList::const_iterator i=entity.Impl()->GetChainList().begin();
+    for (; i!=entity.Impl()->GetChainList().end(); ++i) {
+      this->AddChain(ChainHandle(*i), flags);
     }
   }
 }
diff --git a/modules/mol/base/src/impl/chain_impl_fw.hh b/modules/mol/base/src/impl/chain_impl_fw.hh
index 00f22561b72845bea621bd31f90c1587e886631d..2ba9c725dbf40038cf67f76b6749bdd5f0293fa2 100644
--- a/modules/mol/base/src/impl/chain_impl_fw.hh
+++ b/modules/mol/base/src/impl/chain_impl_fw.hh
@@ -28,7 +28,6 @@ namespace ost { namespace mol { namespace impl {
 class ChainImpl;
 typedef boost::shared_ptr<ChainImpl> ChainImplPtr;
 typedef boost::weak_ptr<ChainImpl> ChainImplW;
-typedef std::list<ChainImplPtr> ChainImplList;
 
 }}} // ns
 
diff --git a/modules/mol/base/src/impl/entity_impl.cc b/modules/mol/base/src/impl/entity_impl.cc
index 29fdad970ebddf5f8a8a49e54a436182bbc1c068..8b13c433fdfc368904fc663ccf79f410e879d933 100644
--- a/modules/mol/base/src/impl/entity_impl.cc
+++ b/modules/mol/base/src/impl/entity_impl.cc
@@ -64,7 +64,7 @@ namespace ost { namespace mol { namespace impl {
 
 EntityImpl::EntityImpl():
   atom_map_(),
-  chain_map_(),
+  chain_list_(),
   connector_map_(),
   torsion_map_(),
   transformation_matrix_(),
@@ -104,9 +104,9 @@ mol::BondHandleList EntityImpl::GetBondList() const
 int EntityImpl::GetResidueCount() const 
 {
   int count=0;
-  for (ChainImplMap::const_iterator i=chain_map_.begin(), 
-       e=chain_map_.end(); i!=e; ++i) {
-    count+=i->second->GetResidueCount();
+  for (ChainImplList::const_iterator i=chain_list_.begin(), 
+       e=chain_list_.end(); i!=e; ++i) {
+    count+=(*i)->GetResidueCount();
   }
   return count;
 }
@@ -133,9 +133,9 @@ ChainImplPtr EntityImpl::InsertChain(const ChainImplPtr& chain)
 
 void EntityImpl::ReplicateHierarchy(EntityImplPtr dest)
 {
-  for (ChainImplMap::const_iterator i=chain_map_.begin(), 
-       e1=chain_map_.end(); i!=e1; ++i) {
-    ChainImplPtr src_chain=i->second;
+  for (ChainImplList::const_iterator i=chain_list_.begin(), 
+       e1=chain_list_.end(); i!=e1; ++i) {
+    ChainImplPtr src_chain=*i;
     ChainImplPtr dst_chain=dest->InsertChain(src_chain);
     // copy generic properties
     dst_chain->Assign(*src_chain.get());
@@ -176,10 +176,10 @@ AtomImplPtr lookup_atom(const AtomImplPtr& atom, EntityImplPtr dest,
 
 void EntityImpl::DoCopyBondsAndTorsions(EntityImplPtr dest)
 {
-  for (ChainImplMap::const_iterator i=chain_map_.begin(), 
-       i2=dest->chain_map_.begin(), e1=chain_map_.end(); i!=e1; ++i, ++i2) {
-    ChainImplPtr src_chain=i->second;
-    ChainImplPtr dst_chain=i2->second;
+  for (ChainImplList::const_iterator i=chain_list_.begin(), 
+       i2=dest->chain_list_.begin(), e1=chain_list_.end(); i!=e1; ++i, ++i2) {
+    ChainImplPtr src_chain=*i;
+    ChainImplPtr dst_chain=*i2;
     for (ResidueImplList::iterator j=src_chain->GetResidueList().begin(),
          j2=dst_chain->GetResidueList().begin(),
          e2=src_chain->GetResidueList().end(); j!=e2; ++j, ++j2) {
@@ -236,7 +236,7 @@ void EntityImpl::DoCopy(EntityImplPtr dest)
 
 int EntityImpl::GetChainCount() const 
 {
-  return static_cast<int>(chain_map_.size());
+  return static_cast<int>(chain_list_.size());
 }
 
 const geom::Mat4& EntityImpl::GetTransfMatrix() const
@@ -384,17 +384,19 @@ ResidueImplPtr EntityImpl::CreateResidue(const ChainImplPtr& cp,
 
 ChainImplPtr EntityImpl::InsertChain(const String& cname)
 {
-  ChainImplMap::iterator i=chain_map_.find(cname);
-  if (i!=chain_map_.end()) {
-    throw IntegrityError("Can't insert chain. A chain with name '"+cname+
-                         "' already exists");
+  for (ChainImplList::iterator 
+       i=chain_list_.begin(), e=chain_list_.end(); i!=e; ++i) {
+      if ((*i)->GetName()==cname) {
+        throw IntegrityError("Can't insert chain. A chain with name '"+cname+
+                             "' already exists");
+      }
   }
 #if MAKE_SHARED_AVAILABLE
   ChainImplPtr cp=boost::make_shared<ChainImpl>(shared_from_this(), cname);
 #else
   ChainImplPtr cp(new ChainImpl(shared_from_this(), cname));
 #endif
-  chain_map_.insert(ChainImplMap::value_type(cp->GetName(),cp));
+  chain_list_.push_back(cp);
   return cp;
 }
 
@@ -767,8 +769,9 @@ void EntityImpl::Apply(EntityVisitor& v)
 {
   LOG_TRACE("visitor @" << &v << " visiting entity impl @" << this << std::endl);
   v.OnEntry();
-  for(ChainImplMap::iterator it = chain_map_.begin();it!=chain_map_.end();++it) {
-    it->second->Apply(v);
+  for(ChainImplList::iterator 
+      it = chain_list_.begin();it!=chain_list_.end();++it) {
+    (*it)->Apply(v);
   }
 
   for(ConnectorImplMap::iterator it = connector_map_.begin();it!=connector_map_.end();++it) {
@@ -821,7 +824,7 @@ void EntityImpl::NotifyObserver()
 void EntityImpl::Swap(EntityImpl& impl)
 {
   atom_map_.swap(impl.atom_map_);
-  chain_map_.swap(impl.chain_map_);
+  chain_list_.swap(impl.chain_list_);
   connector_map_.swap(impl.connector_map_);
   torsion_map_.swap(impl.torsion_map_);
   std::swap(transformation_matrix_,impl.transformation_matrix_);
@@ -830,15 +833,6 @@ void EntityImpl::Swap(EntityImpl& impl)
   observer_map_.swap(impl.observer_map_);
 }
 
-ChainImplList EntityImpl::GetChainList() const {
-  ChainImplList cl;
-  ChainImplMap::const_iterator i;
-  for (i=chain_map_.begin(); i!=chain_map_.end(); ++i) {
-    cl.push_back(i->second);
-  }
-  return cl;
-}
-
 
 TorsionImplP EntityImpl::FindTorsion(const AtomImplPtr& a1,
                                      const AtomImplPtr& a2,
@@ -895,19 +889,15 @@ EntityView EntityImpl::do_selection(const EntityHandle& eh,
   EntityHandle myself(const_cast<impl::EntityImpl*>(this)->shared_from_this());
   QueryState qs(query.CreateQueryState(myself));
   LOGN_DUMP("entering chain loop");
-  for (ChainImplMap::const_iterator ch_it = chain_map_.begin();
-       ch_it!=chain_map_.end();++ch_it) {
-    if(!ch_it->second) {
-      LOGN_DUMP("found invalid chain shared_ptr");
-      continue;
-    }
-    LOGN_DUMP("checking chain " << ch_it->second->GetName());
+  for (ChainImplList::const_iterator 
+       ch_it=chain_list_.begin(); ch_it!=chain_list_.end();++ch_it) {
+    LOGN_DUMP("checking chain " << ch_it->GetName());
     c_added = false;
-    tribool c = always_true ? tribool(true) : qs.EvalChain(ch_it->second);
+    tribool c = always_true ? tribool(true) : qs.EvalChain(*ch_it);
     if (c == true) {
       LOGN_DUMP("chain is selected");
       // Include all residues
-      const ChainImplPtr& ci=ch_it->second;
+      const ChainImplPtr& ci=*ch_it;
       ++chain_count;
       ChainView chain=view.AddChain(ci);
       ResidueImplList::const_iterator re_it = ci->GetResidueList().begin();
@@ -930,7 +920,7 @@ EntityView EntityImpl::do_selection(const EntityHandle& eh,
     } else if (indeterminate(c)) {
       // Test residues
       r_added = false;
-      const ChainImplPtr& ci = ch_it->second;
+      const ChainImplPtr& ci = *ch_it;
 
       ChainView chain;
       ResidueImplList::const_iterator re_it = ci->GetResidueList().begin();
@@ -1042,10 +1032,10 @@ EntityView EntityImpl::CreateFullView(const EntityHandle& h) const
 }
 
 ChainImplPtr EntityImpl::FindChain(const String& name) const {
-  ChainImplMap::const_iterator i;
-  for(i=chain_map_.begin(); i!=chain_map_.end();++i) {
-    if (i->second->GetName()==name)
-      return i->second;
+  ChainImplList::const_iterator i;
+  for(i=chain_list_.begin(); i!=chain_list_.end();++i) {
+    if ((*i)->GetName()==name)
+      return *i;
   }
   return ChainImplPtr();
 }
@@ -1078,7 +1068,7 @@ TorsionImplMap& EntityImpl::GetTorsionMap() {
 void EntityImpl::DeleteChain(const ChainImplPtr& chain) {
   if (chain && chain->GetEntity().get()==this) {
     chain->DeleteAllResidues();
-    chain_map_.erase(chain->GetName());
+    chain_list_.erase(this->GetChain(chain->GetName()));
   }
 }
 
@@ -1191,24 +1181,26 @@ void EntityImpl::DecICSEditorCount()
   }
 }
 
+impl::ChainImplList::iterator EntityImpl::GetChain(const String& name)
+{
+  impl::ChainImplList& cc=this->GetChainList();
+  for (impl::ChainImplList::iterator i=cc.begin(), e=cc.end(); i!=e; ++i) {
+    if ((*i)->GetName()==name) {
+      return i;
+    }
+  }
+  return  cc.end();
+}
 void EntityImpl::RenameChain(ChainImplPtr chain, const String& new_name)
 {
-  ChainImplMap::iterator i, j;
-  j=chain_map_.find(new_name);
-
-  if (j!=chain_map_.end() && j->second!=chain) {
+  ChainImplList::iterator i;
+  ChainImplPtr  ch=this->FindChain(new_name);
+  if (ch) {
     throw IntegrityError("unable to rename chain '"+chain->GetName()+
                          "' to '"+new_name+"', since there is already a chain "
                          "with that name");
   }
-  for(i=chain_map_.begin(); i!=chain_map_.end();++i) {
-    if (i->second==chain) {
-      chain_map_.erase(i);
-      chain_map_.insert(std::make_pair(new_name, chain));
-      chain->SetName(new_name);
-      break;
-    }
-  }
+  chain->SetName(new_name);
 }
 
 void EntityImpl::UpdateTransformedPos(){
diff --git a/modules/mol/base/src/impl/entity_impl.hh b/modules/mol/base/src/impl/entity_impl.hh
index 63504c74987765914620394ab72515b64031090c..81f533bf0a9f3c696276b7e5e487e14a7125bfaa 100644
--- a/modules/mol/base/src/impl/entity_impl.hh
+++ b/modules/mol/base/src/impl/entity_impl.hh
@@ -56,7 +56,7 @@ typedef std::map<AtomImpl*,AtomImplPtr> AtomImplMap;
 /// \internal
 typedef std::map<ResidueImpl*,ResidueImplPtr> ResidueImplMap;
 /// \internal
-typedef std::map<String,ChainImplPtr> ChainImplMap;
+typedef std::vector<ChainImplPtr> ChainImplList;
 /// \internal
 typedef std::map<ConnectorImpl*,ConnectorImplP> ConnectorImplMap;
 /// \internal
@@ -201,10 +201,9 @@ public:
 
   bool IsTransfIdentity() const;
 
-  ChainImplList GetChainList() const;
+  const ChainImplList& GetChainList() const { return chain_list_; }
 
-  ChainImplMap& GetChainMap() {return chain_map_; }
-  const ChainImplMap& GetChainMap() const {return chain_map_; }
+  ChainImplList& GetChainList() { return chain_list_; }
 
   void DeleteFromConnMap(const ConnectorImplP& conn);
 
@@ -241,6 +240,8 @@ public:
 
   const String& GetName() const;
 
+  impl::ChainImplList::iterator GetChain(const String& name);
+
   void SetName(const String& ent_name);
 
 private:
@@ -251,7 +252,7 @@ private:
   void DoCopyBondsAndTorsions(EntityImplPtr dest);
 
   AtomImplMap atom_map_;
-  ChainImplMap chain_map_;
+  ChainImplList chain_list_;
   ConnectorImplMap connector_map_;
   TorsionImplMap torsion_map_;
 
diff --git a/modules/mol/base/src/iterator.cc b/modules/mol/base/src/iterator.cc
index 26fc516444fcfc4000b66f75da3e4d2021dd5ff8..74ff90c6514b1fd86517d68aba1ceddfd604694c 100644
--- a/modules/mol/base/src/iterator.cc
+++ b/modules/mol/base/src/iterator.cc
@@ -28,21 +28,21 @@ namespace ost { namespace mol {
 
 ResidueHandleIter& ResidueHandleIter::operator++() {
   ++cur_res_;
-  if (cur_res_==cur_chain_->second->GetResidueList().end()) {
+  if (cur_res_==(*cur_chain_)->GetResidueList().end()) {
     // we have to skip over empty chains otherwise we end up pointing to an 
     // invalid residue.
     do {
       ++cur_chain_;
-      if (ent_->GetChainMap().end()==cur_chain_) {
+      if (ent_->GetChainList().end()==cur_chain_) {
         break;        
       }
-      cur_res_=cur_chain_->second->GetResidueList().begin();
-    } while (cur_chain_->second->GetResidueList().empty());
+      cur_res_=(*cur_chain_)->GetResidueList().begin();
+    } while ((*cur_chain_)->GetResidueList().empty());
   }        
   return *this;
 }
 
-ResidueHandleIter::ResidueHandleIter(impl::ChainImplMap::iterator chain_it, 
+ResidueHandleIter::ResidueHandleIter(impl::ChainImplList::iterator chain_it, 
                                      impl::ResidueImplList::iterator res_it,
                                      impl::EntityImplPtr ent) 
  : cur_chain_(chain_it), cur_res_(res_it),
@@ -99,7 +99,7 @@ AtomHandleIter::AtomHandleIter()
 #endif
 {}  
 
-AtomHandleIter::AtomHandleIter(impl::ChainImplMap::iterator chain_it,
+AtomHandleIter::AtomHandleIter(impl::ChainImplList::iterator chain_it,
                                impl::ResidueImplList::iterator res_it,
                                impl::AtomImplList::iterator atom_it,
                                impl::EntityImplPtr ent, bool skip_empty)
@@ -122,19 +122,19 @@ void AtomHandleIter::SkipEmpty()
     // pointing to an invalid atom.
     do {
       ++cur_res_;
-      if (cur_chain_->second->GetResidueList().end()==cur_res_) {
+      if ((*cur_chain_)->GetResidueList().end()==cur_res_) {
         do {
           ++cur_chain_;
-          if (ent_->GetChainMap().end()==cur_chain_) {
+          if (ent_->GetChainList().end()==cur_chain_) {
             return;
           }
 
-          cur_res_=cur_chain_->second->GetResidueList().begin();
-          if (!cur_chain_->second->GetResidueList().empty())          
+          cur_res_=(*cur_chain_)->GetResidueList().begin();
+          if (!(*cur_chain_)->GetResidueList().empty())          
             cur_atom_=(*cur_res_)->GetAtomList().begin();
           else
             cur_atom_=impl::AtomImplList::iterator();
-        } while (cur_chain_->second->GetResidueList().empty());
+        } while ((*cur_chain_)->GetResidueList().empty());
       } else {
         cur_atom_=(*cur_res_)->GetAtomList().begin();
       }
diff --git a/modules/mol/base/src/iterator.hh b/modules/mol/base/src/iterator.hh
index 4d75aec8b05e7245a2d382ee96ae51e5f5406c7e..7bbbe48396591eea4ba1af3f8fc991976b754dec 100644
--- a/modules/mol/base/src/iterator.hh
+++ b/modules/mol/base/src/iterator.hh
@@ -80,17 +80,17 @@ private:
 
 namespace impl {
   // forward declearation of chain impl map.
-  typedef std::map<String, ChainImplPtr> ChainImplMap;
+  typedef std::vector<ChainImplPtr> ChainImplList;
 }
 class DLLEXPORT_OST_MOL ChainHandleIter : public std::iterator<std::forward_iterator_tag, 
                                              ChainHandle> {
 public: // internally used constructors
-  ChainHandleIter(impl::ChainImplMap::iterator chain_it)  
+  ChainHandleIter(impl::ChainImplList::iterator chain_it)  
     : cur_(chain_it) {    
   }
 public:
   ChainHandle operator*() {
-    return ChainHandle(cur_->second);
+    return ChainHandle(*cur_);
   }
   
   ChainHandleIter& operator++() {
@@ -106,7 +106,7 @@ public:
     return !this->operator==(rhs);
   }
 private:
-  impl::ChainImplMap::iterator cur_;
+  impl::ChainImplList::iterator cur_;
 };
 
 class DLLEXPORT_OST_MOL ResidueHandleIter : public std::iterator<std::forward_iterator_tag,
@@ -114,7 +114,7 @@ class DLLEXPORT_OST_MOL ResidueHandleIter : public std::iterator<std::forward_it
 public:
   ResidueHandleIter() {    
   }
-  ResidueHandleIter(impl::ChainImplMap::iterator chain_it, 
+  ResidueHandleIter(impl::ChainImplList::iterator chain_it, 
                     impl::ResidueImplList::iterator res_it,
                     impl::EntityImplPtr ent);
   bool operator==(const ResidueHandleIter& rhs) const {
@@ -133,7 +133,7 @@ public:
   ResidueHandle operator*();
   
 private:
-  impl::ChainImplMap::iterator cur_chain_;
+  impl::ChainImplList::iterator cur_chain_;
   impl::ResidueImplList::iterator cur_res_;
   impl::EntityImplPtr  ent_;
 };
@@ -174,7 +174,7 @@ class DLLEXPORT_OST_MOL AtomHandleIter : public std::iterator<std::forward_itera
 public:
   AtomHandleIter(); 
 
-  AtomHandleIter(impl::ChainImplMap::iterator chain_it,
+  AtomHandleIter(impl::ChainImplList::iterator chain_it,
                  impl::ResidueImplList::iterator res_it,
                  impl::AtomImplList::iterator atom_it,
                  impl::EntityImplPtr ent, bool skip_empty);
@@ -195,7 +195,7 @@ public:
   AtomHandle operator*();
 private:
   void SkipEmpty();
-  impl::ChainImplMap::iterator cur_chain_;
+  impl::ChainImplList::iterator cur_chain_;
   impl::ResidueImplList::iterator cur_res_;
   impl::AtomImplList::iterator cur_atom_;
   impl::EntityImplPtr  ent_;
diff --git a/modules/mol/base/src/residue_handle.cc b/modules/mol/base/src/residue_handle.cc
index b66c83250276d6301b4c9699c1f72483e1a70c8f..bfc57c1949c209f753e0592730669f82f179c020 100644
--- a/modules/mol/base/src/residue_handle.cc
+++ b/modules/mol/base/src/residue_handle.cc
@@ -181,7 +181,7 @@ AtomHandleIter ResidueHandle::AtomsBegin() const
   impl::ResidueImplPtr r=Impl();
   int index=this->GetIndex();
   impl::ChainImplPtr c=r->GetChain();
-  impl::ChainImplMap::iterator cc=r->GetEntity()->GetChainMap().find(c->GetName());
+  impl::ChainImplList::iterator cc=r->GetEntity()->GetChain(c->GetName());
   return AtomHandleIter(cc, c->GetResidueList().begin()+index,
                         r->GetAtomList().begin(), r->GetEntity(), true);
 }
@@ -192,7 +192,7 @@ AtomHandleIter ResidueHandle::AtomsEnd() const
   impl::ResidueImplPtr r=Impl();
   int index=this->GetIndex();
   impl::ChainImplPtr c=r->GetChain();
-  impl::ChainImplMap::iterator cc=r->GetEntity()->GetChainMap().find(c->GetName());
+  impl::ChainImplList::iterator cc=r->GetEntity()->GetChain(c->GetName());
   if (c->GetResidueList().begin()+index+1==c->GetResidueList().end()) {
     return AtomHandleIter(cc, c->GetResidueList().begin()+index,
                           r->GetAtomList().end(), r->GetEntity(), false);