Index: trunk/src/org/openstreetmap/josm/io/remotecontrol/AddTagsDialog.java
===================================================================
--- trunk/src/org/openstreetmap/josm/io/remotecontrol/AddTagsDialog.java	(revision 5875)
+++ trunk/src/org/openstreetmap/josm/io/remotecontrol/AddTagsDialog.java	(revision 5876)
@@ -11,13 +11,17 @@
 import java.awt.event.KeyEvent;
 import java.awt.event.MouseEvent;
+import java.io.UnsupportedEncodingException;
+import java.net.URLDecoder;
 import java.util.Collection;
 import java.util.HashMap;
+import java.util.HashSet;
+import java.util.Map;
+import java.util.Set;
 import javax.swing.AbstractAction;
+import javax.swing.JCheckBox;
 
 import javax.swing.JPanel;
 import javax.swing.JTable;
 import javax.swing.KeyStroke;
-import javax.swing.event.CellEditorListener;
-import javax.swing.event.ChangeEvent;
 import javax.swing.table.DefaultTableModel;
 import javax.swing.table.TableCellEditor;
@@ -31,4 +35,5 @@
 import org.openstreetmap.josm.data.osm.OsmPrimitive;
 import org.openstreetmap.josm.gui.ExtendedDialog;
+import org.openstreetmap.josm.gui.util.GuiHelper;
 import org.openstreetmap.josm.gui.util.TableHelper;
 import org.openstreetmap.josm.tools.GBC;
@@ -46,8 +51,14 @@
 
 
+    /** initially given tags  **/
+    String[][] tags; 
+    
     private final JTable propertyTable;
     private Collection<? extends OsmPrimitive> sel;
     int[] count;
 
+    String sender;
+    static Set<String> trustedSenders = new HashSet<String>();
+    
     /**
      * Class for displaying "delete from ... objects" in the table
@@ -110,10 +121,12 @@
     }
             
-    public AddTagsDialog(String[][] tags) {
+    public AddTagsDialog(String[][] tags, String senderName) {
         super(Main.parent, tr("Add tags to selected objects"), new String[] { tr("Add selected tags"), tr("Add all tags"),  tr("Cancel")},
                 false,
                 true);
         setToolTipTexts(new String[]{tr("Add checked tags to selected objects"), tr("Shift+Enter: Add all tags to selected objects"), ""});
-     
+
+        this.sender = senderName;
+        
         DataSet.addSelectionListener(this);
 
@@ -211,4 +224,16 @@
         tablePanel.add(propertyTable.getTableHeader(), GBC.eol().fill(GBC.HORIZONTAL));
         tablePanel.add(propertyTable, GBC.eol().fill(GBC.BOTH));
+        if (!trustedSenders.contains(sender)) {
+            final JCheckBox c = new JCheckBox();
+            c.setAction(new AbstractAction(tr("Accept all tags from {0} for this session", sender) ) {
+                @Override public void actionPerformed(ActionEvent e) {
+                    if (c.isSelected())
+                        trustedSenders.add(sender);
+                    else 
+                        trustedSenders.remove(sender);
+                }
+            } );
+            tablePanel.add(c , GBC.eol().insets(20,10,0,0));
+        }
         setContent(tablePanel);
         setDefaultButton(2);
@@ -251,4 +276,7 @@
                 }
             }
+        } 
+        if (buttonIndex == 2) {
+            trustedSenders.remove(sender);
         }
         setVisible(false);
@@ -260,4 +288,56 @@
         findExistingTags();
     }
-
+    
+     /*
+     * parse addtags parameters Example URL (part):
+     * addtags=wikipedia:de%3DResidenzschloss Dresden|name:en%3DDresden Castle
+     */
+    public static void addTags(final Map<String, String> args, final String sender) {
+        if (args.containsKey("addtags")) {
+            GuiHelper.executeByMainWorkerInEDT(new Runnable() {
+
+                public void run() {
+                    String[] tags = null;
+                    try {
+                        tags = URLDecoder.decode(args.get("addtags"), "UTF-8").split("\\|");
+                    } catch (UnsupportedEncodingException e) {
+                        throw new RuntimeException();
+                    }
+                    Set<String> tagSet = new HashSet<String>();
+                    for (String tag : tags) {
+                        if (!tag.trim().isEmpty() && tag.contains("=")) {
+                            tagSet.add(tag.trim());
+                        }
+                    }
+                    if (!tagSet.isEmpty()) {
+                        String[][] keyValue = new String[tagSet.size()][2];
+                        int i = 0;
+                        for (String tag : tagSet) {
+                            // support a  =   b===c as "a"="b===c"
+                            String [] pair = tag.split("\\s*=\\s*",2); 
+                            keyValue[i][0] = pair[0];
+                            keyValue[i][1] = pair.length<2 ? "": pair[1];
+                            i++;
+                        }
+                        addTagsIfNeeded(keyValue, sender);
+                    }
+                }
+
+                
+            });
+        }
+    }
+    
+    private static void addTagsIfNeeded(String[][] keyValue, String sender) {
+        if (trustedSenders.contains(sender)) {
+            if (Main.main.getCurrentDataSet() != null) {
+                Collection<OsmPrimitive> s = Main.main.getCurrentDataSet().getSelected();
+                for (int j = 0; j < keyValue.length; j++) {
+                    Main.main.undoRedo.add(new ChangePropertyCommand(s, keyValue[j][0], keyValue[j][1]));
+                }
+            }
+        } else {
+            new AddTagsDialog(keyValue, sender).showDialog();
+        }
+    }
 }
