diff --git a/Common/Views.cpp b/Common/Views.cpp
index f7f6dc877297bf78967b7e2813a4815079b42cd5..ac70ad434bab3e37317a32c7e817987ce59f378a 100644
--- a/Common/Views.cpp
+++ b/Common/Views.cpp
@@ -1,4 +1,4 @@
-// $Id: Views.cpp,v 1.132 2004-09-18 05:10:13 geuzaine Exp $
+// $Id: Views.cpp,v 1.133 2004-09-18 15:39:17 geuzaine Exp $
 //
 // Copyright (C) 1997-2004 C. Geuzaine, J.-F. Remacle
 //
@@ -50,6 +50,16 @@ int fcmpPostViewDuplicateOf(const void *v1, const void *v2)
   return (((Post_View *) v1)->DuplicateOf - ((Post_View *) v2)->DuplicateOf);
 }
 
+int fcmpPostViewName(const void *v1, const void *v2)
+{
+  return strcmp(((Post_View *) v1)->Name, ((Post_View *) v2)->Name);
+}
+
+int fcmpPostViewVisibility(const void *v1, const void *v2)
+{
+  return (((Post_View *) v2)->Visible - ((Post_View *) v1)->Visible);
+}
+
 Post_View *BeginView(int allocate)
 {
   Post_View vv, *v;
@@ -584,6 +594,30 @@ void FreeView(Post_View * v)
 
 }
 
+void SortViews(int how)
+{
+  // how==0: by name
+  // how==1: by visibility
+
+  if(!List_Nbr(CTX.post.list)) 
+    return;
+
+  if(how == 0)
+    List_Sort(CTX.post.list, fcmpPostViewName);
+  else
+    List_Sort(CTX.post.list, fcmpPostViewVisibility);
+
+  // recalculate the indices
+  for(int i = 0; i < List_Nbr(CTX.post.list); i++){
+    Post_View *v = (Post_View *) List_Pointer(CTX.post.list, i);
+    v->Index = i;
+  }
+
+#if defined(HAVE_FLTK)
+  UpdateViewsInGUI();
+#endif
+}
+
 void CopyViewOptions(Post_View * src, Post_View * dest)
 {
   dest->Type = src->Type;
diff --git a/Common/Views.h b/Common/Views.h
index 95aa9b175b5796fb28a8eeb27058e9a563a81b25..f911be9dee37c8a32c9e35e2dd897156f872adca 100644
--- a/Common/Views.h
+++ b/Common/Views.h
@@ -160,6 +160,7 @@ void ReadView(FILE *file, char *filename);
 void WriteView(Post_View *v, char *filename, int binary, int append);
 void CopyViewOptions(Post_View *src, Post_View *dest);
 void CombineViews(int time, int how, int remove);
+void SortViews(int how);
 
 int BGMWithView (Post_View *ErrView);
 double ErrorInView(Post_View * ErrView, int *n);
diff --git a/Fltk/Callbacks.cpp b/Fltk/Callbacks.cpp
index 61c240d4bd500f848484991cea09f815349725f6..2d9829e375b316f66b75c61114b2656466aea0d0 100644
--- a/Fltk/Callbacks.cpp
+++ b/Fltk/Callbacks.cpp
@@ -1,4 +1,4 @@
-// $Id: Callbacks.cpp,v 1.272 2004-09-18 01:51:56 geuzaine Exp $
+// $Id: Callbacks.cpp,v 1.273 2004-09-18 15:39:17 geuzaine Exp $
 //
 // Copyright (C) 1997-2004 C. Geuzaine, J.-F. Remacle
 //
@@ -3212,6 +3212,16 @@ void view_combine_time_by_name_cb(CALLBACK_ARGS)
   Draw();
 }
 
+void view_sort_by_name_cb(CALLBACK_ARGS)
+{
+  SortViews(0);
+}
+
+void view_sort_by_visibility_cb(CALLBACK_ARGS)
+{
+  SortViews(1);
+}
+
 void view_applybgmesh_cb(CALLBACK_ARGS)
 {
   Post_View *v = (Post_View *) List_Pointer(CTX.post.list, (long int)data);
diff --git a/Fltk/Callbacks.h b/Fltk/Callbacks.h
index 1537602f0e2be4c5af33fd4d035183c2cf01614c..3ad19d8d857edf70d324d714f5b745329b4a8d0c 100644
--- a/Fltk/Callbacks.h
+++ b/Fltk/Callbacks.h
@@ -118,6 +118,8 @@ void view_combine_space_by_name_cb(CALLBACK_ARGS) ;
 void view_combine_time_all_cb(CALLBACK_ARGS) ;
 void view_combine_time_visible_cb(CALLBACK_ARGS) ;
 void view_combine_time_by_name_cb(CALLBACK_ARGS) ;
+void view_sort_by_name_cb(CALLBACK_ARGS) ;
+void view_sort_by_visibility_cb(CALLBACK_ARGS) ;
 void view_applybgmesh_cb(CALLBACK_ARGS) ;
 void view_options_cb(CALLBACK_ARGS) ;
 void view_plugin_cb(CALLBACK_ARGS) ;
diff --git a/Fltk/GUI.cpp b/Fltk/GUI.cpp
index 8672b52a686143cce417a135bf53c4261a5c0da4..d03a97722d6a633d933f311932f30751c448cf17 100644
--- a/Fltk/GUI.cpp
+++ b/Fltk/GUI.cpp
@@ -1,4 +1,4 @@
-// $Id: GUI.cpp,v 1.346 2004-09-18 01:51:56 geuzaine Exp $
+// $Id: GUI.cpp,v 1.347 2004-09-18 15:39:18 geuzaine Exp $
 //
 // Copyright (C) 1997-2004 C. Geuzaine, J.-F. Remacle
 //
@@ -1074,6 +1074,10 @@ void GUI::set_context(Context_Item * menu_asked, int flag)
 		  (Fl_Callback *) view_combine_time_visible_cb, (void *)nb, 0);
 	p[j]->add("Combine/Time steps/By view name", 0, 
 		 (Fl_Callback *) view_combine_time_by_name_cb, (void *)nb, 0);
+	p[j]->add("Sort/By name", 0, 
+		 (Fl_Callback *) view_sort_by_name_cb, (void *)nb, 0);
+	p[j]->add("Sort/By visibility", 0, 
+		 (Fl_Callback *) view_sort_by_visibility_cb, (void *)nb, 0);
 	p[j]->add("Save as/ASCII view...", 0, 
 		  (Fl_Callback *) view_save_ascii_cb, (void *)nb, 0);
 	p[j]->add("Save as/Binary view...", 0, 
diff --git a/doc/VERSIONS b/doc/VERSIONS
index 95c0f142557a959154434f7055b812eba5bf2910..d0d1e18b18af78d8b09fcd9900b34e4657815f42 100644
--- a/doc/VERSIONS
+++ b/doc/VERSIONS
@@ -1,10 +1,11 @@
-$Id: VERSIONS,v 1.245 2004-09-16 19:15:27 geuzaine Exp $
+$Id: VERSIONS,v 1.246 2004-09-18 15:39:18 geuzaine Exp $
 
 New since 1.55: new post-processing option to draw a scalar view
 raised by a displacement view without using Plugin(DisplacementRaise)
 (makes drawing arbitrary scalar fields on deformed meshes much
 easier); better post-processing menu (arbitrary number of
-views+scrollable+show view number); small bug fixes.
+views+scrollable+show view number); improved view->combine and added
+view->sort; small bug fixes.
 
 New in 1.55: added background mesh support for Triangle; meshes can
 now be displayed using "smoothed" normals (like post-processing