diff --git a/libraries/Preferences/examples/Prefs2Struct/Prefs2Struct.ino b/libraries/Preferences/examples/Prefs2Struct/Prefs2Struct.ino
new file mode 100644
index 00000000000..7ed2a73bcbe
--- /dev/null
+++ b/libraries/Preferences/examples/Prefs2Struct/Prefs2Struct.ino
@@ -0,0 +1,43 @@
+/*
+This example shows how to use Preferences (nvs) to store a
+structure.  Note that the maximum size of a putBytes is 496K
+or 97% of the nvs partition size.  nvs has signifcant overhead,
+so should not be used for data that will change often.
+*/ 
+#include <Preferences.h>
+Preferences prefs;
+
+typedef struct {
+  uint8_t hour;
+  uint8_t minute;
+  uint8_t setting1;
+  uint8_t setting2;
+} schedule_t;
+
+void setup() {
+  Serial.begin(115200);
+  prefs.begin("schedule"); // use "schedule" namespace
+  uint8_t content[] = {9, 30, 235, 255, 20, 15, 0, 1}; // two entries
+  prefs.putBytes("schedule", content, sizeof(content));
+  size_t schLen = prefs.getBytesLength("schedule");
+  char buffer[schLen]; // prepare a buffer for the data
+  prefs.getBytes("schedule", buffer, schLen);
+  if (schLen % sizeof(schedule_t)) { // simple check that data fits
+    log_e("Data is not correct size!");
+    return;
+  }
+  schedule_t *schedule = (schedule_t *) buffer; // cast the bytes into a struct ptr
+  Serial.printf("%02d:%02d %d/%d\n", 
+    schedule[1].hour, schedule[1].minute,
+    schedule[1].setting1, schedule[1].setting2);
+  schedule[2] = {8, 30, 20, 21}; // add a third entry (unsafely)
+// force the struct array into a byte array
+  prefs.putBytes("schedule", schedule, 3*sizeof(schedule_t)); 
+  schLen = prefs.getBytesLength("schedule");
+  char buffer2[schLen];
+  prefs.getBytes("schedule", buffer2, schLen);
+  for (int x=0; x<schLen; x++) Serial.printf("%02X ", buffer[x]);
+  Serial.println(); 
+}
+
+void loop() {}
diff --git a/libraries/Preferences/src/Preferences.cpp b/libraries/Preferences/src/Preferences.cpp
index 81b9b1989b1..c2640a87dab 100644
--- a/libraries/Preferences/src/Preferences.cpp
+++ b/libraries/Preferences/src/Preferences.cpp
@@ -447,9 +447,9 @@ String Preferences::getString(const char* key, const String defaultValue){
     return String(buf);
 }
 
-size_t Preferences::getBytes(const char* key, void * buf, size_t maxLen){
+size_t Preferences::getBytesLength(const char* key){
     size_t len = 0;
-    if(!_started || !key || !buf || !maxLen){
+    if(!_started || !key){
         return 0;
     }
     esp_err_t err = nvs_get_blob(_handle, key, NULL, &len);
@@ -457,11 +457,19 @@ size_t Preferences::getBytes(const char* key, void * buf, size_t maxLen){
         log_e("nvs_get_blob len fail: %s %s", key, nvs_error(err));
         return 0;
     }
+    return len;
+}
+
+size_t Preferences::getBytes(const char* key, void * buf, size_t maxLen){
+    size_t len = getBytesLength(key);
+    if(!len || !buf || !maxLen){
+        return len;
+    }
     if(len > maxLen){
         log_e("not enough space in buffer: %u < %u", maxLen, len);
         return 0;
     }
-    err = nvs_get_blob(_handle, key, buf, &len);
+    esp_err_t err = nvs_get_blob(_handle, key, buf, &len);
     if(err){
         log_e("nvs_get_blob fail: %s %s", key, nvs_error(err));
         return 0;
diff --git a/libraries/Preferences/src/Preferences.h b/libraries/Preferences/src/Preferences.h
index e4872693209..0ad94afbbad 100644
--- a/libraries/Preferences/src/Preferences.h
+++ b/libraries/Preferences/src/Preferences.h
@@ -63,6 +63,7 @@ class Preferences {
         bool getBool(const char* key, bool defaultValue = false);
         size_t getString(const char* key, char* value, size_t maxLen);
         String getString(const char* key, String defaultValue = String());
+	size_t getBytesLength(const char* key);
         size_t getBytes(const char* key, void * buf, size_t maxLen);
         size_t freeEntries();
 };