Index: uspace/drv/time/cmos-rtc/cmos-rtc.c
===================================================================
--- uspace/drv/time/cmos-rtc/cmos-rtc.c	(revision db80a2ea760b13900950dfbd9d3aebc19189973a)
+++ uspace/drv/time/cmos-rtc/cmos-rtc.c	(revision ea5cc5b6a6f00fb33e6f02f2f3f401d2fb3984a2)
@@ -297,4 +297,14 @@
 	rtc_t *rtc = RTC_FROM_FNODE(fun);
 
+	if (boottime != 0) {
+		/* There is no need to read the current time from the
+		 * device because it has already been cached.
+		 */
+
+		time_t cur_time = boottime + uptime_get();
+		*t = *gmtime(&cur_time);
+		return EOK;
+	}
+
 	fibril_mutex_lock(&rtc->mutex);
 
@@ -366,4 +376,6 @@
 	/* Try to normalize the content of the tm structure */
 	time_t r = mktime(t);
+
+	boottime = r - uptime_get();
 
 	return r < 0 ? EINVAL : EOK;
@@ -578,5 +590,4 @@
 	rtc_t *rtc = RTC_FROM_FNODE(fun);
 	bool batt_ok;
-	sysarg_t r = EOK;
 
 	switch (method) {
@@ -586,22 +597,4 @@
 		    RTC_D_BATTERY_OK;
 		async_answer_1(callid, EOK, batt_ok);
-		break;
-	case CLOCK_GET_BOOTTIME:
-		/* Get the boot time */
-		if (boottime == 0) {
-			struct tm cur_tm;
-			time_t uptime;
-
-			uptime = uptime_get();
-			r = rtc_time_get(fun, &cur_tm);
-			if (r == EOK) {
-				time_t current_time = mktime(&cur_tm);
-				if (current_time < uptime)
-					r = EINVAL;
-				else
-					boottime = current_time - uptime;
-			}
-		}
-		async_answer_1(callid, r, boottime);
 		break;
 	default:
Index: uspace/lib/c/include/ipc/clock_ctl.h
===================================================================
--- uspace/lib/c/include/ipc/clock_ctl.h	(revision db80a2ea760b13900950dfbd9d3aebc19189973a)
+++ uspace/lib/c/include/ipc/clock_ctl.h	(revision ea5cc5b6a6f00fb33e6f02f2f3f401d2fb3984a2)
@@ -34,5 +34,4 @@
 typedef enum {
 	CLOCK_GET_BATTERY_STATUS = DEV_FIRST_CUSTOM_METHOD,
-	CLOCK_GET_BOOTTIME,
 } clock_ctl_t;
 
