diff --git a/src/base/commands.c b/src/base/commands.c
index 0651f6b7ecd2cc409ae8d670d3f9283e37d74e95..f10afa7edb84782a57f003c0b4f63f366c6e03a1 100644
--- a/src/base/commands.c
+++ b/src/base/commands.c
@@ -229,12 +229,47 @@ command_next(struct lkt_state *srv, char UNUSED *args[LKT_MESSAGE_ARGS_MAX])
 }
 
 bool
-command_pause(struct lkt_state *srv, char UNUSED *args[LKT_MESSAGE_ARGS_MAX])
+command_pause(struct lkt_state *srv, char *args[LKT_MESSAGE_ARGS_MAX])
 {
-    srv->mpd_idle_events |= MPD_IDLE_PLAYER;
-    if (!database_queue_toggle_pause(srv->db))
-        return false;
-    return ! MOD_PROC(srv->window_mod, "toggle");
+    /* The simple toggle version */
+    if ((! args) || (args && ! args[0])) {
+    toggle_anyway:
+        srv->mpd_idle_events |= MPD_IDLE_PLAYER;
+        RETURN_UNLESS(database_queue_toggle_pause(srv->db), "Failed to toggle pause in db", false);
+        return ! MOD_PROC(srv->window_mod, "toggle");
+    }
+
+    /* Set the 'pause' state */
+    else {
+        long state = strtol(args[0], NULL, 0);
+        struct lkt_queue_state queue;
+        LOG_DEBUG("COMMAND", "Forcing the paused state to %ld", state);
+        GOTO_UNLESS(database_queue_state(srv->db, &queue),
+                    "Failed to get queue state, try to toggle pause state anyway", toggle_anyway);
+
+        /* Pause   := 0 | 1
+         * current := (kara_id > 0) | (NULL --> -1) */
+
+        /* Play! */
+        if (queue.current < 0) {
+            LOG_DEBUG("COMMAND", "Not playing anything, force play from begening of the queue");
+            return command_play(srv, NULL);
+        }
+
+        /* Set play/unpause or the pause */
+        else if (queue.paused != state) {
+            RETURN_UNLESS(database_queue_set_paused(srv->db, state),
+                          "Oupsi, can't get queue state", false);
+            srv->mpd_idle_events |= MPD_IDLE_PLAYER;
+            return ! MOD_PROC(srv->window_mod, "toggle");
+        }
+
+        /* Nop */
+        else {
+            LOG_DEBUG("COMMAND", "Playback was already %s", state ? "paused" : "unpaused");
+            return true;
+        }
+    }
 }
 
 bool
@@ -265,14 +300,14 @@ __play_that_file(struct lkt_state *win, int pos)
 }
 
 bool
