Index: trunk/src/org/openstreetmap/josm/actions/PasteTagsAction.java
===================================================================
--- trunk/src/org/openstreetmap/josm/actions/PasteTagsAction.java	(revision 5808)
+++ trunk/src/org/openstreetmap/josm/actions/PasteTagsAction.java	(revision 5809)
@@ -6,5 +6,4 @@
 import static org.openstreetmap.josm.tools.I18n.trn;
 
-import java.awt.GridBagLayout;
 import java.awt.event.ActionEvent;
 import java.awt.event.KeyEvent;
@@ -14,7 +13,4 @@
 import java.util.List;
 import java.util.Map;
-import javax.swing.JLabel;
-import javax.swing.JOptionPane;
-import javax.swing.JPanel;
 
 import org.openstreetmap.josm.Main;
@@ -27,11 +23,8 @@
 import org.openstreetmap.josm.data.osm.Tag;
 import org.openstreetmap.josm.data.osm.TagCollection;
-import org.openstreetmap.josm.gui.ConditionalOptionPaneUtil;
 import org.openstreetmap.josm.gui.conflict.tags.PasteTagsConflictResolverDialog;
 import org.openstreetmap.josm.gui.help.HelpUtil;
-import org.openstreetmap.josm.tools.GBC;
 import org.openstreetmap.josm.tools.Shortcut;
 import org.openstreetmap.josm.tools.TextTagParser;
-import org.openstreetmap.josm.tools.UrlLabel;
 import org.openstreetmap.josm.tools.Utils;
 
