diff --git a/data/defaultpresets.xml b/data/defaultpresets.xml
index 57d4539..6376227 100644
--- a/data/defaultpresets.xml
+++ b/data/defaultpresets.xml
@@ -117,6 +117,7 @@ check: checkbox
   default: ticked on/off (default is "off")
   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)
 
 role: type to specify possible roles in relations
@@ -171,10 +172,10 @@ Note that for a match, at least one positive and no negative is required.
         <reference ref="surface" />
     </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>
     <chunk id="highway_yesno_incline_oneway">
@@ -379,10 +380,10 @@ Note that for a match, at least one positive and no negative is required.
                 <reference ref="highway_base" />
                 <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" />
                 </checkgroup>
@@ -403,10 +404,10 @@ Note that for a match, at least one positive and no negative is required.
                 <reference ref="highway_base" />
                 <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" />
                 </checkgroup>
@@ -431,10 +432,10 @@ Note that for a match, at least one positive and no negative is required.
                 <checkgroup columns="4">
                     <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" />
                 </checkgroup>
@@ -455,11 +456,10 @@ Note that for a match, at least one positive and no negative is required.
                 <reference ref="highway_base" />
                 <checkgroup columns="4">
                     <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" />
                 </checkgroup>
@@ -2629,8 +2629,8 @@ Note that for a match, at least one positive and no negative is required.
             <space />
             <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" />
         </item>
diff --git a/data/tagging-preset.xsd b/data/tagging-preset.xsd
index 2ab4de5..df890d4 100644
--- a/data/tagging-preset.xsd
+++ b/data/tagging-preset.xsd
@@ -246,6 +246,7 @@
 		<attribute name="default" type="tns:check_default" />
 		<attribute name="value_on" type="string" />
 		<attribute name="value_off" type="string" />
+        <attribute name="disable_off" type="boolean" />
 		<attribute name="match" type="tns:match" />
 
 		<attribute name="name" use="prohibited" />
diff --git a/src/org/openstreetmap/josm/gui/tagging/TaggingPresetItems.java b/src/org/openstreetmap/josm/gui/tagging/TaggingPresetItems.java
index d08f784..9a2c6af 100644
--- a/src/org/openstreetmap/josm/gui/tagging/TaggingPresetItems.java
+++ b/src/org/openstreetmap/josm/gui/tagging/TaggingPresetItems.java
@@ -798,6 +798,7 @@ public final class TaggingPresetItems {
         public String locale_text;
         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
 
         private QuadStateCheckBox check;
@@ -807,7 +808,8 @@ public final class TaggingPresetItems {
         @Override public boolean addToPanel(JPanel p, Collection<OsmPrimitive> sel, boolean presetInitiallyMatches) {
 
             // 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_;
 
             if(locale_text == null) {
@@ -818,10 +820,6 @@ public final class TaggingPresetItems {
                 }
             }
 
-            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()) {
                     // default is set and filling default values feature is disabled - check if all primitives are untagged
@@ -833,30 +831,31 @@ public final class TaggingPresetItems {
 
                 // 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;
                 // the objects have different values, or one or more objects have something
                 // else than true/false. we display a quad-state check box
                 // 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;
         }
@@ -880,7 +879,7 @@ public final class TaggingPresetItems {
 
         @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);
         }
 
         @Override
