Index: /trunk/src/org/openstreetmap/josm/gui/preferences/TaggingPresetPreference.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/gui/preferences/TaggingPresetPreference.java	(revision 1398)
+++ /trunk/src/org/openstreetmap/josm/gui/preferences/TaggingPresetPreference.java	(revision 1399)
@@ -37,4 +37,5 @@
     public static Collection<TaggingPreset> taggingPresets;
     private JList taggingPresetSources;
+    private JCheckBox sortMenu;
     private JCheckBox enableDefault;
 
@@ -42,4 +43,6 @@
 
         taggingPresetSources = new JList(new DefaultListModel());
+        sortMenu = new JCheckBox(tr("Sort presets menu"),
+                Main.pref.getBoolean("taggingpreset.sortmenu", false));
         enableDefault = new JCheckBox(tr("Enable built-in defaults"),
                 Main.pref.getBoolean("taggingpreset.enable-defaults", true));
@@ -91,4 +94,5 @@
         tpPanel.setBorder(BorderFactory.createTitledBorder(BorderFactory.createLineBorder(Color.gray), tr("Tagging Presets")));
         tpPanel.setLayout(new GridBagLayout());
+        tpPanel.add(sortMenu, GBC.eol().insets(5,5,5,0));
         tpPanel.add(enableDefault, GBC.eol().insets(5,5,5,0));
         tpPanel.add(new JLabel(tr("Tagging preset sources")), GBC.eol().insets(5,5,5,0));
@@ -104,7 +108,8 @@
 
     public boolean ok() {
+        boolean restart;
         Main.pref.put("taggingpreset.enable-defaults", enableDefault.getSelectedObjects() != null);
+        restart = Main.pref.put("taggingpreset.sortmenu", sortMenu.getSelectedObjects() != null);
         int num = taggingPresetSources.getModel().getSize();
-        boolean restart;
         if (num > 0)
         {
@@ -112,8 +117,9 @@
             for (int i = 0; i < num; ++i)
                 l.add((String)taggingPresetSources.getModel().getElementAt(i));
-            restart = Main.pref.putCollection("taggingpreset.sources", l);
+            if(Main.pref.putCollection("taggingpreset.sources", l))
+                restart = true;
         }
-        else
-            restart = Main.pref.putCollection("taggingpreset.sources", null);
+        else if(Main.pref.putCollection("taggingpreset.sources", null))
+            restart = true;
         return restart;
     }
@@ -150,4 +156,6 @@
             }
         }
+        if(Main.pref.getBoolean("taggingpreset.sortmenu"))
+            TaggingPresetMenu.sortMenu(Main.main.menu.presetsMenu);
     }
 }
Index: /trunk/src/org/openstreetmap/josm/gui/tagging/TaggingPresetMenu.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/gui/tagging/TaggingPresetMenu.java	(revision 1398)
+++ /trunk/src/org/openstreetmap/josm/gui/tagging/TaggingPresetMenu.java	(revision 1399)
@@ -6,4 +6,6 @@
 import java.awt.event.ActionEvent;
 import java.awt.Component;
+import java.util.ArrayList;
+import java.util.Collections;
 
 import javax.swing.Action;
@@ -14,4 +16,5 @@
 
 import org.openstreetmap.josm.gui.tagging.TaggingPreset;
+import org.openstreetmap.josm.tools.PresetTextComparator;
 
 public class TaggingPresetMenu extends TaggingPreset {
@@ -46,3 +49,59 @@
         }
     }
+	/**
+	 * Sorts the menu items using the translated item text
+	 */
+	public void sortMenu(){
+		TaggingPresetMenu.sortMenu(this.menu);
+	}
+
+	/**
+	 * Sorts the menu items using the translated item text
+	 */
+	public static void sortMenu(JMenu menu){
+		Component[] items = menu.getMenuComponents();
+		PresetTextComparator comp = new PresetTextComparator();
+		ArrayList<JMenuItem> sortarray = new ArrayList<JMenuItem>();
+		int lastSeperator = 0;
+		for (int i = 0; i < items.length; i++) {
+			Object item = items[i];
+			if (item instanceof JMenu){
+				sortMenu((JMenu)item);
+			}			
+			if (item instanceof JMenuItem){
+				sortarray.add((JMenuItem)item);
+				if (i == items.length-1){
+					Collections.sort(sortarray, comp);
+					int pos = 0;
+					for (JMenuItem menuItem : sortarray) {
+						int oldPos;
+						if(lastSeperator == 0){
+							oldPos=pos;
+						}else {
+							oldPos = pos+lastSeperator+1;
+						}
+						menu.add(menuItem, oldPos);
+						pos++;
+					}
+					sortarray = new ArrayList<JMenuItem>();
+					lastSeperator = 0;
+				}
+			}else if (item instanceof JSeparator){
+				Collections.sort(sortarray, comp);
+				int pos = 0;
+				for (JMenuItem menuItem : sortarray) {
+					int oldPos;
+					if(lastSeperator == 0){
+						oldPos=pos;
+					}else {
+						oldPos = pos+lastSeperator+1;
+					}
+					menu.add(menuItem, oldPos);
+					pos++;
+				}
+				sortarray = new ArrayList<JMenuItem>();
+				lastSeperator = i;
+			}
+		}
+	}
 }
