diff --git a/preload/apps/ble/__init__.py b/preload/apps/ble/__init__.py
index 6233a5d1c15a6be55cb3db0ce5d5f82f6c5bf381..983d32e50168708e864f5109d187bd7b6988f1d7 100644
--- a/preload/apps/ble/__init__.py
+++ b/preload/apps/ble/__init__.py
@@ -9,29 +9,21 @@ CONFIG_NAME = "ble.txt"
 MAC_NAME = "mac.txt"
 ACTIVE_STRING = "active=true"
 INACTIVE_STRING = "active=false"
+event = None
 
-def numeric_comparison_callback(_):
-    compare_value = sys_ble.get_compare_value()
-    disp.clear()
-    disp.print("confirm:", posy=0, fg=[0, 255, 255])
-    disp.print("%d" % compare_value, posy=20, fg=[255, 0, 0])
-    disp.update()
-    while True:
-        v = buttons.read()
-        if v & buttons.TOP_RIGHT:
-            sys_ble.confirm_compare_value()
-            break
-        elif v != 0:
-            break
-        utime.sleep(0.1)
+
+def ble_callback(_):
+    global event
+    event = sys_ble.get_event()
 
 
 def init():
     if CONFIG_NAME not in os.listdir("."):
         with open(CONFIG_NAME, "w") as f:
             f.write(INACTIVE_STRING)
-    interrupt.set_callback(10, numeric_comparison_callback)
+    interrupt.set_callback(10, ble_callback)
     interrupt.enable_callback(10)
+    sys_ble.set_bondable(True)
 
 
 def load_mac():
@@ -86,21 +78,74 @@ def selector():
     disp.print("toggle", posx=25, posy=40, fg=[255, 255, 255])
 
 
-disp = display.open()
-button_pressed = True
 init()
+disp = display.open()
+state = 1
+v_old = buttons.read()
 
 while True:
-    disp.clear()
-    headline()
-    v = buttons.read(buttons.TOP_RIGHT)
-    if v == 0:
-        button_pressed = False
-
-    if not button_pressed and v & buttons.TOP_RIGHT != 0:
-        button_pressed = True
-        toggle()
+    v_new = buttons.read()
+    v = ~v_old & v_new
+    v_old = v_new
+
+    if state == 1:
+        # print config screen
+        disp.clear()
+        headline()
+        selector()
+        disp.update()
+        state = 2
+    elif state == 2:
+        # wait for button press or event
+        if event == 1:
+            event = 0
+            state = 3
+        if v & buttons.TOP_RIGHT:
+            toggle()
+            state = 1
+
+    elif state == 3:
+        # print confirmation value
+        compare_value = sys_ble.get_compare_value()
+        disp.clear()
+        disp.print("confirm:", posy=0, fg=[0, 255, 255])
+        disp.print("%06d" % compare_value, posy=20, fg=[255, 0, 0])
+        disp.update()
+        state = 4
+    elif state == 4:
+        # wait for button press or event
+        if event == 2:
+            event = 0
+            state = 6
+        if v & buttons.BOTTOM_RIGHT:
+            sys_ble.confirm_compare_value(True)
+            disp.clear()
+            disp.print("Wait", posy=0, fg=[0, 255, 255])
+            disp.update()
+            state = 5
+        elif v & buttons.BOTTOM_LEFT:
+            sys_ble.confirm_compare_value(False)
+            state = 1
+
+    elif state == 5:
+        # Wait for pairing to complete
+        if event == 2:
+            event = 0
+            state = 6
+        elif event == 3:
+            event = 0
+            disp.clear()
+            disp.print("OK", posy=0, fg=[0, 255, 255])
+            disp.update()
+            time.sleep(5)
+            state = 1
+
+    elif state == 6:
+        # display fail screen and wait 5 seconds
+        disp.clear()
+        disp.print("Fail", posy=0, fg=[0, 255, 255])
+        disp.update()
+        time.sleep(5)
+        state = 1
 
-    selector()
-    disp.update()
     time.sleep(0.1)