Index: trunk/src/org/openstreetmap/josm/data/validation/Test.java
===================================================================
--- trunk/src/org/openstreetmap/josm/data/validation/Test.java	(revision 15639)
+++ trunk/src/org/openstreetmap/josm/data/validation/Test.java	(revision 15640)
@@ -115,4 +115,9 @@
         public TagTest(String name) {
             super(name);
+        }
+
+        @Override
+        public boolean isPrimitiveUsable(OsmPrimitive p) {
+            return super.isPrimitiveUsable(p) && p.isTagged();
         }
 
Index: trunk/src/org/openstreetmap/josm/data/validation/TestError.java
===================================================================
--- trunk/src/org/openstreetmap/josm/data/validation/TestError.java	(revision 15639)
+++ trunk/src/org/openstreetmap/josm/data/validation/TestError.java	(revision 15640)
@@ -85,5 +85,5 @@
          * Sets the error message.
          *
-         * @param message       The the message of this error group
+         * @param message       The message of this error group
          * @param description   The translated description of this error
          * @param descriptionEn The English description (for ignoring errors)
Index: trunk/src/org/openstreetmap/josm/data/validation/tests/ConditionalKeys.java
===================================================================
--- trunk/src/org/openstreetmap/josm/data/validation/tests/ConditionalKeys.java	(revision 15639)
+++ trunk/src/org/openstreetmap/josm/data/validation/tests/ConditionalKeys.java	(revision 15640)
@@ -249,7 +249,5 @@
     @Override
     public void check(OsmPrimitive p) {
-        if (p.isTagged()) {
-            errors.addAll(validatePrimitive(p));
-        }
+        errors.addAll(validatePrimitive(p));
     }
 }
Index: trunk/src/org/openstreetmap/josm/data/validation/tests/MapCSSTagChecker.java
===================================================================
--- trunk/src/org/openstreetmap/josm/data/validation/tests/MapCSSTagChecker.java	(revision 15639)
+++ trunk/src/org/openstreetmap/josm/data/validation/tests/MapCSSTagChecker.java	(revision 15640)
@@ -786,5 +786,5 @@
             addIfNotSimilar(e, errors);
         }
