diff --git a/common/lkt.js b/common/lkt.js
index 903ced8456d558956af9aa1f47ed6cb005f72169..8cb7da43a606b483fc589394646e107a876428eb 100644
--- a/common/lkt.js
+++ b/common/lkt.js
@@ -143,46 +143,41 @@ class LktClient {
         }
         return __getResult(client);
     }
-    
 
-    static idleActualisation()
-    {
+    static idleActualisation() {
         var client = new this();
         client.m_socket.setTimeout(0);
         function __getResult(client) {
-            return new Promise((resolve,reject) => {
-                client.m_socket.on('data',data => {
-                    if(String(data).includes("playlist")) {
+            return new Promise((resolve, reject) => {
+                client.m_socket.on('data', data => {
+                    if (String(data).includes('playlist')) {
                         LktClient.setQueueUpdated(true);
                     }
                     client.m_socket.write(`idle\n`);
                     return null;
                 });
             });
-
         }
         return __getResult(client);
     }
 
     static commandPlay() {
-        var status= LktClient.commandStatus();
-        return status.then(LktClient.changePlayStatus,LktClient.errorStatus);
-    }
-    static changePlayStatus(status)
-    {
-        switch(status.state)
-        {
-            case "play":
-                return LktClient.__execSimple("pause 1");
+        var status = LktClient.commandStatus();
+        return status.then(LktClient.changePlayStatus, LktClient.errorStatus);
+    }
+    static changePlayStatus(status) {
+        switch (status.state) {
+            case 'play':
+                return LktClient.__execSimple('pause 1');
                 break;
-            case "pause":
-                return LktClient.__execSimple("pause 0");
+            case 'pause':
+                return LktClient.__execSimple('pause 0');
                 break;
-            case "stop":
-                return LktClient.__execSimple("play");
+            case 'stop':
+                return LktClient.__execSimple('play');
                 break;
             default:
-                logger.info("Unknown play state"+status.state);
+                logger.info('Unknown play state' + status.state);
         }
     }
     static commandStop() {
@@ -198,9 +193,14 @@ class LktClient {
     static commandShuffle() {
         return LktClient.__execSimple('shuffle');
     }
-    static commandClear(){
+    static commandClear() {
         return LktClient.__execSimple('clear');
     }
+    static commandMove(from, to) {
+        var request = 'move ' + from + ' ' + to;
+        logger.info(request);
+        return LktClient.__execSimple('move ' + from + ' ' + to);
+    }
 
     static commandQueueAddId(id) {
         return LktClient.__execSimple(`add id ${id}`);
@@ -208,9 +208,8 @@ class LktClient {
     static commandQueueDelId(id) {
         return LktClient.__execSimple(`deleteid ${id}`);
     }
-    static errorStatus(error)
-    {
-        logger.error("Unable to access lektor status:" + error);
+    static errorStatus(error) {
+        logger.error('Unable to access lektor status:' + error);
     }
 
     static queue_updated = false;
@@ -238,7 +237,6 @@ function __mpdStatusToBool(string) {
     string = string.split('\n');
     string = string[string.length - 1];
     return string.split(/ /) == 'OK' ? true : false;
-
 }
 
 module.exports = LktClient;
diff --git a/instance/main.js b/instance/main.js
index bf1f6b234724d12f962bf941953246c05e68b706..d3ad286e63497bb04fdf2be063c7d2571c12b90b 100644
--- a/instance/main.js
+++ b/instance/main.js
@@ -1,6 +1,7 @@
 const { ipcRenderer } = require('electron');
 const ejs = require('ejs');
 const logger = require('../common/logger.js');
+const e = require('express');
 
 /* prettier-ignore */
 const buttonList = [
@@ -49,9 +50,8 @@ window.onload = () => {
     addIpcToButton('reloadQueue', ['reload-queue-request']);
     addIpcToButton('reloadDb', ['reload-db-request', 'reload-queue-request']);
 
-    logger.debug('Window loaded');
-    setTimeout(()=>ipcRenderer.send('reload-queue-request'),500);
-    setInterval(()=>ipcRenderer.send('verify-queue-reloaded-request'),1000);
+    setTimeout(() => ipcRenderer.send('reload-queue-request'), 500);
+    setInterval(() => ipcRenderer.send('verify-queue-reloaded-request'), 50);
     logger.debug('instance', 'Window loaded');
 
     $('#filterInput').on('keypress', e => {
@@ -140,6 +140,7 @@ ipcRenderer.on('reload-db-responce', (event, arg) => {
             }
         );
     });
+    [].forEach.call(document.querySelectorAll('#panelLeft .karaCard'), a);
 });
 
 /* Create the right panel: the queue */
@@ -158,6 +159,85 @@ ipcRenderer.on('reload-queue-responce', (event, arg) => {
             }
         );
     });
+    logger.info('Time', new Date().getTime() - time);
+    [].forEach.call(
+        document.querySelectorAll('#panelRight .karaCard'),
+        addQueueDragAndDropHandlers
+    );
+});
+
+ipcRenderer.on('queue-moved-responce', (event, arg) => {
+    logger.info('Time', new Date().getTime() - time);
+    ipcRenderer.send('reload-queue-request');
 });
 
+var isDnDFromDB = false;
+var date = new Date();
+var time = 0;
+
+function addDBDragAndDropHandlers(element) {
+    isDnDFromDB = true;
+}
+
+function addQueueDragAndDropHandlers(element) {
+    element.addEventListener('dragstart', onDragStart, false);
+    element.addEventListener('dragenter', onDragEnter, false);
+    element.addEventListener('dragover', onDragOver, false);
+    element.addEventListener('dragleave', ondragLeave, false);
+    element.addEventListener('drop', onDrop, false);
+    element.addEventListener('dragend', onDragEnd, false);
+}
+
+var dragCounter = 0;
+var leavedElement;
+
+function onDragStart(event) {
+    event.dataTransfer.effectAllowed = 'move';
+    event.currentTarget.style.opacity = 0.4;
+    //logger.debug(event.currentTarget.childElementCount+"\n");
+    event.dataTransfer.setData(
+        'text/plain',
+        event.currentTarget.getElementsByClassName('karaPosition')[0].innerText
+    );
+}
+
+function onDragEnter(event) {
+    if (leavedElement != event.currentTarget) {
+        leavedElement.style.borderTop = '';
+    }
+    event.currentTarget.style.borderTop = '3px solid grey';
+    dragCounter++;
+}
+
+function onDragOver(event) {
+    if (event.preventDefault) {
+        event.preventDefault();
+    }
+    event.dataTransfer.dropEffect = 'move';
+}
+
+function ondragLeave(event) {
+    dragCounter--;
+    leavedElement = event.currentTarget;
+    if (dragCounter == 0) {
+        event.currentTarget.style.borderTop = '';
+    }
+    //logger.debug("dragCount", dragCounter)
+}
+
+function onDrop(event) {
+    //logger.debug("salut", "salut");
+    event.currentTarget.style.borderTop = '';
+    time = new Date().getTime();
+    ipcRenderer.send('queue-moved-kara', {
+        from: event.dataTransfer.getData('text/plain'),
+        to: event.currentTarget.getElementsByClassName('karaPosition')[0]
+            .innerText,
+    });
+    return false;
+}
 
+function onDragEnd(event) {
+    event.currentTarget.style.opacity = 1;
+    dragCounter = 0;
+}
diff --git a/instance/views/karaListItem.ejs b/instance/views/karaListItem.ejs
index 0d3c1ec9ffe25c3d1ffd87942eae179c68b40b24..85bced1fe389e84d3d39aaba867fef894013c1f6 100644
--- a/instance/views/karaListItem.ejs
+++ b/instance/views/karaListItem.ejs
@@ -1,12 +1,13 @@
 <%# vim: ts=4 syntax=html
     The template for the kara card in lists %>
-<li class="card p-2 bd-highlight shadow-none d-flex flex-row bd-highlight mb-3 karaCard">
+<li class="card p-2 bd-highlight shadow-none d-flex flex-row bd-highlight mb-3 karaCard" draggable="true">
+    <span hidden class = "karaID"><%= kara.id %></span>
     <span class="karaElement text-uppercase p-2 bd-highlight badge badge-light"><b><%= kara.language %></b></span>
     <span class="karaElement text-uppercase p-2 bd-highlight badge badge-light"><b><%= kara.cat      %></b></span>
     <span class="karaElement text-uppercase p-2 bd-highlight badge badge-light"><b><%= kara.type     %></b></span>
     <span class="karaElement p-2 bd-highlight mr-auto"><b><%= kara.source %><br> <%= kara.title %></b> <i>[<%= kara.author %>]</i></span>
     <% if (kara.hasOwnProperty('position')) { %>
-        <span class="karaElement p-3 bd-highlight"><b><%= kara.position %></b></span>
+        <span class="karaElement p-3 bd-highlight karaPosition"><b><%= kara.position %></b></span>
     <% } %>
     <div class="karaElement p-2 bd-highlight">
         <div class="d-flex flex-row bd-highlight mb-3 btn-group karaActionBtnGroup" role="group">
diff --git a/main.js b/main.js
index bd76f2a561ff6c7d0bdb1474713a2fbd830ff18d..56ff2da3921ff53eb4484591f5f292b5fd8d4b56 100644
--- a/main.js
+++ b/main.js
@@ -144,7 +144,9 @@ app.on('ready', () => {
                 }
             });
     });
-    setTimeout(() => {lkt.idleActualisation();},500);
+    setTimeout(() => {
+        lkt.idleActualisation();
+    }, 500);
     lektor.on('close', code => {
         logger.warn('main', `Lektor exited with code ${code}`);
         lektor_closed = true;
@@ -205,10 +207,19 @@ ipcMain.on('reload-queue-request', (event, arg) => {
 });
 
 ipcMain.on('verify-queue-reloaded-request', (event, arg) => {
-    if(lkt.isQueueUpdated()) {
+    if (lkt.isQueueUpdated()) {
         lkt.setQueueUpdated(false);
         myDb.queue(0, 100).then(karas => {
             event.reply('reload-queue-responce', karas);
         });
     }
 });
+
+ipcMain.on('queue-moved-kara', (event, movement) => {
+    logger.debug('bonjour', 'bonjour');
+    if (movement.to != movement.from) {
+        lkt.commandMove(movement.from, movement.to).then(arg => {
+            event.reply('queue-moved-responce');
+        });
+    }
+});