diff --git a/www/getSpMetadataXML.php b/www/getSpMetadataXML.php
new file mode 100644
index 0000000000000000000000000000000000000000..fede704450cf4a3192b09fb1dacf34e41ecb42ad
--- /dev/null
+++ b/www/getSpMetadataXML.php
@@ -0,0 +1,32 @@
+<?php
+
+declare(strict_types=1);
+
+use SAML2\Constants;
+use SimpleSAML\Logger;
+use SimpleSAML\Metadata\SAMLBuilder;
+use SimpleSAML\Module\perun\MetadataFromPerun;
+
+$fetch = new MetadataFromPerun();
+$metadata = $fetch->getAllMetadata();
+$result = '<?xml version="1.0" encoding="utf-8" standalone="no"?>';
+$result .= '<EntitiesDescriptor xmlns="urn:oasis:names:tc:SAML:2.0:metadata">';
+foreach ($metadata as $entityId => $metaArray20) {
+    $metaArray20['metadata-set'] = 'saml20-sp-remote';
+    if (empty($metaArray20['AssertionConsumerService'])) {
+        Logger::warning('Skipping XML metadata generation for SP ' . $entityId . ' without ACS');
+    }
+    $metaBuilder = new SAMLBuilder($entityId);
+    $metaBuilder->addMetadataSP20($metaArray20);
+    try {
+        $xml = $metaBuilder->getEntityDescriptorText();
+        $xml = str_replace('<?xml version="1.0"?>', '', $xml);
+        $result .= $xml;
+    } catch (\Exception $e) {
+        Logger::warning('Could not create XML metadata for ' . $entityId . ': ' . $e->getMessage());
+    }
+}
+$result .= '</EntitiesDescriptor>';
+header('Content-Type: application/samlmetadata+xml');
+header('Content-Disposition: attachment; filename="metadata.xml"');
+echo $result;