diff --git a/osaf/libs/common/plmsv/include/plms_hrb.h b/osaf/libs/common/plmsv/include/plms_hrb.h
--- a/osaf/libs/common/plmsv/include/plms_hrb.h
+++ b/osaf/libs/common/plmsv/include/plms_hrb.h
@@ -72,5 +72,7 @@ SaUint32T plms_hrb_mds_msg_sync_send(MDS
 			PLMS_HPI_RSP **o_evt,
 			SaUint32T timeout);
 SaUint32T hrb_mds_msg_send(PLMS_HPI_RSP *response, MDS_SYNC_SND_CTXT context);
+
+extern SaUint32T plms_hrb_finalize();
 #endif   /* PLMS_HRB_H */
 
diff --git a/osaf/libs/common/plmsv/include/plms_hsm.h b/osaf/libs/common/plmsv/include/plms_hsm.h
--- a/osaf/libs/common/plmsv/include/plms_hsm.h
+++ b/osaf/libs/common/plmsv/include/plms_hsm.h
@@ -60,5 +60,6 @@ SaUint32T hsm_get_idr_info(SaHpiRptEntry
 SaUint32T convert_entitypath_to_string(SaHpiEntityPathT *entity_path,
                                         SaInt8T **ent_path_str);
 SaUint32T plms_hsm_session_close();
+SaUint32T plms_hsm_finalize();
 #endif   /* PLMS_HSM_H */
 
diff --git a/osaf/services/saf/cpsv/cpd/cpd_init.c b/osaf/services/saf/cpsv/cpd/cpd_init.c
--- a/osaf/services/saf/cpsv/cpd/cpd_init.c
+++ b/osaf/services/saf/cpsv/cpd/cpd_init.c
@@ -31,14 +31,18 @@
 #include "cpd_imm.h"
 #include <poll.h>
 
-#define FD_AMF 0
-#define FD_CLM 1
-#define FD_MBCSV 2
-#define FD_MBX 3
-#define FD_IMM 4		/* Must be the last in the fds array */
+enum {
+	FD_TERM = 0,
+	FD_AMF,
+	FD_CLM,
+	FD_MBCSV,
+	FD_MBX,
+	FD_IMM,
+	NUM_FD
+};
 
-static struct pollfd fds[5];
-static nfds_t nfds = 5;
+static struct pollfd fds[6];
+static nfds_t nfds = 6;
 uint32_t gl_cpd_cb_hdl = 0;
 
 /* Static Function Declerations */
@@ -423,6 +427,7 @@ void cpd_main_process(CPD_CB *cb)
 	NCS_MBCSV_ARG mbcsv_arg;
 	SaSelectionObjectT amf_sel_obj, clm_sel_obj;
 	SaAisErrorT error = SA_AIS_OK;
+	int term_fd;
 
 	mbx_fd = ncs_ipc_get_sel_obj(&cb->cpd_mbx);
 	error = saAmfSelectionObjectGet(cb->amf_hdl, &amf_sel_obj);
@@ -435,6 +440,8 @@ void cpd_main_process(CPD_CB *cb)
 		LOG_ER("cpd clm selectionobjget failed %u",error);
 		return;
 	}
+
+	daemon_sigterm_install(&term_fd);
 	
 	error = saClmClusterTrack(cb->clm_hdl, SA_TRACK_CHANGES_ONLY, NULL);
 	 if (error != SA_AIS_OK) {
@@ -444,6 +451,8 @@ void cpd_main_process(CPD_CB *cb)
 
 
 	/* Set up all file descriptors to listen to */
+	fds[FD_TERM].fd = term_fd;
+	fds[FD_TERM].events = POLLIN;
 	fds[FD_AMF].fd = amf_sel_obj;
 	fds[FD_AMF].events = POLLIN;
 	fds[FD_CLM].fd = clm_sel_obj;
@@ -460,9 +469,9 @@ void cpd_main_process(CPD_CB *cb)
 		if (cb->immOiHandle != 0) {
 			fds[FD_IMM].fd = cb->imm_sel_obj;
 			fds[FD_IMM].events = POLLIN;
-			nfds = FD_IMM + 1;
+			nfds = NUM_FD;
 		} else {
-			nfds = FD_IMM;
+			nfds = NUM_FD - 1;
 		}
 
 		int ret = poll(fds, nfds, -1);
@@ -474,6 +483,11 @@ void cpd_main_process(CPD_CB *cb)
 			break;
 		}
 
