diff --git a/data/defaultpresets.xml b/data/defaultpresets.xml
index 2d4cb19..8dae8f3 100755
--- a/data/defaultpresets.xml
+++ b/data/defaultpresets.xml
@@ -146,6 +146,21 @@ the tags of an OSM object fit into this preset.
  - keyvalue: positive if key and value matches, negative otherwise
 Note that for a match, at least one positive and no negative is required.
 -->
+  <chunk id="highway_base">
+    <combo key="layer" text="Layer" values="5,4,3,2,1,0,-1,-2,-3,-4,-5" length="3" />
+    <combo key="lanes" text="Lanes" values="1,2,3,4,5" length="3" />
+    <text key="maxspeed" text="Max. speed (km/h)" />
+    <combo key="surface" text="Surface" values="paved,unpaved,asphalt,concrete,metal,wood,paving_stones,cobblestone,gravel,pebblestone,compacted,grass_paver,grass,sand,ground" />
+  </chunk>
+  <chunk id="barrier">
+    <optional text="Allowed traffic:">
+      <check key="foot" text="Foot" default="on" />
+      <check key="bicycle" text="Bicycle" default="on" />
+      <check key="horse" text="Horse" default="off" />
+      <check key="motorcycle" text="Motorcycle" default="off" />
+      <check key="motorcar" text="Motorcar" default="off" />
+    </optional>
+  </chunk>
   <group name="Highways" icon="presets/way_secondary.png">
     <group name="Streets" icon="presets/way_secondary.png">
         <item name="Motorway" icon="presets/motorway.png" type="way">
@@ -165,10 +180,7 @@ Note that for a match, at least one positive and no negative is required.
             <text key="ref" text="Reference" />
             <optional>
                 <text key="name" text="Name" />
-                <combo key="layer" text="Layer" values="5,4,3,2,1,0,-1,-2,-3,-4,-5" length="3" />
-                <combo key="lanes" text="Lanes" values="1,2,3,4,5" length="3" />
-                <text key="maxspeed" text="Max. speed (km/h)" />
-                <combo key="surface" text="Surface" values="paved,unpaved,asphalt,concrete,metal,wood,paving_stones,cobblestone,gravel,pebblestone,compacted,grass_paver,grass,sand,ground" />
+                <reference ref="highway_base" />
                 <checkgroup columns="4">
                     <check key="oneway" text="Oneway" default="on" />
                     <check key="bridge" text="Bridge" default="off" />
@@ -193,10 +205,7 @@ Note that for a match, at least one positive and no negative is required.
             <label text="Edit Motorway Link" />
             <key key="highway" value="motorway_link" />
             <optional>
-                <combo key="layer" text="Layer" values="5,4,3,2,1,0,-1,-2,-3,-4,-5" length="3" />
-                <combo key="lanes" text="Lanes" values="1,2,3,4,5" length="3" />
-                <text key="maxspeed" text="Max. speed (km/h)" />
-                <combo key="surface" text="Surface" values="paved,unpaved,asphalt,concrete,metal,wood,paving_stones,cobblestone,gravel,pebblestone,compacted,grass_paver,grass,sand,ground" />
+                <reference ref="highway_base" />
                 <checkgroup columns="4">
                     <check key="oneway" text="Oneway" default="on" />
                     <check key="bridge" text="Bridge" />
@@ -224,10 +233,7 @@ Note that for a match, at least one positive and no negative is required.
             <text key="ref" text="Reference" />
             <optional>
                 <text key="name" text="Name" />
-                <combo key="layer" text="Layer" values="5,4,3,2,1,0,-1,-2,-3,-4,-5" length="3" />
-                <combo key="lanes" text="Lanes" values="1,2,3,4,5" length="3" />
-                <text key="maxspeed" text="Max. speed (km/h)" />
-                <combo key="surface" text="Surface" values="paved,unpaved,asphalt,concrete,metal,wood,paving_stones,cobblestone,gravel,pebblestone,compacted,grass_paver,grass,sand,ground" />
+                <reference ref="highway_base" />
                 <checkgroup columns="4">
                     <check key="oneway" text="Oneway" default="on" />
                     <check key="motorroad" text="Motorroad" default="on" />
