diff --git a/program/source/interpol/interpol.cc b/program/source/interpol/interpol.cc
index 4d6108ce3ab1aa8179772a538a61104364945bc6..47dc4acd50c68fcbfa6eb8592c1be98b8f7909b2 100644
--- a/program/source/interpol/interpol.cc
+++ b/program/source/interpol/interpol.cc
@@ -111,9 +111,241 @@ Interpolate_on_structured_grid::~Interpolate_on_structured_grid() {
   delete[] ids_k;
 
   delete[] typ_tet;
-  delete[] lambda;
+    delete[] lambda;
 }
 
+void Interpolate_on_structured_grid::update_Interpolate_on_structured_grid(Blockgrid &blockgrid_)
+{
+        int Nx, Ny, Nz;
+        int typ;
+
+        int ilmin, jlmin, klmin;
+        int ilmax, jlmax, klmax;
+
+        double factor = 0.1;
+        //  double factor = 0.00001;
+
+        D3vector lam;
+
+
+
+          //Variable<double> coordXYZ(*blockgrid);
+          X_coordinate Xc(blockgrid_);
+          Y_coordinate Yc(blockgrid_);
+          Z_coordinate Zc(blockgrid_);
+          //D3vector pWSD, pENT;
+          pWSD.x = Minimum(Xc);    pWSD.y = Minimum(Yc);    pWSD.z = Minimum(Zc);
+          pENT.x = Maximum(Xc);    pENT.y = Maximum(Yc);    pENT.z = Maximum(Zc);
+
+        blockgrid = &blockgrid_;
+        ug = blockgrid->Give_unstructured_grid();
+
+
+
+        if(nx>1)
+          hx = (pENT.x - pWSD.x) / (nx-1);
+        else
+          hx = 1.0;
+        if(ny>1)
+          hy = (pENT.y - pWSD.y) / (ny-1);
+        else
+          hy = 1.0;
+        if(nz>1)
+          hz = (pENT.z - pWSD.z) / (nz-1);
+        else
+          hz = 1.0;
+
+        int num_total = nx * ny * nz;
+
+        D3vector cWSD, cESD;
+        D3vector cWND, cEND;
+
+        D3vector cWST, cEST;
+        D3vector cWNT, cENT;
+
+        D3vector boxWSD, boxENT;
+
+        D3vector ploc;
+
+//        ids_hex = new int[num_total];
+
+//        ids_i = new int[num_total];
+//        ids_j = new int[num_total];
+//        ids_k = new int[num_total];
+
+//        typ_tet = new int[num_total];
+
+//        lambda = new D3vector[num_total];
+
+        for(int i=0;i<num_total;++i) ids_hex[i] = -1;
+
+        for(int id_hex=0;id_hex<ug->Give_number_hexahedra();++id_hex) {
+            Nx = blockgrid->Give_Nx_hexahedron(id_hex);
+            Ny = blockgrid->Give_Ny_hexahedron(id_hex);
+            Nz = blockgrid->Give_Nz_hexahedron(id_hex);
+
+            for(int k=0;k<Nz;++k)
+          for(int j=0;j<Ny;++j)
+            for(int i=0;i<Nx;++i) {
+                  // corner points of general hex-cell
+              cWSD = blockgrid->Give_coord_hexahedron(id_hex,i,  j,  k  );
+              cESD = blockgrid->Give_coord_hexahedron(id_hex,i+1,j  ,k  );
+              cWND = blockgrid->Give_coord_hexahedron(id_hex,i,  j+1,k  );
+              cEND = blockgrid->Give_coord_hexahedron(id_hex,i+1,j+1,k  );
+
+              cWST = blockgrid->Give_coord_hexahedron(id_hex,i,  j,  k+1);
+              cEST = blockgrid->Give_coord_hexahedron(id_hex,i+1,j  ,k+1);
+              cWNT = blockgrid->Give_coord_hexahedron(id_hex,i,  j+1,k+1);
+              cENT = blockgrid->Give_coord_hexahedron(id_hex,i+1,j+1,k+1);
+
+                  // bounding box calculation
+              boxWSD.x = MIN(MIN(MIN(cWSD.x,cESD.x),MIN(cWND.x,cEND.x)),
+                     MIN(MIN(cWST.x,cEST.x),MIN(cWNT.x,cENT.x))) - factor *hx;
+              boxWSD.y = MIN(MIN(MIN(cWSD.y,cESD.y),MIN(cWND.y,cEND.y)),
+                     MIN(MIN(cWST.y,cEST.y),MIN(cWNT.y,cENT.y))) - factor *hy;
+              boxWSD.z = MIN(MIN(MIN(cWSD.z,cESD.z),MIN(cWND.z,cEND.z)),
+                     MIN(MIN(cWST.z,cEST.z),MIN(cWNT.z,cENT.z))) - factor *hz;
+
+              boxENT.x = MAX(MAX(MAX(cWSD.x,cESD.x),MAX(cWND.x,cEND.x)),
+                     MAX(MAX(cWST.x,cEST.x),MAX(cWNT.x,cENT.x))) + factor *hx;
+              boxENT.y = MAX(MAX(MAX(cWSD.y,cESD.y),MAX(cWND.y,cEND.y)),
+                     MAX(MAX(cWST.y,cEST.y),MAX(cWNT.y,cENT.y))) + factor *hy;
+              boxENT.z = MAX(MAX(MAX(cWSD.z,cESD.z),MAX(cWND.z,cEND.z)),
+                     MAX(MAX(cWST.z,cEST.z),MAX(cWNT.z,cENT.z))) + factor *hz;
+
+              // calculation of indices of a collection of cells of structured grid which contains bounding box
+              ilmin = Ganzzahliger_Anteil((boxWSD.x - pWSD.x) / hx);
+              jlmin = Ganzzahliger_Anteil((boxWSD.y - pWSD.y) / hy);
+              klmin = Ganzzahliger_Anteil((boxWSD.z - pWSD.z) / hz);
+
+
+              ilmax = Ganzzahliger_Anteil((boxENT.x - pWSD.x) / hx);
+              jlmax = Ganzzahliger_Anteil((boxENT.y - pWSD.y) / hy);
+              klmax = Ganzzahliger_Anteil((boxENT.z - pWSD.z) / hz);
+
+              /*
+              cout << " indices: "
+               << " ilmin: " << ilmin
+               << " jlmin: " << jlmin
+               << " klmin: " << klmin
+               << " ilmax: " << ilmax
+               << " jlmax: " << jlmax
+               << " klmax: " << klmax
+               << " boxWSD.x: " << boxWSD.x
+               << " cWSD.x: " << cWSD.x
+               << " Nx: " <<  Nx
+               << endl;
+              */
+              /*
+      bool now;
+      if(boxWSD.z < 0 && boxENT.z > 0.0 && boxWSD.y < 0.5 && boxENT.y > 0.5 && boxWSD.x < 1.0 && boxENT.x > 1.0 ) {
+        cout << "\n \n WSD   : ";  boxWSD.Print();
+        cout << "\n ENT  : ";  boxENT.Print();
+        now = true;
+       }
+       else now = false;
+
+
+       cout << " tt: " << boxWSD.x << " " << pWSD.x << " " << hx << endl;
+       cout << (boxWSD.x - pWSD.x) << endl;
+
+       cout << " z: " << 0.1 << " g: " << Ganzzahliger_Anteil(0.1) << endl;
+       cout << " z: " << -0.1 << " g: " << Ganzzahliger_Anteil(-0.1) << endl;
+
+       cout << " z: " << 5.1 << " g: " << Ganzzahliger_Anteil(5.1) << endl;
+       cout << " z: " << -5.1 << " g: " << Ganzzahliger_Anteil(-5.1) << endl;
+              */
+
+              if(ilmin<0) ilmin=0;
+              if(jlmin<0) jlmin=0;
+              if(klmin<0) klmin=0;
+
+              for(int il = ilmin; (il <= ilmax) && (il < nx);++il)
+                for(int jl = jlmin; (jl <= jlmax) && (jl < ny);++jl)
+              for(int kl = klmin; (kl <= klmax) && (kl < nz);++kl) {
+
+                ploc = D3vector(il * hx, jl * hy, kl * hz) + pWSD;
+
+                //		  cout << "HI" << endl;
+
+                typ = -1;
+
+                lam = lambda_of_p_in_tet(ploc,cWND,cWNT,cWST,cEST);
+                if(contained_in_tet(lam)) typ=0;
+                else {
+                  lam = lambda_of_p_in_tet(ploc,cEST,cWND,cWST,cESD);
+                  if(contained_in_tet(lam)) typ=1;
+                  else {
+                    lam = lambda_of_p_in_tet(ploc,cWND,cWSD,cWST,cESD);
+                    if(contained_in_tet(lam)) typ=2;
+                    else {
+                  lam = lambda_of_p_in_tet(ploc,cEST,cWND,cESD,cEND);
+                  if(contained_in_tet(lam)) typ=3;
+                  else {
+                    lam = lambda_of_p_in_tet(ploc,cENT,cWNT,cEST,cEND);
+                    if(contained_in_tet(lam)) typ=4;
+                    else {
+                      lam = lambda_of_p_in_tet(ploc,cWNT,cWND,cEST,cEND);
+                      if(contained_in_tet(lam)) typ=5;
+                    }
+                  }
+                    }
+                  }
+                }
+
+                /*
+                cout << " typ " << typ << id_hex
+                     << " il: " << il
+                     << " jl: " << jl
+                     << " kl: " << kl
+                     << endl;
+                */
+
+                if(typ!=-1) {
+                  int ind_global;
+                  ind_global = il+nx*(jl+ny*kl);
+                  bool stop;
+                  stop=false;
+
+                  if(ids_hex[ind_global]!=-1) {
+                    stop=new_lam_worse(lambda[ind_global],lam);
+                  }
+
+                  if(stop==false) {
+                    ids_hex[ind_global] = id_hex;
+                    ids_i[ind_global] = i;
+                    ids_j[ind_global] = j;
+                    ids_k[ind_global] = k;
+
+                    typ_tet[ind_global] = typ;
+
+                    lambda[ind_global] = lam;
+                  }
+                  //go_on = false;
+                }
+
+
+              }
+            }
+        }
+
+
+        for(int i=0;i<num_total;++i) {
+          if(ids_hex[i]==-1) {
+            // wir nehmen default value!!
+            /*
+            cout << i
+             << " Error: Interpolate_on_structured_grid: I cannot interpolate all data!"
+             << endl;
+            ids_hex[i] = 0;
+            */
+          }
+          else {
+            //cout << i << " Interpolate_on_structured_grid: o.k.!" << endl;
+          }
+        }
+      }
+
 Interpolate_on_structured_grid::Interpolate_on_structured_grid(int nx_, int ny_, int nz_,
                                    D3vector pWSD, D3vector pENT,
                                    Blockgrid& blockgrid_) {
@@ -1220,6 +1452,15 @@ void PointInterpolator::smoothGrid()
     }
 }
 
