diff --git a/modules/admin/lib/Controller/Federation.php b/modules/admin/lib/Controller/Federation.php
index 622c612a68124bf25a020a99371019c934f147bc..949b6aeb907a09415bb896a64d47d2652a088dee 100644
--- a/modules/admin/lib/Controller/Federation.php
+++ b/modules/admin/lib/Controller/Federation.php
@@ -203,7 +203,7 @@ class Federation
 
 
     /**
-     * Get a list of the hosted IdP entities, including SAML 2, SAML 1.1 and ADFS.
+     * Get a list of the hosted IdP entities, including SAML 2 and ADFS.
      *
      * @return array
      * @throws \Exception
diff --git a/modules/saml/docs/sp.md b/modules/saml/docs/sp.md
index 2d6271d77d0f4a7e5452280ff79e8850f776cf39..9fd231bbe9eabdc6eb8388375d687455f84767e8 100644
--- a/modules/saml/docs/sp.md
+++ b/modules/saml/docs/sp.md
@@ -466,7 +466,6 @@ Here we will list some examples for this authentication source.
         'saml:SP',
         'acs.Bindings' => [
             'urn:oasis:names:tc:SAML:2.0:bindings:HTTP-POST',
-            'urn:oasis:names:tc:SAML:1.0:profiles:browser-post',
         ],
     ],
 
diff --git a/modules/saml/www/sp/metadata.php b/modules/saml/www/sp/metadata.php
index 3b4e847eb5759108e229c74e8cdcd1a36fb52630..603209c53301c7b4ed03a3a40c3e211ffcee43fc 100644
--- a/modules/saml/www/sp/metadata.php
+++ b/modules/saml/www/sp/metadata.php
@@ -36,239 +36,11 @@ if (!($source instanceof Module\saml\Auth\Source\SP)) {
 
 $entityId = $source->getEntityId();
 $spconfig = $source->getMetadata();
+$metaArray20 = $source->getHostedMetadata();
 $store = Store::getInstance();
 
-$metaArray20 = [];
-
-$slosvcdefault = [
-    Constants::BINDING_HTTP_REDIRECT,
-    Constants::BINDING_SOAP,
-];
-
-$slob = $spconfig->getArray('SingleLogoutServiceBinding', $slosvcdefault);
-$slol = Module::getModuleURL('saml/sp/saml2-logout.php/' . $sourceId);
-
-foreach ($slob as $binding) {
-    if ($binding == Constants::BINDING_SOAP && !($store instanceof Store\SQL)) {
-        // we cannot properly support SOAP logout
-        continue;
-    }
-    $metaArray20['SingleLogoutService'][] = [
-        'Binding'  => $binding,
-        'Location' => $spconfig->getString('SingleLogoutServiceLocation', $slol),
-    ];
-}
-
-$assertionsconsumerservicesdefault = [
-    'urn:oasis:names:tc:SAML:2.0:bindings:HTTP-POST',
-    'urn:oasis:names:tc:SAML:1.0:profiles:browser-post',
-    'urn:oasis:names:tc:SAML:2.0:bindings:HTTP-Artifact',
-    'urn:oasis:names:tc:SAML:1.0:profiles:artifact-01',
-];
-
-if ($spconfig->getString('ProtocolBinding', '') == 'urn:oasis:names:tc:SAML:2.0:profiles:holder-of-key:SSO:browser') {
-    $assertionsconsumerservicesdefault[] = 'urn:oasis:names:tc:SAML:2.0:profiles:holder-of-key:SSO:browser';
-}
-
-$assertionsconsumerservices = $spconfig->getArray('acs.Bindings', $assertionsconsumerservicesdefault);
-
-$index = 0;
-$eps = [];
-$supported_protocols = [];
-foreach ($assertionsconsumerservices as $services) {
-    $acsArray = ['index' => $index];
-    switch ($services) {
-        case 'urn:oasis:names:tc:SAML:2.0:bindings:HTTP-POST':
-            $acsArray['Binding'] = Constants::BINDING_HTTP_POST;
-            $acsArray['Location'] = Module::getModuleURL('saml/sp/saml2-acs.php/' . $sourceId);
-            if (!in_array(Constants::NS_SAMLP, $supported_protocols, true)) {
-                $supported_protocols[] = Constants::NS_SAMLP;
-            }
-            break;
-        case 'urn:oasis:names:tc:SAML:1.0:profiles:browser-post':
-            $acsArray['Binding'] = 'urn:oasis:names:tc:SAML:1.0:profiles:browser-post';
-            $acsArray['Location'] = Module::getModuleURL('saml/sp/saml1-acs.php/' . $sourceId);
-            if (!in_array('urn:oasis:names:tc:SAML:1.1:protocol', $supported_protocols, true)) {
-                $supported_protocols[] = 'urn:oasis:names:tc:SAML:1.1:protocol';
-            }
-            break;
-        case 'urn:oasis:names:tc:SAML:2.0:bindings:HTTP-Artifact':
-            $acsArray['Binding'] = 'urn:oasis:names:tc:SAML:2.0:bindings:HTTP-Artifact';
-            $acsArray['Location'] = Module::getModuleURL('saml/sp/saml2-acs.php/' . $sourceId);
-            if (!in_array(Constants::NS_SAMLP, $supported_protocols, true)) {
-                $supported_protocols[] = Constants::NS_SAMLP;
-            }
-            break;
-        case 'urn:oasis:names:tc:SAML:1.0:profiles:artifact-01':
-            $acsArray['Binding'] = 'urn:oasis:names:tc:SAML:1.0:profiles:artifact-01';
-            $acsArray['Location'] = Module::getModuleURL(
-                'saml/sp/saml1-acs.php/' . $sourceId . '/artifact'
-            );
-            if (!in_array('urn:oasis:names:tc:SAML:1.1:protocol', $supported_protocols, true)) {
-                $supported_protocols[] = 'urn:oasis:names:tc:SAML:1.1:protocol';
-            }
-            break;
-        case 'urn:oasis:names:tc:SAML:2.0:profiles:holder-of-key:SSO:browser':
-            $acsArray['Binding'] = 'urn:oasis:names:tc:SAML:2.0:profiles:holder-of-key:SSO:browser';
-            $acsArray['Location'] = Module::getModuleURL('saml/sp/saml2-acs.php/' . $sourceId);
-            $acsArray['hoksso:ProtocolBinding'] = Constants::BINDING_HTTP_REDIRECT;
-            if (!in_array(Constants::NS_SAMLP, $supported_protocols, true)) {
-                $supported_protocols[] = Constants::NS_SAMLP;
-            }
-            break;
-    }
-    $eps[] = $acsArray;
-    $index++;
-}
-
-$metaArray20['AssertionConsumerService'] = $spconfig->getArray('AssertionConsumerService', $eps);
-
-$keys = [];
-$cryptoUtils = new Utils\Crypto();
-$certInfo = $cryptoUtils->loadPublicKey($spconfig, false, 'new_');
-if ($certInfo !== null && array_key_exists('certData', $certInfo)) {
-    $hasNewCert = true;
-
-    $certData = $certInfo['certData'];
-
-    $keys[] = [
-        'type'            => 'X509Certificate',
-        'signing'         => true,
-        'encryption'      => true,
-        'X509Certificate' => $certInfo['certData'],
-    ];
-} else {
-    $hasNewCert = false;
-}
-
-$certInfo = $cryptoUtils->loadPublicKey($spconfig);
-if ($certInfo !== null && array_key_exists('certData', $certInfo)) {
-    $certData = $certInfo['certData'];
-
-    $keys[] = [
-        'type'            => 'X509Certificate',
-        'signing'         => true,
-        'encryption'      => ($hasNewCert ? false : true),
-        'X509Certificate' => $certInfo['certData'],
-    ];
-} else {
-    $certData = null;
-}
-
-$format = $spconfig->getValue('NameIDPolicy', null);
-if ($format !== null) {
-    if (is_array($format)) {
-        $metaArray20['NameIDFormat'] = Configuration::loadFromArray($format)->getString(
-            'Format',
-            Constants::NAMEID_TRANSIENT
-        );
-    } elseif (is_string($format)) {
-        $metaArray20['NameIDFormat'] = $format;
-    }
-}
-
-$name = $spconfig->getLocalizedString('name', null);
-$attributes = $spconfig->getArray('attributes', []);
-
-if ($name !== null && !empty($attributes)) {
-    $metaArray20['name'] = $name;
-    $metaArray20['attributes'] = $attributes;
-    $metaArray20['attributes.required'] = $spconfig->getArray('attributes.required', []);
-
-    if (empty($metaArray20['attributes.required'])) {
-        unset($metaArray20['attributes.required']);
-    }
-
-    $description = $spconfig->getArray('description', null);
-    if ($description !== null) {
-        $metaArray20['description'] = $description;
-    }
-
-    $nameFormat = $spconfig->getString('attributes.NameFormat', null);
-    if ($nameFormat !== null) {
-        $metaArray20['attributes.NameFormat'] = $nameFormat;
-    }
-
-    if ($spconfig->hasValue('attributes.index')) {
-        $metaArray20['attributes.index'] = $spconfig->getInteger('attributes.index', 0);
-    }
-
-    if ($spconfig->hasValue('attributes.isDefault')) {
-        $metaArray20['attributes.isDefault'] = $spconfig->getBoolean('attributes.isDefault', false);
-    }
-}
-
-// add organization info
-$orgName = $spconfig->getLocalizedString('OrganizationName', null);
-if ($orgName !== null) {
-    $metaArray20['OrganizationName'] = $orgName;
-
-    $metaArray20['OrganizationDisplayName'] = $spconfig->getLocalizedString('OrganizationDisplayName', null);
-    if ($metaArray20['OrganizationDisplayName'] === null) {
-        $metaArray20['OrganizationDisplayName'] = $orgName;
-    }
-
-    $metaArray20['OrganizationURL'] = $spconfig->getLocalizedString('OrganizationURL', null);
-    if ($metaArray20['OrganizationURL'] === null) {
-        throw new Error\Exception('If OrganizationName is set, OrganizationURL must also be set.');
-    }
-}
-
-if ($spconfig->hasValue('contacts')) {
-    $contacts = $spconfig->getArray('contacts');
-    foreach ($contacts as $contact) {
-        $metaArray20['contacts'][] = Utils\Config\Metadata::getContact($contact);
-    }
-}
-
-// add technical contact
-$email = $config->getString('technicalcontact_email', 'na@example.org');
-if ($email && $email !== 'na@example.org') {
-    $techcontact = [
-        'emailAddress' => $email,
-        'name' => $config->getString('technicalcontact_name', null),
-        'contactType' => 'technical'
-    ];
-    $metaArray20['contacts'][] = Utils\Config\Metadata::getContact($techcontact);
-}
-
-// add certificate
-if (count($keys) === 1) {
-    $metaArray20['certData'] = $keys[0]['X509Certificate'];
-} elseif (count($keys) > 1) {
-    $metaArray20['keys'] = $keys;
-}
-
-// add EntityAttributes extension
-if ($spconfig->hasValue('EntityAttributes')) {
-    $metaArray20['EntityAttributes'] = $spconfig->getArray('EntityAttributes');
-}
-
-// add UIInfo extension
-if ($spconfig->hasValue('UIInfo')) {
-    $metaArray20['UIInfo'] = $spconfig->getArray('UIInfo');
-}
-
-// add RegistrationInfo extension
-if ($spconfig->hasValue('RegistrationInfo')) {
-    $metaArray20['RegistrationInfo'] = $spconfig->getArray('RegistrationInfo');
-}
-
-// add signature options
-if ($spconfig->hasValue('WantAssertionsSigned')) {
-    $metaArray20['saml20.sign.assertion'] = $spconfig->getBoolean('WantAssertionsSigned');
-}
-if ($spconfig->hasValue('redirect.sign')) {
-    $metaArray20['redirect.validate'] = $spconfig->getBoolean('redirect.sign');
-} elseif ($spconfig->hasValue('sign.authnrequest')) {
-    $metaArray20['validate.authnrequest'] = $spconfig->getBoolean('sign.authnrequest');
-}
-
-$metaArray20['metadata-set'] = 'saml20-sp-remote';
-$metaArray20['entityid'] = $entityId;
-
 $metaBuilder = new Metadata\SAMLBuilder($entityId);
-$metaBuilder->addMetadataSP20($metaArray20, $supported_protocols);
+$metaBuilder->addMetadataSP20($metaArray20, $source->getSupportedProtocols());
 $metaBuilder->addOrganizationInfo($metaArray20);
 
 $xml = $metaBuilder->getEntityDescriptorText();