diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt
index e4a354d..8cffb22 100644
--- a/src/CMakeLists.txt
+++ b/src/CMakeLists.txt
@@ -448,6 +448,7 @@ list(APPEND SOURCE_FILES
         components/ble/BleController.cpp
         components/ble/NotificationManager.cpp
         components/datetime/DateTimeController.cpp
+        components/statistici/Statistici.cpp
         components/brightness/BrightnessController.cpp
         components/motion/MotionController.cpp
         components/ble/NimbleController.cpp
@@ -519,6 +520,7 @@ list(APPEND RECOVERY_SOURCE_FILES
         components/ble/BleController.cpp
         components/ble/NotificationManager.cpp
         components/datetime/DateTimeController.cpp
+        components/statistici/Statistici.cpp
         components/brightness/BrightnessController.cpp
         components/motion/MotionController.cpp
         components/ble/NimbleController.cpp
diff --git a/src/components/statistici/Statistici.cpp b/src/components/statistici/Statistici.cpp
new file mode 100644
index 0000000..0201eff
--- /dev/null
+++ b/src/components/statistici/Statistici.cpp
@@ -0,0 +1,86 @@
+#include "Statistici.h"
+
+using namespace Pinetime::Components;
+
+void Statistici::Start() {
+  // Coada este mica: pastram doar cateva rapoarte in asteptare.
+  coada = xQueueCreate(4, sizeof(Raport));
+  if (coada == nullptr) {
+    return;                  // nu a fost memorie nici pentru coada
+  }
+
+  // Stiva de 512 de cuvinte = 2 KB. Procesul nu foloseste LVGL si nu
+  // are tampoane mari, deci atat ii ajunge. Verificati cu
+  // uxTaskGetStackHighWaterMark inainte de a considera valoarea finala.
+  if (xTaskCreate(Proces, "statistici", 512, this,
+                  tskIDLE_PRIORITY + 1, &descriptor) != pdPASS) {
+    descriptor = nullptr;    // nu a fost memorie pentru stiva
+  }
+}
+
+void Statistici::Proces(void* param) {
+  static_cast<Statistici*>(param)->Bucla();
+}
+
+void Statistici::Bucla() {
+  Raport r;
+  for (;;) {
+    // Procesul DOARME aici pana soseste un raport. Cat asteapta nu consuma
+    // nimic, iar procesul inactiv poate opri ceasul procesorului.
+    if (xQueueReceive(coada, &r, portMAX_DELAY) != pdTRUE) {
+      continue;
+    }
+
+    // Primul raport dupa pornire da doar punctul de plecare: pasii facuti
+    // inainte de repornirea ceasului nu stim in ce ora au fost facuti.
+    if (!amReferinta) {
+      ultimulPrimit = r.pasi;
+      amReferinta = true;
+      continue;
+    }
+
+    // Senzorul da totalul zilei; diferenta fata de totalul precedent
+    // este numarul de pasi facuti intre timp.
+    uint32_t noi;
+    if (r.pasi >= ultimulPrimit) {
+      noi = r.pasi - ultimulPrimit;
+    } else {
+      // Totalul a scazut: a trecut miezul noptii si numaratorul a luat-o
+      // de la zero. Incepem o zi noua de statistici.
+      noi = r.pasi;
+      taskENTER_CRITICAL();
+      pe_ora.fill(0);
+      taskEXIT_CRITICAL();
+    }
+    ultimulPrimit = r.pasi;
+
+    if (r.ora < pe_ora.size()) {
+      taskENTER_CRITICAL();              // afisarea poate citi tabelul oricand
+      pe_ora[r.ora] += noi;
+      taskEXIT_CRITICAL();
+    }
+  }
+}
+
+void Statistici::RaporteazaPasi(uint32_t pasi) {
+  // Trimitem doar cand s-a schimbat ceva - altfel am umple coada degeaba.
+  if (coada == nullptr || pasi == ultimulTrimis) {
+    return;
+  }
+  Raport r {dateTime.Hours(), pasi};
+  // Fara asteptare: daca coada e plina, raportul se pierde. Nu pierdem insa
+  // pasi - urmatorul raport contine din nou totalul zilei.
+  if (xQueueSend(coada, &r, 0) == pdTRUE) {
+    ultimulTrimis = pasi;
+  }
+}
+
+uint32_t Statistici::PasiInOra(uint8_t ora) {
+  if (ora >= pe_ora.size()) {
+    return 0;
+  }
+  taskENTER_CRITICAL();
+  uint32_t valoare = pe_ora[ora];
+  taskEXIT_CRITICAL();
+  return valoare;
+}
diff --git a/src/components/statistici/Statistici.h b/src/components/statistici/Statistici.h
new file mode 100644
index 0000000..2e88e79
--- /dev/null
+++ b/src/components/statistici/Statistici.h
@@ -0,0 +1,39 @@
+#pragma once
+#include <FreeRTOS.h>
+#include <task.h>
+#include <queue.h>
+#include <array>
+#include <cstdint>
+#include "components/datetime/DateTimeController.h"
+
+namespace Pinetime {
+  namespace Components {
+
+    class Statistici {
+    public:
+      struct Raport {
+        uint8_t  ora;      // 0...23
+        uint32_t pasi;     // totalul zilei, asa cum il da senzorul
+      };
+
+      explicit Statistici(Controllers::DateTime& dateTime) : dateTime {dateTime} {}
+
+      void Start();                          // creeaza coada si procesul
+      void RaporteazaPasi(uint32_t pasi);    // apelat din procesul de sistem
+      uint32_t PasiInOra(uint8_t ora);       // apelat din procesul de afisare
+
+    private:
+      static void Proces(void* param);       // functia procesului
+      void Bucla();
+
+      Controllers::DateTime& dateTime;       // de aici luam ora curenta
+      TaskHandle_t  descriptor = nullptr;
+      QueueHandle_t coada = nullptr;
+
+      uint32_t ultimulTrimis = 0;            // folosit DOAR de procesul de sistem
+      uint32_t ultimulPrimit = 0;            // folosit DOAR de procesul statistici
+      bool     amReferinta = false;          // folosit DOAR de procesul statistici
+      std::array<uint32_t, 24> pe_ora {};    // scris de statistici, citit de afisare
+    };
+  }
+}
diff --git a/src/displayapp/screens/Steps.cpp b/src/displayapp/screens/Steps.cpp
index 2e73dab..80196d6 100644
--- a/src/displayapp/screens/Steps.cpp
+++ b/src/displayapp/screens/Steps.cpp
@@ -16,8 +16,11 @@ static void lap_event_handler(lv_obj_t* obj, lv_event_t event) {
   steps->lapBtnEventHandler(event);
 }
 
-Steps::Steps(Controllers::MotionController& motionController, Controllers::Settings& settingsController)
-  : motionController {motionController}, settingsController {settingsController} {
+Steps::Steps(Controllers::MotionController& motionController,
+             Controllers::Settings& settingsController,
+             Components::Statistici& statistici,
+             Controllers::DateTime& dateTime)
+  : motionController {motionController}, settingsController {settingsController}, statistici {statistici}, dateTime {dateTime} {
 
   stepsArc = lv_arc_create(lv_scr_act(), nullptr);
 
@@ -76,6 +79,11 @@ Steps::Steps(Controllers::MotionController& motionController, Controllers::Setti
   lv_label_set_text_fmt(tripLabel, "Trip: %5li", currentTripSteps);
   lv_obj_align(tripLabel, lstepsGoal, LV_ALIGN_IN_LEFT_MID, 0, 20);
 
+  lOra = lv_label_create(lv_scr_act(), nullptr);
+  lv_obj_set_style_local_text_color(lOra, LV_LABEL_PART_MAIN, LV_STATE_DEFAULT, Colors::orange);
+  lv_label_set_text_static(lOra, "");
+  lv_obj_align(lOra, nullptr, LV_ALIGN_IN_TOP_MID, 0, 25);
+
   taskRefresh = lv_task_create(RefreshTaskCallback, 100, LV_TASK_PRIO_MID, this);
 }
 
@@ -100,6 +108,10 @@ void Steps::Refresh() {
     lv_label_set_text_fmt(tripLabel, "Trip: 99999+");
   }
   lv_arc_set_value(stepsArc, int16_t(500 * stepsCount / settingsController.GetStepsGoal()));
+
+  uint8_t ora = dateTime.Hours();
+  lv_label_set_text_fmt(lOra, "Ora %02d: %lu", int(ora), statistici.PasiInOra(ora));
+  lv_obj_align(lOra, nullptr, LV_ALIGN_IN_TOP_MID, 0, 25);
 }
 
 void Steps::lapBtnEventHandler(lv_event_t event) {
diff --git a/src/displayapp/screens/Steps.h b/src/displayapp/screens/Steps.h
index 4824be6..cfebb38 100644
--- a/src/displayapp/screens/Steps.h
+++ b/src/displayapp/screens/Steps.h
@@ -7,6 +7,7 @@
 #include "displayapp/apps/Apps.h"
 #include "displayapp/Controllers.h"
 #include "Symbols.h"
+#include "systemtask/SystemTask.h"
 
 namespace Pinetime {
 
@@ -19,7 +20,10 @@ namespace Pinetime {
 
       class Steps : public Screen {
       public:
-        Steps(Controllers::MotionController& motionController, Controllers::Settings& settingsController);
+        Steps(Controllers::MotionController& motionController,
+              Controllers::Settings& settingsController,
+              Components::Statistici& statistici,
+              Controllers::DateTime& dateTime);
         ~Steps() override;
 
         void Refresh() override;
@@ -28,6 +32,9 @@ namespace Pinetime {
       private:
         Controllers::MotionController& motionController;
         Controllers::Settings& settingsController;
+        Components::Statistici& statistici;
+        Controllers::DateTime& dateTime;
+        lv_obj_t* lOra;
 
         uint32_t currentTripSteps = 0;
 
@@ -50,7 +57,10 @@ namespace Pinetime {
       static constexpr const char* icon = Screens::Symbols::shoe;
 
       static Screens::Screen* Create(AppControllers& controllers) {
-        return new Screens::Steps(controllers.motionController, controllers.settingsController);
+        return new Screens::Steps(controllers.motionController,
+                                  controllers.settingsController,
+                                  controllers.systemTask->GetStatistici(),
+                                  controllers.dateTimeController);
       };
 
       static bool IsAvailable(Pinetime::Controllers::FS& /*filesystem*/) {
diff --git a/src/systemtask/SystemTask.cpp b/src/systemtask/SystemTask.cpp
index 56bf927..a925501 100644
--- a/src/systemtask/SystemTask.cpp
+++ b/src/systemtask/SystemTask.cpp
@@ -138,6 +138,7 @@ void SystemTask::Work() {
   motionSensor.Init();
   motionController.Init(motionSensor.DeviceType());
   settingsController.Init();
+  statistici.Start();
 
   displayApp.Register(this);
   displayApp.Register(&nimbleController.weather());
@@ -454,6 +455,7 @@ void SystemTask::UpdateMotion() {
   auto motionValues = motionSensor.Process();
 
   motionController.Update(motionValues.x, motionValues.y, motionValues.z, motionValues.steps);
+  statistici.RaporteazaPasi(motionValues.steps);
 
   if (settingsController.GetNotificationStatus() != Controllers::Settings::Notification::Sleep) {
     if ((settingsController.isWakeUpModeOn(Pinetime::Controllers::Settings::WakeUpMode::RaiseWrist) &&
diff --git a/src/systemtask/SystemTask.h b/src/systemtask/SystemTask.h
index 606ddd3..32ac4bb 100644
--- a/src/systemtask/SystemTask.h
+++ b/src/systemtask/SystemTask.h
@@ -31,6 +31,7 @@
 
 #include "drivers/Watchdog.h"
 #include "systemtask/Messages.h"
+#include "components/statistici/Statistici.h"
 
 extern std::chrono::time_point<std::chrono::system_clock, std::chrono::nanoseconds> NoInit_BackUpTime;
 
@@ -78,6 +79,7 @@ namespace Pinetime {
 
       void Start();
       void PushMessage(Messages msg);
+      Pinetime::Components::Statistici& GetStatistici() { return statistici; }
 
       bool IsSleepDisabled() {
         return wakeLocksHeld > 0;
@@ -110,6 +112,7 @@ namespace Pinetime {
 
       Pinetime::Controllers::Ble& bleController;
       Pinetime::Controllers::DateTime& dateTimeController;
+      Pinetime::Components::Statistici statistici {dateTimeController};
       Pinetime::Controllers::StopWatchController& stopWatchController;
       Pinetime::Controllers::AlarmController& alarmController;
       QueueHandle_t systemTasksMsgQueue;
