diff --git a/Plugin/CMakeLists.txt b/Plugin/CMakeLists.txt
index 7e617a70968e0e0427f4c0e6c10a0d74acf86d96..d972474f4dd6b94a534423829a3e99f5ac597c57 100644
--- a/Plugin/CMakeLists.txt
+++ b/Plugin/CMakeLists.txt
@@ -28,6 +28,7 @@ set(SRC
   FieldFromAmplitudePhase.cpp
   Bubbles.cpp NearToFarField.cpp
   DiscretizationError.cpp
+  Scal2Vec.cpp
 )
 
 file(GLOB HDR RELATIVE ${CMAKE_CURRENT_SOURCE_DIR} *.h)
diff --git a/Plugin/PluginManager.cpp b/Plugin/PluginManager.cpp
index 649e77519ab5223cdc97f0ccccb6ec761ef55cdb..75bba111f03349738efb67b841d81f5bd8f9f54d 100644
--- a/Plugin/PluginManager.cpp
+++ b/Plugin/PluginManager.cpp
@@ -53,6 +53,7 @@
 #include "Bubbles.h"
 #include "NearToFarField.h"
 #include "DiscretizationError.h"
+#include "Scal2Vec.h"
 
 // for testing purposes only :-)
 #undef HAVE_DLOPEN
@@ -234,6 +235,8 @@ void PluginManager::registerDefaultPlugins()
                       ("Bubbles", GMSH_RegisterBubblesPlugin()));
     allPlugins.insert(std::pair<std::string, GMSH_Plugin*>
                       ("DiscretizationError", GMSH_RegisterDiscretizationErrorPlugin()));
