diff --git a/Common/Context.h b/Common/Context.h
index 856a0557e8b71c74aacbe7acda1058c646db4f0b..d468499801a0aba3f6a3320f97d390994795b154 100644
--- a/Common/Context.h
+++ b/Common/Context.h
@@ -105,7 +105,7 @@ class CTX {
   int optPosition[2], visPosition[2], hotPosition[2], clipPosition[2], manipPosition[2];
   int statPosition[2], ctxPosition[2], solverPosition[2], solverSize[2];
   int pluginPosition[2], pluginSize[2], fieldPosition[2], fieldSize[2];
-  int fileChooserPosition[2];
+  int fileChooserPosition[2], extraPosition[2], extraSize[2];
   // use the system menu bar on Mac OS X?
   int systemMenuBar;
   // batch mode (-4: lua session, -3: server daemon, -2: check coherence, -1: write
diff --git a/Common/DefaultOptions.h b/Common/DefaultOptions.h
index a42d1598a75bcc223c41cd417c58cd72163f04e1..e77f9987552a90952e511161665901d16b3975e8 100644
--- a/Common/DefaultOptions.h
+++ b/Common/DefaultOptions.h
@@ -360,6 +360,14 @@ StringXNumber GeneralOptions_Number[] = {
   { F|O, "ExpertMode" , opt_general_expert_mode, 0. ,
     "Enable expert mode (to disable all the messages meant for inexperienced "
     "users)" },
+  { F|S, "ExtraPositionX" , opt_general_extra_position0 , 650. ,
+    "Horizontal position (in pixels) of the upper left corner of the generic extra window" },
+  { F|S, "ExtraPositionY" , opt_general_extra_position1 , 350. ,
+    "Vertical position (in pixels) of the upper left corner of the generic extra window" },
+  { F|S, "ExtraHeight" , opt_general_extra_size1 , 100. ,
+    "Height (in pixels) of the generic extra window" },
+  { F|S, "ExtraWidth" , opt_general_extra_size0 , 100. ,
+    "Width (in pixels) of the generic extra window" },
 
  { F|O, "FastRedraw" , opt_general_fast_redraw, 0. ,
     "Draw simplified model while rotating, panning and zooming" },
diff --git a/Common/Options.cpp b/Common/Options.cpp
index 7cc0bbe45d76b8b40f6da91c007301a08b9c3f3d..65f8012fd6a312399eb93ddd733b6db56f223914 100644
--- a/Common/Options.cpp
+++ b/Common/Options.cpp
@@ -1920,6 +1920,34 @@ double opt_general_field_size1(OPT_ARGS_NUM)
   return CTX::instance()->fieldSize[1];
 }
 
+double opt_general_extra_position0(OPT_ARGS_NUM)
+{
+  if(action & GMSH_SET)
+    CTX::instance()->extraPosition[0] = (int)val;
+  return CTX::instance()->extraPosition[0];
+}
+
+double opt_general_extra_position1(OPT_ARGS_NUM)
+{
+  if(action & GMSH_SET)
+    CTX::instance()->extraPosition[1] = (int)val;
+  return CTX::instance()->extraPosition[1];
+}
+
+double opt_general_extra_size0(OPT_ARGS_NUM)
+{
+  if(action & GMSH_SET)
+    CTX::instance()->extraSize[0] = (int)val;
+  return CTX::instance()->extraSize[0];
+}
+
+double opt_general_extra_size1(OPT_ARGS_NUM)
+{
+  if(action & GMSH_SET)
+    CTX::instance()->extraSize[1] = (int)val;
+  return CTX::instance()->extraSize[1];
+}
+
 double opt_general_statistics_position0(OPT_ARGS_NUM)
 {
   if(action & GMSH_SET)
diff --git a/Common/Options.h b/Common/Options.h
index 08861e9eaece09e4f6e72c429a69b2d966da4484..4c31caedef2b333fdbdf0d4779589fc7a2a29d71 100644
--- a/Common/Options.h
+++ b/Common/Options.h
@@ -127,6 +127,10 @@ double opt_general_field_position0(OPT_ARGS_NUM);
 double opt_general_field_position1(OPT_ARGS_NUM);
 double opt_general_field_size0(OPT_ARGS_NUM);
 double opt_general_field_size1(OPT_ARGS_NUM);
+double opt_general_extra_position0(OPT_ARGS_NUM);
+double opt_general_extra_position1(OPT_ARGS_NUM);
+double opt_general_extra_size0(OPT_ARGS_NUM);
+double opt_general_extra_size1(OPT_ARGS_NUM);
 double opt_general_statistics_position0(OPT_ARGS_NUM);
 double opt_general_statistics_position1(OPT_ARGS_NUM);
 double opt_general_visibility_position0(OPT_ARGS_NUM);
diff --git a/Fltk/FlGui.cpp b/Fltk/FlGui.cpp
index e7ed4cff924cb0e79ba28df7d2775e4a36ae5b76..755e0f8327359f7efeb380515409927b03715671 100644
--- a/Fltk/FlGui.cpp
+++ b/Fltk/FlGui.cpp
@@ -49,6 +49,9 @@ typedef unsigned long intptr_t;
 #include "StringUtils.h"
 #include "Generator.h"
 #include "gl2ps.h"
+#if defined(HAVE_3M)
+#include "3M.h"
+#endif
 
 // check (now!) if there are any pending events, and process them
 void FlGui::check(){ Fl::check(); }
@@ -860,6 +863,10 @@ void FlGui::storeCurrentWindowsInfo()
   CTX::instance()->solverSize[0] = onelab->w();
   CTX::instance()->solverSize[1] = onelab->h();
 #endif
+#if defined(HAVE_3M)
+  storeWindowPosition3M();
+#endif
+
   fileChooserGetPosition(&CTX::instance()->fileChooserPosition[0],
                          &CTX::instance()->fileChooserPosition[1]);
 }
diff --git a/Post/PViewData.h b/Post/PViewData.h
index 16db8b15817160511400604b488c77957169c825..997306daa2d93577e95c7669c77c8f33f5d70bb2 100644
--- a/Post/PViewData.h
+++ b/Post/PViewData.h
@@ -225,6 +225,9 @@ class PViewData {
   virtual bool isRemote(){ return false; }
   virtual int fillRemoteVertexArrays(std::string &options){ return 0; }
 
+  // is the view a list-based dataset
+  virtual bool isListBased(){ return false; }
+
   // get GModel (if view supports it)
   virtual GModel *getModel(int step);
 
diff --git a/Post/PViewDataList.h b/Post/PViewDataList.h
index a15b4dfe266d9796923e39d33d49beef3541e520..87f2db440a16592f1b8be4b6eb9baf9d729087ef 100644
--- a/Post/PViewDataList.h
+++ b/Post/PViewDataList.h
@@ -115,6 +115,7 @@ class PViewDataList : public PViewData {
   bool combineTime(nameData &nd);
   bool combineSpace(nameData &nd);
   void setXY(std::vector<double> &x, std::vector<double> &y);
+  bool isListBased(){ return true; }
 
   // specific to list-based data sets
   void setOrder2(int type);