diff --git a/ProcessLib/TH2M/TH2MFEM-impl.h b/ProcessLib/TH2M/TH2MFEM-impl.h
index a571f7ff8ea0eb73466938d49fe98040da9cf6b3..154248a716b36a6b3576d6aab655ab79d156e17d 100644
--- a/ProcessLib/TH2M/TH2MFEM-impl.h
+++ b/ProcessLib/TH2M/TH2MFEM-impl.h
@@ -1079,7 +1079,8 @@ void TH2MLocalAssembler<
                                           typename BMatricesType::BMatrixType>(
                 gradNu, Nu, x_coord, this->is_axially_symmetric_);
 
-        auto const BuT = Bu.transpose().eval();
+        auto const NTN = (Np.transpose() * Np).eval();
+        auto const BTI2N = (Bu.transpose() * Invariants::identity2 * Np).eval();
 
         double const pCap = Np.dot(capillary_pressure);
         double const pCap_prev = Np.dot(capillary_pressure_prev);
@@ -1093,21 +1094,20 @@ void TH2MLocalAssembler<
         // C-component equation
         // ---------------------------------------------------------------------
 
-        MCpG.noalias() += NpT * ip_cv.fC_4_MCpG.m * Np * w;
-        MCpC.noalias() += NpT * ip_cv.fC_4_MCpC.m * Np * w;
+        MCpG.noalias() += NTN * (ip_cv.fC_4_MCpG.m * w);
+        MCpC.noalias() += NTN * (ip_cv.fC_4_MCpC.m * w);
 
         if (this->process_data_.apply_mass_lumping)
         {
             if (pCap - pCap_prev != 0.)  // avoid division by Zero
             {
                 MCpC.noalias() +=
-                    NpT * ip_cv.fC_4_MCpC.ml / (pCap - pCap_prev) * Np * w;
+                    NTN * (ip_cv.fC_4_MCpC.ml / (pCap - pCap_prev) * w);
             }
         }
 
-        MCT.noalias() += NpT * ip_cv.fC_4_MCT.m * Np * w;
-        MCu.noalias() += NpT * Invariants::identity2.transpose() * Bu *
-                         (ip_cv.fC_4_MCu.m * w);
+        MCT.noalias() += NTN * (ip_cv.fC_4_MCT.m * w);
+        MCu.noalias() += BTI2N.transpose() * (ip_cv.fC_4_MCu.m * w);
 
         LCpG.noalias() += gradNpT * ip_cv.fC_4_LCpG.L * gradNp * w;
 
@@ -1119,31 +1119,30 @@ void TH2MLocalAssembler<
 
         if (!this->process_data_.apply_mass_lumping)
         {
-            fC.noalias() -= NpT * ip_cv.fC_2a.a * s_L_dot * w;
+            fC.noalias() -= NpT * (ip_cv.fC_2a.a * s_L_dot * w);
         }
         // fC_III
-        fC.noalias() -= NpT * ip_out.porosity_data.phi * ip_cv.fC_3a.a * w;
+        fC.noalias() -= NpT * (ip_out.porosity_data.phi * ip_cv.fC_3a.a * w);
 
         // ---------------------------------------------------------------------
         // W-component equation
         // ---------------------------------------------------------------------
 
-        MWpG.noalias() += NpT * ip_cv.fW_4_MWpG.m * Np * w;
-        MWpC.noalias() += NpT * ip_cv.fW_4_MWpC.m * Np * w;
+        MWpG.noalias() += NTN * (ip_cv.fW_4_MWpG.m * w);
+        MWpC.noalias() += NTN * (ip_cv.fW_4_MWpC.m * w);
 
         if (this->process_data_.apply_mass_lumping)
         {
             if (pCap - pCap_prev != 0.)  // avoid division by Zero
             {
                 MWpC.noalias() +=
-                    NpT * ip_cv.fW_4_MWpC.ml / (pCap - pCap_prev) * Np * w;
+                    NTN * (ip_cv.fW_4_MWpC.ml / (pCap - pCap_prev) * w);
             }
         }
 
-        MWT.noalias() += NpT * ip_cv.fW_4_MWT.m * Np * w;
+        MWT.noalias() += NTN * (ip_cv.fW_4_MWT.m * w);
 