@@ -253,10 +259,7 @@ Note that for a match, at least one positive and no negative is required.
             <key key="highway" value="trunk_link" />
             <text key="ref" text="Reference" />
             <optional>
-                <combo key="layer" text="Layer" values="5,4,3,2,1,0,-1,-2,-3,-4,-5" length="3" />
-                <combo key="lanes" text="Lanes" values="1,2,3,4,5" length="3" />
-                <text key="maxspeed" text="Max. speed (km/h)" />
-                <combo key="surface" text="Surface" values="paved,unpaved,asphalt,concrete,metal,wood,paving_stones,cobblestone,gravel,pebblestone,compacted,grass_paver,grass,sand,ground" />
+                <reference ref="highway_base" />
                 <checkgroup columns="4">
                     <check key="oneway" text="Oneway" default="on" />
                     <check key="motorroad" text="Motorroad" default="on" />
@@ -286,10 +289,7 @@ Note that for a match, at least one positive and no negative is required.
             <text key="ref" text="Reference" />
             <optional>
                 <text key="name" text="Name" />
-                <combo key="layer" text="Layer" values="5,4,3,2,1,0,-1,-2,-3,-4,-5" length="3" />
-                <combo key="lanes" text="Lanes" values="1,2,3,4,5" length="3" />
-                <text key="maxspeed" text="Max. speed (km/h)" />
-                <combo key="surface" text="Surface" values="paved,unpaved,asphalt,concrete,metal,wood,paving_stones,cobblestone,gravel,pebblestone,compacted,grass_paver,grass,sand,ground" />
+                <reference ref="highway_base" />
                 <check key="oneway" text="Oneway" default="off" />
                 <check key="motorroad" text="Motorroad" default="off" />
                 <check key="bridge" text="Bridge" default="off" />
@@ -311,10 +311,7 @@ Note that for a match, at least one positive and no negative is required.
             <label text="Edit Primary Link" />
             <key key="highway" value="primary_link" />
             <optional>
-                <combo key="layer" text="Layer" values="5,4,3,2,1,0,-1,-2,-3,-4,-5" length="3" />
-                <combo key="lanes" text="Lanes" values="1,2,3,4,5" length="3" />
-                <text key="maxspeed" text="Max. speed (km/h)" />
-                <combo key="surface" text="Surface" values="paved,unpaved,asphalt,concrete,metal,wood,paving_stones,cobblestone,gravel,pebblestone,compacted,grass_paver,grass,sand,ground" />
+                <reference ref="highway_base" />
                 <check key="oneway" text="Oneway" default="off" />
                 <check key="motorroad" text="Motorroad" default="off" />
                 <check key="bridge" text="Bridge" default="off" />
@@ -342,10 +339,7 @@ Note that for a match, at least one positive and no negative is required.
             <text key="ref" text="Reference" />
             <optional>
                 <text key="name" text="Name" />
-                <combo key="layer" text="Layer" values="5,4,3,2,1,0,-1,-2,-3,-4,-5" length="3" />
-                <combo key="lanes" text="Lanes" values="1,2,3,4,5" length="3" />
-                <text key="maxspeed" text="Max. speed (km/h)" />
-                <combo key="surface" text="Surface" values="paved,unpaved,asphalt,concrete,metal,wood,paving_stones,cobblestone,gravel,pebblestone,compacted,grass_paver,grass,sand,ground" />
+                <reference ref="highway_base" />
                 <check key="oneway" text="Oneway" default="off" />
                 <check key="bridge" text="Bridge" default="off" />
                 <check key="tunnel" text="Tunnel" default="off" />
@@ -366,10 +360,7 @@ Note that for a match, at least one positive and no negative is required.
             <label text="Edit Secondary Link" />
             <key key="highway" value="secondary_link" />
             <optional>
