diff --git a/changes/bug30956 b/changes/bug30956
new file mode 100644
index 0000000000000000000000000000000000000000..8f52a81de3d2127d7f6648900f6ec7fda3e2828c
--- /dev/null
+++ b/changes/bug30956
@@ -0,0 +1,4 @@
+  o Minor bugfixes (pluggable transports):
+    - Always publish bridge pluggable transport information in the extra info
+      descriptor, even if ExtraInfoStatistics is 0. This information is
+      needed by BridgeDB. Fixes bug 30956; bugfix on 0.4.1.1-alpha.
diff --git a/doc/tor.1.txt b/doc/tor.1.txt
index 064259b15f1072ff54745085692ecc74230b40ba..e992f883f089d4ebdbf995df051bd4f3b7972d38 100644
--- a/doc/tor.1.txt
+++ b/doc/tor.1.txt
@@ -2451,8 +2451,10 @@ is non-zero):
 [[ExtraInfoStatistics]] **ExtraInfoStatistics** **0**|**1**::
     When this option is enabled, Tor includes previously gathered statistics in
     its extra-info documents that it uploads to the directory authorities.
-    Disabling this option also disables bandwidth usage statistics, GeoIPFile
-    hashes, and ServerTransportPlugin lists in the extra-info file.
+    Disabling this option also removes bandwidth usage statistics, and
+    GeoIPFile and GeoIPv6File hashes from the extra-info file. Bridge
+    ServerTransportPlugin lines are always includes in the extra-info file,
+    because they are required by BridgeDB.
     (Default: 1)
 
 [[ExtendAllowPrivateAddresses]] **ExtendAllowPrivateAddresses** **0**|**1**::
diff --git a/src/feature/relay/router.c b/src/feature/relay/router.c
index e0daf34db262523098366668cc0df1453ed10d91..25bb1835c210414ec98a779cf7ee516e4014099f 100644
--- a/src/feature/relay/router.c
+++ b/src/feature/relay/router.c
@@ -3175,6 +3175,15 @@ extrainfo_dump_to_string(char **s_out, extrainfo_t *extrainfo,
                published);
   smartlist_add(chunks, pre);
 
+  /* Add information about the pluggable transports we support, even if we
+   * are not publishing statistics. This information is needed by BridgeDB
+   * to distribute bridges. */
+  if (options->ServerTransportPlugin) {
+    char *pluggable_transports = pt_get_extra_info_descriptor_string();
+    if (pluggable_transports)
+      smartlist_add(chunks, pluggable_transports);
+  }
+
   if (options->ExtraInfoStatistics && write_stats_to_extrainfo) {
     log_info(LD_GENERAL, "Adding stats to extra-info descriptor.");
     /* Bandwidth usage stats don't have their own option */
@@ -3182,6 +3191,7 @@ extrainfo_dump_to_string(char **s_out, extrainfo_t *extrainfo,
       contents = rep_hist_get_bandwidth_lines();
       smartlist_add(chunks, contents);
     }
+    /* geoip hashes aren't useful unless we are publishing other stats */
     if (geoip_is_loaded(AF_INET))
       smartlist_add_asprintf(chunks, "geoip-db-digest %s\n",
                              geoip_db_digest(AF_INET));
@@ -3223,12 +3233,7 @@ extrainfo_dump_to_string(char **s_out, extrainfo_t *extrainfo,
       if (contents)
         smartlist_add(chunks, contents);
     }
-    /* Add information about the pluggable transports we support. */
-    if (options->ServerTransportPlugin) {
-      char *pluggable_transports = pt_get_extra_info_descriptor_string();
-      if (pluggable_transports)
-        smartlist_add(chunks, pluggable_transports);
-    }
+    /* bridge statistics */
     if (should_record_bridge_info(options)) {
       const char *bridge_stats = geoip_get_bridge_stats_extrainfo(now);
       if (bridge_stats) {