diff --git a/modules/metarefresh/lib/MetaLoader.php b/modules/metarefresh/lib/MetaLoader.php
index 2d99ea73f75a48ad0863d795a81ab56efd4b8089..815da5359c5318ccc585e1922b7f41408aae1283 100644
--- a/modules/metarefresh/lib/MetaLoader.php
+++ b/modules/metarefresh/lib/MetaLoader.php
@@ -206,27 +206,25 @@ class sspmod_metarefresh_MetaLoader {
 
 
 	/**
-	 * Parse XML metadata and return entities
+	 * Recursively load all EntityDescriptor elements inside an EntitiesDescriptor or nested EntitiesDescriptor
+	 * elements. This function fails gracefully when one entity cannot be parsed, and tries to continue processing.
+	 *
+	 * @param DOMElement $root The root DOMElement to start loading from.
+	 *
+	 * @return array The array of entities loaded from the root element.
 	 */
-	private function loadXML($data, $source) {
+	private function recursiveLoadXML(DOMElement $root) {
 		$entities = array();
-		$doc = new DOMDocument();
-		$res = $doc->loadXML($data);
-		if($res !== TRUE) {
-			throw new Exception('Failed to read XML from ' . $source['src']);
-		}
-		if($doc->documentElement ===  NULL) throw new Exception('Opened file is not an XML document: ' . $source['src']);
-
-		if (SimpleSAML_Utilities::isDOMElementOfType($doc->documentElement, 'EntitiesDescriptor', '@md') === TRUE) {
-			foreach (SAML2_Utils::xpQuery($doc->documentElement,
-				'./saml_metadata:EntityDescriptor|./saml_metadata:EntitiesDescriptor') as $node) {
-
-				if ($node->localName === 'EntityDescriptor') {
+		if (SimpleSAML_Utilities::isDOMElementOfType($root, 'EntitiesDescriptor', '@md') === TRUE) {
+			foreach (SAML2_Utils::xpQuery($root,
+				'./saml_metadata:EntityDescriptor|./saml_metadata:EntitiesDescriptor') as $element)
+			{
+				if ($element->localName === 'EntityDescriptor') {
 					try {
 						$entities = array_merge($entities,
-							SimpleSAML_Metadata_SAMLParser::parseDescriptorsElement($node));
+							SimpleSAML_Metadata_SAMLParser::parseDescriptorsElement($element));
 					} catch (Exception $e) {
-						$entityID = $node->getAttribute('entityID');
+						$entityID = $element->getAttribute('entityID');
 						if (empty($entityID)) {
 							$entityID = "unknown";
 						}
@@ -234,17 +232,32 @@ class sspmod_metarefresh_MetaLoader {
 							$e->getMessage());
 					}
 				} else {
-					$entities = array_merge($entities, $this->loadXML($node->ownerDocument->saveXML($node), $source));
+					$entities = array_merge($entities, $this->recursiveLoadXML($element));
 				}
 			}
 		} else {
-			$entities = SimpleSAML_Metadata_SAMLParser::parseDescriptorsElement($doc->documentElement);
+			$entities = SimpleSAML_Metadata_SAMLParser::parseDescriptorsElement($root);
 		}
 
 		return $entities;
 	}
 
 
+	/**
+	 * Parse XML metadata and return entities
+	 */
+	private function loadXML($data, $source) {
+		$doc = new DOMDocument();
+		$res = $doc->loadXML($data);
+		if($res !== TRUE) {
+			throw new Exception('Failed to read XML from ' . $source['src']);
+		}
+		if($doc->documentElement ===  NULL) throw new Exception('Opened file is not an XML document: ' . $source['src']);
+
+		return $this->recursiveLoadXML($doc->documentElement);
+	}
+
+
 	/**
 	 * This function writes the state array back to disk
 	 */