diff --git a/Common/Options.cpp b/Common/Options.cpp
index ada3c6218608e56e4f575d2cab20d583108204ce..ef30e3681ed15ecc70fb4e380c6d79dd6cba80b9 100644
--- a/Common/Options.cpp
+++ b/Common/Options.cpp
@@ -8184,6 +8184,12 @@ static double ovcm(OPT_ARGS_NUM, int nn)
     opt->componentMap[nn] = (int)val;
     if(view) view->setChanged(true);
   }
+#if defined(HAVE_FLTK)
+  if(_gui_action_valid(action, num)){
+    FlGui::instance()->options->view.value[70 + nn]->value
+      (opt->componentMap[nn]);
+  }
+#endif
   return opt->componentMap[nn];
 #else
   return 0.;
diff --git a/Fltk/optionWindow.cpp b/Fltk/optionWindow.cpp
index 2cd4752123fcd8b8c65c8e8347d4aef6eeccfa68..07566753cec4841a1e7d528a0cd849ee67e46ee3 100644
--- a/Fltk/optionWindow.cpp
+++ b/Fltk/optionWindow.cpp
@@ -644,6 +644,15 @@ static void view_options_ok_cb(Fl_Widget *w, void *data)
   double axes_ymax = opt_view_axes_ymax(current, GMSH_GET, 0);
   double axes_zmax = opt_view_axes_zmax(current, GMSH_GET, 0);
   double gen_raise_factor = opt_view_gen_raise_factor(current, GMSH_GET, 0);
+  double component_map0 = opt_view_component_map0(current, GMSH_GET, 0);
+  double component_map1 = opt_view_component_map1(current, GMSH_GET, 0);
+  double component_map2 = opt_view_component_map2(current, GMSH_GET, 0);
+  double component_map3 = opt_view_component_map3(current, GMSH_GET, 0);
+  double component_map4 = opt_view_component_map4(current, GMSH_GET, 0);
+  double component_map5 = opt_view_component_map5(current, GMSH_GET, 0);
+  double component_map6 = opt_view_component_map6(current, GMSH_GET, 0);
+  double component_map7 = opt_view_component_map7(current, GMSH_GET, 0);
+  double component_map8 = opt_view_component_map8(current, GMSH_GET, 0);
 
   std::string name = opt_view_name(current, GMSH_GET, "");
   std::string format = opt_view_format(current, GMSH_GET, "");
@@ -1029,6 +1038,50 @@ static void view_options_ok_cb(Fl_Widget *w, void *data)
       if(force || (val != axes_tics2))
         opt_view_axes_tics2(i, GMSH_SET, val);
 
+      val = o->view.value[70]->value();
+      if(force || (val != component_map0))
+        opt_view_component_map0(i, GMSH_SET, val);
+
+      val = o->view.value[70]->value();
+      if(force || (val != component_map0))
+        opt_view_component_map0(i, GMSH_SET, val);
+
+      val = o->view.value[70]->value();
+      if(force || (val != component_map0))
+        opt_view_component_map0(i, GMSH_SET, val);
+
+      val = o->view.value[71]->value();
+      if(force || (val != component_map1))
+        opt_view_component_map1(i, GMSH_SET, val);
+
+      val = o->view.value[72]->value();
+      if(force || (val != component_map2))
+        opt_view_component_map2(i, GMSH_SET, val);
+
+      val = o->view.value[73]->value();
+      if(force || (val != component_map3))
+        opt_view_component_map3(i, GMSH_SET, val);
+
+      val = o->view.value[74]->value();
+      if(force || (val != component_map4))
+        opt_view_component_map4(i, GMSH_SET, val);
+
+      val = o->view.value[75]->value();
+      if(force || (val != component_map5))
+        opt_view_component_map5(i, GMSH_SET, val);
+
+      val = o->view.value[76]->value();
+      if(force || (val != component_map6))
+        opt_view_component_map6(i, GMSH_SET, val);
+
+      val = o->view.value[77]->value();
+      if(force || (val != component_map7))
+        opt_view_component_map7(i, GMSH_SET, val);
+
+      val = o->view.value[78]->value();
+      if(force || (val != component_map8))
+        opt_view_component_map8(i, GMSH_SET, val);
+
       // view_inputs
 
       std::string str;
@@ -2744,18 +2797,29 @@ optionWindow::optionWindow(int deltaFontSize)
       view.menu[0]->callback(view_options_ok_cb);
 
       static Fl_Menu_Item menu_force_field_type[] = {
-        {"None", 0, 0, 0},
-        {"Scalar", 0, 0, 0},
-        {"Vector", 0, 0, 0},
-        {"Tensor", 0, 0, 0},
+        {"Original Field", 0, 0, 0},
+        {"Force Scalar", 0, 0, 0},
+        {"Force Vector", 0, 0, 0},
+        {"Force Tensor", 0, 0, 0},
         {0}
       };
       view.choice[14] = new Fl_Choice
