Big update to fix samples 1 thru 9. Also fix or remove a bunch of old http links
diff --git a/modules/distribution/bin.xml b/modules/distribution/bin.xml
index 0e76918..1733500 100644
--- a/modules/distribution/bin.xml
+++ b/modules/distribution/bin.xml
@@ -15,23 +15,37 @@
         <dependencySet>
             <outputDirectory>lib</outputDirectory>
             <includes>
-                <include>org.apache.wss4j:wss4j:jar</include>
                 <include>org.apache.wss4j:wss4j-ws-security-common:jar</include>
                 <include>org.apache.wss4j:wss4j-ws-security-dom:jar</include>
+                <include>org.apache.wss4j:wss4j-ws-security-stax:jar</include>
                 <include>org.apache.wss4j:wss4j-policy:jar</include>
+                <include>org.apache.wss4j:wss4j-bindings:jar</include>
                 <include>org.bouncycastle:bcprov-jdk18on:jar</include>
                 <include>org.apache.rampart:rampart-core:jar</include>
                 <include>org.apache.rampart:rampart-policy:jar</include>
                 <include>org.apache.rampart:rampart-trust:jar</include>
-                <include>org.opensaml:opensaml:jar</include>
+                <include>org.opensaml:opensaml-core:jar</include>
+                <include>org.opensaml:opensaml-saml-api:jar</include>
+                <include>org.opensaml:opensaml-saml-impl:jar</include>
                 <include>org.opensaml:opensaml-soap-impl:jar</include>
                 <include>org.opensaml:opensaml-soap-api:jar</include>
                 <include>org.opensaml:opensaml-xacml-impl:jar</include>
                 <include>org.opensaml:opensaml-xacml-api:jar</include>
+                <include>org.opensaml:opensaml-xmlsec-api:jar</include>
+                <include>org.opensaml:opensaml-xmlsec-impl:jar</include>
+                <include>org.opensaml:opensaml-security-api:jar</include>
+                <include>org.opensaml:opensaml-security-impl:jar</include>
+                <include>net.shibboleth.utilities:java-support:jar</include>
+                <include>net.shibboleth:cryptography-api:jar</include>
+                <include>io.dropwizard.metrics:metrics-core:jar</include>
+                <include>org.cryptacular:cryptacular:jar</include>
                 <include>org.apache.santuario:xmlsec:jar</include>
                 <include>org.owasp.esapi:esapi:jar</include>
                 <include>org.slf4j:slf4j-api:jar</include>
-                <include>org.slf4j:jcl-over-slf4j:jar</include>
+                <include>org.apache.logging.log4j:log4j-jcl:jar</include>
+                <include>org.apache.logging.log4j:log4j-slf4j-impl:jar</include>
+                <include>org.apache.logging.log4j:log4j-core:jar</include>
+                <include>org.apache.logging.log4j:log4j-api:jar</include>
                 <include>velocity:velocity:jar</include>
                 <include>commons-lang:commons-lang:jar</include>
             </includes>
@@ -54,6 +68,22 @@
             <directory>src/main/files</directory>
             <outputDirectory>.</outputDirectory>
         </fileSet>
+        <fileSet>
+            <directory>src/main/resources</directory>
+            <outputDirectory>lib</outputDirectory>
+            <includes>
+                <include>log4j2.xml</include>
+                <include>commons-logging.properties</include>
+            </includes>
+        </fileSet>
+        <fileSet>
+            <directory>src/main/resources</directory>
+            <outputDirectory>conf</outputDirectory>
+            <includes>
+                <include>log4j2.xml</include>
+                <include>commons-logging.properties</include>
+            </includes>
+        </fileSet>
     </fileSets>
 
     <files>
diff --git a/modules/distribution/pom.xml b/modules/distribution/pom.xml
index 032d878..21731b1 100644
--- a/modules/distribution/pom.xml
+++ b/modules/distribution/pom.xml
@@ -143,10 +143,40 @@
             <type>pom</type>
             <scope>import</scope>
         </dependency>
+        <!-- Log4j2 Commons Logging bridge - replaces commons-logging -->
         <dependency>
-            <groupId>commons-logging</groupId>
-            <artifactId>commons-logging</artifactId>
-            <version>1.2</version>
+            <groupId>org.apache.logging.log4j</groupId>
+            <artifactId>log4j-jcl</artifactId>
+            <version>2.18.0</version>
+            <exclusions>
+                <exclusion>
+                    <groupId>commons-logging</groupId>
+                    <artifactId>commons-logging</artifactId>
+                </exclusion>
+            </exclusions>
+        </dependency>
+        <!-- SLF4J-Log4j2 bridge for third-party libraries -->
+        <dependency>
+            <groupId>org.apache.logging.log4j</groupId>
+            <artifactId>log4j-slf4j-impl</artifactId>
+            <version>2.18.0</version>
+            <exclusions>
+                <exclusion>
+                    <groupId>org.slf4j</groupId>
+                    <artifactId>jcl-over-slf4j</artifactId>
+                </exclusion>
+            </exclusions>
+        </dependency>
+        <!-- Log4j2 core implementation -->
+        <dependency>
+            <groupId>org.apache.logging.log4j</groupId>
+            <artifactId>log4j-core</artifactId>
+            <version>2.18.0</version>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.logging.log4j</groupId>
+            <artifactId>log4j-api</artifactId>
+            <version>2.18.0</version>
         </dependency>
     </dependencies>
 
diff --git a/modules/rampart-core/src/main/java/org/apache/rampart/MessageBuilder.java b/modules/rampart-core/src/main/java/org/apache/rampart/MessageBuilder.java
index 2eb64de..e4b3450 100644
--- a/modules/rampart-core/src/main/java/org/apache/rampart/MessageBuilder.java
+++ b/modules/rampart-core/src/main/java/org/apache/rampart/MessageBuilder.java
@@ -29,6 +29,8 @@
 import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
 import org.apache.rahas.RahasConstants;
+import org.apache.rahas.Token;
+import org.apache.rahas.TokenStorage;
 import org.apache.rahas.TrustUtil;
 import org.apache.rampart.builder.AsymmetricBindingBuilder;
 import org.apache.rampart.builder.SymmetricBindingBuilder;
