diff --git src/org/openstreetmap/josm/actions/ValidateAction.java src/org/openstreetmap/josm/actions/ValidateAction.java
index 300097a5f..158b166d0 100644
--- src/org/openstreetmap/josm/actions/ValidateAction.java
+++ src/org/openstreetmap/josm/actions/ValidateAction.java
@@ -3,18 +3,31 @@ package org.openstreetmap.josm.actions;
 
 import static org.openstreetmap.josm.tools.I18n.tr;
 
+import java.awt.GridBagLayout;
 import java.awt.event.ActionEvent;
 import java.awt.event.KeyEvent;
 import java.util.Collection;
 import java.util.Optional;
 
+import javax.swing.ButtonGroup;
+import javax.swing.JLabel;
+import javax.swing.JOptionPane;
+import javax.swing.JPanel;
+import javax.swing.JRadioButton;
+
 import org.openstreetmap.josm.data.osm.OsmPrimitive;
+import org.openstreetmap.josm.data.preferences.sources.ValidatorPrefHelper;
 import org.openstreetmap.josm.data.validation.OsmValidator;
 import org.openstreetmap.josm.data.validation.Test;
 import org.openstreetmap.josm.data.validation.ValidationTask;
 import org.openstreetmap.josm.data.validation.util.AggregatePrimitivesVisitor;
+import org.openstreetmap.josm.gui.ExtendedDialog;
 import org.openstreetmap.josm.gui.MainApplication;
 import org.openstreetmap.josm.gui.MapFrame;
