diff --git a/Solver/functionSpace.cpp b/Solver/functionSpace.cpp
index 853c23188fd595614a016a6cc71ecdb7db4fe73f..fed1efa9045ff667d19c0f1529b96ac7497f6b52 100644
--- a/Solver/functionSpace.cpp
+++ b/Solver/functionSpace.cpp
@@ -12,3 +12,4 @@
 #include "functionSpace.h"
 
 const SVector3 VectorLagrangeFunctionSpace::BasisVectors[3]={SVector3(1,0,0),SVector3(0,1,0),SVector3(0,0,1)};
+
diff --git a/Solver/functionSpace.h b/Solver/functionSpace.h
index ac42f08dc65057293e7d3b79957b2d9c52e54022..7ca11a6697d3bb516e4f93e32e78da2a4844998c 100644
--- a/Solver/functionSpace.h
+++ b/Solver/functionSpace.h
@@ -9,6 +9,7 @@
 #include "Numeric.h"
 #include "MElement.h"
 #include "dofManager.h"
+#include "simpleFunction.h"
 
 //class SVoid{};
 
@@ -367,15 +368,16 @@ class xFemFunctionSpace : public FunctionSpace<T>
   typedef typename TensorialTraits<T>::GradType GradType;
   typedef typename TensorialTraits<T>::HessType HessType;
  protected:
-  FunctionSpace<T>* _spacebase;
-  //Function<double>* _enrichment;
+   FunctionSpace<T>* _spacebase;
+   simpleFunctionOnElement<double> *_funcEnrichment;
+
  public:
   virtual void hessfuvw(MElement *ele, double u, double v, double w,std::vector<HessType> &hess){};
-  xFemFunctionSpace(FunctionSpace<T>* spacebase) : _spacebase(spacebase) {};
-  virtual void f(MElement *ele, double u, double v, double w,std::vector<ValType> &vals){};
-  virtual void gradf(MElement *ele, double u, double v, double w,std::vector<GradType> &grads){};
-  virtual int getNumKeys(MElement *ele){};
-  virtual void getKeys(MElement *ele, std::vector<Dof> &keys){};
+  xFemFunctionSpace(FunctionSpace<T>* spacebase,simpleFunctionOnElement<double> *funcEnrichment) : _spacebase(spacebase),_funcEnrichment(funcEnrichment){};
+  virtual void f(MElement *ele, double u, double v, double w,std::vector<ValType> &vals);
+  virtual void gradf(MElement *ele, double u, double v, double w,std::vector<GradType> &grads);
+  virtual int getNumKeys(MElement *ele);
+  virtual void getKeys(MElement *ele, std::vector<Dof> &keys);
 };
 
 
@@ -399,11 +401,226 @@ class FilteredFunctionSpace : public FunctionSpace<T>
   virtual void hessfuvw(MElement *ele, double u, double v, double w,std::vector<HessType> &hess){};
   FilteredFunctionSpace<T,F>(FunctionSpace<T>* spacebase,F * filter) : _spacebase(spacebase),_filter(filter)
   {};
-  virtual void f(MElement *ele, double u, double v, double w,std::vector<ValType> &vals){};;
-  virtual void gradf(MElement *ele, double u, double v, double w,std::vector<GradType> &grads){};;
-  virtual int getNumKeys(MElement *ele){};
-  virtual void getKeys(MElement *ele, std::vector<Dof> &keys){};
+  virtual void f(MElement *ele, double u, double v, double w,std::vector<ValType> &vals);
+  virtual void gradf(MElement *ele, double u, double v, double w,std::vector<GradType> &grads);
+  virtual int getNumKeys(MElement *ele);
+  virtual void getKeys(MElement *ele, std::vector<Dof> &keys);
 };
 
 
