diff --git a/lib/SimpleSAML/IdP.php b/lib/SimpleSAML/IdP.php
index 89b44f7e8ad615639437c908b27735b442c72319..5d9134f95f73e12bc8630ca349ac71d05370a3b7 100644
--- a/lib/SimpleSAML/IdP.php
+++ b/lib/SimpleSAML/IdP.php
@@ -145,20 +145,24 @@ class SimpleSAML_IdP {
 	public function getSPName($assocId) {
 		assert('is_string($assocId)');
 
-		if (substr($assocId, 0, 5) !== 'saml:') {
-			return NULL;
-		}
-
-		$spEntityId = substr($assocId, 5);
+		$prefix = substr($assocId, 0, 4);
+		$spEntityId = substr($assocId, strlen($prefix) + 1);
 		$metadata = SimpleSAML_Metadata_MetaDataStorageHandler::getMetadataHandler();
-		try {
-			$spMetadata = $metadata->getMetaDataConfig($spEntityId, 'saml20-sp-remote');
-		} catch (Exception $e) {
+
+		if ($prefix === 'saml') {
 			try {
-				$spMetadata = $metadata->getMetaDataConfig($spEntityId, 'shib13-sp-remote');
+				$spMetadata = $metadata->getMetaDataConfig($spEntityId, 'saml20-sp-remote');
 			} catch (Exception $e) {
-				return NULL;
+				try {
+					$spMetadata = $metadata->getMetaDataConfig($spEntityId, 'shib13-sp-remote');
+				} catch (Exception $e) {
+					return NULL;
+				}
 			}
+		} else if ($prefix === 'adfs') {
+			$spMetadata = $metadata->getMetaDataConfig($spEntityId, 'adfs-sp-remote');
+		} else {
+			return NULL;
 		}
 
 		if ($spMetadata->hasValue('name')) {
@@ -180,6 +184,8 @@ class SimpleSAML_IdP {
 		assert('isset($association["id"])');
 		assert('isset($association["Handler"])');
 
+		$association['core:IdP'] = $this->id;
+		
 		$session = SimpleSAML_Session::getInstance();
 		$session->addAssociation($this->associationGroup, $association);
 	}
@@ -431,7 +437,8 @@ class SimpleSAML_IdP {
 	public function finishLogout(array &$state) {
 		assert('isset($state["Responder"])');
 
-		call_user_func($state['Responder'], $this, $state);
+		$idp = SimpleSAML_IdP::getByState($state);
+		call_user_func($state['Responder'], $idp, $state);
 		assert('FALSE');
 	}
 
diff --git a/lib/SimpleSAML/IdP/LogoutIFrame.php b/lib/SimpleSAML/IdP/LogoutIFrame.php
index da99deed8336d16402b7fff11df1d1e267a8bc36..695c344a5589645c7e22e32998205534afba5ca9 100644
--- a/lib/SimpleSAML/IdP/LogoutIFrame.php
+++ b/lib/SimpleSAML/IdP/LogoutIFrame.php
@@ -24,7 +24,8 @@ class SimpleSAML_IdP_LogoutIFrame extends SimpleSAML_IdP_LogoutHandler {
 		}
 
 		foreach ($associations as $id => &$association) {
-			$association['core:Logout-IFrame:Name'] = $this->idp->getSPName($id);
+			$idp = SimpleSAML_IdP::getByState($association);
+			$association['core:Logout-IFrame:Name'] = $idp->getSPName($id);
 			$association['core:Logout-IFrame:State'] = 'onhold';
 		}
 		$state['core:Logout-IFrame:Associations'] = $associations;
diff --git a/lib/SimpleSAML/IdP/LogoutTraditional.php b/lib/SimpleSAML/IdP/LogoutTraditional.php
index 0db49e2755641a2e3a224d1cab2e9edcdbe13423..bdef21c540163f71e21a5497280017f2be3d850a 100644
--- a/lib/SimpleSAML/IdP/LogoutTraditional.php
+++ b/lib/SimpleSAML/IdP/LogoutTraditional.php
@@ -28,7 +28,8 @@ class SimpleSAML_IdP_LogoutTraditional extends SimpleSAML_IdP_LogoutHandler {
 		SimpleSAML_Logger::info('Logging out of ' . var_export($id, TRUE) . '.');
 
 		try {
-			$url = call_user_func(array($association['Handler'], 'getLogoutURL'), $this->idp, $association, $relayState);
+			$idp = SimpleSAML_IdP::getByState($association);
+			$url = call_user_func(array($association['Handler'], 'getLogoutURL'), $idp, $association, $relayState);
 			SimpleSAML_Utilities::redirect($url);
 		} catch (Exception $e) {
 			SimpleSAML_Logger::warning('Unable to initialize logout to ' . var_export($id, TRUE) . '.');
diff --git a/modules/core/www/idp/logout-iframe.php b/modules/core/www/idp/logout-iframe.php
index 4caa4b47a8304b6af8086c5333356bd0f60a21c8..e4942b8d30e7b6ab680ccb519502fafa9fe79f2f 100644
--- a/modules/core/www/idp/logout-iframe.php
+++ b/modules/core/www/idp/logout-iframe.php
@@ -79,7 +79,8 @@ if ($type === 'js' || $type === 'nojs') {
 		}
 
 		try {
-			$url = call_user_func(array($sp['Handler'], 'getLogoutURL'), $idp, $sp, NULL);
+			$assocIdP = SimpleSAML_IdP::getByState($sp);
+			$url = call_user_func(array($sp['Handler'], 'getLogoutURL'), $assocIdP, $sp, NULL);
 			$sp['core:Logout-IFrame:URL'] = $url;
 		} catch (Exception $e) {
 			$sp['core:Logout-IFrame:State'] = 'failed';