diff --git a/src/cluster/cluster.cpp b/src/cluster/cluster.cpp
index c2fc61cd85b5acb7c5f79c93d094187341d74a99..77a149a4234063dad795003cbf874ccd6f9447ff 100644
--- a/src/cluster/cluster.cpp
+++ b/src/cluster/cluster.cpp
@@ -707,10 +707,9 @@ int cluster_jxi488_cycle(
   const int npntts = gconf->npntts;
   const int isam = gconf->isam;
   const int jwtm = gconf->jwtm;
-  // np_int ndit = 2 * nsph * cid->c1->nlim;
   int isq, ibf;
   int last_configuration;
-  int num_configs = sconf->configurations;
+  const int num_configs = sconf->configurations;
   const int ndirs = sa->nkks;
   int oindex = -1;
   int jindex = jxi488 - output->first_xi + 1;
diff --git a/src/include/Commons.h b/src/include/Commons.h
index 24a345525413c8776004f190329fad7286e195ce..54f062e5d35adc5a808193ed6b1441d23ecac927 100644
--- a/src/include/Commons.h
+++ b/src/include/Commons.h
@@ -502,13 +502,13 @@ public:
    */
   std::string get_descriptor_type() override { return "inclusion descriptor"; }
   
-  /*! \brief Interface function to update field expansion orders.
+  /*! \brief Update the field expansion orders.
    *
    * \param inner_order: `int` The new inner expansion order to be set.
    * \param outer_order: `int` The new outer expansion order to be set.
    * \return result: `int` An exit code (0 if successful).
    */
-  int update_orders(int inner_order, int outer_order) { return 0; }
+  int update_orders(int inner_order, int outer_order);
 };
 
 /*! \brief The data structure describing a spherical particle model.
diff --git a/src/include/IterationData.h b/src/include/IterationData.h
index 981ed6518e4d5e31003d2c6c7ebff1014433c68e..4fe1d250ddd847e5a812e0fb1933ec1b367789c2 100644
--- a/src/include/IterationData.h
+++ b/src/include/IterationData.h
@@ -354,6 +354,15 @@ public:
   /*! \brief `InclusionIterationData` instance destroyer.
    */
   ~InclusionIterationData();
+
+  /*! \brief Update field expansion orders.
+   *
+   * \param rcf: `double **` Matrix of sphere fractional radii.
+   * \param inner_order: `int` The new inner expansion order to be set.
+   * \param outer_order: `int` The new outer expansion order to be set.
+   * \return result: `int` An exit code (0 if successful).
+   */
+  int update_orders(double** rcf, int inner_order, int outer_order);
 };
 // >>> END OF InclusionIterationData CLASS DEFINITION <<< //
 
