diff --git a/libc/tzcode/localtime.c b/libc/tzcode/localtime.c
index 6838180..e442a03 100644
--- a/libc/tzcode/localtime.c
+++ b/libc/tzcode/localtime.c
@@ -217,9 +217,9 @@
 static const char * getrule P((const char * strp, struct rule * rulep));
 static void     gmtload P((struct state * sp));
 static struct tm *  gmtsub P((const time_t * timep, long offset,
-                struct tm * tmp, const struct state * sp)); // android-changed: added sp.
+                struct tm * tmp));
 static struct tm *  localsub P((const time_t * timep, long offset,
-                struct tm * tmp, const struct state * sp)); // android-changed: added sp.
+                struct tm * tmp));
 static int      increment_overflow P((int * number, int delta));
 static int      leaps_thru_end_of P((int y));
 static int      long_increment_overflow P((long * number, int delta));
@@ -230,16 +230,16 @@
 static void     settzname P((void));
 static time_t       time1 P((struct tm * tmp,
                 struct tm * (*funcp) P((const time_t *,
-                long, struct tm *, const struct state *)), // android-changed: added state*.
-                long offset, const struct state * sp)); // android-changed: added sp.
+                long, struct tm *)),
+                long offset));
 static time_t       time2 P((struct tm *tmp,
                 struct tm * (*funcp) P((const time_t *,
-                long, struct tm*, const struct state *)), // android-changed: added state*.
-                long offset, int * okayp, const struct state * sp)); // android-changed: added sp.
+                long, struct tm*)),
+                long offset, int * okayp));
 static time_t       time2sub P((struct tm *tmp,
                 struct tm * (*funcp) P((const time_t *,
-                long, struct tm*, const struct state *)), // android-changed: added state*.
-                long offset, int * okayp, int do_norm_secs, const struct state * sp)); // android-change: added sp.
+                long, struct tm*)),
+                long offset, int * okayp, int do_norm_secs));
 static struct tm *  timesub P((const time_t * timep, long offset,
                 const struct state * sp, struct tm * tmp));
 static int      tmcomp P((const struct tm * atmp,
@@ -1331,25 +1331,21 @@
 
 /*ARGSUSED*/
 static struct tm *
-localsub(timep, offset, tmp, sp) // android-changed: added sp.
+localsub(timep, offset, tmp)
 const time_t * const    timep;
 const long      offset;
 struct tm * const   tmp;
-const struct state * sp; // android-added: added sp.
 {
+    register struct state *     sp;
     register const struct ttinfo *  ttisp;
     register int            i;
     register struct tm *        result;
     const time_t            t = *timep;
 
-    // BEGIN android-changed: support user-supplied sp.
-    if (sp == NULL) {
-        sp = lclptr;
-    }
-    // END android-changed
+    sp = lclptr;
 #ifdef ALL_STATE
     if (sp == NULL)
-        return gmtsub(timep, offset, tmp, sp); // android-changed: added sp.
+        return gmtsub(timep, offset, tmp);
 #endif /* defined ALL_STATE */
     if ((sp->goback && t < sp->ats[0]) ||
         (sp->goahead && t > sp->ats[sp->timecnt - 1])) {
@@ -1376,7 +1372,7 @@
             if (newt < sp->ats[0] ||
                 newt > sp->ats[sp->timecnt - 1])
                     return NULL;    /* "cannot happen" */
-            result = localsub(&newt, offset, tmp, sp); // android-changed: added sp.
+            result = localsub(&newt, offset, tmp);
             if (result == tmp) {
                 register time_t newy;
 
@@ -1446,7 +1442,7 @@
 
     _tzLock();
     tzset_locked();
-    result = localsub(timep, 0L, tmp, NULL); // android-changed: extra parameter.
+    result = localsub(timep, 0L, tmp);
     _tzUnlock();
 
     return result;
@@ -1457,16 +1453,13 @@
 */
 
 static struct tm *
-gmtsub(timep, offset, tmp, sp) // android-changed: added sp.
+gmtsub(timep, offset, tmp)
 const time_t * const    timep;
 const long      offset;
 struct tm * const   tmp;
-const struct state * sp; // android-changed: added sp.
 {
     register struct tm *    result;
 
-    (void) sp; // android-added: unused.
-
     if (!gmt_is_set) {
         gmt_is_set = TRUE;
 #ifdef ALL_STATE
@@ -1517,7 +1510,7 @@
     struct tm*  result;
 
     _tzLock();
-    result = gmtsub(timep, 0L, tmp, NULL); // android-changed: extra parameter.
+    result = gmtsub(timep, 0L, tmp);
     _tzUnlock();
 
     return result;
@@ -1530,7 +1523,7 @@
 const time_t * const    timep;
 const long      offset;
 {
-    return gmtsub(timep, offset, &tmGlobal, NULL); // android-changed: extra parameter.
+    return gmtsub(timep, offset, &tmGlobal);
 }
 #endif /* 0 */
 #endif /* defined STD_INSPIRED */
@@ -1803,14 +1796,14 @@
 }
 
 static time_t
-time2sub(tmp, funcp, offset, okayp, do_norm_secs, sp) // android-changed: added sp
+time2sub(tmp, funcp, offset, okayp, do_norm_secs)
 struct tm * const   tmp;
-struct tm * (* const    funcp) P((const time_t*, long, struct tm*, const struct state*)); // android-changed: added state*
+struct tm * (* const    funcp) P((const time_t*, long, struct tm*));
 const long      offset;
 int * const     okayp;
 const int       do_norm_secs;
-const struct state * sp; // android-changed: added sp
 {
+    register const struct state *   sp;
     register int            dir;
     register int            i, j;
     register int            saved_seconds;
@@ -1912,7 +1905,7 @@
             t = lo;
         else if (t > hi)
             t = hi;
-        if ((*funcp)(&t, offset, &mytm, sp) == NULL) { // android-changed: added sp.
+        if ((*funcp)(&t, offset, &mytm) == NULL) {
             /*
             ** Assume that t is too extreme to be represented in
             ** a struct tm; arrange things so that it is less
@@ -1950,13 +1943,9 @@
         /*
         ** The (void *) casts are the benefit of SunOS 3.3 on Sun 2's.
         */
-        // BEGIN android-changed: support user-supplied sp
-        if (sp == NULL) {
-            sp = (const struct state *)
-                (((void *) funcp == (void *) localsub) ?
-                lclptr : gmtptr);
-        }
-        // END android-changed
+        sp = (const struct state *)
+            (((void *) funcp == (void *) localsub) ?
+            lclptr : gmtptr);
 #ifdef ALL_STATE
         if (sp == NULL)
             return WRONG;
@@ -1969,7 +1958,7 @@
                     continue;
                 newt = t + sp->ttis[j].tt_gmtoff -
                     sp->ttis[i].tt_gmtoff;
-                if ((*funcp)(&newt, offset, &mytm, sp) == NULL) // android-changed: added sp.
+                if ((*funcp)(&newt, offset, &mytm) == NULL)
                     continue;
                 if (tmcomp(&mytm, &yourtm) != 0)
                     continue;
@@ -1989,19 +1978,17 @@
     if ((newt < t) != (saved_seconds < 0))
         return WRONG;
     t = newt;
-    if ((*funcp)(&t, offset, tmp, sp)) // android-changed: added sp.
+    if ((*funcp)(&t, offset, tmp))
         *okayp = TRUE;
     return t;
 }
 
-// BEGIN android-changed: added sp.
 static time_t
-time2(tmp, funcp, offset, okayp, sp)
+time2(tmp, funcp, offset, okayp)
 struct tm * const   tmp;
-struct tm * (* const    funcp) P((const time_t*, long, struct tm*, const struct state*));
+struct tm * (* const    funcp) P((const time_t*, long, struct tm*));
 const long      offset;
 int * const     okayp;
-const struct state * sp;
 {
     time_t  t;
 
@@ -2010,19 +1997,18 @@
     ** (in case tm_sec contains a value associated with a leap second).
     ** If that fails, try with normalization of seconds.
     */
-    t = time2sub(tmp, funcp, offset, okayp, FALSE, sp);
-    return *okayp ? t : time2sub(tmp, funcp, offset, okayp, TRUE, sp);
+    t = time2sub(tmp, funcp, offset, okayp, FALSE);
+    return *okayp ? t : time2sub(tmp, funcp, offset, okayp, TRUE);
 }
-// END android-changed
 
 static time_t
-time1(tmp, funcp, offset, sp) // android-changed: added sp.
+time1(tmp, funcp, offset)
 struct tm * const   tmp;
-struct tm * (* const    funcp) P((const time_t *, long, struct tm *, const struct state *));
+struct tm * (* const    funcp) P((const time_t *, long, struct tm *));
 const long      offset;
-const struct state * sp; // android-changed: added sp.
 {
     register time_t         t;
+    register const struct state *   sp;
     register int            samei, otheri;
     register int            sameind, otherind;
     register int            i;
@@ -2033,7 +2019,7 @@
 
     if (tmp->tm_isdst > 1)
         tmp->tm_isdst = 1;
-    t = time2(tmp, funcp, offset, &okay, sp); // android-changed: added sp.
+    t = time2(tmp, funcp, offset, &okay);
 #ifdef PCTS
     /*
     ** PCTS code courtesy Grant Sullivan.
@@ -2056,12 +2042,8 @@
     /*
     ** The (void *) casts are the benefit of SunOS 3.3 on Sun 2's.
     */
-    // BEGIN android-changed: support user-supplied sp.
-    if (sp == NULL) {
-        sp = (const struct state *) (((void *) funcp == (void *) localsub) ?
-            lclptr : gmtptr);
-    }
-    // BEGIN android-changed
+    sp = (const struct state *) (((void *) funcp == (void *) localsub) ?
+        lclptr : gmtptr);
 #ifdef ALL_STATE
     if (sp == NULL)
         return WRONG;
@@ -2085,7 +2067,7 @@
             tmp->tm_sec += sp->ttis[otheri].tt_gmtoff -
                     sp->ttis[samei].tt_gmtoff;
             tmp->tm_isdst = !tmp->tm_isdst;
-            t = time2(tmp, funcp, offset, &okay, sp); // android-changed: added sp.
+            t = time2(tmp, funcp, offset, &okay);
             if (okay)
                 return t;
             tmp->tm_sec -= sp->ttis[otheri].tt_gmtoff -
@@ -2103,40 +2085,11 @@
     time_t  result;
     _tzLock();
     tzset_locked();
-    result = time1(tmp, localsub, 0L, NULL); // android-changed: extra parameter.
+    result = time1(tmp, localsub, 0L);
     _tzUnlock();
     return result;
 }
 
-// BEGIN android-added
-time_t
-mktime_tz(tmp, tz)
-struct tm * const tmp;
-char const * tz;
-{
-    struct state st;
-    if (tzload(tz, &st, TRUE) != 0) {
-        // TODO: not sure what's best here, but for now, we fall back to gmt.
-        gmtload(&st);
-    }
-    return time1(tmp, localsub, 0L, &st);
-}
-
-void
-localtime_tz(timep, tmp, tz)
-const time_t * const timep;
-struct tm * tmp;
-const char* tz;
-{
-    struct state st;
-    if (tzload(tz, &st, TRUE) != 0) {
-        // TODO: not sure what's best here, but for now, we fall back to gmt.
-        gmtload(&st);
-    }
-    localsub(timep, 0L, tmp, &st);
-}
-// END android-added
-
 #ifdef STD_INSPIRED
 
 time_t
@@ -2155,7 +2108,7 @@
 
     tmp->tm_isdst = 0;
     _tzLock();
-    result = time1(tmp, gmtsub, 0L, NULL); // android-changed: extra parameter.
+    result = time1(tmp, gmtsub, 0L);
     _tzUnlock();
 
     return result;
@@ -2171,7 +2124,7 @@
 
     tmp->tm_isdst = 0;
     _tzLock();
-    result = time1(tmp, gmtsub, offset, NULL); // android-changed: extra parameter.
+    result = time1(tmp, gmtsub, offset);
     _tzUnlock();
 
     return result;