-                <combo key="layer" text="Layer" values="5,4,3,2,1,0,-1,-2,-3,-4,-5" length="3" />
-                <combo key="lanes" text="Lanes" values="1,2,3,4,5" length="3" />
-                <text key="maxspeed" text="Max. speed (km/h)" />
-                <combo key="surface" text="Surface" values="paved,unpaved,asphalt,concrete,metal,wood,paving_stones,cobblestone,gravel,pebblestone,compacted,grass_paver,grass,sand,ground" />
+                <reference ref="highway_base" />
                 <check key="oneway" text="Oneway" default="off" />
                 <check key="bridge" text="Bridge" default="off" />
                 <check key="tunnel" text="Tunnel" default="off" />
@@ -397,10 +388,7 @@ Note that for a match, at least one positive and no negative is required.
             <text key="ref" text="Reference" />
             <optional>
                 <text key="name" text="Name" />
-                <combo key="layer" text="Layer" values="5,4,3,2,1,0,-1,-2,-3,-4,-5" length="3" />
-                <combo key="lanes" text="Lanes" values="1,2,3,4,5" length="3" />
-                <text key="maxspeed" text="Max. speed (km/h)" />
-                <combo key="surface" text="Surface" values="paved,unpaved,asphalt,concrete,metal,wood,paving_stones,cobblestone,gravel,pebblestone,compacted,grass_paver,grass,sand,ground" />
+                <reference ref="highway_base" />
                 <check key="oneway" text="Oneway" default="off" />
                 <check key="bridge" text="Bridge" default="off" />
                 <check key="tunnel" text="Tunnel" default="off" />
@@ -421,10 +409,7 @@ Note that for a match, at least one positive and no negative is required.
             <label text="Edit Tertiary Link" />
             <key key="highway" value="tertiary_link" />
             <optional>
-                <combo key="layer" text="Layer" values="5,4,3,2,1,0,-1,-2,-3,-4,-5" length="3" />
-                <combo key="lanes" text="Lanes" values="1,2,3,4,5" length="3" />
-                <text key="maxspeed" text="Max. speed (km/h)" />
-                <combo key="surface" text="Surface" values="paved,unpaved,asphalt,concrete,metal,wood,paving_stones,cobblestone,gravel,pebblestone,compacted,grass_paver,grass,sand,ground" />
+                <reference ref="highway_base" />
                 <check key="oneway" text="Oneway" default="off" />
                 <check key="bridge" text="Bridge" default="off" />
                 <check key="tunnel" text="Tunnel" default="off" />
@@ -449,10 +434,7 @@ Note that for a match, at least one positive and no negative is required.
             <optional>
                 <text key="name" text="Name" />
                 <text key="ref" text="Reference" />
-                <combo key="layer" text="Layer" values="5,4,3,2,1,0,-1,-2,-3,-4,-5" length="3" />
-                <combo key="lanes" text="Lanes" values="1,2,3,4,5" length="3" />
-                <text key="maxspeed" text="Max. speed (km/h)" />
-                <combo key="surface" text="Surface" values="paved,unpaved,asphalt,concrete,metal,wood,paving_stones,cobblestone,gravel,pebblestone,compacted,grass_paver,grass,sand,ground" />
+                <reference ref="highway_base" />
                 <check key="oneway" text="Oneway" default="off" />
                 <check key="bridge" text="Bridge" default="off" />
                 <check key="tunnel" text="Tunnel" default="off" />
@@ -479,10 +461,7 @@ Note that for a match, at least one positive and no negative is required.
             <key key="highway" value="residential" />
             <text key="name" text="Name" />
             <optional>
-                <combo key="layer" text="Layer" values="5,4,3,2,1,0,-1,-2,-3,-4,-5" length="3" />
-                <combo key="lanes" text="Lanes" values="1,2,3,4,5" length="3" />
-                <text key="maxspeed" text="Max. speed (km/h)" />
-                <combo key="surface" text="Surface" values="paved,unpaved,asphalt,concrete,metal,wood,paving_stones,cobblestone,gravel,pebblestone,compacted,grass_paver,grass,sand,ground" />
+                <reference ref="highway_base" />
                 <check key="oneway" text="Oneway" default="off" />
                 <check key="bridge" text="Bridge" default="off" />
                 <check key="tunnel" text="Tunnel" default="off" />
