diff --git a/app/gui/oven_control/confirmpopup.cpp b/app/gui/oven_control/confirmpopup.cpp
index 5c4f4c8..5b8f513 100644
--- a/app/gui/oven_control/confirmpopup.cpp
+++ b/app/gui/oven_control/confirmpopup.cpp
@@ -1,6 +1,8 @@
 #include "confirmpopup.h"
 #include "ui_confirmpopup.h"
 
+#include <QKeyEvent>
+
 #include "soundplayer.h"
 
 ConfirmPopup::ConfirmPopup(QWidget *parent, QString text) :
@@ -12,6 +14,8 @@ ConfirmPopup::ConfirmPopup(QWidget *parent, QString text) :
 
     foreach (QPushButton *button, findChildren<QPushButton *>())
         connect(button, &QPushButton::pressed, SoundPlayer::playClick);
+
+    setFocus();
 }
 
 ConfirmPopup::~ConfirmPopup()
@@ -19,6 +23,41 @@ ConfirmPopup::~ConfirmPopup()
     delete ui;
 }
 
+void ConfirmPopup::keyPressEvent(QKeyEvent *event)
+{
+    switch (event->key())
+    {
+    case 0x01000030:    // Turn left
+        onEncoderLeft();
+        break;
+    case 0x01000031:    // Push
+        pushed = focusWidget();
+        break;
+    case 0x01000032:    // Turn right
+        onEncoderRight();
+        break;
+    }
+}
+
+void ConfirmPopup::keyReleaseEvent(QKeyEvent *event)
+{
+    switch (event->key())
+    {
+    case 0x01000030:    // Turn left
+        onEncoderLeft();
+        break;
+    case 0x01000031:    // Push
+        if (focusWidget() == pushed)
+            onEncoderClicked(pushed);
+
+        pushed = NULL;
+        break;
+    case 0x01000032:    // Turn right
+        onEncoderRight();
+        break;
+    }
+}
+
 void ConfirmPopup::on_okButton_clicked()
 {
     deleteLater();
@@ -30,3 +69,28 @@ void ConfirmPopup::on_cancelButton_clicked()
     deleteLater();
     emit rejected();
 }
+
+void ConfirmPopup::onEncoderLeft()
+{
+    QWidget *focused = focusWidget();
+    if (focused == this || focused == ui->okButton)
+        ui->cancelButton->setFocus();
+    else
+        focusPreviousChild();
+}
+
+void ConfirmPopup::onEncoderRight()
+{
+    QWidget *focused = focusWidget();
+    if (focused == this || focused == ui->cancelButton)
+        ui->okButton->setFocus();
+    else
+        focusNextChild();
+}
+
+void ConfirmPopup::onEncoderClicked(QWidget *clicked)
+{
+    QPushButton *b = qobject_cast<QPushButton *>(clicked);
+    if (b)
+        b->click();
+}
diff --git a/app/gui/oven_control/confirmpopup.h b/app/gui/oven_control/confirmpopup.h
index 92aee5e..059f8ee 100644
--- a/app/gui/oven_control/confirmpopup.h
+++ b/app/gui/oven_control/confirmpopup.h
@@ -19,6 +19,10 @@ public:
     explicit ConfirmPopup(QWidget *parent, QString text);
     ~ConfirmPopup();
 
+protected:
+    void keyPressEvent(QKeyEvent *event);
+    void keyReleaseEvent(QKeyEvent *event);
+
 private slots:
     void on_okButton_clicked();
 
@@ -26,6 +30,12 @@ private slots:
 
 private:
     Ui::ConfirmPopup *ui;
+
+    QWidget *pushed = NULL;
+
+    void onEncoderLeft();
+    void onEncoderRight();
+    void onEncoderClicked(QWidget *clicked);
 };
 
 #endif // CONFIRMPOPUP_H
diff --git a/app/gui/oven_control/cooldownpopup.cpp b/app/gui/oven_control/cooldownpopup.cpp
index 3ef86a1..b08ca7a 100644
--- a/app/gui/oven_control/cooldownpopup.cpp
+++ b/app/gui/oven_control/cooldownpopup.cpp
@@ -1,6 +1,8 @@
 #include "cooldownpopup.h"
 #include "ui_cooldownpopup.h"
 
+#include <QKeyEvent>
+
 #include "soundplayer.h"
 #include "stringer.h"
 
@@ -57,6 +59,14 @@ CooldownPopup::CooldownPopup(QWidget *parent, Oven *oven) :
 
     foreach (QPushButton *button, findChildren<QPushButton *>())
         connect(button, &QPushButton::pressed, SoundPlayer::playClick);
+
+    focusTempButtonTimer.setSingleShot(true);
+    focusTempButtonTimer.setInterval(3000);
+    connect(&focusTempButtonTimer, SIGNAL(timeout()), SLOT(focusTempButton()));
+
+    connect(ui->tempSlider, SIGNAL(sliderMoved(int)), &focusTempButtonTimer, SLOT(start()));
+
+    ui->background->setFocus();
 }
 
 CooldownPopup::~CooldownPopup()
@@ -64,6 +74,41 @@ CooldownPopup::~CooldownPopup()
     delete ui;
 }
 
+void CooldownPopup::keyPressEvent(QKeyEvent *event)
+{
+    switch (event->key())
+    {
+    case 0x01000030:    // Turn left
+        onEncoderLeft();
+        break;
+    case 0x01000031:    // Push
+        pushed = focusWidget();
+        break;
+    case 0x01000032:    // Turn right
+        onEncoderRight();
+        break;
+    }
+}
+
+void CooldownPopup::keyReleaseEvent(QKeyEvent *event)
+{
+    switch (event->key())
+    {
+    case 0x01000030:    // Turn left
+        onEncoderLeft();
+        break;
+    case 0x01000031:    // Push
+        if (focusWidget() == pushed)
+            onEncoderClicked(pushed);
+
+        pushed = NULL;
+        break;
+    case 0x01000032:    // Turn right
+        onEncoderRight();
+        break;
+    }
+}
+
 void CooldownPopup::start()
 {
     started = true;
@@ -95,10 +140,8 @@ void CooldownPopup::updateView()
     int temp;
     if (showingCurrentTemp)
         temp = oven->currentTemp();
-    else if (ui->tempSlider->isSliderDown())
-        temp = ui->tempSlider->sliderPosition();
     else
-        temp = ui->tempSlider->value();
+        temp = ui->tempSlider->sliderPosition();
 
     ui->tempCurrentLabel->setText(Stringer::temperature(temp, Stringer::fontSize14));
 
@@ -129,11 +172,7 @@ void CooldownPopup::updateView()
     if (lastDisplayedHumidification != oven->humidification())
     {
         lastDisplayedHumidification = oven->humidification();
-
-        if (oven->humidification())
-            ui->humidificationButton->setStyleSheet("background-image: url(:/images/cooldown/side_nozzle_ov.png);");
-        else
-            ui->humidificationButton->setStyleSheet("background-image: url(:/images/cooldown/side_nozzle.png);");
+        ui->humidificationButton->setChecked(oven->humidification());
     }
 
     if (started && !oven->door())
@@ -227,3 +266,50 @@ void CooldownPopup::on_humidificationButton_clicked()
     else
         oven->startHumidification();
 }
+
+void CooldownPopup::on_tempButton_clicked()
+{
+    ui->tempSlider->setFocus();
+    focusTempButtonTimer.start();
+}
+
+void CooldownPopup::focusTempButton()
+{
+    if (focusWidget() == ui->tempSlider)
+        ui->tempButton->setFocus();
+}
+
+void CooldownPopup::onEncoderLeft()
+{
+    QWidget *focused = focusWidget();
+    if (focused == ui->background)
+        ui->humidificationButton->setFocus();
+    else
+        focusPreviousChild();
+}
+
+void CooldownPopup::onEncoderRight()
+{
+    if (focusWidget() == ui->humidificationButton)
+        ui->background->setFocus();
+    else
+        focusNextChild();
+}
+
+void CooldownPopup::onEncoderClicked(QWidget *clicked)
+{
+    if (clicked == ui->background)
+        close();
+    else if (clicked->inherits("QPushButton"))
+    {
+        QPushButton *b = qobject_cast<QPushButton *>(clicked);
+        if (b)
+            b->click();
+    }
+    else if (clicked->inherits("Slider"))
+    {
+        Slider *slider = qobject_cast<Slider *>(clicked);
+        if (slider == ui->tempSlider)
+            ui->tempButton->setFocus();
+    }
+}
diff --git a/app/gui/oven_control/cooldownpopup.h b/app/gui/oven_control/cooldownpopup.h
index 75eddcc..01ce4e9 100644
--- a/app/gui/oven_control/cooldownpopup.h
+++ b/app/gui/oven_control/cooldownpopup.h
@@ -18,6 +18,10 @@ public:
     explicit CooldownPopup(QWidget *parent = 0, Oven *oven = 0);
     ~CooldownPopup();
 
+protected:
+    void keyPressEvent(QKeyEvent *event);
+    void keyReleaseEvent(QKeyEvent *event);
+
 private slots:
     void start();
     void stop();
@@ -39,6 +43,10 @@ private slots:
 
     void on_humidificationButton_clicked();
 
+    void on_tempButton_clicked();
+
+    void focusTempButton();
+
 private:
     Ui::CooldownPopup *ui;
     Oven *oven;
@@ -56,6 +64,13 @@ private:
 
     int lastDisplayedFanLevel;
     bool lastDisplayedHumidification;
+
+    QTimer focusTempButtonTimer;
+    QWidget *pushed = NULL;
+
+    void onEncoderLeft();
+    void onEncoderRight();
+    void onEncoderClicked(QWidget *clicked);
 };
 
 #endif // COOLDOWNPOPUP_H
diff --git a/app/gui/oven_control/cooldownpopup.ui b/app/gui/oven_control/cooldownpopup.ui
index cecf6bc..8672879 100644
--- a/app/gui/oven_control/cooldownpopup.ui
+++ b/app/gui/oven_control/cooldownpopup.ui
@@ -14,6 +14,7 @@
    <string notr="true">#closeButton { border: none; }
 #closeButton_2 { border: none; }
 #background { background-image: url(:/images/background/popup/373.png); }
