diff --git a/modules/saml/lib/Message.php b/modules/saml/lib/Message.php
index 04318e917015e7aace45f5be4ba0a96798320a2e..685be4f630df7868702f0770146c6c51d4e1e775 100644
--- a/modules/saml/lib/Message.php
+++ b/modules/saml/lib/Message.php
@@ -403,18 +403,29 @@ class sspmod_saml_Message {
 
 		$ar = new SAML2_AuthnRequest();
 
-		if ($spMetadata->hasValue('NameIDPolicy')) {
-			$nameIdPolicy = $spMetadata->getString('NameIDPolicy', NULL);
-		} else {
-			$nameIdPolicy = $spMetadata->getString('NameIDFormat', SAML2_Const::NAMEID_TRANSIENT);
+		// get the NameIDPolicy to apply. IdP metadata has precedence.
+		$nameIdPolicy = array();
+		if ($idpMetadata->hasValue('NameIDPolicy')) {
+			$nameIdPolicy = $idpMetadata->getValue('NameIDPolicy');
+		} elseif ($spMetadata->hasValue('NameIDPolicy')) {
+			$nameIdPolicy = $spMetadata->getValue('NameIDPolicy');
+		}
+
+		if (!is_array($nameIdPolicy)) {
+			// handle old configurations where 'NameIDPolicy' was used to specify just the format
+			$nameIdPolicy = array('Format' => $nameIdPolicy);
 		}
 
-		if ($nameIdPolicy !== NULL) {
-			$ar->setNameIdPolicy(array(
-				'Format' => $nameIdPolicy,
-				'AllowCreate' => TRUE,
-			));
+		$nameIdPolicy_cf = SimpleSAML_Configuration::loadFromArray($nameIdPolicy);
+		$policy = array(
+			'Format' => $nameIdPolicy_cf->getString('Format', SAML2_Const::NAMEID_TRANSIENT),
+			'AllowCreate' => $nameIdPolicy_cf->getBoolean('AllowCreate', true),
+		);
+		$spNameQualifier = $nameIdPolicy_cf->getString('SPNameQualifier', false);
+		if ($spNameQualifier !== false) {
+			$policy['SPNameQualifier'] = $spNameQualifier;
 		}
+		$ar->setNameIdPolicy($policy);
 
 		$ar->setForceAuthn($spMetadata->getBoolean('ForceAuthn', FALSE));
 		$ar->setIsPassive($spMetadata->getBoolean('IsPassive', FALSE));