+
+template <class T> void xFemFunctionSpace<T>::f(MElement *ele, double u, double v, double w,std::vector<ValType> &vals)
+{
+   // We need parent parameters
+  MElement * elep;
+  if (ele->getParent()) elep = ele->getParent();
+  else elep = ele;
+
+    // Get the spacebase valsd
+  std::vector<ValType> valsd;
+  xFemFunctionSpace<T>::_spacebase->f(elep,u,v,w,valsd);
+
+  int nbdofs=valsd.size();
+  int curpos=vals.size();  // if in composite function space
+  vals.reserve(curpos+nbdofs);
+
+    // then enriched dofs so the order is ex:(a2x,a2y,a3x,a3y)
+  if (nbdofs>0) // if enriched
+  {
+        // Enrichment function calcul
+    SPoint3 p;
+    elep->pnt(u, v, w, p); // parametric to cartesian coordinates
+    double func;
+    _funcEnrichment->setElement(elep);
+    func = (*_funcEnrichment)(p.x(), p.y(), p.z());
+    for (int i=0 ;i<nbdofs;i++)
+    {
+      vals.push_back(valsd[i]*func);
+    }
+  }
+}
+
+template <class T> void xFemFunctionSpace<T>::gradf(MElement *ele, double u, double v, double w,std::vector<GradType> &grads)
+{
+
+    // We need parent parameters
+  MElement * elep;
+  if (ele->getParent()) elep = ele->getParent();
+  else elep = ele;
+
+    // Get the spacebase gradsd
+  std::vector<GradType> gradsd;
+  xFemFunctionSpace<T>::_spacebase->gradf(elep,u,v,w,gradsd);
+
+
+  int nbdofs=gradsd.size();
+
+    // We need spacebase valsd to compute total gradient
+  std::vector<ValType> valsd;
+  xFemFunctionSpace<T>::_spacebase->f(elep,u,v,w,valsd);
+
+  int curpos=grads.size();  // if in composite function space
+  grads.reserve(curpos+nbdofs);
+
+    // then enriched dofs so the order is ex:(a2x,a2y,a3x,a3y)
+  if (nbdofs>0) // if enriched
+  {
+    double df[3];
+    SPoint3 p;
+    elep->pnt(u, v, w, p);
+    _funcEnrichment->setElement(elep);
+    _funcEnrichment->gradient (p.x(), p.y(),p.z(),df[0],df[1],df[2]);
+    ValType gradfuncenrich(df[0],df[1],df[2]);
+
+        // Enrichment function calcul
+
+    double func;
+    _funcEnrichment->setElement(elep);
+    func = (*_funcEnrichment)(p.x(), p.y(), p.z());
+
+    for (int i=0 ;i<nbdofs;i++)
+    {
+      GradType GradFunc;
+      tensprod(valsd[i],gradfuncenrich,GradFunc);
+      grads.push_back(gradsd[i]*func + GradFunc);
+    }
+  }
+}
+
+template <class T> int xFemFunctionSpace<T>::getNumKeys(MElement *ele)
+{
+  MElement * elep;
+  if (ele->getParent()) elep = ele->getParent();
+  else elep = ele;
+  int nbdofs = xFemFunctionSpace<T>::_spacebase->getNumKeys(ele);
+  return nbdofs;
+}
+
+template <class T> void xFemFunctionSpace<T>::getKeys(MElement *ele, std::vector<Dof> &keys)
+{
+  MElement * elep;
+  if (ele->getParent()) elep = ele->getParent();
+  else elep = ele;
+
+  int normalk=xFemFunctionSpace<T>::_spacebase->getNumKeys(elep);
+
+  std::vector<Dof> bufk;
+  bufk.reserve(normalk);
+  xFemFunctionSpace<T>::_spacebase->getKeys(elep,bufk);
+  int normaldofs=bufk.size();
+  int nbdofs = normaldofs;
+
+  int curpos=keys.size();
+  keys.reserve(curpos+nbdofs);
+
+    // get keys so the order is ex:(a2x,a2y,a3x,a3y)
+    // enriched dof tagged with ( i2 -> i2 + 1 )
+  for (int i=0 ;i<nbdofs;i++)
+  {
+    int i1,i2;
+    Dof::getTwoIntsFromType(bufk[i].getType(), i1,i2);
+    keys.push_back(Dof(bufk[i].getEntity(),Dof::createTypeWithTwoInts(i1,i2+1)));
+  }
+}
+
+
+// Filtered function space
+//
+
+template <class T,class F> void FilteredFunctionSpace<T,F>::f(MElement *ele, double u, double v, double w,std::vector<ValType> &vals)
+{
+    // We need parent parameters
+  MElement * elep;
+  if (ele->getParent()) elep = ele->getParent();
+  else elep = ele;
+
+  std::vector<ValType> valsd;
+
+  _spacebase->f(elep,u,v,w,valsd);
+
+  int normalk=_spacebase->getNumKeys(elep);
+  std::vector<Dof> bufk;
+  bufk.reserve(normalk);
+  _spacebase->getKeys(elep,bufk);
+
+  for (int i=0;i<bufk.size();i++)
+  {
+    if ((*_filter)(bufk[i]))
+      vals.push_back(valsd[i]);
+  }
+
+}
+
+
+template <class T,class F> void FilteredFunctionSpace<T,F>::gradf(MElement *ele, double u, double v, double w,std::vector<GradType> &grads)
+{
+    // We need parent parameters
+  MElement * elep;
+  if (ele->getParent()) elep = ele->getParent();
+  else elep = ele;
+
+    // Get space base gradsd
+  std::vector<GradType> gradsd;
+  _spacebase->gradf(elep,u,v,w,gradsd);
+
+    // Get numkeys
+  int normalk=_spacebase->getNumKeys(elep);
+  std::vector<Dof> bufk;
+  bufk.reserve(normalk);
+  _spacebase->getKeys(elep,bufk);
+
+  for (int i=0;i<bufk.size();i++)
+  {
+    if ( (*_filter)(bufk[i]))
+      grads.push_back(gradsd[i]);
+  }
+
+}
+
+template <class T,class F> int FilteredFunctionSpace<T,F>::getNumKeys(MElement *ele)
+{
+  MElement *elep;
+  if (ele->getParent()) elep = ele->getParent();
+  else elep = ele;
+
+  int nbdofs = 0;
+
+  int normalk=_spacebase->getNumKeys(elep);
+  std::vector<Dof> bufk;
+  bufk.reserve(normalk);
+  _spacebase->getKeys(elep,bufk);
+
+  for (int i=0;i<bufk.size();i++)
+  {
+    if ( (*_filter)(bufk[i]))
+      nbdofs = nbdofs + 1;
+  }
+  return nbdofs;
+}
+
+template <class T,class F> void FilteredFunctionSpace<T,F>::getKeys(MElement *ele, std::vector<Dof> &keys)
+{
+  MElement * elep;
+  if (ele->getParent()) elep = ele->getParent();
+  else elep = ele;
+
+  int normalk=_spacebase->getNumKeys(elep);
+
+  std::vector<Dof> bufk;
+  bufk.reserve(normalk);
+  _spacebase->getKeys(elep,bufk);
+  int normaldofs=bufk.size();
+  int nbdofs = 0;
+
+  for (int i=0;i<bufk.size();i++)
+  {
+    if ( (*_filter)(bufk[i]))
+      keys.push_back(bufk[i]);
+  }
+}
+
+
+
+
+
 #endif
