diff --git a/Plugin/Warp.cpp b/Plugin/Warp.cpp
index b8c241298a9d198fc33314fa149f75d802592c85..3e75bfff04c5ea7ea1dacf40ba9ab2bba0a85347 100644
--- a/Plugin/Warp.cpp
+++ b/Plugin/Warp.cpp
@@ -1,4 +1,4 @@
-// $Id: Warp.cpp,v 1.9 2007-09-11 14:01:55 geuzaine Exp $
+// $Id: Warp.cpp,v 1.10 2008-01-09 12:32:22 geuzaine Exp $
 //
 // Copyright (C) 1997-2007 C. Geuzaine, J.-F. Remacle
 //
@@ -26,6 +26,7 @@ StringXNumber WarpOptions_Number[] = {
   {GMSH_FULLRC, "Factor", NULL, 1.},
   {GMSH_FULLRC, "TimeStep", NULL, 0.},
   {GMSH_FULLRC, "SmoothingAngle", NULL, 180.},
+  {GMSH_FULLRC, "Explode", NULL, 1.},
   {GMSH_FULLRC, "dView", NULL, -1.},
   {GMSH_FULLRC, "iView", NULL, -1.}
 };
@@ -103,7 +104,7 @@ static void addNormals(List_T *listElm, int nbElm, int nbNod,
 static void warpList(List_T *iList, int iNbElm,
 		     List_T *dList, int dNbElm,
 		     int nbNod, double factor, int TimeStep,
-		     int nbComp, smooth_normals *normals)
+		     int nbComp, smooth_normals *normals, double explode)
 {
   if(!iNbElm)
     return;
@@ -158,15 +159,31 @@ static void warpList(List_T *iList, int iNbElm,
 	z[k] += factor * val[3 * nbNod * TimeStep + 3 * k + 2];
       }
     }
