diff --git a/modules/mol/base/pymod/export_coord_group.cc b/modules/mol/base/pymod/export_coord_group.cc
index 979fc552806fb52fd778f11d0893f9ee2d61f45e..28059f82b23db3226ee243dcb856ad8e179d3566 100644
--- a/modules/mol/base/pymod/export_coord_group.cc
+++ b/modules/mol/base/pymod/export_coord_group.cc
@@ -48,6 +48,8 @@ void export_CoordGroup()
     .def("GetAtomCount",&CoordGroupHandle::GetAtomCount)
     .def("GetFrameCount",&CoordGroupHandle::GetFrameCount)
     .def("SetFramePositions",&CoordGroupHandle::SetFramePositions)
+    .def("SetAtomPos",&CoordGroupHandle::SetAtomPos)
+    .def("GetAtomPos",&CoordGroupHandle::GetAtomPos)
     .def("CopyFrame",&CoordGroupHandle::CopyFrame)
     .def("IsValid", &CoordGroupHandle::IsValid)
     .def("Capture", capture1)
diff --git a/modules/mol/base/src/coord_group.cc b/modules/mol/base/src/coord_group.cc
index e6fbd4641b9b1bae5d33f2433b05ed346d8b7f5d..6675b5499bbacd193dddf51bda764dff67f29196 100644
--- a/modules/mol/base/src/coord_group.cc
+++ b/modules/mol/base/src/coord_group.cc
@@ -100,6 +100,18 @@ void CoordGroupHandle::CheckValidity() const
   }
 }
 
+void CoordGroupHandle::SetAtomPos(uint frame, AtomHandle atom, const geom::Vec3& pos)
+{
+  this->CheckValidity();
+  source_->SetAtomPos(frame,atom,pos);
+}
+
+geom::Vec3 CoordGroupHandle::GetAtomPos(uint frame, AtomHandle atom) const
+{
+  this->CheckValidity();
+  return source_->GetAtomPos(frame,atom);
+}
+
 CoordFramePtr CoordGroupHandle::GetFrame(uint frame) const
 {
   this->CheckValidity();
diff --git a/modules/mol/base/src/coord_group.hh b/modules/mol/base/src/coord_group.hh
index 04bffc41a97ed392bbe6b30060a7ff51be9ca1a0..3b038e37b37af79ddc1d73eb2b1babbccebf988d 100644
--- a/modules/mol/base/src/coord_group.hh
+++ b/modules/mol/base/src/coord_group.hh
@@ -55,7 +55,7 @@ public:
   /// \brief assign positions to the given frame - order and count must match 
   ///      initial atomlist
   void SetFramePositions(uint frame, const std::vector<geom::Vec3>& clist);
-  
+
   /// \brief copy atom positions of given frame to stored atoms in entity
   void CopyFrame(uint frame);
   
@@ -68,6 +68,12 @@ public:
   /// \brief add frame 
   void AddFrame(const std::vector<geom::Vec3>& clist);
 
+  /// \brief set an indidivial atom position in the given frame
+  void SetAtomPos(uint frame, AtomHandle atom, const geom::Vec3& pos);
+
+  /// \brief retrieve an indidivial atom position in the given frame
+  geom::Vec3 GetAtomPos(uint frame, AtomHandle atom) const;
+  
   /// \brief check for handle validity
   bool IsValid() const;
 
diff --git a/modules/mol/base/src/coord_source.cc b/modules/mol/base/src/coord_source.cc
index b1e54ecee67ff4f4b6af0ff660eaf4015f58cf42..a8d95ff1a9828a56663539407aa7df11ccf7b546 100644
--- a/modules/mol/base/src/coord_source.cc
+++ b/modules/mol/base/src/coord_source.cc
@@ -31,11 +31,17 @@ namespace ost { namespace mol {
   
 
 CoordSource::CoordSource(const AtomHandleList& atoms):
-  atoms_(atoms), mutable_(false)
+  atoms_(atoms), 
+  entity_(),
+  mutable_(false),
+  atom_dict_()
 {
   if (!atoms_.empty()) {
     entity_=atoms_.front().GetEntity();
   }
+  for(uint n=0;n<atoms_.size();++n) {
+    atom_dict_[atoms_[n].GetHashCode()]=n;
+  }
 }
 
   
@@ -105,8 +111,6 @@ CoordSourcePtr CoordSource::Extract(int start, int stop, int step)
   return in_mem_source;
 }
 
-
-
 EntityHandle CoordSource::GetEntity() const
 {
   return entity_;
@@ -132,4 +136,25 @@ const AtomHandleList& CoordSource::GetAtomList() const
   return atoms_;
 }
 
-}}  
+void CoordSource::SetAtomPos(uint frame, AtomHandle atom, const geom::Vec3& pos)
+{
+  if(!atom.IsValid()) return;
+  std::map<long,uint>::iterator it = atom_dict_.find(atom.GetHashCode());
+  if(it!=atom_dict_.end()) {
+    CoordFrame& fp=*(GetFrame(frame));
+    fp[it->second]=pos;
+  }
+}
+
+geom::Vec3 CoordSource::GetAtomPos(uint frame, AtomHandle atom) const
+{
+  if(!atom.IsValid()) return geom::Vec3();
+  std::map<long,uint>::const_iterator it = atom_dict_.find(atom.GetHashCode());
+  if(it!=atom_dict_.end()) {
+    const CoordFrame& fp=*(GetFrame(frame));
+    return fp[it->second];
+  }
+  return geom::Vec3();
+}
+
+}} // ns
diff --git a/modules/mol/base/src/coord_source.hh b/modules/mol/base/src/coord_source.hh
index c9e84102ef54f93f4ae55fb8350825b145533347..bc54b88a7925a1c4ed7a1821190a2fffb1775c6d 100644
--- a/modules/mol/base/src/coord_source.hh
+++ b/modules/mol/base/src/coord_source.hh
@@ -49,13 +49,18 @@ public:
   
   virtual uint GetFrameCount()=0;
   
