   address += sizeof(tempo);
   saveToEEPROM(address, (uint8_t *)&channels[0], sizeof(channels));
   address += sizeof(channels);
-
-  //1012 bytes it fits, barely
-  
-  // todo add layer, grid, offset to restart exactly where we left off
+  saveToEEPROM(address, (uint8_t *)&playing_grid_set, sizeof(playing_grid_set));
+  address += sizeof(playing_grid_set);
+  saveToEEPROM(address, (uint8_t *)&layer, sizeof(layer));
+  address += sizeof(layer);
+  saveToEEPROM(address, (uint8_t *)&display_offset, sizeof(display_offset));
+  address += sizeof(display_offset);
+
+  //1015 bytes it fits, barely
 }
 
 void load(void)
 {
   int address = 0;
 
-  if ((EEPROM.read(address + 0) == 0xd5) && 
+ // check for a magic number and a format version number
+  if ((EEPROM.read(address + 0) == 0xd5) && // magic number d6aa96
     (EEPROM.read(address + 1) == 0xaa) &&
     (EEPROM.read(address + 2) == 0x96) &&
-    (EEPROM.read(address + 3) == 0x01))
+    (EEPROM.read(address + 3) == 0x02)) // version 2
   {
     address += 4;
     loadFromEEPROM(address, (uint8_t *)&grid[0], sizeof(grid));

  enc::poll(); // Read encoder(s)

  // adjust the note offset here so all notes are off when we make the change
  int temp = eScaleOffset.getValue() / 4;
  int diff = noteOffset[layer][visible_grid_set] - temp;
  if (diff != 0)

#define GRID_WIDTH     16
#define GRID_SETS      8

uint8_t       grid[GRID_WIDTH][LAYERS - 1][GRID_SETS]; // bitfield. last layer is performance laye so does not need storage

uint8_t       channels[LAYERS];  // 1 to 127, 1 bit free
uint8_t       long_notes[LAYERS] = {
  1, 1, 1, 1, 1, 1, 1, 0}; // 0 to 1, 7 bits free
uint8_t       noteOffset[LAYERS - 1][GRID_SETS]; // 0 to (MAX_MIDI_NOTES-BUTTON_GRID_WIDTH), 2 bits free, last layer is performance laye so does not need storage
uint8_t       volume[LAYERS]; // 0 to 127, 1 bit free
uint8_t       instrument[LAYERS]; // 1 to 127, 1 bit free
uint8_t       scale_notes[LAYERS]; // 0 to (MAX_SCALES-1), 4 bits free
