diff --git a/Common/Context.h b/Common/Context.h
index 10f61f21510cc6ae81928edc906b186e87242d43..b7a21401b76def9be073398e0c87b4d358159ec8 100644
--- a/Common/Context.h
+++ b/Common/Context.h
@@ -230,7 +230,7 @@ public :
     unsigned int ambient_light[6], diffuse_light[6], specular_light[6];
     struct{
       unsigned int point, line, surface, volume;
-      unsigned int selection, highlight[3];
+      unsigned int selection, highlight[3], projection;
       unsigned int tangents, normals;
     } geom;
     struct{
diff --git a/Common/DefaultOptions.h b/Common/DefaultOptions.h
index b5eaa3edf95a739004800b4805b2913a79615072..07016438a7d16301a139023039a7fa00ac27233b 100644
--- a/Common/DefaultOptions.h
+++ b/Common/DefaultOptions.h
@@ -1472,6 +1472,9 @@ StringXColor GeometryOptions_Color[] = {
   { F|O, "Normals" , opt_geometry_color_normals ,
     {255, 0, 0, 255}, {255, 0, 0, 255}, {0, 0, 0, 255},
     "Normal geometry vectors color" },
+  { F|O, "Projection" , opt_geometry_color_projection ,
+    {0, 255, 0, 255}, {0, 255, 0, 255}, {0, 0, 0, 255},
+    "Projection surface color" },
   { 0, NULL , NULL , {0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0} , NULL }
 } ;
 
diff --git a/Common/Options.cpp b/Common/Options.cpp
index 82d5a3664f86c535c61b30192bc880819173b270..350456004c6495358aa89d150b73b661494fea81 100644
--- a/Common/Options.cpp
+++ b/Common/Options.cpp
@@ -1,4 +1,4 @@
-// $Id: Options.cpp,v 1.348 2007-08-03 00:44:28 geuzaine Exp $
+// $Id: Options.cpp,v 1.349 2007-08-17 17:51:26 geuzaine Exp $
 //
 // Copyright (C) 1997-2007 C. Geuzaine, J.-F. Remacle
 //
@@ -7306,6 +7306,17 @@ unsigned int opt_geometry_color_normals(OPT_ARGS_COL)
   return CTX.color.geom.normals;
 }
 