-        MWu.noalias() += NpT * Invariants::identity2.transpose() * Bu *
-                         (ip_cv.fW_4_MWu.m * w);
+        MWu.noalias() += BTI2N.transpose() * (ip_cv.fW_4_MWu.m * w);
 
         LWpG.noalias() += gradNpT * ip_cv.fW_4_LWpG.L * gradNp * w;
 
@@ -1155,42 +1154,40 @@ void TH2MLocalAssembler<
 
         if (!this->process_data_.apply_mass_lumping)
         {
-            fW.noalias() -= NpT * ip_cv.fW_2.a * s_L_dot * w;
+            fW.noalias() -= NpT * (ip_cv.fW_2.a * s_L_dot * w);
         }
 
-        fW.noalias() -= NpT * ip_out.porosity_data.phi * ip_cv.fW_3a.a * w;
+        fW.noalias() -= NpT * (ip_out.porosity_data.phi * ip_cv.fW_3a.a * w);
 
         // ---------------------------------------------------------------------
         //  - temperature equation
         // ---------------------------------------------------------------------
 
         MTu.noalias() +=
-            NTT * Invariants::identity2.transpose() * Bu *
+            BTI2N.transpose() *
             (ip_cv.effective_volumetric_enthalpy_data.rho_h_eff * w);
 
         KTT.noalias() +=
             gradNTT * ip_cv.thermal_conductivity_data.lambda * gradNT * w;
 
-        fT.noalias() -= NTT * ip_cv.fT_1.m * w;
+        fT.noalias() -= NTT * (ip_cv.fT_1.m * w);
 
         fT.noalias() += gradNTT * ip_cv.fT_2.A * w;
 
         fT.noalias() += gradNTT * ip_cv.fT_3.gradN * w;
 
-        fT.noalias() += NTT * ip_cv.fT_3.N * w;
+        fT.noalias() += NTT * (ip_cv.fT_3.N * w);
 
         // ---------------------------------------------------------------------
         //  - displacement equation
         // ---------------------------------------------------------------------
 
-        KUpG.noalias() -=
-            BuT * Invariants::identity2 * Np * (ip_cv.biot_data() * w);
+        KUpG.noalias() -= BTI2N * (ip_cv.biot_data() * w);
 
-        KUpC.noalias() +=
-            BuT * Invariants::identity2 * Np * (ip_cv.fu_2_KupC.m * w);
+        KUpC.noalias() += BTI2N * (ip_cv.fu_2_KupC.m * w);
 
         fU.noalias() -=
