diff --git a/README.md b/README.md
index 31bec14..b2c7910 100644
--- a/README.md
+++ b/README.md
@@ -7,6 +7,7 @@ extremely accurate real-time clocks, based on the [`embedded-hal`] traits.
 
 This driver allows you to:
 - Read/write the seconds.
+- Read/write the minutes.
 
 ## The devices
 
diff --git a/src/ds323x/datetime.rs b/src/ds323x/datetime.rs
index 3558a97..16c5a60 100644
--- a/src/ds323x/datetime.rs
+++ b/src/ds323x/datetime.rs
@@ -6,14 +6,28 @@ use interface::{ ReadRegister, WriteRegister };
 
 impl<DI, IC, E> Ds323x<DI, IC>
 where
-    DI: ReadRegister<Error = E> + WriteRegister<Error = E>
+    DI: ReadRegister<Error = E>
 {
     /// Read the seconds.
     pub fn get_seconds(&mut self) -> Result<u8, Error<E>> {
-        let data = self.iface.read_register(Register::SECONDS)?;
-        Ok(packed_bcd_to_decimal(data))
+        self.read_register_decimal(Register::SECONDS)
     }
 
+    /// Read the minutes.
+    pub fn get_minutes(&mut self) -> Result<u8, Error<E>> {
+        self.read_register_decimal(Register::MINUTES)
+    }
+
+    fn read_register_decimal(&mut self, register: u8) -> Result<u8, Error<E>> {
+        let data = self.iface.read_register(register)?;
+        Ok(packed_bcd_to_decimal(data))
+    }
+}
+
+impl<DI, IC, E> Ds323x<DI, IC>
+where
+    DI: WriteRegister<Error = E>
+{
     /// Set the seconds [0-59].
     ///
     /// Will return an `Error::InvalidInputData` if the seconds are out of range.
@@ -21,7 +35,21 @@ where
         if seconds > 59 {
             return Err(Error::InvalidInputData);
         }
-        self.iface.write_register(Register::SECONDS, decimal_to_packed_bcd(seconds))
+        self.write_register_decimal(Register::SECONDS, seconds)
+    }
+
+    /// Set the minutes [0-59].
+    ///
+    /// Will return an `Error::InvalidInputData` if the minutes are out of range.
+    pub fn set_minutes(&mut self, minutes: u8) -> Result<(), Error<E>> {
+        if minutes > 59 {
+            return Err(Error::InvalidInputData);
+        }
+        self.write_register_decimal(Register::MINUTES, minutes)
+    }
+
+    fn write_register_decimal(&mut self, register: u8, decimal_number: u8) -> Result<(), Error<E>> {
+        self.iface.write_register(register, decimal_to_packed_bcd(decimal_number))
     }
 }
 
diff --git a/src/lib.rs b/src/lib.rs
index 744cf59..693c6c9 100644
--- a/src/lib.rs
+++ b/src/lib.rs
@@ -5,6 +5,7 @@
 //!
 //! This driver allows you to:
 //! - Read/write the seconds.
+//! - Read/write the minutes.
 //!
 //! ## The devices
 //!
@@ -177,6 +178,7 @@ struct Register;
 
 impl Register {
     const SECONDS   : u8 = 0x00;
+    const MINUTES   : u8 = 0x01;
 }
 
 const DEVICE_ADDRESS: u8 = 0b110_1000;
diff --git a/tests/common/mod.rs b/tests/common/mod.rs
index f35e492..cf10d14 100644
--- a/tests/common/mod.rs
+++ b/tests/common/mod.rs
@@ -10,6 +10,7 @@ pub struct Register;
 
 impl Register {
     pub const SECONDS   : u8 = 0x00;
+    pub const MINUTES   : u8 = 0x01;
 }
 
 pub struct DummyOutputPin;
