   lcd.print(freeRam()); 
   lcd.print(F("B]")); 
 }
-
-
-// Show System Information Software Version
-// and available RAM
-void showSystemInfo()
-{  
-  lcd.setCursor(0, 0);
-  lcd.print("Arduino DS1307 Clock"); 
-  lcd.setCursor(0, 1);
-  lcd.print(" With Rocker Switch ");
-  lcd.setCursor(0, 2);
-  lcd.print("3 Buttons & 20X4 LCD"); 
-  lcd.setCursor(0, 3); 
-  lcd.print(F("  [V")); 
-  lcd.print(build); 
-  lcd.print(F(".")); 
-  lcd.print(revision);
-  lcd.print(F(" RAM: "));  
-  lcd.print(freeRam()); 
-  lcd.print(F("B]")); 
-}
-
-// Show Text received
-// over serial connection
+// show text received over a serial connection
 void showSerialText()
 {
-    // when characters arrive over the serial port...
-    if (Serial.available()) {
-      // wait a bit for the entire message to arrive
-      delay(100);
-      // clear the top row
-      lcd.setCursor(0,0); 
-      lcd.print("                    ");
-      lcd.setCursor(0,0); 
-
-      String txtMsg;
-      // add any incoming characters to the String:
-      while (Serial.available() > 0) {
-        char inChar = Serial.read();
-        txtMsg += inChar;
-
-        if(txtMsg.length() < 21)
-        {
-          lcd.write(inChar);
-        }
-      } 
-    }
+  // Initial text only drawn the first time through 
+  if(previousState != state)
+  {
+    lcd.setCursor(0, 0);
+    lcd.print("Awaiting Serial Text"); 
+  }
+  // when characters arrive over the serial port...
+  if (Serial.available()) {
+    // wait a bit for the entire message to arrive
+    delay(100);
+    // clear the top row
+    lcd.setCursor(0,0); 
+    lcd.print("                    ");
+    lcd.setCursor(0,0); 
+    String txtMsg;
+    // add any incoming characters to the String:
+    while (Serial.available() > 0) {
+      char inChar = Serial.read();
+      txtMsg += inChar;
+      if(txtMsg.length() < 21)
+      {
+        lcd.write(inChar);
+      }
+    } 
+  }
 }
 
 // Displays the current date in the top row 
-// e.g. SAT 04 JAN 2014
+// e.g. SAT FEB 4,2019
 void showDate()
 {
-   now = RTC.now();
-   lcd.setCursor(0, 0); 
-   String dateString = "* " + String(dayName[now.dayOfTheWeek()]) + " " + String(monthName[now.month()-1]) + " " + String(now.day()) + ", " + String(now.year()) + " *";
+   DateTime now = RTC.now();
+   int startCol = 3;
+   if(now.day() > 10){ startCol = 2; }
+   lcd.setCursor(startCol, 0); 
+   String dateString = String(dayName[now.dayOfTheWeek()]) + " " + String(monthName[now.month()-1]) + " " + String(now.day()) + "," + String(now.year());
    lcd.print(dateString);
 }
-
 // displays time in large 3 row letters
 // starting on the second row
 // 10:59 AM
