diff --git a/src/Cell-Problem.cc b/src/Cell-Problem.cc
index caf7ceb383ef71af5b23c9df8e91ecf980a3bc03..82b4a5edd95488bb70934e4aa3469766feb96f2b 100644
--- a/src/Cell-Problem.cc
+++ b/src/Cell-Problem.cc
@@ -218,8 +218,8 @@ void computeElementStiffnessMatrix(const LocalView& localView,
   ///////////////////////////////////////////////
   // Basis for R_sym^{2x2}            // wird nicht als Funktion benötigt da konstant...
   //////////////////////////////////////////////
-  MatrixRT G_1 {{1.0, 0.0, 0.0}, {0.0, 0.0, 0.0}, {0.0, 0, 0.0}};
-  MatrixRT G_2 {{0.0, 0.0, 0.0}, {0.0, 1.0, 0.0}, {0, 0.0, 0.0}};
+  MatrixRT G_1 {{1.0, 0.0, 0.0}, {0.0, 0.0, 0.0}, {0.0, 0.0, 0.0}};
+  MatrixRT G_2 {{0.0, 0.0, 0.0}, {0.0, 1.0, 0.0}, {0.0, 0.0, 0.0}};
   MatrixRT G_3 {{0.0, 1.0/sqrt(2.0), 0.0}, {1.0/sqrt(2.0), 0.0, 0.0}, {0.0, 0.0, 0.0}};
   std::array<MatrixRT,3 > basisContainer = {G_1, G_2, G_3};
 
@@ -254,17 +254,22 @@ void computeElementStiffnessMatrix(const LocalView& localView,
         MatrixRT defGradientV(0);
         defGradientV[l][0] = gradients[j][0];                       // Y
         defGradientV[l][1] = gradients[j][1];                       //X2
-        defGradientV[l][2] = (1.0/gamma)*gradients[j][2];           //X3
+//         defGradientV[l][2] = (1.0/gamma)*gradients[j][2];           //X3
+        defGradientV[l][2] = gradients[j][2];           //X3
+        
+        defGradientV = crossSectionDirectionScaling((1/gamma),defGradientV);
         // "phi*phi"-part
         for (size_t k=0; k < dimWorld; k++)
-          for (size_t i=0; i < nSf; i++)
-          {
+        for (size_t i=0; i < nSf; i++)
+        {
             // (scaled) Deformation gradient of the ansatz basis function
             MatrixRT defGradientU(0);
             defGradientU[k][0] = gradients[i][0];                       // Y
             defGradientU[k][1] = gradients[i][1];                       //X2
-            defGradientU[k][2] = (1.0/gamma)*gradients[i][2];           //X3
+//             defGradientU[k][2] = (1.0/gamma)*gradients[i][2];           //X3
+            defGradientU[k][2] = gradients[i][2];           //X3
             // printmatrix(std::cout, defGradientU , "defGradientU", "--");
+            defGradientU = crossSectionDirectionScaling((1/gamma),defGradientU);
 
             double energyDensity = linearizedStVenantKirchhoffDensity(mu(quadPos), lambda(quadPos), defGradientU, defGradientV);
 //             double energyDensity = generalizedDensity(mu(quadPos), lambda(quadPos), defGradientU, defGradientV);  // also works..
@@ -272,16 +277,16 @@ void computeElementStiffnessMatrix(const LocalView& localView,
             size_t col = localView.tree().child(k).localIndex(i);                       
             
             elementMatrix[row][col] += energyDensity * quadPoint.weight() * integrationElement;
-           }
+        }
             
-           // "m*phi"  & "phi*m" - part
-           for( size_t m=0; m<3; m++)
-           {
-               double energyDensityGphi = linearizedStVenantKirchhoffDensity(mu(quadPos), lambda(quadPos), basisContainer[m], defGradientV);
-               auto value = energyDensityGphi * quadPoint.weight() * integrationElement;
-               elementMatrix[row][localPhiOffset+m] += value;
-               elementMatrix[localPhiOffset+m][row] += value;
-            }
+        // "m*phi"  & "phi*m" - part
+        for( size_t m=0; m<3; m++)
+        {
+            double energyDensityGphi = linearizedStVenantKirchhoffDensity(mu(quadPos), lambda(quadPos), basisContainer[m], defGradientV);
+            auto value = energyDensityGphi * quadPoint.weight() * integrationElement;
+            elementMatrix[row][localPhiOffset+m] += value;
+            elementMatrix[localPhiOffset+m][row] += value;
+        }
           
       }
     // "m*m"-part
@@ -397,8 +402,8 @@ void computeElementLoadVector( const LocalView& localView,
   ///////////////////////////////////////////////
   // Basis for R_sym^{2x2}
   //////////////////////////////////////////////
-  MatrixRT G_1 {{1.0, 0.0, 0.0}, {0.0, 0.0, 0.0}, {0.0, 0, 0.0}};
-  MatrixRT G_2 {{0.0, 0.0, 0.0}, {0.0, 1.0, 0.0}, {0, 0.0, 0.0}};
+  MatrixRT G_1 {{1.0, 0.0, 0.0}, {0.0, 0.0, 0.0}, {0.0, 0.0, 0.0}};
+  MatrixRT G_2 {{0.0, 0.0, 0.0}, {0.0, 1.0, 0.0}, {0.0, 0.0, 0.0}};
   MatrixRT G_3 {{0.0, 1.0/sqrt(2.0), 0.0}, {1.0/sqrt(2.0), 0.0, 0.0}, {0.0, 0.0, 0.0}};
   std::array<MatrixRT,3 > basisContainer = {G_1, G_2, G_3};
 
@@ -428,7 +433,10 @@ void computeElementLoadVector( const LocalView& localView,
         MatrixRT defGradientV(0);
         defGradientV[k][0] = gradients[i][0];                                 // Y
         defGradientV[k][1] = gradients[i][1];                                 // X2
-        defGradientV[k][2] = (1.0/gamma)*gradients[i][2];                     // X3
+//         defGradientV[k][2] = (1.0/gamma)*gradients[i][2];                     // 
+        defGradientV[k][2] = gradients[i][2];                     // X3
+        
+        defGradientV = crossSectionDirectionScaling((1/gamma),defGradientV);
 
         double energyDensity = linearizedStVenantKirchhoffDensity(mu(quadPos), lambda(quadPos),forceTerm(quadPos), defGradientV );
         size_t row = localView.tree().child(k).localIndex(i);
@@ -956,8 +964,8 @@ auto test_derivative(const Basis& basis,
     auto geometry = e.geometry();
     const auto& localFiniteElement = localView.tree().child(0).finiteElement();
 
-//     int orderQR = 2*(dim*localFiniteElement.localBasis().order()-1 + 5 );  // TEST
-    int orderQR = 2*(dim*localFiniteElement.localBasis().order()-1);
+    int orderQR = 2*(dim*localFiniteElement.localBasis().order()-1 + 5 );  // TEST
+//     int orderQR = 2*(dim*localFiniteElement.localBasis().order()-1);
     const QuadratureRule<double, dim>& quad = QuadratureRules<double, dim>::rule(e.type(), orderQR);
 
     for (const auto& quadPoint : quad) 
@@ -1133,8 +1141,8 @@ auto check_Orthogonality(const Basis& basis,
     auto geometry = e.geometry();
     const auto& localFiniteElement = localView.tree().child(0).finiteElement();
 
-//     int orderQR = 2*(dim*localFiniteElement.localBasis().order()-1 + 5 );  // TEST
-    int orderQR = 2*(dim*localFiniteElement.localBasis().order()-1);
+    int orderQR = 2*(dim*localFiniteElement.localBasis().order()-1 + 5 );  // TEST
+//     int orderQR = 2*(dim*localFiniteElement.localBasis().order()-1);
     const QuadratureRule<double, dim>& quad = QuadratureRules<double, dim>::rule(e.type(), orderQR);
 
     for (const auto& quadPoint : quad) 
@@ -1183,6 +1191,113 @@ auto check_Orthogonality(const Basis& basis,
 
 
 
+template<class Basis,class LocalFunction1, class LocalFunction2, class GVFunction , class MatrixFunction, class Matrix>
+auto computeFullQ(const Basis& basis,
+                    LocalFunction1& mu,
+                    LocalFunction2& lambda,
+                    const double& gamma,
+                    Matrix& M1,
+                    Matrix& M2,
+                    const GVFunction& DerPhi_1,
+                    const GVFunction& DerPhi_2,
+//                     const GVFunction& matrixFieldA,
+                    const MatrixFunction& matrixFieldFuncG1,
+                    const MatrixFunction& matrixFieldFuncG2
+                    )
+{
+
+//   TEST HIGHER PRECISION
+//   using float_50 = boost::multiprecision::cpp_dec_float_50;
+//   float_50 higherPrecEnergy = 0.0;
+  double energy = 0.0;
+  constexpr int dim = Basis::LocalView::Element::dimension;
+  constexpr int dimWorld = dim;
+
+  auto localView = basis.localView();
+
+  
+  auto DerPhi1 = localFunction(DerPhi_1);
+  auto DerPhi2 = localFunction(DerPhi_2);
+  
+  auto matrixFieldG1GVF  = Dune::Functions::makeGridViewFunction(matrixFieldFuncG1, basis.gridView());
+  auto matrixFieldG1 = localFunction(matrixFieldG1GVF);
+  auto matrixFieldG2GVF  = Dune::Functions::makeGridViewFunction(matrixFieldFuncG2, basis.gridView());
+  auto matrixFieldG2 = localFunction(matrixFieldG2GVF);
+//   auto matrixFieldBGVF  = Dune::Functions::makeGridViewFunction(matrixFieldFuncB, basis.gridView());
+//   auto matrixFieldB = localFunction(matrixFieldBGVF);
+
+  using GridView = typename Basis::GridView;
+  using Domain = typename GridView::template Codim<0>::Geometry::GlobalCoordinate;
+  using MatrixRT = FieldMatrix< double, dimWorld, dimWorld>;
+//   TEST
+//   FieldVector<double,3> testvector = {1.0 , 1.0 , 1.0};
+//   printmatrix(std::cout, matrixFieldFuncB(testvector) , "matrixFieldB(testvector) ", "--");
+
+  for (const auto& e : elements(basis.gridView()))
+  {
+    localView.bind(e);
+    matrixFieldG1.bind(e);
+    matrixFieldG2.bind(e);
+    DerPhi1.bind(e);
+    DerPhi2.bind(e);
+    mu.bind(e);
+    lambda.bind(e);
+
+
+    double elementEnergy = 0.0;
+    //double elementEnergy_HP = 0.0;
+
+    auto geometry = e.geometry();
+    const auto& localFiniteElement = localView.tree().child(0).finiteElement();
+
+    int orderQR = 2*(dim*localFiniteElement.localBasis().order()-1 + 5 );  // TEST
+//     int orderQR = 2*(dim*localFiniteElement.localBasis().order()-1);
+    const QuadratureRule<double, dim>& quad = QuadratureRules<double, dim>::rule(e.type(), orderQR);
+
+    for (const auto& quadPoint : quad) 
+    {
+      const auto& quadPos = quadPoint.position();
+      const double integrationElement = geometry.integrationElement(quadPos);
+      
+      auto Chi1 = sym(crossSectionDirectionScaling(1.0/gamma, DerPhi1(quadPos))) + *M1;
+      auto Chi2 = sym(crossSectionDirectionScaling(1.0/gamma, DerPhi2(quadPos))) + *M2;
+
+//       auto strain1 = DerPhi1(quadPos);
+// //       printmatrix(std::cout, strain1 , "strain1", "--");
+//       //cale with GAMMA
+//       strain1 = crossSectionDirectionScaling(1.0/gamma, strain1);
+//       strain1 = sym(strain1);
+      
+      
+      // ADD M 
+//       auto test = strain1 + *M ; 
+//       std::cout << "test:" << test << std::endl;
+      
+//       for (size_t m=0; m<3; m++ )
+//       for (size_t n=0; n<3; n++ )
+//           strain1[m][n] += M[m][n];
+      
+      auto G1 = matrixFieldG1(quadPos);
+      auto G2 = matrixFieldG2(quadPos);
+      
+      auto X1 = G1 + Chi1;
+      auto X2 = G2 + Chi2;
+
+      double energyDensity = linearizedStVenantKirchhoffDensity(mu(quadPos), lambda(quadPos), tmp1, tmp2);
+
+      elementEnergy += energyDensity * quadPoint.weight() * integrationElement;    
+      
+      
+//       elementEnergy += strain1 * quadPoint.weight() * integrationElement;        
+      //elementEnergy_HP += energyDensity * quadPoint.weight() * integrationElement;
+    }
+    energy += elementEnergy;
+    //higherPrecEnergy += elementEnergy_HP;
+  }
+//   TEST
+//   std::cout << std::setprecision(std::numeric_limits<float_50>::digits10) << higherPrecEnergy << std::endl;
+  return energy;
+}
 
 
 
@@ -1485,6 +1600,18 @@ int main(int argc, char *argv[])
     Func2Tensor x3G_3neg = [x3G_3] (const Domain& x) {return -1.0*x3G_3(x);};
     
     
+    
+    
+    
+    //TEST 
+    std::cout << "Test crossSectionDirectionScaling:" << std::endl;
+    
+    MatrixRT T {{1.0, 1.0, 1.0}, {1.0, 1.0, 1.0}, {1.0, 1.0, 1.0}};
+    printmatrix(std::cout, T, "Matrix T", "--");
+    
+    auto ST = crossSectionDirectionScaling((1.0/5.0),T);
+    printmatrix(std::cout, ST, "scaled Matrix T", "--");
+    
     //TEST 
 //     auto QuadraticForm = [] (const double mu, const double lambda, const MatrixRT& M) {
 // 
@@ -1768,6 +1895,7 @@ int main(int argc, char *argv[])
 
     
     
+    
     //TEST 
     
 //     auto local_cor1 = localFunction(correctorFunction_1);
@@ -1782,6 +1910,8 @@ int main(int argc, char *argv[])
     auto Der2 = derivative(correctorFunction_2);
     auto Der3 = derivative(correctorFunction_3);
     
+    const std::array<decltype(Der1)*,3> phiDerContainer = {&Der1, &Der2, &Der3};
+    
 //     auto output_der = test_derivative(Basis_CE,Der1);
     
     
@@ -1795,6 +1925,8 @@ int main(int argc, char *argv[])
     FieldVector<double,3> B_hat ;
     
     
+    
+    //VARIANT 1
     //Compute effective elastic law Q
     for(size_t a = 0; a < 3; a++)
         for(size_t b=0; b < 3; b++)
@@ -1807,21 +1939,33 @@ int main(int argc, char *argv[])
             MGterm = energy_MG(Basis_CE, muLocal, lambdaLocal, mContainer[a], x3MatrixBasis[b]); 
             
             double tmp = 0.0;
-            if(a==0)
-            {
-                tmp = test_derivative(Basis_CE, muLocal, lambdaLocal,gamma,mContainer[a],Der1,x3MatrixBasis[b]);
-                std::cout << "check_Orthogonality:" << check_Orthogonality(Basis_CE, muLocal, lambdaLocal,gamma,mContainer[a],mContainer[1],Der1,Der2,x3MatrixBasis[a])  << std::endl;
-            }
-            else if (a==1)
-            {
-                tmp = test_derivative(Basis_CE, muLocal, lambdaLocal,gamma,mContainer[a],Der2,x3MatrixBasis[b]);
-                std::cout << "check_Orthogonality:" << check_Orthogonality(Basis_CE, muLocal, lambdaLocal,gamma,mContainer[a],mContainer[1],Der2,Der2,x3MatrixBasis[a])  << std::endl;
-            }
-            else 
-            {
-                tmp = test_derivative(Basis_CE, muLocal, lambdaLocal,gamma,mContainer[a],Der3,x3MatrixBasis[b]);
-                std::cout << "check_Orthogonality:" << check_Orthogonality(Basis_CE, muLocal, lambdaLocal,gamma,mContainer[a],mContainer[1],Der3,Der2,x3MatrixBasis[a])  << std::endl;
-            }
+            
+            tmp = test_derivative(Basis_CE, muLocal, lambdaLocal,gamma,mContainer[a],*phiDerContainer[a],x3MatrixBasis[b]);
+            
+            
+            
+            std::cout << "---- (" << a << "," << b << ") ---- " << std::endl; 
+            
+            std::cout << "check_Orthogonality:" << check_Orthogonality(Basis_CE, muLocal, lambdaLocal,gamma,mContainer[a],mContainer[b],*phiDerContainer[a],*phiDerContainer[b],x3MatrixBasis[a])  << std::endl;
+            
+            
+            
+            
+//             if(a==0)
+//             {
+//                 tmp = test_derivative(Basis_CE, muLocal, lambdaLocal,gamma,mContainer[a],Der1,x3MatrixBasis[b]);
+//                 std::cout << "check_Orthogonality:" << check_Orthogonality(Basis_CE, muLocal, lambdaLocal,gamma,mContainer[a],mContainer[1],Der1,Der2,x3MatrixBasis[a])  << std::endl;
+//             }
+//             else if (a==1)
+//             {
+//                 tmp = test_derivative(Basis_CE, muLocal, lambdaLocal,gamma,mContainer[a],Der2,x3MatrixBasis[b]);
+//                 std::cout << "check_Orthogonality:" << check_Orthogonality(Basis_CE, muLocal, lambdaLocal,gamma,mContainer[a],mContainer[1],Der2,Der2,x3MatrixBasis[a])  << std::endl;
+//             }
+//             else 
+//             {
+//                 tmp = test_derivative(Basis_CE, muLocal, lambdaLocal,gamma,mContainer[a],Der3,x3MatrixBasis[b]);
+//                 std::cout << "check_Orthogonality:" << check_Orthogonality(Basis_CE, muLocal, lambdaLocal,gamma,mContainer[a],mContainer[1],Der3,Der2,x3MatrixBasis[a])  << std::endl;
+//             }
             
             
             std::cout << "GGTerm:" << GGterm << std::endl;
@@ -1829,9 +1973,7 @@ int main(int argc, char *argv[])
             std::cout << "tmp:" << tmp << std::endl;
             std::cout << "(coeffContainer[a]*tmp1):" << (coeffContainer[a]*tmp1) << std::endl;
             
-            
-            
-
+    
             // TEST
             // std::setprecision(std::numeric_limits<float>::digits10);
 
@@ -1845,31 +1987,49 @@ int main(int argc, char *argv[])
                 std::cout << "coeff*tmp: " << coeffContainer[a]*tmp1 << std::endl;
             }
         }
-
-//     // Compute effective elastic law Q
-//     for(size_t a = 0; a < 3; a++)
-//         for(size_t b=0; b < 3; b++)
-//         {
-//             assembleCellLoad(Basis_CE, muLocal, lambdaLocal, gamma, tmp1 ,x3MatrixBasis[b]);   // <L i(M_alpha) + sym(grad phi_alpha), i(x3G_beta) >
-// 
-//             double GGterm = 0.0;
-//             GGterm = energy(Basis_CE, muLocal, lambdaLocal, x3MatrixBasis[a] , x3MatrixBasis[b]  );   // <L i(x3G_alpha) , i(x3G_beta) >
-// 
-//             // TEST
-//             // std::setprecision(std::numeric_limits<float>::digits10);
-// 
-//             Q[a][b] =  (coeffContainer[a]*tmp1) + GGterm;                         // seems symmetric...check positiv definitness?
-//         
-//             if (print_debug)
-//             {
-//                 std::cout << "analyticGGTERM:" << (mu1*(1-theta)+mu2*theta)/6.0 << std::endl;
-//                 std::cout << "GGTerm:" << GGterm << std::endl;
-//                 std::cout << "coeff*tmp: " << coeffContainer[a]*tmp1 << std::endl;
-//             }
-//         }
     printmatrix(std::cout, Q, "Matrix Q", "--");
     log << "Effective Matrix Q: " << std::endl;
     log << Q << std::endl;
+        
+        
+        
+    //VARIANT 2
+    //Compute effective elastic law Q
+    MatrixRT Q_2(0);
+    for(size_t a = 0; a < 3; a++)
+        for(size_t b=0; b < 3; b++)
+        {
+            Q_2[a][b] = computeFullQ(Basis_CE, muLocal, lambdaLocal,gamma,mContainer[a],mContainer[b],*phiDerContainer[a],*phiDerContainer[b],x3MatrixBasis[a],x3MatrixBasis[b]);
+        }
+    printmatrix(std::cout, Q_2, "Matrix Q_2", "--");
+        
+    // VARIANT 3
+    // Compute effective elastic law Q
+    MatrixRT Q_3(0);
+    for(size_t a = 0; a < 3; a++)
+        for(size_t b=0; b < 3; b++)
+        {
+            assembleCellLoad(Basis_CE, muLocal, lambdaLocal, gamma, tmp1 ,x3MatrixBasis[b]);   // <L i(M_alpha) + sym(grad phi_alpha), i(x3G_beta) >
+
+            double GGterm = 0.0;
+            GGterm = energy(Basis_CE, muLocal, lambdaLocal, x3MatrixBasis[a] , x3MatrixBasis[b]  );   // <L i(x3G_alpha) , i(x3G_beta) >
+
+            // TEST
+            // std::setprecision(std::numeric_limits<float>::digits10);
+
+            Q_3[a][b] =  (coeffContainer[a]*tmp1) + GGterm;                         // seems symmetric...check positiv definitness?
+        
+            if (print_debug)
+            {
+                std::cout << "analyticGGTERM:" << (mu1*(1-theta)+mu2*theta)/6.0 << std::endl;
+                std::cout << "GGTerm:" << GGterm << std::endl;
+                std::cout << "coeff*tmp: " << coeffContainer[a]*tmp1 << std::endl;
+            }
+        }
+    printmatrix(std::cout, Q_3, "Matrix Q_3", "--");
+
+
+
 
     // compute B_hat
     for(size_t a = 0; a<3; a++)
@@ -2347,5 +2507,5 @@ int main(int argc, char *argv[])
 
     log.close();
     
-//     std::cout << "Total time elapsed: " << globalTimer.elapsed() << std::endl;
+    std::cout << "Total time elapsed: " << globalTimer.elapsed() << std::endl;
 }