-        (L + 2 * WB, 2 * WB + 10 * BH, IW, BH, "Forced field type");
+        (L + 2 * WB, 2 * WB + 10 * BH, IW, BH);
       view.choice[14]->menu(menu_force_field_type);
       view.choice[14]->align(FL_ALIGN_RIGHT);
       view.choice[14]->callback(view_options_ok_cb);
 
+      for(int i = 0; i < 9; i++){
+        int W = width - 5 * WB - IW;
+        int w = W / 9;
+        view.value[70 + i] = new Fl_Value_Input
+          (L + 3 * WB + IW + i * w, 2 * WB + 10 * BH, w, BH);
+        view.value[70 + i]->minimum(0);
+        view.value[70 + i]->maximum(9);
+        view.value[70 + i]->step(1);
+        view.value[70 + i]->callback(view_options_ok_cb);
+      }
+
       o->end();
     }
     {
@@ -3276,6 +3340,15 @@ void optionWindow::updateViewGroup(int index)
   opt_view_timestep(index, GMSH_GUI, 0);
   opt_view_show_time(index, GMSH_GUI, 0);
   opt_view_force_num_components(index, GMSH_GUI, 0);
+  opt_view_component_map0(index, GMSH_GUI, 0);
+  opt_view_component_map1(index, GMSH_GUI, 0);
+  opt_view_component_map2(index, GMSH_GUI, 0);
+  opt_view_component_map3(index, GMSH_GUI, 0);
+  opt_view_component_map4(index, GMSH_GUI, 0);
+  opt_view_component_map5(index, GMSH_GUI, 0);
+  opt_view_component_map6(index, GMSH_GUI, 0);
+  opt_view_component_map7(index, GMSH_GUI, 0);
+  opt_view_component_map8(index, GMSH_GUI, 0);
 
   opt_view_point_size(index, GMSH_GUI, 0);
   opt_view_point_type(index, GMSH_GUI, 0);
diff --git a/Geo/GFaceCompound.cpp b/Geo/GFaceCompound.cpp
index 843236bfdc8441cde37b6622058b75e70167d734..7f75d2627f558f7a6d9d8d57c3fb298af78daf1c 100644
--- a/Geo/GFaceCompound.cpp
+++ b/Geo/GFaceCompound.cpp
@@ -29,14 +29,6 @@
 #include "Context.h"
 #include "discreteFace.h"
 
-// #if !defined(HAVE_NO_MESH)
-// #include "meshGFace.h"
-// #include "meshGFaceOptimize.h"
-// #include "meshGEdge.h"
-// #include "meshPartitionOptions.h"
-// #include "meshPartition.h"
-// #endif
-
 static void fixEdgeToValue(GEdge *ed, double value, dofManager<double, double> &myAssembler)
 {
   myAssembler.fixVertex(ed->getBeginVertex()->mesh_vertices[0], 0, 1, value);
diff --git a/Mesh/meshGFace.cpp b/Mesh/meshGFace.cpp
index dd5b46863d5b27796f88c1242e532dbf2308af5a..fe926b5df1bf7f373438c1164dc2b44b82d6693a 100644
--- a/Mesh/meshGFace.cpp
+++ b/Mesh/meshGFace.cpp
@@ -1309,17 +1309,15 @@ void meshGFace::operator() (GFace *gf)
 
 void partitionAndRemesh(GFaceCompound *gf)
 {
-
-#if !defined(HAVE_NO_MESH) && (defined(HAVE_CHACO) || defined(HAVE_METIS))
-
+#if defined(HAVE_CHACO) || defined(HAVE_METIS)
   //Partition the mesh and createTopology for new faces
   //-----------------------------------------------------
   int N = gf->nbSplit;
   meshPartitionOptions options;
-  options =  CTX::instance()->partitionOptions;
+  options = CTX::instance()->partitionOptions;
   options.num_partitions = N;
   options.partitioner = 2; //METIS
-  options.algorithm =  1 ;
+  options.algorithm = 1;
   int ier = PartitionMesh(gf->model(), options);
   int numv = gf->model()->maxVertexNum() + 1;
   int nume = gf->model()->maxEdgeNum() + 1;
@@ -1413,13 +1411,7 @@ void partitionAndRemesh(GFaceCompound *gf)
 
     printf("*** Mesh of surface %d done by assembly remeshed faces\n", gf->tag());
     gf->meshStatistics.status = GFace::DONE; 
-
-
-
-#else
-  return;
 #endif
-
 }
 
 
@@ -1499,5 +1491,3 @@ void orientMeshGFace::operator()(GFace *gf)
     }
   }
 }
-
-