+#background:focus { border: 4px solid gray; }
 
 QPushButton {
 background-position: center;
@@ -85,6 +86,9 @@ height: 33px;
      <height>373</height>
     </rect>
    </property>
+   <property name="focusPolicy">
+    <enum>Qt::TabFocus</enum>
+   </property>
    <widget class="QPushButton" name="tempButton">
     <property name="geometry">
      <rect>
@@ -96,7 +100,7 @@ height: 33px;
     </property>
     <property name="styleSheet">
      <string notr="true">QPushButton { image: url(:/images/slider_icon/cooldown.png); }
-QPushButton::pressed { image: url(:/images/slider_icon/cooldown_ov.png); }</string>
+QPushButton::pressed, QPushButton:focus { image: url(:/images/slider_icon/cooldown_ov.png); }</string>
     </property>
     <property name="text">
      <string notr="true"/>
@@ -116,7 +120,7 @@ QPushButton::pressed { image: url(:/images/slider_icon/cooldown_ov.png); }</stri
     </property>
     <property name="styleSheet">
      <string notr="true">QPushButton { background-image: url(:/images/cooldown/run.png); }
-QPushButton:pressed { background-image: url(:/images/cooldown/run_ov.png); }</string>
+QPushButton:pressed, QPushButton:focus { background-image: url(:/images/cooldown/run_ov.png); }</string>
     </property>
     <property name="text">
      <string/>
@@ -149,11 +153,15 @@ QPushButton:pressed { background-image: url(:/images/cooldown/run_ov.png); }</st
     </property>
     <property name="styleSheet">
      <string notr="true">QPushButton { background-image: url(:/images/cooldown/side_nozzle.png); }
-QPushButton:pressed { background-image: url(:/images/cooldown/side_nozzle_ov.png); }</string>
+QPushButton:checked { background-image: url(:/images/cooldown/side_nozzle_ov.png); }
+QPushButton:pressed, QPushButton:focus { background-image: url(:/images/cooldown/side_nozzle_ov.png); }</string>
     </property>
     <property name="text">
      <string/>
     </property>
+    <property name="checkable">
+     <bool>true</bool>
+    </property>
    </widget>
    <widget class="QLabel" name="tempMaxLabel">
     <property name="enabled">
diff --git a/app/gui/oven_control/coretempsettingpopup.cpp b/app/gui/oven_control/coretempsettingpopup.cpp
index 1b4558d..e6848cc 100644
--- a/app/gui/oven_control/coretempsettingpopup.cpp
+++ b/app/gui/oven_control/coretempsettingpopup.cpp
@@ -1,6 +1,8 @@
 #include "coretempsettingpopup.h"
 #include "ui_coretempsettingpopup.h"
 
+#include <QKeyEvent>
+
 #include "config.h"
 #include "soundplayer.h"
 #include "stringer.h"
@@ -77,6 +79,14 @@ CoreTempSettingPopup::CoreTempSettingPopup(QWidget *parent) :
         connect(button, &QPushButton::pressed, SoundPlayer::playClick);
 
     updateView();
+
+    ui->background->setFocus();
+
+    focusCoreTempButtonTimer.setSingleShot(true);
+    focusCoreTempButtonTimer.setInterval(3000);
+    connect(&focusCoreTempButtonTimer, SIGNAL(timeout()), SLOT(focusCoreTempButton()));
+
+    connect(ui->coreTempSlider, SIGNAL(sliderMoved(int)), &focusCoreTempButtonTimer, SLOT(start()));
 }
 
 CoreTempSettingPopup::~CoreTempSettingPopup()
@@ -84,6 +94,90 @@ CoreTempSettingPopup::~CoreTempSettingPopup()
     delete ui;
 }
 
+void CoreTempSettingPopup::keyPressEvent(QKeyEvent *event)
+{
+    switch (event->key())
+    {
+    case 0x01000030:    // Turn left
+        onEncoderLeft();
+        break;
+    case 0x01000031:    // Push
+        pushed = focusWidget();
+        break;
+    case 0x01000032:    // Turn right
+        onEncoderRight();
+        break;
+    }
+}
+
+void CoreTempSettingPopup::keyReleaseEvent(QKeyEvent *event)
+{
+    switch (event->key())
+    {
+    case 0x01000030:    // Turn left
+        onEncoderLeft();
+        break;
+    case 0x01000031:    // Push
+        if (focusWidget() == pushed)
+            onEncoderClicked(pushed);
+
+        pushed = NULL;
+        break;
+    case 0x01000032:    // Turn right
+        onEncoderRight();
+        break;
+    }
+}
+
+void CoreTempSettingPopup::onEncoderLeft()
+{
+    QWidget *focused = focusWidget();
+    if (focused == ui->background)
+        ui->applyButton->setFocus();
+    else if (focused->inherits("QPushButton"))
+        focusPreviousChild();
+}
+
+void CoreTempSettingPopup::onEncoderRight()
+{
+    QWidget *focused = focusWidget();
+    if (focused == ui->applyButton)
+        ui->background->setFocus();
+    else if (focused == ui->background || focused->inherits("QPushButton"))
+        focusNextChild();
+}
+
+void CoreTempSettingPopup::onEncoderClicked(QWidget *clicked)
+{
+    QWidget *focused = clicked;
+    if (focused == ui->background)
+        close();
+    else if (focused->inherits("QPushButton"))
+    {
+        QPushButton *pb = qobject_cast<QPushButton *>(focused);
+        if (pb)
+            pb->click();
+    }
+    else if (focused->inherits("Slider"))
+    {
+        Slider *slider = qobject_cast<Slider *>(focused);
+        if (slider)
+        {
+            if (slider->value() != slider->sliderPosition())
+                slider->setValue(slider->sliderPosition());
+
+            if (slider == ui->coreTempSlider)
+                ui->coreTempButton->setFocus();
+        }
+    }
+}
+
+void CoreTempSettingPopup::focusCoreTempButton()
+{
+    if (focusWidget() == ui->coreTempSlider)
+        ui->coreTempButton->setFocus();
+}
+
 void CoreTempSettingPopup::updateView()
 {
     int coreTemp = ui->coreTempSlider->sliderPosition();
@@ -117,3 +211,9 @@ void CoreTempSettingPopup::on_applyButton_clicked()
     oven->setInterTempEnabled(true);
     close();
 }
+
+void CoreTempSettingPopup::on_coreTempButton_clicked()
+{
+    ui->coreTempSlider->setFocus();
+    focusCoreTempButtonTimer.start();
+}
diff --git a/app/gui/oven_control/coretempsettingpopup.h b/app/gui/oven_control/coretempsettingpopup.h
index 2d0673e..267c762 100644
--- a/app/gui/oven_control/coretempsettingpopup.h
+++ b/app/gui/oven_control/coretempsettingpopup.h
@@ -2,6 +2,7 @@
 #define CORETEMPSETTINGPOPUP_H
 
 #include <QWidget>
+#include <QTimer>
 
 #include "oven.h"
 
@@ -17,14 +18,28 @@ public:
     explicit CoreTempSettingPopup(QWidget *parent = 0);
     ~CoreTempSettingPopup();
 
+protected:
+    void keyPressEvent(QKeyEvent *event);
+    void keyReleaseEvent(QKeyEvent *event);
+
 private:
     Ui::CoreTempSettingPopup *ui;
     Oven *oven;
 
+    QTimer focusCoreTempButtonTimer;
+    QWidget *pushed = NULL;
+
+    void onEncoderLeft();
+    void onEncoderRight();
+    void onEncoderClicked(QWidget *clicked);
+
+
 private slots:
     void updateView();
     void on_cancelButton_clicked();
     void on_applyButton_clicked();
+    void on_coreTempButton_clicked();
+    void focusCoreTempButton();
 };
 
 #endif // CORETEMPSETTINGPOPUP_H
diff --git a/app/gui/oven_control/coretempsettingpopup.ui b/app/gui/oven_control/coretempsettingpopup.ui
index 3bfaab1..d783bdb 100644
--- a/app/gui/oven_control/coretempsettingpopup.ui
+++ b/app/gui/oven_control/coretempsettingpopup.ui
@@ -13,9 +13,15 @@
   <property name="styleSheet">
    <string notr="true">#background {
 background-image: url(:/images/background/manual_core.png);
+background-origin: border;
 margin-top: -720px;
 }
 
