Index: /branches/rel_apv_10_7/usr/click/bin/heartbeat/heartbeat.c
===================================================================
--- /branches/rel_apv_10_7/usr/click/bin/heartbeat/heartbeat.c	(revision 39561)
+++ /branches/rel_apv_10_7/usr/click/bin/heartbeat/heartbeat.c	(working copy)
@@ -20,7 +20,9 @@
 #include "heartbeat_writer.h"
 #include <click/sys/clickarray.h>
 #include <uinet_api.h>
+#include <sys/sysctl.h>
 
+#define sysctlbyname    u_sysctlbyname
 #define BUFFER_LEN 5000
 #define ERROR_MSG_LEN 500
 #define RESPONSE_LEN 102400
@@ -834,15 +836,31 @@
         json_object_put(result);
     } else {
         // not 200 ok
-        time_t t_now;
-
-        t_now = time(NULL);
-        if (t_now  - heartbeat_info.heartbeat_time >= HEARTBEAT_IDLE * 2) {
-            disable_license(1);
-            heartbeat_info.device_manage_status = UNREGISTERED;
-        } else {
-            write_heartbeat_info(CM_INFO, &heartbeat_info);
-        }
+	int new_licensepermit_enable;
+	size_t len = sizeof(new_licensepermit_enable);
+	if (sysctlbyname("net.inet.clicktcp.licensepermit_enable", &new_licensepermit_enable,
+		    &len, NULL, 0)) {
+	    logging("[heartbeat]error retrieving license information", 1);
+	}
+	/* Bug fix- TWSD-1121
+	 * The license is currently removed when the AMP service shuts down.
+	 * To prevent this and ensure the license is retained during service termination,
+	 * enable the activationserver licenspermit setting.
+	 */
+	if (!new_licensepermit_enable) {
+	    time_t t_now;
+
+	    t_now = time(NULL);
+	    if (t_now  - heartbeat_info.heartbeat_time >= HEARTBEAT_IDLE * 2) {
+		disable_license(1);
+		heartbeat_info.device_manage_status = UNREGISTERED;
+	    } else {
+		write_heartbeat_info(CM_INFO, &heartbeat_info);
+	    }
+	} else {
+	    logging("[heartbeat]http status != 200. licensepermit enabled!", 1);
+	    heartbeat_info.device_manage_status = UNREGISTERED;
+	}
     }
 end:
     if (feactl_p) {
Index: /branches/rel_apv_10_7/usr/click/lib/libcaui/ca_ui.h
===================================================================
--- /branches/rel_apv_10_7/usr/click/lib/libcaui/ca_ui.h	(revision 39561)
+++ /branches/rel_apv_10_7/usr/click/lib/libcaui/ca_ui.h	(working copy)
@@ -460,6 +460,7 @@
 extern int clear_webui_language(void);
 /* Bug 15842, end */
 extern char *write_activation_server(void);
+extern char *write_licensepermit(void);
 extern int clear_activation_server(void);
 extern int clear_xmlrpc_ip(void);
 extern int clear_xmlrpc_config(void);
Index: /branches/rel_apv_10_7/usr/click/lib/libparser/commands.pm
===================================================================
--- /branches/rel_apv_10_7/usr/click/lib/libparser/commands.pm	(revision 39561)
+++ /branches/rel_apv_10_7/usr/click/lib/libparser/commands.pm	(working copy)
@@ -21498,6 +21498,45 @@
     },
 	{
 		obj_type => "MENU",
+		name => "licensepermit",
+		parent_menu => ".",
+		uniq_name => "root_licensepermit",
+		cmd_attribute => "CMD_ARRAYOS|CMD_SPROXY|CMD_NORMAL",
+		user_level => "CLI_LEVEL_ENGINEER",
+		help_string => "Retention of license",
+	},
+	{
+		obj_type => "ITEM",
+		name => "on",
+		menu => "root_licensepermit",
+		help_string => "Enable licensepermit",
+		cmd_attribute => "CMD_ARRAYOS|CMD_SPROXY|CMD_NORMAL|CMD_GLOBAL",
+		user_level => "CLI_LEVEL_ENGINEER",
+		function_name => "license_retention_enable",
+		function_args => [],
+	},
+	{
+		obj_type => "ITEM",
+		name => "off",
+		menu => "root_licensepermit",
+		help_string => "Disable licensepermit",
+		cmd_attribute => "CMD_ARRAYOS|CMD_SPROXY|CMD_NORMAL|CMD_GLOBAL",
+		user_level => "CLI_LEVEL_ENGINEER",
+		function_name => "license_retention_disable",
+		function_args => [],
+	},
+	{
+		obj_type => "ITEM",
+		name => "licensepermit",
+		menu => "root_show",
+		cmd_attribute => "CMD_ARRAYOS|CMD_NORMAL|CMD_GLOBAL",
+		user_level => "CLI_LEVEL_ENGINEER",
+		help_string => "Show licensepermit configurations.",
+		function_name => "show_licensepermit",
+		function_args => [],
+	},
+	{
+		obj_type => "MENU",
 		name => "webui",
 		parent_menu => ".",
 		uniq_name => "root_webui",
Index: /branches/rel_apv_10_7/usr/click/lib/libwebui/webui.h
===================================================================
--- /branches/rel_apv_10_7/usr/click/lib/libwebui/webui.h	(revision 39561)
+++ /branches/rel_apv_10_7/usr/click/lib/libwebui/webui.h	(working copy)
@@ -197,6 +197,11 @@
 ca_errcode_t show_activation_server(void);
 char *write_activation_server(void);
 
+ca_errcode_t license_retention_enable(void);
+ca_errcode_t license_retention_disable(void);
+ca_errcode_t show_licensepermit(void);
+char *write_licensepermit(void);
+
 /* Bug 15842, huangyf, 20070426 */
 char * write_webui_language(char *segment);    /* return commands for setting webui language */
 ca_errcode_t clear_webui_language(void); /* return webui language to default */
Index: /branches/rel_apv_10_7/usr/click/lib/libwebui/webui.c
===================================================================
--- /branches/rel_apv_10_7/usr/click/lib/libwebui/webui.c	(revision 39561)
+++ /branches/rel_apv_10_7/usr/click/lib/libwebui/webui.c	(working copy)
@@ -3437,6 +3437,76 @@
 	return 0;
 }
 
