       
       printWeightOnLCD(value, weightName);
 
-      delay(50);
-      scales[i].power_down();	// put the ADC in sleep mode
       last = millis();
     }
   }
 }
 
+
+void printMenuMarker(int up) {
+  //Menu marker
+  if (up) {
+    lcd.setCursor(0, 0);
+    lcd.print(" ");
+    lcd.setCursor(0, 1);
+    lcd.print(">");
+  } else {
+    lcd.setCursor(0, 0);
+    lcd.print(">");
+    lcd.setCursor(0, 1);
+    lcd.print(" ");
+  }
+}
+
+void printMenu() {
+  if (!printGUI){
+    return;
+  }
+  printMenuMarker(menuMarker % 2);
+  lcd.setCursor(1, 0);
+  lcd.print("Calibrate       ");
+  lcd.setCursor(1, 1);
+  lcd.print("Tare       ");
+}
+
+void doTare() {
+  lcd.clear();
+  lcd.setCursor(0, 1);
+  lcd.print("Tare all weights");
+  for (int i = 0; i < WEIGHT_SENSORS; i++) {
+    scales[i].tare();
+    delay(DELAY);
+  }
+  lcd.print("Done tare...");
+  delay(DELAY * 3);
+  printGUI = 0;
+  lcd.clear();
+}
+
+void doCalibrate() {  
+  lcd.clear();
+  lcd.setCursor(0, 0);
+  lcd.print("Calibrate all weights");
+  lcd.setCursor(0, 1);
+  lcd.print("Please clear all.");
+  delay(4000);
+  for (int i = 0; i < WEIGHT_SENSORS; i++) {
+    scales[i].tare();
+    double sum = scales[i].read_average(10);
+#if defined(DEBUG)
+    Serial.print("Offset is");
+    Serial.println(sum);
+    //TODO: Safe into eeprom. http://playground.arduino.cc/Code/EEPROMex
+#endif
+    EEPROM.writeDouble(eepromAddress[i], sum);
+    delay(DELAY);
+    printGUI = 0;
+    lcd.clear();
+  }
+}
+
+void doButtonAction(int btn) {
+  if (btn != btnNONE) {
+#if defined(DEBUG)
+    Serial.print(btn);
+#endif
+
+   switch (btn) {
+    case btnRIGHT: {
+      if (printGUI) {
+        
+      } else {
+          lcd.clear();
+          printGUI = 1;
+       }
+        break;
+    }
+    case btnSELECT: {
+       if (printGUI) {
+           if (menuMarker == 1) {
+             doTare(); 
+           } else if (menuMarker == 0) {
+             doCalibrate();
+           }
+       }
+        break;
+      }
+    case btnLEFT: {
+      if (printGUI) {
+         lcd.clear();
+         printGUI = 0;
+      } else {
+         
+       }
+        break;
+      }
+    case btnUP: {
+       if (menuMarker == 0) {
+             menuMarker = lastItem;
+       } else {
+             menuMarker = menuMarker - 1;
+       }
+       break;
+      }
+    case btnDOWN: {
+         if (printGUI) {
+           if (menuMarker >= lastItem) {
+             menuMarker = 0;
+           } else {
+             menuMarker = menuMarker + 1;
+           }
+         }
+        break;
+      }
+    case btnNONE:
+      {
+        break;
+      }
+    }
+  }
+}
+
 void loop() {
-  doWeigth(0);
+  int btn = getButtonPressed();
+  doButtonAction(btn);
+  doWeigth();
+  printMenu();
   delay(2);
 }
 

  delete weight;
}

void doWeigth(int value) {
  unsigned long now = millis();

  if ((last + DEFAULT_WEIGHT_TIME) < now) {
    for (int i = 0; i < WEIGHT_SENSORS; i++) {
      scales[i].power_up();
      lcd.setCursor(0, 1);

      String weightName = getName(i);
      float value = getValue(scales[i]);

      printToSerial(value, now, weightName);

      const int row = getRow(i);

}

void printWeightOnLCD(const float value, String weightName) {
  if (printGUI) {
    return;
  }
  char* weight = new char[7];
  getWeight(value, weight);
  //lcd.clear();
  if (WEIGHT_SENSORS > 2) {
    lcd.print(weight + kilo);
  } else {