+#background:focus {
+border: 4px solid gray;
+border-top: 724px solid gray;
+}
+
 QPushButton[style=&quot;icon&quot;] {
 background-image: url(:/images/slider_icon/background.png);
 background-repeat: no-repeat;
@@ -61,6 +67,9 @@ height: 33px;
      <height>730</height>
     </rect>
    </property>
+   <property name="focusPolicy">
+    <enum>Qt::TabFocus</enum>
+   </property>
   </widget>
   <widget class="QLabel" name="label_2">
    <property name="geometry">
@@ -150,7 +159,7 @@ height: 33px;
    </property>
    <property name="styleSheet">
     <string notr="true">QPushButton { background-image: url(:/images/manual_button/ok.png); }
-QPushButton:pressed { background-image: url(:/images/manual_button/ok_ov.png); }</string>
+QPushButton:pressed, QPushButton:focus { background-image: url(:/images/manual_button/ok_ov.png); }</string>
    </property>
    <property name="text">
     <string>확인/적용하기</string>
@@ -437,7 +446,8 @@ QPushButton:pressed { background-image: url(:/images/manual_button/ok_ov.png); }
    </property>
    <property name="styleSheet">
     <string notr="true">QPushButton { image: url(:/images/slider_icon/core_temp_enabled.png); }
-QPushButton:pressed { image: url(:/images/slider_icon/core_temp_ov.png); }</string>
+QPushButton:checked { image: url(:/images/slider_icon/core_temp_ov.png); }
+QPushButton:pressed, QPushButton:focus { image: url(:/images/slider_icon/core_temp_ov.png); }</string>
    </property>
    <property name="style" stdset="0">
     <string>icon</string>
@@ -657,7 +667,7 @@ QPushButton:pressed { image: url(:/images/slider_icon/core_temp_ov.png); }</stri
    </property>
    <property name="styleSheet">
     <string notr="true">QPushButton { background-image: url(:/images/manual_button/back.png); }
-QPushButton:pressed { background-image: url(:/images/manual_button/back_ov.png); }</string>
+QPushButton:pressed, QPushButton:focus { background-image: url(:/images/manual_button/back_ov.png); }</string>
    </property>
    <property name="text">
     <string>이전으로</string>
@@ -1004,6 +1014,9 @@ QPushButton:pressed { background-image: url(:/images/manual_button/back_ov.png);
      <height>140</height>
     </rect>
    </property>
+   <property name="focusPolicy">
+    <enum>Qt::ClickFocus</enum>
+   </property>
   </widget>
  </widget>
  <customwidgets>
@@ -1014,6 +1027,12 @@ QPushButton:pressed { background-image: url(:/images/manual_button/back_ov.png);
    <container>1</container>
   </customwidget>
  </customwidgets>
+ <tabstops>
+  <tabstop>background</tabstop>
+  <tabstop>coreTempButton</tabstop>
+  <tabstop>cancelButton</tabstop>
+  <tabstop>applyButton</tabstop>
+ </tabstops>
  <resources>
   <include location="resources.qrc"/>
  </resources>
diff --git a/app/gui/oven_control/manualcookwindow.cpp b/app/gui/oven_control/manualcookwindow.cpp
index 8600482..bb0927f 100644
--- a/app/gui/oven_control/manualcookwindow.cpp
+++ b/app/gui/oven_control/manualcookwindow.cpp
@@ -125,6 +125,27 @@ ManualCookWindow::ManualCookWindow(QWidget *parent, Define::Mode mode) :
     showCurrentTempTimer.setInterval(1000);
     connect(&showCurrentTempTimer, SIGNAL(timeout()), SLOT(showCurrentTemp()));
 
+    focusHumidityButtonTimer.setSingleShot(true);
+    focusHumidityButtonTimer.setInterval(3000);
+    connect(&focusHumidityButtonTimer, SIGNAL(timeout()), SLOT(focusHumidityButton()));
+
+    focusTempButtonTimer.setSingleShot(true);
+    focusTempButtonTimer.setInterval(3000);
+    connect(&focusTempButtonTimer, SIGNAL(timeout()), SLOT(focusTempButton()));
+
+    focusTimeButtonTimer.setSingleShot(true);
+    focusTimeButtonTimer.setInterval(3000);
+    connect(&focusTimeButtonTimer, SIGNAL(timeout()), SLOT(focusTimeButton()));
+
+    focusInterTempButtonTimer.setSingleShot(true);
+    focusInterTempButtonTimer.setInterval(3000);
+    connect(&focusInterTempButtonTimer, SIGNAL(timeout()), SLOT(focusInterTempButton()));
+
+    connect(ui->humiditySlider, SIGNAL(sliderMoved(int)), &focusHumidityButtonTimer, SLOT(start()));
+    connect(ui->tempSlider, SIGNAL(sliderMoved(int)), &focusTempButtonTimer, SLOT(start()));
+    connect(ui->timeSlider, SIGNAL(sliderMoved(int)), &focusTimeButtonTimer, SLOT(start()));
+    connect(ui->interTempSlider, SIGNAL(sliderMoved(int)), &focusInterTempButtonTimer, SLOT(start()));
+
     connect(oven, SIGNAL(changed(Oven*)), this, SLOT(onOvenUpdated(Oven*)));
     oven->setDefault(mode);
 
@@ -135,6 +156,8 @@ ManualCookWindow::ManualCookWindow(QWidget *parent, Define::Mode mode) :
         connect(button, &QPushButton::pressed, SoundPlayer::playClick);
 
     QTimer::singleShot(0, this, SLOT(setupAnimation()));
+
+    setFocus();
 }
 
 ManualCookWindow::ManualCookWindow(QWidget *parent, ManualCookSetting setting)
@@ -159,6 +182,55 @@ ManualCookWindow::~ManualCookWindow()
     delete ui;
 }
 
+void ManualCookWindow::keyPressEvent(QKeyEvent *event)
+{
+    switch (event->key())
+    {
+    case 0x01000030:    // Turn left
+        onEncoderLeft();
+        break;
+    case 0x01000031:    // Push
+        if (focusWidget() != this)
+        {
+            pushed = focusWidget();
+
+            if (pushed == ui->humidityButton)
+                on_humidityButton_pressed();
+            else if (pushed == ui->tempButton)
+                on_tempButton_pressed();
+
+        }
+        break;
+    case 0x01000032:    // Turn right
+        onEncoderRight();
+        break;
+    }
+}
+
+void ManualCookWindow::keyReleaseEvent(QKeyEvent *event)
+{
+    switch (event->key())
+    {
+    case 0x01000030:    // Turn left
+        onEncoderLeft();
+        break;
+    case 0x01000031:    // Push
+        if (focusWidget() == ui->humidityButton)
+            on_humidityButton_released();
+        else if (focusWidget() == ui->tempButton)
+            on_tempButton_released();
+
+        if (focusWidget() == pushed)
+            onEncoderClicked(pushed);
+
+        pushed = NULL;
+        break;
+    case 0x01000032:    // Turn right
+        onEncoderRight();
+        break;
+    }
+}
+
 void ManualCookWindow::setupAnimation()
 {
     ui->openDoorAnimation->load(":/images/animation/door_big_09.png");
@@ -178,16 +250,28 @@ void ManualCookWindow::updateView()
     switch (oven->mode())
     {
     case Define::DryMode:
+        if (ui->steamButton->isChecked())
+            ui->steamButton->setChecked(false);
+        if (ui->combiButton->isChecked())
+            ui->combiButton->setChecked(false);
         if (!ui->dryheatButton->isChecked())
             ui->dryheatButton->setChecked(true);
         break;
     case Define::SteamMode:
         if (!ui->steamButton->isChecked())
             ui->steamButton->setChecked(true);
+        if (ui->combiButton->isChecked())
+            ui->combiButton->setChecked(false);
+        if (ui->dryheatButton->isChecked())
+            ui->dryheatButton->setChecked(false);
         break;
     case Define::CombiMode:
+        if (ui->steamButton->isChecked())
+            ui->steamButton->setChecked(false);
         if (!ui->combiButton->isChecked())
             ui->combiButton->setChecked(true);
+        if (ui->dryheatButton->isChecked())
+            ui->dryheatButton->setChecked(false);
         break;
     default:
         break;
@@ -196,7 +280,7 @@ void ManualCookWindow::updateView()
     int humidity;
     if (showCurrentHumidity_)
         humidity = oven->currentHumidity();
-    else if (ui->humiditySlider->isSliderDown())
+    else if (ui->humiditySlider->isSliderDown() || focusWidget() == ui->humiditySlider)
         humidity = ui->humiditySlider->sliderPosition();
     else
         humidity = oven->humidity();
@@ -217,7 +301,7 @@ void ManualCookWindow::updateView()
     int temp;
     if (showCurrentTemp_)
         temp = oven->currentTemp();
-    else if (ui->tempSlider->isSliderDown())
+    else if (ui->tempSlider->isSliderDown() || focusWidget() == ui->tempSlider)
         temp = ui->tempSlider->sliderPosition();
     else
         temp = oven->temp();
@@ -235,25 +319,21 @@ void ManualCookWindow::updateView()
         ui->tempSlider->setValue(temp);
     ui->tempSlider->blockSignals(old);
 
-    int msecs;
-    if (ui->timeSlider->isSliderDown())
-        msecs = sliderToTime(ui->timeSlider->sliderPosition()) * 1000;
+    int msecs = oven->msecs();
+    if (ui->timeSlider->isSliderMoved())
+        ui->timeLabel->setText(Stringer::remainingTime(sliderToTime(ui->timeSlider->sliderPosition()) * 1000, Stringer::fontSize14));
     else
-        msecs = oven->msecs();
+        ui->timeLabel->setText(Stringer::remainingTime(msecs, Stringer::fontSize14));
 
-    if (msecs != lastViewTime)
+    if (focusWidget() != ui->timeSlider)
     {
-        lastViewTime = msecs;
-
         bool old = ui->timeSlider->blockSignals(true);
         ui->timeSlider->setSliderPosition(timeToSlider(msecs / 1000));
         ui->timeSlider->blockSignals(old);
-
-        ui->timeLabel->setText(Stringer::remainingTime(msecs, Stringer::fontSize14));
     }
 
     int interTemp;
-    if (ui->interTempSlider->isSliderDown())
+    if (ui->interTempSlider->isSliderDown() || focusWidget() == ui->interTempSlider)
         interTemp = ui->interTempSlider->sliderPosition();
     else
         interTemp = oven->interTemp();
@@ -264,23 +344,7 @@ void ManualCookWindow::updateView()
         if (interTempEnabled != lastViewInterTempEnabled)
         {
             lastViewInterTempEnabled = oven->interTempEnabled();
-
-            if (interTempEnabled)
-                ui->interTempButton->setStyleSheet("\
-QPushButton {\
-    image: url(:/images/slider_icon/core_temp_enabled.png);\
-}\
-QPushButton:pressed {\
-    image: url(:/images/slider_icon/core_temp_ov.png);\
-}");
-            else
-                ui->interTempButton->setStyleSheet("\
-QPushButton {\
-    image: url(:/images/slider_icon/core_temp.png);\
-}\
-QPushButton:pressed {\
-    image: url(:/images/slider_icon/core_temp_ov.png);\
-}");
+            ui->interTempButton->setChecked(interTempEnabled);
         }
 
         lastViewInterTemp = interTemp;
@@ -312,32 +376,70 @@ QPushButton:pressed {\
                         "border-image: url(:/images/manual_button/run.png)");
     }
 
-    bool damper = oven->damper();
-    if (damper != lastViewDamper)
+    if (showFrontButtons)
     {
-        lastViewDamper = damper;
-
-        if (damper)
-            ui->damperButton->setStyleSheet(
-                        "background-image: url(:/images/manual_button/damper_open.png)");
+        ui->preheatButton->show();
+        ui->damperButton->show();
+        ui->humidificationButton->show();
+        if (oven->cooking())
+            ui->repeatButton->show();
         else
-            ui->damperButton->setStyleSheet(
-                        "background-image: url(:/images/manual_button/damper_close.png)");
-    }
+            ui->repeatButton->hide();
 
-    bool humidification = oven->humidification();
-    if (humidification != lastViewHumidification)
+        ui->cooldownButton->hide();
+        ui->fanButton->hide();
+        ui->reserveButton->hide();
+        ui->favoriteButton->hide();
+    }
+    else
     {
-        lastViewHumidification = humidification;
+        ui->preheatButton->hide();
+        ui->damperButton->hide();
+        ui->humidificationButton->hide();
+        ui->repeatButton->hide();
 
-        if (humidification)
-            ui->humidificationButton->setStyleSheet(
-                        "background-image: url(:/images/manual_button/side_nozzle_open.png)");
+        ui->cooldownButton->show();
+        ui->fanButton->show();
+        if (oven->cooking())
+        {
+            ui->reserveButton->hide();
+            ui->favoriteButton->hide();
+        }
         else
-            ui->humidificationButton->setStyleSheet(
-                        "background-image: url(:/images/manual_button/side_nozzle_close.png)");
+        {
+            ui->reserveButton->show();
+            ui->favoriteButton->show();
+        }
     }
 
+    bool damper = oven->damper();
+    ui->damperButton->setChecked(damper);
+//    if (damper != lastViewDamper)
+//    {
+//        lastViewDamper = damper;
+
+//        if (damper)
+//            ui->damperButton->setStyleSheet(
+//                        "background-image: url(:/images/manual_button/damper_open.png)");
+//        else
+//            ui->damperButton->setStyleSheet(
+//                        "background-image: url(:/images/manual_button/damper_close.png)");
+//    }
+
+    bool humidification = oven->humidification();
+    ui->humidificationButton->setChecked(humidification);
+//    if (humidification != lastViewHumidification)
+//    {
+//        lastViewHumidification = humidification;
+
+//        if (humidification)
+//            ui->humidificationButton->setStyleSheet(
+//                        "background-image: url(:/images/manual_button/side_nozzle_open.png)");
+//        else
+//            ui->humidificationButton->setStyleSheet(
+//                        "background-image: url(:/images/manual_button/side_nozzle_close.png)");
+//    }
+
     int fan = oven->fan();
     if (fan != lastViewFan)
     {
@@ -376,20 +478,6 @@ QPushButton:pressed {\
         ui->upperStack->setCurrentIndex(1);
     else
         ui->upperStack->setCurrentIndex(0);
-
-    if (oven->cooking())
-    {
-        ui->reserveButton->hide();
-        ui->favoriteButton->hide();
-        ui->repeatButton->show();
-    }
-    else
-    {
-        ui->reserveButton->show();
-        ui->favoriteButton->show();
-        ui->repeatButton->hide();
-    }
-
 }
 
 void ManualCookWindow::showCurrentHumidity()
@@ -588,6 +676,159 @@ void ManualCookWindow::onMonitor3Timeout()
     close();
 }
 
+void ManualCookWindow::onEncoderLeft()
+{
+    QWidget *focused = focusWidget();
+    if (focused == NULL)
+        focusPreviousChild();
+    else if (focused == this || focused->inherits("QPushButton"))
+    {
+        focusPreviousChild();
+        focused = focusWidget();
+
+        if (focused == ui->steamButton)
+        {
+            if (oven->mode() == Define::SteamMode)
+                focusPreviousChild();
+        }
+        else if (focused == ui->combiButton)
+        {
+            if (oven->mode() == Define::CombiMode)
+                focusPreviousChild();
+        }
+        else if (focused == ui->dryheatButton)
+        {
+            if (oven->mode() == Define::DryMode)
+                focusPreviousChild();
+        }
+    }
+}
+
+void ManualCookWindow::onEncoderRight()
+{
+    QWidget *focused = focusWidget();
+    if (focused == NULL)
+        focusNextChild();
+    else if (focused == this)
+    {
+        switch (oven->mode())
+        {
+        case Define::DryMode:
+        case Define::SteamMode:
+            ui->tempButton->setFocus();
+            break;
+        default:
+            ui->humidityButton->setFocus();
+        }
+    }
+    else if (focused->inherits("QPushButton"))
+    {
+        focusNextChild();
+        focused = focusWidget();
+
+        if (focused == ui->steamButton)
+        {
+            if (oven->mode() == Define::SteamMode)
+                focusNextChild();
+        }
+        else if (focused == ui->combiButton)
+        {
+            if (oven->mode() == Define::CombiMode)
+                focusNextChild();
+        }
+        else if (focused == ui->dryheatButton)
+        {
+            if (oven->mode() == Define::DryMode)
+                focusNextChild();
+        }
+    }
+}
+
+void ManualCookWindow::onEncoderClicked(QWidget *clicked)
+{
+    QWidget *focused = clicked;
+    if (focused == NULL)
+        return;
+
+    if (focused->inherits("QPushButton"))
+    {
+        QPushButton *pb = qobject_cast<QPushButton *>(focused);
+        if (pb)
+        {
+            pb->click();
+
+            if (pb == ui->steamButton || pb == ui->dryheatButton)
+                ui->tempButton->setFocus();
+            else if (pb == ui->combiButton)
+                ui->humidityButton->setFocus();
+        }
+    }
+    else if (focused->inherits("Slider"))
+    {
+        Slider *slider = qobject_cast<Slider *>(focused);
+        if (slider)
+        {
+            if (slider->value() != slider->sliderPosition())
+                slider->setValue(slider->sliderPosition());
+
+            if (slider == ui->humiditySlider)
+                ui->humidityButton->setFocus();
+            else if (slider == ui->tempSlider)
+                ui->tempButton->setFocus();
+            else if (slider == ui->timeSlider)
+                ui->timeButton->setFocus();
+            else if (slider == ui->interTempSlider)
+                ui->interTempButton->setFocus();
+        }
+    }
+}
+
+void ManualCookWindow::focusHumidityButton()
+{
+    if (focusWidget() == ui->humiditySlider)
+    {
+        oven->setHumidity(ui->humiditySlider->value());
+        ui->humidityButton->setFocus();
+    }
+}
+
+void ManualCookWindow::focusTempButton()
+{
+    if (focusWidget() == ui->tempSlider)
+    {
+        oven->setTemp(ui->tempSlider->value());
+        ui->tempButton->setFocus();
+    }
+}
+
+void ManualCookWindow::focusTimeButton()
+{
+    if (focusWidget() == ui->timeSlider)
+    {
+        if (ui->timeSlider->isSliderMoved())
+            oven->setTime(sliderToTime(ui->timeSlider->value()));
+        ui->timeButton->setFocus();
+    }
+}
+
+void ManualCookWindow::focusInterTempButton()
+{
+    if (focusWidget() == ui->interTempSlider)
+    {
+        oven->setInterTemp(ui->interTempSlider->value());
+        ui->interTempButton->setFocus();
+    }
+}
+
+void ManualCookWindow::focusAgain()
+{
+    if (focused)
+    {
+        focused->setFocus();
+        focused = NULL;
+    }
+}
+
 void ManualCookWindow::on_steamButton_clicked()
 {
     setOvenDefault(Define::SteamMode);
@@ -629,6 +870,27 @@ void ManualCookWindow::on_tempButton_released()
         hideCurrentTemp();
 }
 
+void ManualCookWindow::on_humidityButton_clicked()
+{
+    ui->humiditySlider->setFocus();
+
+    focusHumidityButtonTimer.start();
+}
+
+void ManualCookWindow::on_tempButton_clicked()
+{
+    ui->tempSlider->setFocus();
+
+    focusTempButtonTimer.start();
+}
+
+void ManualCookWindow::on_timeButton_clicked()
+{
+    ui->timeSlider->setFocus();
+
+    focusTimeButtonTimer.start();
+}
+
 void ManualCookWindow::on_interTempButton_clicked()
 {
     if (oven->interTempEnabled())
@@ -637,6 +899,9 @@ void ManualCookWindow::on_interTempButton_clicked()
     {
         CoreTempSettingPopup *p = new CoreTempSettingPopup(this);
         p->show();
+
+        focused = ui->interTempButton;
+        connect(p, SIGNAL(destroyed(QObject*)), SLOT(focusAgain()));
     }
 }
 
@@ -664,6 +929,9 @@ void ManualCookWindow::on_preheatButton_clicked()
     PreheatPopup *p = new PreheatPopup(this, oven);
     p->setWindowModality(Qt::WindowModal);
     p->showFullScreen();
+
+    focused = ui->preheatButton;
+    connect(p, SIGNAL(destroyed(QObject*)), SLOT(focusAgain()));
 }
 
 void ManualCookWindow::on_damperButton_clicked()
