diff --git a/partner-bayarkilat.js b/partner-bayarkilat.js
index 2187408..d27b4de 100644
--- a/partner-bayarkilat.js
+++ b/partner-bayarkilat.js
@@ -8,6 +8,9 @@ var aaa;
 var callbackReport;
 var logger;
 
+var maxCheckRetry = 20;
+var delayBeforeCheckRetry = 30 * 1000;
+
 process.env.NODE_TLS_REJECT_UNAUTHORIZED = '0';
 
 function start(_config, _callbackReport, options) {
@@ -29,21 +32,27 @@ function start(_config, _callbackReport, options) {
     }
 }
 
-
-function topupRequest(task, retry) {
-    aaa.insertTaskToMongoDb(task);
+function createRequestOptions(methodName, task) {
+    if (('PURCHASE', 'CHECKING').indexOf(methodName) < 0) {
+        return;
+    }
 
     var partnerUrl = url.parse(config.h2h_out.partner);
     var product = prepareRemoteProductCode(task.remoteProduct);
 
+    var destination = task.destination;
+    if (methodName == 'CHECKING') {
+        destination = paddingDestination(destination);
+    }
+
     var options = {
         url: config.h2h_out.partner,
         qs: {
-            request: 'PURCHASE*'
+            request: methodName + '*'
                 + task.requestId + '*'
                 + product.product + '*'
                 + product.productDetail + '*'
-                + task.destination + '*'
+                + destination + '*'
                 + product.nominal + '*'
                 + '0*'
                 + config.h2h_out.noid + '*'
@@ -52,6 +61,41 @@ function topupRequest(task, retry) {
         }
     };
 
+    return options;
+}
+
+function topupCheck(task, retry) {
+    if (retry === null || retry === undefined) {
+        retry = maxCheckRetry + 1;
+    }
+
+    retry = retry - 1;
+
+    if (retry < 0) {
+        var message = 'Max retry check transaction retry exceeded';
+        var response = {
+            raw: message,
+            parsed: {
+                MESSAGE: message
+            }
+        }
+        aaa.pushResponseToMongoDb(task, response, '68');
+        callbackReport(task.requestId, '68', message);
+        return;
+    }
+
+    requestToPartner('CHECKING', task, retry);
+}
+
+function topupRequest(task) {
+    requestToPartner('PURCHASE', task);
+}
+
+function requestToPartner(methodName, task, retry) {
+    aaa.insertTaskToMongoDb(task);
+
+    var options = createRequestOptions(methodName, task);
+
     logger.info('Requesting to partner', {requestOption: options});
     request(options, function(error, response, body) {
         if (error) {
@@ -67,6 +111,13 @@ function topupRequest(task, retry) {
             }
             aaa.pushResponseToMongoDb(task, _response, '68');
 
+            setTimeout(
+                topupCheck,
+                delayBeforeCheckRetry,
+                task,
+                retry
+            );
+
             return;
         }
 
@@ -86,6 +137,13 @@ function topupRequest(task, retry) {
             }
             aaa.pushResponseToMongoDb(task, _response, '68');
 
+            setTimeout(
+                topupCheck,
+                delayBeforeCheckRetry,
+                task,
+                retry
+            );
+
             return;
         }