diff --git a/libc/Android.bp b/libc/Android.bp
index 8c6f596..7c137b0 100644
--- a/libc/Android.bp
+++ b/libc/Android.bp
@@ -129,6 +129,7 @@
     defaults: ["libc_defaults"],
     srcs: [
         "tzcode/**/*.c",
+        "tzcode/bionic.cpp",
         "upstream-openbsd/lib/libc/time/wcsftime.c", // tzcode doesn't include wcsftime, so we use the OpenBSD one.
     ],
 
diff --git a/libc/tzcode/bionic.cpp b/libc/tzcode/bionic.cpp
new file mode 100644
index 0000000..5ae3fab
--- /dev/null
+++ b/libc/tzcode/bionic.cpp
@@ -0,0 +1,232 @@
+/*
+ * Copyright (C) 2017 The Android Open Source Project
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *  * Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ *  * Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in
+ *    the documentation and/or other materials provided with the
+ *    distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+ * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+ * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+ * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
+ * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+ * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+ * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#include <arpa/inet.h> // For ntohl(3).
+#include <fcntl.h>
+#include <stdint.h>
+#include <stdlib.h>
+#include <unistd.h>
+
+#include "private/CachedProperty.h"
+
+extern "C" void tzset_unlocked(void);
+extern "C" int __bionic_open_tzdata(const char*, int32_t*);
+
+extern "C" void tzsetlcl(char const*);
+
+void tzset_unlocked() {
+  // The TZ environment variable is meant to override the system-wide setting.
+  const char* name = getenv("TZ");
+  char buf[PROP_VALUE_MAX];
+
+  // If that's not set, look at the "persist.sys.timezone" system property.
+  if (name == nullptr) {
+    static CachedProperty persist_sys_timezone("persist.sys.timezone");
+
+    if ((name = persist_sys_timezone.Get()) != nullptr && strlen(name) > 3) {
+      // POSIX and Java disagree about the sign in a timezone string. For POSIX, "GMT+3" means
+      // "3 hours west/behind", but for Java it means "3 hours east/ahead". Since (a) Java is
+      // the one that matches human expectations and (b) this system property is used directly
+      // by Java, we flip the sign here to translate from Java to POSIX. http://b/25463955.
+      char sign = name[3];
+      if (sign == '-' || sign == '+') {
+        strlcpy(buf, name, sizeof(buf));
+        buf[3] = (sign == '-') ? '+' : '-';
+        name = buf;
+      }
+    }
+  }
+
+  // If the system property is also not available (because you're running AOSP on a WiFi-only
+  // device, say), fall back to GMT.
+  if (name == nullptr) name = "GMT";
+
+  tzsetlcl(name);
+}
+
+#if !defined(__ANDROID__)
+static char* make_path(const char* path_prefix_variable,
+                       const char* path_suffix) {
+  const char* path_prefix = getenv(path_prefix_variable);
+  if (path_prefix == nullptr) {
+    fprintf(stderr, "%s: %s not set!\n", __FUNCTION__, path_prefix_variable);
+    return -1;
+  }
+  char* path;
+  if (asprintf(&path, "%s/%s", path_prefix, path_suffix) == -1) {
+    fprintf(stderr, "%s: couldn't allocate \"%s/%s\"\n", __FUNCTION__, path_prefix, path_suffix);
+    return -1;
+  }
+  return path;
+}
+#endif
+
+static int __bionic_open_tzdata_path(const char* path,
+                                     const char* olson_id,
+                                     int32_t* entry_length) {
+  int fd = TEMP_FAILURE_RETRY(open(path, O_RDONLY | O_CLOEXEC));
+  if (fd == -1) {
+    return -2; // Distinguish failure to find any data from failure to find a specific id.
+  }
+
+  // byte[12] tzdata_version  -- "tzdata2012f\0"
+  // int index_offset
+  // int data_offset
+  // int zonetab_offset
+  struct bionic_tzdata_header {
+    char tzdata_version[12];
+    int32_t index_offset;
+    int32_t data_offset;
+    int32_t zonetab_offset;
+  } header;
+  memset(&header, 0, sizeof(header));
+  ssize_t bytes_read = TEMP_FAILURE_RETRY(read(fd, &header, sizeof(header)));
+  if (bytes_read != sizeof(header)) {
+    fprintf(stderr, "%s: could not read header of \"%s\": %s\n",
+            __FUNCTION__, path, (bytes_read == -1) ? strerror(errno) : "short read");
+    close(fd);
+    return -1;
+  }
+
+  if (strncmp(header.tzdata_version, "tzdata", 6) != 0 || header.tzdata_version[11] != 0) {
+    fprintf(stderr, "%s: bad magic in \"%s\": \"%.6s\"\n",
+            __FUNCTION__, path, header.tzdata_version);
+    close(fd);
+    return -1;
+  }
+
+#if 0
+  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));
+#endif
+
+  if (TEMP_FAILURE_RETRY(lseek(fd, ntohl(header.index_offset), SEEK_SET)) == -1) {
+    fprintf(stderr, "%s: couldn't seek to index in \"%s\": %s\n",
+            __FUNCTION__, path, strerror(errno));
+    close(fd);
+    return -1;
+  }
+
+  off_t specific_zone_offset = -1;
+  ssize_t index_size = ntohl(header.data_offset) - ntohl(header.index_offset);
+  char* index = new char[index_size];
+  if (index == nullptr) {
+    fprintf(stderr, "%s: couldn't allocate %zd-byte index for \"%s\"\n",
+            __FUNCTION__, index_size, path);
+    close(fd);
+    return -1;
+  }
+  if (TEMP_FAILURE_RETRY(read(fd, index, index_size)) != index_size) {
+    fprintf(stderr, "%s: could not read index of \"%s\": %s\n",
+            __FUNCTION__, path, (bytes_read == -1) ? strerror(errno) : "short read");
+    delete[] index;
+    close(fd);
+    return -1;
+  }
+
+  static const size_t NAME_LENGTH = 40;
+  struct index_entry_t {
+    char buf[NAME_LENGTH];
+    int32_t start;
+    int32_t length;
+    int32_t unused; // Was raw GMT offset; always 0 since tzdata2014f (L).
+  };
+
+  size_t id_count = (ntohl(header.data_offset) - ntohl(header.index_offset)) / sizeof(struct index_entry_t);
+  struct index_entry_t* entry = (struct index_entry_t*) index;
+  for (size_t i = 0; i < id_count; ++i) {
+    char this_id[NAME_LENGTH + 1];
+    memcpy(this_id, entry->buf, NAME_LENGTH);
+    this_id[NAME_LENGTH] = '\0';
+
+    if (strcmp(this_id, olson_id) == 0) {
+      specific_zone_offset = ntohl(entry->start) + ntohl(header.data_offset);
+      *entry_length = ntohl(entry->length);
+      break;
+    }
+
+    ++entry;
+  }
+  delete[] index;
+
+  if (specific_zone_offset == -1) {
+    close(fd);
+    return -1;
+  }
+
+  if (TEMP_FAILURE_RETRY(lseek(fd, specific_zone_offset, SEEK_SET)) == -1) {
+    fprintf(stderr, "%s: could not seek to %ld in \"%s\": %s\n",
+            __FUNCTION__, specific_zone_offset, path, strerror(errno));
+    close(fd);
+    return -1;
+  }
+
+  // TODO: check that there's TZ_MAGIC at this offset, so we can fall back to the other file if not.
+
+  return fd;
+}
+
+int __bionic_open_tzdata(const char* olson_id, int32_t* entry_length) {
+  int fd;
+
+#if defined(__ANDROID__)
+  // On Android, try the two hard-coded locations.
+  fd = __bionic_open_tzdata_path("/data/misc/zoneinfo/current/tzdata",
+                                 olson_id, entry_length);
+  if (fd >= 0) return fd;
+
+  fd = __bionic_open_tzdata_path("/system/usr/share/zoneinfo/tzdata",
+                                 olson_id, entry_length);
+  if (fd >= 0) return fd;
+#else
+  // On the host, we don't expect those locations to exist, and we're not
+  // worried about security so we trust $ANDROID_DATA and $ANDROID_ROOT to
+  // point us in the right direction.
+  char* path = make_path("ANDROID_DATA", "/misc/zoneinfo/current/tzdata");
+  fd = __bionic_open_tzdata_path(path, olson_id, entry_length);
+  free(path);
+  if (fd >= 0) return fd;
+
+  path = make_path("ANDROID_ROOT", "/usr/share/zoneinfo/tzdata");
+  fd = __bionic_open_tzdata_path(path, olson_id, entry_length);
+  free(path);
+  if (fd >= 0) return fd;
+#endif
+
+  // Not finding any tzdata is more serious that not finding a specific zone,
+  // and worth logging.
+  if (fd == -2) {
+    // The first thing that 'recovery' does is try to format the current time. It doesn't have
+    // any tzdata available, so we must not abort here --- doing so breaks the recovery image!
+    fprintf(stderr, "%s: couldn't find any tzdata when looking for %s!\n", __FUNCTION__, olson_id);
+  }
+
+  return fd;
+}
diff --git a/libc/tzcode/localtime.c b/libc/tzcode/localtime.c
index 8d5cd07..091bab0 100644
--- a/libc/tzcode/localtime.c
+++ b/libc/tzcode/localtime.c
@@ -369,8 +369,6 @@
   } u;
 };
 
-static int __bionic_open_tzdata(const char*, int32_t*);
-
 /* Load tz data from the file named NAME into *SP.  Read extended
    format if DOEXTEND.  Use *LSP for temporary storage.  Return 0 on
    success, an errno value on failure.  */
