diff --git a/partner-kospinjasa.js b/partner-kospinjasa.js
index 4482ca9..166d97b 100644
--- a/partner-kospinjasa.js
+++ b/partner-kospinjasa.js
@@ -83,7 +83,15 @@ function topupRequestSoap(task, params, retry) {
         logger.info('Requesting to service', {url: config.h2h_out.partner, params: _params});
 
         soapClient.apih2h.apih2hPort.billpayment({ inputCheck: _params }, function(err, result) {
-            logger.info('Got response', {lastRequest: soapClient.lastRequest, lastMessage: soapClient.lastMessage, lastEndpoint: soapClient.lastEndpoint});
+            logger.verbose(
+                'Got response',
+                {
+                    lastEndpoint: soapClient.lastEndpoint,
+                    lastRequest: soapClient.lastRequest,
+                    lastMessage: soapClient.lastMessage,
+                    lastResponse: soapClient.lastResponse,
+                }
+            );
 
             if (err) {
                 logger.warn('Error requesting service', {err: err});
@@ -91,62 +99,128 @@ function topupRequestSoap(task, params, retry) {
                 return;
             }
 
-            var responseMessageToST24 = result.outputParameter.resultCode.$value + ' - ' + result.outputParameter.resultDesc.$value;
-
-            logger.info('Got result: ' + responseMessageToST24, {result: result});
-
-            callbackReport(task.requestId, '68', responseMessageToST24);
+            topupResponseHandler(task, result);
         });
     });
 }
 