diff --git a/src/include/inclu_subs.h b/src/include/inclu_subs.h
index 64e5a1f3da5d11fc060f709b60ac50d4d2055554..c7af5e26c70594e4a0d9184acf33fffc1de9113e 100644
--- a/src/include/inclu_subs.h
+++ b/src/include/inclu_subs.h
@@ -75,10 +75,10 @@ void indme(
 
 /*! \brief C++ porting of INSTR.
  *
- * \param sconf: `ScattererConfiguration *` Pointer to a ScattererConfiguration instance.
+ * \param rcf: `double **` Pointer to matrix of fractional radii.
  * \param c1: `ParticleDescriptor *` Pointer to a ParticleDescriptor instance.
  */
-void instr(ScattererConfiguration *sconf, ParticleDescriptor *c1);
+void instr(double **rcf, ParticleDescriptor *c1);
 
 /*! \brief C++ porting of OSPV.
  *
diff --git a/src/inclusion/inclusion.cpp b/src/inclusion/inclusion.cpp
index 0b0033c4a20f7609c5fd5e9dc940efdf8f7509df..7d6d4ae38b3403862747b80dc9ac3e310e05d101 100644
--- a/src/inclusion/inclusion.cpp
+++ b/src/inclusion/inclusion.cpp
@@ -19,6 +19,7 @@
  * \brief Implementation of the calculation for a sphere with inclusions.
  */
 #include <chrono>
+#include <cmath>
 #include <cstdio>
 #include <exception>
 #include <fstream>
@@ -233,12 +234,10 @@ void inclusion(const string& config_file, const string& data_file, const string&
       // Open empty virtual ascii file for output
       InclusionOutputInfo *p_output = new InclusionOutputInfo(sconf, gconf, mpidata);
       InclusionIterationData *cid = new InclusionIterationData(gconf, sconf, mpidata, device_count);
-      const np_int ndi = cid->c1->nsph * cid->c1->nlim;
-      const np_int ndit = 2 * ndi;
       logger->log("INFO: Size of matrices to invert: " + to_string((int64_t)cid->c1->ndm) + " x " + to_string((int64_t)cid->c1->ndm) +".\n");
       time_logger->log("INFO: Size of matrices to invert: " + to_string((int64_t)cid->c1->ndm) + " x " + to_string((int64_t)cid->c1->ndm) +".\n");
       
-      instr(sconf, cid->c1);
+      instr(sconf->_rcf, cid->c1);
       thdps(cid->c1->lm, cid->zpv);
       double exdc = sconf->exdc;
       double exri = sqrt(exdc);
@@ -537,6 +536,7 @@ void inclusion(const string& config_file, const string& data_file, const string&
     time_logger->log(message);
     fclose(timing_file);
     delete time_logger;
+    delete logger;
   } // end instructions block of MPI process 0
   
     //===============================
@@ -673,8 +673,9 @@ void inclusion(const string& config_file, const string& data_file, const string&
 }
 
 int inclusion_jxi488_cycle(int jxi488, ScattererConfiguration *sconf, GeometryConfiguration *gconf, ScatteringAngles *sa, InclusionIterationData *cid, InclusionOutputInfo *output, const string& output_path, VirtualBinaryFile *vtppoanp) {
-  const dcomplex cc0 = 0.0 + I * 0.0;
   int nxi = sconf->number_of_scales;
+  const dcomplex cc0 = 0.0 + I * 0.0;
+  const double pi = acos(-1.0);
   char virtual_line[256];
   string message = "INFO: running scale iteration " + to_string(jxi488) + " of " + to_string(nxi) + ".\n";
   Logger *logger = new Logger(LOG_DEBG);
@@ -684,24 +685,24 @@ int inclusion_jxi488_cycle(int jxi488, ScattererConfiguration *sconf, GeometryCo
   int jer = 0;
   int lcalc = 0;
   int jaw = 1;
-  int li = cid->c1->li;
-  int le = cid->c1->le;
-  int lm = cid->c1->lm;
-  int nsph = cid->c1->nsph;
+  bool is_first_scale = (jxi488 == 1);
+  // int li = cid->c1->li;
+  // int le = cid->c1->le;
+  // int lm = cid->c1->lm;
+  const int nsph = cid->c1->nsph;
   np_int mxndm = gconf->mxndm;
-  int iavm = gconf->iavm;
-  int inpol = gconf->in_pol;
-  int npnt = cid->c1->npnt;
-  int npntts = cid->c1->npntts;
-  int isam = gconf->iavm;
-  int jwtm = gconf->jwtm;
-  np_int ndit = cid->c1->ndit;
+  const int iavm = gconf->iavm;
+  const int inpol = gconf->in_pol;
+  const int npnt = cid->c1->npnt;
+  const int npntts = cid->c1->npntts;
+  const int isam = gconf->iavm;
+  const int jwtm = gconf->jwtm;
   int isq, ibf;
   int last_configuration;
   dcomplex ent, entn;
   double enti;
-  int num_configs = sconf->configurations;
-  int ndirs = sa->nkks;
+  const int num_configs = sconf->configurations;
+  const int ndirs = sa->nkks;
   int oindex = -1;
   int jindex = jxi488 - output->first_xi + 1;
 
@@ -725,6 +726,48 @@ int inclusion_jxi488_cycle(int jxi488, ScattererConfiguration *sconf, GeometryCo
     output->vec_vk[jindex - 1] = cid->vk;
     output->vec_xi[jindex - 1] = xi;
   }
+  // Dynamic order check
+  const int max_li = gconf->li;
+  const int max_le = gconf->le;
+  const double alamb = 2.0 * pi / cid->vk;
+  double size_par_li = 2.0 * pi * sqrt(exdc) * sconf->get_max_radius() / alamb;
+  int recommended_li = 4 + (int)ceil(size_par_li + 4.05 * pow(size_par_li, 1.0 / 3.0));
+  double size_par_le = 2.0 * pi * sqrt(exdc) * sconf->get_particle_radius(gconf) / alamb;
+  int recommended_le = 1 + (int)ceil(size_par_le + 11.0 * pow(size_par_le, 1.0 / 3.0));
+  if (recommended_li != cid->c1->li || recommended_le != cid->c1->le) {
+    if (recommended_li > cid->c1->li) {
+      message = "WARNING: internal order " + to_string(cid->c1->li) + " for scale iteration "
+	+ to_string(jxi488) + " too low (recommended order is " + to_string(recommended_li)
+	+ ").\n";
+      logger->log(message, LOG_WARN);
+    } else if (recommended_li < cid->c1->li) {
+      message = "INFO: lowering internal order from " + to_string(cid->c1->li) + " to "
+	+ to_string(recommended_li) + " for scale iteration " + to_string(jxi488) + ".\n";
+      logger->log(message, LOG_INFO);
+    }
+    if (recommended_le > cid->c1->le) {
+      message = "WARNING: external order " + to_string(cid->c1->le) + " for scale iteration "
+	+ to_string(jxi488) + " too low (recommended order is " + to_string(recommended_le)
+	+ ").\n";
+      logger->log(message, LOG_WARN);
+    } else if (recommended_le < cid->c1->le) {
+      message = "INFO: lowering external order from " + to_string(cid->c1->le) + " to "
+	+ to_string(recommended_le) + " for scale iteration " + to_string(jxi488) + ".\n";
+      logger->log(message, LOG_INFO);
+    }
+    if (recommended_li < max_li || recommended_le < max_le) {
+      int new_li = (recommended_li < max_li) ? recommended_li : max_li;
+      int new_le = (recommended_le < max_le) ? recommended_le : max_le;
+      cid->update_orders(sconf->_rcf, new_li, new_le);
+      is_first_scale = true;
+      jaw = 1;
+      cid->refinemode = 2;
+    }
+  }
+  int li = cid->c1->li;
+  int le = cid->c1->le;
+  int lm = cid->c1->lm;
+  // End of dynamic order check
   // label 120
   double sze = vkarg * cid->extr;
   last_configuration = 0;
@@ -745,7 +788,7 @@ int inclusion_jxi488_cycle(int jxi488, ScattererConfiguration *sconf, GeometryCo
 	  cid->c1->dc0[ic] = sconf->get_dielectric_constant(ic, i133 - 1, jxi488 - 1);
 	// goes to 129
       } else { // label 127
-	if (jxi488 == 1) {
+	if (is_first_scale) {
 	  for (int ic = 0; ic < ici; ic++) {
 	    cid->c1->dc0[ic] = sconf->get_dielectric_constant(ic, i133 - 1, 0);
 	  }
@@ -921,7 +964,7 @@ int inclusion_jxi488_cycle(int jxi488, ScattererConfiguration *sconf, GeometryCo
     double cost = 0.0, sint = 0.0, cosp = 0.0, sinp = 0.0;
     for (int jph484 = 1; jph484 <= sa->nph; jph484++) {
       int jw = 0;
-      if (sa->nk != 1 || jxi488 <= 1) {
+      if (sa->nk != 1 || is_first_scale) {
 	upvmp(th, ph, 0, cost, sint, cosp, sinp, cid->u, cid->upmp, cid->unmp);
 	if (isam >= 0) {
 	  wmamp(
@@ -964,7 +1007,7 @@ int inclusion_jxi488_cycle(int jxi488, ScattererConfiguration *sconf, GeometryCo
 	    if (phs > 360.0) phs -= 360.0;
 	  }
 	  // label 188
-	  bool goto190 = (sa->nks == 1 && (jxi488 > 1 || jth486 > 1 || jph484 > 1));
+	  bool goto190 = (sa->nks == 1 && (!(is_first_scale) || jth486 > 1 || jph484 > 1));
 	  if (!goto190) {
 	    upvmp(ths, phs, icspnv, costs, sints, cosps, sinps, cid->us, cid->upsmp, cid->unsmp);
 	    if (isam >= 0)
@@ -974,7 +1017,7 @@ int inclusion_jxi488_cycle(int jxi488, ScattererConfiguration *sconf, GeometryCo
 		    );
 	  }
 	  // label 190
-	  if (sa->nkks != 1 || jxi488 <= 1) {
+	  if (sa->nkks != 1 || is_first_scale) {
 	    upvsp(
 		  cid->u, cid->upmp, cid->unmp, cid->us, cid->upsmp, cid->unsmp, cid->up, cid->un, cid->ups, cid->uns,
 		  cid->duk, isq, ibf, cid->scan, cid->cfmp, cid->sfmp, cid->cfsp, cid->sfsp
@@ -1390,8 +1433,6 @@ int inclusion_jxi488_cycle(int jxi488, ScattererConfiguration *sconf, GeometryCo
 // >>> IMPLEMENTATION OF InclusionIterationData CLASS <<< //
 InclusionIterationData::InclusionIterationData(GeometryConfiguration *gconf, ScattererConfiguration *sconf, const mixMPI *mpidata, const int device_count) {
   c1 = new ParticleDescriptorInclusion(gconf, sconf);
-  const int ndi = c1->nsph * c1->nlim;
-  const np_int ndit = 2 * ndi;
   gaps = new double[c1->nsph]();
   tqev = new double[3]();
   tqsv = new double[3]();
@@ -1502,8 +1543,6 @@ InclusionIterationData::InclusionIterationData(GeometryConfiguration *gconf, Sca
 
 InclusionIterationData::InclusionIterationData(const InclusionIterationData& rhs) {
   c1 = new ParticleDescriptorInclusion(reinterpret_cast<ParticleDescriptorInclusion &>(*(rhs.c1)));
-  const int ndi = c1->nsph * c1->nlim;
-  const np_int ndit = 2 * ndi;
   gaps = new double[c1->nsph]();
   for (int gi = 0; gi < c1->nsph; gi++) gaps[gi] = rhs.gaps[gi];
   tqev = new double[3]();
@@ -1654,8 +1693,6 @@ InclusionIterationData::InclusionIterationData(const InclusionIterationData& rhs
 #ifdef MPI_VERSION
 InclusionIterationData::InclusionIterationData(const mixMPI *mpidata, const int device_count) {
   c1 = new ParticleDescriptorInclusion(mpidata);
-  const int ndi = c1->nsph * c1->nlim;
-  const np_int ndit = 2 * ndi;
   gaps = new double[c1->nsph]();
   MPI_Bcast(gaps, c1->nsph, MPI_DOUBLE, 0, MPI_COMM_WORLD);
   tqev = new double[3]();
@@ -1792,8 +1829,6 @@ InclusionIterationData::InclusionIterationData(const mixMPI *mpidata, const int
 
 void InclusionIterationData::mpibcast(const mixMPI *mpidata) {
   c1->mpibcast(mpidata);
-  const int ndi = c1->nsph * c1->nlim;
-  const np_int ndit = 2 * ndi;
   MPI_Bcast(gaps, c1->nsph, MPI_DOUBLE, 0, MPI_COMM_WORLD);
   MPI_Bcast(tqev, 3, MPI_DOUBLE, 0, MPI_COMM_WORLD);
   MPI_Bcast(tqsv, 3, MPI_DOUBLE, 0, MPI_COMM_WORLD);
@@ -1927,4 +1962,40 @@ InclusionIterationData::~InclusionIterationData() {
   delete[] cmullr;
   delete[] cmul;
 }
+
+int InclusionIterationData::update_orders(double **rcf, int inner_order, int outer_order) {
+  int result = 0;
+  int old_lm = c1->lm;
+  ((ParticleDescriptorInclusion *)c1)->update_orders(inner_order, outer_order);
+  for (int zi = 0; zi < old_lm; zi++) {
+    for (int zj = 0; zj < 3; zj++) {
+      for (int zk = 0; zk < 2; zk++) {
+	delete[] zpv[zi][zj][zk];
+      }
+      delete[] zpv[zi][zj];
+    }
+    delete[] zpv[zi];
+  }
+  delete[] zpv;
+  zpv = new double***[c1->lm];
+  for (int zi = 0; zi < c1->lm; zi++) {
+    zpv[zi] = new double**[3];
+    for (int zj = 0; zj < 3; zj++) {
+      zpv[zi][zj] = new double*[2];
+      for (int zk = 0; zk < 2; zk++) {
+	zpv[zi][zj][zk] = new double[2]();
+      }
+    }
+  }
+  instr(rcf, c1);
+  thdps(c1->lm, zpv);
+  delete[] am;
+  delete[] am_vector;
+  am_vector = new dcomplex[c1->ndm * c1->ndm]();
+  am = new dcomplex*[c1->ndm];
+  for (int ai = 0; ai < c1->ndm; ai++) {
+    am[ai] = am_vector + ai * c1->ndm;
+  }
+  return result;
+}
 // >>> END OF InclusionIterationData CLASS IMPLEMENTATION <<<
diff --git a/src/libnptm/Commons.cpp b/src/libnptm/Commons.cpp
index e66b7fe21e93207b17362a9671894ec280dee2b1..b93abab2ce2fa19c341256ed4a9847901eb99f4c 100644
--- a/src/libnptm/Commons.cpp
+++ b/src/libnptm/Commons.cpp
@@ -83,10 +83,12 @@ ParticleDescriptor::ParticleDescriptor(GeometryConfiguration *gconf, ScattererCo
   _ndm = 0;
   gcs = 0.0;
   _num_configurations = sconf->configurations;
-  _num_layers = (sconf->use_external_sphere) ? 1 : 0;
+  // _num_layers = (sconf->use_external_sphere) ? 1 : 0;
+  _num_layers = 0;
   _max_layers = 1;
   for (int nli = 0; nli < num_configurations; nli++) {
     int nl = sconf->get_nshl(nli);
+    if (nli == 0 && sconf->use_external_sphere) nl++;
     _num_layers += nl;
     if (nl >  _max_layers) _max_layers = nl;
   }
@@ -136,8 +138,6 @@ ParticleDescriptor::ParticleDescriptor(GeometryConfiguration *gconf, ScattererCo
   _npntts = gconf->npntts;
   int max_n = (npnt > npntts) ? npnt : npntts;
   _nhspo = 2 * max_n - 1;
-  // _nl = sconf->configurations;
-  // if (_nsph == 1 && _nl == 1) _nl = 5;
   ris = new dcomplex[_nhspo]();
   dlri = new dcomplex[_nhspo]();
   vkt = new dcomplex[_nsph]();
@@ -310,7 +310,6 @@ ParticleDescriptor::ParticleDescriptor(const ParticleDescriptor &rhs) {
   tfsas = 0.0 + I * 0.0;
   vec_tsas = NULL;
   tsas = NULL;
-  gcs = 0.0;
   scs = 0.0;
   ecs = 0.0;
   acs = 0.0;
@@ -1151,6 +1150,8 @@ ParticleDescriptorInclusion::ParticleDescriptorInclusion(const ParticleDescripto
   vec_ind3j = new int[(_lm + 1) * _lm];
   np_int vec_ind3j_size = (_lm + 1) * _lm;
   for (np_int ii = 0; ii < vec_ind3j_size; ii++) vec_ind3j[ii] = rhs.vec_ind3j[ii];
+  ind3j = new int*[_lm + 1];
+  for (int ii = 0; ii <= _lm; ii++) ind3j[ii] = vec_ind3j + (_lm * ii);
   
   vh = new dcomplex[_ncou * _litpo];
   for (int hi = 0; hi < _ncou * _litpo; hi++) vh[hi] = rhs.vh[hi];
@@ -1191,9 +1192,7 @@ ParticleDescriptorInclusion::ParticleDescriptorInclusion(const ParticleDescripto
     ecscm[ci] = rhs.ecscm[ci];
   }
   v3j0 = new double[_nv3j];
-  for (int vj = 0; vj < _nv3j; vj++) v3j0[vj] = rhs.v3j0[_nv3j];
-  ind3j = new int*[_lm + 1];
-  for (int ii = 0; ii <= _lm; ii++) ind3j[ii] = vec_ind3j + (_lm * ii);
+  for (int vj = 0; vj < _nv3j; vj++) v3j0[vj] = rhs.v3j0[vj];
   rac3j = new double[_lmtpo];
   for (int ri = 0; ri < _lmtpo; ri++) rac3j[ri] = rhs.rac3j[ri];
   // >>> NEEDED BY INCLU <<< //
@@ -1302,6 +1301,96 @@ ParticleDescriptorInclusion::ParticleDescriptorInclusion(const mixMPI *mpidata)
   for (int ai = 0; ai < _nlemt; ai++) at[ai] = vec_at + (ai * _ndm);
 }
 #endif // MPI_VERSION
+
+int ParticleDescriptorInclusion::update_orders(int inner_order, int outer_order) {
+  int result = 0;
+  bool changed_li = false;
+  bool changed_le = false;
+  if (inner_order != _li) {
+    _li = inner_order;
+    changed_li = true;
+    _nlim = _li * (_li + 2);
+    _litpo = _li + _li + 1;
+    _litpos = _litpo * _litpo;
+    _ndi = _nsph * _nlim;
+    _ndit = 2 * _nsph * _nlim;
+    delete[] rmi;
+    delete[] vec_rmi;
+    delete[] rei;
+    delete[] vec_rei;
+    vec_rmi = new dcomplex[_li * _nsph]();
+    rmi = new dcomplex*[_li];
+    vec_rei = new dcomplex[_li * _nsph]();
+    rei = new dcomplex*[_li];
+    for (int ri = 0; ri < _li; ri++) {
+      rmi[ri] = vec_rmi + (_nsph * ri);
+      rei[ri] = vec_rei + (_nsph * ri);
+    }
+    delete[] vh;
+    vh = new dcomplex[_ncou * _litpo]();
+    delete[] vyhj;
+    vyhj = new dcomplex[_ncou * _litpos]();
+  }
+  if (outer_order != le) {
+    _le = outer_order;
+    changed_le = true;
+    _nlem = _le * (_le + 2);
+    _nlemt = 2 * _nlem;
+    delete[] w;
+    delete[] vec_w;
+    vec_w = new dcomplex[_nlemt * 4]();
+    w = new dcomplex*[_nlemt];
+    for (int wi = 0; wi < _nlemt; wi++) w[wi] = vec_w + (4 * wi);
+    delete[] am0m;
+    delete[] vec_am0m;
+    vec_am0m = new dcomplex[_nlemt * _nlemt]();
+    am0m = new dcomplex*[_nlemt];
+    for (int ai = 0; ai < _nlemt; ai++) am0m[ai] = vec_am0m + (ai * _nlemt);
+    delete[] rm0;
+    rm0 = new dcomplex[_le]();
+    delete[] re0;
+    re0 = new dcomplex[_le]();
+    delete[] rmw;
+    rmw = new dcomplex[_le]();
+    delete[] rew;
+    rew = new dcomplex[_le]();
+    delete[] tm;
+    tm = new dcomplex[_le]();
+    delete[] te;
+    te = new dcomplex[_le]();
+    delete[] tm0;
+    tm0 = new dcomplex[_le]();
+    delete[] te0;
+    te0 = new dcomplex[_le]();
+  }
+  if (changed_li || changed_le) {
+    _lm = (_li > _le) ? _li : _le;
+    _lmpo = _lm + 1;
+    _lmtpo = _li + _le + 1;
+    _lmtpos = _lmtpo * _lmtpo;
+    _nv3j = (_lm * (_lm + 1) * (2 * _lm + 7)) / 6;
+    _ndm = 2 * (_nsph  * _nlim + _nlem);
+    delete[] ind3j;
+    delete[] vec_ind3j;
+    vec_ind3j = new int[(_lm + 1) * _lm]();
+    ind3j = new int*[_lm + 1];
+    for (int ii = 0; ii <= _lm; ii++) ind3j[ii] = vec_ind3j + (_lm * ii);
+    delete[] vj0;
+    vj0 = new dcomplex[_nsph * _lmtpo]();
+    delete[] vyj0;
+    vyj0 = new dcomplex[_nsph * _lmtpos]();
+    delete[] v3j0;
+    v3j0 = new double[_nv3j]();
+    delete[] rac3j;
+    rac3j = new double[_lmtpo]();
+    delete[] at;
+    delete[] vec_at;
+    vec_at = new dcomplex[_nlemt * _ndm]();
+    at = new dcomplex*[_nlemt];
+    for (int ai = 0; ai < _nlemt; ai++) at[ai] = vec_at + (ai * _ndm);
+  }
+  return result;
+}
 // >>> End of ParticleDescriptorInclusion class implementation. <<< //
 
 // >>> ParticleDescriptorSphere class implementation. <<< //
diff --git a/src/libnptm/inclu_subs.cpp b/src/libnptm/inclu_subs.cpp
index e2eede6927f1701ca34656ba8cd1a6051baeecdc..12859ab2a1953eb2387fa5d3c9eb804fbb8c4f0b 100644
--- a/src/libnptm/inclu_subs.cpp
+++ b/src/libnptm/inclu_subs.cpp
@@ -493,7 +493,7 @@ void indme(
   delete[] dref;
 }
 
-void instr(ScattererConfiguration *sconf, ParticleDescriptor *c1) {
+void instr(double **rcf, ParticleDescriptor *c1) {
   const int ylm_size = (c1->litpos > c1->lmtpos) ? c1->litpos : c1->lmtpos;
   dcomplex *ylm = new dcomplex[ylm_size]();
   double rx, ry, rz, rr, crth, srth, crph, srph;
@@ -503,7 +503,7 @@ void instr(ScattererConfiguration *sconf, ParticleDescriptor *c1) {
     if (c1->iog[i18] >= i) {
       int nsh = c1->nshl[i18];
       for (int j = 0; j < nsh; j++)
-	c1->rc[i18][j] = sconf->get_rcf(i18, j) * c1->ros[i18];
+	c1->rc[i18][j] = rcf[i18][j] * c1->ros[i18];
     }
   } // i18 loop
   int i = 0;
diff --git a/src/libnptm/outputs.cpp b/src/libnptm/outputs.cpp
index 216d431d1264ed7add96226c795b6a32f651f38c..8c4ecf7df21e3ed3d04320eeac8ec58666d2c510 100644
--- a/src/libnptm/outputs.cpp
+++ b/src/libnptm/outputs.cpp
@@ -4281,22 +4281,22 @@ int InclusionOutputInfo::write_legacy(const std::string &output) {
 		if (isam >= 0) {
 		  fprintf(
 		    p_outfile, "  UNI=(%12.5lE,%12.5lE,%12.5lE)\n",
-		    vec_dir_un[done_dirs],
-		    vec_dir_un[done_dirs + 1],
-		    vec_dir_un[done_dirs + 2]
+		    vec_dir_un[3 * done_dirs],
+		    vec_dir_un[3 * done_dirs + 1],
+		    vec_dir_un[3 * done_dirs + 2]
 		  );
 		  fprintf(
 		    p_outfile, "  UNS=(%12.5lE,%12.5lE,%12.5lE)\n",
-		    vec_dir_uns[done_dirs],
-		    vec_dir_uns[done_dirs + 1],
-		    vec_dir_uns[done_dirs + 2]
+		    vec_dir_uns[3 * done_dirs],
+		    vec_dir_uns[3 * done_dirs + 1],
+		    vec_dir_uns[3 * done_dirs + 2]
 		  );
 		} else { // label 214
 		  fprintf(
 		    p_outfile, "  UN=(%12.5lE,%12.5lE,%12.5lE)\n\n",
-		    vec_dir_un[done_dirs],
-		    vec_dir_un[done_dirs + 1],
-		    vec_dir_un[done_dirs + 2]
+		    vec_dir_un[3 * done_dirs],
+		    vec_dir_un[3 * done_dirs + 1],
+		    vec_dir_un[3 * done_dirs + 2]
 		  );
 		}
 		fprintf(p_outfile, "     SINGLE SCATTERER\n");