   const uint8_t LCD_COLUMNS = 20;
   const uint8_t LCD_ROWS = 4;
 
-  // UI Modes - Each Mode is associated with UI Strings describing its UI
-  struct Mode {
-
-    /* `PROGMEM` is a macro for an attribute that tells the compiler to write
-      instructions for loading this variable into Flash memory at the start of
-      runtime.
-      `PGM_P` is a macro for the type const char* (pointer to (the start of) a
-      string), useful since it connotates that this variable is stored in Flash,
-      which clarifies for the user and helps the compiler optimize assembly code.
-      */
-    
-    // Store array of 4 pointers to strings in Flash memory
-    // Note: strings to which pointers point aren't restricted in length
-    PGM_P UIStringPtrs[LCD_ROWS] PROGMEM;
-    const uint8_t id;
-
-    // Tie integer row indicies to meaningful names based on information layout
-    enum UIStringType : char {
-      Title = 0,
-      Time,
-      Speed,
-      Instruction
-    };
-
-    // Tie UI Modes with integer IDs so that `switch` works--only accepts ints
-    enum ID : char {
-      SETTING_TIME,
-      SETTING_SPEED,
-      SPINNING
-    };
-
-  }; // struct Mode
+  // Macro to prettify long line for reading and then printing to LCD from Flash
+  #define lcd_print_P(string)  lcd.print( (PGM_P) pgm_read_word( &(string) ))
+
+  /* `pgm_read_word` implementation:
+    Implements a Load Program Memory instruction on an 8-bit RAM
+    address argument that's converted to a 16-bit Flash memory address before
+    the address is read and has its stored value returned.
+    http://www.atmel.com/images/doc1233.pdf
+    http://www.atmel.com/webdoc/AVRLibcReferenceManual/group__avr__pgmspace_1ga7fa92c0a662403a643859e0f33b0a182.html
+
+    Need `&` because it's not just the char arrays[] that's stored in Flash,
+    but the pointers to these strings, held in UIStringPtrs, are stored in
+    Flash too. So, convert the pointer and then return its Flash data.
+    */
 
   /* Explanation of string problem and contants/literals:
     Note: Literals are not temporaries.

  // Motor is OFF on startup
  digitalWrite(MOTOR_PIN, LOW);

  // Associate static elements of LCD UI with a temporary Mode
  Mode setupMode = {
    .UIStringPtrs =
    {
      titleStr,  // accessing a whole array, so its (starting) address is returned
      null_str,
      setSpeedStr,
      null_str
    },
    .id = 0
  };

  // Initialize static (not the keyword) elements of LCD UI
  for(int row = 0; row < LCD_ROWS; row++) {

    lcd.setCursor(0, row);

    /* `pgm_read_word` implementation:
      Implements a Load Program Memory instruction on an 8-bit RAM
      address argument that's converted to a 16-bit Flash memory address before
      the address is read and has its stored value returned.
      http://www.atmel.com/images/doc1233.pdf
      http://www.atmel.com/webdoc/AVRLibcReferenceManual/group__avr__pgmspace_1ga7fa92c0a662403a643859e0f33b0a182.html

      Need `&` because it's not just the char arrays[] that's stored in Flash,
      but the pointers to these strings, held in UIStringPtrs, are stored in
      Flash too. So, convert the pointer and then return its Flash data.
      */

    // Read and the UIStringPtrs from Flash memory, and print
    lcd.print( (PGM_P) pgm_read_word(&(setupMode.UIStringPtrs[row])));

  } // for loop LCD_ROWS

} // void setup()

/////////////////////////////////////////////////////////////////////////////////

void loop()
{

  /* Explanation of `static` and statically allocated memory in C++:


    } // case Mode::SETTING_SPEED


    case Mode::SPINNING: {

      // Truncate milliseconds (/1000) for more consistent displayed countdowns
      // Store in a variable so that it's calculated only once
