diff --git a/Solver/solverField.h b/Solver/solverField.h
new file mode 100644
index 0000000000000000000000000000000000000000..d2d96ad570f22dbebc602ac85c4093097f5f63b7
--- /dev/null
+++ b/Solver/solverField.h
@@ -0,0 +1,118 @@
+//
+// C++ Interface: field
+//
+// Description: 
+//
+//
+// Author:  <Eric Bechet>, (C) 2009
+//
+// Copyright: See COPYING file that comes with this distribution
+//
+//
+
+
+#ifndef _SOLVERFIELD_H_
+#define _SOLVERFIELD_H_
+
+#include <vector>
+#include <iostream>
+#include "MElement.h"
+#include "dofManager.h"
+#include "functionSpace.h"
+
+template<class T>
+class SolverField : public FunctionSpace<T> // being able to use it instead of a real function space is interesting (nbkeys=1, dofs undefined (or could be defined by element-wise )
+{
+ public:
+  typedef typename TensorialTraits<T>::ValType ValType;
+  typedef typename TensorialTraits<T>::GradType GradType;
+ private:
+  dofManager<double> *dm;
+  FunctionSpace<T> *fs;
+ public:
+  SolverField(dofManager<double> *dm_,  FunctionSpace<T> *fs_) : dm(dm_),fs(fs_) {}
+  virtual int getNumKeys(MVertex *ver) { return 1;}
+  virtual int getNumKeys(MElement *ele) { return 1;}
+ private:
+  virtual void getKeys(MElement *ele, std::vector<Dof> &keys) { Msg::Error("getKeys for SolverField should'nt be called");}
+  virtual void getKeys(MVertex *ver, std::vector<Dof> &keys) {Msg::Error("getKeys for SolverField should'nt be called");}
+ public:
+
+  virtual void f(MVertex *ver, std::vector<ValType> &vals)
+  {
+    ValType val;
+    f(ver,val);
+    vals.push_back(val);
+  }
+
+  virtual void f(MVertex *ver, ValType &val)
+  {
+    std::vector<Dof> D;
+    std::vector<ValType> SFVals;
+    std::vector<double> DMVals;
+    fs->getKeys(ver,D);
+    dm->getDofValue(D,DMVals);
+    fs->f(ver,SFVals);
+    val=ValType();
+    for (int i=0;i<D.size();++i)
+      val+=SFVals[i]*DMVals[i];
+  }
+
+  virtual void f(MElement *ele, double u, double v, double w, ValType &val)
+  {
+    std::vector<Dof> D;
+    std::vector<ValType> SFVals;
+    std::vector<double> DMVals;
+    fs->getKeys(ele,D);
+    dm->getDofValue(D,DMVals);
+    fs->f(ele,u,v,w,SFVals);
+    val=ValType();
+    for (int i=0;i<D.size();++i)
+      val+=SFVals[i]*DMVals[i];
+  }
+
+  virtual void f(MElement *ele, double u, double v, double w, std::vector<ValType> &vals)
+  {
+    ValType val;
+    f(ele,u,v,w,val);
+    vals.push_back(val);
+  }
+
+  virtual void gradf(MElement *ele, double u, double v, double w,GradType &grad)
+  {
+    std::vector<Dof> D;
+    std::vector<GradType> SFGrads;
+    std::vector<double> DMVals;
+    fs->getKeys(ele,D);
+    dm->getDofValue(D,DMVals);
+    fs->gradf(ele,u,v,w,SFGrads);
+    grad=GradType();
+    for (int i=0;i<D.size();++i)
+      grad+= SFGrads[i] * DMVals[i];
+  }
+
+  virtual void gradf(MElement *ele, double u, double v, double w,std::vector<GradType> &grads)
+  {
+    GradType grad;
+    gradf(ele,u,v,w,grad);
+    grads.push_back(grad);
+  }
+};
+
+
+
+
+/*
+
+class Formulation
+{
+  std::vector<FunctionSpace<double>* > scalarfs;
+  std::vector<FunctionSpace<SVector3>* > vectorfs;
+  std::vector<groupOfElements* > groups;
+  std::vector<std::pair<MElement*,std::vector<groupOfElements&> > > links;
+  dofManager<double> *dm; // 
+
+};
+*/
+
+#endif //_SOLVERFIELD_H_