Index: /branches/rel_ag_9_4/localdb/apps/auth/auth_aaa.c
===================================================================
--- /branches/rel_ag_9_4/localdb/apps/auth/auth_aaa.c	(revision 20224)
+++ /branches/rel_ag_9_4/localdb/apps/auth/auth_aaa.c	(working copy)
@@ -348,6 +348,7 @@
 	char *lock_loginfail_times;
 	char *lock_idletime_expire;
 	char *custom_info1; /* encoded secret */
+	char *third_party_otp_secret; /* secret used to gen google,microsoft...etc otp */
 	uint16_t lock_loginfail_limit;
 	uint32_t lock_loginfail_duration;
 	uint32_t lock_idletime_limit;
@@ -407,7 +408,7 @@
 	if (FLAG_ISSET(vsite->aaa_configure->flag, AAA_FLAG_USERNAME_CASE_INSENSITIVE)) {
 		result = ldbq_exec_one(conn, 
 			"SELECT user_name, user_passwd, passwd_flag, grp_name, phone, mail_address,"
-			" lock_status, interval_time, custom_info1,"
+			" lock_status, interval_time, custom_info1, custom_info2,"
 			" ceil(date_part('epoch', passwd_expiration)) as passwd_expiration,"
 			" ceil(date_part('epoch', lock_manual_expire)) as lock_manual_expire,"
 			" ceil(date_part('epoch', lock_loginfail_expire)) as lock_loginfail_expire,"
@@ -421,7 +422,7 @@
 	} else {
 		result = ldbq_exec_one(conn, 
 			"SELECT user_passwd, passwd_flag, grp_name, phone, mail_address,"
-			" lock_status, interval_time, custom_info1,"
+			" lock_status, interval_time, custom_info1, custom_info2,"
 			" ceil(date_part('epoch', passwd_expiration)) as passwd_expiration,"
 			" ceil(date_part('epoch', lock_manual_expire)) as lock_manual_expire,"
 			" ceil(date_part('epoch', lock_loginfail_expire)) as lock_loginfail_expire,"
@@ -469,6 +470,7 @@
 	lock_loginfail_times  = ldbq_get_value_by_name(result, 0, "lock_loginfail_times");
 	lock_idletime_expire  = ldbq_get_value_by_name(result, 0, "lock_idletime_expire");
 	custom_info1 = ldbq_get_value_by_name(result, 0, "custom_info1");
+	third_party_otp_secret = ldbq_get_value_by_name(result, 0, "custom_info2");
 	
 	lock_loginfail_limit    = vsite->ldb_lock_loginfail_limit;
 	lock_loginfail_duration = vsite->ldb_lock_loginfail_duration;
@@ -647,8 +649,15 @@
 					strcpy(dynamic_code, password);
 					ret = dynamic_authenticate(conn, custom_info1, dynamic_code, vsite->ldb_dynpass_interval);
 					if (ret != LDB_AUTHEN_SUCCESS) {
-						auth_result = -1;
-					} else {
+						/* Check with third party otp secret */
+						ret = dynamic_authenticate(conn, third_party_otp_secret, dynamic_code, 0);
+						if (ret != LDB_AUTHEN_SUCCESS) {
+							auth_result = -1;
+						} else {
+							auth_result = 0;
+						}
+					}
+					else {
 						auth_result = 0;
 					}
 				}
@@ -659,7 +668,13 @@
 				} else {
 					ret = dynamic_authenticate(conn, custom_info1, dynamic_code, vsite->ldb_dynpass_interval);
 					if (ret != LDB_AUTHEN_SUCCESS) {
-						auth_result = -1;
+						/* Check with third party otp secret */
+						ret = dynamic_authenticate(conn, third_party_otp_secret, dynamic_code, 0);
+						if (ret != LDB_AUTHEN_SUCCESS) {
+							auth_result = -1;
+						} else {
+							auth_result = static_auth(user_passwd, password);
+						}
 					} else {
 						auth_result = static_auth(user_passwd, password);
 					}
@@ -755,6 +770,7 @@
 	if (result_tmp) {
 		ldbq_clear_res(result_tmp);	
 	}
+
 	return ret;
 }
 
Index: /branches/rel_ag_9_4/localdb/apps/auth/auth_cli.c
===================================================================
--- /branches/rel_ag_9_4/localdb/apps/auth/auth_cli.c	(revision 20224)
+++ /branches/rel_ag_9_4/localdb/apps/auth/auth_cli.c	(working copy)
@@ -23,6 +23,7 @@
 #include <license.h>
 #include "../../../FreeBSD/src/sys/click/app/vsite/sec_vsite.h"
 #include "../../../aaa/aaa_common.h"
+#include "../dynamic_code/secret.h"
 
 ldba_auth_boundary_t ldba_auth_boundary_table[MAX_MODEL+1] = {
 	{0,0},
@@ -168,6 +169,7 @@
 	char           count[2] = {'\0'};
 	char           pass2[LDB_LEN_MAX_ENC_PASSWD] = {'\0'};
 	char          mode[LDB_INTERVAL_LEN] = {'\0'}; /* to check the account's configuration that update password or repeat*/
+    char          secret_key[SEC_ENCODED_SECRET_LEN] = {'\0'};
 	sec_vsite_t *vsite;
 	int ret, i;
 
@@ -360,6 +362,15 @@
 	        return ret;
 	    }
 
+            if(custom_info2 == NULL || custom_info2[0] == '\0') 
+            {
+                generate_secret_key(secret_key);
+            }
+            else
+            {
+                strcpy(secret_key, custom_info2);
+            }
+
 	    /* add a user with information to "v_acct" by sql command */
 	    result = ldbq_exec_one(conn, "INSERT INTO %s (user_name, user_passwd, phone, mail_address, nfs_group, nfs_account,"
 	                                                  " custom_info1, custom_info2, custom_info3, custom_info4, custom_info5,"
@@ -368,7 +379,7 @@
 	                                                    " 0, 'false', current_timestamp, current_timestamp,"
 	                                                    " current_timestamp, 0);",
 	                           LDB_VIEW_AUTH_USER, username, enc_passwd, phone_number, mail_address, nfs_group, nfs_account,
-	                           custom_info1, custom_info2, custom_info3, custom_info4, custom_info5);
+	                           custom_info1, secret_key, custom_info3, custom_info4, custom_info5);
 		res_state = 0;
 	} 
 	if (result == NULL) {
Index: /branches/rel_ag_9_4/localdb/apps/auth/dynamic_code/Makefile
===================================================================
--- /branches/rel_ag_9_4/localdb/apps/auth/dynamic_code/Makefile	(revision 20224)
+++ /branches/rel_ag_9_4/localdb/apps/auth/dynamic_code/Makefile	(working copy)
@@ -4,8 +4,8 @@
  
 INCLUDE_PATH = -I.
 DC_TARGET = libdc.a
-DC_OBJ = dynamic_code.o hmac.o sha1.o base32.o
-DC_SRC = dynamic_code.c hmac.c sha1.c base32.c
+DC_OBJ = dynamic_code.o hmac.o sha1.o base32.o secret.o
+DC_SRC = dynamic_code.c hmac.c sha1.c base32.c secret.c
 
 all: $(DC_TARGET)
 
Index: /branches/rel_ag_9_4/ui/localcmd/ui_localdb.c
===================================================================
--- /branches/rel_ag_9_4/ui/localcmd/ui_localdb.c	(revision 20224)
+++ /branches/rel_ag_9_4/ui/localcmd/ui_localdb.c	(working copy)
@@ -3438,7 +3438,7 @@
 					ui_printf("%-14s  ", "nfs_info");
 					break;
 				case custom_info :
-					ui_printf("%-14s  %-14s  %-14s  %-14s  %-14s  ", "custom_info1", "custom_info2", "custom_info3", "custom_info4", "custom_info5");
+					ui_printf("%-14s  %-14s  %-14s  %-14s  ", "OTP_secret", "custom_info1", "custom_info2", "custom_info3");
 					break;
 				case assigned_group :
 					ui_printf("%-18s  ", "assigned_group");
@@ -3517,7 +3517,7 @@
 							snprintf(tmp, 2048 - len, ",\"nfs_info\":\"%-14s  \"", ldbq_get_value(result, i, col_pos[j]));
 							break;
 						case custom_info :
-							snprintf(tmp, 2048 - len, ",\"custom_info1\":\"%-14s  \",\"custom_info2\":\"%-14s  \",\"custom_info3\":\"%-14s  \",\"custom_info4\":\"%-14s  \",\"custom_info5\":\"%-14s  \"",ldbq_get_value(result, i, col_pos[j]), ldbq_get_value(result, i, col_pos[j]+1), ldbq_get_value(result, i, col_pos[j]+2), ldbq_get_value(result, i, col_pos[j] + 3),ldbq_get_value(result, i, col_pos[j] + 4));
+							snprintf(tmp, 2048 - len, ",\"OTP_secret\":\"%-14s  \",\"custom_info1\":\"%-14s  \",\"custom_info2\":\"%-14s  \",\"custom_info3\":\"%-14s  \"", ldbq_get_value(result, i, col_pos[j]+1), ldbq_get_value(result, i, col_pos[j]+2), ldbq_get_value(result, i, col_pos[j] + 3),ldbq_get_value(result, i, col_pos[j] + 4));
 							break;
 						case assigned_group :
 							snprintf(tmp, 2048 - len, ",\"assigned_group\":\"%-18s  \"", ldbq_get_value(result, i, col_pos[j]));
Index: /branches/rel_ag_9_4/webui/proxy/new/inc/language/chinese.php
===================================================================
--- /branches/rel_ag_9_4/webui/proxy/new/inc/language/chinese.php	(revision 20224)
+++ /branches/rel_ag_9_4/webui/proxy/new/inc/language/chinese.php	(working copy)
@@ -5137,11 +5137,11 @@
 		'aaa_radius_no_nasip_msg'                  => '没有可删除的NASIP。',
 		'navNode_vRoleACL'                         => '访问控制列表',
 		'alert_username_len_exceeded'              => '用户名长度必须为1到64个字符。',
-		'customer_info3'                           => '自定义信息3',
-		'customer_info2'                           => '自定义信息2',
-		'customer_info1'                           => '自定义信息1',
-		'customer_info5'                           => '自定义信息5',
-		'customer_info4'                           => '自定义信息4',
+		'customer_info1'                           => 'MotionProOTP密钥 ',
+		'customer_info2'                           => 'OTP密钥',
+		'customer_info3'                           => '自定义信息1',
+		'customer_info4'                           => '自定义信息2',
+		'customer_info5'                           => '自定义信息3',
 		'activex'                                  => 'ActiveX',
 		'ignore'                                   => '忽略',
 		'import_error_url_invalid'                 => '无效URL',
@@ -5328,6 +5328,7 @@
 		'sslkeytftp_file_name'                     => '(可选，默认值是&lt;Site Name&gt;.key)',
 		'Quicklink_resource'                       => 'QuickLink资源',
 		'confirm_change'                           => '您确认要修改',
+		'otp_warning_message'                      => '* 注意：请确保NTP正在运行或系统时间与UTC时间同步',
 	'navNode_gIpsec' => 'IPsec',
 	'navNode_gIPsecGeneralSettings' => '基本设置',
 	'gIPsecGeneralSettings' => '基本设置',
Index: /branches/rel_ag_9_4/webui/proxy/new/inc/language/default.php
===================================================================
--- /branches/rel_ag_9_4/webui/proxy/new/inc/language/default.php	(revision 20224)
+++ /branches/rel_ag_9_4/webui/proxy/new/inc/language/default.php	(working copy)
@@ -2323,7 +2323,7 @@
 	'vs_aaa_label_sso_auth' => 'SSO Authentication',
 	'vs_aaa_label_sso_auth_tip' => 'The SSO authentication server must be one of the authentication servers previously entered. Or please enter "".',
 	'vs_aaa_label_sso_auth_tip_note' => '*Note:The SSO authentication server must be one of the authentication servers previously entered. Or please enter "".',
-	'vs_aaa_otp_auth_serv' => 'OTP Authentication Server',
+	'vs_aaa_otp_auth_serv' => 'OTP Authentication SMS Server',
 	'vs_aaa_otp_phone_serv' => 'Server for Phone Number Retrieval',
 	'vs_aaa_method_otp_note' => '*Note:The Server for Phone Number Retrieval must be one of the AAA server (Authentication/Authorization)specified for this AAA method',
 	'vs_aaa_method_otp_note1' => '** Note:If the Server for Phone Number Retrieval is specified as an AAA server of the Client Certificate type, the Certificate SMS Configuration is necessary.',
@@ -2658,15 +2658,16 @@
 	'nfs_user_group_id' => 'NFS ID(Account,Group)',
 	'telephone_number' => 'Telephone Number',
 	'mail_address' => 'Mail Address',
-	'customer_info1' => 'Custom_info1',
-	'customer_info2' => 'Custom_info2',
-	'customer_info3' => 'Custom_info3',
-	'customer_info4' => 'Custom_info4',
-	'customer_info5' => 'Custom_info5',
+	'customer_info1' => 'MotionProOTP secret',
+	'customer_info2' => 'OTP Secret',
+	'customer_info3' => 'Custom_info1',
+	'customer_info4' => 'Custom_info2',
+	'customer_info5' => 'Custom_info3',
 	'force_password_change' => 'Enable Forced Password Change',
 	'add_local_account' => 'Add Local Account',
 	'edit_local_account' => 'Edit Local Account',
 	'footnote_optional_fields' => '* The fields below are optional. The IP and Netmask configuration are used by vpn.',
+	'otp_warning_message' => '* NOTE: Please ensure that NTP is running or system time is synchronized with UTC time.',
 	'nfs_user_id' => 'NFS Account ID',
 	'search' => 'Search',
 	'account_configuration' => 'Configure For ALL Local Accounts',
Index: /branches/rel_ag_9_4/webui/proxy/new/inc/language/japanese.php
===================================================================
--- /branches/rel_ag_9_4/webui/proxy/new/inc/language/japanese.php	(revision 20224)
+++ /branches/rel_ag_9_4/webui/proxy/new/inc/language/japanese.php	(working copy)
@@ -4710,11 +4710,11 @@
 	'acl_resource_definition'                  => 'リソース定義',
 	'import_certificate_via_tftp'              => 'TFTP で証明書インポート',
 	'crl_status_list'                          => '証明書破棄リストステータス',
-	'customer_info3'                           => 'カスタム情報3',
-	'customer_info2'                           => 'カスタム情報2',
-	'customer_info1'                           => 'カスタム情報1',
-	'customer_info5'                           => 'カスタム情報5',
-	'customer_info4'                           => 'カスタム情報4',
+	'customer_info1'                           => 'MotionProOTP鍵',
+	'customer_info2'                           => 'OTP鍵',
+	'customer_info3'                           => 'カスタム情報1',
+	'customer_info4'                           => 'カスタム情報2',
+	'customer_info5'                           => 'カスタム情報3',
 	'activex'                                  => 'ActiveX',
 	'one_row_selection'                        => 'この操作には 1 つの行のみ選択できます。',
 	'ignore'                                   => '無視',
@@ -5347,6 +5347,7 @@
 	'gIPsecPhase1_dhgroup_msg'                 => '(Diffie-Hellman べき乗グループ)',
 	'advNet_ipsec_phase2_pfsgroup_msg'         => '(Diffie-Hellman べき乗グループ)',
 	'aaa_method_l2tp_msg'                      => '* 注: このオプションは、AAA ランクがオフの場合に有効となり、モバイル VPN クライアントの AAA メソッドを指定します。',
+	'otp_warning_message'                      => '* 注: NTPが実行されているか、システムの時刻がUTC時刻と同期していることを確認してください',
 	'advNet_ipsec_phase1_delete_allrow'        => 'これは最後の提案で、この提案の削除により、全ての仮想サイトに対するIPSec機能が停止します。\n本当に削除しますか?',
 	'aaa_rd_accounting_fail' => 'アカウンティングに失敗した場合、アクセスを許可',
 	'position_format_error' => '位置: 0から1000までの整数である必要があります。',
Index: /branches/rel_ag_9_4/webui/proxy/new/incVirtual/localdb/class.cliWrap_vLocalDBAccounts.php
===================================================================
--- /branches/rel_ag_9_4/webui/proxy/new/incVirtual/localdb/class.cliWrap_vLocalDBAccounts.php	(revision 20224)
+++ /branches/rel_ag_9_4/webui/proxy/new/incVirtual/localdb/class.cliWrap_vLocalDBAccounts.php	(working copy)
@@ -425,11 +425,10 @@
 						trim($t_data->telephone),
 						trim($t_data->email),
 						preg_replace("/([ ]*\()|(\)[ ]*)/", "", $t_data->nfs_info),
+						trim($t_data->OTP_secret),
 						trim($t_data->custom_info1),
 						trim($t_data->custom_info2),
 						trim($t_data->custom_info3),
-						trim($t_data->custom_info4),
-						trim($t_data->custom_info5),
 						trim($t_data->force_passwd_change), 
 						trim($t_data->lockout_manual), 
 						'',
@@ -817,7 +816,6 @@
 				"' . language::translate('telephone_number') . '",
 				"' . language::translate('mail_address') . '",
 				"' . language::translate('nfs_user_group_id') . '",
-				"' . language::translate('customer_info1') . '",
 				"' . language::translate('customer_info2') . '",
 				"' . language::translate('customer_info3') . '",
 				"' . language::translate('customer_info4') . '",
@@ -840,8 +838,8 @@
 		$this->jsAppend .= 'var accountDataText = [';
 		$t_keyMin = (pilot::getSessionData('pageIndexStart') - 1) * pilot::getSessionData('rowMax');
 		while (list($t_key, $t_data) = each($this->accountArr)) {
-			$this->jsAppend .= '["' . helper::makeHTMLSafe($t_data[0]) . '", "' . $t_data[1] . '", "' . helper::makeHTMLSafe($t_data[2]) . '", "' . $t_data[3] . '", "' . $t_data[4] . '", "' . $t_data[5] . '", "' . $t_data[6] . '", "' . $t_data[7] . '", "' . $t_data[8] . '", "' . $t_data[9] . '", "' . $t_data[10] . '", "' . $t_data[11] . '", "' . $t_data[12] . '", "' . $t_data[13] . '", "' . $t_data[14] . '", "' . $t_data[15] . '", "' . $t_data[16] . '", "' . $t_data[17] . '", "' . $t_data[18] . '", "' . $t_data[19] . '","' . helper::makeHTMLSafe($t_data[20]) . '","' . helper::makeHTMLSafe($t_data[21]) . '","' . helper::makeHTMLSafe($t_data[22]) . '"],';
-			$t_jsAppend .= '["' . helper::makeFormSafe($t_data[0]) . '", "' . $t_data[1] . '", "' . helper::makeFormSafe($t_data[2]) . '", "' . $t_data[3] . '", "' . $t_data[4] . '", "' . $t_data[5] . '", "' . $t_data[6] . '", "' . $t_data[7] . '", "' . $t_data[8] . '", "' . $t_data[9] . '", "' . $t_data[10] . '", "' . $t_data[11] . '", "' . $t_data[12] . '", "' . $t_data[13] . '", "' . $t_data[14] . '", "' . $t_data[15] . '", "' . $t_data[16] . '", "' . $t_data[17] . '", "' . $t_data[18] . '", "' . $t_data[19] . '","' . helper::makeFormSafe($t_data[20]) . '","' . helper::makeFormSafe($t_data[21]) . '","' . helper::makeFormSafe($t_data[22]) . '"],';
+			$this->jsAppend .= '["' . helper::makeHTMLSafe($t_data[0]) . '", "' . $t_data[1] . '", "' . helper::makeHTMLSafe($t_data[2]) . '", "' . $t_data[3] . '", "' . $t_data[4] . '", "' . $t_data[5] . '", "' . $t_data[6] . '", "' . $t_data[7] . '", "' . $t_data[8] . '", "' . $t_data[9] . '", "' . $t_data[10] . '", "' . $t_data[11] . '", "' . $t_data[12] . '", "' . $t_data[13] . '", "' . $t_data[14] . '", "' . $t_data[15] . '", "' . $t_data[16] . '", "' . $t_data[17] . '", "' . $t_data[18] . '","' . helper::makeHTMLSafe($t_data[19]) . '","' . helper::makeHTMLSafe($t_data[20]) . '","' . helper::makeHTMLSafe($t_data[21]) . '"],';
+            $t_jsAppend .= '["' . helper::makeHTMLSafe($t_data[0]) . '", "' . $t_data[1] . '", "' . helper::makeHTMLSafe($t_data[2]) . '", "' . $t_data[3] . '", "' . $t_data[4] . '", "' . $t_data[5] . '", "' . $t_data[6] . '", "' . $t_data[7] . '", "' . $t_data[8] . '", "' . $t_data[9] . '", "' . $t_data[10] . '", "' . $t_data[11] . '", "' . $t_data[12] . '", "' . $t_data[13] . '", "' . $t_data[14] . '", "' . $t_data[15] . '", "' . $t_data[16] . '", "' . $t_data[17] . '", "' . $t_data[18] . '","' . helper::makeHTMLSafe($t_data[19]) . '","' . helper::makeHTMLSafe($t_data[20]) . '","' . helper::makeHTMLSafe($t_data[21]) . '"],';
 		}
 		$this->jsAppend .= '];';
 		$t_jsAppend .= '];';
@@ -956,35 +954,34 @@
 					document.forms["form_mainView"].' . $this->classId . '_editConfirmPassword.value = accountDataValue[in_row][1];
 					document.forms["form_mainView"].' . $this->classId . '_editTelephoneNumber.value = accountDataValue[in_row][3];
 					document.forms["form_mainView"].' . $this->classId . '_editMailAddress.value = accountDataValue[in_row][4];
-					document.forms["form_mainView"].' . $this->classId . '_editcustomerinfo1.value = accountDataValue[in_row][6];
-					document.forms["form_mainView"].' . $this->classId . '_editcustomerinfo2.value = accountDataValue[in_row][7];
-					document.forms["form_mainView"].' . $this->classId . '_editcustomerinfo3.value = accountDataValue[in_row][8];
-					document.forms["form_mainView"].' . $this->classId . '_editcustomerinfo4.value = accountDataValue[in_row][9];
-					document.forms["form_mainView"].' . $this->classId . '_editcustomerinfo5.value = accountDataValue[in_row][10];
-					document.forms["form_mainView"].' . $this->classId . '_editForcePasswordChange.value = ((accountDataValue[in_row][11] == "Y") ? 1 : 0);
-					document.forms["form_mainView"].' . $this->classId . '_editlockoutmanual.value = ((accountDataValue[in_row][12] == "Y") ? 1 : 0);
-					//document.forms["form_mainView"].' . $this->classId . '_editlockoutmanualexpiration.value = accountDataValue[in_row][12];
-					document.forms["form_mainView"].' . $this->classId . '_editlockoutmanualduration.value = accountDataValue[in_row][14];
-					document.forms["form_mainView"].' . $this->classId . '_editloginfailure.value = ((accountDataValue[in_row][16] != "") ? 1 : 0);
-					document.forms["form_mainView"].' . $this->classId . '_editloginfailureexpiration.value = accountDataValue[in_row][13];
-					t_loginfailureDataArr = (accountDataValue[in_row][16] == "") ? ["",""] : accountDataValue[in_row][16].split(/,/);
+					document.forms["form_mainView"].' . $this->classId . '_editcustomerinfo2.value = accountDataValue[in_row][6];
+					document.forms["form_mainView"].' . $this->classId . '_editcustomerinfo3.value = accountDataValue[in_row][7];
+					document.forms["form_mainView"].' . $this->classId . '_editcustomerinfo4.value = accountDataValue[in_row][8];
+					document.forms["form_mainView"].' . $this->classId . '_editcustomerinfo5.value = accountDataValue[in_row][9];
+					document.forms["form_mainView"].' . $this->classId . '_editForcePasswordChange.value = ((accountDataValue[in_row][10] == "Y") ? 1 : 0);
+					document.forms["form_mainView"].' . $this->classId . '_editlockoutmanual.value = ((accountDataValue[in_row][11] == "Y") ? 1 : 0);
+					//document.forms["form_mainView"].' . $this->classId . '_editlockoutmanualexpiration.value = accountDataValue[in_row][11];
+					document.forms["form_mainView"].' . $this->classId . '_editlockoutmanualduration.value = accountDataValue[in_row][13];
+					document.forms["form_mainView"].' . $this->classId . '_editloginfailure.value = ((accountDataValue[in_row][15] != "") ? 1 : 0);
+					document.forms["form_mainView"].' . $this->classId . '_editloginfailureexpiration.value = accountDataValue[in_row][12];
+					t_loginfailureDataArr = (accountDataValue[in_row][15] == "") ? ["",""] : accountDataValue[in_row][15].split(/,/);
 					document.forms["form_mainView"].' . $this->classId . '_editloginfailureduration.value = t_loginfailureDataArr[0];
 					document.forms["form_mainView"].' . $this->classId . '_editloginfailureattempts.value =(( t_loginfailureDataArr[1] != null) ? t_loginfailureDataArr[1] : "");
-					document.forms["form_mainView"].' . $this->classId . '_editpasswdexpiration.value = accountDataValue[in_row][15];
-					document.forms["form_mainView"].' . $this->classId . '_editpasswdexpireage.value = ((accountDataValue[in_row][15] != "") ? 1 : 0);
-					//t_passwdexpireageDataArr = (accountDataValue[in_row][17] == "") ? ["",""] : accountDataValue[in_row][17].split(/,/);
-					//document.forms["form_mainView"].' . $this->classId . '_editpasswdexpireageduration.value = accountDataValue[in_row][17];
-					//document.forms["form_mainView"].' . $this->classId . '_editpasswdexpireagemode.value = accountDataValue[in_row][20];
+					document.forms["form_mainView"].' . $this->classId . '_editpasswdexpiration.value = accountDataValue[in_row][14];
+					document.forms["form_mainView"].' . $this->classId . '_editpasswdexpireage.value = ((accountDataValue[in_row][14] != "") ? 1 : 0);
+					//t_passwdexpireageDataArr = (accountDataValue[in_row][16] == "") ? ["",""] : accountDataValue[in_row][16].split(/,/);
+					//document.forms["form_mainView"].' . $this->classId . '_editpasswdexpireageduration.value = accountDataValue[in_row][16];
+					//document.forms["form_mainView"].' . $this->classId . '_editpasswdexpireagemode.value = accountDataValue[in_row][19];
 					document.forms["form_mainView"].' . $this->classId . '_editGroupList.value = accountDataValue[in_row][2];
 					t_nfsDataArr = (accountDataValue[in_row][5] == "") ? ["",""] : accountDataValue[in_row][5].split(/,/);
 					document.forms["form_mainView"].' . $this->classId . '_editNfsUserId.value = t_nfsDataArr[0];
 					document.forms["form_mainView"].' . $this->classId . '_editNfsGroupId.value = ((t_nfsDataArr[1] != null) ? t_nfsDataArr[1] : "");
-					document.forms["form_mainView"].' . $this->classId . '_editIpAddress.value = accountDataValue[in_row][18];
-					document.forms["form_mainView"].' . $this->classId . '_editIpNetmask.value = accountDataValue[in_row][19];
-					document.forms["form_mainView"].' . $this->classId . '_edit_app_sso_user_name.value = accountDataValue[in_row][20];
-					document.forms["form_mainView"].' . $this->classId . '_edit_app_sso_domain.value = accountDataValue[in_row][21];					
-					document.forms["form_mainView"].' . $this->classId . '_edit_app_sso_password.value = accountDataValue[in_row][22];
-					document.forms["form_mainView"].' . $this->classId . '_edit_app_sso_confirm_password.value = accountDataValue[in_row][22];					
+					document.forms["form_mainView"].' . $this->classId . '_editIpAddress.value = accountDataValue[in_row][17];
+					document.forms["form_mainView"].' . $this->classId . '_editIpNetmask.value = accountDataValue[in_row][18];
+					document.forms["form_mainView"].' . $this->classId . '_edit_app_sso_user_name.value = accountDataValue[in_row][19];
+					document.forms["form_mainView"].' . $this->classId . '_edit_app_sso_domain.value = accountDataValue[in_row][20];					
+					document.forms["form_mainView"].' . $this->classId . '_edit_app_sso_password.value = accountDataValue[in_row][21];
+					document.forms["form_mainView"].' . $this->classId . '_edit_app_sso_confirm_password.value = accountDataValue[in_row][21];					
 					formAction_setPage("vLocalDBAccountEdit");
 				} else {
 					document.forms["form_mainView"].submit();
Index: /branches/rel_ag_9_4/webui/proxy/new/incVirtual/localdb/class.cliWrap_vLocalDBAddEditAccount.php
===================================================================
--- /branches/rel_ag_9_4/webui/proxy/new/incVirtual/localdb/class.cliWrap_vLocalDBAddEditAccount.php	(revision 20224)
+++ /branches/rel_ag_9_4/webui/proxy/new/incVirtual/localdb/class.cliWrap_vLocalDBAddEditAccount.php	(working copy)
@@ -1096,24 +1096,27 @@
 											'');
 	
 				// FORM INPUT CUSTOMER_INFO1
