diff --git a/modules/mol/mm/pymod/export_simulation.cc b/modules/mol/mm/pymod/export_simulation.cc
index 92b96b0839eb245830f2db1e636d697ffa498b63..2a8f4436245dd7015bb928814ad740af8f7fa3a8 100644
--- a/modules/mol/mm/pymod/export_simulation.cc
+++ b/modules/mol/mm/pymod/export_simulation.cc
@@ -57,7 +57,6 @@ void export_Simulation()
     .def("SetPositions",&ost::mol::mm::Simulation::SetPositions,(arg("positions"),arg("in_angstrom")=true))
     .def("SetVelocities",&ost::mol::mm::Simulation::SetVelocities)
     .def("GetEntity",&ost::mol::mm::Simulation::GetEntity)
-    .def("GetEntityStandardNaming",&ost::mol::mm::Simulation::GetEntityStandardNaming)
     .def("MinimizeEnergy",&ost::mol::mm::Simulation::MinimizeEnergy, (arg("type")="steep",arg("tolerance")=1.0,arg("max_iterations")=1000))
     .def("GetEnergy",&ost::mol::mm::Simulation::GetEnergy)                                                                             
     .def("GetPotentialEnergy",&ost::mol::mm::Simulation::GetPotentialEnergy)                                                                             
diff --git a/modules/mol/mm/pymod/export_topology.cc b/modules/mol/mm/pymod/export_topology.cc
index e95deb1ee812b33016c647851189593ed0b0c477..1307ad6816cd02437c0c232c957ecb37643e4f37 100644
--- a/modules/mol/mm/pymod/export_topology.cc
+++ b/modules/mol/mm/pymod/export_topology.cc
@@ -314,10 +314,10 @@ void export_Topology()
   ;
 
   class_<ost::mol::mm::Topology>("Topology",no_init)
-//    .def(init<ost::mol::EntityHandle&,ost::mol::mm::MMSettingsPtr>())
-//    .def(init<ost::mol::EntityHandle&, std::vector<Real>&>())
 
     .def("__init__",make_constructor(&WrapTopologyConstructor))
+    .def("Save",&ost::mol::mm::Topology::Save)
+    .def("Load",&ost::mol::mm::Topology::Load).staticmethod("Load")
     .def("GetEntity",&ost::mol::mm::Topology::GetEntity)
     //interaction adding functions
     .def("AddHarmonicBond",&ost::mol::mm::Topology::AddHarmonicBond)
diff --git a/modules/mol/mm/src/index.hh b/modules/mol/mm/src/index.hh
index 055ad73a23ca22b4f53b02cf78ccefd2aa7421d4..403634a74997c0372315f618e40e3aa617e1bb72 100644
--- a/modules/mol/mm/src/index.hh
+++ b/modules/mol/mm/src/index.hh
@@ -64,6 +64,10 @@ public:
   Index(uint a) {
     (*this)[0]=a;
   }
+  template <typename DS>
+  void Serialize(DS& ds){
+    ds & (*this)[0];    
+  }
 };
 template <>
 class Index<2> : public impl::IndexBase<2> {
@@ -73,6 +77,11 @@ public:
     (*this)[0]=a;
     (*this)[1]=b;    
   }
+  template <typename DS>
+  void Serialize(DS& ds){
+    ds & (*this)[0];    
+    ds & (*this)[1];    
+  }
 };
 template <>
 class Index<3> : public impl::IndexBase<3> {
@@ -83,6 +92,12 @@ public:
     (*this)[1]=b;    
     (*this)[2]=c;        
   }
+  template <typename DS>
+  void Serialize(DS& ds){
+    ds & (*this)[0];    
+    ds & (*this)[1];    
+    ds & (*this)[2];    
+  }
 };
 template <>
 class Index<4> : public impl::IndexBase<4> {
@@ -94,6 +109,13 @@ public:
     (*this)[2]=c;        
     (*this)[3]=d;            
   }
+  template <typename DS>
+  void Serialize(DS& ds){
+    ds & (*this)[0];    
+    ds & (*this)[1];    
+    ds & (*this)[2];    
+    ds & (*this)[3];    
+  }
 };
 template <>
 class Index<5> : public impl::IndexBase<5> {
@@ -106,6 +128,14 @@ public:
     (*this)[3]=d;            
     (*this)[4]=e;                
   }
