diff --git a/osaf/services/infrastructure/fm/fms/fm_amf.c b/osaf/services/infrastructure/fm/fms/fm_amf.c
--- a/osaf/services/infrastructure/fm/fms/fm_amf.c
+++ b/osaf/services/infrastructure/fm/fms/fm_amf.c
@@ -117,7 +117,7 @@ void fm_saf_CSI_set_callback(SaInvocatio
 	syslog(LOG_INFO, "fm_saf_CSI_set_callback: Comp %s, state %s", compName->value, ha_role_string[haState - 1]);
 	fm_amf_cb = fm_amf_take_hdl();
 	if (fm_amf_cb != NULL) {
-		fm_cb->role = haState;
+		fm_cb->amf_state = haState;
 		error = saAmfResponse(fm_amf_cb->amf_hdl, invocation, error);
 		fm_cb->csi_assigned = true;
 	}
diff --git a/osaf/services/infrastructure/fm/fms/fm_cb.h b/osaf/services/infrastructure/fm/fms/fm_cb.h
--- a/osaf/services/infrastructure/fm/fms/fm_cb.h
+++ b/osaf/services/infrastructure/fm/fms/fm_cb.h
@@ -57,6 +57,9 @@ typedef struct fm_cb {
 /* Holds own role. */
 	PCS_RDA_ROLE role;
 
+/* AMF HA state for FM */
+	SaAmfHAStateT amf_state;
+	
 /* MDS handles. */
 	MDS_DEST adest;
 	MDS_HDL adest_hdl;
diff --git a/osaf/services/infrastructure/fm/fms/fm_evt.h b/osaf/services/infrastructure/fm/fms/fm_evt.h
--- a/osaf/services/infrastructure/fm/fms/fm_evt.h
+++ b/osaf/services/infrastructure/fm/fms/fm_evt.h
@@ -38,11 +38,16 @@ typedef struct gfm_gfm_msg {
 
 } GFM_GFM_MSG;
 
+typedef struct fm_rda_info_t {
+	PCS_RDA_ROLE role;
+} FM_RDA_INFO;
+
 /* FM generated events.*/
 typedef enum {
 	FM_EVT_TMR_EXP,
 	FM_EVT_NODE_DOWN,
 	FM_EVT_PEER_UP,
+	FM_EVT_RDA_ROLE,
 	FM_FSM_EVT_MAX
 } FM_FSM_EVT_CODE;
 
@@ -56,6 +61,7 @@ typedef struct fm_evt {
 	union {
 		FM_TMR *fm_tmr;
 		GFM_GFM_MSG gfm_msg;
+		FM_RDA_INFO rda_info;
 	} info;
 } FM_EVT;
 
diff --git a/osaf/services/infrastructure/fm/fms/fm_main.c b/osaf/services/infrastructure/fm/fms/fm_main.c
--- a/osaf/services/infrastructure/fm/fms/fm_main.c
+++ b/osaf/services/infrastructure/fm/fms/fm_main.c
@@ -74,6 +74,39 @@ static void sigusr1_handler(int sig)
 	ncs_sel_obj_ind(usr1_sel_obj);
 }
 
+/**
+ * Callback from RDA. Post a message/event to the clms mailbox.
+ * @param cb_hdl
+ * @param cb_info
+ * @param error_code
+ */
+static void rda_cb(uint32_t cb_hdl, PCS_RDA_CB_INFO *cb_info, PCSRDA_RETURN_CODE error_code)
+{
+	uint32_t rc;
+	FM_EVT *evt = NULL;
+
+	TRACE_ENTER();
+
+	evt = calloc(1, sizeof(FM_EVT));
+	if (NULL == evt) {
+		LOG_ER("calloc failed");
+		goto done;
+	}
+
+	evt->evt_code = FM_EVT_RDA_ROLE;
+	evt->info.rda_info.role = cb_info->info.io_role;
+
+	rc = ncs_ipc_send(&fm_cb->mbx, (NCS_IPC_MSG *)evt, MDS_SEND_PRIORITY_HIGH);
+	if (rc != NCSCC_RC_SUCCESS) {
+		syslog(LOG_ERR, "IPC send failed %d", rc);
+		free(evt);	
+	}
+
+ done:
+	TRACE_LEAVE();
+}
+
+
 /*****************************************************************************
 
 PROCEDURE NAME:       main
@@ -144,6 +177,11 @@ int main(int argc, char *argv[])
 		goto fm_init_failed;
 	}
 
+	if ((rc = rda_register_callback(0, rda_cb)) != NCSCC_RC_SUCCESS) {
+		syslog(LOG_ERR, "rda_register_callback FAILED %u", rc);
+		goto done;
+	}
+
 	if ((rc = ncs_sel_obj_create(&usr1_sel_obj)) != NCSCC_RC_SUCCESS) {
 		LOG_ER("ncs_sel_obj_create FAILED");
 		goto fm_init_failed;
@@ -326,27 +364,32 @@ static void fm_mbx_msg_handler(FM_CB *fm
 	switch (fm_mbx_evt->evt_code) {
 	case FM_EVT_NODE_DOWN:
 		LOG_NO("Role: %s, Node Down for node id: %x", role_string[fm_cb->role], fm_mbx_evt->node_id);
-		if ((fm_cb->role == PCS_RDA_STANDBY)||(fm_cb->role == PCS_RDA_QUIESCED)) {
-			if ((fm_mbx_evt->node_id == fm_cb->peer_node_id)) {
-				/* Start Promote active timer */
-				if ((fm_cb->role != PCS_RDA_QUIESCED) && (fm_cb->active_promote_tmr_val != 0)){
-					fm_tmr_start(&fm_cb->promote_active_tmr, fm_cb->active_promote_tmr_val);
-					LOG_NO("Promote active timer started");
-				} else {
-					/* Check whether node(AMF) initialization is done */
-					if (fm_cb->csi_assigned == false) {
-						opensaf_reboot(0, NULL,
-						"Failover occurred, but this node is not yet ready");
-					}
-					fm_cb->role = PCS_RDA_ACTIVE;
-					opensaf_reboot(fm_cb->peer_node_id, (char *)fm_cb->peer_node_name.value,
-						"Received Node Down for Active peer");
-					fm_rda_set_role(fm_cb, PCS_RDA_ACTIVE);
-				}
+		if ((fm_mbx_evt->node_id == fm_cb->peer_node_id)) {
+			/* Check whether node(AMF) initialization is done */
+			if (fm_cb->csi_assigned == false) {
+				opensaf_reboot(0, NULL,
+					"Failover occurred, but this node is not yet ready");
 			}
-		} else if (fm_cb->role == PCS_RDA_ACTIVE) {
+			/* Start Promote active timer */
+			if ((fm_cb->role == PCS_RDA_STANDBY) && (fm_cb->active_promote_tmr_val != 0)){
+				fm_tmr_start(&fm_cb->promote_active_tmr, fm_cb->active_promote_tmr_val);
+				LOG_NO("Promote active timer started");
+			} else {
+				TRACE("rda role: %s, amf_state: %u", role_string[fm_cb->role], fm_cb->amf_state);
+			/* The local node is either Quiesced or Active. Reboot the peer node. 
+			 * Note: If local node is Active, there are two interpretations.
+			 *	- Normal scenario where the Standby went down
+			 *	- Standby went down in the middle of a swtichover and AMF has
+			 *	  transitioned CSI state, but not the RDA state.
+			 *       In both the cases, this node should be set to ACTIVE.
+			 */
+				if (fm_cb->role != fm_cb->amf_state )
+					LOG_NO("Failover occurred in the middle of switchover");
+				fm_cb->role = PCS_RDA_ACTIVE;
 				opensaf_reboot(fm_cb->peer_node_id, (char *)fm_cb->peer_node_name.value,
-					"Received Node Down for standby peer");
+					"Received Node Down for peer controller");
+				fm_rda_set_role(fm_cb, PCS_RDA_ACTIVE);
+			}
 		}
 		break;
 	case FM_EVT_PEER_UP:
@@ -371,7 +414,11 @@ static void fm_mbx_msg_handler(FM_CB *fm
 			fm_rda_set_role(fm_cb, PCS_RDA_ACTIVE);
 		}
 		break;
-
+	case FM_EVT_RDA_ROLE:
+		/* RDA role assignment for this controller node */
+		fm_cb->role = fm_mbx_evt->info.rda_info.role;
+		syslog(LOG_INFO, "RDA role for this controller node: %s", role_string[fm_cb->role]);
+		break;
 	default:
 		break;
 	}
