diff --git a/im.js b/im.js
deleted file mode 100644
index 6ec4ff2..0000000
--- a/im.js
+++ /dev/null
@@ -1,331 +0,0 @@
-var redis = require('redis');
-var moment = require('moment');
-var LRU = require('lru-cache');
-
-var config;
-var logger;
-var partner;
-var imConfig;
-var redisClient;
-
-var resendHandlers = LRU({max: 2000, maxAge: 1000 * 3600 * 36});
-
-function dumpStats() {
-    if (config.globals.auto_resend_delay_secs) {
-        logger.verbose('DUMP STATS', {
-            'resendHandlers:length': resendHandlers.length,
-            'resendHandlers:itemCount': resendHandlers.itemCount,
-        });
-    }
-}
-
-function dumpStatsPeriodic() {
-    var dumpStatsInterval = 1000 * 120;
-    if (config.globals.dump_stats_interval_secs) {
-        dumpStatsInterval = config.globals.dump_stats_interval_secs * 1000;
-    }
-    logger.verbose('Dump stats every ' + dumpStatsInterval / 1000 + ' secs (override it with config.globals.dump_stats_interval_secs)');
-    setInterval(dumpStats, dumpStatsInterval);
-}
-
-function init(options) {
-    if (options && options.config) {
-        config = options.config;
-    }
-
-    if (options && options.logger) {
-        logger = options.logger;
-    }
-
-    if (options && options.partner) {
-        partner = options.partner;
-    }
-
-    createRedisClient(config.globals.redis_host, config.globals.redis_port);
-    readImConfig();
-
-    dumpStatsPeriodic();
-}
-
-function createRedisClient(host, port) {
-    try {
-        redisClient = redis.createClient(port, host);
-    } catch(err) {
-        logger.warn("Error creating redis client to " + host + ':' + port);
-    }
-}
-
-function readImConfig(filename) {
-
-    if (!filename) {
-        filename = process.cwd() + '/config.im.json';
-    }
-
-    try {
-        imConfig = require(filename);
-    }
-    catch(e) {
-        imConfig = {};
-    }
-
-    logger.verbose('IM Config', {imConfig: imConfig});
-    return imConfig;
-}
-
-function getPatternFromMessage(message, pattern, patternMatchIndex) {
-    var re = new RegExp(pattern);
-    var matches = message.match(re);
-
-    if (!matches) {
-        return null;
-    }
-
-    if (patternMatchIndex < matches.length) {
-        return matches[patternMatchIndex];
-    } else {
-        return null;
-    }
-}
-
-function getPatternsFromMessage(message, patterns) {
-    var patternCount = patterns.length;
-    for (var i = 0; i < patternCount; i++) {
-
-        var pattern = patterns[i];
-
-        var result = getPatternFromMessage(message, pattern.pattern, pattern.matchIndex);
-        if (result) {
-            return result;
-        }
-    }
-}
-
-function getTaskKey(task, chipInfo, today) {
-    if (!chipInfo && config && config.globals && config.globals.gateway_name) {
-        chipInfo = config.globals.gateway_name;
-    }
-
-    if (task.timestamp && !today) {
-        today = moment(task.timestamp, 'YYYYMMDDHHmmss').format('YYYYMMDD');
-    }
-
-    return chipInfo + '.trx.date:' + today + '.rProduct:' + task.remoteProduct.toUpperCase() + '.dest:' + task.destination ;
-}
-
-function saveTask(task, cb) {
-    var key = getTaskKey(task, config.globals.gateway_name);
-    logger.verbose('Saving task', {key: key, task: task});
-
-    redisClient.set(key, JSON.stringify(task), function() {
-        redisClient.expire(key, 3600*24);
-        if (cb) {
-            cb();
-        }
-    });
-}
-
-function getTask(remoteProduct, destination, cb) {
-    var dummyTask = {
-        remoteProduct: remoteProduct,
-        destination: destination,
-    }
-
-    var key = getTaskKey(dummyTask, config.globals.gateway_name, moment().format('YYYYMMDD'));
-    redisClient.get(key, function(err, result) {
-        if (err) {
-            logger.verbose('getTask: task not found', {key: key, params: dummyTask});
-
-            cb(err, null);
-            return;
-        }
-
-        var task = {};
-
-        try {
-            task = JSON.parse(result);
-        }
-        catch(e) {
-            logger.warn('getTask: Can not parse result', {key: key, params: dummyTask, data: result});
-            err = "Can not parse result"
-        }
-        cb(err, task);
-    });
-}
-
-function deleteTask(remoteProduct, destination) {
-    var dummyTask = {
-        remoteProduct: remoteProduct,
-        destination: destination,
-    }
-
-    var key = getTaskKey(dummyTask, config.globals.gateway_name, moment().format('YYYYMMDD'));
-
-    try {
-        redisClient.del(key);
-    }
-    catch(e) {};
-}
-
-function createMessage(pattern, keywords) {
-    var msg = pattern;
-
-    for (var key in keywords) {
-        msg = msg.replace('[' + key + ']', keywords[key]);
-    }
-    return msg;
-}
-
-function getRemoteProductFromMessage(msg) {
-    return getPatternsFromMessage(msg, imConfig.product_patterns);
-}
-
-function getDestinationFromMessage(msg) {
-    return getPatternsFromMessage(msg, imConfig.destination_patterns);
-}
-
-function getSnFromMessage(msg) {
-    return getPatternsFromMessage(msg, imConfig.sn_patterns);
-}
-
-function getRcFromMessage(msg) {
-    var rcs = imConfig.response_codes;
-    var rcsCount = rcs.length;
-
-    for (var i = 0; i < rcsCount; i++) {
-
-        var item = rcs[i];
-        var re = new RegExp(item.pattern);
-        if (msg.search(re) != -1) {
-            return item.rc;
-        }
-
-    }
-    return '68';
-}
-
-function isAllowedFrom(sender) {
-    if (!config || !config.h2h_out || !config.h2h_out.allowed_response_from) {
-        return true;
-    }
-
-    whitelist = config.h2h_out.allowed_response_from.split(',');
-    whitelistCount = whitelist.length;
-
-    for(var i=0; i<whitelistCount; i++) {
-        if (sender == whitelist[i]) {
-            return true;
-        }
-    }
-
-    return false;
-}
-
-function checkForSameDayDuplicate(task, cbNoDupe, cbDupe, cbDupeWithSameReqId) {
-    getTask(task.remoteProduct, task.destination, function(err, archivedTask) {
-        if (err) {
-            logger.warn('Error on checking same day duplicate', {task: task});
-            cbNoDupe(task);
-            return;
-        }
-
-        if (archivedTask && archivedTask.requestId) {
-            if (cbDupeWithSameReqId && task.requestId == archivedTask.requestId) {
-                logger.verbose('Duplicate trx on same day with same requestId', {task: task});
-                cbDupeWithSameReqId(task, archivedTask);
-                return;
-            }
-
-            logger.verbose('Duplicate trx on same day', {task: task, archivedTask: archivedTask});
-            cbDupe(task, archivedTask);
-            return;
-        }
-
-        cbNoDupe(task);
-    });
-}
-
-function registerResendDelay(task) {
-    if (!task.requestId) {
-        logger.warn('Invalid task on resendDelay')
-        return;
-    }
-
-    if (!config || !config.globals || !Number(config.globals.auto_resend_delay_secs)) {
-        return;
-    }
-
-    if (!partner || !partner.topupRequest) {
-        logger.warn('Skip request resend delay because partner.topupRequest is not exists');
-        return;
-    }
-
-    var retry = 10;
-    var oldHandler = resendHandlers.get(task.requestId);
-    if (oldHandler) {
-        retry = oldHandler.retry - 1;
-
-        try {
-            cancelResendDelay(task);
-        }
-        catch(e) {}
-    }
-
-    if (retry <= 0) {
-        logger.verbose('Resend delay retry exceeded', {task: task});
-        cancelResendDelay(task);
-        return;
-    }
-
-    logger.verbose('Registering resend delay task request', {task: task, delay: config.globals.auto_resend_delay_secs, retry: retry});
-    var handlerData = {
-        handler: setTimeout(partner.topupRequest, config.globals.auto_resend_delay_secs * 1000, task),
-        task: task,
-        retry: retry
-    }
-
-    resendHandlers.set(task.requestId, handlerData);
-}
-
-function cancelResendDelay(task) {
-    if (!task || !task.requestId) {
-        logger.warn('Invalid task on cancelResendDelay');
-        return;
-    }
-
-    var oldHandler = resendHandlers.get(task.requestId);
-    if (!oldHandler) {
-        return;
-    }
-
-    logger.verbose('Canceling resend delay', {task: task});
-
-    try {
-        if (oldHandler.handler) {
-            clearTimeout(oldHandler.handler);
-        }
-    }
-    catch(e) {};
-
-    try {
-        resendHandlers.del(task.requestId);
-    }
-    catch(e) {};
-}
-
-exports.init = init;
-exports.start = init;
-exports.getPatternFromMessage = getPatternFromMessage;
-exports.getPatternsFromMessage = getPatternsFromMessage;
-exports.saveTask = saveTask;
-exports.getTask = getTask;
-exports.readImConfig = readImConfig;
-exports.createMessage = createMessage;
-exports.getRemoteProductFromMessage = getRemoteProductFromMessage;
-exports.getDestinationFromMessage = getDestinationFromMessage;
-exports.getRcFromMessage = getRcFromMessage;
-exports.getSnFromMessage = getSnFromMessage;
-exports.isAllowedFrom = isAllowedFrom;
-exports.checkForSameDayDuplicate = checkForSameDayDuplicate;
-exports.deleteTask = deleteTask;
-exports.registerResendDelay = registerResendDelay;
-exports.cancelResendDelay = cancelResendDelay;
diff --git a/package.json b/package.json
index b6abb83..3500f3d 100644
--- a/package.json
+++ b/package.json
@@ -22,7 +22,6 @@
   "author": "Adhidarma Hadiwinoto <me@adhisimon.org>",
   "license": "ISC",
   "dependencies": {
-    "lru-cache": "^4.0.1",
     "sate24": "git+http://gitlab.kodesumber.com/reload97/node-sate24.git",
     "sate24-expresso": "git+http://gitlab.kodesumber.com/reload97/sate24-expresso.git",
     "yahoomessenger": "^0.1.3-Beta"
diff --git a/partner-ym.js b/partner-ym.js
index d67f5df..7c177ca 100644
--- a/partner-ym.js
+++ b/partner-ym.js
@@ -1,4 +1,4 @@
-var im = require('./im.js')
+var im = require('sate24/im.js')
 var YM = require('yahoomessenger');
 var imAdaptor = require('./adaptor-ym');