-void showTime()
-{   
-    now = RTC.now();
-    lcd.setCursor(0, 0);
-    
-    // Set Times for 12 Hour Clock
-    // Set AMPM Indicator Values
-    hr_24 = now.hour();
-    ampm = "AM";
-    if (hr_24 == 0) { // 12 AM
+void showTime() { 
+  DateTime now = RTC.now();
+  // Standard (AM/PM) or 24 Hour Clock Setup
+  hr_24 = now.hour();
+  if (hr_24 == 0) { // 12 AM
       hr_12 = 12;
-    }
-    else if(hr_24 == 12) { // 12 PM
+      ampm = "AM";
+  }
+  else if(hr_24 == 12) { // 12 PM
       hr_12 = hr_24;
       ampm = "PM";
-    }
-    else if (hr_24 > 12) { // 13-23 PM
-       hr_12 = (hr_24 - 12);
-       ampm = "PM";
-    }
-    else { // 1-11 AM
-      hr_12 = hr_24;
-    }
+  }
+  else if (hr_24 > 12) { // 13-23 PM
+     hr_12 = (hr_24 - 12);
+     ampm = "PM";
+  }
+  else { // 1-11 AM
+    hr_12 = hr_24;
+    ampm = "AM";
+  }
+  // Time Starting Point
+  byte row = 1,col = 0;
+  // Indent if not showing seconds
+  if(!showSeconds){
+    col = col + 4;
+  }
+  // Hours
+  if (militaryTime && hr_24 < 10 ) {  
+    col = col + 3;
+    bigNumber(hr_24,row,col);
+  }
+  else if(!militaryTime && hr_12 < 10) {
+    col = col + 3;
+    bigNumber(hr_12,row,col);
+  }
+  else{
     if(militaryTime){
-      lcd.setCursor(18, 2);
-      lcd.print("24");
-      lcd.setCursor(18, 3);
-      lcd.print("HR");
-    }
-    if(!showSeconds && !militaryTime){
-      lcd.setCursor(18, 2);
-      lcd.print(ampm);
-    }
-
-   // Display the time using bigNumber
-   row = 1;
-   col = 3;
-
-   if(!militaryTime) {
-     if (hr_12 < 10) {  
-        // bigNumber(0,row,col);
-        //col = col + 3;
-        bigNumber(hr_12,row,col);
-        col = col + 3;
-     }
-     else {
-       bigNumber(getDigit(hr_12,2) ,row,col);
-       col = col + 3;
-       bigNumber(getDigit(hr_12,1) ,row,col);
-       col = col + 3;
-     }
+      bigNumber(getDigit(hr_24,2) ,row,col);
+      col = col + 3;
+      bigNumber(getDigit(hr_24,1) ,row,col);
+    }
+    else{
+      bigNumber(getDigit(hr_12,2) ,row,col);
+      col = col + 3;
+      bigNumber(getDigit(hr_12,1) ,row,col);
+    }
+  }
+  if(!showSeconds){
+    col = col + 1;
+  }  
+  col = col + 2;
+  bigNumber(11,row,col);
+  col = col + 1;
+  // Minutes
+  if (now.minute() < 10) {  
+    bigNumber(0,row,col);
+    col = col + 3;
+    bigNumber(now.minute(),row,col);
+  }
+  else {
+    bigNumber(getDigit(now.minute(),2) ,row,col);
+    col = col + 3;
+    bigNumber(getDigit(now.minute(),1) ,row,col);
+  }
+  col = col + 2;
+  // Seconds
+  if(showSeconds){
+   bigNumber(11,row,col);
+   col = col + 1;
+   if (now.second() < 10) {  
+      bigNumber(0,row,col);
+      col = col + 3;
+      bigNumber(now.second(),row,col);
    }
    else {
-     if (hr_24 < 10) {
-        col = col + 2;  
-        bigNumber(hr_24,row,col);
-        col = col + 3;
-     }
-     else {
-       bigNumber(getDigit(hr_24,2) ,row,col);
-       col = col + 3;
-       bigNumber(getDigit(hr_24,1) ,row,col);
-       col = col + 3;
-     }
+     bigNumber(getDigit(now.second(),2) ,row,col);
+     col = col + 3;
+     bigNumber(getDigit(now.second(),1) ,row,col);
    }
-
-   
-   bigNumber(11,row,col);
-   col = col + 2;
-   if (now.minute() < 10) {  
-      bigNumber(0,row,col);
-      col = col + 3;
-      bigNumber(now.minute(),row,col);
-      col = col + 2;
-   }
-   else {
-     bigNumber(getDigit(now.minute(),2) ,row,col);
-     col = col + 3;
-     bigNumber(getDigit(now.minute(),1) ,row,col);
-     
-   }
-   if(showSeconds){
-     col = col + 2;
-     bigNumber(11,row,col);
-     col = col + 2;
-     if (now.second() < 10) {  
-        bigNumber(0,row,col);
-        col = col + 3;
-        bigNumber(now.second(),row,col);
-     }
-     else {
-       bigNumber(getDigit(now.second(),2) ,row,col);
-       col = col + 3;
-       bigNumber(getDigit(now.second(),1) ,row,col);
-     }
-   }
-}
-
+  }
+  // Time Type Indicator On Right
+  if(militaryTime) {
+    lcd.setCursor(18, 3);
+    lcd.print("24");
+  }
+  else {
+    lcd.setCursor(18, 3);
+    lcd.print(ampm);
+  }
+  // Alarm Indicator On Right - Toggle Switch
+  if(button4State == HIGH){
+    lcd.setCursor(18, 1);
+    lcd.print("AL");
+  }
+  else{
+    lcd.setCursor(18, 1);
+    lcd.print("  ");
+  }
+}
+// draw a loading screen
+void drawLoadingScreen()
+{
+  lcd.clear();
+  //drawSolidBorder();
+  lcd.setCursor(1, 1);
+  lcd.print("Loading . . . . .");
+  lcd.setCursor(1, 2);
+  int count = 18;
+  while(count > 0 )
+  {
+    lcd.print((char)255);
+    delay(150);
+    count = count -1;
+  }
+}
+// draw columns on the side of screens
+// single or double column
+void drawSideColumns(bool singleColumn){
+  // Left Column
+  lcd.setCursor(0, 0);
+  lcd.print((char)255);
+  if(!singleColumn) { lcd.print((char)255); }
+  lcd.setCursor(0, 1);
+  lcd.print((char)255);
+  if(!singleColumn) { lcd.print((char)255); }
+  lcd.setCursor(0, 2);
+  lcd.print((char)255);
+  if(!singleColumn) { lcd.print((char)255); }
+  lcd.setCursor(0, 3);
+  lcd.print((char)255);
+  if(!singleColumn) { lcd.print((char)255); }
+  // Right Column
+  lcd.setCursor(19, 0);
+  lcd.print((char)255);
+  if(!singleColumn) {
+    lcd.setCursor(18, 0);
+    lcd.print((char)255);
+  }
+  lcd.setCursor(19, 1);
+  lcd.print((char)255);
+  if(!singleColumn) { 
+    lcd.setCursor(18, 1);   
+    lcd.print((char)255);
+  }
+  lcd.setCursor(19, 2);
+  lcd.print((char)255);
+  if(!singleColumn) {
+    lcd.setCursor(18, 2);
+    lcd.print((char)255);
+  }
+  lcd.setCursor(19, 3);
+  lcd.print((char)255);
+  if(!singleColumn) {
+    lcd.setCursor(18, 3);
+  }
+  lcd.print((char)255);  
+}
+// draw a solid border around the screen
+void drawSolidBorder(){
+  lcd.setCursor(0, 0);
+  int topCount = 20;
+  while(topCount > 0 )
+  {
+    lcd.print((char)255);
+    topCount = topCount -1;
+  }
+  lcd.setCursor(0, 1);
+  lcd.print((char)255);
+  lcd.setCursor(19, 1);
+  lcd.print((char)255);
+  lcd.setCursor(0, 2);
+  lcd.print((char)255);
+  lcd.setCursor(19, 2);
+  lcd.print((char)255);
+  lcd.setCursor(0, 3);
+  int bottomCount = 20;
+  while(bottomCount > 0 )
+  {
+    lcd.print((char)255);
+    bottomCount = bottomCount -1;
+  }
+  lcd.setCursor(1, 1);
+}
 // Position a custom big font digit
 // position number 'num' starting top left at row 'r', column 'c'
 void bigNumber(byte num, byte r, byte c) {

    lcd.createChar(5, x15);                      // digit piece
    lcd.createChar(6, x16);                      // digit piece
    lcd.createChar(7, x17);                      // digit piece (colon)
//    if(!RTC.isrunning())
//    {
//        RTC.adjust(DateTime(__DATE__,__TIME__));
//    }
    
    state = SHOW_SPLASH;  // Initial state
}


