diff --git a/index.php b/index.php
index 2e483a60..f3b2dadb 100644
--- a/index.php
+++ b/index.php
@@ -18,6 +18,14 @@ if(isset($_GET['nux-router']) && !empty($_GET['nux-router'])){
     $_SESSION['nux-router'] = $_GET['nux-router'];
 }
 
+//get chap id and chap challenge
+if(isset($_GET['nux-key']) && !empty($_GET['nux-key'])){
+    $_SESSION['nux-key'] = $_GET['nux-key'];
+}
+//get mikrotik hostname
+if(isset($_GET['nux-hostname']) && !empty($_GET['nux-hostname'])){
+    $_SESSION['nux-hostname'] = $_GET['nux-hostname'];
+}
 require_once 'system/vendor/autoload.php';
 require_once 'system/boot.php';
 App::_run();
diff --git a/system/controllers/home.php b/system/controllers/home.php
index f7b8983d..7cc84fd5 100644
--- a/system/controllers/home.php
+++ b/system/controllers/home.php
@@ -232,6 +232,60 @@ if (!empty($_SESSION['nux-mac']) && !empty($_SESSION['nux-ip'])) {
     }
 }
 
+if (!empty($_SESSION['nux-mac']) && !empty($_SESSION['nux-ip'] && !empty($_SESSION['nux-hostname']) && $_c['hs_auth_method'] == 'hchap')) {
+    $apkurl = (((!empty($_SERVER['HTTPS']) && $_SERVER['HTTPS'] !== 'onoff')|| $_SERVER['SERVER_PORT'] == 443)?'https':'http').'://' . $_SERVER['HTTP_HOST'] . $_SERVER['REQUEST_URI'];
+    $ui->assign('nux_mac', $_SESSION['nux-mac']);
+    $ui->assign('nux_ip', $_SESSION['nux-ip']);
+    $keys = explode('-', $_SESSION['nux-key']);
+    $ui->assign('hostname', $_SESSION['nux-hostname']);
+    $ui->assign('apkurl', $apkurl);
+    $ui->assign('key1', $keys[0]);
+    $ui->assign('key2', $keys[1]);
+    $ui->assign('hchap', $_GET['hchap']);
+    $ui->assign('logged', $_GET['logged']);
+    if ($_app_stage != 'demo') {
+            if ($_GET['mikrotik'] == 'login') {
+                r2(U . 'home&hchap=true', 's', Lang::T('Login Request successfully')); 
+                } 
+                $getmsg = $_GET['msg'];
+                ///get auth notification from mikrotik
+                if($getmsg == 'Connected') {
+                    $msg .= Lang::T($getmsg);
+                    r2(U . 'home&logged=1', 's', $msg); 
+                } else if($getmsg){
+                    $msg .= Lang::T($getmsg);
+                    r2(U . 'home', 's', $msg); 
+            }
+        }
+    }
+
+if (!empty($_SESSION['nux-mac']) && !empty($_SESSION['nux-ip'] && !empty($_SESSION['nux-hostname']) && $_c['hs_auth_method'] == 'hchap')) {
+    $apkurl = (((!empty($_SERVER['HTTPS']) && $_SERVER['HTTPS'] !== 'onoff')|| $_SERVER['SERVER_PORT'] == 443)?'https':'http').'://' . $_SERVER['HTTP_HOST'] . $_SERVER['REQUEST_URI'];
+    $ui->assign('nux_mac', $_SESSION['nux-mac']);
+    $ui->assign('nux_ip', $_SESSION['nux-ip']);
+    $keys = explode('-', $_SESSION['nux-key']);
+    $ui->assign('hostname', $_SESSION['nux-hostname']);
+    $ui->assign('apkurl', $apkurl);
+    $ui->assign('key1', $keys[0]);
+    $ui->assign('key2', $keys[1]);
+    $ui->assign('hchap', $_GET['hchap']);
+    $ui->assign('logged', $_GET['logged']);
+    if ($_app_stage != 'demo') {
+            if ($_GET['mikrotik'] == 'login') {
+                r2(U . 'home&hchap=true', 's', Lang::T('Login Request successfully')); 
+                } 
+                $getmsg = $_GET['msg'];
+                ///get auth notification from mikrotik
+                if($getmsg == 'Connected') {
+                    $msg .= Lang::T($getmsg);
+                    r2(U . 'home&logged=1', 's', $msg); 
+                } else if($getmsg){
+                    $msg .= Lang::T($getmsg);
+                    r2(U . 'home', 's', $msg); 
+            }
+        }
+    }
+
 $ui->assign('unpaid', ORM::for_table('tbl_payment_gateway')
     ->where('username', $user['username'])
     ->where('status', 1)
diff --git a/ui/ui/app-settings.tpl b/ui/ui/app-settings.tpl
index c052d763..11486ca7 100644
--- a/ui/ui/app-settings.tpl
+++ b/ui/ui/app-settings.tpl
@@ -200,7 +200,7 @@
                             <label class="col-md-2 control-label">Redirect after Activation</label>
                             <div class="col-md-6">
                                 <input type="text" class="form-control" id="voucher_redirect" name="voucher_redirect"
-                                    placeholder="https://192.168.88.1/status" value="{$voucher_redirect}">
+                                    placeholder="https://192.168.88.1/status" value="{$_c['voucher_redirect']}">
                             </div>
                             <p class="help-block col-md-4">
                                 {Lang::T('After Customer activate voucher or login, customer will be redirected to this
@@ -621,6 +621,22 @@
                         <p class="help-block col-md-4">
                             {Lang::T('If user buy same internet plan, expiry date will extend')}</p>
                     </div>
+                    <div class="form-group">
+                            <label class="col-md-2 control-label">{Lang::T('Hotspot Auth Method')}</label>
+                            <div class="col-md-6">
+                                <select name="hs_auth_method" id="auth_method" class="form-control">
+                                    <option value="api" {if $_c['hs_auth_method']=='api' }selected="selected" {/if}>
+                                    {Lang::T('Api')}
+                                    </option>
+                                    <option value="hchap" {if $_c['hs_auth_method']=='hchap' }selected="selected" {/if}>
+                                        {Lang::T('Http-Chap')}
+                                    </option>
+                                </select>
+                            </div>
+                            <p class="help-block col-md-4">
+                                {Lang::T('Hotspot Authentication Method. Make sure you have changed your hotspot login page.')}<br><a href="https://github.com/agstrxyz/phpnuxbill-login-hotspot" target="_blank">Download phpnuxbill-login-hotspot</a>
+                            </p>
+                        </div>
                 </div>
 
                 <div class="panel-heading">
diff --git a/ui/ui/scripts/md5.js b/ui/ui/scripts/md5.js
new file mode 100644
index 00000000..a6e63395
--- /dev/null
+++ b/ui/ui/scripts/md5.js
@@ -0,0 +1,217 @@
+/*
+ * A JavaScript implementation of the RSA Data Security, Inc. MD5 Message
+ * Digest Algorithm, as defined in RFC 1321.
+ * Version 1.1 Copyright (C) Paul Johnston 1999 - 2002.
+ * Code also contributed by Greg Holt
+ * See http://pajhome.org.uk/site/legal.html for details.
+ */
+
+/*
+ * Add integers, wrapping at 2^32. This uses 16-bit operations internally
+ * to work around bugs in some JS interpreters.
+ */
+function safe_add(x, y)
+{
+  var lsw = (x & 0xFFFF) + (y & 0xFFFF)
+  var msw = (x >> 16) + (y >> 16) + (lsw >> 16)
+  return (msw << 16) | (lsw & 0xFFFF)
+}
+
+/*
+ * Bitwise rotate a 32-bit number to the left.
+ */
+function rol(num, cnt)
+{
+  return (num << cnt) | (num >>> (32 - cnt))
+}
+
+/*
+ * These functions implement the four basic operations the algorithm uses.
+ */
+function cmn(q, a, b, x, s, t)
+{
+  return safe_add(rol(safe_add(safe_add(a, q), safe_add(x, t)), s), b)
+}
+function ff(a, b, c, d, x, s, t)
+{
+  return cmn((b & c) | ((~b) & d), a, b, x, s, t)
+}
+function gg(a, b, c, d, x, s, t)
+{
+  return cmn((b & d) | (c & (~d)), a, b, x, s, t)
+}
+function hh(a, b, c, d, x, s, t)
+{
+  return cmn(b ^ c ^ d, a, b, x, s, t)
+}
+function ii(a, b, c, d, x, s, t)
+{
+  return cmn(c ^ (b | (~d)), a, b, x, s, t)
+}
+
+/*
+ * Calculate the MD5 of an array of little-endian words, producing an array
+ * of little-endian words.
+ */
+function coreMD5(x)
+{
+  var a =  1732584193
+  var b = -271733879
+  var c = -1732584194
+  var d =  271733878
+
+  for(i = 0; i < x.length; i += 16)
+  {
+    var olda = a
+    var oldb = b
+    var oldc = c
+    var oldd = d
+
+    a = ff(a, b, c, d, x[i+ 0], 7 , -680876936)
+    d = ff(d, a, b, c, x[i+ 1], 12, -389564586)
+    c = ff(c, d, a, b, x[i+ 2], 17,  606105819)
+    b = ff(b, c, d, a, x[i+ 3], 22, -1044525330)
+    a = ff(a, b, c, d, x[i+ 4], 7 , -176418897)
+    d = ff(d, a, b, c, x[i+ 5], 12,  1200080426)
+    c = ff(c, d, a, b, x[i+ 6], 17, -1473231341)
+    b = ff(b, c, d, a, x[i+ 7], 22, -45705983)
+    a = ff(a, b, c, d, x[i+ 8], 7 ,  1770035416)
+    d = ff(d, a, b, c, x[i+ 9], 12, -1958414417)
+    c = ff(c, d, a, b, x[i+10], 17, -42063)
+    b = ff(b, c, d, a, x[i+11], 22, -1990404162)
+    a = ff(a, b, c, d, x[i+12], 7 ,  1804603682)
+    d = ff(d, a, b, c, x[i+13], 12, -40341101)
+    c = ff(c, d, a, b, x[i+14], 17, -1502002290)
+    b = ff(b, c, d, a, x[i+15], 22,  1236535329)
+
+    a = gg(a, b, c, d, x[i+ 1], 5 , -165796510)
+    d = gg(d, a, b, c, x[i+ 6], 9 , -1069501632)
+    c = gg(c, d, a, b, x[i+11], 14,  643717713)
+    b = gg(b, c, d, a, x[i+ 0], 20, -373897302)
+    a = gg(a, b, c, d, x[i+ 5], 5 , -701558691)
+    d = gg(d, a, b, c, x[i+10], 9 ,  38016083)
+    c = gg(c, d, a, b, x[i+15], 14, -660478335)
+    b = gg(b, c, d, a, x[i+ 4], 20, -405537848)
+    a = gg(a, b, c, d, x[i+ 9], 5 ,  568446438)
+    d = gg(d, a, b, c, x[i+14], 9 , -1019803690)
+    c = gg(c, d, a, b, x[i+ 3], 14, -187363961)
+    b = gg(b, c, d, a, x[i+ 8], 20,  1163531501)
+    a = gg(a, b, c, d, x[i+13], 5 , -1444681467)
+    d = gg(d, a, b, c, x[i+ 2], 9 , -51403784)
+    c = gg(c, d, a, b, x[i+ 7], 14,  1735328473)
+    b = gg(b, c, d, a, x[i+12], 20, -1926607734)
+
+    a = hh(a, b, c, d, x[i+ 5], 4 , -378558)
+    d = hh(d, a, b, c, x[i+ 8], 11, -2022574463)
+    c = hh(c, d, a, b, x[i+11], 16,  1839030562)
+    b = hh(b, c, d, a, x[i+14], 23, -35309556)
+    a = hh(a, b, c, d, x[i+ 1], 4 , -1530992060)
+    d = hh(d, a, b, c, x[i+ 4], 11,  1272893353)
+    c = hh(c, d, a, b, x[i+ 7], 16, -155497632)
+    b = hh(b, c, d, a, x[i+10], 23, -1094730640)
+    a = hh(a, b, c, d, x[i+13], 4 ,  681279174)
+    d = hh(d, a, b, c, x[i+ 0], 11, -358537222)
+    c = hh(c, d, a, b, x[i+ 3], 16, -722521979)
+    b = hh(b, c, d, a, x[i+ 6], 23,  76029189)
+    a = hh(a, b, c, d, x[i+ 9], 4 , -640364487)
+    d = hh(d, a, b, c, x[i+12], 11, -421815835)
+    c = hh(c, d, a, b, x[i+15], 16,  530742520)
+    b = hh(b, c, d, a, x[i+ 2], 23, -995338651)
+
+    a = ii(a, b, c, d, x[i+ 0], 6 , -198630844)
+    d = ii(d, a, b, c, x[i+ 7], 10,  1126891415)
+    c = ii(c, d, a, b, x[i+14], 15, -1416354905)
+    b = ii(b, c, d, a, x[i+ 5], 21, -57434055)
+    a = ii(a, b, c, d, x[i+12], 6 ,  1700485571)
+    d = ii(d, a, b, c, x[i+ 3], 10, -1894986606)
+    c = ii(c, d, a, b, x[i+10], 15, -1051523)
+    b = ii(b, c, d, a, x[i+ 1], 21, -2054922799)
+    a = ii(a, b, c, d, x[i+ 8], 6 ,  1873313359)
+    d = ii(d, a, b, c, x[i+15], 10, -30611744)
+    c = ii(c, d, a, b, x[i+ 6], 15, -1560198380)
+    b = ii(b, c, d, a, x[i+13], 21,  1309151649)
+    a = ii(a, b, c, d, x[i+ 4], 6 , -145523070)
+    d = ii(d, a, b, c, x[i+11], 10, -1120210379)
+    c = ii(c, d, a, b, x[i+ 2], 15,  718787259)
+    b = ii(b, c, d, a, x[i+ 9], 21, -343485551)
+
+    a = safe_add(a, olda)
+    b = safe_add(b, oldb)
+    c = safe_add(c, oldc)
+    d = safe_add(d, oldd)
+  }
+  return [a, b, c, d]
+}
+
+/*
+ * Convert an array of little-endian words to a hex string.
+ */
+function binl2hex(binarray)
+{
+  var hex_tab = "0123456789abcdef"
+  var str = ""
+  for(var i = 0; i < binarray.length * 4; i++)
+  {
+    str += hex_tab.charAt((binarray[i>>2] >> ((i%4)*8+4)) & 0xF) +
+           hex_tab.charAt((binarray[i>>2] >> ((i%4)*8)) & 0xF)
+  }
+  return str
+}
+
+/*
+ * Convert an array of little-endian words to a base64 encoded string.
+ */
+function binl2b64(binarray)
+{
+  var tab = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"
+  var str = ""
+  for(var i = 0; i < binarray.length * 32; i += 6)
+  {
+    str += tab.charAt(((binarray[i>>5] << (i%32)) & 0x3F) |
+                      ((binarray[i>>5+1] >> (32-i%32)) & 0x3F))
+  }
+  return str
+}
+
+/*
+ * Convert an 8-bit character string to a sequence of 16-word blocks, stored
+ * as an array, and append appropriate padding for MD4/5 calculation.
+ * If any of the characters are >255, the high byte is silently ignored.
+ */
+function str2binl(str)
+{
+  var nblk = ((str.length + 8) >> 6) + 1 // number of 16-word blocks
+  var blks = new Array(nblk * 16)
+  for(var i = 0; i < nblk * 16; i++) blks[i] = 0
+  for(var i = 0; i < str.length; i++)
+    blks[i>>2] |= (str.charCodeAt(i) & 0xFF) << ((i%4) * 8)
+  blks[i>>2] |= 0x80 << ((i%4) * 8)
+  blks[nblk*16-2] = str.length * 8
+  return blks
+}
+
+/*
+ * Convert a wide-character string to a sequence of 16-word blocks, stored as
+ * an array, and append appropriate padding for MD4/5 calculation.
+ */
+function strw2binl(str)
+{
+  var nblk = ((str.length + 4) >> 5) + 1 // number of 16-word blocks
+  var blks = new Array(nblk * 16)
+  for(var i = 0; i < nblk * 16; i++) blks[i] = 0
+  for(var i = 0; i < str.length; i++)
+    blks[i>>1] |= str.charCodeAt(i) << ((i%2) * 16)
+  blks[i>>1] |= 0x80 << ((i%2) * 16)
+  blks[nblk*16-2] = str.length * 16
+  return blks
+}
+
+/*
+ * External interface
+ */
+function hexMD5 (str) { return binl2hex(coreMD5( str2binl(str))) }
+function hexMD5w(str) { return binl2hex(coreMD5(strw2binl(str))) }
+function b64MD5 (str) { return binl2b64(coreMD5( str2binl(str))) }
+function b64MD5w(str) { return binl2b64(coreMD5(strw2binl(str))) }
+/* Backward compatibility */
+function calcMD5(str) { return binl2hex(coreMD5( str2binl(str))) }
diff --git a/ui/ui/user-dashboard.tpl b/ui/ui/user-dashboard.tpl
index f7a2abbc..158a4803 100644
--- a/ui/ui/user-dashboard.tpl
+++ b/ui/ui/user-dashboard.tpl
@@ -167,7 +167,7 @@
                                 <td class="small mb15">{$nux_mac}</td>
                             </tr>
                         {/if}
-                        {if $_bill['type'] == 'Hotspot' && $_bill['status'] == 'on' && $_bill['routers'] != 'radius'}
+                        {if $_bill['type'] == 'Hotspot' && $_bill['status'] == 'on' && $_bill['routers'] != 'radius' && $_c['hs_auth_method'] != 'hchap'}
                             <tr>
                                 <td class="small text-primary text-uppercase text-normal">{Lang::T('Login Status')}</td>
                                 <td class="small mb15" id="login_status_{$_bill['id']}">
@@ -175,6 +175,19 @@
                                 </td>
                             </tr>
                         {/if}
+                        {if $_bill['type'] == 'Hotspot' && $_bill['status'] == 'on' && $_c['hs_auth_method'] == 'hchap'}
+                            <tr>
+                                <td class="small text-primary text-uppercase text-normal">{Lang::T('Login Status')}</td>
+                                <td class="small mb15">
+                            {if $logged == '1'}
+                        <a href="http://{$hostname}/status" class="btn btn-success btn-xs btn-block">{Lang::T('You are Online, Check Status')}</a>
+                            {else}
+                        <a href="{$_url}home&mikrotik=login" 
+                            onclick="return confirm('{Lang::T('Connect to Internet')}')" class="btn btn-danger btn-xs btn-block">{Lang::T('Not Online, Login now?')}</a>
+                            {/if}
+                                 </td>
+                            </tr>
+                        {/if}
                         <tr>
                             <td class="small text-primary text-uppercase text-normal">
                                 {if $_bill['status'] == 'on'}
@@ -210,7 +223,7 @@
         {/if}
         {if $_bills}
             {foreach $_bills as $_bill}
-                {if $_bill['type'] == 'Hotspot' && $_bill['status'] == 'on'}
+                {if $_bill['type'] == 'Hotspot' && $_bill['status'] == 'on' && $_c['hs_auth_method'] != 'hchap'}
                     <script>
                         setTimeout(() => {
                             $.ajax({
@@ -320,4 +333,17 @@
         {/if}
     </div>
 </div>
+{if isset($hostname) && $hchap == 'true' && $_c['hs_auth_method'] == 'hchap'}
+<script type="text/javascript" src="/ui/ui/scripts/md5.js"></script>
+<script type="text/javascript">
+     var hostname = "http://{$hostname}/login";
+     var user = "{$_user['username']}";
+     var pass = "{$_user['password']}";
+     var dst = "{$apkurl}";
+     var authdly = "2";
+     var key = hexMD5('{$key1}' + pass + '{$key2}');
+     var auth = hostname + '?username=' + user + '&dst=' + dst + '&password=' + key;
+     document.write('<meta http-equiv="refresh" target="_blank" content="'+authdly+'; url='+auth+'">');
+</script>
+{/if}
 {include file="sections/user-footer.tpl"}
\ No newline at end of file