-  virtual CoordFramePtr GetFrame(uint frame_id)=0;
+  virtual CoordFramePtr GetFrame(uint frame_id) const = 0;
  
   int GetAtomCount() const;
   
   EntityHandle GetEntity() const;
   
   const AtomHandleList& GetAtomList() const;
+
+  void SetAtomPos(uint frame, AtomHandle atom, const geom::Vec3& pos);
+
+  geom::Vec3 GetAtomPos(uint frame, AtomHandle atom) const;
+
   /// \brief assign the coordinates in the given frame to the atoms
   void CopyFrame(uint frame);
   bool IsMutable() const;
@@ -70,6 +75,7 @@ private:
   AtomHandleList atoms_;
   EntityHandle   entity_;
   bool           mutable_;
+  std::map<long,uint> atom_dict_;
 };
 
 }}
diff --git a/modules/mol/base/src/in_mem_coord_source.cc b/modules/mol/base/src/in_mem_coord_source.cc
index 48182f4ebd734f5931ff6fa35a9a65a8e2a722c9..98417d1594aa55ba4f26a0a9cfaa208c1fe2ad3f 100644
--- a/modules/mol/base/src/in_mem_coord_source.cc
+++ b/modules/mol/base/src/in_mem_coord_source.cc
@@ -14,7 +14,7 @@ uint InMemCoordSource::GetFrameCount()
   return frames_.size();
 }
 
-CoordFramePtr InMemCoordSource::GetFrame(uint frame_id)
+CoordFramePtr InMemCoordSource::GetFrame(uint frame_id) const
 {
   
   return frame_id>=frames_.size() ? CoordFramePtr() : frames_[frame_id];
diff --git a/modules/mol/base/src/in_mem_coord_source.hh b/modules/mol/base/src/in_mem_coord_source.hh
index ebae59274f0f486451080f88175fc6280dd4421b..08388f313fe51a179ac4295ef9c62689b307486c 100644
--- a/modules/mol/base/src/in_mem_coord_source.hh
+++ b/modules/mol/base/src/in_mem_coord_source.hh
@@ -40,7 +40,7 @@ public:
   
   virtual uint GetFrameCount();
   
-  virtual CoordFramePtr GetFrame(uint frame_id);
+  virtual CoordFramePtr GetFrame(uint frame_id) const;
   
   void AddFrame(const CoordFramePtr& frame);
   virtual void AddFrame(const std::vector<geom::Vec3>& coords);