+import org.openstreetmap.josm.gui.autofilter.AutoFilterManager;
+import org.openstreetmap.josm.gui.util.GuiHelper;
+import org.openstreetmap.josm.tools.GBC;
+import org.openstreetmap.josm.tools.Logging;
 import org.openstreetmap.josm.tools.Shortcut;
 
 /**
@@ -41,6 +54,91 @@ public class ValidateAction extends JosmAction {
 
     @Override
     public void actionPerformed(ActionEvent ev) {
+        // Warn user if validating while filters are active and see if they wish to
+        // continue, as OSM primitives are excluded from validation due to the
+        // filtering (which could possibly lead to a false sense of confidence)
+        boolean filtersActive = AutoFilterManager.getInstance().getCurrentAutoFilter() != null ||
+            (MainApplication.getMap() != null &&
+             MainApplication.getMap().filterDialog != null &&
+             MainApplication.getMap().filterDialog.getFilterModel().hasDisabledOrHiddenPrimitives());
+        if (filtersActive && "fail".equals(ValidatorPrefHelper.PREF_VALIDATE_WITH_FILTERS_ENABLED_ACTION.get())) {
+            // To avoid any confusion, if user has already indicated they do not want to validate
+            // when filters are active, then let them know that validation was not performed
+            // due to active filters
+            GuiHelper.runInEDT(() -> JOptionPane.showMessageDialog(
+                    MainApplication.getMainFrame(),
+                    tr("Validation not performed due to filters being active. Please disable filters."),
+                    tr("Error"),
+                    JOptionPane.ERROR_MESSAGE
+            ));
+            return;
+        }
+
+        if (filtersActive && "ask".equals(ValidatorPrefHelper.PREF_VALIDATE_WITH_FILTERS_ENABLED_ACTION.get())) {
+            JPanel p = new JPanel(new GridBagLayout());
+            p.add(new JLabel("<html><body style=\"width: 375px;\">" +
+                    tr("You are validating while filters are active, this could: ") + "<br/>" +
+                    "<ul>" +
+                    "<li>" + tr("Potentially exclude objects from validation.") + "</li>" +
+                    "<li>" + tr("Make it harder to see validation objects if they are hidden by a filter.") + "</li>" +
+                    "</ul><br/>" +
+                    tr("Do you want to continue?") +
+                    "</body></html>"), GBC.eol());
+
+            JRadioButton validateWithFiltersAsk = new JRadioButton(tr("Show this dialog again the next time"));
+            validateWithFiltersAsk.setActionCommand("ask");
+            JRadioButton validateWithFiltersContinue = new JRadioButton(tr("Do not show this again (remembers choice)"));
+            validateWithFiltersContinue.setActionCommand("continue");
+            JRadioButton validateWithFiltersFail = new JRadioButton(
+                    tr("Skip validation and show an error message the next time (remembers choice)"));
+            validateWithFiltersFail.setActionCommand("fail");
+
+            switch(ValidatorPrefHelper.PREF_VALIDATE_WITH_FILTERS_ENABLED_ACTION.get()) {
+                case "ask":
+                    validateWithFiltersAsk.setSelected(true);
+                    break;
+                case "continue":
+                    validateWithFiltersContinue.setSelected(true);
+                    break;
+                case "fail":
+                    validateWithFiltersFail.setSelected(true);
+                    break;
+            }
+
+            ButtonGroup validateWithFiltersGroup = new ButtonGroup();
+            validateWithFiltersGroup.add(validateWithFiltersAsk);
+            validateWithFiltersGroup.add(validateWithFiltersContinue);
+            validateWithFiltersGroup.add(validateWithFiltersFail);
+
+            p.add(validateWithFiltersAsk, GBC.eol().insets(30, 10, 0, 0));
+            p.add(validateWithFiltersContinue, GBC.eol().insets(30, 0, 0, 0));
+            p.add(validateWithFiltersFail, GBC.eol().insets(30, 0, 0, 10));
+
+            ExtendedDialog ed = new ExtendedDialog(MainApplication.getMainFrame(),
+                    tr("Validation with active filters"),
+                    tr("Continue"),
+                    tr("Cancel"))
+                    .setContent(p)
+                    .configureContextsensitiveHelp("Dialog/Validator", true);
+
+            ed.setButtonIcons("ok", "cancel");
+
+            int result = ed.showDialog().getValue();
+
+            if (result != 1) {
+                Logging.debug("Dialog result indicates the user does not want to continue with validation");
+                return;
+            }
+
+            // Update the persistent preference based on the user's selection
+            ValidatorPrefHelper.PREF_VALIDATE_WITH_FILTERS_ENABLED_ACTION.put(validateWithFiltersGroup.getSelection().getActionCommand());
+
+            // Return (skip validation) if the user wants to skip validation and show the error dialog next time
+            if ("fail".equals(validateWithFiltersGroup.getSelection().getActionCommand())) {
+                return;
+            }
+        }
+
         doValidate(true);
     }
 
diff --git src/org/openstreetmap/josm/data/preferences/sources/ValidatorPrefHelper.java src/org/openstreetmap/josm/data/preferences/sources/ValidatorPrefHelper.java
index a5fe3e30e..455c7f452 100644
--- src/org/openstreetmap/josm/data/preferences/sources/ValidatorPrefHelper.java
+++ src/org/openstreetmap/josm/data/preferences/sources/ValidatorPrefHelper.java
@@ -9,6 +9,7 @@ import java.util.List;
 import java.util.Map;
 
 import org.openstreetmap.josm.data.preferences.BooleanProperty;
+import org.openstreetmap.josm.data.preferences.StringProperty;
 import org.openstreetmap.josm.data.validation.tests.MapCSSTagChecker;
 import org.openstreetmap.josm.tools.ImageProvider;
 
@@ -56,6 +57,13 @@ public class ValidatorPrefHelper extends SourcePrefHelper {
      */
     public static final String PREF_FILTER_BY_SELECTION = PREFIX + ".selectionFilter";
 
+    /**
+     * The preferences for showing a warning if validation action is performed with filters enabled
+     * @since xxx
+     * */
+    public static final StringProperty PREF_VALIDATE_WITH_FILTERS_ENABLED_ACTION =
+            new StringProperty(PREFIX + ".validate_with_filters_action", "ask");
+
     /**
      * Constructs a new {@code PresetPrefHelper}.
      */
diff --git src/org/openstreetmap/josm/gui/dialogs/FilterTableModel.java src/org/openstreetmap/josm/gui/dialogs/FilterTableModel.java
index 07c198f72..a555835e2 100644
--- src/org/openstreetmap/josm/gui/dialogs/FilterTableModel.java
+++ src/org/openstreetmap/josm/gui/dialogs/FilterTableModel.java
@@ -311,6 +311,15 @@ public class FilterTableModel extends AbstractTableModel implements SortableTabl
         return model.getFilters();
     }
 
