diff --git a/osaf/services/saf/immsv/immnd/immnd_main.c b/osaf/services/saf/immsv/immnd/immnd_main.c
--- a/osaf/services/saf/immsv/immnd/immnd_main.c
+++ b/osaf/services/saf/immsv/immnd/immnd_main.c
@@ -40,6 +40,7 @@
 
 #define FD_AMF 0
 #define FD_MBX 1
+#define FD_TERM 2
 
 static IMMND_CB _immnd_cb;
 IMMND_CB *immnd_cb = &_immnd_cb;
@@ -240,7 +241,9 @@ int main(int argc, char *argv[])
 				   server task when we are very bussy. */
 	int maxEvt = 100;
 	int64_t start_time = 0LL;
-	struct pollfd fds[2];
+	struct pollfd fds[3];
+
+	int term_fd;
 
 	daemonize(argc, argv);
 
@@ -249,6 +252,9 @@ int main(int argc, char *argv[])
 		goto done;
 	}
 
+	/* Install sigterm handler and obtain fd to process sigterm */
+	daemon_sigterm_install(&term_fd);
+
 	/* Get file descriptor for mailbox */
 	mbx_fd = m_NCS_IPC_GET_SEL_OBJ(&immnd_cb->immnd_mbx);
 
@@ -261,6 +267,8 @@ int main(int argc, char *argv[])
 	fds[FD_AMF].events = POLLIN;
 	fds[FD_MBX].fd = mbx_fd.rmv_obj;
 	fds[FD_MBX].events = POLLIN;
+	fds[FD_TERM].fd = term_fd;
+	fds[FD_TERM].events = POLLIN;
 
 	while (1) {
 		/* Watch out for performance bug. Possibly change from event-count
@@ -292,6 +300,16 @@ int main(int argc, char *argv[])
 		if (ret > 0) {
 			++eventCount;
 
+			if (fds[FD_TERM].revents & POLLIN) {
+				if (immnd_cb->mIsCoord) {
+					if (immnd_cb->pbePid > 0)
+						kill(immnd_cb->pbePid, SIGTERM);
+					if (immnd_cb->syncPid > 0)
+						kill(immnd_cb->syncPid, SIGTERM);
+				}
+				daemon_exit();
+			}
+
 			if (fds[FD_AMF].revents & POLLIN) {
 				if (immnd_cb->amf_hdl != 0) {
 					error = saAmfDispatch(immnd_cb->amf_hdl, SA_DISPATCH_ALL);