@@ -591,10 +570,7 @@ Note that for a match, at least one positive and no negative is required.
             <combo key="service" text="Service way type" values="alley,driveway,parking_aisle,drive-through" />
             <optional>
                 <text key="name" text="Name" />
-                <combo key="layer" text="Layer" values="5,4,3,2,1,0,-1,-2,-3,-4,-5" length="3" />
-                <combo key="lanes" text="Lanes" values="1,2,3,4,5" length="3" />
-                <text key="maxspeed" text="Max. speed (km/h)" />
-                <combo key="surface" text="Surface" values="paved,unpaved,asphalt,concrete,metal,wood,paving_stones,cobblestone,gravel,pebblestone,compacted,grass_paver,grass,sand,ground" />
+                <reference ref="highway_base" />
                 <check key="oneway" text="Oneway" default="off" />
                 <check key="bridge" text="Bridge" default="off" />
                 <check key="tunnel" text="Tunnel" default="off" />
@@ -637,10 +613,7 @@ Note that for a match, at least one positive and no negative is required.
             <key key="highway" value="road" />
             <optional>
                 <text key="name" text="Name" />
-                <combo key="layer" text="Layer" values="5,4,3,2,1,0,-1,-2,-3,-4,-5" length="3" />
-                <combo key="lanes" text="Lanes" values="1,2,3,4,5" length="3" />
-                <text key="maxspeed" text="Max. speed (km/h)" />
-                <combo key="surface" text="Surface" values="paved,unpaved,asphalt,concrete,metal,wood,paving_stones,cobblestone,gravel,pebblestone,compacted,grass_paver,grass,sand,ground" />
+                <reference ref="highway_base" />
                 <check key="oneway" text="Oneway" default="off" />
                 <check key="bridge" text="Bridge" default="off" />
                 <check key="tunnel" text="Tunnel" default="off" />
@@ -663,10 +636,7 @@ Note that for a match, at least one positive and no negative is required.
             <key key="highway" value="construction" />
             <optional>
                 <text key="name" text="Name" />
-                <combo key="layer" text="Layer" values="5,4,3,2,1,0,-1,-2,-3,-4,-5" length="3" />
-                <combo key="lanes" text="Lanes" values="1,2,3,4,5" length="3" />
-                <text key="maxspeed" text="Max. speed (km/h)" />
-                <combo key="surface" text="Surface" values="paved,unpaved,asphalt,concrete,metal,wood,paving_stones,cobblestone,gravel,pebblestone,compacted,grass_paver,grass,sand,ground" />
+                <reference ref="highway_base" />
                 <check key="oneway" text="Oneway" default="off" />
                 <check key="bridge" text="Bridge" default="off" />
                 <check key="tunnel" text="Tunnel" default="off" />
@@ -1447,13 +1417,7 @@ Note that for a match, at least one positive and no negative is required.
                   ru.href="http://wiki.openstreetmap.org/wiki/RU:Tag:barrier=entrance" />
             <label text="Edit Entrance (barrier opening)" />
             <key key="barrier" value="entrance" />
-            <optional text="Allowed traffic:">
-                <check key="foot" text="Foot" default="on" />
-                <check key="bicycle" text="Bicycle" default="on" />
-                <check key="horse" text="Horse" default="off" />
-                <check key="motorcycle" text="Motorcycle" default="off" />
-                <check key="motorcar" text="Motorcar" default="off" />
-            </optional>
+            <reference ref="barrier" />
             <optional>
                 <text key="maxwidth" text="Max. width (meters)" length="7" />
             </optional>