+		/* process the sig term */
+		if (fds[FD_TERM].revents & POLLIN) {
+			daemon_exit();
+		}
+
 		/* process all the AMF messages */
 		if (fds[FD_AMF].revents & POLLIN) {
 			/* dispatch all the AMF pending function */
diff --git a/osaf/services/saf/cpsv/cpnd/cpnd_init.c b/osaf/services/saf/cpsv/cpnd/cpnd_init.c
--- a/osaf/services/saf/cpsv/cpnd/cpnd_init.c
+++ b/osaf/services/saf/cpsv/cpnd/cpnd_init.c
@@ -498,6 +498,7 @@ void cpnd_main_process(CPND_CB *cb)
 	SaAisErrorT amf_error;
 	SaAisErrorT clm_error;
 	NCS_SEL_OBJ amf_ncs_sel_obj, clm_ncs_sel_obj, highest_sel_obj;
+	int term_fd;
 
 	mbx_fd = m_NCS_IPC_GET_SEL_OBJ(&cb->cpnd_mbx);
 	m_NCS_SEL_OBJ_ZERO(&all_sel_obj);
diff --git a/osaf/services/saf/edsv/eds/eds_cb.c b/osaf/services/saf/edsv/eds/eds_cb.c
--- a/osaf/services/saf/edsv/eds/eds_cb.c
+++ b/osaf/services/saf/edsv/eds/eds_cb.c
@@ -32,14 +32,18 @@ This contains the EDS_CB functions.
 #include "signal.h"
 #include "logtrace.h"
 
-#define FD_AMF 0
-#define FD_MBCSV 1
-#define FD_MBX 2
-#define FD_CLM 3
-#define FD_IMM 4		/* Must be the last in the fds array */
+enum {
+	FD_TERM = 0,
+	FD_AMF,
+	FD_MBCSV,
+	FD_MBX,
+	FD_CLM,
+	FD_IMM,
+	NUM_FD
+};
 
-static struct pollfd fds[5];
-static nfds_t nfds = 5;
+static struct pollfd fds[6];
+static nfds_t nfds = 6;
 
 
 /****************************************************************************
@@ -177,6 +181,7 @@ void eds_main_process(SYSF_MBX *mbx)
 	NCS_SEL_OBJ mbx_fd;
 	SaAisErrorT error = SA_AIS_OK;
 	EDS_CB *eds_cb = NULL;
+	int term_fd;
 	TRACE_ENTER();
 
 	if (NULL == (eds_cb = (EDS_CB *)ncshm_take_hdl(NCS_SERVICE_ID_EDS, gl_eds_hdl))) {
@@ -195,7 +200,11 @@ void eds_main_process(SYSF_MBX *mbx)
 		exit(EXIT_FAILURE);
 	}
 
+	daemon_sigterm_install(&term_fd);
+
 	/* Set up all file descriptors to listen to */
+	fds[FD_TERM].fd = term_fd;
+	fds[FD_TERM].events = POLLIN;
 	fds[FD_AMF].fd = eds_cb->amfSelectionObject;
 	fds[FD_AMF].events = POLLIN;
 	fds[FD_CLM].fd = eds_cb->clm_sel_obj;
@@ -214,9 +223,9 @@ void eds_main_process(SYSF_MBX *mbx)
 		if ((eds_cb->immOiHandle != 0) && (eds_cb->is_impl_set == true)){
 			fds[FD_IMM].fd = eds_cb->imm_sel_obj;
 			fds[FD_IMM].events = POLLIN;
-			nfds = FD_IMM + 1;
+			nfds = NUM_FD;
 		} else {
-			nfds = FD_IMM;
+			nfds = NUM_FD - 1;
 		}
 		
 		int ret = poll(fds, nfds, -1);
@@ -228,6 +237,12 @@ void eds_main_process(SYSF_MBX *mbx)
 			TRACE("poll failed - %s", strerror(errno));
 			break;
 		}
