diff --git a/inc/lektor/common.h b/inc/lektor/common.h
index 62ee6ccd19d5aa2d1314a41b5284d86ba78de379..00f213adbb5f7e3748f6376be03d6564100a1d10 100644
--- a/inc/lektor/common.h
+++ b/inc/lektor/common.h
@@ -89,12 +89,12 @@ enum log_level {
     __LAST_UNUSED_LOG_LEVEL,    /* Usefull to enable all by default */
 };
 extern enum log_level __log_level;
-void __lkt_log(enum log_level, const char *section, const char *func, const char *format, ...);
-#define LOG_DEBUG(section, ...) __lkt_log(DEBUG, section, __func__, __VA_ARGS__)
-#define LOG_INFO( section, ...) __lkt_log(INFO,  section, __func__, __VA_ARGS__)
-#define LOG_WARN( section, ...) __lkt_log(WARN,  section, __func__, __VA_ARGS__)
-#define LOG_ERROR(section, ...) __lkt_log(ERROR, section, __func__, __VA_ARGS__)
-#define LOG_FATAL(...)          { __lkt_log(ERROR, "FATAL", __func__, __VA_ARGS__); exit(1); }
+void __lkt_log(enum log_level, const char *section, const char *func, uint64_t line, const char *format, ...);
+#define LOG_DEBUG(section, ...) __lkt_log(DEBUG, section, __func__, __LINE__, __VA_ARGS__)
+#define LOG_INFO( section, ...) __lkt_log(INFO,  section, __func__, __LINE__, __VA_ARGS__)
+#define LOG_WARN( section, ...) __lkt_log(WARN,  section, __func__, __LINE__, __VA_ARGS__)
+#define LOG_ERROR(section, ...) __lkt_log(ERROR, section, __func__, __LINE__, __VA_ARGS__)
+#define LOG_FATAL(...)          { __lkt_log(ERROR, "FATAL", __func__, __LINE__, __VA_ARGS__); exit(1); }
 
 #define SELF_EXECUTABLE_LINUX       "/proc/self/exe"
 #define SELF_EXECUTABLE_FREEBSD     "/proc/curproc/file"
diff --git a/inc/lektor/queue.h b/inc/lektor/queue.h
index 464e3f8aff98b523c676e6b8ff263085bdf57a87..65eb7b08888ba92206f016e6750ade894b99ad82 100644
--- a/inc/lektor/queue.h
+++ b/inc/lektor/queue.h
@@ -48,15 +48,17 @@ enum lkt_event_type {
     lkt_event_prop_time         = (1 <<  8), // size_t
     lkt_event_skip_current      = (1 <<  9), // NULL
     lkt_event_db_updating       = (1 << 10), // size_t, `LKT_DB_UPDATING_*`
-    lkt_event_db_update_total   = (1 << 11), // size_t, update udapte_total reset update_current
+    lkt_event_db_update_total   = (1 << 11), // size_t, increments udapte_total
     lkt_event_db_update_tick    = (1 << 12), // NULL, increment the `update_current`
 };
 
