Index: org/openstreetmap/josm/gui/preferences/shortcut/PrefJPanel.java
===================================================================
--- org/openstreetmap/josm/gui/preferences/shortcut/PrefJPanel.java	(revision 5023)
+++ org/openstreetmap/josm/gui/preferences/shortcut/PrefJPanel.java	(working copy)
@@ -9,6 +9,8 @@
 import java.awt.Insets;
 import java.awt.Toolkit;
 
+import java.awt.event.ActionEvent;
+import java.awt.event.ActionListener;
 import static org.openstreetmap.josm.tools.I18n.marktr;
 import static org.openstreetmap.josm.tools.I18n.tr;
 
@@ -16,7 +18,6 @@
 import java.lang.reflect.Field;
 import java.util.ArrayList;
 import java.util.LinkedHashMap;
-import java.util.HashMap;
 import java.util.Map;
 
 import java.util.regex.PatternSyntaxException;
@@ -24,9 +25,9 @@
 import javax.swing.BorderFactory;
 import javax.swing.BoxLayout;
 import javax.swing.DefaultComboBoxModel;
+import javax.swing.JButton;
 import javax.swing.JCheckBox;
 import javax.swing.JComboBox;
-import javax.swing.JEditorPane;
 import javax.swing.JLabel;
 import javax.swing.JPanel;
 import javax.swing.JScrollPane;
@@ -48,7 +49,9 @@
 import javax.swing.table.TableRowSorter;
 import org.openstreetmap.josm.Main;
 import org.openstreetmap.josm.gui.widgets.SelectAllOnFocusGainedDecorator;
+import org.openstreetmap.josm.tools.GBC;
 import org.openstreetmap.josm.tools.Shortcut;