@@ -713,6 +981,9 @@ void ManualCookWindow::on_cooldownButton_clicked()
     CooldownPopup *p = new CooldownPopup(this, oven);
     p->setWindowModality(Qt::WindowModal);
     p->showFullScreen();
+
+    focused = ui->cooldownButton;
+    connect(p, SIGNAL(destroyed(QObject*)), SLOT(focusAgain()));
 }
 
 void ManualCookWindow::on_reserveButton_clicked()
@@ -725,6 +996,9 @@ void ManualCookWindow::on_reserveButton_clicked()
         connect(p, SIGNAL(timeout()), SLOT(start()));
         connect(p, SIGNAL(canceled()), &startCookingTimer, SLOT(start()));
         p->showFullScreen();
+
+        focused = ui->reserveButton;
+        connect(p, SIGNAL(destroyed(QObject*)), SLOT(focusAgain()));
     }
 }
 
@@ -736,6 +1010,8 @@ void ManualCookWindow::on_favoriteButton_clicked()
     ConfirmPopup *p = new ConfirmPopup(this, tr("즐겨찾기 항목에 추가하시겠습니까?"));
     p->showFullScreen();
 
+    focused = ui->favoriteButton;
+    connect(p, SIGNAL(destroyed(QObject*)), SLOT(focusAgain()));
     connect(p, SIGNAL(accepted()), SLOT(addFavorite()));
 
     if (startCookingTimer.isActive())
@@ -745,14 +1021,11 @@ void ManualCookWindow::on_favoriteButton_clicked()
     }
 }
 
-void ManualCookWindow::on_goBackStackButton_clicked()
-{
-    ui->buttonStack->setCurrentIndex(1);
-}
-
 void ManualCookWindow::on_goFrontStackButton_clicked()
 {
-    ui->buttonStack->setCurrentIndex(0);
+    showFrontButtons = !showFrontButtons;
+
+    updateView();
 }
 
 void ManualCookWindow::on_backButton_clicked()
@@ -769,6 +1042,9 @@ void ManualCookWindow::on_configButton_clicked()
         p->showFullScreen();
 
         connect(p, SIGNAL(accepted()), SLOT(jumpConfig()));
+
+        focused = ui->configButton;
+        connect(p, SIGNAL(destroyed(QObject*)), SLOT(focusAgain()));
     }
     else
     {
@@ -789,6 +1065,9 @@ void ManualCookWindow::on_favoritesButton_clicked()
         p->showFullScreen();
 
         connect(p, SIGNAL(accepted()), SLOT(jumpFavorites()));
+
+        focused = ui->favoritesButton;
+        connect(p, SIGNAL(destroyed(QObject*)), SLOT(focusAgain()));
     }
     else
     {
@@ -810,6 +1089,9 @@ void ManualCookWindow::on_washButton_clicked()
         p->showFullScreen();
 
         connect(p, SIGNAL(accepted()), SLOT(jumpWash()));
+
+        focused = ui->washButton;
+        connect(p, SIGNAL(destroyed(QObject*)), SLOT(focusAgain()));
     }
     else
     {
@@ -844,8 +1126,8 @@ int ManualCookWindow::sliderToTime(int value)
 int ManualCookWindow::timeToSlider(int secs)
 {
     if (secs <= 180 * 60)
-        return secs / 60;
+        return qCeil((qreal) secs / 60);
     if (secs <= 360 * 60)
-        return 180 + (secs - 180 * 60) / 2 / 60;
-    return 270 + (secs - 360 * 60) / 15 / 60;
+        return 180 + qCeil((qreal) (secs - 180 * 60) / 2 / 60);
+    return 270 + qCeil((qreal) (secs - 360 * 60) / 15 / 60);
 }
diff --git a/app/gui/oven_control/manualcookwindow.h b/app/gui/oven_control/manualcookwindow.h
index e40d206..a7f9230 100644
--- a/app/gui/oven_control/manualcookwindow.h
+++ b/app/gui/oven_control/manualcookwindow.h
@@ -2,6 +2,7 @@
 #define MANUALCOOKWINDOW_H
 
 #include <QMainWindow>
+#include <QKeyEvent>
 
 #include "oven.h"
 #include "udphandler.h"
@@ -20,6 +21,10 @@ public:
     explicit ManualCookWindow(QWidget *parent, ManualCookSetting setting);
     ~ManualCookWindow();
 
+protected:
+    void keyPressEvent(QKeyEvent *event);
+    void keyReleaseEvent(QKeyEvent *event);
+
 signals:
     void cookStopRequested();
 
@@ -47,6 +52,16 @@ private slots:
     void onMonitor2Timeout();
     void onMonitor3Timeout();
 
+    void onEncoderLeft();
+    void onEncoderRight();
+    void onEncoderClicked(QWidget *clicked);
+
+    void focusHumidityButton();
+    void focusTempButton();
+    void focusTimeButton();
+    void focusInterTempButton();
+    void focusAgain();
+
     void on_steamButton_clicked();
     void on_combiButton_clicked();
     void on_dryheatButton_clicked();
@@ -55,6 +70,10 @@ private slots:
     void on_humidityButton_released();
     void on_tempButton_pressed();
     void on_tempButton_released();
+
+    void on_humidityButton_clicked();
+    void on_tempButton_clicked();
+    void on_timeButton_clicked();
     void on_interTempButton_clicked();
 
     void on_runStopButton_clicked();
@@ -66,7 +85,6 @@ private slots:
     void on_cooldownButton_clicked();
     void on_reserveButton_clicked();
     void on_favoriteButton_clicked();
-    void on_goBackStackButton_clicked();
     void on_goFrontStackButton_clicked();
 
     void on_backButton_clicked();
@@ -77,6 +95,8 @@ private slots:
 
     void on_timeSlider_valueChanged();
 
+
+
 private:
     Ui::ManualCookWindow *ui;
     Oven *oven;
@@ -105,6 +125,8 @@ private:
     bool lastViewHumidification;
     int lastViewFan;
 
+    bool showFrontButtons = true;
+
     int monitorLevel;
     QTimer monitor1;
     QTimer monitor2;
@@ -117,6 +139,14 @@ private:
 
     int sliderToTime(int value);
     int timeToSlider(int secs);
+
+    QWidget *pushed = NULL;
+    QWidget *focused = NULL;
+
+    QTimer focusHumidityButtonTimer;
+    QTimer focusTempButtonTimer;
+    QTimer focusTimeButtonTimer;
+    QTimer focusInterTempButtonTimer;
 };
 
 #endif // MANUALCOOKWINDOW_H
diff --git a/app/gui/oven_control/manualcookwindow.ui b/app/gui/oven_control/manualcookwindow.ui
index f395998..8943716 100644
--- a/app/gui/oven_control/manualcookwindow.ui
+++ b/app/gui/oven_control/manualcookwindow.ui
@@ -41,6 +41,12 @@ background-position: center;
 border: none;
 }
 