-#define lkt_event_play ( lkt_event_play_pos    | lkt_event_play_file    \
-                       | lkt_event_play_next   | lkt_event_play_prev    \
-                       | lkt_event_play_toggle | lkt_event_skip_current )
-#define lkt_event_prop ( lkt_event_prop_vol    | lkt_event_prop_dur     \
-                       | lkt_event_prop_time                            )
+#define lkt_event_play   ( lkt_event_play_pos    | lkt_event_play_file      \
+                         | lkt_event_play_next   | lkt_event_play_prev      \
+                         | lkt_event_play_toggle | lkt_event_skip_current   )
+#define lkt_event_prop   ( lkt_event_prop_vol    | lkt_event_prop_dur       \
+                         | lkt_event_prop_time                              )
+#define lkt_event_update ( lkt_event_db_updating | lkt_event_db_update_tick \
+                         | lkt_event_db_update_total                        )
 
 typedef struct {
     unsigned int type;
diff --git a/src/base/commands.c b/src/base/commands.c
index fb9ea2073bdf3e3be476feadd7c4d6cfad2b0691..daeabc74be0971f8838b2a811a2871cf23d5a863 100644
--- a/src/base/commands.c
+++ b/src/base/commands.c
@@ -155,7 +155,7 @@ command_stats(struct lkt_state *srv, size_t c, char UNUSED *args[LKT_MESSAGE_ARG
      *              the sdl2 module and any player module) */
     out->data_len = safe_snprintf(out->data, LKT_MESSAGE_MAX,
                                   "__is_updating: %d\n" /* Custom field here */
-                                  "___update_progress: %ld:%ld\n"
+                                  "__update_progress: %ld:%ld\n"
                                   "db_update: %ld\n"
                                   "uptime: %ld\n"
                                   "artists: %d\n"       /* Number of authors */
diff --git a/src/base/common.c b/src/base/common.c
index 0d24a7f9461b1ea379976e87529465b4892741c0..c297695b9827bdae4dbddc3b539711f69f755c4e 100644
--- a/src/base/common.c
+++ b/src/base/common.c
@@ -53,7 +53,8 @@ __set_assert(void)
 enum log_level __log_level = __LAST_UNUSED_LOG_LEVEL; /* All by default */
 
 void
-__lkt_log(enum log_level level, const char *section, const char *func, const char *format, ...)
+__lkt_log(enum log_level level, const char *section, const char *func, uint64_t line_number,
+          const char *format, ...)
 {
     char line[LKT_MESSAGE_MAX];
     va_list ap;
@@ -69,10 +70,10 @@ __lkt_log(enum log_level level, const char *section, const char *func, const cha
     if (level > __log_level)
         return;
 
-    safe_snprintf(line, LKT_MESSAGE_MAX, " %c [%02d:%02d:%02d] %-10s %s: %s\n",
+    safe_snprintf(line, LKT_MESSAGE_MAX, " %c [%02d:%02d:%02d] %-10s %s(+%ld): %s\n",
                   level == ERROR ? '!' : level == WARN ? '*' : level == INFO ? '.' : ' ',
                   hour, min, sec,
-                  section, func, format);
+                  section, func, line_number, format);
 
     va_start(ap, format);
     vfprintf(stderr, line, ap);
diff --git a/src/database/queue.c b/src/database/queue.c
index 23bafe1ac24ca79e8b40eba4d861fc03d81bff0b..a9aba9847a8a44bd977e01c7be86d6f86c34229c 100644
--- a/src/database/queue.c
+++ b/src/database/queue.c
@@ -621,17 +621,17 @@ database_queue_move(volatile sqlite3 *db, int from, int to)
         "  SELECT position, kara_id, priority FROM queue_tmp ORDER BY priority, position;"
         /* Clean queue_tmp */
         "DELETE FROM sqlite_sequence WHERE name = 'queue_tmp';"
-        
+
         "DELETE FROM queue_tmp;";
 
     char SQL[LKT_MAX_SQLITE_STATEMENT];
 
     SQLITE_EXEC(db, "BEGIN TRANSACTION;", error_no_rollback);
-        safe_snprintf(SQL, LKT_MAX_SQLITE_STATEMENT, SQL_TEMPLATE_PART_1,to,from, from, to, to, to);
-        SQLITE_EXEC(db, SQL, error);
+    safe_snprintf(SQL, LKT_MAX_SQLITE_STATEMENT, SQL_TEMPLATE_PART_1, to, from, from, to, to, to);
+    SQLITE_EXEC(db, SQL, error);
 
-        safe_snprintf(SQL, LKT_MAX_SQLITE_STATEMENT, SQL_TEMPLATE_PART_2, to, from);
-        SQLITE_EXEC(db, SQL, error);
+    safe_snprintf(SQL, LKT_MAX_SQLITE_STATEMENT, SQL_TEMPLATE_PART_2, to, from);
+    SQLITE_EXEC(db, SQL, error);
     SQLITE_EXEC(db, "COMMIT;", error);
     return true;
 error:
diff --git a/src/main/lkt.c b/src/main/lkt.c
index 6a4f6c5cc1415008449032840a29c61f63c0f662..814178c09f3657c392f301ad8a7203b5f94072b0 100644
--- a/src/main/lkt.c
+++ b/src/main/lkt.c
@@ -646,17 +646,38 @@ status__(struct cmd_args *args)
 
     bool play = false, stopped = true, is_updating = false;
     int time_pos = 0, time_duration = 0, song_index = 0, plt_len = 0, ret = EXIT_FAILURE, it = 0;
+    int update_count = 0, update_tick = 0;
     size_t len;
     time_t update_ts = 0;
 
     memset(flags, 0, 24 * sizeof(char));
     FILE *sock = lkt_connect();
 
-#define assign_flag(str, f)  if (STR_NMATCH(buff, str, len) && (atoi(lkt_skip_key(buff)) == 1)) { flags[it++] = f; continue; }
-#define assign_int(str, var) if (STR_NMATCH(buff, str, len)) { var = (strtoll(lkt_skip_key(buff), NULL, 0)); continue; }
-#define check_end()                                     \
-    if (STR_NMATCH(buff, "OK", 2)) break;               \
-    else if (STR_NMATCH(buff, "ACK", 3)) goto error;
+#define assign_flag(str, f) {                                               \
+    if (STR_NMATCH(buff, str, len) && (atoi(lkt_skip_key(buff)) == 1)) {    \
+        flags[it++] = f;                                                    \
+        continue;                                                           \
+    }}
+#define assign_two_int(str, var1, var2) {                   \
+    if (STR_NMATCH(buff, str, len)) {                       \
+        char *endptr = NULL;                                \
+        var1 = (strtoll(lkt_skip_key(buff), &endptr, 0));   \
+        endptr += strspn(endptr, "-/:");                    \
+        if (endptr)                                         \
+            var2 = (strtoll(endptr, NULL, 0));              \
+        continue;                                           \
+    }}
+#define assign_int(str, var) {                          \
+    if (STR_NMATCH(buff, str, len)) {                   \
+        var = (strtoll(lkt_skip_key(buff), NULL, 0));   \
+        continue;                                       \
+    }}
+#define check_end() {                                   \
+    if (STR_NMATCH(buff, "OK", 2)) {                    \
+        break;                                          \
+    } else if (STR_NMATCH(buff, "ACK", 3)) {            \
+        goto error;                                     \
+    }}
 
     /* Get lektor's status */
     write_socket(sock, status_str__);
@@ -695,6 +716,8 @@ status__(struct cmd_args *args)
         assign_int("__is_updating", is_updating)
         assign_int("db_update",     update_ts)
 
+        assign_two_int("__update_progress", update_tick, update_count)
+
         check_end()
     }
 
