diff --git a/.gitignore b/.gitignore
index cc6eea024..503be05e2 100644
--- a/.gitignore
+++ b/.gitignore
@@ -12,4 +12,4 @@ overrides/pt/*
overrides/ru/*
overrides/zh/*
overrides/zh-TW/*
-./cache
+/.cache
\ No newline at end of file
diff --git a/.htaccess b/.htaccess
index 370dc12a5..eb86bd5ff 100644
--- a/.htaccess
+++ b/.htaccess
@@ -1,25 +1,28 @@
# Enable the rewrite engine
RewriteEngine On
+# Enable case-sensitive matching
+Options +SymLinksIfOwnerMatch
+
# Redirect rules using regex
RedirectMatch 301 ^/reference/static/?$ /documentation/schedule/reference/
RedirectMatch 301 ^/schedule/reference/?$ /documentation/schedule/reference/
-RedirectMatch 301 ^/schedule/best-practices/?$ /documentation/schedule/schedule_best_practices/
-RedirectMatch 301 ^/schedule/example-feed/?$ /getting_started/example_feed/
+RedirectMatch 301 ^/schedule/best-practices/?$ /documentation/schedule/schedule-best-practices/
+RedirectMatch 301 ^/schedule/example-feed/?$ /getting-started/example-feed/
RedirectMatch 301 ^/schedule/examples/([^/]+)/?$ /documentation/schedule/examples/$1/
RedirectMatch 301 ^/schedule/examples/?$ /documentation/overview/
-RedirectMatch 301 ^/schedule/changes/?$ /documentation/schedule/change_history/recent_additions/
-RedirectMatch 301 ^/schedule/process/?$ /community/governance/gtfs_schedule_amendment_process/
-RedirectMatch 301 ^/schedule/(validate|publishing)/?$ /getting_started/$1/
-RedirectMatch 301 ^/realtime/best-practices/?$ /documentation/realtime/realtime_best_practices/
-RedirectMatch 301 ^/realtime/feed-entities/?$ /documentation/realtime/feed_entities/overview/
-RedirectMatch 301 ^/realtime/feed-entities/([^/]+)/?$ /documentation/realtime/feed_entities/$1/
+RedirectMatch 301 ^/schedule/changes/?$ /documentation/schedule/change-history/recent-additions/
+RedirectMatch 301 ^/schedule/process/?$ /community/governance/gtfs-schedule-amendment-process/
+RedirectMatch 301 ^/schedule/(validate|publishing)/?$ /getting-started/$1/
+RedirectMatch 301 ^/realtime/best-practices/?$ /documentation/realtime/realtime-best-practices/
+RedirectMatch 301 ^/realtime/feed-entities/?$ /documentation/realtime/feed-entities/overview/
+RedirectMatch 301 ^/realtime/feed-entities/([^/]+)/?$ /documentation/realtime/feed-entities/$1/
RedirectMatch 301 ^/realtime/feed-examples/([^/]+)/?$ /documentation/realtime/examples/$1/
RedirectMatch 301 ^/realtime/feed-examples/?$ /documentation/overview/
RedirectMatch 301 ^/realtime/(proto|reference)/?$ /documentation/realtime/$1/
-RedirectMatch 301 ^/realtime/changes/?$ /documentation/realtime/change_history/recent_additions/
-RedirectMatch 301 ^/realtime/process/?$ /community/governance/gtfs_realtime_amendment_process/
-RedirectMatch 301 ^/resources/community/?$ /community/get_involved/
+RedirectMatch 301 ^/realtime/changes/?$ /documentation/realtime/change-history/recent-additions/
+RedirectMatch 301 ^/realtime/process/?$ /community/governance/gtfs-realtime-amendment-process/
+RedirectMatch 301 ^/resources/community/?$ /community/get-involved/
RedirectMatch 301 ^/extensions/([^/]+)/?$ /community/extensions/$1/
RedirectMatch 301 ^/extensions/?$ /community/extensions/overview/
@@ -41,16 +44,25 @@ RewriteCond %{REQUEST_URI} ^/realtime/reference/$
RewriteRule ^realtime/reference/$ /documentation/realtime/reference/ [L,R=301]
# Anchor redirections
-RewriteRule ^realtime/process/#guiding-principles https://gtfs.org/community/governance/gtfs_realtime_amendment_process/#guiding-principles [R=301,NE]
-RewriteRule ^realtime/process/#revision-history https://gtfs.org/documentation/realtime/change_history/revision_history/ [R=301]
-RewriteRule ^realtime/process/#experimental-fields https://gtfs.org/community/governance/gtfs_realtime_amendment_process/#experimental-fields [R=301,NE]
-RewriteRule ^#why-use-gtfs https://gtfs.org/getting_started/why_use_GTFS/ [R=301]
-RewriteRule ^#what-is-high-quality-gtfs https://gtfs.org/getting_started/validate/ [R=301]
-RewriteRule ^schedule/#getting-started https://gtfs.org/getting_started/create/ [R=301]
+RewriteRule ^realtime/process/#guiding-principles https://gtfs.org/community/governance/gtfs-realtime-amendment-process/#guiding-principles [R=301,NE]
+RewriteRule ^realtime/process/#revision-history https://gtfs.org/documentation/realtime/change-history/revision-history/ [R=301]
+RewriteRule ^realtime/process/#experimental-fields https://gtfs.org/community/governance/gtfs-realtime-amendment-process/#experimental-fields [R=301,NE]
+RewriteRule ^#why-use-gtfs https://gtfs.org/getting-started/why-use-GTFS/ [R=301]
+RewriteRule ^#what-is-high-quality-gtfs https://gtfs.org/getting-started/validate/ [R=301]
+RewriteRule ^schedule/#getting-started https://gtfs.org/getting-started/create/ [R=301]
RewriteRule ^schedule/#training-resources https://gtfs.org/resources/overview/ [R=301]
-RewriteRule ^schedule/#getting-help-community https://gtfs.org/community/get_involved/ [R=301]
-RewriteRule ^schedule/process/#guiding-principles https://gtfs.org/community/governance/gtfs_schedule_amendment_process/#guiding-principles [R=301,NE]
-RewriteRule ^schedule/process/#revision-history https://gtfs.org/documentation/schedule/change_history/revision_history/ [R=301]
+RewriteRule ^schedule/#getting-help-community https://gtfs.org/community/get-involved/ [R=301]
+RewriteRule ^schedule/process/#guiding-principles https://gtfs.org/community/governance/gtfs-schedule-amendment-process/#guiding-principles [R=301,NE]
+RewriteRule ^schedule/process/#revision-history https://gtfs.org/documentation/schedule/change-history/revision-history/ [R=301]
+
+# Redirect any URL containing underscores to the same URL with hyphens, plus correcting the file with spaces
+RewriteCond %{THE_REQUEST} [_ ]
+RewriteRule ^([^_]*)[_ ]([^_]*)$ $1-$2 [N]
+RewriteRule ^(.*)[_ ](.*)$ $1-$2 [R=301,NC,L]
+
+RewriteCond %{THE_REQUEST} %20
+RewriteRule ^([^%]*?)%20([^%]*)$ $1-$2 [N]
+RewriteRule ^(.*?)%20(.*)$ $1-$2 [R=301,NC,L]
# Match any URL trying to access the blog in anything but EN and redirect them to EN
RewriteCond %{REQUEST_URI} ^/(?:fr|es|ja|ru|pt|ko|id|de|zh|zh-TW)/blog/
@@ -59,4 +71,4 @@ RewriteRule ^(.+?)/.+$ /blog/ [L,R=302]
# Match any URL under /ja, /ru, /pt, /ko, /id, /de, /zh, or /zh-TW and redirect to the corresponding index.html
RewriteCond %{REQUEST_URI} ^/(ja|ru|pt|ko|id|de|zh|zh-TW)/
RewriteCond %{REQUEST_URI} !index\.html$
-RewriteRule ^(.+?)/.+$ /$1/index.html [L,R=302]
+RewriteRule ^(.+?)/.+$ /$1/index.html [L,R=302]
\ No newline at end of file
diff --git a/docs/en/assets/TimeVariableFares_OffPeak.png b/docs/en/assets/TimeVariableFares-OffPeak.png
similarity index 100%
rename from docs/en/assets/TimeVariableFares_OffPeak.png
rename to docs/en/assets/TimeVariableFares-OffPeak.png
diff --git a/docs/en/assets/TimeVariableFares_Peak.png b/docs/en/assets/TimeVariableFares-Peak.png
similarity index 100%
rename from docs/en/assets/TimeVariableFares_Peak.png
rename to docs/en/assets/TimeVariableFares-Peak.png
diff --git a/docs/en/assets/create_001.png b/docs/en/assets/create-001.png
similarity index 100%
rename from docs/en/assets/create_001.png
rename to docs/en/assets/create-001.png
diff --git a/docs/en/assets/create_002.png b/docs/en/assets/create-002.png
similarity index 100%
rename from docs/en/assets/create_002.png
rename to docs/en/assets/create-002.png
diff --git a/docs/en/assets/create_003.png b/docs/en/assets/create-003.png
similarity index 100%
rename from docs/en/assets/create_003.png
rename to docs/en/assets/create-003.png
diff --git a/docs/en/assets/deviated _drop-off _route.zip b/docs/en/assets/deviated-drop-off-route.zip
similarity index 100%
rename from docs/en/assets/deviated _drop-off _route.zip
rename to docs/en/assets/deviated-drop-off-route.zip
diff --git a/docs/en/assets/deviated_route_zones.png b/docs/en/assets/deviated-route-zones.png
similarity index 100%
rename from docs/en/assets/deviated_route_zones.png
rename to docs/en/assets/deviated-route-zones.png
diff --git a/docs/en/assets/first_stop_reference.png b/docs/en/assets/first-stop-reference.png
similarity index 100%
rename from docs/en/assets/first_stop_reference.png
rename to docs/en/assets/first-stop-reference.png
diff --git a/docs/en/assets/homepage-theme-image_720x720@1x.png b/docs/en/assets/homepage-theme-image-720x720@1x.png
similarity index 100%
rename from docs/en/assets/homepage-theme-image_720x720@1x.png
rename to docs/en/assets/homepage-theme-image-720x720@1x.png
diff --git a/docs/en/assets/on-demand_services_between_multiple_zones(r).zip b/docs/en/assets/on-demand-services-between-multiple-zones(r).zip
similarity index 100%
rename from docs/en/assets/on-demand_services_between_multiple_zones(r).zip
rename to docs/en/assets/on-demand-services-between-multiple-zones(r).zip
diff --git a/docs/en/assets/on-demand_services_between_multiple_zones.zip b/docs/en/assets/on-demand-services-between-multiple-zones.zip
similarity index 100%
rename from docs/en/assets/on-demand_services_between_multiple_zones.zip
rename to docs/en/assets/on-demand-services-between-multiple-zones.zip
diff --git a/docs/en/assets/on-demand_services_within_a_single_zone.zip b/docs/en/assets/on-demand-services-within-a-single-zone.zip
similarity index 100%
rename from docs/en/assets/on-demand_services_within_a_single_zone.zip
rename to docs/en/assets/on-demand-services-within-a-single-zone.zip
diff --git a/docs/en/assets/propagated_delay.png b/docs/en/assets/propagated-delay.png
similarity index 100%
rename from docs/en/assets/propagated_delay.png
rename to docs/en/assets/propagated-delay.png
diff --git a/docs/en/assets/trip_modification.png b/docs/en/assets/trip-modification.png
similarity index 100%
rename from docs/en/assets/trip_modification.png
rename to docs/en/assets/trip-modification.png
diff --git a/docs/en/assets/validator_demo_large.mp4 b/docs/en/assets/validator-demo-large.mp4
similarity index 100%
rename from docs/en/assets/validator_demo_large.mp4
rename to docs/en/assets/validator-demo-large.mp4
diff --git a/docs/en/assets/what_is_gtfs_001.png b/docs/en/assets/what-is-gtfs-001.png
similarity index 100%
rename from docs/en/assets/what_is_gtfs_001.png
rename to docs/en/assets/what-is-gtfs-001.png
diff --git a/docs/en/assets/what_is_gtfs_002.png b/docs/en/assets/what-is-gtfs-002.png
similarity index 100%
rename from docs/en/assets/what_is_gtfs_002.png
rename to docs/en/assets/what-is-gtfs-002.png
diff --git a/docs/en/community/get_involved.md b/docs/en/community/get-involved.md
similarity index 100%
rename from docs/en/community/get_involved.md
rename to docs/en/community/get-involved.md
diff --git a/docs/en/community/governance/gtfs_realtime_amendment_process.md b/docs/en/community/governance/gtfs-realtime-amendment-process.md
similarity index 100%
rename from docs/en/community/governance/gtfs_realtime_amendment_process.md
rename to docs/en/community/governance/gtfs-realtime-amendment-process.md
diff --git a/docs/en/community/governance/gtfs_schedule_amendment_process.md b/docs/en/community/governance/gtfs-schedule-amendment-process.md
similarity index 100%
rename from docs/en/community/governance/gtfs_schedule_amendment_process.md
rename to docs/en/community/governance/gtfs-schedule-amendment-process.md
diff --git a/docs/en/documentation/overview.md b/docs/en/documentation/overview.md
index 7ad4e9434..2c358a187 100644
--- a/docs/en/documentation/overview.md
+++ b/docs/en/documentation/overview.md
@@ -25,7 +25,7 @@ The specification currently supports the following types of information:
- Service alerts - stop moved, unforeseen events affecting a station, route or the entire network
- Vehicle positions - information about the vehicles including location and congestion level
-To learn more about them visit the [Feed Entities](../realtime/feed_entities/overview) section.
+To learn more about them visit the [Feed Entities](../realtime/feed-entities/overview) section.
GTFS Realtime was designed around ease of implementation, good GTFS interoperability and a focus on passenger information. This was possible through a partnership of the [initial Live Transit Updates](https://developers.google.com/transit/google-transit#LiveTransitUpdates) partner agencies, a number of transit developers and Google. The specification is published under the [Apache 2.0 License](http://www.apache.org/licenses/LICENSE-2.0.html).
diff --git a/docs/en/documentation/realtime/change_history/recent_additions.md b/docs/en/documentation/realtime/change-history/recent-additions.md
similarity index 100%
rename from docs/en/documentation/realtime/change_history/recent_additions.md
rename to docs/en/documentation/realtime/change-history/recent-additions.md
diff --git a/docs/en/documentation/realtime/change_history/revision_history.md b/docs/en/documentation/realtime/change-history/revision-history.md
similarity index 100%
rename from docs/en/documentation/realtime/change_history/revision_history.md
rename to docs/en/documentation/realtime/change-history/revision-history.md
diff --git a/docs/en/documentation/realtime/feed_entities/overview.md b/docs/en/documentation/realtime/feed-entities/overview.md
similarity index 100%
rename from docs/en/documentation/realtime/feed_entities/overview.md
rename to docs/en/documentation/realtime/feed-entities/overview.md
diff --git a/docs/en/documentation/realtime/feed_entities/service-alerts.md b/docs/en/documentation/realtime/feed-entities/service-alerts.md
similarity index 100%
rename from docs/en/documentation/realtime/feed_entities/service-alerts.md
rename to docs/en/documentation/realtime/feed-entities/service-alerts.md
diff --git a/docs/en/documentation/realtime/feed_entities/trip-modifications.md b/docs/en/documentation/realtime/feed-entities/trip-modifications.md
similarity index 97%
rename from docs/en/documentation/realtime/feed_entities/trip-modifications.md
rename to docs/en/documentation/realtime/feed-entities/trip-modifications.md
index e1d08de8d..dc981f793 100644
--- a/docs/en/documentation/realtime/feed_entities/trip-modifications.md
+++ b/docs/en/documentation/realtime/feed-entities/trip-modifications.md
@@ -36,11 +36,11 @@ A `Modification` message describes changes to each affected trip starting at `st
The sequence of `replacement_stops` may be of arbitrary length. For example, 3 stops could be replaced by 2, 4, or 0 stops as the situation may require.
-![](/../assets/trip_modification.png)
+![](/../assets/trip-modification.png)
_An example showing the effect of a modification on a particular trip. This modification may also be applied to several other trips._
-![](/../assets/propagated_delay.png)
+![](/../assets/propagated-delay.png)
_Propagated detour delays affect all stops following the end of a modification. If a trip has multiple modifications, the delays are accumulated._
@@ -54,6 +54,6 @@ The `departure_time` always equals the `arrival_time`.
The optional fields of [`stop_times.txt`](../../../schedule/reference/#stop_timestxt) in the (CSV) GTFS specification are all set to their default values.
-![](/../assets/first_stop_reference.png)
+![](/../assets/first-stop-reference.png)
_If a modification affects the first stop of the trip, that stop also serves as the reference stop of the modification._
diff --git a/docs/en/documentation/realtime/feed_entities/trip-updates.md b/docs/en/documentation/realtime/feed-entities/trip-updates.md
similarity index 100%
rename from docs/en/documentation/realtime/feed_entities/trip-updates.md
rename to docs/en/documentation/realtime/feed-entities/trip-updates.md
diff --git a/docs/en/documentation/realtime/feed_entities/vehicle-positions.md b/docs/en/documentation/realtime/feed-entities/vehicle-positions.md
similarity index 100%
rename from docs/en/documentation/realtime/feed_entities/vehicle-positions.md
rename to docs/en/documentation/realtime/feed-entities/vehicle-positions.md
diff --git a/docs/en/documentation/realtime/realtime_best_practices.md b/docs/en/documentation/realtime/realtime-best-practices.md
similarity index 99%
rename from docs/en/documentation/realtime/realtime_best_practices.md
rename to docs/en/documentation/realtime/realtime-best-practices.md
index dda9b31fd..47cbf1bd2 100644
--- a/docs/en/documentation/realtime/realtime_best_practices.md
+++ b/docs/en/documentation/realtime/realtime-best-practices.md
@@ -57,7 +57,7 @@ General guidelines for trip cancellations:
| `vehicle` | Refer to [message VehicleDescriptor](#vehicledescriptor). |
| | If separate `VehiclePosition` and `TripUpdate` feeds are provided, [TripDescriptor](#tripdescriptor) and [VehicleDescriptor](#vehicledescriptor) ID values pairing should match between the two feeds.
For example, a `VehiclePosition` entity has `vehicle_id:A` and `trip_id:4`, then the corresponding `TripUpdate` entity should also have `vehicle_id:A` and `trip_id:4`. If any `TripUpdate` entity has `trip_id:4` and any `vehicle_id` other than 4, this is an error. |
| `stop_time_update` | `stop_time_updates` for a given `trip_id` should be strictly ordered by increasing `stop_sequence` and no `stop_sequence` should be repeated. |
-| | While the trip is in progress, all `TripUpdates` should include at least one `stop_time_update` with a predicted arrival or departure time in the future. Note that the [GTFS Realtime spec](../feed_entities/trip-updates/#stoptimeupdate) says that producers should not drop a past `StopTimeUpdate` if it refers to a stop with a scheduled arrival time in the future for the given trip (i.e. the vehicle has passed the stop ahead of schedule), as otherwise it will be concluded that there is no update for this stop. |
+| | While the trip is in progress, all `TripUpdates` should include at least one `stop_time_update` with a predicted arrival or departure time in the future. Note that the [GTFS Realtime spec](../feed-entities/trip-updates/#stoptimeupdate) says that producers should not drop a past `StopTimeUpdate` if it refers to a stop with a scheduled arrival time in the future for the given trip (i.e. the vehicle has passed the stop ahead of schedule), as otherwise it will be concluded that there is no update for this stop. |
| `timestamp` | Should reflect the time this prediction for this trip was updated. |
| `delay` | `TripUpdate.delay` should represent schedule deviation, i.e., the observed past value for how ahead/behind schedule the vehicle is. Predictions for future stops should be provided through `StopTimeEvent.delay` or `StopTimeEvent.time`. |
diff --git a/docs/en/documentation/realtime/reference.md b/docs/en/documentation/realtime/reference.md
index 64c2876fb..0a653828d 100644
--- a/docs/en/documentation/realtime/reference.md
+++ b/docs/en/documentation/realtime/reference.md
@@ -139,7 +139,7 @@ A definition (or update) of an entity in the transit feed. If the entity is not
### _message_ TripUpdate
-Realtime update on the progress of a vehicle along a trip. Please also refer to the general discussion of the [trip updates entities](../../../documentation/realtime/feed_entities/trip-updates).
+Realtime update on the progress of a vehicle along a trip. Please also refer to the general discussion of the [trip updates entities](../../../documentation/realtime/feed-entities/trip-updates).
upd
Depending on the value of ScheduleRelationship, a TripUpdate can specify:
@@ -187,7 +187,7 @@ Uncertainty applies equally to both time and delay. The uncertainty roughly spec
### _message_ StopTimeUpdate
-Realtime update for arrival and/or departure events for a given stop on a trip. Please also refer to the general discussion of stop time updates in the [TripDescriptor](#message-tripdescriptor) and [trip updates entities](../../../documentation/realtime/feed_entities/trip-updates) documentation.
+Realtime update for arrival and/or departure events for a given stop on a trip. Please also refer to the general discussion of stop time updates in the [TripDescriptor](#message-tripdescriptor) and [trip updates entities](../../../documentation/realtime/feed-entities/trip-updates) documentation.
Updates can be supplied for both past and future events. The producer is allowed, although not required, to drop past events.
The update is linked to a specific stop either through stop_sequence or stop_id, so one of these fields must necessarily be set. If the same stop_id is visited more than once in a trip, then stop_sequence should be provided in all StopTimeUpdates for that stop_id on that trip.
@@ -617,7 +617,7 @@ A `TripModifications` message identifies a list of similar trips which are all a
**Caution:** this field is still **experimental**, and subject to change. It may be formally adopted in the future.
-[More about Trip Modifications...](../../../documentation/realtime/feed_entities/trip-modifications)
+[More about Trip Modifications...](../../../documentation/realtime/feed-entities/trip-modifications)
**Fields**
@@ -634,11 +634,11 @@ A `Modification` message describes changes to each affected trip starting at `st
**Caution:** this field is still **experimental**, and subject to change. It may be formally adopted in the future.
-
+
_An example showing the effect of a modification on a particular trip. This modification may also be applied to several other trips._
-
+
_Propagated detour delays affect all stops following the end of a modification. If a trip has multiple modifications, the delays are accumulated._
@@ -686,7 +686,7 @@ Each `ReplacementStop` message defines a stop that will now be visited by the tr
**Caution:** this field is still **experimental**, and subject to change. It may be formally adopted in the future.
-
+
_If a modification affects the first stop of the trip, that stop also serves as the reference stop of the modification._
diff --git a/docs/en/documentation/schedule/change_history/recent_additions.md b/docs/en/documentation/schedule/change-history/recent-additions.md
similarity index 100%
rename from docs/en/documentation/schedule/change_history/recent_additions.md
rename to docs/en/documentation/schedule/change-history/recent-additions.md
diff --git a/docs/en/documentation/schedule/change_history/revision_history.md b/docs/en/documentation/schedule/change-history/revision-history.md
similarity index 100%
rename from docs/en/documentation/schedule/change_history/revision_history.md
rename to docs/en/documentation/schedule/change-history/revision-history.md
diff --git a/docs/en/documentation/schedule/examples/fares-v2.md b/docs/en/documentation/schedule/examples/fares-v2.md
index f0dbaa6d9..5ab50eb9e 100644
--- a/docs/en/documentation/schedule/examples/fares-v2.md
+++ b/docs/en/documentation/schedule/examples/fares-v2.md
@@ -421,6 +421,6 @@ Alternatively, a user traveling in train #883 (`service_id=13`) would pay an Out
In Apple Maps, riders can see how their fare price changes and compare fare prices next to the train scheduled departure: