Clone macros
[shibboleth/cpp-opensaml.git] / saml / saml2 / core / impl / Protocols20Impl.cpp
index 6cf699a..6ce1c3a 100644 (file)
@@ -1,50 +1,58 @@
-/*
- *  Copyright 2001-2006 Internet2
- * 
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
+/**
+ * Licensed to the University Corporation for Advanced Internet
+ * Development, Inc. (UCAID) under one or more contributor license
+ * agreements. See the NOTICE file distributed with this work for
+ * additional information regarding copyright ownership.
+ *
+ * UCAID licenses this file to you under the Apache License,
+ * Version 2.0 (the "License"); you may not use this file except
+ * in compliance with the License. You may obtain a copy of the
+ * License at
  *
- *     http://www.apache.org/licenses/LICENSE-2.0
+ * http://www.apache.org/licenses/LICENSE-2.0
  *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND,
+ * either express or implied. See the License for the specific
+ * language governing permissions and limitations under the License.
  */
 
 /**
  * Protocols20Impl.cpp
  * 
- * Implementation classes for SAML 2.0 Protocols schema
+ * Implementation classes for SAML 2.0 Protocols schema.
  */
 
 #include "internal.h"
 #include "exceptions.h"
-#include "saml/encryption/EncryptedKeyResolver.h"
 #include "saml2/core/Protocols.h"
+#include "signature/ContentReference.h"
 
-#include <xmltooling/AbstractChildlessElement.h>
 #include <xmltooling/AbstractComplexElement.h>
-#include <xmltooling/AbstractElementProxy.h>
 #include <xmltooling/AbstractSimpleElement.h>
-#include <xmltooling/encryption/Decrypter.h>
+#include <xmltooling/encryption/Encryption.h>
 #include <xmltooling/impl/AnyElement.h>
 #include <xmltooling/io/AbstractXMLObjectMarshaller.h>
 #include <xmltooling/io/AbstractXMLObjectUnmarshaller.h>
+#include <xmltooling/signature/Signature.h>
+#include <xmltooling/util/DateTime.h>
 #include <xmltooling/util/XMLHelper.h>
 
 #include <ctime>
+#include <boost/lambda/bind.hpp>
+#include <boost/lambda/if.hpp>
+#include <boost/lambda/lambda.hpp>
 #include <xercesc/util/XMLUniDefs.hpp>
 
 using namespace opensaml::saml2p;
-using namespace opensaml::saml2;
-using namespace opensaml;
-using namespace xmlsignature;
-using namespace xmlencryption;
 using namespace xmltooling;
 using namespace std;
+using xmlconstants::XMLSIG_NS;
+using xmlconstants::XMLENC_NS;
+using xmlconstants::XML_BOOL_NULL;
+using samlconstants::SAML20_NS;
+using samlconstants::SAML20P_NS;
 
 #if defined (_MSC_VER)
     #pragma warning( push )
