Index: /trunk/data/defaultpresets.xml
===================================================================
--- /trunk/data/defaultpresets.xml	(revision 7170)
+++ /trunk/data/defaultpresets.xml	(revision 7171)
@@ -118,4 +118,5 @@
   value_on: the value to set when checked (default is "yes")
   value_off: the value to set when unchecked (default is "no")
+  disable_off: whether the off value is disabled in the dialog, i.e., only unset or yes are provided
   match: none/key/key!/keyvalue (default is "none", see below for more information)
 
@@ -172,8 +173,8 @@
     </chunk>
     <chunk id="highway_yesno_incline">
-        <check key="bridge" text="Bridge" />
-        <check key="tunnel" text="Tunnel" />
-        <check key="cutting" text="Cutting" />
-        <check key="embankment" text="Embankment" />
+        <check key="bridge" text="Bridge" disable_off="true" />
+        <check key="tunnel" text="Tunnel" disable_off="true" />
+        <check key="cutting" text="Cutting" disable_off="true" />
+        <check key="embankment" text="Embankment" disable_off="true" />
         <combo key="incline" text="Incline" values="10%,-10%,10°,-10°,up,down"/>
     </chunk>
@@ -380,8 +381,8 @@
                 <checkgroup columns="4">
                     <check key="oneway" text="Oneway" default="on" />
-                    <check key="bridge" text="Bridge" />
-                    <check key="tunnel" text="Tunnel" />
-                    <check key="cutting" text="Cutting" />
-                    <check key="embankment" text="Embankment" />
+                    <check key="bridge" text="Bridge" disable_off="true" />
+                    <check key="tunnel" text="Tunnel" disable_off="true" />
+                    <check key="cutting" text="Cutting" disable_off="true" />
+                    <check key="embankment" text="Embankment" disable_off="true" />
                     <check key="lit" text="Lit" />
                     <check key="toll" text="Toll" />
@@ -404,8 +405,8 @@
                 <checkgroup columns="4">
                     <check key="oneway" text="Oneway" default="on" />
-                    <check key="bridge" text="Bridge" />
-                    <check key="tunnel" text="Tunnel" />
-                    <check key="cutting" text="Cutting" />
-                    <check key="embankment" text="Embankment" />
+                    <check key="bridge" text="Bridge" disable_off="true" />
+                    <check key="tunnel" text="Tunnel" disable_off="true" />
+                    <check key="cutting" text="Cutting" disable_off="true" />
+                    <check key="embankment" text="Embankment" disable_off="true" />
                     <check key="lit" text="Lit" />
                     <check key="toll" text="Toll" />
@@ -432,8 +433,8 @@
                     <check key="oneway" text="Oneway" default="on" />
                     <check key="motorroad" text="Motorroad" default="on" />
-                    <check key="bridge" text="Bridge" />
-                    <check key="tunnel" text="Tunnel" />
-                    <check key="cutting" text="Cutting" />
-                    <check key="embankment" text="Embankment" />
+                    <check key="bridge" text="Bridge" disable_off="true" />
+                    <check key="tunnel" text="Tunnel" disable_off="true" />
+                    <check key="cutting" text="Cutting" disable_off="true" />
+                    <check key="embankment" text="Embankment" disable_off="true" />
                     <check key="lit" text="Lit" />
                     <check key="toll" text="Toll" />
@@ -457,8 +458,8 @@
                     <check key="oneway" text="Oneway" default="on" />
                     <check key="motorroad" text="Motorroad" default="on" />
-                    <check key="bridge" text="Bridge" />
-                    <check key="tunnel" text="Tunnel" />
-                    <check key="cutting" text="Cutting" />
-                    <check key="embankment" text="Embankment" />
+                    <check key="bridge" text="Bridge" disable_off="true" />
+                    <check key="tunnel" text="Tunnel" disable_off="true" />
+                    <check key="cutting" text="Cutting" disable_off="true" />
+                    <check key="embankment" text="Embankment" disable_off="true" />
                     <check key="lit" text="Lit" />
                     <check key="toll" text="Toll" />
@@ -2630,6 +2631,6 @@
             <key key="public_transport" value="station" />
             <text key="name" text="Name" />
-            <check key="area" text="Area" />
-            <check key="building" text="Building" />
+            <check key="area" text="Area" disable_off="true" />
+            <check key="building" text="Building" disable_off="true" />
             <text key="operator" text="Operator" />
             <text key="network" text="Network" />