+void PointInterpolator::resetInterpolator()
+{
+    for (int iter = 0 ; iter < nx*ny*nz;iter++)
+    {
+        dataCounter[iter] = 0;
+        data[iter] = defaultInterpolation;
+    }
+}
+
 void PointInterpolator::normToNumberOfWritings()
 {
     for (int iter = 0 ; iter < nx*ny*nz;iter++)
@@ -1396,6 +1637,27 @@ PointInterpolator::~PointInterpolator() {
     delete[] data;
 }
 
+void PointInterpolator::updatePointInterpolator(Interpolate_on_structured_grid *intermediateGrid)
+{
+
+    nx = intermediateGrid->nx;
+    ny = intermediateGrid->ny;
+    nz = intermediateGrid->nz;
+
+    for (int iter = 0 ; iter < nx*ny*nz;iter++)
+    {
+        data[iter]=0.0;
+        dataCounter[iter]=0;
+    }
+
+    pENT = intermediateGrid->pENT;
+    pWSD = intermediateGrid->pWSD;
+
+    hx = intermediateGrid->getHx();
+    hy = intermediateGrid->getHy();
+    hz = intermediateGrid->getHz();
+}
+
 
 
 void Interpolate_direct::init()
diff --git a/program/source/interpol/interpol.h b/program/source/interpol/interpol.h
index 0dd1f17009fc3e0b6e64d40a31b5acb36edb6cdb..18cd10ce5065c199270f7e01251ae1a2685e5812 100644
--- a/program/source/interpol/interpol.h
+++ b/program/source/interpol/interpol.h
@@ -77,6 +77,8 @@ class Interpolate_on_structured_grid {
   template <class DTyp>
     void interpolate(Variable<DTyp>& u, DTyp* data, DTyp defaultInterpolation);
 
+    void update_Interpolate_on_structured_grid(Blockgrid& blockgrid_);
+
     int getNx(){return nx;}
     int getNy(){return ny;}
     int getNz(){return nz;}
@@ -341,9 +343,12 @@ class PointInterpolator {
    * @param coord_x, coord_y, coord_z, Koordinaten des Punktes
    * @return interpolierter Wert
    **/
+
+  void updatePointInterpolator(Interpolate_on_structured_grid* intermediateGrid);
   double evaluate(double coord_x, double coord_y, double coord_z);
   std::vector<double> evaluateGradient(double coord_x, double coord_y, double coord_z);
   void smoothGrid();
+  void resetInterpolator();
 		 
   void normToNumberOfWritings();
   void writeOnInterpolatedGrid(double coord_x, double coord_y, double coord_z, double value);
@@ -353,9 +358,9 @@ class PointInterpolator {
 
   void QPrint_VTK(QString DateiName);
 
-  double shiftx, shifty, shiftz;
-  double rotationx, rotationy, rotationz;
 private:
+  double shiftx{0}, shifty{0}, shiftz{0};
+  double rotationx{0}, rotationy{0}, rotationz{0};
   int nx, ny, nz;
   double hx, hy, hz;
   Interpolate_on_structured_grid* interpolatorStructured;