diff --git a/lib/SimpleSAML/Bindings/SAML20/HTTPPost.php b/lib/SimpleSAML/Bindings/SAML20/HTTPPost.php
index 33c2a00a95d141a48d3d95a77ada00e19a71be90..0482bb065dd7c534da7f5e897d5cd9329ef9387d 100644
--- a/lib/SimpleSAML/Bindings/SAML20/HTTPPost.php
+++ b/lib/SimpleSAML/Bindings/SAML20/HTTPPost.php
@@ -12,7 +12,8 @@
  */
  
 require_once('SimpleSAML/Configuration.php');
-require_once('SimpleSAML/XML/MetaDataStore.php');
+require_once('SimpleSAML/Metadata/MetaDataStorageHandler.php');
+
 require_once('SimpleSAML/XML/SAML20/AuthnResponse.php');
 require_once('SimpleSAML/XHTML/Template.php');
 
@@ -25,7 +26,7 @@ class SimpleSAML_Bindings_SAML20_HTTPPost {
 	private $configuration = null;
 	private $metadata = null;
 
-	function __construct(SimpleSAML_Configuration $configuration, SimpleSAML_XML_MetaDataStore $metadatastore) {
+	function __construct(SimpleSAML_Configuration $configuration, SimpleSAML_Metadata_MetaDataStorageHandler $metadatastore) {
 		$this->configuration = $configuration;
 		$this->metadata = $metadatastore;
 	}
diff --git a/lib/SimpleSAML/Bindings/SAML20/HTTPRedirect.php b/lib/SimpleSAML/Bindings/SAML20/HTTPRedirect.php
index 8d5fc5e367f969678019dccd72a4ed7fea2c8851..6d777b639150eba3cb45a7b46dc760a916f78f48 100644
--- a/lib/SimpleSAML/Bindings/SAML20/HTTPRedirect.php
+++ b/lib/SimpleSAML/Bindings/SAML20/HTTPRedirect.php
@@ -13,7 +13,7 @@
  
 require_once('SimpleSAML/Configuration.php');
 require_once('SimpleSAML/Utilities.php');
-require_once('SimpleSAML/XML/MetaDataStore.php');
+require_once('SimpleSAML/Metadata/MetaDataStorageHandler.php');
 require_once('SimpleSAML/XHTML/Template.php');
 
 
@@ -25,7 +25,7 @@ class SimpleSAML_Bindings_SAML20_HTTPRedirect {
 	private $configuration = null;
 	private $metadata = null;
 
-	function __construct(SimpleSAML_Configuration $configuration, SimpleSAML_XML_MetaDataStore $metadatastore) {
+	function __construct(SimpleSAML_Configuration $configuration, SimpleSAML_Metadata_MetaDataStorageHandler $metadatastore) {
 		$this->configuration = $configuration;
 		$this->metadata = $metadatastore;
 	}
diff --git a/lib/SimpleSAML/Bindings/Shib13/HTTPPost.php b/lib/SimpleSAML/Bindings/Shib13/HTTPPost.php
index e12b54da125b242d236e4ffa8b4f467ea5dff04f..3b200430a8c6e3b434de4aa704ab6f25446ac74d 100644
--- a/lib/SimpleSAML/Bindings/Shib13/HTTPPost.php
+++ b/lib/SimpleSAML/Bindings/Shib13/HTTPPost.php
@@ -12,7 +12,8 @@
  */
  
 require_once('SimpleSAML/Configuration.php');
-require_once('SimpleSAML/XML/MetaDataStore.php');
+require_once('SimpleSAML/Metadata/MetaDataStorageHandler.php');
+
 require_once('SimpleSAML/XML/Shib13/AuthnResponse.php');
  
 /**
@@ -23,7 +24,7 @@ class SimpleSAML_Bindings_Shib13_HTTPPost {
 	private $configuration = null;
 	private $metadata = null;
 
-	function __construct(SimpleSAML_Configuration $configuration, SimpleSAML_XML_MetaDataStore $metadatastore) {
+	function __construct(SimpleSAML_Configuration $configuration, SimpleSAML_Metadata_MetaDataStorageHandler $metadatastore) {
 		$this->configuration = $configuration;
 		$this->metadata = $metadatastore;
 	}
diff --git a/lib/SimpleSAML/Metadata/MetaDataStorageHandler.php b/lib/SimpleSAML/Metadata/MetaDataStorageHandler.php
index ed9b9660bc64b22dfc4ea841b50f1501b498fcd9..38881163c5ce747a63745fead5961b825cdc4bdc 100644
--- a/lib/SimpleSAML/Metadata/MetaDataStorageHandler.php
+++ b/lib/SimpleSAML/Metadata/MetaDataStorageHandler.php
@@ -15,11 +15,11 @@ require_once('SimpleSAML/Utilities.php');
 /**
  * Configuration of SimpleSAMLphp
  */
-class SimpleSAML_Metadata_MetaDataStorageHandler {
+abstract class SimpleSAML_Metadata_MetaDataStorageHandler {
 
 
-	private $metadata = null;
-	private $hostmap = null;
+	protected $metadata = null;
+	protected $hostmap = null;
 
 
 	/* This static variable contains a reference to the current
@@ -86,15 +86,15 @@ class SimpleSAML_Metadata_MetaDataStorageHandler {
 
 		if($handler === 'flatfile') {
 		
-			require_once('SimpleSAML/Metadata/MetaDataHandlerFlatfile.php');
-			$sh = new SimpleSAML_Metadata_MetaDataHandlerFlatfile();
+			require_once('SimpleSAML/Metadata/MetaDataStorageHandlerFlatfile.php');
+			$sh = new SimpleSAML_Metadata_MetaDataStorageHandlerFlatfile();
 			
 		} else {
 			throw new Exception('Invalid value for the [metadata.handler] configuration option. Unknown handler: ' . $handler);
 		}
 		
 		/* Set the session handler. */
-		self::$sessionHandler = $sh;
+		self::$metadataHandler = $sh;
 	}
 	
 	
diff --git a/lib/SimpleSAML/Metadata/MetaDataStorageHandlerFlatfile.php b/lib/SimpleSAML/Metadata/MetaDataStorageHandlerFlatfile.php
index 1ea953467aa5e9a61942bb775bccba15635df75a..0547541368c2c0c02248b3714a8cd940b6893b23 100644
--- a/lib/SimpleSAML/Metadata/MetaDataStorageHandlerFlatfile.php
+++ b/lib/SimpleSAML/Metadata/MetaDataStorageHandlerFlatfile.php
@@ -11,11 +11,12 @@
 
 require_once('SimpleSAML/Configuration.php');
 require_once('SimpleSAML/Utilities.php');
+require_once('SimpleSAML/Metadata/MetaDataStorageHandler.php');
 
 /**
  * Configuration of SimpleSAMLphp
  */
-class SimpleSAML_XML_MetaDataStore {
+class SimpleSAML_Metadata_MetaDataStorageHandlerFlatFile extends SimpleSAML_Metadata_MetaDataStorageHandler {
 
 
 
@@ -39,8 +40,12 @@ class SimpleSAML_XML_MetaDataStore {
 				throw new Exception('Trying to load illegal set of Meta data [' . $set . ']');
 		}
 		
-		$metadatasetfile = $this->configuration->getBaseDir() . '/' . 
-			$this->configuration->getValue('metadatadir') . '/' . $set . '.php';
+		/* Get the configuration. */
+		$config = SimpleSAML_Configuration::getInstance();
+		assert($config instanceof SimpleSAML_Configuration);
+		
+		$metadatasetfile = $config->getBaseDir() . '/' . 
+			$config->getValue('metadatadir') . '/' . $set . '.php';
 		
 		
 		if (!file_exists($metadatasetfile)) {
diff --git a/lib/SimpleSAML/Utilities.php b/lib/SimpleSAML/Utilities.php
index 8a30040f396390a3fe85deb2f1b782c3355ffc28..8d55afbada2cfd34e80f4e81b8bf406d0b202495 100644
--- a/lib/SimpleSAML/Utilities.php
+++ b/lib/SimpleSAML/Utilities.php
@@ -117,6 +117,50 @@ class SimpleSAML_Utilities {
 		return $uniqueid;
 	}
 	
+	public static function array_values_equals($array, $equalsvalue) {
+		$foundkeys = array();
+		foreach ($array AS $key => $value) {
+			if ($value === $equalsvalue) $foundkeys[] = $key;
+		}
+		return $foundkeys;
+	}
+	
+	public static function checkAssocArrayRules($target, $required, $optional = array()) {
+
+		$results = array(
+			'required.found' 		=> array(),
+			'required.notfound'		=> array(),
+			'optional.found'		=> array(),
+			'optional.notfound'		=> array(),
+			'leftovers'				=> array()
+		);
+		
+		foreach ($target AS $key => $value) {
+			if(in_array($key, $required)) {
+				$results['required.found'][$key] = $value;
+			} elseif (in_array($key, $optional)) {
+				$results['optional.found'][$key] = $value;
+			} else {
+				$results['leftovers'][$key] = $value;
+			}
+		}
+		
+		foreach ($required AS $key) {
+			if (!array_key_exists($key, $target)) {
+				$results['required.notfound'][] = $key;
+			}
+		}
+		
+		foreach ($optional AS $key) {
+			if (!array_key_exists($key, $target)) {
+				$results['optional.notfound'][] = $key;
+			}
+		}
+		return $results;
+	}
+	
+	
+	
 
 	/* This function dumps a backtrace to the error log.
 	 *
diff --git a/lib/SimpleSAML/XML/AuthnResponse.php b/lib/SimpleSAML/XML/AuthnResponse.php
index c2cd28d46996773fe9ce9b4a54b5b67c3d5c4e73..faeef7be4bebf5075435490d8f0ad3cba626adbd 100644
--- a/lib/SimpleSAML/XML/AuthnResponse.php
+++ b/lib/SimpleSAML/XML/AuthnResponse.php
@@ -14,7 +14,7 @@
 require_once('SimpleSAML/Configuration.php');
 require_once('SimpleSAML/Session.php');
 require_once('SimpleSAML/Utilities.php');
-require_once('SimpleSAML/XML/MetaDataStore.php');
+require_once('SimpleSAML/Metadata/MetaDataStorageHandler.php');
 
 require_once('xmlseclibs.php');
  
@@ -34,7 +34,7 @@ abstract class SimpleSAML_XML_AuthnResponse {
 	
 	const PROTOCOL = 'urn:oasis:names:tc:SAML:2.0';
 
-	function __construct(SimpleSAML_Configuration $configuration, SimpleSAML_XML_MetaDataStore $metadatastore) {
+	function __construct(SimpleSAML_Configuration $configuration, SimpleSAML_Metadata_MetaDataStorageHandler $metadatastore) {
 		$this->configuration = $configuration;
 		$this->metadata = $metadatastore;
 	}
diff --git a/lib/SimpleSAML/XML/SAML20/AuthnRequest.php b/lib/SimpleSAML/XML/SAML20/AuthnRequest.php
index eb203f915543cacf04f725bbc6b868c6e92d1bfa..b804e00713fa8aaa80f6e030ab26fc19e6763e7f 100644
--- a/lib/SimpleSAML/XML/SAML20/AuthnRequest.php
+++ b/lib/SimpleSAML/XML/SAML20/AuthnRequest.php
@@ -12,7 +12,7 @@
  */
  
 require_once('SimpleSAML/Configuration.php');
-require_once('SimpleSAML/XML/MetaDataStore.php');
+require_once('SimpleSAML/Metadata/MetaDataStorageHandler.php');
  
 /**
  * Configuration of SimpleSAMLphp
@@ -30,7 +30,7 @@ class SimpleSAML_XML_SAML20_AuthnRequest {
 	const PROTOCOL = 'urn:oasis:names:tc:SAML:2.0';
 
 
-	function __construct(SimpleSAML_Configuration $configuration, SimpleSAML_XML_MetaDataStore $metadatastore) {
+	function __construct(SimpleSAML_Configuration $configuration, SimpleSAML_Metadata_MetaDataStorageHandler $metadatastore) {
 		$this->configuration = $configuration;
 		$this->metadata = $metadatastore;
 	}
diff --git a/lib/SimpleSAML/XML/SAML20/AuthnResponse.php b/lib/SimpleSAML/XML/SAML20/AuthnResponse.php
index db76521b96aae4e2a0ba003fc3fba043e2043dc7..8f0390f6d59af6f79f8517e0a10c8e9cfc744e0b 100644
--- a/lib/SimpleSAML/XML/SAML20/AuthnResponse.php
+++ b/lib/SimpleSAML/XML/SAML20/AuthnResponse.php
@@ -14,7 +14,7 @@
 require_once('SimpleSAML/Configuration.php');
 require_once('SimpleSAML/Session.php');
 require_once('SimpleSAML/Utilities.php');
-require_once('SimpleSAML/XML/MetaDataStore.php');
+require_once('SimpleSAML/Metadata/MetaDataStorageHandler.php');
 require_once('SimpleSAML/XML/AuthnResponse.php');
 
 require_once('xmlseclibs.php');
@@ -46,7 +46,7 @@ class SimpleSAML_XML_SAML20_AuthnResponse extends SimpleSAML_XML_AuthnResponse {
 	
 	
 
-	function __construct(SimpleSAML_Configuration $configuration, SimpleSAML_XML_MetaDataStore $metadatastore) {
+	function __construct(SimpleSAML_Configuration $configuration, SimpleSAML_Metadata_MetaDataStorageHandler $metadatastore) {
 		$this->configuration = $configuration;
 		$this->metadata = $metadatastore;
 	}
diff --git a/lib/SimpleSAML/XML/SAML20/LogoutRequest.php b/lib/SimpleSAML/XML/SAML20/LogoutRequest.php
index 9900daee9b8b3c06f882ca6a54793b39f2f1b490..a4bbd294a872ca14b4b4e8ac6cc041f2c178f9e9 100644
--- a/lib/SimpleSAML/XML/SAML20/LogoutRequest.php
+++ b/lib/SimpleSAML/XML/SAML20/LogoutRequest.php
@@ -10,7 +10,7 @@
  */
  
 require_once('SimpleSAML/Configuration.php');
-require_once('SimpleSAML/XML/MetaDataStore.php');
+require_once('SimpleSAML/Metadata/MetaDataStorageHandler.php');
  
 /**
  * Configuration of SimpleSAMLphp
@@ -27,7 +27,7 @@ class SimpleSAML_XML_SAML20_LogoutRequest {
 	
 	const PROTOCOL = 'urn:oasis:names:tc:SAML:2.0';
 
-	function __construct(SimpleSAML_Configuration $configuration, SimpleSAML_XML_MetaDataStore $metadatastore) {
+	function __construct(SimpleSAML_Configuration $configuration, SimpleSAML_Metadata_MetaDataStorageHandler $metadatastore) {
 		$this->configuration = $configuration;
 		$this->metadata = $metadatastore;
 	}
diff --git a/lib/SimpleSAML/XML/SAML20/LogoutResponse.php b/lib/SimpleSAML/XML/SAML20/LogoutResponse.php
index f209333c554990c870196ce4cb86eb79d25a3e8c..f30f87a23c51da3eab8affce2a1a24d9f2954dbc 100644
--- a/lib/SimpleSAML/XML/SAML20/LogoutResponse.php
+++ b/lib/SimpleSAML/XML/SAML20/LogoutResponse.php
@@ -14,7 +14,7 @@
 require_once('SimpleSAML/Configuration.php');
 require_once('SimpleSAML/Session.php');
 require_once('SimpleSAML/Utilities.php');
-require_once('SimpleSAML/XML/MetaDataStore.php');
+require_once('SimpleSAML/Metadata/MetaDataStorageHandler.php');
 
 require_once('xmlseclibs.php');
  
@@ -32,7 +32,7 @@ class SimpleSAML_XML_SAML20_LogoutResponse {
 	
 	const PROTOCOL = 'urn:oasis:names:tc:SAML:2.0';
 
-	function __construct(SimpleSAML_Configuration $configuration, SimpleSAML_XML_MetaDataStore $metadatastore) {
+	function __construct(SimpleSAML_Configuration $configuration, SimpleSAML_Metadata_MetaDataStorageHandler $metadatastore) {
 		$this->configuration = $configuration;
 		$this->metadata = $metadatastore;
 	}