// Loop
// run over and over again
void loop() {                   

    //timeRef = millis();
    // Get the time from the RTC
    now = RTC.now();

    // Uses the current state to decide what to process
    switch (state)
    {
        case SHOW_SPLASH:
            showSplash();
            delay(5000);
            lcd.clear();
            state = SHOW_TIME;
            break;
        case SHOW_TIME:
            showTime();
            showDate();
            break;
        case SHOW_CUSTOM_TEXT: 
            showSerialText();
            showTime();
            break;
        case SHOW_SYSTEM_INFO:   
            showSystemInfo();
            break;
    }

    // variables to hold the pushbutton states
    int button1State, button2State, button3State;  
    
    // Read Button States
    button1State = digitalRead(button1Pin);
    button2State = digitalRead(button2Pin);
    button3State = digitalRead(button3Pin);

    // Handle Button Presses
    if (button1State == LOW || button2State == LOW || button3State == LOW)
    {

                  Serial.println("Button 1 Pressed - Mode Changed to SHOW_SYSTEM_INFO");
                  break;
              case SHOW_SYSTEM_INFO:
                  lcd.setCursor(0, 0);
                  state = SHOW_CUSTOM_TEXT;
                  Serial.println("Button 1 Pressed - Mode Changed to SHOW_CUSTOM_TEXT");
                  break;
