diff --git a/Mesh/Field.cpp b/Mesh/Field.cpp
index 2937c029075f30c917cd8843eaac3409b2d74b38..1c0a5ec32bf49dc11cf0f070dca66ce8179a7fbe 100644
--- a/Mesh/Field.cpp
+++ b/Mesh/Field.cpp
@@ -1,4 +1,4 @@
-// $Id: Field.cpp,v 1.30 2008-04-16 15:15:21 sabarieg Exp $
+// $Id: Field.cpp,v 1.31 2008-04-17 16:51:15 remacle Exp $
 //
 // Copyright (C) 1997-2008 C. Geuzaine, J.-F. Remacle
 //
@@ -582,6 +582,72 @@ public:
     return dialogBox;
   }
 };
+class LaplacianField:public Field
+{
+  int iField;
+  double delta;
+public:
+  const char *get_name()
+  {
+    return "Laplacian";
+  }
+  LaplacianField():iField(0),  delta(CTX.lc / 1e4)
+  {
+    options["IField"] = new FieldOptionInt(iField);
+    options["Delta"] = new FieldOptionDouble(delta);
+  }
+  double operator() (double x, double y, double z)
+  {
+    Field *field = GModel::current()->getFields()->get(iField);
+      return (
+        (*field) (x + delta , y, z)+ (*field) (x - delta , y, z)
+        +(*field) (x, y + delta , z)+ (*field) (x, y - delta , z)
+        +(*field) (x, y, z + delta )+ (*field) (x, y, z - delta )
+        -8* (*field) (x , y, z)
+        ) / (delta*delta);
+  }
+  FieldDialogBox *&dialog_box()
+  {
+    static FieldDialogBox *dialogBox = NULL;
+    return dialogBox;
+  }
+};
+
+class MeanField:public Field
+{
+  int iField;
+  double delta;
+  int n;
+public:
+  const char *get_name()
+  {
+    return "Mean";
+  }
+  MeanField():iField(0),  delta(CTX.lc / 1e4)
+  {
+    options["IField"] = new FieldOptionInt(iField);
+    options["Delta"] = new FieldOptionDouble(delta);
+    //options["N"] = new FieldOptionInt(n);
+  }
+  double operator() (double x, double y, double z)
+  {
+    Field *field = GModel::current()->getFields()->get(iField);
+    double l=0;
+    int nn=0;
+    double ddelta=delta/n;
+    return (
+      (*field) (x + delta , y, z)+ (*field) (x - delta , y, z)
+      +(*field) (x, y + delta , z)+ (*field) (x, y - delta , z)
+      +(*field) (x, y, z + delta )+ (*field) (x, y, z - delta )
+      + (*field) (x , y, z)
+      ) / 5;
+  }
+  FieldDialogBox *&dialog_box()
+  {
+    static FieldDialogBox *dialogBox = NULL;
+    return dialogBox;
+  }
+};
 
 #if defined(HAVE_MATH_EVAL)
 class MathEvalExpression
@@ -997,6 +1063,8 @@ FieldManager::FieldManager()
   map_type_name["Min"] = new FieldFactoryT < MinField > ();
   map_type_name["Max"] = new FieldFactoryT < MaxField > ();
   map_type_name["UTM"] = new FieldFactoryT < UTMField > ();
+  map_type_name["Laplacian"] = new FieldFactoryT < LaplacianField > ();
+  map_type_name["Mean"] = new FieldFactoryT < MeanField > ();
   background_field = -1;
 }