diff --git a/inc/lektor/common.h b/inc/lektor/common.h
index 28155d1920d67b0d790dea9b595a6f6f9d6087c2..3495f2519ccaadb965b05807dab896e78c3056c5 100644
--- a/inc/lektor/common.h
+++ b/inc/lektor/common.h
@@ -12,6 +12,11 @@
 #define GET_ID_JSON     DEFAULT_URL "/api_karas.php?id=%ld"
 #define GET_ID_FILE     DEFAULT_URL "/download.php?id=%ld"
 
+#define SELF_EXECUTABLE_LINUX           "/proc/self/exe"
+#define SELF_EXECUTABLE_FREEBSD         "/proc/curproc/file"
+#define SELF_EXECUTABLE_SOLARIS         "/proc/self/path/a.out"
+
+
 #define LKT_MAX_SQLITE_STATEMENT        1024
 #define PROTECTED_DATABASE              "disk"
 
@@ -91,7 +96,7 @@ enum mpd_idle_flag {
 
 #define SQLITE_STEP(db, stmt, code, error)                              \
     if (sqlite3_step(stmt) != code) {                                   \
-        LOG_ERROR_SCT("DB", "Failed to step and get a row: %s",         \
+        LOG_ERROR_SCT("DB", "Failed to step: %s",                       \
                       sqlite3_errmsg((sqlite3 *) db));                  \
         goto error;                                                     \
     }
diff --git a/inc/lektor/database.h b/inc/lektor/database.h
index 3c9601400862dae0f1722fde761e677f0a4073a7..f74e2a16332743df3e584b1da30aa229c5bad011 100644
--- a/inc/lektor/database.h
+++ b/inc/lektor/database.h
@@ -45,9 +45,9 @@ bool database_queue_get_current_file (sqlite3 *db, char filepath[PATH_MAX]);
 bool database_sync_mpv_state(sqlite3 *db, mpv_handle **mpv);
 
 /* Update the database. */
-bool database_update(sqlite3 *db, const char *kara_dir);
-bool database_update_add(sqlite3 *db, const char *kara_path, struct kara_metadata *mdt, uint64_t id, bool avail);
-bool database_update_set_available(sqlite3 *db, uint64_t id);
+bool database_update(volatile sqlite3 *db, const char *kara_dir);
+bool database_update_add(volatile sqlite3 *db, const char *kara_path, struct kara_metadata *mdt, uint64_t id, bool avail);
+bool database_update_set_available(volatile sqlite3 *db, uint64_t id);
 
 /* Control the content of the queue. */
 bool database_queue_add_id      (sqlite3 *db, int id,               int priority);
diff --git a/src/commands.c b/src/commands.c
index d5e1d6a577e28ac869d703d6184bb756de0bf689..890c26d318cdbf69c6e1600c1426c2baa6b67030 100644
--- a/src/commands.c
+++ b/src/commands.c
@@ -6,6 +6,7 @@
 #include <lektor/database.h>
 #include <lektor/net.h>
 #include <lektor/uri.h>
+#include <mthread/mthread.h>
 
 #include <errno.h>
 #include <linux/limits.h>
@@ -18,10 +19,6 @@
 #include <poll.h>
 #include <unistd.h>
 
-#define SELF_EXECUTABLE_LINUX   "/proc/self/exe"
-#define SELF_EXECUTABLE_FREEBSD "/proc/curproc/file"
-#define SELF_EXECUTABLE_SOLARIS "/proc/self/path/a.out"
-
 inline bool
 command_restart(struct lkt_state *srv, size_t c)
 {
@@ -61,16 +58,22 @@ command_update(struct lkt_state *srv, size_t c, char *argv[LKT_MESSAGE_ARGS_MAX]
     return ! repo_update(&srv->repo);
 }
 
+static inline void *
+__rescan(void * arg)
+{
+    struct lkt_state *srv = arg;
+    database_update(srv->db, srv->kara_prefix);
+    return NULL;
+}
+
 bool
 command_rescan(struct lkt_state *srv, size_t c, char *argv[LKT_MESSAGE_ARGS_MAX])
 {
     UNUSED(argv);
     RETURN_UNLESS(lkt_client_auth(srv, c, false), "Failed to authentificate user", false);
-    fprintf(stderr, " ! command_rescan: Not implemented\n");
-    return false;
     srv->mpd_idle_events |= MPD_IDLE_UPDATE;
     srv->mpd_idle_events |= MPD_IDLE_DATABASE;
-    return database_update((sqlite3 *) srv->db, srv->kara_prefix);
+    return ! mthread_create(NULL, ATTR_DETACHED_FREE, __rescan, srv);
 }
 
 inline bool
diff --git a/src/database/update.c b/src/database/update.c
index f4d992e4963742ae0d0f13e9a565df961b9f1250..80429007333c98526a9efa5988b88f498ddbcd33 100644
--- a/src/database/update.c
+++ b/src/database/update.c
@@ -1,8 +1,10 @@
 #define _POSIX_C_SOURCE 200809L
 #define _DEFAULT_SOURCE
 
+#include <common/common.h>
 #include <lektor/database.h>
 #include <lektor/common.h>
+
 #include <stdbool.h>
 #include <sqlite3.h>
 #include <stdio.h>
@@ -13,7 +15,7 @@
 #include <linux/limits.h>
 
 static bool
-database_add_kara(sqlite3 *db, const char *filename)
+database_add_kara(volatile sqlite3 *db, const char *filename)
 {
     RETURN_UNLESS(db || filename, "Invalid argument", false);
     static const char *SQL_STMT =
@@ -46,7 +48,7 @@ database_add_kara(sqlite3 *db, const char *filename)
         (sqlite3_bind_text(stmt, 8, data.author_name, -1, 0) != SQLITE_OK)  ||
         (sqlite3_bind_int (stmt, 9, data.song_number)        != SQLITE_OK)
        ) {
-        LOG_ERROR_SCT("DB", "Failed to bind for kara %s: %s", filename, sqlite3_errmsg(db));
+        LOG_ERROR_SCT("DB", "Failed to bind for kara %s: %s", filename, sqlite3_errmsg((sqlite3 *) db));
         goto error;
     }
 
@@ -58,7 +60,7 @@ error:
 }
 
 bool
-database_update_set_available(sqlite3 *db, uint64_t id)
+database_update_set_available(volatile sqlite3 *db, uint64_t id)
 {
     static const char *SQL_STMT = "UPDATE kara SET available = 1 WHERE id = ?;";
     sqlite3_stmt *stmt;
@@ -76,7 +78,7 @@ error:
 }
 
 bool
-database_update_add(sqlite3 *db, const char *kara_path, struct kara_metadata *mdt, uint64_t id, bool avail)
+database_update_add(volatile sqlite3 *db, const char *kara_path, struct kara_metadata *mdt, uint64_t id, bool avail)
 {
     RETURN_UNLESS(db && kara_path && mdt, "Invalid argument", false);
     static const char *SQL_STMT =
@@ -107,7 +109,7 @@ database_update_add(sqlite3 *db, const char *kara_path, struct kara_metadata *md
         (sqlite3_bind_int (stmt, 10, id)                      != SQLITE_OK) ||
         (sqlite3_bind_int (stmt, 11, avail)                   != SQLITE_OK)
        ) {
-        LOG_ERROR_SCT("DB", "Failed to bind argument for kara %s: %s", kara_path, sqlite3_errmsg(db));
+        LOG_ERROR_SCT("DB", "Failed to bind argument for kara %s: %s", kara_path, sqlite3_errmsg((sqlite3 *) db));
         goto error;
     }
 
@@ -120,7 +122,7 @@ error_no_sqlite:
 }
 
 bool
-database_update(sqlite3 *db, const char *kara_dir)
+database_update(volatile sqlite3 *db, const char *kara_dir)
 {
     DIR *d;
     struct dirent *dir;
@@ -137,10 +139,15 @@ database_update(sqlite3 *db, const char *kara_dir)
         strncat(path, "/", PATH_MAX - 1);
         strncat(path, dir->d_name, PATH_MAX - 1);
 
-        if (dir->d_type == DT_REG)
+        if (dir->d_type == DT_REG) {
+            if (get_mtime(path) < database_get_timestamp(db))
+                continue;
             database_add_kara(db, path);
-        else if (dir->d_type == DT_DIR &&
-                 strcmp(dir->d_name, ".") != 0 &&
+            database_stamp(db);
+        }
+
+        else if (dir->d_type == DT_DIR          &&
+                 strcmp(dir->d_name, ".")  != 0 &&
                  strcmp(dir->d_name, "..") != 0)
             database_update(db, path);
     }
diff --git a/src/net/listen.c b/src/net/listen.c
index 4a1c0498a3e4490f8e5c323019e35f4ce28fefdb..690c1844c6111d77864a47a7a01d5fd648c59a14 100644
--- a/src/net/listen.c
+++ b/src/net/listen.c
@@ -164,7 +164,7 @@ handle_simple_command(struct lkt_state *srv, size_t c, struct lkt_command cmd)
             err = ! command_rescan(srv, c, cmd.args);
 
         /* Commands that are available if not in idle mode */
-        if (!strcmp(cmd.name, "currentsong"))
+        else if (!strcmp(cmd.name, "currentsong"))
             err = !command_currentsong(srv, c);
         else if (!strcmp(cmd.name, "status"))
             err = !command_status(srv, c);