diff --git a/adaptor-ym.js b/adaptor-ym.js
index de7d145..9c90793 100644
--- a/adaptor-ym.js
+++ b/adaptor-ym.js
@@ -10,10 +10,10 @@ function onReady() {
     YM.login(username, password);
 }
 
-function onLoginSuccessful(data) {
+function onOnline(data) {
     logger.info('YM login successful', {data: data});
-    if (callbacks.onLoginSuccessful) {
-        callbacks.onLoginSuccessful();
+    if (callbacks.onOnline) {
+        callbacks.onOnline();
     }
 }
 
@@ -43,7 +43,7 @@ function init(_username, _password, _logger, _callbacks) {
     callbacks = _callbacks;
 
     YM.on('ready', onReady);
-    YM.on('loginSuccessful', onLoginSuccessful);
+    YM.on('loginSuccessful', onOnline);
     YM.on('loginError', onLoginError);
     YM.on('friendsList', onFriendsList);
     YM.on('pm', onPM);
diff --git a/index.js b/index.js
index 06ed839..18e575c 100644
--- a/index.js
+++ b/index.js
@@ -1,7 +1,6 @@
 var fs = require('fs');
 var ini = require('ini');
 var expresso = require('sate24-expresso');
-var partner = require('./partner-ym');
 var config = ini.parse(fs.readFileSync(__dirname + '/config.ini', 'utf-8'));
 
 process.chdir(__dirname);
@@ -9,7 +8,9 @@ process.chdir(__dirname);
 var logger = require('sate24/logger.js').start();
 var HttpServer = require('sate24/httpserver.js');
 var aaa = require('sate24/aaa.js');
-var partner = require('./partner-ym.js');
+var partner = require('sate24/partner-im.js');
+var imAdaptor = require('./adaptor-ym');
+
 
 var matrix = aaa.prepareMatrix();
 
@@ -19,6 +20,7 @@ var options = {
     'config': config,
     'matrix': matrix,
     'partner': partner,
+    'imAdaptor': imAdaptor
 }
 
 var httpServer = HttpServer.start(config, options);
diff --git a/partner-ym.js b/partner-ym.js
deleted file mode 100644
index 7c177ca..0000000
--- a/partner-ym.js
+++ /dev/null
@@ -1,141 +0,0 @@
-var im = require('sate24/im.js')
-var YM = require('yahoomessenger');
-var imAdaptor = require('./adaptor-ym');
-
-var config;
-var aaa;
-var logger;
-var callbackReport;
-
-function onLoginSuccessful() {
-    logger.info('Login successful, resuming aaa communication');
-    aaa.resume();
-}
-
-function onPM(from, msg) {
-
-    if (!im.isAllowedFrom(from)) {
-        logger.info('Ignoring message from unknown sender', {from: from, msg: msg});
-        return;
-    }
-
-    var remoteProduct = im.getRemoteProductFromMessage(msg);
-    var destination = im.getDestinationFromMessage(msg);
-
-    if (!remoteProduct && !destination) {
-        logger.warn('Missing remote product or destination', {remoteProduct: remoteProduct, destination: destination, msg: msg});
-        return;
-    }
-
-    logger.info('Got report from partner', {remoteProduct: remoteProduct, destination: destination, msg: msg});
-    im.getTask(remoteProduct, destination, function(err, task) {
-        if (err) {
-            logger.warn('Error getting relevant task');
-            return;
-        }
-
-        if (!task) {
-            logger.warn('Something wrong, undefined task without error')
-            return;
-        }
-
-        logger.verbose('Got relevant task', {task: task, msg: msg});
-        var rc = im.getRcFromMessage(msg);
-        if (rc == '00') {
-            var sn = im.getSnFromMessage(msg);
-            if (sn) {
-                msg = 'SN=' + sn + ';' + msg;
-            }
-        }
-
-        if (['00', '55', '68'].indexOf(rc) == -1) {
-            im.deleteTask(remoteProduct, destination);
-        }
-
-        if (rc != '68') {
-            im.cancelResendDelay(task);
-        }
-
-        callbackReport(task.requestId, rc, msg);
-    });
-}
-
-function start(options) {
-    if (options && options.config) {
-            config = options.config;
-    } else {
-        console.log('Unknown options.config');
-        process.exit('1');
-    }
-
-    if (options && options.aaa) {
-        aaa = options.aaa;
-    }
-
-    if (options && options.aaa && options.aaa.callbackReport) {
-        callbackReport = options.aaa.callbackReport;
-    } else {
-        console.log('Unknown options.aaa.callbackReport')
-        process.exit(2);
-    }
-
-    if (options && options.logger) {
-        logger = options.logger;
-    } else {
-        logger = new winston.Logger({
-            transports: [
-              new (winston.transports.Console)()
-            ]
-        });
-    }
-
-    var callbacks = {
-        onLoginSuccessful: onLoginSuccessful,
-        onPM: onPM,
-    }
-
-    im.init(options);
-    imAdaptor.init(config.h2h_out.ym_id, config.h2h_out.ym_password, logger, callbacks);
-}
-
-function onSameDayDupe(task, archivedTask) {
-    if (task.requestId == archivedTask.requestId) {
-        logger.info('Mengulang trx untuk advice', {task: task});
-        _topupRequest(task);
-    } else {
-        logger.info('Terdeteksi trx sama dalam satu hari yang sama', {task: task});
-        callbackReport(task.requestId, '55', 'Terdeteksi trx sama dalam satu hari yang sama');
-    }
-}
-
-function _topupRequest(task) {
-    var pattern = config.h2h_out.request_pattern;
-
-    var keywords = {
-        remoteProduct: task.remoteProduct,
-        destination: task.destination,
-        pin: config.h2h_out.pin
-    }
-
-    im.saveTask(task, function() {
-        im.registerResendDelay(task);
-
-        var msg = im.createMessage(pattern, keywords);
-        imAdaptor.sendMessage(config.h2h_out.partner, msg);
-    });
-
-}
-
-function topupRequest(task) {
-    if (!aaa.isTodayTrx(task)) {
-        logger.warn('Maaf, transaksi beda hari tidak dapat dilakukan');
-        callbackReport(task.requestId, '68', 'Maaf, transaksi beda hari tidak dapat dilakukan');
-        im.cancelResendDelay(task);
-        return;
-    }
-
-    im.checkForSameDayDuplicate(task, _topupRequest, onSameDayDupe, _topupRequest);
-}
-
-exports.start = start;
-exports.topupRequest = topupRequest;
diff --git a/sample.config.ini b/sample.config.ini
index 19f41e2..88ebed8 100644
--- a/sample.config.ini
+++ b/sample.config.ini
@@ -8,12 +8,12 @@ apikey=123497
 redis_host=localhost
 redis_port=6379
 balance_regex=Saldo: Rp (\d+?)\.
-auto_resend_delay_secs=120
+auto_resend_delay_secs=300
 dump_stats_interval_secs=300
 
 [h2h_out]
-ym_id=myymid
-ym_password=mypassword
+im_username=myymid
+im_password=mypassword
 partner=partnerymid
 allow_response_from=partnerymid
 pin=1234