Index: trunk/src/org/openstreetmap/josm/io/remotecontrol/RequestProcessor.java
===================================================================
--- trunk/src/org/openstreetmap/josm/io/remotecontrol/RequestProcessor.java	(revision 5875)
+++ trunk/src/org/openstreetmap/josm/io/remotecontrol/RequestProcessor.java	(revision 5876)
@@ -2,19 +2,21 @@
 package org.openstreetmap.josm.io.remotecontrol;
 
-import java.io.BufferedInputStream;
 import java.io.BufferedOutputStream;
+import java.io.BufferedReader;
 import java.io.IOException;
 import java.io.InputStreamReader;
 import java.io.OutputStream;
 import java.io.OutputStreamWriter;
-import java.io.Reader;
 import java.io.Writer;
 import java.net.Socket;
 import java.util.Arrays;
 import java.util.Date;
+import java.util.HashMap;
 import java.util.Map;
 import java.util.Map.Entry;
 import java.util.StringTokenizer;
 import java.util.TreeMap;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
 
 import org.openstreetmap.josm.io.remotecontrol.handler.AddNodeHandler;
@@ -136,17 +138,9 @@
                     request.getOutputStream());
             out = new OutputStreamWriter(raw);
-            Reader in = new InputStreamReader(new BufferedInputStream(
-                    request.getInputStream()), "ASCII");
-
-            StringBuffer requestLine = new StringBuffer();
-            while (requestLine.length() < 1024 * 1024) {
-                int c = in.read();
-                if (c == -1 || c == '\r' || c == '\n')
-                    break;
-                requestLine.append((char) c);
-            }
-
-            System.out.println("RemoteControl received: " + requestLine);
-            String get = requestLine.toString();
+            BufferedReader in = new BufferedReader(new InputStreamReader(request.getInputStream(), "ASCII"));
+            
+            String get = in.readLine();
+            System.out.println("RemoteControl received: " + get);
+
             StringTokenizer st = new StringTokenizer(get);
             if (!st.hasMoreTokens()) {
@@ -165,16 +159,42 @@
                 return;
             }
-
-            String command = null;
+            
             int questionPos = url.indexOf('?');
