diff --git a/lib/SAML2/Assertion.php b/lib/SAML2/Assertion.php
index 4cc24573cf37cb5acf13d565c517ea5b60fd654d..be4b8ea351368c5af8332c7947050e2eeab53be3 100644
--- a/lib/SAML2/Assertion.php
+++ b/lib/SAML2/Assertion.php
@@ -879,14 +879,20 @@ class SAML2_Assertion implements SAML2_SignedElement {
 	/**
 	 * Convert this assertion to an XML element.
 	 *
+	 * @param DOMNode|NULL $parentElement  The DOM node the assertion should be created in.
 	 * @return DOMElement  This assertion.
 	 */
-	public function toXML() {
+	public function toXML(DOMNode $parentElement = NULL) {
 
-		$document = new DOMDocument();
+		if ($parentElement === NULL) {
+			$document = new DOMDocument();
+			$parentElement = $document;
+		} else {
+			$document = $parentElement->ownerDocument;
+		}
 
 		$root = $document->createElementNS(SAML2_Const::NS_SAML, 'saml:' . 'Assertion');
-		$document->appendChild($root);
+		$parentElement->appendChild($root);
 
 		/* Ugly hack to add another namespace declaration to the root element. */
 		$root->setAttributeNS(SAML2_Const::NS_SAMLP, 'samlp:tmp', 'tmp');
diff --git a/lib/SAML2/EncryptedAssertion.php b/lib/SAML2/EncryptedAssertion.php
index 5c22dfe3764472b296f36c202b3c042b50d9ff3c..af87ec8fb94666905419629bfd60701186cf113c 100644
--- a/lib/SAML2/EncryptedAssertion.php
+++ b/lib/SAML2/EncryptedAssertion.php
@@ -143,14 +143,20 @@ class SAML2_EncryptedAssertion {
 	/**
 	 * Convert this encrypted assertion to an XML element.
 	 *
+	 * @param DOMNode|NULL $parentElement  The DOM node the assertion should be created in.
 	 * @return DOMElement  This encrypted assertion.
 	 */
-	public function toXML() {
+	public function toXML(DOMNode $parentElement = NULL) {
 
-		$document = new DOMDocument();
+		if ($parentElement === NULL) {
+			$document = new DOMDocument();
+			$parentElement = $document;
+		} else {
+			$document = $parentElement->ownerDocument;
+		}
 
 		$root = $document->createElementNS(SAML2_Const::NS_SAML, 'saml:' . 'EncryptedAssertion');
-		$document->appendChild($root);
+		$parentElement->appendChild($root);
 
 		$root->appendChild($document->importNode($this->encryptedData, TRUE));
 
diff --git a/lib/SAML2/Response.php b/lib/SAML2/Response.php
index d45c73f35e3aa1309107d8453e878381f86638cb..adae1fed0e0b0400f2c94190689087a2a4ffa588 100644
--- a/lib/SAML2/Response.php
+++ b/lib/SAML2/Response.php
@@ -73,9 +73,7 @@ class SAML2_Response extends SAML2_StatusResponse {
 		$root = parent::toUnsignedXML();
 
 		foreach ($this->assertions as $assertion) {
-			$node = $assertion->toXML();
-			$node = $root->ownerDocument->importNode($node, TRUE);
-			$root->appendChild($node);
+			$node = $assertion->toXML($root);
 		}
 
 		return $root;