+  template <typename DS>
+  void Serialize(DS& ds){
+    ds & (*this)[0];    
+    ds & (*this)[1];    
+    ds & (*this)[2];    
+    ds & (*this)[3];    
+    ds & (*this)[4];    
+  }
 };
 template <>
 class Index<6> : public impl::IndexBase<6> {
@@ -119,6 +149,15 @@ public:
     (*this)[4]=e;
     (*this)[5]=f;    
   }
+  template <typename DS>
+  void Serialize(DS& ds){
+    ds & (*this)[0];    
+    ds & (*this)[1];    
+    ds & (*this)[2];    
+    ds & (*this)[3];    
+    ds & (*this)[4];    
+    ds & (*this)[5];    
+  }
 };
 template <>
 class Index<7> : public impl::IndexBase<7> {
@@ -133,6 +172,16 @@ public:
     (*this)[5]=f;    
     (*this)[6]=g;        
   }
+  template <typename DS>
+  void Serialize(DS& ds){
+    ds & (*this)[0];    
+    ds & (*this)[1];    
+    ds & (*this)[2];    
+    ds & (*this)[3];    
+    ds & (*this)[4];    
+    ds & (*this)[5];    
+    ds & (*this)[6];    
+  }
 };
 template<uint D>
 class IndexIterator {
diff --git a/modules/mol/mm/src/simulation.cc b/modules/mol/mm/src/simulation.cc
index 6a0d2762f460489e4b3eb2e6d073effd05590c95..213bd4385a5439c0704ab72fcdb82f91945f5790 100644
--- a/modules/mol/mm/src/simulation.cc
+++ b/modules/mol/mm/src/simulation.cc
@@ -9,34 +9,35 @@ Simulation::Simulation(const ost::mol::EntityHandle& handle,
   //(hydrogens and shit)
 
   TopologyPtr top = TopologyCreator::Create(handle,settings);
-  this->Init(top);
+  this->Init(top, settings);
 }
 
 Simulation::Simulation(const TopologyPtr top,
                        const MMSettingsPtr settings){
 
-  this->Init(top);
+  this->Init(top, settings);
 }
 
-void Simulation::Init(const TopologyPtr top){
+void Simulation::Init(const TopologyPtr top,
+                      const MMSettingsPtr settings){
 
 
   top_ = top;
-  integrator_ = settings_->integrator;
+  integrator_ = settings->integrator;
   if(!integrator_){
     throw ost::Error("Settings must have a valid integrator attached to set up a simulation!");
   }
-  system_ = SystemCreator::Create(top_,settings_,system_force_mapper_); 
+  system_ = SystemCreator::Create(top_,settings,system_force_mapper_); 
   ost::mol::EntityHandle ent = top_->GetEntity();
   original_masses_ = top_->GetMasses();
 
   //setting up the context, which combines the system with an integrator
   //to proceed in time, but first we have to load the proper platform
 
-  OpenMM::Platform::loadPluginsFromDirectory (settings_->openmm_plugin_directory);
+  OpenMM::Platform::loadPluginsFromDirectory (settings->openmm_plugin_directory);
   OpenMM::Platform* platform;
 
-  switch(settings_->platform){
+  switch(settings->platform){
     case Reference:{
       platform = &OpenMM::Platform::getPlatformByName("Reference");
       break;
@@ -74,8 +75,8 @@ void Simulation::Init(const TopologyPtr top){
   //make sure the context satisfies the distance constraints
   context_->applyConstraints(0.00001);
 
-  if(settings_->init_temperature > 0.0){
-    context_->setVelocitiesToTemperature(settings_->init_temperature);
+  if(settings->init_temperature > 0.0){
+    context_->setVelocitiesToTemperature(settings->init_temperature);
   }
 }
 
diff --git a/modules/mol/mm/src/simulation.hh b/modules/mol/mm/src/simulation.hh
index 627e6193481d5479ec59437c60dd2b2dbefc1dc9..a935c63badc5c6ba2b011cdf311dc3cf4c8d88d8 100644
--- a/modules/mol/mm/src/simulation.hh
+++ b/modules/mol/mm/src/simulation.hh
@@ -116,7 +116,8 @@ public:
   void SetPeriodicBoxExtents(geom::Vec3& vec);
 
 private:
-  void Init(const ost::mol::mm::TopologyPtr top);
+  void Init(const ost::mol::mm::TopologyPtr top, 
+            const MMSettingsPtr settings);
 
   int TimeToNextNotification();
 
diff --git a/modules/mol/mm/src/topology.cc b/modules/mol/mm/src/topology.cc
index e31859803ef132227832f869c1d3c79083dd67f4..2ed6edad2866c580ab0246aba779438389105ddb 100644
--- a/modules/mol/mm/src/topology.cc
+++ b/modules/mol/mm/src/topology.cc
@@ -20,25 +20,29 @@ Topology::Topology(const ost::mol::EntityHandle& ent, const std::vector<Real>& m
   fudge_lj_ = 1.0;
   fudge_qq_ = 1.0;
 
-  for(uint i = 0; i < atom_list_.size(); ++i){
-    atom_index_mapper_[atom_list_[i].GetHashCode()] = i;
-  }  
+  this->InitMappers();
+}
 
-  for(uint i = 0; i < res_list_.size(); ++i){
-    residue_index_mapper_[res_list_[i].GetHashCode()] = i;
-  }
+TopologyPtr Topology::Load(const String& filename){
 
-  std::map<String,uint> per_residue_mapper;
-  ost::mol::AtomHandleList residue_atom_list;
-  for(uint i = 0; i < num_residues_; ++i){
-    per_residue_mapper.clear();
-    residue_atom_list = res_list_[i].GetAtomList();
-    for(ost::mol::AtomHandleList::iterator j = residue_atom_list.begin();
-        j != residue_atom_list.end(); ++j){
-      per_residue_mapper[j->GetName()] = atom_index_mapper_[j->GetHashCode()];
-    }
-    atom_name_mapper_.push_back(per_residue_mapper);
+  if (!boost::filesystem::exists(filename)) {
+    std::stringstream ss;
+    ss << "Could not open topology. File '"
+       << filename << "' does not exist";
+    throw ost::io::IOException(ss.str());
   }
+
+  std::ifstream stream(filename.c_str(), std::ios_base::binary);
+  io::BinaryDataSource ds(stream);
+  TopologyPtr top_p(new Topology);
+  ds >> *top_p;
+  return top_p;
+}
+
+void Topology::Save(const String& filename){
+  std::ofstream stream(filename.c_str(), std::ios_base::binary);
+  io::BinaryDataSink ds(stream);
+  ds << *this;  
 }
 
 uint Topology::AddHarmonicBond(uint index_one,
@@ -1332,5 +1336,27 @@ void Topology::Merge(TopologyPtr p){
 
 }
 
+void Topology::InitMappers(){
+  for(uint i = 0; i < atom_list_.size(); ++i){
+    atom_index_mapper_[atom_list_[i].GetHashCode()] = i;
+  }  
+
+  for(uint i = 0; i < res_list_.size(); ++i){
+    residue_index_mapper_[res_list_[i].GetHashCode()] = i;
+  }
+
+  std::map<String,uint> per_residue_mapper;
+  ost::mol::AtomHandleList residue_atom_list;
+  for(uint i = 0; i < num_residues_; ++i){
+    per_residue_mapper.clear();
+    residue_atom_list = res_list_[i].GetAtomList();
+    for(ost::mol::AtomHandleList::iterator j = residue_atom_list.begin();
+        j != residue_atom_list.end(); ++j){
+      per_residue_mapper[j->GetName()] = atom_index_mapper_[j->GetHashCode()];
+    }
+    atom_name_mapper_.push_back(per_residue_mapper);
+  }
+}
+
 
 }}}//ns
diff --git a/modules/mol/mm/src/topology.hh b/modules/mol/mm/src/topology.hh
index dbe67e60d48f07cb918d3145e8f7f852da9e3c5d..16984c7db7c7c15080137ddaca1c8a5c65bc4637 100644
--- a/modules/mol/mm/src/topology.hh
+++ b/modules/mol/mm/src/topology.hh
@@ -20,6 +20,7 @@
 #include <ost/mol/mm/mm_interaction.hh>
 #include <ost/mol/xcs_editor.hh>
 #include <ost/mol/bond_handle.hh>
+#include <ost/mol/residue_prop.hh>
 
 #include <time.h>
 
@@ -37,6 +38,10 @@ public:
 
   Topology(const ost::mol::EntityHandle& ent, const std::vector<Real>& masses);
 
+  static TopologyPtr Load(const String& filename);
+
+  void Save(const String& filename);
+
   uint AddHarmonicBond(uint index_one,
                        uint index_two, 
                        Real bond_length,
@@ -360,8 +365,433 @@ public:
 
   void SetEntityPositions(const geom::Vec3List& positions);
 
+  template <typename DS>
+  void Serialize(DS& ds){
+    
+    ds & num_atoms_;
+    ds & num_residues_;
+
+    uint num_chains = 0;
+    uint num_residues = 0;
+    uint num_atoms = 0;
+    uint num_bonded_atoms = 0;
+    Real x_pos = 0.0;
+    Real y_pos = 0.0;
+    Real z_pos = 0.0;
+    Real bfac = 0.0;
+    Real occ = 0.0;
+    bool is_hetatm = false;
+    String chain_name = "X";
+    String res_name = "XXX";
+    int resnum_num = 0;
+    char resnum_code = '\0';
+    String atom_name = "X";
+    String atom_element = "X";
+    uint atom_index = 0;
+    uint num_items = 0;
+    Index<2> actual_index;
+
+    if(ds.IsSource()){
+      ost::mol::EntityHandle ent = ost::mol::CreateEntity();
+      ost::mol::XCSEditor ed = ent.EditXCS();
+      ds & num_chains;
+      for(uint i = 0; i < num_chains; ++i){
+        ds & chain_name;
+        ds & num_residues;
+        ost::mol::ChainHandle chain = ed.InsertChain(chain_name);
+        for(uint j = 0; j < num_residues; ++j){
+          ds & res_name;
+          ds & resnum_num;
+          ds & resnum_code;
+          ds & num_atoms;
+          ost::mol::ResNum num(resnum_num,resnum_code);
+          ost::mol::ResidueHandle res = ed.AppendResidue(chain,res_name,num);
+          for(uint k = 0; k < num_atoms; ++k){
+            ds & atom_name;
+            ds & atom_element;
+            ds & x_pos;
+            ds & y_pos;
+            ds & z_pos;
+            ds & bfac;
+            ds & occ;
+            ds & is_hetatm;
+            geom::Vec3 pos(x_pos,y_pos,z_pos);
+            ed.InsertAtom(res,atom_name,pos,atom_element,occ,bfac,is_hetatm);
+          }
+        }
+      }
+      ent_ = ent;
+      atom_list_ = ent_.GetAtomList();
+      res_list_ = ent_.GetResidueList();
+      for(uint i = 0; i < atom_list_.size(); ++i){
+        ds & num_bonded_atoms;
+        for(uint j = 0; j < num_bonded_atoms; ++j){
+          ds & atom_index;
+          ed.Connect(atom_list_[i],atom_list_[atom_index]);
+        }
+      }
+      InitMappers();
+    }
+    else{
+      num_chains = ent_.GetChainCount();
+      ds & num_chains;
+      ost::mol::ChainHandleList chain_list = ent_.GetChainList();
+      for(ost::mol::ChainHandleList::iterator i = chain_list.begin();
+          i != chain_list.end(); ++i){
+        chain_name = i->GetName();
+        num_residues = i->GetResidueCount();
+        ds & chain_name;
+        ds & num_residues;
+        ost::mol::ResidueHandleList res_list = i->GetResidueList();
+        for(ost::mol::ResidueHandleList::iterator j = res_list.begin();
+            j != res_list.end(); ++j){
+          res_name = j->GetKey();
+          resnum_num = j->GetNumber().GetNum();
+          resnum_code = j->GetNumber().GetInsCode(); 
+          num_atoms = j->GetAtomCount();
+          ds & res_name;
+          ds & resnum_num;
+          ds & resnum_code;
+          ds & num_atoms;
+          ost::mol::AtomHandleList atom_list = j->GetAtomList();
+          for(ost::mol::AtomHandleList::iterator k = atom_list.begin();
+              k != atom_list.end(); ++k){
+            atom_name = k->GetName();
+            atom_element = k->GetElement();
+            geom::Vec3 pos = k->GetPos();
+            bfac = k->GetBFactor();
+            occ = k->GetOccupancy();
+            is_hetatm = k->IsHetAtom();
+            ds & atom_name;
+            ds & atom_element;
+            ds & pos[0];
+            ds & pos[1];
+            ds & pos[2];
+            ds & bfac;
+            ds & occ;
+            ds & is_hetatm;
+          }
+        }
+      }
+      ost::mol::AtomHandleList bonded_atoms;
+      for(ost::mol::AtomHandleList::iterator i = atom_list_.begin();
+          i != atom_list_.end(); ++i){
+        bonded_atoms = i->GetBondPartners();
+        num_bonded_atoms = bonded_atoms.size();
+        ds & num_bonded_atoms;
+        for(ost::mol::AtomHandleList::iterator j = bonded_atoms.begin();
+            j != bonded_atoms.end(); ++j){
+          atom_index = this->GetAtomIndex(*j);
+          ds & atom_index;
+        }
+      }
+    }
+
+    ds & fudge_qq_;
+    ds & fudge_lj_;
+
+    if(ds.IsSource()){
+      ds & num_items;
+      atom_masses_ = std::vector<Real>(num_items);
+      ds & num_items;
+      sigmas_ = std::vector<Real>(num_items);
+      ds & num_items;
+      epsilons_ = std::vector<Real>(num_items);
+      ds & num_items;
+      gbsa_radii_ = std::vector<Real>(num_items);
+      ds & num_items;
+      obc_scaling_ = std::vector<Real>(num_items);
+      ds & num_items;
+      charges_ = std::vector<Real>(num_items);
+      ds & num_items;
+      position_constraints_ = std::vector<uint>(num_items);
+    }
+    else{
+      num_items = atom_masses_.size();
+      ds & num_items;
+      num_items = sigmas_.size();
+      ds & num_items;
+      num_items = epsilons_.size();
+      ds & num_items;
+      num_items = gbsa_radii_.size();
+      ds & num_items;
+      num_items = obc_scaling_.size();
+      ds & num_items;
+      num_items = charges_.size();
+      ds & num_items;
+      num_items = position_constraints_.size();
+      ds & num_items;
+    }
+
+    for(std::vector<Real>::iterator i = atom_masses_.begin();
+        i != atom_masses_.end(); ++i){
+      ds & *i;
+    }
+
+    for(std::vector<Real>::iterator i = sigmas_.begin();
+        i != sigmas_.end(); ++i){
+      ds & *i;
+    }
+
+    for(std::vector<Real>::iterator i = epsilons_.begin();
+        i != epsilons_.end(); ++i){
+      ds & *i;
+    }
+
+    for(std::vector<Real>::iterator i = gbsa_radii_.begin();
+        i != gbsa_radii_.end(); ++i){
+      ds & *i;
+    }
+
+    for(std::vector<Real>::iterator i = obc_scaling_.begin();
+        i != obc_scaling_.end(); ++i){
+      ds & *i;
+    }
+
+    for(std::vector<Real>::iterator i = charges_.begin();
+        i != charges_.end(); ++i){
+      ds & *i;
+    }
+
+    for(std::vector<uint>::iterator i = position_constraints_.begin();
+        i != position_constraints_.end(); ++i){
+      ds & *i;
+    }
+
+    if(ds.IsSource()){
+      ds & num_items;
+      for(uint i = 0; i < num_items; ++i){
+        harmonic_bonds_.push_back(std::make_pair(Index<2>(),std::vector<Real>(2)));
+      }
+
+      ds & num_items;
+      for(uint i = 0; i < num_items; ++i){
+        harmonic_angles_.push_back(std::make_pair(Index<3>(),std::vector<Real>(2)));
+      }
+
+      ds & num_items;
+      for(uint i = 0; i < num_items; ++i){
+        urey_bradley_angles_.push_back(std::make_pair(Index<3>(),std::vector<Real>(4)));
+      }
+
+      ds & num_items;
+      for(uint i = 0; i < num_items; ++i){
+        periodic_dihedrals_.push_back(std::make_pair(Index<4>(),std::vector<Real>(3)));
+      }
+
+      ds & num_items;
+      for(uint i = 0; i < num_items; ++i){
+        periodic_impropers_.push_back(std::make_pair(Index<4>(),std::vector<Real>(3)));
+      }
+
+      ds & num_items;
+      for(uint i = 0; i < num_items; ++i){
+        harmonic_impropers_.push_back(std::make_pair(Index<4>(),std::vector<Real>(2)));
+      }
+
+      ds & num_items;
+      for(uint i = 0; i < num_items; ++i){
+        uint num_values = 0;
+        ds & num_values;
+        cmaps_.push_back(std::make_pair(Index<5>(),std::vector<Real>(num_values)));
+      }
+
+      ds & num_items;
+      for(uint i = 0; i < num_items; ++i){
+        lj_pairs_.push_back(std::make_pair(Index<2>(),std::vector<Real>(2)));
+      } 
+
+      ds & num_items;
+      for(uint i = 0; i < num_items; ++i){
+        distance_constraints_.push_back(std::make_pair(Index<2>(),std::vector<Real>(1)));
+      }
+
+      ds & num_items;
+      exclusions_ = std::vector<Index<2> >(num_items);
+
+      ds & num_items;
+      for(uint i = 0; i < num_items; ++i){
+        harmonic_position_restraints_.push_back(std::make_pair(Index<1>(),std::vector<Real>(7)));
+      }
+
+      ds & num_items;
+      for(uint i = 0; i < num_items; ++i){
+        harmonic_distance_restraints_.push_back(std::make_pair(Index<2>(),std::vector<Real>(2)));
+      }
+    }
+    else{
+      num_items = harmonic_bonds_.size();
+      ds & num_items;
+      num_items = harmonic_angles_.size();
+      ds & num_items;
+      num_items = urey_bradley_angles_.size();
+      ds & num_items;
+      num_items = periodic_dihedrals_.size();
+      ds & num_items;
+      num_items = periodic_impropers_.size();
+      ds & num_items;
+      num_items = harmonic_impropers_.size();
+      ds & num_items;
+      num_items = cmaps_.size();
+      ds & num_items;
+      for(uint i = 0; i < cmaps_.size(); ++i){
+        num_items = cmaps_[i].second.size();
+        ds & num_items;
+      }
+      num_items = lj_pairs_.size();
+      ds & num_items;
+      num_items = distance_constraints_.size();
+      ds & num_items;
+      num_items = exclusions_.size();
+      ds & num_items;
+      num_items = harmonic_position_restraints_.size();
+      ds & num_items;
+      num_items = harmonic_distance_restraints_.size();
+      ds & num_items;
+    }
+
+    for(std::vector<std::pair<Index<2>,std::vector<Real> > >::iterator i = harmonic_bonds_.begin();
+        i != harmonic_bonds_.end(); ++i){
+      ds & i->first;
+      ds & i->second[0];
+      ds & i->second[1];
+    }
+
+    for(std::vector<std::pair<Index<3>,std::vector<Real> > >::iterator i = harmonic_angles_.begin();
+        i != harmonic_angles_.end(); ++i){
+      ds & i->first;
+      ds & i->second[0];
+      ds & i->second[1];
+    }
+
+    for(std::vector<std::pair<Index<3>,std::vector<Real> > >::iterator i = urey_bradley_angles_.begin();
+        i != urey_bradley_angles_.end(); ++i){
+      ds & i->first;
+      ds & i->second[0];
+      ds & i->second[1];
+      ds & i->second[2];
+      ds & i->second[3];
+    }
+
+    for(std::vector<std::pair<Index<4>,std::vector<Real> > >::iterator i = periodic_dihedrals_.begin();
+        i != periodic_dihedrals_.end(); ++i){
+      ds & i->first;
+      ds & i->second[0];
+      ds & i->second[1];
+      ds & i->second[2];
+    }
+
+    for(std::vector<std::pair<Index<4>,std::vector<Real> > >::iterator i = periodic_impropers_.begin();
+        i != periodic_impropers_.end(); ++i){
+      ds & i->first;
+      ds & i->second[0];
+      ds & i->second[1];
+      ds & i->second[2];
+    }
+
+    for(std::vector<std::pair<Index<4>,std::vector<Real> > >::iterator i = harmonic_impropers_.begin();
+        i != harmonic_impropers_.end(); ++i){
+      ds & i->first;
+      ds & i->second[0];
+      ds & i->second[1];
+    }
+
+    for(std::vector<std::pair<Index<5>,std::vector<Real> > >::iterator i = cmaps_.begin();
+        i != cmaps_.end(); ++i){
+      ds & i->first;
+      for(std::vector<Real>::iterator j = i->second.begin();
+          j != i->second.end(); ++j){
+        ds & (*j);
+      }
+    }
+
+    for(std::vector<std::pair<Index<2>,std::vector<Real> > >::iterator i = lj_pairs_.begin();
+        i != lj_pairs_.end(); ++i){
+      ds & i->first;
+      ds & i->second[0];
+      ds & i->second[1];
+    }
+
+    for(std::vector<std::pair<Index<2>,std::vector<Real> > >::iterator i = distance_constraints_.begin();
+        i != distance_constraints_.end(); ++i){
+      ds & i->first;
+      ds & i->second[0];
+    }
+
+    for(std::vector<Index<2> >::iterator i = exclusions_.begin();
+        i != exclusions_.end(); ++i){
+      ds & (*i);
+    }
+
+    for(std::vector<std::pair<Index<1>,std::vector<Real> > >::iterator i = harmonic_position_restraints_.begin();
+        i != harmonic_position_restraints_.end(); ++i){
+      ds & i->first;
+      ds & i->second[0];
+      ds & i->second[1];
+      ds & i->second[2];
+      ds & i->second[3];
+      ds & i->second[4];
+      ds & i->second[5];
+      ds & i->second[6];
+    }
+
+    for(std::vector<std::pair<Index<2>,std::vector<Real> > >::iterator i = harmonic_distance_restraints_.begin();
+        i != harmonic_distance_restraints_.end(); ++i){
+      ds & i->first;
+      ds & i->second[0];
+      ds & i->second[1];
+    }
+
+    if(ds.IsSource()){
+      ds & num_items;
+      for(uint i = 0; i < num_items; ++i){
+        ds & actual_index;
+        added_lj_pairs_.insert(actual_index);
+      }
+
+      ds & num_items;
+      for(uint i = 0; i < num_items; ++i){
+        ds & actual_index;
+        added_distance_constraints_.insert(actual_index);
+      }
+
+      ds & num_items;
+      for(uint i = 0; i < num_items; ++i){
+        ds & actual_index;
+        added_exclusions_.insert(actual_index);
+      }
+    }
+    else{
+      num_items = added_lj_pairs_.size();
+      ds & num_items;
+      for(std::set<Index<2> >::iterator i = added_lj_pairs_.begin(); 
+          i != added_lj_pairs_.end(); ++i){
+        actual_index = *i;
+        ds & actual_index;
+      }
+      num_items = added_distance_constraints_.size();
+      ds & num_items;
+      for(std::set<Index<2> >::iterator i = added_distance_constraints_.begin(); 
+          i != added_distance_constraints_.end(); ++i){
+        actual_index = *i;
+        ds & actual_index;
+      }
+      num_items = added_exclusions_.size();
+      ds & num_items;
+      for(std::set<Index<2> >::iterator i = added_exclusions_.begin(); 
+          i != added_exclusions_.end(); ++i){
+        actual_index = *i;
+        ds & actual_index;
+      }
+    }
+  }
+
 private:
 
+  Topology() { } //hidden constructor without parameters
+
+  void InitMappers();
+
   ost::mol::EntityHandle ent_;
   ost::mol::AtomHandleList atom_list_;
   ost::mol::ResidueHandleList res_list_;