diff --git a/public/BLEDevice.h b/public/BLEDevice.h
index 2ebc5e3..e22c99c 100644
--- a/public/BLEDevice.h
+++ b/public/BLEDevice.h
@@ -41,9 +41,15 @@ public:
 public:
     /**
      * Set the BTLE MAC address and type.
-     * @return
+     * @return BLE_ERROR_NONE on success.
      */
-    ble_error_t setAddress(Gap::addr_type_t type, const uint8_t address[6]);
+    ble_error_t setAddress(Gap::addr_type_t type, const uint8_t address[Gap::ADDR_LEN]);
+
+    /**
+     * Fetch the BTLE MAC address and type.
+     * @return BLE_ERROR_NONE on success.
+     */
+    ble_error_t getAddress(Gap::addr_type_t *typeP, uint8_t address[Gap::ADDR_LEN]);
 
     /**
      * @param[in] advType
@@ -360,11 +366,17 @@ BLEDevice::reset(void)
 }
 
 inline ble_error_t
-BLEDevice::setAddress(Gap::addr_type_t type, const uint8_t address[6])
+BLEDevice::setAddress(Gap::addr_type_t type, const uint8_t address[Gap::ADDR_LEN])
 {
     return transport->getGap().setAddress(type, address);
 }
 
+inline ble_error_t
+BLEDevice::getAddress(Gap::addr_type_t *typeP, uint8_t address[Gap::ADDR_LEN])
+{
+    return transport->getGap().getAddress(typeP, address);
+}
+
 inline void
 BLEDevice::setAdvertisingType(GapAdvertisingParams::AdvertisingType advType)
 {
diff --git a/public/Gap.h b/public/Gap.h
index 53638fc..7ed3110 100644
--- a/public/Gap.h
+++ b/public/Gap.h
@@ -40,6 +40,8 @@ public:
         ADDR_TYPE_RANDOM_PRIVATE_NON_RESOLVABLE
     } addr_type_t;
 
+    static const unsigned ADDR_LEN = 6;
+
     /**
      * enumeration for disconnection reasons. The values for these reasons are
      * derived from Nordic's implementation; but the reasons are meant to be
@@ -70,7 +72,8 @@ public:
 
 public:
     /* These functions must be defined in the sub-class */
-    virtual ble_error_t setAddress(addr_type_t type, const uint8_t address[6]) = 0;
+    virtual ble_error_t setAddress(addr_type_t type,   const uint8_t address[ADDR_LEN]) = 0;
+    virtual ble_error_t getAddress(addr_type_t *typeP, uint8_t address[ADDR_LEN]) = 0;
     virtual ble_error_t setAdvertisingData(const GapAdvertisingData &, const GapAdvertisingData &) = 0;
     virtual ble_error_t startAdvertising(const GapAdvertisingParams &) = 0;
     virtual ble_error_t stopAdvertising(void)                    = 0;
diff --git a/nRF51Gap.cpp b/nRF51Gap.cpp
index 94ef666..91c1aef 100644
--- a/nRF51Gap.cpp
+++ b/nRF51Gap.cpp
@@ -304,7 +304,7 @@ uint16_t nRF51Gap::getConnectionHandle(void)
     @endcode
 */
 /**************************************************************************/
-ble_error_t nRF51Gap::setAddress(addr_type_t type, const uint8_t address[6])
+ble_error_t nRF51Gap::setAddress(addr_type_t type, const uint8_t address[ADDR_LEN])
 {
     if (type > ADDR_TYPE_RANDOM_PRIVATE_NON_RESOLVABLE) {
         return BLE_ERROR_PARAM_OUT_OF_RANGE;
@@ -312,13 +312,26 @@ ble_error_t nRF51Gap::setAddress(addr_type_t type, const uint8_t address[6])
 
     ble_gap_addr_t dev_addr;
     dev_addr.addr_type = type;
-    memcpy(dev_addr.addr, address, 6);
+    memcpy(dev_addr.addr, address, ADDR_LEN);
 
-    ASSERT_INT(ERROR_NONE,
-               sd_ble_gap_address_set(BLE_GAP_ADDR_CYCLE_MODE_NONE, &dev_addr),
-               BLE_ERROR_PARAM_OUT_OF_RANGE);
+    ASSERT_INT(ERROR_NONE, sd_ble_gap_address_set(BLE_GAP_ADDR_CYCLE_MODE_NONE, &dev_addr), BLE_ERROR_PARAM_OUT_OF_RANGE);
 
+    return BLE_ERROR_NONE;
+}
 
+ble_error_t nRF51Gap::getAddress(addr_type_t *typeP, uint8_t addressP[ADDR_LEN])
+{
+    ble_gap_addr_t dev_addr;
+    if (sd_ble_gap_address_get(&dev_addr) != NRF_SUCCESS) {
+        return BLE_ERROR_PARAM_OUT_OF_RANGE;
+    }
+
+    if (typeP != NULL) {
+        *typeP = static_cast<addr_type_t>(dev_addr.addr_type);
+    }
+    if (addressP != NULL) {
+        memcpy(addressP, dev_addr.addr, ADDR_LEN);
+    }
     return BLE_ERROR_NONE;
 }
 
diff --git a/nRF51Gap.h b/nRF51Gap.h
index 2b6e1e3..03f43d3 100644
--- a/nRF51Gap.h
+++ b/nRF51Gap.h
@@ -39,10 +39,9 @@ public:
     }
 
     /* Functions that must be implemented from Gap */
-    virtual ble_error_t setAddress(addr_type_t   type,
-                                   const uint8_t address[6]);
-    virtual ble_error_t setAdvertisingData(const GapAdvertisingData &,
-                                           const GapAdvertisingData &);
+    virtual ble_error_t setAddress(addr_type_t  type,  const uint8_t address[ADDR_LEN]);
+    virtual ble_error_t getAddress(addr_type_t *typeP, uint8_t addressP[ADDR_LEN]);
+    virtual ble_error_t setAdvertisingData(const GapAdvertisingData &, const GapAdvertisingData &);
     virtual ble_error_t startAdvertising(const GapAdvertisingParams &);
     virtual ble_error_t stopAdvertising(void);
     virtual ble_error_t disconnect(DisconnectionReason_t reason);