@@ -50,29 +52,111 @@
 import javax.xml.namespace.QName;
 
 public class MessageBuilder {
-    
+
     private static Log log = LogFactory.getLog(MessageBuilder.class);
+    private static final String VERSION_ID = "2025-11-01-MESSAGEBUILDER-DEBUG-v2";
 
     public void build(MessageContext msgCtx) throws WSSPolicyException,
             RampartException, WSSecurityException, AxisFault {
 
+        // Log key message context properties that affect security header creation
+        Object rampartPolicy = msgCtx.getOptions().getProperty(RampartMessageData.KEY_RAMPART_POLICY);
+        Object customToken = msgCtx.getOptions().getProperty(RampartMessageData.KEY_CUSTOM_ISSUED_TOKEN);
+
+        if (log.isDebugEnabled()) {
+            String timestamp = java.time.LocalDateTime.now().format(java.time.format.DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss.SSS"));
+            log.debug("=== MESSAGEBUILDER: Starting build for message ===");
+            log.debug("MessageBuilder TIMESTAMP: " + timestamp);
+            log.debug("MessageBuilder VERSION: " + VERSION_ID);
+            log.debug("MessageBuilder: Action = " + msgCtx.getOptions().getAction());
+            log.debug("MessageBuilder: To = " + msgCtx.getOptions().getTo());
+            log.debug("MessageBuilder: Message flow = " + (msgCtx.getFLOW() == MessageContext.IN_FLOW ? "IN_FLOW" :
+                                                               msgCtx.getFLOW() == MessageContext.OUT_FLOW ? "OUT_FLOW" :
+                                                               msgCtx.getFLOW() == MessageContext.IN_FAULT_FLOW ? "IN_FAULT_FLOW" :
+                                                               msgCtx.getFLOW() == MessageContext.OUT_FAULT_FLOW ? "OUT_FAULT_FLOW" : "UNKNOWN"));
+
+            log.debug("MessageBuilder: RampartPolicy property = " + (rampartPolicy != null ? "present" : "null"));
+            log.debug("MessageBuilder: CustomIssuedToken property = " + (customToken != null ? customToken : "null"));
+        }
+
         Axis2Util.useDOOM(true);
-        
+
         RampartMessageData rmd = new RampartMessageData(msgCtx, true);
-        
-        
+
+
         RampartPolicyData rpd = rmd.getPolicyData();
-        if(rpd == null || isSecurityValidationFault(msgCtx) || 
-                !RampartUtil.isSecHeaderRequired(rpd, rmd.isInitiator(),false)) {
-            
+        log.debug("MessageBuilder: PolicyData available = " + (rpd != null));
+        if (rpd != null) {
+            log.debug("MessageBuilder: Policy has SupportingTokens = " + (rpd.getSupportingTokens() != null));
+            log.debug("MessageBuilder: Policy binding type = " +
+                (rpd.isTransportBinding() ? "Transport" :
+                 rpd.isSymmetricBinding() ? "Symmetric" :
+                 rpd.isAsymmetricBinding() ? "Asymmetric" : "Unknown"));
+            log.debug("MessageBuilder: EncryptionToken = " + (rpd.getEncryptionToken() != null ? rpd.getEncryptionToken().getClass().getSimpleName() : "null"));
+            log.debug("MessageBuilder: SignatureToken = " + (rpd.getSignatureToken() != null ? rpd.getSignatureToken().getClass().getSimpleName() : "null"));
+
+            // Log additional custom issued token details
+            log.debug("MessageBuilder: Custom issued token present = " + (customToken != null));
+            if (customToken != null) {
+                log.debug("MessageBuilder: Custom issued token value = " + customToken);
+            }
+
+            // Check token storage
+            try {
+                TokenStorage tokenStorage = rmd.getTokenStorage();
+                log.debug("MessageBuilder: TokenStorage available = " + (tokenStorage != null));
+                if (tokenStorage != null && customToken != null) {
+                    Token token = tokenStorage.getToken((String)customToken);
+                    log.debug("MessageBuilder: Token found in storage = " + (token != null));
+                    if (token != null) {
+                        log.debug("MessageBuilder: Token ID = " + token.getId());
+                        log.debug("MessageBuilder: Token has secret = " + (token.getSecret() != null));
+                    }
+                }
+            } catch (Exception e) {
+                log.debug("MessageBuilder: Error checking token storage: " + e.getMessage());
+            }
+        }
+        log.debug("MessageBuilder: isInitiator = " + rmd.isInitiator());
+        log.debug("MessageBuilder: isSecurityValidationFault = " + isSecurityValidationFault(msgCtx));
+
+        boolean secHeaderRequired = rpd != null ? RampartUtil.isSecHeaderRequired(rpd, rmd.isInitiator(),false) : false;
+        if (log.isDebugEnabled()) {
+            log.debug("MessageBuilder: isSecHeaderRequired = " + secHeaderRequired);
+        }
+
+        if(rpd == null || isSecurityValidationFault(msgCtx) || !secHeaderRequired) {
+            log.warn("MessageBuilder: EARLY RETURN - No security header will be added");
+            log.warn("MessageBuilder: rpd null = " + (rpd == null));
+            log.warn("MessageBuilder: validation fault = " + isSecurityValidationFault(msgCtx));
+            log.warn("MessageBuilder: sec header not required = " + !secHeaderRequired);
+            if (rpd != null && !secHeaderRequired) {
+                log.warn("MessageBuilder: Policy exists but sec header not required - diagnosing policy");
+                log.warn("MessageBuilder: isInitiator = " + rmd.isInitiator());
+                log.warn("MessageBuilder: Policy binding type = " +
+                    (rpd.isTransportBinding() ? "Transport" :
+                     rpd.isSymmetricBinding() ? "Symmetric" :
+                     rpd.isAsymmetricBinding() ? "Asymmetric" : "Unknown"));
+                log.warn("MessageBuilder: Policy includeTimestamp = " + rpd.isIncludeTimestamp());
+            }
+
             WSSecHeader secHeader = rmd.getSecHeader();
-            
+
             if ( secHeader != null && secHeader.isEmpty() ) {
                 secHeader.removeSecurityHeader();
             }
-            
+
             return;
         }
+
+        if (log.isDebugEnabled()) {
+            log.debug("MessageBuilder: PROCEEDING to add security header");
+            log.debug("MessageBuilder: isInitiator = " + rmd.isInitiator());
+            log.debug("MessageBuilder: Policy binding type = " +
+                (rpd.isTransportBinding() ? "Transport" :
+                 rpd.isSymmetricBinding() ? "Symmetric" :
+                 rpd.isAsymmetricBinding() ? "Asymmetric" : "Unknown"));
+        }
         
         //Copy the RECV_RESULTS if available
         if(!rmd.isInitiator()) {
@@ -134,27 +218,68 @@
         }
         
        if(rpd.isTransportBinding()) {
-           log.debug("Building transport binding");
+           log.debug("MessageBuilder: Building transport binding");
            TransportBindingBuilder building = new TransportBindingBuilder();
            building.build(rmd);
+           log.debug("MessageBuilder: TransportBinding build completed");
         } else if(rpd.isSymmetricBinding()) {
-           log.debug("Building SymmetricBinding");
+           log.debug("MessageBuilder: Building SymmetricBinding");
            SymmetricBindingBuilder builder = new SymmetricBindingBuilder();
-           builder.build(rmd);
+           try {
+               builder.build(rmd);
+               log.debug("MessageBuilder: SymmetricBinding build completed successfully");
+           } catch (Exception e) {
+               log.debug("MessageBuilder: SymmetricBinding build FAILED: " + e.getMessage());
+               e.printStackTrace();
+               throw e;
+           }
         } else {
+            log.debug("MessageBuilder: Building AsymmetricBinding");
             AsymmetricBindingBuilder builder = new AsymmetricBindingBuilder();
-            builder.build(rmd);
+            try {
+                builder.build(rmd);
+                log.debug("MessageBuilder: AsymmetricBinding build completed successfully");
+            } catch (Exception e) {
+                log.debug("MessageBuilder: AsymmetricBinding build FAILED: " + e.getMessage());
+                e.printStackTrace();
+                throw e;
+            }
         }
        
        //TODO remove following check, we don't need this check here as we do a check to see whether 
        // security header required 
        
        WSSecHeader secHeader = rmd.getSecHeader();
-       
-       if ( secHeader != null && secHeader.isEmpty() ) {
-           secHeader.removeSecurityHeader();
+       if (log.isDebugEnabled()) {
+           log.debug("MessageBuilder: Final security header check");
+           log.debug("MessageBuilder: Security header present = " + (secHeader != null));
+           if (secHeader != null) {
+               boolean isEmpty = secHeader.isEmpty();
+               log.debug("MessageBuilder: Security header empty = " + isEmpty);
+               if (isEmpty) {
+                   log.debug("MessageBuilder: REMOVING empty security header");
+               } else {
+                   log.debug("MessageBuilder: Security header retained (has content)");
+               }
+           } else {
+               log.debug("MessageBuilder: No security header was created!");
+           }
        }
-        
+
+
+       // Log the final envelope being built
+       if (log.isDebugEnabled()) {
+           try {
+               log.debug("=== MESSAGEBUILDER: Final SOAP envelope being sent ===");
+               log.debug("MessageBuilder: Action = " + msgCtx.getWSAAction());
+               log.debug("MessageBuilder: Final envelope content:");
+               log.debug(msgCtx.getEnvelope().toString());
+               log.debug("=== END SOAP envelope ===");
+           } catch (Exception e) {
+               log.debug("MessageBuilder: Could not log envelope: " + e.getMessage());
+           }
+       }
+
        /*
         * Checking whether MTOMSerializable is there. If so set optimizeElement.
         * */
diff --git a/modules/rampart-core/src/main/java/org/apache/rampart/RampartEngine.java b/modules/rampart-core/src/main/java/org/apache/rampart/RampartEngine.java
index 3eb6d20..540fdf1 100644
--- a/modules/rampart-core/src/main/java/org/apache/rampart/RampartEngine.java
+++ b/modules/rampart-core/src/main/java/org/apache/rampart/RampartEngine.java
@@ -72,11 +72,29 @@
 	private static Log tlog = LogFactory.getLog(RampartConstants.TIME_LOG);
     private static ServiceNonceCache serviceNonceCache = new ServiceNonceCache();
 
+
 	public List<WSSecurityEngineResult> process(MessageContext msgCtx) throws WSSPolicyException,
 	RampartException, WSSecurityException, AxisFault {
 
+		if (log.isDebugEnabled()) {
+			log.debug("RampartEngine: Processing incoming message");
+			log.debug("RampartEngine: Initial SOAP envelope received:");
+			try {
+				log.debug(msgCtx.getEnvelope().toString());
+			} catch (Exception e) {
+				log.debug("RampartEngine: Could not log initial envelope: " + e.getMessage());
+			}
+		}
+
+		if (log.isDebugEnabled()) {
+			String timestamp = java.time.LocalDateTime.now().format(java.time.format.DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss.SSS"));
+			log.debug("Processing message - timestamp: " + timestamp);
+			log.debug("Action = " + (msgCtx.getOptions() != null ? msgCtx.getOptions().getAction() : "null"));
+			log.debug("To = " + (msgCtx.getOptions() != null ? msgCtx.getOptions().getTo() : "null"));
+		}
+
 		boolean dotDebug = tlog.isDebugEnabled();
-		
+
 		log.debug("Enter process(MessageContext msgCtx)");
 
 		RampartMessageData rmd = new RampartMessageData(msgCtx, false);
@@ -238,6 +256,15 @@
 		}
 		
 		if(secHeader == null) {
+		    if (log.isDebugEnabled()) {
+		        log.debug("RampartEngine: No security header found in received message");
+		        log.debug("RampartEngine: Received SOAP envelope:");
+		        try {
+		            log.debug(msgCtx.getEnvelope().toString());
+		        } catch (Exception e) {
+		            log.debug("RampartEngine: Could not log envelope: " + e.getMessage());
+		        }
+		    }
 		    throw new RampartException("missingSecurityHeader");
 		}
 		
@@ -417,7 +444,90 @@
 		    }
 		}
 
-        return engine.processSecurityHeader(rmd.getDocument(), requestData);
+        // CRITICAL FIX: Ensure WSS4J OpenSAML is initialized right before SAML processing
+        // This addresses timing issues where initialization in RampartMessageData isn't sufficient
+        try {
+            if (log.isDebugEnabled()) {
+                log.debug("Ensuring WSS4J OpenSAML initialization before processSecurityHeader");
+            }
+            Class<?> openSAMLUtilClass = Class.forName("org.apache.wss4j.common.saml.OpenSAMLUtil");
+
+            // Check state BEFORE initialization
+            java.lang.reflect.Field factoryField = openSAMLUtilClass.getDeclaredField("unmarshallerFactory");
+            factoryField.setAccessible(true);
+            Object factoryBefore = factoryField.get(null);
+            if (log.isDebugEnabled()) {
+                log.debug("OpenSAMLUtil.unmarshallerFactory BEFORE init: " + factoryBefore);
+            }
+
+            try {
+                java.lang.reflect.Method initMethod = openSAMLUtilClass.getDeclaredMethod("initSamlEngine");
+                initMethod.setAccessible(true);
+                initMethod.invoke(null);
+            } catch (NoSuchMethodException e) {
+                if (log.isDebugEnabled()) {
+                    log.debug("initSamlEngine method not found, will use manual initialization");
+                }
+            }
+
+            // Check state AFTER initSamlEngine attempt
+            Object factoryAfter = factoryField.get(null);
+            if (log.isDebugEnabled()) {
+                log.debug("OpenSAMLUtil.unmarshallerFactory AFTER initSamlEngine: " + factoryAfter);
+            }
+
+            if (factoryAfter == null) {
+                log.info("initSamlEngine failed, performing manual factory initialization");
+
+                // Manual initialization: Get factories from properly initialized OpenSAML and set them directly
+                org.opensaml.core.xml.io.UnmarshallerFactory unmarshallerFactory = org.opensaml.core.xml.config.XMLObjectProviderRegistrySupport.getUnmarshallerFactory();
+                org.opensaml.core.xml.io.MarshallerFactory marshallerFactory = org.opensaml.core.xml.config.XMLObjectProviderRegistrySupport.getMarshallerFactory();
+
+                // Set the factories directly in OpenSAMLUtil static fields
+                java.lang.reflect.Field unmarshallerFactoryField = openSAMLUtilClass.getDeclaredField("unmarshallerFactory");
+                unmarshallerFactoryField.setAccessible(true);
+                unmarshallerFactoryField.set(null, unmarshallerFactory);
+
+                java.lang.reflect.Field marshallerFactoryField = openSAMLUtilClass.getDeclaredField("marshallerFactory");
+                marshallerFactoryField.setAccessible(true);
+                marshallerFactoryField.set(null, marshallerFactory);
+
+                // Verify manual initialization worked
+                Object factoryFinal = factoryField.get(null);
+                if (log.isDebugEnabled()) {
+                    log.debug("OpenSAMLUtil.unmarshallerFactory AFTER manual init: " + factoryFinal);
+                }
+
+                if (factoryFinal != null) {
+                    log.info("Manual WSS4J OpenSAML factory initialization successful");
+                } else {
+                    log.warn("Manual factory initialization failed - OpenSAMLUtil.unmarshallerFactory is still null");
+                }
+            } else {
+                if (log.isDebugEnabled()) {
+                    log.debug("initSamlEngine worked properly");
+                }
+            }
+        } catch (Exception e) {
+            log.warn("WSS4J OpenSAML initialization failed: " + e.getMessage(), e);
+        }
+
+        WSHandlerResult result = engine.processSecurityHeader(rmd.getDocument(), requestData);
+
+        // DEBUG: Check OpenSAMLUtil state AFTER processSecurityHeader to see if it gets corrupted
+        if (log.isDebugEnabled()) {
+            try {
+                Class<?> openSAMLUtilClass = Class.forName("org.apache.wss4j.common.saml.OpenSAMLUtil");
+                java.lang.reflect.Field factoryField = openSAMLUtilClass.getDeclaredField("unmarshallerFactory");
+                factoryField.setAccessible(true);
+                Object factoryAfterProcessing = factoryField.get(null);
+                log.debug("OpenSAMLUtil.unmarshallerFactory AFTER processSecurityHeader: " + factoryAfterProcessing);
+            } catch (Exception e) {
+                log.debug("Error checking factory after processing: " + e.getMessage());
+            }
+        }
+
+        return result;
     }
 	
 	// Check whether this a soap fault because of failure in processing the security header 
diff --git a/modules/rampart-core/src/main/java/org/apache/rampart/RampartMessageData.java b/modules/rampart-core/src/main/java/org/apache/rampart/RampartMessageData.java
index 58c3c7f..e2a122f 100644
--- a/modules/rampart-core/src/main/java/org/apache/rampart/RampartMessageData.java
+++ b/modules/rampart-core/src/main/java/org/apache/rampart/RampartMessageData.java
@@ -18,6 +18,8 @@
 
 import org.apache.axiom.om.OMElement;
 import org.apache.axiom.soap.SOAPEnvelope;
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
 import org.apache.axis2.AxisFault;
 import org.apache.axis2.context.MessageContext;
 import org.apache.axis2.context.OperationContext;
@@ -68,7 +70,9 @@
 import java.util.List;
 
 public class RampartMessageData {
-    
+
+    private static Log log = LogFactory.getLog(RampartMessageData.class);
+
     /**
      * Axis2 parameter name to be used in the client's axis2 xml
      */
@@ -211,6 +215,36 @@
         
         try {
 
+            // CRITICAL FIX: Initialize WSS4J before creating WSSConfig to ensure OpenSAML integration works
+            // This prevents OpenSAMLUtil.unmarshallerFactory from being null when processing SAML assertions
+            if (log.isDebugEnabled()) {
+                log.debug("WSS4J initialization starting");
+            }
+            WSSConfig.init();
+            org.apache.xml.security.Init.init();
+            if (log.isDebugEnabled()) {
+                log.debug("Basic WSS4J initialization complete");
+            }
+
+            // Initialize WSS4J's OpenSAML integration specifically
+            try {
+                if (log.isDebugEnabled()) {
+                    log.debug("Starting OpenSAML initialization");
+                }
+                org.opensaml.core.config.InitializationService.initialize();
+
+                // Call WSS4J's OpenSAMLUtil initialization method
+                Class<?> openSAMLUtilClass = Class.forName("org.apache.wss4j.common.saml.OpenSAMLUtil");
+                java.lang.reflect.Method initMethod = openSAMLUtilClass.getDeclaredMethod("initSamlEngine");
+                initMethod.setAccessible(true);
+                initMethod.invoke(null);
+                if (log.isDebugEnabled()) {
+                    log.debug("OpenSAMLUtil.initSamlEngine() called successfully");
+                }
+            } catch (Exception e) {
+                log.warn("WSS4J OpenSAML initialization failed: " + e.getMessage(), e);
+            }
+
             // Set the WSSConfig
             this.config = WSSConfig.getNewInstance();
             
diff --git a/modules/rampart-core/src/main/java/org/apache/rampart/builder/BindingBuilder.java b/modules/rampart-core/src/main/java/org/apache/rampart/builder/BindingBuilder.java
index 274a933..b512478 100644
--- a/modules/rampart-core/src/main/java/org/apache/rampart/builder/BindingBuilder.java
+++ b/modules/rampart-core/src/main/java/org/apache/rampart/builder/BindingBuilder.java
@@ -93,16 +93,17 @@
      * @param rmd RampartMessageData
      */
     protected void addTimestamp(RampartMessageData rmd) {
-        log.debug("Adding timestamp");
+        log.debug("BindingBuilder: Adding timestamp");
 
         WSSecTimestamp timestampBuilder = new WSSecTimestamp(rmd.getSecHeader());
 
         timestampBuilder.setTimeToLive(RampartUtil.getTimeToLive(rmd));
-        
+
         // add the Timestamp to the SOAP Enevelope
 
         timestampBuilder.build();
 
+        log.info("BindingBuilder: Timestamp added with id: " + timestampBuilder.getId());
         if (log.isDebugEnabled()) {
             log.debug("Timestamp id: " + timestampBuilder.getId());
         }
diff --git a/modules/rampart-core/src/main/java/org/apache/rampart/builder/SymmetricBindingBuilder.java b/modules/rampart-core/src/main/java/org/apache/rampart/builder/SymmetricBindingBuilder.java
index b36ef39..85b6b70 100644
--- a/modules/rampart-core/src/main/java/org/apache/rampart/builder/SymmetricBindingBuilder.java
+++ b/modules/rampart-core/src/main/java/org/apache/rampart/builder/SymmetricBindingBuilder.java
@@ -34,6 +34,7 @@
 import org.apache.wss4j.dom.handler.WSHandlerConstants;
 import org.apache.wss4j.dom.handler.WSHandlerResult;
 import org.apache.wss4j.dom.message.WSSecDKEncrypt;
+import org.apache.wss4j.dom.message.WSSecHeader;
 import org.apache.wss4j.dom.util.WSSecurityUtil;
 import org.apache.wss4j.dom.message.WSSecEncrypt;
 import org.apache.wss4j.dom.message.WSSecEncryptedKey;
@@ -67,23 +68,89 @@
 
         log.debug("SymmetricBindingBuilder build invoked");
 
-        RampartPolicyData rpd = rmd.getPolicyData();
-        if(rpd.isIncludeTimestamp()) {
-            this.addTimestamp(rmd);
-        }
-        
-        if(rmd.isInitiator()) {
-            //Setup required tokens
-            initializeTokens(rmd);
-        }
-        
-            
-        if(SPConstants.ENCRYPT_BEFORE_SIGNING.equals(rpd.getProtectionOrder())) {
-            this.doEncryptBeforeSig(rmd);
-        } else {
-            this.doSignBeforeEncrypt(rmd);
+        if (log.isDebugEnabled()) {
+            String timestamp = java.time.LocalDateTime.now().format(java.time.format.DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss.SSS"));
+            log.debug("Starting symmetric binding build - timestamp: " + timestamp);
+            log.debug("Action = " + (rmd.getMsgContext().getOptions() != null ? rmd.getMsgContext().getOptions().getAction() : "null"));
+            log.debug("isInitiator = " + rmd.isInitiator());
         }
 
+        RampartPolicyData rpd = rmd.getPolicyData();
+
+        if (log.isDebugEnabled()) {
+            log.debug("ProtectionOrder = " + rpd.getProtectionOrder());
+            log.debug("IncludeTimestamp = " + rpd.isIncludeTimestamp());
+        }
+
+        if(rpd.isIncludeTimestamp()) {
+            if (log.isDebugEnabled()) {
+                log.debug("SymmetricBindingBuilder: Adding timestamp");
+            }
+            this.addTimestamp(rmd);
+            if (log.isDebugEnabled()) {
+                log.debug("SymmetricBindingBuilder: Timestamp added successfully");
+            }
+        }
+
+        if(rmd.isInitiator()) {
+            if (log.isDebugEnabled()) {
+                log.debug("SymmetricBindingBuilder: Initializing tokens (initiator)");
+            }
+            //Setup required tokens
+            initializeTokens(rmd);
+            if (log.isDebugEnabled()) {
+                log.debug("SymmetricBindingBuilder: Token initialization completed");
+            }
+        }
+
+
+        try {
+            if(SPConstants.ENCRYPT_BEFORE_SIGNING.equals(rpd.getProtectionOrder())) {
+                if (log.isDebugEnabled()) {
+                    log.debug("SymmetricBindingBuilder: Doing encrypt before sign");
+                }
+                this.doEncryptBeforeSig(rmd);
+                if (log.isDebugEnabled()) {
+                    log.debug("SymmetricBindingBuilder: Encrypt before sign completed successfully");
+                }
+            } else {
+                if (log.isDebugEnabled()) {
+                    log.debug("SymmetricBindingBuilder: Doing sign before encrypt");
+                }
+                this.doSignBeforeEncrypt(rmd);
+                if (log.isDebugEnabled()) {
+                    log.debug("SymmetricBindingBuilder: Sign before encrypt completed successfully");
+                }
+            }
+        } catch (Exception e) {
+            log.error("SymmetricBindingBuilder: ERROR in protection order processing: " + e.getMessage(), e);
+            throw e;
+        }
+
+        // Final security header check
+        if (log.isDebugEnabled()) {
+            log.debug("=== SYMMETRICBINDINGBUILDER: Final security header status ===");
+            WSSecHeader secHeader = rmd.getSecHeader();
+            if (secHeader != null) {
+                log.debug("SymmetricBindingBuilder: Security header exists");
+                try {
+                    log.debug("SymmetricBindingBuilder: Security header isEmpty = " + secHeader.isEmpty());
+                    Element secHeaderElem = secHeader.getSecurityHeaderElement();
+                    if (secHeaderElem != null) {
+                        log.debug("SymmetricBindingBuilder: Security header element exists");
+                        log.debug("SymmetricBindingBuilder: Security header element hasChildNodes = " + secHeaderElem.hasChildNodes());
+                        log.debug("SymmetricBindingBuilder: Security header element childCount = " + secHeaderElem.getChildNodes().getLength());
+                    } else {
+                        log.debug("SymmetricBindingBuilder: Security header element is NULL");
+                    }
+                } catch (Exception e) {
+                    log.debug("SymmetricBindingBuilder: Error checking security header: " + e.getMessage());
+                }
+            } else {
+                log.debug("SymmetricBindingBuilder: Security header is NULL");
+            }
+            log.debug("SymmetricBindingBuilder: Build completed successfully");
+        }
         log.debug("SymmetricBindingBuilder build invoked : DONE");
 
     }
@@ -804,32 +871,80 @@
      * @throws RampartException
      */
     private void initializeTokens(RampartMessageData rmd) throws RampartException {
-        
+
+        if (log.isDebugEnabled()) {
+            String timestamp = java.time.LocalDateTime.now().format(java.time.format.DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss.SSS"));
+            log.debug("=== SYMMETRICBINDINGBUILDER: initializeTokens ===");
+            log.debug("initializeTokens TIMESTAMP: " + timestamp);
+        }
+
         RampartPolicyData rpd = rmd.getPolicyData();
-        
+
         MessageContext msgContext = rmd.getMsgContext();
+        if (log.isDebugEnabled()) {
+            log.debug("initializeTokens: isSymmetricBinding = " + rpd.isSymmetricBinding());
+            log.debug("initializeTokens: isServerSide = " + msgContext.isServerSide());
+            log.debug("initializeTokens: Action = " + (msgContext.getOptions() != null ? msgContext.getOptions().getAction() : "null"));
+
+            // Check for custom issued token
+            Object customTokenId = msgContext.getProperty("customIssuedToken");
+            log.debug("initializeTokens: Custom issued token = " + customTokenId);
+        }
+
         if(rpd.isSymmetricBinding() && !msgContext.isServerSide()) {
             if (log.isDebugEnabled()) {
+                log.debug("initializeTokens: Processing symmetric binding client-side");
+            }
+            if (log.isDebugEnabled()) {
                 log.debug("Processing symmetric binding: " +
                         "Setting up encryption token and signature token");
             }
             //Setting up encryption token and signature token
-            
+
             Token sigTok = rpd.getSignatureToken();
             Token encrTok = rpd.getEncryptionToken();
+
+            if (log.isDebugEnabled()) {
+                log.debug("initializeTokens: SignatureToken type = " + (sigTok != null ? sigTok.getClass().getSimpleName() : "null"));
+                log.debug("initializeTokens: EncryptionToken type = " + (encrTok != null ? encrTok.getClass().getSimpleName() : "null"));
+            }
+
             if(sigTok instanceof IssuedToken) {
-                log.debug("SignatureToken is an IssuedToken");
+                if (log.isDebugEnabled()) {
+                    log.debug("initializeTokens: SignatureToken is an IssuedToken");
+                    log.debug("initializeTokens: Current IssuedSignatureTokenId = " + rmd.getIssuedSignatureTokenId());
+                }
+
                 if(rmd.getIssuedSignatureTokenId() == null) {
-                    log.debug("No Issuedtoken found, requesting a new token");
+                    if (log.isDebugEnabled()) {
+                        log.debug("initializeTokens: No existing issued token found, requesting a new token");
+                    }
 
                     IssuedToken issuedToken = (IssuedToken)sigTok;
-                    
-                    String id = RampartUtil.getIssuedToken(rmd, 
-                            issuedToken);
-                    rmd.setIssuedSignatureTokenId(id);
-                    
+                    if (log.isDebugEnabled()) {
+                        log.debug("initializeTokens: About to call RampartUtil.getIssuedToken()");
+                    }
+
+                    try {
+                        String id = RampartUtil.getIssuedToken(rmd, issuedToken);
+                        if (log.isDebugEnabled()) {
+                            log.debug("initializeTokens: RampartUtil.getIssuedToken() returned id = " + id);
+                        }
+                        rmd.setIssuedSignatureTokenId(id);
+                        if (log.isDebugEnabled()) {
+                            log.debug("initializeTokens: Set IssuedSignatureTokenId = " + id);
+                        }
+                    } catch (Exception e) {
+                        log.error("initializeTokens: ERROR in getIssuedToken: " + e.getMessage(), e);
+                        throw e;
+                    }
+
+                } else {
+                    if (log.isDebugEnabled()) {
+                        log.debug("initializeTokens: Using existing IssuedSignatureTokenId = " + rmd.getIssuedSignatureTokenId());
+                    }
                 }
-                
+
             } else if(sigTok instanceof SecureConversationToken) {
 
                 log.debug("SignatureToken is a SecureConversationToken");
diff --git a/modules/rampart-core/src/main/java/org/apache/rampart/builder/TransportBindingBuilder.java b/modules/rampart-core/src/main/java/org/apache/rampart/builder/TransportBindingBuilder.java
index 4ab54e4..5e37596 100644
--- a/modules/rampart-core/src/main/java/org/apache/rampart/builder/TransportBindingBuilder.java
+++ b/modules/rampart-core/src/main/java/org/apache/rampart/builder/TransportBindingBuilder.java
@@ -73,11 +73,15 @@
     	if(tlog.isDebugEnabled()){
     		t1 = System.currentTimeMillis();
     	}
-        
+
         RampartPolicyData rpd = rmd.getPolicyData();
-        
+
         if (rpd.isIncludeTimestamp()) {
+            log.info("TransportBindingBuilder: Adding timestamp");
         	addTimestamp(rmd);
+            log.info("TransportBindingBuilder: Timestamp added successfully");
+        } else {
+            log.info("TransportBindingBuilder: No timestamp required");
         }
        
         /*
@@ -164,7 +168,9 @@
         } else {
             addSignatureConfirmation(rmd, null);
         }
-        
+
+        log.debug("TransportBindingBuilder: Build completed successfully");
+
     	if(tlog.isDebugEnabled()){
     		t1 = System.currentTimeMillis();
     		tlog.debug("Transport binding build took "+ (t1 - t0));
diff --git a/modules/rampart-core/src/main/java/org/apache/rampart/handler/RampartReceiver.java b/modules/rampart-core/src/main/java/org/apache/rampart/handler/RampartReceiver.java
index 3b8d0a4..4703de2 100644
--- a/modules/rampart-core/src/main/java/org/apache/rampart/handler/RampartReceiver.java
+++ b/modules/rampart-core/src/main/java/org/apache/rampart/handler/RampartReceiver.java
@@ -79,9 +79,20 @@
     }
 
     public InvocationResponse invoke(MessageContext msgContext) throws AxisFault {
-        
+
+        if (mlog.isDebugEnabled()) {
+            String timestamp = java.time.LocalDateTime.now().format(java.time.format.DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss.SSS"));
+            mlog.debug("=== RAMPARTRECEIVER: Processing incoming request ===");
+            mlog.debug("RampartReceiver TIMESTAMP: " + timestamp);
+            mlog.debug("RampartReceiver: Action = " + (msgContext.getOptions() != null ? msgContext.getOptions().getAction() : "null"));
+            mlog.debug("RampartReceiver: To = " + (msgContext.getOptions() != null ? msgContext.getOptions().getTo() : "null"));
+        }
+
         if (!msgContext.isEngaged(WSSHandlerConstants.SECURITY_MODULE_NAME)) {
-          return InvocationResponse.CONTINUE;        
+            if (mlog.isDebugEnabled()) {
+                mlog.debug("RampartReceiver: Security module not engaged, continuing");
+            }
+            return InvocationResponse.CONTINUE;
         }
         
         if(mlog.isDebugEnabled()){
@@ -89,16 +100,50 @@
                     + msgContext.getEnvelope());
         }
         
+        if(mlog.isDebugEnabled()){
+            mlog.debug("RampartReceiver: Processing incoming message");
+            mlog.debug("RampartReceiver: Action = " + msgContext.getOptions().getAction());
+            mlog.debug("RampartReceiver: To = " + msgContext.getOptions().getTo());
+            mlog.debug("RampartReceiver: Message flow = " + (msgContext.getFLOW() == MessageContext.IN_FLOW ? "IN_FLOW" :
+                                                                     msgContext.getFLOW() == MessageContext.OUT_FLOW ? "OUT_FLOW" :
+                                                                     msgContext.getFLOW() == MessageContext.IN_FAULT_FLOW ? "IN_FAULT_FLOW" :
+                                                                     msgContext.getFLOW() == MessageContext.OUT_FAULT_FLOW ? "OUT_FAULT_FLOW" : "UNKNOWN"));
+            try {
+                mlog.debug("RampartReceiver: Incoming envelope:");
+                mlog.debug(msgContext.getEnvelope().toString());
+            } catch (Exception e) {
+                mlog.debug("RampartReceiver: Could not log envelope: " + e.getMessage());
+            }
+        }
+
         RampartEngine engine = new RampartEngine();
         List<WSSecurityEngineResult> wsResult = null;
         try {
+            if(mlog.isDebugEnabled()){
+                mlog.debug("RampartReceiver: About to call RampartEngine.process()");
+            }
             wsResult = engine.process(msgContext);
+            if(mlog.isDebugEnabled()){
+                mlog.debug("RampartReceiver: RampartEngine.process() completed successfully");
+            }
             
         } catch (WSSecurityException e) {
+            if(mlog.isDebugEnabled()){
+                mlog.debug("RampartReceiver: WSSecurityException in RampartEngine.process(): " + e.getMessage());
+                e.printStackTrace();
+            }
             setFaultCodeAndThrowAxisFault(msgContext, e);
         } catch (WSSPolicyException e) {
+            if(mlog.isDebugEnabled()){
+                mlog.debug("RampartReceiver: WSSPolicyException in RampartEngine.process(): " + e.getMessage());
+                e.printStackTrace();
+            }
             setFaultCodeAndThrowAxisFault(msgContext, e);
         } catch (RampartException e) {
+            if(mlog.isDebugEnabled()){
+                mlog.debug("RampartReceiver: RampartException in RampartEngine.process(): " + e.getMessage());
+                e.printStackTrace();
+            }
             setFaultCodeAndThrowAxisFault(msgContext, e);
         } 
         
diff --git a/modules/rampart-core/src/main/java/org/apache/rampart/util/RampartUtil.java b/modules/rampart-core/src/main/java/org/apache/rampart/util/RampartUtil.java
index 5f8cc5b..9bf2a2e 100644
--- a/modules/rampart-core/src/main/java/org/apache/rampart/util/RampartUtil.java
+++ b/modules/rampart-core/src/main/java/org/apache/rampart/util/RampartUtil.java
@@ -1673,74 +1673,121 @@
      * @return boolean true if a security header is required in the incoming message
      */
     public static boolean isSecHeaderRequired(RampartPolicyData rpd, boolean initiator, boolean inflow ) {
-        
+
+        if (log.isDebugEnabled()) {
+            String timestamp = java.time.LocalDateTime.now().format(java.time.format.DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss.SSS"));
+            log.debug("RampartUtil.isSecHeaderRequired TIMESTAMP: " + timestamp);
+            log.debug("RampartUtil.isSecHeaderRequired: initiator=" + initiator + ", inflow=" + inflow);
+        }
+
         // Checking for time stamp
         if ( rpd.isIncludeTimestamp() ) {
+            if (log.isDebugEnabled()) {
+                log.debug("RampartUtil.isSecHeaderRequired: TRUE - timestamp required");
+            }
             return true;
-        } 
-        
-        // Checking for signed parts and elements
-        if (rpd.isSignBody() || rpd.getSignedParts().size() != 0 || 
-                                    rpd.getSignedElements().size() != 0) {
-            return true;
+        } else {
+            if (log.isDebugEnabled()) {
+                log.debug("RampartUtil.isSecHeaderRequired: No timestamp required");
+            }
         }
-        
-        // Checking for encrypted parts and elements
-        if (rpd.isEncryptBody() || rpd.getEncryptedParts().size() != 0 || 
-                                    rpd.getEncryptedElements().size() != 0 ) {
+
+        // Checking for signed parts and elements
+        if (rpd.isSignBody() || rpd.getSignedParts().size() != 0 ||
+                                    rpd.getSignedElements().size() != 0) {
+            if (log.isDebugEnabled()) {
+                log.debug("RampartUtil.isSecHeaderRequired: TRUE - signing required (signBody=" + rpd.isSignBody() +
+                          ", signedParts=" + rpd.getSignedParts().size() + ", signedElements=" + rpd.getSignedElements().size() + ")");
+            }
             return true;
-        }   
-        
+        } else {
+            log.debug("RampartUtil.isSecHeaderRequired: No signing required");
+        }
+
+        // Checking for encrypted parts and elements
+        if (rpd.isEncryptBody() || rpd.getEncryptedParts().size() != 0 ||
+                                    rpd.getEncryptedElements().size() != 0 ) {
+            log.debug("RampartUtil.isSecHeaderRequired: TRUE - encryption required (encryptBody=" + rpd.isEncryptBody() +
+                      ", encryptedParts=" + rpd.getEncryptedParts().size() + ", encryptedElements=" + rpd.getEncryptedElements().size() + ")");
+            return true;
+        } else {
+            log.debug("RampartUtil.isSecHeaderRequired: No encryption required");
+        }
+
         // Checking for supporting tokens
         SupportingToken supportingTokens;
-        
-        if (!initiator && inflow || initiator && !inflow ) {
-        
+
+        boolean supportingTokenCondition = (!initiator && inflow) || (initiator && !inflow);
+        log.debug("RampartUtil.isSecHeaderRequired: Supporting token condition (" + supportingTokenCondition + ") = (!initiator && inflow) || (initiator && !inflow) = " +
+                  "(!" + initiator + " && " + inflow + ") || (" + initiator + " && !" + inflow + ")");
+
+        if (supportingTokenCondition) {
+
             List<SupportingToken> supportingToks = rpd.getSupportingTokensList();
+            log.debug("RampartUtil.isSecHeaderRequired: SupportingTokensList size = " + (supportingToks != null ? supportingToks.size() : "null"));
             for (SupportingToken supportingTok : supportingToks) {
                 if (supportingTok != null && supportingTok.getTokens().size() != 0) {
+                    log.debug("RampartUtil.isSecHeaderRequired: TRUE - supporting tokens found");
                     return true;
                 }
             }
-            
+
             supportingTokens = rpd.getSignedSupportingTokens();
             if (supportingTokens != null && supportingTokens.getTokens().size() != 0) {
+                log.debug("RampartUtil.isSecHeaderRequired: TRUE - signed supporting tokens found");
                 return true;
             }
-            
+
             supportingTokens = rpd.getEndorsingSupportingTokens();
             if (supportingTokens != null && supportingTokens.getTokens().size() != 0) {
+                log.debug("RampartUtil.isSecHeaderRequired: TRUE - endorsing supporting tokens found");
                 return true;
             }
-            
+
             supportingTokens = rpd.getSignedEndorsingSupportingTokens();
             if (supportingTokens != null && supportingTokens.getTokens().size() != 0) {
+                log.debug("RampartUtil.isSecHeaderRequired: TRUE - signed endorsing supporting tokens found");
                 return true;
             }
-       
+
             supportingTokens = rpd.getEncryptedSupportingTokens();
             if (supportingTokens != null && supportingTokens.getTokens().size() != 0) {
+                log.debug("RampartUtil.isSecHeaderRequired: TRUE - encrypted supporting tokens found");
                 return true;
             }
-            
+
             supportingTokens = rpd.getSignedEncryptedSupportingTokens();
             if (supportingTokens != null && supportingTokens.getTokens().size() != 0) {
+                log.debug("RampartUtil.isSecHeaderRequired: TRUE - signed encrypted supporting tokens found");
                 return true;
             }
-            
+
             supportingTokens = rpd.getEndorsingEncryptedSupportingTokens();
             if (supportingTokens != null && supportingTokens.getTokens().size() != 0) {
+                log.debug("RampartUtil.isSecHeaderRequired: TRUE - endorsing encrypted supporting tokens found");
                 return true;
             }
-            
+
             supportingTokens = rpd.getSignedEndorsingEncryptedSupportingTokens();
             if (supportingTokens != null && supportingTokens.getTokens().size() != 0) {
+                log.debug("RampartUtil.isSecHeaderRequired: TRUE - signed endorsing encrypted supporting tokens found");
                 return true;
             }
+
+            log.debug("RampartUtil.isSecHeaderRequired: No supporting tokens found despite condition being true");
+        } else {
+            log.debug("RampartUtil.isSecHeaderRequired: Supporting token condition is false, skipping token checks");
         }
-        
+
+        if (log.isDebugEnabled()) {
+            log.debug("RampartUtil.isSecHeaderRequired: FALSE - no security header requirements found");
+            log.debug("RampartUtil: includeTimestamp = " + rpd.isIncludeTimestamp());
+            log.debug("RampartUtil: signBody = " + rpd.isSignBody());
+            log.debug("RampartUtil: signedParts.size = " + rpd.getSignedParts().size());
+            log.debug("RampartUtil: signedElements.size = " + rpd.getSignedElements().size());
+        }
         return false;
-        
+
     }
 
     public static void handleEncryptedSignedHeaders(List<WSEncryptionPart> encryptedParts,
diff --git a/modules/rampart-core/src/main/resources/org/apache/rampart/errors.properties b/modules/rampart-core/src/main/resources/org/apache/rampart/errors.properties
index 1231c2c..cf5ed2b 100644
--- a/modules/rampart-core/src/main/resources/org/apache/rampart/errors.properties
+++ b/modules/rampart-core/src/main/resources/org/apache/rampart/errors.properties
@@ -69,7 +69,7 @@
 noSecurityResults= No security processing results from the incoming message
 missingEncryptedKeyInRequest=There was no EncryptedKey in the request message
 rampartConigMissing = Please include configured RampartConfiguration assertion in policy
-missingSecurityHeader = Missing wsse:Security header in request
+missingSecurityHeader = Unable to locate or process wsse:Security header in request (header may be missing, malformed, or processing failed due to configuration/dependency issues)
 missingSOAPHeader = SOAP header missing
 clientAuthRequired= Service requires SSL mutual authentication
 
diff --git a/modules/rampart-integration/src/test/resources/log4j.properties b/modules/rampart-integration/src/test/resources/log4j.properties
deleted file mode 100644
index b81a5b4..0000000
--- a/modules/rampart-integration/src/test/resources/log4j.properties
+++ /dev/null
@@ -1,31 +0,0 @@
-#

-# Licensed to the Apache Software Foundation (ASF) under one

-# or more contributor license agreements. See the NOTICE file

-# distributed with this work for additional information

-# regarding copyright ownership. The ASF 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

-#

-# 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.

-#

-

-log4j.rootCategory=ERROR, CONSOLE

-

-log4j.appender.CONSOLE=org.apache.log4j.ConsoleAppender

-log4j.appender.CONSOLE.layout=org.apache.log4j.PatternLayout

-log4j.appender.CONSOLE.layout.ConversionPattern=%d %-5p %c - %m%n

-

-log4j.appender.JETTY=org.apache.log4j.ConsoleAppender

-log4j.appender.JETTY.layout=org.apache.log4j.PatternLayout

-log4j.appender.JETTY.layout.ConversionPattern=[%C{1}] - %m%n

-

-log4j.category.org.apache.axis2.integration.JettyServer=INFO, JETTY

-log4j.additivity.org.apache.axis2.integration.JettyServer = false

diff --git a/modules/rampart-samples/README.txt b/modules/rampart-samples/README.txt
index 6a3d376..d0b8b7b 100644
--- a/modules/rampart-samples/README.txt
+++ b/modules/rampart-samples/README.txt
@@ -12,10 +12,19 @@
     - keys   - The keystore files that contains the keys used by the samples
 
 Please use Apache Ant with the build.xml file available in the top level directory
-to copy all jars and mars to required places.
+to copy all jars and mars to required places. Simply execute the ant command with 
+no arguments.
 
-    - Please copy log4j.jar to AXIS2_HOME/lib directory before trying out samples.
+AXIS2_HOME must be set as an environment variable for the ant command to copy the 
+Rampart jars to AXIS2_HOME/lib. 
 
-    - Please follow the instructions on endorsing the default JAXP implementation
-      available in README.txt of this distribution before invoking 
-      Sample 08.(Issuing a SAML 2.0 Token)
+The policy samples each have an Ant target for both the client and server 
+(SimpleHTTPServer from the Axis2 test suite) i.e. they need to run in separate shells from the samples dir. 
+
+For example, in one shell (repeat for samples 1-9): 
+
+ant -buildfile policy/build.xml service.01
+
+Then in another shell:
+
+ant -buildfile policy/build.xml client.01
diff --git a/modules/rampart-samples/policy/build.xml b/modules/rampart-samples/policy/build.xml
index ec42927..ff60ff1 100644
--- a/modules/rampart-samples/policy/build.xml
+++ b/modules/rampart-samples/policy/build.xml
@@ -32,18 +32,22 @@
 	<property name="sample.services.url" value="http://localhost:${client.port}/axis2/services"/>
 	
     <property environment="env"/>
-    
+
     <property name="lib.dir" value="${env.AXIS2_HOME}/lib"/>
-    
+
     <property name="vmargs" value=""/>
-    
+
     <path id="runtime.classpath">
         <fileset dir="${lib.dir}">
             <include name="**/*.jar"/>
         </fileset>
+        <!-- Include distribution lib directory if it exists (when running from distribution) -->
+        <fileset dir="../../lib" erroronmissingdir="false">
+            <include name="**/*.jar"/>
+        </fileset>
         <pathelement location="${env.AXIS2_HOME}/conf"/>
     </path>
-    
+
 	<target name="check.dependency" unless="env.AXIS2_HOME">
         <echo message="AXIS2_HOME must be set"/>
     </target>
diff --git a/modules/rampart-samples/policy/sample01/README.txt b/modules/rampart-samples/policy/sample01/README.txt
index dd87594..ba14876 100644
--- a/modules/rampart-samples/policy/sample01/README.txt
+++ b/modules/rampart-samples/policy/sample01/README.txt
@@ -13,6 +13,13 @@
 If you uncomment this and deploy the service you will see the following error message :
 org.apache.axis2.AxisFault: Expected transport is "https" but incoming transport found : "http"
 
-You can find a complete tutorial on transport level
-security here:
-http://wso2.org/library/3190
\ No newline at end of file
+For more information on transport level security with Apache Rampart,
+please refer to:
+- Apache Rampart Quick Start Guide: ../../../src/site/xdoc/quick-start.xml
+- Apache Rampart Configuration Guide: ../../../src/site/xdoc/rampartconfig-guide.xml
+
+The original WSO2 tutorial (http://wso2.org/library/3190) is no longer available at that URL.
+For current WSO2 documentation that may contain similar content, check:
+- WSO2 Documentation: https://wso2.com/documentation/
+- WSO2 Technical Docs: https://docs.wso2.com/
+- WSO2 GitHub: https://github.com/wso2
\ No newline at end of file
diff --git a/modules/rampart-samples/policy/sample05/README.txt b/modules/rampart-samples/policy/sample05/README.txt
index 3093c68..cb6ad6e 100644
--- a/modules/rampart-samples/policy/sample05/README.txt
+++ b/modules/rampart-samples/policy/sample05/README.txt
@@ -3,9 +3,12 @@
 When using this sample with the TCPMon to monitor the soap messages, you have to use the 
 correct URL in the client code before build the sample 05.
 
-There is a known bug in OpenSAML-1.1.jar, which is used for implementing SAML 1.1 support in Rampart.
-So before you run this sample, please download the patched OpenSAML jar from here[1], and replace it 
-with the OpenSAML-1.1.jar in your $AXIS2_HOME/lib.
+This sample demonstrates WS-Trust RST (Request Security Token) for issuing SAML tokens.
 
-[1] - http://dist.wso2.org/maven2/opensaml/opensaml/1.1.406/opensaml-1.1.406.jar  
+Note: This sample now uses OpenSAML 4.3.2 which is included with the current Rampart distribution.
+The historical reference to OpenSAML 1.1.406 from WSO2's Maven repository is no longer needed
+as the OpenSAML library has been significantly updated and the old bug has been resolved.
+
+For current OpenSAML documentation, please refer to:
+- OpenSAML Documentation: https://wiki.shibboleth.net/confluence/display/OS30/Home  
 
diff --git a/modules/rampart-samples/policy/sample05/src/org/apache/rampart/samples/policy/sample05/Client.java b/modules/rampart-samples/policy/sample05/src/org/apache/rampart/samples/policy/sample05/Client.java
index a40f96b..7857f13 100644
--- a/modules/rampart-samples/policy/sample05/src/org/apache/rampart/samples/policy/sample05/Client.java
+++ b/modules/rampart-samples/policy/sample05/src/org/apache/rampart/samples/policy/sample05/Client.java
@@ -43,6 +43,26 @@
 
 import javax.xml.namespace.QName;
 
+/*
+  sample 05 uses SAML token processing, unlike others such as sample 01 that uses username token processing
+
+  1. Unit Tests that use Sample05, use in-memory objects, minimal XML marshalling → only Builder required
+  2. Sample05: Full end-to-end SAML token creation with XML marshalling → Both builder AND marshaller required
+
+  Sample05 calls this path:
+  1. Client requests SAML token from STS
+  2. → SAMLTokenIssuer.createAttributeAssertion()
+  3. → CommonUtil.getSymmetricKeyBasedKeyInfo()
+  4. → SAMLUtils.createEncryptedKey()
+  5. → CommonUtil.buildXMLObject(SecurityTokenReference.ELEMENT_NAME)
+  6. → OpenSAML tries to marshall the SecurityTokenReference to actual XML
+
+  In the unit test, when KeyInfo is marshalled, OpenSAML handles the EncryptedKey as a
+  child element and doesn't require the SecurityTokenReference to be independently
+  marshallable. However, in sample05's STS token issuance process, the
+  SecurityTokenReference objects need to be marshalled as standalone elements in the XML security header.
+
+*/
 public class Client {
 
 	public static void main(String[] args) throws Exception {
@@ -51,35 +71,46 @@
 			System.out.println("Usage: $java Client endpoint_address client_repo_path policy_xml_path");
 		}
 
-		ConfigurationContext ctx = ConfigurationContextFactory.createConfigurationContextFromFileSystem(args[1], null);		
-		
-		STSClient stsClient = new STSClient(ctx);		
-		
+		ConfigurationContext ctx = ConfigurationContextFactory.createConfigurationContextFromFileSystem(args[1], null);
+
+		STSClient stsClient = new STSClient(ctx);
+
 		stsClient.setRstTemplate(getRSTTemplate());
 		String action = TrustUtil.getActionValue(RahasConstants.VERSION_05_02, RahasConstants.RST_ACTION_ISSUE);
 		stsClient.setAction(action);
-		
-		Token responseToken = stsClient.requestSecurityToken(loadPolicy("sample05/policy.xml"), new URL(new URL(args[0]), "/axis2/services/STS").toString(), loadPolicy("sample05/sts_policy.xml"), null);
-		
+
+		// Use the policy file path passed as argument
+		String policyPath = args[2];
+		String stsPolicyPath = policyPath.replace("policy.xml", "sts_policy.xml");
+
+		String stsUrl = new URL(new URL(args[0]), "/axis2/services/STS").toString();
+
+		Token responseToken = stsClient.requestSecurityToken(loadPolicy(policyPath), stsUrl, loadPolicy(stsPolicyPath), null);
+
 	        System.out.println("\n############################# Requested Token ###################################\n");
 	        System.out.println(responseToken.getToken().toString());
-		
+	        System.out.println("Token successfully received! Token ID: " + responseToken.getId());
+
 	        TokenStorage store = TrustUtil.getTokenStore(ctx);
 	        store.add(responseToken);
-		
-		
+
 	        ServiceClient client = new ServiceClient(ctx, null);
-		
+
 	        Options options = new Options();
 	        options.setAction("urn:echo");
 	        options.setTo(new EndpointReference(args[0]));
-	        options.setProperty(RampartMessageData.KEY_RAMPART_POLICY,  loadPolicy("sample05/policy.xml"));
+	        // Force SOAP 1.2 to match STS call
+	        options.setSoapVersionURI(org.apache.axiom.soap.SOAP12Constants.SOAP_ENVELOPE_NAMESPACE_URI);
+
+	        Policy servicePolicy = loadPolicy(policyPath);
+	        options.setProperty(RampartMessageData.KEY_RAMPART_POLICY, servicePolicy);
 	        options.setProperty(RampartMessageData.KEY_CUSTOM_ISSUED_TOKEN, responseToken.getId());
+
 	        client.setOptions(options);
-	        
+
 	        client.engageModule("addressing");
                 client.engageModule("rampart");
-                
+
                 OMElement response = client.sendReceive(getPayload("Hello world1"));
                 System.out.println("Response  : " + response);
 	        
@@ -87,8 +118,15 @@
 	}
 
 	private static Policy loadPolicy(String xmlPath) throws Exception {
+		java.io.File policyFile = new java.io.File(xmlPath);
+
+		if (!policyFile.exists()) {
+			throw new Exception("Policy file not found: " + xmlPath);
+		}
+
         OMXMLParserWrapper builder = OMXMLBuilderFactory.createOMBuilder(new FileInputStream(xmlPath));
-		return PolicyEngine.getPolicy(builder.getDocumentElement());
+        Policy policy = PolicyEngine.getPolicy(builder.getDocumentElement());
+		return policy;
 	}
 	
     private static OMElement getSAMLToken(OMElement resp) {
diff --git a/modules/rampart-tests/test-resources/log4j.properties b/modules/rampart-tests/test-resources/log4j.properties
deleted file mode 100644
index 8a80313..0000000
--- a/modules/rampart-tests/test-resources/log4j.properties
+++ /dev/null
@@ -1,25 +0,0 @@
-#

-# Licensed to the Apache Software Foundation (ASF) under one

-# or more contributor license agreements. See the NOTICE file

-# distributed with this work for additional information

-# regarding copyright ownership. The ASF 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

-#

-# 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.

-#

-

-log4j.rootCategory=ERROR, CONSOLE

-

-log4j.appender.CONSOLE=org.apache.log4j.ConsoleAppender

-log4j.appender.CONSOLE.layout=org.apache.log4j.PatternLayout

-log4j.appender.CONSOLE.layout.ConversionPattern=%d %-5p %c - %m%n

-

diff --git a/modules/rampart-trust/pom.xml b/modules/rampart-trust/pom.xml
index 346a166..7228cd5 100644
--- a/modules/rampart-trust/pom.xml
+++ b/modules/rampart-trust/pom.xml
@@ -60,11 +60,6 @@
         </dependency>
         <dependency>
             <groupId>org.apache.wss4j</groupId>
-            <artifactId>wss4j</artifactId>
-            <type>pom</type>
-        </dependency>
-        <dependency>
-            <groupId>org.apache.wss4j</groupId>
             <artifactId>wss4j-ws-security-common</artifactId>
         </dependency>
         <dependency>
diff --git a/modules/rampart-trust/src/main/java/org/apache/rahas/impl/util/CommonUtil.java b/modules/rampart-trust/src/main/java/org/apache/rahas/impl/util/CommonUtil.java
index 77f6bf7..c95fbd0 100644
--- a/modules/rampart-trust/src/main/java/org/apache/rahas/impl/util/CommonUtil.java
+++ b/modules/rampart-trust/src/main/java/org/apache/rahas/impl/util/CommonUtil.java
@@ -47,7 +47,11 @@
 import org.opensaml.core.xml.XMLObjectBuilderFactory;
 import org.opensaml.core.xml.config.XMLObjectProviderRegistrySupport;
 import org.opensaml.soap.wssecurity.KeyIdentifier;
+import org.opensaml.soap.wssecurity.SecurityTokenReference;
 import org.opensaml.soap.wssecurity.impl.SecurityTokenReferenceBuilder;
+import org.opensaml.soap.wssecurity.impl.SecurityTokenReferenceMarshaller;
+import org.opensaml.soap.wssecurity.impl.KeyIdentifierBuilder;
+import org.opensaml.soap.wssecurity.impl.KeyIdentifierMarshaller;
 import org.opensaml.saml.common.SAMLObjectBuilder;
 import org.opensaml.xmlsec.encryption.EncryptedKey;
 import org.opensaml.xmlsec.signature.KeyInfo;
@@ -362,12 +366,70 @@
      */
     public static XMLObject buildXMLObject(QName objectQName) throws TrustException {
 
+        if (log.isDebugEnabled()) {
+            String timestamp = java.time.LocalDateTime.now().format(java.time.format.DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss.SSS"));
+            log.debug("CommonUtil.buildXMLObject TIMESTAMP: " + timestamp);
+            log.debug("CommonUtil.buildXMLObject() starting on QName: " + objectQName);
+        }
         log.debug("buildXMLObject() is starting on QName: " + objectQName);
         XMLObjectBuilderFactory builderFactory = XMLObjectProviderRegistrySupport.getBuilderFactory();
+
+        // CRITICAL FIX: Proactively register both builders to prevent WSS4J ClassCastExceptions
+        // This ensures builders are available for all WSS4J operations, not just explicit requests
+        if (builderFactory.getBuilder(KeyIdentifier.ELEMENT_NAME) == null) {
+            builderFactory.registerBuilder(KeyIdentifier.ELEMENT_NAME, new KeyIdentifierBuilder());
+            if (log.isDebugEnabled()) {
+                log.debug("CommonUtil: Proactively registered KeyIdentifierBuilder");
+            }
+            org.opensaml.core.xml.io.MarshallerFactory marshallerFactory = XMLObjectProviderRegistrySupport.getMarshallerFactory();
+            marshallerFactory.registerMarshaller(KeyIdentifier.ELEMENT_NAME, new KeyIdentifierMarshaller());
+            if (log.isDebugEnabled()) {
+                log.debug("CommonUtil: Proactively registered KeyIdentifierMarshaller");
+            }
+        }
+
+        if (builderFactory.getBuilder(SecurityTokenReference.ELEMENT_NAME) == null) {
+            builderFactory.registerBuilder(SecurityTokenReference.ELEMENT_NAME, new SecurityTokenReferenceBuilder());
+            if (log.isDebugEnabled()) {
+                log.debug("CommonUtil: Proactively registered SecurityTokenReferenceBuilder");
+            }
+            org.opensaml.core.xml.io.MarshallerFactory marshallerFactory = XMLObjectProviderRegistrySupport.getMarshallerFactory();
+            marshallerFactory.registerMarshaller(SecurityTokenReference.ELEMENT_NAME, new SecurityTokenReferenceMarshaller());
+            if (log.isDebugEnabled()) {
+                log.debug("CommonUtil: Proactively registered SecurityTokenReferenceMarshaller");
+            }
+        }
         if (builderFactory.getBuilder(objectQName) == null) {
             if (KeyIdentifier.ELEMENT_NAME == objectQName) {
-                builderFactory.registerBuilder(KeyIdentifier.ELEMENT_NAME, new SecurityTokenReferenceBuilder());
-                log.warn("An opensaml SecurityTokenReferenceBuilder was added to the opensaml registry for QName key: " + KeyIdentifier.ELEMENT_NAME);
+                builderFactory.registerBuilder(KeyIdentifier.ELEMENT_NAME, new KeyIdentifierBuilder());
+                if (log.isDebugEnabled()) {
+                    log.debug("CommonUtil: Registered KeyIdentifierBuilder for " + KeyIdentifier.ELEMENT_NAME);
+                }
+                log.warn("An opensaml KeyIdentifierBuilder was added to the opensaml registry for QName key: " + KeyIdentifier.ELEMENT_NAME);
+
+                // Also register the marshaller
+                org.opensaml.core.xml.io.MarshallerFactory marshallerFactory = XMLObjectProviderRegistrySupport.getMarshallerFactory();
+                marshallerFactory.registerMarshaller(KeyIdentifier.ELEMENT_NAME, new KeyIdentifierMarshaller());
+                if (log.isDebugEnabled()) {
+                    log.debug("CommonUtil: Registered KeyIdentifierMarshaller for " + KeyIdentifier.ELEMENT_NAME);
+                }
+                log.warn("An opensaml KeyIdentifierMarshaller was added to the opensaml registry for QName key: " + KeyIdentifier.ELEMENT_NAME);
+
+            } else if (SecurityTokenReference.ELEMENT_NAME == objectQName) {
+                builderFactory.registerBuilder(SecurityTokenReference.ELEMENT_NAME, new SecurityTokenReferenceBuilder());
+                if (log.isDebugEnabled()) {
+                    log.debug("CommonUtil: Registered SecurityTokenReferenceBuilder for " + SecurityTokenReference.ELEMENT_NAME);
+                }
+                log.warn("An opensaml SecurityTokenReferenceBuilder was added to the opensaml registry for QName key: " + SecurityTokenReference.ELEMENT_NAME);
+
+                // Also register the marshaller
+                org.opensaml.core.xml.io.MarshallerFactory marshallerFactory = XMLObjectProviderRegistrySupport.getMarshallerFactory();
+                marshallerFactory.registerMarshaller(SecurityTokenReference.ELEMENT_NAME, new SecurityTokenReferenceMarshaller());
+                if (log.isDebugEnabled()) {
+                    log.debug("CommonUtil: Registered SecurityTokenReferenceMarshaller for " + SecurityTokenReference.ELEMENT_NAME);
+                }
+                log.warn("An opensaml SecurityTokenReferenceMarshaller was added to the opensaml registry for QName key: " + SecurityTokenReference.ELEMENT_NAME);
+
             } else {
                 log.error("No opensaml builders found for QName key: " + objectQName);
             }
diff --git a/modules/rampart-trust/src/test/resources/log4j.properties b/modules/rampart-trust/src/test/resources/log4j.properties
deleted file mode 100644
index 8a80313..0000000
--- a/modules/rampart-trust/src/test/resources/log4j.properties
+++ /dev/null
@@ -1,25 +0,0 @@
-#

-# Licensed to the Apache Software Foundation (ASF) under one

-# or more contributor license agreements. See the NOTICE file

-# distributed with this work for additional information

-# regarding copyright ownership. The ASF 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

-#

-# 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.

-#

-

-log4j.rootCategory=ERROR, CONSOLE

-

-log4j.appender.CONSOLE=org.apache.log4j.ConsoleAppender

-log4j.appender.CONSOLE.layout=org.apache.log4j.PatternLayout

-log4j.appender.CONSOLE.layout.ConversionPattern=%d %-5p %c - %m%n

-

diff --git a/pom.xml b/pom.xml
index 5af951e..7c5791d 100644
--- a/pom.xml
+++ b/pom.xml
@@ -518,24 +518,27 @@
             <!-- Other Rampart Dependencies -->
             <dependency>
                 <groupId>org.apache.wss4j</groupId>
-                <artifactId>wss4j</artifactId>
-                <version>${wss4j.version}</version>
-                <type>pom</type>
-            </dependency>
-            <dependency>
-                <groupId>org.apache.wss4j</groupId>
                 <artifactId>wss4j-ws-security-common</artifactId>
                 <version>${wss4j.version}</version>
+                <scope>compile</scope>
             </dependency>
             <dependency>
                 <groupId>org.apache.wss4j</groupId>
                 <artifactId>wss4j-ws-security-dom</artifactId>
                 <version>${wss4j.version}</version>
+                <scope>compile</scope>
             </dependency>
             <dependency>
                 <groupId>org.apache.wss4j</groupId>
                 <artifactId>wss4j-policy</artifactId>
                 <version>${wss4j.version}</version>
+                <scope>compile</scope>
+            </dependency>
+            <dependency>
+                <groupId>org.apache.wss4j</groupId>
+                <artifactId>wss4j-bindings</artifactId>
+                <version>${wss4j.version}</version>
+                <scope>compile</scope>
             </dependency>
             <dependency>
                 <groupId>org.bouncycastle</groupId>
@@ -549,6 +552,18 @@
             </dependency>
             <dependency>
                 <groupId>org.opensaml</groupId>
+                <artifactId>opensaml-core</artifactId>
+                <version>${opensaml.version}</version>
+                <scope>compile</scope>
+            </dependency>
+            <dependency>
+                <groupId>org.opensaml</groupId>
+                <artifactId>opensaml-saml-api</artifactId>
+                <version>${opensaml.version}</version>
+                <scope>compile</scope>
+            </dependency>
+            <dependency>
+                <groupId>org.opensaml</groupId>
                 <artifactId>opensaml-saml-impl</artifactId>
                 <version>${opensaml.version}</version>
                 <scope>compile</scope>
@@ -632,6 +647,54 @@
                 <scope>compile</scope>
             </dependency>
             <dependency>
+                <groupId>org.opensaml</groupId>
+                <artifactId>opensaml-xmlsec-api</artifactId>
+                <version>${opensaml.version}</version>
+                <scope>compile</scope>
+            </dependency>
+            <dependency>
+                <groupId>org.opensaml</groupId>
+                <artifactId>opensaml-xmlsec-impl</artifactId>
+                <version>${opensaml.version}</version>
+                <scope>compile</scope>
+            </dependency>
+            <dependency>
+                <groupId>org.opensaml</groupId>
+                <artifactId>opensaml-security-api</artifactId>
+                <version>${opensaml.version}</version>
+                <scope>compile</scope>
+            </dependency>
+            <dependency>
+                <groupId>org.opensaml</groupId>
+                <artifactId>opensaml-security-impl</artifactId>
+                <version>${opensaml.version}</version>
+                <scope>compile</scope>
+            </dependency>
+            <dependency>
+                <groupId>net.shibboleth.utilities</groupId>
+                <artifactId>java-support</artifactId>
+                <version>${shibboleth.utilities.version}</version>
+                <scope>compile</scope>
+            </dependency>
+            <dependency>
+                <groupId>net.shibboleth</groupId>
+                <artifactId>cryptography-api</artifactId>
+                <version>1.0.0</version>
+                <scope>compile</scope>
+            </dependency>
+            <dependency>
+                <groupId>io.dropwizard.metrics</groupId>
+                <artifactId>metrics-core</artifactId>
+                <version>${dropwizard.metrics.version}</version>
+                <scope>compile</scope>
+            </dependency>
+            <dependency>
+                <groupId>org.cryptacular</groupId>
+                <artifactId>cryptacular</artifactId>
+                <version>${cryptacular.version}</version>
+                <scope>compile</scope>
+            </dependency>
+            <dependency>
                 <groupId>org.apache.logging.log4j</groupId>
                 <artifactId>log4j-jul</artifactId>
                 <version>2.24.1</version>
@@ -698,6 +761,28 @@
                 <version>4.0.2</version>
             </dependency>
 
+            <!-- WSS4J dependency management -->
+            <dependency>
+                <groupId>org.apache.wss4j</groupId>
+                <artifactId>wss4j-ws-security-common</artifactId>
+                <version>${wss4j.version}</version>
+            </dependency>
+            <dependency>
+                <groupId>org.apache.wss4j</groupId>
+                <artifactId>wss4j-ws-security-dom</artifactId>
+                <version>${wss4j.version}</version>
+            </dependency>
+            <dependency>
+                <groupId>org.apache.wss4j</groupId>
+                <artifactId>wss4j-policy</artifactId>
+                <version>${wss4j.version}</version>
+            </dependency>
+            <dependency>
+                <groupId>org.apache.wss4j</groupId>
+                <artifactId>wss4j-bindings</artifactId>
+                <version>${wss4j.version}</version>
+            </dependency>
+
         </dependencies>
     </dependencyManagement>
 
@@ -762,6 +847,9 @@
 
         <wss4j.version>3.0.3</wss4j.version>
         <opensaml.version>4.3.2</opensaml.version>
+        <shibboleth.utilities.version>8.4.2</shibboleth.utilities.version>
+        <dropwizard.metrics.version>4.2.19</dropwizard.metrics.version>
+        <cryptacular.version>1.2.4</cryptacular.version>
 
         <bcprov.jdk18.version>1.79</bcprov.jdk18.version>
 
diff --git a/src/site/markdown/download.md.vm b/src/site/markdown/download.md.vm
index 32832bc..4ab1ecd 100644
--- a/src/site/markdown/download.md.vm
+++ b/src/site/markdown/download.md.vm
@@ -7,7 +7,7 @@
 ## "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
+## https://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
@@ -45,14 +45,14 @@
 
 All releases are also available as Maven artifacts in the [central repository][13].
 
-[1]: http://www.apache.org/dyn/closer.lua/axis/axis2/java/rampart/${release_version}/rampart-dist-${release_version}-bin.zip
+[1]: https://www.apache.org/dyn/closer.lua/axis/axis2/java/rampart/${release_version}/rampart-dist-${release_version}-bin.zip
 [3]: https://www.apache.org/dist/axis/axis2/java/rampart/${release_version}/rampart-dist-${release_version}-bin.zip.sha512
 [4]: https://www.apache.org/dist/axis/axis2/java/rampart/${release_version}/rampart-dist-${release_version}-bin.zip.asc
-[5]: http://www.apache.org/dyn/closer.lua/axis/axis2/java/rampart/${release_version}/rampart-dist-${release_version}-src.zip
+[5]: https://www.apache.org/dyn/closer.lua/axis/axis2/java/rampart/${release_version}/rampart-dist-${release_version}-src.zip
 [7]: https://www.apache.org/dist/axis/axis2/java/rampart/${release_version}/rampart-dist-${release_version}-src.zip.sha512
 [8]: https://www.apache.org/dist/axis/axis2/java/rampart/${release_version}/rampart-dist-${release_version}-src.zip.asc
-[9]: http://www.apache.org/dev/release-signing#verifying-signature
+[9]: https://www.apache.org/dev/release-signing#verifying-signature
 [10]: https://www.apache.org/dist/axis/axis2/java/rampart/KEYS
-[11]: http://www.apache.org/dyn/closer.lua/axis/axis2/java/rampart/
-[12]: http://archive.apache.org/dist/axis/axis2/java/rampart/
-[13]: http://search.maven.org/#search%7Cga%7C1%7Cg%3A%22org.apache.rampart%22
+[11]: https://www.apache.org/dyn/closer.lua/axis/axis2/java/rampart/
+[12]: https://archive.apache.org/dist/axis/axis2/java/rampart/
+[13]: https://search.maven.org/#search%7Cga%7C1%7Cg%3A%22org.apache.rampart%22
diff --git a/src/site/markdown/index.md b/src/site/markdown/index.md
index e174284..0094358 100644
--- a/src/site/markdown/index.md
+++ b/src/site/markdown/index.md
@@ -19,5 +19,5 @@
 
 Apache Rampart, Rampart, Apache, the Apache feather logo, and the Apache Rampart project logo are trademarks of The Apache Software Foundation.
 
-[1]: http://ws.apache.org/wss4j/
-[2]: http://ws.apache.org/axiom/implementations/axiom-dom/
+[1]: https://wss4j.apache.org/
+[2]: https://ws.apache.org/axiom/implementations/axiom-dom/
diff --git a/src/site/markdown/release-notes/1.6.2.md b/src/site/markdown/release-notes/1.6.2.md
index 746b984..56310df 100644
--- a/src/site/markdown/release-notes/1.6.2.md
+++ b/src/site/markdown/release-notes/1.6.2.md
@@ -5,6 +5,5 @@
 1.6.4 and OpenSAML to version 2.5.1. Apache Rampart 1.6.2 ensure compatibility
 with the latest Axis2 1.6.2 release.
 
-A complete list of issues fixed in this release can be found [here][1].
-
-[1]: http://s.apache.org/rampart1.6.2
+<!-- Removed broken Apache shortlink - http://s.apache.org/rampart1.6.2 -->
+A complete list of issues fixed in this release can be found in the Apache JIRA project.
diff --git a/src/site/markdown/release-notes/1.6.3.md b/src/site/markdown/release-notes/1.6.3.md
index dcf8861..f0d5934 100644
--- a/src/site/markdown/release-notes/1.6.3.md
+++ b/src/site/markdown/release-notes/1.6.3.md
@@ -2,6 +2,7 @@
 ---------------------------------
 
 Apache Rampart 1.6.3 is a maintenance release compatible with Apache Axis2
-1.6.3. A complete list of issues fixed in this release can be found [here][1].
+1.6.3.
 
-[1]: http://s.apache.org/rampart1.6.3
\ No newline at end of file
+<!-- Removed broken Apache shortlink - http://s.apache.org/rampart1.6.3 -->
+A complete list of issues fixed in this release can be found in the Apache JIRA project.
\ No newline at end of file
diff --git a/src/site/markdown/release-notes/1.8.0.md b/src/site/markdown/release-notes/1.8.0.md
index b5a6783..3990279 100644
--- a/src/site/markdown/release-notes/1.8.0.md
+++ b/src/site/markdown/release-notes/1.8.0.md
@@ -4,7 +4,7 @@
 Apache Rampart 1.8.0 is a major release designed for compatibility with Axis2
 1.8.2. 
 
-A huge amount of effort went into upgrading everything possible up to jakarta - 
+A huge amount of effort went into upgrading everything possible up to jakarta -
 namely opensaml to 4.3 and ws-wss4j to 3.0.3.
 
 This will be the last javax based release. The next Rampart release will be 2.0.0 
diff --git a/src/site/markdown/release-notes/2.0.0.md b/src/site/markdown/release-notes/2.0.0.md
index b49106d..6e599aa 100644
--- a/src/site/markdown/release-notes/2.0.0.md
+++ b/src/site/markdown/release-notes/2.0.0.md
@@ -1,3 +1,32 @@
 Apache Rampart 2.0.0 Release Notes
 ---------------------------------
 
+Apache Rampart 2.0.0 is a major release that continues support for the WS-Security, WS-Trust, and WS-SecureConversation specifications for Apache Axis2.
+
+## Current Dependency Versions
+
+This release uses the following updated dependency versions:
+
+- **Apache WSS4J**: 3.0.3 - Provides WS-Security implementation
+- **OpenSAML**: 4.3.2 - Provides SAML token support and processing
+- **Apache Axis2**: 1.8.2 - Compatible with the latest Axis2 release
+- **Apache Axiom**: 1.4.0 - XML object model used by Axis2
+
+## Key Features
+
+Apache Rampart implements the following WS-Security specifications:
+
+- WS-Security 1.0 and 1.1
+- WS-Trust
+- WS-SecureConversation
+- WS-SecurityPolicy
+
+## Dependencies
+
+For complete dependency information, see the project's Maven POM files. The core dependencies include:
+
+- Apache WSS4J 3.0.3 for WS-Security processing
+- OpenSAML 4.3.2 for SAML assertion handling
+- Bouncy Castle 1.79 for cryptographic operations
+- Apache Santuario XMLSec for XML security
+
diff --git a/src/site/site.xml b/src/site/site.xml
index bacd474..25727ff 100644
--- a/src/site/site.xml
+++ b/src/site/site.xml
@@ -25,8 +25,8 @@
     </bannerLeft>
 
     <bannerRight>
-        <src>http://www.apache.org/images/asf_logo_wide.png</src>
-        <href>http://www.apache.org</href>
+        <src>https://www.apache.org/images/asf_logo_wide.png</src>
+        <href>https://www.apache.org</href>
     </bannerRight>
 
     <skin>
@@ -39,7 +39,7 @@
 
     <body>
         <links>
-            <item name="Apache Axis2/Java" href="http://axis.apache.org/axis2/java/core/" />
+            <item name="Apache Axis2/Java" href="https://axis.apache.org/axis2/java/core/" />
         </links>
         
         <menu name="Apache Rampart">
@@ -59,7 +59,8 @@
         <menu name="Documentation">
             <item name="Getting Started" href="quick-start.html"/>
             <item name="Samples" href="samples.html"/>
-            <item name="FAQ" href="http://wiki.apache.org/ws/FrontPage/Rampart/FAQ"/>
+<!-- Removing broken wiki link - wiki.apache.org/ws no longer exists -->
+            <!-- <item name="FAQ" href="http://wiki.apache.org/ws/FrontPage/Rampart/FAQ"/> -->
             <item name="Rampart Configuration" href="rampartconfig-guide.html"/>
             <item name="STS Configuration" href="setting-up-sts.html"/>
             <item name="Developer Guide" href="developer-guide.html"/>
@@ -71,13 +72,13 @@
         </menu>
         <menu name="Project Information">
             <item name="Project Team" href="team.html" />
-            <item name="Issue Tracking" href="http://issues.apache.org/jira/browse/Rampart" />
+            <item name="Issue Tracking" href="https://issues.apache.org/jira/browse/Rampart" />
             <item name="Mailing Lists" href="mail-lists.html"/>
             <item name="Source Code" href="https://github.com/apache/axis-axis2-java-rampart" />
-            <item name="License" href="http://www.apache.org/licenses/"/>
-            <item name="Sponsorship" href="http://www.apache.org/foundation/sponsorship.html"/>
-            <item name="Thanks" href="http://www.apache.org/foundation/thanks.html"/>
-            <item name="Security" href="http://www.apache.org/security/"/>
+            <item name="License" href="https://www.apache.org/licenses/"/>
+            <item name="Sponsorship" href="https://www.apache.org/foundation/sponsorship.html"/>
+            <item name="Thanks" href="https://www.apache.org/foundation/thanks.html"/>
+            <item name="Security" href="https://www.apache.org/security/"/>
         </menu>
     </body>
 </project>
diff --git a/src/site/xdoc/articles.xml b/src/site/xdoc/articles.xml
index 24f98f0..6a3e477 100644
--- a/src/site/xdoc/articles.xml
+++ b/src/site/xdoc/articles.xml
@@ -24,51 +24,46 @@
 </head>

 <body>

 <h1>Apache Rampart Knowledge Base</h1>

-<p>This page contains articles, tutorials, presentations and

-question and answers published on various Web sites on the Apache

-Rampart. </p>

-<h2>Articles:</h2>

-<ul>

-<li><a href="http://wso2.org/library/240">

-UsernameToken Authentication with Rampart</a>- By Ruchith Ferenando</li>
-<li><a href="http://www.xml.com/pub/a/2007/05/02/sure-reliable-web-services-with-apache.html">
-Secure, Reliable Web Services with Apache</a>- By Kyle Gabhart</li>
-<li><a href="http://wso2.org/library/3132">
-Understanding WS - Security Policy Language</a>- By Nandana Mihindukulasooriya</li>
-<li><a href="http://wso2.org/library/1027">
-Integrating WS-Security and WS-SecureConversation Implementations with Apache Sandesha2 </a>- By Chamikara Jayalath</li>

-</ul>
+<p>This page contains information about articles, tutorials, and presentations related to Apache Rampart.</p>

 

-<h2>Tutorials</h2>

+<h2>External Articles:</h2>

 <ul>

-<li><a href="http://wso2.org/library/140">Secure Message Exchanges with Multiple Users</a>- By

-Ruchith Fernando</li>
-<li><a href="http://wso2.org/library/174">Setting Up Keystores for a Client and a Service</a>- By
-Ruchith Fernando</li>
-<li><a href="http://wso2.org/library/3190">Web Services Security with Apache Rampart - Part 1 (Transport Level Security)</a>- By
-Nandana Mihindukulasooriya</li>
-<li><a href="http://wso2.org/library/3415">Web Services Security with Apache Rampart - Part 2 (Message-Level Security)</a>- By
-Nandana Mihindukulasooriya</li>

+<li><a href="https://www.xml.com/pub/a/2007/05/02/sure-reliable-web-services-with-apache.html">

+Secure, Reliable Web Services with Apache</a> - By Kyle Gabhart</li>

 </ul>

 

-<h2>Presentations</h2>

+<h2>Historical Articles (WSO2 Library)</h2>

+<p>The following articles were originally published on WSO2's library. While the original http://wso2.org/library/ links are no longer accessible,

+the content may be available through:</p>

 <ul>

-<li><a href="http://wso2.org/library/136">Secure Web Services with Apache Rampart</a>- By
-Ruchith Fernando</li>
-<li><a href="http://wso2.org/library/2534">Apache Rahas</a>- By
-Ruchith Fernando</li>

+<li><a href="https://wso2.com/documentation/">WSO2 Current Documentation</a></li>

+<li><a href="https://docs.wso2.com/">WSO2 Technical Documentation</a></li>

+<li><a href="https://github.com/wso2">WSO2 GitHub Repositories</a> (may contain samples and tutorials)</li>

 </ul>

-<h2>Interviews</h2>
-<ul>
-<li><a href="http://wso2.org/library/695">Secure Messaging with Apache Rampart/Java</a>- By
-Ruchith Fernando</li>

-</ul>

-<h2>Questions and Answers</h2>

+<p>Original articles that may be available in updated form:</p>

+

 <ul>

-<li><a href="http://wso2.org/library/2507">Timestamp validation fails! Why?</a></li>
-<li><a href="http://wso2.org/library/2506">How can I convert an LLOM AXIOM tree into a DOOM AXIOM tree?</a></li>
-<li><a href="http://wso2.org/library/169">How can I obtain UsernameToken information at the service?</a></li>
-<li><a href="http://wso2.org/library/116">Unexpected number of X509Data: for Signature. Why?</a></li>

+<li>UsernameToken Authentication with Rampart - By Ruchith Fernando</li>

+<li>Understanding WS-Security Policy Language - By Nandana Mihindukulasooriya</li>

+<li>Integrating WS-Security and WS-SecureConversation Implementations with Apache Sandesha2 - By Chamikara Jayalath</li>

+<li>Secure Message Exchanges with Multiple Users - By Ruchith Fernando</li>

+<li>Setting Up Keystores for a Client and a Service - By Ruchith Fernando</li>

+<li>Web Services Security with Apache Rampart - Part 1 (Transport Level Security) - By Nandana Mihindukulasooriya</li>

+<li>Web Services Security with Apache Rampart - Part 2 (Message-Level Security) - By Nandana Mihindukulasooriya</li>

+<li>Secure Web Services with Apache Rampart - By Ruchith Fernando</li>

+<li>Apache Rahas - By Ruchith Fernando</li>

+<li>Secure Messaging with Apache Rampart/Java - By Ruchith Fernando</li>

+</ul>

+

+<h2>Current Documentation</h2>

+<p>For current tutorials and documentation, please refer to:</p>

+<ul>

+<li><a href="quick-start.html">Getting Started Guide</a></li>

+<li><a href="samples.html">Rampart Samples</a></li>

+<li><a href="rampartconfig-guide.html">Rampart Configuration Guide</a></li>

+<li><a href="developer-guide.html">Developer Guide</a></li>

+<li><a href="https://wss4j.apache.org/">Apache WSS4J Documentation</a></li>

+<li><a href="https://axis.apache.org/axis2/java/core/">Apache Axis2 Documentation</a></li>

 </ul>

 </body>

 </html>

diff --git a/src/site/xdoc/developer-guide.xml b/src/site/xdoc/developer-guide.xml
index 239b8e8..15f0372 100644
--- a/src/site/xdoc/developer-guide.xml
+++ b/src/site/xdoc/developer-guide.xml
@@ -27,7 +27,7 @@
 <h3>Building Rampart</h3>
 <ol>
   <li>Install maven3. Refer to the <a
-    href="http://maven.apache.org/guides/getting-started/maven-in-five-minutes.html">Installation
+    href="https://maven.apache.org/guides/getting-started/maven-in-five-minutes.html">Installation
     guide</a>.</li>
   <li>Download the source code.
     <ul>
@@ -86,12 +86,12 @@
 
 <p>Rampart uses WSS4J for securing SOAP messages. WSS4J is an Apache project
 which implements the WS-Security specification. SOAP messages are signed and
-encrypted according to the <a href="http://www.w3.org/TR/xmlenc-core/">XML
-Encryption</a> and <a href="http://www.w3.org/TR/xmldsig-core/">XML Digital
+encrypted according to the <a href="https://www.w3.org/TR/xmlenc-core/">XML
+Encryption</a> and <a href="https://www.w3.org/TR/xmldsig-core/">XML Digital
 Signature</a> specifications, but the WS-Security specification introduces an
 additional set of rules. Therefore WSS4J ensures that SOAP messages are
 singed according to all the rules defined in the specifications. WSS4J uses
-Apache's <a href="http://santuario.apache.org/Java/index.html">xmlsec
+Apache's <a href="https://santuario.apache.org/Java/index.html">xmlsec
 libraries</a> for XML Encryption and XML Digital Signature.</p>
 
 <p>Rather than re-inventing the wheel, it was decided to use WSS4J for SOAP
@@ -201,7 +201,8 @@
 
 <p>The following things are required to perform the actual release:</p>
 
-<p>A PGP key that conforms to the <a href="http://specs.xmlsoap.org/ws/2005/02/trust/WS-Trust.pdf"> requirement for Apache release signing</a></p>
+<!-- Removing broken specs.xmlsoap.org link - domain no longer exists -->
+<p>A PGP key that conforms to the requirement for Apache release signing</p>
 
 <p>To make the release process easier, the passphrase for the code signing key should be configured in ~/.m2/settings.xml</p>
 
@@ -236,7 +237,7 @@
 
 <p>If you have multiple keys, you can define a ~/.gnupg/gpg.conf file for a default. Note that while 'gpg --list-keys' will show your public keys, using maven-release-plugin with the command 'release:perform' below requires 'gpg --list-secret-keys' to have a valid entry that matches your public key, in order to create 'asc' files that are used to verify the release artifcats. 'release:prepare' creates the sha512 checksum files.</p>
 
-<p>The created artifacts i.e. zip files can be checked with, for example, sha512sum 'rampart-dist-1.8.0-bin.zip' which should match the generated sha512 files. In that example, use 'gpg --verify rampart-dist-1.8.0-bin.zip.asc rampart-dist-1.8.0-bin.zip' to verify the artifacts were signed correctly</p>
+<p>The created artifacts i.e. zip files can be checked with, for example, sha512sum 'rampart-dist-2.0.0-bin.zip' which should match the generated sha512 files. In that example, use 'gpg --verify rampart-dist-2.0.0-bin.zip.asc rampart-dist-2.0.0-bin.zip' to verify the artifacts were signed correctly</p>
 
 <p>If necessary, update the copyright date in the top level NOTICE file.</p>
 
diff --git a/src/site/xdoc/rampartconfig-guide.xml b/src/site/xdoc/rampartconfig-guide.xml
index d313ce9..107d8ef 100644
--- a/src/site/xdoc/rampartconfig-guide.xml
+++ b/src/site/xdoc/rampartconfig-guide.xml
@@ -142,6 +142,6 @@
       </pre>
       <br></br>
       <h3>References</h3>1.
-      <a href="http://ws.apache.org/wss4j">Apache WSS4J -Home</a>
+      <a href="https://wss4j.apache.org/">Apache WSS4J -Home</a>
   </body>
 </html>