Index: /trunk/src/org/openstreetmap/josm/tools/template_engine/Condition.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/tools/template_engine/Condition.java	(revision 11056)
+++ /trunk/src/org/openstreetmap/josm/tools/template_engine/Condition.java	(revision 11057)
@@ -41,5 +41,5 @@
     public String toString() {
         StringBuilder sb = new StringBuilder();
-        sb.append("?{");
+        sb.append("?{ ");
         for (TemplateEntry entry: entries) {
             if (entry instanceof SearchExpressionCondition) {
@@ -48,6 +48,8 @@
                 sb.append('\'').append(entry).append('\'');
             }
-            sb.append('|');
+            sb.append(" | ");
         }
+        sb.setLength(sb.length() - 3);
+        sb.append(" }");
         return sb.toString();
     }
Index: /trunk/src/org/openstreetmap/josm/tools/template_engine/Variable.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/tools/template_engine/Variable.java	(revision 11056)
+++ /trunk/src/org/openstreetmap/josm/tools/template_engine/Variable.java	(revision 11057)
@@ -56,5 +56,5 @@
     @Override
     public String toString() {
-        return '{' + variableName + '}';
+        return '{' + (special ? SPECIAL_VARIABLE_PREFIX : "") + variableName + '}';
     }
 
Index: /trunk/test/unit/org/openstreetmap/josm/tools/template_engine/TemplateParserTest.java
===================================================================
--- /trunk/test/unit/org/openstreetmap/josm/tools/template_engine/TemplateParserTest.java	(revision 11056)
+++ /trunk/test/unit/org/openstreetmap/josm/tools/template_engine/TemplateParserTest.java	(revision 11057)
@@ -174,4 +174,5 @@
         entry.appendText(sb, dataProvider);
         Assert.assertEquals("name=waypointName, number=10", sb.toString());
+        Assert.assertEquals("{special:everything}", entry.toString());
     }
 
@@ -333,3 +334,12 @@
         Assert.assertEquals("child2", sb.toString());
     }
+
+    @Test
+    public void testToStringCanBeParsedAgain() throws Exception {
+        final String s1 = "?{ '{name} ({desc})' | '{name} ({cmt})' | '{name}' | '{desc}' | '{cmt}' }";
+        final String s2 = new TemplateParser(s1).parse().toString();
+        final String s3 = new TemplateParser(s2).parse().toString();
+        Assert.assertEquals(s1, s2);
+        Assert.assertEquals(s2, s3);
+    }
 }
