diff --git a/modules/mol/base/pymod/__init__.py b/modules/mol/base/pymod/__init__.py
index 6431ae0ce891d8e3b8fdbc2dd1ff42c60e90d046..a473f7ae467faff11c759f9f48627018cf665d8a 100644
--- a/modules/mol/base/pymod/__init__.py
+++ b/modules/mol/base/pymod/__init__.py
@@ -18,4 +18,18 @@
 #------------------------------------------------------------------------------
 from _mol import *
 import ost.geom as _geom
-from ost.mol import alg
\ No newline at end of file
+from ost.mol import alg
+
+
+def MergeCoordGroups(*coord_groups):
+  """
+  Merge several separate coord groups into one. The coord groups must have the 
+  same number of atoms. In case no coord group is supplied, None will be 
+  returned.
+  """
+  if len(coord_groups)==0:
+    return None
+  cg=CreateCoordGroup(coord_groups[0].atoms)
+  for coord_group in coord_groups:
+    cg.AddFrames(coord_group)
+  return cg
\ No newline at end of file
diff --git a/modules/mol/base/pymod/export_coord_group.cc b/modules/mol/base/pymod/export_coord_group.cc
index 5589268afbb64498a74255cc797cda97f4d7bfdf..bed54377ec626890bae0de10ec69ae032ecf64e5 100644
--- a/modules/mol/base/pymod/export_coord_group.cc
+++ b/modules/mol/base/pymod/export_coord_group.cc
@@ -46,11 +46,13 @@ void export_CoordGroup()
     .def("IsValid",&CoordGroupHandle::IsValid)
     .def("GetEntity",&CoordGroupHandle::GetEntity)
     .def("GetAtomCount",&CoordGroupHandle::GetAtomCount)
+    .def("AddFrames", &CoordGroupHandle::AddFrames)
     .def("GetFrameCount",&CoordGroupHandle::GetFrameCount)
     .def("SetFramePositions",&CoordGroupHandle::SetFramePositions)
     .def("SetAtomPos",&CoordGroupHandle::SetAtomPos)
     .def("GetAtomPos",&CoordGroupHandle::GetAtomPos)
     .def("CopyFrame",&CoordGroupHandle::CopyFrame)
+    .add_property("atoms", &CoordGroupHandle::GetAtomList)
     .def("IsValid", &CoordGroupHandle::IsValid)
     .def("Capture", capture1)
     .def("Capture", capture2)
diff --git a/modules/mol/base/src/coord_group.cc b/modules/mol/base/src/coord_group.cc
index 4dcabf68bdc7ef09818a3f9a42fae7886c031dee..b4bea4c8e8267214f27c3794884ebb3978c9c62b 100644
--- a/modules/mol/base/src/coord_group.cc
+++ b/modules/mol/base/src/coord_group.cc
@@ -93,6 +93,21 @@ void CoordGroupHandle::AddFrame(const std::vector<geom::Vec3>& clist)
   }
 }
 
+void CoordGroupHandle::AddFrames(const CoordGroupHandle& cg)
+{
+  this->CheckValidity();
+  if (source_->IsMutable()) {
+    if (cg.GetAtomCount()!=this->GetAtomCount()) {
+      throw IntegrityError("Atom number don't match");
+    }
+    for (size_t i=0; i<cg.GetFrameCount(); ++i) {
+      source_->AddFrame(*cg.GetFrame(i));
+    }
+  } else {
+    throw IntegrityError("Can't add frame to immutable CoordGroup");
+  }
+}
+
 void CoordGroupHandle::CheckValidity() const
 {
   if (!source_) {
diff --git a/modules/mol/base/src/coord_group.hh b/modules/mol/base/src/coord_group.hh
index dfa3c85304e38e1e63da5cbac085220b7e063fed..8f7f78c9ec0196cb9619ec0dda0c85b77b7ebfb3 100644
--- a/modules/mol/base/src/coord_group.hh
+++ b/modules/mol/base/src/coord_group.hh
@@ -67,6 +67,7 @@ public:
   /// \brief add frame 
   void AddFrame(const std::vector<geom::Vec3>& clist);
 
+  void AddFrames(const CoordGroupHandle& cg);
   /// \brief set an indidivial atom position in the given frame
   void SetAtomPos(uint frame, AtomHandle atom, const geom::Vec3& pos);