Index: /trunk/data/tagging-preset.xsd
===================================================================
--- /trunk/data/tagging-preset.xsd	(revision 7170)
+++ /trunk/data/tagging-preset.xsd	(revision 7171)
@@ -247,4 +247,5 @@
 		<attribute name="value_on" type="string" />
 		<attribute name="value_off" type="string" />
+        <attribute name="disable_off" type="boolean" />
 		<attribute name="match" type="tns:match" />
 
Index: /trunk/src/org/openstreetmap/josm/gui/tagging/TaggingPresetItems.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/gui/tagging/TaggingPresetItems.java	(revision 7170)
+++ /trunk/src/org/openstreetmap/josm/gui/tagging/TaggingPresetItems.java	(revision 7171)
@@ -799,4 +799,5 @@
         public String value_on = OsmUtils.trueval;
         public String value_off = OsmUtils.falseval;
+        public boolean disable_off = false;
         public boolean default_ = false; // only used for tagless objects
 
@@ -808,5 +809,6 @@
 
             // find out if our key is already used in the selection.
-            Usage usage = determineBooleanUsage(sel, key);
+            final Usage usage = determineBooleanUsage(sel, key);
+            final String oneValue = usage.values.isEmpty() ? null : usage.values.last();
             def = default_;
 
@@ -819,8 +821,4 @@
             }
 
-            String oneValue = null;
-            for (String s : usage.values) {
-                oneValue = s;
-            }
             if (usage.values.size() < 2 && (oneValue == null || value_on.equals(oneValue) || value_off.equals(oneValue))) {
                 if (def && !PROP_FILL_DEFAULT.get()) {
@@ -834,15 +832,11 @@
                 // all selected objects share the same value which is either true or false or unset,
                 // we can display a standard check box.
-                initialState = value_on.equals(oneValue) ?
-                        QuadStateCheckBox.State.SELECTED :
-                            value_off.equals(oneValue) ?
-                                    QuadStateCheckBox.State.NOT_SELECTED :
-                                        def ? QuadStateCheckBox.State.SELECTED
-                                                : QuadStateCheckBox.State.UNSET;
-                check = new QuadStateCheckBox(locale_text, initialState,
-                        new QuadStateCheckBox.State[] {
-                        QuadStateCheckBox.State.SELECTED,
-                        QuadStateCheckBox.State.NOT_SELECTED,
-                        QuadStateCheckBox.State.UNSET });
+                initialState = value_on.equals(oneValue)
+                        ? QuadStateCheckBox.State.SELECTED
+                        : value_off.equals(oneValue)
+                        ? QuadStateCheckBox.State.NOT_SELECTED
+                        : def
+                        ? QuadStateCheckBox.State.SELECTED
+                        : QuadStateCheckBox.State.UNSET;
             } else {
                 def = false;
@@ -851,11 +845,16 @@
                 // in "partial" state.
                 initialState = QuadStateCheckBox.State.PARTIAL;
-                check = new QuadStateCheckBox(locale_text, QuadStateCheckBox.State.PARTIAL,
-                        new QuadStateCheckBox.State[] {
-                        QuadStateCheckBox.State.PARTIAL,
-                        QuadStateCheckBox.State.SELECTED,
-                        QuadStateCheckBox.State.NOT_SELECTED,
-                        QuadStateCheckBox.State.UNSET });
-            }
+            }
+
+            final List<QuadStateCheckBox.State> allowedStates = new ArrayList<>(4);
+            if (QuadStateCheckBox.State.PARTIAL.equals(initialState))
+                allowedStates.add(QuadStateCheckBox.State.PARTIAL);
+            allowedStates.add(QuadStateCheckBox.State.SELECTED);
+            if (!disable_off || value_off.equals(oneValue))
+                allowedStates.add(QuadStateCheckBox.State.NOT_SELECTED);
+            allowedStates.add(QuadStateCheckBox.State.UNSET);
+            check = new QuadStateCheckBox(locale_text, initialState,
+                    allowedStates.toArray(new QuadStateCheckBox.State[allowedStates.size()]));
+
             p.add(check, GBC.eol().fill(GBC.HORIZONTAL));
             return true;
@@ -881,5 +880,5 @@
         @Override
         public Collection<String> getValues() {
-            return Arrays.asList(value_on, value_off);
+            return disable_off ? Arrays.asList(value_on) : Arrays.asList(value_on, value_off);
         }
 