@@ -46,4 +39,7 @@
 public final class PasteTagsAction extends JosmAction {
 
+    private static final String help = ht("/Action/PasteTags");
+    private static final String helpUrl = HelpUtil.getHelpTopicUrl(HelpUtil.buildAbsoluteHelpTopic(help));
+    
     public PasteTagsAction() {
         super(tr("Paste Tags"), "pastetags",
@@ -51,19 +47,5 @@
                 Shortcut.registerShortcut("system:pastestyle", tr("Edit: {0}", tr("Paste Tags")),
                 KeyEvent.VK_V, Shortcut.CTRL_SHIFT), true);
-        putValue("help", ht("/Action/PasteTags"));
-    }
-
-    private void showBadBufferMessage() {
-        String msg = tr("<html><p> Sorry, it is impossible to paste tags from buffer. It does not contain any JOSM object"
-            + " or suitable text. </p></html>");
-        JPanel p = new JPanel(new GridBagLayout());
-        p.add(new JLabel(msg),GBC.eop());
-        p.add(new UrlLabel(
-                HelpUtil.getHelpTopicUrl(HelpUtil.buildAbsoluteHelpTopic((String)getValue("help")))),
-                GBC.eop());
-
-        ConditionalOptionPaneUtil.showMessageDialog(
-            "paste_badbuffer", Main.parent,
-            p, tr("Warning"), JOptionPane.WARNING_MESSAGE);
+        putValue("help", help);
     }
 
@@ -269,28 +251,55 @@
         
         String buf = Utils.getClipboardContent();
-
+        if (buf == null || buf.isEmpty() || buf.matches("(\\d+,)*\\d+")) {
+            pasteTagsFromJOSMBuffer(selection);
+        } else { 
+            // Paste tags from arbitrary text
+            pasteTagsFromText(selection, buf);
+        }
+    }
+
+    /** Paste tags from arbitrary text
+     * @return false if action was successful
+     */
+    public static boolean pasteTagsFromText(Collection<OsmPrimitive> selection, String text) {
+        Map<String, String> tags = TextTagParser.readTagsFromText(text);
         List<Command> commands = new ArrayList<Command>();
-        if (buf==null) {
-            showBadBufferMessage();
-            return;
-        }
-        if (buf.matches("(\\d+,)*\\d+")) { // Paste tags from JOSM buffer
-            PasteTagsAction.TagPaster tagPaster = new PasteTagsAction.TagPaster(Main.pasteBuffer.getDirectlyAdded(), selection);
-            for (Tag tag: tagPaster.execute()) {
-                commands.add(new ChangePropertyCommand(selection, tag.getKey(), "".equals(tag.getValue())?null:tag.getValue()));
-            }
-        } else { // Paste tags from arbitrary text
-            Map<String, String> tags = TextTagParser.readTagsFromText(buf);
-            if (tags==null || tags.isEmpty()) {
-                showBadBufferMessage();
-                return;
-            }
-            if (!TextTagParser.validateTags(tags)) return;
-            String v;
-            for (String key: tags.keySet()) {
-                v = tags.get(key);
-                commands.add(new ChangePropertyCommand(selection, key, "".equals(v)?null:v));
-            }
-        }
+        if (tags==null || tags.isEmpty()) {
+            TextTagParser.showBadBufferMessage(helpUrl);
+            return false;
+        };
+        if (!TextTagParser.validateTags(tags)) return false;
+        String v;
+        for (String key: tags.keySet()) {
+            v = tags.get(key);
+            commands.add(new ChangePropertyCommand(selection, key, "".equals(v)?null:v));
+        }
+        commitCommands(selection, commands);
+        return !commands.isEmpty();
+    }
+        
+    /** Paste tags from JOSM buffer
+     * @param selection objects 
+     * @param commands
+     * @return 
+     */
+    public static boolean pasteTagsFromJOSMBuffer(Collection<OsmPrimitive> selection) {
+        List<PrimitiveData> directlyAdded = Main.pasteBuffer.getDirectlyAdded();
+        if (directlyAdded==null || directlyAdded.isEmpty()) return false;
+
+        PasteTagsAction.TagPaster tagPaster = new PasteTagsAction.TagPaster(directlyAdded, selection);
+        List<Command> commands = new ArrayList<Command>();
+        for (Tag tag : tagPaster.execute()) {
+            commands.add(new ChangePropertyCommand(selection, tag.getKey(), "".equals(tag.getValue()) ? null : tag.getValue()));
+        }
+        commitCommands(selection, commands);
+        return true;
+    }
+
+    /**
+     * Create and execute SequenceCommand with descriptive title
+     * @param commands 
+     */
+    private static void commitCommands(Collection<OsmPrimitive> selection, List<Command> commands) {
         if (!commands.isEmpty()) {
             String title1 = trn("Pasting {0} tag", "Pasting {0} tags", commands.size(), commands.size());
@@ -302,8 +311,6 @@
                     ));
         }
-        
-    }
-
-
+    } 
+   
     @Override
     protected void updateEnabledState() {
Index: trunk/src/org/openstreetmap/josm/tools/TextTagParser.java
===================================================================
--- trunk/src/org/openstreetmap/josm/tools/TextTagParser.java	(revision 5808)
+++ trunk/src/org/openstreetmap/josm/tools/TextTagParser.java	(revision 5809)
@@ -1,4 +1,5 @@
 package org.openstreetmap.josm.tools;
 
+import java.awt.GridBagLayout;
 import java.util.Arrays;
 import java.util.HashMap;
@@ -6,5 +7,7 @@
 import java.util.regex.Matcher;
 import java.util.regex.Pattern;
+import javax.swing.JLabel;
 import javax.swing.JOptionPane;
+import javax.swing.JPanel;
 import org.openstreetmap.josm.Main;
 import org.openstreetmap.josm.gui.ExtendedDialog;
@@ -224,5 +227,5 @@
      * Check tags for correctness and display warnings if needed
      * @param tags - map key->value to check
-     * @return true if user decision was "OK"
+     * @return true if the tags shoul be pasted
      */
     public static boolean validateTags(Map<String, String> tags) {
@@ -234,20 +237,20 @@
             r=warning(trn("There was {0} tag found in the buffer, it is suspicious!",
             "There were {0} tags found in the buffer, it is suspicious!", s,
-            s), "", "toomanytags");
-            if (r==2) return false; if (r==3) return true;
+            s), "", "tags.paste.toomanytags");
+            if (r==2 || r==3) return false; if (r==4) return true;
         }
         for (String key: tags.keySet()) {
             value = tags.get(key);
             if (key.length() > MAX_KEY_LENGTH) {
-                r = warning(tr("Key is too long (max {0} characters):", MAX_KEY_LENGTH), key+"="+value, "keytoolong");
-                if (r==2) return false; if (r==3) return true;
+                r = warning(tr("Key is too long (max {0} characters):", MAX_KEY_LENGTH), key+"="+value, "tags.paste.keytoolong");
+                if (r==2 || r==3) return false; if (r==4) return true;
             }
             if (!key.matches(KEY_PATTERN)) {
-                r = warning(tr("Suspicious characters in key:"), key, "keydoesnotmatch");
-                if (r==2) return false; if (r==3) return true;
+                r = warning(tr("Suspicious characters in key:"), key, "tags.paste.keydoesnotmatch");
+                if (r==2 || r==3) return false; if (r==4) return true;
             }
             if (value.length() > MAX_VALUE_LENGTH) {
-                r = warning(tr("Value is too long (max {0} characters):", MAX_VALUE_LENGTH), value, "valuetoolong");
-                if (r==2) return false; if (r==3) return true;
+                r = warning(tr("Value is too long (max {0} characters):", MAX_VALUE_LENGTH), value, "tags.paste.valuetoolong");
+                if (r==2 || r==3) return false; if (r==4) return true;
             }
         }
