diff --git a/Fltk/Callbacks.cpp b/Fltk/Callbacks.cpp
index 93aa0dc773f8473a654b07e54773f64c2935c902..a5705a38d7cc7739c7c47a006b1360486fb1437a 100644
--- a/Fltk/Callbacks.cpp
+++ b/Fltk/Callbacks.cpp
@@ -1,4 +1,4 @@
-// $Id: Callbacks.cpp,v 1.468 2006-11-04 00:17:07 geuzaine Exp $
+// $Id: Callbacks.cpp,v 1.469 2006-11-04 14:14:12 geuzaine Exp $
 //
 // Copyright (C) 1997-2006 C. Geuzaine, J.-F. Remacle
 //
@@ -3616,6 +3616,63 @@ void mesh_parameterize_cb(CALLBACK_ARGS)
   printf("LAUNCH REPARAMETERIZATION WINDOW!\n");
 }
 
+void mesh_inspect_cb(CALLBACK_ARGS)
+{
+  char *str = (char*)data;
+
+  std::vector<GVertex*> vertices;
+  std::vector<GEdge*> edges;
+  std::vector<GFace*> faces;
+  std::vector<GRegion*> regions;
+  std::vector<MElement*> elements;
+  MElement *ele = 0;
+
+  CTX.pick_elements = 1;
+  CTX.mesh.changed = ENT_ALL;
+  Draw();
+
+  while(1) {
+    Msg(ONSCREEN, "Select element\n[Press 'q' to abort]");
+    char ib = SelectEntity(ENT_ALL, vertices, edges, faces, regions, elements);
+    if(ib == 'l') {
+      if(ele) ele->setVisibility(1);
+      if(elements.size()){
+	ele = elements[0];
+	ele->setVisibility(2);
+	Msg(DIRECT, "Element %d:", ele->getNum());
+	Msg(DIRECT, "  Type: %d", ele->getTypeForMSH()); 
+	Msg(DIRECT, "  Dimension: %d", ele->getDim());
+	Msg(DIRECT, "  Order: %d", ele->getPolynomialOrder()); 
+	Msg(DIRECT, "  Partition: %d", ele->getPartition()); 
+	char tmp1[256], tmp2[256];
+	sprintf(tmp2, "  Vertices:");
+	for(int i = 0; i < ele->getNumVertices(); i++){
+	  sprintf(tmp1, " %d", ele->getVertex(i)->getNum());
+	  strcat(tmp2, tmp1);
+	}
+	Msg(DIRECT, tmp2);
+	SPoint3 pt = ele->barycenter();
+	Msg(DIRECT, "  Barycenter: (%g,%g,%g)", pt[0], pt[1], pt[2]);
+	Msg(DIRECT, "  Rho: %g", ele->rhoShapeMeasure());
+	Msg(DIRECT, "  Gamma: %g", ele->gammaShapeMeasure());
+	Msg(DIRECT, "  Eta: %g", ele->etaShapeMeasure());
+	CTX.mesh.changed = ENT_ALL;
+	Draw();
+	WID->create_message_window();
+      }
+    }
+    if(ib == 'q') {
+      if(ele) ele->setVisibility(1);
+      break;
+    }
+  }
+
+  CTX.pick_elements = 0;
+  CTX.mesh.changed = ENT_ALL;
+  Draw();
+  Msg(ONSCREEN, "");
+}
+
 void mesh_degree_cb(CALLBACK_ARGS)
 {
   if((long)data == 2)
diff --git a/Fltk/Callbacks.h b/Fltk/Callbacks.h
index ba2a26a9d0f880d6b0fe75785c58ec67879edf9a..5f853b50495d2a640c01aa4813ee7626e4bbf404 100644
--- a/Fltk/Callbacks.h
+++ b/Fltk/Callbacks.h
@@ -273,6 +273,7 @@ void mesh_3d_cb(CALLBACK_ARGS);
 void mesh_edit_cb(CALLBACK_ARGS);
 void mesh_delete_cb(CALLBACK_ARGS);
 void mesh_delete_parts_cb(CALLBACK_ARGS);
+void mesh_inspect_cb(CALLBACK_ARGS);
 void mesh_remesh_cb(CALLBACK_ARGS); 
 void mesh_update_edges_cb(CALLBACK_ARGS); 
 void mesh_parameterize_cb(CALLBACK_ARGS);
diff --git a/Fltk/GUI.cpp b/Fltk/GUI.cpp
index 1a0241a7164e3c70f63510810c7122bd132d0777..f299f5a7e4bd280281a6fd634ac6870c21358189 100644
--- a/Fltk/GUI.cpp
+++ b/Fltk/GUI.cpp
@@ -1,4 +1,4 @@
-// $Id: GUI.cpp,v 1.557 2006-11-02 18:55:45 geuzaine Exp $
+// $Id: GUI.cpp,v 1.558 2006-11-04 14:14:12 geuzaine Exp $
 //
 // Copyright (C) 1997-2006 C. Geuzaine, J.-F. Remacle
 //
@@ -322,6 +322,7 @@ Context_Item menu_geometry[] = {
 Context_Item menu_mesh[] = {
   {"1Mesh", NULL} ,
   {"Define",       (Fl_Callback *)mesh_define_cb} ,
+  {"Inspect",      (Fl_Callback *)mesh_inspect_cb} , 
   {"Edit",         (Fl_Callback *)mesh_edit_cb} , 
   {"1D",           (Fl_Callback *)mesh_1d_cb} ,
   {"2D",           (Fl_Callback *)mesh_2d_cb} , 
diff --git a/Fltk/Opengl_Window.cpp b/Fltk/Opengl_Window.cpp
index 1ae4bd1eddbdb1375561ddb56588d848be52e176..a815cbee15aa204a13d1f969f57cd865e215f500 100644
--- a/Fltk/Opengl_Window.cpp
+++ b/Fltk/Opengl_Window.cpp
@@ -1,4 +1,4 @@
-// $Id: Opengl_Window.cpp,v 1.75 2006-11-04 00:17:08 geuzaine Exp $
+// $Id: Opengl_Window.cpp,v 1.76 2006-11-04 14:14:13 geuzaine Exp $
 //
 // Copyright (C) 1997-2006 C. Geuzaine, J.-F. Remacle
 //
@@ -301,8 +301,16 @@ int Opengl_Window::handle(int event)
 	redraw();
       }
       else {
-	if(Fl::event_button() == 1 && 
-	   !Fl::event_state(FL_SHIFT) && !Fl::event_state(FL_ALT)) {
+	if(Fl::event_state(FL_META)) {
+	  // will try to select or unselect entities on the fly
+	  WID->try_selection = Fl::event_state(FL_SHIFT) ? -1 : 1; 
+	  WID->try_selection_xywh[0] = (int)curr.win[0];
+	  WID->try_selection_xywh[1] = (int)curr.win[1];
+	  WID->try_selection_xywh[2] = 5;
+	  WID->try_selection_xywh[3] = 5;
+	}
+	else if(Fl::event_button() == 1 && 
+		!Fl::event_state(FL_SHIFT) && !Fl::event_state(FL_ALT)) {
 	  if(CTX.useTrackball)
 	    CTX.addQuaternion((2. * prev.win[0] - w()) / w(),
 			      (h() - 2. * prev.win[1]) / h(),