@@ -398,6 +396,7 @@
 	}
 
 #if defined(__BIONIC__)
+	extern int __bionic_open_tzdata(const char*, int32_t*);
 	int32_t entry_length;
 	fid = __bionic_open_tzdata(name, &entry_length);
 #else
@@ -1279,7 +1278,7 @@
   }
 }
 
-static void
+void
 tzsetlcl(char const *name)
 {
   struct state *sp = lclptr;
@@ -1314,58 +1313,14 @@
 #endif
 
 #if defined(__BIONIC__)
-#define _REALLY_INCLUDE_SYS__SYSTEM_PROPERTIES_H_
-#include <sys/_system_properties.h> // For __system_property_serial.
-#endif
-
+extern void tzset_unlocked(void);
+#else
 static void
 tzset_unlocked(void)
 {
-#if defined(__BIONIC__)
-  // The TZ environment variable is meant to override the system-wide setting.
-  const char* name = getenv("TZ");
-
-  // If that's not set, look at the "persist.sys.timezone" system property.
-  if (name == NULL) {
-    // The lookup is the most expensive part by several orders of magnitude, so we cache it.
-    // We check for null more than once because the system property may not have been set
-    // yet, so our first lookup may fail.
-    static const prop_info* pi;
-    if (pi == NULL) pi = __system_property_find("persist.sys.timezone");
-
-    if (pi) {
-      // If the property hasn't changed since the last time we read it, there's nothing else to do.
-      static uint32_t last_serial = -1;
-      uint32_t serial = __system_property_serial(pi);
-      if (serial == last_serial) return;
-
-      // Otherwise read the new value...
-      last_serial = serial;
-      char buf[PROP_VALUE_MAX];
-      if (__system_property_read(pi, NULL, buf) > 0) {
-        // POSIX and Java disagree about the sign in a timezone string. For POSIX, "GMT+3" means
-        // "3 hours west/behind", but for Java it means "3 hours east/ahead". Since (a) Java is
-        // the one that matches human expectations and (b) this system property is used directly
-        // by Java, we flip the sign here to translate from Java to POSIX. http://b/25463955.
-        if (buf[3] == '-') {
-          buf[3] = '+';
-        } else if (buf[3] == '+') {
-          buf[3] = '-';
-        }
-        name = buf;
-      }
-    }
-  }
-
-  // If the system property is also not available (because you're running AOSP on a WiFi-only
-  // device, say), fall back to GMT.
-  if (name == NULL) name = gmt;
-
-  tzsetlcl(name);
-#else
   tzsetlcl(getenv("TZ"));
-#endif
 }
+#endif
 
 void
 tzset(void)
@@ -2346,175 +2301,3 @@
 }
 
 #endif
