diff --git a/index.js b/index.js
new file mode 100644
index 0000000..d32f084
--- /dev/null
+++ b/index.js
@@ -0,0 +1,26 @@
+var fs = require('fs');
+var ini = require('ini');
+var expresso = require('sate24-expresso');
+var config = ini.parse(fs.readFileSync(__dirname + '/config.ini', 'utf-8'));
+
+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-bayarkilat.js');
+
+var matrix = aaa.prepareMatrix();
+
+var options = {
+    'aaa': aaa,
+    'logger': logger,
+    'config': config,
+    'matrix': matrix,
+}
+
+var httpServer = HttpServer.start(config, options);
+
+partner.start(config, aaa.callbackReport, options);
+aaa.start(config, partner, options);
+expresso.start(options);
diff --git a/package.json b/package.json
index 325c22a..e457ac1 100644
--- a/package.json
+++ b/package.json
@@ -18,5 +18,12 @@
     "bayarkilat"
   ],
   "author": "Adhidarma Hadiwinoto <me@adhisimon.org>",
-  "license": "ISC"
+  "license": "ISC",
+  "dependencies": {
+    "sate24": "git+http://gitlab.kodesumber.com/reload97/node-sate24.git",
+    "sate24-expresso": "git+http://gitlab.kodesumber.com/reload97/sate24-expresso.git"
+  },
+  "devDependencies": {
+    "should": "^9.0.2"
+  }
 }
diff --git a/partner-bayarkilat.js b/partner-bayarkilat.js
new file mode 100644
index 0000000..56552de
--- /dev/null
+++ b/partner-bayarkilat.js
@@ -0,0 +1,87 @@
+var request = require('request');
+var url = require('url');
+var winston = require('winston');
+
+var config;
+var aaa;
+var callbackReport;
+var logger;
+
+function start(_config, _callbackReport, options) {
+    config = _config;
+    callbackReport = _callbackReport;
+
+    if (options && options.aaa) {
+            aaa = options.aaa;
+    }
+
+    if (options && options.logger) {
+        logger = options.logger;
+    } else {
+        logger = new winston.Logger({
+            transports: [
+              new (winston.transports.Console)()
+            ]
+        });
+    }
+}
+
+
+function topupRequest(task, retry) {
+    aaa.insertTaskToMongoDb(task);
+
+    var partnerUrl = url.parse(config.h2h_out.partner);
+    var product = prepareRemoteProductCode(task.remoteProduct);
+
+    var options = {
+        host: partnerUrl.hostname,
+        path: partnerUrl.pathname,
+        port: partnerUrl.port,
+        qs: {
+            request: 'PURCHASE*'
+                + task.requestId + '*'
+                + product.product + '*'
+                + product.productDetail + '*'
+                + task.destination + '*'
+                + task.nominal + '*'
+                + '0*'
+                + config.h2h_out.noid + '*'
+                + config.h2h_out.userid + '*'
+                + config.h2h_out.password
+        }
+    };
+
+    request(options, function(error, response, body) {
+        if (error) {
+            logger.warn('Error requesting to partner', {error: error});
+            callbackReport(task.requestId, '68', 'Error requesting to partner. ' + error);
+            return;
+        }
+
+        if (response.statusCode != 200) {
+            var message = 'Partner response with http status code other that 200 (' + response.statusCode +')';
+
+            logger.warn(message);
+            callbackReport(task.requestId, '68', message);
+            return;
+        }
+
+        callbackReport(task.requestId, '68', body);
+    });
+}
+
+function prepareRemoteProductCode(remoteProduct) {
+    var product = remoteProduct.split(',');
+
+    if (product.length != 3) {
+        return;
+    }
+
+    return {
+        product: product[0],
+        productDetail: product[1],
+        nominal: product[2]
+    }
+}
+
+exports.prepareRemoteProductCode = prepareRemoteProductCode;
diff --git a/test.js b/test.js
new file mode 100644
index 0000000..98bfb09
--- /dev/null
+++ b/test.js
@@ -0,0 +1,15 @@
+var should = require('should');
+var partner = require('./partner-bayarkilat');
+
+describe('#partner-bayarkilat', function() {
+
+    describe('#prepareRemoteProductCode', function() {
+        product = partner.prepareRemoteProductCode('PULSA,TELKOMSEL10,10000');
+
+        it('should return correct object', function() {
+            product.product.should.equal('PULSA');
+            product.productDetail.should.equal('TELKOMSEL10');
+            product.nominal.should.equal('10000');
+        });
+    });
+});