diff --git a/Solver/terms.h b/Solver/terms.h
index b110de521a9cbedc8d727f1834e50513b5eea5bd..837ed4f126515826b2e5c63b5631f4e248000424 100644
--- a/Solver/terms.h
+++ b/Solver/terms.h
@@ -21,17 +21,18 @@
 #include "functionSpace.h"
 #include "groupOfElements.h"
 #include "materialLaw.h"
-#include "../contrib/cm3/MInterfaceElement.h"
+
 class  BilinearTermBase
 {
  public :
   virtual ~BilinearTermBase() {}
   virtual void get(MElement *ele,int npts,IntPt *GP,fullMatrix<double> &m) = 0 ;
+  /* has nothing to do here...
   virtual void getInter(MInterfaceElement *iele,int npts,IntPt *GP,fullMatrix<double> &m){} ;
   virtual void getInterForce(MInterfaceElement *iele,int npts,IntPt *GP,const fullMatrix<double> &disp,fullMatrix<double> &m){} ;
   virtual void getForce(MElement *ele,int npts,IntPt *GP,const fullMatrix<double> &disp, fullMatrix<double> &m){}
   virtual void getInterOnBoundary(MInterfaceElement *iele,int npts,IntPt *GP,fullMatrix<double> &m){}
-  virtual void getInterForceOnBoundary(MInterfaceElement *iele,int npts,IntPt *GP,const fullMatrix<double> &disp,fullMatrix<double> &m){} ;
+  virtual void getInterForceOnBoundary(MInterfaceElement *iele,int npts,IntPt *GP,const fullMatrix<double> &disp,fullMatrix<double> &m){} ;*/
 };
 
 template<class T1,class T2> class BilinearTerm : public BilinearTermBase