-command_play(struct lkt_state *srv, char UNUSED *args[LKT_MESSAGE_ARGS_MAX])
+command_play(struct lkt_state *srv, char *args[LKT_MESSAGE_ARGS_MAX])
 {
     char *endptr, err;
     long pos = 1;
     struct lkt_queue_state queue_state;
 
     /* Argument handle. */
-    if (args[0]) {
+    if (args && args[0]) {
         STRTOL(pos, args[0], endptr, err);
         RETURN_IF(err, "STRTOL failed", false);
     }
diff --git a/src/module/module_sdl2.c b/src/module/module_sdl2.c
index 61d5b86c50383c4bc7fe63cd929748e24621ce6f..3bcc6e126cb619c44b03eb7d2608e0b6cdab86b0 100644
--- a/src/module/module_sdl2.c
+++ b/src/module/module_sdl2.c
@@ -53,15 +53,18 @@ struct module_sdl2_window {
  * Function definitions *
  ************************/
 
-static bool module_sdl2_get_elapsed(struct module_sdl2_window *, int *);
+// *INDENT-OFF*
+static bool module_sdl2_get_elapsed (struct module_sdl2_window *, int *);
 static bool module_sdl2_get_duration(struct module_sdl2_window *, int *);
-static bool module_sdl2_set_volume(struct module_sdl2_window *, int);
+static bool module_sdl2_set_paussed (struct module_sdl2_window *, int);
+static bool module_sdl2_set_volume  (struct module_sdl2_window *, int);
 static bool module_sdl2_set_position(struct module_sdl2_window *, int);
-static bool module_sdl2_load_file(struct module_sdl2_window *, const char *);
+static bool module_sdl2_load_file   (struct module_sdl2_window *, const char *);
 static bool module_sdl2_toggle_pause(struct module_sdl2_window *);
-static void module_sdl2_free(struct module_sdl2_window *);
-static void module_sdl2_close(struct module_sdl2_window *);
-static bool module_sdl2_new(struct module_sdl2_window **, struct queue *, volatile sqlite3 *);
+static void module_sdl2_free        (struct module_sdl2_window *);
+static void module_sdl2_close       (struct module_sdl2_window *);
+static bool module_sdl2_new         (struct module_sdl2_window **, struct queue *, volatile sqlite3 *);
+// *INDENT-OF*
 
 /*********************
  * Private functions *
@@ -166,7 +169,7 @@ mod_toggle_pause(va_list *va)
     va_list copy;
     struct module_sdl2_window **win;
     va_copy(copy, *va);
-    win = (struct module_sdl2_window **) va_arg(copy, void **);
+    win      = (struct module_sdl2_window **) va_arg(copy, void **);
     bool ret = module_sdl2_toggle_pause(*win);
     va_end(copy);
     return ! ret;
@@ -178,9 +181,9 @@ mod_load_file(va_list *va)
     va_list copy;
     struct module_sdl2_window **win;
     va_copy(copy, *va);
-    win = (struct module_sdl2_window **) va_arg(copy, void **);
+    win              = (struct module_sdl2_window **) va_arg(copy, void **);
     const char *file = va_arg(copy, const char *);
-    bool ret = module_sdl2_load_file(*win, file);
+    bool ret         = module_sdl2_load_file(*win, file);
     va_end(copy);
     return ! ret;
 }
@@ -191,9 +194,22 @@ mod_set_volume(va_list *va)
     va_list copy;
     struct module_sdl2_window **win;
     va_copy(copy, *va);
-    win = (struct module_sdl2_window **) va_arg(copy, void **);
+    win        = (struct module_sdl2_window **) va_arg(copy, void **);
     int volume = va_arg(copy, int);
-    bool ret = module_sdl2_set_volume(*win, volume);
+    bool ret   = module_sdl2_set_volume(*win, volume);
+    va_end(copy);
+    return ! ret;
+}
+
+static int
+mod_set_paused(va_list *va)
+{
+    va_list copy;
+    struct module_sdl2_window **win;
+    va_copy(copy, *va);
+    win       = (struct module_sdl2_window **) va_arg(copy, void **);
+    int state = va_arg(copy, int);
+    bool ret  = module_sdl2_set_paussed(*win, state);
     va_end(copy);
     return ! ret;
 }
@@ -204,9 +220,9 @@ mod_set_position(va_list *va)
     va_list copy;
     struct module_sdl2_window **win;
     va_copy(copy, *va);
-    win = (struct module_sdl2_window **) va_arg(copy, void **);
+    win         = (struct module_sdl2_window **) va_arg(copy, void **);
     int seconds = va_arg(copy, int);
-    bool ret = module_sdl2_set_position(*win, seconds);
+    bool ret    = module_sdl2_set_position(*win, seconds);
     va_end(copy);
     return ! ret;
 }
@@ -217,9 +233,9 @@ mod_get_duration(va_list *va)
     va_list copy;
     struct module_sdl2_window **win;
     va_copy(copy, *va);
-    win = (struct module_sdl2_window **) va_arg(copy, void **);
+    win           = (struct module_sdl2_window **) va_arg(copy, void **);
     int *duration = va_arg(copy, int *);
-    bool ret = module_sdl2_get_duration(*win, duration);
+    bool ret      = module_sdl2_get_duration(*win, duration);
     va_end(copy);
     return ! ret;
 }
@@ -230,9 +246,9 @@ mod_get_elapsed(va_list *va)
     va_list copy;
     struct module_sdl2_window **win;
     va_copy(copy, *va);
-    win = (struct module_sdl2_window **) va_arg(copy, void **);
+    win          = (struct module_sdl2_window **) va_arg(copy, void **);
     int *elapsed = va_arg(copy, int *);
-    bool ret = module_sdl2_get_elapsed(*win, elapsed);
+    bool ret     = module_sdl2_get_elapsed(*win, elapsed);
     va_end(copy);
     return ! ret;
 }
@@ -247,10 +263,11 @@ REG_ADD_NAMED("free",         mod_free)
 REG_ADD_NAMED("close",        mod_close)
 REG_ADD_NAMED("toggle",       mod_toggle_pause)
 REG_ADD_NAMED("load",         mod_load_file)
+REG_ADD_NAMED("set_paused",   mod_set_paused)
+REG_ADD_NAMED("set_position", mod_set_position)
 REG_ADD_NAMED("set_volume",   mod_set_volume)
 REG_ADD_NAMED("get_duration", mod_get_duration)
 REG_ADD_NAMED("get_elapsed",  mod_get_elapsed)
-REG_ADD_NAMED("set_position", mod_set_position)
 REG_END()
 #if ! defined (LKT_STATIC_MODULE)
     REG_EXPORT(sdl2_reg)
@@ -514,6 +531,18 @@ module_sdl2_load_file(struct module_sdl2_window *win, const char *filepath)
     return ret;
 }
 
+static bool
+module_sdl2_set_paussed(struct module_sdl2_window *win, int paused)
+{
+    RETURN_UNLESS(win && win->window, "Invalid arguments", false);
+    if (((!paused) && win->state == STATE_PAUSE) || (win->state == STATE_PLAY && paused)) {
+        return ! lmpv_toggle_pause((struct mpv_handle *) win->mpv);
+    } else {
+        LOG_DEBUG("WINDOW", "No need to toggle paused state, already what was asked");
+        return true;
+    }
+}
+
 static bool
 module_sdl2_set_volume(struct module_sdl2_window *win, int vol)
 {
diff --git a/src/net/listen.c b/src/net/listen.c
index a0ecab1b46318123b4c8a6f2b281a2a023983de0..33114bff45342bb5c6a73081fe4bd60ac0718e15 100644
--- a/src/net/listen.c
+++ b/src/net/listen.c
@@ -188,7 +188,7 @@ handle_simple_command(struct lkt_state *srv, size_t c, struct lkt_command cmd)
         else if (STR_MATCH(cmd.name, "next"))
             err = ! command_next(srv, NULL);
         else if (STR_MATCH(cmd.name, "pause"))
-            err = ! command_pause(srv, NULL);
+            err = ! command_pause(srv, cmd.args);
         else if (STR_MATCH(cmd.name, "previous"))
             err = ! command_previous(srv, NULL);
         else if (STR_MATCH(cmd.name, "play"))