diff --git a/modules/io/src/mol/entity_io_mae_handler.cc b/modules/io/src/mol/entity_io_mae_handler.cc
index b8647c00acb49f8013da13b33e7644b0df0b68c2..03700f62a350cf827a1edce0a56ec54707ddbe6b 100644
--- a/modules/io/src/mol/entity_io_mae_handler.cc
+++ b/modules/io/src/mol/entity_io_mae_handler.cc
@@ -30,7 +30,6 @@
 #include <boost/iostreams/filter/gzip.hpp>
 #include <boost/filesystem/convenience.hpp>
 #include <boost/algorithm/string.hpp>
-#include <boost/lexical_cast.hpp>
 #include <boost/format.hpp>
 #include <boost/regex.hpp>
 
@@ -128,11 +127,16 @@ void MAEReader::Import(mol::EntityHandle& ent)
       if(in_atom_block) {
         if(parsing_atoms) {
           if(boost::regex_match(line,r_delim)) {
-            std::cerr << "stopping atom parsing" << std::endl;
+            LOGN_DUMP( "stopping atom parsing" );
             parsing_atoms=false;
+            prop_list.clear();
           } else {
             // parsing atom line
             std::vector<std::string> tokens=tokenize(line);
+            for(int i=0;i<tokens.size();++i) {
+              LOG_DUMP( "[" << tokens[i] << "] ");
+            }
+            LOGN_DUMP("");
             add_atom(ent,editor,
                      tokens[i_atom_name],
                      tokens[i_atom_xpos],
@@ -153,37 +157,39 @@ void MAEReader::Import(mol::EntityHandle& ent)
                i_chain_name==-1) {
               throw IOException("missing atom prop");
             }
-            std::cerr << "starting atom parsing" << std::endl;
+            LOGN_DUMP( "starting atom parsing" );
             parsing_atoms=true;
           } else if(line[0]=='}') {
-            std::cerr << "exiting atom block" << std::endl;
+            LOGN_DUMP( "exiting atom block" );
             in_atom_block=false;
           } else {
             // parsing property line
-            int pid=prop_list.size();
-            prop_list.push_back(line);
-            std::cerr << "found property '" << prop_list.back() << "'" << std::endl;
-            if(line=="s_m_pdb_atom_name") i_atom_name=pid;
-            else if(line=="r_m_x_coord") i_atom_xpos=pid;
-            else if(line=="r_m_y_coord") i_atom_ypos=pid;
-            else if(line=="r_m_z_coord") i_atom_zpos=pid;
-            else if(line=="s_m_pdb_residue_name") i_res_name=pid;
-            else if(line=="i_m_residue_number") i_res_num=pid;
-            else if(line=="s_m_pdb_segment_name") i_chain_name=pid;
+            if(line[0]!='#') {
+              int pid=prop_list.size()+1;
+              prop_list.push_back(line);
+              LOGN_DUMP( "found property '" << prop_list.back() << "' id=" << pid );
+              if(line=="s_m_pdb_atom_name") i_atom_name=pid;
+              else if(line=="r_m_x_coord") i_atom_xpos=pid;
+              else if(line=="r_m_y_coord") i_atom_ypos=pid;
+              else if(line=="r_m_z_coord") i_atom_zpos=pid;
+              else if(line=="s_m_pdb_residue_name") i_res_name=pid;
+              else if(line=="i_m_residue_number") i_res_num=pid;
+              else if(line=="s_m_pdb_segment_name") i_chain_name=pid;
+            }
           }
         }
       } else { // not in atom block
         if(boost::regex_match(line,r_atom_block)) {
-          std::cerr << "entering atom block" << std::endl;
+          LOGN_DUMP( "entering atom block" );
           in_atom_block=true;
         } else if(line[0]=='}') {
-          std::cerr << "exiting ct block" << std::endl;
+          LOGN_DUMP( "exiting ct block" );
           in_ct_block=false;
         }
       }
     } else { // not in ct block
       if(boost::regex_match(line,r_ct_block)) {
-        std::cerr << "entering ct block" << std::endl;
+        LOGN_DUMP( "entering ct block" );
         in_ct_block=true;
       }
     }
