diff --git a/Mesh/Field.cpp b/Mesh/Field.cpp
index a60cf2d1aaf722f98b98d4646d20fc75b8d7ee0d..f20223eedce960f27e09b2ac32e366e42a7df527 100644
--- a/Mesh/Field.cpp
+++ b/Mesh/Field.cpp
@@ -35,6 +35,22 @@
 #include "ANN/ANN.h"
 #endif
 
+template<class t>
+class FieldCallbackGeneric : public FieldCallback {
+  t * _field;
+  void (t::*_callback)();
+  public :
+  void run()
+  {
+    (_field->*_callback)();
+  }
+  FieldCallbackGeneric( t *field, void (t::*callback)(), const std::string description) : FieldCallback(description)
+  {
+    _field = field;
+    _callback = callback;
+  }
+};
+
 Field::~Field()
 {
   for(std::map<std::string, FieldOption*>::iterator it = options.begin();
@@ -1019,13 +1035,15 @@ class MathEvalField : public Field
     }
   };
  public:
+  void myAction(){
+    printf("doing sthg \n");
+  }
   MathEvalField()
   {
     options["F"] = new FieldOptionString
       (f, "Mathematical function to evaluate.", &update_needed);
     f = "F2 + Sin(z)";
-    callbacks["test"] = new testAction(this, "description blabla \n"); 
-    //callbacks["test"] = new FieldCallbackGeneric<MathEvalField>(this, MathEvalField::myFunc, "description")
+    callbacks["test"] = new FieldCallbackGeneric<MathEvalField>(this, &MathEvalField::myAction, "description blabla"); 
   }
   double operator() (double x, double y, double z, GEntity *ge=0)
   {
@@ -1037,9 +1055,6 @@ class MathEvalField : public Field
     }
     return expr.evaluate(x, y, z);
   }
-  void myAction(){
-    printf("doing sthg \n");
-  }
   const char *getName()
   {
     return "MathEval";