-function topupRequestSoapDIY(task, params, retry) {
-    var message = whiskers.render(soapTemplate, params);
-    logger.verbose("Generating SOAP message", {message: message});
-
-    var partnerUrl = url.parse(config.h2h_out.partner_endpoint);
-    var postRequest = {
-        host: partnerUrl.hostname,
-        path: partnerUrl.path,
-        port: partnerUrl.port,
-        method: "POST",
-        headers: {
-            'Content-Type': 'text/xml',
-            'Content-Length': Buffer.byteLength(message),
-            //'SOAPAction': "urn:apih2h#billpayment"
-        }
-    };
-
-    logger.info('POST to partner', {postRequest: postRequest});
-    var req = http.request(postRequest, function( res ) {
-
-        logger.verbose('Request status code: ' + res.statusCode );
-        var buffer = "";
-
-        res.on( "data", function( data ) {
-            buffer = buffer + data;
-        });
-
-        res.on( "end", function( data ) {
-            topupResponseHandler(buffer, task);
-        });
+function topupResponseHandler(task, response) {
+    var st24rc = '68';
+    var st24message = response.outputParameter.resultDesc.$value;
 
-    });
-
-    req.on('error', function(e) {
-        logger.warn('problem with request: ' + e.message);
-        callbackReport(task.requestId, '68', e.message);
+    if ( response.outputParameter.resultCode.$value == '001' ) {
+        // product disabled
+        st24rc = '13';
+    }
+    else if ( response.outputParameter.resultCode.$value == '002' ) {
+        // prodcode disable
+        st24rc = '13';
+    }
+    else if ( response.outputParameter.resultCode.$value == '003' ) {
+        // duplicate reff
+        st24rc = '55';
+    }
+    else if ( response.outputParameter.resultCode.$value == '004' ) {
+        // not enough balance
+        st24rc = '40';
+    }
+    else if ( response.outputParameter.resultCode.$value == '005' ) {
+        // username blocked
+        st24rc = '40';
+    }
+    else if ( response.outputParameter.resultCode.$value == '006' ) {
+        // not exists username
+        st24rc = '40';
+    }
+    else if ( response.outputParameter.resultCode.$value == '011' ) {
+        // invalid request
+        st24rc = '40'
+    }
+    else if ( response.outputParameter.resultCode.$value == '012' ) {
+        // no route to host
+        st24rc = '40'
+    }
+    else if ( response.outputParameter.resultCode.$value == '013' ) {
+        // invalid signature
+        st24rc = '40'
+    }
+    else if ( response.outputParameter.bit39.$value == '06' ) {
+        st24rc = '40';
+        st24message = 'Error Transaksi ditolak karena terjadi error di H2H dengan response code diluar daftar ini. Silahkan hubungi H2H';
+    }
+    else if ( response.outputParameter.bit39.$value == '12' ) {
+        st24rc = '40';
+        st24message = 'Invalid Transaction Transaksi ditolak karena flow transaksi tidak valid';
+    }
+    else if ( response.outputParameter.bit39.$value == '13' ) {
+        st24rc = '13';
+        st24message = 'Invalid voucher nominal';
+    }
+    else if ( response.outputParameter.bit39.$value == '14' ) {
+        st24rc = '14';
+        st24message = 'MSISDN tidak ditemukan';
+    }
+    else if ( response.outputParameter.bit39.$value == '30' ) {
+        st24rc = '40';
+        st24message = 'Format Error';
+    }
+    else if ( response.outputParameter.bit39.$value == '31' ) {
+        st24rc = '40';
+        st24message = 'Kode bank tidak terdaftar';
+    }
+    else if ( response.outputParameter.bit39.$value == '63' ) {
+        st24rc = '40';
+        st24message = 'Reversal denied';
+    }
+    else if ( response.outputParameter.bit39.$value == '68' ) {
+        st24rc = '68';
+        st24message = 'Transaksi sedang dalam proses';
+    }
+    else if ( response.outputParameter.bit39.$value == '69' ) {
+        st24rc = '68';
+        st24message = 'Respon Ok lebih dari 24 detik';
+    }
+    else if ( response.outputParameter.bit39.$value == '70' ) {
+        st24rc = '13';
+        st24message = 'Voucher out of stock';
+    }
+    else if ( response.outputParameter.bit39.$value == '79' ) {
+        st24rc = '14';
+        st24message = 'Phone number is blocked by Telkomsel';
+    }
+    else if ( response.outputParameter.bit39.$value == '81' ) {
+        st24rc = '14';
+        st24message = 'Phone number is expired';
+    }
+    else if ( response.outputParameter.bit39.$value == '89' ) {
+        st24rc = '40';
+        st24message = 'Link to billing provider is down';
+    }
+    else if ( response.outputParameter.bit39.$value == '91' ) {
+        st24rc = '40';
+        st24message = 'Database problem';
+    }
+    else if ( response.outputParameter.bit39.$value == '92' ) {
+        st24rc = '40';
+        st24message = 'Unable to route transaction';
+    }
+    else if ( response.outputParameter.bit39.$value == '94' ) {
+        st24rc = '40';
+        st24message = 'Duplicate reversal request';
+    }
 
-        topupRequestRetry(task);
-    });
+    var message =
+        response.outputParameter.resultCode.$value
+        + " " + response.outputParameter.resultDesc.$value
+        + "; " + response.outputParameter.bit39.$value
+        ;
 
-    req.write(message);
-    req.end();
-}
+    if (response.outputParameter.resultDesc.$value != st24message) {
+        var message = message + " " + st24message;
+    }
 
-function topupResponseHandler(response, task) {
-    logger.verbose('Got response', {response: response, task: task});
-    callbackReport(task.requestId, '68', 'Got response');
+    logger.info('Got result: ' + message, {result: result});
+    callbackReport(task.requestId, st24rc, st24message);
 }
 
 function topupRequestRetry(task) {
@@ -162,11 +236,8 @@ function topupRequestRetry(task) {
 }
 
 
-
-
 function createSignature(params, password) {
     var passwordHash = crypto.createHash('sha256').update(password).digest().toString('hex');
-
     var plain =
         params.userName
         + passwordHash
@@ -178,13 +249,7 @@ function createSignature(params, password) {
         + params.reff
         + params.timeStamp;
 
-    var result = crypto.createHash('sha1').update(plain).digest().toString('hex');
-
-    if (logger) {
-        logger.verbose('Calculating signature', {plain: plain, result: result, params: params, password: password});
-    }
-
-    return result;
+    return crypto.createHash('sha1').update(plain).digest().toString('hex');
 }
 
 function createBillNumber(destination) {