diff --git a/index.js b/index.js
index e7e97d7..c5c4d2b 100644
--- a/index.js
+++ b/index.js
@@ -25,7 +25,7 @@ router.get('/hello', function(request, response) {
 
 router.get('/broadcastPing', function(request, response) {
     response.end('Ok');
-    broadcast(config.yahoomessenger.report_to, 'PING');
+    ym.broadcast(config.yahoomessenger.report_to, 'PING');
 });
 
 router.get('/status', function(request, response) {
@@ -54,13 +54,9 @@ router.get('/relogin/:apikey', function(request, response) {
         return;
     }
 
-    logger.info("Logging out");
-    YahooMessenger.logout();
-
-    logger.info("Logout");
-    clearTimeout(keepAliveTimer);
-
-    ymLogin();
+    logger.info("Got relogin request by http");
+    ym.relogin();
+    response.end('Ok');
 });
 
 logger.info("Starting http server on port " + config.httpserver.listen_port);
diff --git a/ym.js b/ym.js
index 8604c50..7ce4a9f 100644
--- a/ym.js
+++ b/ym.js
@@ -2,6 +2,11 @@ var YahooMessenger = require("yahoomessenger");
 var striptags = require('striptags');
 var db = require('./db.js');
 
+var oldMessages = [];
+
+var config;
+var logger;
+
 function insertMessages(db_connection, logger_id, direction, partner, message, sentdate) {
 
     db_connection.query(
@@ -23,56 +28,65 @@ function insertMessages(db_connection, logger_id, direction, partner, message, s
     );
 }
 
-function start(config, logger) {
-    var oldMessages = [];
+function pm(destination, message) {
+    logger.info("Sending to " + destination + ": " + message);
 
-    var keepAliveTimer;
+    YahooMessenger.sendPM(destination, message);
+}
 
-    var _keepAliveLoop = function() {
-        logger.info('Keep alive loop');
 
-        YahooMessenger.keepAlive();
-        keepAliveLoop();
-    }
+function broadcast(destinations, message, exclude) {
+    var destinations = destinations.split(',');
+    var destinationCount = destinations.length;
 
-    function isAdmin(user) {
-      var admins = config.yahoomessenger.admin.split(',');
+    for (var i=0; i < destinationCount; i++) {
+        destination = destinations[i];
+        if (destination == exclude) {
+            continue;
+        }
 
-      return (admins.indexOf(user) >= 0);
+        pm(destination, message);
     }
+}
 
-    function keepAliveLoop() {
-        keepAliveTimer = setTimeout(_keepAliveLoop, config.yahoomessenger.keepalive_interval * 1000);
-    }
+var keepAliveTimer;
 
-    function login(){
-        logger.info("Login to YM as " + config.yahoomessenger.username)
-        YahooMessenger.login(config.yahoomessenger.username, config.yahoomessenger.password);
-    }
+var _keepAliveLoop = function() {
+    logger.info('Keep alive loop');
 
-    function pm(destination, message) {
-        logger.info("Sending to " + destination + ": " + message);
+    YahooMessenger.keepAlive();
+    keepAliveLoop();
+}
 
-        YahooMessenger.sendPM(destination, message);
-    }
+function isAdmin(user) {
+  var admins = config.yahoomessenger.admin.split(',');
 
-    function sendPM(destination, message) {
-        pm(destination, message);
-    }
+  return (admins.indexOf(user) >= 0);
+}
 
-    function broadcast(destinations, message, exclude) {
-        var destinations = destinations.split(',');
-        var destinationCount = destinations.length;
+function keepAliveLoop() {
+    keepAliveTimer = setTimeout(_keepAliveLoop, config.yahoomessenger.keepalive_interval * 1000);
+}
 
-        for (var i=0; i < destinationCount; i++) {
-            destination = destinations[i];
-            if (destination == exclude) {
-                continue;
-            }
+function login(){
+    logger.info("Login to YM as " + config.yahoomessenger.username)
+    YahooMessenger.login(config.yahoomessenger.username, config.yahoomessenger.password);
+}
 
-            sendPM(destination, message);
-        }
-    }
+function logout() {
+    logger.info("Logout from YM");
+    clearTimeout(keepAliveTimer);
+    YahooMessenger.logout();
+}
+
+function relogin() {
+    logout();
+    YahooMessenger.newInstance();
+}
+
+function start(_config, _logger) {
+    config = _config;
+    logger = _logger;
 
     function onReady() {
         login();
@@ -152,7 +166,7 @@ function start(config, logger) {
                 }
 
                 logger.info('Forward to ' + target + ': ' + messageToForward);
-                sendPM(target, '@' + partner + ': ' + messageToForward);
+                pm(target, '@' + partner + ': ' + messageToForward);
 
             } else if (message.charAt(0) == '+') {
                 target = message.split(' ', 1).join();
@@ -164,7 +178,7 @@ function start(config, logger) {
                 }
 
                 logger.info('Clean forward to ' + target + ': ' + messageToForward);
-                sendPM(target, messageToForward);
+                pm(target, messageToForward);
             }
         }
     }
@@ -182,3 +196,7 @@ function start(config, logger) {
 }
 
 exports.start = start;
+exports.broadcast = broadcast;
+exports.pm = pm;
+exports.logout = logout;
+exports.relogin = relogin;