diff --git a/index.js b/index.js
index e69de29..fbc28e6 100644
--- a/index.js
+++ b/index.js
@@ -0,0 +1,132 @@
+var request = require('request');
+var http = require('http');
+var url = require('url');
+var fs = require('fs');
+var ini = require('ini');
+var strftime = require('strftime');
+var xmpp = require('simple-xmpp');
+var winston = require('winston');
+
+var config = ini.parse(fs.readFileSync(__dirname + '/config.ini', 'utf-8'));
+
+var warming_up = true;
+
+var log_level = 'info';
+if (config.globals.log_level) {
+    log_level = config.globals.log_level;
+}
+
+var logger = new (winston.Logger)({
+  transports: [
+    new (winston.transports.Console)({
+        timestamp: function() {
+            return strftime('%F %T', new Date());
+        },
+        level: log_level
+    }),
+    new (winston.transports.DailyRotateFile)({
+        filename: __dirname + '/logs/log',
+        timestamp: function() {
+            return strftime('%F %T', new Date());
+        },
+        level: log_level
+    })
+  ]
+});
+
+function onHttpIncomingMessage(request, response) {
+    var qs = url.parse(request.url, true).query;
+    logger.info("onHttpIncomingMessage()", {qs: qs});
+    
+    logger.info('Sending message to ' + qs.to + ': ' + qs.msg);
+    ym.sendPM(qs.to, qs.msg);
+    response.end('OK');
+}
+
+
+function createHttpListener() {
+
+    var httpServer = http.createServer(function(request,response){
+    
+    var qs = url.parse(request.url, true).query;
+        logger.verbose('Incoming message from EVO', {qs: qs});
+        response.end('OK');
+        
+        sendMessage(qs.PhoneNumber, qs.text);
+    });
+    
+    httpServer.listen(config.globals.listen_port, function(){
+        logger.info("HTTP server listening on " + config.globals.listen_port);
+    })
+}
+
+function sendMessage(destination, message) {
+    logger.info('Sending xmpp message', {destination: destination, message: message});
+    xmpp.send(destination, message);
+}
+
+function reportToEvo(from, message) {
+    var opts = {
+        url: config.globals.evo_url,
+        qs: {
+            msg: message,
+            msisdn: from,
+            smsc: config.globals.smsc,
+            ts: strftime('%F %T'),
+        }
+    };
+    
+    logger.info("Forwarding message to evo", {request_opts: opts});
+    request(opts, function(err, response, body) {
+        if (err) {
+            logger.warn('Error forwarding to evo: ' + err);
+            return;
+        }
+    });
+    
+}
+
+xmpp.on('online', function(data) {
+    logger.info('XMPP online', {data: data});
+    logger.info('Connected with JID: ' + data.jid.user);
+    
+    setTimeout(function() {
+        warming_up = false;
+        logger.info('BOT selesai warming up, pesan-pesan selanjutnya akan diproses');
+    }, config.globals.warming_up);
+});
+
+xmpp.on('chat', function(from, message) {
+    logger.info('Incoming message via XMPP ', {from: from, message: message});
+    
+    if (warming_up) {
+        logger.info('BOT masih dalam tahap warming up, abaikan pesan');
+        var response_message = 'Pesan diabaikan. Silahkan diulang kembali: ' + message;
+        sendMessage(from, response_message);
+        return;
+    }
+    
+    var response_message = 'Pesan anda telah diterima dan akan segera diproses: ' + message;
+    sendMessage(from, response_message);
+    
+    reportToEvo(from, message);
+});
+
+xmpp.on('error', function(err) {
+    logger.warn('XMPP error', {err: err});
+});
+
+xmpp.on('subscribe', function(from) {
+    logger.warn('XMPP subscribe request from ' + from);
+    xmpp.acceptSubscription(from);
+});
+
+xmpp.connect({
+        jid: config.globals.jid,
+        password: config.globals.password,
+});
+
+// check for incoming subscription requests
+xmpp.getRoster();
+
+createHttpListener();