diff --git a/Geo/MElement.h b/Geo/MElement.h
index da25f024db33ba50e5e9e6cd2232176634d91494..2f5dbc375e34c8288b4f1ea855a7aa8888b8c719 100644
--- a/Geo/MElement.h
+++ b/Geo/MElement.h
@@ -264,7 +264,8 @@ class MElement
   // integration routines
   virtual void getIntegrationPoints(int pOrder, int *npts, IntPt **pts)
   {
-    Msg::Error("No integration points defined for this type of element: %d",this->getType());
+    Msg::Error("No integration points defined for this type of element: %d",
+               this->getType());
   }
 
   // IO routines
diff --git a/Geo/MElementOctree.cpp b/Geo/MElementOctree.cpp
index e34fa693fd1c295037dcf6b881ce2281f0f194e3..a1dd5a13da624cd9c068553f5aeaa84daa64e98b 100644
--- a/Geo/MElementOctree.cpp
+++ b/Geo/MElementOctree.cpp
@@ -7,6 +7,7 @@
 #include "MElement.h"
 #include "MElementOctree.h"
 #include "Octree.h"
+#include "Context.h"
 
 static void MElementBB(void *a, double *min, double *max)
 {
@@ -21,6 +22,13 @@ static void MElementBB(void *a, double *min, double *max)
     min[1] = std::min(min[1], v->y()); max[1] = std::max(max[1], v->y());
     min[2] = std::min(min[2], v->z()); max[2] = std::max(max[2], v->z());
   }
+
+  // make bounding boxes larger up to (absolute) geometrical tolerance
+  double eps = CTX::instance()->geom.tolerance;
+  for(int i = 0; i < 3; i++){
+    min[i] -= eps;
+    max[i] += eps;
+  }
 }
 
 static void MElementCentroid(void *a, double *x)
@@ -50,10 +58,15 @@ static int MElementInEle(void *a, double *x)
 MElementOctree::MElementOctree(GModel *m)
 {
   SBoundingBox3d bb = m->bounds();
-  double min[3] = {bb.min().x(), bb.min().y(), bb.min().z()};
-  double size[3] = {bb.max().x() - bb.min().x(),
-                    bb.max().y() - bb.min().y(),
-                    bb.max().z() - bb.min().z()};
+  // make bounding box larger up to (absolute) geometrical tolerance
+  double eps = CTX::instance()->geom.tolerance;
+  SPoint3 bbmin = bb.min(), bbmax = bb.max(), bbeps(eps, eps, eps);
+  bbmin -= bbeps;
+  bbmax += bbeps;
+  double min[3] = {bbmin.x(), bbmin.y(), bbmin.z()};
+  double size[3] = {bbmax.x() - bbmin.x(),
+                    bbmax.y() - bbmin.y(),
+                    bbmax.z() - bbmin.z()};
   const int maxElePerBucket = 100; // memory vs. speed trade-off
   _octree = Octree_Create(maxElePerBucket, min, size,
                           MElementBB, MElementCentroid, MElementInEle);
@@ -75,10 +88,15 @@ MElementOctree::MElementOctree(std::vector<MElement*> &v)
                     v[i]->getVertex(j)->z());
     }
   }
-  double min[3] = {bb.min().x(), bb.min().y(), bb.min().z()};
-  double size[3] = {bb.max().x() - bb.min().x(),
-                    bb.max().y() - bb.min().y(),
-                    bb.max().z() - bb.min().z()};
+  // make bounding box larger up to (absolute) geometrical tolerance
+  double eps = CTX::instance()->geom.tolerance;
+  SPoint3 bbmin = bb.min(), bbmax = bb.max(), bbeps(eps, eps, eps);
+  bbmin -= bbeps;
+  bbmax += bbeps;
+  double min[3] = {bbmin.x(), bbmin.y(), bbmin.z()};
+  double size[3] = {bbmax.x() - bbmin.x(),
+                    bbmax.y() - bbmin.y(),
+                    bbmax.z() - bbmin.z()};
   const int maxElePerBucket = 100; // memory vs. speed trade-off
   _octree = Octree_Create(maxElePerBucket, min, size,
                           MElementBB, MElementCentroid, MElementInEle);
diff --git a/Mesh/Field.cpp b/Mesh/Field.cpp
index 468f166012760c33f31d78d1061b19f80aeff36a..b1288474ffa6a8a6265e881d7bf5625851ba8f24 100644
--- a/Mesh/Field.cpp
+++ b/Mesh/Field.cpp
@@ -1146,7 +1146,9 @@ class PostViewField : public Field
       update_needed = false;
     }
     double l = 0.;