@@ -196,25 +202,27 @@ void MAEReader::Import(mol::EntityHandle& ent)
 
 void MAEReader::add_atom(mol::EntityHandle ent,
                          mol::XCSEditor& editor,
-                         const std::string& aname, 
+                         const std::string& aname2, 
                          const std::string& s_axpos, 
                          const std::string& s_aypos, 
                          const std::string& s_azpos, 
-                         const std::string& rname,
+                         const std::string& rname2,
                          const std::string& s_rnum,
-                         const std::string& cname)
+                         const std::string& cname2)
 {
-  std::string ele = aname.substr(0,1);
-  int irnum = boost::lexical_cast<int>(s_rnum);
-  geom::Vec3 apos(boost::lexical_cast<Real>(s_axpos),
-                  boost::lexical_cast<Real>(s_aypos),
-                  boost::lexical_cast<Real>(s_azpos));
+  std::string aname=boost::trim_copy(aname2);
+  std::string rname=boost::trim_copy(rname2);
+  std::string cname=boost::trim_copy(cname2);
+  std::string ele=aname.substr(0,1);
+  if(isdigit(ele[0])) ele="H";
+
+  int irnum = atoi(s_rnum.c_str());
+  geom::Vec3 apos(atof(s_axpos.c_str()),
+                  atof(s_aypos.c_str()),
+                  atof(s_azpos.c_str()));
 
   mol::ResidueKey rkey(rname);
   
-  // some postprocessing
-  LOGN_TRACE( "cname: [" << cname << "]" );
-
   mol::ResNum rnum(irnum);
   
   // determine chain and residue update
@@ -236,23 +244,27 @@ void MAEReader::add_atom(mol::EntityHandle ent,
 
   if(update_chain) {  
     if (!(curr_chain_=ent.FindChain(cname))) {
-      LOGN_DUMP("new chain " << cname);      
       curr_chain_=editor.InsertChain(cname);
+      LOGN_DUMP("new chain " << curr_chain_);      
       ++chain_count_;      
+    } else {
+      LOGN_DUMP("old chain " << curr_chain_);      
     }
   }
 
   if(update_residue) {
     if (!(curr_residue_=curr_chain_.FindResidue(rnum))) {
-      LOGN_DUMP("new residue " << rkey << " " << rnum);
       curr_residue_=editor.AppendResidue(curr_chain_, rkey, rnum);
       assert(curr_residue_.IsValid());
+      LOGN_DUMP(" new residue " << curr_residue_);
       ++residue_count_;
+    } else {
+      LOGN_DUMP(" old residue " << curr_residue_);
     }
   }
 
   // finally add atom
-  LOGN_DUMP("adding atom " << aname << " (" << ele << ") @" << apos);
+  LOGN_DUMP("  atom " << aname << " (" << ele << ") @" << apos);
   mol::AtomProp aprop;
   aprop.element=ele;
   aprop.radius=conop::Conopology::Instance().GetDefaultAtomRadius(ele);
diff --git a/modules/mol/base/pymod/export_coord_group.cc b/modules/mol/base/pymod/export_coord_group.cc
index 28059f82b23db3226ee243dcb856ad8e179d3566..90efa24de02f61c24fbef173811e043d9a460f82 100644
--- a/modules/mol/base/pymod/export_coord_group.cc
+++ b/modules/mol/base/pymod/export_coord_group.cc
@@ -54,6 +54,8 @@ void export_CoordGroup()
     .def("IsValid", &CoordGroupHandle::IsValid)
     .def("Capture", capture1)
     .def("Capture", capture2)
+    .def("CaptureInto",&CoordGroupHandle::CaptureInto)
+    .def("GetAtomList",&CoordGroupHandle::GetAtomList)
     .def("__getitem__",cg_getitem)
     .def("__setitem__",cg_setitem)
   ;
diff --git a/modules/mol/base/pymod/export_residue.cc b/modules/mol/base/pymod/export_residue.cc
index 66214c7d4b5050d7ba0ce4697a56a1ffad4fb6b1..688f81be82c80d3579762a97d3bbef0bfcab1e88 100644
--- a/modules/mol/base/pymod/export_residue.cc
+++ b/modules/mol/base/pymod/export_residue.cc
@@ -36,6 +36,8 @@ namespace {
 
   void set_sec_struct1(ResidueBase* b, const SecStructure& s) {b->SetSecStructure(s);}
   void set_sec_struct2(ResidueBase* b, char c) {b->SetSecStructure(SecStructure(c));}
+  void set_chemclass1(ResidueBase* b, const ChemClass& cc) {b->SetChemClass(cc);}
+  void set_chemclass2(ResidueBase* b, char c) {b->SetChemClass(ChemClass(c));}
 
 }
 
@@ -104,6 +106,9 @@ void export_Residue()
          return_value_policy<copy_const_reference>())
     .def("GetNumber", &ResidueBase::GetNumber,
          return_value_policy<copy_const_reference>())
+    .def("GetChemClass", &ResidueBase::GetChemClass)
+    .def("SetChemClass", set_chemclass1)
+    .def("SetChemClass", set_chemclass2)
     .add_property("number",
                    make_function(&ResidueBase::GetNumber,
                                  return_value_policy<copy_const_reference>()))
diff --git a/modules/mol/base/src/coord_group.cc b/modules/mol/base/src/coord_group.cc
index 6675b5499bbacd193dddf51bda764dff67f29196..df0b1a5de0e723b4c33360c0ca89c5c3eaf83c4c 100644
--- a/modules/mol/base/src/coord_group.cc
+++ b/modules/mol/base/src/coord_group.cc
@@ -118,7 +118,7 @@ CoordFramePtr CoordGroupHandle::GetFrame(uint frame) const
   return source_->GetFrame(frame);
 }
 
