diff --git a/config.pri b/config.pri
index 3585baa5ad96c0f2d357e008912b9fa157001511..99d1f938d68578c597b918b5af92aa13d401da9f 100644
--- a/config.pri
+++ b/config.pri
@@ -29,7 +29,7 @@ unix:VTK_LIBPATH      = -L/usr/local/lib
 
 # Pathes
 # -Home Directory
-HOME_DIR        = /home/rzlin/er96apow/git/
+HOME_DIR        = /home/pflaum/UGBlocks
 #HOME_DIR        = ../../ 
 
 # -UGBlocks Directory
diff --git a/program/main.cc b/program/main.cc
index 2ac9d1fe4d07efe6cd06eb055b8cf94f7eb2a969..26f216581971eceb1329a49ffe038b6312817770 100644
--- a/program/main.cc
+++ b/program/main.cc
@@ -6,6 +6,108 @@
 #include "source/ugblock.h"
 
 
+
+/** Kern_matrix
+*** 6 x 6 matrix for rigid body modes
+**/
+Kern_matrix::Kern_matrix() {
+  matrix = new double*[6];
+  for(int i=0;i<6;++i)
+    matrix[i] = new double[6];
+
+  aux_matrix = new double*[6];
+  for(int i=0;i<6;++i)
+    aux_matrix[i] = new double[6];
+  perm = new int[6];
+  b = new double[6];
+  x = new double[6];
+}
+
+Kern_matrix::~Kern_matrix() {
+  for(int i=0;i<6;++i) {
+    delete[](matrix[i]);
+    delete[](aux_matrix[i]);
+  }
+  delete[](matrix);
+  delete[](aux_matrix);
+  delete[](perm);
+  delete[](b);
+  delete[](x);
+}
+
+
+void Calc_weights(Variable<double>& One,
+		  Variable<double>& Xcoord, Variable<double>& Ycoord, Variable<double>& Zcoord,
+		  Kern_matrix& M) {
+			  double weight_const;
+  One          = 1.0;
+  weight_const = sqrt(product(One,One));
+  One          = One / weight_const;
+
+  // erste Zeile
+  M.matrix[0][0] = 1.0;
+  M.matrix[0][1] = 0.0;
+  M.matrix[0][2] = 0.0;
+
+  M.matrix[0][3] = 0.0;
+  M.matrix[0][4] =   product(One,Zcoord);
+  M.matrix[0][5] = - product(One,Ycoord);
+
+  // zweite Zeile
+  M.matrix[1][0] = 0.0;
+  M.matrix[1][1] = 1.0;
+  M.matrix[1][2] = 0.0;
+
+  M.matrix[1][3] = - product(One,Zcoord);
+  M.matrix[1][4] = 0.0;
+  M.matrix[1][5] =   product(One,Xcoord);
+
+  // dritte Zeile
+
+
+  M.matrix[2][0] = 0.0;
+  M.matrix[2][1] = 0.0;
+  M.matrix[2][2] = 1.0;
+
+  M.matrix[2][3] =   product(One,Ycoord);
+  M.matrix[2][4] = - product(One,Xcoord);
+  M.matrix[2][5] = 0.0;
+
+  // vierte Zeile
+  M.matrix[3][0] = 0.0;
+  M.matrix[3][1] = - product(One,Zcoord);
+  M.matrix[3][2] =   product(One,Ycoord);
+
+  M.matrix[3][3] =   product(Zcoord,Zcoord) + product(Ycoord,Ycoord);
+  M.matrix[3][4] = - product(Ycoord,Xcoord);
+  M.matrix[3][5] = - product(Xcoord,Zcoord);
+
+  // fuenfte Zeile
+  M.matrix[4][0] =   product(One,Zcoord);
+  M.matrix[4][1] = 0.0;
+  M.matrix[4][2] = - product(One,Xcoord);
+
+  M.matrix[4][3] = - product(Xcoord,Ycoord);
+  M.matrix[4][4] =   product(Zcoord,Zcoord) + product(Xcoord,Xcoord);
+  M.matrix[4][5] = - product(Ycoord,Zcoord);
+
+  // sechste Zeile
+  M.matrix[5][0] = - product(One,Ycoord);
+  M.matrix[5][1] =   product(One,Xcoord);
+  M.matrix[5][2] = 0.0;
+
+  M.matrix[5][3] = - product(Xcoord,Zcoord);
+  M.matrix[5][4] = - product(Ycoord,Zcoord);
+  M.matrix[5][5] =   product(Ycoord,Ycoord) + product(Xcoord,Xcoord);
+
+  // Calc LR-decomposition
+  int result;
+  result = gauss(1,6,M.matrix,M.aux_matrix,M.perm,M.b,M.x,&(M.signd));
+  if(result!=0)std::cout << " error in gauss: " << result <<std::endl;
+}
+
+
+
 double sinus (double x){
   return sin(x);
 }
