diff --git a/include/iba/ib_types.h b/include/iba/ib_types.h
index 5c238ae..24bad76 100644
--- a/include/iba/ib_types.h
+++ b/include/iba/ib_types.h
@@ -6242,6 +6242,65 @@ ib_port_info_set_phy_and_overrun_err_thd(IN ib_port_info_t * const p_pi,
 * SEE ALSO
 *********/
 
+/****f* IBA Base: Types/ib_port_info_get_m_key
+* NAME
+*	ib_port_info_get_m_key
+*
+* DESCRIPTION
+*	Gets the M_Key
+*
+* SYNOPSIS
+*/
+static inline ib_net64_t OSM_API
+ib_port_info_get_m_key(IN const ib_port_info_t * const p_pi)
+{
+	return p_pi->m_key;
+}
+
+/*
+* PARAMETERS
+*	p_pi
+*		[in] Pointer to a PortInfo attribute.
+*
+* RETURN VALUES
+*	M_Key.
+*
+* NOTES
+*
+* SEE ALSO
+*********/
+
+/****f* IBA Base: Types/ib_port_info_set_m_key
+* NAME
+*	ib_port_info_set_m_key
+*
+* DESCRIPTION
+*	Sets the M_Key value
+*
+* SYNOPSIS
+*/
+static inline void OSM_API
+ib_port_info_set_m_key(IN ib_port_info_t * const p_pi, IN ib_net64_t m_key)
+{
+	p_pi->m_key = m_key;
+}
+
+/*
+* PARAMETERS
+*	p_pi
+*		[in] Pointer to a PortInfo attribute.
+*	m_key
+*		[in] M_Key value.
+*
+* RETURN VALUES
+*	None.
+*
+* NOTES
+*
+* SEE ALSO
+*********/
+
+
 /****s* IBA Base: Types/ib_mlnx_ext_port_info_t
 * NAME
 *	ib_mlnx_ext_port_info_t
diff --git a/include/opensm/osm_sm.h b/include/opensm/osm_sm.h
index 710d206..e48c549 100644
--- a/include/opensm/osm_sm.h
+++ b/include/opensm/osm_sm.h
@@ -402,6 +402,7 @@ ib_api_status_t osm_sm_bind(IN osm_sm_t * p_sm, IN ib_net64_t port_guid);
 */
 ib_api_status_t osm_req_get(IN osm_sm_t * sm, IN const osm_dr_path_t * p_path,
 			    IN ib_net16_t attr_id, IN ib_net32_t attr_mod,
+			    IN boolean_t find_mkey, ib_net64_t m_key,
 			    IN cl_disp_msgid_t err_msg,
 			    IN const osm_madw_context_t * p_context);
 /*
@@ -419,6 +420,13 @@ ib_api_status_t osm_req_get(IN osm_sm_t * sm, IN const osm_dr_path_t * p_path,
 *	attr_mod
 *		[in] Attribute modifier for this request.
 *
+*	find_mkey
+*		[in] Flag to indicate whether the M_Key should be looked up for
+*		     this MAD.
+* 	m_key
+* 		[in] M_Key value to be send with this MAD. Applied, only when
+* 		     find_mkey is FALSE.
+*
 *	err_msg
 *		[in] Message id with which to post this MAD if an error occurs.
 *
@@ -467,7 +475,8 @@ void osm_send_req_mad(IN osm_sm_t * sm, IN osm_madw_t *p_madw);
 osm_madw_t *osm_prepare_req_set(IN osm_sm_t * sm, IN const osm_dr_path_t * p_path,
 				IN const uint8_t * p_payload,
 				IN size_t payload_size, IN ib_net16_t attr_id,
-				IN ib_net32_t attr_mod, IN cl_disp_msgid_t err_msg,
+				IN ib_net32_t attr_mod, IN boolean_t find_mkey,
+				IN ib_net64_t m_key, IN cl_disp_msgid_t err_msg,
 				IN const osm_madw_context_t * p_context);
 /*
 * PARAMETERS
@@ -489,6 +498,13 @@ osm_madw_t *osm_prepare_req_set(IN osm_sm_t * sm, IN const osm_dr_path_t * p_pat
 *	attr_mod
 *		[in] Attribute modifier for this request.
 *
+*	find_mkey
+*		[in] Flag to indicate whether the M_Key should be looked up for
+*		     this MAD.
+* 	m_key
+* 		[in] M_Key value to be send with this MAD. Applied, only when
+* 		     find_mkey is FALSE.
+*
 *	err_msg
 *		[in] Message id with which to post this MAD if an error occurs.
 *
@@ -513,7 +529,8 @@ osm_madw_t *osm_prepare_req_set(IN osm_sm_t * sm, IN const osm_dr_path_t * p_pat
 ib_api_status_t osm_req_set(IN osm_sm_t * sm, IN const osm_dr_path_t * p_path,
 			    IN const uint8_t * p_payload,
 			    IN size_t payload_size, IN ib_net16_t attr_id,
-			    IN ib_net32_t attr_mod, IN cl_disp_msgid_t err_msg,
+			    IN ib_net32_t attr_mod, IN boolean_t find_mkey,
+			    IN ib_net64_t m_key, IN cl_disp_msgid_t err_msg,
 			    IN const osm_madw_context_t * p_context);
 /*
 * PARAMETERS
@@ -535,6 +552,14 @@ ib_api_status_t osm_req_set(IN osm_sm_t * sm, IN const osm_dr_path_t * p_path,
 *	attr_mod
 *		[in] Attribute modifier for this request.
 *
+*	find_mkey
+*		[in] Flag to indicate whether the M_Key should be looked up for
+*		     this MAD.
+*
+* 	m_key
+* 		[in] M_Key value to be send with this MAD. Applied, only when
+* 		     find_mkey is FALSE.
+*
 *	err_msg
 *		[in] Message id with which to post this MAD if an error occurs.
 *
diff --git a/opensm/osm_guid_mgr.c b/opensm/osm_guid_mgr.c
index 5bb2c67..d826366 100644
--- a/opensm/osm_guid_mgr.c
+++ b/opensm/osm_guid_mgr.c
@@ -73,6 +73,8 @@ static void guidinfo_set(IN osm_sa_t *sa, IN osm_port_t *p_port,
 
 	status = osm_req_set(sa->sm, osm_physp_get_dr_path_ptr(p_port->p_physp),
 			     payload, sizeof(payload), IB_MAD_ATTR_GUID_INFO,
+			     FALSE,
+			     ib_port_info_get_m_key(&p_port->p_physp->port_info),
 			     cl_hton32((uint32_t)block_num),
 			     CL_DISP_MSGID_NONE, &context);
 	if (status != IB_SUCCESS)
diff --git a/opensm/osm_lid_mgr.c b/opensm/osm_lid_mgr.c
index 96ae4d6..ae8d234 100644
--- a/opensm/osm_lid_mgr.c
+++ b/opensm/osm_lid_mgr.c
@@ -1061,6 +1061,7 @@ static int lid_mgr_set_physp_pi(IN osm_lid_mgr_t * p_mgr,
 	status = osm_req_set(p_mgr->sm, osm_physp_get_dr_path_ptr(p_physp),
 			     payload, sizeof(payload), IB_MAD_ATTR_PORT_INFO,
 			     cl_hton32(osm_physp_get_port_num(p_physp)),
+			     FALSE, ib_port_info_get_m_key(&p_physp->port_info),
 			     CL_DISP_MSGID_NONE, &context);
 	if (status != IB_SUCCESS)
 		ret = -1;
diff --git a/opensm/osm_link_mgr.c b/opensm/osm_link_mgr.c
index 26671bf..95c5537 100644
--- a/opensm/osm_link_mgr.c
+++ b/opensm/osm_link_mgr.c
@@ -106,6 +106,7 @@ static int link_mgr_set_physp_pi(osm_sm_t * sm, IN osm_physp_t * p_physp,
 	int ret = 0;
 	ib_net32_t attr_mod, cap_mask;
 	boolean_t update_mkey = FALSE;
+	ib_net64_t m_key = 0;
 
 	OSM_LOG_ENTER(sm->p_log);
 
@@ -360,11 +361,15 @@ static int link_mgr_set_physp_pi(osm_sm_t * sm, IN osm_physp_t * p_physp,
 			}
 		}
 
-		if (osm_node_get_type(p_physp->p_node) == IB_NODE_TYPE_SWITCH) {
+		if (osm_node_get_type(p_physp->p_node) == IB_NODE_TYPE_SWITCH &&
+		    osm_physp_get_port_num(p_physp) != 0) {
 			physp0 = osm_node_get_physp_ptr(p_physp->p_node, 0);
 			cap_mask = physp0->port_info.capability_mask;
-		} else
+			m_key = ib_port_info_get_m_key(&physp0->port_info);
+		} else {
 			cap_mask = p_pi->capability_mask;
+			m_key = ib_port_info_get_m_key(p_pi);
+		}
 		if (cap_mask & IB_PORT_CAP_HAS_EXT_SPEEDS)
 			issue_ext = 1;
 
@@ -455,7 +460,8 @@ Send:
 		attr_mod |= cl_hton32(1 << 31);	/* AM SMSupportExtendedSpeeds */
 	status = osm_req_set(sm, osm_physp_get_dr_path_ptr(p_physp),
 			     payload, sizeof(payload), IB_MAD_ATTR_PORT_INFO,
-			     attr_mod, CL_DISP_MSGID_NONE, &context);
+			     attr_mod, FALSE, m_key,
+			     CL_DISP_MSGID_NONE, &context);
 	if (status)
 		ret = -1;
 