-
-// BEGIN android-added
-
-#include <assert.h>
-#include <stdint.h>
-#include <arpa/inet.h> // For ntohl(3).
-
-#if !defined(__ANDROID__)
-static char* make_path(const char* path_prefix_variable,
-                       const char* path_suffix) {
-  const char* path_prefix = getenv(path_prefix_variable);
-  if (path_prefix == NULL) {
-    fprintf(stderr, "%s: %s not set!\n", __FUNCTION__, path_prefix_variable);
-    return -1;
-  }
-  size_t path_length = strlen(path_prefix) + 1 + strlen(path_suffix) + 1;
-  char* path = malloc(path_length);
-  if (path == NULL) {
-    fprintf(stderr, "%s: couldn't allocate %zu-byte path\n", __FUNCTION__, path_length);
-    return -1;
-  }
-  snprintf(path, path_length, "%s/%s", path_prefix, path_suffix);
-  return path;
-}
-#endif
-
-static int __bionic_open_tzdata_path(const char* path,
-                                     const char* olson_id,
-                                     int32_t* entry_length) {
-  int fd = TEMP_FAILURE_RETRY(open(path, O_RDONLY | O_CLOEXEC));
-  if (fd == -1) {
-    return -2; // Distinguish failure to find any data from failure to find a specific id.
-  }
-
-  // byte[12] tzdata_version  -- "tzdata2012f\0"
-  // int index_offset
-  // int data_offset
-  // int zonetab_offset
-  struct bionic_tzdata_header {
-    char tzdata_version[12];
-    int32_t index_offset;
-    int32_t data_offset;
-    int32_t zonetab_offset;
-  } header;
-  memset(&header, 0, sizeof(header));
-  ssize_t bytes_read = TEMP_FAILURE_RETRY(read(fd, &header, sizeof(header)));
-  if (bytes_read != sizeof(header)) {
-    fprintf(stderr, "%s: could not read header of \"%s\": %s\n",
-            __FUNCTION__, path, (bytes_read == -1) ? strerror(errno) : "short read");
-    close(fd);
-    return -1;
-  }
-
-  if (strncmp(header.tzdata_version, "tzdata", 6) != 0 || header.tzdata_version[11] != 0) {
-    fprintf(stderr, "%s: bad magic in \"%s\": \"%.6s\"\n",
-            __FUNCTION__, path, header.tzdata_version);
-    close(fd);
-    return -1;
-  }
-
-#if 0
-  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));
-#endif
-
-  if (TEMP_FAILURE_RETRY(lseek(fd, ntohl(header.index_offset), SEEK_SET)) == -1) {
-    fprintf(stderr, "%s: couldn't seek to index in \"%s\": %s\n",
-            __FUNCTION__, path, strerror(errno));
-    close(fd);
-    return -1;
-  }
-
-  off_t specific_zone_offset = -1;
-  ssize_t index_size = ntohl(header.data_offset) - ntohl(header.index_offset);
-  char* index = malloc(index_size);
-  if (index == NULL) {
-    fprintf(stderr, "%s: couldn't allocate %zd-byte index for \"%s\"\n",
-            __FUNCTION__, index_size, path);
-    close(fd);
-    return -1;
-  }
-  if (TEMP_FAILURE_RETRY(read(fd, index, index_size)) != index_size) {
-    fprintf(stderr, "%s: could not read index of \"%s\": %s\n",
-            __FUNCTION__, path, (bytes_read == -1) ? strerror(errno) : "short read");
-    free(index);
-    close(fd);
-    return -1;
-  }
-
-  static const size_t NAME_LENGTH = 40;
-  struct index_entry_t {
-    char buf[NAME_LENGTH];
-    int32_t start;
-    int32_t length;
-    int32_t unused; // Was raw GMT offset; always 0 since tzdata2014f (L).
-  };
-
-  size_t id_count = (ntohl(header.data_offset) - ntohl(header.index_offset)) / sizeof(struct index_entry_t);
-  struct index_entry_t* entry = (struct index_entry_t*) index;
-  for (size_t i = 0; i < id_count; ++i) {
-    char this_id[NAME_LENGTH + 1];
-    memcpy(this_id, entry->buf, NAME_LENGTH);
-    this_id[NAME_LENGTH] = '\0';
-
-    if (strcmp(this_id, olson_id) == 0) {
-      specific_zone_offset = ntohl(entry->start) + ntohl(header.data_offset);
-      *entry_length = ntohl(entry->length);
-      break;
-    }
-
-    ++entry;
-  }
-  free(index);
-
-  if (specific_zone_offset == -1) {
-    close(fd);
-    return -1;
-  }
-
-  if (TEMP_FAILURE_RETRY(lseek(fd, specific_zone_offset, SEEK_SET)) == -1) {
-    fprintf(stderr, "%s: could not seek to %ld in \"%s\": %s\n",
-            __FUNCTION__, specific_zone_offset, path, strerror(errno));
-    close(fd);
-    return -1;
-  }
-
-  // TODO: check that there's TZ_MAGIC at this offset, so we can fall back to the other file if not.
-
-  return fd;
-}
-
-static int __bionic_open_tzdata(const char* olson_id, int32_t* entry_length) {
-  int fd;
-
-#if defined(__ANDROID__)
-  // On Android, try the two hard-coded locations.
-  fd = __bionic_open_tzdata_path("/data/misc/zoneinfo/current/tzdata",
-                                 olson_id, entry_length);
-  if (fd >= 0) return fd;
-
-  fd = __bionic_open_tzdata_path("/system/usr/share/zoneinfo/tzdata",
-                                 olson_id, entry_length);
-  if (fd >= 0) return fd;
-#else
-  // On the host, we don't expect those locations to exist, and we're not
-  // worried about security so we trust $ANDROID_DATA and $ANDROID_ROOT to
-  // point us in the right direction.
-  char* path = make_path("ANDROID_DATA", "/misc/zoneinfo/current/tzdata");
-  fd = __bionic_open_tzdata_path(path, olson_id, entry_length);
-  free(path);
-  if (fd >= 0) return fd;
-
-  path = make_path("ANDROID_ROOT", "/usr/share/zoneinfo/tzdata");
-  fd = __bionic_open_tzdata_path(path, olson_id, entry_length);
-  free(path);
-  if (fd >= 0) return fd;
-#endif
-
-  // Not finding any tzdata is more serious that not finding a specific zone,
-  // and worth logging.
-  if (fd == -2) {
-    // The first thing that 'recovery' does is try to format the current time. It doesn't have
-    // any tzdata available, so we must not abort here --- doing so breaks the recovery image!
-    fprintf(stderr, "%s: couldn't find any tzdata when looking for %s!\n", __FUNCTION__, olson_id);
-  }
-
-  return fd;
-}
-
-// END android-added
