diff --git a/lib/partner-mkios.js b/lib/partner-mkios.js
index 239c099..82fe4e0 100644
--- a/lib/partner-mkios.js
+++ b/lib/partner-mkios.js
@@ -20,10 +20,12 @@ if (config && config.debug_modem) {
     process.env.KOMODO_DEBUG_MODEM=1;
 }
 
+/*
 if (!config || !config.partner || !config.partner.pin) {
     logger.warn('Undefined PIN');
     process.exit(1);
 }
+*/
 
 matrix.modem = {};
 
@@ -45,10 +47,14 @@ const resumeHandlers = {};
 
 let last_trx_id = null;
 
+function getPin() {
+    return ( config && config.partner && config.partner.pin ) || ( matrix && matrix.modem && matrix.modem.pin_trx );
+}
+
 modem.on('open', function() {
     logger.info('Modem opened');
 
-    const ussd_command = '*776*' + config.partner.pin + '#';
+    const ussd_command = '*776*' + getPin() + '#';
     db.run("INSERT INTO ussd VALUES (?, ?, 'OUT', ?, ?)", moment().format('YYYY-MM-DD HH:mm:ss'), moment().format('YYYY-MM-DD'), matrix.modem.imsi, 'AT+CUSD=1,"' + ussd_command + '",15', function(err) {
         if (err) {
             logger.warn('Error inserting ussd command (stock check) to local database', {err: err});
@@ -62,6 +68,7 @@ modem.on('imsi', function(imsi) {
     logger.verbose('IMSI: ' + imsi);
     matrix.modem.imsi = imsi;
     matrix.modem.msisdn = chips && chips.by_imsi && chips.by_imsi[imsi] && chips.by_imsi[imsi].msisdn ? chips.by_imsi[imsi].msisdn : config.partner.msisdn;
+    matrix.modem.pin_trx = chips && chips.by_imsi && chips.by_imsi[imsi] && chips.by_imsi[imsi].pin ? chips.by_imsi[imsi].pin : null;
 })
 
 
@@ -286,11 +293,21 @@ function onTrxFinish(trx_id) {
 }
 
 function buy(task) {
+
+    if (!getPin()) {
+        report({
+            trx_id: task.trx_id,
+            rc: '40',
+            message: 'INTERNAL: Tidak dapat melakukan transaksi. PIN transaksi tidak terdefinisi.'
+        });
+        return;
+    }
+
     if (task.product === task.remote_product) {
         report({
             trx_id: task.trx_id,
             rc: '40',
-            message: 'INTERNAL: Gagal melakukan transaksi. Kode USSD belum terdefinisi.'
+            message: 'INTERNAL: Tidak dapat melakukan transaksi. Kode USSD belum terdefinisi.'
         });
         return;
     }
@@ -311,7 +328,7 @@ function buy(task) {
             return;
         }
 
-        const ussd_command = task.remote_product.split(',')[0].replace("<DESTINATION>", task.destination).replace("<PIN>", config.partner.pin);
+        const ussd_command = task.remote_product.split(',')[0].replace("<DESTINATION>", task.destination).replace("<PIN>", getPin());
         logger.verbose('Going to execute USSD', {trx_id: task.trx_id, destination: task.destination, product: task.product, ussd: ussd_command});
 
         db.run("INSERT INTO ussd VALUES (?, ?, 'OUT', ?, ?)", moment().format('YYYY-MM-DD HH:mm:ss'), moment().format('YYYY-MM-DD'), matrix.modem.imsi, 'AT+CUSD=1,"' + ussd_command + '",15', function(err) {