@@ -471,7 +477,7 @@ Send:
 		status = osm_req_set(sm, osm_physp_get_dr_path_ptr(p_physp),
 				     payload2, sizeof(payload2),
 				     IB_MAD_ATTR_MLNX_EXTENDED_PORT_INFO,
-				     cl_hton32(port_num),
+				     cl_hton32(port_num), FALSE, m_key,
 				     CL_DISP_MSGID_NONE, &context);
 		if (status)
 			ret = -1;
diff --git a/opensm/osm_mcast_mgr.c b/opensm/osm_mcast_mgr.c
index d4f9452..7993150 100644
--- a/opensm/osm_mcast_mgr.c
+++ b/opensm/osm_mcast_mgr.c
@@ -348,6 +348,7 @@ static int mcast_mgr_set_mft_block(osm_sm_t * sm, IN osm_switch_t * p_sw,
 				   uint32_t block_num, uint32_t position)
 {
 	osm_node_t *p_node;
+	osm_physp_t *p_physp;
 	osm_dr_path_t *p_path;
 	osm_madw_context_t context;
 	ib_api_status_t status;
@@ -366,7 +367,8 @@ static int mcast_mgr_set_mft_block(osm_sm_t * sm, IN osm_switch_t * p_sw,
 
 	CL_ASSERT(p_node);
 
-	p_path = osm_physp_get_dr_path_ptr(osm_node_get_physp_ptr(p_node, 0));
+	p_physp = osm_node_get_physp_ptr(p_node, 0);
+	p_path = osm_physp_get_dr_path_ptr(p_physp);
 
 	/*
 	   Send multicast forwarding table blocks to the switch
@@ -390,8 +392,9 @@ static int mcast_mgr_set_mft_block(osm_sm_t * sm, IN osm_switch_t * p_sw,
 
 		status = osm_req_set(sm, p_path, (void *)block, sizeof(block),
 				     IB_MAD_ATTR_MCAST_FWD_TBL,
-				     cl_hton32(block_id_ho), CL_DISP_MSGID_NONE,
-				     &context);
+				     cl_hton32(block_id_ho), FALSE,
+				     ib_port_info_get_m_key(&p_physp->port_info),
+				     CL_DISP_MSGID_NONE, &context);
 		if (status != IB_SUCCESS) {
 			OSM_LOG(sm->p_log, OSM_LOG_ERROR, "ERR 0A02: "
 				"Sending multicast fwd. tbl. block to %s failed (%s)\n",
@@ -1071,7 +1074,9 @@ static void mcast_mgr_set_mfttop(IN osm_sm_t * sm, IN osm_switch_t * p_sw)
 
 		status = osm_req_set(sm, p_path, (uint8_t *) & si,
 				     sizeof(si), IB_MAD_ATTR_SWITCH_INFO,
-				     0, CL_DISP_MSGID_NONE, &context);
+				     0, FALSE,
+				     ib_port_info_get_m_key(&p_physp->port_info),
+				     CL_DISP_MSGID_NONE, &context);
 
 		if (status != IB_SUCCESS)
 			OSM_LOG(sm->p_log, OSM_LOG_ERROR, "ERR 0A1B: "
diff --git a/opensm/osm_node_info_rcv.c b/opensm/osm_node_info_rcv.c
index 592f2de..786bcde 100644
--- a/opensm/osm_node_info_rcv.c
+++ b/opensm/osm_node_info_rcv.c
@@ -119,7 +119,7 @@ static void requery_dup_node_info(IN osm_sm_t * sm, osm_physp_t * p_physp,
 	context.ni_context.dup_count = count;
 
 	status = osm_req_get(sm, &path, IB_MAD_ATTR_NODE_INFO, 0,
-			     CL_DISP_MSGID_NONE, &context);
+			     TRUE, 0, CL_DISP_MSGID_NONE, &context);
 
 	if (status != IB_SUCCESS)
 		OSM_LOG(sm->p_log, OSM_LOG_ERROR, "ERR 0D02: "
@@ -311,7 +311,7 @@ static void ni_rcv_get_port_info(IN osm_sm_t * sm, IN osm_node_t * node,
 	for (; port < num_ports; port++) {
 		status = osm_req_get(sm, osm_physp_get_dr_path_ptr(physp),
 				     IB_MAD_ATTR_PORT_INFO, cl_hton32(port),
-				     CL_DISP_MSGID_NONE, &context);
+				     TRUE, 0, CL_DISP_MSGID_NONE, &context);
 		if (status != IB_SUCCESS)
 			OSM_LOG(sm->p_log, OSM_LOG_ERROR, "ERR OD02: "
 				"Failure initiating PortInfo request (%s)\n",
@@ -320,7 +320,7 @@ static void ni_rcv_get_port_info(IN osm_sm_t * sm, IN osm_node_t * node,
 			status = osm_req_get(sm,
 					     osm_physp_get_dr_path_ptr(physp),
 					     IB_MAD_ATTR_MLNX_EXTENDED_PORT_INFO,
-					     cl_hton32(port),
+					     cl_hton32(port), TRUE, 0,
 					     CL_DISP_MSGID_NONE, &context);
 			if (status != IB_SUCCESS)
 				OSM_LOG(sm->p_log, OSM_LOG_ERROR, "ERR 0D0B: "
@@ -344,8 +344,8 @@ void osm_req_get_node_desc(IN osm_sm_t * sm, osm_physp_t * p_physp)
 	    osm_node_get_node_guid(osm_physp_get_node_ptr(p_physp));
 
 	status = osm_req_get(sm, osm_physp_get_dr_path_ptr(p_physp),
-			     IB_MAD_ATTR_NODE_DESC, 0, CL_DISP_MSGID_NONE,
-			     &context);
+			     IB_MAD_ATTR_NODE_DESC, 0, TRUE, 0,
+			     CL_DISP_MSGID_NONE, &context);
 	if (status != IB_SUCCESS)
 		OSM_LOG(sm->p_log, OSM_LOG_ERROR, "ERR 0D03: "
 			"Failure initiating NodeDescription request (%s)\n",
@@ -537,6 +537,7 @@ static void ni_rcv_process_switch(IN osm_sm_t * sm, IN osm_node_t * p_node,
 				  IN const osm_madw_t * p_madw)
 {
 	ib_api_status_t status = IB_SUCCESS;
+	osm_physp_t *p_physp;
 	osm_madw_context_t context;
 	osm_dr_path_t *path;
 	ib_smp_t *p_smp;
@@ -545,8 +546,9 @@ static void ni_rcv_process_switch(IN osm_sm_t * sm, IN osm_node_t * p_node,
 
 	p_smp = osm_madw_get_smp_ptr(p_madw);
 
+	p_physp = osm_node_get_physp_ptr(p_node, 0);
 	/* update DR path of already initialized switch port 0 */
-	path = osm_physp_get_dr_path_ptr(osm_node_get_physp_ptr(p_node, 0));
+	path = osm_physp_get_dr_path_ptr(p_physp);
 	osm_dr_path_init(path, p_smp->hop_count, p_smp->initial_path);
 
 	context.si_context.node_guid = osm_node_get_node_guid(p_node);
@@ -555,8 +557,8 @@ static void ni_rcv_process_switch(IN osm_sm_t * sm, IN osm_node_t * p_node,
 	context.si_context.lft_top_change = FALSE;
 
 	/* Request a SwitchInfo attribute */
-	status = osm_req_get(sm, path, IB_MAD_ATTR_SWITCH_INFO,
-			     0, CL_DISP_MSGID_NONE, &context);
+	status = osm_req_get(sm, path, IB_MAD_ATTR_SWITCH_INFO, 0, TRUE, 0,
+			     CL_DISP_MSGID_NONE, &context);
 	if (status != IB_SUCCESS)
 		/* continue despite error */
 		OSM_LOG(sm->p_log, OSM_LOG_ERROR, "ERR 0D06: "
diff --git a/opensm/osm_perfmgr.c b/opensm/osm_perfmgr.c
index 9c1dd62..6f626df 100644
--- a/opensm/osm_perfmgr.c
+++ b/opensm/osm_perfmgr.c
@@ -822,7 +822,7 @@ static int sweep_hop_1(osm_sm_t * sm)
 		osm_dr_path_init(&hop_1_path, 1, path_array);
 		CL_PLOCK_ACQUIRE(sm->p_lock);
 		status = osm_req_get(sm, &hop_1_path, IB_MAD_ATTR_NODE_INFO, 0,
-				     CL_DISP_MSGID_NONE, &context);
+				     TRUE, 0, CL_DISP_MSGID_NONE, &context);
 		CL_PLOCK_RELEASE(sm->p_lock);
 
 		if (status != IB_SUCCESS)
@@ -856,7 +856,7 @@ static int sweep_hop_1(osm_sm_t * sm)
 			osm_dr_path_init(&hop_1_path, 1, path_array);
 			CL_PLOCK_ACQUIRE(sm->p_lock);
 			status = osm_req_get(sm, &hop_1_path,
-					     IB_MAD_ATTR_NODE_INFO, 0,
+					     IB_MAD_ATTR_NODE_INFO, 0, TRUE, 0,
 					     CL_DISP_MSGID_NONE, &context);
 			CL_PLOCK_RELEASE(sm->p_lock);
 
@@ -920,7 +920,7 @@ static int sweep_hop_0(osm_sm_t * sm)
 	osm_dr_path_init(&dr_path, 0, path_array);
 	CL_PLOCK_ACQUIRE(sm->p_lock);
 	status = osm_req_get(sm, &dr_path, IB_MAD_ATTR_NODE_INFO, 0,
-			     CL_DISP_MSGID_NONE, NULL);
+			     TRUE, 0, CL_DISP_MSGID_NONE, NULL);
 	CL_PLOCK_RELEASE(sm->p_lock);
 
 	if (status != IB_SUCCESS)
diff --git a/opensm/osm_pkey_mgr.c b/opensm/osm_pkey_mgr.c
index 97f76ad..105473f 100644
--- a/opensm/osm_pkey_mgr.c
+++ b/opensm/osm_pkey_mgr.c
@@ -178,18 +178,26 @@ pkey_mgr_update_pkey_entry(IN osm_sm_t * sm,
 {
 	osm_madw_context_t context;
 	osm_node_t *p_node = osm_physp_get_node_ptr(p_physp);
+	osm_physp_t *physp0;
 	uint32_t attr_mod;
+	ib_net64_t m_key;
 
 	context.pkey_context.node_guid = osm_node_get_node_guid(p_node);
 	context.pkey_context.port_guid = osm_physp_get_port_guid(p_physp);
 	context.pkey_context.set_method = TRUE;
 	attr_mod = block_index;
-	if (osm_node_get_type(p_node) == IB_NODE_TYPE_SWITCH)
+	if (osm_node_get_type(p_node) == IB_NODE_TYPE_SWITCH &&
+	    osm_physp_get_port_num(p_physp) != 0) {
 		attr_mod |= osm_physp_get_port_num(p_physp) << 16;
+		physp0 = osm_node_get_physp_ptr(p_node, 0);
+		m_key = ib_port_info_get_m_key(&physp0->port_info);
+	} else
+		m_key = ib_port_info_get_m_key(&p_physp->port_info);
 	return osm_req_set(sm, osm_physp_get_dr_path_ptr(p_physp),
 			   (uint8_t *) block, sizeof(*block),
 			   IB_MAD_ATTR_P_KEY_TABLE,
-			   cl_hton32(attr_mod), CL_DISP_MSGID_NONE, &context);
+			   cl_hton32(attr_mod), FALSE, m_key,
+			   CL_DISP_MSGID_NONE, &context);
 }
 
 static ib_api_status_t
@@ -200,6 +208,8 @@ pkey_mgr_enforce_partition(IN osm_log_t * p_log, osm_sm_t * sm,
 	osm_madw_context_t context;
 	uint8_t payload[IB_SMP_DATA_SIZE];
 	ib_port_info_t *p_pi;
+	ib_net64_t m_key;
+	osm_physp_t *physp0;
 	ib_api_status_t status;
 	uint8_t enforce_bits;
 
@@ -234,6 +244,9 @@ pkey_mgr_enforce_partition(IN osm_log_t * p_log, osm_sm_t * sm,
 	p_pi->state_info2 = 0;
 	ib_port_info_set_port_state(p_pi, IB_LINK_NO_CHANGE);
 
+	physp0 = osm_node_get_physp_ptr(p_physp->p_node, 0);
+	m_key = ib_port_info_get_m_key(&physp0->port_info);
+
 	context.pi_context.node_guid =
 	    osm_node_get_node_guid(osm_physp_get_node_ptr(p_physp));
 	context.pi_context.port_guid = osm_physp_get_port_guid(p_physp);
@@ -245,6 +258,7 @@ pkey_mgr_enforce_partition(IN osm_log_t * p_log, osm_sm_t * sm,
 			     payload, sizeof(payload),
 			     IB_MAD_ATTR_PORT_INFO,
 			     cl_hton32(osm_physp_get_port_num(p_physp)),
+			     FALSE, m_key,
 			     CL_DISP_MSGID_NONE, &context);
 	if (status != IB_SUCCESS)
 		OSM_LOG(p_log, OSM_LOG_ERROR, "ERR 0511: "
diff --git a/opensm/osm_port_info_rcv.c b/opensm/osm_port_info_rcv.c
index 961b376..1a7377a 100644
--- a/opensm/osm_port_info_rcv.c
+++ b/opensm/osm_port_info_rcv.c
@@ -171,6 +171,8 @@ static void pi_rcv_process_endport(IN osm_sm_t * sm, IN osm_physp_t * p_physp,
 						     osm_physp_get_dr_path_ptr
 						     (p_physp),
 						     IB_MAD_ATTR_SM_INFO, 0,
+						     FALSE,
+						     ib_port_info_get_m_key(&p_physp->port_info),
 						     CL_DISP_MSGID_NONE,
 						     &context);
 
@@ -289,6 +291,7 @@ static void pi_rcv_process_switch_port(IN osm_sm_t * sm, IN osm_node_t * p_node,
 
 				status = osm_req_get(sm, &path,
 						     IB_MAD_ATTR_NODE_INFO, 0,
+						     TRUE, 0,
 						     CL_DISP_MSGID_NONE,
 						     &context);
 
@@ -387,6 +390,8 @@ static void get_pkey_table(IN osm_log_t * p_log, IN osm_sm_t * sm,
 	osm_madw_context_t context;
 	ib_api_status_t status;
 	osm_dr_path_t path;
+	osm_physp_t *physp0;
+	ib_net64_t m_key;
 	uint8_t port_num;
 	uint16_t block_num, max_blocks;
 	uint32_t attr_mod_ho;
@@ -427,13 +432,18 @@ static void get_pkey_table(IN osm_log_t * p_log, IN osm_sm_t * sm,
 	}
 
 	for (block_num = 0; block_num < max_blocks; block_num++) {
-		if (osm_node_get_type(p_node) != IB_NODE_TYPE_SWITCH)
+		if (osm_node_get_type(p_node) != IB_NODE_TYPE_SWITCH ||
+		    osm_physp_get_port_num(p_physp) == 0) {
 			attr_mod_ho = block_num;
-		else
+			m_key = ib_port_info_get_m_key(&p_physp->port_info);
+		} else {
 			attr_mod_ho = block_num | (port_num << 16);
+			physp0 = osm_node_get_physp_ptr(p_node, 0);
+			m_key = ib_port_info_get_m_key(&physp0->port_info);
+		}
 		status = osm_req_get(sm, &path, IB_MAD_ATTR_P_KEY_TABLE,
-				     cl_hton32(attr_mod_ho),
-				     CL_DISP_MSGID_NONE, &context);
+				     cl_hton32(attr_mod_ho), FALSE,
+				     m_key, CL_DISP_MSGID_NONE, &context);
 
 		if (status != IB_SUCCESS) {
 			OSM_LOG(p_log, OSM_LOG_ERROR, "ERR 0F12: "
diff --git a/opensm/osm_qos.c b/opensm/osm_qos.c
index b443abb..a301803 100644
--- a/opensm/osm_qos.c
+++ b/opensm/osm_qos.c
@@ -91,8 +91,16 @@ static qos_mad_item_t *osm_qos_mad_create(IN osm_sm_t * sm,
 	osm_madw_context_t context;
 	osm_madw_t *p_madw;
 	osm_node_t *p_node;
+	osm_physp_t *physp0;
+	ib_net64_t m_key;
 
 	p_node = osm_physp_get_node_ptr(p);
+	if (osm_node_get_type(p_node) == IB_NODE_TYPE_SWITCH &&
+	    osm_physp_get_port_num(p) != 0) {
+		physp0 = osm_node_get_physp_ptr(p_node, 0);
+		m_key = ib_port_info_get_m_key(&physp0->port_info);
+	} else
+		m_key = ib_port_info_get_m_key(&p->port_info);
 
 	switch (attr_id){
 	case IB_MAD_ATTR_SLVL_TABLE:
@@ -118,6 +126,7 @@ static qos_mad_item_t *osm_qos_mad_create(IN osm_sm_t * sm,
 	p_madw = osm_prepare_req_set(sm, osm_physp_get_dr_path_ptr(p),
 				     p_data, data_size,
 				     attr_id, cl_hton32(attr_mod),
+				     FALSE, m_key,
 				     CL_DISP_MSGID_NONE, &context);
 
 	if (p_madw == NULL) {
diff --git a/opensm/osm_req.c b/opensm/osm_req.c
index f0fa406..b2cfefd 100644
--- a/opensm/osm_req.c
+++ b/opensm/osm_req.c
@@ -155,13 +155,14 @@ Remote_Guid:
 **********************************************************************/
 ib_api_status_t osm_req_get(IN osm_sm_t * sm, IN const osm_dr_path_t * p_path,
 			    IN ib_net16_t attr_id, IN ib_net32_t attr_mod,
+			    IN boolean_t find_mkey, ib_net64_t m_key,
 			    IN cl_disp_msgid_t err_msg,
 			    IN const osm_madw_context_t * p_context)
 {
 	osm_madw_t *p_madw;
 	ib_api_status_t status = IB_SUCCESS;
+	ib_net64_t m_key_calc;
 	ib_net64_t tid;
-	ib_net64_t m_key;
 
 	CL_ASSERT(sm);
 
@@ -191,18 +192,23 @@ ib_api_status_t osm_req_get(IN osm_sm_t * sm, IN const osm_dr_path_t * p_path,
 		tid = cl_hton64((uint64_t) cl_atomic_inc(&sm->sm_trans_id)
 							 & (uint64_t)(0xFFFFFFFF));
 
-	m_key = (sm->p_subn->opt.m_key_lookup == TRUE) ?
-		req_determine_mkey(sm, p_path) : sm->p_subn->opt.m_key;
+	if (sm->p_subn->opt.m_key_lookup == TRUE) {
+		if (find_mkey == TRUE)
+			m_key_calc = req_determine_mkey(sm, p_path);
+		else
+			m_key_calc = m_key;
+	} else
+		m_key_calc = sm->p_subn->opt.m_key;
 
 	OSM_LOG(sm->p_log, OSM_LOG_DEBUG,
 		"Getting %s (0x%X), modifier 0x%X, TID 0x%" PRIx64
 		", MKey 0x%016" PRIx64 "\n",
 		ib_get_sm_attr_str(attr_id), cl_ntoh16(attr_id),
-		cl_ntoh32(attr_mod), cl_ntoh64(tid), cl_ntoh64(m_key));
+		cl_ntoh32(attr_mod), cl_ntoh64(tid), cl_ntoh64(m_key_calc));
 
 	ib_smp_init_new(osm_madw_get_smp_ptr(p_madw), IB_MAD_METHOD_GET,
 			tid, attr_id, attr_mod, p_path->hop_count,
-			m_key, p_path->path,
+			m_key_calc, p_path->path,
 			IB_LID_PERMISSIVE, IB_LID_PERMISSIVE);
 
 	p_madw->mad_addr.dest_lid = IB_LID_PERMISSIVE;
@@ -233,12 +239,13 @@ osm_madw_t *osm_prepare_req_set(IN osm_sm_t * sm, IN const osm_dr_path_t * p_pat
 				IN const uint8_t * p_payload,
 				IN size_t payload_size,
 				IN ib_net16_t attr_id, IN ib_net32_t attr_mod,
+				IN boolean_t find_mkey, IN ib_net64_t m_key,
 				IN cl_disp_msgid_t err_msg,
 				IN const osm_madw_context_t * p_context)
 {
 	osm_madw_t *p_madw = NULL;
+	ib_net64_t m_key_calc;
 	ib_net64_t tid;
-	ib_net64_t m_key;
 
 	CL_ASSERT(sm);
 
@@ -268,18 +275,23 @@ osm_madw_t *osm_prepare_req_set(IN osm_sm_t * sm, IN const osm_dr_path_t * p_pat
 		tid = cl_hton64((uint64_t) cl_atomic_inc(&sm->sm_trans_id)
 							 & (uint64_t)(0xFFFFFFFF));
 
-	m_key = (sm->p_subn->opt.m_key_lookup == TRUE) ?
-		req_determine_mkey(sm, p_path) : sm->p_subn->opt.m_key;
+	if (sm->p_subn->opt.m_key_lookup == TRUE) {
+		if (find_mkey == TRUE)
+			m_key_calc = req_determine_mkey(sm, p_path);
+		else
+			m_key_calc = m_key;
+	} else
+		m_key_calc = sm->p_subn->opt.m_key;
 
 	OSM_LOG(sm->p_log, OSM_LOG_DEBUG,
 		"Setting %s (0x%X), modifier 0x%X, TID 0x%" PRIx64
 		", MKey 0x%016" PRIx64 "\n",
 		ib_get_sm_attr_str(attr_id), cl_ntoh16(attr_id),
-		cl_ntoh32(attr_mod), cl_ntoh64(tid), cl_ntoh64(m_key));
+		cl_ntoh32(attr_mod), cl_ntoh64(tid), cl_ntoh64(m_key_calc));
 
 	ib_smp_init_new(osm_madw_get_smp_ptr(p_madw), IB_MAD_METHOD_SET,
 			tid, attr_id, attr_mod, p_path->hop_count,
-			m_key, p_path->path,
+			m_key_calc, p_path->path,
 			IB_LID_PERMISSIVE, IB_LID_PERMISSIVE);
 
 	p_madw->mad_addr.dest_lid = IB_LID_PERMISSIVE;
@@ -318,14 +330,15 @@ ib_api_status_t osm_req_set(IN osm_sm_t * sm, IN const osm_dr_path_t * p_path,
                             IN const uint8_t * p_payload,
                             IN size_t payload_size,
                             IN ib_net16_t attr_id, IN ib_net32_t attr_mod,
+			    IN boolean_t find_mkey, IN ib_net64_t m_key,
                             IN cl_disp_msgid_t err_msg,
                             IN const osm_madw_context_t * p_context)
 {
 	osm_madw_t *p_madw;
 	ib_api_status_t status = IB_SUCCESS;
 
-	p_madw = osm_prepare_req_set(sm, p_path, p_payload, payload_size,attr_id,
-				     attr_mod, err_msg, p_context);
+	p_madw = osm_prepare_req_set(sm, p_path, p_payload, payload_size, attr_id,
+				     attr_mod, find_mkey, m_key, err_msg, p_context);
 	if (p_madw == NULL)
 		status = IB_INSUFFICIENT_RESOURCES;
 	else
diff --git a/opensm/osm_sm_state_mgr.c b/opensm/osm_sm_state_mgr.c
index 5d4b651..596ad8f 100644
--- a/opensm/osm_sm_state_mgr.c
+++ b/opensm/osm_sm_state_mgr.c
@@ -119,8 +119,9 @@ static void sm_state_mgr_send_master_sm_info_req(osm_sm_t * sm)
 	memcpy(&dr_path, osm_physp_get_dr_path_ptr(p_port->p_physp), sizeof(osm_dr_path_t));
 
 	status = osm_req_get(sm, &dr_path,
-			     IB_MAD_ATTR_SM_INFO, 0, CL_DISP_MSGID_NONE,
-			     &context);
+			     IB_MAD_ATTR_SM_INFO, 0, FALSE,
+			     ib_port_info_get_m_key(&p_port->p_physp->port_info),
+			     CL_DISP_MSGID_NONE, &context);
 	CL_PLOCK_RELEASE(sm->p_lock);
 
 	if (status != IB_SUCCESS)
diff --git a/opensm/osm_state_mgr.c b/opensm/osm_state_mgr.c
index 0cc8162..adfea9a 100644
--- a/opensm/osm_state_mgr.c
+++ b/opensm/osm_state_mgr.c
@@ -121,6 +121,7 @@ static void state_mgr_reset_switch_count(IN cl_map_item_t * p_map_item,
 static void state_mgr_get_sw_info(IN cl_map_item_t * p_object, IN void *context)
 {
 	osm_node_t *p_node;
+	osm_physp_t *p_physp;
 	osm_dr_path_t *p_dr_path;
 	osm_madw_context_t mad_context;
 	osm_switch_t *const p_sw = (osm_switch_t *) p_object;
@@ -130,8 +131,8 @@ static void state_mgr_get_sw_info(IN cl_map_item_t * p_object, IN void *context)
 	OSM_LOG_ENTER(sm->p_log);
 
 	p_node = p_sw->p_node;
-	p_dr_path =
-	    osm_physp_get_dr_path_ptr(osm_node_get_physp_ptr(p_node, 0));
+	p_physp = osm_node_get_physp_ptr(p_node, 0);
+	p_dr_path = osm_physp_get_dr_path_ptr(p_physp);
 
 	memset(&mad_context, 0, sizeof(mad_context));
 
@@ -141,6 +142,7 @@ static void state_mgr_get_sw_info(IN cl_map_item_t * p_object, IN void *context)
 	mad_context.si_context.lft_top_change = FALSE;
 
 	status = osm_req_get(sm, p_dr_path, IB_MAD_ATTR_SWITCH_INFO, 0,
+			     FALSE, ib_port_info_get_m_key(&p_physp->port_info),
 			     OSM_MSG_LIGHT_SWEEP_FAIL, &mad_context);
 	if (status != IB_SUCCESS)
 		OSM_LOG(sm->p_log, OSM_LOG_ERROR, "ERR 3304: "
@@ -186,7 +188,7 @@ static void state_mgr_get_remote_port_info(IN osm_sm_t * sm,
 	/* note that with some negative logic - if the query failed it means
 	 * that there is no point in going to heavy sweep */
 	status = osm_req_get(sm, &rem_node_dr_path, IB_MAD_ATTR_PORT_INFO, 0,
-			     CL_DISP_MSGID_NONE, &mad_context);
+			     TRUE, 0, CL_DISP_MSGID_NONE, &mad_context);
 	if (status != IB_SUCCESS)
 		OSM_LOG(sm->p_log, OSM_LOG_ERROR, "ERR 332E: "
 			"Request for PortInfo failed (%s)\n",
@@ -246,7 +248,7 @@ static ib_api_status_t state_mgr_sweep_hop_0(IN osm_sm_t * sm)
 		osm_dr_path_init(&dr_path, 0, path_array);
 		CL_PLOCK_ACQUIRE(sm->p_lock);
 		status = osm_req_get(sm, &dr_path, IB_MAD_ATTR_NODE_INFO, 0,
-				     CL_DISP_MSGID_NONE, NULL);
+				     TRUE, 0, CL_DISP_MSGID_NONE, NULL);
 		CL_PLOCK_RELEASE(sm->p_lock);
 		if (status != IB_SUCCESS)
 			OSM_LOG(sm->p_log, OSM_LOG_ERROR, "ERR 3305: "
@@ -441,7 +443,7 @@ static ib_api_status_t state_mgr_sweep_hop_1(IN osm_sm_t * sm)
 		osm_dr_path_init(&hop_1_path, 1, path_array);
 		CL_PLOCK_ACQUIRE(sm->p_lock);
 		status = osm_req_get(sm, &hop_1_path, IB_MAD_ATTR_NODE_INFO, 0,
-				     CL_DISP_MSGID_NONE, &context);
+				     TRUE, 0, CL_DISP_MSGID_NONE, &context);
 		CL_PLOCK_RELEASE(sm->p_lock);
 		if (status != IB_SUCCESS)
 			OSM_LOG(sm->p_log, OSM_LOG_ERROR, "ERR 3311: "
@@ -473,6 +475,7 @@ static ib_api_status_t state_mgr_sweep_hop_1(IN osm_sm_t * sm)
 				CL_PLOCK_ACQUIRE(sm->p_lock);
 				status = osm_req_get(sm, &hop_1_path,
 						     IB_MAD_ATTR_NODE_INFO, 0,
+						     TRUE, 0,
 						     CL_DISP_MSGID_NONE,
 						     &context);
 				CL_PLOCK_RELEASE(sm->p_lock);
@@ -516,7 +519,9 @@ static void query_sm_info(cl_map_item_t * item, void *cxt)
 	context.smi_context.light_sweep = TRUE;
 
 	ret = osm_req_get(sm, osm_physp_get_dr_path_ptr(p_port->p_physp),
-			  IB_MAD_ATTR_SM_INFO, 0, CL_DISP_MSGID_NONE, &context);
+			  IB_MAD_ATTR_SM_INFO, 0, FALSE,
+			  ib_port_info_get_m_key(&p_port->p_physp->port_info),
+			  CL_DISP_MSGID_NONE, &context);
 	if (ret != IB_SUCCESS)
 		OSM_LOG(sm->p_log, OSM_LOG_ERROR, "ERR 3314: "
 			"Failure requesting SMInfo (%s)\n",
@@ -555,8 +560,9 @@ static void state_mgr_update_node_desc(IN cl_map_item_t * obj, IN void *context)
 	mad_context.nd_context.node_guid = osm_node_get_node_guid(p_node);
 
 	status = osm_req_get(sm, osm_physp_get_dr_path_ptr(p_physp),
-			     IB_MAD_ATTR_NODE_DESC, 0, CL_DISP_MSGID_NONE,
-			     &mad_context);
+			     IB_MAD_ATTR_NODE_DESC, 0, FALSE,
+			     ib_port_info_get_m_key(&p_physp->port_info),
+			     CL_DISP_MSGID_NONE, &mad_context);
 	if (status != IB_SUCCESS)
 		OSM_LOG(sm->p_log, OSM_LOG_ERROR,
 			"ERR 331B: Failure initiating NodeDescription request "
@@ -835,8 +841,9 @@ static void state_mgr_send_handover(IN osm_sm_t * sm, IN osm_remote_sm_t * p_sm)
 	CL_PLOCK_ACQUIRE(sm->p_lock);
 	status = osm_req_set(sm, osm_physp_get_dr_path_ptr(p_port->p_physp),
 			     payload, sizeof(payload), IB_MAD_ATTR_SM_INFO,
-			     IB_SMINFO_ATTR_MOD_HANDOVER, CL_DISP_MSGID_NONE,
-			     &context);
+			     IB_SMINFO_ATTR_MOD_HANDOVER, FALSE,
+			     ib_port_info_get_m_key(&p_port->p_physp->port_info),
+			     CL_DISP_MSGID_NONE, &context);
 	CL_PLOCK_RELEASE(sm->p_lock);
 
 	if (status != IB_SUCCESS)
diff --git a/opensm/osm_sw_info_rcv.c b/opensm/osm_sw_info_rcv.c
index 4381cbe..02f6ab2 100644
--- a/opensm/osm_sw_info_rcv.c
+++ b/opensm/osm_sw_info_rcv.c
@@ -93,7 +93,7 @@ static void si_rcv_get_fwd_tbl(IN osm_sm_t * sm, IN osm_switch_t * p_sw)
 			"Retrieving FT block %u\n", block_id_ho);
 
 		status = osm_req_get(sm, p_dr_path, IB_MAD_ATTR_LIN_FWD_TBL,
-				     cl_hton32(block_id_ho),
+				     cl_hton32(block_id_ho), TRUE, 0,
 				     CL_DISP_MSGID_NONE, &context);
 		if (status != IB_SUCCESS)
 			/* continue the loop despite the error */
@@ -175,7 +175,7 @@ static void si_rcv_get_mcast_fwd_tbl(IN osm_sm_t * sm, IN osm_switch_t * p_sw)
 			status =
 			    osm_req_get(sm, p_dr_path,
 					IB_MAD_ATTR_MCAST_FWD_TBL,
-					cl_hton32(attr_mod_ho),
+					cl_hton32(attr_mod_ho), TRUE, 0,
 					CL_DISP_MSGID_NONE, &context);
 			if (status != IB_SUCCESS)
 				/* continue the loop despite the error */
diff --git a/opensm/osm_trap_rcv.c b/opensm/osm_trap_rcv.c
index 1e75023..469b00f 100644
--- a/opensm/osm_trap_rcv.c
+++ b/opensm/osm_trap_rcv.c
@@ -216,6 +216,8 @@ static int disable_port(osm_sm_t *sm, osm_physp_t *p)
 	uint8_t payload[IB_SMP_DATA_SIZE];
 	osm_madw_context_t context;
 	ib_port_info_t *pi = (ib_port_info_t *)payload;
+	osm_physp_t *physp0;
+	ib_net64_t m_key;
 	ib_api_status_t status;
 
 	/* select the nearest port to master opensm */
@@ -238,11 +240,18 @@ static int disable_port(osm_sm_t *sm, osm_physp_t *p)
 	context.pi_context.set_method = TRUE;
 	context.pi_context.light_sweep = FALSE;
 	context.pi_context.active_transition = FALSE;
+	if (osm_node_get_type(p->p_node) == IB_NODE_TYPE_SWITCH &&
+	    osm_physp_get_port_num(p) != 0) {
+		physp0 = osm_node_get_physp_ptr(p->p_node, 0);
+		m_key = ib_port_info_get_m_key(&physp0->port_info);
+	} else
+		m_key = ib_port_info_get_m_key(&p->port_info);
 
 	CL_PLOCK_ACQUIRE(sm->p_lock);
 	status = osm_req_set(sm, osm_physp_get_dr_path_ptr(p),
 			   payload, sizeof(payload), IB_MAD_ATTR_PORT_INFO,
 			   cl_hton32(osm_physp_get_port_num(p)),
+			   FALSE, m_key,
 			   CL_DISP_MSGID_NONE, &context);
 	CL_PLOCK_RELEASE(sm->p_lock);
 	return status;
@@ -428,7 +437,7 @@ static void trap_rcv_process_request(IN osm_sm_t * sm,
 	p_physp = osm_get_physp_by_mad_addr(sm->p_log, sm->p_subn,
 					    &tmp_madw.mad_addr);
 	if (p_physp)
-		p_smp->m_key = p_physp->port_info.m_key;
+		p_smp->m_key = ib_port_info_get_m_key(&p_physp->port_info);
 	else
 		OSM_LOG(sm->p_log, OSM_LOG_ERROR, "ERR 3809: "
 			"Failed to find source physical port for trap\n");
diff --git a/opensm/osm_ucast_mgr.c b/opensm/osm_ucast_mgr.c
index 77094b7..6384362 100644
--- a/opensm/osm_ucast_mgr.c
+++ b/opensm/osm_ucast_mgr.c
@@ -895,6 +895,7 @@ static void ucast_mgr_set_fwd_top(IN cl_map_item_t * p_map_item,
 	osm_ucast_mgr_t *p_mgr = cxt;
 	osm_switch_t * p_sw = (osm_switch_t *) p_map_item;
 	osm_node_t *p_node;
+	osm_physp_t *p_physp;
 	osm_dr_path_t *p_path;
 	osm_madw_context_t context;
 	ib_api_status_t status;
@@ -916,7 +917,11 @@ static void ucast_mgr_set_fwd_top(IN cl_map_item_t * p_map_item,
 	if (p_mgr->max_lid < p_sw->max_lid_ho)
 		p_mgr->max_lid = p_sw->max_lid_ho;
 
-	p_path = osm_physp_get_dr_path_ptr(osm_node_get_physp_ptr(p_node, 0));
+	p_physp = osm_node_get_physp_ptr(p_node, 0);
+
+	CL_ASSERT(p_physp);
+
+	p_path = osm_physp_get_dr_path_ptr(p_physp);
 
 	/*
 	   Set the top of the unicast forwarding table.
@@ -953,7 +958,9 @@ static void ucast_mgr_set_fwd_top(IN cl_map_item_t * p_map_item,
 
 		status = osm_req_set(p_mgr->sm, p_path, (uint8_t *) & si,
 				     sizeof(si), IB_MAD_ATTR_SWITCH_INFO,
-				     0, CL_DISP_MSGID_NONE, &context);
+				     0, FALSE,
+				     ib_port_info_get_m_key(&p_physp->port_info),
+				     CL_DISP_MSGID_NONE, &context);
 
 		if (status != IB_SUCCESS)
 			OSM_LOG(p_mgr->p_log, OSM_LOG_ERROR, "ERR 3A06: "
@@ -969,6 +976,7 @@ static int set_lft_block(IN osm_switch_t *p_sw, IN osm_ucast_mgr_t *p_mgr,
 {
 	osm_madw_context_t context;
 	osm_dr_path_t *p_path;
+	osm_physp_t *p_physp;
 	ib_api_status_t status;
 
 	/*
@@ -983,7 +991,11 @@ static int set_lft_block(IN osm_switch_t *p_sw, IN osm_ucast_mgr_t *p_mgr,
 		return -1;
 	}
 
-	p_path = osm_physp_get_dr_path_ptr(osm_node_get_physp_ptr(p_sw->p_node, 0));
+	p_physp = osm_node_get_physp_ptr(p_sw->p_node, 0);
+	if (!p_physp)
+		return -1;
+
+	p_path = osm_physp_get_dr_path_ptr(p_physp);
 
 	context.lft_context.node_guid = osm_node_get_node_guid(p_sw->p_node);
 	context.lft_context.set_method = TRUE;
@@ -1001,7 +1013,8 @@ static int set_lft_block(IN osm_switch_t *p_sw, IN osm_ucast_mgr_t *p_mgr,
 	status = osm_req_set(p_mgr->sm, p_path,
 			     p_sw->new_lft + block_id_ho * IB_SMP_DATA_SIZE,
 			     IB_SMP_DATA_SIZE, IB_MAD_ATTR_LIN_FWD_TBL,
-			     cl_hton32(block_id_ho),
+			     cl_hton32(block_id_ho), FALSE,
+			     ib_port_info_get_m_key(&p_physp->port_info),
 			     CL_DISP_MSGID_NONE, &context);
 
 	if (status != IB_SUCCESS) {
