diff --git a/Fltk/optionWindow.cpp b/Fltk/optionWindow.cpp
index 6ef3ede13dcf1dff0ca9cdd4628301ed147d7de3..695721de509c9b7f7967f22ee7fb5eac07ee9396 100644
--- a/Fltk/optionWindow.cpp
+++ b/Fltk/optionWindow.cpp
@@ -591,12 +591,14 @@ static void view_options_ok_cb(Fl_Widget *w, void *data)
       if(vindex >= 0 && vindex < (int)PView::list.size()){
         // compute min/max taking current visibility status into account
         int step = (int)opt_view_timestep(vindex, GMSH_GET, 0);
+        PViewData *data = PView::list[vindex]->getData(true);
+        PViewOptions *opt = PView::list[vindex]->getOptions();
         if(!strcmp(str, "range_min"))
-          o->view.value[31]->value
-            (PView::list[vindex]->getData(true)->getMin(step, true));
+          o->view.value[31]->value(data->getMin(step, true, opt->forceNumComponents,
+                                                opt->componentMap));
         else if(!strcmp(str, "range_max"))
-          o->view.value[32]->value
-            (PView::list[vindex]->getData(true)->getMax(step, true));
+          o->view.value[32]->value(data->getMax(step, true, opt->forceNumComponents,
+                                                opt->componentMap));
       }
     }
   }
diff --git a/Post/PViewData.cpp b/Post/PViewData.cpp
index dd56dc81ca31108cc1db84b6aa9c71478eb48703..d76ac09bee45148b28e0fa4f6f3a02358917bf2a 100644
--- a/Post/PViewData.cpp
+++ b/Post/PViewData.cpp
@@ -57,10 +57,22 @@ bool PViewData::skipElement(int step, int ent, int ele, bool checkVisibility,
   return ele % samplingRate;
 }
 
