Index: /trunk/src/org/openstreetmap/josm/tools/TextTagParser.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/tools/TextTagParser.java	(revision 13540)
+++ /trunk/src/org/openstreetmap/josm/tools/TextTagParser.java	(revision 13541)
@@ -36,4 +36,5 @@
         private boolean esc;
         private final StringBuilder s = new StringBuilder(200);
+        private String valueStops = "\n\r\t";
         private int pos;
         private final String data;
@@ -46,6 +47,10 @@
         public TextAnalyzer(String text) {
             pos = 0;
-            data = text;
+            data = Utils.strip(text);
             n = data.length();
+            // fix #1604: allow space characters as value stops for single-line input only
+            if (data.indexOf('\r') == -1 && data.indexOf('\n') == -1) {
+                valueStops += " ";
+            }
         }
 
@@ -73,5 +78,5 @@
                     break;
                 }
-                v = parseString("\n\r\t ");
+                v = parseString(valueStops);
                 tags.put(k, v);
             }
Index: /trunk/test/unit/org/openstreetmap/josm/tools/TextTagParserTest.java
===================================================================
--- /trunk/test/unit/org/openstreetmap/josm/tools/TextTagParserTest.java	(revision 13540)
+++ /trunk/test/unit/org/openstreetmap/josm/tools/TextTagParserTest.java	(revision 13541)
@@ -1,4 +1,6 @@
 // License: GPL. For details, see LICENSE file.
 package org.openstreetmap.josm.tools;
+
+import static org.junit.Assert.assertEquals;
 
 import java.util.Collections;
@@ -6,5 +8,4 @@
 import java.util.Map;
 
-import org.junit.Assert;
 import org.junit.Rule;
 import org.junit.Test;
@@ -32,17 +33,17 @@
         s = "\"2 3 4\"";
         s1 = "2 3 4";
-        Assert.assertEquals(s1, TextTagParser.unescape(s));
+        assertEquals(s1, TextTagParser.unescape(s));
 
         s = "\"2 \\\"3\\\" 4\"";
         s1 = "2 \"3\" 4";
-        Assert.assertEquals(s1, TextTagParser.unescape(s));
+        assertEquals(s1, TextTagParser.unescape(s));
 
         s = "\"2 3 ===4===\"";
         s1 = "2 3 ===4===";
-        Assert.assertEquals(s1, TextTagParser.unescape(s));
+        assertEquals(s1, TextTagParser.unescape(s));
 
         s = "\"2 3 \\\\\\\\===4===\"";
         s1 = "2 3 \\\\===4===";
-        Assert.assertEquals(s1, TextTagParser.unescape(s));
+        assertEquals(s1, TextTagParser.unescape(s));
     }
 
@@ -57,5 +58,5 @@
         } };
         Map<String, String> tags = TextTagParser.readTagsFromText(txt);
-        Assert.assertEquals(correctTags, tags);
+        assertEquals(correctTags, tags);
     }
 
@@ -71,5 +72,5 @@
         } };
         Map<String, String> tags = TextTagParser.readTagsFromText(txt);
-        Assert.assertEquals(correctTags, tags);
+        assertEquals(correctTags, tags);
     }
 
@@ -84,15 +85,15 @@
         correctTags = new HashMap<String, String>() { { put("a", "1"); put("b", "2 3 4"); } };
         tags = TextTagParser.readTagsFromText(txt);
-        Assert.assertEquals(correctTags, tags);
+        assertEquals(correctTags, tags);
 
         txt = "\"a\"  :     \"1 1 1\", \"b2\"  :\"2 \\\"3 qwe\\\" 4\"";
         correctTags = new HashMap<String, String>() { { put("a", "1 1 1"); put("b2", "2 \"3 qwe\" 4"); } };
         tags = TextTagParser.readTagsFromText(txt);
-        Assert.assertEquals(correctTags, tags);
+        assertEquals(correctTags, tags);
 
         txt = " \"aыыы\"   :    \"val\\\"\\\"\\\"ue1\"";
         correctTags = new HashMap<String, String>() { { put("aыыы", "val\"\"\"ue1"); } };
         tags = TextTagParser.readTagsFromText(txt);
-        Assert.assertEquals(correctTags, tags);
+        assertEquals(correctTags, tags);
     }
 
@@ -107,5 +108,5 @@
         } };
         Map<String, String> tags = TextTagParser.readTagsFromText(txt);
-        Assert.assertEquals(correctTags, tags);
+        assertEquals(correctTags, tags);
     }
 
@@ -117,5 +118,5 @@
         String txt = "a=2 b=3 4";
         Map<String, String> tags = TextTagParser.readTagsFromText(txt);
-        Assert.assertEquals(Collections.EMPTY_MAP, tags);
+        assertEquals(Collections.EMPTY_MAP, tags);
     }
 
@@ -125,8 +126,39 @@
     @Test
     public void testTab() {
-        Assert.assertEquals(TextTagParser.readTagsFromText("shop\tjewelry"), Collections.singletonMap("shop", "jewelry"));
-        Assert.assertEquals(TextTagParser.readTagsFromText("!shop\tjewelry"), Collections.singletonMap("shop", "jewelry"));
-        Assert.assertEquals(TextTagParser.readTagsFromText("!!!shop\tjewelry"), Collections.singletonMap("shop", "jewelry"));
-        Assert.assertEquals(TextTagParser.readTagsFromText("shop\t\t\tjewelry"), Collections.singletonMap("shop", "jewelry"));
+        assertEquals(Collections.singletonMap("shop", "jewelry"), TextTagParser.readTagsFromText("shop\tjewelry"));
+        assertEquals(Collections.singletonMap("shop", "jewelry"), TextTagParser.readTagsFromText("!shop\tjewelry"));
+        assertEquals(Collections.singletonMap("shop", "jewelry"), TextTagParser.readTagsFromText("!!!shop\tjewelry"));
+        assertEquals(Collections.singletonMap("shop", "jewelry"), TextTagParser.readTagsFromText("shop\t\t\tjewelry"));
+    }
+
+    /**
+     * Non-regression test for ticket <a href="https://josm.openstreetmap.de/ticket/16104">#16104</a>
+     */
+    @Test
+    public void testTicket16104() {
+        Map<String, String> expected = new HashMap<>();
+        expected.put("boundary", "national_park");
+        expected.put("name", "Raet nasjonalpark");
+        expected.put("naturbase:iid", "VV00003273");
+        expected.put("naturbase:verneform", "NP");
+        expected.put("operator", "Raet Nasjonalparkstyre");
+        expected.put("protect_class", "2");
+        expected.put("related_law", "https://lovdata.no/forskrift/2016-12-16-1632");
+        expected.put("short_name", "Raet");
+        expected.put("start_date", "2016-12-16");
+        expected.put("type", "boundary");
+        expected.put("url", "http://faktaark.naturbase.no/?id=VV00003273");
+        assertEquals(expected, TextTagParser.readTagsFromText(
+                "boundary=national_park\n" +
+                "name=Raet nasjonalpark\n" +
+                "naturbase:iid=VV00003273\n" +
+                "naturbase:verneform=NP\n" +
+                "operator=Raet Nasjonalparkstyre\n" +
+                "protect_class=2\n" +
+                "related_law=https://lovdata.no/forskrift/2016-12-16-1632\n" +
+                "short_name=Raet\n" +
+                "start_date=2016-12-16\n" +
+                "type=boundary\n" +
+                "url=http://faktaark.naturbase.no/?id=VV00003273"));
     }
 }
