diff --git a/scripts/nfc-poll-wrapper.sh b/scripts/nfc-poll-wrapper.sh
index 384a9e769e46e133ec1c1185a6e3ce4029d07ba5..21ef17ef29b47cf5497408edb33afabac662a2dc 100755
--- a/scripts/nfc-poll-wrapper.sh
+++ b/scripts/nfc-poll-wrapper.sh
@@ -7,8 +7,8 @@ do
   then
     echo $res
     echo "11ff11 0.2" > /dev/rgb_pipe
+    sleep 1
   else
     echo "ff1111 0.2" > /dev/rgb_pipe
   fi
-  sleep 1
 done
diff --git a/server/index.js b/server/index.js
index 7efe6a45dcd3ce7cd31425cddd23f4946614f49e..39c74b06a2c9a4a45022d796afd446af84b02976 100644
--- a/server/index.js
+++ b/server/index.js
@@ -4,36 +4,45 @@ const {
   uuid, fontSize, rowHeight, port, api,
 } = require('./config');
 
-const dummyResponse = require('./dummyResponse.json');
-
 const io = require('socket.io')(port || 3000);
 const { createSignedJWT, interval } = require('./utils');
 
+const { spawn } = require('child_process');
+
+const dummyResponse = require('./dummyResponse.json');
+
 const useDummy = false;
 
+
+const doScreenApiRequest = (socket, userid = null) => {
+  const query = userid ? `?userid=${userid}` : '';
+  return fetch(`${api.url}/${api.version}/screen/${uuid}${query}`, {
+    headers: {
+      Autorization: `Bearer ${createSignedJWT()}`,
+    },
+  })
+    .then(rawRes => rawRes.json())
+    .then((res) => {
+      socket.emit('panel_data', res);
+      return res.ttl;
+    })
+    .catch(console.log);
+};
+
+
+const setChrono = (socket) => {
+  if (useDummy) {
+    return interval(() => socket.emit('panel_data', dummyResponse), 0);
+  }
+  return interval(() => doScreenApiRequest(socket), 0);
+};
+
+
 io.of('/').on('connection', (socket) => {
   socket.emit('config', { fontSize, rowHeight });
 
-  const chrono = useDummy
-    ? interval(() => {
-      socket.emit('panel_data', dummyResponse);
-      return 15000;
-    }, 0)
-    : interval(
-      () =>
-        fetch(`${api.url}/${api.version}/screen/${uuid}`, {
-          headers: {
-            Autorization: `Bearer ${createSignedJWT()}`,
-          },
-        })
-          .then(rawRes => rawRes.json())
-          .then((res) => {
-            socket.emit('panel_data', res);
-            return res.ttl;
-          })
-          .catch(console.log),
-      0,
-    );
+  const chrono = setChrono(socket);
+  chrono.start();
 
   // Respond to date message with the date
   socket.on('date', () => {
@@ -43,4 +52,13 @@ io.of('/').on('connection', (socket) => {
   socket.on('disconnect', () => {
     chrono.stop();
   });
+
+  const badgeChild = spawn('scripts/nfc-poll-wrapper-dummy.sh');
+
+  badgeChild.stdout.on('data', (data0) => {
+    const userid = data0.toString().trim();
+    console.log(`child stdout: ${userid}`);
+
+    doScreenApiRequest(socket, userid).then(ttl => chrono.restart(ttl));
+  });
 });
diff --git a/server/utils.js b/server/utils.js
index ebc10574df921d9bdaa3a993e0311fcf4a32c9be..424c9f01836ee146928fdbacd6b223e0d2fe5918 100644
--- a/server/utils.js
+++ b/server/utils.js
@@ -56,12 +56,12 @@ const interval = (fn, initialTTL, output = {}) => {
         Object.assign(output, getOutput(getTimeout(0)));
         return output;
       },
+      stop,
       restart: (ttl) => {
         stop();
         Object.assign(output, getOutput(getTimeout(ttl || initialTTL)));
         return output;
       },
-      stop,
       restartNow: () => {
         stop();
         Object.assign(output, getOutput(getTimeout(0)));