diff --git a/components/badge23/display.c b/components/badge23/display.c
index afaffd34acc23612c56551581d84250c5974e0f3..8210c72d9d263cb3fce3acfc7dd80d22ab2f6e16 100644
--- a/components/badge23/display.c
+++ b/components/badge23/display.c
@@ -17,6 +17,8 @@
 
 Ctx *the_ctx = NULL;
 
+uint8_t scope_active = 0;
+
 uint16_t *pixels;
 
 typedef struct leds_cfg {
@@ -24,28 +26,13 @@ typedef struct leds_cfg {
 } display_cfg_t;
 
 static QueueHandle_t display_queue = NULL;
-static void display_task(TimerHandle_t aaaaa);
-//static void display_task(void* arg);
+static void display_task(TimerHandle_t dummy);
+static TimerHandle_t display_animation_timer;
 
 static void _display_init() {
     GC9A01_Init();
-    //    GC9A01_Screen_Load(0,0,240,240,pixels);
     GC9A01_Update();
-    
-	
-	
-    /*
-    display_queue = xQueueCreate(1, sizeof(display_cfg_t));
-    TaskHandle_t handle;
-    xTaskCreate(&display_task, "Display", 4096, NULL, configMAX_PRIORITIES - 3, &handle);
-    */
-    
-    /* SCOPE TASK
-    TimerHandle_t aa = xTimerCreate("Display", pdMS_TO_TICKS(100), pdTRUE, (void *) 0, *display_task);
-    if( xTimerStart(aa, 0 ) != pdPASS )
-    {
-    }
-    */
+    display_animation_timer = xTimerCreate("display animation timer", pdMS_TO_TICKS(100), pdTRUE, (void *) 0, *display_task);
 }
 
 
@@ -63,6 +50,7 @@ void display_ctx_init() {
 }
 
 void display_update(){
+    if(scope_active) return;
     GC9A01_Update();
 }
 
@@ -79,29 +67,18 @@ void display_fill(uint16_t col){
 }
 
 void display_draw_scope(){
-    //display_cfg_t  display_;
     uint16_t line[240];
-    /*
-    printf("waiting...\n");
-    xQueueReceive(display_queue, &display_, portMAX_DELAY);
-    printf("go...\n");
-    */
-    //uint32_t t0 = esp_log_timestamp();
     begin_scope_read();
-
     for(int y=0; y<240; y++){
         read_line_from_scope(&(line[0]), y);
         memcpy(&ScreenBuff[y * 240], line, sizeof(line));
     }
     end_scope_read();
-
-    //uint32_t td = esp_log_timestamp() - t0;
-    // printf("it took %lu\n", td);
-    display_update();
-
+    GC9A01_Update();
 }
+
 //static void display_task(void* arg) {
-static void display_task(TimerHandle_t aaaaa) {
+static void display_task(TimerHandle_t dummy) {
     display_draw_scope();
 }
 
@@ -110,3 +87,20 @@ void display_init() {
 	display_ctx_init();
 }
 
+void display_scope_start(){
+    scope_active = 1;
+    vTaskDelay(pdMS_TO_TICKS(100)); //hack: wait until last display update has stopped
+    if(xTimerStart(display_animation_timer, pdMS_TO_TICKS(100)) != pdPASS)
+    {   // timer startup has failed
+        scope_active = 0;
+    }
+}
+
+void display_scope_stop(){
+    if(!scope_active) return; //nothing to do
+    if(xTimerStop(display_animation_timer, pdMS_TO_TICKS(1000)) != pdPASS)
+    {
+        // not sure how to handle this, any ideas? just repeat query? throw error?
+    }
+    scope_active = 0;
+}
diff --git a/components/badge23/include/badge23/display.h b/components/badge23/include/badge23/display.h
index e2946a47c711e84e73982053045ea07ed903aae2..1ef35ae73659daacf37a54acd900f4be15f92dad 100644
--- a/components/badge23/include/badge23/display.h
+++ b/components/badge23/include/badge23/display.h
@@ -8,6 +8,8 @@ void display_init();
 void display_ctx_init();
 void display_draw_scope();
 void display_update();
+void display_scope_start();
+void display_scope_stop();
 void display_draw_pixel(uint8_t x, uint8_t y, uint16_t col);
 uint16_t display_get_pixel(uint8_t x, uint8_t y);
 void display_fill(uint16_t col);
diff --git a/python_payload/main.py b/python_payload/main.py
index d678944c295b4d56a4bf2e61f4acf0c2244b6073..404492656e9b03333257df858a8bdb13b90be37a 100644
--- a/python_payload/main.py
+++ b/python_payload/main.py
@@ -94,6 +94,7 @@ def main():
             if(get_button(0) == 2):
                 if CURRENT_APP_RUN != run_menu:
                     CURRENT_APP_RUN = run_menu
+                    display_scope_stop()
                     foreground_menu()
             else:
                 if(get_button(0) == 1):
diff --git a/python_payload/melodic_demo.py b/python_payload/melodic_demo.py
index 8ffee2979dd158cbfcf233259d63686ca92316bb..9fc2a7c3b3bc0e54adab40547554ee2e93ced98b 100644
--- a/python_payload/melodic_demo.py
+++ b/python_payload/melodic_demo.py
@@ -65,3 +65,4 @@ def init():
 
 def foreground():
     adjust_playing_field_to_octave()
+    display_scope_start()
diff --git a/usermodule/mp_hardware.c b/usermodule/mp_hardware.c
index 110f08223900403a248077bdacba15a8c9c97785..0af6255cf09e5aa5791c3df5880d25308d251ccd 100644
--- a/usermodule/mp_hardware.c
+++ b/usermodule/mp_hardware.c
@@ -33,6 +33,18 @@ STATIC mp_obj_t mp_display_update(size_t n_args, const mp_obj_t *args) {
 }
 STATIC MP_DEFINE_CONST_FUN_OBJ_VAR_BETWEEN(mp_display_update_obj, 0, 1, mp_display_update);
 
+STATIC mp_obj_t mp_display_scope_start(size_t n_args, const mp_obj_t *args) {
+    display_scope_start();
+    return mp_const_none;
+}
+STATIC MP_DEFINE_CONST_FUN_OBJ_VAR_BETWEEN(mp_display_scope_start_obj, 0, 1, mp_display_scope_start);
+
+STATIC mp_obj_t mp_display_scope_stop(size_t n_args, const mp_obj_t *args) {
+    display_scope_stop();
+    return mp_const_none;
+}
+STATIC MP_DEFINE_CONST_FUN_OBJ_VAR_BETWEEN(mp_display_scope_stop_obj, 0, 1, mp_display_scope_stop);
+
 STATIC mp_obj_t mp_display_draw_pixel(size_t n_args, const mp_obj_t *args) {
     uint16_t x = mp_obj_get_int(args[0]);
     uint16_t y = mp_obj_get_int(args[1]);
@@ -161,6 +173,8 @@ STATIC const mp_rom_map_elem_t mp_module_hardware_globals_table[] = {
     { MP_ROM_QSTR(MP_QSTR_set_led_hsv), MP_ROM_PTR(&mp_set_led_hsv_obj) },
     { MP_ROM_QSTR(MP_QSTR_update_leds), MP_ROM_PTR(&mp_update_leds_obj) },
     { MP_ROM_QSTR(MP_QSTR_display_update), MP_ROM_PTR(&mp_display_update_obj) },
+    { MP_ROM_QSTR(MP_QSTR_display_scope_start), MP_ROM_PTR(&mp_display_scope_start_obj) },
+    { MP_ROM_QSTR(MP_QSTR_display_scope_stop), MP_ROM_PTR(&mp_display_scope_stop_obj) },
     { MP_ROM_QSTR(MP_QSTR_display_draw_pixel), MP_ROM_PTR(&mp_display_draw_pixel_obj) },
     { MP_ROM_QSTR(MP_QSTR_display_get_pixel), MP_ROM_PTR(&mp_display_get_pixel_obj) },
     { MP_ROM_QSTR(MP_QSTR_display_fill), MP_ROM_PTR(&mp_display_fill_obj) },