diff --git a/Common/Context.h b/Common/Context.h
index 2ff9e4b1170799e0b526635a651d3167917bf911..24a67fcfa1cfd46a2c9f8f29020c39d5098f1f2e 100644
--- a/Common/Context.h
+++ b/Common/Context.h
@@ -192,7 +192,7 @@ public :
   struct{
     List_T *list ;
     int force_num, compute_bb, vertex_arrays;
-    int draw, scales, link ;
+    int draw, scales, link, horizontal_scales ;
     int smooth, anim_cycle, combine_time, combine_remove_orig ;
     double anim_delay ;
   }post;
diff --git a/Common/DefaultOptions.h b/Common/DefaultOptions.h
index 55f6b8f8a6eb20563638bf267c2eea006efdc129..503937d1a8e93713200d014521be5f8f58c58274 100644
--- a/Common/DefaultOptions.h
+++ b/Common/DefaultOptions.h
@@ -915,6 +915,9 @@ StringXNumber PostProcessingOptions_Number[] = {
   { F|O, "CombineRemoveOriginal" , opt_post_combine_remove_orig , 1. ,
     "Remove original views after a Combine operation" },
 
+  { F|O, "HorizontalScales" , opt_post_horizontal_scales , 0. , 
+    "Display value scales horizontally" },
+
   { F|O, "Link" , opt_post_link , 0. ,
     "Link post-processing views (0=none, 1,2=changes in visible/all, 3,4=everything in visible/all)" },
 
@@ -1061,8 +1064,6 @@ StringXNumber ViewOptions_Number[] = {
     "Tensor Visualization Type" },
   { F,   "TimeStep" , opt_view_timestep , 0. ,
     "Current time step displayed" },
-  { F|O, "TransparentScale" , opt_view_transparent_scale , 1. ,
-    "Display a `transparent' value scale?" },
   { F, "Type" , opt_view_type , DRAW_POST_3D ,
     "Type of graph (1=3D, 2=2D-space, 3=2D-time)" },
 
diff --git a/Common/Options.cpp b/Common/Options.cpp
index 34ae2d079c948ee33ffc0d711bda2fa96ed5113e..78710b201d34f874f3c13de77374ed1015901ca1 100644
--- a/Common/Options.cpp
+++ b/Common/Options.cpp
@@ -1,4 +1,4 @@
-// $Id: Options.cpp,v 1.186 2004-09-25 06:16:12 geuzaine Exp $
+// $Id: Options.cpp,v 1.187 2004-10-11 17:22:56 geuzaine Exp $
 //
 // Copyright (C) 1997-2004 C. Geuzaine, J.-F. Remacle
 //
@@ -4141,6 +4141,17 @@ double opt_post_scales(OPT_ARGS_NUM)
   return CTX.post.scales;
 }
 