-const AtomHandleList& CoordGroupHandle::GetAtomList() const
+AtomHandleList CoordGroupHandle::GetAtomList() const
 {
   this->CheckValidity();
   return source_->GetAtomList();
@@ -134,6 +134,16 @@ void CoordGroupHandle::Capture()
   }  
 }
 
+void CoordGroupHandle::CaptureInto(int pos)
+{
+  this->CheckValidity();
+  if (source_->IsMutable()) {
+    source_->CaptureInto(pos);    
+  } else {
+    throw IntegrityError("Can't capture. CoordGroup is immutable");
+  }  
+}
+
 void CoordGroupHandle::Capture(uint frame)
 {
   this->CheckValidity();
diff --git a/modules/mol/base/src/coord_group.hh b/modules/mol/base/src/coord_group.hh
index 3b038e37b37af79ddc1d73eb2b1babbccebf988d..38fa81d2e5089989c1ecc01300784c694f485217 100644
--- a/modules/mol/base/src/coord_group.hh
+++ b/modules/mol/base/src/coord_group.hh
@@ -62,6 +62,8 @@ public:
   /// \brief store current atom positions in new frame
   void Capture();
 
+  void CaptureInto(int pos);
+
   /// \brief store current atom positions in given frame (must exist)
   void Capture(uint frame);
   
@@ -80,7 +82,7 @@ public:
   /// \brief whether the handle is valid
   operator bool() const;
   
-  const AtomHandleList& GetAtomList() const;
+  AtomHandleList GetAtomList() const;
   CoordFramePtr GetFrame(uint frame) const;
 private:
   void CheckValidity() const;
@@ -91,7 +93,7 @@ private:
 };
 
 // factory method
-// create with a reference set of atoms and the number of frames
+// create with a reference set of atoms and zero frames
 DLLEXPORT_OST_MOL CoordGroupHandle CreateCoordGroup(const AtomHandleList& atoms);
 
 }} // ns
