Index: /applications/editors/josm/plugins/comfort0/src/net/simon04/comfort0/level0l/Level0LParser.jj
===================================================================
--- /applications/editors/josm/plugins/comfort0/src/net/simon04/comfort0/level0l/Level0LParser.jj	(revision 35287)
+++ /applications/editors/josm/plugins/comfort0/src/net/simon04/comfort0/level0l/Level0LParser.jj	(revision 35288)
@@ -90,4 +90,19 @@
 }
 
+RelationData relation():
+{
+    RelationData r;
+    Token id;
+}
+{
+    <RELATION>
+    { r = new RelationData(); }
+    id=<H_ID>
+    { r.setId(Long.parseLong(id.image)); }
+    ( <COMMENT_START> <C_EOL> | <H_EOL> )
+    relation_data(r)
+    { return r; }
+}
+
 void way_data(WayData r):
 {}
@@ -112,4 +127,41 @@
 }
 
+void relation_data(RelationData r):
+{}
+{
+    (
+        <D_SPACE> <D_SPACE>
+        ( relation_member(r) | tag(r) )
+    )*
+}
+
+void relation_member(RelationData r):
+{
+    OsmPrimitiveType type;
+    Token id;
+    Token role = null;
+}
+{
+    (
+        <ND> { type = OsmPrimitiveType.NODE; }
+    |
+        <WY> { type = OsmPrimitiveType.WAY; }
+    |
+        <REL> { type = OsmPrimitiveType.RELATION; }
+    )
+    <D_SPACE>
+    id=<D_ID>
+    (
+        <D_SPACE>
+        (
+            role=<IDENT> ( <D_SPACE> )*
+        |
+            ( <D_SPACE> )*
+        )
+    )?
+    { r.getMembers().add(new RelationMemberData(role != null ? role.image : "", type, Long.parseLong(id.image))); }
+    ( <D_COMMENT_START> <C_EOL> | <D_EOL> )
+}
+
 void tag(PrimitiveData r):
 {
Index: /applications/editors/josm/plugins/comfort0/test/unit/net/simon04/comfort0/level0l/parsergen/Level0LParserTest.java
===================================================================
--- /applications/editors/josm/plugins/comfort0/test/unit/net/simon04/comfort0/level0l/parsergen/Level0LParserTest.java	(revision 35287)
+++ /applications/editors/josm/plugins/comfort0/test/unit/net/simon04/comfort0/level0l/parsergen/Level0LParserTest.java	(revision 35288)
@@ -8,4 +8,6 @@
 import org.junit.Test;
 import org.openstreetmap.josm.data.osm.NodeData;
+import org.openstreetmap.josm.data.osm.OsmPrimitiveType;
+import org.openstreetmap.josm.data.osm.RelationData;
 import org.openstreetmap.josm.data.osm.WayData;
 
@@ -45,3 +47,29 @@
         assertThat(way.getKeys().get("name"), is("Pastower Straße"));
     }
+
+    @Test
+    public void testRelation() throws Exception {
+        final String level0l = "" +
+                "relation 56688 # member types: nd, wy, rel; roles are put after ids\n" +
+                "  nd 294942404\n" +
+                "  nd 364933006 # the second node\n" +
+                "  wy 4579143 forward\n" +
+                "  nd 249673494 stop # the end\n" +
+                "  name = Küstenbus Linie 123\n" +
+                "  network = VVW\n" +
+                "  operator = Regionalverkehr Küste\n" +
+                "  ref = 123\n" +
+                "  route = bus\n" +
+                "  type = route\n";
+        final RelationData relation = new Level0LParser(new StringReader(level0l)).relation();
+        assertThat(relation.getId(), is(56688L));
+        assertThat(relation.getMembersCount(), is(4));
+        assertThat(relation.getMembers().get(0).getMemberId(), is(294942404L));
+        assertThat(relation.getMembers().get(0).getMemberType(), is(OsmPrimitiveType.NODE));
+        assertThat(relation.getMembers().get(0).getRole(), is(""));
+        assertThat(relation.getMembers().get(2).getMemberId(), is(4579143L));
+        assertThat(relation.getMembers().get(2).getMemberType(), is(OsmPrimitiveType.WAY));
+        assertThat(relation.getMembers().get(2).getRole(), is("forward"));
+        assertThat(relation.getKeys().size(), is(6));
+    }
 }