-    if(!octree->searchScalarWithTol(x, y, z, &l, 0, 0, 10.))
+    // use large tolerance (in element reference coordinates) to
+    // maximize chance of finding an element
+    if(!octree->searchScalarWithTol(x, y, z, &l, 0, 0, 1.))
       Msg::Info("No element found containing point (%g,%g,%g)", x, y, z);
     if(l <= 0 && crop_negative_values) return MAX_LC;
     return l;
diff --git a/Post/OctreePost.cpp b/Post/OctreePost.cpp
index 7a226a566d18437af28eb04a837b163494b5f76a..338d3a0b15f65563765b25e46247c3cb25f2ab4a 100644
--- a/Post/OctreePost.cpp
+++ b/Post/OctreePost.cpp
@@ -13,6 +13,7 @@
 #include "shapeFunctions.h"
 #include "GModel.h"
 #include "MElement.h"
+#include "Context.h"
 
 // helper routines for list-based views
 
@@ -33,6 +34,13 @@ static void minmax(int n, double *X, double *Y, double *Z,
     max[1] = (Y[i] > max[1]) ? Y[i] : max[1];
     max[2] = (Z[i] > max[2]) ? Z[i] : max[2];
   }
+
+  // make bounding boxes larger up to (absolute) geometrical tolerance
+  double eps = CTX::instance()->geom.tolerance;
+  for(int i = 0; i < 3; i++){
+    min[i] -= eps;
+    max[i] += eps;
+  }
 }
 
 static void centroid(int n, double *X, double *Y, double *Z, double *c)
@@ -233,10 +241,15 @@ OctreePost::OctreePost(PView *v)
     }
 
     SBoundingBox3d bb = l->getBoundingBox();
-    double min[3] = {bb.min().x(), bb.min().y(), bb.min().z()};
-    double size[3] = {bb.max().x() - bb.min().x(),
-                      bb.max().y() - bb.min().y(),
-                      bb.max().z() - bb.min().z()};                   
+    // make bounding box larger up to (absolute) geometrical tolerance
+    double eps = CTX::instance()->geom.tolerance;
+    SPoint3 bbmin = bb.min(), bbmax = bb.max(), bbeps(eps, eps, eps);
+    bbmin -= bbeps;
+    bbmax += bbeps;
+    double min[3] = {bbmin.x(), bbmin.y(), bbmin.z()};
+    double size[3] = {bbmax.x() - bbmin.x(),
+                      bbmax.y() - bbmin.y(),
+                      bbmax.z() - bbmin.z()};
     const int maxElePerBucket = 100; // memory vs. speed trade-off
     
     _SL = Octree_Create(maxElePerBucket, min, size, linBB, linCentroid, linInEle);
diff --git a/Post/PViewData.h b/Post/PViewData.h
index 100243ff7a8eb33077cd008b802c26121ad5e8aa..f2bf9ccbc99441737ebdca555948038ea0106457 100644
--- a/Post/PViewData.h
+++ b/Post/PViewData.h
@@ -213,6 +213,9 @@ class PViewData {
   virtual bool isRemote(){ return false; }
   virtual int fillRemoteVertexArrays(std::string &options){ return 0; }
 
+  // get MElement (if view supports it)
+  virtual MElement *getElement(int step, int entity, int element);
+
   // I/O routines
   virtual bool writeSTL(std::string fileName);
   virtual bool writeTXT(std::string fileName);
@@ -220,8 +223,7 @@ class PViewData {
                         bool append=false);
   virtual bool writeMSH(std::string fileName, bool binary=false);
   virtual bool writeMED(std::string fileName);
-  //
-  virtual MElement *getElement (int step, int entity, int element);
+
   static void registerBindings(binding *b);
 };
 
diff --git a/Post/PViewDataGModel.h b/Post/PViewDataGModel.h
index d9656cd1e2806938f579d8f7a7bfb2b54f7e5330..c741374972ed74d0841483c6a42bb23496ce46d8 100644
--- a/Post/PViewDataGModel.h
+++ b/Post/PViewDataGModel.h
@@ -227,6 +227,8 @@ class PViewDataGModel : public PViewData {
   bool getValueByIndex(int step, int dataIndex, int node, int comp, double &val);
   // get underlying model
   GModel* getModel(int step){ return _steps[step]->getModel(); }
+  // get MElement
+  MElement *getElement(int step, int entity, int element);
 
   // Add some data "on the fly" (data is stored in a map, indexed by
   // node or element number depending on the type of dataset)
@@ -240,7 +242,6 @@ class PViewDataGModel : public PViewData {
   bool writeMSH(std::string fileName, bool binary=false);
   bool readMED(std::string fileName, int fileIndex);
   bool writeMED(std::string fileName);
-  MElement *getElement (int step, int entity, int element);
 };
 
 #endif