+    /**
+     * Determines if at least one OSM primitive is disabled or hidden due to filtering.
+     * @return {@code true} if at least one primitive is disabled or hidden
+     * @since xxx
+     */
+    public boolean hasDisabledOrHiddenPrimitives() {
+        return model.getDisabledAndHiddenCount() > 0 || model.getDisabledCount() > 0;
+    }
+
     @Override
     public void sort() {
         model.sort();
diff --git src/org/openstreetmap/josm/gui/preferences/validator/ValidatorTestsPreference.java src/org/openstreetmap/josm/gui/preferences/validator/ValidatorTestsPreference.java
index a280ae8ec..407e99a09 100644
--- src/org/openstreetmap/josm/gui/preferences/validator/ValidatorTestsPreference.java
+++ src/org/openstreetmap/josm/gui/preferences/validator/ValidatorTestsPreference.java
@@ -11,9 +11,11 @@ import java.util.LinkedList;
 import java.util.List;
 
 import javax.swing.BorderFactory;
+import javax.swing.ButtonGroup;
 import javax.swing.JCheckBox;
 import javax.swing.JLabel;
 import javax.swing.JPanel;
+import javax.swing.JRadioButton;
 
 import org.openstreetmap.josm.data.preferences.sources.ValidatorPrefHelper;
 import org.openstreetmap.josm.data.validation.OsmValidator;
@@ -49,6 +51,7 @@ public class ValidatorTestsPreference implements SubPreferenceSetting {
     private JCheckBox prefUseLayer;
     private JCheckBox prefOtherUpload;
     private JCheckBox prefOther;
+    private ButtonGroup validateWithFiltersGroup;
 
     /** The list of all tests */
     private Collection<Test> allTests;
@@ -92,6 +95,36 @@ public class ValidatorTestsPreference implements SubPreferenceSetting {
         gui.getValidatorPreference().addSubTab(this, tr("Tests"),
                 GuiHelper.embedInVerticalScrollPane(testPanel),
                 tr("Choose tests to enable"));
+
+        JRadioButton validateWithFiltersAsk = new JRadioButton(tr("Ask to continue with validation"));
+        validateWithFiltersAsk.setActionCommand("ask");
+        JRadioButton validateWithFiltersContinue = new JRadioButton(tr("Continue with validation"));
+        validateWithFiltersContinue.setActionCommand("continue");
+        JRadioButton validateWithFiltersFail = new JRadioButton(tr("Show an error message"));
+        validateWithFiltersFail.setActionCommand("fail");
+
+        switch(ValidatorPrefHelper.PREF_VALIDATE_WITH_FILTERS_ENABLED_ACTION.get()) {
+            case "ask":
+                validateWithFiltersAsk.setSelected(true);
+                break;
+            case "continue":
+                validateWithFiltersContinue.setSelected(true);
+                break;
+            case "fail":
+                validateWithFiltersFail.setSelected(true);
+                break;
+        }
+
+        validateWithFiltersGroup = new ButtonGroup();
+        validateWithFiltersGroup.add(validateWithFiltersAsk);
+        validateWithFiltersGroup.add(validateWithFiltersContinue);
+        validateWithFiltersGroup.add(validateWithFiltersFail);
+
+        JLabel validateWithFiltersLabel = new JLabel(tr("When validation is performed with filters enabled:"));
+        testPanel.add(validateWithFiltersLabel, GBC.eol());
+        testPanel.add(validateWithFiltersAsk, GBC.eol().insets(40, 0, 0, 0));
+        testPanel.add(validateWithFiltersContinue, GBC.eol().insets(40, 0, 0, 0));
+        testPanel.add(validateWithFiltersFail, GBC.eol().insets(40, 0, 0, 0));
     }
 
     @Override
@@ -121,6 +154,7 @@ public class ValidatorTestsPreference implements SubPreferenceSetting {
         ValidatorPrefHelper.PREF_OTHER.put(prefOther.isSelected());
         ValidatorPrefHelper.PREF_OTHER_UPLOAD.put(prefOtherUpload.isSelected());
         ValidatorPrefHelper.PREF_LAYER.put(prefUseLayer.isSelected());
+        ValidatorPrefHelper.PREF_VALIDATE_WITH_FILTERS_ENABLED_ACTION.put(validateWithFiltersGroup.getSelection().getActionCommand());
         return false;
     }
 
