diff --git a/lib/modem.js b/lib/modem.js
index 4ab4a81..8ed3dba 100644
--- a/lib/modem.js
+++ b/lib/modem.js
@@ -5,6 +5,9 @@ const MAX_LAST_DATA_AGE_MS = 3 * 60 * 1000;
 const REGEX_WAIT_FOR_OK_OR_ERROR = /\n(?:OK|ERROR)\r/;
 // const REGEX_WAIT_FOR_OK_OR_ERROR_USSD = /\n(?:OK|ERROR)\r/;
 
+const CUSD2_BEFORE = -1;
+const CUSD2_AFTER = 1;
+
 const moment = require('moment');
 const SerialPort = require('serialport');
 const ParserReadline = require('@serialport/parser-readline');
@@ -311,21 +314,42 @@ async function sendSMS(destination, msg) {
  *
  * @param  {string} code - Kode USSD
  */
-function executeUSSD(code) {
+function executeUSSD(code, includeCUSD2) {
     return new Promise(async (resolve) => {
-        const parser = new ParserRegex({ regex: REGEX_WAIT_FOR_OK_OR_ERROR });
-        parser.on('data', (data) => {
-            port.unpipe(parser);
+        const parserMain = new ParserRegex({ regex: REGEX_WAIT_FOR_OK_OR_ERROR });
+        parserMain.on('data', (data) => {
+            port.unpipe(parserMain);
             mutex.releaseLockWaitForSubCommand();
             resolve(data);
         });
 
+        const parserCUSD2 = new ParserRegex({ regex: REGEX_WAIT_FOR_OK_OR_ERROR });
+        parserCUSD2.on('data', () => {
+            port.unpipe(parserCUSD2);
+            mutex.releaseLockWaitForSubCommand();
+        });
+
         logger.verbose('Waiting for command lock to execute USSD');
         await mutex.setLockWaitForCommand();
 
+        if (includeCUSD2 === CUSD2_BEFORE) {
+            logger.info('Terminating existing USSD session');
+            await mutex.setLockWaitForSubCommand();
+            port.pipe(parserCUSD2);
+            await writeToPort('AT+CUSD=2\r');
+        }
+
         await mutex.setLockWaitForSubCommand();
+        port.pipe(parserMain);
         await writeToPort(`AT+CUSD=1,"${code}",15\r`);
 
+        if (includeCUSD2 === CUSD2_AFTER) {
+            logger.info('Terminating existing USSD session');
+            await mutex.setLockWaitForSubCommand();
+            port.pipe(parserCUSD2);
+            await writeToPort('AT+CUSD=2\r');
+        }
+
         await mutex.setLockWaitForSubCommand();
         mutex.releaseLockWaitForSubCommand();
 
@@ -389,6 +413,9 @@ function init() {
 
 init();
 
+exports.CUSD2_BEFORE = CUSD2_BEFORE;
+exports.CUSD2_AFTER = CUSD2_AFTER;
+
 exports.modemInfo = modemInfo;
 exports.sendSMS = sendSMS;
 exports.executeUSSD = executeUSSD;