@@ -1468,13 +1432,7 @@ Note that for a match, at least one positive and no negative is required.
                   ru.href="http://wiki.openstreetmap.org/wiki/RU:Tag:barrier=gate" />
             <label text="Edit Gate" />
             <key key="barrier" value="gate" />
-            <optional text="Allowed traffic:">
-                <check key="foot" text="Foot" default="on" />
-                <check key="bicycle" text="Bicycle" default="on" />
-                <check key="horse" text="Horse" default="off" />
-                <check key="motorcycle" text="Motorcycle" default="off" />
-                <check key="motorcar" text="Motorcar" default="off" />
-            </optional>
+            <reference ref="barrier" />
             <optional>
                 <text key="maxwidth" text="Max. width (meters)" length="7" />
             </optional>
@@ -1488,13 +1446,7 @@ Note that for a match, at least one positive and no negative is required.
                   ru.href="http://wiki.openstreetmap.org/wiki/RU:Tag:barrier=lift_gate" />
             <label text="Edit Lift Gate" />
             <key key="barrier" value="lift_gate" />
-            <optional text="Allowed traffic:">
-                <check key="foot" text="Foot" default="on" />
-                <check key="bicycle" text="Bicycle" default="on" />
-                <check key="horse" text="Horse" default="off" />
-                <check key="motorcycle" text="Motorcycle" default="off" />
-                <check key="motorcar" text="Motorcar" default="off" />
-            </optional>
+            <reference ref="barrier" />
             <optional>
                 <text key="maxwidth" text="Max. width (meters)" length="7" />
             </optional>
@@ -1502,13 +1454,7 @@ Note that for a match, at least one positive and no negative is required.
         <item name="Hampshire Gate" icon="presets/empty.png" type="node">
             <label text="Edit Hampshire Gate" />
             <key key="barrier" value="hampshire_gate" />
-            <optional text="Allowed traffic:">
-                <check key="foot" text="Foot" default="on" />
-                <check key="bicycle" text="Bicycle" default="on" />
-                <check key="horse" text="Horse" default="off" />
-                <check key="motorcycle" text="Motorcycle" default="off" />
-                <check key="motorcar" text="Motorcar" default="off" />
-            </optional>
+            <reference ref="barrier" />
             <optional>
                 <text key="maxwidth" text="Max. width (meters)" length="7" />
             </optional>
@@ -1516,13 +1462,7 @@ Note that for a match, at least one positive and no negative is required.
         <item name="Bump Gate" icon="presets/empty.png" type="node">
             <label text="Edit Bump Gate" />
             <key key="barrier" value="bump_gate" />
-            <optional text="Allowed traffic:">
-                <check key="foot" text="Foot" default="on" />
-                <check key="bicycle" text="Bicycle" default="on" />
-                <check key="horse" text="Horse" default="off" />
-                <check key="motorcycle" text="Motorcycle" default="off" />
-                <check key="motorcar" text="Motorcar" default="off" />
-            </optional>
+            <reference ref="barrier" />
             <optional>
                 <text key="maxwidth" text="Max. width (meters)" length="7" />
             </optional>
@@ -1544,13 +1484,7 @@ Note that for a match, at least one positive and no negative is required.
                   pl.href="http://wiki.openstreetmap.org/wiki/Pl:Tag:barrier=chain" />
             <label text="Edit Chain" />
             <key key="barrier" value="chain" />
-            <optional text="Allowed traffic:">
-                <check key="foot" text="Foot" default="on" />
-                <check key="bicycle" text="Bicycle" default="on" />
-                <check key="horse" text="Horse" default="off" />
-                <check key="motorcycle" text="Motorcycle" default="off" />
-                <check key="motorcar" text="Motorcar" default="off" />
-            </optional>
+            <reference ref="barrier" />
             <optional>
                 <text key="maxwidth" text="Max. width (meters)" length="7" />
             </optional>
@@ -1584,13 +1518,7 @@ Note that for a match, at least one positive and no negative is required.
             <link href="http://wiki.openstreetmap.org/wiki/Tag:highway=sally_port" />
             <label text="Edit Sally Port" />
             <key key="barrier" value="sally_port" />