+QPushButton[style=&quot;tool&quot;] {
+border: none;
+background-repeat: no-repeat;
+background-position: center;
+}
+
 QSlider::groove {
 background-image: url(:/images/slider/groove_ticks.png);
 background-repeat: no-repeat;
@@ -133,8 +139,8 @@ height: 33px;
     </property>
     <property name="styleSheet">
      <string notr="true">QPushButton { background-image: url(:/images/cook_mode/big_combi_hide.png); }
-QPushButton:pressed { background-image: url(:/images/cook_mode/big_combi_ov.png); }
-QPushButton:checked { background-image: url(:/images/cook_mode/big_combi.png); }</string>
+QPushButton:checked { background-image: url(:/images/cook_mode/big_combi.png); }
+QPushButton:pressed, QPushButton:focus { background-image: url(:/images/cook_mode/big_combi_ov.png); }</string>
     </property>
     <property name="text">
      <string>콤비</string>
@@ -143,7 +149,7 @@ QPushButton:checked { background-image: url(:/images/cook_mode/big_combi.png); }
      <bool>true</bool>
     </property>
     <property name="autoExclusive">
-     <bool>true</bool>
+     <bool>false</bool>
     </property>
     <property name="style" stdset="0">
      <string notr="true">mode</string>
@@ -160,8 +166,8 @@ QPushButton:checked { background-image: url(:/images/cook_mode/big_combi.png); }
     </property>
     <property name="styleSheet">
      <string notr="true">QPushButton { background-image: url(:/images/cook_mode/big_steam_hide.png); }
-QPushButton:pressed { background-image: url(:/images/cook_mode/big_steam_ov.png); }
-QPushButton:checked { background-image: url(:/images/cook_mode/big_steam.png); }</string>
+QPushButton:checked { background-image: url(:/images/cook_mode/big_steam.png); }
+QPushButton:pressed, QPushButton:focus { background-image: url(:/images/cook_mode/big_steam_ov.png); }</string>
     </property>
     <property name="text">
      <string>스팀</string>
@@ -170,7 +176,7 @@ QPushButton:checked { background-image: url(:/images/cook_mode/big_steam.png); }
      <bool>true</bool>
     </property>
     <property name="autoExclusive">
-     <bool>true</bool>
+     <bool>false</bool>
     </property>
     <property name="style" stdset="0">
      <string notr="true">mode</string>
@@ -187,8 +193,8 @@ QPushButton:checked { background-image: url(:/images/cook_mode/big_steam.png); }
     </property>
     <property name="styleSheet">
      <string notr="true">QPushButton { background-image: url(:/images/cook_mode/big_dryheat_hide.png); }
-QPushButton:pressed { background-image: url(:/images/cook_mode/big_dryheat_ov.png); }
-QPushButton:checked { background-image: url(:/images/cook_mode/big_dryheat.png); }</string>
+QPushButton:checked { background-image: url(:/images/cook_mode/big_dryheat.png); }
+QPushButton:pressed, QPushButton:focus { background-image: url(:/images/cook_mode/big_dryheat_ov.png); }</string>
     </property>
     <property name="text">
      <string>건열</string>
@@ -197,7 +203,7 @@ QPushButton:checked { background-image: url(:/images/cook_mode/big_dryheat.png);
      <bool>true</bool>
     </property>
     <property name="autoExclusive">
-     <bool>true</bool>
+     <bool>false</bool>
     </property>
     <property name="style" stdset="0">
      <string notr="true">mode</string>
@@ -223,7 +229,7 @@ QPushButton:checked { background-image: url(:/images/cook_mode/big_dryheat.png);
      </property>
      <property name="styleSheet">
       <string notr="true">QPushButton { border-image: url(:/images/bottom_bar/back.png); }
-QPushButton:pressed { border-image: url(:/images/bottom_bar/back_ov.png); }</string>
+QPushButton:pressed, QPushButton:focus { border-image: url(:/images/bottom_bar/back_ov.png); }</string>
      </property>
      <property name="text">
       <string/>
@@ -240,7 +246,7 @@ QPushButton:pressed { border-image: url(:/images/bottom_bar/back_ov.png); }</str
      </property>
      <property name="styleSheet">
       <string notr="true">QPushButton { border-image: url(:/images/bottom_bar/config.png); }
-QPushButton:pressed { border-image: url(:/images/bottom_bar/config_ov.png); }</string>
+QPushButton:pressed, QPushButton:focus { border-image: url(:/images/bottom_bar/config_ov.png); }</string>
      </property>
      <property name="text">
       <string/>
@@ -257,7 +263,7 @@ QPushButton:pressed { border-image: url(:/images/bottom_bar/config_ov.png); }</s
      </property>
      <property name="styleSheet">
       <string notr="true">QPushButton { border-image: url(:/images/bottom_bar/favorites_manual.png); }
-QPushButton:pressed { border-image: url(:/images/bottom_bar/favorites_manual_ov.png); }</string>
+QPushButton:pressed, QPushButton:focus { border-image: url(:/images/bottom_bar/favorites_manual_ov.png); }</string>
      </property>
      <property name="text">
       <string/>
@@ -274,7 +280,7 @@ QPushButton:pressed { border-image: url(:/images/bottom_bar/favorites_manual_ov.
      </property>
      <property name="styleSheet">
       <string notr="true">QPushButton { border-image: url(:/images/bottom_bar/wash.png); }
-QPushButton:pressed { border-image: url(:/images/bottom_bar/wash_ov.png); }</string>
+QPushButton:pressed, QPushButton:focus { border-image: url(:/images/bottom_bar/wash_ov.png); }</string>
      </property>
      <property name="text">
       <string/>
@@ -291,7 +297,7 @@ QPushButton:pressed { border-image: url(:/images/bottom_bar/wash_ov.png); }</str
      </property>
      <property name="styleSheet">
       <string notr="true">QPushButton { border-image: url(:/images/bottom_bar/help.png); }
-QPushButton:pressed { border-image: url(:/images/bottom_bar/help_ov.png); }</string>
+QPushButton:pressed, QPushButton:focus { border-image: url(:/images/bottom_bar/help_ov.png); }</string>
      </property>
      <property name="text">
       <string/>
@@ -497,7 +503,7 @@ QPushButton:pressed { border-image: url(:/images/bottom_bar/help_ov.png); }</str
     </property>
     <property name="styleSheet">
      <string notr="true">QPushButton { image: url(:/images/slider_icon/temp.png); }
-QPushButton:pressed { image: url(:/images/slider_icon/temp_ov.png); }</string>
+QPushButton:pressed, QPushButton:focus { image: url(:/images/slider_icon/temp_ov.png); }</string>
     </property>
     <property name="style" stdset="0">
      <string notr="true">icon</string>
@@ -631,248 +637,6 @@ QPushButton:pressed { image: url(:/images/slider_icon/temp_ov.png); }</string>
      <set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
     </property>
    </widget>
-   <widget class="QStackedWidget" name="buttonStack">
-    <property name="geometry">
-     <rect>
-      <x>337</x>
-      <y>1319</y>
-      <width>563</width>
-      <height>131</height>
-     </rect>
-    </property>
-    <property name="styleSheet">
-     <string notr="true">QPushButton {
-background-repeat: no-repeat;
-background-position: center;
-border: none;
-}</string>
-    </property>
-    <property name="currentIndex">
-     <number>0</number>
-    </property>
-    <widget class="QWidget" name="frontButtonStack">
-     <widget class="QPushButton" name="goBackStackButton">
-      <property name="geometry">
-       <rect>
-        <x>448</x>
-        <y>0</y>
-        <width>112</width>
-        <height>131</height>
-       </rect>
-      </property>
-      <property name="styleSheet">
-       <string notr="true">QPushButton { background-image: url(:/images/manual_button/next.png); }
-QPushButton:pressed { background-image: url(:/images/manual_button/next_ov.png); }</string>
-      </property>
-     </widget>
-     <widget class="QWidget" name="sysLine_7" native="true">
-      <property name="geometry">
-       <rect>
-        <x>336</x>
-        <y>36</y>
-        <width>2</width>
-        <height>58</height>
-       </rect>
-      </property>
-      <property name="styleSheet">
-       <string notr="true">background-image: url(:/images/line/manual_button.png);</string>
-      </property>
-     </widget>
-     <widget class="QPushButton" name="humidificationButton">
-      <property name="geometry">
-       <rect>
-        <x>224</x>
-        <y>0</y>
-        <width>112</width>
-        <height>131</height>
-       </rect>
-      </property>
-      <property name="styleSheet">
-       <string notr="true">QPushButton { background-image: url(:/images/manual_button/side_nozzle_close.png); }</string>
-      </property>
-     </widget>
-     <widget class="QWidget" name="sysLine_8" native="true">
-      <property name="geometry">
-       <rect>
-        <x>224</x>
-        <y>36</y>
-        <width>2</width>
-        <height>58</height>
-       </rect>
-      </property>
-      <property name="styleSheet">
-       <string notr="true">background-image: url(:/images/line/manual_button.png);</string>
-      </property>
-     </widget>
-     <widget class="QPushButton" name="preheatButton">
-      <property name="geometry">
-       <rect>
-        <x>0</x>
-        <y>0</y>
-        <width>112</width>
-        <height>131</height>
-       </rect>
-      </property>
-      <property name="styleSheet">
-       <string notr="true">QPushButton { background-image: url(:/images/manual_button/preheat.png); }
-QPushButton:pressed { background-image: url(:/images/manual_button/preheat_ov.png); }</string>
-      </property>
-     </widget>
-     <widget class="QPushButton" name="repeatButton">
-      <property name="geometry">
-       <rect>
-        <x>336</x>
-        <y>0</y>
-        <width>112</width>
-        <height>131</height>
-       </rect>
-      </property>
-      <property name="styleSheet">
-       <string notr="true">QPushButton { background-image: url(:/images/manual_button/repeat.png); }
-QPushButton:pressed { background-image: url(:/images/manual_button/repeat_ov.png); }</string>
-      </property>
-     </widget>
-     <widget class="QWidget" name="sysLine_9" native="true">
-      <property name="geometry">
-       <rect>
-        <x>112</x>
-        <y>36</y>
-        <width>2</width>
-        <height>58</height>
-       </rect>
-      </property>
-      <property name="styleSheet">
-       <string notr="true">background-image: url(:/images/line/manual_button.png);</string>
-      </property>
-     </widget>
-     <widget class="QPushButton" name="damperButton">
-      <property name="geometry">
-       <rect>
-        <x>112</x>
-        <y>0</y>
-        <width>112</width>
-        <height>131</height>
-       </rect>
-      </property>
-      <property name="styleSheet">
-       <string notr="true">QPushButton { background-image: url(:/images/manual_button/damper_close.png); }</string>
-      </property>
-     </widget>
-    </widget>
-    <widget class="QWidget" name="backButtonStack">
-     <widget class="QPushButton" name="goFrontStackButton">
-      <property name="geometry">
-       <rect>
-        <x>448</x>
-        <y>0</y>
-        <width>112</width>
-        <height>131</height>
-       </rect>
-      </property>
-      <property name="styleSheet">
-       <string notr="true">QPushButton { background-image: url(:/images/manual_button/next.png); }
-QPushButton:pressed { background-image: url(:/images/manual_button/next_ov.png); }</string>
-      </property>
-     </widget>
-     <widget class="QWidget" name="sysLine_10" native="true">
-      <property name="geometry">
-       <rect>
-        <x>112</x>
-        <y>36</y>
-        <width>2</width>
-        <height>58</height>
-       </rect>
-      </property>
-      <property name="styleSheet">
-       <string notr="true">background-image: url(:/images/line/manual_button.png);</string>
-      </property>
-     </widget>
-     <widget class="QPushButton" name="reserveButton">
-      <property name="geometry">
-       <rect>
-        <x>224</x>
-        <y>0</y>
-        <width>112</width>
-        <height>131</height>
-       </rect>
-      </property>
-      <property name="styleSheet">
-       <string notr="true">QPushButton { background-image: url(:/images/manual_button/reserve.png); }
-QPushButton:pressed { background-image: url(:/images/manual_button/reserve_ov.png); }</string>
-      </property>
-     </widget>
-     <widget class="QWidget" name="sysLine_11" native="true">
-      <property name="geometry">
-       <rect>
-        <x>224</x>
-        <y>36</y>
-        <width>2</width>
-        <height>58</height>
-       </rect>
-      </property>
-      <property name="styleSheet">
-       <string notr="true">background-image: url(:/images/line/manual_button.png);</string>
-      </property>
-     </widget>
-     <widget class="QPushButton" name="cooldownButton">
-      <property name="geometry">
-       <rect>
-        <x>0</x>
-        <y>0</y>
-        <width>112</width>
-        <height>131</height>
-       </rect>
-      </property>
-      <property name="styleSheet">
-       <string notr="true">QPushButton { background-image: url(:/images/manual_button/cooldown.png); }
-QPushButton:pressed { background-image: url(:/images/manual_button/cooldown_ov.png); }</string>
-      </property>
-      <property name="checkable">
-       <bool>true</bool>
-      </property>
-     </widget>
-     <widget class="QPushButton" name="favoriteButton">
-      <property name="geometry">
-       <rect>
-        <x>336</x>
-        <y>0</y>
-        <width>112</width>
-        <height>131</height>
-       </rect>
-      </property>
-      <property name="styleSheet">
-       <string notr="true">QPushButton { background-image: url(:/images/manual_button/favorites.png); }
-QPushButton:pressed { background-image: url(:/images/manual_button/favorites_ov.png); }</string>
-      </property>
-     </widget>
-     <widget class="QWidget" name="sysLine_12" native="true">
-      <property name="geometry">
-       <rect>
-        <x>336</x>
-        <y>36</y>
-        <width>2</width>
-        <height>58</height>
-       </rect>
-      </property>
-      <property name="styleSheet">
-       <string notr="true">background-image: url(:/images/line/manual_button.png);</string>
-      </property>
-     </widget>
-     <widget class="QPushButton" name="fanButton">
-      <property name="geometry">
-       <rect>
-        <x>112</x>
-        <y>0</y>
-        <width>112</width>
-        <height>131</height>
-       </rect>
-      </property>
-      <property name="styleSheet">
-       <string notr="true">QPushButton { background-image: url(:/images/manual_button/fan_4.png); }</string>
-      </property>
-     </widget>
-    </widget>
-   </widget>
    <widget class="QLabel" name="steamLabel_4">
     <property name="enabled">
      <bool>true</bool>
@@ -946,7 +710,11 @@ QPushButton:pressed { background-image: url(:/images/manual_button/favorites_ov.
     </property>
     <property name="styleSheet">
      <string notr="true">QPushButton { image: url(:/images/slider_icon/humidity.png); }
-QPushButton:pressed { image: url(:/images/slider_icon/humidity_ov.png); }</string>
+QPushButton:checked { image: url(:/images/slider_icon/humidity_ov.png); }
+QPushButton:pressed, QPushButton:focus { border: 2px dotted white; border-radius: 70px; }</string>
+    </property>
+    <property name="checkable">
+     <bool>true</bool>
     </property>
     <property name="style" stdset="0">
      <string notr="true">icon</string>
@@ -963,7 +731,11 @@ QPushButton:pressed { image: url(:/images/slider_icon/humidity_ov.png); }</strin
     </property>
     <property name="styleSheet">
      <string notr="true">QPushButton { image: url(:/images/slider_icon/core_temp.png); }
-QPushButton:pressed { image: url(:/images/slider_icon/core_temp_ov.png); }</string>
+QPushButton:checked { image: url(:/images/slider_icon/core_temp_enabled.png); }
+QPushButton:pressed, QPushButton:focus { image: url(:/images/slider_icon/core_temp_ov.png); }</string>
+    </property>
+    <property name="checkable">
+     <bool>true</bool>
     </property>
     <property name="style" stdset="0">
      <string notr="true">icon</string>
@@ -980,7 +752,7 @@ QPushButton:pressed { image: url(:/images/slider_icon/core_temp_ov.png); }</stri
     </property>
     <property name="styleSheet">
      <string notr="true">QPushButton { image: url(:/images/slider_icon/time.png); }
-QPushButton:pressed { image: url(:/images/slider_icon/time_ov.png); }</string>
+QPushButton:pressed, QPushButton:focus { image: url(:/images/slider_icon/time_ov.png); }</string>
     </property>
     <property name="style" stdset="0">
      <string notr="true">icon</string>
@@ -1132,42 +904,288 @@ QPushButton:pressed { image: url(:/images/slider_icon/time_ov.png); }</string>
     <property name="geometry">
      <rect>
       <x>185</x>
-      <y>875</y>
+      <y>915</y>
       <width>666</width>
-      <height>140</height>
+      <height>60</height>
      </rect>
     </property>
+    <property name="focusPolicy">
+     <enum>Qt::ClickFocus</enum>
+    </property>
    </widget>
    <widget class="Slider" name="humiditySlider" native="true">
     <property name="geometry">
      <rect>
       <x>185</x>
-      <y>725</y>
+      <y>765</y>
       <width>666</width>
-      <height>140</height>
+      <height>60</height>
      </rect>
     </property>
+    <property name="focusPolicy">
+     <enum>Qt::ClickFocus</enum>
+    </property>
    </widget>
    <widget class="Slider" name="timeSlider" native="true">
     <property name="geometry">
      <rect>
       <x>185</x>
-      <y>1025</y>
+      <y>1065</y>
       <width>666</width>
-      <height>140</height>
+      <height>60</height>
      </rect>
     </property>
+    <property name="focusPolicy">
+     <enum>Qt::ClickFocus</enum>
+    </property>
    </widget>
    <widget class="Slider" name="interTempSlider" native="true">
     <property name="geometry">
      <rect>
       <x>185</x>
-      <y>1175</y>
+      <y>1215</y>
       <width>666</width>
-      <height>140</height>
+      <height>60</height>
+     </rect>
+    </property>
+    <property name="focusPolicy">
+     <enum>Qt::ClickFocus</enum>
+    </property>
+   </widget>
+   <widget class="QPushButton" name="cooldownButton">
+    <property name="geometry">
+     <rect>
+      <x>337</x>
+      <y>1319</y>
+      <width>112</width>
+      <height>131</height>
+     </rect>
+    </property>
+    <property name="styleSheet">
+     <string notr="true">QPushButton { background-image: url(:/images/manual_button/cooldown.png); }
+QPushButton:pressed, QPushButton:focus { background-image: url(:/images/manual_button/cooldown_ov.png); }</string>
+    </property>
+    <property name="checkable">
+     <bool>true</bool>
+    </property>
+    <property name="style" stdset="0">
+     <string>tool</string>
+    </property>
+   </widget>
+   <widget class="QPushButton" name="goFrontStackButton">
+    <property name="geometry">
+     <rect>
+      <x>785</x>
+      <y>1319</y>
+      <width>112</width>
+      <height>131</height>
+     </rect>
+    </property>
+    <property name="styleSheet">
+     <string notr="true">QPushButton { background-image: url(:/images/manual_button/next.png); }
+QPushButton:pressed, QPushButton:focus { background-image: url(:/images/manual_button/next_ov.png); }</string>
+    </property>
+    <property name="style" stdset="0">
+     <string>tool</string>
+    </property>
+   </widget>
+   <widget class="QPushButton" name="favoriteButton">
+    <property name="geometry">
+     <rect>
+      <x>673</x>
+      <y>1319</y>
+      <width>112</width>
+      <height>131</height>
+     </rect>
+    </property>
+    <property name="styleSheet">
+     <string notr="true">QPushButton { background-image: url(:/images/manual_button/favorites.png); }
+QPushButton:pressed, QPushButton:focus { background-image: url(:/images/manual_button/favorites_ov.png); }</string>
+    </property>
+    <property name="style" stdset="0">
+     <string>tool</string>
+    </property>
+   </widget>
+   <widget class="QPushButton" name="reserveButton">
+    <property name="geometry">
+     <rect>
+      <x>561</x>
+      <y>1319</y>
+      <width>112</width>
+      <height>131</height>
      </rect>
     </property>
+    <property name="styleSheet">
+     <string notr="true">QPushButton { background-image: url(:/images/manual_button/reserve.png); }
+QPushButton:pressed, QPushButton:focus { background-image: url(:/images/manual_button/reserve_ov.png); }</string>
+    </property>
+    <property name="style" stdset="0">
+     <string>tool</string>
+    </property>
+   </widget>
+   <widget class="QPushButton" name="fanButton">
+    <property name="geometry">
+     <rect>
+      <x>449</x>
+      <y>1319</y>
+      <width>112</width>
+      <height>131</height>
+     </rect>
+    </property>
+    <property name="styleSheet">
+     <string notr="true">QPushButton { background-image: url(:/images/manual_button/fan_4.png); }</string>
+    </property>
+    <property name="style" stdset="0">
+     <string>tool</string>
+    </property>
+   </widget>
+   <widget class="QWidget" name="sysLine_8" native="true">
+    <property name="geometry">
+     <rect>
+      <x>561</x>
+      <y>1355</y>
+      <width>2</width>
+      <height>58</height>
+     </rect>
+    </property>
+    <property name="styleSheet">
+     <string notr="true">background-image: url(:/images/line/manual_button.png);</string>
+    </property>
+   </widget>
+   <widget class="QWidget" name="sysLine_7" native="true">
+    <property name="geometry">
+     <rect>
+      <x>673</x>
+      <y>1355</y>
+      <width>2</width>
+      <height>58</height>
+     </rect>
+    </property>
+    <property name="styleSheet">
+     <string notr="true">background-image: url(:/images/line/manual_button.png);</string>
+    </property>
+   </widget>
+   <widget class="QPushButton" name="damperButton">
+    <property name="geometry">
+     <rect>
+      <x>449</x>
+      <y>1319</y>
+      <width>112</width>
+      <height>131</height>
+     </rect>
+    </property>
+    <property name="styleSheet">
+     <string notr="true">QPushButton { background-image: url(:/images/manual_button/damper_close.png); }
+QPushButton:checked, QPushButton:focus { background-image: url(:/images/manual_button/damper_open.png); }</string>
+    </property>
+    <property name="checkable">
+     <bool>true</bool>
+    </property>
+    <property name="style" stdset="0">
+     <string>tool</string>
+    </property>
+   </widget>
+   <widget class="QPushButton" name="repeatButton">
+    <property name="geometry">
+     <rect>
+      <x>673</x>
+      <y>1319</y>
+      <width>112</width>
+      <height>131</height>
+     </rect>
+    </property>
+    <property name="styleSheet">
+     <string notr="true">QPushButton { background-image: url(:/images/manual_button/repeat.png); }
+QPushButton:pressed { background-image: url(:/images/manual_button/repeat_ov.png); }</string>
+    </property>
+    <property name="style" stdset="0">
+     <string>tool</string>
+    </property>
+   </widget>
+   <widget class="QPushButton" name="preheatButton">
+    <property name="geometry">
+     <rect>
+      <x>337</x>
+      <y>1319</y>
+      <width>112</width>
+      <height>131</height>
+     </rect>
+    </property>
+    <property name="styleSheet">
+     <string notr="true">QPushButton { background-image: url(:/images/manual_button/preheat.png); }
+QPushButton:pressed, QPushButton:focus { background-image: url(:/images/manual_button/preheat_ov.png); }</string>
+    </property>
+    <property name="style" stdset="0">
+     <string>tool</string>
+    </property>
+   </widget>
+   <widget class="QPushButton" name="humidificationButton">
+    <property name="geometry">
+     <rect>
+      <x>561</x>
+      <y>1319</y>
+      <width>112</width>
+      <height>131</height>
+     </rect>
+    </property>
+    <property name="styleSheet">
+     <string notr="true">QPushButton, QPushButton:checked:pressed { background-image: url(:/images/manual_button/side_nozzle_close.png); }
+QPushButton:checked, QPushButton:focus, QPushButton:pressed { background-image: url(:/images/manual_button/side_nozzle_open.png); }</string>
+    </property>
+    <property name="checkable">
+     <bool>true</bool>
+    </property>
+    <property name="style" stdset="0">
+     <string>tool</string>
+    </property>
+   </widget>
+   <widget class="QWidget" name="sysLine_9" native="true">
+    <property name="geometry">
+     <rect>
+      <x>449</x>
+      <y>1355</y>
+      <width>2</width>
+      <height>58</height>
+     </rect>
+    </property>
+    <property name="styleSheet">
+     <string notr="true">background-image: url(:/images/line/manual_button.png);</string>
+    </property>
    </widget>
+   <zorder>goFrontStackButton</zorder>
+   <zorder>fanButton</zorder>
+   <zorder>reserveButton</zorder>
+   <zorder>favoriteButton</zorder>
+   <zorder>cooldownButton</zorder>
+   <zorder>preheatButton</zorder>
+   <zorder>damperButton</zorder>
+   <zorder>repeatButton</zorder>
+   <zorder>humidificationButton</zorder>
+   <zorder>upperStack</zorder>
+   <zorder>combiButton</zorder>
+   <zorder>steamButton</zorder>
+   <zorder>dryheatButton</zorder>
+   <zorder>bottomBar</zorder>
+   <zorder>steamLabel_3</zorder>
+   <zorder>steamLabel_2</zorder>
+   <zorder>timeLabel</zorder>
+   <zorder>tempButton</zorder>
+   <zorder>tempLabel</zorder>
+   <zorder>humidityLabel</zorder>
+   <zorder>steamLabel_4</zorder>
+   <zorder>humidityButton</zorder>
+   <zorder>interTempButton</zorder>
+   <zorder>timeButton</zorder>
+   <zorder>interTempLabel</zorder>
+   <zorder>steamLabel_5</zorder>
+   <zorder>runStopButton</zorder>
+   <zorder>tempSlider</zorder>
+   <zorder>humiditySlider</zorder>
+   <zorder>timeSlider</zorder>
+   <zorder>interTempSlider</zorder>
+   <zorder>sysLine_8</zorder>
+   <zorder>sysLine_7</zorder>
+   <zorder>sysLine_9</zorder>
   </widget>
  </widget>
  <customwidgets>
@@ -1194,6 +1212,30 @@ QPushButton:pressed { image: url(:/images/slider_icon/time_ov.png); }</string>
    <container>1</container>
   </customwidget>
  </customwidgets>
+ <tabstops>
+  <tabstop>steamButton</tabstop>
+  <tabstop>combiButton</tabstop>
+  <tabstop>dryheatButton</tabstop>
+  <tabstop>humidityButton</tabstop>
+  <tabstop>tempButton</tabstop>
+  <tabstop>timeButton</tabstop>
+  <tabstop>interTempButton</tabstop>
+  <tabstop>runStopButton</tabstop>
+  <tabstop>preheatButton</tabstop>
+  <tabstop>cooldownButton</tabstop>
+  <tabstop>damperButton</tabstop>
+  <tabstop>fanButton</tabstop>
+  <tabstop>humidificationButton</tabstop>
+  <tabstop>reserveButton</tabstop>
+  <tabstop>repeatButton</tabstop>
+  <tabstop>favoriteButton</tabstop>
+  <tabstop>goFrontStackButton</tabstop>
+  <tabstop>backButton</tabstop>
+  <tabstop>configButton</tabstop>
+  <tabstop>favoritesButton</tabstop>
+  <tabstop>washButton</tabstop>
+  <tabstop>helpButton</tabstop>
+ </tabstops>
  <resources>
   <include location="resources.qrc"/>
  </resources>
diff --git a/app/gui/oven_control/preheatpopup.cpp b/app/gui/oven_control/preheatpopup.cpp
index 0b84759..ded25aa 100644
--- a/app/gui/oven_control/preheatpopup.cpp
+++ b/app/gui/oven_control/preheatpopup.cpp
@@ -1,6 +1,8 @@
 #include "preheatpopup.h"
 #include "ui_preheatpopup.h"
 
+#include <QKeyEvent>
+
 #include "stringer.h"
 
 PreheatPopup::PreheatPopup(QWidget *parent, Oven *oven) :
@@ -28,9 +30,13 @@ PreheatPopup::PreheatPopup(QWidget *parent, Oven *oven) :
     ui->preheatGauge->setMinimum(oven->currentTemp());
     ui->preheatGauge->setValue(oven->currentTemp());
 
+    ui->infoButton->hide();
+
     updateView();
 
     start();
+
+    ui->background->setFocus();
 }
 
 PreheatPopup::~PreheatPopup()
@@ -38,6 +44,21 @@ PreheatPopup::~PreheatPopup()
     delete ui;
 }
 
+void PreheatPopup::keyReleaseEvent(QKeyEvent *event)
+{
+    switch (event->key())
+    {
+    case 0x01000030:    // Turn left
+        break;
+    case 0x01000031:    // Push
+        stop();
+        close();
+        break;
+    case 0x01000032:    // Turn right
+        break;
+    }
+}
+
 void PreheatPopup::updateView()
 {
     ui->timeLabel->setText(Stringer::remainingTime(oven->msecs(), Stringer::fontSize14));
diff --git a/app/gui/oven_control/preheatpopup.h b/app/gui/oven_control/preheatpopup.h
index 6ef43c8..0f66edc 100644
--- a/app/gui/oven_control/preheatpopup.h
+++ b/app/gui/oven_control/preheatpopup.h
@@ -18,6 +18,9 @@ public:
     explicit PreheatPopup(QWidget *parent = 0, Oven *oven = 0);
     ~PreheatPopup();
 
+protected:
+    void keyReleaseEvent(QKeyEvent *event);
+
 private slots:
     void updateView();
     void start();
diff --git a/app/gui/oven_control/preheatpopup.ui b/app/gui/oven_control/preheatpopup.ui
index 1c0997d..21d82b9 100644
--- a/app/gui/oven_control/preheatpopup.ui
+++ b/app/gui/oven_control/preheatpopup.ui
@@ -13,7 +13,10 @@
   <property name="styleSheet">
    <string notr="true">#closeButton { border: none; }
 #closeButton_2 { border: none; }
-#background { background-image: url(:/images/background/popup/696.png); }</string>
+#background { background-image: url(:/images/background/popup/696.png); }
+
+
+QWidget#background:focus { border: 4px solid gray; }</string>
   </property>
   <widget class="QPushButton" name="closeButton">
    <property name="geometry">
@@ -24,6 +27,9 @@
      <height>426</height>
     </rect>
    </property>
+   <property name="focusPolicy">
+    <enum>Qt::NoFocus</enum>
+   </property>
    <property name="text">
     <string/>
    </property>
@@ -37,6 +43,9 @@
      <height>696</height>
     </rect>
    </property>
+   <property name="focusPolicy">
+    <enum>Qt::TabFocus</enum>
+   </property>
    <widget class="QLabel" name="humidityLabel">
     <property name="geometry">
      <rect>
@@ -378,6 +387,9 @@
       <height>290</height>
      </rect>
     </property>
+    <property name="focusPolicy">
+     <enum>Qt::NoFocus</enum>
+    </property>
     <property name="styleSheet">
      <string notr="true">border: #000000</string>
     </property>
@@ -659,6 +671,9 @@ border-image: url(:/images/images/auto/btn_01_ov.png);
       <height>290</height>
      </rect>
     </property>
+    <property name="focusPolicy">
+     <enum>Qt::NoFocus</enum>
+    </property>
     <property name="styleSheet">
      <string notr="true">border: #000000</string>
     </property>
@@ -789,6 +804,9 @@ border-image: url(:/images/images/auto/btn_01_ov.png);
      <height>478</height>
     </rect>
    </property>
+   <property name="focusPolicy">
+    <enum>Qt::NoFocus</enum>
+   </property>
    <property name="text">
     <string/>
    </property>
@@ -814,6 +832,13 @@ border-image: url(:/images/images/auto/btn_01_ov.png);
    <container>1</container>
   </customwidget>
  </customwidgets>
+ <tabstops>
+  <tabstop>background</tabstop>
+  <tabstop>infoButton</tabstop>
+  <tabstop>humidityGaugeButton</tabstop>
+  <tabstop>selectCookButton_2</tabstop>
+  <tabstop>heatGaugeButton</tabstop>
+ </tabstops>
  <resources>
   <include location="resources.qrc"/>
  </resources>
diff --git a/app/gui/oven_control/slider.cpp b/app/gui/oven_control/slider.cpp
index 06d9875..befdcf3 100644
--- a/app/gui/oven_control/slider.cpp
+++ b/app/gui/oven_control/slider.cpp
@@ -8,6 +8,7 @@ Slider::Slider(QWidget *parent) : QWidget(parent),
     isSliderDown_(false),
     sliderPosition_(0), value_(0), minimum_(0), maximum_(1),
     subVisible_(true),
+    focused(false), isSliderMoved_(false),
     tickInterval(0), bigTickInterval(0)
 {
     groove.load(":/images/slider/groove.png");
@@ -95,16 +96,76 @@ int Slider::sliderPosition()
 
 void Slider::setSliderPosition(int value)
 {
+    value = qBound(minimum_, value, maximum_);
+
     if (sliderPosition_ == value)
         return;
 
     sliderPosition_ = value;
+    if (focused)
+        isSliderMoved_ = true;
 
     emit sliderMoved(value);
 
     update();
 }
 
+bool Slider::isSliderMoved()
+{
+    return isSliderMoved_;
+}
+
+void Slider::focusInEvent(QFocusEvent */*event*/)
+{
+    focused = true;
+}
+
+void Slider::focusOutEvent(QFocusEvent *event)
+{
+    QWidget::focusOutEvent(event);
+
+    focused = false;
+
+    if (isSliderMoved_)
+    {
+        isSliderMoved_ = false;
+        value_ = sliderPosition_;
+        emit valueChanged(value_);
+    }
+}
+
+void Slider::keyPressEvent(QKeyEvent *event)
+{
+    switch (event->key())
+    {
+    case 0x01000030:    // Turn left
+        decrease();
+        break;
+    case 0x01000031:    // Push
+        event->ignore();
+        break;
+    case 0x01000032:    // Turn right
+        increase();
+        break;
+    }
+}
+
+void Slider::keyReleaseEvent(QKeyEvent *event)
+{
+    switch (event->key())
+    {
+    case 0x01000030:    // Turn left
+        decrease();
+        break;
+    case 0x01000031:    // Push
+        event->ignore();
+        break;
+    case 0x01000032:    // Turn right
+        increase();
+        break;
+    }
+}
+
 void Slider::mouseMoveEvent(QMouseEvent *event)
 {
     if (!isSliderDown_)
@@ -124,12 +185,7 @@ void Slider::mouseReleaseEvent(QMouseEvent */*event*/)
 {
     isSliderDown_ = false;
 
-    if (sliderPosition_ == value_)
-        return;
-
     emit sliderReleased();
-
-    setValue(sliderPosition_);
 }
 
 void Slider::paintEvent(QPaintEvent */*event*/)
@@ -206,6 +262,7 @@ void Slider::updatePixmapPosition()
 
 void Slider::setValue(int value)
 {
+    value = qBound(minimum_, value, maximum_);
     if (value == value_)
         return;
 
@@ -215,3 +272,13 @@ void Slider::setValue(int value)
 
     emit valueChanged(value);
 }
+
+void Slider::increase()
+{
+    setSliderPosition(sliderPosition_ + 1);
+}
+
+void Slider::decrease()
+{
+    setSliderPosition(sliderPosition_ - 1);
+}
diff --git a/app/gui/oven_control/slider.h b/app/gui/oven_control/slider.h
index 2d61775..14c6a88 100644
--- a/app/gui/oven_control/slider.h
+++ b/app/gui/oven_control/slider.h
@@ -25,6 +25,8 @@ class Slider : public QWidget
     QPoint subPoint;
 
     bool subVisible_;
+    bool focused;
+    bool isSliderMoved_;
 
 public:
     explicit Slider(QWidget *parent = 0);
@@ -44,6 +46,7 @@ public:
     bool isSliderDown();
     int sliderPosition();
     void setSliderPosition(int value);
+    bool isSliderMoved();
 
     QList<int> ticks;
     QList<int> bigTicks;
@@ -52,6 +55,10 @@ public:
     int bigTickInterval;
 
 protected:
+    virtual void focusInEvent(QFocusEvent *event);
+    virtual void focusOutEvent(QFocusEvent *event);
+    virtual void keyPressEvent(QKeyEvent *event);
+    virtual void keyReleaseEvent(QKeyEvent *event);
     virtual void mouseMoveEvent(QMouseEvent *event);
     virtual void mousePressEvent(QMouseEvent *event);
     virtual void mouseReleaseEvent(QMouseEvent *event);
@@ -71,7 +78,8 @@ signals:
 
 public slots:
     void setValue(int value);
-
+    void increase();
+    void decrease();
 };
 
 #endif // SLIDER_H
diff --git a/app/gui/oven_control/washwindow.cpp b/app/gui/oven_control/washwindow.cpp
index 0553bfe..8505a5a 100644
--- a/app/gui/oven_control/washwindow.cpp
+++ b/app/gui/oven_control/washwindow.cpp
@@ -2,6 +2,7 @@
 #include "ui_washwindow.h"
 
 #include <QSignalMapper>
+#include <QKeyEvent>
 
 #include "soundplayer.h"
 #include "dirtylevel.h"
@@ -53,6 +54,8 @@ WashWindow::WashWindow(QWidget *parent) :
         connect(button, &QPushButton::pressed, SoundPlayer::playClick);
 
     updateGauge();
+
+    setFocus();
 }
 
 WashWindow::~WashWindow()
@@ -60,6 +63,41 @@ WashWindow::~WashWindow()
     delete ui;
 }
 
+void WashWindow::keyPressEvent(QKeyEvent *event)
+{
+    switch (event->key())
+    {
+    case 0x01000030:    // Turn left
+        onEncoderLeft();
+        break;
+    case 0x01000031:    // Push
+        pushed = focusWidget();
+        break;
+    case 0x01000032:    // Turn right
+        onEncoderRight();
+        break;
+    }
+}
+
+void WashWindow::keyReleaseEvent(QKeyEvent *event)
+{
+    switch (event->key())
+    {
+    case 0x01000030:    // Turn left
+        onEncoderLeft();
+        break;
+    case 0x01000031:    // Push
+        if (focusWidget() == pushed)
+            onEncoderClicked(pushed);
+
+        pushed = NULL;
+        break;
+    case 0x01000032:    // Turn right
+        onEncoderRight();
+        break;
+    }
+}
+
 void WashWindow::start(int type)
 {
     if (selected)
@@ -273,3 +311,20 @@ void WashWindow::on_helpButton_clicked()
 {
 
 }
+
+void WashWindow::onEncoderLeft()
+{
+    focusPreviousChild();
+}
+
+void WashWindow::onEncoderRight()
+{
+    focusNextChild();
+}
+
+void WashWindow::onEncoderClicked(QWidget *clicked)
+{
+    QPushButton *b = qobject_cast<QPushButton *>(clicked);
+    if (b)
+        b->click();
+}
diff --git a/app/gui/oven_control/washwindow.h b/app/gui/oven_control/washwindow.h
index 5913929..d9154ad 100644
--- a/app/gui/oven_control/washwindow.h
+++ b/app/gui/oven_control/washwindow.h
@@ -18,16 +18,20 @@ public:
     explicit WashWindow(QWidget *parent = 0);
     ~WashWindow();
 
+protected:
+    void keyPressEvent(QKeyEvent *event);
+    void keyReleaseEvent(QKeyEvent *event);
+
 private slots:
     void start(int type);
     void stop();
     void returnToClock();
     void updateGauge();
+
     void onChanged();
-    void on_backButton_clicked();
 
+    void on_backButton_clicked();
     void on_configButton_clicked();
-
     void on_helpButton_clicked();
 
 private:
@@ -42,6 +46,12 @@ private:
     int type;
 
     QTimer returnToClockTimer;
+
+    QWidget *pushed = NULL;
+
+    void onEncoderLeft();
+    void onEncoderRight();
+    void onEncoderClicked(QWidget *clicked);
 };
 
 #endif // WASHWINDOW_H
diff --git a/app/gui/oven_control/washwindow.ui b/app/gui/oven_control/washwindow.ui
index e7fc06f..3a66aab 100644
--- a/app/gui/oven_control/washwindow.ui
+++ b/app/gui/oven_control/washwindow.ui
@@ -482,7 +482,7 @@ border: none;
      </property>
      <property name="styleSheet">
       <string notr="true">QPushButton { border-image: url(:/images/bottom_bar/back.png); }
-QPushButton:pressed { border-image: url(:/images/bottom_bar/back_ov.png); }</string>
+QPushButton:pressed, QPushButton:focus { border-image: url(:/images/bottom_bar/back_ov.png); }</string>
      </property>
      <property name="text">
       <string/>
@@ -505,7 +505,7 @@ QPushButton:pressed { border-image: url(:/images/bottom_bar/back_ov.png); }</str
      </property>
      <property name="styleSheet">
       <string notr="true">QPushButton { border-image: url(:/images/bottom_bar/config.png); }
-QPushButton:pressed { border-image: url(:/images/bottom_bar/config_ov.png); }</string>
+QPushButton:pressed, QPushButton:focus { border-image: url(:/images/bottom_bar/config_ov.png); }</string>
      </property>
      <property name="text">
       <string/>
@@ -528,7 +528,7 @@ QPushButton:pressed { border-image: url(:/images/bottom_bar/config_ov.png); }</s
      </property>
      <property name="styleSheet">
       <string notr="true">QPushButton { border-image: url(:/images/bottom_bar/help.png); }
-QPushButton:pressed { border-image: url(:/images/bottom_bar/help_ov.png); }</string>
+QPushButton:pressed, QPushButton:focus { border-image: url(:/images/bottom_bar/help_ov.png); }</string>
      </property>
      <property name="text">
       <string/>
@@ -545,11 +545,11 @@ QPushButton:pressed { border-image: url(:/images/bottom_bar/help_ov.png); }</str
      </rect>
     </property>
     <property name="focusPolicy">
-     <enum>Qt::NoFocus</enum>
+     <enum>Qt::StrongFocus</enum>
     </property>
     <property name="styleSheet">
      <string notr="true">QPushButton { background-image: url(:/images/wash/button_1.png); }
-QPushButton::pressed { background-image: url(:/images/wash/button_1_ov.png); }</string>
+QPushButton::pressed, QPushButton:focus { background-image: url(:/images/wash/button_1_ov.png); }</string>
     </property>
     <property name="text">
      <string>세제 없이 헹굼</string>
@@ -568,11 +568,11 @@ QPushButton::pressed { background-image: url(:/images/wash/button_1_ov.png); }</
      </rect>
     </property>
     <property name="focusPolicy">
-     <enum>Qt::NoFocus</enum>
+     <enum>Qt::StrongFocus</enum>
     </property>
     <property name="styleSheet">
      <string notr="true">QPushButton { background-image: url(:/images/wash/button_2.png); }
-QPushButton::pressed { background-image: url(:/images/wash/button_2_ov.png); }</string>
+QPushButton::pressed, QPushButton:focus { background-image: url(:/images/wash/button_2_ov.png); }</string>
     </property>
     <property name="text">
      <string>간이 세척</string>
@@ -591,11 +591,11 @@ QPushButton::pressed { background-image: url(:/images/wash/button_2_ov.png); }</
      </rect>
     </property>
     <property name="focusPolicy">
-     <enum>Qt::NoFocus</enum>
+     <enum>Qt::StrongFocus</enum>
     </property>
     <property name="styleSheet">
      <string notr="true">QPushButton { background-image: url(:/images/wash/button_3.png); }
-QPushButton::pressed { background-image: url(:/images/wash/button_3_ov.png); }</string>
+QPushButton::pressed, QPushButton:focus { background-image: url(:/images/wash/button_3_ov.png); }</string>
     </property>
     <property name="text">
      <string>표준 세척</string>
@@ -614,11 +614,11 @@ QPushButton::pressed { background-image: url(:/images/wash/button_3_ov.png); }</
      </rect>
     </property>
     <property name="focusPolicy">
-     <enum>Qt::NoFocus</enum>
+     <enum>Qt::StrongFocus</enum>
     </property>
     <property name="styleSheet">
      <string notr="true">QPushButton { background-image: url(:/images/wash/button_4.png); }
-QPushButton::pressed { background-image: url(:/images/wash/button_4_ov.png); }</string>
+QPushButton::pressed, QPushButton:focus { background-image: url(:/images/wash/button_4_ov.png); }</string>
     </property>
     <property name="text">
      <string>강 세척</string>
@@ -637,11 +637,11 @@ QPushButton::pressed { background-image: url(:/images/wash/button_4_ov.png); }</
      </rect>
     </property>
     <property name="focusPolicy">
-     <enum>Qt::NoFocus</enum>
+     <enum>Qt::StrongFocus</enum>
     </property>
     <property name="styleSheet">
      <string notr="true">QPushButton { background-image: url(:/images/wash/button_5.png); }
-QPushButton::pressed { background-image: url(:/images/wash/button_5_ov.png); }</string>
+QPushButton::pressed, QPushButton:focus { background-image: url(:/images/wash/button_5_ov.png); }</string>
     </property>
     <property name="text">
      <string>고속 세척</string>
@@ -721,6 +721,9 @@ QPushButton::pressed { background-image: url(:/images/wash/button_5_ov.png); }</
       <height>140</height>
      </rect>
     </property>
+    <property name="focusPolicy">
+     <enum>Qt::NoFocus</enum>
+    </property>
     <property name="styleSheet">
      <string notr="true">QPushButton { image: url(:/images/slider_icon/management.png); }
 QPushButton:pressed { image: url(:/images/slider_icon/management_ov.png); }</string>
@@ -870,6 +873,9 @@ QPushButton:pressed { image: url(:/images/slider_icon/management_ov.png); }</str
       <height>33</height>
      </rect>
     </property>
+    <property name="focusPolicy">
+     <enum>Qt::NoFocus</enum>
+    </property>
     <property name="maximum">
      <number>5</number>
     </property>
@@ -960,6 +966,9 @@ QPushButton:pressed { image: url(:/images/slider_icon/management_ov.png); }</str
       <height>140</height>
      </rect>
     </property>
+    <property name="focusPolicy">
+     <enum>Qt::NoFocus</enum>
+    </property>
     <property name="styleSheet">
      <string notr="true">QPushButton { image: url(:/images/slider_icon/clean.png); }
 QPushButton:pressed { image: url(:/images/slider_icon/clean_ov.png); }</string>
@@ -1109,6 +1118,9 @@ QPushButton:pressed { image: url(:/images/slider_icon/clean_ov.png); }</string>
       <height>33</height>
      </rect>
     </property>
+    <property name="focusPolicy">
+     <enum>Qt::NoFocus</enum>
+    </property>
     <property name="maximum">
      <number>5</number>
     </property>
@@ -1180,6 +1192,16 @@ QPushButton:pressed { image: url(:/images/slider_icon/clean_ov.png); }</string>
    <container>1</container>
   </customwidget>
  </customwidgets>
+ <tabstops>
+  <tabstop>washButton_1</tabstop>
+  <tabstop>washButton_2</tabstop>
+  <tabstop>washButton_3</tabstop>
+  <tabstop>washButton_4</tabstop>
+  <tabstop>washButton_5</tabstop>
+  <tabstop>backButton</tabstop>
+  <tabstop>configButton</tabstop>
+  <tabstop>helpButton</tabstop>
+ </tabstops>
  <resources>
   <include location="resources.qrc"/>
  </resources>