Index: uspace/lib/c/generic/time.c
===================================================================
--- uspace/lib/c/generic/time.c	(revision 8219eb99dd0f26b10bbbfd30017d3f5c5954ae03)
+++ uspace/lib/c/generic/time.c	(revision f6cb995de3c31bddccc2c6a818f493944620302a)
@@ -798,5 +798,4 @@
 
 	return &result;
-
 }
 
@@ -833,4 +832,32 @@
 }
 
+/**
+ * Converts a time value to a broken-down local time.
+ *
+ * @param timer Time to convert.
+ * @return Normalized broken-down time in local timezone, NULL on overflow.
+ */
+struct tm *localtime(const time_t *timer)
+{
+	// TODO: deal with timezone
+	// currently assumes system and all times are in GMT
+
+	static struct tm result;
+
+	/* Set result to epoch. */
+	result.tm_sec = 0;
+	result.tm_min = 0;
+	result.tm_hour = 0;
+	result.tm_mday = 1;
+	result.tm_mon = 0;
+	result.tm_year = 70; /* 1970 */
+
+	if (_normalize_time(&result, *timer) == -1) {
+		errno = EOVERFLOW;
+		return NULL;
+	}
+
+	return &result;
+}
 
 /** @}
Index: uspace/lib/c/include/sys/time.h
===================================================================
--- uspace/lib/c/include/sys/time.h	(revision 8219eb99dd0f26b10bbbfd30017d3f5c5954ae03)
+++ uspace/lib/c/include/sys/time.h	(revision f6cb995de3c31bddccc2c6a818f493944620302a)
@@ -82,4 +82,5 @@
 extern struct tm *gmtime(const time_t *timer);
 extern char *asctime(const struct tm *timeptr);
+extern struct tm *localtime(const time_t *timer);
 extern size_t strftime(char *restrict s, size_t maxsize,
     const char *restrict format, const struct tm *restrict tm);
Index: uspace/lib/posix/time.c
===================================================================
--- uspace/lib/posix/time.c	(revision 8219eb99dd0f26b10bbbfd30017d3f5c5954ae03)
+++ uspace/lib/posix/time.c	(revision f6cb995de3c31bddccc2c6a818f493944620302a)
@@ -353,16 +353,4 @@
 /**
  * Converts a time value to a broken-down local time.
- *
- * @param timer Time to convert.
- * @return Normalized broken-down time in local timezone, NULL on overflow.
- */
-struct tm *posix_localtime(const time_t *timer)
-{
-	static struct tm result;
-	return posix_localtime_r(timer, &result);
-}
-
-/**
- * Converts a time value to a broken-down local time.
  * 
  * @param timer Time to convert.
@@ -419,5 +407,5 @@
 char *posix_ctime(const time_t *timer)
 {
-	struct tm *loctime = posix_localtime(timer);
+	struct tm *loctime = localtime(timer);
 	if (loctime == NULL) {
 		return NULL;
Index: uspace/lib/posix/time.h
===================================================================
--- uspace/lib/posix/time.h	(revision 8219eb99dd0f26b10bbbfd30017d3f5c5954ae03)
+++ uspace/lib/posix/time.h	(revision f6cb995de3c31bddccc2c6a818f493944620302a)
@@ -90,5 +90,4 @@
 extern struct tm *posix_gmtime_r(const time_t *restrict timer,
     struct tm *restrict result);
-extern struct tm *posix_localtime(const time_t *timer);
 extern struct tm *posix_localtime_r(const time_t *restrict timer,
     struct tm *restrict result);
@@ -126,5 +125,4 @@
 
 	#define gmtime_r posix_gmtime_r
-	#define localtime posix_localtime
 	#define localtime_r posix_localtime_r
 