-            <optional text="Allowed traffic:">
-                <check key="foot" text="Foot" default="on" />
-                <check key="bicycle" text="Bicycle" default="on" />
-                <check key="horse" text="Horse" default="off" />
-                <check key="motorcycle" text="Motorcycle" default="off" />
-                <check key="motorcar" text="Motorcar" default="off" />
-            </optional>
+            <reference ref="barrier" />
             <optional>
                 <text key="maxheight" text="Max. height (meters)" length="7" />
                 <text key="maxwidth" text="Max. width (meters)" length="7" />
@@ -1605,7 +1533,7 @@ Note that for a match, at least one positive and no negative is required.
                   fr.href="http://wiki.openstreetmap.org/wiki/FR:Key:tunnel"
                   it.href="http://wiki.openstreetmap.org/wiki/IT:Key:tunnel"
                   ja.href="http://wiki.openstreetmap.org/wiki/JA:Key:tunnel"
-                  pt_BR.href="http://wiki.openstreetmap.org/wiki/Pt-br:Key:tunnel"
+                  pt_BR.href="http://wiki.openstreetmap.org/wiki/PtsetMinimumSize-br:Key:tunnel"
                   ru.href="http://wiki.openstreetmap.org/wiki/RU:Key:tunnel"
                   uk.href="http://wiki.openstreetmap.org/wiki/Uk:Key:tunnel" />
             <label text="Edit Tunnel" />
diff --git a/data/tagging-preset.xsd b/data/tagging-preset.xsd
index 1ec6353..b7b23cb 100644
--- a/data/tagging-preset.xsd
+++ b/data/tagging-preset.xsd
@@ -8,7 +8,16 @@
 		errors, elements have specified prohibited attributes -->
 
 	<element name="annotations" type="tns:root" />
-	<element name="presets" type="tns:root" />
+	<element name="presets" type="tns:root">
+		<unique name="chunk_id">
+			<selector xpath=".//tns:chunk"/>
+			<field xpath="@id"/>
+		</unique>
+		<keyref name="chunk_ref" refer="tns:chunk_id">
+			<selector xpath=".//tns:reference"/>
+			<field xpath="@ref"/>
+		</keyref>
+	</element>
 
 	<complexType name="root">
 		<complexContent>
@@ -27,6 +36,7 @@
 	<complexType name="group-parent">
 		<sequence>
 			<choice minOccurs="1" maxOccurs="unbounded">
+				<element name="chunk" type="tns:chunk"/>
 				<element name="group" type="tns:group" />
 				<element name="item" type="tns:item" />
 				<element name="separator" type="tns:separator" />
@@ -74,6 +84,21 @@
 		<attribute name="text_context" type="string" />
 	</complexType>
 
+    <complexType name="chunk">
+        <sequence>
+            <choice minOccurs="1" maxOccurs="unbounded">
+                <group ref="tns:optional_elements" />
+                <element name="key" type="tns:key" />
+                <element name="optional" type="tns:optional" minOccurs="0" />
+            </choice>
+        </sequence>
+        <attribute name="id" type="ID" use="required" />
+    </complexType>
+
+    <complexType name="reference">
+        <attribute name="ref" type="IDREF" use="required" />
+    </complexType>
+
 	<group name="optional_elements">
 		<choice>
 			<element name="label" type="tns:label" />
@@ -85,6 +110,7 @@
 			<element name="checkgroup" type="tns:checkgroup" />
 			<element name="check" type="tns:check" />
 			<element name="item_separator" type="tns:separator" />
+			<element name="reference" type="tns:reference" />
 		</choice>
 	</group>
 
diff --git a/src/org/openstreetmap/josm/gui/tagging/TaggingPresetReader.java b/src/org/openstreetmap/josm/gui/tagging/TaggingPresetReader.java
index 0efe5fe..87dbb03 100644
--- a/src/org/openstreetmap/josm/gui/tagging/TaggingPresetReader.java
+++ b/src/org/openstreetmap/josm/gui/tagging/TaggingPresetReader.java
@@ -10,9 +10,14 @@ import java.io.InputStream;
 import java.io.InputStreamReader;
 import java.io.Reader;
 import java.io.UnsupportedEncodingException;