diff --git a/program/source/grid/examples_ug.cc b/program/source/grid/examples_ug.cc
index df5070071671b397be50c845aa2a595d5c63ec2a..029ee5ca717061abf5aaefa9f20876b80a08d7c8 100644
--- a/program/source/grid/examples_ug.cc
+++ b/program/source/grid/examples_ug.cc
@@ -109,6 +109,74 @@ Hexahedron::Hexahedron(double lx, double ly, double lz,
   construction_done();
 }
 
+HexahedronRotY::HexahedronRotY(double lx, double ly, double lz, double rx, double ry, double rz, double sa) 
+                                  : UG_WithZdirection(hexahedronUgTyp,2){
+  constructionParameters.resize(7);
+  constructionParameters[0] = lx;
+  constructionParameters[1] = ly;
+  constructionParameters[2] = lz;
+  constructionParameters[3] = rx;
+  constructionParameters[4] = ry;
+  constructionParameters[5] = rz;
+  constructionParameters[6] = sa;
+			 
+  Lz.at(0) = lz;
+  Lz.at(1) = rz;
+  Set_number_points ( 8 ); // 8 an den Ecken
+
+  assert(sa*sa <=1.0);
+  double ca = sqrt(1.0 - sa*sa);
+  
+  double sx = 0.5*(rx-lx);
+  double sz = 0.5*(rz-lz);
+  
+  double ETz =  ca * sz - sa * sx;
+  double ETx =  sa * sz + ca * sx;
+  
+  double WTz =  ca * sz + sa * sx;
+  double WTx =  sa * sz - ca * sx;
+
+  double EDz = -ca * sz - sa * sx;
+  double EDx = -sa * sz + ca * sx;
+  
+  double WDz = -ca * sz + sa * sx;
+  double WDx = -sa * sz - ca * sx;
+
+  double centerX = 0.5*(rx+lx);
+  double centerZ = 0.5*(rz+lz);
+  
+  
+  Set_coordinate_point ( WSDdir3D, D3vector ( centerX + WDx,ly, centerZ + WDz ) );
+  Set_coordinate_point ( ESDdir3D, D3vector ( centerX + EDx,ly, centerZ + EDz ) );
+  Set_coordinate_point ( WNDdir3D, D3vector ( centerX + WDx,ry, centerZ + WDz ) );
+  Set_coordinate_point ( ENDdir3D, D3vector ( centerX + EDx,ry, centerZ + EDz ) );
+
+  Set_coordinate_point ( WSTdir3D, D3vector ( centerX + WTx,ly, centerZ + WTz ) );
+  Set_coordinate_point ( ESTdir3D, D3vector ( centerX + ETx,ly, centerZ + ETz ) );
+  Set_coordinate_point ( WNTdir3D, D3vector ( centerX + WTx,ry, centerZ + WTz ) );
+  Set_coordinate_point ( ENTdir3D, D3vector ( centerX + ETx,ry, centerZ + ETz ) );
+  
+  Set_number_hexahedra ( 1 );
+  Set_hexahedron ( 0, WSDdir3D, ESDdir3D, WNDdir3D, ENDdir3D, WSTdir3D, ESTdir3D, WNTdir3D, ENTdir3D );
+
+  construction_hexahedron_points_done();
+  // set all directions constant
+  Give_not_constant_directions()->Mark_x_as_not_constant_at ( 0,false );
+  Give_not_constant_directions()->Mark_y_as_not_constant_at ( 0,false );
+  Give_not_constant_directions()->Mark_z_as_not_constant_at ( 0,false );
+
+  // no transformations of the edges and faces
+  construction_done();
+}
+
+void HexahedronBasis::PrintLengthEdgesHere(std::vector<D3vector> pointsHere) {
+   cout << " Print Hexaeder info of UGBlocks. " << endl;
+   cout << " -------------------------------- " << endl;
+   cout << " L1: " << D3VectorNorm(pointsHere.at(WSDdir3D) - pointsHere.at(ESDdir3D)) << endl;
+   cout << " L1: " << D3VectorNorm(pointsHere.at(WSDdir3D) - pointsHere.at(WNDdir3D)) << endl;
+   cout << " L1: " << D3VectorNorm(pointsHere.at(WSDdir3D) - pointsHere.at(WSTdir3D)) << endl;   
+}
+
 Hexahedron::Hexahedron ( double l_x, double l_y, double l_z ) : UG_WithZdirection(hexahedronUgTyp,2) {  
   Lz.at(0) = 0.0; 
   Lz.at(1) = l_z; 
diff --git a/program/source/grid/examples_ug.h b/program/source/grid/examples_ug.h
index fc9da5d139e068099caaf607bfa494d49719fe63..885502577f490cafca50c01f3202566501bbf32c 100644
--- a/program/source/grid/examples_ug.h
+++ b/program/source/grid/examples_ug.h
@@ -20,13 +20,18 @@
 #define EXAMPLES_UG_H
 #include <vector>
 
+class HexahedronBasis  {
+protected: 
+  void PrintLengthEdgesHere(std::vector<D3vector> pointsHere);  
+};
+
 /** \addtogroup GridGeneration **/
 /* @{ */   
 /**
  * Normaler Hexaeder
  * 
  * **/
-class Hexahedron : public UG_WithZdirection {
+class Hexahedron : public HexahedronBasis , public UG_WithZdirection{
  public:
    /**
     * [0,lx] x [0,ly] x [0,lz]
@@ -37,7 +42,28 @@ class Hexahedron : public UG_WithZdirection {
     */
   Hexahedron(double lx, double ly, double lz,
 	     double rx, double ry, double rz);
+  
+  void PrintLengthEdges() { PrintLengthEdgesHere(getVectorOfPoints()); }
+  
   ~Hexahedron(){};
+
+};
+
+/**
+ * Hexaeder rotated Y
+ * 
+ * **/
+class HexahedronRotY : public HexahedronBasis, public UG_WithZdirection {
+ public:
+   /**
+    * [lx,rx] x [ly,ry] x [lz,rz]  und rotiert um das Zentrum ((lx+rx)/2, (ly+ry)/2, (lz+rz)/2)
+    */
+  HexahedronRotY(double lx, double ly, double lz,
+	         double rx, double ry, double rz, double sinRotY);
+
+  void PrintLengthEdges() { PrintLengthEdgesHere(getVectorOfPoints()); }  
+  
+  ~HexahedronRotY(){};
 };
 
 /**
diff --git a/program/source/grid/examples_ug_optics.h b/program/source/grid/examples_ug_optics.h
index a9cb3af86ced3858420060392f6b8398db983ca6..9c2e3284dca707d753bcb8615f6b5156623c79b1 100644
--- a/program/source/grid/examples_ug_optics.h
+++ b/program/source/grid/examples_ug_optics.h
@@ -3,11 +3,17 @@
 #include <vector>
 
 
+class GeometryWithBoundaryPoints {
+public:      
+    std::vector<D3vector> getBoundaryPoints(){return boundaryPoints;}
+protected:
+     std::vector<D3vector> boundaryPoints;     
+};
 
 
 /** \addtogroup GridGeneration **/
 /* @{ */   
-class Lens_Geometry : public Unstructured_grid {
+class Lens_Geometry :  public Unstructured_grid {
  public:
   Lens_Geometry(double Radius, double thickness, double curvatureLeft, double curvatureRight, double offsetX, double offsetY, double offsetZ, bool inner_grid_arched = false, double radius = 0.0);
   ~Lens_Geometry(){};
@@ -20,7 +26,7 @@ class Lens_Geometry : public Unstructured_grid {
 
 };
 
-class Lens_Geometry_Quad : public Unstructured_grid {
+class Lens_Geometry_Quad : public GeometryWithBoundaryPoints, public Unstructured_grid {
     public:
     Lens_Geometry_Quad(double Radius, double thickness, double curvatureLeft, double curvatureRight, double offsetX, double offsetY, double offsetZ, bool inner_grid_arched = false, double radius = 0.0, double cut_edge_from_left = 0, double cut_edge_from_right = 0);
     ~Lens_Geometry_Quad(){};
@@ -31,8 +37,7 @@ class Lens_Geometry_Quad : public Unstructured_grid {
     double getOffsetY(){return offsetY_;};
     double getOffsetZ(){return offsetZ_;};
     double getFocalLength(){return focalLength_;};
-    private:
-
+    private:      
     double Radius_;
     double radius_;
     double thickness_;
@@ -42,7 +47,7 @@ class Lens_Geometry_Quad : public Unstructured_grid {
     double focalLength_;
 };
 
-class Lens_Geometry_cutted_edges : public Unstructured_grid {
+class Lens_Geometry_cutted_edges : public GeometryWithBoundaryPoints, public Unstructured_grid {
     public:
      Lens_Geometry_cutted_edges(double RadiusLeft, double RadiusRight, double MechanicalRadiusLeft,double MechanicalRadiusRight, double thickness, double curvatureLeft, double curvatureRight, double offsetX, double offsetY, double offsetZ, bool inner_grid_arched = false, double radius = 0.0);
     ~Lens_Geometry_cutted_edges(){};
diff --git a/program/source/grid/ug.cc b/program/source/grid/ug.cc
index 48a82a1d78c9b957da4288c861de267c0836c2ca..18b5329d6dda885035271a357cb8b5f55f25c36f 100644
--- a/program/source/grid/ug.cc
+++ b/program/source/grid/ug.cc
@@ -209,6 +209,15 @@ void Unstructured_grid::Set_coordinate_point(int id, D3vector coord) {
   points[id].Set_coordinate(coord);
 }
 
+std::vector<D3vector> Unstructured_grid::getVectorOfPoints() {
+   std::vector<D3vector> pointsReturn;
+   pointsReturn.resize(num_points);
+   for(int i=0;i<num_points;++i) {
+       pointsReturn.at(i) = points[i].Give_coordinate();
+   }
+   return pointsReturn;
+}
+
 void Unstructured_grid::Set_number_hexahedra(int num_hexahedra_) {
   // Set informations of hexahedra
   num_hexahedra = num_hexahedra_;
diff --git a/program/source/grid/ug.h b/program/source/grid/ug.h
index 19c03db5c240717c7f1ab02a26212f9193704c9e..a08c48b5677e33cc1e57bd5d9ab4b7169dfa7efd 100644
--- a/program/source/grid/ug.h
+++ b/program/source/grid/ug.h
@@ -121,7 +121,8 @@ class Zordering {
 //           main class describing an unstructured grid
 //////////////////////////////////////////////////////////////////
 
-enum TypeOfUG { noWithZTyp = 0, hexahedronUgTyp = 1, cylinderUgTyp = 2, cylinderListUgTyp = 3, hexahedronAdaptiveUgTyp = 4, hexahedronListUgTyp = 5,hexahedronListTestUgTyp = 6, lensUgTyp = 7  };
+enum TypeOfUG { noWithZTyp = 0, hexahedronUgTyp = 1, cylinderUgTyp = 2, cylinderListUgTyp = 3, hexahedronAdaptiveUgTyp = 4, hexahedronListUgTyp = 5,hexahedronListTestUgTyp = 6, 
+                lensUgTyp = 7 }; 
 
 // This is base class of every object which needs data from ug Unstructured_grid
 class Object_based_on_ug {
@@ -294,12 +295,14 @@ class Unstructured_grid : public Partitioning {
     Zordering* Give_Zordering() { return zordering; }
 
     double* Get_pointer_global_data() { return pointer_global_data; }
-    std::vector<D3vector> getBoundaryPoints(){return boundaryPoints;}
+    
+    std::vector<D3vector> getVectorOfPoints();
+
     int sizeGlobalPointerData() { return size_pointer_global_data; } 
   protected:
 	 // pointer for global objects used in coordinate transformations
      double* pointer_global_data;
-     std::vector<D3vector> boundaryPoints;
+
      int size_pointer_global_data;
      
      TypeOfUG typFuerSlice;
diff --git a/program/source/interpol/interpol.cc b/program/source/interpol/interpol.cc
index 15722aa4fa473b0da1deb5d39723542a40181481..b95dec6463eb0e1f7094cfda5e739a01506e467b 100644
--- a/program/source/interpol/interpol.cc
+++ b/program/source/interpol/interpol.cc
@@ -5163,3 +5163,150 @@ void Interpolate_on_block_grid_from_pointinterpolator::interpolate(Variable<doub
 }
 
 
+void Interpolate_fromOneXZhexaeder::Copy(Variable<double> &toData, Variable<double> &fromData) {  
+//    toData = fromData;
+//    return;
+  
+    init(fromData);
+    fromData.UpdateHexahedra();
+    
+    Blockgrid* bg = toData.Give_blockgrid();
+    
+    X_coordinate X(*bg);
+    Y_coordinate Y(*bg);
+    Z_coordinate Z(*bg);
+    
+    Functor3<double,double,Interpolate_fromOneXZhexaeder> interpolRotated(this);
+    
+    toData = interpolRotated(X,Y,Z);
+}
+
+
+void Interpolate_fromOneXZhexaeder::Add( Variable<double> &toData, Variable<double> &addData) {
+     init(addData);
+     addData.UpdateHexahedra();     
+     
+     Blockgrid* bg = toData.Give_blockgrid();     
+     
+     X_coordinate X(*bg);
+     Y_coordinate Y(*bg);
+     Z_coordinate Z(*bg);
+    
+     Functor3<double,double,Interpolate_fromOneXZhexaeder> interpolRotated(this);
+ 
+//TEST NOW     
+     toData = toData + interpolRotated(X,Y,Z);     
+}
+
+
+
+double Interpolate_fromOneXZhexaeder::evaluate(double px, double py, double pz) {
+   double xP = px - xOrg;
+   double yP = py - yOrg;   
+   double zP = pz - zOrg;  
+  
+   xP = xP * 1.0000001;
+   yP = yP * 1.0000001;
+   zP = zP * 1.0000001; 
+   
+   double zRot =   zP * cosA + xP * sinA;
+   double xRot = - zP * sinA + xP * cosA;
+
+//   if((zP<=0.0)   ||  (yP<=0.0)   ||  (xP<=0.0))   return defaultVal;
+//   if((zP>=LZ )   ||  (yP>=LY )   ||  (xP>=LX ))   return defaultVal;   
+   
+   int k = int(zRot / hZ);
+   int j = int(yP   / hY);
+   int i = int(xRot / hX);
+      
+   if(k<0) { if(k>-0.00001) k=0;  else return defaultVal; }
+   if(j<0) { if(j>-0.00001) j=0;  else return defaultVal; }
+   if(i<0) { if(i>-0.00001) i=0;  else return defaultVal; }
+
+   if(k>=Nz) { if(k<=Nz+0.00001) k=Nz-1;  else return defaultVal; }
+   if(j>=Ny) { if(j<=Ny+0.00001) j=Ny-1;  else return defaultVal; }
+   if(i>=Nx) { if(i<=Nx+0.00001) i=Nx-1;  else return defaultVal; }
+
+//cout << " i: " << i << " j: " << j << " k: " << k
+//     << " xRot/hX: " << xRot/hX << " yP/hY: " << yP/hY << " zRot / hZ: " << zRot/hZ << endl;
+
+   double uWSD = hexFrom[((Ny+1)*k+j)*(Nx+1)+i];
+   double uESD = hexFrom[((Ny+1)*k+j)*(Nx+1)+i+1];
+   double uWND = hexFrom[((Ny+1)*k+j+1)*(Nx+1)+i];
+   double uEND = hexFrom[((Ny+1)*k+j+1)*(Nx+1)+i+1];
+   double uWST = hexFrom[((Ny+1)*(k+1)+j)*(Nx+1)+i];
+   double uEST = hexFrom[((Ny+1)*(k+1)+j)*(Nx+1)+i+1];
+   double uWNT = hexFrom[((Ny+1)*(k+1)+j+1)*(Nx+1)+i];
+   double uENT = hexFrom[((Ny+1)*(k+1)+j+1)*(Nx+1)+i+1];
+
+//   assert(((Ny+1)*(k+1)+j+1)*(Nx+1)+i+1 < (Nx+1)*(Ny+1)*(Nz+1));
+   
+   double fz = zRot/hZ - k;
+   double fy =   yP/hY - j;
+   double fx = xRot/hX - i;
+   
+   return ((uWSD * (1.0-fx) + uESD * fx) * (1.0-fy) +
+           (uWND * (1.0-fx) + uEND * fx) * fy         ) * (1.0-fz) +
+          ((uWST * (1.0-fx) + uEST * fx) * (1.0-fy) +
+           (uWNT * (1.0-fx) + uENT * fx) * fy         ) * fz;
+      
+   return hexFrom[((Ny+1)*k+j)*(Nx+1)+i];
+}
+
+void Interpolate_fromOneXZhexaeder::init(Variable<double> &fromData) {
+   Blockgrid* bg = fromData.Give_blockgrid();
+   hexFrom = fromData.Give_pointer_data_hexahedra()[0];
+   
+   Unstructured_grid* ug = bg->Give_unstructured_grid();
+   Hexahedron_el* hex = ug->Give_hexahedron(0);
+
+//   enum dir3D_sons { WSDdir3D, ESDdir3D, WNDdir3D, ENDdir3D, WSTdir3D, ESTdir3D, WNTdir3D, ENTdir3D };
+   D3vector pWSD = hex->Give_coord(WSDdir3D); 
+   D3vector pWST = hex->Give_coord(WSTdir3D); 
+   D3vector pESD = hex->Give_coord(ESDdir3D); 
+   D3vector pWND = hex->Give_coord(WNDdir3D); 
+   
+   xOrg = pWSD.x;
+   yOrg = pWSD.y;   
+   zOrg = pWSD.z;
+   
+   double xZ = pWST.x - xOrg;
+   double zZ = pWST.z - zOrg;
+
+   double xX = pESD.x - xOrg;
+   double zX = pESD.z - zOrg;
+   
+   LY = pWND.y - yOrg; 
+   
+   LZ = sqrt(xZ*xZ+zZ*zZ);
+   LX = sqrt(xX*xX+zX*zX);
+   
+   cosA = zZ / LZ;
+   sinA = xZ / LZ;
+
+   Nx = bg->Give_Nx_hexahedron(0);
+   Ny = bg->Give_Ny_hexahedron(0);
+   Nz = bg->Give_Nz_hexahedron(0);
+   
+   hX = LX / Nx;
+   hY = LY / Ny;
+   hZ = LZ / Nz;
+   
+/*   
+cout << " hX: " << hX  << " hY: " << hY  << " hZ: " << hZ 
+     << " Nx: " << Nx  << " Ny: " << Ny  << " Nz: " << Nz 
+     << " LX: " << LX  << " LY: " << LY  << " LZ: " << LZ << endl
+     << " cosA: " << cosA  << " sinA: " << sinA 
+     << endl;
+  */
+
+}
+
+/*
+ private:
+    double xOrg;
+    double zOrg;
+    
+    double cosA;
+    double sinA;    
+*/
diff --git a/program/source/interpol/interpol.h b/program/source/interpol/interpol.h
index 5a8271155bdddb7e451ae6ff6abda21f7a179367..77b33cc16eac90f26f907d6b55d7f41b6f8a164a 100644
--- a/program/source/interpol/interpol.h
+++ b/program/source/interpol/interpol.h
@@ -30,6 +30,7 @@
 // 2. Interpolate from  blockgrid  to  blockgrid
 // 3. Interpolate from Variable on a blockgrid to any point using structured intermediate grid
 // 4. Interpolate from blockgrid direct to any point
+// 5. Interpolate from xz-rotated Hexaeder Block
 /////////////////////////////////////////////////////////////
 
 /////////////////////////////////////////////////////////////
@@ -622,7 +623,50 @@ DTyp Interpolate_direct::evaluateSurface(Variable<DTyp> &u)
 }
 
 
+/////////////////////////////////////////////////////////////
+// 5. Interpolate from xz-rotated Hexaeder Block
+/////////////////////////////////////////////////////////////
 
 
+/** \addtogroup InterpolationOperators **/
+/* @{ */
+/**
+ * Interpolate from a single xz-rotated Hexaeder Block
+***/
+class Interpolate_fromOneXZhexaeder {
+ public:
+    Interpolate_fromOneXZhexaeder(double defaultValue) { defaultVal = defaultValue; };
+
+    void Copy(Variable<double> &toData, Variable<double> &fromData);
+    void Add( Variable<double> &toData, Variable<double> &addData);
+
+    double evaluate(double px, double py, double pz);       
+    
+ private:
+    void init(Variable<double> &fromData);
+    
+    double defaultVal;
+    
+    double xOrg;
+    double yOrg;    
+    double zOrg;
+    
+    double LZ;
+    double LY;    
+    double LX;
+    
+    int Nz;
+    int Ny;        
+    int Nx;    
+
+    
+    double hZ;
+    double hY;    
+    double hX;    
+    double *hexFrom;
+
+    double cosA;
+    double sinA;    
+};
 
 #endif // INTERPOL_H
diff --git a/program2D/source/extemp/interpolateFrom3D.cc b/program2D/source/extemp/interpolateFrom3D.cc
index b66dd60a9485d5b80adf42c5952d3ad0684cbf8b..239aa81208f073e3d78f0bf2649ae4a486901761 100644
--- a/program2D/source/extemp/interpolateFrom3D.cc
+++ b/program2D/source/extemp/interpolateFrom3D.cc
@@ -168,6 +168,11 @@ void IteratorZDirection::endBlock(int numBlock) {
   else              z_Wert = zRight - hz;
 }
 
+bool IteratorZDirection::nextDirection(bool right) {
+     if(right) return next();
+     return previous();
+}
+
 bool IteratorZDirection::next() {  
    if(k==Nz) {
      if(nummernBloecke == nummerBlock+1) return false;
@@ -202,6 +207,11 @@ bool IteratorZDirection::previous() {
    return true;
 }
 
+void IteratorZDirection::gotoStartDirection(bool right) {
+   if(right) gotoFront();
+   else      gotoEnd();
+}
+
 void IteratorZDirection::gotoFront() {
   index = 0;
    //Start-Werte setzen:
diff --git a/program2D/source/extemp/interpolateFrom3D.h b/program2D/source/extemp/interpolateFrom3D.h
index 84e4bb54221a1a589d32fb15e4c2df13d18aeea1..69556bd5aec6cd44c5b1ff9fd0d980576e64e9b7 100644
--- a/program2D/source/extemp/interpolateFrom3D.h
+++ b/program2D/source/extemp/interpolateFrom3D.h
@@ -66,8 +66,10 @@ public:
    bool next(); ///> nächster slice in z-Richtung
    bool has_next(); ///> true falls es nächsten slice in z-Richtung gibt   
    bool previous(); ///> vorheriger slice in z-Richtung
+   bool nextDirection(bool right); ///> nächster oder vorheriger slice in z-Richtung, nächster falls right==true
    void gotoFront(); ///> geh zum ersten slice in z-Richtung, dies ist default beim constructor
    void gotoEnd(); ///> geh zum letzten slice in z-Richtung
+   void gotoStartDirection(bool right); ///> geh zum start slice in z-Richtung in Richtung right   
    
    int get_k() { return index; } ///> globaler NummerierungsIndex: 0, ... , getSize()-1
    int getSize()  { return totalNumberSlices; } ///> maximale Anzahl der indizes