diff --git a/tests/ds323x.rs b/tests/ds323x.rs
index 42360fa..ba0da06 100644
--- a/tests/ds323x.rs
+++ b/tests/ds323x.rs
@@ -7,21 +7,46 @@ mod common;
 use common::{ DEVICE_ADDRESS, Register, new_ds3231,
               new_ds3232, new_ds3234 };
 
-get_test!(can_get_seconds_ds3231, get_seconds, new_ds3231, 1,
-          I2cTrans::write_read(DEVICE_ADDRESS, vec![Register::SECONDS], vec![1]));
+mod seconds {
+    use super::*;
+    get_test!(can_get_ds3231, get_seconds, new_ds3231, 1,
+            I2cTrans::write_read(DEVICE_ADDRESS, vec![Register::SECONDS], vec![1]));
 
-get_test!(can_get_seconds_ds3232, get_seconds, new_ds3232, 1,
-          I2cTrans::write_read(DEVICE_ADDRESS, vec![Register::SECONDS], vec![1]));
+    get_test!(can_get_ds3232, get_seconds, new_ds3232, 1,
+            I2cTrans::write_read(DEVICE_ADDRESS, vec![Register::SECONDS], vec![1]));
 
-get_test!(can_get_seconds_ds3234, get_seconds, new_ds3234, 1,
-          SpiTrans::transfer(vec![Register::SECONDS, 0], vec![Register::SECONDS, 1]));
+    get_test!(can_get_ds3234, get_seconds, new_ds3234, 1,
+            SpiTrans::transfer(vec![Register::SECONDS, 0], vec![Register::SECONDS, 1]));
 
 
-set_test!(can_set_seconds_ds3231, set_seconds, new_ds3231, 1,
-          I2cTrans::write(DEVICE_ADDRESS, vec![Register::SECONDS, 1]));
+    set_test!(can_set_ds3231, set_seconds, new_ds3231, 1,
+            I2cTrans::write(DEVICE_ADDRESS, vec![Register::SECONDS, 1]));
 
-set_test!(can_set_seconds_ds3232, set_seconds, new_ds3232, 1,
-          I2cTrans::write(DEVICE_ADDRESS, vec![Register::SECONDS, 1]));
+    set_test!(can_set_ds3232, set_seconds, new_ds3232, 1,
+            I2cTrans::write(DEVICE_ADDRESS, vec![Register::SECONDS, 1]));
 
-set_test!(can_set_seconds_ds3234, set_seconds, new_ds3234, 1,
-          SpiTrans::write(vec![Register::SECONDS + 0x80, 1]));
+    set_test!(can_set_ds3234, set_seconds, new_ds3234, 1,
+            SpiTrans::write(vec![Register::SECONDS + 0x80, 1]));
+}
+
+mod minutes {
+    use super::*;
+    get_test!(can_get_ds3231, get_minutes, new_ds3231, 1,
+            I2cTrans::write_read(DEVICE_ADDRESS, vec![Register::MINUTES], vec![1]));
+
+    get_test!(can_get_ds3232, get_minutes, new_ds3232, 1,
+            I2cTrans::write_read(DEVICE_ADDRESS, vec![Register::MINUTES], vec![1]));
+
+    get_test!(can_get_ds3234, get_minutes, new_ds3234, 1,
+            SpiTrans::transfer(vec![Register::MINUTES, 0], vec![Register::MINUTES, 1]));
+
+
+    set_test!(can_set_ds3231, set_minutes, new_ds3231, 1,
+            I2cTrans::write(DEVICE_ADDRESS, vec![Register::MINUTES, 1]));
+
+    set_test!(can_set_ds3232, set_minutes, new_ds3232, 1,
+            I2cTrans::write(DEVICE_ADDRESS, vec![Register::MINUTES, 1]));
+
+    set_test!(can_set_ds3234, set_minutes, new_ds3234, 1,
+            SpiTrans::write(vec![Register::MINUTES + 0x80, 1]));
+}
\ No newline at end of file