diff --git a/Common/DefaultOptions.h b/Common/DefaultOptions.h
index 7ca7271c420eab59e5a46a6cf1dae5905b872866..05951d252b481446aa1252f2ac04bc6f7f3dff79 100644
--- a/Common/DefaultOptions.h
+++ b/Common/DefaultOptions.h
@@ -974,6 +974,8 @@ StringXNumber ViewOptions_Number[] = {
     "Arrow location (1=cog, 2=node)" },
   { F|O, "ArrowSize" , opt_view_arrow_size , 60. ,
     "Display size of arrows (in pixels)" },
+  { F|O, "ArrowSizeProportional" , opt_view_arrow_size_proportional , 1. ,
+    "Scale the arrows according to the norm of the vector" },
   { F|O, "ArrowStemLength" , opt_view_arrow_stem_length , 0.56 ,
     "Relative length of arrow stem" },
   { F|O, "ArrowStemRadius" , opt_view_arrow_stem_radius , 0.02 ,
diff --git a/Common/Options.cpp b/Common/Options.cpp
index bfff11196e26188c263f7635341b1064ee66fa12..f6c3d3ee312196caf849ef5ac4e30bdf8ff3b970 100644
--- a/Common/Options.cpp
+++ b/Common/Options.cpp
@@ -1,4 +1,4 @@
-// $Id: Options.cpp,v 1.193 2004-10-25 00:45:47 geuzaine Exp $
+// $Id: Options.cpp,v 1.194 2004-10-25 19:19:29 geuzaine Exp $
 //
 // Copyright (C) 1997-2004 C. Geuzaine, J.-F. Remacle
 //
@@ -4494,6 +4494,19 @@ double opt_view_arrow_size(OPT_ARGS_NUM)
   return v->ArrowSize;
 }
 