+char *
+write_licensepermit(void)
+{
+	char *buf = NULL;
+	char msg[128];
+	int new_licensepermit_enable = 0;
+	size_t len = sizeof(new_licensepermit_enable);
+
+	memset(msg, 0, sizeof(msg));
+	if (access("/var/crash/cm_address", F_OK) == 0) {
+		if (sysctlbyname("net.inet.clicktcp.licensepermit_enable",
+					&new_licensepermit_enable, &len, NULL, 0)){
+			perror("Error retrieving licenseperit information");
+			return NULL;
+		}
+		if (new_licensepermit_enable < 0) {
+			new_licensepermit_enable = 0;
+		}
+		snprintf(msg, sizeof(msg), "licensepermit %s\n", (new_licensepermit_enable == 1) ? "on" : "off");
+		buf = (char *)malloc(strlen(msg)+1);
+		if (buf == NULL) {
+			perror("Error allocating memory for license permit string");
+			return NULL;
+		}
+		strcpy(buf, msg);
+		return buf;
+	}
+	return NULL;
+}
+
+ca_errcode_t license_retention_enable(void)
+{
+	int new_licensepermit_enable = 1;
+
+	if (access("/var/crash/cm_address", F_OK) == 0) {
+		sysctlbyname("net.inet.clicktcp.licensepermit_enable", NULL, 0,
+				&new_licensepermit_enable, sizeof(new_licensepermit_enable));
+	}
+	return 0;
+}
+
+ca_errcode_t license_retention_disable(void)
+{
+	int new_licensepermit_enable = 0;
+
+	if (access("/var/crash/cm_address", F_OK) == 0) {
+		sysctlbyname("net.inet.clicktcp.licensepermit_enable", NULL, 0,
+				&new_licensepermit_enable, sizeof(new_licensepermit_enable));
+	}
+}
+
+ca_errcode_t show_licensepermit(void)
+{
+	int new_licensepermit_enable;
+	size_t len = sizeof(new_licensepermit_enable);
+
+	if (access("/var/crash/cm_address", F_OK) == 0) {
+		if (sysctlbyname("net.inet.clicktcp.licensepermit_enable",
+					&new_licensepermit_enable, &len, NULL, 0)){
+			perror("Error retrieving licenseperit information");
+			return -1;
+		}
+		if (new_licensepermit_enable < 0) {
+			new_licensepermit_enable = 0;
+		}
+		printf("licensepermit %s\n", (new_licensepermit_enable == 1) ? "on" : "off");
+	}
+	return 0;
+}
+
 ca_errcode_t clear_activation_server(void)
 {
 	int model_id = 0;
Index: /branches/rel_apv_10_7/usr/src/sys/click/netinet/click_input.c
===================================================================
--- /branches/rel_apv_10_7/usr/src/sys/click/netinet/click_input.c	(revision 39561)
+++ /branches/rel_apv_10_7/usr/src/sys/click/netinet/click_input.c	(working copy)
@@ -869,6 +869,9 @@
 int domestic_equipment = 0; /* */
 SYSCTL_INT(_net_inet_clicktcp, OID_AUTO, domestic_equipment, CTLFLAG_RD,
          &domestic_equipment, 0, "check whether it is domestic equipment");
+int licensepermit_enable = 1;
+SYSCTL_INT(_net_inet_clicktcp, OID_AUTO, licensepermit_enable, CTLFLAG_RW,
+                &licensepermit_enable, 0, "license retention enable");
 
 static int sysctl_atcp_thread_init_done(SYSCTL_HANDLER_ARGS);
 int atcp_thread_init_done[ATCP_MAXTHREADS] = { 0 };