+
+		/* process the sigterm */
+		if (fds[FD_TERM].revents & POLLIN) {
+			daemon_exit();
+		}
+
 		/* process all the AMF messages */
 		if (fds[FD_AMF].revents & POLLIN) {
 			/* dispatch all the AMF pending callbacks */
diff --git a/osaf/services/saf/glsv/gld/gld_api.c b/osaf/services/saf/glsv/gld/gld_api.c
--- a/osaf/services/saf/glsv/gld/gld_api.c
+++ b/osaf/services/saf/glsv/gld/gld_api.c
@@ -32,13 +32,17 @@ uint32_t gl_gld_hdl;
 
 void gld_main_process(SYSF_MBX *mbx);
 
-#define FD_AMF 0
-#define FD_MBCSV 1
-#define FD_MBX 2
-#define FD_IMM 3		/* Must be the last in the fds array */
+enum {
+	FD_TERM = 0,
+	FD_AMF,
+	FD_MBCSV,
+	FD_MBX,
+	FD_IMM,
+	NUM_FD
+};
 
-static struct pollfd fds[4];
-static nfds_t nfds = 4;
+static struct pollfd fds[5];
+static nfds_t nfds = 5;
 
 /****************************************************************************
  * Name          : ncs_glsv_gld_lib_req
@@ -475,6 +479,8 @@ void gld_main_process(SYSF_MBX *mbx)
 	GLSV_GLD_CB *gld_cb = NULL;
 	NCS_MBCSV_ARG mbcsv_arg;
 	SaSelectionObjectT amf_sel_obj;
+	int term_fd;
+
 	TRACE_ENTER();
 
 	if ((gld_cb = (GLSV_GLD_CB *)ncshm_take_hdl(NCS_SERVICE_ID_GLD, gl_gld_hdl))
@@ -491,6 +497,8 @@ void gld_main_process(SYSF_MBX *mbx)
 		goto end;
 	}
 
+	daemon_sigterm_install(&term_fd);
+
 	/* Set up all file descriptors to listen to */
 	fds[FD_AMF].fd = amf_sel_obj;
 	fds[FD_AMF].events = POLLIN;
@@ -505,9 +513,9 @@ void gld_main_process(SYSF_MBX *mbx)
 		if ((gld_cb->immOiHandle != 0) && (gld_cb->is_impl_set == true)){
 			fds[FD_IMM].fd = gld_cb->imm_sel_obj;
 			fds[FD_IMM].events = POLLIN;
-			nfds = FD_IMM + 1;
+			nfds = NUM_FD;
 		} else {
-			nfds = FD_IMM;
+			nfds = NUM_FD - 1;
 		}
 
 		int ret = poll(fds, nfds, -1);
@@ -520,6 +528,10 @@ void gld_main_process(SYSF_MBX *mbx)
 			break;
 		}
 