+import org.openstreetmap.josm.tools.ImageProvider;
 
 /**
  * This is the keyboard preferences content.
@@ -138,6 +141,11 @@
     private JComboBox tfKey = new JComboBox();
 
     JTable shortcutTable = new JTable();
+    
+    JComboBox<String> cboxSchema = new JComboBox<String>();
+    JButton saveButton = new JButton(ImageProvider.get("save"));
+    JButton loadButton = new JButton(ImageProvider.get("open"));
+    JButton resetButton = new JButton(ImageProvider.get("undo"));
 
     private JTextField filterField = new JTextField();
 
@@ -247,24 +255,66 @@
         // copied from PluginPreference
         JPanel pnl  = new JPanel(new GridBagLayout());
         pnl.setBorder(BorderFactory.createEmptyBorder(5,5,5,5));
-        GridBagConstraints gc = new GridBagConstraints();
-
-        gc.anchor = GridBagConstraints.NORTHWEST;
-        gc.fill = GridBagConstraints.HORIZONTAL;
-        gc.weightx = 0.0;
-        gc.insets = new Insets(0,0,0,5);
-        pnl.add(new JLabel(tr("Search:")), gc);
-
-        gc.gridx = 1;
-        gc.weightx = 1.0;
-        pnl.add(filterField, gc);
+        
+        pnl.add(new JLabel(tr("Search:")),GBC.std());
+        pnl.add(filterField,GBC.std().fill(GBC.HORIZONTAL));
         filterField.setToolTipText(tr("Enter a search expression"));
         SelectAllOnFocusGainedDecorator.decorate(filterField);
         filterField.getDocument().addDocumentListener(new FilterFieldAdapter());
-        pnl.setMaximumSize(new Dimension(300,10));
+        pnl.add(new JLabel(tr("Schema:")),GBC.std().insets(10,0,0,0));
+        
+        final String presetsFolder = Main.pref.getPreferencesDir();
+        rebuildSchemaList(presetsFolder);
+        pnl.add(cboxSchema,GBC.std().fill(GBC.HORIZONTAL).weight(0.5,1));
+        pnl.add(loadButton,GBC.std().insets(10,0,0,0).weight(0.1, 1));
+        pnl.add(saveButton,GBC.std().weight(0.1, 1));
+        pnl.add(resetButton,GBC.std().weight(0.1, 1));
+        
+        loadButton.addActionListener(new ActionListener() {
+            @Override
+            public void actionPerformed(ActionEvent e) {
+                if (cboxSchema.getSelectedItem()==null) return;
+                ShortcutPresetsManager.resetShortcutsToDefaults();
+                ShortcutPresetsManager.loadShortcutsFromFile(presetsFolder,cboxSchema.getSelectedItem().toString());
+                model.fireTableDataChanged();   
+            }});
+
+        saveButton.addActionListener(new ActionListener() {
+            @Override
+            public void actionPerformed(ActionEvent e) {
+                System.out.println(cboxSchema.getSelectedItem());
+                if (cboxSchema.getSelectedItem()==null) return;
+                String sel = cboxSchema.getSelectedItem().toString().trim();
+                if (sel.length()==0) return;
+                if (cboxSchema.getSelectedIndex()<0) {
+                    sel=sel+".scm";
+                    ShortcutPresetsManager.saveShortcutsToFile(presetsFolder,sel);
+                    rebuildSchemaList(presetsFolder);
+                    cboxSchema.setSelectedItem(sel);
+                } else {
+                    ShortcutPresetsManager.saveShortcutsToFile(presetsFolder,sel);
+                }
+            }
+        });
+        
+        resetButton.addActionListener(new ActionListener() {
+            @Override
+            public void actionPerformed(ActionEvent e) {
+                ShortcutPresetsManager.resetShortcutsToDefaults();
+                model.fireTableDataChanged();
+            }
+        });
+        
+        pnl.setMaximumSize(new Dimension(600,10));
         return pnl;
     }
 
+    private void rebuildSchemaList(final String presetsFolder) {
+        cboxSchema.setModel(new DefaultComboBoxModel<String>(
+                ShortcutPresetsManager.getSchemaFileNames(presetsFolder)));
+        cboxSchema.setEditable(true);
+    }
+
     private void disableAllModifierCheckboxes() {
         cbDefault.setEnabled(false);
         cbDisable.setEnabled(false);
@@ -317,6 +367,7 @@
             }
         }
         public void actionPerformed(java.awt.event.ActionEvent e) {
+            // calls setAcssignedKey, setAdssignedUser, setAssignedModifier
             ListSelectionModel lsm = panel.shortcutTable.getSelectionModel();
             if (lsm != null && !lsm.isSelectionEmpty()) {
                 if (e != null) { // only if we've been called by a user action
@@ -383,5 +434,5 @@
         public void insertUpdate(DocumentEvent arg0) {  filter(); }
         public void removeUpdate(DocumentEvent arg0) { filter(); }
     }
-
+    
 }
Index: org/openstreetmap/josm/gui/preferences/shortcut/ShortcutPresetsManager.java
===================================================================
--- org/openstreetmap/josm/gui/preferences/shortcut/ShortcutPresetsManager.java	(revision 0)
+++ org/openstreetmap/josm/gui/preferences/shortcut/ShortcutPresetsManager.java	(working copy)
@@ -0,0 +1,75 @@
+/*
+ * To change this template, choose Tools | Templates
+ * and open the template in the editor.
+ */
+package org.openstreetmap.josm.gui.preferences.shortcut;
+
+import java.io.*;
+import java.util.ArrayList;
+import org.openstreetmap.josm.tools.Shortcut;
+
+/**
+ *
+ * @author Alexei
+ */
+public class ShortcutPresetsManager {
+
+    public static void saveShortcutsToFile(String dir, String fileName) {
+
+        File f = new File(dir, fileName);
+        PrintWriter fw = null;
+        try {
+            fw = new PrintWriter(f);
+            for (Shortcut s : Shortcut.listAll()) {
+                String txt = s.getSettingsText();
+                if (txt != null) fw.println(txt);
+            }
+        } catch (IOException ex) {
+            System.err.println("can not write file");
+        } finally {
+            try {
+                if (fw != null) fw.close();
+            } catch (Exception ex) {  }
+        }
+    }
+    
+    
+    public static void loadShortcutsFromFile(String dir, String fileName) {
+        ArrayList<String> items = new ArrayList<String>();
+        BufferedReader fr = null;
+        try {
+            File f = new File(dir, fileName);
+            fr = new BufferedReader(new FileReader(f));
+            String s;
+            while ((s = fr.readLine()) != null) {
+                items.add(s);
+            }
+        } catch (IOException ex) {
+            System.err.println("can not read file");
+            return;
+        } finally {
+            try {
+                if (fr != null)  fr.close();
+            } catch (IOException ex2) {   }
+        }
+        for (String s : items) {
+//            System.out.println(s);
+            Shortcut.addOrModifyShortcutPreferences(s);
+        }
+    }
+
+    public static void resetShortcutsToDefaults() {
+        for (Shortcut s: Shortcut.listAll()) {
+                    s.setAssignedUser(false);
+        }
+    }
+    public static String[] getSchemaFileNames(String dir) {
+        return new File(dir).list(new FilenameFilter() {
+            public boolean accept(File dir, String name) {
+                return name.endsWith(".scm");
+            }
+        });
+        
+    }
+    
+}
Index: org/openstreetmap/josm/tools/Shortcut.java
===================================================================
--- org/openstreetmap/josm/tools/Shortcut.java	(revision 5023)
+++ org/openstreetmap/josm/tools/Shortcut.java	(working copy)
@@ -184,7 +184,29 @@
             String.valueOf(assignedModifier), String.valueOf(assignedDefault), String.valueOf(assignedUser)}));
         }
     }
-
+    
+    public String getSettingsText() {
+        if (getAutomatic() || getReset() || !getAssignedUser()) {
+            return null;
+        } else {
+            return String.format("%s\t%s\t%d\t%d\t%d\t%d\t%s\t%s",shortText,longText,requestedKey,requestedGroup,assignedKey,assignedModifier, String.valueOf(assignedDefault), String.valueOf(assignedUser));
+        }
+    }
+    
+    public static void addOrModifyShortcutPreferences(String settingsText) {
+        String elems[] = settingsText.split("\t");
+        String shortText = elems[0];
+        Shortcut s = shortcuts.get(shortText);
+        s.longText = elems[1];
+        s.requestedKey = Integer.parseInt(elems[2]);
+        s.requestedGroup = Integer.parseInt(elems[3]);
+        s.assignedKey = Integer.parseInt(elems[4]);
+        s.assignedModifier = Integer.parseInt(elems[5]);
+        s.assignedDefault = Boolean.parseBoolean(elems[6]);
+        s.assignedUser = Boolean.parseBoolean(elems[7]);
+    }
+    
+    
     private boolean isSame(int isKey, int isModifier) {
         // an unassigned shortcut is different from any other shortcut
         return isKey == assignedKey && isModifier == assignedModifier && assignedModifier != getGroupModifier(NONE);