+double opt_view_arrow_size_proportional(OPT_ARGS_NUM)
+{
+  GET_VIEW(0.);
+  if(action & GMSH_SET) {
+    v->ArrowSizeProportional = (int)val;
+  }
+#if defined(HAVE_FLTK)
+  if(_gui_action_valid(action, num))
+    WID->view_butt[0]->value(v->ArrowSizeProportional);
+#endif
+  return v->ArrowSizeProportional;
+}
+
 double opt_view_arrow_head_radius(OPT_ARGS_NUM)
 {
   GET_VIEW(0.);
diff --git a/Common/Options.h b/Common/Options.h
index f9feaf6a8812e7824ba5a95e933dd087ed4a8907..a3171417f5d676799c7a424ffa0a5b27ab7542dc 100644
--- a/Common/Options.h
+++ b/Common/Options.h
@@ -463,6 +463,7 @@ double opt_view_raise0(OPT_ARGS_NUM);
 double opt_view_raise1(OPT_ARGS_NUM);
 double opt_view_raise2(OPT_ARGS_NUM);
 double opt_view_arrow_size(OPT_ARGS_NUM);
+double opt_view_arrow_size_proportional(OPT_ARGS_NUM);
 double opt_view_arrow_head_radius(OPT_ARGS_NUM);
 double opt_view_arrow_stem_length(OPT_ARGS_NUM);
 double opt_view_arrow_stem_radius(OPT_ARGS_NUM);
diff --git a/Common/Views.cpp b/Common/Views.cpp
index 20e13713149de94b2551b2f6b83bb18e727818b5..5cc2a666fc71e3fc0ebb14488b113125706bbccd 100644
--- a/Common/Views.cpp
+++ b/Common/Views.cpp
@@ -1,4 +1,4 @@
-// $Id: Views.cpp,v 1.141 2004-10-21 17:02:25 geuzaine Exp $
+// $Id: Views.cpp,v 1.142 2004-10-25 19:19:29 geuzaine Exp $
 //
 // Copyright (C) 1997-2004 C. Geuzaine, J.-F. Remacle
 //
@@ -620,6 +620,7 @@ void CopyViewOptions(Post_View * src, Post_View * dest)
   dest->Raise[1] = src->Raise[1];
   dest->Raise[2] = src->Raise[2];
   dest->ArrowSize = src->ArrowSize;
+  dest->ArrowSizeProportional = src->ArrowSizeProportional;
   dest->ArrowRelHeadRadius = src->ArrowRelHeadRadius;
   dest->ArrowRelStemLength = src->ArrowRelStemLength;
   dest->ArrowRelStemRadius = src->ArrowRelStemRadius;
diff --git a/Common/Views.h b/Common/Views.h
index 34b4862290180a0c879fad284e9ed7ab718f9d37..da1021ae1900e3d21edb10810ae5674513cc4a1b 100644
--- a/Common/Views.h
+++ b/Common/Views.h
@@ -150,7 +150,7 @@ class Post_View{
   double CustomMin, CustomMax;
   double Offset[3], Raise[3], DisplacementFactor, Explode;
   double ArrowSize, ArrowRelHeadRadius, ArrowRelStemRadius, ArrowRelStemLength;
-  int Visible, IntervalsType, NbIso, NbAbscissa;
+  int Visible, IntervalsType, NbIso, NbAbscissa, ArrowSizeProportional;
   int Light, LightTwoSide, SmoothNormals;
   double AngleSmoothNormals, AlphaChannel;
   int SaturateValues;
diff --git a/Fltk/Callbacks.cpp b/Fltk/Callbacks.cpp
index 2305a2fcd7e4dd2146e3f31ad4a3abd2e3e46eef..8f758b8ece0512efb0c4d3bbdf816134ef1371c3 100644
--- a/Fltk/Callbacks.cpp
+++ b/Fltk/Callbacks.cpp
@@ -1,4 +1,4 @@
-// $Id: Callbacks.cpp,v 1.288 2004-10-25 00:45:47 geuzaine Exp $
+// $Id: Callbacks.cpp,v 1.289 2004-10-25 19:19:30 geuzaine Exp $
 //
 // Copyright (C) 1997-2004 C. Geuzaine, J.-F. Remacle
 //
@@ -3468,6 +3468,7 @@ void view_options_ok_cb(CALLBACK_ARGS)
   double raise2 = opt_view_raise2(current, GMSH_GET, 0);
   double timestep = opt_view_timestep(current, GMSH_GET, 0);
   double arrow_size = opt_view_arrow_size(current, GMSH_GET, 0);
+  double arrow_size_proportional = opt_view_arrow_size_proportional(current, GMSH_GET, 0);
   double displacement_factor = opt_view_displacement_factor(current, GMSH_GET, 0);
   double raised_view = opt_view_raised_view(current, GMSH_GET, 0);
   double point_size = opt_view_point_size(current, GMSH_GET, 0);
@@ -3610,6 +3611,10 @@ void view_options_ok_cb(CALLBACK_ARGS)
 
       // view_butts
 
+      val = WID->view_butt[0]->value();
+      if(force || (val != arrow_size_proportional))
+        opt_view_arrow_size_proportional(i, GMSH_SET, val);
+
       val = WID->view_butt[1]->value() ? DRAW_POST_3D :
 	WID->view_butt[2]->value() ? DRAW_POST_2D_SPACE : DRAW_POST_2D_TIME;
       if(force || (val != type))
diff --git a/Fltk/GUI.cpp b/Fltk/GUI.cpp
index 65e3a029afc50679558e3039b2d945ef26e47519..41d47c5271cd1afa011daa4607051d10afcbad84 100644
--- a/Fltk/GUI.cpp
+++ b/Fltk/GUI.cpp
@@ -1,4 +1,4 @@
-// $Id: GUI.cpp,v 1.367 2004-10-21 17:02:25 geuzaine Exp $
+// $Id: GUI.cpp,v 1.368 2004-10-25 19:19:30 geuzaine Exp $
 //
 // Copyright (C) 1997-2004 C. Geuzaine, J.-F. Remacle
 //
@@ -2627,6 +2627,11 @@ void GUI::create_option_window()
         view_value[60]->step(1);
         view_value[60]->align(FL_ALIGN_RIGHT);
 
+	view_butt[0] = new Fl_Check_Button(L + 2 * IW - 2 * WB, 2 * WB + 7 * BH, (int)(1.5*BB), BH, "Proportional");
+	view_butt[0]->type(FL_TOGGLE_BUTTON);
+	view_butt[0]->down_box(TOGGLE_BOX);
+	view_butt[0]->selection_color(TOGGLE_COLOR);
+
         view_value[63] = new Fl_Value_Input(L + 2 * WB, 2 * WB + 8 * BH, IW, BH, "Displacement factor");
         view_value[63]->minimum(0.);
         view_value[63]->maximum(1.);
@@ -2844,6 +2849,7 @@ void GUI::update_view_window(int num)
   opt_view_line_type(num, GMSH_GUI, 0);
   opt_view_vector_type(num, GMSH_GUI, 0);
   opt_view_arrow_size(num, GMSH_GUI, 0);
+  opt_view_arrow_size_proportional(num, GMSH_GUI, 0);
 
   opt_view_displacement_factor(num, GMSH_GUI, 0);
   double val3 = 2. * CTX.lc / maxval;
diff --git a/Graphics/PostElement.cpp b/Graphics/PostElement.cpp
index ac3c920e8ef320dce961aeba79a782b9f19bf6dc..98879ec12519eda8bdd56d29254ddf369518c0b3 100644
--- a/Graphics/PostElement.cpp
+++ b/Graphics/PostElement.cpp
@@ -1,4 +1,4 @@
-// $Id: PostElement.cpp,v 1.47 2004-10-21 23:42:50 geuzaine Exp $
+// $Id: PostElement.cpp,v 1.48 2004-10-25 19:19:30 geuzaine Exp $
 //
 // Copyright (C) 1997-2004 C. Geuzaine, J.-F. Remacle
 //
@@ -1162,7 +1162,8 @@ void Draw_VectorElement(int type, Post_View * View, int preproNormals,
         Draw_String(Num);
       }
       else {
-        fact = CTX.pixel_equiv_x / CTX.s[0] * View->ArrowSize / ValMax;
+        fact = CTX.pixel_equiv_x / CTX.s[0] * View->ArrowSize / 
+	  (View->ArrowSizeProportional ? ValMax : dd);
         if(View->ScaleType == DRAW_POST_LOGARITHMIC && ValMin > 0) {
           dx /= dd;
           dy /= dd;
@@ -1187,7 +1188,8 @@ void Draw_VectorElement(int type, Post_View * View, int preproNormals,
 	else
 	  PaletteDiscrete(View, View->NbIso,
 			  View->GIFV(ValMin, ValMax, View->NbIso, norm[k]));
-        fact = CTX.pixel_equiv_x / CTX.s[0] * View->ArrowSize / ValMax;
+        fact = CTX.pixel_equiv_x / CTX.s[0] * View->ArrowSize /
+	  (View->ArrowSizeProportional ? ValMax : norm[k]);
         if(View->ScaleType == DRAW_POST_LOGARITHMIC && ValMin > 0) {
           Val[k][0] /= norm[k];
           Val[k][1] /= norm[k];