diff --git a/libc/tools/zoneinfo/ZoneCompactor.java b/libc/tools/zoneinfo/ZoneCompactor.java
index 6ce24cf..8a1a628 100644
--- a/libc/tools/zoneinfo/ZoneCompactor.java
+++ b/libc/tools/zoneinfo/ZoneCompactor.java
@@ -107,7 +107,7 @@
     return ret;
   }
 
-  public ZoneCompactor(String setupFile, String dataDirectory, String outputDirectory, String version) throws Exception {
+  public ZoneCompactor(String setupFile, String dataDirectory, String zoneTabFile, String outputDirectory, String version) throws Exception {
     // Read the setup file, and concatenate all the data.
     ByteArrayOutputStream allData = new ByteArrayOutputStream();
     BufferedReader reader = new BufferedReader(new FileReader(setupFile));
@@ -138,6 +138,7 @@
         }
       }
     }
+    reader.close();
 
     // Fill in fields for links.
     Iterator<String> it = links.keySet().iterator();
@@ -156,18 +157,14 @@
 
     // Write the header.
 
-    // byte[12] tzdata_version          -- 'tzdata2012f\0'
-    // int file_format_version          -- probably won't need this, but just in case
-    // int index_offset                 -- likewise
+    // byte[12] tzdata_version -- 'tzdata2012f\0'
+    // int index_offset -- so we can slip in extra header fields in a backwards-compatible way
     // int data_offset
     // int zonetab_offset
 
     // tzdata_version
     f.write(toAscii(new byte[12], version));
 
-    // file_format_version
-    f.writeInt(1);
-
     // Write dummy values for the three offsets, and remember where we need to seek back to later
     // when we have the real values.
     int index_offset_offset = (int) f.getFilePointer();
@@ -201,8 +198,17 @@
     // Write the data.
     f.write(allData.toByteArray());
 
-    // TODO: append the zonetab.
-    int zonetab_offset = 0;
+    // Copy the zone.tab.
+    reader = new BufferedReader(new FileReader(zoneTabFile));
+    while ((s = reader.readLine()) != null) {
+      if (!s.startsWith("#")) {
+        f.writeBytes(s);
+        f.write('\n');
+      }
+    }
+    reader.close();
+
+    int zonetab_offset = (int) f.getFilePointer();
 
     // Go back and fix up the offsets in the header.
     f.seek(index_offset_offset);
@@ -226,10 +232,10 @@
   }
 
   public static void main(String[] args) throws Exception {
-    if (args.length != 4) {
-      System.err.println("usage: java ZoneCompactor <setup file> <data directory> <output directory> <tzdata version>");
+    if (args.length != 5) {
+      System.err.println("usage: java ZoneCompactor <setup file> <data directory> <zone.tab file> <output directory> <tzdata version>");
       System.exit(0);
     }
-    new ZoneCompactor(args[0], args[1], args[2], args[3]);
+    new ZoneCompactor(args[0], args[1], args[2], args[3], args[4]);
   }
 }
diff --git a/libc/tools/zoneinfo/generate b/libc/tools/zoneinfo/generate
index e9ff59b..27d023f 100755
--- a/libc/tools/zoneinfo/generate
+++ b/libc/tools/zoneinfo/generate
@@ -89,7 +89,8 @@
                          '%s/libcore/util/ZoneInfo.java' % libcore_src_dir,
                          '%s/libcore/io/BufferIterator.java' % libcore_src_dir])
   subprocess.check_call(['java', 'ZoneCompactor',
-                         'setup', 'data', bionic_libc_zoneinfo_dir, new_version])
+                         'setup', 'data', 'extracted/zone.tab',
+                         bionic_libc_zoneinfo_dir, new_version])
 
 
 # Run with no arguments from any directory, with no special setup required.
diff --git a/libc/tzcode/localtime.c b/libc/tzcode/localtime.c
index 31068f1..0ab9e0f 100644
--- a/libc/tzcode/localtime.c
+++ b/libc/tzcode/localtime.c
@@ -2247,13 +2247,11 @@
   }
 
   // byte[12] tzdata_version  -- "tzdata2012f\0"
-  // int file_format_version  -- 1
   // int index_offset
   // int data_offset
   // int zonetab_offset
   struct bionic_tzdata_header {
     char tzdata_version[12];
-    int32_t file_format_version;
     int32_t index_offset;
     int32_t data_offset;
     int32_t zonetab_offset;
@@ -2269,14 +2267,9 @@
     close(fd);
     return -1;
   }
-  if (ntohl(header.file_format_version) != 1) {
-    fprintf(stderr, "%s: bad file format version: %d\n", __FUNCTION__, header.file_format_version);
-    close(fd);
-    return -1;
-  }
 
 #if 0
-  fprintf(stderr, "version: %s (%d)\n", header.tzdata_version, ntohl(header.file_format_version));
+  fprintf(stderr, "version: %s\n", header.tzdata_version);
   fprintf(stderr, "index_offset = %d\n", ntohl(header.index_offset));
   fprintf(stderr, "data_offset = %d\n", ntohl(header.data_offset));
   fprintf(stderr, "zonetab_offset = %d\n", ntohl(header.zonetab_offset));
diff --git a/libc/zoneinfo/tzdata b/libc/zoneinfo/tzdata
index f5fefe2..a1c77d6 100644
--- a/libc/zoneinfo/tzdata
+++ b/libc/zoneinfo/tzdata
Binary files differ
