diff --git a/modelling/pymod/export_sidechain_reconstructor.cc b/modelling/pymod/export_sidechain_reconstructor.cc
index 81e75700c9393359e67a27238159166a5e58c3e0..5c8306f3becb3f13b9c99b3ac0e5906ebf7895a9 100644
--- a/modelling/pymod/export_sidechain_reconstructor.cc
+++ b/modelling/pymod/export_sidechain_reconstructor.cc
@@ -8,6 +8,20 @@ using namespace boost::python;
 
 namespace {
 
+boost::python::list
+WrapGetLoopStartIndices(const SidechainReconstructionData& sc_rec_data) {
+  boost::python::list return_list;
+  core::AppendVectorToList(sc_rec_data.loop_start_indices, return_list);
+  return return_list;
+}
+
+boost::python::list
+WrapGetLoopLengths(const SidechainReconstructionData& sc_rec_data) {
+  boost::python::list return_list;
+  core::AppendVectorToList(sc_rec_data.loop_lengths, return_list);
+  return return_list;
+}
+
 boost::python::list
 WrapGetRotamerResIndices(const SidechainReconstructionData& sc_rec_data) {
   boost::python::list return_list;
@@ -80,7 +94,8 @@ void export_SidechainReconstructor() {
   class_<SidechainReconstructionData, SidechainReconstructionDataPtr>
     ("SidechainReconstructionData", init<>())
     .def_readonly("env_pos", &SidechainReconstructionData::env_pos)
-    .def_readonly("length", &SidechainReconstructionData::length)
+    .add_property("loop_start_indices", &WrapGetLoopStartIndices)
+    .add_property("loop_lengths", &WrapGetLoopLengths)
     .add_property("rotamer_res_indices", &WrapGetRotamerResIndices)
     .add_property("disulfid_bridges", &WrapGetDisulfidBridges)
     .add_property("is_n_ter", &WrapGetIsNTer)
diff --git a/modelling/src/all_atom_relaxer.cc b/modelling/src/all_atom_relaxer.cc
index 6aa0c960b7b2bcd760c1e2e3edc551e078259256..3f99edbf13851294773042c9fc4d4b98c388efe5 100644
--- a/modelling/src/all_atom_relaxer.cc
+++ b/modelling/src/all_atom_relaxer.cc
@@ -19,11 +19,13 @@ AllAtomRelaxer::AllAtomRelaxer(ScRecDataPtr sc_data,
   std::vector<uint>& res_indices = sc_data->env_pos->res_indices;
   for (uint i = 0; i < res_indices.size(); ++i) {
     const uint res_idx = res_indices[i];
-    all_pos_->SetResidue(res_idx, *(sc_data_->env_pos->all_pos), i);
+    all_pos_->SetResidue(res_idx, *(sc_data->env_pos->all_pos), i);
   }
 
   // setup system
-  mm_system_creator_->SetupSystem(*all_pos_, res_indices, sc_data_->length,
+  mm_system_creator_->SetupSystem(*all_pos_, res_indices,
+                                  sc_data->loop_start_indices,
+                                  sc_data->loop_lengths,
                                   sc_data->is_n_ter, sc_data->is_c_ter,
                                   sc_data->disulfid_bridges);
 }
diff --git a/modelling/src/sidechain_reconstructor.cc b/modelling/src/sidechain_reconstructor.cc
index 81e503c2ca6f2e1f5c61d3c1b7c3c276dc37ea1d..02c47aacca66e71c3c0a6addbf936ca8d1cac11e 100644
--- a/modelling/src/sidechain_reconstructor.cc
+++ b/modelling/src/sidechain_reconstructor.cc
@@ -41,17 +41,20 @@ SidechainReconstructor::Reconstruct(uint start_resnum, uint num_residues,
   }
 
   // get loop indices
-  std::vector<uint> indices = idx_handler_->ToIdxVector(start_resnum, 
+  std::vector<uint> indices = idx_handler_->ToIdxVector(start_resnum,
                                                         num_residues,
                                                         chain_idx);
-  return this->ReconstructFromIndices(indices);
+  std::vector<uint> loop_start_indices(1, 0);
+  std::vector<uint> loop_lengths(1, num_residues);
+  return ReconstructFromIndices(indices, loop_start_indices, loop_lengths);
 
 }
 
 SidechainReconstructionDataPtr
-SidechainReconstructor::Reconstruct(const std::vector<uint>& start_resnums, 
-                                    const std::vector<uint>& num_residues,
-                                    const std::vector<uint>& chain_indices) const {
+SidechainReconstructor::Reconstruct(
+                       const std::vector<uint>& start_resnums,
+                       const std::vector<uint>& num_residues,
+                       const std::vector<uint>& chain_indices) const {
   
   promod3::core::ScopedTimerPtr prof = core::StaticRuntimeProfiler::StartScoped(
                             "SidechainReconstructor::Reconstruct", 2);
@@ -61,32 +64,20 @@ SidechainReconstructor::Reconstruct(const std::vector<uint>& start_resnums,
                          "attached!");
   }
 
-  if(start_resnums.size() != num_residues.size()){
-    String err = "Size inconsistency of input data in SidechainReconstructor!";
-    throw promod3::Error(err);
-  }
-
-  if(start_resnums.size() != chain_indices.size()){
-    String err = "Size inconsistency of input data in SidechainReconstructor!";
-    throw promod3::Error(err);
-  }
-  
-  std::vector<uint> full_indices;
-
-  for(uint i = 0; i < start_resnums.size(); ++i){
-    // get loop indices
-    std::vector<uint> indices = idx_handler_->ToIdxVector(start_resnums[i], 
-                                                          num_residues[i],
-                                                          chain_indices[i]);
-
-    full_indices.insert(full_indices.end(), indices.begin(), indices.end());
-  }
-
-  return this->ReconstructFromIndices(full_indices);
+  // get loop indices
+  std::vector<uint> loop_start_indices;
+  std::vector<uint> loop_lengths;
+  std::vector<uint> indices = idx_handler_->ToIdxVector(start_resnums,
+                                                        num_residues,
+                                                        chain_indices,
+                                                        loop_start_indices,
+                                                        loop_lengths, true);
+  return ReconstructFromIndices(indices, loop_start_indices, loop_lengths);
 }
 
 void SidechainReconstructor::AttachEnvironment(loop::AllAtomEnv& env,
-                                               bool use_frm, bool use_bbdep_lib) {
+                                               bool use_frm,
+                                               bool use_bbdep_lib) {
   loop::AllAtomEnvListenerPtr tst = env.GetListener("SidechainEnvListener");
   if (tst) {
     env_ = boost::dynamic_pointer_cast<SidechainEnvListener>(tst);
@@ -133,14 +124,18 @@ void SidechainReconstructor::AttachEnvironment(loop::AllAtomEnv& env,
 }
 
 SidechainReconstructionDataPtr
-SidechainReconstructor::ReconstructFromIndices(const std::vector<uint>& indices) const{
+SidechainReconstructor::ReconstructFromIndices(
+                       const std::vector<uint>& indices,
+                       const std::vector<uint>& loop_start_indices,
+                       const std::vector<uint>& loop_lengths) const {
 
   // prepare result
   SidechainReconstructionDataPtr res(new SidechainReconstructionData());
   res->env_pos.reset(new loop::AllAtomEnvPositions);
   std::vector<uint>& res_indices = res->env_pos->res_indices;
   res_indices = indices;
-  res->length = indices.size();
+  res->loop_start_indices = loop_start_indices;
+  res->loop_lengths = loop_lengths;
   res->all_pos = all_pos_;
 
   std::set<uint> nb_frame_indices;
@@ -150,7 +145,7 @@ SidechainReconstructor::ReconstructFromIndices(const std::vector<uint>& indices)
   std::set<uint> nb_indices;
   ScCBetaSpatialOrganizer::WithinResult within_result;
   std::pair<ScCBetaSpatialOrganizerItem*,Real>* a;
-  for (uint i = 0; i < res->length; ++i) {
+  for (uint i = 0; i < indices.size(); ++i) {
     const uint res_idx = res_indices[i];
     within_result = env_->FindWithin(GetCxPos_(*all_pos_, res_idx), 
                                      overall_cutoff);
@@ -162,27 +157,27 @@ SidechainReconstructor::ReconstructFromIndices(const std::vector<uint>& indices)
   }
 
   // remove the indices form nb_indices
-  for(std::vector<uint>::iterator i = res_indices.begin(); 
-      i != res_indices.end(); ++i){
+  for (std::vector<uint>::iterator i = res_indices.begin();
+       i != res_indices.end(); ++i) {
     nb_indices.erase(*i);
   }
 
   // remove indices from nb_frame_indices
-  for(std::vector<uint>::iterator i = res_indices.begin(); 
-      i != res_indices.end(); ++i){
+  for (std::vector<uint>::iterator i = res_indices.begin();
+       i != res_indices.end(); ++i) {
     nb_frame_indices.erase(*i);
   }
 
   // and also the nb_indices
-  for(std::set<uint>::iterator i = nb_indices.begin();
-      i != nb_indices.end(); ++i) {
+  for (std::set<uint>::iterator i = nb_indices.begin();
+       i != nb_indices.end(); ++i) {
     nb_frame_indices.erase(*i);
   }
 
   // append unique surrounding residue indices (first loop part, then rest)
   res_indices.insert(res_indices.end(), nb_indices.begin(), nb_indices.end());
   // assign all frame residues close to the unique surrounding residues
-  res->rigid_frame_indices.assign(nb_frame_indices.begin(), 
+  res->rigid_frame_indices.assign(nb_frame_indices.begin(),
                                   nb_frame_indices.end());
 
   // add information on termini
diff --git a/modelling/src/sidechain_reconstructor.hh b/modelling/src/sidechain_reconstructor.hh
index 25292bb82d67b3f682c51d5bda1044ec288e8476..abe8be222f85787b027f554dfd73f591980a58df 100644
--- a/modelling/src/sidechain_reconstructor.hh
+++ b/modelling/src/sidechain_reconstructor.hh
@@ -17,9 +17,11 @@ class SidechainReconstructionData {
 public:
   // atoms and res. indices
   loop::AllAtomEnvPositionsPtr env_pos;
-  // first *length* residues of env_pos are the ones actually
-  // being reconstructed
-  uint length;
+  // loop residues of env_pos are the ones actually being reconstructed
+  // -> loop i_loop has res. indices "env_pos->res_indices[i]" for i in
+  //    (loop_start_indices[i_loop] + [0, loop_lengths[i_loop] - 1])
+  std::vector<uint> loop_start_indices;
+  std::vector<uint> loop_lengths;
   // indices (into env_pos) of residues where we added rotamer sidechains
   std::vector<uint> rotamer_res_indices;
   // pairs of indices (into env_pos) of residues where we added disulfid bridge
@@ -75,8 +77,13 @@ public:
 
 private:
 
+  // indices = res. indices of loops to reconstruct
+  // -> loop i_loop has res. indices "indices[i]" for i in 
+  //    (loop_start_indices[i_loop] + [0, loop_lengths[i_loop] - 1])
   SidechainReconstructionDataPtr 
-  ReconstructFromIndices(const std::vector<uint>& indices) const;
+  ReconstructFromIndices(const std::vector<uint>& indices,
+                         const std::vector<uint>& loop_start_indices,
+                         const std::vector<uint>& loop_lengths) const;
 
   // HELPERS
   void CheckEnvListener_(bool use_frm) const;
diff --git a/modelling/tests/test_sidechain_reconstructor.cc b/modelling/tests/test_sidechain_reconstructor.cc
index a1db8ba86c0dfdbdf8f58d009ade2d726687281f..f7be288b4192618537aeb5a9f4cbcc85ddd3d5e6 100644
--- a/modelling/tests/test_sidechain_reconstructor.cc
+++ b/modelling/tests/test_sidechain_reconstructor.cc
@@ -61,11 +61,14 @@ void CheckLoopRec(const SidechainReconstructorPtr sc_rec,
                       sc_data->all_pos->GetAA(res_idx));
   }
   // check loop
-  BOOST_CHECK_EQUAL(sc_data->length, loop_length);
-  for (uint i = 0; i < sc_data->length; ++i) {
+  BOOST_CHECK_EQUAL(sc_data->loop_start_indices.size(), 1u);
+  BOOST_CHECK_EQUAL(sc_data->loop_lengths.size(), 1u);
+  BOOST_CHECK_EQUAL(sc_data->loop_lengths[0], loop_length);
+  for (uint i = 0; i < loop_length; ++i) {
     // all loop res. assumed to be contiguous
-    const uint res_idx = sc_data->env_pos->res_indices[i];
-    BOOST_CHECK(res_idx == start_resnum+i-1);
+    const uint start_idx = sc_data->loop_start_indices[0];
+    const uint res_idx = sc_data->env_pos->res_indices[start_idx + i];
+    BOOST_CHECK(res_idx == start_resnum + i - 1);
   }
   // check N-ter / C-ter info
   BOOST_CHECK_EQUAL(sc_data->env_pos->res_indices.size(),