Index: uspace/drv/time/cmos-rtc/cmos-regs.h
===================================================================
--- uspace/drv/time/cmos-rtc/cmos-regs.h	(revision cf729431e2d328dcd1fd95a1f692c33d72b93030)
+++ uspace/drv/time/cmos-rtc/cmos-regs.h	(revision a8a0d43569cffc3f37bdb2d40073470acce08a26)
@@ -30,20 +30,22 @@
 #define _CMOS_RTC_H_
 
-#define RTC_SEC         0x00
-#define RTC_MIN         0x02
-#define RTC_HOUR        0x04
-#define RTC_DAY         0x07
-#define RTC_MON         0x08
-#define RTC_YEAR        0x09
+#define RTC_SEC           0x00
+#define RTC_MIN           0x02
+#define RTC_HOUR          0x04
+#define RTC_DAY           0x07
+#define RTC_MON           0x08
+#define RTC_YEAR          0x09
 
-#define RTC_STATUS_B    0x0B
-#define RTC_MASK_24H    0x02 /* 24h mode */
-#define RTC_MASK_BCD    0x04 /* BCD mode */
+#define RTC_STATUS_B      0x0B
+#define RTC_MASK_24H      0x02 /* 24h mode */
+#define RTC_MASK_BCD      0x04 /* BCD mode */
+#define RTC_MASK_INH      0x80 /* Inhibit updates */
 
-#define RTC_STATUS_D    0x0D
-#define RTC_BATTERY_OK  0x80 /* Battery status */
+#define RTC_STATUS_D      0x0D
+#define RTC_BATTERY_OK    0x80 /* Battery status */
 
-#define RTC_STATUS_A    0x0A
-#define RTC_MASK_UPDATE 0x80 /* Update in progress */
+#define RTC_STATUS_A      0x0A
+#define RTC_MASK_UPDATE   0x80 /* Update in progress */
+#define RTC_MASK_CLK_STOP 0x70 /* Stop the clock */
 
 #endif
Index: uspace/drv/time/cmos-rtc/cmos-rtc.c
===================================================================
--- uspace/drv/time/cmos-rtc/cmos-rtc.c	(revision cf729431e2d328dcd1fd95a1f692c33d72b93030)
+++ uspace/drv/time/cmos-rtc/cmos-rtc.c	(revision a8a0d43569cffc3f37bdb2d40073470acce08a26)
@@ -91,4 +91,5 @@
 static int rtc_dev_remove(ddf_dev_t *dev);
 static int rtc_tm_sanity_check(struct tm *t);
+static void rtc_register_write(rtc_t *rtc, int reg, int data);
 
 
@@ -247,6 +248,4 @@
 }
 
-/* XXX */
-#if 0
 /** Write a register to the CMOS memory
  *
@@ -261,8 +260,4 @@
 	pio_write_8(rtc->port + 1, data);
 }
-
-#endif
-
-/* XXX */
 
 /** Check if an update is in progress
@@ -373,6 +368,8 @@
 rtc_time_set(ddf_fun_t *fun, struct tm *t)
 {
-	int rc;
+	int  rc;
 	bool bcd_mode;
+	int  reg_b;
+	int  reg_a;
 	rtc_t *rtc = RTC_FROM_FNODE(fun);
 
@@ -381,10 +378,12 @@
 		return rc;
 
-	t->tm_mon++; /* Must start from 1, not from 0 */
+	t->tm_mon++; /* counts from 1, not from 0 */
 
 	fibril_mutex_lock(&rtc->mutex);
 
+	reg_b = rtc_register_read(rtc, RTC_STATUS_B);
+
 	/* Check if the rtc is working in bcd mode */
-	bcd_mode = !(rtc_register_read(rtc, RTC_STATUS_B) & RTC_MASK_BCD);
+	bcd_mode = !(reg_b & RTC_MASK_BCD);
 	if (bcd_mode) {
 		/* Convert the tm struct fields in BCD mode */
@@ -397,5 +396,22 @@
 	}
 
-	/* XXX Inhibit updates */
+	/* Inhibit updates */
+	rtc_register_write(rtc, RTC_STATUS_B, reg_b | RTC_MASK_INH);
+
+	/* Write current time to RTC */
+	rtc_register_write(rtc, RTC_SEC, t->tm_sec);
+	rtc_register_write(rtc, RTC_MIN, t->tm_min);
+	rtc_register_write(rtc, RTC_HOUR, t->tm_hour);
+	rtc_register_write(rtc, RTC_DAY, t->tm_mday);
+	rtc_register_write(rtc, RTC_MON, t->tm_mon);
+	rtc_register_write(rtc, RTC_YEAR, t->tm_year);
+
+	/* Stop the clock */
+	reg_a = rtc_register_read(rtc, RTC_STATUS_A);
+	rtc_register_write(rtc, RTC_STATUS_A, RTC_MASK_CLK_STOP | reg_a);
+	
+	/* Enable updates */
+	rtc_register_write(rtc, RTC_STATUS_B, reg_b);
+	rtc_register_write(rtc, RTC_STATUS_A, reg_a);
 
 	fibril_mutex_unlock(&rtc->mutex);