+		if (fds[FD_TERM].revents & POLLIN) {
+			daemon_exit();
+		}
+
 		if (fds[FD_AMF].revents & POLLIN) {
 			if (gld_cb->amf_hdl != 0) {
 				/* dispatch all the AMF pending function */
diff --git a/osaf/services/saf/mqsv/mqd/mqd_api.c b/osaf/services/saf/mqsv/mqd/mqd_api.c
--- a/osaf/services/saf/mqsv/mqd/mqd_api.c
+++ b/osaf/services/saf/mqsv/mqd/mqd_api.c
@@ -51,13 +51,17 @@
 
 MQDLIB_INFO gl_mqdinfo;
 
-#define FD_AMF 0
-#define FD_MBCSV 1
-#define FD_MBX 2
-#define FD_CLM 3
+enum {
+	FD_TERM = 0,
+	FD_AMF,
+	FD_MBCSV,
+	FD_MBX,
+	FD_CLM,
+	NUM_FD
+};
 
-static struct pollfd fds[4];
-static nfds_t nfds = 4;
+static struct pollfd fds[5];
+static nfds_t nfds = 5;
 
 /******************************** LOCAL ROUTINES *****************************/
 static uint32_t mqd_lib_init(void);
@@ -422,6 +426,8 @@ void mqd_main_process(uint32_t hdl)
 	SaAisErrorT err = SA_AIS_OK;
 	NCS_MBCSV_ARG mbcsv_arg;
 	SaSelectionObjectT amfSelObj,clmSelObj;
+	int term_fd;
+
 	TRACE_ENTER();
 	/* Get the controll block */
 	pMqd = ncshm_take_hdl(NCS_SERVICE_ID_MQD, hdl);
@@ -447,6 +453,8 @@ void mqd_main_process(uint32_t hdl)
 	}
 	TRACE_1("saClmSelectionObjectGet success");
 
+	daemon_sigterm_install(&term_fd);
+
 	err = saClmClusterTrack(pMqd->clm_hdl, SA_TRACK_CHANGES_ONLY, NULL);
 	if (SA_AIS_OK != err) {
 		LOG_ER("saClmClusterTrack failed with error %d", err);
@@ -456,6 +464,8 @@ void mqd_main_process(uint32_t hdl)
 	TRACE_1("saClmClusterTrack success");
 
 	/* Set up all file descriptors to listen to */
+	fds[FD_TERM].fd = term_fd;
+	fds[FD_TERM].events = POLLIN;
 	fds[FD_AMF].fd = amfSelObj;
 	fds[FD_AMF].events = POLLIN;
 	fds[FD_CLM].fd = clmSelObj;
@@ -475,6 +485,10 @@ void mqd_main_process(uint32_t hdl)
 			break;
 		}
 
+		if (fds[FD_TERM].revents & POLLIN) {
+			daemon_exit();
+		}
+
 		/* Dispatch all the AMF pending function */
 		if (fds[FD_AMF].revents & POLLIN) {
 			err = saAmfDispatch(pMqd->amf_hdl, SA_DISPATCH_ALL);
diff --git a/osaf/services/saf/mqsv/mqnd/mqnd_init.c b/osaf/services/saf/mqsv/mqnd/mqnd_init.c
--- a/osaf/services/saf/mqsv/mqnd/mqnd_init.c
+++ b/osaf/services/saf/mqsv/mqnd/mqnd_init.c
@@ -33,12 +33,17 @@
 #define MQND_CLM_API_TIMEOUT 10000000000LL
 uint32_t gl_mqnd_cb_hdl = 0;
 
-#define FD_AMF 0
-#define FD_CLM 1
-#define FD_MBX 2
-#define FD_IMM 3		/* Must be the last in the fds array */
-static struct pollfd fds[4];
-static nfds_t nfds = 4;
+enum {
+	FD_TERM = 0,
+	FD_AMF,
+	FD_CLM,
+	FD_MBX,
+	FD_IMM,
+	NUM_FD
+};
+
+static struct pollfd fds[5];
+static nfds_t nfds = 5;
 /* Static Function Declerations */
 static uint32_t mqnd_extract_create_info(int argc, char *argv[], MQSV_CREATE_INFO *create_info);
 static uint32_t mqnd_extract_destroy_info(int argc, char *argv[], MQSV_DESTROY_INFO *destroy_info);
@@ -748,6 +753,8 @@ void mqnd_main_process(uint32_t hdl)
 	MQSV_DSEND_EVT *dsend_evt = NULL;
 	SaSelectionObjectT amf_sel_obj, clm_sel_obj;
 	SaAisErrorT clm_error, err;
+	int term_fd;
+
 	TRACE_ENTER();
 
 	cb = ncshm_take_hdl(NCS_SERVICE_ID_MQND, hdl);
@@ -765,11 +772,15 @@ void mqnd_main_process(uint32_t hdl)
 	}
 	TRACE_1("saAmfSelectionObjectGet Successfull");
 
+	daemon_sigterm_install(&term_fd);
+
 	if (saClmSelectionObjectGet(cb->clm_hdl, &clm_sel_obj) != SA_AIS_OK) {
 		LOG_ER("saClmSelectionObjectGet Failed");
 		return;
 	}
 
+	fds[FD_TERM].fd = term_fd;
+	fds[FD_TERM].events = POLLIN;
 	fds[FD_AMF].fd = amf_sel_obj;
 	fds[FD_AMF].events = POLLIN;
 	fds[FD_CLM].fd = clm_sel_obj;
@@ -790,9 +801,9 @@ void mqnd_main_process(uint32_t hdl)
 		if (cb->immOiHandle != 0) {
 			fds[FD_IMM].fd = cb->imm_sel_obj;
 			fds[FD_IMM].events = POLLIN;
-			nfds = FD_IMM + 1;
+			nfds = NUM_FD;
 		} else {
-			nfds = FD_IMM;
+			nfds = NUM_FD - 1;
 		}
 
 		int ret = poll(fds, nfds, -1);
@@ -804,6 +815,10 @@ void mqnd_main_process(uint32_t hdl)
 			break;
 		}
 
