diff --git a/Solver/convexCombinationTerm.h b/Solver/convexCombinationTerm.h
new file mode 100644
index 0000000000000000000000000000000000000000..57ef4af802feee321b4894c5197808b9b64e7c93
--- /dev/null
+++ b/Solver/convexCombinationTerm.h
@@ -0,0 +1,52 @@
+// Gmsh - Copyright (C) 1997-2009 C. Geuzaine, J.-F. Remacle
+//
+// See the LICENSE.txt file for license information. Please report all
+// bugs and problems to <gmsh@geuz.org>.
+
+#ifndef _CONVEX_COMBINATION_TERM_H_
+#define _CONVEX_COMBINATION_TERM_H_
+
+#include "femTerm.h"
+#include "simpleFunction.h"
+#include "Gmsh.h"
+#include "GModel.h"
+#include "SElement.h"
+#include "fullMatrix.h"
+
+class convexCombinationTerm : public femTerm<double, double> {
+ protected:
+  const simpleFunction<double> *_diffusivity;
+  const int _iField;
+ public:
+  convexCombinationTerm(GModel *gm, int iField, simpleFunction<double> *diffusivity)
+    : femTerm<double, double>(gm), _iField(iField), _diffusivity(diffusivity) {}
+  virtual int sizeOfR(SElement *se) const
+  {
+    return se->getMeshElement()->getNumVertices();
+  }
+  virtual int sizeOfC(SElement *se) const 
+  { 
+    return se->getMeshElement()->getNumVertices();
+  }
+  void getLocalDofR(SElement *se, int iRow) const
+  {
+    return Dof(se->getMeshElement()->getVertex(iRow)->getNum(), _iField);
+  }
+  virtual void elementMatrix(SElement *e, fullMatrix<double> &m) const
+  {
+    m.set_all(0.);
+    int nbNodes = e->getMeshElement()->getNumVertices();
+    //double x = 0.3*(e->getVertex(0)->x()+e->getVertex(1)->x()+e->getVertex(2)->x());
+    //double y = 0.3*(e->getVertex(0)->y()+e->getVertex(1)->y()+e->getVertex(2)->y());
+    //double z = 0.3*(e->getVertex(0)->z()+e->getVertex(1)->z()+e->getVertex(2)->z());
+    const double _diff = 1.0; 
+    for (int j = 0; j < nbNodes; j++){
+      for (int k = 0; k < nbNodes; k++){
+        m(j,k) = -1.*_diff;
+      }
+      m(j,j) = (nbNodes - 1) * _diff;
+    }
+  }
+};
+
+#endif
diff --git a/Solver/crossConfTerm.h b/Solver/crossConfTerm.h
new file mode 100644
index 0000000000000000000000000000000000000000..1565addd4efaec63dfad823599afd81085dc08c7
--- /dev/null
+++ b/Solver/crossConfTerm.h
@@ -0,0 +1,89 @@
+// Gmsh - Copyright (C) 1997-2009 C. Geuzaine, J.-F. Remacle
+//
+// See the LICENSE.txt file for license information. Please report all
+// bugs and problems to <gmsh@geuz.org>.
+
+#ifndef _CROSS_CONF_TERM_H_
+#define _CROSS_CONF_TERM_H_
+
+#include "femTerm.h"
+#include "simpleFunction.h"
+#include "Gmsh.h"
+#include "GModel.h"
+#include "SElement.h"
+#include "fullMatrix.h"
+#include "Numeric.h"
+
+class crossConfTerm : public femTerm<double, double> {
+ protected:
+  const simpleFunction<double> *_diffusivity;
+  const int _iFieldR;
+  int _iFieldC;
+ public:
+  crossConfTerm(GModel *gm, int iFieldR, int iFieldC, 
+                simpleFunction<double> *diffusivity)
+    : femTerm<double, double>(gm), _iFieldR(iFieldR), _iFieldC(iFieldC), 
+      _diffusivity(diffusivity) {}
+  virtual int sizeOfR(SElement *se) const 
+  {
+    return se->getMeshElement()->getNumVertices(); 
+  }
+  virtual int sizeOfC(SElement *se) const
+  {
+    return se->getMeshElement()->getNumVertices(); 
+  }
+  Dof getLocalDofR(SElement *se, int iRow) const
+  {
+    return Dof(se->getMeshElement()->getVertex(iRow)->getNum(), _iFieldR);
+  }
+  void getLocalDofC(SElement *se, int iRow) const
+  {
+    return Dof(se->getMeshElement()->getVertex(iRow)->getNum(), _iFieldC);
+  }
+  virtual void elementMatrix(SElement *e, fullMatrix<double> &m) const
+  {
+    MElement *e = se->getMeshElement();
+    int nbNodes = e->getNumVertices();
+    int integrationOrder = 2 * (e->getPolynomialOrder() - 1);
+    int npts;
+    IntPt *GP;
+    double jac[3][3];
+    double invjac[3][3];
+    SVector3 Grads [256];
+    double grads[256][3];
+    e->getIntegrationPoints(integrationOrder, &npts, &GP);
+  
+    m.set_all(0.);
+    
+    for (int i = 0; i < npts; i++){
+      const double u = GP[i].pt[0];
+      const double v = GP[i].pt[1];
+      const double w = GP[i].pt[2];
+      const double weight = GP[i].weight;
+      const double detJ = e->getJacobian(u, v, w, jac);   
+      SPoint3 p; e->pnt(u, v, w, p);
+      const double _diff = (*_diffusivity)(p.x(), p.y(), p.z());
+      inv3x3(jac, invjac); 
+      e->getGradShapeFunctions(u, v, w, grads);
+      for (int j = 0; j < nbNodes; j++){
+        Grads[j] = SVector3(invjac[0][0] * grads[j][0] + invjac[0][1] * grads[j][1] + 
+                            invjac[0][2] * grads[j][2],
+                            invjac[1][0] * grads[j][0] + invjac[1][1] * grads[j][1] + 
+                            invjac[1][2] * grads[j][2],
+                            invjac[2][0] * grads[j][0] + invjac[2][1] * grads[j][1] +
+                            invjac[2][2] * grads[j][2]);
+      }
+      SVector3 N (jac[2][0], jac[2][1], jac[2][2]);
+      for (int j = 0; j < nbNodes; j++){
+        for (int k = 0; k <= j; k++){
+          m(j, k) += dot(crossprod(Grads[j], Grads[k]), N) * weight * detJ * _diff;
+        }
+      }
+    }
+    for (int j = 0; j < nbNodes; j++)
+      for (int k = 0; k < j; k++)
+        m(k, j) = -1.*m(j, k);    
+  }
+};
+
+#endif
diff --git a/Solver/helmholtzTerm.h b/Solver/helmholtzTerm.h
index 3cf3e9e4f3f19fb7db0c784bfb0ca50e1dc9b96e..fa709a8a4b5cc9bedc770979cbb7e1f42d15ea79 100644
--- a/Solver/helmholtzTerm.h
+++ b/Solver/helmholtzTerm.h
@@ -25,8 +25,8 @@ class helmoltzTerm : public femTerm<scalar, scalar> {
  public:
   helmoltzTerm(GModel *gm, int iFieldR, int iFieldC, simpleFunction<scalar> *k,
                simpleFunction<scalar> *a) 
-    : femTerm<scalar,scalar>(gm), _k(k), _a(a), _iFieldR(iFieldR), 
-      _iFieldC(iFieldC) {}
+    : femTerm<scalar, scalar>(gm), _iFieldR(iFieldR), _iFieldC(iFieldC),
+      _k(k), _a(a) {}
   // one dof per vertex (nodal fem)
   virtual int sizeOfR(SElement *se) const 
   {