@@ -65,7 +73,7 @@ namespace opensaml {
 
         //TODO need unit test for this, using objects from another namespace
         class SAML_DLLLOCAL ExtensionsImpl : public virtual Extensions,
-             public AbstractElementProxy,
+             public AbstractComplexElement,
              public AbstractDOMCachingXMLObject,
              public AbstractXMLObjectMarshaller,
              public AbstractXMLObjectUnmarshaller
@@ -73,27 +81,23 @@ namespace opensaml {
         public:
             virtual ~ExtensionsImpl() {}
     
-            ExtensionsImpl(const XMLCh* nsURI, const XMLCh* localName, const XMLCh* prefix, const QName* schemaType)
-                : AbstractXMLObject(nsURI, localName, prefix, schemaType) {
-            }
+            ExtensionsImpl(const XMLCh* nsURI, const XMLCh* localName, const XMLCh* prefix, const xmltooling::QName* schemaType)
+                : AbstractXMLObject(nsURI, localName, prefix, schemaType) {}
                 
             ExtensionsImpl(const ExtensionsImpl& src)
-                    : AbstractXMLObject(src), AbstractElementProxy(src), AbstractDOMCachingXMLObject(src) {
-                for (list<XMLObject*>::const_iterator i=src.m_children.begin(); i!=src.m_children.end(); i++) {
-                    if (*i) {
-                        getXMLObjects().push_back((*i)->clone());
-                    }
-                }
+                    : AbstractXMLObject(src), AbstractComplexElement(src), AbstractDOMCachingXMLObject(src) {
+                IMPL_CLONE_XMLOBJECT_CHILDREN(UnknownXMLObject);
             }
             
             IMPL_XMLOBJECT_CLONE(Extensions);
+            IMPL_XMLOBJECT_CHILDREN(UnknownXMLObject,m_children.end());
     
         protected:
             void processChildElement(XMLObject* childXMLObject, const DOMElement* root) {
                 // Unknown child.
                 const XMLCh* nsURI=root->getNamespaceURI();
-                if (!XMLString::equals(nsURI,SAMLConstants::SAML20P_NS) && nsURI && *nsURI) {
-                    getXMLObjects().push_back(childXMLObject);
+                if (!XMLString::equals(nsURI,SAML20P_NS) && nsURI && *nsURI) {
+                    getUnknownXMLObjects().push_back(childXMLObject);
                     return;
                 }
                 
@@ -108,77 +112,73 @@ namespace opensaml {
              public AbstractXMLObjectUnmarshaller
         {
             void init() {
-                m_Value=NULL;
-                m_StatusCode=NULL;
-                m_children.push_back(NULL);
+                m_Value=nullptr;
+                m_StatusCode=nullptr;
+                m_children.push_back(nullptr);
                 m_pos_StatusCode=m_children.begin();
             }
-            public:
-                virtual ~StatusCodeImpl() {}
 
-                StatusCodeImpl(const XMLCh* nsURI, const XMLCh* localName, const XMLCh* prefix, const QName* schemaType)
-                    : AbstractXMLObject(nsURI, localName, prefix, schemaType)
-                {
-                        init();
-                }
+        public:
+            virtual ~StatusCodeImpl() {
+                XMLString::release(&m_Value);
+            }
 
-                StatusCodeImpl(const StatusCodeImpl& src) : AbstractXMLObject(src), AbstractDOMCachingXMLObject(src) {
-                    init();
-                    setValue(src.getValue());
-                    if (src.getStatusCode())
-                        setStatusCode(src.getStatusCode()->cloneStatusCode());
-                }
+            StatusCodeImpl(const XMLCh* nsURI, const XMLCh* localName, const XMLCh* prefix, const xmltooling::QName* schemaType)
+                    : AbstractXMLObject(nsURI, localName, prefix, schemaType) {
+                init();
+            }
 
-                IMPL_XMLOBJECT_CLONE(StatusCode);
-                IMPL_STRING_ATTRIB(Value);
-                IMPL_TYPED_CHILD(StatusCode);
+            StatusCodeImpl(const StatusCodeImpl& src)
+                    : AbstractXMLObject(src), AbstractComplexElement(src), AbstractDOMCachingXMLObject(src) {
+                init();
+                IMPL_CLONE_ATTRIB(Value);
+                IMPL_CLONE_TYPED_CHILD(StatusCode);
+            }
 
-            protected:
-                void marshallAttributes(DOMElement* domElement) const {
-                    MARSHALL_STRING_ATTRIB(Value,VALUE,NULL);
-                }
+            IMPL_XMLOBJECT_CLONE(StatusCode);
+            IMPL_STRING_ATTRIB(Value);
+            IMPL_TYPED_CHILD(StatusCode);
 
-                void processChildElement(XMLObject* childXMLObject, const DOMElement* root) {
-                    PROC_TYPED_CHILD(StatusCode,SAMLConstants::SAML20P_NS,false);
-                    AbstractXMLObjectUnmarshaller::processChildElement(childXMLObject,root);
-                }
+        protected:
+            void marshallAttributes(DOMElement* domElement) const {
+                MARSHALL_STRING_ATTRIB(Value,VALUE,nullptr);
+            }
 
-                void processAttribute(const DOMAttr* attribute) {
-                    PROC_STRING_ATTRIB(Value,VALUE,NULL);
-                    AbstractXMLObjectUnmarshaller::processAttribute(attribute);
-                }
+            void processChildElement(XMLObject* childXMLObject, const DOMElement* root) {
+                PROC_TYPED_CHILD(StatusCode,SAML20P_NS,false);
+                AbstractXMLObjectUnmarshaller::processChildElement(childXMLObject,root);
+            }
+
+            void processAttribute(const DOMAttr* attribute) {
+                PROC_STRING_ATTRIB(Value,VALUE,nullptr);
+                AbstractXMLObjectUnmarshaller::processAttribute(attribute);
+            }
         };
 
-        //TODO need unit tests for non-SAML namespace children
         class SAML_DLLLOCAL StatusDetailImpl : public virtual StatusDetail,
             public AbstractComplexElement,
             public AbstractDOMCachingXMLObject,
             public AbstractXMLObjectMarshaller,
             public AbstractXMLObjectUnmarshaller
         {
-            public:
-                virtual ~StatusDetailImpl() {}
-
-                StatusDetailImpl(const XMLCh* nsURI, const XMLCh* localName, const XMLCh* prefix, const QName* schemaType)
-                    : AbstractXMLObject(nsURI, localName, prefix, schemaType) { }
-
-                StatusDetailImpl(const StatusDetailImpl& src) : AbstractXMLObject(src), AbstractDOMCachingXMLObject(src) {
-                        VectorOf(XMLObject) v=getDetails();
-                        for (vector<XMLObject*>::const_iterator i=src.m_Details.begin(); i!=src.m_Details.end(); i++) {
-                            if (*i) {
-                                v.push_back((*i)->clone());
-                            }
-                        }
-                    }
-
-                IMPL_XMLOBJECT_CLONE(StatusDetail);
-                IMPL_XMLOBJECT_CHILDREN(Detail,m_children.end());
-
-            protected:
-                void processChildElement(XMLObject* childXMLObject, const DOMElement* root) {
-                    getDetails().push_back(childXMLObject);
-                    AbstractXMLObjectUnmarshaller::processChildElement(childXMLObject,root);
-                }
+        public:
+            virtual ~StatusDetailImpl() {}
+
+            StatusDetailImpl(const XMLCh* nsURI, const XMLCh* localName, const XMLCh* prefix, const xmltooling::QName* schemaType)
+                : AbstractXMLObject(nsURI, localName, prefix, schemaType) {}
+
+            StatusDetailImpl(const StatusDetailImpl& src)
+                    : AbstractXMLObject(src), AbstractComplexElement(src), AbstractDOMCachingXMLObject(src) {
+                IMPL_CLONE_XMLOBJECT_CHILDREN(UnknownXMLObject);
+            }
+
+            IMPL_XMLOBJECT_CLONE(StatusDetail);
+            IMPL_XMLOBJECT_CHILDREN(UnknownXMLObject,m_children.end());
+
+        protected:
+            void processChildElement(XMLObject* childXMLObject, const DOMElement* root) {
+                getUnknownXMLObjects().push_back(childXMLObject);
+            }
         };
 
 
@@ -189,35 +189,32 @@ namespace opensaml {
              public AbstractXMLObjectUnmarshaller
         {
             void init() {
-                m_StatusCode=NULL;
-                m_StatusMessage=NULL;
-                m_StatusDetail=NULL;
-                m_children.push_back(NULL);
-                m_children.push_back(NULL);
-                m_children.push_back(NULL);
+                m_StatusCode=nullptr;
+                m_StatusMessage=nullptr;
+                m_StatusDetail=nullptr;
+                m_children.push_back(nullptr);
+                m_children.push_back(nullptr);
+                m_children.push_back(nullptr);
                 m_pos_StatusCode=m_children.begin();
                 m_pos_StatusMessage=m_pos_StatusCode;
                 ++m_pos_StatusMessage;
                 m_pos_StatusDetail=m_pos_StatusMessage;
                 ++m_pos_StatusDetail;
             }
+
         public:
-            virtual ~StatusImpl() { }
+            virtual ~StatusImpl() {}
     
-            StatusImpl(const XMLCh* nsURI, const XMLCh* localName, const XMLCh* prefix, const QName* schemaType)
-                : AbstractXMLObject(nsURI, localName, prefix, schemaType)
-            {
-                    init();
+            StatusImpl(const XMLCh* nsURI, const XMLCh* localName, const XMLCh* prefix, const xmltooling::QName* schemaType)
+                    : AbstractXMLObject(nsURI, localName, prefix, schemaType) {
+                init();
             }
                 
-            StatusImpl(const StatusImpl& src) : AbstractXMLObject(src), AbstractDOMCachingXMLObject(src) {
+            StatusImpl(const StatusImpl& src) : AbstractXMLObject(src), AbstractComplexElement(src), AbstractDOMCachingXMLObject(src) {
                 init();
-                if (src.getStatusCode())
-                    setStatusCode(src.getStatusCode()->cloneStatusCode());
-                if (src.getStatusMessage())
-                    setStatusMessage(src.getStatusMessage()->cloneStatusMessage());
-                if (src.getStatusDetail())
-                    setStatusDetail(src.getStatusDetail()->cloneStatusDetail());
+                IMPL_CLONE_TYPED_CHILD(StatusCode);
+                IMPL_CLONE_TYPED_CHILD(StatusMessage);
+                IMPL_CLONE_TYPED_CHILD(StatusDetail);
             }
             
             IMPL_XMLOBJECT_CLONE(Status);
@@ -226,47 +223,47 @@ namespace opensaml {
             IMPL_TYPED_CHILD(StatusDetail);
     
         protected:
-    
             void processChildElement(XMLObject* childXMLObject, const DOMElement* root) {
-                PROC_TYPED_CHILD(StatusCode,SAMLConstants::SAML20P_NS,false);
-                PROC_TYPED_CHILD(StatusMessage,SAMLConstants::SAML20P_NS,false);
-                PROC_TYPED_CHILD(StatusDetail,SAMLConstants::SAML20P_NS,false);
+                PROC_TYPED_CHILD(StatusCode,SAML20P_NS,false);
+                PROC_TYPED_CHILD(StatusMessage,SAML20P_NS,false);
+                PROC_TYPED_CHILD(StatusDetail,SAML20P_NS,false);
                 AbstractXMLObjectUnmarshaller::processChildElement(childXMLObject,root);
             }
-    
         };
 
 
-        class SAML_DLLLOCAL RequestImpl : public virtual Request,
+        class SAML_DLLLOCAL RequestAbstractTypeImpl : public virtual RequestAbstractType,
             public AbstractComplexElement,
             public AbstractDOMCachingXMLObject,
             public AbstractXMLObjectMarshaller,
             public AbstractXMLObjectUnmarshaller
         {
             void init() {
-                m_ID=NULL;
-                m_Version=NULL;
-                m_IssueInstant=NULL;
-                m_Destination=NULL;
-                m_Consent=NULL;
-                m_Issuer=NULL;
-                m_Signature=NULL;
-                m_Extensions=NULL;
-                m_children.push_back(NULL);
-                m_children.push_back(NULL);
-                m_children.push_back(NULL);
+                m_ID=nullptr;
+                m_Version=nullptr;
+                m_IssueInstant=nullptr;
+                m_Destination=nullptr;
+                m_Consent=nullptr;
+                m_Issuer=nullptr;
+                m_Signature=nullptr;
+                m_Extensions=nullptr;
+                m_children.push_back(nullptr);
+                m_children.push_back(nullptr);
+                m_children.push_back(nullptr);
                 m_pos_Issuer=m_children.begin();
                 m_pos_Signature=m_pos_Issuer;
                 ++m_pos_Signature;
                 m_pos_Extensions=m_pos_Signature;
                 ++m_pos_Extensions;
             }
+
         protected:
-            RequestImpl() {
+            RequestAbstractTypeImpl() {
                 init();
             }
+
         public:
-            virtual ~RequestImpl() {
+            virtual ~RequestAbstractTypeImpl() {
                 XMLString::release(&m_ID);
                 XMLString::release(&m_Version);
                 XMLString::release(&m_Destination);
@@ -274,52 +271,51 @@ namespace opensaml {
                 delete m_IssueInstant;
             }
     
-            RequestImpl(const XMLCh* nsURI, const XMLCh* localName, const XMLCh* prefix, const QName* schemaType)
-                : AbstractXMLObject(nsURI, localName, prefix, schemaType)
-            {
+            RequestAbstractTypeImpl(const XMLCh* nsURI, const XMLCh* localName, const XMLCh* prefix, const xmltooling::QName* schemaType)
+                : AbstractXMLObject(nsURI, localName, prefix, schemaType) {
                 init();
             }
                 
-            RequestImpl(const RequestImpl& src) : AbstractXMLObject(src), AbstractDOMCachingXMLObject(src) {
+            RequestAbstractTypeImpl(const RequestAbstractTypeImpl& src)
+                    : AbstractXMLObject(src), AbstractComplexElement(src), AbstractDOMCachingXMLObject(src) {
                 init();
-                setID(src.getID());
-                setVersion(src.getVersion());
-                setIssueInstant(src.getIssueInstant());
-                setDestination(src.getDestination());
-                setConsent(src.getConsent());
-                if (src.getIssuer())
-                    setIssuer(src.getIssuer()->cloneIssuer());
-                if (src.getSignature())
-                    setSignature(src.getSignature()->cloneSignature());
-                if (src.getExtensions())
-                    setExtensions(src.getExtensions()->cloneExtensions());
-            }
-            
-            const XMLCh* getId() const {
-                return getID();
             }
 
+            void _clone(const RequestAbstractTypeImpl& src) {
+                IMPL_CLONE_ATTRIB(ID);
+                IMPL_CLONE_ATTRIB(Version);
+                IMPL_CLONE_ATTRIB(IssueInstant);
+                IMPL_CLONE_ATTRIB(Destination);
+                IMPL_CLONE_ATTRIB(Consent);
+                IMPL_CLONE_TYPED_CHILD(Issuer);
+                IMPL_CLONE_TYPED_CHILD(Signature);
+                IMPL_CLONE_TYPED_CHILD(Extensions);
+            }
+            
             //IMPL_TYPED_CHILD(Signature);
             // Need customized setter.
         protected:
-            Signature* m_Signature;
+            xmlsignature::Signature* m_Signature;
             list<XMLObject*>::iterator m_pos_Signature;
         public:
-            Signature* getSignature() const {
+            xmlsignature::Signature* getSignature() const {
                 return m_Signature;
             }
             
-            void setSignature(Signature* sig) {
+            void setSignature(xmlsignature::Signature* sig) {
                 prepareForAssignment(m_Signature,sig);
                 *m_pos_Signature=m_Signature=sig;
                 // Sync content reference back up.
                 if (m_Signature)
                     m_Signature->setContentReference(new opensaml::ContentReference(*this));
             }
+
+            RequestAbstractType* cloneRequestAbstractType() const {
+                return dynamic_cast<RequestAbstractType*>(clone());
+            }
             
-            IMPL_XMLOBJECT_CLONE(Request);
             IMPL_STRING_ATTRIB(Version);
-            IMPL_STRING_ATTRIB(ID);
+            IMPL_ID_ATTRIB_EX(ID,ID,nullptr);
             IMPL_DATETIME_ATTRIB(IssueInstant,0);
             IMPL_STRING_ATTRIB(Destination);
             IMPL_STRING_ATTRIB(Consent);
@@ -327,107 +323,114 @@ namespace opensaml {
             IMPL_TYPED_CHILD(Extensions);
     
         protected:
+            void prepareForMarshalling() const {
+                if (m_Signature)
+                    declareNonVisibleNamespaces();
+            }
+
             void marshallAttributes(DOMElement* domElement) const {
                 if (!m_Version)
-                    const_cast<RequestImpl*>(this)->m_Version=XMLString::transcode("2.0");
-                MARSHALL_STRING_ATTRIB(Version,VER,NULL);
+                    const_cast<RequestAbstractTypeImpl*>(this)->m_Version=XMLString::transcode("2.0");
+                MARSHALL_STRING_ATTRIB(Version,VER,nullptr);
                 if (!m_ID)
-                    const_cast<RequestImpl*>(this)->m_ID=SAMLConfig::getConfig().generateIdentifier();
-                MARSHALL_ID_ATTRIB(ID,ID,NULL);
+                    const_cast<RequestAbstractTypeImpl*>(this)->m_ID=SAMLConfig::getConfig().generateIdentifier();
+                MARSHALL_ID_ATTRIB(ID,ID,nullptr);
                 if (!m_IssueInstant) {
-                    const_cast<RequestImpl*>(this)->m_IssueInstantEpoch=time(NULL);
-                    const_cast<RequestImpl*>(this)->m_IssueInstant=new DateTime(m_IssueInstantEpoch);
+                    const_cast<RequestAbstractTypeImpl*>(this)->m_IssueInstantEpoch=time(nullptr);
+                    const_cast<RequestAbstractTypeImpl*>(this)->m_IssueInstant=new DateTime(m_IssueInstantEpoch);
                 }
-                MARSHALL_DATETIME_ATTRIB(IssueInstant,ISSUEINSTANT,NULL);
-                MARSHALL_STRING_ATTRIB(Destination,DESTINATION,NULL);
-                MARSHALL_STRING_ATTRIB(Consent,CONSENT,NULL);
+                MARSHALL_DATETIME_ATTRIB(IssueInstant,ISSUEINSTANT,nullptr);
+                MARSHALL_STRING_ATTRIB(Destination,DESTINATION,nullptr);
+                MARSHALL_STRING_ATTRIB(Consent,CONSENT,nullptr);
             }
     
             void processChildElement(XMLObject* childXMLObject, const DOMElement* root) {
-                PROC_TYPED_FOREIGN_CHILD(Issuer,saml2,SAMLConstants::SAML20_NS,false);
-                PROC_TYPED_FOREIGN_CHILD(Signature,xmlsignature,XMLConstants::XMLSIG_NS,false);
-                PROC_TYPED_CHILD(Extensions,SAMLConstants::SAML20P_NS,false);
+                PROC_TYPED_FOREIGN_CHILD(Issuer,saml2,SAML20_NS,false);
+                PROC_TYPED_FOREIGN_CHILD(Signature,xmlsignature,XMLSIG_NS,false);
+                PROC_TYPED_CHILD(Extensions,SAML20P_NS,false);
                 AbstractXMLObjectUnmarshaller::processChildElement(childXMLObject,root);
             }
     
             void processAttribute(const DOMAttr* attribute) {
-                PROC_ID_ATTRIB(ID,ID,NULL);
-                PROC_STRING_ATTRIB(Version,VER,NULL);
-                PROC_DATETIME_ATTRIB(IssueInstant,ISSUEINSTANT,NULL);
-                PROC_STRING_ATTRIB(Destination,DESTINATION,NULL);
-                PROC_STRING_ATTRIB(Consent,CONSENT,NULL);
+                PROC_ID_ATTRIB(ID,ID,nullptr);
+                PROC_STRING_ATTRIB(Version,VER,nullptr);
+                PROC_DATETIME_ATTRIB(IssueInstant,ISSUEINSTANT,nullptr);
+                PROC_STRING_ATTRIB(Destination,DESTINATION,nullptr);
+                PROC_STRING_ATTRIB(Consent,CONSENT,nullptr);
                 AbstractXMLObjectUnmarshaller::processAttribute(attribute);
             }
         };
 
 
-        class SAML_DLLLOCAL AssertionIDRequestImpl : public virtual AssertionIDRequest, public RequestImpl
+        class SAML_DLLLOCAL AssertionIDRequestImpl : public virtual AssertionIDRequest, public RequestAbstractTypeImpl
         {
         public:
-            virtual ~AssertionIDRequestImpl() { }
+            virtual ~AssertionIDRequestImpl() {}
     
-            AssertionIDRequestImpl(const XMLCh* nsURI, const XMLCh* localName, const XMLCh* prefix, const QName* schemaType)
-                : AbstractXMLObject(nsURI, localName, prefix, schemaType) { }
+            AssertionIDRequestImpl(const XMLCh* nsURI, const XMLCh* localName, const XMLCh* prefix, const xmltooling::QName* schemaType)
+                : AbstractXMLObject(nsURI, localName, prefix, schemaType) {}
                 
-            AssertionIDRequestImpl(const AssertionIDRequestImpl& src) : AbstractXMLObject(src), RequestImpl(src) {
-                VectorOf(AssertionIDRef) v=getAssertionIDRefs();
-                for (vector<AssertionIDRef*>::const_iterator i=src.m_AssertionIDRefs.begin(); i!=src.m_AssertionIDRefs.end(); i++) {
-                    if (*i) {                               
-                        v.push_back((*i)->cloneAssertionIDRef());
-                    }
-                }
+            AssertionIDRequestImpl(const AssertionIDRequestImpl& src) : AbstractXMLObject(src), RequestAbstractTypeImpl(src) {}
 
+            void _clone(const AssertionIDRequestImpl& src) {
+                RequestAbstractTypeImpl::_clone(src);
+                IMPL_CLONE_TYPED_FOREIGN_CHILDREN(AssertionIDRef,saml2);
             }
             
-            IMPL_XMLOBJECT_CLONE(AssertionIDRequest);
+            IMPL_XMLOBJECT_CLONE_EX(AssertionIDRequest);
             IMPL_TYPED_FOREIGN_CHILDREN(AssertionIDRef,saml2,m_children.end());
     
         protected:
             void processChildElement(XMLObject* childXMLObject, const DOMElement* root) {
-                PROC_TYPED_FOREIGN_CHILDREN(AssertionIDRef,saml2,SAMLConstants::SAML20_NS,false);
-                RequestImpl::processChildElement(childXMLObject,root);
+                PROC_TYPED_FOREIGN_CHILDREN(AssertionIDRef,saml2,SAML20_NS,false);
+                RequestAbstractTypeImpl::processChildElement(childXMLObject,root);
             }
         };
 
-        class SAML_DLLLOCAL SubjectQueryImpl : public virtual SubjectQuery, public RequestImpl
+        class SAML_DLLLOCAL SubjectQueryImpl : public virtual SubjectQuery, public RequestAbstractTypeImpl
         {
-            void init()
-            {
-                m_Subject = NULL;
-                m_children.push_back(NULL);
+            void init() {
+                m_Subject = nullptr;
+                m_children.push_back(nullptr);
                 m_pos_Subject = m_pos_Extensions;
                 ++m_pos_Subject;
             }
+
         protected:
             SubjectQueryImpl() {
                 init();
             }
+
         public:
-            virtual ~SubjectQueryImpl() { }
+            virtual ~SubjectQueryImpl() {}
     
-            SubjectQueryImpl(const XMLCh* nsURI, const XMLCh* localName, const XMLCh* prefix, const QName* schemaType)
-                : AbstractXMLObject(nsURI, localName, prefix, schemaType)
-            { 
+            SubjectQueryImpl(const XMLCh* nsURI, const XMLCh* localName, const XMLCh* prefix, const xmltooling::QName* schemaType)
+                : AbstractXMLObject(nsURI, localName, prefix, schemaType) {
                 init();
             }
                 
-            SubjectQueryImpl(const SubjectQueryImpl& src) : AbstractXMLObject(src), RequestImpl(src) {
+            SubjectQueryImpl(const SubjectQueryImpl& src) : AbstractXMLObject(src), RequestAbstractTypeImpl(src) {
                 init();
-                if (src.getSubject())
-                    setSubject(src.getSubject()->cloneSubject());
+            }
+
+            void _clone(const SubjectQueryImpl& src) {
+                RequestAbstractTypeImpl::_clone(src);
+                IMPL_CLONE_TYPED_CHILD(Subject);
             }
             
-            IMPL_XMLOBJECT_CLONE(SubjectQuery);
+            SubjectQuery* cloneSubjectQuery() const {
+                return dynamic_cast<SubjectQuery*>(clone());
+            }
+
             IMPL_TYPED_FOREIGN_CHILD(Subject,saml2);
     
         protected:
             void processChildElement(XMLObject* childXMLObject, const DOMElement* root) {
-                PROC_TYPED_FOREIGN_CHILD(Subject,saml2,SAMLConstants::SAML20_NS,false);
-                RequestImpl::processChildElement(childXMLObject,root);
+                PROC_TYPED_FOREIGN_CHILD(Subject,saml2,SAML20_NS,false);
+                RequestAbstractTypeImpl::processChildElement(childXMLObject,root);
             }
         };
 
-
         class SAML_DLLLOCAL RequestedAuthnContextImpl : public virtual RequestedAuthnContext,
             public AbstractComplexElement,
             public AbstractDOMCachingXMLObject,
@@ -435,37 +438,27 @@ namespace opensaml {
             public AbstractXMLObjectUnmarshaller
         {
             void init() {
-                m_Comparison=NULL;
+                m_Comparison=nullptr;
             }
+
         public:
             virtual ~RequestedAuthnContextImpl() {
                 XMLString::release(&m_Comparison);
             }
     
-            RequestedAuthnContextImpl(const XMLCh* nsURI, const XMLCh* localName, const XMLCh* prefix, const QName* schemaType)
-                : AbstractXMLObject(nsURI, localName, prefix, schemaType)
-            {
+            RequestedAuthnContextImpl(const XMLCh* nsURI, const XMLCh* localName, const XMLCh* prefix, const xmltooling::QName* schemaType)
+                    : AbstractXMLObject(nsURI, localName, prefix, schemaType) {
                 init();
             }
                 
-            RequestedAuthnContextImpl(const RequestedAuthnContextImpl& src) : AbstractXMLObject(src), AbstractDOMCachingXMLObject(src) {
+            RequestedAuthnContextImpl(const RequestedAuthnContextImpl& src)
+                    : AbstractXMLObject(src), AbstractComplexElement(src), AbstractDOMCachingXMLObject(src) {
                 init();
-                setComparison(src.getComparison());
-                for (list<XMLObject*>::const_iterator i=src.m_children.begin(); i!=src.m_children.end(); i++) {
-                    if (*i) {
-                        AuthnContextClassRef* classref=dynamic_cast<AuthnContextClassRef*>(*i);
-                        if (classref) {
-                            getAuthnContextClassRefs().push_back(classref->cloneAuthnContextClassRef());
-                            continue;
-                        }
-
-                        AuthnContextDeclRef* declref=dynamic_cast<AuthnContextDeclRef*>(*i);
-                        if (declref) {
-                            getAuthnContextDeclRefs().push_back(declref->cloneAuthnContextDeclRef());
-                            continue;
-                        }
-                    }
-                }
+                IMPL_CLONE_ATTRIB(Comparison);
+                IMPL_CLONE_CHILDBAG_BEGIN;
+                    IMPL_CLONE_TYPED_FOREIGN_CHILD_IN_BAG(AuthnContextClassRef,saml2);
+                    IMPL_CLONE_TYPED_FOREIGN_CHILD_IN_BAG(AuthnContextDeclRef,saml2);
+                IMPL_CLONE_CHILDBAG_END;
             }
             
             IMPL_XMLOBJECT_CLONE(RequestedAuthnContext);
@@ -475,66 +468,68 @@ namespace opensaml {
     
         protected:
             void marshallAttributes(DOMElement* domElement) const {
-                MARSHALL_STRING_ATTRIB(Comparison,COMPARISON,NULL);
+                MARSHALL_STRING_ATTRIB(Comparison,COMPARISON,nullptr);
             }
     
             void processChildElement(XMLObject* childXMLObject, const DOMElement* root) {
-                PROC_TYPED_FOREIGN_CHILDREN(AuthnContextClassRef,saml2,SAMLConstants::SAML20_NS,false);
-                PROC_TYPED_FOREIGN_CHILDREN(AuthnContextDeclRef,saml2,SAMLConstants::SAML20_NS,false);
+                PROC_TYPED_FOREIGN_CHILDREN(AuthnContextClassRef,saml2,SAML20_NS,false);
+                PROC_TYPED_FOREIGN_CHILDREN(AuthnContextDeclRef,saml2,SAML20_NS,false);
                 AbstractXMLObjectUnmarshaller::processChildElement(childXMLObject,root);
             }
     
             void processAttribute(const DOMAttr* attribute) {
-                PROC_STRING_ATTRIB(Comparison,COMPARISON,NULL);
+                PROC_STRING_ATTRIB(Comparison,COMPARISON,nullptr);
                 AbstractXMLObjectUnmarshaller::processAttribute(attribute);
             }
         };
 
-
         class SAML_DLLLOCAL AuthnQueryImpl : public virtual AuthnQuery, public SubjectQueryImpl
         {
             void init() {
-                m_SessionIndex=NULL;
-                m_RequestedAuthnContext=NULL;
-                m_children.push_back(NULL);
+                m_SessionIndex=nullptr;
+                m_RequestedAuthnContext=nullptr;
+                m_children.push_back(nullptr);
                 m_pos_RequestedAuthnContext = m_pos_Subject;
                 ++m_pos_RequestedAuthnContext;
                 
             }
+
         public:
             virtual ~AuthnQueryImpl() {
                 XMLString::release(&m_SessionIndex);
             }
     
-            AuthnQueryImpl(const XMLCh* nsURI, const XMLCh* localName, const XMLCh* prefix, const QName* schemaType)
-                : AbstractXMLObject(nsURI, localName, prefix, schemaType)
-            {
+            AuthnQueryImpl(const XMLCh* nsURI, const XMLCh* localName, const XMLCh* prefix, const xmltooling::QName* schemaType)
+                : AbstractXMLObject(nsURI, localName, prefix, schemaType) {
                 init();
             }
                 
             AuthnQueryImpl(const AuthnQueryImpl& src) : AbstractXMLObject(src), SubjectQueryImpl(src) {
                 init();
-                setSessionIndex(src.getSessionIndex());
-                if (src.getRequestedAuthnContext())
-                    setRequestedAuthnContext(src.getRequestedAuthnContext()->cloneRequestedAuthnContext());
+            }
+
+            void _clone(const AuthnQueryImpl& src) {
+                SubjectQueryImpl::_clone(src);
+                IMPL_CLONE_ATTRIB(SessionIndex);
+                IMPL_CLONE_TYPED_CHILD(RequestedAuthnContext);
             }
             
-            IMPL_XMLOBJECT_CLONE(AuthnQuery);
+            IMPL_XMLOBJECT_CLONE_EX(AuthnQuery);
             IMPL_STRING_ATTRIB(SessionIndex);
             IMPL_TYPED_CHILD(RequestedAuthnContext);
     
         protected:
             void marshallAttributes(DOMElement* domElement) const {
-                MARSHALL_STRING_ATTRIB(SessionIndex,SESSIONINDEX,NULL);
+                MARSHALL_STRING_ATTRIB(SessionIndex,SESSIONINDEX,nullptr);
                 SubjectQueryImpl::marshallAttributes(domElement);
             }
     
             void processChildElement(XMLObject* childXMLObject, const DOMElement* root) {
-                PROC_TYPED_CHILD(RequestedAuthnContext,SAMLConstants::SAML20P_NS,false);
+                PROC_TYPED_CHILD(RequestedAuthnContext,SAML20P_NS,false);
                 SubjectQueryImpl::processChildElement(childXMLObject,root);
             }
             void processAttribute(const DOMAttr* attribute) {
-                PROC_STRING_ATTRIB(SessionIndex,SESSIONINDEX,NULL);
+                PROC_STRING_ATTRIB(SessionIndex,SESSIONINDEX,nullptr);
                 SubjectQueryImpl::processAttribute(attribute);
             }
         };
@@ -542,30 +537,24 @@ namespace opensaml {
         class SAML_DLLLOCAL AttributeQueryImpl : public virtual AttributeQuery, public SubjectQueryImpl
         {
         public:
-            virtual ~AttributeQueryImpl() { }
+            virtual ~AttributeQueryImpl() {}
     
-            AttributeQueryImpl(const XMLCh* nsURI, const XMLCh* localName, const XMLCh* prefix, const QName* schemaType)
-                : AbstractXMLObject(nsURI, localName, prefix, schemaType) { }
+            AttributeQueryImpl(const XMLCh* nsURI, const XMLCh* localName, const XMLCh* prefix, const xmltooling::QName* schemaType)
+                : AbstractXMLObject(nsURI, localName, prefix, schemaType) {}
                 
-            AttributeQueryImpl(const AttributeQueryImpl& src) : AbstractXMLObject(src), SubjectQueryImpl(src) {
-                for (list<XMLObject*>::const_iterator i=src.m_children.begin(); i!=src.m_children.end(); i++) {
-                    if (*i) {
-                        Attribute* attrib=dynamic_cast<Attribute*>(*i);
-                        if (attrib) {
-                            getAttributes().push_back(attrib->cloneAttribute());
-                            continue;
-                        }
-                    }
-                }
+            AttributeQueryImpl(const AttributeQueryImpl& src) : AbstractXMLObject(src), SubjectQueryImpl(src) {}
 
+            void _clone(const AttributeQueryImpl& src) {
+                SubjectQueryImpl::_clone(src);
+                IMPL_CLONE_TYPED_FOREIGN_CHILDREN(Attribute,saml2);
             }
             
-            IMPL_XMLOBJECT_CLONE(AttributeQuery);
+            IMPL_XMLOBJECT_CLONE_EX(AttributeQuery);
             IMPL_TYPED_FOREIGN_CHILDREN(Attribute,saml2,m_children.end());
     
         protected:
             void processChildElement(XMLObject* childXMLObject, const DOMElement* root) {
-                PROC_TYPED_FOREIGN_CHILDREN(Attribute,saml2,SAMLConstants::SAML20_NS,false);
+                PROC_TYPED_FOREIGN_CHILDREN(Attribute,saml2,SAML20_NS,false);
                 SubjectQueryImpl::processChildElement(childXMLObject,root);
             }
         };
@@ -573,163 +562,156 @@ namespace opensaml {
         class SAML_DLLLOCAL AuthzDecisionQueryImpl : public virtual AuthzDecisionQuery, public SubjectQueryImpl
         {
             void init() {
-                m_Resource=NULL;
-                m_Evidence=NULL;
-                m_children.push_back(NULL);
+                m_Resource=nullptr;
+                m_Evidence=nullptr;
+                m_children.push_back(nullptr);
                 m_pos_Evidence=m_pos_Subject;
-                ++m_pos_Evidence;
-                
+                ++m_pos_Evidence;   
             }
+
         public:
             virtual ~AuthzDecisionQueryImpl() {
                 XMLString::release(&m_Resource);
             }
     
-            AuthzDecisionQueryImpl(const XMLCh* nsURI, const XMLCh* localName, const XMLCh* prefix, const QName* schemaType)
-                : AbstractXMLObject(nsURI, localName, prefix, schemaType)
-            {
+            AuthzDecisionQueryImpl(const XMLCh* nsURI, const XMLCh* localName, const XMLCh* prefix, const xmltooling::QName* schemaType)
+                    : AbstractXMLObject(nsURI, localName, prefix, schemaType) {
                 init();
             }
                 
             AuthzDecisionQueryImpl(const AuthzDecisionQueryImpl& src) : AbstractXMLObject(src), SubjectQueryImpl(src) {
                 init();
-                setResource(src.getResource());
-                if (src.getEvidence())
-                    setEvidence(src.getEvidence()->cloneEvidence());
-                for (list<XMLObject*>::const_iterator i=src.m_children.begin(); i!=src.m_children.end(); i++) {
-                    if (*i) {
-                        Action* action=dynamic_cast<Action*>(*i);
-                        if (action) {
-                            getActions().push_back(action->cloneAction());
-                            continue;
-                        }
-                    }
-                }
+            }
+
+            void _clone(const AuthzDecisionQueryImpl& src) {
+                SubjectQueryImpl::_clone(src);
+                IMPL_CLONE_ATTRIB(Resource);
+                IMPL_CLONE_TYPED_CHILD(Evidence);
+                IMPL_CLONE_TYPED_FOREIGN_CHILDREN(Action,saml2);
             }
             
-            IMPL_XMLOBJECT_CLONE(AuthzDecisionQuery);
+            IMPL_XMLOBJECT_CLONE_EX(AuthzDecisionQuery);
             IMPL_STRING_ATTRIB(Resource);
             IMPL_TYPED_FOREIGN_CHILDREN(Action,saml2,m_pos_Evidence);
             IMPL_TYPED_FOREIGN_CHILD(Evidence,saml2);
     
         protected:
             void marshallAttributes(DOMElement* domElement) const {
-                MARSHALL_STRING_ATTRIB(Resource,RESOURCE,NULL);
+                MARSHALL_STRING_ATTRIB(Resource,RESOURCE,nullptr);
                 SubjectQueryImpl::marshallAttributes(domElement);
             }
     
             void processChildElement(XMLObject* childXMLObject, const DOMElement* root) {
-                PROC_TYPED_FOREIGN_CHILD(Evidence,saml2,SAMLConstants::SAML20_NS,false);
-                PROC_TYPED_FOREIGN_CHILDREN(Action,saml2,SAMLConstants::SAML20_NS,false);
+                PROC_TYPED_FOREIGN_CHILD(Evidence,saml2,SAML20_NS,false);
+                PROC_TYPED_FOREIGN_CHILDREN(Action,saml2,SAML20_NS,false);
                 SubjectQueryImpl::processChildElement(childXMLObject,root);
             }
             void processAttribute(const DOMAttr* attribute) {
-                PROC_STRING_ATTRIB(Resource,RESOURCE,NULL);
+                PROC_STRING_ATTRIB(Resource,RESOURCE,nullptr);
                 SubjectQueryImpl::processAttribute(attribute);
             }
         };
 
         class SAML_DLLLOCAL NameIDPolicyImpl : public virtual NameIDPolicy,
-            public AbstractChildlessElement,
+            public AbstractSimpleElement,
             public AbstractDOMCachingXMLObject,
             public AbstractXMLObjectMarshaller,
             public AbstractXMLObjectUnmarshaller
         {
             void init() {
-                m_Format=NULL;
-                m_SPNameQualifier=NULL;
-                m_AllowCreate=XMLConstants::XML_BOOL_NULL;
-            }
-            public:
-                virtual ~NameIDPolicyImpl()
-                {
-                    XMLString::release(&m_Format);
-                    XMLString::release(&m_SPNameQualifier);
-                }
+                m_Format=nullptr;
+                m_SPNameQualifier=nullptr;
+                m_AllowCreate=XML_BOOL_NULL;
+            }
 
-                NameIDPolicyImpl(const XMLCh* nsURI, const XMLCh* localName, const XMLCh* prefix, const QName* schemaType)
-                    : AbstractXMLObject(nsURI, localName, prefix, schemaType)
-                {
-                        init();
-                }
+        public:
+            virtual ~NameIDPolicyImpl() {
+                XMLString::release(&m_Format);
+                XMLString::release(&m_SPNameQualifier);
+            }
 
-                NameIDPolicyImpl(const NameIDPolicyImpl& src) : AbstractXMLObject(src), AbstractDOMCachingXMLObject(src) {
-                    init();
-                    setFormat(src.getFormat());
-                    setSPNameQualifier(src.getSPNameQualifier());
-                    AllowCreate(m_AllowCreate);
-                }
+            NameIDPolicyImpl(const XMLCh* nsURI, const XMLCh* localName, const XMLCh* prefix, const xmltooling::QName* schemaType)
+                    : AbstractXMLObject(nsURI, localName, prefix, schemaType) {
+                init();
+            }
 
-                IMPL_XMLOBJECT_CLONE(NameIDPolicy);
-                IMPL_STRING_ATTRIB(Format);
-                IMPL_STRING_ATTRIB(SPNameQualifier);
-                IMPL_BOOLEAN_ATTRIB(AllowCreate);
+            NameIDPolicyImpl(const NameIDPolicyImpl& src)
+                    : AbstractXMLObject(src), AbstractSimpleElement(src), AbstractDOMCachingXMLObject(src) {
+                init();
+                IMPL_CLONE_ATTRIB(Format);
+                IMPL_CLONE_ATTRIB(SPNameQualifier);
+                IMPL_CLONE_BOOLEAN_ATTRIB(AllowCreate);
+            }
 
-            protected:
-                void marshallAttributes(DOMElement* domElement) const {
-                    MARSHALL_STRING_ATTRIB(Format,FORMAT,NULL);
-                    MARSHALL_STRING_ATTRIB(SPNameQualifier,SPNAMEQUALIFIER,NULL);
-                    MARSHALL_BOOLEAN_ATTRIB(AllowCreate,ALLOWCREATE,NULL);
-                }
+            IMPL_XMLOBJECT_CLONE(NameIDPolicy);
+            IMPL_STRING_ATTRIB(Format);
+            IMPL_STRING_ATTRIB(SPNameQualifier);
+            IMPL_BOOLEAN_ATTRIB(AllowCreate);
 
-                void processAttribute(const DOMAttr* attribute) {
-                    PROC_STRING_ATTRIB(Format,FORMAT,NULL);
-                    PROC_STRING_ATTRIB(SPNameQualifier,SPNAMEQUALIFIER,NULL);
-                    PROC_BOOLEAN_ATTRIB(AllowCreate,ALLOWCREATE,NULL);
-                    AbstractXMLObjectUnmarshaller::processAttribute(attribute);
-                }
+        protected:
+            void marshallAttributes(DOMElement* domElement) const {
+                MARSHALL_STRING_ATTRIB(Format,FORMAT,nullptr);
+                MARSHALL_STRING_ATTRIB(SPNameQualifier,SPNAMEQUALIFIER,nullptr);
+                MARSHALL_BOOLEAN_ATTRIB(AllowCreate,ALLOWCREATE,nullptr);
+            }
+
+            void processAttribute(const DOMAttr* attribute) {
+                PROC_STRING_ATTRIB(Format,FORMAT,nullptr);
+                PROC_STRING_ATTRIB(SPNameQualifier,SPNAMEQUALIFIER,nullptr);
+                PROC_BOOLEAN_ATTRIB(AllowCreate,ALLOWCREATE,nullptr);
+                AbstractXMLObjectUnmarshaller::processAttribute(attribute);
+            }
         };
 
         class SAML_DLLLOCAL IDPEntryImpl : public virtual IDPEntry,
-            public AbstractChildlessElement,
+            public AbstractSimpleElement,
             public AbstractDOMCachingXMLObject,
             public AbstractXMLObjectMarshaller,
             public AbstractXMLObjectUnmarshaller
         {
             void init() {
-                m_ProviderID=NULL;
-                m_Name=NULL;
-                m_Loc=NULL;
-            }
-            public:
-                virtual ~IDPEntryImpl()
-                {
-                    XMLString::release(&m_ProviderID);
-                    XMLString::release(&m_Name);
-                    XMLString::release(&m_Loc);
-                }
+                m_ProviderID=nullptr;
+                m_Name=nullptr;
+                m_Loc=nullptr;
+            }
 
-                IDPEntryImpl(const XMLCh* nsURI, const XMLCh* localName, const XMLCh* prefix, const QName* schemaType)
-                    : AbstractXMLObject(nsURI, localName, prefix, schemaType)
-                {
-                        init();
-                }
+        public:
+            virtual ~IDPEntryImpl() {
+                XMLString::release(&m_ProviderID);
+                XMLString::release(&m_Name);
+                XMLString::release(&m_Loc);
+            }
 
-                IDPEntryImpl(const IDPEntryImpl& src) : AbstractXMLObject(src), AbstractDOMCachingXMLObject(src) {
-                    init();
-                    setProviderID(src.getProviderID());
-                    setName(src.getName());
-                    setLoc(src.getLoc());
-                }
+            IDPEntryImpl(const XMLCh* nsURI, const XMLCh* localName, const XMLCh* prefix, const xmltooling::QName* schemaType)
+                    : AbstractXMLObject(nsURI, localName, prefix, schemaType) {
+                init();
+            }
+
+            IDPEntryImpl(const IDPEntryImpl& src) : AbstractXMLObject(src), AbstractSimpleElement(src), AbstractDOMCachingXMLObject(src) {
+                init();
+                IMPL_CLONE_ATTRIB(ProviderID);
+                IMPL_CLONE_ATTRIB(Name);
+                IMPL_CLONE_ATTRIB(Loc);
+            }
 
-                IMPL_XMLOBJECT_CLONE(IDPEntry);
-                IMPL_STRING_ATTRIB(ProviderID);
-                IMPL_STRING_ATTRIB(Name);
-                IMPL_STRING_ATTRIB(Loc);
+            IMPL_XMLOBJECT_CLONE(IDPEntry);
+            IMPL_STRING_ATTRIB(ProviderID);
+            IMPL_STRING_ATTRIB(Name);
+            IMPL_STRING_ATTRIB(Loc);
 
-            protected:
-                void marshallAttributes(DOMElement* domElement) const {
-                    MARSHALL_STRING_ATTRIB(ProviderID,PROVIDERID,NULL);
-                    MARSHALL_STRING_ATTRIB(Name,NAME,NULL);
-                    MARSHALL_STRING_ATTRIB(Loc,LOC,NULL);
-                }
+        protected:
+            void marshallAttributes(DOMElement* domElement) const {
+                MARSHALL_STRING_ATTRIB(ProviderID,PROVIDERID,nullptr);
+                MARSHALL_STRING_ATTRIB(Name,NAME,nullptr);
+                MARSHALL_STRING_ATTRIB(Loc,LOC,nullptr);
+            }
 
-                void processAttribute(const DOMAttr* attribute) {
-                    PROC_STRING_ATTRIB(ProviderID,PROVIDERID,NULL);
-                    PROC_STRING_ATTRIB(Name,NAME,NULL);
-                    PROC_STRING_ATTRIB(Loc,LOC,NULL);
-                    AbstractXMLObjectUnmarshaller::processAttribute(attribute);
-                }
+            void processAttribute(const DOMAttr* attribute) {
+                PROC_STRING_ATTRIB(ProviderID,PROVIDERID,nullptr);
+                PROC_STRING_ATTRIB(Name,NAME,nullptr);
+                PROC_STRING_ATTRIB(Loc,LOC,nullptr);
+                AbstractXMLObjectUnmarshaller::processAttribute(attribute);
+            }
         };
 
         class SAML_DLLLOCAL IDPListImpl : public virtual IDPList,
@@ -739,34 +721,24 @@ namespace opensaml {
             public AbstractXMLObjectUnmarshaller
         {
             void init() {
-                m_GetComplete=NULL;
-                m_children.push_back(NULL);
+                m_GetComplete=nullptr;
+                m_children.push_back(nullptr);
                 m_pos_GetComplete=m_children.begin();
-                
             }
+
         public:
-            virtual ~IDPListImpl() { }
+            virtual ~IDPListImpl() {}
     
-            IDPListImpl(const XMLCh* nsURI, const XMLCh* localName, const XMLCh* prefix, const QName* schemaType)
-                : AbstractXMLObject(nsURI, localName, prefix, schemaType)
-            {
+            IDPListImpl(const XMLCh* nsURI, const XMLCh* localName, const XMLCh* prefix, const xmltooling::QName* schemaType)
+                    : AbstractXMLObject(nsURI, localName, prefix, schemaType) {
                 init();
             }
                 
             IDPListImpl(const IDPListImpl& src)
                     : AbstractXMLObject(src), AbstractComplexElement(src), AbstractDOMCachingXMLObject(src) {
                 init();
-                if (src.getGetComplete())
-                    setGetComplete(src.getGetComplete()->cloneGetComplete());
-                for (list<XMLObject*>::const_iterator i=src.m_children.begin(); i!=src.m_children.end(); i++) {
-                    if (*i) {
-                        IDPEntry* entry=dynamic_cast<IDPEntry*>(*i);
-                        if (entry) {
-                            getIDPEntrys().push_back(entry->cloneIDPEntry());
-                            continue;
-                        }
-                    }
-                }
+                IMPL_CLONE_TYPED_CHILD(GetComplete);
+                IMPL_CLONE_TYPED_CHILDREN(IDPEntry);
             }
             
             IMPL_XMLOBJECT_CLONE(IDPList);
@@ -775,8 +747,8 @@ namespace opensaml {
     
         protected:
             void processChildElement(XMLObject* childXMLObject, const DOMElement* root) {
-                PROC_TYPED_CHILDREN(IDPEntry,SAMLConstants::SAML20P_NS,false);
-                PROC_TYPED_CHILD(GetComplete,SAMLConstants::SAML20P_NS,false);
+                PROC_TYPED_CHILDREN(IDPEntry,SAML20P_NS,false);
+                PROC_TYPED_CHILD(GetComplete,SAML20P_NS,false);
                 AbstractXMLObjectUnmarshaller::processChildElement(childXMLObject,root);
             }
         };
@@ -789,38 +761,28 @@ namespace opensaml {
             public AbstractXMLObjectUnmarshaller
         {
             void init() {
-                m_ProxyCount=NULL;
-                m_IDPList=NULL;
-                m_children.push_back(NULL);
+                m_ProxyCount=nullptr;
+                m_IDPList=nullptr;
+                m_children.push_back(nullptr);
                 m_pos_IDPList=m_children.begin();
-                
             }
+
         public:
             virtual ~ScopingImpl() {
                 XMLString::release(&m_ProxyCount); 
             }
     
-            ScopingImpl(const XMLCh* nsURI, const XMLCh* localName, const XMLCh* prefix, const QName* schemaType)
-                : AbstractXMLObject(nsURI, localName, prefix, schemaType)
-            {
+            ScopingImpl(const XMLCh* nsURI, const XMLCh* localName, const XMLCh* prefix, const xmltooling::QName* schemaType)
+                    : AbstractXMLObject(nsURI, localName, prefix, schemaType) {
                 init();
             }
                 
             ScopingImpl(const ScopingImpl& src)
                     : AbstractXMLObject(src), AbstractComplexElement(src), AbstractDOMCachingXMLObject(src) {
                 init();
-                setProxyCount(m_ProxyCount);
-                if (src.getIDPList())
-                    setIDPList(src.getIDPList()->cloneIDPList());
-                for (list<XMLObject*>::const_iterator i=src.m_children.begin(); i!=src.m_children.end(); i++) {
-                    if (*i) {
-                        RequesterID* reqid =dynamic_cast<RequesterID*>(*i);
-                        if (reqid) {
-                            getRequesterIDs().push_back(reqid->cloneRequesterID());
-                            continue;
-                        }
-                    }
-                }
+                IMPL_CLONE_INTEGER_ATTRIB(ProxyCount);
+                IMPL_CLONE_TYPED_CHILD(IDPList);
+                IMPL_CLONE_TYPED_CHILDREN(RequesterID);
             }
             
             IMPL_XMLOBJECT_CLONE(Scoping);
@@ -830,42 +792,42 @@ namespace opensaml {
     
         protected:
             void marshallAttributes(DOMElement* domElement) const {
-                    MARSHALL_INTEGER_ATTRIB(ProxyCount,PROXYCOUNT,NULL);
+                MARSHALL_INTEGER_ATTRIB(ProxyCount,PROXYCOUNT,nullptr);
             }
     
             void processChildElement(XMLObject* childXMLObject, const DOMElement* root) {
-                PROC_TYPED_CHILD(IDPList,SAMLConstants::SAML20P_NS,false);
-                PROC_TYPED_CHILDREN(RequesterID,SAMLConstants::SAML20P_NS,false);
+                PROC_TYPED_CHILD(IDPList,SAML20P_NS,false);
+                PROC_TYPED_CHILDREN(RequesterID,SAML20P_NS,false);
                 AbstractXMLObjectUnmarshaller::processChildElement(childXMLObject,root);
             }
 
             void processAttribute(const DOMAttr* attribute) {
-                PROC_INTEGER_ATTRIB(ProxyCount,PROXYCOUNT,NULL);
+                PROC_INTEGER_ATTRIB(ProxyCount,PROXYCOUNT,nullptr);
                 AbstractXMLObjectUnmarshaller::processAttribute(attribute);
             }
         };
 
-        class SAML_DLLLOCAL AuthnRequestImpl : public virtual AuthnRequest, public RequestImpl
+        class SAML_DLLLOCAL AuthnRequestImpl : public virtual AuthnRequest, public RequestAbstractTypeImpl
         {
             void init() {
-                m_ForceAuthn=XMLConstants::XML_BOOL_NULL;
-                m_IsPassive=XMLConstants::XML_BOOL_NULL;
-                m_ProtocolBinding=NULL;
-                m_AssertionConsumerServiceIndex=NULL;
-                m_AssertionConsumerServiceURL=NULL;
-                m_AttributeConsumingServiceIndex=NULL;
-                m_ProviderName=NULL;
-
-                m_Subject=NULL;
-                m_NameIDPolicy=NULL;
-                m_Conditions=NULL;
-                m_RequestedAuthnContext=NULL;
-                m_Scoping=NULL;
-                m_children.push_back(NULL);
-                m_children.push_back(NULL);
-                m_children.push_back(NULL);
-                m_children.push_back(NULL);
-                m_children.push_back(NULL);
+                m_ForceAuthn=XML_BOOL_NULL;
+                m_IsPassive=XML_BOOL_NULL;
+                m_ProtocolBinding=nullptr;
+                m_AssertionConsumerServiceIndex=nullptr;
+                m_AssertionConsumerServiceURL=nullptr;
+                m_AttributeConsumingServiceIndex=nullptr;
+                m_ProviderName=nullptr;
+
+                m_Subject=nullptr;
+                m_NameIDPolicy=nullptr;
+                m_Conditions=nullptr;
+                m_RequestedAuthnContext=nullptr;
+                m_Scoping=nullptr;
+                m_children.push_back(nullptr);
+                m_children.push_back(nullptr);
+                m_children.push_back(nullptr);
+                m_children.push_back(nullptr);
+                m_children.push_back(nullptr);
                 m_pos_Subject=m_pos_Extensions;
                 ++m_pos_Subject;
                 m_pos_NameIDPolicy=m_pos_Subject;
@@ -876,8 +838,8 @@ namespace opensaml {
                 ++m_pos_RequestedAuthnContext;
                 m_pos_Scoping=m_pos_RequestedAuthnContext;
                 ++m_pos_Scoping;
-                
             }
+
         public:
             virtual ~AuthnRequestImpl() {
                 XMLString::release(&m_ProtocolBinding);
@@ -887,36 +849,32 @@ namespace opensaml {
                 XMLString::release(&m_AttributeConsumingServiceIndex);
             }
     
-            AuthnRequestImpl(const XMLCh* nsURI, const XMLCh* localName, const XMLCh* prefix, const QName* schemaType)
-                : AbstractXMLObject(nsURI, localName, prefix, schemaType)
-            {
+            AuthnRequestImpl(const XMLCh* nsURI, const XMLCh* localName, const XMLCh* prefix, const xmltooling::QName* schemaType)
+                : AbstractXMLObject(nsURI, localName, prefix, schemaType) {
                 init();
             }
                 
-            AuthnRequestImpl(const AuthnRequestImpl& src) : AbstractXMLObject(src), RequestImpl(src) {
+            AuthnRequestImpl(const AuthnRequestImpl& src) : AbstractXMLObject(src), RequestAbstractTypeImpl(src) {
                 init();
+            }
 
-                ForceAuthn(m_ForceAuthn);
-                IsPassive(m_IsPassive);
-                setProtocolBinding(src.getProtocolBinding());
-                setAssertionConsumerServiceIndex(m_AssertionConsumerServiceIndex);
-                setAssertionConsumerServiceURL(src.getAssertionConsumerServiceURL());
-                setAttributeConsumingServiceIndex(m_AttributeConsumingServiceIndex);
-                setProviderName(src.getProviderName());
-
-                if (src.getSubject())
-                    setSubject(src.getSubject()->cloneSubject());
-                if (src.getNameIDPolicy())
-                    setNameIDPolicy(src.getNameIDPolicy()->cloneNameIDPolicy());
-                if (src.getConditions())
-                    setConditions(src.getConditions()->cloneConditions());
-                if (src.getRequestedAuthnContext())
-                    setRequestedAuthnContext(src.getRequestedAuthnContext()->cloneRequestedAuthnContext());
-                if (src.getScoping())
-                    setScoping(src.getScoping()->cloneScoping());
+            void _clone(const AuthnRequestImpl& src) {
+                RequestAbstractTypeImpl::_clone(src);
+                IMPL_CLONE_BOOLEAN_ATTRIB(ForceAuthn);
+                IMPL_CLONE_BOOLEAN_ATTRIB(IsPassive);
+                IMPL_CLONE_ATTRIB(ProtocolBinding);
+                IMPL_CLONE_INTEGER_ATTRIB(AssertionConsumerServiceIndex);
+                IMPL_CLONE_ATTRIB(AssertionConsumerServiceURL);
+                IMPL_CLONE_INTEGER_ATTRIB(AttributeConsumingServiceIndex);
+                IMPL_CLONE_ATTRIB(ProviderName);
+                IMPL_CLONE_TYPED_CHILD(Subject);
+                IMPL_CLONE_TYPED_CHILD(NameIDPolicy);
+                IMPL_CLONE_TYPED_CHILD(Conditions);
+                IMPL_CLONE_TYPED_CHILD(RequestedAuthnContext);
+                IMPL_CLONE_TYPED_CHILD(Scoping);
             }
             
-            IMPL_XMLOBJECT_CLONE(AuthnRequest);
+            IMPL_XMLOBJECT_CLONE_EX(AuthnRequest);
 
             IMPL_BOOLEAN_ATTRIB(ForceAuthn);
             IMPL_BOOLEAN_ATTRIB(IsPassive);
@@ -934,57 +892,57 @@ namespace opensaml {
     
         protected:
             void marshallAttributes(DOMElement* domElement) const {
-                MARSHALL_BOOLEAN_ATTRIB(ForceAuthn,FORCEAUTHN,NULL);
-                MARSHALL_BOOLEAN_ATTRIB(IsPassive,ISPASSIVE,NULL);
-                MARSHALL_STRING_ATTRIB(ProtocolBinding,PROTOCOLBINDING,NULL);
-                MARSHALL_INTEGER_ATTRIB(AssertionConsumerServiceIndex,ASSERTIONCONSUMERSERVICEINDEX,NULL);
-                MARSHALL_STRING_ATTRIB(AssertionConsumerServiceURL,ASSERTIONCONSUMERSERVICEURL,NULL);
-                MARSHALL_INTEGER_ATTRIB(AttributeConsumingServiceIndex,ATTRIBUTECONSUMINGSERVICEINDEX,NULL);
-                MARSHALL_STRING_ATTRIB(ProviderName,PROVIDERNAME,NULL);
-                RequestImpl::marshallAttributes(domElement);
+                MARSHALL_BOOLEAN_ATTRIB(ForceAuthn,FORCEAUTHN,nullptr);
+                MARSHALL_BOOLEAN_ATTRIB(IsPassive,ISPASSIVE,nullptr);
+                MARSHALL_STRING_ATTRIB(ProtocolBinding,PROTOCOLBINDING,nullptr);
+                MARSHALL_INTEGER_ATTRIB(AssertionConsumerServiceIndex,ASSERTIONCONSUMERSERVICEINDEX,nullptr);
+                MARSHALL_STRING_ATTRIB(AssertionConsumerServiceURL,ASSERTIONCONSUMERSERVICEURL,nullptr);
+                MARSHALL_INTEGER_ATTRIB(AttributeConsumingServiceIndex,ATTRIBUTECONSUMINGSERVICEINDEX,nullptr);
+                MARSHALL_STRING_ATTRIB(ProviderName,PROVIDERNAME,nullptr);
+                RequestAbstractTypeImpl::marshallAttributes(domElement);
             }
     
             void processChildElement(XMLObject* childXMLObject, const DOMElement* root) {
-                PROC_TYPED_FOREIGN_CHILD(Subject,saml2,SAMLConstants::SAML20_NS,false);
-                PROC_TYPED_CHILD(NameIDPolicy,SAMLConstants::SAML20P_NS,false);
-                PROC_TYPED_FOREIGN_CHILD(Conditions,saml2,SAMLConstants::SAML20_NS,false);
-                PROC_TYPED_CHILD(RequestedAuthnContext,SAMLConstants::SAML20P_NS,false);
-                PROC_TYPED_CHILD(Scoping,SAMLConstants::SAML20P_NS,false);
-                RequestImpl::processChildElement(childXMLObject,root);
+                PROC_TYPED_FOREIGN_CHILD(Subject,saml2,SAML20_NS,false);
+                PROC_TYPED_CHILD(NameIDPolicy,SAML20P_NS,false);
+                PROC_TYPED_FOREIGN_CHILD(Conditions,saml2,SAML20_NS,false);
+                PROC_TYPED_CHILD(RequestedAuthnContext,SAML20P_NS,false);
+                PROC_TYPED_CHILD(Scoping,SAML20P_NS,false);
+                RequestAbstractTypeImpl::processChildElement(childXMLObject,root);
             }
             void processAttribute(const DOMAttr* attribute) {
-                PROC_BOOLEAN_ATTRIB(ForceAuthn,FORCEAUTHN,NULL);
-                PROC_BOOLEAN_ATTRIB(IsPassive,ISPASSIVE,NULL);
-                PROC_STRING_ATTRIB(ProtocolBinding,PROTOCOLBINDING,NULL);
-                PROC_INTEGER_ATTRIB(AssertionConsumerServiceIndex,ASSERTIONCONSUMERSERVICEINDEX,NULL);
-                PROC_STRING_ATTRIB(AssertionConsumerServiceURL,ASSERTIONCONSUMERSERVICEURL,NULL);
-                PROC_INTEGER_ATTRIB(AttributeConsumingServiceIndex,ATTRIBUTECONSUMINGSERVICEINDEX,NULL);
-                PROC_STRING_ATTRIB(ProviderName,PROVIDERNAME,NULL);
-                RequestImpl::processAttribute(attribute);
+                PROC_BOOLEAN_ATTRIB(ForceAuthn,FORCEAUTHN,nullptr);
+                PROC_BOOLEAN_ATTRIB(IsPassive,ISPASSIVE,nullptr);
+                PROC_STRING_ATTRIB(ProtocolBinding,PROTOCOLBINDING,nullptr);
+                PROC_INTEGER_ATTRIB(AssertionConsumerServiceIndex,ASSERTIONCONSUMERSERVICEINDEX,nullptr);
+                PROC_STRING_ATTRIB(AssertionConsumerServiceURL,ASSERTIONCONSUMERSERVICEURL,nullptr);
+                PROC_INTEGER_ATTRIB(AttributeConsumingServiceIndex,ATTRIBUTECONSUMINGSERVICEINDEX,nullptr);
+                PROC_STRING_ATTRIB(ProviderName,PROVIDERNAME,nullptr);
+                RequestAbstractTypeImpl::processAttribute(attribute);
             }
         };
 
-        class SAML_DLLLOCAL StatusResponseImpl : public virtual StatusResponse,
+        class SAML_DLLLOCAL StatusResponseTypeImpl : public virtual StatusResponseType,
             public AbstractComplexElement,
             public AbstractDOMCachingXMLObject,
             public AbstractXMLObjectMarshaller,
             public AbstractXMLObjectUnmarshaller
         {
             void init() {
-                m_ID=NULL;
-                m_InResponseTo=NULL;
-                m_Version=NULL;
-                m_IssueInstant=NULL;
-                m_Destination=NULL;
-                m_Consent=NULL;
-                m_Issuer=NULL;
-                m_Signature=NULL;
-                m_Extensions=NULL;
-                m_Status=NULL;
-                m_children.push_back(NULL);
-                m_children.push_back(NULL);
-                m_children.push_back(NULL);
-                m_children.push_back(NULL);
+                m_ID=nullptr;
+                m_InResponseTo=nullptr;
+                m_Version=nullptr;
+                m_IssueInstant=nullptr;
+                m_Destination=nullptr;
+                m_Consent=nullptr;
+                m_Issuer=nullptr;
+                m_Signature=nullptr;
+                m_Extensions=nullptr;
+                m_Status=nullptr;
+                m_children.push_back(nullptr);
+                m_children.push_back(nullptr);
+                m_children.push_back(nullptr);
+                m_children.push_back(nullptr);
                 m_pos_Issuer=m_children.begin();
                 m_pos_Signature=m_pos_Issuer;
                 ++m_pos_Signature;
@@ -993,12 +951,14 @@ namespace opensaml {
                 m_pos_Status=m_pos_Extensions;
                 ++m_pos_Status;
             }
+
         protected:
-            StatusResponseImpl() {
+            StatusResponseTypeImpl() {
                 init();
             }
+
         public:
-            virtual ~StatusResponseImpl() {
+            virtual ~StatusResponseTypeImpl() {
                 XMLString::release(&m_ID);
                 XMLString::release(&m_InResponseTo);
                 XMLString::release(&m_Version);
@@ -1007,45 +967,40 @@ namespace opensaml {
                 delete m_IssueInstant;
             }
     
-            StatusResponseImpl(const XMLCh* nsURI, const XMLCh* localName, const XMLCh* prefix, const QName* schemaType)
-                : AbstractXMLObject(nsURI, localName, prefix, schemaType)
-            {
+            StatusResponseTypeImpl(const XMLCh* nsURI, const XMLCh* localName, const XMLCh* prefix, const xmltooling::QName* schemaType)
+                    : AbstractXMLObject(nsURI, localName, prefix, schemaType) {
                 init();
             }
                 
-            StatusResponseImpl(const StatusResponseImpl& src) : AbstractXMLObject(src), AbstractDOMCachingXMLObject(src) {
+            StatusResponseTypeImpl(const StatusResponseTypeImpl& src)
+                    : AbstractXMLObject(src), AbstractComplexElement(src), AbstractDOMCachingXMLObject(src) {
                 init();
-                setID(src.getID());
-                setInResponseTo(src.getInResponseTo());
-                setVersion(src.getVersion());
-                setIssueInstant(src.getIssueInstant());
-                setDestination(src.getDestination());
-                setConsent(src.getConsent());
-                if (src.getIssuer())
-                    setIssuer(src.getIssuer()->cloneIssuer());
-                if (src.getSignature())
-                    setSignature(src.getSignature()->cloneSignature());
-                if (src.getExtensions())
-                    setExtensions(src.getExtensions()->cloneExtensions());
-                if (src.getStatus())
-                    setStatus(src.getStatus()->cloneStatus());
-            }
-            
-            const XMLCh* getId() const {
-                return getID();
             }
 
+            void _clone(const StatusResponseTypeImpl& src) {
+                IMPL_CLONE_ATTRIB(ID);
+                IMPL_CLONE_ATTRIB(InResponseTo);
+                IMPL_CLONE_ATTRIB(Version);
+                IMPL_CLONE_ATTRIB(IssueInstant);
+                IMPL_CLONE_ATTRIB(Destination);
+                IMPL_CLONE_ATTRIB(Consent);
+                IMPL_CLONE_TYPED_CHILD(Issuer);
+                IMPL_CLONE_TYPED_CHILD(Signature);
+                IMPL_CLONE_TYPED_CHILD(Extensions);
+                IMPL_CLONE_TYPED_CHILD(Status);
+            }
+            
             //IMPL_TYPED_CHILD(Signature);
             // Need customized setter.
         protected:
-            Signature* m_Signature;
+            xmlsignature::Signature* m_Signature;
             list<XMLObject*>::iterator m_pos_Signature;
         public:
-            Signature* getSignature() const {
+            xmlsignature::Signature* getSignature() const {
                 return m_Signature;
             }
             
-            void setSignature(Signature* sig) {
+            void setSignature(xmlsignature::Signature* sig) {
                 prepareForAssignment(m_Signature,sig);
                 *m_pos_Signature=m_Signature=sig;
                 // Sync content reference back up.
@@ -1053,9 +1008,12 @@ namespace opensaml {
                     m_Signature->setContentReference(new opensaml::ContentReference(*this));
             }
             
-            IMPL_XMLOBJECT_CLONE(StatusResponse);
+            StatusResponseType* cloneStatusResponseType() const {
+                return dynamic_cast<StatusResponseType*>(clone());
+            }
+
             IMPL_STRING_ATTRIB(Version);
-            IMPL_STRING_ATTRIB(ID);
+            IMPL_ID_ATTRIB_EX(ID,ID,nullptr);
             IMPL_STRING_ATTRIB(InResponseTo);
             IMPL_DATETIME_ATTRIB(IssueInstant,0);
             IMPL_STRING_ATTRIB(Destination);
@@ -1065,156 +1023,155 @@ namespace opensaml {
             IMPL_TYPED_CHILD(Status);
     
         protected:
+            void prepareForMarshalling() const {
+                if (m_Signature)
+                    declareNonVisibleNamespaces();
+            }
+
             void marshallAttributes(DOMElement* domElement) const {
                 if (!m_Version)
-                    const_cast<StatusResponseImpl*>(this)->m_Version=XMLString::transcode("2.0");
-                MARSHALL_STRING_ATTRIB(Version,VER,NULL);
+                    const_cast<StatusResponseTypeImpl*>(this)->m_Version=XMLString::transcode("2.0");
+                MARSHALL_STRING_ATTRIB(Version,VER,nullptr);
                 if (!m_ID)
-                    const_cast<StatusResponseImpl*>(this)->m_ID=SAMLConfig::getConfig().generateIdentifier();
-                MARSHALL_ID_ATTRIB(ID,ID,NULL);
+                    const_cast<StatusResponseTypeImpl*>(this)->m_ID=SAMLConfig::getConfig().generateIdentifier();
+                MARSHALL_ID_ATTRIB(ID,ID,nullptr);
                 if (!m_IssueInstant) {
-                    const_cast<StatusResponseImpl*>(this)->m_IssueInstantEpoch=time(NULL);
-                    const_cast<StatusResponseImpl*>(this)->m_IssueInstant=new DateTime(m_IssueInstantEpoch);
+                    const_cast<StatusResponseTypeImpl*>(this)->m_IssueInstantEpoch=time(nullptr);
+                    const_cast<StatusResponseTypeImpl*>(this)->m_IssueInstant=new DateTime(m_IssueInstantEpoch);
                 }
-                MARSHALL_DATETIME_ATTRIB(IssueInstant,ISSUEINSTANT,NULL);
-                MARSHALL_STRING_ATTRIB(Destination,DESTINATION,NULL);
-                MARSHALL_STRING_ATTRIB(Consent,CONSENT,NULL);
-                MARSHALL_STRING_ATTRIB(InResponseTo,INRESPONSETO,NULL);
+                MARSHALL_DATETIME_ATTRIB(IssueInstant,ISSUEINSTANT,nullptr);
+                MARSHALL_STRING_ATTRIB(Destination,DESTINATION,nullptr);
+                MARSHALL_STRING_ATTRIB(Consent,CONSENT,nullptr);
+                MARSHALL_STRING_ATTRIB(InResponseTo,INRESPONSETO,nullptr);
             }
     
             void processChildElement(XMLObject* childXMLObject, const DOMElement* root) {
-                PROC_TYPED_FOREIGN_CHILD(Issuer,saml2,SAMLConstants::SAML20_NS,false);
-                PROC_TYPED_FOREIGN_CHILD(Signature,xmlsignature,XMLConstants::XMLSIG_NS,false);
-                PROC_TYPED_CHILD(Extensions,SAMLConstants::SAML20P_NS,false);
-                PROC_TYPED_CHILD(Status,SAMLConstants::SAML20P_NS,false);
+                PROC_TYPED_FOREIGN_CHILD(Issuer,saml2,SAML20_NS,false);
+                PROC_TYPED_FOREIGN_CHILD(Signature,xmlsignature,XMLSIG_NS,false);
+                PROC_TYPED_CHILD(Extensions,SAML20P_NS,false);
+                PROC_TYPED_CHILD(Status,SAML20P_NS,false);
                 AbstractXMLObjectUnmarshaller::processChildElement(childXMLObject,root);
             }
     
             void processAttribute(const DOMAttr* attribute) {
-                PROC_ID_ATTRIB(ID,ID,NULL);
-                PROC_STRING_ATTRIB(Version,VER,NULL);
-                PROC_STRING_ATTRIB(InResponseTo,INRESPONSETO,NULL);
-                PROC_DATETIME_ATTRIB(IssueInstant,ISSUEINSTANT,NULL);
-                PROC_STRING_ATTRIB(Destination,DESTINATION,NULL);
-                PROC_STRING_ATTRIB(Consent,CONSENT,NULL);
+                PROC_ID_ATTRIB(ID,ID,nullptr);
+                PROC_STRING_ATTRIB(Version,VER,nullptr);
+                PROC_STRING_ATTRIB(InResponseTo,INRESPONSETO,nullptr);
+                PROC_DATETIME_ATTRIB(IssueInstant,ISSUEINSTANT,nullptr);
+                PROC_STRING_ATTRIB(Destination,DESTINATION,nullptr);
+                PROC_STRING_ATTRIB(Consent,CONSENT,nullptr);
                 AbstractXMLObjectUnmarshaller::processAttribute(attribute);
             }
         };
 
-        class SAML_DLLLOCAL ResponseImpl : public virtual Response, public StatusResponseImpl
+        class SAML_DLLLOCAL ResponseImpl : public virtual Response, public StatusResponseTypeImpl
         {
         public:
-            virtual ~ResponseImpl() { }
+            virtual ~ResponseImpl() {}
     
-            ResponseImpl(const XMLCh* nsURI, const XMLCh* localName, const XMLCh* prefix, const QName* schemaType)
-                : AbstractXMLObject(nsURI, localName, prefix, schemaType) { }
+            ResponseImpl(const XMLCh* nsURI, const XMLCh* localName, const XMLCh* prefix, const xmltooling::QName* schemaType)
+                : AbstractXMLObject(nsURI, localName, prefix, schemaType) {}
                 
-            ResponseImpl(const ResponseImpl& src) : AbstractXMLObject(src), StatusResponseImpl(src) {
-                for (list<XMLObject*>::const_iterator i=src.m_children.begin(); i!=src.m_children.end(); i++) {
-                    if (*i) {
-                        Assertion* assertion=dynamic_cast<Assertion*>(*i);
-                        if (assertion) {
-                            getAssertions().push_back(assertion->cloneAssertion());
-                            continue;
-                        }
-                        EncryptedAssertion* encAssertion=dynamic_cast<EncryptedAssertion*>(*i);
-                        if (encAssertion) {
-                            getEncryptedAssertions().push_back(encAssertion->cloneEncryptedAssertion());
-                            continue;
-                        }
-                    }
-                }
+            ResponseImpl(const ResponseImpl& src) : AbstractXMLObject(src), StatusResponseTypeImpl(src) {}
 
+            void _clone(const ResponseImpl& src) {
+                StatusResponseTypeImpl::_clone(src);
+                IMPL_CLONE_CHILDBAG_BEGIN;
+                    IMPL_CLONE_TYPED_FOREIGN_CHILD_IN_BAG(Assertion,saml2);
+                    IMPL_CLONE_TYPED_FOREIGN_CHILD_IN_BAG(EncryptedAssertion,saml2);
+                IMPL_CLONE_CHILDBAG_END;
             }
             
-            IMPL_XMLOBJECT_CLONE(Response);
+            IMPL_XMLOBJECT_CLONE_EX(Response);
             IMPL_TYPED_FOREIGN_CHILDREN(Assertion,saml2,m_children.end());
             IMPL_TYPED_FOREIGN_CHILDREN(EncryptedAssertion,saml2,m_children.end());
     
         protected:
             void processChildElement(XMLObject* childXMLObject, const DOMElement* root) {
-                PROC_TYPED_FOREIGN_CHILDREN(Assertion,saml2,SAMLConstants::SAML20_NS,false);
-                PROC_TYPED_FOREIGN_CHILDREN(EncryptedAssertion,saml2,SAMLConstants::SAML20_NS,false);
-                StatusResponseImpl::processChildElement(childXMLObject,root);
+                PROC_TYPED_FOREIGN_CHILDREN(Assertion,saml2,SAML20_NS,false);
+                PROC_TYPED_FOREIGN_CHILDREN(EncryptedAssertion,saml2,SAML20_NS,false);
+                StatusResponseTypeImpl::processChildElement(childXMLObject,root);
             }
         };
 
-        class SAML_DLLLOCAL ArtifactResolveImpl : public virtual ArtifactResolve, public RequestImpl
+        class SAML_DLLLOCAL ArtifactResolveImpl : public virtual ArtifactResolve, public RequestAbstractTypeImpl
         {
             void init() {
-                m_Artifact=NULL;
-                m_children.push_back(NULL);
+                m_Artifact=nullptr;
+                m_children.push_back(nullptr);
                 m_pos_Artifact=m_pos_Extensions;
                 ++m_pos_Artifact;
             }
+
         public:
-            virtual ~ArtifactResolveImpl() { }
+            virtual ~ArtifactResolveImpl() {}
     
-            ArtifactResolveImpl(const XMLCh* nsURI, const XMLCh* localName, const XMLCh* prefix, const QName* schemaType)
-                : AbstractXMLObject(nsURI, localName, prefix, schemaType)
-            { 
+            ArtifactResolveImpl(const XMLCh* nsURI, const XMLCh* localName, const XMLCh* prefix, const xmltooling::QName* schemaType)
+                    : AbstractXMLObject(nsURI, localName, prefix, schemaType) {
                 init();
             }
                 
-            ArtifactResolveImpl(const ArtifactResolveImpl& src) : AbstractXMLObject(src), RequestImpl(src) {
+            ArtifactResolveImpl(const ArtifactResolveImpl& src) : AbstractXMLObject(src), RequestAbstractTypeImpl(src) {
                 init();
-                if(src.getArtifact())
-                    setArtifact(src.getArtifact()->cloneArtifact());
+            }
+
+            void _clone(const ArtifactResolveImpl& src) {
+                RequestAbstractTypeImpl::_clone(src);
+                IMPL_CLONE_TYPED_CHILD(Artifact);
             }
             
-            IMPL_XMLOBJECT_CLONE(ArtifactResolve);
+            IMPL_XMLOBJECT_CLONE_EX(ArtifactResolve);
             IMPL_TYPED_CHILD(Artifact);
     
         protected:
             void processChildElement(XMLObject* childXMLObject, const DOMElement* root) {
-                PROC_TYPED_CHILD(Artifact,SAMLConstants::SAML20P_NS,false);
-                RequestImpl::processChildElement(childXMLObject,root);
+                PROC_TYPED_CHILD(Artifact,SAML20P_NS,false);
+                RequestAbstractTypeImpl::processChildElement(childXMLObject,root);
             }
         };
 
-        class SAML_DLLLOCAL ArtifactResponseImpl : public virtual ArtifactResponse, public StatusResponseImpl
+        class SAML_DLLLOCAL ArtifactResponseImpl : public virtual ArtifactResponse, public StatusResponseTypeImpl
         {
             void init() {
-                m_Payload=NULL;
-                m_children.push_back(NULL);
+                m_Payload=nullptr;
+                m_children.push_back(nullptr);
                 m_pos_Payload=m_pos_Status;
                 ++m_pos_Payload;
             }
+
         public:
-            virtual ~ArtifactResponseImpl() { }
+            virtual ~ArtifactResponseImpl() {}
     
-            ArtifactResponseImpl(const XMLCh* nsURI, const XMLCh* localName, const XMLCh* prefix, const QName* schemaType)
-                : AbstractXMLObject(nsURI, localName, prefix, schemaType)
-            {
+            ArtifactResponseImpl(const XMLCh* nsURI, const XMLCh* localName, const XMLCh* prefix, const xmltooling::QName* schemaType)
+                    : AbstractXMLObject(nsURI, localName, prefix, schemaType) {
                 init();
             }
                 
-            ArtifactResponseImpl(const ArtifactResponseImpl& src) : AbstractXMLObject(src), StatusResponseImpl(src) {
+            ArtifactResponseImpl(const ArtifactResponseImpl& src) : AbstractXMLObject(src), StatusResponseTypeImpl(src) {
                 init();
-                if (src.getPayload())
-                    setPayload(getPayload()->clone());
+            }
 
+            void _clone(const ArtifactResponseImpl& src) {
+                StatusResponseTypeImpl::_clone(src);
+                IMPL_CLONE_XMLOBJECT_CHILD(Payload);
             }
             
-            IMPL_XMLOBJECT_CLONE(ArtifactResponse);
+            IMPL_XMLOBJECT_CLONE_EX(ArtifactResponse);
             IMPL_XMLOBJECT_CHILD(Payload);
     
         protected:
             void processChildElement(XMLObject* childXMLObject, const DOMElement* root) {
-                // These are valid elements for the parent StatusResponse, so don't process these.
+                // These are valid elements for the parent StatusResponseType, so don't process these.
                 // If not one of these, then it must be the payload.
-                if (
-                    ! XMLHelper::isNodeNamed(root,SAMLConstants::SAML20_NS,saml2::Issuer::LOCAL_NAME) &&
-                    ! XMLHelper::isNodeNamed(root,XMLConstants::XMLSIG_NS,xmlsignature::Signature::LOCAL_NAME) &&
-                    ! XMLHelper::isNodeNamed(root,SAMLConstants::SAML20P_NS,saml2p::Extensions::LOCAL_NAME) &&
-                    ! XMLHelper::isNodeNamed(root,SAMLConstants::SAML20P_NS,saml2p::Status::LOCAL_NAME)
-                   )
-                {
+                if (!XMLHelper::isNodeNamed(root,SAML20_NS,saml2::Issuer::LOCAL_NAME) &&
+                    !XMLHelper::isNodeNamed(root,XMLSIG_NS,xmlsignature::Signature::LOCAL_NAME) &&
+                    !XMLHelper::isNodeNamed(root,SAML20P_NS,saml2p::Extensions::LOCAL_NAME) &&
+                    !XMLHelper::isNodeNamed(root,SAML20P_NS,saml2p::Status::LOCAL_NAME)) {
                     setPayload(childXMLObject);
                     return;
                 }
 
-                StatusResponseImpl::processChildElement(childXMLObject,root);
+                StatusResponseTypeImpl::processChildElement(childXMLObject,root);
             }
         };
 
@@ -1225,106 +1182,77 @@ namespace opensaml {
             public AbstractXMLObjectUnmarshaller
         {
             void init() {
-                m_EncryptedData=NULL;
-                m_children.push_back(NULL);
+                m_EncryptedData=nullptr;
+                m_children.push_back(nullptr);
                 m_pos_EncryptedData=m_children.begin();
             }
             
         protected:
-            NewEncryptedIDImpl()
-            {
+            NewEncryptedIDImpl() {
                 init();
             }
             
         public:
             virtual ~NewEncryptedIDImpl() {}
     
-            NewEncryptedIDImpl(const XMLCh* nsURI, const XMLCh* localName, const XMLCh* prefix, const QName* schemaType)
-                    : AbstractXMLObject(nsURI, localName, prefix, schemaType)
-            {
+            NewEncryptedIDImpl(const XMLCh* nsURI, const XMLCh* localName, const XMLCh* prefix, const xmltooling::QName* schemaType)
+                    : AbstractXMLObject(nsURI, localName, prefix, schemaType) {
                 init();
             }
                 
-            NewEncryptedIDImpl(const NewEncryptedIDImpl& src) : AbstractXMLObject(src), AbstractDOMCachingXMLObject(src) {
+            NewEncryptedIDImpl(const NewEncryptedIDImpl& src)
+                    : AbstractXMLObject(src), AbstractComplexElement(src), AbstractDOMCachingXMLObject(src) {
                 init();
-                if (src.getEncryptedData())
-                    setEncryptedData(src.getEncryptedData()->cloneEncryptedData());
-                VectorOf(xmlencryption::EncryptedKey) v=getEncryptedKeys();
-                for (vector<xmlencryption::EncryptedKey*>::const_iterator i=src.m_EncryptedKeys.begin(); i!=src.m_EncryptedKeys.end(); i++) {
-                    if (*i) {
-                        v.push_back((*i)->cloneEncryptedKey());
-                    }
-                }
+                IMPL_CLONE_TYPED_CHILD(EncryptedData);
+                IMPL_CLONE_TYPED_FOREIGN_CHILDREN(EncryptedKey,xmlencryption);
             }
     
-            XMLObject* decrypt(KeyResolver* KEKresolver, const XMLCh* recipient) const
-            {
-                if (!m_EncryptedData)
-                    throw DecryptionException("No encrypted data present.");
-                Decrypter decrypter(KEKresolver, new EncryptedKeyResolver(*this, recipient));
-                DOMDocumentFragment* frag = decrypter.decryptData(m_EncryptedData);
-                if (frag->hasChildNodes() && frag->getFirstChild()==frag->getLastChild()) {
-                    DOMNode* plaintext=frag->getFirstChild();
-                    if (plaintext->getNodeType()==DOMNode::ELEMENT_NODE) {
-                        auto_ptr<XMLObject> ret(XMLObjectBuilder::buildOneFromElement(static_cast<DOMElement*>(plaintext)));
-                        ret->releaseThisAndChildrenDOM();
-                        return ret.release();
-                    }
-                }
-                frag->release();
-                throw DecryptionException("Decryption did not result in a single element.");
-            }
-        
-            IMPL_XMLOBJECT_CLONE(NewEncryptedID);
-            EncryptedElementType* cloneEncryptedElementType() const {
-                return new NewEncryptedIDImpl(*this);
-            }
-
+            IMPL_XMLOBJECT_CLONE2(NewEncryptedID,EncryptedElementType);
             IMPL_TYPED_FOREIGN_CHILD(EncryptedData,xmlencryption);
             IMPL_TYPED_FOREIGN_CHILDREN(EncryptedKey,xmlencryption,m_children.end());
     
         protected:
             void processChildElement(XMLObject* childXMLObject, const DOMElement* root) {
-                PROC_TYPED_FOREIGN_CHILD(EncryptedData,xmlencryption,XMLConstants::XMLENC_NS,false);
-                PROC_TYPED_FOREIGN_CHILDREN(EncryptedKey,xmlencryption,XMLConstants::XMLENC_NS,false);
+                PROC_TYPED_FOREIGN_CHILD(EncryptedData,xmlencryption,XMLENC_NS,false);
+                PROC_TYPED_FOREIGN_CHILDREN(EncryptedKey,xmlencryption,XMLENC_NS,false);
                 AbstractXMLObjectUnmarshaller::processChildElement(childXMLObject,root);
             }
         };
 
         class SAML_DLLLOCAL TerminateImpl : public virtual Terminate,
-            public AbstractChildlessElement,
+            public AbstractSimpleElement,
             public AbstractDOMCachingXMLObject,
             public AbstractXMLObjectMarshaller,
             public AbstractXMLObjectUnmarshaller
         {
-            public:
-                virtual ~TerminateImpl() { }
+        public:
+            virtual ~TerminateImpl() {}
 
-                TerminateImpl(const XMLCh* nsURI, const XMLCh* localName, const XMLCh* prefix, const QName* schemaType)
-                    : AbstractXMLObject(nsURI, localName, prefix, schemaType) { }
+            TerminateImpl(const XMLCh* nsURI, const XMLCh* localName, const XMLCh* prefix, const xmltooling::QName* schemaType)
+                : AbstractXMLObject(nsURI, localName, prefix, schemaType) {}
 
-                TerminateImpl(const TerminateImpl& src) : AbstractXMLObject(src), AbstractDOMCachingXMLObject(src) {
-                }
+            TerminateImpl(const TerminateImpl& src)
+                : AbstractXMLObject(src), AbstractSimpleElement(src), AbstractDOMCachingXMLObject(src) {}
 
-                IMPL_XMLOBJECT_CLONE(Terminate);
+            IMPL_XMLOBJECT_CLONE(Terminate);
 
-            protected:
-                // has no attributes or children
+        protected:
+            // has no attributes or children
         };
 
-        class SAML_DLLLOCAL ManageNameIDRequestImpl : public virtual ManageNameIDRequest, public RequestImpl
+        class SAML_DLLLOCAL ManageNameIDRequestImpl : public virtual ManageNameIDRequest, public RequestAbstractTypeImpl
         {
             void init() {
-                m_NameID=NULL;
-                m_EncryptedID=NULL;
-                m_NewID=NULL;
-                m_NewEncryptedID=NULL;
-                m_Terminate=NULL;
-                m_children.push_back(NULL);
-                m_children.push_back(NULL);
-                m_children.push_back(NULL);
-                m_children.push_back(NULL);
-                m_children.push_back(NULL);
+                m_NameID=nullptr;
+                m_EncryptedID=nullptr;
+                m_NewID=nullptr;
+                m_NewEncryptedID=nullptr;
+                m_Terminate=nullptr;
+                m_children.push_back(nullptr);
+                m_children.push_back(nullptr);
+                m_children.push_back(nullptr);
+                m_children.push_back(nullptr);
+                m_children.push_back(nullptr);
                 m_pos_NameID=m_pos_Extensions;
                 ++m_pos_NameID;
                 m_pos_EncryptedID=m_pos_NameID;
@@ -1335,35 +1263,30 @@ namespace opensaml {
                 ++m_pos_NewEncryptedID;
                 m_pos_Terminate=m_pos_NewEncryptedID;
                 ++m_pos_Terminate;
-                
             }
+
         public:
-            virtual ~ManageNameIDRequestImpl() { }
+            virtual ~ManageNameIDRequestImpl() {}
     
-            ManageNameIDRequestImpl(const XMLCh* nsURI, const XMLCh* localName, const XMLCh* prefix, const QName* schemaType)
-                : AbstractXMLObject(nsURI, localName, prefix, schemaType)
-            {
+            ManageNameIDRequestImpl(const XMLCh* nsURI, const XMLCh* localName, const XMLCh* prefix, const xmltooling::QName* schemaType)
+                    : AbstractXMLObject(nsURI, localName, prefix, schemaType) {
                 init();
             }
                 
-            ManageNameIDRequestImpl(const ManageNameIDRequestImpl& src) : AbstractXMLObject(src), RequestImpl(src) {
+            ManageNameIDRequestImpl(const ManageNameIDRequestImpl& src) : AbstractXMLObject(src), RequestAbstractTypeImpl(src) {
                 init();
+            }
 
-                if (src.getNameID())
-                    setNameID(src.getNameID()->cloneNameID());
-                if (src.getEncryptedID())
-                    setEncryptedID(src.getEncryptedID()->cloneEncryptedID());
-                if (src.getNewID())
-                    setNewID(src.getNewID()->cloneNewID());
-                if (src.getNewEncryptedID())
-                    setNewEncryptedID(src.getNewEncryptedID()->cloneNewEncryptedID());
-                if (src.getTerminate())
-                    setTerminate(src.getTerminate()->cloneTerminate());
-
+            void _clone(const ManageNameIDRequestImpl& src) {
+                RequestAbstractTypeImpl::_clone(src);
+                IMPL_CLONE_TYPED_CHILD(NameID);
+                IMPL_CLONE_TYPED_CHILD(EncryptedID);
+                IMPL_CLONE_TYPED_CHILD(NewID);
+                IMPL_CLONE_TYPED_CHILD(NewEncryptedID);
+                IMPL_CLONE_TYPED_CHILD(Terminate);
             }
             
-            IMPL_XMLOBJECT_CLONE(ManageNameIDRequest);
-
+            IMPL_XMLOBJECT_CLONE_EX(ManageNameIDRequest);
             IMPL_TYPED_FOREIGN_CHILD(NameID,saml2);
             IMPL_TYPED_FOREIGN_CHILD(EncryptedID,saml2);
             IMPL_TYPED_CHILD(NewID);
@@ -1372,87 +1295,73 @@ namespace opensaml {
     
         protected:
             void processChildElement(XMLObject* childXMLObject, const DOMElement* root) {
-                PROC_TYPED_FOREIGN_CHILD(NameID,saml2,SAMLConstants::SAML20_NS,false);
-                PROC_TYPED_FOREIGN_CHILD(EncryptedID,saml2,SAMLConstants::SAML20_NS,false);
-                PROC_TYPED_CHILD(NewID,SAMLConstants::SAML20P_NS,false);
-                PROC_TYPED_CHILD(NewEncryptedID,SAMLConstants::SAML20P_NS,false);
-                PROC_TYPED_CHILD(Terminate,SAMLConstants::SAML20P_NS,false);
-                RequestImpl::processChildElement(childXMLObject,root);
+                PROC_TYPED_FOREIGN_CHILD(NameID,saml2,SAML20_NS,false);
+                PROC_TYPED_FOREIGN_CHILD(EncryptedID,saml2,SAML20_NS,false);
+                PROC_TYPED_CHILD(NewID,SAML20P_NS,false);
+                PROC_TYPED_CHILD(NewEncryptedID,SAML20P_NS,false);
+                PROC_TYPED_CHILD(Terminate,SAML20P_NS,false);
+                RequestAbstractTypeImpl::processChildElement(childXMLObject,root);
             }
         };
 
-        class SAML_DLLLOCAL ManageNameIDResponseImpl : public virtual ManageNameIDResponse, public StatusResponseImpl
+        class SAML_DLLLOCAL ManageNameIDResponseImpl : public virtual ManageNameIDResponse, public StatusResponseTypeImpl
         {
-            public:
-                virtual ~ManageNameIDResponseImpl() { }
-    
-                ManageNameIDResponseImpl(const XMLCh* nsURI, const XMLCh* localName, const XMLCh* prefix, const QName* schemaType)
-                    : AbstractXMLObject(nsURI, localName, prefix, schemaType) { }
-                
-                ManageNameIDResponseImpl(const ManageNameIDResponseImpl& src) : AbstractXMLObject(src), StatusResponseImpl(src) {
-                }
+        public:
+            virtual ~ManageNameIDResponseImpl() {}
+
+            ManageNameIDResponseImpl(const XMLCh* nsURI, const XMLCh* localName, const XMLCh* prefix, const xmltooling::QName* schemaType)
+                : AbstractXMLObject(nsURI, localName, prefix, schemaType) {}
+            
+            ManageNameIDResponseImpl(const ManageNameIDResponseImpl& src) : AbstractXMLObject(src), StatusResponseTypeImpl(src) {}
 
-                IMPL_XMLOBJECT_CLONE(ManageNameIDResponse);
+            IMPL_XMLOBJECT_CLONE_EX(ManageNameIDResponse);
         };
 
-        class SAML_DLLLOCAL LogoutRequestImpl : public virtual LogoutRequest, public RequestImpl
+        class SAML_DLLLOCAL LogoutRequestImpl : public virtual LogoutRequest, public RequestAbstractTypeImpl
         {
             void init() {
-                m_Reason=NULL;
-                m_NotOnOrAfter=NULL;
-
-                m_BaseID=NULL;
-                m_NameID=NULL;
-                m_EncryptedID=NULL;
-                m_children.push_back(NULL);
-                m_children.push_back(NULL);
-                m_children.push_back(NULL);
+                m_Reason=nullptr;
+                m_NotOnOrAfter=nullptr;
+                m_BaseID=nullptr;
+                m_NameID=nullptr;
+                m_EncryptedID=nullptr;
+                m_children.push_back(nullptr);
+                m_children.push_back(nullptr);
+                m_children.push_back(nullptr);
                 m_pos_BaseID=m_pos_Extensions;
                 ++m_pos_BaseID;
                 m_pos_NameID=m_pos_BaseID;
                 ++m_pos_NameID;
                 m_pos_EncryptedID=m_pos_NameID;
                 ++m_pos_EncryptedID;
-                
             }
+
         public:
             virtual ~LogoutRequestImpl() {
                 XMLString::release(&m_Reason);
                 delete m_NotOnOrAfter;
             }
     
-            LogoutRequestImpl(const XMLCh* nsURI, const XMLCh* localName, const XMLCh* prefix, const QName* schemaType)
-                : AbstractXMLObject(nsURI, localName, prefix, schemaType)
-            {
+            LogoutRequestImpl(const XMLCh* nsURI, const XMLCh* localName, const XMLCh* prefix, const xmltooling::QName* schemaType)
+                    : AbstractXMLObject(nsURI, localName, prefix, schemaType) {
                 init();
             }
                 
-            LogoutRequestImpl(const LogoutRequestImpl& src) : AbstractXMLObject(src), RequestImpl(src) {
+            LogoutRequestImpl(const LogoutRequestImpl& src) : AbstractXMLObject(src), RequestAbstractTypeImpl(src) {
                 init();
+            }
 
-                setReason(src.getReason());
-                setNotOnOrAfter(src.getNotOnOrAfter());
-
-                if (src.getBaseID())
-                    setBaseID(src.getBaseID()->cloneBaseID());
-                if (src.getNameID())
-                    setNameID(src.getNameID()->cloneNameID());
-                if (src.getEncryptedID())
-                    setEncryptedID(src.getEncryptedID()->cloneEncryptedID());
-
-                for (list<XMLObject*>::const_iterator i=src.m_children.begin(); i!=src.m_children.end(); i++) {
-                    if (*i) {
-                        SessionIndex* si = dynamic_cast<SessionIndex*>(*i);
-                        if (si) {
-                            getSessionIndexs().push_back(si->cloneSessionIndex());
-                            continue;
-                        }
-                    }
-                }
+            void _clone(const LogoutRequestImpl& src) {
+                RequestAbstractTypeImpl::_clone(src);
+                IMPL_CLONE_ATTRIB(Reason);
+                IMPL_CLONE_ATTRIB(NotOnOrAfter);
+                IMPL_CLONE_TYPED_CHILD(BaseID);
+                IMPL_CLONE_TYPED_CHILD(NameID);
+                IMPL_CLONE_TYPED_CHILD(EncryptedID);
+                IMPL_CLONE_TYPED_CHILDREN(SessionIndex);
             }
             
-            IMPL_XMLOBJECT_CLONE(LogoutRequest);
-
+            IMPL_XMLOBJECT_CLONE_EX(LogoutRequest);
             IMPL_STRING_ATTRIB(Reason);
             IMPL_DATETIME_ATTRIB(NotOnOrAfter,SAMLTIME_MAX);
             IMPL_TYPED_FOREIGN_CHILD(BaseID,saml2);
@@ -1462,51 +1371,50 @@ namespace opensaml {
     
         protected:
             void marshallAttributes(DOMElement* domElement) const {
-                MARSHALL_STRING_ATTRIB(Reason,REASON,NULL);
-                MARSHALL_DATETIME_ATTRIB(NotOnOrAfter,NOTONORAFTER,NULL);
-                RequestImpl::marshallAttributes(domElement);
+                MARSHALL_STRING_ATTRIB(Reason,REASON,nullptr);
+                MARSHALL_DATETIME_ATTRIB(NotOnOrAfter,NOTONORAFTER,nullptr);
+                RequestAbstractTypeImpl::marshallAttributes(domElement);
             }
     
             void processChildElement(XMLObject* childXMLObject, const DOMElement* root) {
-                PROC_TYPED_FOREIGN_CHILD(BaseID,saml2,SAMLConstants::SAML20_NS,false);
-                PROC_TYPED_FOREIGN_CHILD(NameID,saml2,SAMLConstants::SAML20_NS,false);
-                PROC_TYPED_FOREIGN_CHILD(EncryptedID,saml2,SAMLConstants::SAML20_NS,false);
-                PROC_TYPED_CHILDREN(SessionIndex,SAMLConstants::SAML20P_NS,false);
-                RequestImpl::processChildElement(childXMLObject,root);
+                PROC_TYPED_FOREIGN_CHILD(BaseID,saml2,SAML20_NS,false);
+                PROC_TYPED_FOREIGN_CHILD(NameID,saml2,SAML20_NS,false);
+                PROC_TYPED_FOREIGN_CHILD(EncryptedID,saml2,SAML20_NS,false);
+                PROC_TYPED_CHILDREN(SessionIndex,SAML20P_NS,false);
+                RequestAbstractTypeImpl::processChildElement(childXMLObject,root);
             }
             void processAttribute(const DOMAttr* attribute) {
-                PROC_STRING_ATTRIB(Reason,REASON,NULL);
-                PROC_DATETIME_ATTRIB(NotOnOrAfter,NOTONORAFTER,NULL);
-                RequestImpl::processAttribute(attribute);
+                PROC_STRING_ATTRIB(Reason,REASON,nullptr);
+                PROC_DATETIME_ATTRIB(NotOnOrAfter,NOTONORAFTER,nullptr);
+                RequestAbstractTypeImpl::processAttribute(attribute);
             }
         };
 
-        class SAML_DLLLOCAL LogoutResponseImpl : public virtual LogoutResponse, public StatusResponseImpl
+        class SAML_DLLLOCAL LogoutResponseImpl : public virtual LogoutResponse, public StatusResponseTypeImpl
         {
-            public:
-                virtual ~LogoutResponseImpl() { }
-    
-                LogoutResponseImpl(const XMLCh* nsURI, const XMLCh* localName, const XMLCh* prefix, const QName* schemaType)
-                    : AbstractXMLObject(nsURI, localName, prefix, schemaType) { }
-                
-                LogoutResponseImpl(const LogoutResponseImpl& src) : AbstractXMLObject(src), StatusResponseImpl(src) {
-                }
+        public:
+            virtual ~LogoutResponseImpl() {}
+
+            LogoutResponseImpl(const XMLCh* nsURI, const XMLCh* localName, const XMLCh* prefix, const xmltooling::QName* schemaType)
+                : AbstractXMLObject(nsURI, localName, prefix, schemaType) {}
+            
+            LogoutResponseImpl(const LogoutResponseImpl& src) : AbstractXMLObject(src), StatusResponseTypeImpl(src) {}
 
-                IMPL_XMLOBJECT_CLONE(LogoutResponse);
+            IMPL_XMLOBJECT_CLONE_EX(LogoutResponse);
         };
 
 
-        class SAML_DLLLOCAL NameIDMappingRequestImpl : public virtual NameIDMappingRequest, public RequestImpl
+        class SAML_DLLLOCAL NameIDMappingRequestImpl : public virtual NameIDMappingRequest, public RequestAbstractTypeImpl
         {
             void init() {
-                m_BaseID=NULL;
-                m_NameID=NULL;
-                m_EncryptedID=NULL;
-                m_NameIDPolicy=NULL;
-                m_children.push_back(NULL);
-                m_children.push_back(NULL);
-                m_children.push_back(NULL);
-                m_children.push_back(NULL);
+                m_BaseID=nullptr;
+                m_NameID=nullptr;
+                m_EncryptedID=nullptr;
+                m_NameIDPolicy=nullptr;
+                m_children.push_back(nullptr);
+                m_children.push_back(nullptr);
+                m_children.push_back(nullptr);
+                m_children.push_back(nullptr);
                 m_pos_BaseID=m_pos_Extensions;
                 ++m_pos_BaseID;
                 m_pos_NameID=m_pos_BaseID;
@@ -1515,33 +1423,29 @@ namespace opensaml {
                 ++m_pos_EncryptedID;
                 m_pos_NameIDPolicy=m_pos_EncryptedID;
                 ++m_pos_NameIDPolicy;
-                
             }
+
         public:
-            virtual ~NameIDMappingRequestImpl() { }
+            virtual ~NameIDMappingRequestImpl() {}
     
-            NameIDMappingRequestImpl(const XMLCh* nsURI, const XMLCh* localName, const XMLCh* prefix, const QName* schemaType)
-                : AbstractXMLObject(nsURI, localName, prefix, schemaType)
-            {
+            NameIDMappingRequestImpl(const XMLCh* nsURI, const XMLCh* localName, const XMLCh* prefix, const xmltooling::QName* schemaType)
+                    : AbstractXMLObject(nsURI, localName, prefix, schemaType) {
                 init();
             }
                 
-            NameIDMappingRequestImpl(const NameIDMappingRequestImpl& src) : AbstractXMLObject(src), RequestImpl(src) {
+            NameIDMappingRequestImpl(const NameIDMappingRequestImpl& src) : AbstractXMLObject(src), RequestAbstractTypeImpl(src) {
                 init();
+            }
 
-                if (src.getBaseID())
-                    setBaseID(src.getBaseID()->cloneBaseID());
-                if (src.getNameID())
-                    setNameID(src.getNameID()->cloneNameID());
-                if (src.getEncryptedID())
-                    setEncryptedID(src.getEncryptedID()->cloneEncryptedID());
-                if (src.getNameIDPolicy())
-                    setNameIDPolicy(src.getNameIDPolicy()->cloneNameIDPolicy());
-
+            void _clone(const NameIDMappingRequestImpl& src) {
+                RequestAbstractTypeImpl::_clone(src);
+                IMPL_CLONE_TYPED_CHILD(BaseID);
+                IMPL_CLONE_TYPED_CHILD(NameID);
+                IMPL_CLONE_TYPED_CHILD(EncryptedID);
+                IMPL_CLONE_TYPED_CHILD(NameIDPolicy);
             }
             
-            IMPL_XMLOBJECT_CLONE(NameIDMappingRequest);
-
+            IMPL_XMLOBJECT_CLONE_EX(NameIDMappingRequest);
             IMPL_TYPED_FOREIGN_CHILD(BaseID,saml2);
             IMPL_TYPED_FOREIGN_CHILD(NameID,saml2);
             IMPL_TYPED_FOREIGN_CHILD(EncryptedID,saml2);
@@ -1549,54 +1453,54 @@ namespace opensaml {
     
         protected:
             void processChildElement(XMLObject* childXMLObject, const DOMElement* root) {
-                PROC_TYPED_FOREIGN_CHILD(BaseID,saml2,SAMLConstants::SAML20_NS,false);
-                PROC_TYPED_FOREIGN_CHILD(NameID,saml2,SAMLConstants::SAML20_NS,false);
-                PROC_TYPED_FOREIGN_CHILD(EncryptedID,saml2,SAMLConstants::SAML20_NS,false);
-                PROC_TYPED_CHILD(NameIDPolicy,SAMLConstants::SAML20P_NS,false);
-                RequestImpl::processChildElement(childXMLObject,root);
+                PROC_TYPED_FOREIGN_CHILD(BaseID,saml2,SAML20_NS,false);
+                PROC_TYPED_FOREIGN_CHILD(NameID,saml2,SAML20_NS,false);
+                PROC_TYPED_FOREIGN_CHILD(EncryptedID,saml2,SAML20_NS,false);
+                PROC_TYPED_CHILD(NameIDPolicy,SAML20P_NS,false);
+                RequestAbstractTypeImpl::processChildElement(childXMLObject,root);
             }
         };
 
-        class SAML_DLLLOCAL NameIDMappingResponseImpl : public virtual NameIDMappingResponse, public StatusResponseImpl
+        class SAML_DLLLOCAL NameIDMappingResponseImpl : public virtual NameIDMappingResponse, public StatusResponseTypeImpl
         {
             void init() {
-                m_NameID=NULL;
-                m_EncryptedID=NULL;
-                m_children.push_back(NULL);
-                m_children.push_back(NULL);
+                m_NameID=nullptr;
+                m_EncryptedID=nullptr;
+                m_children.push_back(nullptr);
+                m_children.push_back(nullptr);
                 m_pos_NameID=m_pos_Status;
                 ++m_pos_NameID;
                 m_pos_EncryptedID=m_pos_NameID;
                 ++m_pos_EncryptedID;
             }
+
         public:
-            virtual ~NameIDMappingResponseImpl() { }
+            virtual ~NameIDMappingResponseImpl() {}
     
-            NameIDMappingResponseImpl(const XMLCh* nsURI, const XMLCh* localName, const XMLCh* prefix, const QName* schemaType)
-                : AbstractXMLObject(nsURI, localName, prefix, schemaType)
-            {
+            NameIDMappingResponseImpl(const XMLCh* nsURI, const XMLCh* localName, const XMLCh* prefix, const xmltooling::QName* schemaType)
+                    : AbstractXMLObject(nsURI, localName, prefix, schemaType) {
                 init();
             }
                 
-            NameIDMappingResponseImpl(const NameIDMappingResponseImpl& src) : AbstractXMLObject(src), StatusResponseImpl(src) {
+            NameIDMappingResponseImpl(const NameIDMappingResponseImpl& src) : AbstractXMLObject(src), StatusResponseTypeImpl(src) {
                 init();
+            }
 
-                if (src.getNameID())
-                    setNameID(getNameID()->cloneNameID());
-                if (src.getEncryptedID())
-                    setEncryptedID(getEncryptedID()->cloneEncryptedID());
-
+            void _clone(const NameIDMappingResponseImpl& src) {
+                StatusResponseTypeImpl::_clone(src);
+                IMPL_CLONE_TYPED_CHILD(NameID);
+                IMPL_CLONE_TYPED_CHILD(EncryptedID);
             }
             
-            IMPL_XMLOBJECT_CLONE(NameIDMappingResponse);
+            IMPL_XMLOBJECT_CLONE_EX(NameIDMappingResponse);
             IMPL_TYPED_FOREIGN_CHILD(NameID,saml2);
             IMPL_TYPED_FOREIGN_CHILD(EncryptedID,saml2);
     
         protected:
             void processChildElement(XMLObject* childXMLObject, const DOMElement* root) {
-                PROC_TYPED_FOREIGN_CHILD(NameID,saml2,SAMLConstants::SAML20_NS,false);
-                PROC_TYPED_FOREIGN_CHILD(EncryptedID,saml2,SAMLConstants::SAML20_NS,false);
-                StatusResponseImpl::processChildElement(childXMLObject,root);
+                PROC_TYPED_FOREIGN_CHILD(NameID,saml2,SAML20_NS,false);
+                PROC_TYPED_FOREIGN_CHILD(EncryptedID,saml2,SAML20_NS,false);
+                StatusResponseTypeImpl::processChildElement(childXMLObject,root);
             }
         };
     };
@@ -1637,7 +1541,6 @@ IMPL_XMLOBJECTBUILDER(Status);
 IMPL_XMLOBJECTBUILDER(StatusCode);
 IMPL_XMLOBJECTBUILDER(StatusDetail);
 IMPL_XMLOBJECTBUILDER(StatusMessage);
-IMPL_XMLOBJECTBUILDER(StatusResponse);
 IMPL_XMLOBJECTBUILDER(Terminate);
 
 IMPL_XMLOBJECTBUILDER(RespondTo);
@@ -1704,13 +1607,13 @@ const XMLCh RequestedAuthnContext::COMPARISON_EXACT[] = UNICODE_LITERAL_5(e,x,a,
 const XMLCh RequestedAuthnContext::COMPARISON_MINIMUM[] = UNICODE_LITERAL_7(m,i,n,i,m,u,m);
 const XMLCh RequestedAuthnContext::COMPARISON_MAXIMUM[] = UNICODE_LITERAL_7(m,a,x,i,m,u,m);
 const XMLCh RequestedAuthnContext::COMPARISON_BETTER[] = UNICODE_LITERAL_6(b,e,t,t,e,r);
-const XMLCh Request::LOCAL_NAME[] = {chNull};
-const XMLCh Request::TYPE_NAME[] = UNICODE_LITERAL_19(R,e,q,u,e,s,t,A,b,s,t,r,a,c,t,T,y,p,e);
-const XMLCh Request::ID_ATTRIB_NAME[] = UNICODE_LITERAL_2(I,D);
-const XMLCh Request::VER_ATTRIB_NAME[] = UNICODE_LITERAL_7(V,e,r,s,i,o,n);
-const XMLCh Request::ISSUEINSTANT_ATTRIB_NAME[] = UNICODE_LITERAL_12(I,s,s,u,e,I,n,s,t,a,n,t);
-const XMLCh Request::DESTINATION_ATTRIB_NAME[] = UNICODE_LITERAL_11(D,e,s,t,i,n,a,t,i,o,n);
-const XMLCh Request::CONSENT_ATTRIB_NAME[] = UNICODE_LITERAL_7(C,o,n,s,e,n,t);
+const XMLCh RequestAbstractType::LOCAL_NAME[] = {chNull};
+const XMLCh RequestAbstractType::TYPE_NAME[] = UNICODE_LITERAL_19(R,e,q,u,e,s,t,A,b,s,t,r,a,c,t,T,y,p,e);
+const XMLCh RequestAbstractType::ID_ATTRIB_NAME[] = UNICODE_LITERAL_2(I,D);
+const XMLCh RequestAbstractType::VER_ATTRIB_NAME[] = UNICODE_LITERAL_7(V,e,r,s,i,o,n);
+const XMLCh RequestAbstractType::ISSUEINSTANT_ATTRIB_NAME[] = UNICODE_LITERAL_12(I,s,s,u,e,I,n,s,t,a,n,t);
+const XMLCh RequestAbstractType::DESTINATION_ATTRIB_NAME[] = UNICODE_LITERAL_11(D,e,s,t,i,n,a,t,i,o,n);
+const XMLCh RequestAbstractType::CONSENT_ATTRIB_NAME[] = UNICODE_LITERAL_7(C,o,n,s,e,n,t);
 const XMLCh RespondTo::LOCAL_NAME[] = UNICODE_LITERAL_9(R,e,s,p,o,n,d,T,o);
 const XMLCh Response::LOCAL_NAME[] = UNICODE_LITERAL_8(R,e,s,p,o,n,s,e);
 const XMLCh Response::TYPE_NAME[] = UNICODE_LITERAL_12(R,e,s,p,o,n,s,e,T,y,p,e);
@@ -1726,16 +1629,16 @@ const XMLCh StatusCode::VALUE_ATTRIB_NAME[] = UNICODE_LITERAL_5(V,a,l,u,e);
 const XMLCh StatusDetail::LOCAL_NAME[] = UNICODE_LITERAL_12(S,t,a,t,u,s,D,e,t,a,i,l);
 const XMLCh StatusDetail::TYPE_NAME[] = UNICODE_LITERAL_16(S,t,a,t,u,s,D,e,t,a,i,l,T,y,p,e);
 const XMLCh StatusMessage::LOCAL_NAME[] = UNICODE_LITERAL_13(S,t,a,t,u,s,M,e,s,s,a,g,e);
-const XMLCh StatusResponse::LOCAL_NAME[] = {chNull};
-const XMLCh StatusResponse::TYPE_NAME[] = UNICODE_LITERAL_18(S,t,a,t,u,s,R,e,s,p,o,n,s,e,T,y,p,e);
-const XMLCh StatusResponse::ID_ATTRIB_NAME[] = UNICODE_LITERAL_2(I,D);
-const XMLCh StatusResponse::INRESPONSETO_ATTRIB_NAME[] = UNICODE_LITERAL_12(I,n,R,e,s,p,o,n,s,e,T,o);
-const XMLCh StatusResponse::VER_ATTRIB_NAME[] = UNICODE_LITERAL_7(V,e,r,s,i,o,n);
-const XMLCh StatusResponse::ISSUEINSTANT_ATTRIB_NAME[] = UNICODE_LITERAL_12(I,s,s,u,e,I,n,s,t,a,n,t);
-const XMLCh StatusResponse::DESTINATION_ATTRIB_NAME[] = UNICODE_LITERAL_11(D,e,s,t,i,n,a,t,i,o,n);
-const XMLCh StatusResponse::CONSENT_ATTRIB_NAME[] = UNICODE_LITERAL_7(C,o,n,s,e,n,t);
-const XMLCh SubjectQuery::LOCAL_NAME[] = {chNull};
-const XMLCh SubjectQuery::TYPE_NAME[] = UNICODE_LITERAL_16(S,u,b,j,e,c,t,Q,u,e,r,y,T,y,p,e);
+const XMLCh StatusResponseType::LOCAL_NAME[] = {chNull};
+const XMLCh StatusResponseType::TYPE_NAME[] = UNICODE_LITERAL_18(S,t,a,t,u,s,R,e,s,p,o,n,s,e,T,y,p,e);
+const XMLCh StatusResponseType::ID_ATTRIB_NAME[] = UNICODE_LITERAL_2(I,D);
+const XMLCh StatusResponseType::INRESPONSETO_ATTRIB_NAME[] = UNICODE_LITERAL_12(I,n,R,e,s,p,o,n,s,e,T,o);
+const XMLCh StatusResponseType::VER_ATTRIB_NAME[] = UNICODE_LITERAL_7(V,e,r,s,i,o,n);
+const XMLCh StatusResponseType::ISSUEINSTANT_ATTRIB_NAME[] = UNICODE_LITERAL_12(I,s,s,u,e,I,n,s,t,a,n,t);
+const XMLCh StatusResponseType::DESTINATION_ATTRIB_NAME[] = UNICODE_LITERAL_11(D,e,s,t,i,n,a,t,i,o,n);
+const XMLCh StatusResponseType::CONSENT_ATTRIB_NAME[] = UNICODE_LITERAL_7(C,o,n,s,e,n,t);
+const XMLCh SubjectQuery::LOCAL_NAME[] = UNICODE_LITERAL_12(S,u,b,j,e,c,t,Q,u,e,r,y);
+const XMLCh SubjectQuery::TYPE_NAME[] = UNICODE_LITERAL_24(S,u,b,j,e,c,t,Q,u,e,r,y,A,b,s,t,r,a,c,t,T,y,p,e);
 const XMLCh Terminate::LOCAL_NAME[] = UNICODE_LITERAL_9(T,e,r,m,i,n,a,t,e);
 const XMLCh Terminate::TYPE_NAME[] = UNICODE_LITERAL_13(T,e,r,m,i,n,a,t,e,T,y,p,e);