diff --git a/modules/mol/base/src/coord_source.cc b/modules/mol/base/src/coord_source.cc
index b25a91755d461be23870de214a5e592c038ece6a..9b9f853e32e18e1f237a98458f7bfc85e24545ea 100644
--- a/modules/mol/base/src/coord_source.cc
+++ b/modules/mol/base/src/coord_source.cc
@@ -87,6 +87,21 @@ void CoordSource::Capture()
   this->AddFrame(coords);
 }
 
+void CoordSource::CaptureInto(int pos)
+{
+  std::vector<geom::Vec3> coords;
+  coords.reserve(atoms_.size());
+  for (AtomHandleList::const_iterator i=atoms_.begin(), 
+       e=atoms_.end(); i!=e; ++i) {
+    coords.push_back(i->GetPos());
+  }
+  if(pos<0 || pos>=GetFrameCount()) {
+    this->AddFrame(coords);
+  } else {
+    this->InsertFrame(pos,coords);
+  }
+}
+
 void CoordSource::Capture(uint f)
 {
   CoordFrame& fp=*(GetFrame(f));
@@ -124,11 +139,6 @@ bool CoordSource::IsMutable() const
  return mutable_; 
 }
 
-void CoordSource::AddFrame(const std::vector<geom::Vec3>& coords)
-{
-  assert(0 && "implement me");
-}
-
 void CoordSource::SetMutable(bool flag)
 {
   mutable_=flag;
diff --git a/modules/mol/base/src/coord_source.hh b/modules/mol/base/src/coord_source.hh
index bc54b88a7925a1c4ed7a1821190a2fffb1775c6d..590ba8073e83b05557d835a9292edf4743111d65 100644
--- a/modules/mol/base/src/coord_source.hh
+++ b/modules/mol/base/src/coord_source.hh
@@ -66,9 +66,11 @@ public:
   bool IsMutable() const;
   
   void Capture();
+  void CaptureInto(int pos);
   void Capture(uint f);
   
-  virtual void AddFrame(const std::vector<geom::Vec3>& coords);
+  virtual void AddFrame(const std::vector<geom::Vec3>& coords) = 0;
+  virtual void InsertFrame(int pos, const std::vector<geom::Vec3>& coords) = 0;
 protected:
   void SetMutable(bool flag);
 private:
diff --git a/modules/mol/base/src/in_mem_coord_source.cc b/modules/mol/base/src/in_mem_coord_source.cc
index 089c667bd1971f1a7ea6ee7c77d807deaeeb3d8e..1690c11048713795f5bf3d86bbef29b9fb82702f 100644
--- a/modules/mol/base/src/in_mem_coord_source.cc
+++ b/modules/mol/base/src/in_mem_coord_source.cc
@@ -16,7 +16,6 @@ uint InMemCoordSource::GetFrameCount()
 
 CoordFramePtr InMemCoordSource::GetFrame(uint frame_id) const
 {
-  
   return frame_id>=frames_.size() ? CoordFramePtr() : frames_[frame_id];
 }
 
@@ -31,4 +30,12 @@ void InMemCoordSource::AddFrame(const std::vector<geom::Vec3>& coords)
   frames_.push_back(fp);
 }
 
+void InMemCoordSource::InsertFrame(int pos, const std::vector<geom::Vec3>& coords)
+{
+  CoordFrameList::iterator it = frames_.begin();
+  for(int i=0;i<pos;++i) ++it;
+  CoordFramePtr fp(new CoordFrame(coords));
+  frames_.insert(it,fp);
+}
+
 }}
diff --git a/modules/mol/base/src/in_mem_coord_source.hh b/modules/mol/base/src/in_mem_coord_source.hh
index 08388f313fe51a179ac4295ef9c62689b307486c..67b31e95fe0d16e6136775bd4980f578d56a6468 100644
--- a/modules/mol/base/src/in_mem_coord_source.hh
+++ b/modules/mol/base/src/in_mem_coord_source.hh
@@ -44,6 +44,7 @@ public:
   
   void AddFrame(const CoordFramePtr& frame);
   virtual void AddFrame(const std::vector<geom::Vec3>& coords);
+  virtual void InsertFrame(int pos, const std::vector<geom::Vec3>& coords);
   
 private:
   CoordFrameList  frames_;