+
+    if(explode != 1.){
+      double cg[3] = {0., 0., 0.};
+      for(int k = 0; k < nbNod; k++) {
+	cg[0] += x[k];
+	cg[1] += y[k];
+	cg[2] += z[k];
+      }
+      for(int k = 0; k < 3; k++) cg[k] /= (double)nbNod;
+      for(int k = 0; k < nbNod; k++) {
+	x[k] = cg[0] + explode * (x[k] - cg[0]);
+	y[k] = cg[1] + explode * (y[k] - cg[1]);
+	z[k] = cg[2] + explode * (z[k] - cg[2]);
+      }
+    }
+
   }
   
 }
 
 static void warp(PViewDataList *data1, PViewDataList *data2, double factor, 
-		 int ts, double tol)
+		 int ts, double tol, double e)
 {
   smooth_normals *nn = 0;
-  if(WarpOptions_Number[3].def <  0){
+  if(WarpOptions_Number[4].def <  0){
     nn = new smooth_normals(tol);
     addNormals(data1->ST, data1->NbST, 3, nn);
     addNormals(data1->VT, data1->NbVT, 3, nn);
@@ -176,32 +193,32 @@ static void warp(PViewDataList *data1, PViewDataList *data2, double factor,
     addNormals(data1->TQ, data1->NbTQ, 4, nn);
   }
 
-  warpList(data1->SP, data1->NbSP, data2->VP, data2->NbVP, 1, factor, ts, 1, nn);
-  warpList(data1->SL, data1->NbSL, data2->VL, data2->NbVL, 2, factor, ts, 1, nn);
-  warpList(data1->ST, data1->NbST, data2->VT, data2->NbVT, 3, factor, ts, 1, nn);
-  warpList(data1->SQ, data1->NbSQ, data2->VQ, data2->NbVQ, 4, factor, ts, 1, nn);
-  warpList(data1->SS, data1->NbSS, data2->VS, data2->NbVS, 4, factor, ts, 1, nn);
-  warpList(data1->SH, data1->NbSH, data2->VH, data2->NbVH, 8, factor, ts, 1, nn);
-  warpList(data1->SI, data1->NbSI, data2->VI, data2->NbVI, 6, factor, ts, 1, nn);
-  warpList(data1->SY, data1->NbSY, data2->VY, data2->NbVY, 5, factor, ts, 1, nn);
+  warpList(data1->SP, data1->NbSP, data2->VP, data2->NbVP, 1, factor, ts, 1, nn, e);
+  warpList(data1->SL, data1->NbSL, data2->VL, data2->NbVL, 2, factor, ts, 1, nn, e);
+  warpList(data1->ST, data1->NbST, data2->VT, data2->NbVT, 3, factor, ts, 1, nn, e);
+  warpList(data1->SQ, data1->NbSQ, data2->VQ, data2->NbVQ, 4, factor, ts, 1, nn, e);
+  warpList(data1->SS, data1->NbSS, data2->VS, data2->NbVS, 4, factor, ts, 1, nn, e);
+  warpList(data1->SH, data1->NbSH, data2->VH, data2->NbVH, 8, factor, ts, 1, nn, e);
+  warpList(data1->SI, data1->NbSI, data2->VI, data2->NbVI, 6, factor, ts, 1, nn, e);
+  warpList(data1->SY, data1->NbSY, data2->VY, data2->NbVY, 5, factor, ts, 1, nn, e);
 	   		   	       	  	                    
-  warpList(data1->VP, data1->NbVP, data2->VP, data2->NbVP, 1, factor, ts, 3, nn);
-  warpList(data1->VL, data1->NbVL, data2->VL, data2->NbVL, 2, factor, ts, 3, nn);
-  warpList(data1->VT, data1->NbVT, data2->VT, data2->NbVT, 3, factor, ts, 3, nn);
-  warpList(data1->VQ, data1->NbVQ, data2->VQ, data2->NbVQ, 4, factor, ts, 3, nn);
-  warpList(data1->VS, data1->NbVS, data2->VS, data2->NbVS, 4, factor, ts, 3, nn);
-  warpList(data1->VH, data1->NbVH, data2->VH, data2->NbVH, 8, factor, ts, 3, nn);
-  warpList(data1->VI, data1->NbVI, data2->VI, data2->NbVI, 6, factor, ts, 3, nn);
-  warpList(data1->VY, data1->NbVY, data2->VY, data2->NbVY, 5, factor, ts, 3, nn);
+  warpList(data1->VP, data1->NbVP, data2->VP, data2->NbVP, 1, factor, ts, 3, nn, e);
+  warpList(data1->VL, data1->NbVL, data2->VL, data2->NbVL, 2, factor, ts, 3, nn, e);
+  warpList(data1->VT, data1->NbVT, data2->VT, data2->NbVT, 3, factor, ts, 3, nn, e);
+  warpList(data1->VQ, data1->NbVQ, data2->VQ, data2->NbVQ, 4, factor, ts, 3, nn, e);
+  warpList(data1->VS, data1->NbVS, data2->VS, data2->NbVS, 4, factor, ts, 3, nn, e);
+  warpList(data1->VH, data1->NbVH, data2->VH, data2->NbVH, 8, factor, ts, 3, nn, e);
+  warpList(data1->VI, data1->NbVI, data2->VI, data2->NbVI, 6, factor, ts, 3, nn, e);
+  warpList(data1->VY, data1->NbVY, data2->VY, data2->NbVY, 5, factor, ts, 3, nn, e);
 	   		   	       	  	                    
-  warpList(data1->TP, data1->NbTP, data2->VP, data2->NbVP, 1, factor, ts, 9, nn);
-  warpList(data1->TL, data1->NbTL, data2->VL, data2->NbVL, 2, factor, ts, 9, nn);
-  warpList(data1->TT, data1->NbTT, data2->VT, data2->NbVT, 3, factor, ts, 9, nn);
-  warpList(data1->TQ, data1->NbTQ, data2->VQ, data2->NbVQ, 4, factor, ts, 9, nn);
-  warpList(data1->TS, data1->NbTS, data2->VS, data2->NbVS, 4, factor, ts, 9, nn);
-  warpList(data1->TH, data1->NbTH, data2->VH, data2->NbVH, 8, factor, ts, 9, nn);
-  warpList(data1->TI, data1->NbTI, data2->VI, data2->NbVI, 6, factor, ts, 9, nn);
-  warpList(data1->TY, data1->NbTY, data2->VY, data2->NbVY, 5, factor, ts, 9, nn);
+  warpList(data1->TP, data1->NbTP, data2->VP, data2->NbVP, 1, factor, ts, 9, nn, e);
+  warpList(data1->TL, data1->NbTL, data2->VL, data2->NbVL, 2, factor, ts, 9, nn, e);
+  warpList(data1->TT, data1->NbTT, data2->VT, data2->NbVT, 3, factor, ts, 9, nn, e);
+  warpList(data1->TQ, data1->NbTQ, data2->VQ, data2->NbVQ, 4, factor, ts, 9, nn, e);
+  warpList(data1->TS, data1->NbTS, data2->VS, data2->NbVS, 4, factor, ts, 9, nn, e);
+  warpList(data1->TH, data1->NbTH, data2->VH, data2->NbVH, 8, factor, ts, 9, nn, e);
+  warpList(data1->TI, data1->NbTI, data2->VI, data2->NbVI, 6, factor, ts, 9, nn, e);
+  warpList(data1->TY, data1->NbTY, data2->VY, data2->NbVY, 5, factor, ts, 9, nn, e);
 
   if(nn) delete nn;
 }
@@ -211,8 +228,9 @@ PView *GMSH_WarpPlugin::execute(PView *v)
   double factor = WarpOptions_Number[0].def;
   int TimeStep = (int)WarpOptions_Number[1].def;
   double AngleTol = WarpOptions_Number[2].def;
-  int dView = (int)WarpOptions_Number[3].def;
-  int iView = (int)WarpOptions_Number[4].def;
+  double Explode = WarpOptions_Number[3].def;
+  int dView = (int)WarpOptions_Number[4].def;
+  int iView = (int)WarpOptions_Number[5].def;
 
   PView *v1 = getView(iView, v);
   if(!v1) return v;
@@ -234,7 +252,7 @@ PView *GMSH_WarpPlugin::execute(PView *v)
     return v;
   }
 
-  warp(data1, data2, factor, TimeStep, AngleTol);
+  warp(data1, data2, factor, TimeStep, AngleTol, Explode);
 
   data1->finalize();
   v1->setChanged(true);