     }
     return BLINK_DELAY;
 
-    // Turn off all keys in order
+  // Turn off all keys in order
   } else if (state == IDLE_TURN_OFF) {
     trellis.clrLED(nextLED);
     trellis.writeDisplay();
     nextLED = (nextLED + 1) % NUMKEYS;
     if (nextLED == 0) {
-      state = IDLE_WAIT_OFF;
+      if ((enterIdle + IDLE_TIMEOUT) <= now) {
+        onTimeout();
+      } else {
+        state = IDLE_WAIT_OFF;
+      }
       return IDLE_PAUSE;
     }
     return BLINK_DELAY;
 
-    // Wait in darkness
+  // Wait in darkness
   } else if (state == IDLE_WAIT_OFF) {
-    //Serial.print(".");
     trellis.clear(); // just to clean up
     state = IDLE_LIGHT_UP;
     return BLINK_DELAY;
-  }
-}
-
-unsigned long tickReadKeys() {
+
+  // Power down after timeout, periodic wakeup (watchdog timer)
+  } else if (state == TIMEOUT_WAIT) {
+    trellis.sleep();
+    LowPower.powerDown(SLEEP_8S, ADC_OFF, BOD_OFF); 
+    trellis.wakeup();
+    trellis.setBrightness(BRIGHTNESS_SLEEPTICK);
+    trellis.setLED(nextLED);
+    trellis.writeDisplay();
+    LowPower.powerDown(SLEEP_15MS, ADC_OFF, BOD_OFF); 
+    trellis.clrLED(nextLED);
+    trellis.writeDisplay();
+    nextLED = (nextLED + 1) % NUMKEYS;
+    return IDLE_WAIT_OFF;
+  }
+}
+
+unsigned long tickReadKeys(unsigned long now) {
   // Read trellis keys
   if (trellis.readSwitches()) {
     for (byte i = 0; i < NUMKEYS; i++) {
       if (trellis.justPressed(i)) {
+        if (state == TIMEOUT_WAIT) onSleepWake();
         onKey(i);
         break;
       }

  return READ_DELAY;
}

void onKey(byte index) {
  // Same key pressed again
  if (state == PLAY_SELECTED && playingAlbum == index) {
    stopPlaying();
    onTryNextTrack();

    // Some (other) key pressed
  } else {
    if (state == PLAY_SELECTED) stopPlaying();
    enablePlayer(true);

    Serial.println("Rollover timer ticks!");
    nextReadTick = now;
    nextIdleTick = now;
    enterIdle    = now;
  }

  // Next ticks
  if (nextReadTick <= now) {
    nextReadTick += tickReadKeys(now);
    nextReadTick = max(nextReadTick, now);
  }
  if (nextIdleTick <= now) {
    nextIdleTick += tickIdleShow(now);
    nextIdleTick = max(nextIdleTick, now);
  }

  // Check for finished track
