diff --git a/lib/SimpleSAML/Error/MetadataNotFound.php b/lib/SimpleSAML/Error/MetadataNotFound.php
new file mode 100644
index 0000000000000000000000000000000000000000..d079331fbf8d7e1a417cbcb325fd8a66d94ca324
--- /dev/null
+++ b/lib/SimpleSAML/Error/MetadataNotFound.php
@@ -0,0 +1,50 @@
+<?php
+
+/**
+ * Error for missing metadata.
+ *
+ * @package simpleSAMLphp
+ * @version $Id$
+ */
+class SimpleSAML_Error_MetadataNotFound extends SimpleSAML_Error_Error {
+
+	/**
+	 * The entityID we were unable to locate.
+	 *
+	 * @var string
+	 */
+	private $entityId;
+
+
+	/**
+	 * Create the error
+	 *
+	 * @param string $entityId  The entityID we were unable to locate.
+	 */
+	public function __construct($entityId) {
+		assert('is_string($entityId)');
+
+		parent::__construct('Unable to locate metadata for ' . var_export($entityId, TRUE) . '.');
+		$this->entityId = $entityId;
+	}
+
+
+	/**
+	 * Show the error to the user.
+	 *
+	 * This function does not return.
+	 */
+	public function show() {
+
+		header('HTTP/1.0 500 Internal Server Error');
+
+		$this->logError();
+
+		$globalConfig = SimpleSAML_Configuration::getInstance();
+		$t = new SimpleSAML_XHTML_Template($globalConfig, 'core:no_metadata.tpl.php');
+		$t->data['entityId'] = $this->entityId;
+		$t->show();
+		exit();
+	}
+
+}
diff --git a/lib/SimpleSAML/Metadata/MetaDataStorageHandler.php b/lib/SimpleSAML/Metadata/MetaDataStorageHandler.php
index 91c999cd0fa08f2159466500db9b5565bc75774c..2e4352ef560c0ab0709b4a0501c5567b659ba4db 100644
--- a/lib/SimpleSAML/Metadata/MetaDataStorageHandler.php
+++ b/lib/SimpleSAML/Metadata/MetaDataStorageHandler.php
@@ -286,7 +286,7 @@ class SimpleSAML_Metadata_MetaDataStorageHandler {
 			}
 		}
 
-		throw new Exception('Unable to locate metadata for \'' . $index . '\' in set \'' . $set . '\'.');
+		throw new SimpleSAML_Error_MetadataNotFound($index);
 	}
 
 
diff --git a/modules/core/dictionaries/no_metadata.definition.json b/modules/core/dictionaries/no_metadata.definition.json
new file mode 100644
index 0000000000000000000000000000000000000000..4d551aaaf581785f04e6e2524de2e600ae51acfb
--- /dev/null
+++ b/modules/core/dictionaries/no_metadata.definition.json
@@ -0,0 +1,17 @@
+{
+	"header": {
+		"en": "Metadata not found"
+	},
+	"not_found_for": {
+		"en": "We were unable to locate the metadata for the entity:"
+	},
+	"config_problem": {
+		"en": "This is most likely a configuration problem on either the service provider or identity provider."
+	},
+	"suggestion_user_link": {
+		"en": "If you are an user who received this error after following a link on a site, you should report this error to the owner of that site."
+	},
+	"suggestion_developer": {
+		"en": "If you are a developer who is deploying a single sign-on solution, you have a problem with the metadata configuration. Verify that metadata is configured correctly on both the identity provider and service provider."
+	}
+}
diff --git a/modules/core/dictionaries/no_metadata.translation.json b/modules/core/dictionaries/no_metadata.translation.json
new file mode 100644
index 0000000000000000000000000000000000000000..568cea71899dcbac585040ea90847f9bea52623d
--- /dev/null
+++ b/modules/core/dictionaries/no_metadata.translation.json
@@ -0,0 +1,22 @@
+{
+	"header": {
+		"no": "Kunne ikke finne metadata",
+		"nn": "Kunne ikkje finne metadata"
+	},
+	"not_found_for": {
+		"no": "Vi fant ikke metadataene for:",
+		"nn": "Vi fann ikkje metadataene for:"
+	},
+	"config_problem": {
+		"no": "Dette er sannsynligvis et konfigurasjonsproblem hos enten tjenesteleverand\u00f8ren eller identitetsleverand\u00f8ren.",
+		"nn": "Dette er sannsynlegvis eit problem med oppsettet hj\u00e5 anten tenesteleverand\u00f8ren eller identitetsleverand\u00f8ren."
+	},
+	"suggestion_user_link": {
+		"no": "Hvis du er en bruker som fikk denne feilen etter at du fulgte en link p\u00e5 en nettside, s\u00e5 b\u00f8r du rapportere denne feilen til eieren av den nettsiden.",
+		"nn": "Om du er ein brukar som mottok denne feilen etter at du f\u00f8lgde ei lenke p\u00e5 ei nettside, s\u00e5 b\u00f8r du melde denne feilen til eigaren av den nettsida."
+	},
+	"suggestion_developer": {
+		"no": "Hvis du er en utvikler som setter opp en \"single sign-on\" l\u00f8sning, s\u00e5 har du et problem med metadataoppsettet. Kontroller at metadata er riktig konfigurert hos b\u00e5de identitetsleverand\u00f8ren og tjenesteleverand\u00f8ren.",
+		"nn": "Om du er ein utviklar som set opp ei \"single sign-on\" l\u00f8ysing, s\u00e5 har du eit problem med metadataoppsettet. Kontroller at metadata er rett satt opp hj\u00e5 b\u00e5de identitetsleverand\u00f8ren og tenesteleverand\u00f8ren."
+	}
+}
diff --git a/modules/core/templates/no_metadata.tpl.php b/modules/core/templates/no_metadata.tpl.php
new file mode 100644
index 0000000000000000000000000000000000000000..09cdbbc33d1c767cc5ae38121d11d70035759f3c
--- /dev/null
+++ b/modules/core/templates/no_metadata.tpl.php
@@ -0,0 +1,16 @@
+<?php
+
+$this->data['header'] = $this->t('{core:no_metadata:header}');
+$this->includeAtTemplateBase('includes/header.php');
+
+echo('<h2>' . $this->t('{core:no_metadata:header}') . '</h2>');
+echo('<p>' . $this->t('{core:no_metadata:not_found_for}') . '</p>');
+echo('<code style="margin-left: 3em;">' . htmlspecialchars($this->data['entityId']) . '</code>');
+echo('<p>' . $this->t('{core:no_metadata:config_problem}') . '</p>');
+
+echo('<ul>');
+echo('<li>' . $this->t('{core:no_metadata:suggestion_user_link}') . '</li>');
+echo('<li>' . $this->t('{core:no_metadata:suggestion_developer}') . '</li>');
+echo('</ul>');
+
+$this->includeAtTemplateBase('includes/footer.php');