diff --git a/Fltk/GUI_Projection.cpp b/Fltk/GUI_Projection.cpp
index 1d4f2ddd57adb065ac0b73fae6b74585d5376c8e..d2fe12f42bb1b48749e2aaba881ac4c45b1e2156 100644
--- a/Fltk/GUI_Projection.cpp
+++ b/Fltk/GUI_Projection.cpp
@@ -369,6 +369,24 @@ void browse_cb(Fl_Widget *w, void *data)
   update_cb(0, data);
 }
 
+void project_point(FM::ProjectionSurface *ps, double x, double y, double z,
+		   std::vector<double> &u, std::vector<double> &v, 
+		   std::vector<double> &dist,
+		   std::vector<std::complex<double> > &f)
+{		   
+  double uu, vv, p[3], n[3];
+  ps->OrthoProjectionOnSurface(x, y, z, uu, vv);
+  if(uu >= 0. && uu <= 1. && vv >= 0. && vv <= 1.){
+    ps->F(uu, vv, p[0], p[1], p[2]);
+    ps->GetUnitNormal(uu, vv, n[0], n[1], n[2]);
+    double dx = x - p[0], dy = y - p[1], dz = z - p[2];
+    u.push_back(uu);
+    v.push_back(vv);
+    dist.push_back(sqrt(dx * dx + dy * dy + dz * dz));
+    f.push_back(dx * n[0] + dy * n[1] + dz * n[2]);
+  }
+}
+
 void update_cb(Fl_Widget *w, void *data)
 {
   projectionEditor *e = (projectionEditor*)data;
@@ -393,7 +411,7 @@ void update_cb(Fl_Widget *w, void *data)
       ps->SetParameter(i - 9, p->parameters[i]->value());
     p->face->computeGraphicsRep(64, 64); // FIXME: hardcoded for now!
    
-    // project all selected points and update u,v display
+    // project selected points and elements and update u,v display
     std::vector<double> u, v, dist;
     std::vector<std::complex<double> > f;
     std::vector<GEntity*> &ent(e->getEntities());
@@ -402,22 +420,18 @@ void update_cb(Fl_Widget *w, void *data)
 	GVertex *gv = dynamic_cast<GVertex*>(ent[i]);
 	if(!gv)
 	  Msg(GERROR, "Problem in point selection processing");
-	else{
-	  double uu, vv, p[3], n[3];
-	  ps->OrthoProjectionOnSurface(gv->x(), gv->y(), gv->z(), uu, vv);
-	  if(uu >= 0. && uu <= 1. && vv >= 0. && vv <= 1.){
-	    ps->F(uu, vv, p[0], p[1], p[2]);
-	    ps->GetUnitNormal(uu, vv, n[0], n[1], n[2]);
-	    double dx = gv->x() - p[0], dy = gv->y() - p[1], dz = gv->z() - p[2];
-	    u.push_back(uu);
-	    v.push_back(vv);
-	    dist.push_back(sqrt(dx * dx + dy * dy + dz * dz));
-	    f.push_back(dx * n[0] + dy * n[1] + dz * n[2]);
-	  }
-	}
+	else
+	  project_point(ps, gv->x(), gv->y(), gv->z(), u, v, dist, f);
       }
     }
-    // deal with elements here
+    std::vector<MElement*> &ele(e->getElements());
+    std::set<MVertex*> verts;
+    for(unsigned int i = 0; i < ele.size(); i++)
+      if(ele[i]->getVisibility() == 2)
+	for(int j = 0; j < ele[i]->getNumVertices(); j++)
+	  verts.insert(ele[i]->getVertex(j));
+    for(std::set<MVertex*>::iterator it = verts.begin(); it != verts.end(); it++)
+      project_point(ps, (*it)->x(), (*it)->y(), (*it)->z(), u, v, dist, f);
     e->uv()->set(u, v, dist, f);
   }
 
@@ -549,7 +563,20 @@ void filter_cb(Fl_Widget *w, void *data)
 	  gv->setSelection(false);
       }
     }
-    // deal with elements here
+    std::vector<MElement*> &ele(e->getElements());
+    for(unsigned int i = 0; i < ele.size(); i++){
+      SPoint3 pc = ele[i]->barycenter();
+      double uu, vv, p[3], n[3];
+      ps->OrthoProjectionOnSurface(pc.x(), pc.y(), pc.z(), uu, vv);
+      ps->F(uu, vv, p[0], p[1], p[2]);
+      double dx = pc.x() - p[0], dy = pc.y() - p[1], dz = pc.z() - p[2];
+      if(uu >= 0. && uu <= 1. && vv >= 0. && vv < 1. &&
+	 sqrt(dx * dx + dy * dy + dz * dz) < threshold)
+	ele[i]->setVisibility(2);
+      else
+	ele[i]->setVisibility(1);
+    }
+    if(ele.size()) CTX.mesh.changed = ENT_ALL;
   }
   update_cb(0, data);
 }