-            if(questionPos < 0)
-            {
-                command = url;
-            }
-            else
-            {
-                command = url.substring(0, questionPos);
-            }
-
+            
+            String command = questionPos < 0 ? url : url.substring(0, questionPos);
+            
+            Map <String,String> headers = new HashMap<String, String>();
+            int k=0, MAX_HEADERS=20;
+            while (k<MAX_HEADERS) {
+                get=in.readLine();
+                if (get==null) break;
+                k++;
+                String h[] = get.split(": ", 2);
+                if (h.length==2) {
+                    headers.put(h[0], h[1]);
+                } else break;
+            }
+            
+            // Who sent the request: trying our best to detect
+            // not from localhost => sender = IP
+            // from localhost: sender = referer header, if exists
+            String sender = null;
+            
+            if (!request.getInetAddress().isLoopbackAddress()) {
+                sender = request.getInetAddress().getHostAddress();
+            } else {
+                String ref = headers.get("Referer");
+                Pattern r = Pattern.compile("(https?://)?([^/]*)");
+                if (ref!=null) {
+                    Matcher m = r.matcher(ref);
+                    if (m.find()) {
+                        sender = m.group(2);
+                    }
+                }
+                if (sender == null) {
+                    sender = "localhost";
+                } 
+            }
+            
             // find a handler for this command
             Class<? extends RequestHandler> handlerClass = handlers.get(command);
@@ -202,4 +222,5 @@
                     handler.setCommand(command);
                     handler.setUrl(url);
+                    handler.setSender(sender);
                     handler.handle();
                     sendHeader(out, "200 OK", handler.getContentType(), false);
Index: trunk/src/org/openstreetmap/josm/io/remotecontrol/handler/AddNodeHandler.java
===================================================================
--- trunk/src/org/openstreetmap/josm/io/remotecontrol/handler/AddNodeHandler.java	(revision 5875)
+++ trunk/src/org/openstreetmap/josm/io/remotecontrol/handler/AddNodeHandler.java	(revision 5876)
@@ -13,4 +13,5 @@
 import org.openstreetmap.josm.data.osm.OsmPrimitive;
 import org.openstreetmap.josm.gui.util.GuiHelper;
+import org.openstreetmap.josm.io.remotecontrol.AddTagsDialog;
 import org.openstreetmap.josm.io.remotecontrol.PermissionPrefWithDefault;
 import org.openstreetmap.josm.io.remotecontrol.handler.RequestHandler.RequestHandlerBadRequestException;
@@ -90,5 +91,5 @@
         }
         // parse parameter addtags=tag1=value1|tag2=vlaue2
-        LoadAndZoomHandler.addTags(args);
+        AddTagsDialog.addTags(args, sender);        
     }
 
Index: trunk/src/org/openstreetmap/josm/io/remotecontrol/handler/AddWayHandler.java
===================================================================
--- trunk/src/org/openstreetmap/josm/io/remotecontrol/handler/AddWayHandler.java	(revision 5875)
+++ trunk/src/org/openstreetmap/josm/io/remotecontrol/handler/AddWayHandler.java	(revision 5876)
@@ -20,4 +20,5 @@
 import org.openstreetmap.josm.data.osm.Way;
 import org.openstreetmap.josm.gui.util.GuiHelper;
+import org.openstreetmap.josm.io.remotecontrol.AddTagsDialog;
 import org.openstreetmap.josm.io.remotecontrol.PermissionPrefWithDefault;
 import org.openstreetmap.josm.io.remotecontrol.handler.RequestHandler.RequestHandlerBadRequestException;
@@ -53,5 +54,5 @@
         });
         // parse parameter addtags=tag1=value1|tag2=value2
-        LoadAndZoomHandler.addTags(args);        
+        AddTagsDialog.addTags(args, sender);        
     }
 