+		if (fds[FD_TERM].revents & POLLIN) {
+			daemon_exit();
+		}
+
 		if (fds[FD_AMF].revents & POLLIN) {
 			if (cb->amf_hdl != 0) {
 				err = saAmfDispatch(cb->amf_hdl, SA_DISPATCH_ALL);
diff --git a/osaf/services/saf/plmsv/plms/hpi_intf/plms_hrb.c b/osaf/services/saf/plmsv/plms/hpi_intf/plms_hrb.c
--- a/osaf/services/saf/plmsv/plms/hpi_intf/plms_hrb.c
+++ b/osaf/services/saf/plmsv/plms/hpi_intf/plms_hrb.c
@@ -136,6 +136,7 @@ SaUint32T plms_hrb_finalize()
 {
 	PLMS_HRB_CB *cb = hrb_cb;
 	SaUint32T   rc;
+	void *join;
 
 	/* detach the mail box */
         if ((rc = m_NCS_IPC_DETACH(&cb->mbx, hrb_cleanup_mbx, NULL)) 
@@ -152,8 +153,17 @@ SaUint32T plms_hrb_finalize()
 		
 
 	/* Kill the HRB thread */
-	pthread_cancel(cb->thread_id);
+	if ((rc = pthread_cancel(cb->thread_id)) == 0) {
+		if ((rc = pthread_join(cb->thread_id, &join)) != 0)
+			LOG_NO("PLMS hrb thread join failed");
+	} else
+		LOG_NO("PLMS hrb thread cancel failed");
 
+	if ((rc = pthread_mutex_destroy(&hrb_ha_state.mutex)) != 0)
+		LOG_NO ("hrb_ha_state mutex destroy failed");
+
+	if ((rc = kill(cb->thread_id, SIGTERM)) != 0)
+		LOG_ER("kill of hrb thread failed with error:  %s", strerror(errno));
 	TRACE("exiing plms_hrb_finalize with ret value:%d",rc);
 
         return NCSCC_RC_SUCCESS;
diff --git a/osaf/services/saf/plmsv/plms/hpi_intf/plms_hsm.c b/osaf/services/saf/plmsv/plms/hpi_intf/plms_hsm.c
--- a/osaf/services/saf/plmsv/plms/hpi_intf/plms_hsm.c
+++ b/osaf/services/saf/plmsv/plms/hpi_intf/plms_hsm.c
@@ -200,6 +200,7 @@ SaUint32T plms_hsm_finalize(void)
 {
 	PLMS_HSM_CB     *cb = hsm_cb;
 	SaErrorT        rc;
+	void		*join;
 
 	/* Close the HPI session */
 	rc = saHpiSessionClose(cb->session_id);
@@ -210,10 +211,18 @@ SaUint32T plms_hsm_finalize(void)
         if (SA_OK != rc)
 		LOG_ER("HSM: saNtfFinalize return error: %d:\n",rc);
 
+        /* Kill the HSM thread */
+        if ((rc = pthread_cancel(cb->threadid)) == 0) {
+                if ((rc = pthread_join(cb->threadid, &join)) != 0)
+                        LOG_NO("PLMS hsm thread join failed");
+        } else
+                LOG_NO("PLMS hsm thread cancel failed");
+	
+	if ((rc = pthread_mutex_destroy(&hsm_ha_state.mutex)) != 0)
+		LOG_NO ("hsm_ha_state mutex destroy failed");
 
-	/* Kill the HSM thread */
-	pthread_cancel(cb->threadid);
-	
+	if ((rc = kill(cb->threadid, SIGTERM)) != 0)
+		LOG_ER("kill of hsm thread failed with error:  %s", strerror(errno));
 	return NCSCC_RC_SUCCESS;
 }    
 /*********************************************************************
diff --git a/osaf/services/saf/plmsv/plms/plms_main.c b/osaf/services/saf/plmsv/plms/plms_main.c
--- a/osaf/services/saf/plmsv/plms/plms_main.c
+++ b/osaf/services/saf/plmsv/plms/plms_main.c
@@ -41,11 +41,15 @@
 #include "plms_hrb.h"
 #include "plms_mbcsv.h"
 
-#define FD_USR1 0
-#define FD_AMF 0
-#define FD_MBCSV 1
-#define FD_MBX 2
-#define FD_IMM 3
+enum {
+	FD_TERM = 0,
+	FD_USR1,
+	FD_AMF,
+	FD_MBCSV,
+	FD_MBX,
+	FD_IMM,
+	NUM_FD
+};
 
 static PLMS_CB  _plms_cb;
 PLMS_CB *plms_cb = &_plms_cb;
@@ -412,9 +416,10 @@ done:
 int main(int argc, char *argv[])
 {
 	NCS_SEL_OBJ mbx_fd;
-	struct pollfd fds[4];
+	struct pollfd fds[5];
 	SaAisErrorT error;
 	SaInt8T num_fds;
+	int term_fd;
 
 	daemonize(argc, argv);
 
@@ -424,6 +429,7 @@ int main(int argc, char *argv[])
 	}
 
 	mbx_fd = m_NCS_IPC_GET_SEL_OBJ(&plms_cb->mbx);
+	daemon_sigterm_install(&term_fd);
 	
 	/* Wait on all the FDs */
 	/* Set up all file descriptors to listen to */
@@ -438,9 +444,9 @@ int main(int argc, char *argv[])
 		if (plms_cb->oi_hdl != 0) {
 			fds[FD_IMM].fd = plms_cb->imm_sel_obj;
 			fds[FD_IMM].events = POLLIN;
-			num_fds = 4;
+			num_fds = NUM_FD;
 		} else {
-			num_fds = 3;
+			num_fds = NUM_FD - 1;
 		}
                 int ret = poll(fds, num_fds, -1);
 
@@ -451,6 +457,12 @@ int main(int argc, char *argv[])
 			break;
 		}
 
+		if (fds[FD_TERM].revents & POLLIN) {
+			plms_hrb_finalize();
+			plms_hsm_finalize();
+			daemon_exit(); /* exit forcibly, for now */
+		}
+
 		if (fds[FD_MBCSV].revents & POLLIN) {
 			if (plms_mbcsv_dispatch() != NCSCC_RC_SUCCESS) {
 				LOG_ER("PLMS MBCSv Dispatch Failed");