-        if (partialSelection && p.isTagged()) {
+        if (partialSelection) {
             tested.add(p);
         }
Index: trunk/src/org/openstreetmap/josm/data/validation/tests/OpeningHourTest.java
===================================================================
--- trunk/src/org/openstreetmap/josm/data/validation/tests/OpeningHourTest.java	(revision 15639)
+++ trunk/src/org/openstreetmap/josm/data/validation/tests/OpeningHourTest.java	(revision 15640)
@@ -18,5 +18,5 @@
 import org.openstreetmap.josm.data.osm.OsmPrimitive;
 import org.openstreetmap.josm.data.validation.Severity;
-import org.openstreetmap.josm.data.validation.Test;
+import org.openstreetmap.josm.data.validation.Test.TagTest;
 import org.openstreetmap.josm.data.validation.TestError;
 import org.openstreetmap.josm.gui.Notification;
@@ -34,5 +34,5 @@
  * @since 6370
  */
-public class OpeningHourTest extends Test.TagTest {
+public class OpeningHourTest extends TagTest {
 
     /**
@@ -328,9 +328,7 @@
     @Override
     public void check(final OsmPrimitive p) {
-        if (p.isTagged()) {
-            check(p, "opening_hours");
-            check(p, "collection_times");
-            check(p, "service_times");
-        }
+        check(p, "opening_hours");
+        check(p, "collection_times");
+        check(p, "service_times");
     }
 }
Index: trunk/src/org/openstreetmap/josm/data/validation/tests/TagChecker.java
===================================================================
--- trunk/src/org/openstreetmap/josm/data/validation/tests/TagChecker.java	(revision 15639)
+++ trunk/src/org/openstreetmap/josm/data/validation/tests/TagChecker.java	(revision 15640)
@@ -14,4 +14,5 @@
 import java.util.Collection;
 import java.util.Collections;
+import java.util.EnumSet;
 import java.util.HashMap;
 import java.util.HashSet;
@@ -44,4 +45,5 @@
 import org.openstreetmap.josm.gui.tagging.presets.TaggingPresetItem;
 import org.openstreetmap.josm.gui.tagging.presets.TaggingPresetListener;
+import org.openstreetmap.josm.gui.tagging.presets.TaggingPresetType;
 import org.openstreetmap.josm.gui.tagging.presets.TaggingPresets;
 import org.openstreetmap.josm.gui.tagging.presets.items.Check;
@@ -106,4 +108,8 @@
      */
     public static final String PREF_CHECK_FIXMES = PREFIX + ".checkFixmes";
+    /**
+     * The preference key to check presets
+     */
+    public static final String PREF_CHECK_PRESETS_TYPES = PREFIX + ".checkPresetsTypes";
 
     /**
@@ -130,4 +136,8 @@
      */
     public static final String PREF_CHECK_FIXMES_BEFORE_UPLOAD = PREF_CHECK_FIXMES + BEFORE_UPLOAD;
+    /**
+     * The preference key to search for presets - used before upload
+     */
+    public static final String PREF_CHECK_PRESETS_TYPES_BEFORE_UPLOAD = PREF_CHECK_PRESETS_TYPES + BEFORE_UPLOAD;
 
     private static final int MAX_LEVENSHTEIN_DISTANCE = 2;
@@ -138,4 +148,5 @@
     protected boolean checkComplex;
     protected boolean checkFixmes;
+    protected boolean checkPresetsTypes;
 
     protected JCheckBox prefCheckKeys;
@@ -143,5 +154,5 @@
     protected JCheckBox prefCheckComplex;
     protected JCheckBox prefCheckFixmes;
-    protected JCheckBox prefCheckPaint;
+    protected JCheckBox prefCheckPresetsTypes;
 
     protected JCheckBox prefCheckKeysBeforeUpload;
@@ -149,5 +160,5 @@
     protected JCheckBox prefCheckComplexBeforeUpload;
     protected JCheckBox prefCheckFixmesBeforeUpload;
-    protected JCheckBox prefCheckPaintBeforeUpload;
+    protected JCheckBox prefCheckPresetsTypesBeforeUpload;
 
     // CHECKSTYLE.OFF: SingleSpaceSeparator
@@ -168,4 +179,5 @@
     protected static final int MISSPELLED_VALUE_NO_FIX  = 1215;
     protected static final int UNUSUAL_UNICODE_CHAR_VALUE = 1216;
+    protected static final int INVALID_PRESETS_TYPE     = 1217;
     // CHECKSTYLE.ON: SingleSpaceSeparator
 
@@ -578,7 +590,4 @@
     @Override
     public void check(OsmPrimitive p) {
-        if (!p.isTagged())
-            return;
-
         // Just a collection to know if a primitive has been already marked with error
         MultiMap<OsmPrimitive, String> withErrors = new MultiMap<>();
@@ -602,4 +611,17 @@
                         .build());
                 withErrors.put(p, "FIXME");
+            }
+        }
+
+        if (checkPresetsTypes) {
+            for (TaggingPreset tp : TaggingPresets.getMatchingPresets(null, p.getKeys(), false)) {
+                TaggingPresetType presetType = TaggingPresetType.forPrimitive(p);
+                if (!tp.typeMatches(EnumSet.of(presetType))) {
+                    errors.add(TestError.builder(this, Severity.OTHER, INVALID_PRESETS_TYPE)
+                            .message(tr("Wrong presets types"),
+                                    marktr("{0} is not supported by tagging preset: {1}"), tr(presetType.getName()), tp.getLocaleName())
+                            .primitives(p)
+                            .build());
+                }
             }
         }
@@ -881,9 +903,14 @@
             checkFixmes = checkFixmes && Config.getPref().getBoolean(PREF_CHECK_FIXMES_BEFORE_UPLOAD, true);
         }
