diff --git a/NonLinearSolver/materialLaw/mlawTFAMaterialLaws.cpp b/NonLinearSolver/materialLaw/mlawTFAMaterialLaws.cpp
index bda7ad45b8094ce584ecdb6185b3ecf4ab93a4cf..4669ea9bde6c02ecfc9b90f54f553cf023742803 100644
--- a/NonLinearSolver/materialLaw/mlawTFAMaterialLaws.cpp
+++ b/NonLinearSolver/materialLaw/mlawTFAMaterialLaws.cpp
@@ -285,8 +285,14 @@ void mlawGenericTFAMaterialLaws::setTFAMethod(int TFAMethodNum, int dim, int cor
   else if(TFAMethodNum == 2)
   {
     polarization = true;
-    Msg::Info("IncrementalTangentTFAPolarization is used !!!");
-    _reductionModel = new IncrementalTangentTFAPolarization(solverType, dim, correction, withFrame, polarization, tag);
+    Msg::Info("IncrementalTangentHS is used !!!");
+    _reductionModel = new IncrementalTangentHS(solverType, dim, correction, withFrame, polarization, tag);
+  }
+  else if(TFAMethodNum == 3)
+  {
+    polarization = true;
+    Msg::Info("IncrementalTangentPFA is used !!!");
+    _reductionModel = new IncrementalTangentPFA(solverType, dim, correction, withFrame, polarization, tag);
   }
   else
   {
diff --git a/NonLinearSolver/modelReduction/modelReduction.cpp b/NonLinearSolver/modelReduction/modelReduction.cpp
index 65392c38ea8f599cc7d4825f9849ed5ecaba9791..15d5f97aa03e8ec0aafdb1aeeb0227430c3f16ff 100644
--- a/NonLinearSolver/modelReduction/modelReduction.cpp
+++ b/NonLinearSolver/modelReduction/modelReduction.cpp
@@ -612,7 +612,7 @@ void ReductionTFA::preallocateSystem(const ClusteringData *q0,  const Clustering
       }
       else if(_polarization)
       {
-        getBiLinearTermPolarization(icl,q0,q1, othersId, m);
+        getBiLinearTermHS(icl,q0,q1, othersId, m);
       }
       else
       {
@@ -868,7 +868,7 @@ void ReductionTFA::assembleRes(const ClusteringData *q0,  const ClusteringData *
   {
     for (int icl = 0; icl < nbClusters; icl++)
     {
-      getLinearTermPolarization(icl,q0,q1,r);
+      getLinearTermHS(icl,q0,q1,r);
       std::vector<Dof> R;
       getKeys(icl,R);
       for (int j=0; j<R.size(); j++)
@@ -944,7 +944,7 @@ void ReductionTFA::assembleDresDu(const ClusteringData *q0,  const ClusteringDat
   {
     for (int icl = 0; icl < nbClusters; icl++)
     {
-      getBiLinearTermPolarization(icl,q0,q1,othersId,Ke);
+      getBiLinearTermHS(icl,q0,q1,othersId,Ke);
       //Ke.print("Ke");
       //
       std::vector<Dof> R, C;
@@ -1496,7 +1496,125 @@ void ReductionTFA::getTangentTerm(int clusterId, const ClusteringData *q0,  cons
 };
 
 
-void ReductionTFA::getLinearTermPolarization(int clusterId, const ClusteringData *q0,  const ClusteringData *q1, fullVector<double>& res) const
+void ReductionTFA::getLinearTermHS(int clusterId, const ClusteringData *q0,  const ClusteringData *q1, fullVector<double>& res) const
+{
+  int nbClusters = _clusteringData->getTotalNumberOfClusters();
+  
+  const STensor3& eps1i = q1->getConstRefToStrain(clusterId);
+  const STensor3& eps0i = q0->getConstRefToStrain(clusterId);
+  
+  const STensor3& macroeps1 = q1->getConstRefToMacroStrain();
+  const STensor3& macroeps0 = q0->getConstRefToMacroStrain();
+
+  static STensor3 resTen;  
+  resTen = eps1i;
+  resTen -= eps0i;
+  resTen -= macroeps1;
+  resTen += macroeps0;
+  
+  const STensor43& C0iso = _clusteringData->getReferenceStiffnessIso();
+  double G0 = C0iso(0,1,0,1);
+  const double& Gtan = q1->getConstRefToTangentShearModulus();
+  
+  for (int jcl =0; jcl < nbClusters; jcl++)
+  {
+    const STensor43 &Dij =  getClusterInteractionTensor(clusterId,jcl);
+    
+    const STensor3& sig1j = q1->getConstRefToStress(jcl);
+    const STensor3& eps1j = q1->getConstRefToStrain(jcl);      
+    const STensor3& sig0j = q0->getConstRefToStress(jcl);
+    const STensor3& eps0j = q0->getConstRefToStrain(jcl);
+    
+    STensor3 dsigj(sig1j);
+    dsigj -= sig0j;
+    STensor3 depsj(eps1j);
+    depsj -= eps0j; 
+    
+    STensor3 fac;    
+    fac = dsigj;
+    fac *= G0/Gtan;
+    STensorOperation::multSTensor43STensor3Add(C0iso,depsj,-1.,fac);         
+    STensorOperation::multSTensor43STensor3Add(Dij,fac,-1.,resTen);          
+  }
+  STensorOperation::fromSTensor3ToFullVector(resTen,res);
+};
+void ReductionTFA::getBiLinearTermHS(int clusterId, const ClusteringData *q0,  const ClusteringData *q1, std::vector<int>& othersId, fullMatrix<double>& dres) const 
+{
+  int nbClusters = _clusteringData->getTotalNumberOfClusters();
+  othersId.resize(nbClusters);
+  for (int j=0; j< nbClusters; j++)
+  {
+    othersId[j] = j;
+  }
+  dres.resize(6,6*nbClusters,true);
+  
+  double vtot;
+  vtot = totalVolume();
+  
+  for (int jcl=0; jcl< nbClusters; jcl++)
+  {
+    static STensor43 J_ij;
+    getJacHS_rs(clusterId,jcl,q0,q1,J_ij);
+    static fullMatrix<double> J_ij_matrix;
+    STensorOperation::fromSTensor43ToFullMatrix(J_ij,J_ij_matrix);
+    for (int row=0; row<6; row++)
+    {
+      for (int col=0; col<6; col++)
+      {
+        dres(row, col+6*jcl) += J_ij_matrix(row,col);
+      }
+    }
+  }
+}
+void ReductionTFA::getJacHS_rs(int r, int s, const ClusteringData *q0,  const ClusteringData *q1, STensor43& Jac_rs) const 
+{
+  if (r==s)
+  {
+    STensorOperation::unity(Jac_rs);
+  }
+  else
+  {
+    STensorOperation::zero(Jac_rs);
+  }
+  
+  const STensor3& macroeps1 = q1->getConstRefToMacroStrain(); 
+  
+  const STensor43& C0iso = _clusteringData->getReferenceStiffnessIso();
+  double G0 = C0iso(0,1,0,1);
+  const double& Gtan = q1->getConstRefToTangentShearModulus(); 
+  const STensor43 &Drs =  getClusterInteractionTensor(r,s); 
+  const STensor43 &Calgs = q1->getConstRefToTangent(s);
+  
+  const STensor3& sig1s = q1->getConstRefToStress(s);
+  const STensor3& sig0s = q0->getConstRefToStress(s);   
+  STensor3 dsigs(sig1s);
+  dsigs -= sig0s;
+   
+  STensor43 fac; 
+  fac = Calgs;
+  fac *= G0/Gtan;
+  fac -= C0iso; 
+  STensorOperation::multSTensor43Add(Drs,fac,-1.,Jac_rs);
+  
+  /*STensor3 dGtandeps;
+  dtangentShearModulusOveralldeps(q0,q1,s,dGtandeps);
+  STensor3 fac2_part;
+  int nbClusters = _clusteringData->getTotalNumberOfClusters(); 
+  for (int p =0; p < nbClusters; p++)
+  {
+    const STensor43 &Drp =  getClusterInteractionTensor(r,p);
+    const STensor3& sig1p = q1->getConstRefToStress(p);
+    const STensor3& sig0p = q0->getConstRefToStress(p); 
+    STensor3 Dsigp(sig1p);
+    Dsigp -= sig0p; 
+    STensorOperation::multSTensor43STensor3Add(Drp,Dsigp,1.,fac2_part);
+  }
+  fac2_part *= G0/(Gtan*Gtan);
+  STensorOperation::prodAdd(fac2_part,dGtandeps,1.,Jac_rs);*/
+}
+
+
+void ReductionTFA::getLinearTermPFA(int clusterId, const ClusteringData *q0,  const ClusteringData *q1, fullVector<double>& res) const
 {
   int nbClusters = _clusteringData->getTotalNumberOfClusters();
   
@@ -1560,17 +1678,15 @@ void ReductionTFA::getLinearTermPolarization(int clusterId, const ClusteringData
     //STensorOperation::multSTensor43STensor3(prefac,dsigj,fac);
     STensorOperation::multSTensor43STensor3Add(C0iso,depsj,-1.,fac);
 
-
     //STensorOperation::multSTensor43(C0,C_inv,prefac);
     //STensorOperation::multSTensor43STensor3(prefac,dsigj,fac);
     //STensorOperation::multSTensor43STensor3Add(C0,depsj,-1.,fac);
-    
-         
+            
     STensorOperation::multSTensor43STensor3Add(Dij,fac,-1.,resTen);          
   }
   STensorOperation::fromSTensor3ToFullVector(resTen,res);
 };
-void ReductionTFA::getBiLinearTermPolarization(int clusterId, const ClusteringData *q0,  const ClusteringData *q1, std::vector<int>& othersId, fullMatrix<double>& dres) const 
+void ReductionTFA::getBiLinearTermPFA(int clusterId, const ClusteringData *q0,  const ClusteringData *q1, std::vector<int>& othersId, fullMatrix<double>& dres) const 
 {
   int nbClusters = _clusteringData->getTotalNumberOfClusters();
   othersId.resize(nbClusters);
@@ -1586,7 +1702,7 @@ void ReductionTFA::getBiLinearTermPolarization(int clusterId, const ClusteringDa
   for (int jcl=0; jcl< nbClusters; jcl++)
   {
     static STensor43 J_ij;
-    getJacPolarization_rs(clusterId,jcl,q0,q1,J_ij);
+    getJacHS_rs(clusterId,jcl,q0,q1,J_ij);
     static fullMatrix<double> J_ij_matrix;
     STensorOperation::fromSTensor43ToFullMatrix(J_ij,J_ij_matrix);
     for (int row=0; row<6; row++)
@@ -1598,7 +1714,7 @@ void ReductionTFA::getBiLinearTermPolarization(int clusterId, const ClusteringDa
     }
   }
 }
-void ReductionTFA::getJacPolarization_rs(int r, int s, const ClusteringData *q0,  const ClusteringData *q1, STensor43& Jac_rs) const 
+void ReductionTFA::getJacPFA_rs(int r, int s, const ClusteringData *q0,  const ClusteringData *q1, STensor43& Jac_rs) const 
 {
   if (r==s)
   {
@@ -1674,6 +1790,7 @@ void ReductionTFA::getJacPolarization_rs(int r, int s, const ClusteringData *q0,
   STensorOperation::prodAdd(fac2_part,dGtandeps,1.,Jac_rs);*/
 }
 
+
 void ReductionTFA::elasticStiffnessHom(STensor43& CelHom) const 
 {
   int nbClusters = _clusteringData->getTotalNumberOfClusters(); 
@@ -2227,20 +2344,18 @@ void IncrementalTangentTFAWithFrame::localConstitutive(const STensor3& F0, const
 
 
 //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
-IncrementalTangentTFAPolarization::IncrementalTangentTFAPolarization(int solverType, int dim, int correction, bool withFrame, bool polarization, int tag): ReductionTFA(solverType, dim, correction, withFrame, polarization, tag){}
-IncrementalTangentTFAPolarization::~IncrementalTangentTFAPolarization(){}
+IncrementalTangentHS::IncrementalTangentHS(int solverType, int dim, int correction, bool withFrame, bool polarization, int tag): ReductionTFA(solverType, dim, correction, withFrame, polarization, tag){}
+IncrementalTangentHS::~IncrementalTangentHS(){}
 
 
-void IncrementalTangentTFAPolarization::localConstitutive(const STensor3& F0, const STensor3& Fn, const ClusteringData *q0,  ClusteringData *q1)
+void IncrementalTangentHS::localConstitutive(const STensor3& F0, const STensor3& Fn, const ClusteringData *q0,  ClusteringData *q1)
 {
   int nbClusters = _clusteringData->getTotalNumberOfClusters();
   
   const STensor43& C0 = _clusteringData->getReferenceStiffness();
   const STensor43& C0iso = _clusteringData->getReferenceStiffnessIso();
   double G0 = C0iso(0,1,0,1);
-  double k0 = C0iso(0,0,0,0) - 4./3.*G0;
   
-  //
   const STensor3& eps0 = q0->getConstRefToMacroStrain();
   STensor3& eps1 = q1->getRefToMacroStrain();
   for  (int i=0; i<3; i++)
@@ -2260,15 +2375,88 @@ void IncrementalTangentTFAPolarization::localConstitutive(const STensor3& F0, co
   double DepsEq = TFANumericTools::EquivalentStrain(Deps);
   
   const STensor3& P0hom = q0->getConstRefToMacroStress();
-  const STensor3& epsEigMacro0 = q0->getConstRefToMacroEigenStrain();
   STensor3& Phom = q1->getRefToMacroStress();
-  STensor3& epsEigMacro = q1->getRefToMacroEigenStrain();
+    
+  // local constitutive behavior
+  static STensor3 Isecond(1.);
+  for (int icl =0; icl < nbClusters; icl++)
+  {
+    const materialLaw *law = getLawForCluster(icl); 
+    static STensor3 F0i, F1i;
+    F0i = q0->getConstRefToStrain(icl);
+    F1i = q1->getConstRefToStrain(icl);
+    F0i += Isecond;
+    F1i += Isecond;
+    STensor3& P1i = q1->getRefToStress(icl);
+    STensor43& Tangenti = q1->getRefToTangent(icl);
+    STensor43& depsEig1depsi = q1->getRefTodEigenStraindStrain(icl);
+    STensor3& epsEig1i = q1->getRefToEigenStrain(icl);
+    //
+    const IPVariable* ipv0i = q0->getConstRefToIPv(icl);
+    IPVariable* ipv1i = q1->getRefToIPv(icl);
+    if(_clusterIncOri)
+    {
+      const fullVector<double>& euler_i = getClusterMeanFiberOrientation(icl);
+      law->constitutiveTFA_incOri(F0i,F1i,euler_i,P1i,ipv0i,ipv1i,Tangenti,epsEig1i,depsEig1depsi);
+    }
+    else
+    {
+      law->constitutiveTFA(F0i,F1i,P1i,ipv0i,ipv1i,Tangenti,epsEig1i,depsEig1depsi);
+    }
+  }
   
-  STensor3 PtrHom; 
-  elasticTotalTrialStressHom(q1,PtrHom);
+  STensor3 DPhom;
+  double DsigEqHom;  
+  q1->computeHomogenizedStress(Phom);
+  DPhom = Phom;
+  DPhom -= P0hom;
+  DsigEqHom = TFANumericTools::EquivalentStress(DPhom);
   
-  STensor3 PtrHom_true;
-  STensorOperation::multSTensor43STensor3(C0,eps1,PtrHom_true);
+  double& Gel = q1->getRefToElasticShearModulus();
+  Gel = G0;
+  double& Gtan = q1->getRefToTangentShearModulus();
+  Gtan = G0;
+  if(DepsEq>1.e-10)
+  {
+    Gtan = DsigEqHom/(3.*DepsEq);
+  }
+  if(Gtan < 5.){Gtan=5.;};
+};
+
+IncrementalTangentPFA::IncrementalTangentPFA(int solverType, int dim, int correction, bool withFrame, bool polarization, int tag): ReductionTFA(solverType, dim, correction, withFrame, polarization, tag){}
+IncrementalTangentPFA::~IncrementalTangentPFA(){}
+
+
+void IncrementalTangentPFA::localConstitutive(const STensor3& F0, const STensor3& Fn, const ClusteringData *q0,  ClusteringData *q1)
+{
+  int nbClusters = _clusteringData->getTotalNumberOfClusters();
+  
+  const STensor43& C0 = _clusteringData->getReferenceStiffness();
+  const STensor43& C0iso = _clusteringData->getReferenceStiffnessIso();
+  double G0 = C0iso(0,1,0,1);
+  double k0 = C0iso(0,0,0,0) - 4./3.*G0;
+  
+  //
+  const STensor3& eps0 = q0->getConstRefToMacroStrain();
+  STensor3& eps1 = q1->getRefToMacroStrain();
+  for  (int i=0; i<3; i++)
+  {
+    for (int j=0; j<3; j++)
+    {
+      eps1(i,j) = (Fn(i,j)+Fn(j,i))*0.5;
+    }
+  }
+  eps1(0,0) -= 1.;
+  eps1(1,1) -= 1.;
+  eps1(2,2) -= 1.;
+  double epsEq = TFANumericTools::EquivalentStrain(eps1);
+  STensor3 Deps;
+  Deps = eps1;
+  Deps -= eps0;
+  double DepsEq = TFANumericTools::EquivalentStrain(Deps);
+  
+  const STensor3& P0hom = q0->getConstRefToMacroStress();
+  STensor3& Phom = q1->getRefToMacroStress();
     
   // local constitutive behavior
   static STensor3 Isecond(1.);
@@ -2286,8 +2474,7 @@ void IncrementalTangentTFAPolarization::localConstitutive(const STensor3& F0, co
     STensor3& epsEig1i = q1->getRefToEigenStrain(icl);
     //
     const IPVariable* ipv0i = q0->getConstRefToIPv(icl);
-    IPVariable* ipv1i = q1->getRefToIPv(icl);
-    STensor43& Secanti = q1->getRefToSecant(icl);    
+    IPVariable* ipv1i = q1->getRefToIPv(icl); 
     if(_clusterIncOri)
     {
       const fullVector<double>& euler_i = getClusterMeanFiberOrientation(icl);
@@ -2300,26 +2487,12 @@ void IncrementalTangentTFAPolarization::localConstitutive(const STensor3& F0, co
   }
   
   STensor3 DPhom,DepsEigMacro;
-  double sigEqHom,DsigEqHom;
-  double DepsEigEqHom;
+  double DsigEqHom;
   
   q1->computeHomogenizedStress(Phom);
-  //sigEqHom = TFANumericTools::EquivalentStress(Phom);
   DPhom = Phom;
   DPhom -= P0hom;
   DsigEqHom = TFANumericTools::EquivalentStress(DPhom);
-
-  //STensor3 sigEigMacro;
-  //sigEigMacro = Phom;
-  //sigEigMacro -= PtrHom;
-  
-  //STensor43 SelHom;
-  //STensorOperation::inverseSTensor43(C0,SelHom);
-  //STensorOperation::multSTensor43STensor3(SelHom,sigEigMacro,epsEigMacro);
-  //epsEigMacro *= -1.;
-  //DepsEigMacro = epsEigMacro;
-  //DepsEigMacro -= epsEigMacro0;
-  //DepsEigEqHom = TFANumericTools::EquivalentStrain(DepsEigMacro);
   
   double& Gel = q1->getRefToElasticShearModulus();
   Gel = G0;
@@ -2327,8 +2500,6 @@ void IncrementalTangentTFAPolarization::localConstitutive(const STensor3& F0, co
   Gtan = G0;
   if(DepsEq>1.e-10)
   {
-    //DepsEigEqHom = DepsEq - DsigEqHom/(3.*G0);
-    //Gtan *= (1.-DepsEigEqHom/DepsEq);
     Gtan = DsigEqHom/(3.*DepsEq);
   }
   if(Gtan < 5){Gtan=5;};
@@ -2347,6 +2518,7 @@ void IncrementalTangentTFAPolarization::localConstitutive(const STensor3& F0, co
 };
 
 
+//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
 HierarchicalReductionTFA::HierarchicalReductionTFA(int solverType, int dim, int correction, bool withFrame, bool polarization, int tag): 
                                                                      ReductionTFA(solverType, dim, 0, false, polarization, tag), _sysHierarchical(NULL) {}
                                                                      
@@ -3433,7 +3605,7 @@ void HierarchicalReductionTFA::getJac_rsHierarchical(int r, int s, const Cluster
   STensorOperation::multSTensor43Add(Drs,depsEig1dstrains,1.,Jac_rs);
 }
 
-void HierarchicalReductionTFA::getLinearTermPolarizationHierarchical(int clusterId, const ClusteringData *q0,  const ClusteringData *q1, fullVector<double>& res) const
+void HierarchicalReductionTFA::getLinearTermHSHierarchical(int clusterId, const ClusteringData *q0,  const ClusteringData *q1, fullVector<double>& res) const
 {
   int nbClusters = q0->clustersNb;
   
@@ -3482,7 +3654,7 @@ void HierarchicalReductionTFA::getLinearTermPolarizationHierarchical(int cluster
   }
   STensorOperation::fromSTensor3ToFullVector(resTen,res);
 };
-void HierarchicalReductionTFA::getBiLinearTermPolarizationHierarchical(int clusterId, const ClusteringData *q0,  const ClusteringData *q1, std::vector<int>& othersId, fullMatrix<double>& dres)
+void HierarchicalReductionTFA::getBiLinearTermHSHierarchical(int clusterId, const ClusteringData *q0,  const ClusteringData *q1, std::vector<int>& othersId, fullMatrix<double>& dres)
 const 
 {
   int nbClusters = q0->clustersNb;
@@ -3499,7 +3671,7 @@ const
   for (int jcl=0; jcl< nbClusters; jcl++)
   {
     static STensor43 J_ij;
-    getJacPolarization_rsHierarchical(clusterId,jcl,q0,q1,J_ij);
+    getJacHS_rsHierarchical(clusterId,jcl,q0,q1,J_ij);
     static fullMatrix<double> J_ij_matrix;
     STensorOperation::fromSTensor43ToFullMatrix(J_ij,J_ij_matrix);
     for (int row=0; row<6; row++)
@@ -3511,7 +3683,7 @@ const
     }
   }
 }
-void HierarchicalReductionTFA::getJacPolarization_rsHierarchical(int r, int s, const ClusteringData *q0,  const ClusteringData *q1, STensor43& Jac_rs) const 
+void HierarchicalReductionTFA::getJacHS_rsHierarchical(int r, int s, const ClusteringData *q0,  const ClusteringData *q1, STensor43& Jac_rs) const 
 {
   std::vector<int> clHostIDs = q0->upperClusterIDs;
 
diff --git a/NonLinearSolver/modelReduction/modelReduction.h b/NonLinearSolver/modelReduction/modelReduction.h
index d380eef553f2a574f27db19c80ce6db5798760f0..c09f7948ead0f23dd9b52c2d68554c44c18aa3c5 100644
--- a/NonLinearSolver/modelReduction/modelReduction.h
+++ b/NonLinearSolver/modelReduction/modelReduction.h
@@ -23,8 +23,8 @@ class nonLinearSystemPETSc;
 class modelReduction
 {
   public:
-    enum ReductionMethod{TFA_IncrementalTangent=0, TFA_IncrementalTangentWithFrame, TFA_IncrementalTangentPolarization, 
-                         TFA_HierarchicalIncrementalTangent, TFA_HierarchicalIncrementalTangentMixed};
+    enum ReductionMethod{TFA_IncrementalTangent=0, TFA_IncrementalTangentWithFrame, HS_IncrementalTangent, PFA_IncrementalTangent, 
+                         TFA_HierarchicalIncrementalTangent};
   #ifndef SWIG
   public:
     modelReduction(){}
@@ -174,9 +174,13 @@ class ReductionTFA: public modelReduction
     //////////////////////////////////////////////////////////////////////////////////////////
     virtual void getJac_rs(int r, int s, const ClusteringData *q0,  const ClusteringData *q1, STensor43& Jac_rs) const;
     
-    virtual void getLinearTermPolarization(int clusterId, const ClusteringData *q0,  const ClusteringData *q1, fullVector<double>& res) const;
-    virtual void getBiLinearTermPolarization(int clusterId, const ClusteringData *q0,  const ClusteringData *q1, std::vector<int>& othersId, fullMatrix<double>& dres) const;
-    virtual void getJacPolarization_rs(int r, int s, const ClusteringData *q0,  const ClusteringData *q1, STensor43& Jac_rs) const;
+    virtual void getLinearTermHS(int clusterId, const ClusteringData *q0,  const ClusteringData *q1, fullVector<double>& res) const;
+    virtual void getBiLinearTermHS(int clusterId, const ClusteringData *q0,  const ClusteringData *q1, std::vector<int>& othersId, fullMatrix<double>& dres) const;
+    virtual void getJacHS_rs(int r, int s, const ClusteringData *q0,  const ClusteringData *q1, STensor43& Jac_rs) const;
+    
+    virtual void getLinearTermPFA(int clusterId, const ClusteringData *q0,  const ClusteringData *q1, fullVector<double>& res) const;
+    virtual void getBiLinearTermPFA(int clusterId, const ClusteringData *q0,  const ClusteringData *q1, std::vector<int>& othersId, fullMatrix<double>& dres) const;
+    virtual void getJacPFA_rs(int r, int s, const ClusteringData *q0,  const ClusteringData *q1, STensor43& Jac_rs) const;
     
     virtual void elasticStiffnessHom(STensor43& CelHom) const;
     virtual void elasticTotalTrialStressHom(const ClusteringData *q, STensor3& PtrHom) const;
@@ -234,13 +238,25 @@ class IncrementalTangentTFAWithFrame : public ReductionTFA
     virtual void localConstitutive(const STensor3& F0, const STensor3& Fn, const ClusteringData *q0,  ClusteringData *q1);
   #endif // SWIG
 };
-class IncrementalTangentTFAPolarization : public ReductionTFA
+class IncrementalTangentHS : public ReductionTFA
+{
+  public:
+    IncrementalTangentHS(int solverType, int dim, int correction, bool withFrame, bool polarization, int tag=1000);
+  #ifndef SWIG
+    virtual ~IncrementalTangentHS();
+    virtual ReductionMethod getMethod() const {return modelReduction::HS_IncrementalTangent;};
+
+  protected:
+    virtual void localConstitutive(const STensor3& F0, const STensor3& Fn, const ClusteringData *q0,  ClusteringData *q1);
+  #endif // SWIG
+};
+class IncrementalTangentPFA : public ReductionTFA
 {
   public:
-    IncrementalTangentTFAPolarization(int solverType, int dim, int correction, bool withFrame, bool polarization, int tag=1000);
+    IncrementalTangentPFA(int solverType, int dim, int correction, bool withFrame, bool polarization, int tag=1000);
   #ifndef SWIG
-    virtual ~IncrementalTangentTFAPolarization();
-    virtual ReductionMethod getMethod() const {return modelReduction::TFA_IncrementalTangentPolarization;};
+    virtual ~IncrementalTangentPFA();
+    virtual ReductionMethod getMethod() const {return modelReduction::PFA_IncrementalTangent;};
 
   protected:
     virtual void localConstitutive(const STensor3& F0, const STensor3& Fn, const ClusteringData *q0,  ClusteringData *q1);
@@ -333,9 +349,9 @@ class HierarchicalReductionTFA : public ReductionTFA
     virtual void getBiLinearTermHierarchical(int clusterId, const ClusteringData *q0,  const ClusteringData *q1, std::vector<int>& othersId, fullMatrix<double>& dres) const;
     virtual void getJac_rsHierarchical(int r, int s, const ClusteringData *q0,  const ClusteringData *q1, STensor43& Jac_rs) const;
     
-    virtual void getLinearTermPolarizationHierarchical(int clusterId, const ClusteringData *q0,  const ClusteringData *q1, fullVector<double>& res) const;
-    virtual void getBiLinearTermPolarizationHierarchical(int clusterId, const ClusteringData *q0,  const ClusteringData *q1, std::vector<int>& othersId, fullMatrix<double>& dres) const;
-    virtual void getJacPolarization_rsHierarchical(int r, int s, const ClusteringData *q0,  const ClusteringData *q1, STensor43& Jac_rs) const;
+    virtual void getLinearTermHSHierarchical(int clusterId, const ClusteringData *q0,  const ClusteringData *q1, fullVector<double>& res) const;
+    virtual void getBiLinearTermHSHierarchical(int clusterId, const ClusteringData *q0,  const ClusteringData *q1, std::vector<int>& othersId, fullMatrix<double>& dres) const;
+    virtual void getJacHS_rsHierarchical(int r, int s, const ClusteringData *q0,  const ClusteringData *q1, STensor43& Jac_rs) const;
         
     void initSolveHierarchical(const ClusteringData *q0,  const ClusteringData *q1, nonLinearSystemPETSc<double>* &NLsystem);
     void preallocateSystemHierarchical(const ClusteringData *q0,  const ClusteringData *q1, nonLinearSystemPETSc<double>* &NLsystem);