-            (BuT * current_state.eff_stress_data.sigma -
+            (Bu.transpose() * current_state.eff_stress_data.sigma -
              N_u_op(Nu).transpose() * ip_cv.volumetric_body_force()) *
             w;
 
@@ -1391,7 +1388,8 @@ void TH2MLocalAssembler<ShapeFunctionDisplacement, ShapeFunctionPressure,
                                           typename BMatricesType::BMatrixType>(
                 gradNu, Nu, x_coord, this->is_axially_symmetric_);
 
-        auto const BuT = Bu.transpose().eval();
+        auto const NTN = (Np.transpose() * Np).eval();
+        auto const BTI2N = (Bu.transpose() * Invariants::identity2 * Np).eval();
 
         double const div_u_dot =
             Invariants::trace(Bu * (displacement - displacement_prev) / dt);
@@ -1417,32 +1415,31 @@ void TH2MLocalAssembler<ShapeFunctionDisplacement, ShapeFunctionPressure,
         // C-component equation
         // ---------------------------------------------------------------------
 
-        MCpG.noalias() += NpT * ip_cv.fC_4_MCpG.m * Np * w;
-        MCpC.noalias() += NpT * ip_cv.fC_4_MCpC.m * Np * w;
+        MCpG.noalias() += NTN * (ip_cv.fC_4_MCpG.m * w);
+        MCpC.noalias() += NTN * (ip_cv.fC_4_MCpC.m * w);
 
         if (this->process_data_.apply_mass_lumping)
         {
             if (pCap - pCap_prev != 0.)  // avoid division by Zero
             {
                 MCpC.noalias() +=
-                    NpT * ip_cv.fC_4_MCpC.ml / (pCap - pCap_prev) * Np * w;
+                    NTN * (ip_cv.fC_4_MCpC.ml / (pCap - pCap_prev) * w);
             }
         }
 
-        MCT.noalias() += NpT * ip_cv.fC_4_MCT.m * Np * w;
+        MCT.noalias() += NTN * (ip_cv.fC_4_MCT.m * w);
         // d (fC_4_MCT * T_dot)/d T
         local_Jac
             .template block<C_size, temperature_size>(C_index,
                                                       temperature_index)
-            .noalias() += NpT * ip_dd.dfC_4_MCT.dT * (T - T_prev) / dt * NT * w;
+            .noalias() += NTN * (ip_dd.dfC_4_MCT.dT * (T - T_prev) / dt * w);
 
-        MCu.noalias() += NpT * Invariants::identity2.transpose() * Bu *
-                         (ip_cv.fC_4_MCu.m * w);
+        MCu.noalias() += BTI2N.transpose() * (ip_cv.fC_4_MCu.m * w);
         // d (fC_4_MCu * u_dot)/d T
         local_Jac
             .template block<C_size, temperature_size>(C_index,
                                                       temperature_index)
-            .noalias() += NpT * ip_dd.dfC_4_MCu.dT * div_u_dot * NT * w;
+            .noalias() += NTN * (ip_dd.dfC_4_MCu.dT * div_u_dot * w);
 
         LCpG.noalias() += gradNpT * ip_cv.fC_4_LCpG.L * gradNp * w;
 
@@ -1462,14 +1459,14 @@ void TH2MLocalAssembler<ShapeFunctionDisplacement, ShapeFunctionPressure,
 
         // d (fC_4_MCpG * p_GR_dot)/d p_GR
         local_Jac.template block<C_size, C_size>(C_index, C_index).noalias() +=
-            NpT * ip_dd.dfC_4_MCpG.dp_GR * (pGR - pGR_prev) / dt * Np * w;
+            NTN * (ip_dd.dfC_4_MCpG.dp_GR * (pGR - pGR_prev) / dt * w);
 
         // d (fC_4_MCpG * p_GR_dot)/d T
         local_Jac
             .template block<C_size, temperature_size>(C_index,
                                                       temperature_index)
             .noalias() +=
-            NpT * ip_dd.dfC_4_MCpG.dT * (pGR - pGR_prev) / dt * NT * w;
+            NTN * (ip_dd.dfC_4_MCpG.dT * (pGR - pGR_prev) / dt * w);
 
         LCpC.noalias() -= gradNpT * ip_cv.fC_4_LCpC.L * gradNp * w;
 
@@ -1495,65 +1492,65 @@ void TH2MLocalAssembler<ShapeFunctionDisplacement, ShapeFunctionPressure,
         if (!this->process_data_.apply_mass_lumping)
         {
             // fC_2 = \int a * s_L_dot
-            fC.noalias() -= NpT * ip_cv.fC_2a.a * s_L_dot * w;
+            fC.noalias() -= NpT * (ip_cv.fC_2a.a * s_L_dot * w);
 
             local_Jac.template block<C_size, C_size>(C_index, C_index)
-                .noalias() += NpT *
-                              (ip_dd.dfC_2a.dp_GR * s_L_dot
-                               /*- ip_cv.fC_2a.a * (ds_L_dp_GR = 0) / dt*/) *
-                              Np * w;
+                .noalias() +=
+                NTN * ((ip_dd.dfC_2a.dp_GR * s_L_dot
+                        /*- ip_cv.fC_2a.a * (ds_L_dp_GR = 0) / dt*/) *
+                       w);
 
             local_Jac.template block<C_size, W_size>(C_index, W_index)
-                .noalias() += NpT *
-                              (ip_dd.dfC_2a.dp_cap * s_L_dot +
-                               ip_cv.fC_2a.a * ip_dd.dS_L_dp_cap() / dt) *
-                              Np * w;
+                .noalias() +=
+                NTN * ((ip_dd.dfC_2a.dp_cap * s_L_dot +
+                        ip_cv.fC_2a.a * ip_dd.dS_L_dp_cap() / dt) *
+                       w);
 
             local_Jac
                 .template block<C_size, temperature_size>(C_index,
                                                           temperature_index)
-                .noalias() += NpT * ip_dd.dfC_2a.dT * s_L_dot * NT * w;
+                .noalias() += NTN * (ip_dd.dfC_2a.dT * s_L_dot * w);
         }
         {
             // fC_3 = \int phi * a
-            fC.noalias() -= NpT * ip_out.porosity_data.phi * ip_cv.fC_3a.a * w;
+            fC.noalias() -=
+                NpT * (ip_out.porosity_data.phi * ip_cv.fC_3a.a * w);
 
             local_Jac.template block<C_size, C_size>(C_index, C_index)
                 .noalias() +=
-                NpT * ip_out.porosity_data.phi * ip_dd.dfC_3a.dp_GR * Np * w;
+                NTN * (ip_out.porosity_data.phi * ip_dd.dfC_3a.dp_GR * w);
 
             local_Jac.template block<C_size, W_size>(C_index, W_index)
                 .noalias() +=
-                NpT * ip_out.porosity_data.phi * ip_dd.dfC_3a.dp_cap * Np * w;
+                NTN * (ip_out.porosity_data.phi * ip_dd.dfC_3a.dp_cap * w);
 
             local_Jac
                 .template block<C_size, temperature_size>(C_index,
                                                           temperature_index)
-                .noalias() += NpT *
-                              (ip_dd.porosity_d_data.dphi_dT * ip_cv.fC_3a.a +
-                               ip_out.porosity_data.phi * ip_dd.dfC_3a.dT) *
-                              NT * w;
+                .noalias() +=
+                NTN * ((ip_dd.porosity_d_data.dphi_dT * ip_cv.fC_3a.a +
+                        ip_out.porosity_data.phi * ip_dd.dfC_3a.dT) *
+                       w);
         }
         // ---------------------------------------------------------------------
         // W-component equation
         // ---------------------------------------------------------------------
 
-        MWpG.noalias() += NpT * ip_cv.fW_4_MWpG.m * Np * w;
-        MWpC.noalias() += NpT * ip_cv.fW_4_MWpC.m * Np * w;
+        MWpG.noalias() += NTN * (ip_cv.fW_4_MWpG.m * w);
+        MWpC.noalias() += NTN * (ip_cv.fW_4_MWpC.m * w);
 
         if (this->process_data_.apply_mass_lumping)
         {
             if (pCap - pCap_prev != 0.)  // avoid division by Zero
             {
                 MWpC.noalias() +=
-                    NpT * ip_cv.fW_4_MWpC.ml / (pCap - pCap_prev) * Np * w;
+                    NTN * (ip_cv.fW_4_MWpC.ml / (pCap - pCap_prev) * w);
             }
         }
 
-        MWT.noalias() += NpT * ip_cv.fW_4_MWT.m * Np * w;
+        MWT.noalias() += NTN * (ip_cv.fW_4_MWT.m * w);
 
-        MWu.noalias() += NpT * Invariants::identity2.transpose() * Bu *
-                         (ip_cv.fW_4_MWu.m * w);
+        MWu.noalias() += BTI2N.transpose() * (ip_cv.fW_4_MWu.m * w);
 
         LWpG.noalias() += gradNpT * ip_cv.fW_4_LWpG.L * gradNp * w;
 
@@ -1591,49 +1588,48 @@ void TH2MLocalAssembler<ShapeFunctionDisplacement, ShapeFunctionPressure,
         // fW_2 = \int a * s_L_dot
         if (!this->process_data_.apply_mass_lumping)
         {
-            fW.noalias() -= NpT * ip_cv.fW_2.a * s_L_dot * w;
+            fW.noalias() -= NpT * (ip_cv.fW_2.a * s_L_dot * w);
 
             local_Jac.template block<W_size, C_size>(W_index, C_index)
-                .noalias() += NpT * ip_dd.dfW_2.dp_GR * s_L_dot * Np * w;
+                .noalias() += NTN * (ip_dd.dfW_2.dp_GR * s_L_dot * w);
 
             // sign negated because of dp_cap = -dp_LR
             // TODO (naumov) Had to change the sign to get equal Jacobian WW
             // blocks in A2 Test. Where is the error?
             local_Jac.template block<W_size, W_size>(W_index, W_index)
-                .noalias() += NpT *
-                              (ip_dd.dfW_2.dp_cap * s_L_dot +
-                               ip_cv.fW_2.a * ip_dd.dS_L_dp_cap() / dt) *
-                              Np * w;
+                .noalias() += NTN * ((ip_dd.dfW_2.dp_cap * s_L_dot +
+                                      ip_cv.fW_2.a * ip_dd.dS_L_dp_cap() / dt) *
+                                     w);
 
             local_Jac
                 .template block<W_size, temperature_size>(W_index,
                                                           temperature_index)
-                .noalias() += NpT * ip_dd.dfW_2.dT * s_L_dot * Np * w;
+                .noalias() += NTN * (ip_dd.dfW_2.dT * s_L_dot * w);
         }
 
         // fW_3 = \int phi * a
-        fW.noalias() -= NpT * ip_out.porosity_data.phi * ip_cv.fW_3a.a * w;
+        fW.noalias() -= NpT * (ip_out.porosity_data.phi * ip_cv.fW_3a.a * w);
 
         local_Jac.template block<W_size, C_size>(W_index, C_index).noalias() +=
-            NpT * ip_out.porosity_data.phi * ip_dd.dfW_3a.dp_GR * Np * w;
+            NTN * (ip_out.porosity_data.phi * ip_dd.dfW_3a.dp_GR * w);
 
         local_Jac.template block<W_size, W_size>(W_index, W_index).noalias() +=
-            NpT * ip_out.porosity_data.phi * ip_dd.dfW_3a.dp_cap * Np * w;
+            NTN * (ip_out.porosity_data.phi * ip_dd.dfW_3a.dp_cap * w);
 
         local_Jac
             .template block<W_size, temperature_size>(W_index,
                                                       temperature_index)
-            .noalias() += NpT *
-                          (ip_dd.porosity_d_data.dphi_dT * ip_cv.fW_3a.a +
-                           ip_out.porosity_data.phi * ip_dd.dfW_3a.dT) *
-                          NT * w;
+            .noalias() +=
+            NTN * ((ip_dd.porosity_d_data.dphi_dT * ip_cv.fW_3a.a +
+                    ip_out.porosity_data.phi * ip_dd.dfW_3a.dT) *
+                   w);
 
         // ---------------------------------------------------------------------
         //  - temperature equation
         // ---------------------------------------------------------------------
 
         MTu.noalias() +=
-            NTT * Invariants::identity2.transpose() * Bu *
+            BTI2N.transpose() *
             (ip_cv.effective_volumetric_enthalpy_data.rho_h_eff * w);
 
         // dfT_4/dp_GR
@@ -1642,8 +1638,8 @@ void TH2MLocalAssembler<ShapeFunctionDisplacement, ShapeFunctionPressure,
             .template block<temperature_size, C_size>(temperature_index,
                                                       C_index)
             .noalias() +=
-            NTT * ip_dd.effective_volumetric_enthalpy_d_data.drho_h_eff_dp_GR *
-            div_u_dot * NT * w;
+            NTN * (ip_dd.effective_volumetric_enthalpy_d_data.drho_h_eff_dp_GR *
+                   div_u_dot * w);
 
         // dfT_4/dp_cap
         // d (MTu * u_dot)/dp_cap
@@ -1651,8 +1647,9 @@ void TH2MLocalAssembler<ShapeFunctionDisplacement, ShapeFunctionPressure,
             .template block<temperature_size, W_size>(temperature_index,
                                                       W_index)
             .noalias() -=
-            NTT * ip_dd.effective_volumetric_enthalpy_d_data.drho_h_eff_dp_cap *
-            div_u_dot * NT * w;
+            NTN *
+            (ip_dd.effective_volumetric_enthalpy_d_data.drho_h_eff_dp_cap *
+             div_u_dot * w);
 
         // dfT_4/dT
         // d (MTu * u_dot)/dT
@@ -1660,8 +1657,8 @@ void TH2MLocalAssembler<ShapeFunctionDisplacement, ShapeFunctionPressure,
             .template block<temperature_size, temperature_size>(
                 temperature_index, temperature_index)
             .noalias() +=
-            NTT * ip_dd.effective_volumetric_enthalpy_d_data.drho_h_eff_dT *
-            div_u_dot * NT * w;
+            NTN * (ip_dd.effective_volumetric_enthalpy_d_data.drho_h_eff_dT *
+                   div_u_dot * w);
 
         KTT.noalias() +=
             gradNTT * ip_cv.thermal_conductivity_data.lambda * gradNT * w;
@@ -1697,26 +1694,26 @@ void TH2MLocalAssembler<ShapeFunctionDisplacement, ShapeFunctionPressure,
                           NT * w;
 
         // fT_1
-        fT.noalias() -= NTT * ip_cv.fT_1.m * w;
+        fT.noalias() -= NTT * (ip_cv.fT_1.m * w);
 
         // dfT_1/dp_GR
         local_Jac
             .template block<temperature_size, C_size>(temperature_index,
                                                       C_index)
-            .noalias() += NpT * Np * (ip_dd.dfT_1.dp_GR * w);
+            .noalias() += NTN * (ip_dd.dfT_1.dp_GR * w);
 
         // dfT_1/dp_cap
         local_Jac
             .template block<temperature_size, W_size>(temperature_index,
                                                       W_index)
-            .noalias() += NpT * Np * (ip_dd.dfT_1.dp_cap * w);
+            .noalias() += NTN * (ip_dd.dfT_1.dp_cap * w);
 
         // dfT_1/dT
         // MTT
         local_Jac
             .template block<temperature_size, temperature_size>(
                 temperature_index, temperature_index)
-            .noalias() += NTT * NT * (ip_dd.dfT_1.dT * w);
+            .noalias() += NTN * (ip_dd.dfT_1.dT * w);
 
         // fT_2
         fT.noalias() += gradNTT * ip_cv.fT_2.A * w;
@@ -1748,7 +1745,7 @@ void TH2MLocalAssembler<ShapeFunctionDisplacement, ShapeFunctionPressure,
             .noalias() -= gradNTT * ip_dd.dfT_2.dT * NT * w;
 
         // fT_3
-        fT.noalias() += NTT * ip_cv.fT_3.N * w;
+        fT.noalias() += NTT * (ip_cv.fT_3.N * w);
 
         fT.noalias() += gradNTT * ip_cv.fT_3.gradN * w;
 
@@ -1756,31 +1753,29 @@ void TH2MLocalAssembler<ShapeFunctionDisplacement, ShapeFunctionPressure,
         //  - displacement equation
         // ---------------------------------------------------------------------
 
-        KUpG.noalias() -=
-            BuT * Invariants::identity2 * Np * (ip_cv.biot_data() * w);
+        KUpG.noalias() -= BTI2N * (ip_cv.biot_data() * w);
 
         // dfU_2/dp_GR = dKUpG/dp_GR * p_GR + KUpG. The former is zero, the
         // latter is handled below.
 
-        KUpC.noalias() +=
-            BuT * Invariants::identity2 * Np * (ip_cv.fu_2_KupC.m * w);
+        KUpC.noalias() += BTI2N * (ip_cv.fu_2_KupC.m * w);
 
         // dfU_2/dp_cap = dKUpC/dp_cap * p_cap + KUpC. The former is handled
         // here, the latter below.
         local_Jac
             .template block<displacement_size, W_size>(displacement_index,
                                                        W_index)
-            .noalias() +=
-            BuT * Invariants::identity2 * Np * (ip_dd.dfu_2_KupC.dp_cap * w);
+            .noalias() += BTI2N * (ip_dd.dfu_2_KupC.dp_cap * w);
 
         local_Jac
             .template block<displacement_size, displacement_size>(
                 displacement_index, displacement_index)
-            .noalias() += BuT * ip_cd.s_mech_data.stiffness_tensor * Bu * w;
+            .noalias() +=
+            Bu.transpose() * ip_cd.s_mech_data.stiffness_tensor * Bu * w;
 
         // fU_1
         fU.noalias() -=
-            (BuT * current_state.eff_stress_data.sigma -
+            (Bu.transpose() * current_state.eff_stress_data.sigma -
              N_u_op(Nu).transpose() * ip_cv.volumetric_body_force()) *
             w;
 
@@ -1788,7 +1783,7 @@ void TH2MLocalAssembler<ShapeFunctionDisplacement, ShapeFunctionPressure,
         local_Jac
             .template block<displacement_size, temperature_size>(
                 displacement_index, temperature_index)
-            .noalias() -= BuT * ip_dd.dfu_1_KuT.dT * NT * w;
+            .noalias() -= Bu.transpose() * ip_dd.dfu_1_KuT.dT * NT * w;
 
         /* TODO (naumov) Test with gravity needed to check this Jacobian part.
         local_Jac