+    allPlugins.insert(std::pair<std::string, GMSH_Plugin*>
+                      ("Scal2Vec", GMSH_RegisterScal2VecPlugin()));
 
 #if defined(HAVE_TETGEN)
     allPlugins.insert(std::pair<std::string, GMSH_Plugin*>
diff --git a/Plugin/Scal2Vec.cpp b/Plugin/Scal2Vec.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..0efce3e4f08a5ff0009f3b6b5acd0f52b9a8fe80
--- /dev/null
+++ b/Plugin/Scal2Vec.cpp
@@ -0,0 +1,158 @@
+// Gmsh - Copyright (C) 1997-2011 C. Geuzaine, J.-F. Remacle
+//
+// See the LICENSE.txt file for license information. Please report all
+// bugs and problems to <gmsh@geuz.org>.
+
+#include "Scal2Vec.h"
+#include "PViewOptions.h"
+#include "shapeFunctions.h"
+
+StringXNumber Scal2VecOptions_Number[] = {
+  {GMSH_FULLRC, "View X", NULL, -1.},
+  {GMSH_FULLRC, "View Y", NULL, -1.},
+  {GMSH_FULLRC, "View Z", NULL, -1.}
+};
+
+StringXString Scal2VecOptions_String[] = {
+  {GMSH_FULLRC, "Name NewView", NULL, "NewView"}
+};
+
+extern "C"
+{
+  GMSH_Plugin *GMSH_RegisterScal2VecPlugin()
+  {
+    return new GMSH_Scal2VecPlugin();
+  }
+}
+
+std::string GMSH_Scal2VecPlugin::getHelp() const
+{
+  return "Plugin(Scal2Vec) converts the scalar fields of 'View X', "
+         "'View Y' and/or 'View Z' into a vectorial field. "
+         "The new view 'Name NewView' contains it.\n\n"
+         "If the value of 'View X', 'View Y' or 'View Z' is -1, "
+         "the value of the vectorial field in the corresponding direction is 0.";
+}
+
+int GMSH_Scal2VecPlugin::getNbOptions() const
+{
+  return sizeof(Scal2VecOptions_Number) / sizeof(StringXNumber);
+}
+
+StringXNumber *GMSH_Scal2VecPlugin::getOption(int iopt)
+{
+  return &Scal2VecOptions_Number[iopt];
+}
+
+int GMSH_Scal2VecPlugin::getNbOptionsStr() const
+{
+  return sizeof(Scal2VecOptions_String) / sizeof(StringXString);
+}
+
+StringXString *GMSH_Scal2VecPlugin::getOptionStr(int iopt)
+{
+  return &Scal2VecOptions_String[iopt];
+}
+
+
+PView *GMSH_Scal2VecPlugin::execute(PView *v)
+{
+  int iViewX = (int)Scal2VecOptions_Number[0].def;
+  int iViewY = (int)Scal2VecOptions_Number[1].def;
+  int iViewZ = (int)Scal2VecOptions_Number[2].def;
+  std::string nameNewView = Scal2VecOptions_String[0].def;
+  
+  PView *vRef = 0, *vX = 0, *vY = 0, *vZ = 0;
+  PViewData *dataRef, *dataX, *dataY, *dataZ;
+  
+  // Load data
+  if(iViewX >= 0){
+    vX = getView(iViewX, v);
+    if(!vX){
+      Msg::Error("Scal2Vec plugin could not find View X: %i", iViewX);
+      return v;
+    }
+    dataX = vX->getData();
+    if(!vRef){
+      vRef = vX;
+      dataRef = dataX;
+    }
+  }
+  if(iViewY >= 0){
+    vY = getView(iViewY, v);
+    if(!vY){
+      Msg::Error("Scal2Vec plugin could not find View Y: %i", iViewY);
+      return v;
+    }
+    dataY = vY->getData();
+    if(!vRef){
+      vRef = vY;
+      dataRef = dataY;
+    }
+  }
+  if(iViewZ >= 0){
+    vZ = getView(iViewZ, v);
+    if(!vZ){
+      Msg::Error("Scal2Vec plugin could not find View Z: %i", iViewZ);
+      return v;
+    }
+    dataZ = vZ->getData();
+    if(!vRef){
+      vRef = vZ;
+      dataRef = dataZ;
+    }
+  }
+  if(!vRef){
+    Msg::Error("Scal2Vec plugin could not find any view.", iViewZ);
+    return v;
+  }
+  
+  // Initialize the new view
+  PView *vNew = new PView();
+  PViewDataList *dataNew = getDataList(vNew);
+  
+  for(int ent = 0; ent < dataRef->getNumEntities(0); ent++){
+    for(int ele = 0; ele < dataRef->getNumElements(0, ent); ele++){
+      if(dataRef->skipElement(0, ent, ele)) continue;
+      int numComp = 3; // The 3 components of the new view: x,y,z
+      int type = dataRef->getType(0, ent, ele);
+      std::vector<double> *out = dataNew->incrementList(numComp, type); // Pointer in data of the new view
+      if(!out) continue;
+      int numNodes = dataRef->getNumNodes(0, ent, ele);
+      double x[8], y[8], z[8], valX, valY, valZ;
+      for(int nod = 0; nod < numNodes; nod++)
+        dataRef->getNode(0, ent, ele, nod, x[nod], y[nod], z[nod]);
+      int dim = dataRef->getDimension(0, ent, ele);
+      elementFactory factory;
+      element *element = factory.create(numNodes, dim, x, y, z);
+      if(!element) continue;
+      for(int nod = 0; nod < numNodes; nod++) out->push_back(x[nod]); // Save coordinates (x,y,z)
+      for(int nod = 0; nod < numNodes; nod++) out->push_back(y[nod]);
+      for(int nod = 0; nod < numNodes; nod++) out->push_back(z[nod]);
+      for(int step = 0; step < dataRef->getNumTimeSteps(); step++){
+        for(int nod = 0; nod < numNodes; nod++){
+          if(vX) dataX->getValue(step, ent, ele, nod, 0, valX); else valX = 0;
+          if(vY) dataY->getValue(step, ent, ele, nod, 0, valY); else valY = 0;
+          if(vZ) dataZ->getValue(step, ent, ele, nod, 0, valZ); else valZ = 0;
+          out->push_back(valX); // Save values (fx,fy,fz)
+          out->push_back(valY);
+          out->push_back(valZ);
+        }
+      }
+      delete element;
+    }
+  }
+  
+  for(int step = 0; step < dataRef->getNumTimeSteps(); step++){
+    if(dataRef->hasTimeStep(step)){
+      double time = dataRef->getTime(step);
+      dataNew->Time.push_back(time);
+    }
+  }
+  
+  dataNew->setName(nameNewView);
+  dataNew->setFileName(nameNewView + ".pos");
+  dataNew->finalize();
+  
+  return vNew;
+}
diff --git a/Plugin/Scal2Vec.h b/Plugin/Scal2Vec.h
new file mode 100644
index 0000000000000000000000000000000000000000..43afebc0e0241b851baa7534b469fcec0821e271
--- /dev/null
+++ b/Plugin/Scal2Vec.h
@@ -0,0 +1,33 @@
+// Gmsh - Copyright (C) 1997-2011 C. Geuzaine, J.-F. Remacle
+//
+// See the LICENSE.txt file for license information. Please report all
+// bugs and problems to <gmsh@geuz.org>.
+
+#ifndef _SCAL2VEC_H_
+#define _SCAL2VEC_H_
+
+#include "Plugin.h"
+
+extern "C"
+{
+  GMSH_Plugin *GMSH_RegisterScal2VecPlugin();
+}
+
+class GMSH_Scal2VecPlugin : public GMSH_PostPlugin
+{
+ public:
+  GMSH_Scal2VecPlugin(){}
+  std::string getName() const { return "Scal2Vec"; }
+  std::string getShortHelp() const
+  {
+    return "Convert some scalar fields into a vector field";
+  }
+  std::string getHelp() const;
+  int getNbOptions() const;
+  StringXNumber *getOption(int iopt);
+  int getNbOptionsStr() const;
+  StringXString* getOptionStr(int iopt);
+  PView *execute(PView *);
+};
+
+#endif