diff --git a/Fltk/GUI_Projection.cpp b/Fltk/GUI_Projection.cpp
index d1191ede0b93f2abef8221dd0ac5f80588dae545..3309be6a48e72aa7c3d32fef799fec0330be05da 100644
--- a/Fltk/GUI_Projection.cpp
+++ b/Fltk/GUI_Projection.cpp
@@ -148,6 +148,21 @@ projection::projection(FProjectionFace *f, int x, int y, int w, int h, int BB, i
       v->label((i == 0) ? "X" : (i == 1) ? "Y" : "Z");
     }
     ps->SetOrigin(pc[0], pc[1], pc[2]);
+    Fl_Repeat_Button *bm[3], *bp[3];
+    for(int i = 0; i < 3; i++){
+      new Fl_Box(x + w - BB / 3 - BB / 6, y + (1 + i) * BH, BB / 8, BH, 
+		 (i == 0) ? "E0" : (i == 1) ? "E1" : "E2");
+      bp[i] = new Fl_Repeat_Button(x + w - BB / 3, y + (1 + i) * BH, 
+				   BB / 8, BH / 2, "+");
+      bm[i] = new Fl_Repeat_Button(x + w - BB / 3, y + (1 + i) * BH + BH / 2,
+				   BB / 8, BH / 2, "-");
+    }
+    bp[0]->callback(translate_p0_cb, e);
+    bp[1]->callback(translate_p1_cb, e);
+    bp[2]->callback(translate_p2_cb, e);
+    bm[0]->callback(translate_m0_cb, e);
+    bm[1]->callback(translate_m1_cb, e);
+    bm[2]->callback(translate_m2_cb, e);
   }
   { // normal is stored in parameters[3,4,5]
     Fl_Value_Input *v1 = new Fl_Value_Input(x, y + 4 * BH, BB / 3, BH);
@@ -160,7 +175,7 @@ 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, "-");
+    Fl_Button *b = new Fl_Button(x + w - BB / 3, y + 4 * BH + BH / 4, BB / 8, BH / 2, "-");
     b->callback(invert_normal_cb, e);
     b->tooltip("Invert normal");
   }
@@ -434,23 +449,40 @@ void invert_normal_cb(Fl_Widget *w, void *data)
   }
 }
 
-void translate_cb(Fl_Widget *w, void *data)
+void translate(void *data, int axis, bool plus)
 {
   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);
+    FM::ProjectionSurface *ps = p->face->GetProjectionSurface();
+    SVector3 origin(p->parameters[0]->value(),
+		    p->parameters[1]->value(),
+		    p->parameters[2]->value());
+    SVector3 vec;
+    if(axis == 0)
+      ps->GetE0(vec[0], vec[1], vec[2]);
+    else if(axis == 1)
+      ps->GetE1(vec[0], vec[1], vec[2]);
+    else
+      ps->GetE2(vec[0], vec[1], vec[2]);
+    if(plus)
+      origin += vec * (CTX.lc / 100.);
+    else
+      origin -= vec * (CTX.lc / 100.);
+    p->parameters[0]->value(origin[0]);
+    p->parameters[1]->value(origin[1]);
+    p->parameters[2]->value(origin[2]);
     update_cb(0, data);
   }
 }
 
+void translate_p0_cb(Fl_Widget *w, void *data){ translate(data, 0, true); }
+void translate_p1_cb(Fl_Widget *w, void *data){ translate(data, 1, true); }
+void translate_p2_cb(Fl_Widget *w, void *data){ translate(data, 2, true); }
+void translate_m0_cb(Fl_Widget *w, void *data){ translate(data, 0, false); }
+void translate_m1_cb(Fl_Widget *w, void *data){ translate(data, 1, false); }
+void translate_m2_cb(Fl_Widget *w, void *data){ translate(data, 2, false); }
+
 void set_position_cb(Fl_Widget *w, void *data)
 {
   projectionEditor *e = (projectionEditor*)data;
diff --git a/Fltk/GUI_Projection.h b/Fltk/GUI_Projection.h
index 04a7fe684cf1eb925aacf111a6dd26af7f819e0b..0ccad8cd7a3b8dbd0c41dcee879a258e1a7a54b2 100644
--- a/Fltk/GUI_Projection.h
+++ b/Fltk/GUI_Projection.h
@@ -19,7 +19,12 @@ 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 translate_p0_cb(Fl_Widget *w, void *data);
+void translate_p1_cb(Fl_Widget *w, void *data);
+void translate_p2_cb(Fl_Widget *w, void *data);
+void translate_m0_cb(Fl_Widget *w, void *data);
+void translate_m1_cb(Fl_Widget *w, void *data);
+void translate_m2_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);