+
+        checkPresetsTypes = Config.getPref().getBoolean(PREF_CHECK_PRESETS_TYPES, true);
+        if (isBeforeUpload) {
+            checkPresetsTypes = checkPresetsTypes && Config.getPref().getBoolean(PREF_CHECK_PRESETS_TYPES_BEFORE_UPLOAD, true);
+        }
     }
 
     @Override
     public void visit(Collection<OsmPrimitive> selection) {
-        if (checkKeys || checkValues || checkComplex || checkFixmes) {
+        if (checkKeys || checkValues || checkComplex || checkFixmes || checkPresetsTypes) {
             super.visit(selection);
         }
@@ -942,4 +969,12 @@
         prefCheckFixmesBeforeUpload.setSelected(Config.getPref().getBoolean(PREF_CHECK_FIXMES_BEFORE_UPLOAD, true));
         testPanel.add(prefCheckFixmesBeforeUpload, a);
+
+        prefCheckPresetsTypes = new JCheckBox(tr("Check for presets types."), Config.getPref().getBoolean(PREF_CHECK_PRESETS_TYPES, true));
+        prefCheckPresetsTypes.setToolTipText(tr("Validate that objects types are valid checking against presets."));
+        testPanel.add(prefCheckPresetsTypes, GBC.std().insets(20, 0, 0, 0));
+
+        prefCheckPresetsTypesBeforeUpload = new JCheckBox();
+        prefCheckPresetsTypesBeforeUpload.setSelected(Config.getPref().getBoolean(PREF_CHECK_PRESETS_TYPES_BEFORE_UPLOAD, true));
+        testPanel.add(prefCheckPresetsTypesBeforeUpload, a);
     }
 
@@ -963,8 +998,10 @@
         Config.getPref().putBoolean(PREF_CHECK_KEYS, prefCheckKeys.isSelected());
         Config.getPref().putBoolean(PREF_CHECK_FIXMES, prefCheckFixmes.isSelected());
+        Config.getPref().putBoolean(PREF_CHECK_PRESETS_TYPES, prefCheckPresetsTypes.isSelected());
         Config.getPref().putBoolean(PREF_CHECK_VALUES_BEFORE_UPLOAD, prefCheckValuesBeforeUpload.isSelected());
         Config.getPref().putBoolean(PREF_CHECK_COMPLEX_BEFORE_UPLOAD, prefCheckComplexBeforeUpload.isSelected());
         Config.getPref().putBoolean(PREF_CHECK_KEYS_BEFORE_UPLOAD, prefCheckKeysBeforeUpload.isSelected());
         Config.getPref().putBoolean(PREF_CHECK_FIXMES_BEFORE_UPLOAD, prefCheckFixmesBeforeUpload.isSelected());
+        Config.getPref().putBoolean(PREF_CHECK_PRESETS_TYPES_BEFORE_UPLOAD, prefCheckPresetsTypesBeforeUpload.isSelected());
         return Config.getPref().putList(PREF_SOURCES, sourcesList.getItems());
     }
Index: trunk/src/org/openstreetmap/josm/gui/tagging/presets/TaggingPreset.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/tagging/presets/TaggingPreset.java	(revision 15639)
+++ trunk/src/org/openstreetmap/josm/gui/tagging/presets/TaggingPreset.java	(revision 15640)
@@ -23,4 +23,5 @@
 import java.util.concurrent.CompletableFuture;
 import java.util.function.Predicate;
+import java.util.stream.Collectors;
 
 import javax.swing.AbstractAction;
@@ -525,11 +526,5 @@
     public Collection<OsmPrimitive> createSelection(Collection<OsmPrimitive> participants) {
         originalSelectionEmpty = participants.isEmpty();
-        Collection<OsmPrimitive> sel = new LinkedList<>();
-        for (OsmPrimitive osm : participants) {
-            if (typeMatches(EnumSet.of(TaggingPresetType.forPrimitive(osm)))) {
-                sel.add(osm);
-            }
-        }
-        return sel;
+        return participants.stream().filter(this::typeMatches).collect(Collectors.toList());
     }
 
@@ -540,7 +535,5 @@
     public List<Tag> getChangedTags() {
         List<Tag> result = new ArrayList<>();
-        for (TaggingPresetItem i: data) {
-            i.addCommands(result);
-        }
+        data.forEach(i -> i.addCommands(result));
         return result;
     }
@@ -585,4 +578,14 @@
     public String toString() {
         return (types == null ? "" : types.toString()) + ' ' + name;
+    }
+
+    /**
+     * Determines whether this preset matches the OSM primitive type.
+     * @param primitive The OSM primitive for which type must match
+     * @return <code>true</code> if type matches.
+     * @since 15640
+     */
+    public final boolean typeMatches(IPrimitive primitive) {
+        return typeMatches(EnumSet.of(TaggingPresetType.forPrimitive(primitive)));
     }
 