-void PViewData::getScalarValue(int step, int ent, int ele, int nod, double &val)
+void PViewData::getScalarValue(int step, int ent, int ele, int nod, double &val,
+                               int forceNumComponents, int componentMap[9])
 {
   int numComp = getNumComponents(step, ent, ele);
-  if(numComp == 1){
+  if(forceNumComponents && componentMap){
+    std::vector<double> d(forceNumComponents);
+    for(int i = 0; i < forceNumComponents; i++){
+      int comp = componentMap[i];
+      if(comp >= 0 && comp < numComp)
+        getValue(step, ent, ele, nod, comp, d[i]);
+      else
+        d[i] = 0.;
+    }
+    val = ComputeScalarRep(forceNumComponents, &d[0]);
+  }
+  else if(numComp == 1){
     getValue(step, ent, ele, nod, 0, val);
   }
   else{
diff --git a/Post/PViewData.h b/Post/PViewData.h
index 17b339a4a95aa4db7b37319ddd9817e897b0abc7..c67cb9936729e1f197f05244bcb18601ac4b118d 100644
--- a/Post/PViewData.h
+++ b/Post/PViewData.h
@@ -74,8 +74,10 @@ class PViewData {
   virtual double getTime(int step){ return 0.; }
 
   // get/set min/max for given step (global over all steps if step=-1)
-  virtual double getMin(int step=-1, bool onlyVisible=false) = 0;
-  virtual double getMax(int step=-1, bool onlyVisible=false) = 0;
+  virtual double getMin(int step=-1, bool onlyVisible=false, 
+                        int forceNumComponents=0, int componentMap[9]=0) = 0;
+  virtual double getMax(int step=-1, bool onlyVisible=false,
+                        int forceNumComponents=0, int componentMap[9]=0) = 0;
   virtual void setMin(double min) = 0;
   virtual void setMax(double max) = 0;
 
@@ -142,7 +144,8 @@ class PViewData {
   // return a scalar value (same as value for scalars, norm for
   // vectors, etc.) associated with the node-th node from the ele-th
   // element in the ent-th entity
-  void getScalarValue(int step, int ent, int ele, int nod, double &val);
+  void getScalarValue(int step, int ent, int ele, int nod, double &val,
+                      int forceNumComponents=0, int componentMap[9]=0);
 
   // return the number of edges of the ele-th element in the ent-th
   // entity
diff --git a/Post/PViewDataGModel.cpp b/Post/PViewDataGModel.cpp
index 9383a174f75ee793659b8c9622afec4e976d3294..e4c77edb602cec226abf67460efe91260e1bf07e 100644
--- a/Post/PViewDataGModel.cpp
+++ b/Post/PViewDataGModel.cpp
@@ -222,17 +222,21 @@ double PViewDataGModel::getTime(int step)
   return _steps[step]->getTime();
 }
 
-double PViewDataGModel::getMin(int step, bool onlyVisible)
+double PViewDataGModel::getMin(int step, bool onlyVisible, int forceNumComponents,
+                               int componentMap[9])
 {
-  if(onlyVisible){
+  if(_steps.empty()) return _min;
+
+  if(onlyVisible || forceNumComponents){
     double vmin = VAL_INF;
     for(int ent = 0; ent < getNumEntities(step); ent++){
-      if(skipEntity(step, ent)) continue;
+      if(onlyVisible && skipEntity(step, ent)) continue;
       for(int ele = 0; ele < getNumElements(step, ent); ele++){
-        if(skipElement(step, ent, ele, true)) continue;
+        if(skipElement(step, ent, ele, onlyVisible)) continue;
         for(int nod = 0; nod < getNumNodes(step, ent, ele); nod++){
           double val;
-          getScalarValue(step, ent, ele, nod, val);
+          getScalarValue(step, ent, ele, nod, val, 
+                         forceNumComponents, componentMap);
           vmin = std::min(vmin, val);
         }
       }
@@ -240,21 +244,25 @@ double PViewDataGModel::getMin(int step, bool onlyVisible)
     return vmin;
   }
 
-  if(step < 0 || _steps.empty()) return _min;
+  if(step < 0) return _min;
   return _steps[step]->getMin();
 }
 
-double PViewDataGModel::getMax(int step, bool onlyVisible)
+double PViewDataGModel::getMax(int step, bool onlyVisible, int forceNumComponents,
+                               int componentMap[9])
 {
-  if(onlyVisible){
+  if(_steps.empty()) return _max;
+
+  if(onlyVisible || forceNumComponents){
     double vmax = -VAL_INF;
     for(int ent = 0; ent < getNumEntities(step); ent++){
-      if(skipEntity(step, ent)) continue;
+      if(onlyVisible && skipEntity(step, ent)) continue;
       for(int ele = 0; ele < getNumElements(step, ent); ele++){
-        if(skipElement(step, ent, ele, true)) continue;
+        if(skipElement(step, ent, ele, onlyVisible)) continue;
         for(int nod = 0; nod < getNumNodes(step, ent, ele); nod++){
           double val;
-          getScalarValue(step, ent, ele, nod, val);
+          getScalarValue(step, ent, ele, nod, val, 
+                         forceNumComponents, componentMap);
           vmax = std::max(vmax, val);
         }
       }
@@ -262,7 +270,7 @@ double PViewDataGModel::getMax(int step, bool onlyVisible)
     return vmax;
   }
 
-  if(step < 0 || _steps.empty()) return _max;
+  if(step < 0) return _max;
   return _steps[step]->getMax();
 }
 
diff --git a/Post/PViewDataGModel.h b/Post/PViewDataGModel.h
index 4731430c8256edb753dda3e2128be47c5c737882..5153aea5d0907e4b0d275838c90e515332c4e103 100644
--- a/Post/PViewDataGModel.h
+++ b/Post/PViewDataGModel.h
@@ -174,8 +174,10 @@ class PViewDataGModel : public PViewData {
   int getNumTimeSteps();
   int getFirstNonEmptyTimeStep();
   double getTime(int step);
-  double getMin(int step=-1, bool onlyVisible=false);
-  double getMax(int step=-1, bool onlyVisible=false);
+  double getMin(int step=-1, bool onlyVisible=false, int forceNumComponents=0,
+                int componentMap[9]=0);
+  double getMax(int step=-1, bool onlyVisible=false, int forceNumComponents=0,
+                int componentMap[9]=0);
   void setMin(double min){ _min = min; }
   void setMax(double max){ _max = max; }
   SBoundingBox3d getBoundingBox(int step=-1);
diff --git a/Post/PViewDataList.cpp b/Post/PViewDataList.cpp
index 75df3978814e64322eb78e5db1fd124401b2c2e9..31e9dff239af952faae07590ebf865539ddb507e 100644
--- a/Post/PViewDataList.cpp
+++ b/Post/PViewDataList.cpp
@@ -104,15 +104,51 @@ double PViewDataList::getTime(int step)
   return Time[step];
 }
 
-double PViewDataList::getMin(int step, bool onlyVisible)
-{
-  if(step < 0 || step >= (int)TimeStepMin.size()) return Min;
+double PViewDataList::getMin(int step, bool onlyVisible, int forceNumComponents,
+                             int componentMap[9])
+{
+  if(step >= (int)TimeStepMin.size()) return Min;
+
+  if(forceNumComponents){
+    double vmin = VAL_INF;
+    for(int ent = 0; ent < getNumEntities(step); ent++){
+      for(int ele = 0; ele < getNumElements(step, ent); ele++){
+        for(int nod = 0; nod < getNumNodes(step, ent, ele); nod++){
+          double val;
+          getScalarValue(step, ent, ele, nod, val, 
+                         forceNumComponents, componentMap);
+          vmin = std::min(vmin, val);
+        }
+      }
+    }
+    return vmin;
+  }
+
+  if(step < 0) return Min;
   return TimeStepMin[step];
 }
 
-double PViewDataList::getMax(int step, bool onlyVisible)
+double PViewDataList::getMax(int step, bool onlyVisible, int forceNumComponents,
+                             int componentMap[9])
 {
-  if(step < 0 || step >= (int)TimeStepMax.size()) return Max;
+  if(step >= (int)TimeStepMax.size()) return Max;
+
+  if(forceNumComponents){
+    double vmax = -VAL_INF;
+    for(int ent = 0; ent < getNumEntities(step); ent++){
+      for(int ele = 0; ele < getNumElements(step, ent); ele++){
+        for(int nod = 0; nod < getNumNodes(step, ent, ele); nod++){
+          double val;
+          getScalarValue(step, ent, ele, nod, val, 
+                         forceNumComponents, componentMap);
+          vmax = std::max(vmax, val);
+        }
+      }
+    }
+    return vmax;
+  }
+
+  if(step < 0) return Max;
   return TimeStepMax[step];
 }
 
diff --git a/Post/PViewDataList.h b/Post/PViewDataList.h
index 85e1e71b565c728a78adcd28b22733de69ef0533..a3d52af75867b23e13ee755de0c6b1b8474ed1a5 100644
--- a/Post/PViewDataList.h
+++ b/Post/PViewDataList.h
@@ -61,8 +61,10 @@ class PViewDataList : public PViewData {
   bool finalize(bool computeMinMax=true, const std::string &interpolationScheme="");
   int getNumTimeSteps(){ return NbTimeStep; }
   double getTime(int step);
-  double getMin(int step=-1, bool onlyVisible=false);
-  double getMax(int step=-1, bool onlyVisible=false);
+  double getMin(int step=-1, bool onlyVisible=false, int forceNumComponents=0,
+                int componentMap[9]=0);
+  double getMax(int step=-1, bool onlyVisible=false, int forceNumComponents=0,
+                int componentMap[9]=0);
   void setMin(double min) {Min = min;}
   void setMax(double max) {Max = max;}
   SBoundingBox3d getBoundingBox(int step=-1){ return BBox; }
diff --git a/Post/PViewDataRemote.h b/Post/PViewDataRemote.h
index 6f2230682c6e6346ce44993582721464801e9c08..bcc001ddd0491a18b8914dad2eb1f801725ffc7d 100644
--- a/Post/PViewDataRemote.h
+++ b/Post/PViewDataRemote.h
@@ -34,8 +34,10 @@ class PViewDataRemote : public PViewData {
     return true;
   }
   int getNumTimeSteps(){ return _numTimeSteps; }
-  double getMin(int step=-1, bool onlyVisible=false){ return _min; }
-  double getMax(int step=-1, bool onlyVisible=false){ return _max; }
+  double getMin(int step=-1, bool onlyVisible=false, int forceNumComponents=0, 
+                int componentMap[9]=0){ return _min; }
+  double getMax(int step=-1, bool onlyVisible=false, int forceNumComponents=0,
+                int componentMap[9]=0){ return _max; }
   SBoundingBox3d getBoundingBox(int step=-1){ return _bbox; }
   double getTime(int step){ return _time; }
   // need to return != 0 for "empty" tests