diff --git a/main/src/main/java/org/mobilitydata/gtfsvalidator/table/GtfsStopSchema.java b/main/src/main/java/org/mobilitydata/gtfsvalidator/table/GtfsStopSchema.java
index 01ca241dad..c42e3d3a66 100644
--- a/main/src/main/java/org/mobilitydata/gtfsvalidator/table/GtfsStopSchema.java
+++ b/main/src/main/java/org/mobilitydata/gtfsvalidator/table/GtfsStopSchema.java
@@ -20,7 +20,7 @@
 import org.mobilitydata.gtfsvalidator.annotation.*;
 
 @GtfsTable("stops.txt")
-@Required
+@ConditionallyRequired
 public interface GtfsStopSchema extends GtfsEntity {
   @FieldType(FieldTypeEnum.ID)
   @PrimaryKey
diff --git a/main/src/main/java/org/mobilitydata/gtfsvalidator/validator/MissingStopsFileValidator.java b/main/src/main/java/org/mobilitydata/gtfsvalidator/validator/MissingStopsFileValidator.java
new file mode 100644
index 0000000000..9d00ffbbbd
--- /dev/null
+++ b/main/src/main/java/org/mobilitydata/gtfsvalidator/validator/MissingStopsFileValidator.java
@@ -0,0 +1,28 @@
+package org.mobilitydata.gtfsvalidator.validator;
+
+import javax.inject.Inject;
+import org.mobilitydata.gtfsvalidator.annotation.GtfsValidator;
+import org.mobilitydata.gtfsvalidator.notice.MissingRequiredFileNotice;
+import org.mobilitydata.gtfsvalidator.notice.NoticeContainer;
+import org.mobilitydata.gtfsvalidator.table.*;
+
+@GtfsValidator
+public class MissingStopsFileValidator extends FileValidator {
+
+  private final GtfsStopTableContainer stopTableContainer;
+  private final GtfsGeojsonFeaturesContainer geojsonFeaturesContainer;
+
+  @Inject
+  MissingStopsFileValidator(
+      GtfsStopTableContainer table, GtfsGeojsonFeaturesContainer geojsonFeaturesContainer) {
+    this.stopTableContainer = table;
+    this.geojsonFeaturesContainer = geojsonFeaturesContainer;
+  }
+
+  @Override
+  public void validate(NoticeContainer noticeContainer) {
+    if (stopTableContainer.isMissingFile() && geojsonFeaturesContainer.isMissingFile()) {
+      noticeContainer.addValidationNotice(new MissingRequiredFileNotice("stops.txt"));
+    }
+  }
+}
diff --git a/main/src/test/java/org/mobilitydata/gtfsvalidator/validator/MissingStopsFileValidatorTest.java b/main/src/test/java/org/mobilitydata/gtfsvalidator/validator/MissingStopsFileValidatorTest.java
new file mode 100644
index 0000000000..88a6dfae60
--- /dev/null
+++ b/main/src/test/java/org/mobilitydata/gtfsvalidator/validator/MissingStopsFileValidatorTest.java
@@ -0,0 +1,43 @@
+package org.mobilitydata.gtfsvalidator.validator;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import java.util.ArrayList;
+import org.junit.Test;
+import org.mobilitydata.gtfsvalidator.notice.MissingRequiredFileNotice;
+import org.mobilitydata.gtfsvalidator.notice.NoticeContainer;
+import org.mobilitydata.gtfsvalidator.table.GtfsGeojsonFeaturesContainer;
+import org.mobilitydata.gtfsvalidator.table.GtfsGeojsonFileDescriptor;
+import org.mobilitydata.gtfsvalidator.table.GtfsStopTableContainer;
+import org.mobilitydata.gtfsvalidator.table.TableStatus;
+
+public class MissingStopsFileValidatorTest {
+  @Test
+  public void stopsTxtMissingFileShouldGenerateNotice() {
+    // If stops.txt is missing and locations.geojson is missing, a notice should be generated
+    NoticeContainer noticeContainer = new NoticeContainer();
+    GtfsGeojsonFileDescriptor descriptor = new GtfsGeojsonFileDescriptor();
+    GtfsGeojsonFeaturesContainer geoJsonFeaturesContainer =
+        descriptor.createContainerForInvalidStatus(TableStatus.MISSING_FILE);
+    GtfsStopTableContainer stopTableContainer =
+        GtfsStopTableContainer.forStatus(TableStatus.MISSING_FILE);
+    new MissingStopsFileValidator(stopTableContainer, geoJsonFeaturesContainer)
+        .validate(noticeContainer);
+    assertThat(noticeContainer.getValidationNotices())
+        .containsExactly(new MissingRequiredFileNotice("stops.txt"));
+  }
+
+  @Test
+  public void stopsTxtMissingFileShouldNotGenerateNotice() {
+    // If stops.txt is missing, but locations.geojson is present, no notice should be generated
+    NoticeContainer noticeContainer = new NoticeContainer();
+    GtfsGeojsonFileDescriptor descriptor = new GtfsGeojsonFileDescriptor();
+    GtfsGeojsonFeaturesContainer geoJsonFeaturesContainer =
+        descriptor.createContainerForEntities(new ArrayList<>(), noticeContainer);
+    GtfsStopTableContainer stopTableContainer =
+        GtfsStopTableContainer.forStatus(TableStatus.MISSING_FILE);
+    new MissingStopsFileValidator(stopTableContainer, geoJsonFeaturesContainer)
+        .validate(noticeContainer);
+    assertThat(noticeContainer.getValidationNotices()).isEmpty();
+  }
+}