+import java.util.ArrayList;
+import java.util.Arrays;
 import java.util.Collection;
+import java.util.HashMap;
+import java.util.Iterator;
 import java.util.LinkedList;
 import java.util.List;
+import java.util.Map;
 
 import javax.swing.JOptionPane;
 
@@ -45,6 +50,20 @@ public final class TaggingPresetReader {
 
         return sources;
     }
+
+    /**
+     * Holds a reference to a chunk of  items/objects.
+     */
+    public static class Chunk {
+        public String id;
+    }
+
+    /**
+     * Holds a reference to an earlier item/object.
+     */
+    public static class Reference {
+        public String ref;
+    }
     
     public static List<TaggingPreset> readAll(Reader in, boolean validate) throws SAXException {
         XmlObjectParser parser = new XmlObjectParser();
@@ -65,12 +84,17 @@ public final class TaggingPresetReader {
         parser.map("key", TaggingPresetItems.Key.class);
         parser.map("list_entry", TaggingPresetItems.PresetListEntry.class);
         parser.map("item_separator", TaggingPresetItems.ItemSeparator.class);
-        
+        parser.mapBoth("chunk", Chunk.class);
+        parser.map("reference", Reference.class);
+
         LinkedList<TaggingPreset> all = new LinkedList<TaggingPreset>();
         TaggingPresetMenu lastmenu = null;
         TaggingPresetItems.Roles lastrole = null;
         final List<TaggingPresetItems.Check> checks = new LinkedList<TaggingPresetItems.Check>();
         List<TaggingPresetItems.PresetListEntry> listEntries = new LinkedList<TaggingPresetItems.PresetListEntry>();
+        final Map<String, List<Object>> byId = new HashMap<String, List<Object>>();
+        String lastId = null;
+        Iterator<Object> lastIdIterator = null;
 
         if (validate) {
             parser.startWithValidation(in, Main.JOSM_WEBSITE+"/tagging-preset-1.0", "resource://data/tagging-preset.xsd");
@@ -78,7 +102,42 @@ public final class TaggingPresetReader {
             parser.start(in);
         }
         while (parser.hasNext()) {
-            Object o = parser.next();
+            final Object o;
+            if (lastIdIterator != null && lastIdIterator.hasNext()) {
+                // obtain elements from lastIdIterator with higher priority
+                o = lastIdIterator.next();
+            } else {
+                o = parser.next();
+            }
+            if (o instanceof Chunk) {
+                if (((Chunk) o).id.equals(lastId)) {
+                    // reset last id on end of object, don't process further
+                    lastId = null;
+                    ((Chunk) o).id = null;
+                    continue;
+                } else if (lastId == null) {
+                    // if preset item contains an id, store a mapping for later usage
+                    lastId = ((Chunk) o).id;
+                    byId.put(lastId, new ArrayList<Object>());
+                    continue;
+                } else {
+                    throw new IllegalStateException("Cannot deal with nested id objects (lastId was expected to be null)");
+                }
+            } else if (lastId != null) {
+                // add object to mapping for later usage
+                byId.get(lastId).add(o);
+                continue;
+            }
+            if (o instanceof Reference) {
+                // if o is a reference, obtain the corresponding objects from the mapping,
+                // and iterate over those before consuming the next element from parser.
+                final String ref = ((Reference) o).ref;
+                if (byId.get(ref) == null) {
+                    throw new SAXException(tr("Reference {0} is being used before it was defined", ref));
+                }
+                lastIdIterator = byId.get(ref).iterator();
+                continue;
+            }
             if (!(o instanceof TaggingPresetItem) && !checks.isEmpty()) {
                 all.getLast().data.addAll(checks);
                 checks.clear();