@@ -703,6 +726,7 @@ status__(struct cmd_args *args)
 
 #undef assign_flag
 #undef assign_int
+#undef assign_two_int
 #undef check_end
 
     struct tm *p_tm = localtime(&update_ts);
@@ -717,13 +741,17 @@ status__(struct cmd_args *args)
     printf("Lektor: %s\n"
            "Queue: #%d/%d\n"
            "Playback: %d:%02d/%d:%02d\n"
-           "Flags: %s\n"
-           "%s: %s\n",
+           "Flags: %s\n",
            play ? "play" : "stopped",
            song_index + 1, plt_len,
            pla_m, pla_s, dur_m, dur_s,
-           flags[0] ? flags : "(none)",
-           is_updating ? "Updating" : "Last update", buff);
+           flags[0] ? flags : "(none)");
+    if (is_updating) {
+        printf("Updating: %d/%d%s\n", update_tick, update_count,
+               update_count >= update_tick ? "" : " (invalid)");
+    } else {
+        printf("Last update: %s\n", buff);
+    }
 
     /* If there is a kara loaded in mpv, get this kara. */
     if (!stopped) {
diff --git a/src/main/server.c b/src/main/server.c
index 7117c8ccceadf17d550b8b81b9ae424223ead56e..e472659d1eb8ad260282fb63b8dfc7f728029ee9 100644
--- a/src/main/server.c
+++ b/src/main/server.c
@@ -332,6 +332,7 @@ retry_config:
         database_queue_clear(srv.db);
     }
     lkt_queue_make_available(&srv.queue, lkt_event_prop);
+    lkt_queue_make_available(&srv.queue, lkt_event_update);
 
     {   /* Module initialization */
         char *module = safe_malloc(sizeof(char) * PATH_MAX);
diff --git a/src/module/module_repo.c b/src/module/module_repo.c
index 054bbb19ddf35ea6d903cef082a3a91e40d7ee6a..3969e2acd932a26eaccf8f4f805b27697172a064 100644
--- a/src/module/module_repo.c
+++ b/src/module/module_repo.c
@@ -422,12 +422,14 @@ __handle_got_json_internal_callback(const char *key, const char *val, int comp,
             ++(kara->ignored_count);
             database_update_touch(kara->db, kara->id);
             database_update_set_available(kara->db, kara->id);
+            lkt_queue_send(kara->repo->queue, lkt_event_db_update_tick, NULL);
             LOG_DEBUG("REPO", "Ignore kara %ld", kara->id);
             return;
         }
 
     do_it:
         __handle_got_json_dl(kara, current_id);
+        lkt_queue_send(kara->repo->queue, lkt_event_db_update_tick, NULL);
     }
 
     else
@@ -464,6 +466,7 @@ __handle_got_json(volatile sqlite3 *db, struct module_repo_internal *repo, const
 
     /* Handle the json */
     LOG_INFO("REPO", "Starting to process json for repo %s, total of %ld karas", repo->name, len);
+    lkt_queue_send(repo->queue, lkt_event_db_update_total, (void *) (size_t) len);
     json_parse(json, 2, __handle_got_json_internal_callback, (void *) &kara);
     LOG_INFO("REPO", "Updated %ld karas and ignored %ld karas, total is %ld",
              kara.update_count, kara.ignored_count, len);
diff --git a/src/net/listen.c b/src/net/listen.c
index 284ff2c84d9433a6c7c1da6121e7c733588adad7..f7383952e8631192c655a42586d18e3c46d004f2 100644
--- a/src/net/listen.c
+++ b/src/net/listen.c
@@ -866,14 +866,14 @@ redo:
         free(string);
     })
 
+    __CASE(db_update_total, { srv->update_total += (size_t) evt.attr;                 })
     __CASE(db_updating,     { srv->is_updating = (((uint8_t) (size_t) evt.attr) > 0); })
     __CASE(db_update_tick,  {
         if (srv->update_current != ((size_t) -1))
             srv->update_current++;
-    })
-    __CASE(db_update_total, {
-        srv->update_total   = (size_t) evt.attr;
-        srv->update_current = 0;
+        if (srv->update_current >= srv->update_total)
+            (LOG_WARN("EVENT", "Force updating state because tikcs exceded the update count"),
+             srv->is_updating = 0);
     })
 
     /* The null event / ignored events, just return / continue */