diff --git a/examples/dom/package_manager.cpp b/examples/dom/package_manager.cpp
index 2ba500935a770f7d7200969baccc6852a7518d53..21c803a6d10f124795fdc84ce4d71b9db1240da3 100644
--- a/examples/dom/package_manager.cpp
+++ b/examples/dom/package_manager.cpp
@@ -21,24 +21,23 @@ int main(int argc, const char *argv[])
   };
 
   std::list<Task> remaining_tasks = {
-    {L"contact server       "  , 10 , 0 , 6*25} ,
-    {L"download index.html  "  , 10 , 0 , 9*25} ,
-    {L"download script.js   "  , 1 , 0 , 3*25} ,
-    {L"download style.js    "  , 1 , 0 , 4*25} ,
-    {L"download image.png   "  , 1 , 0 , 5*25}  ,
-    {L"download big_1.png   "  , 1 , 0 , 30*25}  ,
-    {L"download icon_1.png  "  , 1 , 0 , 7*25}  ,
-    {L"download icon_2.png  "  , 1 , 0 , 8*25}  ,
-    {L"download big_2.png   "  , 1 , 0 , 30*25}  ,
-    {L"download small_1.png "  , 1 , 0 , 10*25}  ,
-    {L"download small_2.png "  , 1 , 0 , 11*25}  ,
-    {L"download small_3.png "  , 1 , 0 , 12*25}  ,
+      {L"contact server       ", 10, 0, 6 * 25},
+      {L"download index.html  ", 10, 0, 9 * 25},
+      {L"download script.js   ", 1, 0, 3 * 25},
+      {L"download style.js    ", 1, 0, 4 * 25},
+      {L"download image.png   ", 1, 0, 5 * 25},
+      {L"download big_1.png   ", 1, 0, 30 * 25},
+      {L"download icon_1.png  ", 1, 0, 7 * 25},
+      {L"download icon_2.png  ", 1, 0, 8 * 25},
+      {L"download big_2.png   ", 1, 0, 30 * 25},
+      {L"download small_1.png ", 1, 0, 10 * 25},
+      {L"download small_2.png ", 1, 0, 11 * 25},
+      {L"download small_3.png ", 1, 0, 12 * 25},
   };
 
   std::list<Task> displayed_task;
 
   int remaining_threads = 12;
-  std::string reset_position;
 
   int nb_queued = remaining_tasks.size();
   int nb_active = 0;
@@ -50,55 +49,50 @@ int main(int argc, const char *argv[])
       t = L" " + t;
     return text(t);
   };
-  
-  for(;;) {
-    std::vector<Element> entries;
-    for(auto& task : displayed_task) {
-      auto style = (task.downloaded == task.size) ? dim : bold;
-      entries.push_back(
-        hbox(
-          text(task.name) | style,
-          separator(),
-          to_text(task.downloaded),
-          text(L"/"),
-          to_text(task.size),
-          separator(),
-          gauge(task.downloaded / float(task.size))
+
+  auto renderTask = [&](const Task& task) {
+    auto style = (task.downloaded == task.size) ? dim : bold;
+    return
+      hbox(
+        text(task.name) | style,
+        separator(),
+        to_text(task.downloaded),
+        text(L"/"),
+        to_text(task.size),
+        separator(),
+        gauge(task.downloaded / float(task.size))
+      );
+  };
+
+  auto renderSummary = [&]() {
+    return
+      window(text(L" Summary "),
+        vbox(
+          hbox(text(L"- done:   "), to_text(nb_done) | bold) | color(Color::Green),
+          hbox(text(L"- active: "), to_text(nb_active) | bold ) | color(Color::RedLight),
+          hbox(text(L"- queue:  "), to_text(nb_queued) | bold) | color(Color::Red)
         )
       );
-    }
+  };
+
+  auto render = [&](){
+    std::vector<Element> entries;
+    for(auto& task : displayed_task)
+      entries.push_back(renderTask(task));
 
-    auto document =
+    return
       vbox(
+        // List of tasks.
         window(text(L" Task "),
           vbox(std::move(entries))
         ),
-        hbox(
-          window(text(L" Summary "),
-            vbox(
-              hbox(text(L"- done:   "), to_text(nb_done) | bold) | color(Color::Green),
-              hbox(text(L"- active: "), to_text(nb_active) | bold ) | color(Color::RedLight),
-              hbox(text(L"- queue:  "), to_text(nb_queued) | bold) | color(Color::Red)
-            )
-          )
-        )
-      );
-
-    // Draw.
-    //if (step != 0) screen.Clear();
-    auto screen = ftxui::Screen::TerminalOutput(document);
-    Render(screen, document.get());
-    std::cout << reset_position << screen.ToString() << std::flush;
-    reset_position = screen.ResetPosition();
-
-    // Simulate time.
-    using namespace std::chrono_literals;
-    std::this_thread::sleep_for(0.01s);
 
-    if (nb_active + nb_queued == 0)
-      break;
+        // Summary.
+        hbox(renderSummary(), filler())
+      );
+  };
 
-    // Update the model.
+  auto updateModel = [&](){
     for(auto& task : displayed_task) {
       if (task.downloaded != task.size) {
         task.downloaded++;
@@ -118,6 +112,28 @@ int main(int argc, const char *argv[])
       nb_queued--;
       nb_active++;
     }
+  };
+
+  std::string reset_position;
+  for(;;) {
+
+    // Draw.
+    auto document = render();
+    auto screen = ftxui::Screen::TerminalOutput(document);
+    Render(screen, document.get());
+    std::cout << reset_position << screen.ToString() << std::flush;
+    reset_position = screen.ResetPosition();
+
+    // Simulate time.
+    using namespace std::chrono_literals;
+    std::this_thread::sleep_for(0.01s);
+
+    // Exit
+    if (nb_active + nb_queued == 0)
+      break;
+
+    // Update the model for the next frame.
+    updateModel();
   }
   std::cout << std::endl;
 }