diff --git a/metadata/saml20-idp-hosted.php b/metadata/saml20-idp-hosted.php
new file mode 100644
index 0000000000000000000000000000000000000000..86a1aeca0a13dfb12efb590a6c833591f2bcc88a
--- /dev/null
+++ b/metadata/saml20-idp-hosted.php
@@ -0,0 +1,103 @@
+<?php
+
+/**
+ * SAML 2.0 IdP configuration for SimpleSAMLphp.
+ *
+ * See: https://simplesamlphp.org/docs/stable/simplesamlphp-reference-idp-hosted
+ */
+
+function nest($name, $value) {
+  $element = array_pop($name);
+  if ($element) return nest($name, array($element => $value));
+  else return $value;
+}
+
+$config = SimpleSAML\Configuration::getInstance();
+$db_dsn = $config->getString('database.dsn', null);
+$db_user = $config->getString('database.username', null);
+$db_passwd = $config->getString('database.password', null);
+$db = new PDO($db_dsn, $db_user, $db_passwd);
+
+$vserver = $_SERVER['SERVER_NAME'];
+$vparts = explode('.', $vserver);
+$vhost = $vparts[0];
+
+$metadata['__DYNAMIC:1__'] = [
+    /*
+     * The hostname of the server (VHOST) that will use this SAML entity.
+     *
+     * Can be '__DEFAULT__', to use this entry by default.
+     */
+    'host' => '__DEFAULT__',
+
+    'OrganizationName' => $vhost . ' IdP',
+    'OrganizationDisplayName' => $vhost . ' IdP',
+    'OrganizationURL' => 'https:// ' . $vserver . '/',
+
+    'contacts' => [
+        'a' => [
+            'contactType'       => 'technical',
+            'emailAddress'      => 'support@'. $vserver,
+            'givenName'         => 'John',
+            'surName'           => $vhost,
+            'telephoneNumber'   => '+31(0)12345678',
+            'company'           => $vhost . ' Inc.',
+        ],
+    ],
+
+    'UIInfo' => array(
+        'DisplayName' => array(
+            'en' => $vhost . ' IdP'
+        ),
+        'Description' => array(
+            'en' => $vhost . ' IdP description'
+        ),
+    ),
+
+    'RegistrationInfo' => [
+        'authority' => 'urn:mace:' . $vhost,
+        'instant' => '2008-01-17T11:28:03Z',
+        'policies' => [
+            'en' => 'http://' . $vhost . '/policy',
+        ],
+    ],
+
+    // X.509 key and certificate. Relative to the cert directory.
+    'privatekey' => 'server.pem',
+    'certificate' => 'server.crt',
+
+    /*
+     * Authentication source to use. Must be one that is configured in
+     * 'config/authsources.php'.
+     */
+    'auth' => 'example-userpass',
+
+    /* Uncomment the following to use the uri NameFormat on attributes. */
+    /*
+    'attributes.NameFormat' => 'urn:oasis:names:tc:SAML:2.0:attrname-format:uri',
+    'authproc' => [
+        // Convert LDAP names to oids.
+        100 => ['class' => 'core:AttributeMap', 'name2oid'],
+    ],
+    */
+];
+
+$query = "select o.name, o.type, c.value  from idps i
+  left join config c on c.idp_id = i.idp_id
+  left join options o on c.option_id = o.option_id
+  where i.host = :host";
+
+
+$stmt = $db->prepare($query);
+$stmt->execute(array(':host' => $vhost));
+$result = $stmt->fetchAll(PDO::FETCH_ASSOC);
+
+$config = array();
+foreach ($result as $row) {
+  $name = explode(':', $row['name']);
+  $value = $row['value'];
+  $config = array_merge_recursive($config, nest($name, $value));
+} 
+
+$metadata['__DYNAMIC:1__'] = array_replace_recursive($metadata['__DYNAMIC:1__'], $config);
+
diff --git a/metadata/saml20-sp-remote.php b/metadata/saml20-sp-remote.php
new file mode 100644
index 0000000000000000000000000000000000000000..478a4fb028a3fc3c07511536a1da69e798ace430
--- /dev/null
+++ b/metadata/saml20-sp-remote.php
@@ -0,0 +1,40 @@
+<?php
+
+/**
+ * SAML 2.0 remote SP metadata for SimpleSAMLphp.
+ *
+ * See: https://simplesamlphp.org/docs/stable/simplesamlphp-reference-sp-remote
+ */
+
+$config = SimpleSAML\Configuration::getInstance();
+$db_dsn = $config->getString('database.dsn', null);
+$db_user = $config->getString('database.username', null);
+$db_passwd = $config->getString('database.password', null);
+$db = new PDO($db_dsn, $db_user, $db_passwd);
+
+$vserver = $_SERVER['SERVER_NAME'];
+$vparts = explode('.', $vserver);
+$vhost = $vparts[0];
+
+$query = "select sp_metadata from idps i where i.host = :host";
+
+$stmt = $db->prepare($query);
+$stmt->execute(array(':host' => $vhost));
+$result = $stmt->fetchAll(PDO::FETCH_ASSOC);
+
+foreach ($result as $row) {
+  $xmldata = $row['sp_metadata'];
+  SimpleSAML\Utils\XML::checkSAMLMessage($xmldata, 'saml-meta');
+  $entities = SimpleSAML\Metadata\SAMLParser::parseDescriptorsString($xmldata);
+  foreach ($entities as &$entity) {
+    $entity = array('saml20-sp-remote' => $entity->getMetadata20SP());
+  }
+} 
+
+if ($entities) {
+  $output = SimpleSAML\Utils\Arrays::transpose($entities);
+  $metadata = $output['saml20-sp-remote'];
+} else {
+  $metadata = array();
+}
+
diff --git a/testidp.sql b/testidp.sql
new file mode 100644
index 0000000000000000000000000000000000000000..06a13f3b0aaa6cf4734eb1c3dfe6dc87e3b04d96
--- /dev/null
+++ b/testidp.sql
@@ -0,0 +1,107 @@
+-- MySQL dump 10.17  Distrib 10.3.25-MariaDB, for debian-linux-gnu (x86_64)
+--
+-- Host: localhost    Database: testidp
+-- ------------------------------------------------------
+-- Server version	10.3.25-MariaDB-0ubuntu0.20.04.1
+
+/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;
+/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;
+/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */;
+/*!40101 SET NAMES utf8mb4 */;
+/*!40103 SET @OLD_TIME_ZONE=@@TIME_ZONE */;
+/*!40103 SET TIME_ZONE='+00:00' */;
+/*!40014 SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0 */;
+/*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */;
+/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */;
+/*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */;
+
+--
+-- Table structure for table `config`
+--
+
+DROP TABLE IF EXISTS `config`;
+/*!40101 SET @saved_cs_client     = @@character_set_client */;
+/*!40101 SET character_set_client = utf8 */;
+CREATE TABLE `config` (
+  `idp_id` int(10) unsigned NOT NULL,
+  `option_id` int(10) unsigned NOT NULL,
+  `value` varchar(100) DEFAULT NULL,
+  KEY `config_FK` (`idp_id`),
+  KEY `config_FK_1` (`option_id`),
+  CONSTRAINT `config_FK` FOREIGN KEY (`idp_id`) REFERENCES `idps` (`idp_id`),
+  CONSTRAINT `config_FK_1` FOREIGN KEY (`option_id`) REFERENCES `options` (`option_id`)
+) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
+/*!40101 SET character_set_client = @saved_cs_client */;
+
+--
+-- Dumping data for table `config`
+--
+
+LOCK TABLES `config` WRITE;
+/*!40000 ALTER TABLE `config` DISABLE KEYS */;
+INSERT INTO `config` VALUES (1,1,'Foobar DB DisplayName'),(1,2,'Foobar DB'),(1,3,'http://foobar.org/url'),(1,5,'technical'),(1,6,'technical@geant.org'),(1,7,'FooDB'),(1,8,'Doe'),(1,9,'+316012345678'),(1,10,'Foobar DB inc.'),(1,11,'Foobar DB mdui'),(1,12,'Foober DB description mdui'),(1,13,'Foobar DB authority'),(1,14,'2008-01-17T11:28:03Z'),(1,15,'http://foobar.org/policy/en');
+/*!40000 ALTER TABLE `config` ENABLE KEYS */;
+UNLOCK TABLES;
+
+--
+-- Table structure for table `idps`
+--
+
+DROP TABLE IF EXISTS `idps`;
+/*!40101 SET @saved_cs_client     = @@character_set_client */;
+/*!40101 SET character_set_client = utf8 */;
+CREATE TABLE `idps` (
+  `idp_id` int(10) unsigned NOT NULL AUTO_INCREMENT,
+  `host` varchar(100) NOT NULL,
+  `comment` varchar(100) DEFAULT NULL,
+  `sp_metadata` text DEFAULT NULL,
+  PRIMARY KEY (`idp_id`)
+) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8mb4;
+/*!40101 SET character_set_client = @saved_cs_client */;
+
+--
+-- Dumping data for table `idps`
+--
+
+LOCK TABLES `idps` WRITE;
+/*!40000 ALTER TABLE `idps` DISABLE KEYS */;
+INSERT INTO `idps` VALUES (1,'foobar','Test Foobar IdP','<?xml version=\"1.0\"?>\n<md:EntityDescriptor xmlns:md=\"urn:oasis:names:tc:SAML:2.0:metadata\" entityID=\"https://foobar.testidp.incubator.geant.org/saml/module.php/saml/sp/metadata.php/default-sp\">\n  <md:SPSSODescriptor protocolSupportEnumeration=\"urn:oasis:names:tc:SAML:2.0:protocol urn:oasis:names:tc:SAML:1.1:protocol\">\n    <md:SingleLogoutService Binding=\"urn:oasis:names:tc:SAML:2.0:bindings:HTTP-Redirect\" Location=\"https://foobar.testidp.incubator.geant.org/saml/module.php/saml/sp/saml2-logout.php/default-sp\"/>\n    <md:AssertionConsumerService Binding=\"urn:oasis:names:tc:SAML:2.0:bindings:HTTP-POST\" Location=\"https://foobar.testidp.incubator.geant.org/saml/module.php/saml/sp/saml2-acs.php/default-sp\" index=\"0\"/>\n    <md:AssertionConsumerService Binding=\"urn:oasis:names:tc:SAML:1.0:profiles:browser-post\" Location=\"https://foobar.testidp.incubator.geant.org/saml/module.php/saml/sp/saml1-acs.php/default-sp\" index=\"1\"/>\n    <md:AssertionConsumerService Binding=\"urn:oasis:names:tc:SAML:2.0:bindings:HTTP-Artifact\" Location=\"https://foobar.testidp.incubator.geant.org/saml/module.php/saml/sp/saml2-acs.php/default-sp\" index=\"2\"/>\n    <md:AssertionConsumerService Binding=\"urn:oasis:names:tc:SAML:1.0:profiles:artifact-01\" Location=\"https://foobar.testidp.incubator.geant.org/saml/module.php/saml/sp/saml1-acs.php/default-sp/artifact\" index=\"3\"/>\n  </md:SPSSODescriptor>\n</md:EntityDescriptor>');
+/*!40000 ALTER TABLE `idps` ENABLE KEYS */;
+UNLOCK TABLES;
+
+--
+-- Table structure for table `options`
+--
+
+DROP TABLE IF EXISTS `options`;
+/*!40101 SET @saved_cs_client     = @@character_set_client */;
+/*!40101 SET character_set_client = utf8 */;
+CREATE TABLE `options` (
+  `option_id` int(10) unsigned NOT NULL AUTO_INCREMENT,
+  `name` varchar(100) NOT NULL,
+  `type` varchar(100) NOT NULL,
+  `comment` varchar(100) DEFAULT NULL,
+  PRIMARY KEY (`option_id`)
+) ENGINE=InnoDB AUTO_INCREMENT=16 DEFAULT CHARSET=utf8mb4;
+/*!40101 SET character_set_client = @saved_cs_client */;
+
+--
+-- Dumping data for table `options`
+--
+
+LOCK TABLES `options` WRITE;
+/*!40000 ALTER TABLE `options` DISABLE KEYS */;
+INSERT INTO `options` VALUES (1,'OrganizationDisplayName','string','Organization Display name'),(2,'OrganizationName','string','Organization Name'),(3,'OrganizationURL','string','Organization URL'),(5,'contacts:a:contactType','string','e.g. technical or support'),(6,'contacts:a:emailAddress','string','email'),(7,'contacts:a:givenName','string','Given name of the contact'),(8,'contacts:a:surName','string','Surname'),(9,'contacts:a:telephoneNumber','string','Phone number'),(10,'contacts:a:company','string','Company name'),(11,'UIInfo:DisplayName:en','string','Display name (UIInfo)'),(12,'UIInfo:Description:en','string','Description (UIInfo)'),(13,'RegistrationInfo:authority','string','Registration authority'),(14,'RegistrationInfo:instant','date','Registraion instant (date format)'),(15,'RegistrationInfo:policies:en','string','Policy URL (en)');
+/*!40000 ALTER TABLE `options` ENABLE KEYS */;
+UNLOCK TABLES;
+/*!40103 SET TIME_ZONE=@OLD_TIME_ZONE */;
+
+/*!40101 SET SQL_MODE=@OLD_SQL_MODE */;
+/*!40014 SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS */;
+/*!40014 SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS */;
+/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */;
+/*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */;
+/*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */;
+/*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */;
+
+-- Dump completed on 2021-04-08 12:02:51