Index: build.xml
===================================================================
--- build.xml	(revision 6136)
+++ build.xml	(working copy)
@@ -184,8 +184,9 @@
         <jacoco:coverage destfile="${test.dir}/jacoco.exec">
             <junit printsummary="yes" fork="true" forkmode="once">
                 <sysproperty key="josm.home" value="${test.dir}/config/unit-josm.home"/>
+                <sysproperty key="josm.test.data" value="${test.dir}/data"/>
                 <sysproperty key="java.awt.headless" value="true"/>
-            <sysproperty key="suppressPermanentFailure" value="${suppressPermanentFailure}"/>
+                <sysproperty key="suppressPermanentFailure" value="${suppressPermanentFailure}"/>
                 <classpath>
                     <path refid="test.classpath"/>
                     <pathelement path="${test.dir}/build"/>
Index: test/data/regress/8954/preset.xml
===================================================================
--- test/data/regress/8954/preset.xml	(revision 0)
+++ test/data/regress/8954/preset.xml	(working copy)
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<presets xmlns="http://josm.openstreetmap.de/tagging-preset-1.0">
+    <item name="ItemName" type="node">
+        <check key="foo" text="Foo" default="off" />
+    </item>
+</presets>
Index: test/unit/org/openstreetmap/josm/gui/tagging/TaggingPresetReaderTest.java
===================================================================
--- test/unit/org/openstreetmap/josm/gui/tagging/TaggingPresetReaderTest.java	(revision 0)
+++ test/unit/org/openstreetmap/josm/gui/tagging/TaggingPresetReaderTest.java	(working copy)
@@ -0,0 +1,66 @@
+// License: GPL. For details, see LICENSE file.
+package org.openstreetmap.josm.gui.tagging;
+
+import java.io.IOException;
+import java.util.Collection;
+
+import org.junit.Assert;
+import org.junit.BeforeClass;
+import org.junit.Test;
+import org.openstreetmap.josm.Main;
+import org.openstreetmap.josm.data.Preferences;
+import org.xml.sax.SAXException;
+
+/**
+ * Unit tests of {@link TaggingPresetReader} class.
+ */
+public class TaggingPresetReaderTest {
+    /**
+     * path to test data root directory
+     */
+    private static String testdataroot;
+    
+    @BeforeClass
+    public static void setUpClass() {
+        Main.pref = new Preferences();
+        testdataroot = System.getProperty("josm.test.data");
+        if (testdataroot == null || testdataroot.isEmpty()) {
+            testdataroot = "test/data";
+            System.out.println("System property josm.test.data is not set, using '" + testdataroot + "'");
+        }
+    }
+
+    /**
+     * Gets path to test data directory for given ticketid.
+     * @param ticketid 
+     * @return 
+     */
+    protected static String getRegressionDataDir(int ticketid) {
+        return testdataroot + "/regress/" + ticketid;
+    }
+
+    /**
+     * Gets path to given file in test data directory for given ticketid.
+     * @param ticketid
+     * @param filename
+     * @return 
+     */
+    protected static String getRegressionDataFile(int ticketid, String filename) {
+        return getRegressionDataDir(ticketid) + '/' + filename;
+    }
+
+    /**
+     * #8954 - last checkbox in the preset is not added
+     */
+    @Test
+    public void test8954() throws SAXException, IOException {
+        String presetfile = getRegressionDataFile(8954, "preset.xml");
+        final Collection<TaggingPreset> presets = TaggingPresetReader.readAll(presetfile, false);
+        Assert.assertEquals("Number of preset items", 1, presets.size());
+        final TaggingPreset preset = presets.iterator().next();
+        Assert.assertEquals("Number of entries", 1, preset.data.size());
+        final TaggingPresetItem item = preset.data.get(0);
+        Assert.assertTrue("Entry is not checkbox", item instanceof TaggingPresetItems.Check);
+    }
+
+}
