diff --git a/src/libnptm/Configuration.cpp b/src/libnptm/Configuration.cpp
index 63faf394b7cc76573a1c248e0fde060d2b71a619..3485d543bef862afd5378ee32f6d061a9ba291ea 100644
--- a/src/libnptm/Configuration.cpp
+++ b/src/libnptm/Configuration.cpp
@@ -234,21 +234,21 @@ ScattererConfiguration::ScattererConfiguration(
 }
 
 ScattererConfiguration::~ScattererConfiguration() {
-  int max_ici = 0;
+  int configurations = 0;
   for (int i = 1; i <= number_of_spheres; i++) {
     if (iog_vec[i - 1] < i) continue;
-    int nsh = nshl_vec[i - 1];
-    if (max_ici < (nsh + 1) / 2) max_ici = (nsh + 1) / 2;
+    configurations++;
   }
-  for (int i = 0; i < max_ici; i++) {
+  for (int i = 0; i < configurations; i++) {
     for (int j = 0; j < number_of_spheres; j++) {
       delete[] dc0_matrix[i][j];
     }
   }
   delete[] dc0_matrix;
-  for (int i = 0; i < number_of_spheres; i++) {
+  for (int i = 0; i < configurations; i++) {
     delete[] rcf[i];
   }
+  delete[] rcf;
   delete[] nshl_vec;
   delete[] radii_of_spheres;
   delete[] iog_vec;
@@ -430,88 +430,82 @@ ScattererConfiguration* ScattererConfiguration::from_dedfb(string dedfb_file_nam
     }
   }
   int *iog_vector = new int[nsph]();
-  double *ros_vector = new double[nsph]();
-  double **rcf_vector = new double*[nsph];
-  int *nshl_vector = new int[nsph]();
-  int filled_iogs = 0;
+  str_target = file_lines[++last_read_line];
   re = regex("[0-9]+");
-  while (filled_iogs < nsph) {
-    string str_target = file_lines[++last_read_line];
-    while(regex_search(str_target, m, re)) {
-      iog_vector[filled_iogs++] = stoi(m.str());
+  int configurations = 0;
+  for (int i = 1; i <= nsph; i++) {
+    bool success = regex_search(str_target, m, re);
+    if (success) {
+      iog_vector[i - 1] = stoi(m.str());
       str_target = m.suffix().str();
-      if (filled_iogs == nsph) break;
+      if (iog_vector[i - 1] >= i) configurations++;
+    } else {
+      str_target = file_lines[++last_read_line];
+      i--;
     }
   }
+  int index = 0;
+  double *ros_vector = new double[configurations]();
+  int *nshl_vector = new int[configurations]();
+  double **rcf_vector = new double*[configurations];
   for (int i113 = 1; i113 <= nsph; i113++) {
-    int i_val, nsh;
-    double ros_val;
-    if (iog_vector[i113 - 1] < i113) {
-      rcf_vector[i113 - 1] = new double[1]();
-      continue;
-    }
-    re = regex("[0-9]+");
+    if (iog_vector[i113 - 1] < i113) continue;
     str_target = file_lines[++last_read_line];
     regex_search(str_target, m, re);
-    i_val = stoi(m.str());
-    str_target = m.suffix();
+    nshl_vector[i113 - 1] = stoi(m.str());
+    str_target = m.suffix().str();
     re = regex("-?[0-9]+\\.[0-9]+([eEdD][-+]?[0-9]+)?");
     regex_search(str_target, m, re);
     string str_number = m.str();
     str_number = regex_replace(str_number, regex("D"), "e");
     str_number = regex_replace(str_number, regex("d"), "e");
-    ros_val = stod(str_number);
-    nshl_vector[i113 - 1] = i_val;
-    if (max_ici < (i_val + 1) / 2) max_ici = (i_val + 1) / 2;
-    ros_vector[i113 - 1] = ros_val;
-    nsh = nshl_vector[i113 - 1];
+    ros_vector[i113 - 1] = stod(m.str());
+    int nsh = nshl_vector[i113 - 1];
     if (i113 == 1) nsh += ies;
     rcf_vector[i113 - 1] = new double[nsh]();
-    for (int ns = 0; ns < nsh; ns++) {
-      double ns_rcf;
+    for (int ns112 = 0; ns112 < nsh; ns112++) {
       str_target = file_lines[++last_read_line];
       regex_search(str_target, m, re);
       str_number = m.str();
       str_number = regex_replace(str_number, regex("D"), "e");
       str_number = regex_replace(str_number, regex("d"), "e");
-      ns_rcf = stod(str_number);
-      rcf_vector[i113 - 1][ns] = ns_rcf;
-    }
-  }
-  complex<double> ***dc0m = new complex<double>**[max_ici];
-  int dim3 = (_idfc == 0) ? nxi : 1;
-  for (int dim1 = 0; dim1 < max_ici; dim1++) {
-    dc0m[dim1] = new complex<double>*[nsph];
-    for (int dim2 = 0; dim2 < nsph; dim2++) {
-      dc0m[dim1][dim2] = new complex<double>[dim3]();
-    }
-  }
-  re = regex("-?[0-9]+\\.[0-9]+([eEdD][-+]?[0-9]+)?");
+      rcf_vector[i113 - 1][ns112] = stod(str_number);
+    } // ns112 loop
+  } // i113 loop
+
+  complex<double> ***dc0m = new complex<double>**[configurations];
+  complex<double> *dc0 = new complex<double>[configurations]();
+  for (int di = 0; di < configurations; di++) {
+    dc0m[di] = new complex<double>*[nsph];
+    for (int dj = 0; dj < nsph; dj++) dc0m[di][dj] = new complex<double>[nxi]();
+  } // di loop
   for (int jxi468 = 1; jxi468 <= nxi; jxi468++) {
-    if (_idfc != 0 && jxi468 > 1) continue;
+    if (_idfc != 0 && jxi468 > 1) continue; // jxi468 loop
     for (int i162 = 1; i162 <= nsph; i162++) {
-      if (iog_vector[i162 - 1] < i162) continue;
-      int nsh = nshl_vector[i162 - 1];
-      int ici = (nsh + 1) / 2; // QUESTION: is integer division really intended here?
-      if (i162 == 1) ici = ici + ies;
-      for (int i157 = 0; i157 < ici; i157++) {
-	double dc0_real, dc0_img;
-	str_target = file_lines[++last_read_line];
-	regex_search(str_target, m, re);
-	string str_number = m.str();
-	str_number = regex_replace(str_number, regex("D"), "e");
-	str_number = regex_replace(str_number, regex("d"), "e");
-	dc0_real = stod(str_number);
-	str_target = m.suffix().str();
-	regex_search(str_target, m, re);
-	str_number = m.str();
-	str_number = regex_replace(str_number, regex("D"), "e");
-	str_number = regex_replace(str_number, regex("d"), "e");
-	dc0_img = stod(str_number);
-	dc0m[i157][i162 - 1][jxi468 - 1] = complex<double>(dc0_real, dc0_img);
+      if (iog_vector[i162 - 1] >= i162) {
+	int nsh = nshl_vector[i162 - 1];
+	int ici = (nsh + 1) / 2;
+	if (i162 == 1) ici += ies;
+	for (int ic157 = 0; ic157 < ici; ic157++) {
+	  str_target = file_lines[++last_read_line];
+	  regex_search(str_target, m, re);
+	  string str_number = m.str();
+	  str_number = regex_replace(str_number, regex("D"), "e");
+	  str_number = regex_replace(str_number, regex("d"), "e");
+	  double rval = stod(str_number);
+	  str_target = m.suffix().str();
+	  regex_search(str_target, m, re);
+	  str_number = m.str();
+	  str_number = regex_replace(str_number, regex("D"), "e");
+	  str_number = regex_replace(str_number, regex("d"), "e");
+	  double ival = stod(str_number);
+	  dc0[ic157] = complex<double>(rval, ival);
+	  dc0m[ic157][i162 - 1][jxi468 - 1] = dc0[ic157];
+	} // ic157 loop
       }
-    }
-  }
+    } // i162 loop
+  } // jxi468 loop
+  delete[] dc0;
 
   ScattererConfiguration *config = new ScattererConfiguration(
 							      nsph,
@@ -627,104 +621,83 @@ ScattererConfiguration* ScattererConfiguration::from_hdf5(string file_name) {
 }
 
 ScattererConfiguration* ScattererConfiguration::from_legacy(string file_name) {
-  int nsph;
-  int *iog;
+  int _nsph;
+  int *_iog_vec;
+  int _ies;
   double _exdc, _wp, _xip;
-  int _idfc, nxi;
-  int *nshl_vector;
-  double *xi_vec;
-  double *ros_vector;
-  double **rcf_vector;
-  complex<double> ***dc0m;
-  
-  int max_ici = 0;
+  int _idfc, _nxi;
+  int *_nshl_vec;
+  double *_xi_vec;
+  double *_ros_vec;
+  double **_rcf_vec;
+  complex<double> ***_dc0m;
+
   fstream input;
   input.open(file_name.c_str(), ios::in | ios::binary);
-  if (input.is_open()) {
-    input.read(reinterpret_cast<char *>(&nsph), sizeof(int));
-    iog = new int[nsph]();
-    for (int i = 0; i < nsph; i++) {
-      input.read(reinterpret_cast<char *>(&(iog[i])), sizeof(int));
-    }
-    int configuration_count = 0;
-    for (int i115 = 1; i115 <= nsph; i115++) {
-      if (iog[i115 - 1] < i115) continue;
-      configuration_count++;
-    }
-    input.read(reinterpret_cast<char *>(&_exdc), sizeof(double));
-    input.read(reinterpret_cast<char *>(&_wp), sizeof(double));
-    input.read(reinterpret_cast<char *>(&_xip), sizeof(double));
-    input.read(reinterpret_cast<char *>(&_idfc), sizeof(int));
-    input.read(reinterpret_cast<char *>(&nxi), sizeof(int));
-    try {
-      xi_vec = new double[nxi]();
-    } catch (const bad_alloc &ex) {
-      throw UnrecognizedConfigurationException("Wrong parameter set: invalid number of scales " + to_string(nxi));
-    }
-    for (int i = 0; i < nxi; i++) {
-      input.read(reinterpret_cast<char *>(&(xi_vec[i])), sizeof(double));
-    }
-    nshl_vector = new int[configuration_count]();
-    ros_vector = new double[configuration_count]();
-    rcf_vector = new double*[configuration_count];
-    for (int i115 = 1; i115 <= nsph; i115++) {
-      if (iog[i115 - 1] < i115) {
-	rcf_vector[i115 - 1] = new double[1]();
-	continue;
-      }
-      input.read(reinterpret_cast<char *>(&(nshl_vector[i115 - 1])), sizeof(int)); // was not from IOG
-      input.read(reinterpret_cast<char *>(&(ros_vector[i115 - 1])), sizeof(double)); // was not from IOG
-      int nsh = nshl_vector[i115 - 1]; // was not from IOG
-      if (max_ici < (nsh + 1) / 2) max_ici = (nsh + 1) / 2;
-      try {
-	rcf_vector[i115 - 1] = new double[nsh](); // was not from IOG
-      } catch (const bad_alloc &ex) {
-	throw UnrecognizedConfigurationException("Wrong parameter set: invalid number of layers " + to_string(nsh));
-      }
-      for (int nsi = 0; nsi < nsh; nsi++) {
-	input.read(reinterpret_cast<char *>(&(rcf_vector[i115 - 1][nsi])), sizeof(double)); // was not from IOG
-      }
-    }
-    dc0m = new complex<double>**[max_ici];
-    int dim3 = (_idfc == 0) ? nxi : 1;
-    for (int dim1 = 0; dim1 < max_ici; dim1++) {
-      dc0m[dim1] = new complex<double>*[nsph];
-      for (int dim2 = 0; dim2 < nsph; dim2++) {
-	dc0m[dim1][dim2] = new complex<double>[dim3]();
-      }
-    }
-    for (int jxi468 = 1; jxi468 <= nxi; jxi468++) {
-      if (_idfc != 0 && jxi468 > 1) continue;
-      for (int i162 = 1; i162 <= nsph; i162++) {
-	if (iog[i162 - 1] < i162) continue;
-	int nsh = nshl_vector[iog[i162 - 1] - 1]; // was not from IOG
-	int ici = (nsh + 1) / 2; // QUESTION: is integer division really intended here?
-	for (int i157 = 0; i157 < ici; i157++) {
-	  double dc0_real, dc0_img;
-	  input.read(reinterpret_cast<char *>(&dc0_real), sizeof(double));
-	  input.read(reinterpret_cast<char *>(&dc0_img), sizeof(double));
-	  dc0m[i157][i162 - 1][jxi468 - 1] = dc0_real + 1i * dc0_img;
-	}
+  input.read(reinterpret_cast<char *>(&_nsph), sizeof(int));
+  input.read(reinterpret_cast<char *>(&_ies), sizeof(int));
+  _iog_vec = new int[_nsph]();
+  for (int i = 0; i < _nsph; i++)
+    input.read(reinterpret_cast<char *>(&(_iog_vec[i])), sizeof(int));
+  input.read(reinterpret_cast<char *>(&_exdc), sizeof(double));
+  input.read(reinterpret_cast<char *>(&_wp), sizeof(double));
+  input.read(reinterpret_cast<char *>(&_xip), sizeof(double));
+  input.read(reinterpret_cast<char *>(&_idfc), sizeof(int));
+  input.read(reinterpret_cast<char *>(&_nxi), sizeof(int));
+  _xi_vec = new double[_nxi]();
+  for (int i = 0; i < _nxi; i++)
+    input.read(reinterpret_cast<char *>(&(_xi_vec[i])), sizeof(double));
+  int configurations = 0;
+  for (int i = 1; i <= _nsph; i++) {
+    if (_iog_vec[i - 1] >= i) configurations++;
+  }
+  _nshl_vec = new int[configurations]();
+  _ros_vec = new double[configurations]();
+  _rcf_vec = new double*[configurations];
+  for (int i115 = 1; i115 <= _nsph; i115++) {
+    if (_iog_vec[i115 - 1] < i115) continue;
+    input.read(reinterpret_cast<char *>(&(_nshl_vec[i115 - 1])), sizeof(int));
+    input.read(reinterpret_cast<char *>(&(_ros_vec[i115 - 1])), sizeof(double));
+    int nsh = _nshl_vec[i115 - 1];
+    if (i115 == 1) nsh += _ies;
+    _rcf_vec[i115 - 1] = new double[nsh]();
+    for (int nsi = 0; nsi < nsh; nsi++)
+      input.read(reinterpret_cast<char *>(&(_rcf_vec[i115 - 1][nsi])), sizeof(double));
+  }
+  _dc0m = new complex<double>**[configurations];
+  for (int di = 0; di < configurations; di++) {
+    _dc0m[di] = new complex<double>*[_nsph];
+    for (int dj = 0; dj < _nsph; dj++) _dc0m[di][dj] = new complex<double>[_nxi]();
+  } // di loop
+  for (int jxi468 = 1; jxi468 <= _nxi; jxi468++) {
+    if (_idfc != 0 && jxi468 > 1) continue;
+    for (int i162 = 1; i162 <= _nsph; i162++) {
+      if (_iog_vec[i162 - 1] < i162) continue;
+      int nsh = _nshl_vec[i162 - 1];
+      int ici = (nsh + 1) / 2;
+      if (i162 == 1) ici = ici + _ies;
+      for (int i157 = 0; i157 < ici; i157++) {
+	double rval, ival;
+	input.read(reinterpret_cast<char *>(&rval), sizeof(double));
+	input.read(reinterpret_cast<char *>(&ival), sizeof(double));
+	_dc0m[i157][i162 - 1][jxi468 - 1] = complex<double>(rval, ival);
       }
     }
-    input.close();
-  } else { // Opening of the input file did not succeed.
-    OpenConfigurationFileException ex(file_name);
-    throw ex;
   }
+  input.close();
     
   ScattererConfiguration *conf = new ScattererConfiguration(
-							    nsph,
-							    xi_vec,
-							    nxi,
+							    _nsph,
+							    _xi_vec,
+							    _nxi,
 							    "XIV",
-							    iog,
-							    ros_vector,
-							    nshl_vector,
-							    rcf_vector,
+							    _iog_vec,
+							    _ros_vec,
+							    _nshl_vec,
+							    _rcf_vec,
 							    _idfc,
-							    dc0m,
-							    false,
+							    _dc0m,
+							    (_ies == 1),
 							    _exdc,
 							    _wp,
 							    _xip
@@ -889,12 +862,11 @@ void ScattererConfiguration::write_hdf5(string file_name) {
 }
 
 void ScattererConfiguration::write_legacy(string file_name) {
-  const double two_pi = acos(0.0) * 4.0;
-  const double evc = 6.5821188e-16;
   fstream output;
   int ies = (use_external_sphere)? 1 : 0;
   output.open(file_name.c_str(), ios::out | ios::binary);
   output.write(reinterpret_cast<char *>(&number_of_spheres), sizeof(int));
+  output.write(reinterpret_cast<char *>(&ies), sizeof(int));
   for (int i = 0; i < number_of_spheres; i++)
     output.write(reinterpret_cast<char *>(&(iog_vec[i])), sizeof(int));
   output.write(reinterpret_cast<char *>(&exdc), sizeof(double));