Index: trunk/src/org/openstreetmap/josm/io/remotecontrol/handler/LoadAndZoomHandler.java
===================================================================
--- trunk/src/org/openstreetmap/josm/io/remotecontrol/handler/LoadAndZoomHandler.java	(revision 5875)
+++ trunk/src/org/openstreetmap/josm/io/remotecontrol/handler/LoadAndZoomHandler.java	(revision 5876)
@@ -6,8 +6,5 @@
 import java.awt.geom.Area;
 import java.awt.geom.Rectangle2D;
-import java.io.UnsupportedEncodingException;
-import java.net.URLDecoder;
 import java.util.HashSet;
-import java.util.Map;
 import java.util.Set;
 import java.util.concurrent.Future;
@@ -191,44 +188,5 @@
         }
 
-        addTags(args);
-    }
-
-    /*
-     * parse addtags parameters Example URL (part):
-     * addtags=wikipedia:de%3DResidenzschloss Dresden|name:en%3DDresden Castle
-     */
-    static void addTags(final Map<String, String> args) {
-        if (args.containsKey("addtags")) {
-            GuiHelper.executeByMainWorkerInEDT(new Runnable() {
-
-                public void run() {
-                    String[] tags = null;
-                    try {
-                        tags = URLDecoder.decode(args.get("addtags"), "UTF-8").split("\\|");
-                    } catch (UnsupportedEncodingException e) {
-                        throw new RuntimeException();
-                    }
-                    Set<String> tagSet = new HashSet<String>();
-                    for (String tag : tags) {
-                        if (!tag.trim().isEmpty() && tag.contains("=")) {
-                            tagSet.add(tag.trim());
-                        }
-                    }
-                    if (!tagSet.isEmpty()) {
-                        String[][] keyValue = new String[tagSet.size()][2];
-                        int i = 0;
-                        for (String tag : tagSet) {
-                            // support a  =   b===c as "a"="b===c"
-                            String [] pair = tag.split("\\s*=\\s*",2); 
-                            keyValue[i][0] = pair[0];
-                            keyValue[i][1] = pair.length<2 ? "": pair[1];
-                            i++;
-                        }
-    
-                        new AddTagsDialog(keyValue).showDialog();
-                    }
-                }
-            });
-        }
+        AddTagsDialog.addTags(args, sender);
     }
 
Index: trunk/src/org/openstreetmap/josm/io/remotecontrol/handler/LoadObjectHandler.java
===================================================================
--- trunk/src/org/openstreetmap/josm/io/remotecontrol/handler/LoadObjectHandler.java	(revision 5875)
+++ trunk/src/org/openstreetmap/josm/io/remotecontrol/handler/LoadObjectHandler.java	(revision 5876)
@@ -10,4 +10,5 @@
 import org.openstreetmap.josm.data.osm.SimplePrimitiveId;
 import org.openstreetmap.josm.gui.util.GuiHelper;
+import org.openstreetmap.josm.io.remotecontrol.AddTagsDialog;
 import org.openstreetmap.josm.io.remotecontrol.PermissionPrefWithDefault;
 
@@ -48,5 +49,5 @@
                 public void run() {
                     Main.main.getCurrentDataSet().setSelected(ps);
-                    LoadAndZoomHandler.addTags(args);
+                    AddTagsDialog.addTags(args, sender);        
                     ps.clear();
                 }
Index: trunk/src/org/openstreetmap/josm/io/remotecontrol/handler/RequestHandler.java
===================================================================
--- trunk/src/org/openstreetmap/josm/io/remotecontrol/handler/RequestHandler.java	(revision 5875)
+++ trunk/src/org/openstreetmap/josm/io/remotecontrol/handler/RequestHandler.java	(revision 5876)
@@ -43,4 +43,10 @@
     /** will be filled with the command assigned to the subclass */
     protected String myCommand;
+    
+    /**
+     * who send th request?
+     * the host from refrerer header or IP of request sender
+     */
+    protected String sender;
 
     /**
@@ -242,4 +248,8 @@
     }
 
+    public void setSender(String sender) {
+        this.sender = sender;
+    }
+ 
     public static class RequestHandlerException extends Exception {
 