@@ -259,6 +262,6 @@
                     Main.parent,
                     tr("Do you want to paste these tags?"),
-                    new String[]{tr("Ok"), tr("Cancel"), tr("Ignore warnings")});
-        ed.setButtonIcons(new String[]{"ok.png", "cancel.png", "pastetags.png"});
+                    new String[]{tr("Ok"), tr("Cancel"), tr("Clear buffer"), tr("Ignore warnings")});
+        ed.setButtonIcons(new String[]{"ok.png", "cancel.png", "dialogs/delete.png", "pastetags.png"});
         ed.setContent("<html><b>"+text + "</b><br/><br/><div width=\"300px\">"+XmlWriter.encode(data,true)+"</html>");
         ed.setDefaultButton(2);
@@ -267,9 +270,41 @@
         ed.toggleEnable(code);
         ed.showDialog();
-        Object o = ed.getValue();
-        if (o instanceof Integer) 
-            return ((Integer)o).intValue(); 
-        else 
-            return 2;
+        int r = ed.getValue();
+        if (r==0) r = 2;
+        // clean clipboard if user asked
+        if (r==3) Utils.copyToClipboard("");
+        return r;
+    }
+
+    /**
+     * Shows message that the buffer can not be pasted, allowing user to clean the buffer
+     * @param helpUrl
+     */
+    public static void showBadBufferMessage(String helpUrl) {
+        String msg = tr("<html><p> Sorry, it is impossible to paste tags from buffer. It does not contain any JOSM object"
+            + " or suitable text. </p></html>");
+        JPanel p = new JPanel(new GridBagLayout());
+        p.add(new JLabel(msg),GBC.eop());
+        if (helpUrl != null) {
+            p.add(new UrlLabel(helpUrl), GBC.eop());
+        }
+
+        ExtendedDialog ed = new ExtendedDialog(
+                    Main.parent,
+                    tr("Warning"),
+                    new String[]{tr("Ok"), tr("Clear buffer")});
+        
+        ed.setButtonIcons(new String[]{"ok.png", "dialogs/delete.png"});
+        
+        ed.setContent(p);
+        ed.setDefaultButton(1);
+        ed.setCancelButton(1);
+        ed.setIcon(JOptionPane.WARNING_MESSAGE);
+        ed.toggleEnable("tags.paste.cleanbadbuffer");
+        ed.showDialog();
+
+        int r = ed.getValue();
+        // clean clipboard if user asked
+        if (r==2) Utils.copyToClipboard("");
     }
 }