+unsigned int opt_geometry_color_projection(OPT_ARGS_COL)
+{
+  if(action & GMSH_SET){
+    CTX.color.geom.projection = val;
+  }
+#if defined(HAVE_FLTK)
+  CCC(CTX.color.geom.projection, WID->geo_col[10]);
+#endif
+  return CTX.color.geom.projection;
+}
+
 unsigned int opt_mesh_color_points(OPT_ARGS_COL)
 {
   if(action & GMSH_SET) {
diff --git a/Common/Options.h b/Common/Options.h
index bfad509042e9f923c8eeee06f9e6941cae066176..1b6992b9ab6e63e44a1fb4d0f3f65836e2ecc411 100644
--- a/Common/Options.h
+++ b/Common/Options.h
@@ -672,6 +672,7 @@ unsigned int opt_geometry_color_highlight1(OPT_ARGS_COL);
 unsigned int opt_geometry_color_highlight2(OPT_ARGS_COL);
 unsigned int opt_geometry_color_tangents(OPT_ARGS_COL);
 unsigned int opt_geometry_color_normals(OPT_ARGS_COL);
+unsigned int opt_geometry_color_projection(OPT_ARGS_COL);
 unsigned int opt_mesh_color_points(OPT_ARGS_COL); 
 unsigned int opt_mesh_color_points_sup(OPT_ARGS_COL); 
 unsigned int opt_mesh_color_lines(OPT_ARGS_COL); 
diff --git a/Fltk/GUI_Projection.cpp b/Fltk/GUI_Projection.cpp
index 3d07e958d095d02636f77878348b71ecb4d42dc5..d1191ede0b93f2abef8221dd0ac5f80588dae545 100644
--- a/Fltk/GUI_Projection.cpp
+++ b/Fltk/GUI_Projection.cpp
@@ -160,6 +160,9 @@ projection::projection(FProjectionFace *f, int x, int y, int w, int h, int BB, i
     parameters.push_back(v3);
     v3->maximum(1.); v3->minimum(-1.); v3->step(0.01); v3->value(1.);
     v3->label("Normal");
+    Fl_Button *b = new Fl_Button(x + w - BB / 3, y + 4 * BH, BB / 8, BH, "-");
+    b->callback(invert_normal_cb, e);
+    b->tooltip("Invert normal");
   }
   { // rotation is stored in parameters[6]
     Fl_Value_Input *v = new Fl_Value_Input(x, y + 5 * BH, BB, BH, "Rotation");
@@ -419,6 +422,35 @@ void project_point(FM::ProjectionSurface *ps, double x, double y, double z,
   }
 }
 
+void invert_normal_cb(Fl_Widget *w, void *data)
+{
+  projectionEditor *e = (projectionEditor*)data;
+  projection *p = e->getCurrentProjection();
+  if(p){
+    p->parameters[3]->value(-p->parameters[3]->value());
+    p->parameters[4]->value(-p->parameters[4]->value());
+    p->parameters[5]->value(-p->parameters[5]->value());
+    update_cb(0, data);
+  }
+}
+
+void translate_cb(Fl_Widget *w, void *data)
+{
+  projectionEditor *e = (projectionEditor*)data;
+  projection *p = e->getCurrentProjection();
+  if(p){
+    // add widgets so that we can translate along the principal
+    // directions, and change the origin's position accordingly
+    double x = p->parameters[0]->value();
+    double y = p->parameters[1]->value();
+    double z = p->parameters[2]->value();
+    p->parameters[0]->value(x);
+    p->parameters[1]->value(y);
+    p->parameters[2]->value(z);
+    update_cb(0, data);
+  }
+}
+
 void set_position_cb(Fl_Widget *w, void *data)
 {
   projectionEditor *e = (projectionEditor*)data;
@@ -452,8 +484,8 @@ void set_position_cb(Fl_Widget *w, void *data)
       }
     }
     ((Fl_Toggle_Button*)w)->value(0);
+    update_cb(0, data);
   }
-  update_cb(0, data);
 }
 
 void getTangents(const SVector3 n, SVector3 &t1, SVector3 &t2, const double angle)
diff --git a/Fltk/GUI_Projection.h b/Fltk/GUI_Projection.h
index 09c6fa04547d17ab94eea738a24b13294d05accf..04a7fe684cf1eb925aacf111a6dd26af7f819e0b 100644
--- a/Fltk/GUI_Projection.h
+++ b/Fltk/GUI_Projection.h
@@ -18,6 +18,8 @@ void select_cb(Fl_Widget *w, void *data);
 void filter_cb(Fl_Widget *w, void *data);
 void browse_cb(Fl_Widget *w, void *data);
 void set_position_cb(Fl_Widget *w, void *data);
+void invert_normal_cb(Fl_Widget *w, void *data);
+void translate_cb(Fl_Widget *w, void *data);
 void update_cb(Fl_Widget *w, void *data);
 void close_cb(Fl_Widget *w, void *data);
 void hide_cb(Fl_Widget *w, void *data);
diff --git a/Graphics/Geom.cpp b/Graphics/Geom.cpp
index 7f1fd4f63d06538a2146f4fd54973740f50d604b..d319321e6fe950df310463ae8ca4680bfab90ed2 100644
--- a/Graphics/Geom.cpp
+++ b/Graphics/Geom.cpp
@@ -1,4 +1,4 @@
-// $Id: Geom.cpp,v 1.136 2007-08-17 15:43:07 geuzaine Exp $
+// $Id: Geom.cpp,v 1.137 2007-08-17 17:51:27 geuzaine Exp $
 //
 // Copyright (C) 1997-2007 C. Geuzaine, J.-F. Remacle
 //
@@ -262,7 +262,7 @@ class drawGFace {
     if(gr.size() != N) return;
 
     if(f->geomType() == GEntity::ProjectionFace)
-      glColor4ubv((GLubyte *) & CTX.color.geom.selection);
+      glColor4ubv((GLubyte *) & CTX.color.geom.projection);
 
     if(CTX.geom.surface_type > 0)
       glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);