-				$this->mainContent .= anLib_htmlCode::cliWrap_rowTextField (
-											'_customer_info1',
-											'customer_info1',
-											$this,
-											$this->Customer1Default,
-											$g_tabIndex++,
-											'maxlength="256" size="32"',
-											'');
-				// FORM INPUT CUSTOMER_INFO2
+				// $this->mainContent .= anLib_htmlCode::cliWrap_rowTextField (
+				// 							'_customer_info1',
+				// 							'customer_info1',
+				// 							$this,
+				// 							$this->Customer1Default,
+				// 							$g_tabIndex++,
+				// 							'maxlength="256" size="32"',
+				// 							'');	
+
+				// FORM INPUT OTP_SECRET
 				$this->mainContent .= anLib_htmlCode::cliWrap_rowTextField (
 											'_customer_info2',
 											'customer_info2',
 											$this,
 											$this->Customer2Default,
 											$g_tabIndex++,
-											'maxlength="256" size="32"',
+											'maxlength="16" size="32"',
 											'');
-				
+
+				$this->mainContent .= '<TR><TD></TD><TD>' . anLib_htmlCode::footnoteBox ('optionalFields', $this, array(array('status', language::translate('otp_warning_message')))) . '</TD></TR>';
+
 				// FORM INPUT CUSTOMER_INFO3
 				$this->mainContent .= anLib_htmlCode::cliWrap_rowTextField (
 											'_customer_info3',
