diff --git a/src/displayapp/screens/StopWatch.cpp b/src/displayapp/screens/StopWatch.cpp
index 2ccafb16..1a6ff598 100644
--- a/src/displayapp/screens/StopWatch.cpp
+++ b/src/displayapp/screens/StopWatch.cpp
@@ -1,6 +1,7 @@
 #include "StopWatch.h"
 
 #include "Screen.h"
+#include "Symbols.h"
 #include "lvgl/lvgl.h"
 #include "projdefs.h"
 #include "FreeRTOSConfig.h"
@@ -8,6 +9,8 @@
 
 #include <tuple>
 
+using namespace Pinetime::Applications::Screens;
+
 // Anonymous namespace for local functions
 namespace {
   std::tuple<int, int, int> convertTicksToTimeSegments(const TickType_t timeElapsed) {
@@ -31,19 +34,30 @@ namespace {
     return delta;
   }
 }
-using namespace Pinetime::Applications::Screens;
+
+static void play_pause_event_handler(lv_obj_t* obj, lv_event_t event) {
+  StopWatch* stopWatch = static_cast<StopWatch*>(obj->user_data);
+  stopWatch->playPauseBtnEventHandler(event);
+}
 
 StopWatch::StopWatch(DisplayApp* app, const Pinetime::Controllers::DateTime& dateTime)
-  : Screen(app), dateTime {dateTime}, running {true}, currentState {States::INIT}, currentEvent {Events::PLAY}, startTime {},
-    timeElapsed {} {
+  : Screen(app), dateTime {dateTime}, running {true}, currentState {States::INIT}, currentEvent {Events::STOP}, startTime {},
+    oldTimeElapsed {} {
 
   time = lv_label_create(lv_scr_act(), nullptr);
   lv_obj_set_style_local_text_font(time, LV_LABEL_PART_MAIN, LV_STATE_DEFAULT, &jetbrains_mono_extrabold_compressed);
-  lv_obj_align(time, lv_scr_act(), LV_ALIGN_IN_LEFT_MID, 0, 0);
+  lv_obj_align(time, lv_scr_act(), LV_ALIGN_IN_LEFT_MID, 0, -50);
 
   msecTime = lv_label_create(lv_scr_act(), nullptr);
   lv_obj_set_style_local_text_font(msecTime, LV_LABEL_PART_MAIN, LV_STATE_DEFAULT, &jetbrains_mono_bold_20);
-  lv_obj_align(msecTime, lv_scr_act(), LV_ALIGN_IN_LEFT_MID, 115, 60);
+  lv_obj_align(msecTime, lv_scr_act(), LV_ALIGN_IN_LEFT_MID, 113, 0);
+
+  btnPlayPause = lv_btn_create(lv_scr_act(), nullptr);
+  btnPlayPause->user_data = this;
+  lv_obj_set_event_cb(btnPlayPause, play_pause_event_handler);
+  lv_obj_align(btnPlayPause, lv_scr_act(), LV_ALIGN_IN_BOTTOM_MID, 0, 0);
+  txtPlayPause = lv_label_create(btnPlayPause, nullptr);
+  lv_label_set_text(txtPlayPause, Symbols::play);
 }
 
 StopWatch::~StopWatch() {
@@ -66,14 +80,30 @@ bool StopWatch::Refresh() {
       break;
     }
     case States::RUNNING: {
-      auto timeElapsed = calculateDelta(startTime, xTaskGetTickCount());
-      auto timeSeparated = convertTicksToTimeSegments(timeElapsed);
+      lv_label_set_text(txtPlayPause, Symbols::pause);
+
+      const auto timeElapsed = calculateDelta(startTime, xTaskGetTickCount());
+      const auto timeSeparated = convertTicksToTimeSegments((oldTimeElapsed + timeElapsed));
+
       lv_label_set_text_fmt(time, "%02d:%02d", std::get<0>(timeSeparated), std::get<1>(timeSeparated));
       lv_label_set_text_fmt(msecTime, "%02d", std::get<2>(timeSeparated));
+
+      if (currentEvent == Events::PAUSE) {
+        // Reset the start time
+        startTime = 0;
+        // Store the current time elapsed in cache
+        oldTimeElapsed += timeElapsed;
+        currentState = States::HALTED;
+      }
       break;
     }
     case States::HALTED: {
+      lv_label_set_text(txtPlayPause, Symbols::play);
 
+      if (currentEvent == Events::PLAY) {
+        startTime = xTaskGetTickCount();
+        currentState = States::RUNNING;
+      }
       break;
     }
   }
@@ -86,5 +116,19 @@ bool StopWatch::OnButtonPushed() {
 }
 
 bool StopWatch::OnTouchEvent(uint16_t x, uint16_t y) {
+  if (y < 60) {
+    playPauseBtnEventHandler(LV_EVENT_CLICKED);
+  }
   return true;
+}
+
+void StopWatch::playPauseBtnEventHandler(lv_event_t event) {
+  if (event == LV_EVENT_CLICKED) {
+    if (currentState == States::INIT) {
+      currentEvent = Events::PLAY;
+    } else {
+      // Simple Toggle for play/pause
+      currentEvent = (currentEvent == Events::PLAY ? Events::PAUSE : Events::PLAY);
+    }
+  }
 }
\ No newline at end of file
diff --git a/src/displayapp/screens/StopWatch.h b/src/displayapp/screens/StopWatch.h
index 4763fd1e..9e5779a1 100644
--- a/src/displayapp/screens/StopWatch.h
+++ b/src/displayapp/screens/StopWatch.h
@@ -20,6 +20,8 @@ namespace Pinetime::Applications::Screens {
     bool Refresh() override;
     bool OnButtonPushed() override;
     bool OnTouchEvent(uint16_t x, uint16_t y) override;
+    void playPauseBtnEventHandler(lv_event_t event);
+
 
   private:
     const Pinetime::Controllers::DateTime& dateTime;
@@ -27,7 +29,7 @@ namespace Pinetime::Applications::Screens {
     States currentState;
     Events currentEvent;
     TickType_t startTime;
-    TickType_t timeElapsed;
-    lv_obj_t *time, *msecTime;
+    TickType_t oldTimeElapsed;
+    lv_obj_t *time, *msecTime, *btnPlayPause, *btnStop, *txtPlayPause, *txtStop;
   };
 }
\ No newline at end of file