+double opt_post_horizontal_scales(OPT_ARGS_NUM)
+{
+  if(action & GMSH_SET)
+    CTX.post.horizontal_scales = (int)val;
+#if defined(HAVE_FLTK)
+  if(WID && (action & GMSH_GUI))
+    WID->post_butt[2]->value(CTX.post.horizontal_scales);
+#endif
+  return CTX.post.horizontal_scales;
+}
+
 double opt_post_link(OPT_ARGS_NUM)
 {
   if(action & GMSH_SET){
@@ -4924,15 +4935,6 @@ double opt_view_draw_tensors(OPT_ARGS_NUM)
   return v->DrawTensors;
 }
 
-double opt_view_transparent_scale(OPT_ARGS_NUM)
-{
-  GET_VIEW(0.);
-  if(action & GMSH_SET) {
-    v->TransparentScale = (int)val;
-  }
-  return v->TransparentScale;
-}
-
 double opt_view_scale_type(OPT_ARGS_NUM)
 {
   GET_VIEW(0.);
diff --git a/Common/Options.h b/Common/Options.h
index 1660a2dd1e06204c94625d5ff8bbd57a3f93c6f4..b2ae315f05c40a9e2ed97fac68b5366e0d27f0b7 100644
--- a/Common/Options.h
+++ b/Common/Options.h
@@ -428,6 +428,7 @@ double opt_solver_merge_views3(OPT_ARGS_NUM);
 double opt_solver_merge_views4(OPT_ARGS_NUM);
 double opt_post_vertex_arrays(OPT_ARGS_NUM);
 double opt_post_scales(OPT_ARGS_NUM);
+double opt_post_horizontal_scales(OPT_ARGS_NUM);
 double opt_post_link(OPT_ARGS_NUM);
 double opt_post_smooth(OPT_ARGS_NUM);
 double opt_post_anim_delay(OPT_ARGS_NUM);
@@ -486,7 +487,6 @@ double opt_view_draw_pyramids(OPT_ARGS_NUM);
 double opt_view_draw_scalars(OPT_ARGS_NUM);
 double opt_view_draw_vectors(OPT_ARGS_NUM);
 double opt_view_draw_tensors(OPT_ARGS_NUM);
-double opt_view_transparent_scale(OPT_ARGS_NUM);
 double opt_view_scale_type(OPT_ARGS_NUM);
 double opt_view_tensor_type(OPT_ARGS_NUM);
 double opt_view_range_type(OPT_ARGS_NUM);
diff --git a/Common/Views.cpp b/Common/Views.cpp
index 80b54b4ed8c02c40b0960e01c81abf04d617e2a7..7846ff827e68e9bf449ec29bbc1a71a908a79864 100644
--- a/Common/Views.cpp
+++ b/Common/Views.cpp
@@ -1,4 +1,4 @@
-// $Id: Views.cpp,v 1.134 2004-09-18 20:25:25 geuzaine Exp $
+// $Id: Views.cpp,v 1.135 2004-10-11 17:22:56 geuzaine Exp $
 //
 // Copyright (C) 1997-2004 C. Geuzaine, J.-F. Remacle
 //
@@ -649,7 +649,6 @@ void CopyViewOptions(Post_View * src, Post_View * dest)
   dest->DrawVectors = src->DrawVectors;
   dest->DrawTensors = src->DrawTensors;
   dest->DrawStrings = src->DrawStrings;
-  dest->TransparentScale = src->TransparentScale;
   dest->ScaleType = src->ScaleType;
   dest->RangeType = src->RangeType;
   dest->VectorType = src->VectorType;
diff --git a/Common/Views.h b/Common/Views.h
index 95aa9b175b5796fb28a8eeb27058e9a563a81b25..1da08287cc8442508e862237a41d1121c5631ef3 100644
--- a/Common/Views.h
+++ b/Common/Views.h
@@ -73,7 +73,7 @@ class Post_View{
   double AngleSmoothNormals, AlphaChannel;
   int SaturateValues;
   int ShowElement, ShowTime, ShowScale;
-  int TransparentScale, ScaleType, RangeType;
+  int ScaleType, RangeType;
   int VectorType, TensorType, ArrowLocation;
   int TimeStep;
   int DrawStrings;
diff --git a/Fltk/Callbacks.cpp b/Fltk/Callbacks.cpp
index b2db5564d09a2c9f0f8fa3cade9e0d2e15a730d5..f734c4a9142311543a6d1b8464f986ba719d1e47 100644
--- a/Fltk/Callbacks.cpp
+++ b/Fltk/Callbacks.cpp
@@ -1,4 +1,4 @@
-// $Id: Callbacks.cpp,v 1.279 2004-09-25 17:25:45 geuzaine Exp $
+// $Id: Callbacks.cpp,v 1.280 2004-10-11 17:22:57 geuzaine Exp $
 //
 // Copyright (C) 1997-2004 C. Geuzaine, J.-F. Remacle
 //
@@ -1058,6 +1058,7 @@ void post_options_ok_cb(CALLBACK_ARGS)
 {
   opt_post_anim_cycle(0, GMSH_SET, WID->post_butt[0]->value());
   opt_post_combine_remove_orig(0, GMSH_SET, WID->post_butt[1]->value());
+  opt_post_horizontal_scales(0, GMSH_SET, WID->post_butt[2]->value());
 
   opt_post_anim_delay(0, GMSH_SET, WID->post_value[0]->value());
 
diff --git a/Fltk/GUI.cpp b/Fltk/GUI.cpp
index bd6bc3e866c08f979d3465765b5b2179d8a31fc2..77464f4830efc6868723414156bd5bc31ab74896 100644
--- a/Fltk/GUI.cpp
+++ b/Fltk/GUI.cpp
@@ -1,4 +1,4 @@
-// $Id: GUI.cpp,v 1.357 2004-09-28 23:07:27 geuzaine Exp $
+// $Id: GUI.cpp,v 1.358 2004-10-11 17:22:57 geuzaine Exp $
 //
 // Copyright (C) 1997-2004 C. Geuzaine, J.-F. Remacle
 //
@@ -2283,6 +2283,11 @@ void GUI::create_option_window()
       post_butt[1]->down_box(TOGGLE_BOX);
       post_butt[1]->selection_color(TOGGLE_COLOR);
 
+      post_butt[2] = new Fl_Check_Button(2 * WB, 2 * WB + 5 * BH, BW, BH, "Draw horizontal scales");
+      post_butt[2]->type(FL_TOGGLE_BUTTON);
+      post_butt[2]->down_box(TOGGLE_BOX);
+      post_butt[2]->selection_color(TOGGLE_COLOR);
+
       o->end();
     }
     o->end();
diff --git a/Graphics/Graph2D.cpp b/Graphics/Graph2D.cpp
index 6caace4743b9908788e385ec17ada38dc3b9d44a..477613db57fe17aebd3aa8fc2242d54ad17a1e61 100644
--- a/Graphics/Graph2D.cpp
+++ b/Graphics/Graph2D.cpp
@@ -1,4 +1,4 @@
-// $Id: Graph2D.cpp,v 1.35 2004-04-24 05:31:13 geuzaine Exp $
+// $Id: Graph2D.cpp,v 1.36 2004-10-11 17:22:57 geuzaine Exp $
 //
 // Copyright (C) 1997-2004 C. Geuzaine, J.-F. Remacle
 //
@@ -106,16 +106,6 @@ static void Draw_Graph2D(Post_View * v,
   double Abs, Val, ValMin = 0., ValMax = 0., AbsMin, AbsMax;
   double p1[3], p2[3];
 
-  if(!v->TransparentScale) {
-    glColor4ubv((GLubyte *) & CTX.color.bg);
-    glBegin(GL_QUADS);
-    glVertex2d(bb[0], CTX.viewport[3] - bb[1]);
-    glVertex2d(bb[2], CTX.viewport[3] - bb[1]);
-    glVertex2d(bb[2], CTX.viewport[3] - bb[3]);
-    glVertex2d(bb[0], CTX.viewport[3] - bb[3]);
-    glEnd();
-  }
-
   gl_font(CTX.gl_font_enum, CTX.gl_fontsize);
   font_h = gl_height(); // total font height
   font_a = gl_height() - gl_descent();  // height above ref pt
diff --git a/Graphics/Scale.cpp b/Graphics/Scale.cpp
index f69155eccc319a3f7666fc1820d706871e7d266c..19b28883383a36c108ea98a5dfdd75217fef4bc5 100644
--- a/Graphics/Scale.cpp
+++ b/Graphics/Scale.cpp
@@ -1,4 +1,4 @@
-// $Id: Scale.cpp,v 1.44 2004-09-01 20:23:50 geuzaine Exp $
+// $Id: Scale.cpp,v 1.45 2004-10-11 17:22:57 geuzaine Exp $
 //
 // Copyright (C) 1997-2004 C. Geuzaine, J.-F. Remacle
 //
@@ -35,19 +35,19 @@ extern Context_T CTX;
 
 void draw_scale(Post_View * v,
                 double xmin, double ymin, double width, double height,
-                double tic, double space, double dx, double dy)
+                double tic, int horizontal)
 {
-  int i, nbv;
-  double font_h, font_a;
-  double cs_bh, cv_xmin, cv_bh;
-  char label[1024];
-  double Val, ValMin, ValMax;
+  gl_font(CTX.gl_font_enum, CTX.gl_fontsize);
+  double font_h = gl_height(); // total font height
+  double font_a = gl_height() - gl_descent();  // height above ref pt
 
-  gl_font(FL_HELVETICA, CTX.gl_fontsize);
-  font_h = gl_height(); // total font height
-  font_a = gl_height() - gl_descent();  // height above ref pt
-  cs_bh = height / (v->NbIso ? v->NbIso : 1);   // colorscale box height
-  cv_xmin = xmin + width + tic; // valuescale xmin
+  double box;
+  if(horizontal){
+    box = width / (v->NbIso ? v->NbIso : 1);   // colorscale box width
+  }
+  else{
+    box = height / (v->NbIso ? v->NbIso : 1);   // colorscale box height
+  }
 
   glPointSize(v->PointSize);
   gl2psPointSize(v->PointSize * CTX.print.eps_point_size_factor);
@@ -55,19 +55,7 @@ void draw_scale(Post_View * v,
   glLineWidth(v->LineWidth);
   gl2psLineWidth(v->LineWidth * CTX.print.eps_line_width_factor);
 
-  if(!v->TransparentScale) {
-    double dytop = 0.;
-    if(v->IntervalsType != DRAW_POST_ISO)
-      dytop = font_h / 2.;
-    glColor4ubv((GLubyte *) & CTX.color.bg);
-    glBegin(GL_QUADS);
-    glVertex2d(xmin - space, ymin - dy - space);
-    glVertex2d(xmin + width + dx + space, ymin - dy - space);
-    glVertex2d(xmin + width + dx + space, ymin + height + dytop + space);
-    glVertex2d(xmin - space, ymin + height + dytop + space);
-    glEnd();
-  }
-
+  double ValMin, ValMax;
   if(v->VectorType == DRAW_POST_DISPLACEMENT_EXTERNAL){
     ValMin = v->MinForDisplacement;
     ValMax = v->MaxForDisplacement;
@@ -107,14 +95,22 @@ void draw_scale(Post_View * v,
 
   // colorscale
 
-  for(i = 0; i < v->NbIso; i++) {
+  for(int i = 0; i < v->NbIso; i++) {
     if(v->IntervalsType == DRAW_POST_DISCRETE) {
       PaletteDiscrete(v, v->NbIso, i);
       glBegin(GL_QUADS);
-      glVertex2d(xmin, ymin + i * cs_bh);
-      glVertex2d(xmin + width, ymin + i * cs_bh);
-      glVertex2d(xmin + width, ymin + (i + 1) * cs_bh);
-      glVertex2d(xmin, ymin + (i + 1) * cs_bh);
+      if(horizontal){
+	glVertex2d(xmin + i * box, ymin);
+	glVertex2d(xmin + (i + 1) * box, ymin);
+	glVertex2d(xmin + (i + 1) * box, ymin + height);
+	glVertex2d(xmin + i * box, ymin + height);
+      }
+      else{
+	glVertex2d(xmin, ymin + i * box);
+	glVertex2d(xmin + width, ymin + i * box);
+	glVertex2d(xmin + width, ymin + (i + 1) * box);
+	glVertex2d(xmin, ymin + (i + 1) * box);
+      }
       glEnd();
     }
     else if(v->IntervalsType == DRAW_POST_CONTINUOUS) {
@@ -122,28 +118,58 @@ void draw_scale(Post_View * v,
       PaletteContinuousLinear(v, ValMin, ValMax,
 			      ValMin + i * (ValMax - ValMin) / 
 			      (v->NbIso ? v->NbIso : 1));
-      glVertex2d(xmin, ymin + i * cs_bh);
-      glVertex2d(xmin + width, ymin + i * cs_bh);
+      if(horizontal){
+	glVertex2d(xmin + i * box, ymin + height);
+	glVertex2d(xmin + i * box, ymin);
+      }
+      else{
+	glVertex2d(xmin, ymin + i * box);
+	glVertex2d(xmin + width, ymin + i * box);
+      }
       PaletteContinuousLinear(v, ValMin, ValMax,
 			      ValMin + (i + 1) * (ValMax - ValMin) / 
 			      (v->NbIso ? v->NbIso : 1));
-      glVertex2d(xmin + width, ymin + (i + 1) * cs_bh);
-      glVertex2d(xmin, ymin + (i + 1) * cs_bh);
+      if(horizontal){
+	glVertex2d(xmin + (i + 1) * box, ymin);
+	glVertex2d(xmin + (i + 1) * box, ymin + height);
+      }
+      else{
+	glVertex2d(xmin + width, ymin + (i + 1) * box);
+	glVertex2d(xmin, ymin + (i + 1) * box);
+      }
       glEnd();
     }
     else {
       PaletteDiscrete(v, v->NbIso, i);
       glBegin(GL_LINES);
-      glVertex2d(xmin, ymin + i * cs_bh + 0.5 * cs_bh);
-      glVertex2d(xmin + width, ymin + i * cs_bh + 0.5 * cs_bh);
+      if(horizontal){
+	glVertex2d(xmin + i * box + 0.5 * box, ymin);
+	glVertex2d(xmin + i * box + 0.5 * box, ymin + height);
+      }
+      else{
+	glVertex2d(xmin, ymin + i * box + 0.5 * box);
+	glVertex2d(xmin + width, ymin + i * box + 0.5 * box);
+      }
       glEnd();
     }
   }
 
   // valuescale
 
-  nbv = (v->NbIso < floor(height / font_h)) ? v->NbIso : -1;
-  cv_bh = height / nbv;
+  char label[1024];
+  int nbv;
+  double cv_box;
+
+  if(horizontal){
+    sprintf(label, v->Format, -100*M_PI);
+    double estim = gl_width(label);
+    nbv = (v->NbIso < floor(width / estim)) ? v->NbIso : -1;
+    cv_box = width / nbv;
+  }
+  else{
+    nbv = (v->NbIso < floor(height / font_h)) ? v->NbIso : -1;
+    cv_box = height / nbv;
+  }
 
   glColor4ubv((GLubyte *) & CTX.color.text);
 
@@ -151,39 +177,57 @@ void draw_scale(Post_View * v,
     if(v->IntervalsType == DRAW_POST_DISCRETE ||
        v->IntervalsType == DRAW_POST_CONTINUOUS) {
       sprintf(label, v->Format, ValMin);
-      glRasterPos2d(cv_xmin, ymin - font_a / 3.);
+      if(horizontal)
+	glRasterPos2d(xmin - gl_width(label)/2., ymin + height + tic);
+      else
+	glRasterPos2d(xmin + width + tic, ymin - font_a / 3.);
       Draw_String(label);
 
       sprintf(label, v->Format, ValMax);
-      glRasterPos2d(cv_xmin, ymin + height - font_a / 3.);
+      if(horizontal)
+	glRasterPos2d(xmin + width - gl_width(label)/2., ymin + height + tic);
+      else
+	glRasterPos2d(xmin + width + tic, ymin + height - font_a / 3.);
       Draw_String(label);
     }
     else {
       sprintf(label, v->Format, ValMin);
-      glRasterPos2d(cv_xmin, ymin + (cs_bh / 2) - font_a / 3.);
+      if(horizontal)
+	glRasterPos2d(xmin + (box / 2) - gl_width(label)/2., ymin + height + tic);
+      else
+	glRasterPos2d(xmin + width + tic, ymin + (box / 2) - font_a / 3.);
       Draw_String(label);
 
       sprintf(label, v->Format, ValMax);
-      glRasterPos2d(cv_xmin, ymin + height - (cs_bh / 2) - font_a / 3.);
+      if(horizontal)
+	glRasterPos2d(xmin + width - (box / 2) - gl_width(label)/2., ymin + height + tic);
+      else
+	glRasterPos2d(xmin + width + tic, ymin + height - (box / 2) - font_a / 3.);
       Draw_String(label);
     }
   }
   else {
     if(v->IntervalsType == DRAW_POST_DISCRETE ||
        v->IntervalsType == DRAW_POST_CONTINUOUS) {
-      for(i = 0; i < nbv + 1; i++) {
-        Val = v->GVFI(ValMin, ValMax, nbv + 1, i);
+      for(int i = 0; i < nbv + 1; i++) {
+        double Val = v->GVFI(ValMin, ValMax, nbv + 1, i);
         sprintf(label, v->Format, Val);
-        glRasterPos2d(cv_xmin, ymin + i * cv_bh - font_a / 3.);
+	if(horizontal)
+	  glRasterPos2d(xmin + i * cv_box - gl_width(label) / 2., ymin + height + tic);
+	else
+	  glRasterPos2d(xmin + width + tic, ymin + i * cv_box - font_a / 3.);
         Draw_String(label);
       }
     }
     else {
-      for(i = 0; i < nbv; i++) {
-        Val = v->GVFI(ValMin, ValMax, nbv, i);
+      for(int i = 0; i < nbv; i++) {
+        double Val = v->GVFI(ValMin, ValMax, nbv, i);
         sprintf(label, v->Format, Val);
-        glRasterPos2d(cv_xmin,
-                      ymin + (2 * i + 1) * (cv_bh / 2) - font_a / 3.);
+	if(horizontal)
+	  glRasterPos2d(xmin + (2 * i + 1) * (cv_box / 2) - gl_width(label) / 2., 
+			ymin + height + tic);
+	else
+	  glRasterPos2d(xmin + width + tic, ymin + (2 * i + 1) * (cv_box / 2) - font_a / 3.);
         Draw_String(label);
       }
     }
@@ -191,26 +235,23 @@ void draw_scale(Post_View * v,
 
   // the label
 
-  glRasterPos2d(cv_xmin, ymin - 2 * font_h);
   if((v->ShowTime == 1 && List_Nbr(v->Time) > 1) ||
      (v->ShowTime == 2 && List_Nbr(v->Time) > 0))
     sprintf(label, "%s (%g)", v->Name, *(double *)List_Pointer(v->Time, v->TimeStep));
   else
     sprintf(label, "%s", v->Name);
-  Draw_String(label);
 
-}
+  if(horizontal)
+    glRasterPos2d(xmin + width / 2. - gl_width(label) / 2., ymin + height + tic + 1.4*font_h);
+  else
+    glRasterPos2d(xmin, ymin - 2 * font_h);
 
-static List_T *todraw = NULL;
+  Draw_String(label);
+}
 
 void Draw_Scales(void)
 {
-  int i;
-  double xmin, ymin, width, height, xsep, ysep;
-  double oldwidth, totalwidth;
-  double dx = 0., dy = 0., tic = 10., space = 10.;
-  char label[1024];
-  Post_View *v;
+  static List_T *todraw = NULL;
 
   if(!CTX.post.list)
     return;
@@ -222,8 +263,8 @@ void Draw_Scales(void)
   else
     List_Reset(todraw);
 
-  for(i = 0; i < List_Nbr(CTX.post.list); i++) {
-    v = (Post_View *) List_Pointer(CTX.post.list, i);
+  for(int i = 0; i < List_Nbr(CTX.post.list); i++) {
+    Post_View *v = (Post_View *) List_Pointer(CTX.post.list, i);
     if(v->Visible && !v->Dirty && v->ShowScale &&
        v->Type == DRAW_POST_3D && !v->TextOnly)
       List_Add(todraw, &v);
@@ -233,55 +274,80 @@ void Draw_Scales(void)
     return;
   }
 
-  xsep = 20.;
-  width = 16.0;
-  totalwidth = 0.0;
-  if(List_Nbr(todraw) == 1)
-    ysep = (CTX.viewport[3] - CTX.viewport[1]) / 6.;
-  else
-    ysep = (CTX.viewport[3] - CTX.viewport[1]) / 15.;
-  xmin = CTX.viewport[0] + xsep;
-  ymin = CTX.viewport[1] + ysep;
-
-  for(i = 0; i < List_Nbr(todraw); i++) {
-    v = *(Post_View **) List_Pointer(todraw, i);
-    oldwidth = width + dx + space;
-    dx = dy = 0.;
-    gl_font(FL_HELVETICA, CTX.gl_fontsize);
-    sprintf(label, v->Format, v->CustomMin);
-    if(gl_width(label) + tic > dx)
-      dx = gl_width(label) + tic;
-    sprintf(label, v->Format, v->CustomMax);
-    if(gl_width(label) + tic > dx)
-      dx = gl_width(label) + tic;
-    if(List_Nbr(v->Time) > 1 && v->ShowTime)
-      sprintf(label, "%s (%g)", v->Name,
-              *(double *)List_Pointer(v->Time, v->TimeStep));
-    else
-      sprintf(label, "%s", v->Name);
-    if(gl_width(label) + tic > dx)
-      dx = gl_width(label) + tic;
-    dy = 2. * gl_height();
-    if(v->AutoPosition) {
-      if(List_Nbr(todraw) == 1) {
-        height = CTX.viewport[3] - CTX.viewport[1] - 2 * ysep - dy;
-        draw_scale(v, xmin, ymin + dy, width, height, tic, space, dx, dy);
+  gl_font(CTX.gl_font_enum, CTX.gl_fontsize);
+
+  const double tic = 10., bar_size = 16.;
+  double width = 0., width_prev = 0., width_total = 0.;
+
+  for(int i = 0; i < List_Nbr(todraw); i++) {
+    Post_View *v = *(Post_View **) List_Pointer(todraw, i);
+
+    if(!v->AutoPosition) {
+	draw_scale(v, 
+		   v->Position[0], 
+		   CTX.viewport[3] - v->Size[1] - v->Position[1], 
+		   v->Size[0], v->Size[1], 
+		   tic, CTX.post.horizontal_scales);
+    }
+    else{
+      if(CTX.post.horizontal_scales){
+	double ysep = 20.;
+	if(List_Nbr(todraw) == 1){
+	  double ww = (CTX.viewport[2] - CTX.viewport[0]) / 2.;
+	  draw_scale(v, 
+		     (CTX.viewport[2] - CTX.viewport[0]) / 2. - ww / 2,
+		     CTX.viewport[1] + ysep, 
+		     ww, bar_size, 
+		     tic, 1);
+	}
+	else{
+	  char label[1024];
+	  sprintf(label, v->Format, -100*M_PI);
+	  double xsep = gl_width(label)/2. + 20;
+	  double ww = (CTX.viewport[2] - CTX.viewport[0]) / 2. - 2 * xsep;
+	  if(ww < 20) ww = 20;
+	  draw_scale(v, 
+		     (CTX.viewport[2] - CTX.viewport[0]) / 2. - (i%2 ? -(xsep-10) : ww+xsep-10),
+		     CTX.viewport[1] + ysep + (i/2) * (bar_size+tic+2*gl_height()+ysep), 
+		     ww, bar_size, 
+		     tic, 1);
+	}
       }
-      else {
-        height =
-          (CTX.viewport[3] - CTX.viewport[1] - 3 * ysep - 2.5 * dy) / 2.;
-        draw_scale(v, xmin + totalwidth + (i / 2) * xsep,
-                   ymin + dy + (1 - i % 2) * (height + 1.5 * dy + ysep),
-                   width, height, tic, space, dx, dy);
+      else{
+	double xsep = 20.;
+	double ysep = (CTX.viewport[3] - CTX.viewport[1]) / ((List_Nbr(todraw) == 1) ? 6. : 15.);
+	double dy = 2. * gl_height();
+	if(List_Nbr(todraw) == 1){
+	  double hh = CTX.viewport[3] - CTX.viewport[1] - 2 * ysep - dy;
+	  draw_scale(v, 
+		     CTX.viewport[0] + xsep, 
+		     CTX.viewport[1] + ysep + dy, 
+		     bar_size, hh, 
+		     tic, 0);
+	}
+	else{
+	  double hh = (CTX.viewport[3] - CTX.viewport[1] - 3 * ysep - 2.5 * dy) / 2.;
+	  draw_scale(v, 
+		     CTX.viewport[0] + xsep + width_total + (i / 2) * xsep,
+		     CTX.viewport[1] + ysep + dy + (1 - i % 2) * (hh + 1.5 * dy + ysep),
+		     bar_size, hh,
+		     tic, 0);
+	}
+	// compute width
+	width_prev = width;
+	char label[1024];
+	sprintf(label, v->Format, -100*M_PI);
+	width = bar_size + tic + gl_width(label);
+	if(List_Nbr(v->Time) > 1 && v->ShowTime)
+	  sprintf(label, "%s (%g)", v->Name, *(double *)List_Pointer(v->Time, v->TimeStep));
+	else
+	  sprintf(label, "%s", v->Name);
+	if(gl_width(label) > width)
+	  width = gl_width(label);
+	if(i % 2)
+	  width_total += DMAX(bar_size + width, bar_size + width_prev);
       }
-      if(i % 2)
-        totalwidth += DMAX(width + dx + space, oldwidth);
     }
-    else
-      draw_scale(v, v->Position[0],
-                 CTX.viewport[3] - v->Size[1] - v->Position[1], v->Size[0],
-                 v->Size[1], tic, space, dx, dy);
   }
-
-
 }
+
diff --git a/Makefile b/Makefile
index 2e970daf455dfda68cf5c8e375fa932017f1f310..403c8a7cbed9c3c4418db5d1eda22cef8b262605 100644
--- a/Makefile
+++ b/Makefile
@@ -1,4 +1,4 @@
-# $Id: Makefile,v 1.373 2004-10-08 04:36:20 geuzaine Exp $
+# $Id: Makefile,v 1.374 2004-10-11 17:22:56 geuzaine Exp $
 #
 # Copyright (C) 1997-2004 C. Geuzaine, J.-F. Remacle
 #
@@ -23,7 +23,7 @@ include variables
 
 GMSH_MAJOR_VERSION = 1
 GMSH_MINOR_VERSION = 55
-GMSH_PATCH_VERSION = 5
+GMSH_PATCH_VERSION = 6
 GMSH_EXTRA_VERSION = "-cvs"
 
 GMSH_VERSION = ${GMSH_MAJOR_VERSION}.${GMSH_MINOR_VERSION}.${GMSH_PATCH_VERSION}${GMSH_EXTRA_VERSION}
diff --git a/doc/FAQ b/doc/FAQ
index c508676498a74a7a0d2ee68fe2b546780bc6f63e..f0ac39e8ed434634ae2c28fe57d403ea65289e8e 100644
--- a/doc/FAQ
+++ b/doc/FAQ
@@ -1,4 +1,4 @@
-$Id: FAQ,v 1.38 2004-06-30 21:15:58 geuzaine Exp $
+$Id: FAQ,v 1.39 2004-10-11 17:22:57 geuzaine Exp $
 
 This is the Gmsh FAQ
 
@@ -212,6 +212,10 @@ The solver executable (e.g. 'getdp.exe') has to be in your path. If
 not, simply go to the solver options
 (e.g. Solver->GetDP->Options->Executable) to specify its location.
 
+On recent versions of Microsoft Windows (XP SP2), it seems that you
+need to execute the solver (e.g. launch 'getdp.exe') at least once
+independently of Gmsh in order to authorize future executions.
+
 ********************************************************************
 
 Section 7: Post-processing module
diff --git a/doc/texinfo/opt_post.texi b/doc/texinfo/opt_post.texi
index 93b9b311a0530ef8a7ddee8acad4e70f27aeecd7..48d8e37771340d91400783aef2ce68af2a1b68fa 100644
--- a/doc/texinfo/opt_post.texi
+++ b/doc/texinfo/opt_post.texi
@@ -14,6 +14,11 @@ Remove original views after a Combine operation@*
 Default value: @code{1}@*
 Saved in: @code{General.OptionsFileName}
 
+@item PostProcessing.HorizontalScales
+Display value scales horizontally@*
+Default value: @code{0}@*
+Saved in: @code{General.OptionsFileName}
+
 @item PostProcessing.Link
 Link post-processing views (0=none, 1,2=changes in visible/all, 3,4=everything in visible/all)@*
 Default value: @code{0}@*
diff --git a/doc/texinfo/opt_view.texi b/doc/texinfo/opt_view.texi
index 850104d669f5cdb2030653783dd6a776b70bf5e7..c91bca8dbc8a06c4a4cc057e529327e8ec8f98eb 100644
--- a/doc/texinfo/opt_view.texi
+++ b/doc/texinfo/opt_view.texi
@@ -309,11 +309,6 @@ Current time step displayed@*
 Default value: @code{0}@*
 Saved in: @code{-}
 
-@item View.TransparentScale
-Display a `transparent' value scale?@*
-Default value: @code{1}@*
-Saved in: @code{General.OptionsFileName}
-
 @item View.Type
 Type of graph (1=3D, 2=2D-space, 3=2D-time)@*
 Default value: @code{1}@*