diff --git a/src/org/apache/ws/commons/attachments/ByteArrayDataSource.java b/src/org/apache/ws/commons/attachments/ByteArrayDataSource.java
new file mode 100644
index 0000000..8fbe840
--- /dev/null
+++ b/src/org/apache/ws/commons/attachments/ByteArrayDataSource.java
@@ -0,0 +1,66 @@
+/*
+ * Copyright 2004,2005 The Apache Software Foundation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      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.
+ */
+
+package org.apache.ws.commons.attachments;
+
+import javax.activation.DataSource;
+import java.io.ByteArrayInputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.OutputStream;
+
+public class ByteArrayDataSource implements DataSource {
+
+    private byte[] data;
+
+    private String type;
+
+    public ByteArrayDataSource(byte[] data, String type) {
+        super();
+        this.data = data;
+        this.type = type;
+    }
+
+    public ByteArrayDataSource(byte[] data) {
+        super();
+        this.data = data;
+    }
+
+    public void setType(String type) {
+        this.type = type;
+    }
+
+    public String getContentType() {
+        if (type == null)
+            return "application/octet-stream";
+        else
+            return type;
+    }
+
+    public InputStream getInputStream() throws IOException {
+        return new ByteArrayInputStream(data);
+    }
+
+    public String getName() {
+
+        return "ByteArrayDataSource";
+    }
+
+    public OutputStream getOutputStream() throws IOException {
+        throw new IOException("Not Supported");
+    }
+}
+
diff --git a/src/org/apache/ws/commons/attachments/DataHandlerUtils.java b/src/org/apache/ws/commons/attachments/DataHandlerUtils.java
new file mode 100644
index 0000000..b3a4a64
--- /dev/null
+++ b/src/org/apache/ws/commons/attachments/DataHandlerUtils.java
@@ -0,0 +1,38 @@
+/*
+ * Copyright  2004 The Apache Software Foundation.
+ *
+ *  Licensed under the Apache License, Version 2.0 (the "License");
+ *  you may not use this file except in compliance with the License.
+ *  You may obtain a copy of the License at
+ *
+ *      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.
+ *
+ */
+package org.apache.ws.commons.attachments;
+
+
+import org.apache.ws.commons.om.util.Base64;
+
+import javax.activation.DataHandler;
+
+public class DataHandlerUtils {
+
+  public static Object getDataHandlerFromText(String value, String mimeType)
+  {
+      ByteArrayDataSource dataSource;
+      byte[] data = Base64.decode(value);
+      if (mimeType != null) {
+          dataSource = new ByteArrayDataSource(data, mimeType);
+      } else {
+          // Assumes type as application/octet-stream
+          dataSource = new ByteArrayDataSource(data);
+      }
+      return new DataHandler(dataSource);
+  }
+}
diff --git a/src/org/apache/ws/commons/attachments/MIMEBodyPartInputStream.java b/src/org/apache/ws/commons/attachments/MIMEBodyPartInputStream.java
new file mode 100644
index 0000000..dc6a846
--- /dev/null
+++ b/src/org/apache/ws/commons/attachments/MIMEBodyPartInputStream.java
@@ -0,0 +1,111 @@
+/*
+ * Copyright 2004,2005 The Apache Software Foundation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      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.
+ */
+
+package org.apache.ws.commons.attachments;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.PushbackInputStream;
+
+public class MIMEBodyPartInputStream extends InputStream {
+    PushbackInputStream inStream;
+
+    boolean boundaryFound;
+
+    MIMEHelper parent;
+
+    byte[] boundary;
+
+    public MIMEBodyPartInputStream(PushbackInputStream inStream, byte[] boundary) {
+        super();
+        this.inStream = inStream;
+        this.boundary = boundary;
+    }
+
+    public MIMEBodyPartInputStream(PushbackInputStream inStream,
+            byte[] boundary, MIMEHelper parent) {
+        this(inStream, boundary);
+        this.parent = parent;
+    }
+
+    public int read() throws IOException {
+        if (boundaryFound) {
+            return -1;
+        }
+        // read the next value from stream
+        int value = inStream.read();
+
+        // A problem occured because all the mime parts tends to have a /r/n at
+        // the end. Making it hard to transform them to correct DataSources.
+        // This logic introduced to handle it
+        //TODO look more in to this && for a better way to do this
+        if (value == 13) {
+            value = inStream.read();
+            if (value != 10) {
+                inStream.unread(value);
+                return 13;
+            } else {
+                value = inStream.read();
+                if ((byte) value != boundary[0]) {
+                    inStream.unread(value);
+                    inStream.unread(10);
+                    return 13;
+                }
+            }
+        } else if ((byte) value != boundary[0]) {
+            return value;
+        }
+
+        // read value is the first byte of the boundary. Start matching the
+        // next characters to find a boundary
+        int boundaryIndex = 0;
+        while ((boundaryIndex < (boundary.length - 1))
+                && ((byte) value == boundary[boundaryIndex])) {
+            value = inStream.read();
+            boundaryIndex++;
+        }
+
+        if (boundaryIndex == (boundary.length - 1)) { // boundary found
+            boundaryFound = true;
+            // read the end of line character
+            if ((value = inStream.read()) == 45) {
+                //check whether end of stream
+                //Last mime boundary should have a succeeding "--"
+                if ((value = inStream.read()) == 45 && parent!=null) {
+                    parent.setEndOfStream(true);
+                }
+            } else {
+                inStream.read();
+            }
+
+            return -1;
+        }
+
+        // Boundary not found. Restoring bytes skipped.
+        // write first skipped byte, push back the rest
+
+        if (value != -1) { // Stream might have ended
+            inStream.unread(value);
+        }
+        inStream.unread(boundary, 1, boundaryIndex - 1);
+        return boundary[0];
+    }
+    
+    public boolean getBoundaryStatus()
+    {
+        return boundaryFound;
+    }
+}
\ No newline at end of file
diff --git a/src/org/apache/ws/commons/attachments/MIMEHelper.java b/src/org/apache/ws/commons/attachments/MIMEHelper.java
new file mode 100644
index 0000000..dff3871
--- /dev/null
+++ b/src/org/apache/ws/commons/attachments/MIMEHelper.java
@@ -0,0 +1,405 @@
+/*
+ * Copyright 2004,2005 The Apache Software Foundation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      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.
+ */
+
+package org.apache.ws.commons.attachments;
+
+import org.apache.ws.commons.om.OMException;
+import org.apache.ws.commons.om.impl.MTOMConstants;
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+
+import javax.activation.DataHandler;
+import javax.mail.MessagingException;
+import javax.mail.internet.ContentType;
+import javax.mail.internet.ParseException;
+import java.io.ByteArrayInputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.PushbackInputStream;
+import java.util.HashMap;
+
+public class MIMEHelper {
+
+    /**
+     * <code>ContentType</code> of the MIME message
+     */
+    ContentType contentType;
+
+    /**
+     * Mime <code>boundary</code> which separates mime parts
+     */
+    byte[] boundary;
+
+    /**
+     * <code>applicationType</code> used to distinguish between MTOM & SWA If
+     * the message is MTOM optimised type is application/xop+xml If the message
+     * is SWA, type is ??have to find out
+     */
+    String applicationType;
+
+    /**
+     * <code>pushbackInStream</code> stores the reference to the incoming
+     * stream A PushbackStream has the ability to "push back" or "unread" one
+     * byte.
+     */
+    PushbackInputStream pushbackInStream;
+
+    /**
+     * <code>mimeBodyPartsMap</code> stores the already parsed Mime Body
+     * Parts. This Map will be keyed using the content-ID's
+     */
+    HashMap bodyPartsMap;
+
+    /**
+     * <code>partIndex</code>- Number of Mime parts parsed
+     */
+    int partIndex = 0;
+
+    /**
+     * <code>endOfStreamReached</code> flag which is to be set by
+     * MIMEBodyPartStream when MIME message terminator is found.
+     */
+    boolean endOfStreamReached;
+
+    String firstPartId;
+
+    boolean fileCacheEnable;
+
+    String attachmentRepoDir;
+
+    int fileStorageThreshold;
+
+    protected Log log = LogFactory.getLog(getClass());
+
+
+    /**
+     * Moves the pointer to the beginning of the first MIME part. Reads
+     * till first MIME boundary is found or end of stream is reached.
+     *
+     * @param inStream
+     * @param contentTypeString
+     * @param fileCacheEnable
+     * @param attachmentRepoDir
+     * @throws OMException 
+     */
+    public MIMEHelper(InputStream inStream, String contentTypeString,
+                      boolean fileCacheEnable, String attachmentRepoDir,
+                      String fileThreshold) throws OMException {
+        this.attachmentRepoDir = attachmentRepoDir;
+        this.fileCacheEnable = fileCacheEnable;
+        if (fileThreshold != null && (!"".equals(fileThreshold))) {
+            this.fileStorageThreshold = Integer.parseInt(fileThreshold);
+        } else {
+            this.fileStorageThreshold = 1;
+        }
+        bodyPartsMap = new HashMap();
+        try {
+            contentType = new ContentType(contentTypeString);
+        } catch (ParseException e) {
+            throw new OMException(
+                    "Invalid Content Type Field in the Mime Message"
+                            ,e);
+        }
+        // Boundary always have the prefix "--".
+        this.boundary = ("--" + contentType.getParameter("boundary"))
+                .getBytes();
+
+        // do we need to wrap InputStream from a BufferedInputStream before
+        // wrapping from PushbackStream
+        pushbackInStream = new PushbackInputStream(inStream,
+                (this.boundary.length + 2));
+
+        // Move the read pointer to the beginning of the first part
+        // read till the end of first boundary
+        while (true) {
+            int value;
+            try {
+                value = pushbackInStream.read();
+                if ((byte) value == boundary[0]) {
+                    int boundaryIndex = 0;
+                    while ((boundaryIndex < boundary.length)
+                            && ((byte) value == boundary[boundaryIndex])) {
+                        value = pushbackInStream.read();
+                        if (value == -1)
+                            throw new OMException(
+                                    "Unexpected End of Stream while searching for first Mime Boundary");
+                        boundaryIndex++;
+                    }
+                    if (boundaryIndex == boundary.length) { // boundary found
+                        pushbackInStream.read();
+                        break;
+                    }
+                } else if ((byte) value == -1) {
+                    throw new OMException(
+                            "Mime parts not found. Stream ended while searching for the boundary");
+                }
+            } catch (IOException e1) {
+                throw new OMException("Stream Error" + e1.toString(), e1);
+            }
+        }
+    }
+
+    /**
+     * Sets file cache to false.
+     *
+     * @param inStream
+     * @param contentTypeString
+     * @throws OMException
+     */
+    public MIMEHelper(InputStream inStream, String contentTypeString)
+            throws OMException {
+        this(inStream, contentTypeString, false, null, null);
+    }
+
+    /**
+     * @return whether Message Type is SOAP with Attachments or MTOM optimized,
+     *         by checking the application type parameter in the Content Type.
+     */
+    public String getAttachmentSpecType() {
+        if (this.applicationType == null) {
+            applicationType = contentType.getParameter("type");
+            if ((MTOMConstants.MTOM_TYPE).equalsIgnoreCase(applicationType)) {
+                this.applicationType = MTOMConstants.MTOM_TYPE;
+            } else if ((MTOMConstants.SWA_TYPE).equalsIgnoreCase(applicationType)) {
+                this.applicationType = MTOMConstants.SWA_TYPE;
+            } else {
+                throw new OMException(
+                        "Invalid Application type. Support available for MTOM/SOAP 1.2 & SwA/SOAP 1.l only.");
+            }
+        }
+        return this.applicationType;
+    }
+
+    /**
+     * @return the InputStream which includes the SOAP Envelope. It assumes that
+     *         the root mime part is always pointed by "start" parameter in
+     *         content-type.
+     */
+    public InputStream getSOAPPartInputStream() throws OMException {
+        DataHandler dh;
+        try {
+            dh = getDataHandler(getSOAPPartContentID());
+            if (dh == null) {
+                throw new OMException(
+                        "Mandatory Root MIME part containing the SOAP Envelope is missing");
+            }
+            return dh.getInputStream();
+        } catch (IOException e) {
+            throw new OMException(
+                    "Problem with DataHandler of the Root Mime Part. ",e);
+        }
+    }
+
+    /**
+     * @return the Content-ID of the SOAP part It'll be the value Start
+     *         Parameter of Content-Type header if given in the Content type of
+     *         the MIME message. Else it'll be the content-id of the first MIME
+     *         part of the MIME message
+     */
+    private String getSOAPPartContentID() {
+        String rootContentID = contentType.getParameter("start");
+
+        // to handle the Start parameter not mentioned situation
+        if (rootContentID == null) {
+            if (partIndex == 0) {
+                getNextPart();
+            }
+            rootContentID = firstPartId;
+        } else {
+            rootContentID.trim();
+
+            if ((rootContentID.indexOf("<") > -1)
+                    & (rootContentID.indexOf(">") > -1))
+                rootContentID = rootContentID.substring(1, (rootContentID
+                        .length() - 1));
+        }
+        // Strips off the "cid" part from content-id
+        if ("cid".equalsIgnoreCase(rootContentID.substring(0, 3))) {
+            rootContentID = rootContentID.substring(4);
+        }
+        return rootContentID;
+    }
+
+    public String getSOAPPartContentType() {
+        Part soapPart = getPart(getSOAPPartContentID());
+        try {
+            return soapPart.getContentType();
+        } catch (MessagingException e) {
+            log.error(e.getMessage());
+            throw new OMException(e);
+        }
+    }
+
+    /**
+     * @param blobContentID
+     *            (without the surrounding angle brackets and "cid:" prefix)
+     * @return The DataHandler of the mime part referred by the Content-Id
+     * @throws OMException
+     */
+    public DataHandler getDataHandler(String blobContentID) throws OMException {
+
+        try {
+            return getPart(blobContentID).getDataHandler();
+        } catch (MessagingException e) {
+            throw new OMException("Problem with Mime Body Part No " + partIndex
+                    + ".  ", e);
+        }
+
+    }
+
+    /**
+     * Checks whether the MIME part is already parsed by checking the
+     * parts HashMap. If it is not parsed yet then call the getNextPart()
+     * till the required part is found.
+     *
+     * @param blobContentID
+     * @return The Part referred by the Content-Id
+     * @throws OMException
+     * 
+     */
+    public Part getPart(String blobContentID) {
+        Part bodyPart;
+        if (bodyPartsMap.containsKey(blobContentID)) {
+            bodyPart = (Part) bodyPartsMap.get(blobContentID);
+            return bodyPart;
+        } else {
+            //This loop will be terminated by the Exceptions thrown if the Mime
+            // part searching was not found
+            while (true) {
+                bodyPart = this.getNextPart();
+                if (bodyPart == null) {
+                    return null;
+                }
+                if (bodyPartsMap.containsKey(blobContentID)) {
+                    bodyPart = (Part) bodyPartsMap.get(blobContentID);
+                    return bodyPart;
+                }
+            }
+        }
+    }
+
+    protected void setEndOfStream(boolean value) {
+        this.endOfStreamReached = value;
+
+    }
+
+    /**
+     * @return the Next valid MIME part + store the Part in the Parts List
+     * @throws OMException
+     *             throw if content id is null or if two MIME parts contain the
+     *             same content-ID & the exceptions throws by getPart()
+     */
+    private Part getNextPart() throws OMException {
+        Part nextPart;
+        nextPart = getPart();
+        if (nextPart != null) {
+            String partContentID;
+            try {
+                partContentID = nextPart.getContentID();
+
+                if (partContentID == null & partIndex == 1) {
+                    bodyPartsMap.put("firstPart", nextPart);
+                    firstPartId = "firstPart";
+                    return nextPart;
+                }
+                if (partContentID == null) {
+                    throw new OMException(
+                            "Part content ID cannot be blank for non root MIME parts");
+                }
+                if ((partContentID.indexOf("<") > -1)
+                        & (partContentID.indexOf(">") > -1)) {
+                    partContentID = partContentID.substring(1, (partContentID
+                            .length() - 1));
+
+                } else if (partIndex == 1) {
+                    firstPartId = partContentID;
+                }
+                if (bodyPartsMap.containsKey(partContentID)) {
+                    throw new OMException(
+                            "Two MIME parts with the same Content-ID not allowed.");
+                }
+                bodyPartsMap.put(partContentID, nextPart);
+                return nextPart;
+            } catch (MessagingException e) {
+                throw new OMException("Error reading Content-ID from the Part."
+                        + e);
+            }
+        } else
+            return null;
+    }
+
+    /**
+     * @return This will return the next available MIME part in the stream.
+     * @throws OMException
+     *             if Stream ends while reading the next part...
+     */
+    private Part getPart() throws OMException {
+        // endOfStreamReached will be set to true if the message ended in MIME
+        // Style having "--" suffix with the last mime boundary
+        if (endOfStreamReached)
+            throw new OMException(
+                    "Referenced MIME part not found.End of Stream reached.");
+
+        Part part = null;
+
+        try {
+            if (fileCacheEnable) {
+                try {
+                    MIMEBodyPartInputStream partStream;
+                    byte[] buffer = new byte[fileStorageThreshold];
+                    partStream = new MIMEBodyPartInputStream(pushbackInStream,
+                            boundary, this);
+                    int count = 0;
+                    int value;
+                    // Make sure not to modify this to a Short Circuit "&". If
+                    // removed a byte will be lost
+                    while (count != fileStorageThreshold
+                            && (!partStream.getBoundaryStatus())) {
+                        value = partStream.read();
+                        buffer[count] = (byte) value;
+                        count++;
+                    }
+                    if (count == fileStorageThreshold) {
+                        PushbackFilePartInputStream filePartStream = new PushbackFilePartInputStream(
+                                partStream, buffer);
+                        part = new PartOnFile(filePartStream, attachmentRepoDir);
+                    } else {
+                        ByteArrayInputStream byteArrayInStream = new ByteArrayInputStream(
+                                buffer,0,count-1);
+                        part = new PartOnMemory(byteArrayInStream);
+                    }
+                } catch (Exception e) {
+                    throw new OMException("Error creating temporary File.", e);
+                }
+            } else {
+                MIMEBodyPartInputStream partStream;
+                partStream = new MIMEBodyPartInputStream(pushbackInStream,
+                        boundary, this);
+                part = new PartOnMemory(partStream);
+            }
+            // This will take care if stream ended without having MIME
+            // message terminator
+            if (part.getSize() <= 0) {
+                throw new OMException(
+                        "Referenced MIME part not found.End of Stream reached.");
+            }
+        } catch (MessagingException e) {
+            throw new OMException(e);
+        }
+        partIndex++;
+        return part;
+    }
+}
\ No newline at end of file
diff --git a/src/org/apache/ws/commons/attachments/Part.java b/src/org/apache/ws/commons/attachments/Part.java
new file mode 100644
index 0000000..4987608
--- /dev/null
+++ b/src/org/apache/ws/commons/attachments/Part.java
@@ -0,0 +1,44 @@
+/*
+ * Copyright 2004,2005 The Apache Software Foundation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      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.
+ */
+
+package org.apache.ws.commons.attachments;
+
+import javax.activation.DataHandler;
+import javax.mail.MessagingException;
+import java.io.IOException;
+import java.io.InputStream;
+import java.util.Enumeration;
+
+public interface Part{
+
+    
+    public int getSize() throws MessagingException ;
+
+    public String getContentType() throws MessagingException;
+    
+    public String getContentID() throws MessagingException;
+    
+    public String getFileName() throws MessagingException;
+
+    public InputStream getInputStream() throws IOException, MessagingException ;
+    
+    public DataHandler getDataHandler() throws MessagingException ;
+    
+    public String getHeader(String arg0) throws MessagingException ;
+    
+    public Enumeration getAllHeaders() throws MessagingException ;
+    
+}
diff --git a/src/org/apache/ws/commons/attachments/PartOnFile.java b/src/org/apache/ws/commons/attachments/PartOnFile.java
new file mode 100644
index 0000000..7f55df2
--- /dev/null
+++ b/src/org/apache/ws/commons/attachments/PartOnFile.java
@@ -0,0 +1,184 @@
+/*
+ * Copyright 2004,2005 The Apache Software Foundation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      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.
+ */
+
+package org.apache.ws.commons.attachments;
+
+import org.apache.ws.commons.om.OMException;
+
+import javax.activation.DataHandler;
+import javax.activation.FileDataSource;
+import javax.mail.MessagingException;
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.OutputStream;
+import java.util.Enumeration;
+import java.util.HashMap;
+
+public class PartOnFile implements Part {
+
+    File cacheFile;
+
+    Part bodyPart;
+
+    String contentType;
+
+    String contentID;
+
+    HashMap headers;
+
+    public PartOnFile(PushbackFilePartInputStream inStream, String repoDir) {
+        super();
+
+        headers = new HashMap();
+
+        if (repoDir == null) {
+            repoDir = ".";
+        }
+        try {
+            cacheFile = File.createTempFile("Axis2", ".att",
+                    (repoDir == null) ? null : new File(repoDir));
+
+            FileOutputStream fileOutStream = new FileOutputStream(cacheFile);
+            int value;
+            value = parseTheHeaders(inStream);
+            fileOutStream.write(value);
+            while (!inStream.getBoundaryStatus()) {
+                value = inStream.read();
+                if (!inStream.getBoundaryStatus()) {
+                    fileOutStream.write(value);
+                }
+
+            }
+
+            fileOutStream.flush();
+            fileOutStream.close();
+        } catch (IOException e) {
+            throw new OMException("Error creating temporary File.", e);
+        }
+    }
+
+    private int parseTheHeaders(InputStream inStream) throws IOException {
+        int value;
+        boolean readingHeaders = true;
+        StringBuffer header = new StringBuffer();
+        while (readingHeaders & (value = inStream.read()) != -1) {
+            if (value == 13) {
+                if ((value = inStream.read()) == 10) {
+                    if ((value = inStream.read()) == 13) {
+                        if ((value = inStream.read()) == 10) {
+                            putToMap(header);
+                            readingHeaders = false;
+                        }
+                    } else {
+                        putToMap(header);
+                        header = new StringBuffer();
+                        header.append((char) value);
+                    }
+                } else {
+                    header.append(13);
+                    header.append(value);
+                }
+            } else {
+                header.append((char) value);
+            }
+        }
+        return value;
+    }
+
+    private void putToMap(StringBuffer header) {
+        String headerString = header.toString();
+        int delimiter = headerString.indexOf(":");
+        headers.put(headerString.substring(0, delimiter).trim(), headerString
+                .substring(delimiter + 1, headerString.length()).trim());
+    }
+
+    public String getContentID() {
+        String cID = (String) headers.get("Content-ID");
+        if (cID == null) {
+            cID = (String) headers.get("Content-Id");
+            if (cID == null) {
+                cID = (String) headers.get("Content-id");
+                if (cID == null) {
+                    cID = (String) headers.get("content-id");
+                }
+            }
+
+        }
+        return cID;
+    }
+
+    public int getSize() throws MessagingException {
+        return (int) cacheFile.length();
+    }
+
+    public int getLineCount() throws MessagingException {
+        throw new UnsupportedOperationException();
+    }
+
+    public String getDescription() throws MessagingException {
+        throw new UnsupportedOperationException();
+    }
+
+    public void setDescription(String arg0) throws MessagingException {
+        throw new UnsupportedOperationException();
+    }
+
+    public String getFileName() throws MessagingException {
+        return cacheFile.getAbsolutePath();
+    }
+
+    public InputStream getInputStream() throws IOException, MessagingException {
+        return new FileInputStream(cacheFile);
+    }
+
+    public DataHandler getDataHandler() throws MessagingException {
+        return new DataHandler(new FileDataSource(cacheFile));
+    }
+
+    public Object getContent() throws IOException, MessagingException {
+        return getDataHandler().getContent();
+    }
+
+    public void writeTo(OutputStream outStream) throws IOException,
+            MessagingException {
+        getDataHandler().writeTo(outStream);
+    }
+
+    public String getHeader(String arg0) throws MessagingException {
+        String header;
+        header = (String) headers.get(arg0);
+        return header;
+    }
+
+    public Enumeration getAllHeaders() throws MessagingException {
+        return null;
+    }
+
+    public String getContentType() throws MessagingException {
+        String cType = (String) headers.get("Content-Type");
+        if (cType == null) {
+            cType = (String) headers.get("Content-type");
+            if (cType == null) {
+                cType = (String) headers.get("content-type");
+            }
+        }
+        return cType;
+    }
+
+}
\ No newline at end of file
diff --git a/src/org/apache/ws/commons/attachments/PartOnMemory.java b/src/org/apache/ws/commons/attachments/PartOnMemory.java
new file mode 100644
index 0000000..c8e68b1
--- /dev/null
+++ b/src/org/apache/ws/commons/attachments/PartOnMemory.java
@@ -0,0 +1,66 @@
+/*
+ * Copyright 2004,2005 The Apache Software Foundation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      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.
+ */
+
+package org.apache.ws.commons.attachments;
+
+import javax.activation.DataHandler;
+import javax.mail.MessagingException;
+import javax.mail.internet.MimeBodyPart;
+import java.io.IOException;
+import java.io.InputStream;
+import java.util.Enumeration;
+
+public class PartOnMemory implements Part{
+
+    MimeBodyPart part;
+    public PartOnMemory(InputStream partInStream) throws MessagingException
+    {
+        part =  new MimeBodyPart(partInStream);
+    }
+
+    public int getSize() throws MessagingException {
+        return part.getSize();
+    }
+
+    public String getContentType() throws MessagingException {
+        return part.getContentType();
+    }
+
+    public String getFileName() throws MessagingException {
+        return part.getFileName();
+    }
+
+    public InputStream getInputStream() throws IOException, MessagingException {
+        return part.getInputStream();
+    }
+
+    public DataHandler getDataHandler() throws MessagingException {
+        return part.getDataHandler();
+    }
+
+    public String getHeader(String arg0) throws MessagingException {
+       return part.getHeader(arg0)[0];
+    }
+
+    public Enumeration getAllHeaders() throws MessagingException {
+       return part.getAllHeaders();
+    }
+
+
+    public String getContentID() throws MessagingException {
+        return part.getContentID();
+    }
+}
diff --git a/src/org/apache/ws/commons/attachments/PushbackFilePartInputStream.java b/src/org/apache/ws/commons/attachments/PushbackFilePartInputStream.java
new file mode 100644
index 0000000..b78061f
--- /dev/null
+++ b/src/org/apache/ws/commons/attachments/PushbackFilePartInputStream.java
@@ -0,0 +1,58 @@
+/*
+ * Copyright 2004,2005 The Apache Software Foundation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      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.
+ */
+
+package org.apache.ws.commons.attachments;
+
+import java.io.IOException;
+import java.io.InputStream;
+
+public class PushbackFilePartInputStream extends InputStream {
+
+    MIMEBodyPartInputStream inStream;
+
+    byte[] buffer;
+
+    int count;
+
+    /**
+     * @param inStream
+     * @param buffer
+     */
+    public PushbackFilePartInputStream(MIMEBodyPartInputStream inStream,
+            byte[] buffer) {
+        super();
+        this.inStream = inStream;
+        this.buffer = buffer;
+        count = buffer.length;
+    }
+
+    public int read() throws IOException {
+        int data;
+        if (count > 0) {
+            data = buffer[buffer.length - count];
+            count--;
+        } else {
+            data = inStream.read();
+        }
+        return data;
+    }
+    
+    public boolean getBoundaryStatus()
+    {
+        return inStream.getBoundaryStatus();
+    }
+
+}
\ No newline at end of file
diff --git a/src/org/apache/ws/commons/attachments/utils/IOUtils.java b/src/org/apache/ws/commons/attachments/utils/IOUtils.java
new file mode 100644
index 0000000..1f01bee
--- /dev/null
+++ b/src/org/apache/ws/commons/attachments/utils/IOUtils.java
@@ -0,0 +1,61 @@
+/*
+ * Copyright 2004,2005 The Apache Software Foundation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      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.
+ */
+
+package org.apache.ws.commons.attachments.utils;
+
+import java.io.IOException;
+import java.io.InputStream;
+
+/**
+ * Utility class containing IO helper methods
+ */
+public class IOUtils {
+    private IOUtils() {
+    }
+
+    /**
+     * Reads into a byte array. Ensures that the full buffer is read.
+     * Helper method, just calls <tt>readFully(in, b, 0, b.length)</tt>
+     *
+     * @see #readFully(java.io.InputStream, byte[], int, int)
+     */
+    public static int readFully(InputStream in, byte[] b)
+            throws IOException {
+        return readFully(in, b, 0, b.length);
+    }
+
+    /**
+     * Same as the normal <tt>in.read(b, off, len)</tt>, but tries to ensure that
+     * the entire len number of bytes is read.
+     * 
+     * @return Returns the number of bytes read, or -1 if the end of file is
+     * reached before any bytes are read
+     */
+    public static int readFully(InputStream in, byte[] b, int off, int len)
+            throws IOException {
+        int total = 0;
+        for (; ;) {
+            int got = in.read(b, off + total, len - total);
+            if (got < 0) {
+                return (total == 0) ? -1 : total;
+            } else {
+                total += got;
+                if (total == len)
+                    return total;
+            }
+        }
+    }
+}
diff --git a/src/org/apache/ws/commons/attachments/utils/ImageDataSource.java b/src/org/apache/ws/commons/attachments/utils/ImageDataSource.java
new file mode 100644
index 0000000..506d804
--- /dev/null
+++ b/src/org/apache/ws/commons/attachments/utils/ImageDataSource.java
@@ -0,0 +1,79 @@
+/*
+ * Copyright 2004,2005 The Apache Software Foundation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      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.
+ */
+
+package org.apache.ws.commons.attachments.utils;
+
+import javax.activation.DataSource;
+import java.awt.*;
+import java.io.ByteArrayInputStream;
+import java.io.ByteArrayOutputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.OutputStream;
+
+public class ImageDataSource implements DataSource {
+
+    public static final String CONTENT_TYPE = "image/jpeg";
+
+    private final String name;
+
+    private final String contentType;
+
+    private byte[] data;
+
+    private ByteArrayOutputStream os;
+
+    public ImageDataSource(String name, Image data) throws Exception {
+        this(name, CONTENT_TYPE, data);
+    } // ctor
+
+    public ImageDataSource(String name, String contentType, Image data) throws Exception {
+        this.name = name;
+        this.contentType = contentType == null ? CONTENT_TYPE : contentType;
+        os = new ByteArrayOutputStream();
+        try {
+            if (data != null) {
+                new ImageIO().saveImage(this.contentType, data, os);
+            }
+        } catch (Exception e) {
+            throw e;
+        }
+    }
+
+    public String getName() {
+        return name;
+    } // getName
+
+    public String getContentType() {
+        return contentType;
+    } // getOptimizedContentType
+
+    public InputStream getInputStream() throws IOException {
+        if (os.size() != 0) {
+            data = os.toByteArray();
+            os.reset();
+        }
+        return new ByteArrayInputStream(data == null ? new byte[0] : data);
+    } // getInputStream
+
+    public OutputStream getOutputStream() throws IOException {
+        if (os.size() != 0) {
+            data = os.toByteArray();
+            os.reset();
+        }
+        return os;
+    } // getOutputStream
+} // class ImageDataSource
diff --git a/src/org/apache/ws/commons/attachments/utils/ImageIO.java b/src/org/apache/ws/commons/attachments/utils/ImageIO.java
new file mode 100644
index 0000000..d17d707
--- /dev/null
+++ b/src/org/apache/ws/commons/attachments/utils/ImageIO.java
@@ -0,0 +1,77 @@
+/*
+ * Copyright 2004,2005 The Apache Software Foundation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      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.
+ */
+
+package org.apache.ws.commons.attachments.utils;
+
+
+import javax.imageio.IIOImage;
+import javax.imageio.ImageWriter;
+import java.awt.*;
+import java.awt.image.BufferedImage;
+import java.io.InputStream;
+import java.io.OutputStream;
+import java.util.Iterator;
+
+/**
+ * JDK1.4 based Image I/O
+ */
+public class ImageIO extends Component {
+	
+    private static final long serialVersionUID = 4697911685739683266L;
+
+	/**
+     * Saves an image.
+     *
+     * @param mimeType the mime-type of the format to save the image
+     * @param image    the image to save
+     * @param os       the stream to write to
+     * @throws Exception if an error prevents image encoding
+     */
+    public void saveImage(String mimeType, Image image, OutputStream os)
+            throws Exception {
+
+        ImageWriter writer = null;
+        Iterator iter = javax.imageio.ImageIO.getImageWritersByMIMEType(mimeType);
+        if (iter.hasNext()) {
+            writer = (ImageWriter) iter.next();
+        }
+        writer.setOutput(javax.imageio.ImageIO.createImageOutputStream(os));
+        BufferedImage rendImage = null;
+        if (image instanceof BufferedImage) {
+            rendImage = (BufferedImage) image;
+        } else {
+            MediaTracker tracker = new MediaTracker(this);
+            tracker.addImage(image, 0);
+            tracker.waitForAll();
+            rendImage = new BufferedImage(image.getWidth(null), image.getHeight(null), 1);
+            Graphics g = rendImage.createGraphics();
+            g.drawImage(image, 0, 0, null);
+        }
+        writer.write(new IIOImage(rendImage, null, null));
+        writer.dispose();
+    } // saveImage
+
+    /**
+     * Loads an Image.
+     *
+     * @param in the stream to load the image
+     * @return the Image
+     */
+    public Image loadImage(InputStream in) throws Exception {
+        return javax.imageio.ImageIO.read(in);
+    } // loadImage
+}
+
diff --git a/src/org/apache/ws/commons/om/FactoryFinder.java b/src/org/apache/ws/commons/om/FactoryFinder.java
new file mode 100644
index 0000000..9578864
--- /dev/null
+++ b/src/org/apache/ws/commons/om/FactoryFinder.java
@@ -0,0 +1,132 @@
+/*
+ * Copyright 2004,2005 The Apache Software Foundation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      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.
+ */
+
+package org.apache.ws.commons.om;
+
+import org.apache.ws.commons.soap.SOAPFactory;
+
+
+/**
+ * Class FactoryFinder
+ */
+class FactoryFinder {
+    private static final String DEFAULT_OM_FACTORY_CLASS_NAME =
+            "org.apache.ws.commons.om.impl.llom.factory.OMLinkedListImplFactory";
+    private static final String DEFAULT_SOAP11_FACTORY_CLASS_NAME =
+            "org.apache.ws.commons.soap.impl.llom.soap11.SOAP11Factory";
+    private static final String DEFAULT_SOAP12_FACTORY_CLASS_NAME =
+            "org.apache.ws.commons.soap.impl.llom.soap12.SOAP12Factory";
+
+    /**
+     * @param loader
+     * @return
+     * @throws OMFactoryException
+     */
+
+
+    private static Object findFactory(ClassLoader loader,
+                                      String factoryClass,
+                                      String systemPropertyName)
+            throws OMFactoryException {
+
+        String factoryClassName = factoryClass;
+
+        //first look for a java system property
+        if (systemPropertyName != null &&
+            System.getProperty(systemPropertyName) != null) {
+            factoryClassName = System.getProperty(systemPropertyName);
+        }
+
+        Object factory;
+        try {
+            if (loader == null) {
+                factory = Class.forName(factoryClassName).newInstance();
+            } else {
+                factory = loader.loadClass(factoryClassName).newInstance();
+            }
+        } catch (Exception e) {
+            throw new OMFactoryException(e);
+        }
+        return factory;
+    }
+
+    /**
+     * The searching for the factory class happens in the following order
+     * 1. look for a system property called <b>soap11.factory</b>. this can be set by
+     * passing the -Dsoap11.factory="classname"
+     * 2. Pick the default factory class.
+     * it is the class hardcoded at the constant DEFAULT_SOAP11_FACTORY_CLASS_NAME
+     *
+     * @param loader
+     * @return
+     * @throws OMFactoryException
+     */
+    public static SOAPFactory findSOAP11Factory(ClassLoader loader)
+            throws OMFactoryException {
+        return (SOAPFactory) findFactory(loader,
+                                         DEFAULT_SOAP11_FACTORY_CLASS_NAME,
+                                         OMAbstractFactory.SOAP11_FACTORY_NAME_PROPERTY);
+    }
+
+    /**
+     * The searching for the factory class happens in the following order
+     * 1. look for a system property called <b>soap12.factory</b>. this can be set by
+     * passing the -Dsoap12.factory="classname"
+     * 2. Pick the default factory class.
+     * it is the class hardcoded at the constant DEFAULT_SOAP12_FACTORY_CLASS_NAME
+     *
+     * @param loader
+     * @return
+     * @throws OMFactoryException
+     */
+    public static SOAPFactory findSOAP12Factory(ClassLoader loader)
+            throws OMFactoryException {
+        return (SOAPFactory) findFactory(loader,
+                                         DEFAULT_SOAP12_FACTORY_CLASS_NAME,
+                                         OMAbstractFactory.SOAP12_FACTORY_NAME_PROPERTY);
+    }
+
+    /**
+     * The searching for the factory class happens in the following order
+     * 1. look for a system property called <b>om.factory</b>. this can be set by
+     * passing the -Dom.factory="classname"
+     * 2. Pick the default factory class.
+     * it is the class hardcoded at the constant DEFAULT_OM_FACTORY_CLASS_NAME
+     *
+     * @param loader
+     * @return
+     * @throws OMFactoryException
+     */
+    public static OMFactory findOMFactory(ClassLoader loader)
+            throws OMFactoryException {
+        return (OMFactory) findFactory(loader,
+                                       DEFAULT_OM_FACTORY_CLASS_NAME,
+                                       OMAbstractFactory.OM_FACTORY_NAME_PROPERTY);
+    }
+
+    /**
+     *
+     * @param classLoader
+     * @param soapFactory
+     * @return The SOAPFactory
+     */
+    public static SOAPFactory findSOAPFactory(final ClassLoader classLoader,
+                                              final String soapFactory) {
+        return (SOAPFactory) findFactory(classLoader,
+                                         soapFactory,
+                                         null);
+    }
+}
diff --git a/src/org/apache/ws/commons/om/OMAbstractFactory.java b/src/org/apache/ws/commons/om/OMAbstractFactory.java
new file mode 100644
index 0000000..c9a0925
--- /dev/null
+++ b/src/org/apache/ws/commons/om/OMAbstractFactory.java
@@ -0,0 +1,123 @@
+/*
+ * Copyright 2004,2005 The Apache Software Foundation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      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.
+ */
+
+package org.apache.ws.commons.om;
+
+import org.apache.ws.commons.soap.SOAPFactory;
+import org.apache.ws.commons.soap.impl.llom.factory.SOAPLinkedListImplFactory;
+
+public class OMAbstractFactory {
+    public static final String OM_FACTORY_NAME_PROPERTY = "om.factory";
+    public static final String SOAP11_FACTORY_NAME_PROPERTY = "soap11.factory";
+    public static final String SOAP12_FACTORY_NAME_PROPERTY = "soap12.factory";
+    public static final String SOAP_FACTORY_NAME_PROPERTY = "soap.factory";
+
+    /**
+     * Picks up the default factory implementation from the classpath.
+     *
+     * @return Returns OMFactory.
+     */
+    public static OMFactory getOMFactory() {
+        return FactoryFinder.findOMFactory(null);
+    }
+
+    /**
+     * If user needs to provide his own factory implementation, provide the
+     * Class Loader here.
+     *
+     * @param classLoader
+     * @return Returns OMFactory.
+     */
+    public static OMFactory getOMFactory(ClassLoader classLoader) {
+        return FactoryFinder.findOMFactory(classLoader);
+    }
+
+    /**
+     * Gets the <code>soapFactory</code> factory implementation from the classpath
+     *
+     * @param soapFactory Fully qualified SOAP 1.1 or SOAP 1.2 Factory implementation class name
+     * @return Returns the SOAP 1.1 or 1.2 Factory implementation instance corresponding to <code>soapFactory</code>
+     */
+    public static SOAPFactory getSOAPFactory(String soapFactory) {
+        return FactoryFinder.findSOAPFactory(null, soapFactory);
+    }
+
+    /**
+     * Gets the <code>soapFactory</code> factory implementation using the provided
+     * <code>classLoader</code>
+     *
+     * @param classLoader
+     * @param soapFactory Fully qualified SOAP 1.1 or SOAP 1.2 Factory implementation class name
+     * @return Returns the SOAP 1.1 or 1.2 Factory implementation instance corresponding to <code>soapFactory</code>
+     */
+    public static SOAPFactory getSOAPFactory(ClassLoader classLoader, String soapFactory) {
+        return FactoryFinder.findSOAPFactory(classLoader, soapFactory);
+    }
+
+    /**
+     * Gets the default factory implementation from the classpath.
+     *
+     * @return Returns SOAPFactory.
+     */
+    public static SOAPFactory getSOAP11Factory() {
+        return FactoryFinder.findSOAP11Factory(null);
+    }
+
+    /**
+     * If user needs to provide his own factory implementation, provide the
+     * Class Loader here.
+     *
+     * @param classLoader
+     * @return Returns SOAPFactory.
+     */
+    public static SOAPFactory getSOAP11Factory(ClassLoader classLoader) {
+        return FactoryFinder.findSOAP11Factory(classLoader);
+    }
+
+    /**
+     * Gets the default factory implementation from the classpath.
+     *
+     * @return Returns SOAPFactory.
+     */
+    public static SOAPFactory getSOAP12Factory() {
+        return FactoryFinder.findSOAP12Factory(null);
+    }
+
+    /**
+     * If user needs to provide his own factory implementation, provide the
+     * Class Loader here.
+     *
+     * @param classLoader
+     * @return Returns SOAPFactory.
+     */
+    public static SOAPFactory getSOAP12Factory(ClassLoader classLoader) {
+        return FactoryFinder.findSOAP12Factory(classLoader);
+    }
+
+    /**
+     * WARNING - DO NOT USE THIS METHOD !!!!!.
+     * This method is used in the case where we do not know the correct SOAP version to be used.
+     * We can do some operation using the factory returned from this, without knowing the SOAP version.
+     * But most of the methods have not been implemented.
+     * We use this in the builder, where we want to first create the SOAP envelope to get the SOAP version.
+     * So this method is to solve the chicken and egg problem, we have. If you do not know the SOAP version to be used
+     * to process a particluar SOAP message you have recd, use this method to buid the SOAP envelope, and then extract the SOAP
+     * version from that envlope and switch to the proper factory using that.
+     */
+    public static SOAPFactory getDefaultSOAPFactory() {
+        return new SOAPLinkedListImplFactory();
+    }
+}
diff --git a/src/org/apache/ws/commons/om/OMAttribute.java b/src/org/apache/ws/commons/om/OMAttribute.java
new file mode 100644
index 0000000..66e03ca
--- /dev/null
+++ b/src/org/apache/ws/commons/om/OMAttribute.java
@@ -0,0 +1,59 @@
+/*
+ * Copyright 2004,2005 The Apache Software Foundation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      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.
+ */
+
+package org.apache.ws.commons.om;
+
+import javax.xml.namespace.QName;
+
+/**
+ * Interface OMAttribute
+ */
+public interface OMAttribute {
+    /**
+     * @return Returns localName.
+     */
+    public String getLocalName();
+
+    /**
+     * @param localName
+     */
+    public void setLocalName(String localName);
+
+    /**
+     * @return Returns String.
+     */
+    public String getAttributeValue();
+
+    /**
+     * @param value
+     */
+    public void setAttributeValue(String value);
+
+    /**
+     * @param omNamespace
+     */
+    public void setOMNamespace(OMNamespace omNamespace);
+
+    /**
+     * @return Returns OMNamespace.
+     */
+    public OMNamespace getNamespace();
+
+    /**
+     * @return Returns javax.xml.namespace.QName
+     */
+    public QName getQName();
+}
diff --git a/src/org/apache/ws/commons/om/OMComment.java b/src/org/apache/ws/commons/om/OMComment.java
new file mode 100644
index 0000000..c8e68f4
--- /dev/null
+++ b/src/org/apache/ws/commons/om/OMComment.java
@@ -0,0 +1,34 @@
+/*
+ * Copyright 2004,2005 The Apache Software Foundation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      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.
+ */
+
+package org.apache.ws.commons.om;
+
+/**
+ * Interface OMComment
+ */
+public interface OMComment extends OMNode {
+    /**
+     * Returns the value of this comment as defined by XPath 1.0.
+     * @return Returns String.
+     */
+    public String getValue();
+
+    /**
+     * Sets the content of this comment to the specified string.
+     * @param text
+     */
+    public void setValue(String text);
+}
diff --git a/src/org/apache/ws/commons/om/OMConstants.java b/src/org/apache/ws/commons/om/OMConstants.java
new file mode 100644
index 0000000..8b812f5
--- /dev/null
+++ b/src/org/apache/ws/commons/om/OMConstants.java
@@ -0,0 +1,75 @@
+/*
+ * Copyright 2004,2005 The Apache Software Foundation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      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.
+ */
+
+package org.apache.ws.commons.om;
+
+/**
+ * Interface OMConstants
+ */
+public interface OMConstants {
+
+
+    // OMBuilder constants
+    /**
+     * Field PUSH_TYPE_BUILDER
+     */
+    public static final short PUSH_TYPE_BUILDER = 0;
+
+    /**
+     * Field PULL_TYPE_BUILDER
+     */
+    public static final short PULL_TYPE_BUILDER = 1;
+
+    /**
+     * Field ARRAY_ITEM_NSURI
+     */
+    public static final String ARRAY_ITEM_NSURI =
+            "http://axis.apache.org/encoding/Arrays";
+
+    /**
+     * Field ARRAY_ITEM_LOCALNAME
+     */
+    public static final String ARRAY_ITEM_LOCALNAME = "item";
+
+    /**
+     * Field ARRAY_ITEM_NS_PREFIX
+     */
+    public static final String ARRAY_ITEM_NS_PREFIX = "arrays";
+
+    /**
+     * Field ARRAY_ITEM_QNAME
+     */
+    public static final String ARRAY_ITEM_QNAME =
+            OMConstants.ARRAY_ITEM_NS_PREFIX + ':'
+            + OMConstants.ARRAY_ITEM_LOCALNAME;
+
+    /**
+     * Field DEFAULT_CHAR_SET_ENCODING specifies the default
+     * character encoding scheme to be used
+     */
+    public static final String DEFAULT_CHAR_SET_ENCODING = "utf-8";
+    public static final String DEFAULT_XML_VERSION = "1.0";
+    
+    
+    public static final String XMLNS_URI =
+        "http://www.w3.org/XML/1998/namespace";
+
+    public static final String XMLNS_NS_URI = "http://www.w3.org/2000/xmlns/";
+	public final static String XMLNS_NS_PREFIX = "xmlns";
+    
+    public static final String XMLNS_PREFIX =
+        "xml";
+}
diff --git a/src/org/apache/ws/commons/om/OMContainer.java b/src/org/apache/ws/commons/om/OMContainer.java
new file mode 100644
index 0000000..09972d0
--- /dev/null
+++ b/src/org/apache/ws/commons/om/OMContainer.java
@@ -0,0 +1,100 @@
+/*
+ * Copyright 2004,2005 The Apache Software Foundation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      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.
+ */
+
+package org.apache.ws.commons.om;
+
+import javax.xml.namespace.QName;
+import java.util.Iterator;
+
+/**
+ * Captures the operations related to containment shared by both a document and an element.
+ *
+ * <p>Exposes the ability to add, find, and iterate over the children of a document or
+ * element.</p>
+ */
+public interface OMContainer {
+
+    /**
+     * Adds the given node as the last child. One must preserve the order of children, 
+     * in this operation.
+     * Tip : appending the new child is preferred.
+     *
+     * @param omNode
+     */
+    public void addChild(OMNode omNode);
+
+    /**
+     * Returns an iterator for child nodes matching the criteria indicated by the given QName.
+     *
+     * <p>This function searches in three ways:
+     *  <ul>
+     *   <li>Exact match - Both parts of the passed QName are non-null.  Only children with the
+     *      same namespace and local name will be returned.
+     *   </li>
+     *  <li>Namespace match - The local name of the passed QName is null.  All children matching the
+     *      namespace will be returned by the iterator.
+     *  </li>
+     *  <li>Local name match - The namespace of the passed QName is null.  All children with the
+     *      matching local name will be returned by the iterator.
+     *  </li>
+     * </ul>
+     *
+     * <p>
+     * <b>Example:</b> <code>header.getChildrenWithName( new QName(ADDRESSING_NAMESPACE, null));</code>
+     *  will return all of the "addressing" headers.
+     * </p>
+     *
+     * @param elementQName The QName specifying namespace and local name to match.
+     * @return Returns an iterator of {@link OMElement} items that match the given QName appropriately.
+     */
+    public Iterator getChildrenWithName(QName elementQName);
+
+    /**
+     * Returns the first child in document order that matches the given QName criteria.
+     *
+     * <p>The QName filter is applied as in the function {@link #getChildrenWithName}.</p>
+     *
+     * @param elementQName The QName to use for matching.
+     *
+     * @return Returns the first element in document order that matches the <tt>elementQName</tt> criteria.
+     *
+     * @see #getChildrenWithName
+     *
+     * @throws OMException Could indirectly trigger building of child nodes.
+     */
+    public OMElement getFirstChildWithName(QName elementQName) throws OMException;
+
+    /**
+     * Returns an iterator for the children of the container.
+     *
+     * @return Returns a {@link Iterator} of children, all of which implement {@link OMNode}.
+     *
+     * @see #getFirstChildWithName
+     * @see #getChildrenWithName
+     */
+    public Iterator getChildren();
+
+    /**
+     * Gets the first child.
+     *
+     * @return Returns the first child.  May return null if the container has no children.
+     */
+    public OMNode getFirstOMChild();
+
+    public boolean isComplete();
+
+    public void buildNext();
+}
diff --git a/src/org/apache/ws/commons/om/OMDocType.java b/src/org/apache/ws/commons/om/OMDocType.java
new file mode 100644
index 0000000..31fd3c6
--- /dev/null
+++ b/src/org/apache/ws/commons/om/OMDocType.java
@@ -0,0 +1,34 @@
+/*
+ * Copyright 2004,2005 The Apache Software Foundation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      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.
+ */
+
+package org.apache.ws.commons.om;
+
+/**
+ * Interface OMDocType
+ */
+public interface OMDocType extends OMNode {
+    /**
+     * Returns the value of this DocType.
+     * @return Returns String.
+     */
+    public String getValue();
+
+    /**
+     * Sets the content of this DocType to the specified string.
+     * @param text
+     */
+    public void setValue(String text);
+}
diff --git a/src/org/apache/ws/commons/om/OMDocument.java b/src/org/apache/ws/commons/om/OMDocument.java
new file mode 100644
index 0000000..7242506
--- /dev/null
+++ b/src/org/apache/ws/commons/om/OMDocument.java
@@ -0,0 +1,110 @@
+/*
+ * Copyright 2004,2005 The Apache Software Foundation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      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.
+ */
+
+package org.apache.ws.commons.om;
+
+import javax.xml.stream.XMLStreamException;
+import java.io.OutputStream;
+
+
+public interface OMDocument extends OMContainer {
+
+    /**
+     * Field XML_10 XML Version 1.0
+     */
+    public final static String XML_10 = "1.0";
+
+    /**
+     * Field XML_11 XML Version 1.1
+     */
+    public final static String XML_11 = "1.1";
+
+    /**
+     * Returns the document element.
+     * @return Returns OMElement.
+     */
+    public OMElement getOMDocumentElement();
+
+    /**
+     * Sets the document element of the XML document.
+     * @param rootElement
+     */
+    public void setOMDocumentElement(OMElement rootElement);
+
+    /**
+     * Returns the XML version.
+     * @return Returns String.
+     */
+    public String getXMLVersion();
+
+    /**
+     * Sets the XML version.
+     * @see org.apache.ws.commons.om.impl.llom.OMDocumentImpl#XML_10 XML 1.0
+     * @see org.apache.ws.commons.om.impl.llom.OMDocumentImpl#XML_11 XML 1.1
+     * @param version
+     */
+    public void setXMLVersion(String version);
+
+    /**
+     * Returns the character set encoding scheme.
+     * @return Returns String.
+     */
+    public String getCharsetEncoding();
+
+    /**
+     * Sets the character set encoding scheme to be used.
+     * @param charsetEncoding
+     */
+    public void setCharsetEncoding(String charsetEncoding);
+
+    /**
+     * XML standalone value.
+     * This will be yes, no or null (if not available)
+     * @return Returns boolean.
+     */
+    public String isStandalone();
+    public void setStandalone(String isStandalone);
+
+    /**
+     * Serializes the OMDocument.
+     * @param output
+     * @param format
+     * @throws XMLStreamException
+     */
+    public void serializeAndConsume(OutputStream output, OMOutputFormat format) throws XMLStreamException;
+
+    /**
+     * Builds the OM node/tree and then serializes the document.
+     * @param output
+     * @param format
+     * @throws XMLStreamException
+     */
+    public void serialize(OutputStream output, OMOutputFormat format) throws XMLStreamException;
+
+    /**
+     * Serializes the OMDocument.
+     * @param output
+     * @throws XMLStreamException
+     */
+    public void serializeAndConsume(OutputStream output) throws XMLStreamException;
+
+    /**
+     * Serializes the document with cache on.
+     * @param output
+     * @throws XMLStreamException
+     */
+    public void serialize(OutputStream output) throws XMLStreamException;
+}
diff --git a/src/org/apache/ws/commons/om/OMElement.java b/src/org/apache/ws/commons/om/OMElement.java
new file mode 100644
index 0000000..9c72b21
--- /dev/null
+++ b/src/org/apache/ws/commons/om/OMElement.java
@@ -0,0 +1,299 @@
+/*
+ * Copyright 2004,2005 The Apache Software Foundation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      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.
+ */
+
+package org.apache.ws.commons.om;
+
+import javax.xml.namespace.QName;
+import javax.xml.stream.XMLStreamException;
+import javax.xml.stream.XMLStreamReader;
+import java.util.Iterator;
+
+/**
+ * A particular kind of node that represents an element infoset information item.
+ * <p/>
+ * <p>An element has a collection of children, attributes, and namespaces.</p>
+ * <p>In contrast with DOM, this interface exposes namespaces separately from the
+ * attributes.</p>
+ */
+public interface OMElement extends OMNode, OMContainer {
+
+    /**
+     * Returns a filtered list of children - just the elements.
+     *
+     * @return Returns an iterator over the child elements.
+     * @see #getChildren()
+     * @see #getChildrenWithName(javax.xml.namespace.QName)
+     */
+    public Iterator getChildElements();
+
+    /**
+     * Creates a namespace in the current element scope.
+     *
+     * @param uri    The namespace to declare in the current scope.  The
+     *               caller is expected to ensure that the URI is a valid namespace name.
+     * @param prefix The prefix to associate with the given namespace.
+     *               The caller is expected to ensure that this is a valid XML prefix.
+     * @return Returns the created namespace information item.
+     * @see #declareNamespace(OMNamespace)
+     * @see #findNamespace(String, String)
+     * @see #getAllDeclaredNamespaces()
+     */
+    public OMNamespace declareNamespace(String uri, String prefix);
+
+    /**
+     * Declares a namespace with the element as its scope.
+     *
+     * @param namespace The namespace to declare
+     * @return Returns the namespace parameter passed.
+     * @see #declareNamespace(String, String)
+     * @see #findNamespace(String, String)
+     * @see #getAllDeclaredNamespaces()
+     */
+    public OMNamespace declareNamespace(OMNamespace namespace);
+
+    /**
+     * Finds a namespace with the given uri and prefix, in the scope of the hierarchy.
+     * <p/>
+     * <p>Searches from the current element and goes up the hiararchy until a match is found.
+     * If no match is found, returns <tt>null</tt>.</p>
+     * <p/>
+     * <p>Either <tt>prefix</tt> or <tt>uri</tt> should be null.  Results are undefined
+     * if both are specified.</p>
+     *
+     * @param uri    The namespace to look for.  If this is specified, <tt>prefix</tt> should be null.
+     * @param prefix The prefix to look for.  If this is specified, <tt>uri</tt> should be null.
+     * @return Returns the matching namespace declaration, or <tt>null</tt> if none was found.
+     * @see #declareNamespace(String, String)
+     * @see #declareNamespace(OMNamespace)
+     * @see #getAllDeclaredNamespaces()
+     */
+    public OMNamespace findNamespace(String uri, String prefix);
+
+    /**
+     * Checks for a namespace in the context of this element with the given prefix and
+     * returns the relevant namespace object, if available. If not available, returns null.
+     *
+     * @param prefix
+     */
+    public OMNamespace findNamespaceURI(String prefix);
+
+    /**
+     * Returns an iterator for all of the namespaces declared on this element.
+     * <p/>
+     * <p>If you're interested in all namespaces in scope, you need to call this function
+     * for all parent elements as well.  Note that the iterator may be invalidated by
+     * any call to either <tt>declareNamespace</tt> function.
+     * </p>
+     *
+     * @return Returns an iterator over the {@link OMNamespace} items declared on the current element.
+     * @see #findNamespace(String, String)
+     * @see #declareNamespace(String, String)
+     * @see #declareNamespace(OMNamespace)
+     */
+    public Iterator getAllDeclaredNamespaces() throws OMException;
+
+    /**
+     * Returns a list of OMAttributes.
+     * 
+     * <p>Note that the iterator returned by this function will be invalidated by
+     * any <tt>addAttribute</tt> call.
+     * </p>
+     *
+     * @return Returns an {@link Iterator} of {@link OMAttribute} items associated with the element.
+     * @see #getAttribute
+     * @see #addAttribute(OMAttribute)
+     * @see #addAttribute(String, String, OMNamespace)
+     */
+    public Iterator getAllAttributes();
+
+    /**
+     * Returns a named attribute if present.
+     *
+     * @param qname the qualified name to search for
+     * @return Returns an OMAttribute with the given name if found, or null
+     */
+    public OMAttribute getAttribute(QName qname);
+
+    /**
+     * Returns a named attribute's value, if present.
+     *
+     * @param qname the qualified name to search for
+     * @return Returns a String containing the attribute value, or null
+     */
+    public String getAttributeValue(QName qname);
+
+    /**
+     * Adds an attribute to this element.
+     * <p/>
+     * <p>There is no order implied by added attributes.</p>
+     *
+     * @param attr The attribute to add.
+     * @return Returns the passed in attribute.
+     */
+    public OMAttribute addAttribute(OMAttribute attr);
+
+    /**
+     * Adds an attribute to the current element.
+     * <p/>
+     * <p>This function does not check to make sure that the given attribute value can be serialized directly
+     * as an XML value.  The caller may, for example, pass a string with the character 0x01.
+     *
+     * @param attributeName The "local name" for the attribute.
+     * @param value         The string value of the attribute.
+     * @param ns            The namespace has to be one of the in scope namespace. i.e. the passed namespace
+     *                      must be declared in the parent element of this attribute or ancestors of the parent element of the attribute.
+     * @return Returns the added attribute.
+     */
+    public OMAttribute addAttribute(String attributeName, String value,
+                                    OMNamespace ns);
+
+    /**
+     * Method removeAttribute
+     *
+     * @param attr
+     */
+    public void removeAttribute(OMAttribute attr);
+
+    /**
+     * Method setBuilder.
+     *
+     * @param wrapper
+     */
+    public void setBuilder(OMXMLParserWrapper wrapper);
+
+    /**
+     * Returns the builder object.
+     *
+     * @return Returns the builder object used to construct the underlying XML infoset on the fly.
+     */
+    public OMXMLParserWrapper getBuilder();
+
+    /**
+     * Sets the first child.
+     *
+     * @param node
+     */
+    public void setFirstChild(OMNode node);
+
+    /**
+     * Returns the first child element of the element.
+     *
+     * @return Returns the first child element of the element, or <tt>null</tt> if none was found.
+     */
+
+    public OMElement getFirstElement();
+
+
+    /**
+     * Returns the pull parser that will generate the pull
+     * events relevant to THIS element.
+     * <p/>
+     * <p>Caching is on.</p>
+     *
+     * @return Returns an XMLStreamReader relative to this element.
+     */
+    public XMLStreamReader getXMLStreamReader();
+
+    /**
+     * Returns the pull parser that will generate the pull
+     * events relevant to THIS element.
+     * <p/>
+     * <p>Caching is off.</p>
+     *
+     * @return Returns an XMLStreamReader relative to this element, with no caching.
+     */
+    public XMLStreamReader getXMLStreamReaderWithoutCaching();
+
+    /**
+     * @param text
+     */
+    public void setText(String text);
+
+    /**
+     * Returns the non-empty text children as a String.
+     *
+     * @return Returns a String representing the concatenation of the child text nodes.
+     */
+    public String getText();
+
+    /**
+     * Returns the local name of the element.
+     *
+     * @return Returns the local name of the element.
+     */
+    public String getLocalName();
+
+    /**
+     * Method setLocalName
+     *
+     * @param localName
+     */
+    public void setLocalName(String localName);
+
+    /**
+     * @return Returns the OMNamespace object associated with this element
+     * @throws OMException
+     */
+    public OMNamespace getNamespace() throws OMException;
+
+    /**
+     * Sets the Namespace.
+     *
+     * @param namespace
+     */
+    public void setNamespace(OMNamespace namespace);
+
+    /**
+     * Gets the QName of this node.
+     *
+     * @return Returns the {@link QName} for the element.
+     */
+    public QName getQName();
+
+    /**
+     * This is a convenience method only. This will basically serialize the given OMElement
+     * to a String but will build the OMTree in the memory
+     */
+    public String toString();
+
+    /**
+     * This is a convenience method only. This basically serializes the given OMElement
+     * to a String but will NOT build the OMTree in the memory. So you are at your own risk of
+     * losing information.
+     */
+    public String toStringWithConsume() throws XMLStreamException;
+
+
+    /**
+     * Turns a prefix:local qname string into a proper QName, evaluating it in the OMElement context.
+     * Unprefixed qnames resolve to the local namespace.
+     *
+     * @param qname prefixed qname string to resolve
+     * @return Returns null for any failure to extract a qname.
+     */
+    QName resolveQName(String qname);
+
+    /**
+     * Clones this element. Since both elements are build compleletely, you will
+     * lose the differed building capability.
+     * @return Returns OMElement.
+     */
+    public OMElement cloneOMElement();
+
+
+    public void setLineNumber(int lineNumber);
+    public int getLineNumber();
+}
diff --git a/src/org/apache/ws/commons/om/OMException.java b/src/org/apache/ws/commons/om/OMException.java
new file mode 100644
index 0000000..c18d7ef
--- /dev/null
+++ b/src/org/apache/ws/commons/om/OMException.java
@@ -0,0 +1,56 @@
+/*
+ * Copyright 2004,2005 The Apache Software Foundation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      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.
+ */
+
+package org.apache.ws.commons.om;
+
+/**
+ * Class OMException
+ */
+public class OMException extends RuntimeException {
+    /**
+     * Constructor OMException
+     */
+    public OMException() {
+    }
+
+    /**
+     * Constructor OMException
+     *
+     * @param message
+     */
+    public OMException(String message) {
+        super(message);
+    }
+
+    /**
+     * Constructor OMException
+     *
+     * @param message
+     * @param cause
+     */
+    public OMException(String message, Throwable cause) {
+        super(message, cause);
+    }
+
+    /**
+     * Constructor OMException
+     *
+     * @param cause
+     */
+    public OMException(Throwable cause) {
+        super(cause);
+    }
+}
diff --git a/src/org/apache/ws/commons/om/OMFactory.java b/src/org/apache/ws/commons/om/OMFactory.java
new file mode 100644
index 0000000..ce35ffa
--- /dev/null
+++ b/src/org/apache/ws/commons/om/OMFactory.java
@@ -0,0 +1,155 @@
+/*
+ * Copyright 2004,2005 The Apache Software Foundation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      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.
+ */
+
+package org.apache.ws.commons.om;
+
+import javax.xml.namespace.QName;
+
+/**
+ * Class OMFactory
+ */
+public interface OMFactory {
+
+	/**
+	 * Creates a new OMDocument.
+	 */
+	public OMDocument createOMDocument();
+	public OMDocument createOMDocument(OMXMLParserWrapper builder);
+	
+	
+    /**
+     * @param localName
+     * @param ns
+     */
+    public OMElement createOMElement(String localName, OMNamespace ns);
+    public OMElement createOMElement(String localName, OMNamespace ns, OMContainer parent) throws OMException;
+
+    /**
+     * @param localName
+     * @param ns
+     * @param parent
+     * @param builder
+     */
+    public OMElement createOMElement(String localName, OMNamespace ns,
+                                     OMContainer parent,
+                                     OMXMLParserWrapper builder);
+
+    /**
+     * This is almost the same as as createOMElement(localName,OMNamespace) method above.
+     * But some people may, for some reason, need to use the conventional method of putting a namespace.
+     * Or in other words people might not want to use the new OMNamespace.
+     * Well, this is for those people.
+     *
+     * @param localName
+     * @param namespaceURI
+     * @param namespacePrefix
+     * @return Returns the newly created OMElement.
+     */
+    public OMElement createOMElement(String localName,
+                                     String namespaceURI,
+                                     String namespacePrefix);
+
+    /**
+     * QName(localPart),
+     * QName(namespaceURI, localPart) - a prefix will be assigned to this
+     * QName(namespaceURI, localPart, prefix)
+     *
+     * @param qname
+     * @param parent
+     * @return Returns the new OMElement.
+     * @throws OMException
+     */
+    public OMElement createOMElement(QName qname, OMContainer parent)
+            throws OMException;
+
+    /**
+     * @param uri
+     * @param prefix
+     * @return Returns OMNameSpace.
+     */
+    public OMNamespace createOMNamespace(String uri, String prefix);
+
+    /**
+     * @param parent
+     * @param text
+     * @return Returns OMText.
+     */
+    public OMText createText(OMElement parent, String text);
+
+    /**
+     *
+     * @param parent
+     * @param text
+     * @param type - this should be either of XMLStreamConstants.CHARACTERS, XMLStreamConstants.CDATA,
+     * XMLStreamConstants.SPACE, XMLStreamConstants.ENTITY_REFERENCE
+     * @return Returns OMText.
+     */
+    public OMText createText(OMElement parent, String text, int type);
+
+    /**
+     * @param s
+     * @return Returns OMText.
+     */
+    public OMText createText(String s);
+
+    /**
+     *
+     * @param s
+     * @param type - OMText node can handle SPACE, CHARACTERS, CDATA and ENTITY REFERENCES. For Constants, use either
+     * XMLStreamConstants or constants found in OMNode.
+     * @return Returns OMText.
+     */ 
+    public OMText createText(String s, int type);
+
+    public OMText createText(String s, String mimeType, boolean optimize);
+
+    public OMText createText(Object dataHandler, boolean optimize);
+
+    public OMText createText(OMElement parent, String s, String mimeType,
+                             boolean optimize);
+
+    public OMText createText(String contentID, OMElement parent,
+            OMXMLParserWrapper builder);
+    
+    public OMAttribute createOMAttribute(String localName,
+                                         OMNamespace ns,
+                                         String value);
+
+    /**
+     * Creates DocType/DTD.
+     * @param parent
+     * @param content
+     * @return Returns doctype.
+     */
+    public OMDocType createOMDocType(OMContainer parent, String content);
+
+    /**
+     * Creates a PI.
+     * @param parent
+     * @param piTarget
+     * @param piData
+     * @return Returns OMProcessingInstruction.
+     */
+    public OMProcessingInstruction createOMProcessingInstruction(OMContainer parent, String piTarget, String piData);
+
+    /**
+     * Creates a comment.
+     * @param parent
+     * @param content
+     * @return Returns OMComment.
+     */
+    public OMComment createOMComment(OMContainer parent, String content);
+}
diff --git a/src/org/apache/ws/commons/om/OMFactoryException.java b/src/org/apache/ws/commons/om/OMFactoryException.java
new file mode 100644
index 0000000..d6136f8
--- /dev/null
+++ b/src/org/apache/ws/commons/om/OMFactoryException.java
@@ -0,0 +1,56 @@
+/*
+ * Copyright 2004,2005 The Apache Software Foundation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      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.
+ */
+
+package org.apache.ws.commons.om;
+
+/**
+ * Class OMFactoryException
+ */
+public class OMFactoryException extends OMException {
+    /**
+     * Constructor OMFactoryException
+     */
+    public OMFactoryException() {
+    }
+
+    /**
+     * Constructor OMFactoryException
+     *
+     * @param message
+     */
+    public OMFactoryException(String message) {
+        super(message);
+    }
+
+    /**
+     * Constructor OMFactoryException
+     *
+     * @param message
+     * @param cause
+     */
+    public OMFactoryException(String message, Throwable cause) {
+        super(message, cause);
+    }
+
+    /**
+     * Constructor OMFactoryException
+     *
+     * @param cause
+     */
+    public OMFactoryException(Throwable cause) {
+        super(cause);
+    }
+}
diff --git a/src/org/apache/ws/commons/om/OMNamespace.java b/src/org/apache/ws/commons/om/OMNamespace.java
new file mode 100644
index 0000000..ea3b909
--- /dev/null
+++ b/src/org/apache/ws/commons/om/OMNamespace.java
@@ -0,0 +1,45 @@
+/*
+ * Copyright 2004,2005 The Apache Software Foundation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      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.
+ */
+
+package org.apache.ws.commons.om;
+
+/**
+ * Interface OMNamespace
+ */
+public interface OMNamespace {
+    /**
+     * Method equals.
+     *
+     * @param uri
+     * @param prefix
+     * @return Returns boolean.
+     */
+    public boolean equals(String uri, String prefix);
+
+    /**
+     * Method getPrefix.
+     *
+     * @return Returns String.
+     */
+    public String getPrefix();
+
+    /**
+     * Method getName.
+     *
+     * @return Returns String.
+     */
+    public String getName();
+}
diff --git a/src/org/apache/ws/commons/om/OMNode.java b/src/org/apache/ws/commons/om/OMNode.java
new file mode 100644
index 0000000..5dfbff6
--- /dev/null
+++ b/src/org/apache/ws/commons/om/OMNode.java
@@ -0,0 +1,272 @@
+/*
+ * Copyright 2004,2005 The Apache Software Foundation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      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.
+ */
+
+package org.apache.ws.commons.om;
+
+import javax.xml.stream.XMLStreamConstants;
+import javax.xml.stream.XMLStreamException;
+import javax.xml.stream.XMLStreamWriter;
+import java.io.OutputStream;
+import java.io.Writer;
+
+/**
+ * Defines the base interface used by most of the XML object model within Axis.
+ *
+ * <p>This tree model for XML captures the idea of deferring the construction of child nodes
+ * until they are needed.  The <code>isComplete</code> function identifies whether or not
+ * a particular node has been fully parsed.  A node may not be fully parsed, for example, if
+ * all of the children of an element have not yet been parsed.</p>
+ *
+ * <p>In comparison to DOM, in this model, you will not find document fragments, or entities.
+ * In addition, while {@link OMDocument} and {@link OMAttribute} exist, neither is an extension
+ * of <code>OMNode</code>.
+ * </p>
+ */
+public interface OMNode {
+    /**
+     * The node is an <code>Element</code>.
+     *
+     * @see #getType()
+     */
+    public static final short ELEMENT_NODE = 1;
+
+    /**
+     * The node is a <code>Text</code> node.
+     *
+     * @see #getType()
+     */
+    public static final short TEXT_NODE = XMLStreamConstants.CHARACTERS;
+
+    /**
+     * The node is a <code>CDATASection</code>.
+     *
+     * @see #getType()
+     */
+    public static final short CDATA_SECTION_NODE = XMLStreamConstants.CDATA;
+
+    /**
+     * The node is a <code>Comment</code>.
+     *
+     * @see #getType()
+     */
+    public static final short COMMENT_NODE = XMLStreamConstants.COMMENT;
+
+    /**
+     * This node is a <code>DTD</code>.
+     *
+     * @see #getType()
+     */
+    public static final short DTD_NODE = XMLStreamConstants.DTD;
+
+    /**
+     * This node is a <code>ProcessingInstruction</code>.
+     *
+     * @see #getType()
+     */
+    public static final short PI_NODE = XMLStreamConstants.PROCESSING_INSTRUCTION;
+
+    /**
+     * This node is an <code>Entity Reference</code>.
+     *
+     * @see #getType()
+     */
+    public static final short ENTITY_REFERENCE_NODE = XMLStreamConstants.ENTITY_REFERENCE;
+
+    /**
+     * This node is an <code>Entity Reference</code>.
+     *
+     * @see #getType()
+     */
+    public static final short SPACE_NODE = XMLStreamConstants.SPACE;
+
+    /**
+     * Returns the parent containing node.
+     *
+     * <p>Returns the parent container, which may be either an {@link OMDocument} or {@link OMElement}.
+     *
+     * @return The {@link OMContainer} of the node.
+     */
+    public OMContainer getParent();
+
+    /**
+     * Returns the next sibling in document order.
+     *
+     * @return Returns the next sibling in document order.
+     */
+    public OMNode getNextOMSibling() throws OMException;
+
+    /**
+     * Indicates whether parser has parsed this information item completely or not.
+     * If some info are not available in the item, one has to check this attribute to make sure that, this
+     * item has been parsed completely or not.
+     *
+     * @return Returns boolean.
+     */
+    public boolean isComplete();
+
+    /**
+     * Removes a node (and all of its children) from its containing parent.
+     *
+     * <p>Removes a node from its parent.  Partially complete nodes will be completed before
+     * they are detached from the model.  A node cannot be detached until its next sibling
+     * has been identified, so that the next sibling and parent can be updated appropriately.
+     * Please note that this will not handle the namespaces. For example, if there you have used a
+     * namespace within the detaching node and which is defined outside the detaching node, user has
+     * to handle it manually.
+     * </p>
+     *
+     * @throws OMException If a node is not complete, the detach can trigger further
+     * parsing, which may cause an exception.
+     */
+    public OMNode detach() throws OMException;
+
+    /**
+     * Discards a node.
+     *
+     * <p>Discard goes to the parser level and if the element is not completely built, then it will be
+     * completely skipped at the parser level.</p>
+     *
+     * @throws OMException
+     */
+    public void discard() throws OMException;
+
+    /**
+     * Inserts a new sibling after the current node.
+     *
+     * @param sibling The node that will be added after the current node.
+     *
+     * @throws OMException
+     */
+    public void insertSiblingAfter(OMNode sibling) throws OMException;
+
+    /**
+     * Inserts a sibling just before the current node.
+     *
+     * @param sibling The node that will be added before the current node.
+     * @throws OMException
+     */
+    public void insertSiblingBefore(OMNode sibling) throws OMException;
+
+    /**
+     * Returns the type of node.
+     *
+     * @return Returns one of {@link #ELEMENT_NODE}, {@link #TEXT_NODE}, {@link #CDATA_SECTION_NODE}, {@link #COMMENT_NODE},
+     *  {@link #DTD_NODE}, {@link #PI_NODE}, {@link #ENTITY_REFERENCE_NODE}, {@link #SPACE_NODE},
+     * or {@link #TEXT_NODE}.
+     */
+    public int getType();
+
+    /**
+     * Gets the previous sibling.
+     *
+     * @return Returns node.
+     */
+    public OMNode getPreviousOMSibling();
+
+    /**
+     * Serializes the node with caching.
+     *
+     * @param xmlWriter
+     * @throws XMLStreamException
+     */
+    public void serialize(XMLStreamWriter xmlWriter)
+            throws XMLStreamException;
+
+    /**
+     * Serializes the node with caching.
+     *
+     * @param output
+     * @throws XMLStreamException
+     */
+    public void serialize(OutputStream output)
+            throws XMLStreamException;
+
+    /**
+     * Serializes the node with caching.
+     *
+     * @param writer
+     * @throws XMLStreamException
+     */
+    public void serialize(Writer writer)
+            throws XMLStreamException;
+
+    /**
+     * Serializes the node with caching.
+     *
+     * @param output
+     * @param format
+     * @throws XMLStreamException
+     */
+    public void serialize(OutputStream output, OMOutputFormat format)
+            throws XMLStreamException;
+
+    /**
+     * Serializes the node with caching.
+     *
+     * @param writer
+     * @param format
+     * @throws XMLStreamException
+     */
+    public void serialize(Writer writer, OMOutputFormat format)
+            throws XMLStreamException;
+    
+    /**
+     * Serializes the node without caching.
+     *
+     * @param xmlWriter
+     * @throws XMLStreamException
+     */
+    public void serializeAndConsume(XMLStreamWriter xmlWriter) throws XMLStreamException;
+
+    /**
+     * Serializes the node without caching.
+     *
+     * @param output
+     * @throws XMLStreamException
+     */
+    public void serializeAndConsume(OutputStream output) throws XMLStreamException;
+
+    /**
+     * Serializes the node without caching.
+     *
+     * @param writer
+     * @throws XMLStreamException
+     */
+    public void serializeAndConsume(Writer writer) throws XMLStreamException;
+
+    /**
+     * Serializes the node without caching.
+     *
+     * @param output
+     * @param format
+     * @throws XMLStreamException
+     */
+    public void serializeAndConsume(OutputStream output, OMOutputFormat format) throws XMLStreamException;
+
+    /**
+     * Serializes the node without caching.
+     *
+     * @param writer
+     * @param format
+     * @throws XMLStreamException
+     */
+    public void serializeAndConsume(Writer writer, OMOutputFormat format) throws XMLStreamException;
+
+    /**
+     * Builds itself.
+     */
+    public void build();
+}
diff --git a/src/org/apache/ws/commons/om/OMOutputFormat.java b/src/org/apache/ws/commons/om/OMOutputFormat.java
new file mode 100644
index 0000000..54ca345
--- /dev/null
+++ b/src/org/apache/ws/commons/om/OMOutputFormat.java
@@ -0,0 +1,142 @@
+/*
+ * Copyright 2004,2005 The Apache Software Foundation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      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.
+ */
+
+package org.apache.ws.commons.om;
+
+import org.apache.ws.commons.om.impl.MIMEOutputUtils;
+import org.apache.ws.commons.om.util.UUIDGenerator;
+import org.apache.ws.commons.soap.SOAP11Constants;
+import org.apache.ws.commons.soap.SOAP12Constants;
+
+
+/**
+ * Formats options for OM Output.
+ */
+public class OMOutputFormat {
+    private String mimeBoundary = null;
+    private String rootContentId = null;
+    private int nextid = 0;
+    private boolean doOptimize;
+    private boolean isSoap11 = true;
+
+    /**
+     * Field DEFAULT_CHAR_SET_ENCODING. Specifies the default
+     * character encoding scheme to be used.
+     */
+    public static final String DEFAULT_CHAR_SET_ENCODING = "utf-8";
+
+    private String charSetEncoding;
+    private String xmlVersion;
+    private boolean ignoreXMLDeclaration = false;
+
+
+    public OMOutputFormat() {
+    }
+
+    public boolean isOptimized() {
+        return doOptimize;
+    }
+
+    public String getContentType() {
+        String SOAPContentType;
+        if (isOptimized()) {
+            if (isSoap11) {
+                SOAPContentType = SOAP11Constants.SOAP_11_CONTENT_TYPE;
+            } else {
+                SOAPContentType = SOAP12Constants.SOAP_12_CONTENT_TYPE;
+            }
+            return MIMEOutputUtils.getContentTypeForMime(
+                    getMimeBoundary(),
+                    getRootContentId(),
+                    this.getCharSetEncoding(), SOAPContentType);
+        } else {
+            if (!isSoap11) {
+                return SOAP12Constants.SOAP_12_CONTENT_TYPE;
+            } else {
+                return SOAP11Constants.SOAP_11_CONTENT_TYPE;
+            }
+        }
+    }
+
+    public String getMimeBoundary() {
+        if (mimeBoundary == null) {
+            mimeBoundary =
+                    "MIMEBoundary"
+                            + UUIDGenerator.getUUID();
+        }
+        return mimeBoundary;
+    }
+
+    public String getRootContentId() {
+        if (rootContentId == null) {
+            rootContentId =
+                    "0."
+                            + UUIDGenerator.getUUID()
+                            + "@apache.org";
+        }
+        return rootContentId;
+    }
+
+    public String getNextContentId() {
+        nextid++;
+        return nextid
+                + "."
+                + UUIDGenerator.getUUID()
+                + "@apache.org";
+    }
+
+    /**
+     * Returns the character set encoding scheme. If the value of the
+     * charSetEncoding is not set then the default will be returned.
+     *
+     * @return Returns encoding string.
+     */
+    public String getCharSetEncoding() {
+        return this.charSetEncoding;
+    }
+
+    public void setCharSetEncoding(String charSetEncoding) {
+        this.charSetEncoding = charSetEncoding;
+    }
+
+    public String getXmlVersion() {
+        return xmlVersion;
+    }
+
+    public void setXmlVersion(String xmlVersion) {
+        this.xmlVersion = xmlVersion;
+    }
+
+    public void setSOAP11(boolean b) {
+        isSoap11 = b;
+    }
+    
+    public boolean isSOAP11() {
+        return isSoap11;
+    }
+
+    public boolean isIgnoreXMLDeclaration() {
+        return ignoreXMLDeclaration;
+    }
+
+    public void setIgnoreXMLDeclaration(boolean ignoreXMLDeclaration) {
+        this.ignoreXMLDeclaration = ignoreXMLDeclaration;
+    }
+
+    public void setDoOptimize(boolean b) {
+        doOptimize = b;
+    }
+}
diff --git a/src/org/apache/ws/commons/om/OMProcessingInstruction.java b/src/org/apache/ws/commons/om/OMProcessingInstruction.java
new file mode 100644
index 0000000..62caef1
--- /dev/null
+++ b/src/org/apache/ws/commons/om/OMProcessingInstruction.java
@@ -0,0 +1,46 @@
+/*
+ * Copyright 2004,2005 The Apache Software Foundation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      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.
+ */
+
+package org.apache.ws.commons.om;
+
+/**
+ * Interface OMProcessingInstruction
+ */
+public interface OMProcessingInstruction extends OMNode {
+    /**
+     * Sets the target of this Processing Instruction.
+     * @param target
+     */
+    public void setTarget(String target);
+
+    /**
+     * Gets the target of this Processing Instruction.
+      * @return Returns string.
+     */
+    public String getTarget();
+
+    /**
+     * Sets the value of this Processing Instruction.
+     * @param value
+     */
+    public void setValue(String value);
+
+    /**
+     * Gets the value of this Processing Instruction.
+      * @return Returns String.
+     */
+    public String getValue();
+}
diff --git a/src/org/apache/ws/commons/om/OMSerializer.java b/src/org/apache/ws/commons/om/OMSerializer.java
new file mode 100644
index 0000000..ba60136
--- /dev/null
+++ b/src/org/apache/ws/commons/om/OMSerializer.java
@@ -0,0 +1,36 @@
+/*
+ * Copyright 2004,2005 The Apache Software Foundation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      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.
+ */
+
+package org.apache.ws.commons.om;
+
+import javax.xml.stream.XMLStreamException;
+import javax.xml.stream.XMLStreamReader;
+import javax.xml.stream.XMLStreamWriter;
+
+/**
+ * Interface OMSerializer
+ */
+public interface OMSerializer {
+    /**
+     * Method serializeAndConsume
+     *
+     * @param reader
+     * @param writer
+     * @throws XMLStreamException
+     */
+    void serialize(XMLStreamReader reader, XMLStreamWriter writer)
+            throws XMLStreamException;
+}
diff --git a/src/org/apache/ws/commons/om/OMText.java b/src/org/apache/ws/commons/om/OMText.java
new file mode 100644
index 0000000..d3054ac
--- /dev/null
+++ b/src/org/apache/ws/commons/om/OMText.java
@@ -0,0 +1,54 @@
+/*
+ * Copyright 2004,2005 The Apache Software Foundation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      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.
+ */
+
+package org.apache.ws.commons.om;
+
+
+/**
+ * Interface OMText
+ */
+public interface OMText extends OMNode {
+    /**
+     * Returns the text value of this node.
+     *
+     * @return Returns String.
+     */
+    String getText();
+
+    /**
+     * Gets the datahandler.
+     * @return Returns datahandler.
+     */
+    Object getDataHandler();
+
+    /**
+     * @return Returns boolean flag saying whether the node contains
+     *         an optimized text or not.
+     */
+    boolean isOptimized();
+
+    /**
+     * Sets the optimize flag.
+     * @param value
+     */
+    void setOptimize(boolean value);
+
+    /**
+     * Gets the content id.
+     * @return Returns String.
+     */
+    String getContentID();
+}
diff --git a/src/org/apache/ws/commons/om/OMXMLParserWrapper.java b/src/org/apache/ws/commons/om/OMXMLParserWrapper.java
new file mode 100644
index 0000000..da32d15
--- /dev/null
+++ b/src/org/apache/ws/commons/om/OMXMLParserWrapper.java
@@ -0,0 +1,95 @@
+/*
+ * Copyright 2004,2005 The Apache Software Foundation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      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.
+ */
+
+package org.apache.ws.commons.om;
+
+/**
+ * Interface OMXMLParserWrapper
+ */
+public interface OMXMLParserWrapper {
+    /**
+     * Proceed the parser one step and return the event value.
+     *
+     * @return Returns int.
+     * @throws org.apache.ws.commons.om.OMException
+     *
+     * @throws OMException
+     */
+    int next() throws OMException;
+
+    /**
+     * Discards the current element.
+     * This will remove the given element and its decendants.
+     *
+     * @param el
+     * @throws org.apache.ws.commons.om.OMException
+     *
+     * @throws OMException
+     */
+    void discard(OMElement el) throws OMException;
+
+    /**
+     * @param b
+     * @throws org.apache.ws.commons.om.OMException
+     *
+     * @throws OMException
+     */
+    void setCache(boolean b) throws OMException;
+
+    /**
+     * Allows to access the underlying parser. Since the parser
+     * depends on the underlying implementation, an Object is returned.
+     * However the implementations may have restrictions in letting access to
+     * the parser.
+     *
+     * @return Returns Object.
+     */
+    Object getParser();
+
+    /**
+     * @return Returns the complete status.
+     */
+    boolean isCompleted();
+
+    /**
+     * @return Returns the document element.
+     */
+    OMElement getDocumentElement();
+
+    /**
+     * Returns the type of the builder.
+     * Can be either PUSH_TYPE_BUILDER or PULL_TYPE_BUILDER.
+     *
+     * @return Returns short.
+     */
+    short getBuilderType();
+
+    /**
+     * Registers an external content handler. Especially useful for
+     * push type builders. Throws an unsupportedOperationException if
+     * such handler registration is not supported.
+     *
+     * @param obj
+     */
+    void registerExternalContentHandler(Object obj);
+
+    /**
+     * get the registered external content handler
+     *
+     * @return Returns Object.
+     */
+    Object getRegisteredContentHandler();
+}
diff --git a/src/org/apache/ws/commons/om/impl/MIMEOutputUtils.java b/src/org/apache/ws/commons/om/impl/MIMEOutputUtils.java
new file mode 100644
index 0000000..d2e8c33
--- /dev/null
+++ b/src/org/apache/ws/commons/om/impl/MIMEOutputUtils.java
@@ -0,0 +1,139 @@
+/*
+ * Copyright 2004,2005 The Apache Software Foundation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      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.
+ */
+
+package org.apache.ws.commons.om.impl;
+
+import org.apache.ws.commons.om.OMException;
+import org.apache.ws.commons.om.OMText;
+
+import javax.mail.MessagingException;
+import javax.mail.internet.MimeBodyPart;
+import javax.activation.DataHandler;
+import java.io.IOException;
+import java.io.OutputStream;
+import java.io.StringWriter;
+import java.util.Iterator;
+import java.util.LinkedList;
+
+public class MIMEOutputUtils {
+
+    private static byte[] CRLF =  { 13, 10 };
+
+    public static void complete(OutputStream outStream,
+                                StringWriter writer, LinkedList binaryNodeList,
+                                String boundary, String contentId, String charSetEncoding,String SOAPContentType) {
+        try {
+            startWritingMime(outStream, boundary);
+
+            javax.activation.DataHandler dh = new javax.activation.DataHandler(writer.toString(),
+                    "text/xml; charset=" + charSetEncoding);
+            MimeBodyPart rootMimeBodyPart = new MimeBodyPart();
+            rootMimeBodyPart.setDataHandler(dh);
+            
+            rootMimeBodyPart.addHeader("content-type",
+                    "application/xop+xml; charset=" + charSetEncoding + 
+					"; type=\""+SOAPContentType+"\";");
+            rootMimeBodyPart.addHeader("content-transfer-encoding", "binary");
+            rootMimeBodyPart.addHeader("content-id","<"+contentId+">");
+
+            writeBodyPart(outStream, rootMimeBodyPart, boundary);
+
+            Iterator binaryNodeIterator = binaryNodeList.iterator();
+            while (binaryNodeIterator.hasNext()) {
+                OMText binaryNode = (OMText) binaryNodeIterator.next();
+                writeBodyPart(outStream, createMimeBodyPart(binaryNode),
+                        boundary);
+            }
+            finishWritingMime(outStream);
+        } catch (IOException e) {
+            throw new OMException("Problem with the OutputStream.", e);
+        } catch (MessagingException e) {
+            throw new OMException("Problem writing Mime Parts.", e);
+        }
+    }
+
+    public static MimeBodyPart createMimeBodyPart(OMText node)
+            throws MessagingException {
+        MimeBodyPart mimeBodyPart = new MimeBodyPart();
+        final DataHandler dataHandler = (DataHandler) node.getDataHandler();
+        mimeBodyPart.setDataHandler(dataHandler);
+        mimeBodyPart.addHeader("content-id", "<"+node.getContentID()+">");
+        mimeBodyPart.addHeader("content-type", dataHandler.getContentType());
+        mimeBodyPart.addHeader("content-transfer-encoding", "binary");
+        return mimeBodyPart;
+
+    }
+
+    /**
+     * @throws IOException This will write the boundary to output Stream
+     */
+    public static void writeMimeBoundary(OutputStream outStream,
+                                         String boundary) throws IOException {
+        outStream.write(new byte[]{45, 45});
+        outStream.write(boundary.getBytes());
+    }
+
+    /**
+     * @throws IOException This will write the boundary with CRLF
+     */
+    public static void startWritingMime(OutputStream outStream,
+                                        String boundary)
+            throws IOException {
+        writeMimeBoundary(outStream, boundary);
+        //outStream.write(CRLF);
+    }
+
+    /**
+     * Writes a CRLF for the earlier boundary then the BodyPart data
+     * with headers followed by boundary. Writes only the boundary. No more
+     * CRLF's are written after that.
+     *
+     * @throws IOException
+     * @throws MessagingException
+     */
+    public static void writeBodyPart(OutputStream outStream,
+                                     MimeBodyPart part, 
+                                     String boundary) throws IOException,
+            MessagingException {
+        outStream.write(CRLF);
+        part.writeTo(outStream);
+        outStream.write(CRLF);
+        writeMimeBoundary(outStream, boundary);
+    }
+
+    /**
+     * @throws IOException This will write "--" to the end of last boundary
+     */
+    public static void finishWritingMime(OutputStream outStream)
+            throws IOException {
+        outStream.write(new byte[]{45, 45});
+    }
+
+    public static String getContentTypeForMime(String boundary, String contentId, String charSetEncoding, String SOAPContentType) {
+        StringBuffer sb = new StringBuffer();
+        sb.append("multipart/related");
+        sb.append("; ");
+        sb.append("boundary=");
+        sb.append(boundary);
+        sb.append("; ");
+        sb.append("type=\"application/xop+xml\"");
+        sb.append("; ");
+        sb.append("start=\"<" + contentId + ">\"");
+        sb.append("; ");
+        sb.append("start-info=\""+SOAPContentType+"\"");
+        return sb.toString();
+    }
+}
diff --git a/src/org/apache/ws/commons/om/impl/MTOMConstants.java b/src/org/apache/ws/commons/om/impl/MTOMConstants.java
new file mode 100644
index 0000000..82d14e6
--- /dev/null
+++ b/src/org/apache/ws/commons/om/impl/MTOMConstants.java
@@ -0,0 +1,37 @@
+/*
+ * Copyright 2004,2005 The Apache Software Foundation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      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.
+ */
+
+package org.apache.ws.commons.om.impl;
+
+public interface MTOMConstants {
+    public static final String XOP_INCLUDE = "Include";
+    public static final String XOP_NAMESPACE_URI = "http://www.w3.org/2004/08/xop/include";
+
+    /**
+     * If the Message is MTOM optimised then <code>MTOM_TYPE</code>
+     */
+    String MTOM_TYPE = "application/xop+xml";
+    /**
+     * If the message is Soap with Attachments <code>SWA_TYPE</code>
+     */
+    String SWA_TYPE = "text/xml";
+    /**
+     * <code>rootPart</code> is used as the key for the root BodyPart in the
+     * Parts HashMap
+     */
+    String ROOT_PART = "SoapPart";
+    String ATTACHMENTS = "Attachments";
+}
diff --git a/src/org/apache/ws/commons/om/impl/OMContainerEx.java b/src/org/apache/ws/commons/om/impl/OMContainerEx.java
new file mode 100644
index 0000000..c9d8fb0
--- /dev/null
+++ b/src/org/apache/ws/commons/om/impl/OMContainerEx.java
@@ -0,0 +1,32 @@
+/*
+ * Copyright 2004,2005 The Apache Software Foundation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      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.
+ */
+
+package org.apache.ws.commons.om.impl;
+
+import org.apache.ws.commons.om.OMContainer;
+import org.apache.ws.commons.om.OMNode;
+
+/**
+ * Interface OMContainerEx
+ *
+ * Internal Implementation detail. Adding special interface to stop folks from accidently using OMContainer.
+ * Please use at your own risk. May corrupt the data integrity.
+ */
+public interface OMContainerEx extends OMContainer {
+    public void setComplete(boolean state);
+
+    public void setFirstChild(OMNode omNode);
+}
diff --git a/src/org/apache/ws/commons/om/impl/OMNodeEx.java b/src/org/apache/ws/commons/om/impl/OMNodeEx.java
new file mode 100644
index 0000000..702d361
--- /dev/null
+++ b/src/org/apache/ws/commons/om/impl/OMNodeEx.java
@@ -0,0 +1,59 @@
+/*
+ * Copyright 2004,2005 The Apache Software Foundation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      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.
+ */
+
+package org.apache.ws.commons.om.impl;
+
+import org.apache.ws.commons.om.OMContainer;
+import org.apache.ws.commons.om.OMException;
+import org.apache.ws.commons.om.OMNode;
+
+import javax.xml.stream.XMLStreamException;
+
+/**
+ * Interface OMNodeEx
+ *
+ * Internal Implementation detail. Adding special interface to stop folks from accidently using OMNode.
+ * Please use at your own risk. May corrupt the data integrity.
+ */
+public interface OMNodeEx extends OMNode {
+    public void setNextOMSibling(OMNode node);
+
+    public void setPreviousOMSibling(OMNode previousSibling);
+
+    public void setParent(OMContainer element);
+
+    public void setComplete(boolean state);
+
+    public void setType(int nodeType) throws OMException;
+
+    /**
+     * Serializes the node with caching.
+     *
+     * @param omOutput
+     * @throws javax.xml.stream.XMLStreamException
+     * @see #serialize(org.apache.ws.commons.om.impl.OMOutputImpl)
+     */
+    public void serialize(org.apache.ws.commons.om.impl.OMOutputImpl omOutput)
+            throws XMLStreamException;
+
+    /**
+     * Serializes the node without caching.
+     *
+     * @param omOutput
+     * @throws XMLStreamException
+     */
+    public void serializeAndConsume(OMOutputImpl omOutput) throws XMLStreamException;
+}
diff --git a/src/org/apache/ws/commons/om/impl/OMOutputImpl.java b/src/org/apache/ws/commons/om/impl/OMOutputImpl.java
new file mode 100644
index 0000000..7aa6aaa
--- /dev/null
+++ b/src/org/apache/ws/commons/om/impl/OMOutputImpl.java
@@ -0,0 +1,169 @@
+/*
+ * Copyright 2004,2005 The Apache Software Foundation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      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.
+ */
+
+package org.apache.ws.commons.om.impl;
+
+import org.apache.ws.commons.om.OMOutputFormat;
+import org.apache.ws.commons.om.OMText;
+import org.apache.ws.commons.soap.SOAP11Constants;
+import org.apache.ws.commons.soap.SOAP12Constants;
+
+import javax.xml.stream.FactoryConfigurationError;
+import javax.xml.stream.XMLOutputFactory;
+import javax.xml.stream.XMLStreamException;
+import javax.xml.stream.XMLStreamWriter;
+import java.io.OutputStream;
+import java.io.StringWriter;
+import java.util.LinkedList;
+
+
+/**
+ * For the moment this assumes that transport takes the decision of whether
+ * to optimize or not by looking at whether the MTOM optimize is enabled &
+ * also looking at the OM tree whether it has any optimizable content.
+ */
+public class OMOutputImpl {
+    private XMLStreamWriter xmlWriter;
+    private OutputStream outStream;
+    private LinkedList binaryNodeList = new LinkedList();
+    private StringWriter bufferedSOAPBody;
+    private OMOutputFormat format = new OMOutputFormat();
+
+    public OMOutputImpl(XMLStreamWriter xmlWriter) {
+        this.xmlWriter = xmlWriter;
+    }
+
+    /**
+     * Creates a new OMOutputImpl with specified encoding.
+     *
+     * @param outStream
+     * @param format
+     * @throws XMLStreamException
+     * @throws FactoryConfigurationError
+     * @see OMOutputFormat#DEFAULT_CHAR_SET_ENCODING
+     */
+    public OMOutputImpl(OutputStream outStream, OMOutputFormat format)
+            throws XMLStreamException, FactoryConfigurationError {
+        this.format = format;
+        this.outStream = outStream;
+
+        if (format.getCharSetEncoding() == null) //Default encoding is UTF-8
+            format.setCharSetEncoding(OMOutputFormat.DEFAULT_CHAR_SET_ENCODING);
+
+        XMLOutputFactory factory = XMLOutputFactory.newInstance();
+
+        if (format.isOptimized()) {
+            bufferedSOAPBody = new StringWriter();
+            xmlWriter = factory.createXMLStreamWriter(bufferedSOAPBody);
+        } else {
+            xmlWriter = factory.createXMLStreamWriter(outStream,
+                    format.getCharSetEncoding());
+        }
+    }
+
+    public void flush() throws XMLStreamException {
+        xmlWriter.flush();
+        String SOAPContentType;
+        if (format.isOptimized()) {
+            if (format.isSOAP11()) {
+                SOAPContentType = SOAP11Constants.SOAP_11_CONTENT_TYPE;
+            } else {
+                SOAPContentType = SOAP12Constants.SOAP_12_CONTENT_TYPE;
+            }
+            MIMEOutputUtils.complete(
+                    outStream,
+                    bufferedSOAPBody,
+                    binaryNodeList,
+                    format.getMimeBoundary(),
+                    format.getRootContentId(),
+                    format.getCharSetEncoding(), SOAPContentType);
+        }
+    }
+
+    public boolean isOptimized() {
+        return format.isOptimized();
+    }
+
+    public String getContentType() {
+        return format.getContentType();
+    }
+
+    public void writeOptimized(OMText node) {
+        binaryNodeList.add(node);
+    }
+
+    public void setXmlStreamWriter(XMLStreamWriter xmlWriter) {
+        this.xmlWriter = xmlWriter;
+    }
+
+    public XMLStreamWriter getXmlStreamWriter() {
+        return xmlWriter;
+    }
+
+    public String getMimeBoundary() {
+        return format.getMimeBoundary();
+    }
+
+    public String getRootContentId() {
+        return format.getRootContentId();
+    }
+
+    public String getNextContentId() {
+        return format.getNextContentId();
+    }
+
+    /**
+     * Returns the character set encoding scheme. If the value of the
+     * charSetEncoding is not set then the default will be returned.
+     *
+     * @return Returns encoding.
+     */
+    public String getCharSetEncoding() {
+        return format.getCharSetEncoding();
+    }
+
+    public void setCharSetEncoding(String charSetEncoding) {
+        format.setCharSetEncoding(charSetEncoding);
+    }
+
+    public String getXmlVersion() {
+        return format.getXmlVersion();
+    }
+
+    public void setXmlVersion(String xmlVersion) {
+        format.setXmlVersion(xmlVersion);
+    }
+
+    public void setSoap11(boolean b) {
+        format.setSOAP11(b);
+    }
+
+    public boolean isIgnoreXMLDeclaration() {
+        return format.isIgnoreXMLDeclaration();
+    }
+
+    public void setIgnoreXMLDeclaration(boolean ignoreXMLDeclaration) {
+        format.setIgnoreXMLDeclaration(ignoreXMLDeclaration);
+    }
+
+    public void setDoOptimize(boolean b) {
+        format.setDoOptimize(b);
+    }
+
+    public void setOutputFormat(OMOutputFormat format) {
+        this.format = format;
+    }
+}
diff --git a/src/org/apache/ws/commons/om/impl/llom/EmptyOMLocation.java b/src/org/apache/ws/commons/om/impl/llom/EmptyOMLocation.java
new file mode 100644
index 0000000..1d44fdc
--- /dev/null
+++ b/src/org/apache/ws/commons/om/impl/llom/EmptyOMLocation.java
@@ -0,0 +1,45 @@
+package org.apache.ws.commons.om.impl.llom;
+
+import javax.xml.stream.Location;
+
+/*
+ * Copyright 2001-2004 The Apache Software Foundation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      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.
+ *
+ */
+
+public class EmptyOMLocation implements Location {
+
+
+    public int getLineNumber() {
+        return -1;  //To change body of implemented methods use File | Settings | File Templates.
+    }
+
+    public int getColumnNumber() {
+        return -1;  //To change body of implemented methods use File | Settings | File Templates.
+    }
+
+    public int getCharacterOffset() {
+        return 0;  //To change body of implemented methods use File | Settings | File Templates.
+    }
+
+    public String getPublicId() {
+        return null;  //To change body of implemented methods use File | Settings | File Templates.
+    }
+
+    public String getSystemId() {
+        return null;  //To change body of implemented methods use File | Settings | File Templates.
+    }
+
+}
diff --git a/src/org/apache/ws/commons/om/impl/llom/OMAttributeImpl.java b/src/org/apache/ws/commons/om/impl/llom/OMAttributeImpl.java
new file mode 100644
index 0000000..29aeebc
--- /dev/null
+++ b/src/org/apache/ws/commons/om/impl/llom/OMAttributeImpl.java
@@ -0,0 +1,123 @@
+/*
+ * Copyright 2004,2005 The Apache Software Foundation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      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.
+ */
+
+package org.apache.ws.commons.om.impl.llom;
+
+import org.apache.ws.commons.om.OMAttribute;
+import org.apache.ws.commons.om.OMNamespace;
+
+import javax.xml.namespace.QName;
+
+/**
+ * Class OMAttributeImpl
+ */
+public class OMAttributeImpl implements OMAttribute {
+    /**
+     * Field localName
+     */
+    private String localName;
+
+    /**
+     * Field value
+     */
+    private String value;
+
+    /**
+     * Field namespace
+     */
+    private OMNamespace namespace;
+
+    /**
+     * Constructor OMAttributeImpl.
+     *
+     * @param localName
+     * @param ns
+     * @param value
+     */
+    public OMAttributeImpl(String localName, OMNamespace ns, String value) {
+        setLocalName(localName);
+        setAttributeValue(value);
+        setOMNamespace(ns);
+    }
+
+    /**
+     *
+     * @return Returns QName.
+     */
+    public QName getQName() {
+        if(namespace != null){
+            return new QName(namespace.getName(), localName, namespace.getPrefix());
+        }else{
+            return new QName(localName);
+        }
+    }
+
+    // -------- Getters and Setters
+
+    /**
+     * Method getLocalName.
+     *
+     * @return Returns local name.
+     */
+    public String getLocalName() {
+        return localName;
+    }
+
+    /**
+     * Method setLocalName.
+     *
+     * @param localName
+     */
+    public void setLocalName(String localName) {
+        this.localName = localName;
+    }
+
+    /**
+     * Method getAttributeValue.
+     *
+     * @return Returns value.
+     */
+    public String getAttributeValue() {
+        return value;
+    }
+
+    /**
+     * Method setAttributeValue.
+     *
+     * @param value
+     */
+    public void setAttributeValue(String value) {
+        this.value = value;
+    }
+
+    /**
+     * Method setOMNamespace.
+     *
+     * @param omNamespace
+     */
+    public void setOMNamespace(OMNamespace omNamespace) {
+        this.namespace = omNamespace;
+    }
+
+    /**
+     * Method getNamespace.
+     *
+     * @return Returns namespace.
+     */
+    public OMNamespace getNamespace() {
+        return namespace;
+    }
+}
diff --git a/src/org/apache/ws/commons/om/impl/llom/OMCommentImpl.java b/src/org/apache/ws/commons/om/impl/llom/OMCommentImpl.java
new file mode 100644
index 0000000..744804c
--- /dev/null
+++ b/src/org/apache/ws/commons/om/impl/llom/OMCommentImpl.java
@@ -0,0 +1,107 @@
+/*
+ * Copyright 2004,2005 The Apache Software Foundation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      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.
+ */
+
+package org.apache.ws.commons.om.impl.llom;
+
+import org.apache.ws.commons.om.OMComment;
+import org.apache.ws.commons.om.OMContainer;
+import org.apache.ws.commons.om.OMElement;
+import org.apache.ws.commons.om.OMException;
+import org.apache.ws.commons.om.OMNode;
+import org.apache.ws.commons.om.impl.OMOutputImpl;
+
+import javax.xml.stream.XMLStreamException;
+import javax.xml.stream.XMLStreamWriter;
+
+public class OMCommentImpl extends OMNodeImpl implements OMComment {
+    protected String value;
+
+    /**
+     * Constructor OMCommentImpl.
+     *
+     * @param parentNode
+     * @param contentText
+     */
+    public OMCommentImpl(OMContainer parentNode, String contentText) {
+        super(parentNode);
+        this.value = contentText;
+        nodeType = OMNode.COMMENT_NODE;
+        this.done = true;
+    }
+
+    /**
+     * Constructor OMCommentImpl.
+     *
+     * @param parentNode
+     */
+    public OMCommentImpl(OMContainer parentNode) {
+        this(parentNode, null);
+    }
+
+    /**
+     * Serializes the node with caching.
+     *
+     * @param omOutput
+     * @throws XMLStreamException
+     * @see #serialize(org.apache.ws.commons.om.impl.OMOutputImpl)
+     */
+    public void serialize(OMOutputImpl omOutput) throws XMLStreamException {
+        XMLStreamWriter writer = omOutput.getXmlStreamWriter();
+        writer.writeComment(this.value);
+    }
+
+    /**
+     * Serializes the node without caching.
+     *
+     * @param omOutput
+     * @throws XMLStreamException
+     * @see #serializeAndConsume(org.apache.ws.commons.om.impl.OMOutputImpl)
+     */
+    public void serializeAndConsume(OMOutputImpl omOutput) throws XMLStreamException {
+        serialize(omOutput);
+    }
+
+    /**
+     * Gets the value of this comment.
+     *
+     * @return Returns String.
+     */
+    public String getValue() {
+        return value;
+    }
+
+    /**
+     * Sets the value of this comment.
+     *
+     * @param text
+     */
+    public void setValue(String text) {
+        this.value = text;
+    }
+
+    /**
+     * Discards this node.
+     *
+     * @throws OMException
+     */
+    public void discard() throws OMException {
+        if (done) {
+            this.detach();
+        } else {
+            builder.discard((OMElement) this.parent);
+        }
+    }
+}
diff --git a/src/org/apache/ws/commons/om/impl/llom/OMDocTypeImpl.java b/src/org/apache/ws/commons/om/impl/llom/OMDocTypeImpl.java
new file mode 100644
index 0000000..8a54fd3
--- /dev/null
+++ b/src/org/apache/ws/commons/om/impl/llom/OMDocTypeImpl.java
@@ -0,0 +1,106 @@
+/*
+ * Copyright 2004,2005 The Apache Software Foundation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      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.
+ */
+
+package org.apache.ws.commons.om.impl.llom;
+
+import org.apache.ws.commons.om.OMContainer;
+import org.apache.ws.commons.om.OMDocType;
+import org.apache.ws.commons.om.OMElement;
+import org.apache.ws.commons.om.OMException;
+import org.apache.ws.commons.om.OMNode;
+import org.apache.ws.commons.om.impl.OMOutputImpl;
+
+import javax.xml.stream.XMLStreamException;
+import javax.xml.stream.XMLStreamWriter;
+
+public class OMDocTypeImpl extends OMNodeImpl implements OMDocType {
+    protected String value;
+
+    /**
+     * Constructor OMDocTypeImpl.
+     *
+     * @param parentNode
+     * @param contentText
+     */
+    public OMDocTypeImpl(OMContainer parentNode, String contentText) {
+        super(parentNode);
+        this.value = contentText;
+        nodeType = OMNode.DTD_NODE;
+    }
+
+    /**
+     * Constructor OMDocTypeImpl.
+     *
+     * @param parentNode
+     */
+    public OMDocTypeImpl(OMContainer parentNode) {
+        this(parentNode, null);
+    }
+
+    /**
+     * Serializes the node with caching.
+     *
+     * @param omOutput
+     * @throws XMLStreamException
+     * @see #serialize(org.apache.ws.commons.om.impl.OMOutputImpl)
+     */
+    public void serialize(OMOutputImpl omOutput) throws XMLStreamException {
+        XMLStreamWriter writer = omOutput.getXmlStreamWriter();
+        writer.writeDTD(this.value);
+    }
+
+    /**
+     * Serializes the node without caching.
+     *
+     * @param omOutput
+     * @throws XMLStreamException
+     * @see #serializeAndConsume(org.apache.ws.commons.om.impl.OMOutputImpl)
+     */
+    public void serializeAndConsume(org.apache.ws.commons.om.impl.OMOutputImpl omOutput) throws XMLStreamException {
+        serialize(omOutput);
+    }
+
+    /**
+     * Gets the value of this DocType.
+     *
+     * @return Returns String.
+     */
+    public String getValue() {
+        return value;
+    }
+
+    /**
+     * Sets the value of this DocType.
+     *
+     * @param text
+     */
+    public void setValue(String text) {
+        this.value = text;
+    }
+
+    /**
+     * Discards this node.
+     *
+     * @throws OMException
+     */
+    public void discard() throws OMException {
+        if (done) {
+            this.detach();
+        } else {
+            builder.discard((OMElement) this.parent);
+        }
+    }
+}
diff --git a/src/org/apache/ws/commons/om/impl/llom/OMDocumentImpl.java b/src/org/apache/ws/commons/om/impl/llom/OMDocumentImpl.java
new file mode 100644
index 0000000..5cb9328
--- /dev/null
+++ b/src/org/apache/ws/commons/om/impl/llom/OMDocumentImpl.java
@@ -0,0 +1,402 @@
+/*
+ * Copyright 2004,2005 The Apache Software Foundation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      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.
+ */
+
+package org.apache.ws.commons.om.impl.llom;
+
+import org.apache.ws.commons.om.OMDocument;
+import org.apache.ws.commons.om.OMElement;
+import org.apache.ws.commons.om.OMException;
+import org.apache.ws.commons.om.OMNode;
+import org.apache.ws.commons.om.OMOutputFormat;
+import org.apache.ws.commons.om.OMXMLParserWrapper;
+import org.apache.ws.commons.om.impl.OMContainerEx;
+import org.apache.ws.commons.om.impl.OMNodeEx;
+import org.apache.ws.commons.om.impl.OMOutputImpl;
+import org.apache.ws.commons.om.impl.llom.traverse.OMChildrenIterator;
+import org.apache.ws.commons.om.impl.llom.traverse.OMChildrenQNameIterator;
+
+import javax.xml.namespace.QName;
+import javax.xml.stream.XMLStreamException;
+import java.io.OutputStream;
+import java.util.Iterator;
+
+/**
+ * Class OMDocumentImpl
+ */
+public class OMDocumentImpl implements OMDocument, OMContainerEx {
+    /**
+     * Field documentElement
+     */
+    protected OMElement documentElement;
+
+    /**
+     * Field firstChild
+     */
+    protected OMNode firstChild;
+
+    /**
+     * Field lastChild
+     */
+    protected OMNode lastChild;
+
+    /**
+     * Field done
+     */
+    protected boolean done = false;
+
+    /**
+     * Field parserWrapper
+     */
+    protected OMXMLParserWrapper parserWrapper;
+
+    /**
+     * Field charSetEncoding
+     * Default : UTF-8
+     */
+    protected String charSetEncoding = "UTF-8";
+
+    /**
+     * Field xmlVersion
+     */
+    protected String xmlVersion = "1.0";
+
+    protected String isStandalone;
+
+
+    /**
+     * Default constructor
+     */
+    public OMDocumentImpl() {
+        this.done = true;
+    }
+
+    /**
+     * @param documentElement
+     * @param parserWrapper
+     */
+    public OMDocumentImpl(OMElement documentElement, OMXMLParserWrapper parserWrapper) {
+        this.documentElement = documentElement;
+        this.parserWrapper = parserWrapper;
+    }
+
+    /**
+     * @param parserWrapper
+     */
+    public OMDocumentImpl(OMXMLParserWrapper parserWrapper) {
+        this.parserWrapper = parserWrapper;
+    }
+
+    /**
+     * Method getDocumentElement.
+     *
+     * @return Returns OMElement.
+     */
+    public OMElement getOMDocumentElement() {
+        while (documentElement == null) {
+            parserWrapper.next();
+        }
+        return documentElement;
+    }
+
+    /**
+     * Method setDocumentElement.
+     *
+     * @param documentElement
+     */
+    public void setOMDocumentElement(OMElement documentElement) {
+        this.documentElement = documentElement;
+    }
+
+    /**
+     * Indicates whether parser has parsed this information item completely or not.
+     * If some information is not available in the item, one has to check this 
+     * attribute to make sure that, this item has been parsed completely or not.
+     *
+     * @return Returns boolean.
+     */
+    public boolean isComplete() {
+        return done;
+    }
+
+    /**
+     * Method setComplete.
+     *
+     * @param state
+     */
+    public void setComplete(boolean state) {
+        this.done = state;
+    }
+
+    /**
+     * Forces the parser to proceed, if parser has not yet finished with the XML input.
+     */
+    public void buildNext() {
+        if (!parserWrapper.isCompleted())
+            parserWrapper.next();
+    }
+
+    /**
+     * Adds child to the element. One can decide whether to append the child or to add to the
+     * front of the children list.
+     *
+     * @param child
+     */
+    public void addChild(OMNode child) {
+    	if(child instanceof OMElement) {
+    		if(this.documentElement == null) {
+    			addChild((OMNodeImpl) child);
+    			this.documentElement = (OMElement)child;
+    		} else {
+    			throw new OMException("Document element already exists");
+    		}
+    	} else {
+    		addChild((OMNodeImpl) child);
+    	}
+    }
+
+    /**
+     * Method addChild.
+     *
+     * @param child
+     */
+    private void addChild(OMNodeImpl child) {
+        if (firstChild == null) {
+            firstChild = child;
+            child.setPreviousOMSibling(null);
+        } else {
+            child.setPreviousOMSibling(lastChild);
+            ((OMNodeEx)lastChild).setNextOMSibling(child);
+        }
+        child.setNextOMSibling(null);
+        child.setParent(this);
+        lastChild = child;
+
+    }
+
+    /**
+     * Returns a collection of this element.
+     * Children can be of types OMElement, OMText.
+     *
+     * @return Returns iterator.
+     */
+    public Iterator getChildren() {
+        return new OMChildrenIterator(getFirstOMChild());
+    }
+
+    /**
+     * Searches for children with a given QName and returns an iterator to traverse through
+     * the OMNodes.
+     * The QName can contain any combination of prefix, localname and URI.
+     *
+     * @param elementQName
+     * @return Returns Iterator.
+     * @throws org.apache.ws.commons.om.OMException
+     */
+    public Iterator getChildrenWithName(QName elementQName) {
+        return new OMChildrenQNameIterator(getFirstOMChild(),
+                elementQName);
+    }
+
+    /**
+     * Method getFirstOMChild.
+     *
+     * @return Returns first om child.
+     */
+    public OMNode getFirstOMChild() {
+        while ((firstChild == null) && !done) {
+            buildNext();
+        }
+        return firstChild;
+    }
+
+    /**
+     * Method getFirstChildWithName.
+     *
+     * @param elementQName
+     * @return Returns OMElement.
+     * @throws OMException
+     */
+    public OMElement getFirstChildWithName(QName elementQName) throws OMException {
+        OMChildrenQNameIterator omChildrenQNameIterator =
+                new OMChildrenQNameIterator(getFirstOMChild(),
+                        elementQName);
+        OMNode omNode = null;
+        if (omChildrenQNameIterator.hasNext()) {
+            omNode = (OMNode) omChildrenQNameIterator.next();
+        }
+
+        return ((omNode != null) && (OMNode.ELEMENT_NODE == omNode.getType())) ?
+                (OMElement) omNode : null;
+
+    }
+
+    /**
+     * Method setFirstChild.
+     *
+     * @param firstChild
+     */
+    public void setFirstChild(OMNode firstChild) {
+        this.firstChild = firstChild;
+    }
+
+
+    /**
+     * Returns the character set encoding scheme to be used.
+     *
+     * @return Returns charset.
+     */
+    public String getCharsetEncoding() {
+        return charSetEncoding;
+    }
+
+    /**
+     * Sets the character set encoding scheme.
+     *
+     * @param charEncoding
+     */
+    public void setCharsetEncoding(String charEncoding) {
+        this.charSetEncoding = charEncoding;
+    }
+
+    public String isStandalone() {
+        return isStandalone;
+    }
+
+    public void setStandalone(String isStandalone) {
+        this.isStandalone = isStandalone;
+    }
+
+    public String getXMLVersion() {
+        return xmlVersion;
+    }
+
+    public void setXMLVersion(String xmlVersion) {
+        this.xmlVersion = xmlVersion;
+    }
+
+    /**
+     * Serialize the docuement with/without the XML declaration
+     */
+    public void serializeAndConsume(OMOutputImpl omOutput, boolean includeXMLDeclaration) throws XMLStreamException {
+        serialize(omOutput, false, includeXMLDeclaration);
+    }
+
+    /**
+     * Serializes the document with the XML declaration.
+     */
+    public void serializeAndConsume(OMOutputImpl omOutput)
+            throws XMLStreamException {
+        serialize(omOutput, false, !omOutput.isIgnoreXMLDeclaration());
+    }
+
+
+    /**
+     * Serializes the document with cache.
+     */
+    public void serialize(OMOutputImpl omOutput) throws XMLStreamException {
+        serialize(omOutput, true, !omOutput.isIgnoreXMLDeclaration());
+
+    }
+
+    /**
+     * Serializes the document directly to the output stream with caching disabled.
+     * 
+     * @param output
+     * @throws XMLStreamException
+     */
+    public void serializeAndConsume(OutputStream output) throws XMLStreamException {
+        OMOutputImpl omOutput = new OMOutputImpl(output, new OMOutputFormat());
+        serializeAndConsume(omOutput);
+        omOutput.flush();
+    }
+
+    /**
+     * Serializes the document directly to the output stream with caching enabled.
+     * 
+     * @param output
+     * @throws XMLStreamException
+     */
+    public void serialize(OutputStream output) throws XMLStreamException {
+        OMOutputImpl omOutput = new OMOutputImpl(output, new OMOutputFormat());
+        serialize(omOutput);
+        omOutput.flush();
+    }
+
+    /**
+     * Serializes the document directly to the output stream with caching disabled.
+     * 
+     * @param output
+     * @param format
+     * @throws XMLStreamException
+     */
+    public void serializeAndConsume(OutputStream output, OMOutputFormat format) throws XMLStreamException {
+        OMOutputImpl omOutput = new OMOutputImpl(output, format);
+        serializeAndConsume(omOutput);
+        omOutput.flush();
+    }
+
+    /**
+     * Serializes the document directly to the output stream with caching enabled.
+     * 
+     * @param output
+     * @param format
+     * @throws XMLStreamException
+     */
+    public void serialize(OutputStream output, OMOutputFormat format) throws XMLStreamException {
+        OMOutputImpl omOutput = new OMOutputImpl(output, format);
+        serialize(omOutput);
+        omOutput.flush();
+    }
+
+    /**
+     * Serializes the document with cache.
+     */
+    public void serialize(OMOutputImpl omOutput, boolean includeXMLDeclaration) throws XMLStreamException {
+        serialize(omOutput, true, includeXMLDeclaration);
+
+    }
+
+    protected void serialize(OMOutputImpl omOutput, boolean cache, boolean includeXMLDeclaration) throws XMLStreamException {
+        if (includeXMLDeclaration) {
+            //Check whether the OMOutput char encoding and OMDocument char
+            //encoding matches, if not use char encoding of OMOutput
+            String outputCharEncoding = omOutput.getCharSetEncoding();
+            if (outputCharEncoding == null || "".equals(outputCharEncoding)) {
+                omOutput.getXmlStreamWriter().writeStartDocument(charSetEncoding,
+                        xmlVersion);
+            } else {
+                omOutput.getXmlStreamWriter().writeStartDocument(outputCharEncoding,
+                        xmlVersion);
+            }
+        }
+
+        Iterator children = this.getChildren();
+
+        if (cache) {
+            while (children.hasNext()) {
+                OMNodeEx omNode = (OMNodeEx) children.next();
+                omNode.serialize(omOutput);
+            }
+        } else {
+            while (children.hasNext()) {
+                OMNodeEx omNode = (OMNodeEx) children.next();
+                omNode.serializeAndConsume(omOutput);
+            }
+        }
+    }
+
+
+}
diff --git a/src/org/apache/ws/commons/om/impl/llom/OMElementImpl.java b/src/org/apache/ws/commons/om/impl/llom/OMElementImpl.java
new file mode 100644
index 0000000..37981bf
--- /dev/null
+++ b/src/org/apache/ws/commons/om/impl/llom/OMElementImpl.java
@@ -0,0 +1,862 @@
+/*
+ * Copyright 2004,2005 The Apache Software Foundation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      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.
+ */
+
+package org.apache.ws.commons.om.impl.llom;
+
+import org.apache.ws.commons.om.OMAbstractFactory;
+import org.apache.ws.commons.om.OMAttribute;
+import org.apache.ws.commons.om.OMConstants;
+import org.apache.ws.commons.om.OMContainer;
+import org.apache.ws.commons.om.OMElement;
+import org.apache.ws.commons.om.OMException;
+import org.apache.ws.commons.om.OMNamespace;
+import org.apache.ws.commons.om.OMNode;
+import org.apache.ws.commons.om.OMText;
+import org.apache.ws.commons.om.OMXMLParserWrapper;
+import org.apache.ws.commons.om.impl.OMContainerEx;
+import org.apache.ws.commons.om.impl.OMNodeEx;
+import org.apache.ws.commons.om.impl.OMOutputImpl;
+import org.apache.ws.commons.om.impl.llom.builder.StAXOMBuilder;
+import org.apache.ws.commons.om.impl.llom.traverse.OMChildElementIterator;
+import org.apache.ws.commons.om.impl.llom.traverse.OMChildrenIterator;
+import org.apache.ws.commons.om.impl.llom.traverse.OMChildrenQNameIterator;
+import org.apache.ws.commons.om.impl.llom.util.EmptyIterator;
+import org.apache.ws.commons.om.util.ElementHelper;
+
+import javax.xml.namespace.QName;
+import javax.xml.stream.XMLStreamConstants;
+import javax.xml.stream.XMLStreamException;
+import javax.xml.stream.XMLStreamReader;
+import java.io.ByteArrayOutputStream;
+import java.util.HashMap;
+import java.util.Iterator;
+
+/**
+ * Class OMElementImpl
+ */
+public class OMElementImpl extends OMNodeImpl
+        implements OMElement, OMConstants, OMContainerEx {
+    /**
+     * Field ns
+     */
+    protected OMNamespace ns;
+
+    /**
+     * Field localName
+     */
+    protected String localName;
+    /**
+     * Field firstChild
+     */
+    protected OMNode firstChild;
+
+    /**
+     * Field namespaces
+     */
+    protected HashMap namespaces = null;
+
+    /**
+     * Field attributes
+     */
+    protected HashMap attributes = null;
+
+    /**
+     * Field noPrefixNamespaceCounter
+     */
+    protected int noPrefixNamespaceCounter = 0;
+    private OMNode lastChild;
+    private int lineNumber;
+
+    /**
+     * Constructor OMElementImpl.
+     */
+    public OMElementImpl(String localName, OMNamespace ns, OMContainer parent,
+                         OMXMLParserWrapper builder) {
+        super(parent);
+        this.localName = localName;
+        if (ns != null) {
+            setNamespace(ns);
+        }
+        this.builder = builder;
+        firstChild = null;
+    }
+
+
+    /**
+     * Constructor OMElementImpl.
+     */
+    public OMElementImpl(String localName, OMNamespace ns) {
+        this(localName, ns, null);
+    }
+
+    /**
+     * This is the basic constructor for OMElement. All the other constructors 
+     * depends on this.
+     *
+     * @param localName - this MUST always be not null
+     * @param ns        - can be null
+     * @param parent    - this should be an OMContainer
+     */
+    public OMElementImpl(String localName, OMNamespace ns, OMContainer parent) {
+        super(parent);
+        if (localName == null || localName.trim().length() == 0) {
+            throw new OMException("localname can not be null or empty");
+        }
+        this.localName = localName;
+        this.done = true;
+        if (ns != null) {
+            setNamespace(ns);
+        }
+    }
+
+    /**
+     * It is assumed that the QName passed contains, at least, the localName for this element.
+     *
+     * @param qname - this should be valid qname according to javax.xml.namespace.QName
+     * @throws OMException
+     */
+    public OMElementImpl(QName qname, OMContainer parent) throws OMException {
+        this(qname.getLocalPart(), null, parent);
+        this.ns = handleNamespace(qname);
+    }
+
+    /**
+     * Method handleNamespace.
+     */
+    private OMNamespace handleNamespace(QName qname) {
+        OMNamespace ns = null;
+
+        // first try to find a namespace from the scope
+        String namespaceURI = qname.getNamespaceURI();
+        if (namespaceURI != null && namespaceURI.length() > 0) {
+            ns = findNamespace(qname.getNamespaceURI(),
+                    qname.getPrefix());
+
+            /**
+             * What is left now is
+             *  1. nsURI = null & parent != null, but ns = null
+             *  2. nsURI != null, (parent doesn't have an ns with given URI), but ns = null
+             */
+            if (ns == null) {
+                String prefix = qname.getPrefix();
+                ns = declareNamespace(namespaceURI, prefix);
+            }
+            if (ns != null) {
+                this.ns = (ns);
+            }
+        }
+
+        else
+
+        {
+            // no namespace URI in the given QName. No need to bother about this ??
+        }
+
+        return ns;
+    }
+
+    /**
+     * Method handleNamespace.
+     *
+     * @return Returns namespace.
+     */
+    private OMNamespace handleNamespace(OMNamespace ns) {
+        OMNamespace namespace = findNamespace(ns.getName(),
+                ns.getPrefix());
+        if (namespace == null) {
+            namespace = declareNamespace(ns);
+        }
+        return namespace;
+    }
+
+    /**
+     * Adds child to the element. One can decide whether to append the child or to add to the
+     * front of the children list.
+     */
+    public void addChild(OMNode child) {
+        addChild((OMNodeImpl) child);
+    }
+
+    /**
+     * Searches for children with a given QName and returns an iterator to traverse through
+     * the OMNodes.
+     * This QName can contain any combination of prefix, localname and URI.
+     *
+     * @throws OMException
+     */
+    public Iterator getChildrenWithName(QName elementQName) {
+        return new OMChildrenQNameIterator(getFirstOMChild(),
+                elementQName);
+    }
+
+    /**
+     * Method getFirstChildWithName.
+     *
+     * @throws OMException
+     */
+    public OMElement getFirstChildWithName(QName elementQName) throws OMException {
+        OMChildrenQNameIterator omChildrenQNameIterator =
+                new OMChildrenQNameIterator(getFirstOMChild(),
+                        elementQName);
+        OMNode omNode = null;
+        if (omChildrenQNameIterator.hasNext()) {
+            omNode = (OMNode) omChildrenQNameIterator.next();
+        }
+
+        return ((omNode != null) && (OMNode.ELEMENT_NODE == omNode.getType())) ?
+                (OMElement) omNode : null;
+
+    }
+
+    /**
+     * Method addChild.
+     */
+    private void addChild(OMNodeImpl child) {
+        //the order of these statements is VERY important
+        //Since setting the parent has a detach method inside
+        //it strips down all the rerefences to siblings.
+        //setting the siblings should take place AFTER setting the parent
+
+        child.setParent(this);
+
+        if (firstChild == null) {
+            firstChild = child;
+            child.setPreviousOMSibling(null);
+        } else {
+            child.setPreviousOMSibling(lastChild);
+            ((OMNodeEx) lastChild).setNextOMSibling(child);
+        }
+
+        child.setNextOMSibling(null);
+        lastChild = child;
+
+    }
+
+    /**
+     * Gets the next sibling. This can be an OMAttribute or OMText or 
+     * OMELement for others.
+     *
+     * @throws OMException
+     */
+    public OMNode getNextOMSibling() throws OMException {
+        while (!done) {
+            int token = builder.next();
+            if (token == XMLStreamConstants.END_DOCUMENT) {
+                throw new OMException();
+            }
+        }
+        return super.getNextOMSibling();
+    }
+
+    /**
+     * Returns a collection of this element. Children can be of types OMElement, OMText.
+     *
+     * @return Returns children.
+     */
+    public Iterator getChildren() {
+        return new OMChildrenIterator(getFirstOMChild());
+    }
+
+    /**
+     * Returns a filtered list of children - just the elements.
+     *
+     * @return Returns an iterator of the child elements.
+     */
+    public Iterator getChildElements() {
+        return new OMChildElementIterator(getFirstElement());
+    }
+
+    /**
+     * Creates a namespace in the current element scope.
+     *
+     * @return Returns namespace.
+     */
+    public OMNamespace declareNamespace(String uri, String prefix) {
+        OMNamespaceImpl ns = new OMNamespaceImpl(uri, prefix);
+        return declareNamespace(ns);
+    }
+
+    /**
+     * @return Returns namespace.
+     */
+    public OMNamespace declareNamespace(OMNamespace namespace) {
+        if (namespaces == null) {
+            this.namespaces = new HashMap(5);
+        }
+        namespaces.put(namespace.getPrefix(), namespace);
+        return namespace;
+    }
+
+    /**
+     * Finds a namespace with the given uri and prefix, in the scope of the document.
+     * Starts to find from the current element and goes up in the hiararchy until one is found.
+     * If none is found, returns null.
+     */
+    public OMNamespace findNamespace(String uri, String prefix) {
+
+        // check in the current element
+        OMNamespace namespace = findDeclaredNamespace(uri, prefix);
+        if (namespace != null) {
+            return namespace;
+        }
+
+        // go up to check with ancestors
+        if (parent != null) {
+            //For the OMDocumentImpl there won't be any explicit namespace
+            //declarations, so going up the parent chain till the document
+            //element should be enough.
+            if (parent instanceof OMElement) {
+                namespace = ((OMElementImpl) parent).findNamespace(uri, prefix);
+            }
+        }
+
+        return namespace;
+    }
+
+    public OMNamespace findNamespaceURI(String prefix) {
+        OMNamespace ns = (OMNamespace) this.namespaces.get(prefix);
+        if (ns == null && this.parent instanceof OMElement) {
+            // try with the parent
+            ns = ((OMElement) this.parent).findNamespaceURI(prefix);
+        }
+        return ns;
+    }
+
+    /**
+     * Checks for the namespace <B>only</B> in the current Element.
+     * This is also used to retrieve the prefix of a known namespace URI.
+     */
+    private OMNamespace findDeclaredNamespace(String uri, String prefix) {
+
+
+        if (uri == null) {
+            return null;
+        }
+
+        //If the prefix is available and uri is available and its the xml namespace
+        if (prefix != null && prefix.equals(OMConstants.XMLNS_PREFIX) && uri.equals(OMConstants.XMLNS_URI)) {
+            return new OMNamespaceImpl(uri, prefix);
+        }
+
+        if (namespaces == null) {
+            return null;
+        }
+
+        if (prefix == null || "".equals(prefix)) {
+            Iterator namespaceListIterator = namespaces.values().iterator();
+
+            OMNamespace ns = null;
+
+            while (namespaceListIterator.hasNext()) {
+                OMNamespace omNamespace =
+                        (OMNamespace) namespaceListIterator.next();
+                if (omNamespace.getName() != null &&
+                        omNamespace.getName().equals(uri)) {
+                       if(ns == null){
+                        ns = omNamespace;
+                       }else{
+                               if(omNamespace.getPrefix() == null || omNamespace.getPrefix().length() == 0){
+                                       ns = omNamespace;
+                               }
+                       }
+                }
+            }
+            return ns;
+        } else {
+            OMNamespace namespace = (OMNamespace) namespaces.get(prefix);
+            if (namespace != null && uri.equalsIgnoreCase(namespace.getName())) {
+                return namespace;
+            } else {
+                return null;
+            }
+        }
+    }
+
+
+    /**
+     * Method getAllDeclaredNamespaces.
+     *
+     * @return Returns Iterator.
+     */
+    public Iterator getAllDeclaredNamespaces() {
+        if (namespaces == null) {
+            return new Iterator() {
+                public void remove() {
+                    throw new UnsupportedOperationException();
+                }
+
+                public boolean hasNext() {
+                    return false;
+                }
+
+                public Object next() {
+                    return null;
+                }
+            };
+        }
+        return namespaces.values().iterator();
+    }
+
+    /**
+     * Returns a List of OMAttributes.
+     *
+     * @return Returns iterator.
+     */
+    public Iterator getAllAttributes() {
+        if (attributes == null) {
+            return new EmptyIterator();
+        }
+        return attributes.values().iterator();
+    }
+
+    /**
+     * Returns a named attribute if present.
+     *
+     * @param qname the qualified name to search for
+     * @return Returns an OMAttribute with the given name if found, or null
+     */
+    public OMAttribute getAttribute(QName qname) {
+        return attributes == null ? null : (OMAttribute) attributes.get(qname);
+    }
+
+    /**
+     * Returns a named attribute's value, if present.
+     *
+     * @param qname the qualified name to search for
+     * @return Returns a String containing the attribute value, or null.
+     */
+    public String getAttributeValue(QName qname) {
+        OMAttribute attr = getAttribute(qname);
+        return (attr == null) ? null : attr.getAttributeValue();
+    }
+
+    /**
+     * Inserts an attribute to this element. Implementor can decide as to insert this
+     * in the front or at the end of set of attributes.
+     *
+     * @return Returns attribute.
+     */
+    public OMAttribute addAttribute(OMAttribute attr) {
+        if (attributes == null) {
+            this.attributes = new HashMap(5);
+        }
+        OMNamespace namespace = attr.getNamespace();
+        if (namespace != null && this.findNamespace(namespace.getName(), namespace.getPrefix()) == null) {
+            this.declareNamespace(namespace.getName(), namespace.getPrefix());
+        }
+
+        attributes.put(attr.getQName(), attr);
+        return attr;
+    }
+
+    /**
+     * Method removeAttribute.
+     */
+    public void removeAttribute(OMAttribute attr) {
+        if (attributes != null) {
+            attributes.remove(attr.getQName());
+        }
+    }
+
+    /**
+     * Method addAttribute.
+     *
+     * @return Returns OMAttribute.
+     */
+    public OMAttribute addAttribute(String attributeName, String value,
+                                    OMNamespace ns) {
+        OMNamespace namespace;
+        if (ns != null) {
+            namespace = findNamespace(ns.getName(), ns.getPrefix());
+            if (namespace == null) {
+                throw new OMException("Given OMNamespace(" + ns.getName() +
+                        ns.getPrefix()
+                        + ") for "
+                        +
+                        "this attribute is not declared in the scope of this element. First declare the namespace"
+                        + " and then use it with the attribute");
+            }
+        }
+        return addAttribute(new OMAttributeImpl(attributeName, ns, value));
+    }
+
+    /**
+     * Method setBuilder.
+     */
+    public void setBuilder(OMXMLParserWrapper wrapper) {
+        this.builder = wrapper;
+    }
+
+    /**
+     * Method getBuilder.
+     *
+     * @return Returns OMXMLParserWrapper.
+     */
+    public OMXMLParserWrapper getBuilder() {
+        return builder;
+    }
+
+    /**
+     * Forces the parser to proceed, if parser has not yet finished with the XML input.
+     */
+    public void buildNext() {
+        builder.next();
+    }
+
+    /**
+     * Method getFirstOMChild.
+     *
+     * @return Returns child.
+     */
+    public OMNode getFirstOMChild() {
+        while ((firstChild == null) && !done) {
+            buildNext();
+        }
+        return firstChild;
+    }
+
+    /**
+     * Method setFirstChild.
+     */
+    public void setFirstChild(OMNode firstChild) {
+        if (firstChild != null) {
+            ((OMNodeEx) firstChild).setParent(this);
+        }
+        this.firstChild = firstChild;
+    }
+
+    /**
+     * Removes this information item and its children, from the model completely.
+     *
+     * @throws OMException
+     */
+    public OMNode detach() throws OMException {
+        if (!done) {
+            build();
+        } else {
+            super.detach();
+        }
+        return this;
+    }
+
+    /**
+     * Method isComplete.
+     *
+     * @return Returns boolean.
+     */
+    public boolean isComplete() {
+        return done;
+    }
+
+    /**
+     * Gets the type of node, as this is the super class of all the nodes.
+     */
+    public int getType() {
+        return OMNode.ELEMENT_NODE;
+    }
+
+    /**
+     * Method getXMLStreamReader.
+     *
+     * @see OMElement#getXMLStreamReader()
+     */
+    public XMLStreamReader getXMLStreamReader() {
+        return getXMLStreamReader(true);
+    }
+
+    /**
+     * Method getXMLStreamReaderWithoutCaching.
+     *
+     * @see OMElement#getXMLStreamReaderWithoutCaching()
+     */
+    public XMLStreamReader getXMLStreamReaderWithoutCaching() {
+        return getXMLStreamReader(false);
+    }
+
+    /**
+     * Method getXMLStreamReader.
+     *
+     * @return Returns reader.
+     */
+    private XMLStreamReader getXMLStreamReader(boolean cache) {
+        if ((builder == null) && !cache) {
+            throw new UnsupportedOperationException(
+                    "This element was not created in a manner to be switched");
+        }
+        if (builder != null && builder.isCompleted() && !cache) {
+            throw new UnsupportedOperationException(
+                    "The parser is already consumed!");
+        }
+        return new OMStAXWrapper(builder, this, cache);
+    }
+
+    /**
+     * Sets the text of the given element.
+     * caution - This method will wipe out all the text elements (and hence any
+     * mixed content) before setting the text.
+     */
+    public void setText(String text) {
+
+        OMNode child = this.getFirstOMChild();
+        while (child != null) {
+            if (child.getType() == OMNode.TEXT_NODE) {
+                child.detach();
+            }
+            child = child.getNextOMSibling();
+        }
+
+        this.addChild(OMAbstractFactory.getOMFactory().createText(this, text));
+    }
+
+    /**
+     * Selects all the text children and concatinates them to a single string.
+     *
+     * @return Returns String.
+     */
+    public String getText() {
+        String childText = "";
+        OMNode child = this.getFirstOMChild();
+        OMText textNode;
+
+        while (child != null) {
+            if (child.getType() == OMNode.TEXT_NODE) {
+                textNode = (OMText) child;
+                if (textNode.getText() != null &&
+                        !"".equals(textNode.getText())) {
+                    childText += textNode.getText();
+                }
+            }
+            child = child.getNextOMSibling();
+        }
+
+        return childText;
+    }
+
+    /**
+     * Returns the concatination string of TRIMMED values of all
+     * OMText  child nodes of this element.
+     * This is included purely to improve usability.
+     */
+    public String getTrimmedText() {
+        String childText = "";
+        OMNode child = this.getFirstOMChild();
+        OMText textNode;
+
+        while (child != null) {
+            if (child.getType() == OMNode.TEXT_NODE) {
+                textNode = (OMText) child;
+                if (textNode.getText() != null &&
+                        !"".equals(textNode.getText().trim())) {
+                    childText += textNode.getText().trim();
+                }
+            }
+            child = child.getNextOMSibling();
+        }
+
+        return childText;
+    }
+
+    /**
+     * Method serialize.
+     *
+     * @throws XMLStreamException
+     */
+    public void serialize(OMOutputImpl omOutput) throws XMLStreamException {
+        serialize(omOutput, true);
+    }
+
+///////////////////////////////////////////////////////////////////////////////////////////////
+//////////////////////////////////////////////////////////////////////////////////////////////
+
+    protected void serialize(OMOutputImpl omOutput, boolean cache) throws XMLStreamException {
+
+        if (cache) {
+            //in this case we don't care whether the elements are built or not
+            //we just call the serializeAndConsume methods
+            OMSerializerUtil.serializeStartpart(this, omOutput);
+            //serialize children
+            Iterator children = this.getChildren();
+            while (children.hasNext()) {
+                ((OMNodeEx) children.next()).serialize(omOutput);
+            }
+            OMSerializerUtil.serializeEndpart(omOutput);
+
+        } else {
+            //Now the caching is supposed to be off. However caching been switched off
+            //has nothing to do if the element is already built!
+            if (this.done) {
+                OMSerializerUtil.serializeStartpart(this, omOutput);
+                OMNodeImpl child = (OMNodeImpl) firstChild;
+                while(child != null && ((!(child instanceof OMElement)) || child.isComplete())) {
+                    child.serializeAndConsume(omOutput);
+                    child = child.nextSibling;
+                }
+                if(child != null) {
+                    OMElement element = (OMElement) child;
+                    element.getBuilder().setCache(false);
+                    OMSerializerUtil.serializeByPullStream(element, omOutput, cache);
+                }
+                OMSerializerUtil.serializeEndpart(omOutput);
+            } else {
+                OMSerializerUtil.serializeByPullStream(this, omOutput, cache);
+            }
+
+
+        }
+    }
+
+////////////////////////////////////////////////////////////////////////////////////////////////
+////////////////////////////////////////////////////////////////////////////////////////////////
+
+    /**
+     * This method serializes and consumes without building the object structure in memory. 
+     * Misuse of this method will cause loss of data. So it is advised to use 
+     * populateYourSelf() method, before calling this method, if one wants to 
+     * preserve data in the stream. This was requested during the second Axis2 summit. 
+     *
+     * @throws XMLStreamException
+     */
+    public void serializeAndConsume(OMOutputImpl omOutput) throws XMLStreamException {
+        this.serialize(omOutput, false);
+    }
+
+    /**
+     * Gets first element.
+     *
+     * @return Returns element.
+     */
+    public OMElement getFirstElement() {
+        OMNode node = getFirstOMChild();
+        while (node != null) {
+            if (node.getType() == OMNode.ELEMENT_NODE) {
+                return (OMElement) node;
+            } else {
+                node = node.getNextOMSibling();
+            }
+        }
+        return null;
+    }
+
+    /**
+     * Method getLocalName.
+     *
+     * @return Returns local name.
+     */
+    public String getLocalName() {
+        return localName;
+    }
+
+    /**
+     * Method setLocalName.
+     */
+    public void setLocalName(String localName) {
+        this.localName = localName;
+    }
+
+    /**
+     * Method getNamespace.
+     *
+     * @throws OMException
+     */
+    public OMNamespace getNamespace() throws OMException {
+        return ns;
+    }
+
+    /**
+     * Method setNamespace.
+     */
+    public void setNamespace(OMNamespace namespace) {
+        OMNamespace nsObject = null;
+        if (namespace != null) {
+            nsObject = handleNamespace(namespace);
+        }
+        this.ns = nsObject;
+    }
+
+    /**
+     * Method getQName.
+     *
+     * @return Returns QName.
+     */
+    public QName getQName() {
+        QName qName;
+        if (ns != null) {
+            if (ns.getPrefix() != null) {
+                qName = new QName(ns.getName(), localName, ns.getPrefix());
+            } else {
+                qName = new QName(ns.getName(), localName);
+            }
+        } else {
+            qName = new QName(localName);
+        }
+        return qName;
+    }
+
+    public String toStringWithConsume() throws XMLStreamException {
+        ByteArrayOutputStream baos = new ByteArrayOutputStream();
+        this.serializeAndConsume(baos);
+        return new String(baos.toByteArray());
+    }
+
+    public String toString() {
+        ByteArrayOutputStream baos = new ByteArrayOutputStream();
+        try {
+            this.serialize(baos);
+        } catch (XMLStreamException e) {
+            throw new RuntimeException("Can not serialize OM Element " + this.getLocalName(), e);
+        }
+        return new String(baos.toByteArray());
+    }
+
+    /**
+     * Method discard.
+     *
+     * @throws OMException
+     */
+    public void discard() throws OMException {
+        if (done) {
+            this.detach();
+        } else {
+            builder.discard(this);
+        }
+    }
+
+    /**
+     * Converts a prefix:local qname string into a proper QName, evaluating it 
+     * in the OMElement context. Unprefixed qnames resolve to the local namespace.
+     *
+     * @param qname prefixed qname string to resolve
+     * @return Returns null for any failure to extract a qname.
+     */
+    public QName resolveQName(String qname) {
+        ElementHelper helper = new ElementHelper(this);
+        return helper.resolveQName(qname);
+    }
+
+    public OMElement cloneOMElement() {
+        OMElement clonedElement = new StAXOMBuilder(this.getXMLStreamReader(true)).getDocumentElement();
+        clonedElement.build();
+        return clonedElement;
+    }
+
+    public void setLineNumber(int lineNumber) {
+        this.lineNumber = lineNumber;
+    }
+
+    public int getLineNumber() {
+        return lineNumber;
+    }
+}
diff --git a/src/org/apache/ws/commons/om/impl/llom/OMNamespaceImpl.java b/src/org/apache/ws/commons/om/impl/llom/OMNamespaceImpl.java
new file mode 100644
index 0000000..15571ce
--- /dev/null
+++ b/src/org/apache/ws/commons/om/impl/llom/OMNamespaceImpl.java
@@ -0,0 +1,74 @@
+/*
+ * Copyright 2004,2005 The Apache Software Foundation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      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.
+ */
+
+package org.apache.ws.commons.om.impl.llom;
+
+import org.apache.ws.commons.om.OMNamespace;
+
+/**
+ * Class OMNamespaceImpl
+ */
+public class OMNamespaceImpl implements OMNamespace {
+    /**
+     * Field prefix
+     */
+    private String prefix;
+
+    /**
+     * Field uri
+     */
+    private String uri;
+
+    /**
+     * @param uri
+     * @param prefix
+     */
+    public OMNamespaceImpl(String uri, String prefix) {
+        this.uri = uri;
+        this.prefix = prefix;
+    }
+
+    /**
+     * Method equals.
+     *
+     * @param uri
+     * @param prefix
+     * @return Returns boolean.
+     */
+    public boolean equals(String uri, String prefix) {
+        return (((prefix == null) && (this.prefix == null)) ||
+                ((prefix != null) && prefix.equals(this.prefix))) &&
+                uri.equals(uri);
+    }
+
+    /**
+     * Method getPrefix.
+     *
+     * @return Returns String.
+     */
+    public String getPrefix() {
+        return prefix;
+    }
+
+    /**
+     * Method getName.
+     *
+     * @return Returns String.
+     */
+    public String getName() {
+        return uri;
+    }
+}
diff --git a/src/org/apache/ws/commons/om/impl/llom/OMNavigator.java b/src/org/apache/ws/commons/om/impl/llom/OMNavigator.java
new file mode 100644
index 0000000..d090afb
--- /dev/null
+++ b/src/org/apache/ws/commons/om/impl/llom/OMNavigator.java
@@ -0,0 +1,193 @@
+/*
+ * Copyright 2004,2005 The Apache Software Foundation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      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.
+ */
+
+package org.apache.ws.commons.om.impl.llom;
+
+import org.apache.ws.commons.om.OMContainer;
+import org.apache.ws.commons.om.OMElement;
+import org.apache.ws.commons.om.OMNode;
+
+/**
+ * Refer to the testClass to find out how to use
+ * features like isNavigable, isComplete and step.
+ */
+public class OMNavigator {
+    /**
+     * Field node
+     */
+    protected OMNode node;
+
+    /**
+     * Field visited
+     */
+    private boolean visited;
+
+    /**
+     * Field next
+     */
+    private OMNode next;
+
+    // root is the starting element. Once the navigator comes back to the
+    // root, the traversal is terminated
+
+    /**
+     * Field root
+     */
+    private OMNode root;
+
+    /**
+     * Field backtracked
+     */
+    private boolean backtracked;
+
+    // flags that tell the status of the navigator
+
+    /**
+     * Field end
+     */
+    private boolean end = false;
+
+    /**
+     * Field start
+     */
+    private boolean start = true;
+
+    /**
+     * Constructor OMNavigator.
+     */
+    public OMNavigator() {
+    }
+
+    /**
+     * Constructor OMNavigator.
+     *
+     * @param node
+     */
+    public OMNavigator(OMNode node) {
+        init(node);
+    }
+
+    /**
+     * Method init.
+     *
+     * @param node
+     */
+    public void init(OMNode node) {
+        next = node;
+        root = node;
+        backtracked = false;
+    }
+
+    /**
+     * Gets the next node.
+     *
+     * @return Returns OMnode in the sequence of preorder traversal. Note however 
+     *         that an element node is treated slightly differently. Once the 
+     *         element is passed it returns the same element in the next encounter as well.
+     */
+    public OMNode next() {
+        if (next == null) {
+            return null;
+        }
+        node = next;
+        visited = backtracked;
+        backtracked = false;
+        updateNextNode();
+
+        // set the starting and ending flags
+        if (root.equals(node)) {
+            if (!start) {
+                end = true;
+            } else {
+                start = false;
+            }
+        }
+        return node;
+    }
+
+    /**
+     * Private method to encapsulate the searching logic.
+     */
+    private void updateNextNode() {
+        if ((next instanceof OMElement) && !visited) {
+            OMElementImpl e = (OMElementImpl) next;
+            if (e.firstChild != null) {
+                next = e.firstChild;
+            } else if (e.isComplete()) {
+                backtracked = true;
+            } else {
+                next = null;
+            }
+        } else {
+            OMNode nextSibling = ((OMNodeImpl) next).nextSibling;
+            //OMNode parent = next.getParent();
+            OMContainer parent = next.getParent();
+            if (nextSibling != null) {
+                next = nextSibling;
+            } else if ((parent != null) && parent.isComplete()) {
+                next = (OMNodeImpl) parent;
+                backtracked = true;
+            } else {
+                next = null;
+            }
+        }
+    }
+
+    /**
+     * Method visited.
+     *
+     * @return Returns boolean.
+     */
+    public boolean visited() {
+        return visited;
+    }
+
+    /**
+     * This is a very special method. This allows the navigator to step
+     * once it has reached the existing OM. At this point the isNavigable
+     * method will return false but the isComplete method may return false
+     * which means that the navigating the given element is not complete and
+     * the navigator cannot proceed.
+     */
+    public void step() {
+        if (!end) {
+            next = node;
+            updateNextNode();
+        }
+    }
+
+    /**
+     * Returns the navigable status.
+     *
+     * @return Returns boolean.
+     */
+    public boolean isNavigable() {
+        if (end) {
+            return false;
+        } else {
+            return !(next == null);
+        }
+    }
+
+    /**
+     * Returns the completed status.
+     *
+     * @return Returns boolean.
+     */
+    public boolean isCompleted() {
+        return end;
+    }
+}
diff --git a/src/org/apache/ws/commons/om/impl/llom/OMNodeImpl.java b/src/org/apache/ws/commons/om/impl/llom/OMNodeImpl.java
new file mode 100644
index 0000000..e648f91
--- /dev/null
+++ b/src/org/apache/ws/commons/om/impl/llom/OMNodeImpl.java
@@ -0,0 +1,378 @@
+/*
+ * Copyright 2004,2005 The Apache Software Foundation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      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.
+ */
+
+package org.apache.ws.commons.om.impl.llom;
+
+import org.apache.ws.commons.om.OMContainer;
+import org.apache.ws.commons.om.OMException;
+import org.apache.ws.commons.om.OMNode;
+import org.apache.ws.commons.om.OMOutputFormat;
+import org.apache.ws.commons.om.OMXMLParserWrapper;
+import org.apache.ws.commons.om.impl.OMContainerEx;
+import org.apache.ws.commons.om.impl.OMNodeEx;
+import org.apache.ws.commons.om.impl.OMOutputImpl;
+
+import javax.xml.stream.XMLOutputFactory;
+import javax.xml.stream.XMLStreamException;
+import javax.xml.stream.XMLStreamWriter;
+import java.io.OutputStream;
+import java.io.Writer;
+
+/**
+ * Class OMNodeImpl
+ */
+public abstract class OMNodeImpl implements OMNode, OMNodeEx {
+    /**
+     * Field parent
+     */
+    protected OMContainerEx parent;
+
+    /**
+     * Field nextSibling
+     */
+    protected OMNodeImpl nextSibling;
+
+    /**
+     * Field previousSibling
+     */
+    protected OMNodeImpl previousSibling;
+    /**
+     * Field builder
+     */
+    protected OMXMLParserWrapper builder;
+
+    /**
+     * Field done
+     */
+    protected boolean done = false;
+
+    /**
+     * Field nodeType
+     */
+    protected int nodeType;
+
+    /**
+     * Constructor OMNodeImpl
+     */
+    public OMNodeImpl() {
+    }
+
+    /**
+     * For a node to exist there must be a parent.
+     *
+     * @param parent
+     */
+    public OMNodeImpl(OMContainer parent) {
+        if ((parent != null)) {
+            this.parent = (OMContainerEx)parent;
+            parent.addChild(this);
+        }
+    }
+
+    /**
+     * Returns the immediate parent of the node. Parent is always an Element.
+     *
+     * @return Returns OMContainer.
+     *
+     * @throws OMException
+     */
+    public OMContainer getParent() {
+        return parent;
+    }
+
+    /**
+     * Method setParent.
+     *
+     * @param element
+     */
+    public void setParent(OMContainer element) {
+
+        if ((this.parent) == element) {
+            return;
+        }
+
+        //If we are asked to assign a new parent in place 
+        //of an existing one. We should detach this node
+        //from the aegis of previous parent.
+        if (this.parent != null) {
+            this.detach();
+        }
+        this.parent = (OMContainerEx)element;
+    }
+
+    /**
+     * Returns the next sibling. This can be an OMAttribute or 
+     * OMText or OMElement for others.
+     *
+     * @return Returns OMNode.
+     * @throws org.apache.ws.commons.om.OMException
+     */
+    public OMNode getNextOMSibling() throws OMException {
+        if ((nextSibling == null) && (parent != null) && !parent.isComplete()) {
+            parent.buildNext();
+        }
+        return nextSibling;
+    }
+
+    /**
+     * Method setNextOMSibling.
+     *
+     * @param node
+     */
+    public void setNextOMSibling(OMNode node) {
+        this.nextSibling = (OMNodeImpl) node;
+    }
+
+
+    /**
+     * Indicates whether parser has parsed this information item completely or not.
+     * If some information is not available in the item, one has to check this 
+     * attribute to make sure that, this item has been parsed completely or not.
+     *
+     * @return Returns boolean.
+     */
+    public boolean isComplete() {
+        return done;
+    }
+
+    /**
+     * Method setComplete.
+     *
+     * @param state
+     */
+    public void setComplete(boolean state) {
+        this.done = state;
+    }
+
+    /**
+     * Removes this information item and its children, from the model completely.
+     *
+     * @throws OMException
+     */
+    public OMNode detach() throws OMException {
+        if (parent == null) {
+            throw new OMException(
+                    "Elements that doesn't have a parent can not be detached");
+        }
+        OMNodeImpl nextSibling = (OMNodeImpl) getNextOMSibling();
+        if (previousSibling == null) {
+            parent.setFirstChild(nextSibling);
+        } else {
+            ((OMNodeEx)getPreviousOMSibling()).setNextOMSibling(nextSibling);
+        }
+        if (nextSibling != null) {
+            nextSibling.setPreviousOMSibling(getPreviousOMSibling());
+        }
+        this.parent = null;
+        return this;
+    }
+
+    /**
+     * Inserts a sibling just after the current information item.
+     *
+     * @param sibling
+     * @throws OMException
+     */
+    public void insertSiblingAfter(OMNode sibling) throws OMException {
+        if (parent == null) {
+            throw new OMException();
+        }
+        ((OMNodeEx)sibling).setParent(parent);
+        if (sibling instanceof OMNodeImpl) {
+            OMNodeImpl siblingImpl = (OMNodeImpl) sibling;
+            if (nextSibling == null) {
+                getNextOMSibling();
+            }
+            siblingImpl.setPreviousOMSibling(this);
+            if (nextSibling != null) {
+                nextSibling.setPreviousOMSibling(sibling);
+            }
+            ((OMNodeEx)sibling).setNextOMSibling(nextSibling);
+            nextSibling = siblingImpl;
+        }
+    }
+
+    /**
+     * Inserts a sibling just before the current information item.
+     *
+     * @param sibling
+     * @throws OMException
+     */
+    public void insertSiblingBefore(OMNode sibling) throws OMException {
+        if (parent == null) {
+            throw new OMException();
+        }
+        if (sibling instanceof OMNodeImpl) {
+            OMNodeImpl siblingImpl = (OMNodeImpl) sibling;
+            siblingImpl.nextSibling = this;
+            if (previousSibling == null) {
+                parent.setFirstChild(siblingImpl);
+                siblingImpl.previousSibling = null;
+            } else {
+                siblingImpl.setParent(parent);
+                previousSibling.setNextOMSibling(siblingImpl);
+                siblingImpl.setPreviousOMSibling(previousSibling);
+            }
+            previousSibling = siblingImpl;
+
+        }
+    }
+
+    /**
+     * Gets the type of node, as this is the super class of all the nodes.
+     *
+     * @return Returns the type of node as indicated by {@link #setType}
+     *
+     * @see #setType
+     */
+    public int getType() {
+        return nodeType;
+    }
+
+    /**
+     * Method setType.
+     *
+     * @param nodeType
+     * @throws OMException
+     */
+    public void setType(int nodeType) throws OMException {
+        this.nodeType = nodeType;
+    }
+
+    /**
+     * Gets the previous sibling.
+     *
+     * @return boolean
+     */
+    public OMNode getPreviousOMSibling() {
+        return previousSibling;
+    }
+
+    /**
+     * Method setPreviousOMSibling.
+     *
+     * @param previousSibling
+     */
+    public void setPreviousOMSibling(OMNode previousSibling) {
+        this.previousSibling = (OMNodeImpl) previousSibling;
+    }
+
+
+    /**
+     * Parses this node and builds the object structure in memory.
+     * However a node, created programmatically, will have done set to true by 
+     * default and this will cause populateyourself not to work properly!
+     *
+     * @throws OMException
+     */
+    public void build() throws OMException {
+        while (!done) {
+            builder.next();
+        }
+    }
+
+    /**
+     * Serializes the node with caching.
+     *
+     * @param xmlWriter
+     * @throws javax.xml.stream.XMLStreamException
+     *
+     * @see #serialize(org.apache.ws.commons.om.impl.OMOutputImpl)
+     */
+    public void serialize(XMLStreamWriter xmlWriter) throws XMLStreamException {
+        OMOutputImpl omOutput = new OMOutputImpl(xmlWriter);
+        serialize(omOutput);
+        omOutput.flush();
+    }
+
+    /**
+     * Serializes the node without caching.
+     *
+     * @param xmlWriter
+     * @throws javax.xml.stream.XMLStreamException
+     *
+     * @see #serializeAndConsume(org.apache.ws.commons.om.impl.OMOutputImpl)
+     */
+    public void serializeAndConsume(XMLStreamWriter xmlWriter) throws XMLStreamException {
+        OMOutputImpl omOutput = new OMOutputImpl(xmlWriter);
+        serializeAndConsume(omOutput);
+        omOutput.flush();
+    }
+
+    /**
+     * Serializes the node with caching.
+     *
+     * @param omOutput
+     * @throws XMLStreamException
+     * @see #serialize(org.apache.ws.commons.om.impl.OMOutputImpl)
+     */
+    public void serialize(OMOutputImpl omOutput) throws XMLStreamException {
+        throw new RuntimeException("Not implemented yet!");
+    }
+
+    /**
+     * Serializes the node without caching.
+     *
+     * @param omOutput
+     * @throws XMLStreamException
+     * @see #serializeAndConsume(org.apache.ws.commons.om.impl.OMOutputImpl)
+     */
+    public void serializeAndConsume(OMOutputImpl omOutput) throws XMLStreamException {
+        throw new RuntimeException("Not implemented yet!");
+    }
+
+    public void serialize(OutputStream output) throws XMLStreamException {
+        serialize(XMLOutputFactory.newInstance().createXMLStreamWriter(output));
+    }
+
+    public void serialize(Writer writer) throws XMLStreamException {
+        serialize(XMLOutputFactory.newInstance().createXMLStreamWriter(writer));
+    }
+
+    public void serializeAndConsume(OutputStream output) throws XMLStreamException {
+        serializeAndConsume(XMLOutputFactory.newInstance().createXMLStreamWriter(output));
+    }
+
+    public void serializeAndConsume(Writer writer) throws XMLStreamException {
+        serializeAndConsume(XMLOutputFactory.newInstance().createXMLStreamWriter(writer));
+    }
+
+    public void serialize(OutputStream output, OMOutputFormat format) throws XMLStreamException {    
+        OMOutputImpl omOutput = new  OMOutputImpl(output, format);
+        serialize(omOutput);
+        omOutput.flush();
+    }
+
+    public void serialize(Writer writer, OMOutputFormat format) throws XMLStreamException {
+        OMOutputImpl omOutput = new  OMOutputImpl(XMLOutputFactory.newInstance().createXMLStreamWriter(writer));
+        omOutput.setOutputFormat(format);
+        serialize(omOutput);
+        omOutput.flush();
+    }
+
+    public void serializeAndConsume(OutputStream output, OMOutputFormat format) throws XMLStreamException {
+        OMOutputImpl omOutput = new  OMOutputImpl(output, format);
+        serializeAndConsume(omOutput);
+        omOutput.flush();
+    }
+
+    public void serializeAndConsume(Writer writer, OMOutputFormat format) throws XMLStreamException {
+        OMOutputImpl omOutput = new  OMOutputImpl(XMLOutputFactory.newInstance().createXMLStreamWriter(writer));
+        omOutput.setOutputFormat(format);
+        serializeAndConsume(omOutput);
+        omOutput.flush();
+    }
+}
diff --git a/src/org/apache/ws/commons/om/impl/llom/OMProcessingInstructionImpl.java b/src/org/apache/ws/commons/om/impl/llom/OMProcessingInstructionImpl.java
new file mode 100644
index 0000000..1bb5d35
--- /dev/null
+++ b/src/org/apache/ws/commons/om/impl/llom/OMProcessingInstructionImpl.java
@@ -0,0 +1,126 @@
+/*
+ * Copyright 2004,2005 The Apache Software Foundation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      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.
+ */
+
+package org.apache.ws.commons.om.impl.llom;
+
+import org.apache.ws.commons.om.OMContainer;
+import org.apache.ws.commons.om.OMElement;
+import org.apache.ws.commons.om.OMException;
+import org.apache.ws.commons.om.OMNode;
+import org.apache.ws.commons.om.OMProcessingInstruction;
+
+import javax.xml.stream.XMLStreamException;
+import javax.xml.stream.XMLStreamWriter;
+
+public class OMProcessingInstructionImpl extends OMNodeImpl implements OMProcessingInstruction {
+    protected String target;
+    protected String value;
+
+    /**
+     * Constructor OMProcessingInstructionImpl.
+     *
+     * @param parentNode
+     * @param target
+     * @param value
+     */
+    public OMProcessingInstructionImpl(OMContainer parentNode, String target, String value) {
+        super(parentNode);
+        this.target = (target == null) ? null : target.trim();
+        this.value = (value == null) ? null : value.trim();
+        nodeType = OMNode.PI_NODE;
+    }
+
+    /**
+     * Constructor OMProcessingInstructionImpl.
+     *
+     * @param parentNode
+     */
+    public OMProcessingInstructionImpl(OMContainer parentNode) {
+        this(parentNode, null, null);
+    }
+
+    /**
+     * Serializes the node with caching.
+     *
+     * @param omOutput
+     * @throws XMLStreamException
+     * @see #serialize(org.apache.ws.commons.om.impl.OMOutputImpl)
+     */
+    public void serialize(org.apache.ws.commons.om.impl.OMOutputImpl omOutput) throws XMLStreamException {
+        XMLStreamWriter writer = omOutput.getXmlStreamWriter();
+        writer.writeProcessingInstruction(this.target+" ", this.value);
+    }
+
+    /**
+     * Serializes the node without caching.
+     *
+     * @param omOutput
+     * @throws XMLStreamException
+     * @see #serializeAndConsume(org.apache.ws.commons.om.impl.OMOutputImpl)
+     */
+    public void serializeAndConsume(org.apache.ws.commons.om.impl.OMOutputImpl omOutput) throws XMLStreamException {
+        serialize(omOutput);
+    }
+
+    /**
+     * Gets the value of this Processing Instruction.
+     *
+     * @return string
+     */
+    public String getValue() {
+        return value;
+    }
+
+    /**
+     * Sets the target of this Processing Instruction.
+     *
+     * @param target
+     */
+    public void setTarget(String target) {
+        this.target = target;
+    }
+
+    /**
+     * Gets the target of this Processing Instruction.
+     *
+     * @return Returns String.
+     */
+    public String getTarget() {
+        return target;
+    }
+
+    /**
+     * Sets the value of this Processing Instruction.
+     *
+     * @param text
+     */
+    public void setValue(String text) {
+        this.value = text;
+    }
+
+    /**
+     * Discards this node.
+     *
+     * @throws OMException
+     */
+    public void discard() throws OMException {
+        if (done) {
+            this.detach();
+        } else {
+            builder.discard((OMElement) this.parent);
+        }
+    }
+}
diff --git a/src/org/apache/ws/commons/om/impl/llom/OMSerializerUtil.java b/src/org/apache/ws/commons/om/impl/llom/OMSerializerUtil.java
new file mode 100644
index 0000000..1204a31
--- /dev/null
+++ b/src/org/apache/ws/commons/om/impl/llom/OMSerializerUtil.java
@@ -0,0 +1,210 @@
+/*
+ * Copyright 2004,2005 The Apache Software Foundation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      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.
+ */
+
+package org.apache.ws.commons.om.impl.llom;
+
+import org.apache.ws.commons.om.OMAttribute;
+import org.apache.ws.commons.om.OMElement;
+import org.apache.ws.commons.om.OMNamespace;
+import org.apache.ws.commons.om.OMNode;
+import org.apache.ws.commons.om.impl.OMNodeEx;
+import org.apache.ws.commons.om.impl.OMOutputImpl;
+import org.apache.ws.commons.om.impl.llom.serialize.StreamingOMSerializer;
+
+import javax.xml.stream.XMLStreamException;
+import javax.xml.stream.XMLStreamReader;
+import javax.xml.stream.XMLStreamWriter;
+import java.util.Iterator;
+
+public class OMSerializerUtil {
+
+    /**
+     * Method serializeEndpart.
+     *
+     * @param omOutput
+     * @throws javax.xml.stream.XMLStreamException
+     *
+     */
+    public static void serializeEndpart(OMOutputImpl omOutput)
+            throws XMLStreamException {
+        omOutput.getXmlStreamWriter().writeEndElement();
+    }
+
+    /**
+     * Method serializeAttribute.
+     *
+     * @param attr
+     * @param omOutput
+     * @throws XMLStreamException
+     */
+    public static void serializeAttribute(OMAttribute attr, OMOutputImpl omOutput)
+            throws XMLStreamException {
+
+        // first check whether the attribute is associated with a namespace
+        OMNamespace ns = attr.getNamespace();
+        String prefix = null;
+        String namespaceName = null;
+        XMLStreamWriter writer = omOutput.getXmlStreamWriter();
+        if (ns != null) {
+
+            // add the prefix if it's availble
+            prefix = ns.getPrefix();
+            namespaceName = ns.getName();
+            if (prefix != null) {
+                writer.writeAttribute(prefix, namespaceName,
+                        attr.getLocalName(), attr.getAttributeValue());
+            } else {
+                writer.writeAttribute(namespaceName, attr.getLocalName(),
+                        attr.getAttributeValue());
+            }
+        } else {
+            writer.writeAttribute(attr.getLocalName(), attr.getAttributeValue());
+        }
+    }
+
+    /**
+     * Method serializeNamespace.
+     *
+     * @param namespace
+     * @param omOutput
+     * @throws XMLStreamException
+     */
+    public static void serializeNamespace(OMNamespace namespace, org.apache.ws.commons.om.impl.OMOutputImpl omOutput)
+            throws XMLStreamException {
+
+        if (namespace != null) {
+            XMLStreamWriter writer = omOutput.getXmlStreamWriter();
+            String uri = namespace.getName();
+            String prefix = writer.getPrefix(uri);
+            String ns_prefix = namespace.getPrefix();
+            if (ns_prefix != null && !ns_prefix.equals(prefix)) {
+                writer.writeNamespace(ns_prefix, namespace.getName());
+            }
+        }
+    }
+
+
+    /**
+     * Method serializeStartpart.
+     *
+     * @param omOutput
+     * @throws XMLStreamException
+     */
+    public static void serializeStartpart(OMElement element, OMOutputImpl omOutput)
+            throws XMLStreamException {
+        String nameSpaceName = null;
+        String writer_prefix = null;
+        String prefix = null;
+        XMLStreamWriter writer = omOutput.getXmlStreamWriter();
+        if (element.getNamespace() != null) {
+            nameSpaceName = element.getNamespace().getName();
+            writer_prefix = writer.getPrefix(nameSpaceName);
+            prefix = element.getNamespace().getPrefix();
+            if (nameSpaceName != null) {
+                if (writer_prefix != null) {
+                    writer.writeStartElement(nameSpaceName,
+                            element.getLocalName());
+                } else {
+                    prefix = (prefix == null) ? "" : prefix;
+                    writer.writeStartElement(prefix, element.getLocalName(),
+                            nameSpaceName);
+                    writer.writeNamespace(prefix, nameSpaceName);
+                    writer.setPrefix(prefix, nameSpaceName);
+                }
+            } else {
+                writer.writeStartElement(element.getLocalName());
+            }
+        } else {
+            writer.writeStartElement(element.getLocalName());
+            // we need to check whether there's a default namespace visible at this point because
+            // otherwise this element will go into that namespace unintentionally. So we check
+            // whether there is a default NS visible and if so turn it off.
+            if (writer.getNamespaceContext().getNamespaceURI("") != null) {
+                writer.writeDefaultNamespace("");
+            }
+        }
+
+        // add the namespaces
+        serializeNamespaces(element, omOutput);
+
+        // add the elements attributes
+        serializeAttributes(element, omOutput);
+    }
+
+    public static void serializeNamespaces(OMElement element,
+                                           org.apache.ws.commons.om.impl.OMOutputImpl omOutput) throws XMLStreamException {
+        Iterator namespaces = element.getAllDeclaredNamespaces();
+        if (namespaces != null) {
+            while (namespaces.hasNext()) {
+                serializeNamespace((OMNamespace) namespaces.next(), omOutput);
+            }
+        }
+    }
+
+    public static void serializeAttributes(OMElement element,
+                                           org.apache.ws.commons.om.impl.OMOutputImpl omOutput) throws XMLStreamException {
+        if (element.getAllAttributes() != null) {
+            Iterator attributesList = element.getAllAttributes();
+            while (attributesList.hasNext()) {
+                serializeAttribute((OMAttribute) attributesList.next(),
+                        omOutput);
+            }
+        }
+    }
+
+
+    /**
+     * Method serializeNormal.
+     *
+     * @param omOutput
+     * @param cache
+     * @throws XMLStreamException
+     */
+    public static void serializeNormal(OMElement element, OMOutputImpl omOutput, boolean cache)
+            throws XMLStreamException {
+
+        if (cache) {
+            element.build();
+        }
+
+        serializeStartpart(element, omOutput);
+        OMNode firstChild = element.getFirstOMChild();
+        if (firstChild != null) {
+            if (cache) {
+                ((OMNodeEx)firstChild).serialize(omOutput);
+            } else {
+                ((OMNodeEx)firstChild).serializeAndConsume(omOutput);
+            }
+        }
+        serializeEndpart(omOutput);
+    }
+
+    public static void serializeByPullStream(OMElement element, org.apache.ws.commons.om.impl.OMOutputImpl omOutput) throws XMLStreamException {
+        serializeByPullStream(element, omOutput, false);
+    }
+
+    public static void serializeByPullStream(OMElement element, org.apache.ws.commons.om.impl.OMOutputImpl omOutput, boolean cache) throws XMLStreamException {
+        StreamingOMSerializer streamingOMSerializer = new StreamingOMSerializer();
+        if (cache) {
+            streamingOMSerializer.serialize(element.getXMLStreamReader(),
+                    omOutput);
+        } else {
+            XMLStreamReader xmlStreamReaderWithoutCaching = element.getXMLStreamReaderWithoutCaching();
+            streamingOMSerializer.serialize(xmlStreamReaderWithoutCaching,
+                    omOutput);
+        }
+    }
+}
diff --git a/src/org/apache/ws/commons/om/impl/llom/OMStAXWrapper.java b/src/org/apache/ws/commons/om/impl/llom/OMStAXWrapper.java
new file mode 100644
index 0000000..62413da
--- /dev/null
+++ b/src/org/apache/ws/commons/om/impl/llom/OMStAXWrapper.java
@@ -0,0 +1,1233 @@
+/*
+ * Copyright 2004,2005 The Apache Software Foundation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      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.
+ */
+
+package org.apache.ws.commons.om.impl.llom;
+
+import org.apache.ws.commons.om.OMAttribute;
+import org.apache.ws.commons.om.OMComment;
+import org.apache.ws.commons.om.OMDocument;
+import org.apache.ws.commons.om.OMElement;
+import org.apache.ws.commons.om.OMNamespace;
+import org.apache.ws.commons.om.OMNode;
+import org.apache.ws.commons.om.OMText;
+import org.apache.ws.commons.om.OMXMLParserWrapper;
+import org.apache.ws.commons.om.impl.llom.exception.OMStreamingException;
+
+import javax.xml.namespace.NamespaceContext;
+import javax.xml.namespace.QName;
+import javax.xml.stream.Location;
+import javax.xml.stream.XMLStreamConstants;
+import javax.xml.stream.XMLStreamException;
+import javax.xml.stream.XMLStreamReader;
+import java.util.Iterator;
+import java.util.Stack;
+
+/**
+ * Note  - This class also implements the streaming constants interface
+ * to get access to the StAX constants
+ */
+public class OMStAXWrapper implements XMLStreamReader, XMLStreamConstants {
+    /**
+     * Field navigator
+     */
+    private OMNavigator navigator;
+
+    /**
+     * Field builder
+     */
+    private OMXMLParserWrapper builder;
+
+    /**
+     * Field parser
+     */
+    private XMLStreamReader parser;
+
+    /**
+     * Field rootNode
+     */
+    private OMNode rootNode;
+
+    /**
+     * Field isFirst
+     */
+    private boolean isFirst = true;
+
+    // Navigable means the output should be taken from the navigator.
+    // As soon as the navigator returns a null navigable will be reset
+    // to false and the subsequent events will be taken from the builder
+    // or the parser directly.
+
+    /**
+     * Field NAVIGABLE
+     */
+    private static final short NAVIGABLE = 0;
+    private static final short SWITCH_AT_NEXT = 1;
+    private static final short COMPLETED = 2;
+    private static final short SWITCHED = 3;
+    private static final short DOCUMENT_COMPLETE = 4;
+
+
+    /**
+     * Field state
+     */
+    private short state;
+
+    /**
+     * Field currentEvent
+     * Default set to START_DOCUMENT
+     */
+    private int currentEvent = START_DOCUMENT;
+
+    // SwitchingAllowed is set to false by default.
+    // This means that unless the user explicitly states
+    // that he wants things not to be cached, everything will
+    // be cached.
+
+    /**
+     * Field switchingAllowed
+     */
+    boolean switchingAllowed = false;
+
+    /**
+     * Field elementStack
+     */
+    private Stack elementStack = new Stack();
+
+    // keeps the next event. The parser actually keeps one step ahead to
+    // detect the end of navigation. (at the end of the stream the navigator
+    // returns a null
+
+    /**
+     * Field nextNode
+     */
+    private OMNode nextNode = null;
+
+    // holder for the current node. Needs this to generate events from the current node
+
+    /**
+     * Field currentNode
+     */
+    private OMNode currentNode = null;
+
+    // needs this to refer to the last known node
+
+    /**
+     * Field lastNode
+     */
+    private OMNode lastNode = null;
+
+    /**
+     * Track depth to ensure we stop generating events when we are done with the root node.  
+     */
+    int depth = 0;
+
+    private boolean needToThrowEndDocument = false;
+
+    /**
+     * Method setAllowSwitching.
+     *
+     * @param b
+     */
+    public void setAllowSwitching(boolean b) {
+        this.switchingAllowed = b;
+    }
+
+    /**
+     * Method isAllowSwitching.
+     *
+     * @return Returns boolean.
+     */
+    public boolean isAllowSwitching() {
+        return switchingAllowed;
+    }
+
+    /**
+     * When constructing the OMStaxWrapper, the creator must produce the
+     * builder (an instance of the OMXMLparserWrapper of the input) and the
+     * Element Node to start parsing. The wrapper will parse(proceed) until
+     * the end of the given element. Hence care should be taken to pass the
+     * root element if the entire document is needed.
+     *
+     * @param builder
+     * @param startNode
+     */
+    public OMStAXWrapper(OMXMLParserWrapper builder, OMElement startNode) {
+        this(builder, startNode, false);
+    }
+
+    /**
+     * Constructor OMStAXWrapper.
+     *
+     * @param builder
+     * @param startNode
+     * @param cache
+     */
+    public OMStAXWrapper(OMXMLParserWrapper builder, OMElement startNode,
+                         boolean cache) {
+
+        // create a navigator
+        this.navigator = new OMNavigator(startNode);
+        this.builder = builder;
+        this.rootNode = startNode;
+        if (rootNode != null && rootNode.getParent() != null && rootNode.getParent() instanceof OMDocument) {
+            needToThrowEndDocument = true;
+        }
+
+        // initaite the next and current nodes
+        // Note -  navigator is written in such a way that it first
+        // returns the starting node at the first call to it
+        currentNode = navigator.next();
+        updateNextNode();
+        switchingAllowed = !cache;
+    }
+
+    /**
+     * @return Returns String.
+     * @see javax.xml.stream.XMLStreamReader#getPrefix()
+     */
+    public String getPrefix() {
+        String returnStr = null;
+        if (parser != null) {
+            returnStr = parser.getPrefix();
+        } else {
+            if ((currentEvent == START_ELEMENT)
+                    || (currentEvent == END_ELEMENT)) {
+                OMNamespace ns = ((OMElement) lastNode).getNamespace();
+                returnStr = (ns == null)
+                        ? null
+                        : ns.getPrefix();
+            }
+        }
+        return returnStr;
+    }
+
+    /**
+     * @return Returns String.
+     * @see javax.xml.stream.XMLStreamReader#getNamespaceURI()
+     */
+    public String getNamespaceURI() {
+        String returnStr = null;
+        if (parser != null) {
+            returnStr = parser.getNamespaceURI();
+        } else {
+            if ((currentEvent == START_ELEMENT)
+                    || (currentEvent == END_ELEMENT)
+                    || (currentEvent == NAMESPACE)) {
+                OMNamespace ns = ((OMElement) lastNode).getNamespace();
+                returnStr = (ns == null)
+                        ? null
+                        : ns.getName();
+            }
+        }
+        return returnStr;
+    }
+
+    /**
+     * @return Returns boolean.
+     * @see javax.xml.stream.XMLStreamReader#hasName()
+     */
+    public boolean hasName() {
+        if (parser != null) {
+            return parser.hasName();
+        } else {
+            return ((currentEvent == START_ELEMENT)
+                    || (currentEvent == END_ELEMENT));
+        }
+    }
+
+    /**
+     * @return Returns String.
+     * @see javax.xml.stream.XMLStreamReader#getLocalName()
+     */
+    public String getLocalName() {
+        String returnStr = null;
+        if (parser != null) {
+            returnStr = parser.getLocalName();
+        } else {
+            if ((currentEvent == START_ELEMENT)
+                    || (currentEvent == END_ELEMENT)
+                    || (currentEvent == ENTITY_REFERENCE)) {
+                returnStr = ((OMElement) lastNode).getLocalName();
+            }
+        }
+        return returnStr;
+    }
+
+    /**
+     * @return Returns QName.
+     * @see javax.xml.stream.XMLStreamReader#getName()
+     */
+    public QName getName() {
+        QName returnName = null;
+        if (parser != null) {
+            returnName = parser.getName();
+        } else {
+            if ((currentEvent == START_ELEMENT)
+                    || (currentEvent == END_ELEMENT)) {
+                returnName = getQName((OMElement) lastNode);
+            }
+        }
+        return returnName;
+    }
+
+    /**
+     * @return Returns boolean.
+     * @see javax.xml.stream.XMLStreamReader#hasText()
+     */
+    public boolean hasText() {
+        return ((currentEvent == CHARACTERS) || (currentEvent == DTD)
+                || (currentEvent == ENTITY_REFERENCE)
+                || (currentEvent == COMMENT) || (currentEvent == SPACE));
+    }
+
+    /**
+     * @return Returns int.
+     * @see javax.xml.stream.XMLStreamReader#getTextLength()
+     */
+    public int getTextLength() {
+        int returnLength = 0;
+        if (parser != null) {
+            returnLength = parser.getTextLength();
+        } else {
+            OMText textNode = (OMText) lastNode;
+            returnLength = textNode.getText().length();
+        }
+        return returnLength;
+    }
+
+    /**
+     * @return Returns int.
+     * @see javax.xml.stream.XMLStreamReader#getTextStart()
+     */
+    public int getTextStart() {
+        int returnLength = 0;
+        if (parser != null) {
+            returnLength = parser.getTextStart();
+        }
+
+        // Note - this has no relevant method in the OM
+        return returnLength;
+    }
+
+    /**
+     * @param i
+     * @param chars
+     * @param i1
+     * @param i2
+     * @return Returns int.
+     * @throws XMLStreamException
+     * @see javax.xml.stream.XMLStreamReader#getTextCharacters(int, char[], int, int)
+     */
+    public int getTextCharacters(int i, char[] chars, int i1, int i2)
+            throws XMLStreamException {
+        int returnLength = 0;
+        if (parser != null) {
+            try {
+                returnLength = parser.getTextCharacters(i, chars, i1, i2);
+            } catch (XMLStreamException e) {
+                throw new OMStreamingException(e);
+            }
+        } else {
+            if (hasText()) {
+                OMText textNode = (OMText) lastNode;
+                String str = textNode.getText();
+                str.getChars(i, i + i2, chars, i1);
+            }
+        }
+        return returnLength;
+    }
+
+    /**
+     * @return Returns char[].
+     * @see javax.xml.stream.XMLStreamReader#getTextCharacters()
+     */
+    public char[] getTextCharacters() {
+        char[] returnArray = null;
+        if (parser != null) {
+            returnArray = parser.getTextCharacters();
+        } else {
+            if (hasText()) {
+                OMText textNode = (OMText) lastNode;
+                String str = textNode.getText();
+                returnArray = str.toCharArray();
+            }
+        }
+        return returnArray;
+    }
+
+    /**
+     * @return Returns String.
+     * @see javax.xml.stream.XMLStreamReader#getText()
+     */
+    public String getText() {
+        String returnString = null;
+        if (parser != null) {
+            returnString = parser.getText();
+        } else {
+            if (hasText()) {
+                if (lastNode instanceof OMText) {
+                    returnString = ((OMText) lastNode).getText();
+                } else if (lastNode instanceof OMComment) {
+                    returnString = ((OMComment) lastNode).getValue();
+                }
+            }
+        }
+        return returnString;
+    }
+
+    /**
+     * @return Returns int.
+     * @see javax.xml.stream.XMLStreamReader#getEventType()
+     */
+
+    // todo this should be improved
+    public int getEventType() {
+        return currentEvent;
+    }
+
+    /**
+     * @param i
+     * @return Returns String.
+     * @see javax.xml.stream.XMLStreamReader#getNamespaceURI
+     */
+    public String getNamespaceURI(int i) {
+        String returnString = null;
+        if (parser != null) {
+            returnString = parser.getNamespaceURI(i);
+        } else {
+            if (isStartElement() || isEndElement()
+                    || (currentEvent == NAMESPACE)) {
+                OMNamespace ns = (OMNamespace) getItemFromIterator(
+                        ((OMElement) lastNode).getAllDeclaredNamespaces(), i);
+                returnString = (ns == null)
+                        ? null
+                        : ns.getName();
+            }
+        }
+        return returnString;
+    }
+
+    /**
+     * @param i
+     * @return Returns String.
+     * @see javax.xml.stream.XMLStreamReader#getNamespacePrefix
+     */
+    public String getNamespacePrefix(int i) {
+        String returnString = null;
+        if (parser != null) {
+            returnString = parser.getNamespacePrefix(i);
+        } else {
+            if (isStartElement() || isEndElement()
+                    || (currentEvent == NAMESPACE)) {
+                OMNamespace ns = (OMNamespace) getItemFromIterator(
+                        ((OMElement) lastNode).getAllDeclaredNamespaces(), i);
+                returnString = (ns == null)
+                        ? null
+                        : ns.getPrefix();
+            }
+        }
+        return returnString;
+    }
+
+    /**
+     * @return Returns int.
+     * @see javax.xml.stream.XMLStreamReader#getNamespaceCount()
+     */
+    public int getNamespaceCount() {
+        int returnCount = 0;
+        if (parser != null) {
+            returnCount = parser.getNamespaceCount();
+        } else {
+            if (isStartElement() || isEndElement()
+                    || (currentEvent == NAMESPACE)) {
+                returnCount =
+                        getCount(
+                                ((OMElement) lastNode).getAllDeclaredNamespaces());
+            }
+        }
+        return returnCount;
+    }
+
+    /**
+     * @param i
+     * @return Returns boolean.
+     * @see javax.xml.stream.XMLStreamReader#isAttributeSpecified
+     */
+    public boolean isAttributeSpecified(int i) {
+        boolean returnValue = false;
+        if (parser != null) {
+            returnValue = parser.isAttributeSpecified(i);
+        } else {
+            if (isStartElement() || (currentEvent == ATTRIBUTE)) {
+
+                // theres nothing to be returned here
+            } else {
+                throw new IllegalStateException(
+                        "attribute type accessed in illegal event!");
+            }
+        }
+        return returnValue;
+    }
+
+    /**
+     * @param i
+     * @return Returns String.
+     * @see javax.xml.stream.XMLStreamReader#getAttributeValue
+     */
+    public String getAttributeValue(int i) {
+        String returnString = null;
+        if (parser != null) {
+            returnString = parser.getAttributeValue(i);
+        } else {
+            if (isStartElement() || (currentEvent == ATTRIBUTE)) {
+                OMAttribute attrib = getAttribute((OMElement) lastNode, i);
+                if (attrib != null) {
+                    returnString = attrib.getAttributeValue();
+                }
+            } else {
+                throw new IllegalStateException(
+                        "attribute type accessed in illegal event!");
+            }
+        }
+        return returnString;
+    }
+
+    /**
+     * @param i
+     * @return Returns String.
+     * @see javax.xml.stream.XMLStreamReader#getAttributeType
+     */
+    public String getAttributeType(int i) {
+        String returnString = null;
+        if (parser != null) {
+            returnString = parser.getAttributeType(i);
+        } else {
+            if (isStartElement() || (currentEvent == ATTRIBUTE)) {
+
+                // todo implement this
+            } else {
+                throw new IllegalStateException(
+                        "attribute type accessed in illegal event!");
+            }
+        }
+        return returnString;
+    }
+
+    /**
+     * @param i
+     * @return Returns String.
+     * @see javax.xml.stream.XMLStreamReader#getAttributePrefix
+     */
+    public String getAttributePrefix(int i) {
+        String returnString = null;
+        if (parser != null) {
+            returnString = parser.getAttributePrefix(i);
+        } else {
+            if (isStartElement() || (currentEvent == ATTRIBUTE)) {
+                OMAttribute attrib = getAttribute((OMElement) lastNode, i);
+                if (attrib != null) {
+                    OMNamespace nameSpace = attrib.getNamespace();
+                    if (nameSpace != null) {
+                        returnString = nameSpace.getPrefix();
+                    }
+                }
+            } else {
+                throw new IllegalStateException(
+                        "attribute prefix accessed in illegal event!");
+            }
+        }
+        return returnString;
+    }
+
+    /**
+     * @param i
+     * @return Returns String.
+     * @see javax.xml.stream.XMLStreamReader#getAttributeLocalName
+     */
+    public String getAttributeLocalName(int i) {
+        String returnString = null;
+        if (parser != null) {
+            returnString = parser.getAttributeLocalName(i);
+        } else {
+            if (isStartElement() || (currentEvent == ATTRIBUTE)) {
+                OMAttribute attrib = getAttribute((OMElement) lastNode, i);
+                if (attrib != null) {
+                    returnString = attrib.getLocalName();
+                }
+            } else {
+                throw new IllegalStateException(
+                        "attribute localName accessed in illegal event!");
+            }
+        }
+        return returnString;
+    }
+
+    /**
+     * @param i
+     * @return Returns String.
+     * @see javax.xml.stream.XMLStreamReader#getAttributeNamespace
+     */
+    public String getAttributeNamespace(int i) {
+        String returnString = null;
+        if (parser != null) {
+            returnString = parser.getAttributeNamespace(i);
+        } else {
+            if (isStartElement() || (currentEvent == ATTRIBUTE)) {
+                OMAttribute attrib = getAttribute((OMElement) lastNode, i);
+                if (attrib != null) {
+                    OMNamespace nameSpace = attrib.getNamespace();
+                    if (nameSpace != null) {
+                        returnString = nameSpace.getName();
+                    }
+                }
+            } else {
+                throw new IllegalStateException(
+                        "attribute nameSpace accessed in illegal event!");
+            }
+        }
+        return returnString;
+    }
+
+    /**
+     * @param i
+     * @return Returns QName.
+     * @see javax.xml.stream.XMLStreamReader#getAttributeName
+     */
+    public QName getAttributeName(int i) {
+        QName returnQName = null;
+        if (parser != null) {
+            returnQName = parser.getAttributeName(i);
+        } else {
+            if (isStartElement() || (currentEvent == ATTRIBUTE)) {
+                returnQName = getAttribute((OMElement) lastNode, i).getQName();
+            } else {
+                throw new IllegalStateException(
+                        "attribute count accessed in illegal event!");
+            }
+        }
+        return returnQName;
+    }
+
+    /**
+     * @return Returns int.
+     * @see javax.xml.stream.XMLStreamReader#getAttributeCount
+     */
+    public int getAttributeCount() {
+        int returnCount = 0;
+        if (parser != null) {
+            returnCount = parser.getAttributeCount();
+        } else {
+            if (isStartElement() || (currentEvent == ATTRIBUTE)) {
+                OMElement elt = (OMElement) lastNode;
+                returnCount = getCount(elt.getAllAttributes());
+            } else {
+                throw new IllegalStateException(
+                        "attribute count accessed in illegal event (" +
+                                currentEvent + ")!");
+            }
+        }
+        return returnCount;
+    }
+
+    // todo
+
+    /**
+     * Method getAttributeValue.
+     *
+     * @param s
+     * @param s1
+     * @return Returns String.
+     */
+    public String getAttributeValue(String s, String s1) {
+        String returnString = null;
+        if (parser != null) {
+            returnString = parser.getAttributeValue(s, s1);
+        } else {
+            if (isStartElement() || (currentEvent == ATTRIBUTE)) {
+                QName qname = new QName(s, s1);
+                OMAttribute attrib = ((OMElement) lastNode).getAttribute(qname);
+                if (attrib != null) {
+                    returnString = attrib.getAttributeValue();
+                }
+            } else {
+                throw new IllegalStateException(
+                        "attribute type accessed in illegal event!");
+            }
+        }
+        return returnString;
+    }
+
+    /**
+     * Method isWhiteSpace.
+     *
+     * @return Returns boolean.
+     */
+    public boolean isWhiteSpace() {
+        boolean b;
+        if (parser != null) {
+            b = parser.isWhiteSpace();
+        } else {
+            b = (currentEvent == SPACE);
+        }
+        return b;
+    }
+
+    /**
+     * Method isCharacters.
+     *
+     * @return Returns boolean.
+     */
+    public boolean isCharacters() {
+        boolean b;
+        if (parser != null) {
+            b = parser.isCharacters();
+        } else {
+            b = (currentEvent == CHARACTERS);
+        }
+        return b;
+    }
+
+    /**
+     * Method isEndElement.
+     *
+     * @return Returns boolean.
+     */
+    public boolean isEndElement() {
+        boolean b;
+        if (parser != null) {
+            b = parser.isEndElement();
+        } else {
+            b = (currentEvent == END_ELEMENT);
+        }
+        return b;
+    }
+
+    /**
+     * @param i
+     * @param s
+     * @param s1
+     * @throws XMLStreamException
+     * @see javax.xml.stream.XMLStreamReader#require(int, String, String)
+     */
+    public void require(int i, String s, String s1) throws XMLStreamException {
+        throw new XMLStreamException();
+    }
+
+    /**
+     * Method isStartElement.
+     *
+     * @return Returns boolean.
+     */
+    public boolean isStartElement() {
+        boolean b;
+        if (parser != null) {
+            b = parser.isStartElement();
+        } else {
+            b = (currentEvent == START_ELEMENT);
+        }
+        return b;
+    }
+
+    /**
+     * Method getNamespaceURI.
+     *
+     * @param s
+     * @return Returns String.
+     */
+    public String getNamespaceURI(String s) {
+        String returnString = null;
+        if (parser != null) {
+            returnString = parser.getNamespaceURI(s);
+        } else {
+            if (isStartElement() || isEndElement()
+                    || (currentEvent == NAMESPACE)) {
+
+                // Nothing to do here! How to get the namespacace references
+            }
+        }
+        return returnString;
+    }
+
+    /**
+     * Method close.
+     *
+     * @throws XMLStreamException
+     */
+    public void close() throws XMLStreamException {
+
+        // this doesnot mean anything with respect to the OM
+        if (parser != null) {
+            parser.close();
+        }
+    }
+
+    /**
+     * Method hasNext.
+     *
+     * @return Returns boolean.
+     * @throws XMLStreamException
+     */
+    public boolean hasNext() throws XMLStreamException {
+        if(needToThrowEndDocument){
+            return !(state == DOCUMENT_COMPLETE);
+        } else {
+            return (state != COMPLETED && currentEvent != END_DOCUMENT);
+        }
+    }
+
+    /**
+     * Returns the next tag.
+     *
+     * @return Returns int.
+     * @throws org.apache.ws.commons.om.impl.llom.exception.OMStreamingException
+     *
+     * @throws XMLStreamException
+     */
+    public int nextTag() throws XMLStreamException {
+        int eventType = next();
+        while((eventType == XMLStreamConstants.CHARACTERS && isWhiteSpace()) // skip whitespace
+            || (eventType == XMLStreamConstants.CDATA && isWhiteSpace()) // skip whitespace
+            || eventType == XMLStreamConstants.SPACE
+            || eventType == XMLStreamConstants.PROCESSING_INSTRUCTION
+            || eventType == XMLStreamConstants.COMMENT) {
+            eventType = next();
+         }
+         if (eventType != XMLStreamConstants.START_ELEMENT && eventType != XMLStreamConstants.END_ELEMENT) {
+             throw new XMLStreamException("expected start or end tag", getLocation());
+         }
+         return eventType;    
+    }
+    
+    /**
+     * @return Returns String.
+     * @throws XMLStreamException
+     * @see javax.xml.stream.XMLStreamReader#getElementText()
+     */
+    public String getElementText() throws XMLStreamException {
+        if (parser != null) {
+            try {
+                return parser.getElementText();
+            } catch (XMLStreamException e) {
+                throw new OMStreamingException(e);
+            }
+        } else {
+            if (currentNode.getType() == OMNode.ELEMENT_NODE) {
+                return ((OMElement)currentNode).getText();
+            }else if (currentNode.getType() == OMNode.TEXT_NODE){
+                 return ((OMText)currentNode).getText();
+            }
+        }
+        return "";
+    }
+
+    /**
+     * Method next.
+     *
+     * @return Returns int.
+     * @throws XMLStreamException
+     */
+    public int next() throws XMLStreamException {
+        switch (state) {
+            case DOCUMENT_COMPLETE:
+                throw new XMLStreamException("End of the document reached");
+            case COMPLETED:
+                state = DOCUMENT_COMPLETE;
+                currentEvent = END_DOCUMENT;
+                break;
+            case SWITCH_AT_NEXT:
+                state = SWITCHED;
+
+                // load the parser
+                try {
+                    parser = (XMLStreamReader) builder.getParser();
+                } catch (Exception e) {
+                    throw new XMLStreamException("problem accessing the parser", e);
+                }
+
+                // We should throw an END_DOCUMENT
+                needToThrowEndDocument = true;
+                if ((currentEvent == START_DOCUMENT) &&
+                        (currentEvent == parser.getEventType())) {
+                    currentEvent = parser.next();
+                } else {
+                    currentEvent = parser.getEventType();
+                }
+
+                if(currentEvent == START_ELEMENT) {
+                    depth = 0;
+                } else if(currentEvent == END_ELEMENT) {
+                    depth ++;
+                }
+                updateCompleteStatus();
+                break;
+            case NAVIGABLE:
+                currentEvent = generateEvents(currentNode);
+                updateCompleteStatus();
+                updateLastNode();
+                break;
+            case SWITCHED:
+                if(parser.hasNext()) {
+                    currentEvent = parser.next();
+                }
+                updateCompleteStatus();
+                break;
+            default :
+                throw new OMStreamingException("unsuppported state!");
+        }
+        return currentEvent;
+    }
+
+    /**
+     * Method getProperty.
+     *
+     * @param s
+     * @return Returns Object.
+     * @throws IllegalArgumentException
+     */
+    public Object getProperty(String s) throws IllegalArgumentException {
+        throw new UnsupportedOperationException();
+    }
+
+    /**
+     * This is a very important method. It keeps the navigator one step ahead 
+     * and pushes it one event ahead. If the nextNode is null then navigable is 
+     * set to false. At the same time the parser and builder are set up for 
+     * the upcoming event generation.
+     *
+     * @throws XMLStreamException
+     */
+    private void updateLastNode() throws XMLStreamException {
+        lastNode = currentNode;
+        currentNode = nextNode;
+        try {
+            updateNextNode();
+        } catch (Exception e) {
+            throw new XMLStreamException(e);
+        }
+    }
+
+    /**
+     * Method updateNextNode.
+     */
+    private void updateNextNode() {
+        if (navigator.isNavigable()) {
+            nextNode = navigator.next();
+        } else {
+            if (!switchingAllowed) {
+                if (navigator.isCompleted()) {
+                    nextNode = null;
+
+                } else {
+                    builder.next();
+                    navigator.step();
+                    nextNode = navigator.next();
+                }
+            } else {
+
+                // reset caching (the default is ON so it was not needed in the
+                // earlier case!
+                builder.setCache(false);
+                state = SWITCH_AT_NEXT;
+            }
+        }
+    }
+
+    /**
+     * Method updateCompleteStatus.
+     */
+    private void updateCompleteStatus() {
+        if (state == NAVIGABLE) {
+            if (rootNode == currentNode) {
+                if (isFirst) {
+                    isFirst = false;
+                } else {
+                    state = COMPLETED;
+                }
+            }
+        } else {
+            if (state == SWITCHED) {
+                if (currentEvent == START_ELEMENT) {
+                    ++depth;
+                } else if (currentEvent == END_ELEMENT) {
+                    --depth;
+                    if(depth < 0) {
+                        state = COMPLETED;
+                    }
+                }
+            }
+            state = (currentEvent == END_DOCUMENT)
+                    ? DOCUMENT_COMPLETE
+                    : state;
+        }
+    }
+
+    /**
+     * Method getNamespaceContext.
+     *
+     * @return Returns NamespaceContext.
+     */
+    public NamespaceContext getNamespaceContext() {
+        throw new UnsupportedOperationException();
+    }
+
+    /**
+     * Method getEncoding.
+     *
+     * @return Returns String.
+     */
+    public String getEncoding() {
+        return null;
+    }
+
+    /**
+     * Method getLocation.
+     *
+     * @return Returns Location.
+     */
+    public Location getLocation() {
+         return new EmptyOMLocation();
+    }
+
+    /**
+     * Method getVersion.
+     *
+     * @return Returns String.
+     */
+    public String getVersion() {
+        return "1.0"; //todo put the constant
+    }
+
+
+    /**
+     * Method isStandalone.
+     *
+     * @return Returns boolean.
+     */
+    public boolean isStandalone() {
+        return true;
+    }
+
+    /**
+     * Method standaloneSet.
+     *
+     * @return Returns boolean.
+     */
+    public boolean standaloneSet() {
+        return false;
+    }
+
+    /**
+     * Method getCharacterEncodingScheme.
+     *
+     * @return Returns String.
+     */
+    public String getCharacterEncodingScheme() {
+        return "utf-8";
+    }
+
+    /**
+     * Method getPITarget.
+     *
+     * @return Returns String.
+     */
+    public String getPITarget() {
+        throw new UnsupportedOperationException();
+    }
+
+    /**
+     * Method getPIData.
+     *
+     * @return Returns String.
+     */
+    public String getPIData() {
+        throw new UnsupportedOperationException();
+    }
+
+    /*
+     *
+     * ################################################################
+     * Generator methods for the OMNodes returned by the navigator
+     * ################################################################
+     *
+     */
+
+    /**
+     * Method generateEvents.
+     *
+     * @param node
+     * @return Returns int.
+     */
+    private int generateEvents(OMNode node) {
+        int returnEvent = 0;
+        int nodeType = node.getType();
+        switch (nodeType) {
+            case OMNode.ELEMENT_NODE:
+                OMElement element = (OMElement) node;
+                returnEvent = generateElementEvents(element);
+                break;
+            case OMNode.TEXT_NODE:
+                returnEvent = generateTextEvents();
+                break;
+            case OMNode.COMMENT_NODE:
+                returnEvent = generateCommentEvents();
+                break;
+            case OMNode.CDATA_SECTION_NODE:
+                returnEvent = generateCdataEvents();
+                break;
+            default :
+                break;    // just ignore any other nodes
+        }
+        return returnEvent;
+    }
+
+    /**
+     * Method generateElementEvents.
+     *
+     * @param elt
+     * @return Returns int.
+     */
+    private int generateElementEvents(OMElement elt) {
+        int returnValue = START_ELEMENT;
+        if (!elementStack.isEmpty() && elementStack.peek().equals(elt)) {
+            returnValue = END_ELEMENT;
+            elementStack.pop();
+        } else {
+            elementStack.push(elt);
+        }
+        return returnValue;
+    }
+
+    /**
+     * Method generateTextEvents.
+     *
+     * @return Returns int.
+     */
+    private int generateTextEvents() {
+        return CHARACTERS;
+    }
+
+    /**
+     * Method generateCommentEvents
+     *
+     * @return Returns int.
+     */
+    private int generateCommentEvents() {
+        return COMMENT;
+    }
+
+    /**
+     * Method generateCdataEvents
+     *
+     * @return Returns int.
+     */
+    private int generateCdataEvents() {
+        return CDATA;
+    }
+
+    /*
+     * ####################################################################
+     * Other helper methods
+     * ####################################################################
+     */
+
+    /**
+     * helper method getCount.
+     *
+     * @param it
+     * @return Returns int.
+     */
+    private int getCount(Iterator it) {
+        int count = 0;
+        if (it != null) {
+            while (it.hasNext()) {
+                it.next();
+                count++;
+            }
+        }
+        return count;
+    }
+
+    /**
+     * Helper method getItemFromIterator.
+     *
+     * @param it
+     * @param index
+     * @return Returns Object.
+     */
+    private Object getItemFromIterator(Iterator it, int index) {
+        int count = 0;
+        Object returnObject = null;
+        boolean found = false;
+        if (it != null) {
+            while (it.hasNext()) {
+                returnObject = it.next();
+                if (index == count++) {
+                    found = true;
+                    break;
+                }
+            }
+        }
+        if (found) {
+            return returnObject;
+        } else {
+            return null;
+        }
+    }
+
+    /**
+     * Helper method getQName.
+     *
+     * @param element
+     * @return Returns QName.
+     */
+    private QName getQName(OMElement element) {
+        QName returnName;
+        OMNamespace ns = element.getNamespace();
+        String localPart = element.getLocalName();
+        if (ns != null) {
+            String prefix = ns.getPrefix();
+            String uri = ns.getName();
+            if ((prefix == null) || prefix.equals("")) {
+                returnName = new QName(uri, localPart);
+            } else {
+                returnName = new QName(uri, localPart, prefix);
+            }
+        } else {
+            returnName = new QName(localPart);
+        }
+        return returnName;
+    }
+
+    /**
+     * @param elt
+     * @param index
+     * @return Returns OMAttribute.
+     */
+    private OMAttribute getAttribute(OMElement elt, int index) {
+        OMAttribute returnAttrib = null;
+        if (elt != null) {
+            returnAttrib =
+                    (OMAttribute) getItemFromIterator(elt.getAllAttributes(),
+                            index);
+        }
+        return returnAttrib;
+    }
+
+    public void setParser(XMLStreamReader parser) {
+        this.parser = parser;
+    }
+
+}
diff --git a/src/org/apache/ws/commons/om/impl/llom/OMTextImpl.java b/src/org/apache/ws/commons/om/impl/llom/OMTextImpl.java
new file mode 100644
index 0000000..99546fa
--- /dev/null
+++ b/src/org/apache/ws/commons/om/impl/llom/OMTextImpl.java
@@ -0,0 +1,433 @@
+/*
+ * Copyright 2004,2005 The Apache Software Foundation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      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.
+ */
+
+package org.apache.ws.commons.om.impl.llom;
+
+
+import org.apache.ws.commons.om.OMAttribute;
+import org.apache.ws.commons.om.OMConstants;
+import org.apache.ws.commons.om.OMElement;
+import org.apache.ws.commons.om.OMException;
+import org.apache.ws.commons.om.OMNamespace;
+import org.apache.ws.commons.om.OMText;
+import org.apache.ws.commons.om.OMXMLParserWrapper;
+import org.apache.ws.commons.om.util.Base64;
+import org.apache.ws.commons.om.util.UUIDGenerator;
+import org.apache.ws.commons.om.impl.OMOutputImpl;
+import org.apache.ws.commons.om.impl.llom.mtom.MTOMStAXSOAPModelBuilder;
+
+import javax.xml.stream.XMLStreamException;
+import javax.xml.stream.XMLStreamWriter;
+import java.io.IOException;
+import java.io.InputStream;
+
+public class OMTextImpl extends OMNodeImpl implements OMText, OMConstants {
+    protected String value = null;
+
+    protected String mimeType;
+
+    protected boolean optimize = false;
+
+    protected boolean isBinary = false;
+
+    /**
+     * Field contentID for the mime part used when serializing Binary stuff as
+     * MTOM optimized.
+     */
+    private String contentID = null;
+
+    /**
+     * Field dataHandler contains the DataHandler
+     * Declaring as Object to remove the dependency on 
+     * Javax.activation.DataHandler
+     */
+    private Object dataHandlerObject = null;
+
+    /**
+     * Field nameSpace used when serializing Binary stuff as MTOM optimized.
+     */
+    protected OMNamespace ns = new OMNamespaceImpl(
+            "http://www.w3.org/2004/08/xop/include", "xop");
+
+    /**
+     * Field localName used when serializing Binary stuff as MTOM optimized.
+     */
+    protected String localName = "Include";
+
+    /**
+     * Field attributes used when serializing Binary stuff as MTOM optimized.
+     */
+    protected OMAttribute attribute;
+
+    /**
+     * Constructor OMTextImpl.
+     *
+     * @param s
+     */
+    public OMTextImpl(String s) {
+        this.value = s;
+        this.nodeType = TEXT_NODE;
+    }
+
+    /**
+     * @param s
+     * @param nodeType - OMText can handle CHARACTERS, SPACES, CDATA and ENTITY REFERENCES.
+     *                 Constants for this can be found in OMNode.
+     */
+    public OMTextImpl(String s, int nodeType) {
+        this.value = s;
+        this.nodeType = nodeType;
+    }
+
+    /**
+     * Constructor OMTextImpl.
+     *
+     * @param parent
+     * @param text
+     */
+    public OMTextImpl(OMElement parent, String text) {
+        super(parent);
+        this.value = text;
+        done = true;
+        this.nodeType = TEXT_NODE;
+    }
+
+    public OMTextImpl(OMElement parent, String text, int nodeType) {
+        super(parent);
+        this.value = text;
+        done = true;
+        this.nodeType = nodeType;
+    }
+
+    /**
+     * @param s        - base64 encoded String representation of Binary
+     * @param mimeType of the Binary
+     */
+    public OMTextImpl(String s, String mimeType, boolean optimize) {
+        this(null, s, mimeType, optimize);
+    }
+
+    /**
+     * @param parent
+     * @param s        -
+     *                 base64 encoded String representation of Binary
+     * @param mimeType of the Binary
+     */
+    public OMTextImpl(OMElement parent, String s, String mimeType,
+                      boolean optimize) {
+        this(parent, s);
+        this.mimeType = mimeType;
+        this.optimize = optimize;
+        this.isBinary = true;
+        done = true;
+        this.nodeType = TEXT_NODE;
+    }
+
+    /**
+     * @param dataHandler To send binary optimised content Created programatically.
+     */
+    public OMTextImpl(Object dataHandler) {
+        this(dataHandler, true);
+    }
+
+    /**
+     * @param dataHandler
+     * @param optimize    To send binary content. Created progrmatically.
+     */
+    public OMTextImpl(Object dataHandler, boolean optimize) {
+        this.dataHandlerObject = dataHandler;
+        this.isBinary = true;
+        this.optimize = optimize;
+        done = true;
+        this.nodeType = TEXT_NODE;
+    }
+
+    /**
+     * @param contentID
+     * @param parent
+     * @param builder   Used when the builder is encountered with a XOP:Include tag
+     *                  Stores a reference to the builder and the content-id. Supports
+     *                  deferred parsing of MIME messages.
+     */
+    public OMTextImpl(String contentID, OMElement parent,
+                      OMXMLParserWrapper builder) {
+        super(parent);
+        this.contentID = contentID;
+        this.optimize = true;
+        this.isBinary = true;
+        this.builder = builder;
+        this.nodeType = TEXT_NODE;
+    }
+
+    /**
+     * @param omOutput
+     * @throws XMLStreamException
+     */
+    public void serialize(OMOutputImpl omOutput) throws XMLStreamException {
+        serializeLocal(omOutput);
+
+    }
+
+    /**
+     * Writes the relevant output.
+     *
+     * @param omOutput
+     * @throws XMLStreamException
+     */
+    private void writeOutput(OMOutputImpl omOutput) throws XMLStreamException {
+        XMLStreamWriter writer = omOutput.getXmlStreamWriter();
+        int type = getType();
+        if (type == TEXT_NODE || type == SPACE_NODE) {
+            writer.writeCharacters(this.getText());
+        } else if (type == CDATA_SECTION_NODE) {
+            writer.writeCData(this.getText());
+        } else if (type == ENTITY_REFERENCE_NODE) {
+            writer.writeEntityRef(this.getText());
+        }
+    }
+
+    /**
+     * Returns the value.
+     */
+    public String getText() throws OMException {
+        if (this.value != null) {
+            return this.value;
+        } else {
+            try {
+                InputStream inStream;
+                inStream = this.getInputStream();
+                byte[] data;
+                StringBuffer text = new StringBuffer();
+                do {
+                	data = new byte[1024];
+                	int len;
+                	while((len = inStream.read(data)) > 0) {
+                		byte[] temp = new byte[len];
+                		System.arraycopy(data,0,temp,0,len);
+                		text.append(Base64.encode(temp));
+                	}
+
+                } while (inStream.available() > 0);
+                
+                return text.toString();
+            } catch (Exception e) {
+                throw new OMException(e);
+            }
+        }
+    }
+
+    public boolean isOptimized() {
+        return optimize;
+    }
+
+    public void setOptimize(boolean value) {
+        this.optimize = value;
+	if (value)
+	{
+	     isBinary = true;
+	}
+    }
+
+    
+    /**
+     * Gets the datahandler.
+     * @return Returns javax.activation.DataHandler
+     */
+    public Object getDataHandler() {
+        /*
+         * this should return a DataHandler containing the binary data
+         * reperesented by the Base64 strings stored in OMText
+         */
+        if (value != null & isBinary) {
+        	return org.apache.ws.commons.attachments.DataHandlerUtils.getDataHandlerFromText(value,mimeType);
+        } else {
+
+            if (dataHandlerObject == null) {
+                if (contentID == null) {
+                    throw new RuntimeException("ContentID is null");
+                }
+                dataHandlerObject = ((MTOMStAXSOAPModelBuilder) builder)
+                        .getDataHandler(contentID);
+            }
+            return dataHandlerObject;
+        }
+    }
+
+    public String getLocalName() {
+        return localName;
+    }
+
+    public java.io.InputStream getInputStream() throws OMException {
+        if (isBinary) {
+            if (dataHandlerObject == null) {
+                getDataHandler();
+            }
+            InputStream inStream;
+            javax.activation.DataHandler dataHandler = (javax.activation.DataHandler)dataHandlerObject;
+            try {
+                inStream = dataHandler.getDataSource().getInputStream();
+            } catch (IOException e) {
+                throw new OMException(
+                        "Cannot get InputStream from DataHandler." + e);
+            }
+            return inStream;
+        } else {
+            throw new OMException("Unsupported Operation");
+        }
+    }
+
+    public String getContentID() {
+        if (contentID == null) {
+            contentID = UUIDGenerator.getUUID()
+                    + "@apache.org";
+        }
+        return this.contentID;
+    }
+
+    public boolean isComplete() {
+        return done;
+    }
+
+    public void serializeAndConsume(OMOutputImpl omOutput)
+            throws XMLStreamException {
+        serializeLocal(omOutput);
+    }
+
+    private void serializeLocal(OMOutputImpl omOutput) throws XMLStreamException {
+        if (!this.isBinary) {
+            writeOutput(omOutput);
+        } else {
+            if (omOutput.isOptimized()) {
+                if (contentID == null) {
+                    contentID = omOutput.getNextContentId();
+                }
+                // send binary as MTOM optimised
+                this.attribute = new OMAttributeImpl("href",
+                        new OMNamespaceImpl("", ""), "cid:" + getContentID());
+                this.serializeStartpart(omOutput);
+                omOutput.writeOptimized(this);
+                omOutput.getXmlStreamWriter().writeEndElement();
+            } else {
+                omOutput.getXmlStreamWriter().writeCharacters(this.getText());
+            } 
+        }
+    }
+
+    /*
+     * Methods to copy from OMSerialize utils
+     */
+    private void serializeStartpart(OMOutputImpl omOutput)
+            throws XMLStreamException {
+        String nameSpaceName;
+        String writer_prefix;
+        String prefix;
+        XMLStreamWriter writer = omOutput.getXmlStreamWriter();
+        if (this.ns != null) {
+            nameSpaceName = this.ns.getName();
+            writer_prefix = writer.getPrefix(nameSpaceName);
+            prefix = this.ns.getPrefix();
+            if (nameSpaceName != null) {
+                if (writer_prefix != null) {
+                    writer
+                            .writeStartElement(nameSpaceName, this
+                                    .getLocalName());
+                } else {
+                    if (prefix != null) {
+                        writer.writeStartElement(prefix, this.getLocalName(),
+                                nameSpaceName);
+                        //TODO FIX ME
+                        //writer.writeNamespace(prefix, nameSpaceName);
+                        writer.setPrefix(prefix, nameSpaceName);
+                    } else {
+                        writer.writeStartElement(nameSpaceName, this
+                                .getLocalName());
+                        writer.writeDefaultNamespace(nameSpaceName);
+                        writer.setDefaultNamespace(nameSpaceName);
+                    }
+                }
+            } else {
+                writer.writeStartElement(this.getLocalName());
+            }
+        } else {
+            writer.writeStartElement(this.getLocalName());
+        }
+        // add the elements attribute "href"
+        serializeAttribute(this.attribute, omOutput);
+        // add the namespace
+        serializeNamespace(this.ns, omOutput);
+    }
+
+    /**
+     * Method serializeAttribute.
+     *
+     * @param attr
+     * @param omOutput
+     * @throws XMLStreamException
+     */
+    static void serializeAttribute(OMAttribute attr, OMOutputImpl omOutput)
+            throws XMLStreamException {
+        XMLStreamWriter writer = omOutput.getXmlStreamWriter();
+        // first check whether the attribute is associated with a namespace
+        OMNamespace ns = attr.getNamespace();
+        String prefix;
+        String namespaceName;
+        if (ns != null) {
+            // add the prefix if it's availble
+            prefix = ns.getPrefix();
+            namespaceName = ns.getName();
+            if (prefix != null) {
+                writer.writeAttribute(prefix, namespaceName, attr
+                        .getLocalName(), attr.getAttributeValue());
+            } else {
+                writer.writeAttribute(namespaceName, attr.getLocalName(), attr
+                        .getAttributeValue());
+            }
+        } else {
+            writer.writeAttribute(attr.getLocalName(), attr.getAttributeValue());
+        }
+    }
+
+    /**
+     * Method serializeNamespace.
+     *
+     * @param namespace
+     * @param omOutput
+     * @throws XMLStreamException
+     */
+    static void serializeNamespace(OMNamespace namespace, OMOutputImpl omOutput)
+            throws XMLStreamException {
+        XMLStreamWriter writer = omOutput.getXmlStreamWriter();
+        if (namespace != null) {
+            String uri = namespace.getName();
+            String ns_prefix = namespace.getPrefix();
+            writer.writeNamespace(ns_prefix, namespace.getName());
+            writer.setPrefix(ns_prefix, uri);
+        }
+    }
+
+    /**
+     * A slightly different implementation of the discard method.
+     *
+     * @throws OMException
+     */
+    public void discard() throws OMException {
+        if (done) {
+            this.detach();
+        } else {
+            builder.discard((OMElement) this.parent);
+        }
+    }
+}
diff --git a/src/org/apache/ws/commons/om/impl/llom/builder/SAXOMBuilder.java b/src/org/apache/ws/commons/om/impl/llom/builder/SAXOMBuilder.java
new file mode 100644
index 0000000..c41891a
--- /dev/null
+++ b/src/org/apache/ws/commons/om/impl/llom/builder/SAXOMBuilder.java
@@ -0,0 +1,174 @@
+/*
+ * Copyright 2004,2005 The Apache Software Foundation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      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.
+ */
+
+package org.apache.ws.commons.om.impl.llom.builder;
+
+import org.apache.ws.commons.om.OMAbstractFactory;
+import org.apache.ws.commons.om.OMContainer;
+import org.apache.ws.commons.om.OMElement;
+import org.apache.ws.commons.om.OMException;
+import org.apache.ws.commons.om.OMFactory;
+import org.apache.ws.commons.om.OMNode;
+import org.apache.ws.commons.om.impl.OMNodeEx;
+import org.xml.sax.Attributes;
+import org.xml.sax.Locator;
+import org.xml.sax.SAXException;
+import org.xml.sax.helpers.DefaultHandler;
+
+import java.util.ArrayList;
+import java.util.List;
+
+public class SAXOMBuilder extends DefaultHandler {
+    OMElement root = null;
+
+    OMNode lastNode = null;
+
+    OMElement nextElem = null;
+
+    OMFactory factory = OMAbstractFactory.getOMFactory();
+
+    List prefixMappings = new ArrayList();
+
+    public void setDocumentLocator(Locator arg0) {
+    }
+
+    public void startDocument() throws SAXException {
+
+    }
+
+    public void endDocument() throws SAXException {
+    }
+
+    protected OMElement createNextElement(String localName) throws OMException {
+        OMElement e;
+        if (lastNode == null) {
+            root = e = factory.createOMElement(localName, null, null, null);
+        } else if (lastNode.isComplete()) {
+            e = factory.createOMElement(localName, null, lastNode.getParent(),
+                    null);
+            ((OMNodeEx)lastNode).setNextOMSibling(e);
+            ((OMNodeEx)e).setPreviousOMSibling(lastNode);
+        } else {
+            OMElement parent = (OMElement) lastNode;
+            e = factory.createOMElement(localName, null, (OMElement) lastNode,
+                    null);
+            parent.setFirstChild(e);
+        }
+        return e;
+    }
+
+    /*
+     * (non-Javadoc)
+     *
+     * @see org.xml.sax.ContentHandler#startPrefixMapping(java.lang.String,
+     *      java.lang.String)
+     */
+    public void startPrefixMapping(String prefix, String uri)
+            throws SAXException {
+        if (nextElem == null)
+            nextElem = createNextElement(null);
+        nextElem.declareNamespace(uri, prefix);
+    }
+
+    public void endPrefixMapping(String arg0) throws SAXException {
+    }
+
+    /*
+     * (non-Javadoc)
+     *
+     * @see org.xml.sax.ContentHandler#startElement(java.lang.String,
+     *      java.lang.String, java.lang.String, org.xml.sax.Attributes)
+     */
+    public void startElement(String namespaceURI, String localName,
+                             String qName, Attributes atts) throws SAXException {
+        if (localName == null || localName.trim().equals(""))
+            localName = qName.substring(qName.indexOf(':') + 1);
+        if (nextElem == null)
+            nextElem = createNextElement(localName);
+        else
+            nextElem.setLocalName(localName);
+        nextElem
+                .setNamespace(nextElem.findNamespace(namespaceURI, null));
+        int j = atts.getLength();
+        for (int i = 0; i < j; i++)
+            nextElem.addAttribute(atts.getLocalName(i), atts.getValue(i),
+                    nextElem.findNamespace(atts.getURI(i), null));
+        lastNode = nextElem;
+        nextElem = null;
+    }
+
+    /*
+     * (non-Javadoc)
+     *
+     * @see org.xml.sax.ContentHandler#endElement(java.lang.String,
+     *      java.lang.String, java.lang.String)
+     */
+    public void endElement(String arg0, String arg1, String arg2)
+            throws SAXException {
+        if (lastNode.isComplete()) {
+            OMContainer parent = lastNode.getParent();
+            ((OMNodeEx)parent).setComplete(true);
+            lastNode = (OMNode) parent;
+        } else {
+            OMElement e = (OMElement) lastNode;
+            ((OMNodeEx)e).setComplete(true);
+        }
+    }
+
+    /*
+     * (non-Javadoc)
+     *
+     * @see org.xml.sax.ContentHandler#characters(char[], int, int)
+     */
+    public void characters(char[] ch, int start, int length)
+            throws SAXException {
+        if (lastNode == null) {
+            throw new SAXException("");
+        }
+        OMNode node;
+        if (lastNode.isComplete()) {
+            node =
+                    factory.createText((OMElement) lastNode.getParent(),
+                            new String(ch,
+                                    start, length));
+            ((OMNodeEx)lastNode).setNextOMSibling(node);
+            ((OMNodeEx)node).setPreviousOMSibling(lastNode);
+        } else {
+            OMElement e = (OMElement) lastNode;
+            node = factory.createText(e, new String(ch, start, length));
+            e.setFirstChild(node);
+        }
+        lastNode = node;
+    }
+
+    public void ignorableWhitespace(char[] arg0, int arg1, int arg2)
+            throws SAXException {
+    }
+
+    public void processingInstruction(String arg0, String arg1)
+            throws SAXException {
+    }
+
+    public void skippedEntity(String arg0) throws SAXException {
+    }
+
+    /**
+     * @return Returns the root.
+     */
+    public OMElement getRootElement() {
+        return root;
+    }
+}
diff --git a/src/org/apache/ws/commons/om/impl/llom/builder/StAXBuilder.java b/src/org/apache/ws/commons/om/impl/llom/builder/StAXBuilder.java
new file mode 100644
index 0000000..e3136aa
--- /dev/null
+++ b/src/org/apache/ws/commons/om/impl/llom/builder/StAXBuilder.java
@@ -0,0 +1,424 @@
+/*
+ * Copyright 2004,2005 The Apache Software Foundation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      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.
+ */
+
+package org.apache.ws.commons.om.impl.llom.builder;
+
+import org.apache.ws.commons.om.OMAbstractFactory;
+import org.apache.ws.commons.om.OMConstants;
+import org.apache.ws.commons.om.OMDocument;
+import org.apache.ws.commons.om.OMElement;
+import org.apache.ws.commons.om.OMException;
+import org.apache.ws.commons.om.OMFactory;
+import org.apache.ws.commons.om.OMNamespace;
+import org.apache.ws.commons.om.OMNode;
+import org.apache.ws.commons.om.OMXMLParserWrapper;
+import org.apache.ws.commons.om.impl.OMNodeEx;
+
+import javax.xml.stream.XMLStreamConstants;
+import javax.xml.stream.XMLStreamReader;
+
+/**
+ * OM should be able to be built from any data source. And the model it builds 
+ * may be a SOAP specific one or just an XML model. This class will give 
+ * some common functionality of OM Building from StAX.
+ */
+public abstract class StAXBuilder implements OMXMLParserWrapper {
+
+    /**
+     * Field parser
+     */
+    protected XMLStreamReader parser;
+
+    /**
+     * Field omfactory
+     */
+    protected OMFactory omfactory;
+
+    /**
+     * Field lastNode
+     */
+    protected OMNode lastNode;
+
+    // returns the state of completion
+
+    /**
+     * Field done
+     */
+    protected boolean done = false;
+
+    // keeps the state of the cache
+
+    /**
+     * Field cache
+     */
+    protected boolean cache = true;
+
+    // keeps the state of the parser access. if the parser is
+    // accessed atleast once,this flag will be set
+
+    /**
+     * Field parserAccessed
+     */
+    protected boolean parserAccessed = false;
+    protected OMDocument document;
+
+
+
+    /**
+     * Constructor StAXBuilder.
+     *
+     * @param ombuilderFactory
+     * @param parser
+     */
+    protected StAXBuilder(OMFactory ombuilderFactory, XMLStreamReader parser) {
+        this.parser = parser;
+        omfactory = ombuilderFactory;
+    }
+
+    /**
+     * Constructor StAXBuilder.
+     *
+     * @param parser
+     */
+    protected StAXBuilder(XMLStreamReader parser) {
+        this(OMAbstractFactory.getOMFactory(), parser);
+    }
+
+    /**
+     * Method setOmbuilderFactory.
+     *
+     * @param ombuilderFactory
+     */
+    public void setOmbuilderFactory(OMFactory ombuilderFactory) {
+        this.omfactory = ombuilderFactory;
+    }
+
+    /**
+     * Method processNamespaceData.
+     *
+     * @param node
+     * @param isSOAPElement
+     */
+    protected abstract void processNamespaceData(OMElement node,
+                                                 boolean isSOAPElement);
+
+    // since the behaviors are different when it comes to namespaces
+    // this must be implemented differently
+
+    /**
+     * Method processAttributes.
+     *
+     * @param node
+     */
+    protected void processAttributes(OMElement node) {
+        int attribCount = parser.getAttributeCount();
+        for (int i = 0; i < attribCount; i++) {
+            OMNamespace ns = null;
+            String uri = parser.getAttributeNamespace(i);
+            String prefix = parser.getAttributePrefix(i);
+            if (uri != null && uri.hashCode() != 0) {
+                ns = node.findNamespace(uri, prefix);
+            }
+            // todo if the attributes are supposed to namespace qualified all the time
+            // todo then this should throw an exception here
+            node.addAttribute(parser.getAttributeLocalName(i),
+                    parser.getAttributeValue(i), ns);
+        }
+    }
+
+    /**
+     * Method createOMText.
+     *
+     * @return Returns OMNode.
+     * @throws OMException
+     */
+    protected OMNode createOMText(int textType) throws OMException {
+        OMNode node = null;
+        if (lastNode == null) {
+            return null;
+        } else if (!lastNode.isComplete()) {
+            node = omfactory.createText((OMElement) lastNode, parser.getText(), textType);
+        } else if (!(lastNode.getParent() instanceof OMDocument)) {
+            node = omfactory.createText((OMElement)lastNode.getParent(), parser.getText(), textType);
+        }
+        return node;
+    }
+
+    /**
+     * Method reset.
+     *
+     * @param node
+     * @throws OMException
+     */
+    public void reset(OMNode node) throws OMException {
+        lastNode = null;
+    }
+
+    /**
+     * Method discard.
+     *
+     * @param el
+     * @throws OMException
+     */
+    public void discard(OMElement el) throws OMException {
+        OMElement element = null;
+
+        if (element.isComplete() || !cache) {
+            throw new OMException();
+        }
+        try {
+            cache = false;
+            do {
+                while (parser.next() != XMLStreamConstants.END_ELEMENT) ;
+
+                // TODO:
+            } while (!parser.getName().equals(element.getQName()));
+            lastNode = element.getPreviousOMSibling();
+            if (lastNode != null) {
+                ((OMNodeEx)lastNode).setNextOMSibling(null);
+            } else {
+                OMElement parent = (OMElement) element.getParent();
+                if (parent == null) {
+                    throw new OMException();
+                }
+                parent.setFirstChild(null);
+                lastNode = parent;
+            }
+            cache = true;
+        } catch (OMException e) {
+            throw e;
+        } catch (Exception e) {
+            throw new OMException(e);
+        }
+    }
+
+    /**
+     * Method getText.
+     *
+     * @return Returns String.
+     * @throws OMException
+     */
+    public String getText() throws OMException {
+        return parser.getText();
+    }
+
+    /**
+     * Method getNamespace. 
+     *
+     * @return Returns String.
+     * @throws OMException
+     */
+    public String getNamespace() throws OMException {
+        return parser.getNamespaceURI();
+    }
+
+    /**
+     * Method getNamespaceCount.
+     *
+     * @return Returns int.
+     * @throws OMException
+     */
+    public int getNamespaceCount() throws OMException {
+        try {
+            return parser.getNamespaceCount();
+        } catch (Exception e) {
+            throw new OMException(e);
+        }
+    }
+
+    /**
+     * Method getNamespacePrefix.
+     *
+     * @param index
+     * @return Returns String.
+     * @throws OMException
+     */
+    public String getNamespacePrefix(int index) throws OMException {
+        try {
+            return parser.getNamespacePrefix(index);
+        } catch (Exception e) {
+            throw new OMException(e);
+        }
+    }
+
+    /**
+     * Method getNamespaceUri.
+     *
+     * @param index
+     * @return Returns String.
+     * @throws OMException
+     */
+    public String getNamespaceUri(int index) throws OMException {
+        try {
+            return parser.getNamespaceURI(index);
+        } catch (Exception e) {
+            throw new OMException(e);
+        }
+    }
+
+    /**
+     * Method setCache.
+     *
+     * @param b
+     */
+    public void setCache(boolean b) {
+        if (parserAccessed && b) {
+            throw new UnsupportedOperationException(
+                    "parser accessed. cannot set cache");
+        }
+        cache = b;
+    }
+
+    /**
+     * Method getName.
+     *
+     * @return Returns String.
+     * @throws OMException
+     */
+    public String getName() throws OMException {
+        return parser.getLocalName();
+    }
+
+    /**
+     * Method getPrefix.
+     *
+     * @return Returns String.
+     * @throws OMException
+     */
+    public String getPrefix() throws OMException {
+        return parser.getPrefix();
+    }
+
+    /**
+     * Method getAttributeCount.
+     *
+     * @return Returns int.
+     * @throws OMException
+     */
+    public int getAttributeCount() throws OMException {
+        return parser.getAttributeCount();
+    }
+
+    /**
+     * Method getAttributeNamespace.
+     *
+     * @param arg
+     * @return Returns String.
+     * @throws OMException
+     */
+    public String getAttributeNamespace(int arg) throws OMException {
+        return parser.getAttributeNamespace(arg);
+    }
+
+    /**
+     * Method getAttributeName.
+     *
+     * @param arg
+     * @return Returns String.
+     * @throws OMException
+     */
+    public String getAttributeName(int arg) throws OMException {
+        return parser.getAttributeNamespace(arg);
+    }
+
+    /**
+     * Method getAttributePrefix.
+     *
+     * @param arg
+     * @return Returns String.
+     * @throws OMException
+     */
+    public String getAttributePrefix(int arg) throws OMException {
+        return parser.getAttributeNamespace(arg);
+    }
+
+    /**
+     * Method getParser.
+     *
+     * @return Returns Object.
+     */
+    public Object getParser() {
+        if (parserAccessed){
+            throw new IllegalStateException(
+                    "Parser already accessed!");  
+        }
+        if (!cache) {
+            parserAccessed = true;
+            return parser;
+        } else {
+            throw new IllegalStateException(
+                    "cache must be switched off to access the parser");
+        }
+    }
+
+    /**
+     * Method isCompleted.
+     *
+     * @return Returns boolean.
+     */
+    public boolean isCompleted() {
+        return done;
+    }
+
+    /**
+     * This method is called with the XMLStreamConstants.START_ELEMENT event.
+     *
+     * @return Returns OMNode.
+     * @throws OMException
+     */
+    protected abstract OMNode createOMElement() throws OMException;
+
+    /**
+     * Forwards the parser one step further, if parser is not completed yet.
+     * If this is called after parser is done, then throw an OMException.
+     * If the cache is set to false, then returns the event, *without* building the OM tree.
+     * If the cache is set to true, then handles all the events within this, and 
+     * builds the object structure appropriately and returns the event.
+     *
+     * @return Returns int.
+     * @throws OMException
+     */
+    public abstract int next() throws OMException;
+
+    /**
+     * @return Returns short.
+     */ 
+    public short getBuilderType() {
+        return OMConstants.PULL_TYPE_BUILDER;
+    }
+
+    /**
+     * Method registerExternalContentHandler.
+     *
+     * @param obj
+     */
+    public void registerExternalContentHandler(Object obj) {
+        throw new UnsupportedOperationException();
+    }
+
+    /**
+     * Method getRegisteredContentHandler.
+     * 
+     * @return Returns Object.
+     */
+    public Object getRegisteredContentHandler() {
+        throw new UnsupportedOperationException();
+    }
+
+    public OMDocument getDocument() {
+        return document;
+    }
+}
diff --git a/src/org/apache/ws/commons/om/impl/llom/builder/StAXOMBuilder.java b/src/org/apache/ws/commons/om/impl/llom/builder/StAXOMBuilder.java
new file mode 100644
index 0000000..75901e9
--- /dev/null
+++ b/src/org/apache/ws/commons/om/impl/llom/builder/StAXOMBuilder.java
@@ -0,0 +1,341 @@
+/*
+ * Copyright 2004,2005 The Apache Software Foundation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      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.
+ */
+
+package org.apache.ws.commons.om.impl.llom.builder;
+
+import org.apache.ws.commons.om.OMAbstractFactory;
+import org.apache.ws.commons.om.OMContainer;
+import org.apache.ws.commons.om.OMElement;
+import org.apache.ws.commons.om.OMException;
+import org.apache.ws.commons.om.OMFactory;
+import org.apache.ws.commons.om.OMNamespace;
+import org.apache.ws.commons.om.OMNode;
+import org.apache.ws.commons.om.OMText;
+import org.apache.ws.commons.om.impl.OMContainerEx;
+import org.apache.ws.commons.om.impl.OMNodeEx;
+
+import javax.xml.stream.XMLInputFactory;
+import javax.xml.stream.XMLStreamConstants;
+import javax.xml.stream.XMLStreamException;
+import javax.xml.stream.XMLStreamReader;
+import java.io.FileInputStream;
+import java.io.FileNotFoundException;
+import java.io.InputStream;
+
+
+/**
+ * Constructs an OM without using SOAP specific classes like SOAPEnvelope,
+ * SOAPHeader, SOAPHeaderBlock and SOAPBody. This has the document concept also.
+ */
+public class StAXOMBuilder extends StAXBuilder {
+    /**
+     * Field document
+     */
+
+    private boolean doDebug = false;
+    private static int nsCount = 0;
+
+    /**
+     * Constructor StAXOMBuilder.
+     *
+     * @param ombuilderFactory
+     * @param parser
+     */
+    public StAXOMBuilder(OMFactory ombuilderFactory, XMLStreamReader parser) {
+        super(ombuilderFactory, parser);
+        document = ombuilderFactory.createOMDocument(this);
+    }
+
+    /**
+     * @param filePath - Path to the XML file
+     * @throws XMLStreamException
+     * @throws FileNotFoundException
+     */
+    public StAXOMBuilder(String filePath) throws XMLStreamException, FileNotFoundException {
+        this(XMLInputFactory.newInstance().createXMLStreamReader(new FileInputStream(filePath)));
+    }
+
+    /**
+     * @param inStream - instream which contains the XML
+     * @throws XMLStreamException
+     */
+    public StAXOMBuilder(InputStream inStream) throws XMLStreamException {
+        this(XMLInputFactory.newInstance().createXMLStreamReader(inStream));
+    }
+
+    /**
+     * Constructor StAXOMBuilder.
+     *
+     * @param parser
+     */
+    public StAXOMBuilder(XMLStreamReader parser) {
+        super(parser);
+        omfactory = OMAbstractFactory.getOMFactory();
+        document = omfactory.createOMDocument(this);
+    }
+
+    /**
+     * Method createOMElement.
+     *
+     * @return Returns OMNode.
+     * @throws OMException
+     */
+    protected OMNode createOMElement() throws OMException {
+        OMElement node;
+        String elementName = parser.getLocalName();
+        if (lastNode == null) {
+            node = omfactory.createOMElement(elementName, null, document, this);
+        } else if (lastNode.isComplete()) {
+            node = omfactory.createOMElement(elementName, null,
+                    lastNode.getParent(), this);
+            ((OMNodeEx) lastNode).setNextOMSibling(node);
+            ((OMNodeEx) node).setPreviousOMSibling(lastNode);
+        } else {
+            OMElement e = (OMElement) lastNode;
+            node = omfactory.createOMElement(elementName, null,
+                    (OMElement) lastNode, this);
+            e.setFirstChild(node);
+        }
+        // create the namespaces
+        processNamespaceData(node, false);
+        // fill in the attributes
+        processAttributes(node);
+        node.setLineNumber(parser.getLocation().getLineNumber());
+        return node;
+    }
+
+    /**
+     * Method createOMText.
+     *
+     * @return Returns OMNode.
+     * @throws OMException
+     */
+    protected OMNode createComment() throws OMException {
+        OMNode node;
+        if (lastNode == null) {
+            node = omfactory.createOMComment(document, parser.getText());
+        } else if (lastNode.isComplete()) {
+            node = omfactory.createOMComment(lastNode.getParent(), parser.getText());
+        } else {
+            node = omfactory.createOMComment((OMElement) lastNode, parser.getText());
+        }
+        return node;
+    }
+
+    /**
+     * Method createDTD.
+     *
+     * @return Returns OMNode.
+     * @throws OMException
+     */
+    protected OMNode createDTD() throws OMException {
+        if (!parser.hasText())
+            return null;
+        return omfactory.createOMDocType(document, parser.getText());
+    }
+
+    /**
+     * Method createPI.
+     *
+     * @return Returns OMNode.
+     * @throws OMException
+     */
+    protected OMNode createPI() throws OMException {
+        OMNode node;
+        String target = parser.getPITarget();
+        String data = parser.getPIData();
+        if (lastNode == null) {
+            node = omfactory.createOMProcessingInstruction(document, target, data);
+        } else if (lastNode.isComplete()) {
+            node = omfactory.createOMProcessingInstruction(lastNode.getParent(), target, data);
+        } else if (lastNode instanceof OMText) {
+            node = omfactory.createOMProcessingInstruction(lastNode.getParent(), target, data);
+        } else {
+            node = omfactory.createOMProcessingInstruction((OMContainer) lastNode, target, data);
+        }
+        return node;
+    }
+
+    protected void endElement() {
+        if (lastNode.isComplete()) {
+            OMElement parent = (OMElement) lastNode.getParent();
+            ((OMNodeEx) parent).setComplete(true);
+            lastNode = parent;
+        } else {
+            OMElement e = (OMElement) lastNode;
+            ((OMNodeEx) e).setComplete(true);
+        }
+
+        //return lastNode;
+    }
+
+    /**
+     * Method next.
+     *
+     * @return Returns int.
+     * @throws OMException
+     */
+    public int next() throws OMException {
+        try {
+            if (done) {
+                throw new OMException();
+            }
+            int token = parser.next();
+            if (!cache) {
+                return token;
+            }
+            switch (token) {
+                case XMLStreamConstants.START_ELEMENT:
+                    if (doDebug) {
+                        System.out.println("START_ELEMENT: " + parser.getName() + ":" + parser.getLocalName());
+                    }
+                    lastNode = createOMElement();
+                    break;
+                case XMLStreamConstants.START_DOCUMENT:
+                    // Document has already being created.
+
+                    document.setXMLVersion(parser.getVersion());
+                    document.setCharsetEncoding(parser.getEncoding());
+                    document.setStandalone(parser.isStandalone() ? "yes" : "no");
+                    if (doDebug) {
+                        System.out.println("START_DOCUMENT: ");
+                    }
+                    break;
+                case XMLStreamConstants.CHARACTERS:
+                    if (doDebug) {
+                        System.out.println("CHARACTERS: [" + parser.getText() + "]");
+                    }
+                    lastNode = createOMText(XMLStreamConstants.CHARACTERS);
+                    break;
+                case XMLStreamConstants.CDATA:
+                    if (doDebug) {
+                        System.out.println("CDATA: [" + parser.getText() + "]");
+                    }
+                    lastNode = createOMText(XMLStreamConstants.CDATA);
+                    break;
+                case XMLStreamConstants.END_ELEMENT:
+                    if (doDebug) {
+                        System.out.println("END_ELEMENT: " + parser.getName() + ":" + parser.getLocalName());
+                    }
+                    endElement();
+                    break;
+                case XMLStreamConstants.END_DOCUMENT:
+                    if (doDebug) {
+                        System.out.println("END_DOCUMENT: ");
+                    }
+                    done = true;
+                    ((OMContainerEx) this.document).setComplete(true);
+                    break;
+                case XMLStreamConstants.SPACE:
+                    if (doDebug) {
+                        System.out.println("SPACE: [" + parser.getText() + "]");
+                    }
+                    lastNode = createOMText(XMLStreamConstants.SPACE);
+                    break;
+                case XMLStreamConstants.COMMENT:
+                    if (doDebug) {
+                        System.out.println("COMMENT: [" + parser.getText() + "]");
+                    }
+                    createComment();
+                    break;
+                case XMLStreamConstants.DTD:
+                    if (doDebug) {
+                        System.out.println("DTD: [" + parser.getText() + "]");
+                    }
+                    createDTD();
+                    break;
+                case XMLStreamConstants.PROCESSING_INSTRUCTION:
+                    if (doDebug) {
+                        System.out.println("PROCESSING_INSTRUCTION: [" + parser.getPITarget() + "][" + parser.getPIData() + "]");
+                    }
+                    createPI();
+                    break;
+                case XMLStreamConstants.ENTITY_REFERENCE:
+                    if (doDebug) {
+                        System.out.println("ENTITY_REFERENCE: " + parser.getLocalName() + "[" + parser.getText() + "]");
+                    }
+                    lastNode = createOMText(XMLStreamConstants.ENTITY_REFERENCE);
+                    break;
+                default :
+                    throw new OMException();
+            }
+            return token;
+        } catch (OMException e) {
+            throw e;
+        } catch (Exception e) {
+            throw new OMException(e);
+        }
+    }
+
+    /**
+     * Method getDocumentElement.
+     *
+     * @return Returns root element.
+     */
+    public OMElement getDocumentElement() {
+        return document.getOMDocumentElement();
+    }
+
+    /**
+     * Method processNamespaceData.
+     *
+     * @param node
+     * @param isSOAPElement
+     */
+    protected void processNamespaceData(OMElement node, boolean isSOAPElement) {
+        // set the own namespace
+        String namespaceURI = parser.getNamespaceURI();
+        String prefix = parser.getPrefix();
+
+        OMNamespace namespace = null;
+        if (namespaceURI != null && namespaceURI.length() > 0) {
+
+            // prefix being null means this elements has a default namespace or it has inherited
+            // a default namespace from its parent
+            prefix = prefix == null ? "" : prefix;
+            namespace = node.findNamespace(namespaceURI, prefix);
+
+            if (namespace == null) {
+                namespace = node.declareNamespace(namespaceURI, prefix);
+            }
+            node.setNamespace(namespace);
+        }
+
+
+        int namespaceCount = parser.getNamespaceCount();
+        for (int i = 0; i < namespaceCount; i++) {
+            String nsprefix = parser.getNamespacePrefix(i);
+            nsprefix = (nsprefix == null ? "" : nsprefix);
+
+            //if the namespace is not defined already when we write the start tag declare it
+
+            if (!nsprefix.equals(prefix)) {
+                node.declareNamespace(parser.getNamespaceURI(i),
+                        parser.getNamespacePrefix(i));
+            }
+        }
+    }
+
+
+    public void setDoDebug(boolean doDebug) {
+        this.doDebug = doDebug;
+    }
+
+    protected String createPrefix() {
+        return "ns" + nsCount++;
+    }
+
+}
diff --git a/src/org/apache/ws/commons/om/impl/llom/exception/OMBuilderException.java b/src/org/apache/ws/commons/om/impl/llom/exception/OMBuilderException.java
new file mode 100644
index 0000000..30e3e52
--- /dev/null
+++ b/src/org/apache/ws/commons/om/impl/llom/exception/OMBuilderException.java
@@ -0,0 +1,40 @@
+/*
+ * Copyright 2004,2005 The Apache Software Foundation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      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.
+ */
+
+package org.apache.ws.commons.om.impl.llom.exception;
+
+import org.apache.ws.commons.om.OMException;
+
+/**
+ * Class OMBuilderException
+ */
+public class OMBuilderException extends OMException {
+	
+    private static final long serialVersionUID = -7447667411291193889L;
+
+	/**
+     * Constructor OMBuilderException
+     *
+     * @param s
+     */
+    public OMBuilderException(String s) {
+        super(s);
+    }
+
+    public OMBuilderException(Throwable cause) {
+        super(cause);
+    }
+}
diff --git a/src/org/apache/ws/commons/om/impl/llom/exception/OMStreamingException.java b/src/org/apache/ws/commons/om/impl/llom/exception/OMStreamingException.java
new file mode 100644
index 0000000..d668817
--- /dev/null
+++ b/src/org/apache/ws/commons/om/impl/llom/exception/OMStreamingException.java
@@ -0,0 +1,61 @@
+/*
+ * Copyright 2004,2005 The Apache Software Foundation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      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.
+ */
+
+package org.apache.ws.commons.om.impl.llom.exception;
+
+import org.apache.ws.commons.om.OMException;
+
+/**
+ * Class OMStreamingException
+ */
+public class OMStreamingException extends OMException {
+	
+    private static final long serialVersionUID = 8108888406034145092L;
+
+	/**
+     * Constructor OMStreamingException
+     */
+    public OMStreamingException() {
+    }
+
+    /**
+     * Constructor OMStreamingException
+     *
+     * @param message
+     */
+    public OMStreamingException(String message) {
+        super(message);
+    }
+
+    /**
+     * Constructor OMStreamingException
+     *
+     * @param message
+     * @param cause
+     */
+    public OMStreamingException(String message, Throwable cause) {
+        super(message, cause);
+    }
+
+    /**
+     * Constructor OMStreamingException
+     *
+     * @param cause
+     */
+    public OMStreamingException(Throwable cause) {
+        super(cause);
+    }
+}
diff --git a/src/org/apache/ws/commons/om/impl/llom/exception/XMLComparisonException.java b/src/org/apache/ws/commons/om/impl/llom/exception/XMLComparisonException.java
new file mode 100644
index 0000000..b3e1117
--- /dev/null
+++ b/src/org/apache/ws/commons/om/impl/llom/exception/XMLComparisonException.java
@@ -0,0 +1,37 @@
+/*
+ * Copyright 2004,2005 The Apache Software Foundation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      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.
+ */
+
+package org.apache.ws.commons.om.impl.llom.exception;
+
+public class XMLComparisonException extends Exception {
+	/**
+     * Eran Chinthaka (chinthaka@apache.org)
+     */
+	
+    private static final long serialVersionUID = -7918497983548520994L;
+
+    public XMLComparisonException(String message) {
+        super(message);
+    }
+
+    public XMLComparisonException(Throwable cause) {
+        super(cause);
+    }
+
+    public XMLComparisonException(String message, Throwable cause) {
+        super(message, cause);
+    }
+}
diff --git a/src/org/apache/ws/commons/om/impl/llom/factory/OMLinkedListImplFactory.java b/src/org/apache/ws/commons/om/impl/llom/factory/OMLinkedListImplFactory.java
new file mode 100644
index 0000000..055cc14
--- /dev/null
+++ b/src/org/apache/ws/commons/om/impl/llom/factory/OMLinkedListImplFactory.java
@@ -0,0 +1,266 @@
+/*
+ * Copyright 2004,2005 The Apache Software Foundation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      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.
+ */
+
+package org.apache.ws.commons.om.impl.llom.factory;
+
+import org.apache.ws.commons.om.OMAttribute;
+import org.apache.ws.commons.om.OMComment;
+import org.apache.ws.commons.om.OMContainer;
+import org.apache.ws.commons.om.OMDocType;
+import org.apache.ws.commons.om.OMDocument;
+import org.apache.ws.commons.om.OMElement;
+import org.apache.ws.commons.om.OMException;
+import org.apache.ws.commons.om.OMFactory;
+import org.apache.ws.commons.om.OMNamespace;
+import org.apache.ws.commons.om.OMProcessingInstruction;
+import org.apache.ws.commons.om.OMText;
+import org.apache.ws.commons.om.OMXMLParserWrapper;
+import org.apache.ws.commons.om.impl.llom.OMAttributeImpl;
+import org.apache.ws.commons.om.impl.llom.OMCommentImpl;
+import org.apache.ws.commons.om.impl.llom.OMDocTypeImpl;
+import org.apache.ws.commons.om.impl.llom.OMDocumentImpl;
+import org.apache.ws.commons.om.impl.llom.OMElementImpl;
+import org.apache.ws.commons.om.impl.llom.OMNamespaceImpl;
+import org.apache.ws.commons.om.impl.llom.OMProcessingInstructionImpl;
+import org.apache.ws.commons.om.impl.llom.OMTextImpl;
+
+import javax.xml.namespace.QName;
+import java.util.HashMap;
+import java.util.Map;
+
+/**
+ * Class OMLinkedListImplFactory
+ */
+public class OMLinkedListImplFactory implements OMFactory {
+
+    private static final String uriAndPrefixSeparator = ";";
+    /**
+     * This is a map of namespaces with the namespace URI as the key and
+     * Namespace object itself as the value.
+     */
+    protected Map namespaceTable = new HashMap(5);
+
+    /**
+     * Method createOMElement.
+     *
+     * @param localName
+     * @param ns
+     * @return Returns OMElement.
+     */
+    public OMElement createOMElement(String localName, OMNamespace ns) {
+        return new OMElementImpl(localName, ns);
+    }
+
+    public OMElement createOMElement(String localName, OMNamespace ns, OMContainer parent) {
+        return new OMElementImpl(localName, ns, parent);
+    }
+
+    /**
+     * Method createOMElement.
+     *
+     * @param localName
+     * @param ns
+     * @param parent
+     * @param builder
+     * @return Returns OMElement.
+     */
+    public OMElement createOMElement(String localName, OMNamespace ns,
+                                     OMContainer parent,
+                                     OMXMLParserWrapper builder) {
+        return new OMElementImpl(localName, ns, parent,
+                builder);
+    }
+
+    /**
+     * Method createOMElement.
+     *
+     * @param localName
+     * @param namespaceURI
+     * @param namespacePrefix
+     * @return Returns OMElement.
+     */
+    public OMElement createOMElement(String localName, String namespaceURI,
+                                     String namespacePrefix) {
+        return this.createOMElement(localName,
+                this.createOMNamespace(namespaceURI,
+                        namespacePrefix));
+    }
+
+    /**
+     * Method createOMElement.
+     *
+     * @param qname
+     * @param parent
+     * @return Returns OMElement.
+     * @throws OMException
+     */
+    public OMElement createOMElement(QName qname, OMContainer parent)
+            throws OMException {
+        return new OMElementImpl(qname, parent);
+    }
+
+    /**
+     * Method createOMNamespace.
+     *
+     * @param uri
+     * @param prefix
+     * @return Returns OMNamespace.
+     */
+    public OMNamespace createOMNamespace(String uri, String prefix) {
+        String key = uri + uriAndPrefixSeparator + prefix;
+        OMNamespace existingNamespaceObject = (OMNamespace) namespaceTable.get(key);
+        if (existingNamespaceObject == null) {
+            existingNamespaceObject = new OMNamespaceImpl(uri, prefix);
+            namespaceTable.put(key, existingNamespaceObject);
+        }
+        return existingNamespaceObject;
+    }
+
+    /**
+     * Method createText.
+     *
+     * @param parent
+     * @param text
+     * @return Returns OMText.
+     */
+    public OMText createText(OMElement parent, String text) {
+        return new OMTextImpl(parent, text);
+    }
+
+    public OMText createText(OMElement parent, String text, int type) {
+        return new OMTextImpl(parent, text, type);
+    }
+
+    /**
+     * Method createText.
+     *
+     * @param s
+     * @return Returns OMText.
+     */
+    public OMText createText(String s) {
+        return new OMTextImpl(s);
+    }
+
+    public OMText createText(String s, int type) {
+        return new OMTextImpl(s, type);
+    }
+
+    /**
+     * Creates text.
+     *
+     * @param s
+     * @param mimeType
+     * @param optimize
+     * @return Returns OMText.
+     */
+    public OMText createText(String s, String mimeType, boolean optimize) {
+        return new OMTextImpl(s, mimeType, optimize);
+    }
+
+    /**
+     * Creates text.
+     *
+     * @param dataHandler
+     * @param optimize
+     * @return Returns OMText.
+     */
+    public OMText createText(Object dataHandler, boolean optimize) {
+        return new OMTextImpl(dataHandler, optimize);
+    }
+
+    public OMText createText(String contentID, OMElement parent,
+                             OMXMLParserWrapper builder) {
+        return new OMTextImpl(contentID, parent, builder);
+    }
+
+    /**
+     * Creates text.
+     *
+     * @param parent
+     * @param s
+     * @param mimeType
+     * @param optimize
+     * @return Returns OMText.
+     */
+    public OMText createText(OMElement parent,
+                             String s,
+                             String mimeType,
+                             boolean optimize) {
+        return new OMTextImpl(parent, s, mimeType, optimize);
+    }
+
+    /**
+     * Creates attribute.
+     *
+     * @param localName
+     * @param ns
+     * @param value
+     * @return Returns OMAttribute.
+     */
+    public OMAttribute createOMAttribute(String localName,
+                                         OMNamespace ns,
+                                         String value) {
+        return new OMAttributeImpl(localName, ns, value);
+    }
+
+    /**
+     * Creates DocType/DTD.
+     *
+     * @param parent
+     * @param content
+     * @return Returns doctype.
+     */
+    public OMDocType createOMDocType(OMContainer parent, String content) {
+        return new OMDocTypeImpl(parent, content);
+    }
+
+    /**
+     * Creates a PI.
+     *
+     * @param parent
+     * @param piTarget
+     * @param piData
+     * @return Returns OMProcessingInstruction.
+     */
+    public OMProcessingInstruction createOMProcessingInstruction(OMContainer parent, String piTarget, String piData) {
+        return new OMProcessingInstructionImpl(parent, piTarget, piData);
+    }
+
+    /**
+     * Creates a comment.
+     *
+     * @param parent
+     * @param content
+     * @return Returns OMComment.
+     */
+    public OMComment createOMComment(OMContainer parent, String content) {
+        return new OMCommentImpl(parent, content);
+    }
+
+    /* (non-Javadoc)
+    * @see org.apache.ws.commons.om.OMFactory#createOMDocument()
+    */
+    public OMDocument createOMDocument() {
+        return new OMDocumentImpl();
+    }
+
+    /* (non-Javadoc)
+      * @see org.apache.ws.commons.om.OMFactory#createOMDocument(org.apache.ws.commons.om.OMXMLParserWrapper)
+      */
+    public OMDocument createOMDocument(OMXMLParserWrapper builder) {
+        return new OMDocumentImpl(builder);
+    }
+}
diff --git a/src/org/apache/ws/commons/om/impl/llom/factory/OMXMLBuilderFactory.java b/src/org/apache/ws/commons/om/impl/llom/factory/OMXMLBuilderFactory.java
new file mode 100644
index 0000000..c705cc5
--- /dev/null
+++ b/src/org/apache/ws/commons/om/impl/llom/factory/OMXMLBuilderFactory.java
@@ -0,0 +1,73 @@
+/*
+ * Copyright 2004,2005 The Apache Software Foundation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      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.
+ */
+
+package org.apache.ws.commons.om.impl.llom.factory;
+
+import org.apache.ws.commons.om.OMFactory;
+import org.apache.ws.commons.om.impl.llom.builder.StAXOMBuilder;
+import org.apache.ws.commons.soap.SOAPFactory;
+import org.apache.ws.commons.soap.impl.llom.builder.StAXSOAPModelBuilder;
+
+import javax.xml.stream.XMLStreamReader;
+
+/**
+ * Class OMXMLBuilderFactory
+ */
+public class OMXMLBuilderFactory {
+    /**
+     * Field PARSER_XPP
+     */
+    public static final String PARSER_XPP = "XPP";
+
+    /**
+     * Field PARSER_STAX
+     */
+    public static final String PARSER_STAX = "StAX";
+
+    /**
+     * Field MODEL_SOAP_SPECIFIC
+     */
+    public static final String MODEL_SOAP_SPECIFIC = "SOAP_SPECIFIC";
+
+    /**
+     * Field MODEL_OM
+     */
+    public static final String MODEL_OM = "OM_ONLY";
+
+    /**
+     * Method createStAXSOAPModelBuilder.
+     *
+     * @param soapFactory
+     * @param parser
+     * @return Returns StAXSOAPModelBuilder.
+     */
+    public static StAXSOAPModelBuilder createStAXSOAPModelBuilder(
+            SOAPFactory soapFactory, XMLStreamReader parser) {
+        return new StAXSOAPModelBuilder(parser, soapFactory, null);
+    }
+
+    /**
+     * Method createStAXOMBuilder.
+     *
+     * @param ombuilderFactory
+     * @param parser
+     * @return Returns StAXOMBuilder.
+     */
+    public static StAXOMBuilder createStAXOMBuilder(OMFactory ombuilderFactory,
+                                                    XMLStreamReader parser) {
+        return new StAXOMBuilder(ombuilderFactory, parser);
+    }
+}
diff --git a/src/org/apache/ws/commons/om/impl/llom/mtom/MTOMStAXSOAPModelBuilder.java b/src/org/apache/ws/commons/om/impl/llom/mtom/MTOMStAXSOAPModelBuilder.java
new file mode 100644
index 0000000..d6f4bd0
--- /dev/null
+++ b/src/org/apache/ws/commons/om/impl/llom/mtom/MTOMStAXSOAPModelBuilder.java
@@ -0,0 +1,153 @@
+/*
+ * Copyright 2004,2005 The Apache Software Foundation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      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.
+ */
+
+package org.apache.ws.commons.om.impl.llom.mtom;
+
+import org.apache.ws.commons.attachments.MIMEHelper;
+import org.apache.ws.commons.om.OMElement;
+import org.apache.ws.commons.om.OMException;
+import org.apache.ws.commons.om.OMNode;
+import org.apache.ws.commons.om.OMText;
+import org.apache.ws.commons.om.impl.MTOMConstants;
+import org.apache.ws.commons.om.impl.OMNodeEx;
+import org.apache.ws.commons.soap.SOAPFactory;
+import org.apache.ws.commons.soap.impl.llom.builder.StAXSOAPModelBuilder;
+
+import javax.activation.DataHandler;
+import javax.xml.stream.XMLStreamReader;
+import java.io.UnsupportedEncodingException;
+import java.net.URLDecoder;
+
+public class MTOMStAXSOAPModelBuilder extends StAXSOAPModelBuilder implements MTOMConstants {
+	
+    /**
+     * <code>mimeHelper</code> handles deferred parsing of incoming MIME
+     * Messages.
+     */
+    MIMEHelper mimeHelper;
+
+    int partIndex = 0;
+
+    public MTOMStAXSOAPModelBuilder(XMLStreamReader parser,
+                                    SOAPFactory factory,
+                                    MIMEHelper mimeHelper, String soapVersion) {
+        super(parser, factory, soapVersion);
+        this.mimeHelper = mimeHelper;
+    }
+
+    /**
+     * @param reader
+     * @param mimeHelper
+     */
+    public MTOMStAXSOAPModelBuilder(XMLStreamReader reader,
+                                    MIMEHelper mimeHelper, String soapVersion) {
+        super(reader, soapVersion);
+        this.mimeHelper = mimeHelper;
+    }
+
+    protected OMNode createOMElement() throws OMException {
+
+        elementLevel++;
+        String elementName = parser.getLocalName();
+
+        String namespaceURI = parser.getNamespaceURI();
+
+        // create an OMBlob if the element is an <xop:Include>
+
+        if (XOP_INCLUDE.equalsIgnoreCase(elementName)
+                && XOP_NAMESPACE_URI
+                .equalsIgnoreCase(namespaceURI)) {
+            // do we need to check prfix as well. Meaning, should it be "XOP" ?
+
+
+            OMText node;
+            String contentID = null;
+            String contentIDName = null;
+            if (lastNode == null) {
+                // Decide whether to ckeck the level >3 or not
+                throw new OMException(
+                        "XOP:Include element is not supported here");
+            }
+            if (parser.getAttributeCount() > 0) {
+                contentID = parser.getAttributeValue(0);
+                contentID = contentID.trim();
+                contentIDName = parser.getAttributeLocalName(0);
+                if (contentIDName.equalsIgnoreCase("href")
+                        & contentID.substring(0, 3).equalsIgnoreCase("cid")) {
+                    contentID = contentID.substring(4);
+                    String charsetEncoding = getDocument().getCharsetEncoding();
+                    String charEnc = charsetEncoding == null || "".equals(charsetEncoding) ? "UTF-8" : charsetEncoding;
+                    try {
+                        contentID = URLDecoder.decode(contentID, charEnc);
+                    } catch (UnsupportedEncodingException e) {
+                        throw new OMException("Unsupported Character Encoding Found", e);
+                    }
+                } else if (!(contentIDName.equalsIgnoreCase("href")
+                        & (!contentID.equals("")))) {
+                    throw new OMException(
+                            "contentID not Found in XOP:Include element");
+                }
+            } else {
+                throw new OMException(
+                        "Href attribute not found in XOP:Include element");
+            }
+
+            // This cannot happen. XOP:Include is always the only child of an parent element
+            // cause it is same as having some text
+            try {
+                OMElement e = (OMElement) lastNode;
+                //node = new OMTextImpl(contentID, (OMElement) lastNode, this);
+                node = this.omfactory.createText(contentID, (OMElement) lastNode, this);
+                e.setFirstChild(node);
+            } catch (ClassCastException e) {
+                throw new OMException(
+                        "Last Node & Parent of an OMText should be an Element" +
+                                e);
+            }
+
+            return node;
+
+        } else {
+            OMElement node;
+            if (lastNode == null) {
+                node = constructNode(null, elementName, true);
+                setSOAPEnvelope(node);
+            } else if (lastNode.isComplete()) {
+                node =
+                        constructNode((OMElement) lastNode.getParent(),
+                                elementName,
+                                false);
+                ((OMNodeEx)lastNode).setNextOMSibling(node);
+                ((OMNodeEx)node).setPreviousOMSibling(lastNode);
+            } else {
+                OMElement e = (OMElement) lastNode;
+                node = constructNode((OMElement) lastNode, elementName, false);
+                e.setFirstChild(node);
+            }
+
+            // fill in the attributes
+            processAttributes(node);
+            //TODO Exception when trying to log . check this
+            //			log.info("Build the OMElelment {" + node.getLocalName() + '}'
+            //					+ node.getLocalName() + "By the StaxSOAPModelBuilder");
+            return node;
+        }
+    }
+
+    public DataHandler getDataHandler(String blobContentID) throws OMException {
+        return mimeHelper.getDataHandler(blobContentID);
+    }
+}
diff --git a/src/org/apache/ws/commons/om/impl/llom/serialize/StreamWriterToContentHandlerConverter.java b/src/org/apache/ws/commons/om/impl/llom/serialize/StreamWriterToContentHandlerConverter.java
new file mode 100644
index 0000000..5c00843
--- /dev/null
+++ b/src/org/apache/ws/commons/om/impl/llom/serialize/StreamWriterToContentHandlerConverter.java
@@ -0,0 +1,234 @@
+/*
+ * Copyright 2004,2005 The Apache Software Foundation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      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.
+ */
+
+package org.apache.ws.commons.om.impl.llom.serialize;
+
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.xml.sax.Attributes;
+import org.xml.sax.ContentHandler;
+import org.xml.sax.Locator;
+import org.xml.sax.SAXException;
+
+import javax.xml.stream.XMLStreamException;
+import javax.xml.stream.XMLStreamWriter;
+
+/**
+ * Class StreamWriterToContentHandlerConverter
+ */
+public class StreamWriterToContentHandlerConverter implements ContentHandler {
+    /**
+     * Field log
+     */
+    private Log log = LogFactory.getLog(getClass());
+
+    /**
+     * Field writer
+     */
+    private XMLStreamWriter writer;
+
+    /**
+     * Constructor StreamWriterToContentHandlerConverter.
+     *
+     * @param omOutput
+     */
+    public StreamWriterToContentHandlerConverter(org.apache.ws.commons.om.impl.OMOutputImpl omOutput) {
+        this.writer = omOutput.getXmlStreamWriter();
+    }
+
+    /**
+     * Method endDocument.
+     *
+     * @throws SAXException
+     */
+    public void endDocument() throws SAXException {
+
+        // do nothing
+    }
+
+    /**
+     * Method startDocument.
+     *
+     * @throws SAXException
+     */
+    public void startDocument() throws SAXException {
+
+        // 
+    }
+
+    /**
+     * Method characters.
+     *
+     * @param ch
+     * @param start
+     * @param length
+     * @throws SAXException
+     */
+    public void characters(char ch[], int start, int length)
+            throws SAXException {
+        try {
+            writer.writeCharacters(ch, start, length);
+        } catch (XMLStreamException e) {
+            throw new SAXException(e);
+        }
+    }
+
+    /**
+     * Method ignorableWhitespace.
+     *
+     * @param ch
+     * @param start
+     * @param length
+     * @throws SAXException
+     */
+    public void ignorableWhitespace(char ch[], int start, int length)
+            throws SAXException {
+
+        // throw new UnsupportedOperationException();
+    }
+
+    /**
+     * Method endPrefixMapping.
+     *
+     * @param prefix
+     * @throws SAXException
+     */
+    public void endPrefixMapping(String prefix) throws SAXException {
+
+        // throw new UnsupportedOperationException();
+    }
+
+    /**
+     * Method skippedEntity.
+     *
+     * @param name
+     * @throws SAXException
+     */
+    public void skippedEntity(String name) throws SAXException {
+
+        // throw new UnsupportedOperationException();
+    }
+
+    /**
+     * Method setDocumentLocator.
+     *
+     * @param locator
+     */
+    public void setDocumentLocator(Locator locator) {
+
+        // throw new UnsupportedOperationException();
+    }
+
+    /**
+     * Method processingInstruction.
+     *
+     * @param target
+     * @param data
+     * @throws SAXException
+     */
+    public void processingInstruction(String target, String data)
+            throws SAXException {
+
+        // throw new UnsupportedOperationException();
+    }
+
+    /**
+     * Method startPrefixMapping.
+     *
+     * @param prefix
+     * @param uri
+     * @throws SAXException
+     */
+    public void startPrefixMapping(String prefix, String uri)
+            throws SAXException {
+        try {
+            writer.writeNamespace(prefix, uri);
+            writer.setPrefix(prefix, uri);
+        } catch (XMLStreamException e) {
+            throw new SAXException(e);
+        }
+    }
+
+    /**
+     * Method endElement.
+     *
+     * @param namespaceURI
+     * @param localName
+     * @param qName
+     * @throws SAXException
+     */
+    public void endElement(String namespaceURI,
+                           String localName,
+                           String qName)
+            throws SAXException {
+        try {
+            writer.writeEndElement();
+        } catch (XMLStreamException e) {
+            throw new SAXException(e);
+        }
+    }
+
+    /**
+     * Method getPrefix.
+     *
+     * @param qName
+     * @return Returns String.
+     */
+    private String getPrefix(String qName) {
+        if (qName != null) {
+            return qName.substring(0, qName.indexOf(":"));
+        }
+        return null;
+    }
+
+    /**
+     * Method startElement.
+     *
+     * @param namespaceURI
+     * @param localName
+     * @param qName
+     * @param atts
+     * @throws SAXException
+     */
+    public void startElement(String namespaceURI,
+                             String localName,
+                             String qName,
+                             Attributes atts)
+            throws SAXException {
+        try {
+            log.info("writing element {" + namespaceURI + '}' + localName
+                    + " directly to stream ");
+            String prefix = getPrefix(qName);
+
+            // it is only the prefix we want to learn from the QName! so we can get rid of the
+            // spliting QName
+            if (prefix == null) {
+                writer.writeStartElement(namespaceURI, localName);
+            } else {
+                writer.writeStartElement(prefix, localName, namespaceURI);
+            }
+            if (atts != null) {
+                int attCount = atts.getLength();
+                for (int i = 0; i < attCount; i++) {
+                    writer.writeAttribute(atts.getURI(i), localName,
+                            atts.getValue(i));
+                }
+            }
+        } catch (XMLStreamException e) {
+            throw new SAXException(e);
+        }
+    }
+}
diff --git a/src/org/apache/ws/commons/om/impl/llom/serialize/StreamingOMSerializer.java b/src/org/apache/ws/commons/om/impl/llom/serialize/StreamingOMSerializer.java
new file mode 100644
index 0000000..d8948cc
--- /dev/null
+++ b/src/org/apache/ws/commons/om/impl/llom/serialize/StreamingOMSerializer.java
@@ -0,0 +1,248 @@
+/*
+ * Copyright 2004,2005 The Apache Software Foundation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      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.
+ */
+
+package org.apache.ws.commons.om.impl.llom.serialize;
+
+import org.apache.ws.commons.om.OMSerializer;
+import org.apache.ws.commons.om.impl.OMOutputImpl;
+
+import javax.xml.stream.XMLStreamConstants;
+import javax.xml.stream.XMLStreamException;
+import javax.xml.stream.XMLStreamReader;
+import javax.xml.stream.XMLStreamWriter;
+
+/**
+ * Class StreamingOMSerializer
+ */
+public class StreamingOMSerializer implements XMLStreamConstants, OMSerializer {
+
+    /*
+     * The behavior of the serializer is such that it returns when it encounters the
+     * starting element for the second time. The depth variable tracks the depth of the
+     * serilizer and tells it when to return.
+     * Note that it is assumed that this serialization starts on an Element.
+     */
+
+    /**
+     * Field depth
+     */
+    private int depth = 0;
+
+    /**
+     * Method serialize.
+     *
+     * @param node
+     * @param writer
+     * @throws XMLStreamException
+     */
+    public void serialize(XMLStreamReader node, XMLStreamWriter writer)
+            throws XMLStreamException {
+        serializeNode(node, new OMOutputImpl(writer));
+    }
+
+    /**
+     * Method serialize.
+     *
+     * @param obj
+     * @param omOutput
+     * @throws XMLStreamException
+     */
+    public void serialize(XMLStreamReader obj, OMOutputImpl omOutput)
+            throws XMLStreamException {
+        XMLStreamReader node = obj;
+        serializeNode(node, omOutput);
+    }
+
+    /**
+     * Method serializeNode.
+     *
+     * @param reader
+     * @param omOutput
+     * @throws XMLStreamException
+     */
+    protected void serializeNode(XMLStreamReader reader, OMOutputImpl omOutput)
+            throws XMLStreamException {
+        //TODO We get the StAXWriter at this point and uses it hereafter assuming that this is the only entry point to this class.
+        // If there can be other classes calling methodes of this we might need to change methode signatures to OMOutputer
+        XMLStreamWriter writer = omOutput.getXmlStreamWriter();
+        while (reader.hasNext()) {
+            int event = reader.next();
+            if (event == START_ELEMENT) {
+                serializeElement(reader, writer);
+                depth++;
+            } else if (event == ATTRIBUTE) {
+                serializeAttributes(reader, writer);
+            } else if (event == CHARACTERS) {
+                serializeText(reader, writer);
+            } else if (event == COMMENT) {
+                serializeComment(reader, writer);
+            } else if (event == CDATA) {
+                serializeCData(reader, writer);
+            } else if (event == END_ELEMENT) {
+                serializeEndElement(writer);
+                depth--;
+            } else if (event == END_DOCUMENT) {
+                try {
+                    serializeEndElement(writer);
+                } catch (Exception e) {
+                    //TODO: log exceptions
+                }
+            }
+            if (depth == 0) {
+                break;
+            }
+        }
+    }
+
+    /**
+     * @param reader
+     * @param writer
+     * @throws XMLStreamException
+     */
+    protected void serializeElement(XMLStreamReader reader,
+                                    XMLStreamWriter writer)
+            throws XMLStreamException {
+        String prefix = reader.getPrefix();
+        String nameSpaceName = reader.getNamespaceURI();
+        if (nameSpaceName != null) {
+            String writer_prefix = writer.getPrefix(nameSpaceName);
+            if (writer_prefix != null) {
+                writer.writeStartElement(nameSpaceName, reader.getLocalName());
+            } else {
+                if (prefix != null) {
+                    writer.writeStartElement(prefix, reader.getLocalName(),
+                            nameSpaceName);
+                    writer.writeNamespace(prefix, nameSpaceName);
+                    writer.setPrefix(prefix, nameSpaceName);
+                } else {
+                    writer.writeStartElement(nameSpaceName,
+                            reader.getLocalName());
+                    writer.writeDefaultNamespace(nameSpaceName);
+                    writer.setDefaultNamespace(nameSpaceName);
+                }
+            }
+        } else {
+            writer.writeStartElement(reader.getLocalName());
+        }
+
+        // add attributes
+        serializeAttributes(reader, writer);
+
+        // add the namespaces
+        int count = reader.getNamespaceCount();
+        String namespacePrefix;
+        for (int i = 0; i < count; i++) {
+            namespacePrefix = reader.getNamespacePrefix(i);
+            if(namespacePrefix != null && namespacePrefix.length()==0)
+                continue;
+            
+            serializeNamespace(namespacePrefix,
+                    reader.getNamespaceURI(i), writer);
+        }
+    }
+
+    /**
+     * Method serializeEndElement.
+     *
+     * @param writer
+     * @throws XMLStreamException
+     */
+    protected void serializeEndElement(XMLStreamWriter writer)
+            throws XMLStreamException {
+        writer.writeEndElement();
+    }
+
+    /**
+     * @param reader
+     * @param writer
+     * @throws XMLStreamException
+     */
+    protected void serializeText(XMLStreamReader reader,
+                                 XMLStreamWriter writer)
+            throws XMLStreamException {
+        writer.writeCharacters(reader.getText());
+    }
+
+    /**
+     * Method serializeCData.
+     *
+     * @param reader
+     * @param writer
+     * @throws XMLStreamException
+     */
+    protected void serializeCData(XMLStreamReader reader,
+                                  XMLStreamWriter writer)
+            throws XMLStreamException {
+        writer.writeCData(reader.getText());
+    }
+
+    /**
+     * Method serializeComment.
+     *
+     * @param reader
+     * @param writer
+     * @throws XMLStreamException
+     */
+    protected void serializeComment(XMLStreamReader reader,
+                                    XMLStreamWriter writer)
+            throws XMLStreamException {
+        writer.writeComment(reader.getText());
+    }
+
+    /**
+     * @param reader
+     * @param writer
+     * @throws XMLStreamException
+     */
+    protected void serializeAttributes(XMLStreamReader reader,
+                                       XMLStreamWriter writer)
+            throws XMLStreamException {
+        int count = reader.getAttributeCount();
+        String prefix = null;
+        String namespaceName = null;
+        for (int i = 0; i < count; i++) {
+            prefix = reader.getAttributePrefix(i);
+            namespaceName = reader.getAttributeNamespace(i);
+            if ((prefix != null) && !namespaceName.equals("")) {
+                writer.writeAttribute(prefix, namespaceName,
+                        reader.getAttributeLocalName(i),
+                        reader.getAttributeValue(i));
+            } else {
+                writer.writeAttribute(reader.getAttributeLocalName(i),
+                        reader.getAttributeValue(i));
+            }
+        }
+    }
+
+    /**
+     * Method serializeNamespace.
+     *
+     * @param prefix
+     * @param URI
+     * @param writer
+     * @throws XMLStreamException
+     */
+    private void serializeNamespace(String prefix,
+                                    String URI,
+                                    XMLStreamWriter writer)
+            throws XMLStreamException {
+        String prefix1 = writer.getPrefix(URI);
+        if (prefix1 == null) {
+            writer.writeNamespace(prefix, URI);
+            writer.setPrefix(prefix, URI);
+        }
+    }
+}
diff --git a/src/org/apache/ws/commons/om/impl/llom/traverse/OMChildElementIterator.java b/src/org/apache/ws/commons/om/impl/llom/traverse/OMChildElementIterator.java
new file mode 100644
index 0000000..e89379c
--- /dev/null
+++ b/src/org/apache/ws/commons/om/impl/llom/traverse/OMChildElementIterator.java
@@ -0,0 +1,120 @@
+/*
+ * Copyright 2004,2005 The Apache Software Foundation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      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.
+ */
+
+package org.apache.ws.commons.om.impl.llom.traverse;
+
+import org.apache.ws.commons.om.OMElement;
+import org.apache.ws.commons.om.OMException;
+import org.apache.ws.commons.om.OMNode;
+
+import java.util.Iterator;
+
+public class OMChildElementIterator implements Iterator {
+
+    /**
+     * Field currentChild
+     */
+    protected OMNode currentChild;
+
+    /**
+     * Field lastChild
+     */
+    protected OMNode lastChild;
+
+    /**
+     * Field nextCalled
+     */
+    protected boolean nextCalled = false;
+
+    /**
+     * Field removeCalled
+     */
+    protected boolean removeCalled = false;
+
+    /**
+     * Constructor OMChildrenIterator.
+     *
+     * @param currentChild
+     */
+    public OMChildElementIterator(OMElement currentChild) {
+        this.currentChild = currentChild;
+    }
+
+    /**
+     * Removes the last element returned by the iterator (optional operation) 
+     * from the underlying collection. This method can be called only once per
+     * call to <tt>next</tt>.  The behavior of an iterator is unspecified if
+     * the underlying collection is modified while the iteration is in
+     * progress in any way other than by calling this method.
+     *
+     * @throws UnsupportedOperationException if the <tt>remove</tt>
+     *                                       operation is not supported by this Iterator.
+     * @throws IllegalStateException         if the <tt>next</tt> method has not
+     *                                       yet been called, or the <tt>remove</tt> method has already
+     *                                       been called after the last call to the <tt>next</tt>
+     *                                       method.
+     */
+    public void remove() {
+        if (!nextCalled) {
+            throw new IllegalStateException(
+                    "next method has not yet being called");
+        }
+        if (removeCalled) {
+            throw new IllegalStateException("remove has already being called");
+        }
+        removeCalled = true;
+
+        // since this acts on the last child there is no need to mess with the current child
+        if (lastChild == null) {
+            throw new OMException("cannot remove a child at this stage!");
+        }
+        lastChild.detach();
+    }
+
+    /**
+     * Returns <tt>true</tt> if the iteration has more elements. (In other
+     * words, returns <tt>true</tt> if <tt>next</tt> would return an element
+     * rather than throwing an exception.)
+     *
+     * @return Returns <tt>true</tt> if the iterator has more elements.
+     */
+    public boolean hasNext() {
+        return (currentChild != null);
+    }
+
+    /**
+     * Returns the next element in the iteration.
+     *
+     * @return Returns the next element in the iteration.
+     * @throws java.util.NoSuchElementException
+     *          iteration has no more elements.
+     */
+    public Object next() {
+        nextCalled = true;
+        removeCalled = false;
+
+        if (hasNext()) {
+            lastChild = currentChild;
+            do{
+                currentChild = currentChild.getNextOMSibling();
+            }while(currentChild!=null && currentChild.getType()!=OMNode.ELEMENT_NODE);
+
+
+            return lastChild;
+        }
+        return null;
+    }
+}
diff --git a/src/org/apache/ws/commons/om/impl/llom/traverse/OMChildrenIterator.java b/src/org/apache/ws/commons/om/impl/llom/traverse/OMChildrenIterator.java
new file mode 100644
index 0000000..b528b8c
--- /dev/null
+++ b/src/org/apache/ws/commons/om/impl/llom/traverse/OMChildrenIterator.java
@@ -0,0 +1,116 @@
+/*
+ * Copyright 2004,2005 The Apache Software Foundation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      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.
+ */
+
+package org.apache.ws.commons.om.impl.llom.traverse;
+
+import org.apache.ws.commons.om.OMException;
+import org.apache.ws.commons.om.OMNode;
+
+import java.util.Iterator;
+
+/**
+ * Class OMChildrenIterator
+ */
+public class OMChildrenIterator implements Iterator {
+    /**
+     * Field currentChild
+     */
+    protected OMNode currentChild;
+
+    /**
+     * Field lastChild
+     */
+    protected OMNode lastChild;
+
+    /**
+     * Field nextCalled
+     */
+    protected boolean nextCalled = false;
+
+    /**
+     * Field removeCalled
+     */
+    protected boolean removeCalled = false;
+
+    /**
+     * Constructor OMChildrenIterator.
+     *
+     * @param currentChild
+     */
+    public OMChildrenIterator(OMNode currentChild) {
+        this.currentChild = currentChild;
+    }
+
+    /**
+     * Removes the last element returned by the iterator (optional operation) 
+     * from the underlying collection.   This method must be called only once per
+     * call to <tt>next</tt>.  The behavior of an iterator is unspecified if
+     * the underlying collection is modified while the iteration is in
+     * progress in any way other than by calling this method.
+     *
+     * @throws UnsupportedOperationException if the <tt>remove</tt>
+     *                                       operation is not supported by this Iterator.
+     * @throws IllegalStateException         if the <tt>next</tt> method has not
+     *                                       yet been called, or the <tt>remove</tt> method has already
+     *                                       been called after the last call to the <tt>next</tt>
+     *                                       method.
+     */
+    public void remove() {
+        if (!nextCalled) {
+            throw new IllegalStateException(
+                    "next method has not yet being called");
+        }
+        if (removeCalled) {
+            throw new IllegalStateException("remove has already being called");
+        }
+        removeCalled = true;
+
+        // since this acts on the last child there is no need to mess with the current child
+        if (lastChild == null) {
+            throw new OMException("cannot remove a child at this stage!");
+        }
+        lastChild.detach();
+    }
+
+    /**
+     * Returns <tt>true</tt> if the iteration has more elements. (In other
+     * words, returns <tt>true</tt> if <tt>next</tt> would return an element
+     * rather than throwing an exception.)
+     *
+     * @return Returns <tt>true</tt> if the iterator has more elements.
+     */
+    public boolean hasNext() {
+        return (currentChild != null);
+    }
+
+    /**
+     * Returns the next element in the iteration.
+     *
+     * @return Returns the next element in the iteration.
+     * @throws java.util.NoSuchElementException
+     *          iteration has no more elements.
+     */
+    public Object next() {
+        nextCalled = true;
+        removeCalled = false;
+        if (hasNext()) {
+            lastChild = currentChild;
+            currentChild = currentChild.getNextOMSibling();
+            return lastChild;
+        }
+        return null;
+    }
+}
diff --git a/src/org/apache/ws/commons/om/impl/llom/traverse/OMChildrenQNameIterator.java b/src/org/apache/ws/commons/om/impl/llom/traverse/OMChildrenQNameIterator.java
new file mode 100644
index 0000000..ddc8d93
--- /dev/null
+++ b/src/org/apache/ws/commons/om/impl/llom/traverse/OMChildrenQNameIterator.java
@@ -0,0 +1,141 @@
+/*
+ * Copyright 2004,2005 The Apache Software Foundation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      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.
+ */
+
+package org.apache.ws.commons.om.impl.llom.traverse;
+
+import org.apache.ws.commons.om.OMElement;
+import org.apache.ws.commons.om.OMNode;
+
+import javax.xml.namespace.QName;
+
+/**
+ * Class OMChildrenQNameIterator
+ */
+public class OMChildrenQNameIterator extends OMChildrenIterator {
+    /**
+     * Field givenQName
+     */
+    private QName givenQName;
+
+    /**
+     * Field needToMoveForward
+     */
+    private boolean needToMoveForward = true;
+
+    /**
+     * Field isMatchingNodeFound
+     */
+    private boolean isMatchingNodeFound = false;
+
+    /**
+     * Constructor OMChildrenQNameIterator.
+     *
+     * @param currentChild
+     * @param givenQName
+     */
+    public OMChildrenQNameIterator(OMNode currentChild, QName givenQName) {
+        super(currentChild);
+        this.givenQName = givenQName;
+    }
+
+    /**
+     * Returns <tt>true</tt> if the iteration has more elements. (In other
+     * words, returns <tt>true</tt> if <tt>next</tt> would return an element
+     * rather than throwing an exception.)
+     *
+     * @return Returns <tt>true</tt> if the iterator has more elements.
+     */
+    public boolean hasNext() {
+        while (needToMoveForward) {
+            if (currentChild != null) {
+
+                // check the current node for the criteria
+                if ((currentChild instanceof OMElement)
+                        && (isQNamesMatch(
+                                ((OMElement) currentChild).getQName(),
+                                this.givenQName))) {
+                    isMatchingNodeFound = true;
+                    needToMoveForward = false;
+                } else {
+
+                    // get the next named node
+                    currentChild = currentChild.getNextOMSibling();
+                    isMatchingNodeFound = needToMoveForward = !(currentChild
+                            == null);
+                }
+            } else {
+                needToMoveForward = false;
+            }
+        }
+        return isMatchingNodeFound;
+    }
+
+    /**
+     * Returns the next element in the iteration.
+     *
+     * @return Returns the next element in the iteration.
+     * @throws java.util.NoSuchElementException
+     *          iteration has no more elements.
+     */
+    public Object next() {
+
+        // reset the flags
+        needToMoveForward = true;
+        isMatchingNodeFound = false;
+        nextCalled = true;
+        removeCalled = false;
+        lastChild = currentChild;
+        currentChild = currentChild.getNextOMSibling();
+        return lastChild;
+    }
+
+    /**
+     * Cannot use the overridden equals method of QName, as one might want to get
+     * some element just by giving the localname, even though a matching element 
+     * has a namespace uri as well.
+     * This is not supported in the equals method of the QName.
+     *
+     * @param elementQName
+     * @param qNameToBeMatched
+     * @return Returns boolean.
+     */
+    private boolean isQNamesMatch(QName elementQName, QName qNameToBeMatched) {
+
+        // if no QName was given, that means user is asking for all
+        if (qNameToBeMatched == null) {
+            return true;
+        }
+
+        // if the given localname is null, whatever value this.qname has, its a match. But can one give a QName without a localName ??
+        boolean localNameMatch =
+                (qNameToBeMatched.getLocalPart() == null)
+                || (qNameToBeMatched.getLocalPart() == "")
+                ||
+                ((elementQName != null)
+                &&
+                elementQName.getLocalPart().equalsIgnoreCase(
+                        qNameToBeMatched.getLocalPart()));
+        boolean namespaceURIMatch =
+                (qNameToBeMatched.getNamespaceURI() == null)
+                || (qNameToBeMatched.getNamespaceURI() == "")
+                ||
+                ((elementQName != null)
+                &&
+                elementQName.getNamespaceURI().equalsIgnoreCase(
+                        qNameToBeMatched.getNamespaceURI()));
+        return localNameMatch && namespaceURIMatch;
+    }
+}
diff --git a/src/org/apache/ws/commons/om/impl/llom/traverse/OMChildrenWithSpecificAttributeIterator.java b/src/org/apache/ws/commons/om/impl/llom/traverse/OMChildrenWithSpecificAttributeIterator.java
new file mode 100644
index 0000000..577985e
--- /dev/null
+++ b/src/org/apache/ws/commons/om/impl/llom/traverse/OMChildrenWithSpecificAttributeIterator.java
@@ -0,0 +1,118 @@
+/*
+ * Copyright 2004,2005 The Apache Software Foundation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      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.
+ */
+
+package org.apache.ws.commons.om.impl.llom.traverse;
+
+import org.apache.ws.commons.om.OMAttribute;
+import org.apache.ws.commons.om.OMElement;
+import org.apache.ws.commons.om.OMNode;
+
+import javax.xml.namespace.QName;
+
+/**
+ * Class OMChildrenWithSpecificAttributeIterator
+ */
+public class OMChildrenWithSpecificAttributeIterator
+        extends OMChildrenIterator {
+    /**
+     * Field attributeName
+     */
+    private QName attributeName;
+
+    /**
+     * Field attributeValue
+     */
+    private String attributeValue;
+
+    /**
+     * Field detach
+     */
+    private boolean detach;
+
+    /**
+     * Constructor OMChildrenWithSpecificAttributeIterator.
+     *
+     * @param currentChild
+     * @param attributeName
+     * @param attributeValue
+     * @param detach
+     */
+    public OMChildrenWithSpecificAttributeIterator(OMNode currentChild,
+                                                   QName attributeName,
+                                                   String attributeValue,
+                                                   boolean detach) {
+        super(currentChild);
+        this.attributeName = attributeName;
+        this.attributeValue = attributeValue;
+        this.detach = detach;
+    }
+
+    /**
+     * Method hasNext.
+     *
+     * @return Returns boolean.
+     */
+    public boolean hasNext() {
+
+        // First check whether we have a child, using the super class
+        if (currentChild == null) {
+            return false;
+        }
+        boolean isMatchingNodeFound = false;
+        boolean needToMoveForward = true;
+
+        // now we have a child to check. If its an OMElement and matches the criteria, then we are done
+        while (needToMoveForward) {
+
+            // check the current node for the criteria
+            if (currentChild instanceof OMElement) {
+                OMAttribute attr =
+                        ((OMElement) currentChild).getAttribute(
+                                attributeName);
+                if ((attr != null)
+                        && attr.getAttributeValue().equalsIgnoreCase(attributeValue)) {
+                    isMatchingNodeFound = true;
+                    needToMoveForward = false;
+                } else {
+                    currentChild = currentChild.getNextOMSibling();
+                    needToMoveForward = !(currentChild == null);
+                }
+            } else {
+
+                // get the next named node
+                currentChild = currentChild.getNextOMSibling();
+                needToMoveForward = !(currentChild == null);
+            }
+        }
+        return isMatchingNodeFound;
+    }
+
+    /**
+     * Method next.
+     *
+     * @return Returns Object.
+     */
+    public Object next() {
+        nextCalled = true;
+        removeCalled = false;
+        lastChild = currentChild;
+        currentChild = currentChild.getNextOMSibling();
+        if ((lastChild != null) && detach && lastChild.getParent() != null) {
+            lastChild.detach();
+        }
+        return lastChild;
+    }
+}
diff --git a/src/org/apache/ws/commons/om/impl/llom/util/EmptyIterator.java b/src/org/apache/ws/commons/om/impl/llom/util/EmptyIterator.java
new file mode 100644
index 0000000..7206a8a
--- /dev/null
+++ b/src/org/apache/ws/commons/om/impl/llom/util/EmptyIterator.java
@@ -0,0 +1,35 @@
+/*
+ * Copyright 2004,2005 The Apache Software Foundation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      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.
+ */
+
+package org.apache.ws.commons.om.impl.llom.util;
+
+import java.util.Iterator;
+
+public class EmptyIterator implements Iterator {
+    public void remove() {
+        throw new UnsupportedOperationException();
+
+    }
+
+    public boolean hasNext() {
+        return false;
+    }
+
+    public Object next() {
+        throw new UnsupportedOperationException();
+    }
+}
+
diff --git a/src/org/apache/ws/commons/om/impl/llom/util/XMLComparator.java b/src/org/apache/ws/commons/om/impl/llom/util/XMLComparator.java
new file mode 100644
index 0000000..d697a87
--- /dev/null
+++ b/src/org/apache/ws/commons/om/impl/llom/util/XMLComparator.java
@@ -0,0 +1,222 @@
+/*
+ * Copyright 2004,2005 The Apache Software Foundation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      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.
+ */
+
+package org.apache.ws.commons.om.impl.llom.util;
+
+import org.apache.ws.commons.om.OMAttribute;
+import org.apache.ws.commons.om.OMElement;
+import org.apache.ws.commons.om.OMNamespace;
+import org.apache.ws.commons.om.OMNode;
+import org.apache.ws.commons.om.impl.llom.exception.XMLComparisonException;
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+
+import java.util.Iterator;
+import java.util.Vector;
+
+public class XMLComparator {
+    /**
+     * Eran Chinthaka (chinthaka@apache.org)
+     */
+    private Log log = LogFactory.getLog(getClass());
+
+    private Vector ignorableNamespaceList = new Vector();
+
+    public void addIgnorableNamespace(String nsURI){
+        ignorableNamespaceList.add(nsURI);
+    }
+
+    public void clearIgnorableNamespaces(){
+        ignorableNamespaceList.clear();
+    }
+
+
+    public boolean compare(OMElement elementOne, OMElement elementTwo) throws XMLComparisonException {
+
+        //ignore if the elements belong to any of the ignorable namespaces list
+        if (isIgnorable(elementOne) ||
+                isIgnorable(elementTwo)){
+            return true;
+        }
+
+        if (elementOne == null && elementTwo == null) {
+            log.info("Both Elements are null.");
+            return true;
+        }
+        if (elementOne == null && elementTwo != null) {
+            throw new XMLComparisonException(
+                    "Element One is null and Element Two is not null");
+        }
+        if (elementOne != null && elementTwo == null) {
+            throw new XMLComparisonException(
+                    "Element Two is null and Element One is not null");
+        }
+
+        log.info(
+                "Now Checking " + elementOne.getLocalName() + " and " +
+                elementTwo.getLocalName() +
+                "=============================");
+
+        log.info("Comparing Element Names .......");
+        compare("Elements names are not equal. ",
+                elementOne.getLocalName(),
+                elementTwo.getLocalName());
+
+        log.info("Comparing Namespaces .........");
+        compare("Element namespaces are not equal",
+                elementOne.getNamespace(),
+                elementTwo.getNamespace());
+
+        log.info("Comparing attributes .....");
+        compareAllAttributes(elementOne, elementTwo);
+
+        log.info("Comparing texts .....");
+
+        /*
+        * Trimming the value of the XMLElement is not correct
+        * since this compare method cannot be used to compare
+        * element contents with trailing and leading whitespaces
+        * BUT for the practicalltiy of tests and to get the current
+        * tests working we have to trim() the contents
+        */
+        compare("Elements texts are not equal ",
+                elementOne.getText().trim(),
+                elementTwo.getText().trim());
+
+        log.info("Comparing Children ......");
+        compareAllChildren(elementOne, elementTwo);
+
+
+        return true;
+    }
+
+    private void compareAllAttributes(OMElement elementOne,
+                                      OMElement elementTwo) throws XMLComparisonException {
+        compareAttibutes(elementOne, elementTwo);
+        compareAttibutes(elementTwo, elementOne);
+    }
+
+    private void compareAllChildren(OMElement elementOne,
+                                    OMElement elementTwo) throws XMLComparisonException {
+        compareChildren(elementOne, elementTwo);
+        compareChildren(elementTwo, elementOne);
+    }
+
+
+    private boolean isIgnorable(OMElement elt){
+        if (elt!=null){
+            OMNamespace namespace = elt.getNamespace();
+            if (namespace!=null){
+            return ignorableNamespaceList.contains(namespace.getName());
+            }else{
+                return false; 
+            }
+        }else{
+            return false;
+        }
+    }
+
+
+    private void compareChildren(OMElement elementOne, OMElement elementTwo) throws XMLComparisonException {
+        //ignore if the elements belong to any of the ignorable namespaces list
+        if (isIgnorable(elementOne) ||
+                isIgnorable(elementTwo)){
+            return ;
+        }
+        Iterator elementOneChildren = elementOne.getChildren();
+        while (elementOneChildren.hasNext()) {
+            OMNode omNode = (OMNode) elementOneChildren.next();
+            if (omNode instanceof OMElement) {
+                OMElement elementOneChild = (OMElement) omNode;
+                OMElement elementTwoChild = null;
+                //Do the comparison only if the element is not ignorable
+                if (!isIgnorable(elementOneChild)){
+                    elementTwoChild = elementTwo.getFirstChildWithName(
+                            elementOneChild.getQName());
+                    //Do the comparison only if the element is not ignorable
+                    if (!isIgnorable(elementTwoChild)){
+                        if (elementTwoChild == null) {
+                            throw new XMLComparisonException(
+                                    " There is no " + elementOneChild.getLocalName() +
+                                    " element under " +
+                                    elementTwo.getLocalName());
+                        }
+                    }
+                }
+                compare(elementOneChild, elementTwoChild);
+            }
+        }
+    }
+
+
+    private void compareAttibutes(OMElement elementOne, OMElement elementTwo) throws XMLComparisonException {
+        int elementOneAtribCount = 0;
+        int elementTwoAtribCount = 0;
+        Iterator attributes = elementOne.getAllAttributes();
+        while (attributes.hasNext()) {
+            OMAttribute omAttribute = (OMAttribute) attributes.next();
+            OMAttribute attr = elementTwo.getAttribute(
+                    omAttribute.getQName());
+            if (attr == null) {
+                throw new XMLComparisonException(
+                        "Attributes are not the same in two elements. Attribute " +
+                        omAttribute.getLocalName() +
+                        " != ");
+            }
+            elementOneAtribCount++;
+        }
+
+        Iterator elementTwoIter = elementTwo.getAllAttributes();
+        while (elementTwoIter.hasNext()) {
+            elementTwoIter.next();
+            elementTwoAtribCount++;
+
+        }
+
+        if (elementOneAtribCount != elementTwoAtribCount) {
+            throw new XMLComparisonException(
+                    "Attributes are not the same in two elements.");
+        }
+    }
+
+    private void compare(String failureNotice, String one, String two) throws XMLComparisonException {
+        if (!one.equals(two)) {
+            throw new XMLComparisonException(
+                    failureNotice + one + " != " + two);
+        }
+    }
+
+    private void compare(String failureNotice,
+                         OMNamespace one,
+                         OMNamespace two) throws XMLComparisonException {
+        if (one == null && two == null) {
+            return;
+        } else if (one != null && two == null) {
+            throw new XMLComparisonException(
+                    "First Namespace is NOT null. But the second is null");
+        } else if (one == null && two != null) {
+            throw new XMLComparisonException(
+                    "First Namespace is null. But the second is NOT null");
+        }
+
+        if (!one.getName().equals(two.getName())) {
+            throw new XMLComparisonException(
+                    failureNotice + one + " != " + two);
+        }
+
+        // Do we need to compare prefixes as well
+    }
+}
diff --git a/src/org/apache/ws/commons/om/util/Base64.java b/src/org/apache/ws/commons/om/util/Base64.java
new file mode 100644
index 0000000..d240b83
--- /dev/null
+++ b/src/org/apache/ws/commons/om/util/Base64.java
@@ -0,0 +1,295 @@
+package org.apache.ws.commons.om.util;
+
+import java.io.OutputStream;
+import java.io.IOException;
+import java.io.Writer;
+
+/*
+ * Copyright 2001-2004 The Apache Software Foundation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      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.
+ *
+ */
+
+public class Base64 {
+    private static final char[] S_BASE64CHAR = {'A', 'B', 'C', 'D', 'E', 'F',
+            'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S',
+            'T', 'U', 'V', 'W', 'X', 'Y', 'Z', 'a', 'b', 'c', 'd', 'e', 'f',
+            'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's',
+            't', 'u', 'v', 'w', 'x', 'y', 'z', '0', '1', '2', '3', '4', '5',
+            '6', '7', '8', '9', '+', '/'};
+
+    private static final char S_BASE64PAD = '=';
+
+    private static final byte[] S_DECODETABLE = new byte[128];
+
+    static {
+        for (int i = 0; i < S_DECODETABLE.length; i++)
+            S_DECODETABLE[i] = Byte.MAX_VALUE; // 127
+        for (int i = 0; i < S_BASE64CHAR.length; i++)
+            // 0 to 63
+            S_DECODETABLE[S_BASE64CHAR[i]] = (byte) i;
+    }
+
+    private static int decode0(char[] ibuf, byte[] obuf, int wp) {
+        int outlen = 3;
+        if (ibuf[3] == S_BASE64PAD)
+            outlen = 2;
+        if (ibuf[2] == S_BASE64PAD)
+            outlen = 1;
+        int b0 = S_DECODETABLE[ibuf[0]];
+        int b1 = S_DECODETABLE[ibuf[1]];
+        int b2 = S_DECODETABLE[ibuf[2]];
+        int b3 = S_DECODETABLE[ibuf[3]];
+        switch (outlen) {
+            case 1:
+                obuf[wp] = (byte) (b0 << 2 & 0xfc | b1 >> 4 & 0x3);
+                return 1;
+            case 2:
+                obuf[wp++] = (byte) (b0 << 2 & 0xfc | b1 >> 4 & 0x3);
+                obuf[wp] = (byte) (b1 << 4 & 0xf0 | b2 >> 2 & 0xf);
+                return 2;
+            case 3:
+                obuf[wp++] = (byte) (b0 << 2 & 0xfc | b1 >> 4 & 0x3);
+                obuf[wp++] = (byte) (b1 << 4 & 0xf0 | b2 >> 2 & 0xf);
+                obuf[wp] = (byte) (b2 << 6 & 0xc0 | b3 & 0x3f);
+                return 3;
+            default:
+                throw new RuntimeException("internalError00");
+        }
+    }
+
+    /**
+     *
+     */
+    public static byte[] decode(char[] data, int off, int len) {
+        char[] ibuf = new char[4];
+        int ibufcount = 0;
+        byte[] obuf = new byte[len / 4 * 3 + 3];
+        int obufcount = 0;
+        for (int i = off; i < off + len; i++) {
+            char ch = data[i];
+            if (ch == S_BASE64PAD || ch < S_DECODETABLE.length
+                    && S_DECODETABLE[ch] != Byte.MAX_VALUE) {
+                ibuf[ibufcount++] = ch;
+                if (ibufcount == ibuf.length) {
+                    ibufcount = 0;
+                    obufcount += decode0(ibuf, obuf, obufcount);
+                }
+            }
+        }
+        if (obufcount == obuf.length)
+            return obuf;
+        byte[] ret = new byte[obufcount];
+        System.arraycopy(obuf, 0, ret, 0, obufcount);
+        return ret;
+    }
+
+    /**
+     *
+     */
+    public static byte[] decode(String data) {
+        char[] ibuf = new char[4];
+        int ibufcount = 0;
+        byte[] obuf = new byte[data.length() / 4 * 3 + 3];
+        int obufcount = 0;
+        for (int i = 0; i < data.length(); i++) {
+            char ch = data.charAt(i);
+            if (ch == S_BASE64PAD || ch < S_DECODETABLE.length
+                    && S_DECODETABLE[ch] != Byte.MAX_VALUE) {
+                ibuf[ibufcount++] = ch;
+                if (ibufcount == ibuf.length) {
+                    ibufcount = 0;
+                    obufcount += decode0(ibuf, obuf, obufcount);
+                }
+            }
+        }
+        if (obufcount == obuf.length)
+            return obuf;
+        byte[] ret = new byte[obufcount];
+        System.arraycopy(obuf, 0, ret, 0, obufcount);
+        return ret;
+    }
+
+    /**
+     *
+     */
+    public static void decode(char[] data, int off, int len,
+                              OutputStream ostream) throws IOException {
+        char[] ibuf = new char[4];
+        int ibufcount = 0;
+        byte[] obuf = new byte[3];
+        for (int i = off; i < off + len; i++) {
+            char ch = data[i];
+            if (ch == S_BASE64PAD || ch < S_DECODETABLE.length
+                    && S_DECODETABLE[ch] != Byte.MAX_VALUE) {
+                ibuf[ibufcount++] = ch;
+                if (ibufcount == ibuf.length) {
+                    ibufcount = 0;
+                    int obufcount = decode0(ibuf, obuf, 0);
+                    ostream.write(obuf, 0, obufcount);
+                }
+            }
+        }
+    }
+
+    /**
+     *
+     */
+    public static void decode(String data, OutputStream ostream)
+            throws IOException {
+        char[] ibuf = new char[4];
+        int ibufcount = 0;
+        byte[] obuf = new byte[3];
+        for (int i = 0; i < data.length(); i++) {
+            char ch = data.charAt(i);
+            if (ch == S_BASE64PAD || ch < S_DECODETABLE.length
+                    && S_DECODETABLE[ch] != Byte.MAX_VALUE) {
+                ibuf[ibufcount++] = ch;
+                if (ibufcount == ibuf.length) {
+                    ibufcount = 0;
+                    int obufcount = decode0(ibuf, obuf, 0);
+                    ostream.write(obuf, 0, obufcount);
+                }
+            }
+        }
+    }
+
+    /**
+     * Returns base64 representation of specified byte array.
+     */
+    public static String encode(byte[] data) {
+        return encode(data, 0, data.length);
+    }
+
+    /**
+     * Returns base64 representation of specified byte array.
+     */
+    public static String encode(byte[] data, int off, int len) {
+        if (len <= 0)
+            return "";
+        char[] out = new char[len / 3 * 4 + 4];
+        int rindex = off;
+        int windex = 0;
+        int rest = len - off;
+        while (rest >= 3) {
+            int i = ((data[rindex] & 0xff) << 16)
+                    + ((data[rindex + 1] & 0xff) << 8)
+                    + (data[rindex + 2] & 0xff);
+            out[windex++] = S_BASE64CHAR[i >> 18];
+            out[windex++] = S_BASE64CHAR[(i >> 12) & 0x3f];
+            out[windex++] = S_BASE64CHAR[(i >> 6) & 0x3f];
+            out[windex++] = S_BASE64CHAR[i & 0x3f];
+            rindex += 3;
+            rest -= 3;
+        }
+        if (rest == 1) {
+            int i = data[rindex] & 0xff;
+            out[windex++] = S_BASE64CHAR[i >> 2];
+            out[windex++] = S_BASE64CHAR[(i << 4) & 0x3f];
+            out[windex++] = S_BASE64PAD;
+            out[windex++] = S_BASE64PAD;
+        } else if (rest == 2) {
+            int i = ((data[rindex] & 0xff) << 8) + (data[rindex + 1] & 0xff);
+            out[windex++] = S_BASE64CHAR[i >> 10];
+            out[windex++] = S_BASE64CHAR[(i >> 4) & 0x3f];
+            out[windex++] = S_BASE64CHAR[(i << 2) & 0x3f];
+            out[windex++] = S_BASE64PAD;
+        }
+        return new String(out, 0, windex);
+    }
+
+    /**
+     * Outputs base64 representation of the specified byte array to a byte
+     * stream.
+     */
+    public static void encode(byte[] data, int off, int len,
+                              OutputStream ostream) throws IOException {
+        if (len <= 0)
+            return;
+        byte[] out = new byte[4];
+        int rindex = off;
+        int rest = len - off;
+        while (rest >= 3) {
+            int i = ((data[rindex] & 0xff) << 16)
+                    + ((data[rindex + 1] & 0xff) << 8)
+                    + (data[rindex + 2] & 0xff);
+            out[0] = (byte) S_BASE64CHAR[i >> 18];
+            out[1] = (byte) S_BASE64CHAR[(i >> 12) & 0x3f];
+            out[2] = (byte) S_BASE64CHAR[(i >> 6) & 0x3f];
+            out[3] = (byte) S_BASE64CHAR[i & 0x3f];
+            ostream.write(out, 0, 4);
+            rindex += 3;
+            rest -= 3;
+        }
+        if (rest == 1) {
+            int i = data[rindex] & 0xff;
+            out[0] = (byte) S_BASE64CHAR[i >> 2];
+            out[1] = (byte) S_BASE64CHAR[(i << 4) & 0x3f];
+            out[2] = (byte) S_BASE64PAD;
+            out[3] = (byte) S_BASE64PAD;
+            ostream.write(out, 0, 4);
+        } else if (rest == 2) {
+            int i = ((data[rindex] & 0xff) << 8) + (data[rindex + 1] & 0xff);
+            out[0] = (byte) S_BASE64CHAR[i >> 10];
+            out[1] = (byte) S_BASE64CHAR[(i >> 4) & 0x3f];
+            out[2] = (byte) S_BASE64CHAR[(i << 2) & 0x3f];
+            out[3] = (byte) S_BASE64PAD;
+            ostream.write(out, 0, 4);
+        }
+    }
+
+    /**
+     * Outputs base64 representation of the specified byte array to a character
+     * stream.
+     */
+    public static void encode(byte[] data, int off, int len, Writer writer)
+            throws IOException {
+        if (len <= 0)
+            return;
+        char[] out = new char[4];
+        int rindex = off;
+        int rest = len - off;
+        int output = 0;
+        while (rest >= 3) {
+            int i = ((data[rindex] & 0xff) << 16)
+                    + ((data[rindex + 1] & 0xff) << 8)
+                    + (data[rindex + 2] & 0xff);
+            out[0] = S_BASE64CHAR[i >> 18];
+            out[1] = S_BASE64CHAR[(i >> 12) & 0x3f];
+            out[2] = S_BASE64CHAR[(i >> 6) & 0x3f];
+            out[3] = S_BASE64CHAR[i & 0x3f];
+            writer.write(out, 0, 4);
+            rindex += 3;
+            rest -= 3;
+            output += 4;
+            if (output % 76 == 0)
+                writer.write("\n");
+        }
+        if (rest == 1) {
+            int i = data[rindex] & 0xff;
+            out[0] = S_BASE64CHAR[i >> 2];
+            out[1] = S_BASE64CHAR[(i << 4) & 0x3f];
+            out[2] = S_BASE64PAD;
+            out[3] = S_BASE64PAD;
+            writer.write(out, 0, 4);
+        } else if (rest == 2) {
+            int i = ((data[rindex] & 0xff) << 8) + (data[rindex + 1] & 0xff);
+            out[0] = S_BASE64CHAR[i >> 10];
+            out[1] = S_BASE64CHAR[(i >> 4) & 0x3f];
+            out[2] = S_BASE64CHAR[(i << 2) & 0x3f];
+            out[3] = S_BASE64PAD;
+            writer.write(out, 0, 4);
+        }
+    }
+}
diff --git a/src/org/apache/ws/commons/om/util/ElementHelper.java b/src/org/apache/ws/commons/om/util/ElementHelper.java
new file mode 100644
index 0000000..8ddb306
--- /dev/null
+++ b/src/org/apache/ws/commons/om/util/ElementHelper.java
@@ -0,0 +1,108 @@
+/*
+ * Copyright 2005 The Apache Software Foundation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      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.
+ */
+package org.apache.ws.commons.om.util;
+
+import org.apache.ws.commons.om.OMElement;
+import org.apache.ws.commons.om.OMNamespace;
+import org.apache.ws.commons.om.OMNode;
+
+import javax.xml.namespace.QName;
+import java.util.Iterator;
+
+/**
+ * Helper class to provide extra utility stuff against elements.
+ * The code is designed to work with any element implementation.
+ */
+
+public class ElementHelper {
+
+    private OMElement element;
+
+    /**
+     * Constructs and binds to an element.
+     * @param element element to work with
+     */
+    public ElementHelper(OMElement element) {
+        this.element = element;
+    }
+
+    /**
+     * Turns a prefix:local qname string into a proper QName, evaluating it in the OMElement context.
+     *
+     * @param qname                    qname to resolve
+     * @param defaultToParentNameSpace flag that controls behaviour when there is no namespace.
+     * @return Returns null for any failure to extract a qname.
+     */
+    public QName resolveQName(String qname, boolean defaultToParentNameSpace) {
+        int colon = qname.indexOf(':');
+        if (colon < 0) {
+            if (defaultToParentNameSpace) {
+                //get the parent ns and use it for the child
+                OMNamespace namespace = element.getNamespace();
+                return new QName(namespace.getName(), qname, namespace.getPrefix());
+            } else {
+                //else things without no prefix are local.
+                return new QName(qname);
+            }
+        }
+        String prefix = qname.substring(0, colon);
+        String local = qname.substring(colon + 1);
+        if (local.length() == 0) {
+            //empy local, exit accordingly
+            return null;
+        }
+
+        OMNamespace namespace = element.findNamespaceURI(prefix);
+        if (namespace == null) {
+            return null;
+        }
+        return new QName(namespace.getName(), local, prefix);
+    }
+
+    /**
+     * Turns a prefix:local qname string into a proper QName, evaluating it in the OMElement context.
+     * Unprefixed qnames resolve to the local namespace.
+     *
+     * @param qname prefixed qname string to resolve
+     * @return Returns null for any failure to extract a qname.
+     */
+    public QName resolveQName(String qname) {
+        return resolveQName(qname, true);
+    }
+
+    public static void setNewElement(OMElement parent,
+                                     OMElement myElement,
+                                     OMElement newElement) {
+        if (myElement != null) {
+            myElement.discard();
+        }
+        parent.addChild(newElement);
+        myElement = newElement;
+    }
+
+    public static OMElement getChildWithName(OMElement parent,
+                                             String childName) {
+        Iterator childrenIter = parent.getChildren();
+        while (childrenIter.hasNext()) {
+            OMNode node = (OMNode) childrenIter.next();
+            if (node.getType() == OMNode.ELEMENT_NODE &&
+                    childName.equals(((OMElement) node).getLocalName())) {
+                return (OMElement) node;
+            }
+        }
+        return null;
+    }
+}
diff --git a/src/org/apache/ws/commons/om/util/UUIDGenerator.java b/src/org/apache/ws/commons/om/util/UUIDGenerator.java
new file mode 100644
index 0000000..f3c95d6
--- /dev/null
+++ b/src/org/apache/ws/commons/om/util/UUIDGenerator.java
@@ -0,0 +1,104 @@
+package org.apache.ws.commons.om.util;
+
+/*
+ * Copyright 2001-2004 The Apache Software Foundation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      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.
+ *
+ */
+
+import java.net.InetAddress;
+import java.net.UnknownHostException;
+import java.security.MessageDigest;
+import java.security.NoSuchAlgorithmException;
+import java.util.Date;
+import java.util.Random;
+
+public class UUIDGenerator {
+    /**
+     * This class will give UUIDs for axis2.
+     */
+
+    private static String baseUUID = null;
+    private static long incrementingValue = 0;
+
+
+    private static Random myRand = null;
+
+    /**
+     * MD5 a random string with localhost/date etc will return 128 bits
+     * construct a string of 18 characters from those bits.
+     *
+     * @return string
+     */
+    public static String getUUID() {
+        if (baseUUID == null) {
+            baseUUID = getInitialUUID();
+        }
+        if (++incrementingValue >= Long.MAX_VALUE) {
+            incrementingValue = 0;
+        }
+        return "urn:uuid:" + baseUUID + new Date().getTime() + incrementingValue;
+    }
+
+    protected static String getInitialUUID() {
+        if (myRand == null) {
+            myRand = new Random();
+        }
+        long rand = myRand.nextLong();
+        String sid;
+        try {
+            sid = InetAddress.getLocalHost().toString();
+        } catch (UnknownHostException e) {
+            sid = Thread.currentThread().getName();
+        }
+        StringBuffer sb = new StringBuffer();
+        sb.append(sid);
+        sb.append(":");
+        sb.append(Long.toString(rand));
+        MessageDigest md5 = null;
+        try {
+            md5 = MessageDigest.getInstance("MD5");
+        } catch (NoSuchAlgorithmException e) {
+            //System.out.println("Error: " + e);
+            //todo heve to be properly handle
+        }
+        md5.update(sb.toString().getBytes());
+        byte[] array = md5.digest();
+        StringBuffer sb2 = new StringBuffer();
+        for (int j = 0; j < array.length; ++j) {
+            int b = array[j] & 0xFF;
+            sb2.append(Integer.toHexString(b));
+        }
+        int begin = myRand.nextInt();
+        if (begin < 0) begin = begin * -1;
+        begin = begin % 8;
+        return sb2.toString().substring(begin, begin + 18).toUpperCase();
+    }
+
+    public static void main(String[] args) {
+        long startTime = new Date().getTime();
+        for (int i = 0; i < 100000; i++) {
+            UUIDGenerator.getInitialUUID();
+        }
+        long endTime = new Date().getTime();
+        System.out.println("getInitialUUID Difference = " + (endTime - startTime));
+
+        startTime = new Date().getTime();
+        for (int i = 0; i < 100000; i++) {
+            UUIDGenerator.getUUID();
+        }
+        endTime = new Date().getTime();
+        System.out.println("getUUID Difference = " + (endTime - startTime));
+    }
+}
diff --git a/src/org/apache/ws/commons/om/util/XPathEvaluator.java b/src/org/apache/ws/commons/om/util/XPathEvaluator.java
new file mode 100644
index 0000000..35a5c82
--- /dev/null
+++ b/src/org/apache/ws/commons/om/util/XPathEvaluator.java
@@ -0,0 +1,21 @@
+package org.apache.ws.commons.om.util;
+
+import org.apache.ws.commons.om.xpath.AXIOMXPath;
+import org.jaxen.SimpleNamespaceContext;
+
+import java.util.List;
+
+public class XPathEvaluator {
+
+    public List evaluateXpath(String xpathExpression, Object element, String nsURI) throws Exception{
+        AXIOMXPath xpath = new AXIOMXPath(xpathExpression);
+        if (nsURI!=null){
+            SimpleNamespaceContext nsContext = new SimpleNamespaceContext();
+            nsContext.addNamespace(null,nsURI);
+            xpath.setNamespaceContext(nsContext);
+        }
+        return xpath.selectNodes(element);
+    }
+
+
+}
diff --git a/src/org/apache/ws/commons/om/xpath/AXIOMXPath.java b/src/org/apache/ws/commons/om/xpath/AXIOMXPath.java
new file mode 100644
index 0000000..31e091e
--- /dev/null
+++ b/src/org/apache/ws/commons/om/xpath/AXIOMXPath.java
@@ -0,0 +1,20 @@
+package org.apache.ws.commons.om.xpath;
+
+import org.jaxen.BaseXPath;
+import org.jaxen.JaxenException;
+
+public class AXIOMXPath extends BaseXPath {
+	
+    private static final long serialVersionUID = -5839161412925154639L;
+
+	/**
+     * Construct given an XPath expression string.
+     *
+     * @param xpathExpr the XPath expression.
+     * @throws org.jaxen.JaxenException if there is a syntax error while
+     *                                  parsing the expression
+     */
+    public AXIOMXPath(String xpathExpr) throws JaxenException {
+        super(xpathExpr, new DocumentNavigator());
+    }
+}
diff --git a/src/org/apache/ws/commons/om/xpath/DocumentNavigator.java b/src/org/apache/ws/commons/om/xpath/DocumentNavigator.java
new file mode 100644
index 0000000..8e3f37b
--- /dev/null
+++ b/src/org/apache/ws/commons/om/xpath/DocumentNavigator.java
@@ -0,0 +1,738 @@
+package org.apache.ws.commons.om.xpath;
+
+import org.apache.ws.commons.om.OMAttribute;
+import org.apache.ws.commons.om.OMComment;
+import org.apache.ws.commons.om.OMContainer;
+import org.apache.ws.commons.om.OMDocument;
+import org.apache.ws.commons.om.OMElement;
+import org.apache.ws.commons.om.OMNamespace;
+import org.apache.ws.commons.om.OMNode;
+import org.apache.ws.commons.om.OMProcessingInstruction;
+import org.apache.ws.commons.om.OMText;
+import org.apache.ws.commons.om.impl.llom.OMNamespaceImpl;
+import org.apache.ws.commons.om.impl.llom.builder.StAXOMBuilder;
+import org.jaxen.BaseXPath;
+import org.jaxen.DefaultNavigator;
+import org.jaxen.FunctionCallException;
+import org.jaxen.JaxenConstants;
+import org.jaxen.UnsupportedAxisException;
+import org.jaxen.XPath;
+import org.jaxen.saxpath.SAXPathException;
+import org.jaxen.util.SingleObjectIterator;
+
+import javax.xml.namespace.QName;
+import javax.xml.stream.XMLInputFactory;
+import javax.xml.stream.XMLStreamReader;
+import java.io.FileInputStream;
+import java.net.URL;
+import java.util.ArrayList;
+import java.util.HashSet;
+import java.util.Iterator;
+import java.util.List;
+
+public class DocumentNavigator extends DefaultNavigator {
+	
+    private static final long serialVersionUID = 7325116153349780805L;
+
+	/**
+     * Returns a parsed form of the given xpath string, which will be suitable
+     * for queries on documents that use the same navigator as this one.
+     *
+     * @param xpath the XPath expression
+     * @return Returns a new XPath expression object.
+     * @throws SAXPathException if the string is not a syntactically
+     *                          correct XPath expression
+     * @see XPath
+     */
+    public XPath parseXPath(String xpath) throws SAXPathException {
+        return new BaseXPath(xpath, this);
+    }
+
+    /**
+     * Retrieves the namespace URI of the given element node.
+     *
+     * @param object the context element node
+     * @return Returns the namespace URI of the element node.
+     */
+    public String getElementNamespaceUri(Object object) {
+        OMElement attr = (OMElement) object;
+        return attr.getQName().getNamespaceURI();
+    }
+
+    /**
+     * Retrieves the name of the given element node.
+     *
+     * @param object the context element node
+     * @return Returns the name of the element node.
+     */
+    public String getElementName(Object object) {
+        OMElement attr = (OMElement) object;
+        return attr.getQName().getLocalPart();
+    }
+
+    /**
+     * Retrieves the QName of the given element node.
+     *
+     * @param object the context element node
+     * @return Returns the QName of the element node.
+     */
+    public String getElementQName(Object object) {
+        OMElement attr = (OMElement) object;
+        String prefix = null;
+        if (attr.getNamespace() != null) {
+            prefix = attr.getNamespace().getPrefix();
+        }
+        if (prefix == null || "".equals(prefix)) {
+            return attr.getQName().getLocalPart();
+        }
+        return prefix + ":" + attr.getNamespace().getName();
+    }
+
+    /**
+     * Retrieves the namespace URI of the given attribute node.
+     *
+     * @param object the context attribute node
+     * @return Returns the namespace URI of the attribute node.
+     */
+    public String getAttributeNamespaceUri(Object object) {
+        OMAttribute attr = (OMAttribute) object;
+        return attr.getQName().getNamespaceURI();
+    }
+
+    /**
+     * Retrieves the name of the given attribute node.
+     *
+     * @param object the context attribute node
+     * @return Returns the name of the attribute node.
+     */
+    public String getAttributeName(Object object) {
+        OMAttribute attr = (OMAttribute) object;
+        return attr.getQName().getLocalPart();
+    }
+
+    /**
+     * Retrieves the QName of the given attribute node.
+     *
+     * @param object the context attribute node
+     * @return Returns the qualified name of the attribute node.
+     */
+    public String getAttributeQName(Object object) {
+        OMAttribute attr = (OMAttribute) object;
+        String prefix = attr.getNamespace().getPrefix();
+        if (prefix == null || "".equals(prefix)) {
+            return attr.getQName().getLocalPart();
+        }
+        return prefix + ":" + attr.getNamespace().getName();
+    }
+
+    /**
+     * Returns whether the given object is a document node. A document node
+     * is the node that is selected by the xpath expression <code>/</code>.
+     *
+     * @param object the object to test
+     * @return Returns <code>true</code> if the object is a document node,
+     *         else <code>false</code> .
+     */
+    public boolean isDocument(Object object) {
+        return object instanceof OMDocument;
+    }
+
+    /**
+     * Returns whether the given object is an element node.
+     *
+     * @param object the object to test
+     * @return Returns <code>true</code> if the object is an element node,
+     *         else <code>false</code> .
+     */
+    public boolean isElement(Object object) {
+        return object instanceof OMElement;
+    }
+
+    /**
+     * Returns whether the given object is an attribute node.
+     *
+     * @param object the object to test
+     * @return Returns <code>true</code> if the object is an attribute node,
+     *         else <code>false</code> .
+     */
+    public boolean isAttribute(Object object) {
+        return object instanceof OMAttribute;
+    }
+
+    /**
+     * Returns whether the given object is a namespace node.
+     *
+     * @param object the object to test
+     * @return Returns <code>true</code> if the object is a namespace node,
+     *         else <code>false</code> .
+     */
+    public boolean isNamespace(Object object) {
+        return object instanceof OMNamespace;
+    }
+
+    /**
+     * Returns whether the given object is a comment node.
+     *
+     * @param object the object to test
+     * @return Returns <code>true</code> if the object is a comment node,
+     *         else <code>false</code> .
+     */
+    public boolean isComment(Object object) {
+        return (object instanceof OMComment);
+    }
+
+    /**
+     * Returns whether the given object is a text node.
+     *
+     * @param object the object to test
+     * @return Returns <code>true</code> if the object is a text node,
+     *         else <code>false</code> .
+     */
+    public boolean isText(Object object) {
+        return (object instanceof OMText);
+    }
+
+    /**
+     * Returns whether the given object is a processing-instruction node.
+     *
+     * @param object the object to test
+     * @return Returns <code>true</code> if the object is a processing-instruction node,
+     *         else <code>false</code> .
+     */
+    public boolean isProcessingInstruction(Object object) {
+        return (object instanceof OMProcessingInstruction);
+    }
+
+    /**
+     * Retrieves the string-value of a comment node.
+     * This may be the empty string if the comment is empty,
+     * but must not be null.
+     *
+     * @param object the comment node
+     * @return Returns the string-value of the node.
+     */
+    public String getCommentStringValue(Object object) {
+        return ((OMComment) object).getValue();
+    }
+
+    /**
+     * Retrieves the string-value of an element node.
+     * This may be the empty string if the element is empty,
+     * but must not be null.
+     *
+     * @param object the comment node.
+     * @return Returns the string-value of the node.
+     */
+    public String getElementStringValue(Object object) {
+        if (isElement(object)) {
+            return getStringValue((OMElement) object, new StringBuffer())
+                    .toString();
+        }
+        return null;
+    }
+
+    private StringBuffer getStringValue(OMNode node, StringBuffer buffer) {
+        if (isText(node)) {
+            buffer.append(((OMText) node).getText());
+        } else if (node instanceof OMElement) {
+            Iterator children = ((OMElement) node).getChildren();
+            while (children.hasNext()) {
+                getStringValue((OMNode) children.next(), buffer);
+            }
+        }
+        return buffer;
+    }
+
+    /**
+     * Retrieves the string-value of an attribute node.
+     * This should be the XML 1.0 normalized attribute value.
+     * This may be the empty string but must not be null.
+     *
+     * @param object the attribute node
+     * @return Returns the string-value of the node.
+     */
+    public String getAttributeStringValue(Object object) {
+        return ((OMAttribute) object).getAttributeValue();
+    }
+
+    /**
+     * Retrieves the string-value of a namespace node.
+     * This is generally the namespace URI.
+     * This may be the empty string but must not be null.
+     *
+     * @param object the namespace node
+     * @return Returns the string-value of the node.
+     */
+    public String getNamespaceStringValue(Object object) {
+        return ((OMNamespace) object).getName();
+    }
+
+    /**
+     * Retrieve the string-value of a text node.
+     * This must not be null and should not be the empty string.
+     * The XPath data model does not allow empty text nodes.
+     *
+     * @param object the text node
+     * @return Returns the string-value of the node.
+     */
+    public String getTextStringValue(Object object) {
+        return ((OMText) object).getText();
+    }
+
+    /**
+     * Retrieves the namespace prefix of a namespace node.
+     *
+     * @param object the namespace node
+     * @return Returns the prefix associated with the node.
+     */
+    public String getNamespacePrefix(Object object) {
+        return ((OMNamespace) object).getPrefix();
+    }
+
+    /**
+     * Retrieves an <code>Iterator</code> matching the <code>child</code>
+     * XPath axis.
+     *
+     * @param contextNode the original context node
+     * @return Returns an Iterator capable of traversing the axis, not null.
+     * @throws UnsupportedAxisException if the semantics of the child axis are
+     *                                  not supported by this object model
+     */
+    public Iterator getChildAxisIterator(Object contextNode) throws UnsupportedAxisException {
+        if (contextNode instanceof OMContainer) {
+            return ((OMContainer) contextNode).getChildren();
+        }
+        return JaxenConstants.EMPTY_ITERATOR;
+    }
+
+    public Iterator getDescendantAxisIterator(Object object) throws UnsupportedAxisException {
+        //TODO: Fix this better?
+        return super.getDescendantAxisIterator(object);
+    }
+
+    /**
+     * Retrieves an <code>Iterator</code> matching the <code>attribute</code>
+     * XPath axis.
+     *
+     * @param contextNode the original context node
+     * @return Returns an Iterator capable of traversing the axis, not null.
+     * @throws UnsupportedAxisException if the semantics of the attribute axis are
+     *                                  not supported by this object model
+     */
+    public Iterator getAttributeAxisIterator(Object contextNode) throws UnsupportedAxisException {
+        if (isElement(contextNode)) {
+            ArrayList attributes = new ArrayList();
+            Iterator i = ((OMElement) contextNode).getAllAttributes();
+            while (i != null && i.hasNext()) {
+                attributes.add(
+                        new OMAttributeEx((OMAttribute) i.next(),
+                                (OMContainer) contextNode));
+            }
+            return attributes.iterator();
+        }
+        return JaxenConstants.EMPTY_ITERATOR;
+    }
+
+    /**
+     * Retrieves an <code>Iterator</code> matching the <code>namespace</code>
+     * XPath axis.
+     *
+     * @param contextNode the original context node
+     * @return Returns an Iterator capable of traversing the axis, not null.
+     * @throws UnsupportedAxisException if the semantics of the namespace axis are
+     *                                  not supported by this object model
+     */
+    public Iterator getNamespaceAxisIterator(Object contextNode) throws UnsupportedAxisException {
+        if (!(contextNode instanceof OMContainer &&
+                contextNode instanceof OMElement)) {
+            return JaxenConstants.EMPTY_ITERATOR;
+        }
+        List nsList = new ArrayList();
+        HashSet prefixes = new HashSet();
+        for (OMContainer context = (OMContainer) contextNode;
+             context != null && !(context instanceof OMDocument);
+             context = ((OMElement) context).getParent()) {
+            OMElement element = (OMElement) context;
+            ArrayList declaredNS = new ArrayList();
+            Iterator i = element.getAllDeclaredNamespaces();
+            while (i != null && i.hasNext()) {
+                declaredNS.add(i.next());
+            }
+            declaredNS.add(element.getNamespace());
+            for (Iterator iter = element.getAllAttributes();
+                 iter != null && iter.hasNext();) {
+                OMAttribute attr = (OMAttribute) iter.next();
+                declaredNS.add(attr.getNamespace());
+            }
+            for (Iterator iter = declaredNS.iterator();
+                 iter != null && iter.hasNext();) {
+                OMNamespace namespace = (OMNamespace) iter.next();
+                if (namespace != null) {
+                    String prefix = namespace.getPrefix();
+                    if (prefix != null && !prefixes.contains(prefix)) {
+                        prefixes.add(prefix);
+                        nsList.add(new OMNamespaceEx(namespace, context));
+                    }
+                }
+            }
+        }
+        nsList.add(
+                new OMNamespaceEx(
+                        new OMNamespaceImpl(
+                                "http://www.w3.org/XML/1998/namespace", "xml"),
+                        (OMContainer) contextNode));
+        return nsList.iterator();
+    }
+
+    /**
+     * Retrieves an <code>Iterator</code> matching the <code>self</code> xpath
+     * axis.
+     *
+     * @param contextNode the original context node
+     * @return Returns an Iterator capable of traversing the axis, not null.
+     * @throws UnsupportedAxisException if the semantics of the self axis are
+     *                                  not supported by this object model
+     */
+    public Iterator getSelfAxisIterator(Object contextNode) throws UnsupportedAxisException {
+        //TODO: Fix this better?
+        return super.getSelfAxisIterator(contextNode);
+    }
+
+    /**
+     * Retrieves an <code>Iterator</code> matching the
+     * <code>descendant-or-self</code> XPath axis.
+     *
+     * @param contextNode the original context node
+     * @return Returns an Iterator capable of traversing the axis, not null.
+     * @throws UnsupportedAxisException if the semantics of the descendant-or-self axis are
+     *                                  not supported by this object model
+     */
+    public Iterator getDescendantOrSelfAxisIterator(Object contextNode) throws UnsupportedAxisException {
+        //TODO: Fix this better?
+        return super.getDescendantOrSelfAxisIterator(contextNode);
+    }
+
+    /**
+     * Retrieves an <code>Iterator</code> matching the
+     * <code>ancestor-or-self</code> XPath axis.
+     *
+     * @param contextNode the original context node
+     * @return Returns an Iterator capable of traversing the axis, not null.
+     * @throws UnsupportedAxisException if the semantics of the ancestor-or-self axis are
+     *                                  not supported by this object model
+     */
+    public Iterator getAncestorOrSelfAxisIterator(Object contextNode) throws UnsupportedAxisException {
+        //TODO: Fix this better?
+        return super.getAncestorOrSelfAxisIterator(contextNode);
+    }
+
+    /**
+     * Retrieves an <code>Iterator</code> matching the <code>parent</code> XPath axis.
+     *
+     * @param contextNode the original context node
+     * @return Returns an Iterator capable of traversing the axis, not null.
+     * @throws UnsupportedAxisException if the semantics of the parent axis are
+     *                                  not supported by this object model
+     */
+    public Iterator getParentAxisIterator(Object contextNode) throws UnsupportedAxisException {
+        if (contextNode instanceof OMNode) {
+            return new SingleObjectIterator(((OMNode) contextNode).getParent());
+        } else if (contextNode instanceof OMNamespaceEx) {
+            return new SingleObjectIterator(
+                    ((OMNamespaceEx) contextNode).getParent());
+        } else if (contextNode instanceof OMAttributeEx) {
+            return new SingleObjectIterator(
+                    ((OMAttributeEx) contextNode).getParent());
+        }
+        return JaxenConstants.EMPTY_ITERATOR;
+    }
+
+    /**
+     * Retrieves an <code>Iterator</code> matching the <code>ancestor</code>
+     * XPath axis.
+     *
+     * @param contextNode the original context node
+     * @return Returns an Iterator capable of traversing the axis, not null.
+     * @throws UnsupportedAxisException if the semantics of the ancestor axis are
+     *                                  not supported by this object model
+     */
+    public Iterator getAncestorAxisIterator(Object contextNode) throws UnsupportedAxisException {
+        //TODO: Fix this better?
+        return super.getAncestorAxisIterator(contextNode);
+    }
+
+    /**
+     * Retrieves an <code>Iterator</code> matching the
+     * <code>following-sibling</code> XPath axis.
+     *
+     * @param contextNode the original context node
+     * @return Returns an Iterator capable of traversing the axis, not null.
+     * @throws UnsupportedAxisException if the semantics of the following-sibling axis are
+     *                                  not supported by this object model
+     */
+    public Iterator getFollowingSiblingAxisIterator(Object contextNode) throws UnsupportedAxisException {
+        ArrayList list = new ArrayList();
+        if (contextNode != null && contextNode instanceof OMNode) {
+            while (contextNode != null && contextNode instanceof OMNode) {
+                contextNode = ((OMNode) contextNode).getNextOMSibling();
+                if (contextNode != null)
+                    list.add(contextNode);
+            }
+        }
+        return list.iterator();
+    }
+
+    /**
+     * Retrieves an <code>Iterator</code> matching the
+     * <code>preceding-sibling</code> XPath axis.
+     *
+     * @param contextNode the original context node
+     * @return Returns an Iterator capable of traversing the axis, not null.
+     * @throws UnsupportedAxisException if the semantics of the preceding-sibling axis are
+     *                                  not supported by this object model
+     */
+    public Iterator getPrecedingSiblingAxisIterator(Object contextNode) throws UnsupportedAxisException {
+        ArrayList list = new ArrayList();
+        if (contextNode != null && contextNode instanceof OMNode) {
+            while (contextNode != null && contextNode instanceof OMNode) {
+                contextNode = ((OMNode) contextNode).getPreviousOMSibling();
+                if (contextNode != null)
+                    list.add(contextNode);
+            }
+        }
+        return list.iterator();
+    }
+
+    /**
+     * Retrieves an <code>Iterator</code> matching the <code>following</code>
+     * XPath axis.
+     *
+     * @param contextNode the original context node
+     * @return Returns an Iterator capable of traversing the axis, not null.
+     * @throws UnsupportedAxisException if the semantics of the following axis are
+     *                                  not supported by this object model
+     */
+    public Iterator getFollowingAxisIterator(Object contextNode) throws UnsupportedAxisException {
+        //TODO: Fix this better?
+        return super.getFollowingAxisIterator(contextNode);
+    }
+
+    /**
+     * Retrieves an <code>Iterator</code> matching the <code>preceding</code> XPath axis.
+     *
+     * @param contextNode the original context node
+     * @return Returns an Iterator capable of traversing the axis, not null.
+     * @throws UnsupportedAxisException if the semantics of the preceding axis are
+     *                                  not supported by this object model
+     */
+    public Iterator getPrecedingAxisIterator(Object contextNode) throws UnsupportedAxisException {
+        //TODO: Fix this better?
+        return super.getPrecedingAxisIterator(contextNode);
+    }
+
+    /**
+     * Loads a document from the given URI.
+     *
+     * @param uri the URI of the document to load
+     * @return Returns the document.
+     * @throws FunctionCallException if the document could not be loaded
+     */
+    public Object getDocument(String uri)
+            throws FunctionCallException {
+        try {
+            XMLStreamReader parser;
+            XMLInputFactory xmlInputFactory = XMLInputFactory.newInstance();
+            xmlInputFactory.setProperty(XMLInputFactory.IS_COALESCING, Boolean.TRUE);
+            if (uri.indexOf(':') == -1) {
+                parser = xmlInputFactory.createXMLStreamReader(
+                                new FileInputStream(uri));
+            } else {
+                URL url = new URL(uri);
+                parser = xmlInputFactory.createXMLStreamReader(
+                                url.openStream());
+            }
+            StAXOMBuilder builder =
+                    new StAXOMBuilder(parser);
+            return builder.getDocumentElement().getParent();
+        } catch (Exception e) {
+            throw new FunctionCallException(e);
+        }
+    }
+
+    /**
+     * Returns the element whose ID is given by elementId.
+     * If no such element exists, returns null.
+     * Attributes with the name "ID" are not of type ID unless so defined.
+     * Implementations that do not know whether attributes are of type ID or
+     * not are expected to return null.
+     *
+     * @param contextNode a node from the document in which to look for the
+     *                    id
+     * @param elementId   id to look for
+     * @return Returns element whose ID is given by elementId, or null if no such
+     *         element exists in the document or if the implementation
+     *         does not know about attribute types.
+     */
+    public Object getElementById(Object contextNode, String elementId) {
+        //TODO: Fix this better?
+        return super.getElementById(contextNode, elementId);
+    }
+
+    /**
+     * Returns the document node that contains the given context node.
+     *
+     * @param contextNode the context node
+     * @return Returns the document of the context node.
+     * @see #isDocument(Object)
+     */
+    public Object getDocumentNode(Object contextNode) {
+        if (contextNode instanceof OMDocument) {
+            return contextNode;
+        }
+        return getDocumentNode(((OMNode) contextNode).getParent());
+    }
+
+    /**
+     * Translates a namespace prefix to a namespace URI, <b>possibly</b>
+     * considering a particular element node.
+     * <p/>
+     * Strictly speaking, prefix-to-URI translation should occur
+     * irrespective of any element in the document.  This method
+     * is provided to allow a non-conforming ease-of-use enhancement.
+     * </p>
+     *
+     * @param prefix  the prefix to translate
+     * @param element the element to consider during translation
+     * @return Returns the namespace URI associated with the prefix.
+     */
+    public String translateNamespacePrefixToUri(String prefix, Object element) {
+        //TODO: Fix this better?
+        return super.translateNamespacePrefixToUri(prefix, element);
+    }
+
+    /**
+     * Retrieves the target of a processing-instruction.
+     *
+     * @param object the context processing-instruction node
+     * @return Returns the target of the processing-instruction node.
+     */
+    public String getProcessingInstructionTarget(Object object) {
+        return ((OMProcessingInstruction)object).getTarget();
+    }
+
+    /**
+     * Retrieves the data of a processing-instruction.
+     *
+     * @param object the context processing-instruction node
+     * @return Returns the data of the processing-instruction node.
+     */
+    public String getProcessingInstructionData(Object object) {
+        return ((OMProcessingInstruction)object).getValue();
+    }
+
+    /**
+     * Returns a number that identifies the type of node that the given
+     * object represents in this navigator. See org.jaxen.pattern.Pattern
+     *
+     * @param node ????
+     * @return Returns short.
+     */
+    public short getNodeType(Object node) {
+        //TODO: Fix this better?
+        return super.getNodeType(node);
+    }
+
+    /**
+     * Returns the parent of the given context node.
+     * <p/>
+     * The parent of any node must either be a document
+     * node or an element node.
+     *
+     * @param contextNode the context node
+     * @return Returns the parent of the context node, or null if this is a document node.
+     * @throws UnsupportedAxisException if the parent axis is not
+     *                                  supported by the model
+     * @see #isDocument
+     * @see #isElement
+     */
+    public Object getParentNode(Object contextNode) throws UnsupportedAxisException {
+        if (contextNode == null ||
+                contextNode instanceof OMDocument) {
+            return null;
+        } else if (contextNode instanceof OMAttributeEx) {
+            return ((OMAttributeEx) contextNode).getParent();
+        } else if (contextNode instanceof OMNamespaceEx) {
+            return ((OMNamespaceEx) contextNode).getParent();
+        }
+        return ((OMNode) contextNode).getParent();
+    }
+
+    class OMNamespaceEx implements OMNamespace {
+        OMNamespace originalNsp = null;
+        OMContainer parent = null;
+
+        OMNamespaceEx(OMNamespace nsp, OMContainer parent) {
+            originalNsp = nsp;
+            this.parent = parent;
+        }
+
+        public boolean equals(String uri, String prefix) {
+            return originalNsp.equals(uri, prefix);
+        }
+
+        public String getPrefix() {
+            return originalNsp.getPrefix();
+        }
+
+        public String getName() {
+            return originalNsp.getName();
+        }
+
+        public OMContainer getParent() {
+            return parent;
+        }
+    }
+
+    class OMAttributeEx implements OMAttribute {
+        OMAttribute attribute = null;
+        OMContainer parent = null;
+
+        OMAttributeEx(OMAttribute attribute, OMContainer parent) {
+            this.attribute = attribute;
+            this.parent = parent;
+        }
+
+        public String getLocalName() {
+            return attribute.getLocalName();
+        }
+
+        public void setLocalName(String localName) {
+            attribute.setLocalName(localName);
+        }
+
+        public String getAttributeValue() {
+            return attribute.getAttributeValue();
+        }
+
+        public void setAttributeValue(String value) {
+            attribute.setAttributeValue(value);
+        }
+
+        public void setOMNamespace(OMNamespace omNamespace) {
+            attribute.setOMNamespace(omNamespace);
+        }
+
+        public OMNamespace getNamespace() {
+            return attribute.getNamespace();
+        }
+
+        public QName getQName() {
+            return attribute.getQName();
+        }
+
+        public OMContainer getParent() {
+            return parent;
+        }
+    }
+}
+
diff --git a/src/org/apache/ws/commons/soap/SOAP11Constants.java b/src/org/apache/ws/commons/soap/SOAP11Constants.java
new file mode 100644
index 0000000..7477ebb
--- /dev/null
+++ b/src/org/apache/ws/commons/soap/SOAP11Constants.java
@@ -0,0 +1,54 @@
+/*
+ * Copyright 2004,2005 The Apache Software Foundation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      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.
+ */
+
+package org.apache.ws.commons.soap;
+
+
+public interface SOAP11Constants extends SOAPConstants {
+    /**
+     * Eran Chinthaka (chinthaka@apache.org)
+     */
+    public static final String SOAP_ENVELOPE_NAMESPACE_URI = "http://schemas.xmlsoap.org/soap/envelope/";
+
+    /**
+     * Field ATTR_ACTOR
+     */
+    public static final String ATTR_ACTOR = "actor";
+
+    /**
+     * Field SOAP_FAULT_CODE_LOCAL_NAME
+     */
+    public static final String SOAP_FAULT_CODE_LOCAL_NAME = "faultcode";
+    /**
+     * Field SOAP_FAULT_STRING_LOCAL_NAME
+     */
+    public static final String SOAP_FAULT_STRING_LOCAL_NAME = "faultstring";
+    /**
+     * Field SOAP_FAULT_ACTOR_LOCAL_NAME
+     */
+    public static final String SOAP_FAULT_ACTOR_LOCAL_NAME = "faultactor";
+
+    public static final String SOAP_FAULT_DETAIL_LOCAL_NAME = "detail";
+
+    //SOAP 1.2 Content Type
+    public static final String SOAP_11_CONTENT_TYPE = "text/xml";
+
+     // -------- SOAP Fault Codes ------------------------------
+    public static final String FAULT_CODE_SENDER = "Client";
+    public static final String FAULT_CODE_RECEIVER = "Server";
+
+    public static final String SOAP_ACTOR_NEXT = "http://schemas.xmlsoap.org/soap/actor/next";
+}
diff --git a/src/org/apache/ws/commons/soap/SOAP12Constants.java b/src/org/apache/ws/commons/soap/SOAP12Constants.java
new file mode 100644
index 0000000..22494e9
--- /dev/null
+++ b/src/org/apache/ws/commons/soap/SOAP12Constants.java
@@ -0,0 +1,70 @@
+/*
+ * Copyright 2004,2005 The Apache Software Foundation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      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.
+ */
+
+package org.apache.ws.commons.soap;
+
+
+public interface SOAP12Constants extends SOAPConstants {
+    /**
+     * Eran Chinthaka (chinthaka@apache.org)
+     */
+
+    public String SOAP_ENVELOPE_NAMESPACE_URI =
+            "http://www.w3.org/2003/05/soap-envelope";
+
+    public static final String SOAP_ROLE = "role";
+    public static final String SOAP_RELAY = "relay";
+
+    // SOAP Fault Code
+    public static final String SOAP_FAULT_CODE_LOCAL_NAME = "Code";
+    public static final String SOAP_FAULT_SUB_CODE_LOCAL_NAME = "Subcode";
+    public static final String SOAP_FAULT_VALUE_LOCAL_NAME = "Value";
+
+    // SOAP Fault Codes
+    public static final String SOAP_FAULT_VALUE_VERSION_MISMATCH = "VersionMismatch";
+    public static final String SOAP_FAULT_VALUE_MUST_UNDERSTAND = "MustUnderstand";
+    public static final String SOAP_FAULT_VALUE_DATA_ENCODING_UKNOWN = "DataEncodingUnknown";
+    public static final String SOAP_FAULT_VALUE_SENDER = "Sender";
+    public static final String SOAP_FAULT_VALUE_RECEIVER = "Receiver";
+
+    // SOAP Fault Reason
+    public static final String SOAP_FAULT_REASON_LOCAL_NAME = "Reason";
+    public static final String SOAP_FAULT_TEXT_LOCAL_NAME = "Text";
+    public static final String SOAP_FAULT_TEXT_LANG_ATTR_LOCAL_NAME = "lang";
+    public static final String SOAP_FAULT_TEXT_LANG_ATTR_NS_URI = "http://www.w3.org/XML/1998/namespace";
+    public static final String SOAP_FAULT_TEXT_LANG_ATTR_NS_PREFIX = "xml";
+
+    // SOAP Fault Node
+    public static final String SOAP_FAULT_NODE_LOCAL_NAME = "Node";
+
+    // SOAP Fault Detail
+    public static final String SOAP_FAULT_DETAIL_LOCAL_NAME = "Detail";
+
+    // SOAP Fault Role
+    public static final String SOAP_FAULT_ROLE_LOCAL_NAME = "Role";
+
+    //SOAP 1.2 Content Type
+    public static final String SOAP_12_CONTENT_TYPE = "application/soap+xml";
+
+    // -------- SOAP Fault Codes ------------------------------
+    public static final String FAULT_CODE_SENDER = "Sender";
+    public static final String FAULT_CODE_RECEIVER = "Receiver";
+
+    public static final String SOAP_ROLE_NEXT = "http://www.w3.org/2003/05/soap-envelope/role/next";
+    public static final String SOAP_ROLE_NONE = "http://www.w3.org/2003/05/soap-envelope/role/next";
+    public static final String SOAP_ROLE_ULTIMATE_RECEIVER = "http://www.w3.org/2003/05/soap-envelope/role/ultimateReceiver";
+    
+}
diff --git a/src/org/apache/ws/commons/soap/SOAPBody.java b/src/org/apache/ws/commons/soap/SOAPBody.java
new file mode 100644
index 0000000..f3e7dea
--- /dev/null
+++ b/src/org/apache/ws/commons/soap/SOAPBody.java
@@ -0,0 +1,72 @@
+/*
+ * Copyright 2004,2005 The Apache Software Foundation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      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.
+ */
+
+package org.apache.ws.commons.soap;
+
+import org.apache.ws.commons.om.OMElement;
+import org.apache.ws.commons.om.OMException;
+
+/**
+ * An object that represents the contents of the SOAP body
+ * element in a SOAP message. B SOAP body element consists of XML data
+ * that affects the way the application-specific content is processed.
+ * <P>
+ * B <code>SOAPBody</code> object contains <code>OMBodyBlock</code>
+ * objects, which have the content for the SOAP body.
+ * B <code>SOAPFault</code> object, which carries status and/or
+ * error information, is an example of a <code>OMBodyBlock</code> object.
+ */
+public interface SOAPBody extends OMElement {
+    /**
+     * Creates a new <code>SOAPFault</code> object and adds it to
+     * this <code>SOAPBody</code> object.
+     *
+     * @param e
+     * @return the new <code>SOAPFault</code> object
+     * @throws org.apache.ws.commons.om.OMException
+     *          if there is a SOAP error
+     * @throws org.apache.ws.commons.om.OMException
+     *
+     */
+    public abstract SOAPFault addFault(Exception e) throws OMException;
+
+    /**
+     * Indicates whether a <code>SOAPFault</code> object exists in
+     * this <code>SOAPBody</code> object.
+     *
+     * @return <code>true</code> if a <code>SOAPFault</code> object exists in
+     *         this <code>SOAPBody</code> object; <code>false</code>
+     *         otherwise
+     */
+    public abstract boolean hasFault();
+
+    /**
+     * Returns the <code>SOAPFault</code> object in this <code>SOAPBody</code>
+     * object.
+     *
+     * @return the <code>SOAPFault</code> object in this <code>SOAPBody</code>
+     *         object
+     */
+    public abstract SOAPFault getFault();
+
+    /**
+     * @param soapFault
+     * @throws OMException
+     */
+    public abstract void addFault(SOAPFault soapFault) throws OMException;
+
+
+}
diff --git a/src/org/apache/ws/commons/soap/SOAPConstants.java b/src/org/apache/ws/commons/soap/SOAPConstants.java
new file mode 100644
index 0000000..b9a59dc
--- /dev/null
+++ b/src/org/apache/ws/commons/soap/SOAPConstants.java
@@ -0,0 +1,85 @@
+/*
+ * Copyright 2004,2005 The Apache Software Foundation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      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.
+ */
+
+package org.apache.ws.commons.soap;
+
+public interface SOAPConstants {
+    /**
+     * Eran Chinthaka (chinthaka@apache.org)
+     */
+    /**
+     * Field SOAP_DEFAULT_NAMESPACE_PREFIX
+     */
+    public static final String SOAP_DEFAULT_NAMESPACE_PREFIX = "soapenv";
+    /**
+     * Field SOAPENVELOPE_LOCAL_NAME
+     */
+    public static final String SOAPENVELOPE_LOCAL_NAME = "Envelope";
+
+    /**
+     * Field HEADER_LOCAL_NAME
+     */
+    public static final String HEADER_LOCAL_NAME = "Header";
+
+    /**
+     * Field BODY_LOCAL_NAME
+     */
+    public static final String BODY_LOCAL_NAME = "Body";
+    /**
+     * Field BODY_NAMESPACE_PREFIX
+     */
+    public static final String BODY_NAMESPACE_PREFIX =
+            SOAP_DEFAULT_NAMESPACE_PREFIX;
+    /**
+     * Field BODY_FAULT_LOCAL_NAME
+     */
+    public static final String BODY_FAULT_LOCAL_NAME = "Fault";
+
+    /**
+     * Field ATTR_MUSTUNDERSTAND
+     */
+    public static final String ATTR_MUSTUNDERSTAND = "mustUnderstand";
+    public static final String ATTR_MUSTUNDERSTAND_TRUE = "true";
+    public static final String ATTR_MUSTUNDERSTAND_FALSE = "false";
+    public static final String ATTR_MUSTUNDERSTAND_0 = "0";
+    public static final String ATTR_MUSTUNDERSTAND_1 = "1";
+    /**
+     * Field SOAPFAULT_LOCAL_NAME
+     */
+    public static final String SOAPFAULT_LOCAL_NAME = "Fault";
+    /**
+     * Field SOAPFAULT_DETAIL_LOCAL_NAME
+     */
+    public static final String SOAPFAULT_DETAIL_LOCAL_NAME = "detail";
+
+    /**
+     * Field SOAPFAULT_NAMESPACE_PREFIX
+     */
+    public static final String SOAPFAULT_NAMESPACE_PREFIX =
+            SOAP_DEFAULT_NAMESPACE_PREFIX;
+
+    public static final String SOAP_FAULT_DETAIL_EXCEPTION_ENTRY = "Exception";
+
+    // -------- SOAP Fault Codes ------------------------------
+    public static final String FAULT_CODE_VERSION_MISMATCH = "env:VersionMismatch";
+    public static final String FAULT_CODE_MUST_UNDERSTAND  = "env:MustUnderstand";
+    public static final String FAULT_CODE_DATA_ENCODING_UNKNOWN = "env:DataEncodingUnknown";
+
+    // Followings are different in SOAP 1.1 and 1.2 specifications
+    public static final String FAULT_CODE_SENDER = "";
+    public static final String FAULT_CODE_RECEIVER = "";
+
+}
diff --git a/src/org/apache/ws/commons/soap/SOAPEnvelope.java b/src/org/apache/ws/commons/soap/SOAPEnvelope.java
new file mode 100644
index 0000000..1f6182f
--- /dev/null
+++ b/src/org/apache/ws/commons/soap/SOAPEnvelope.java
@@ -0,0 +1,55 @@
+/*
+ * Copyright 2004,2005 The Apache Software Foundation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      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.
+ */
+
+package org.apache.ws.commons.soap;
+
+import org.apache.ws.commons.om.OMElement;
+import org.apache.ws.commons.om.OMException;
+
+/**
+ * Interface SOAPEnvelope
+ */
+public interface SOAPEnvelope extends OMElement {
+    /**
+     * Returns the <CODE>SOAPHeader</CODE> object for this <CODE>
+     * SOAPEnvelope</CODE> object.
+     * <P> This SOAPHeader will just be a container for all the headers in the
+     * <CODE>OMMessage</CODE>
+     * </P>
+     *
+     * @return the <CODE>SOAPHeader</CODE> object or <CODE>
+     *         null</CODE> if there is none
+     * @throws org.apache.ws.commons.om.OMException
+     *          if there is a problem
+     *          obtaining the <CODE>SOAPHeader</CODE> object
+     */
+    public abstract SOAPHeader getHeader() throws OMException;
+
+    /**
+     * Returns the <CODE>SOAPBody</CODE> object associated with
+     * this <CODE>SOAPEnvelope</CODE> object.
+     * <P> This SOAPBody will just be a container for all the BodyElements in the
+     * <CODE>OMMessage</CODE>
+     * </P>
+     *
+     * @return the <CODE>SOAPBody</CODE> object for this <CODE>
+     *         SOAPEnvelope</CODE> object or <CODE>null</CODE> if there
+     *         is none
+     * @throws OMException if there is a problem
+     *                     obtaining the <CODE>SOAPBody</CODE> object
+     */
+    public abstract SOAPBody getBody() throws OMException;
+}
diff --git a/src/org/apache/ws/commons/soap/SOAPFactory.java b/src/org/apache/ws/commons/soap/SOAPFactory.java
new file mode 100644
index 0000000..89c2b96
--- /dev/null
+++ b/src/org/apache/ws/commons/soap/SOAPFactory.java
@@ -0,0 +1,328 @@
+/*
+ * Copyright 2004,2005 The Apache Software Foundation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      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.
+ */
+
+package org.apache.ws.commons.soap;
+
+import org.apache.ws.commons.om.OMFactory;
+import org.apache.ws.commons.om.OMNamespace;
+import org.apache.ws.commons.om.OMXMLParserWrapper;
+
+
+public interface SOAPFactory extends OMFactory {
+    
+    public String getSoapVersionURI();
+    
+    /**
+     * Eran Chinthaka (chinthaka@apache.org)
+     */
+
+    public SOAPMessage createSOAPMessage(OMXMLParserWrapper builder);
+    public SOAPMessage createSOAPMessage(SOAPEnvelope envelope, OMXMLParserWrapper parserWrapper);
+
+    /**
+     * @param builder
+     * @return Returns SOAPEnvelope.
+     */
+    public SOAPEnvelope createSOAPEnvelope(OMXMLParserWrapper builder);
+
+    /**
+     * @return Returns SOAPEnvelope.
+     */
+    public SOAPEnvelope createSOAPEnvelope() throws SOAPProcessingException;
+
+    /**
+     * @param envelope
+     * @return Returns SOAPHeader.
+     */
+    public SOAPHeader createSOAPHeader(SOAPEnvelope envelope) throws SOAPProcessingException;
+
+    /**
+     * @param envelope
+     * @param builder
+     * @return Returns SOAPHeader.
+     */
+    public SOAPHeader createSOAPHeader(SOAPEnvelope envelope,
+                                       OMXMLParserWrapper builder);
+
+    /**
+     * @param localName
+     * @param ns
+     * @return Returns SOAPHeaderBlock.
+     */
+    public SOAPHeaderBlock createSOAPHeaderBlock(String localName,
+                                                 OMNamespace ns,
+                                                 SOAPHeader parent) throws SOAPProcessingException;
+
+    /**
+     * @param localName
+     * @param ns
+     * @param parent
+     * @param builder
+     * @return Returns SOAPHeaderBlock.
+     */
+    public SOAPHeaderBlock createSOAPHeaderBlock(String localName,
+                                                 OMNamespace ns,
+                                                 SOAPHeader parent,
+                                                 OMXMLParserWrapper builder) throws SOAPProcessingException;
+
+    /**
+     * @param parent
+     * @param e
+     * @return Returns SOAPFault.
+     */
+    public SOAPFault createSOAPFault(SOAPBody parent, Exception e) throws SOAPProcessingException;
+
+    public SOAPFault createSOAPFault(SOAPBody parent) throws SOAPProcessingException;
+
+    /**
+     * @param parent
+     * @param builder
+     * @return Returns SOAPFault.
+     */
+    public SOAPFault createSOAPFault(SOAPBody parent,
+                                     OMXMLParserWrapper builder);
+
+    /**
+     * @param envelope
+     * @return Returns SOAPBody.
+     */
+    public SOAPBody createSOAPBody(SOAPEnvelope envelope) throws SOAPProcessingException;
+
+    /**
+     * @param envelope
+     * @param builder
+     * @return Returns SOAPBody.
+     */
+    public SOAPBody createSOAPBody(SOAPEnvelope envelope,
+                                   OMXMLParserWrapper builder);
+
+    /* ========================
+       =  SOAPFaultCode       =
+       ======================== */
+
+    /**
+     * Code eii under SOAPFault (parent)
+     *
+     * @param parent
+     * @return Returns SOAPFaultCode.
+     */
+    public SOAPFaultCode createSOAPFaultCode(SOAPFault parent) throws SOAPProcessingException;
+
+    /**
+     * Code eii under SOAPFault (parent)
+     *
+     * @param parent
+     * @param builder
+     * @return Returns SOAPFaultCode.
+     */
+    public SOAPFaultCode createSOAPFaultCode(SOAPFault parent,
+                                             OMXMLParserWrapper builder);
+
+
+    /*========================
+      =  SOAPFaultCodeValue  =
+      ======================== */
+    /**
+     * Value eii under Code (parent)
+     *
+     * @param parent
+     * @return Returns SOAPFaultValue.
+     */
+    public SOAPFaultValue createSOAPFaultValue(SOAPFaultCode parent) throws SOAPProcessingException;
+
+    /**
+     * Value eii under Code (parent)
+     *
+     * @param parent
+     * @param builder
+     * @return Returns SOAPFaultValue.
+     */
+    public SOAPFaultValue createSOAPFaultValue(SOAPFaultCode parent,
+                                               OMXMLParserWrapper builder);
+
+    /*========================
+      =  SOAPFaultSubCode    =
+      ======================== */
+
+    /**
+     * SubCode eii under Value (parent)
+     *
+     * @param parent
+     * @return Returns SOAPFaultValue.
+     */
+
+    //added
+    public SOAPFaultValue createSOAPFaultValue(SOAPFaultSubCode parent) throws SOAPProcessingException;
+
+    //added
+    public SOAPFaultValue createSOAPFaultValue(SOAPFaultSubCode parent,
+                                               OMXMLParserWrapper builder);
+
+    //changed
+    public SOAPFaultSubCode createSOAPFaultSubCode(SOAPFaultCode parent) throws SOAPProcessingException;
+
+    /**
+     * SubCode eii under Value (parent)
+     *
+     * @param parent
+     * @param builder
+     * @return Returns SOAPFaultSubCode.
+     */
+    //changed
+    public SOAPFaultSubCode createSOAPFaultSubCode(SOAPFaultCode parent,
+                                                   OMXMLParserWrapper builder);
+
+    /**
+     * SubCode eii under SubCode (parent)
+     *
+     * @param parent
+     * @return Returns SOAPFaultSubCode.
+     */
+    public SOAPFaultSubCode createSOAPFaultSubCode(SOAPFaultSubCode parent) throws SOAPProcessingException;
+
+    /**
+     * SubCode eii under SubCode (parent)
+     *
+     * @param parent
+     * @param builder
+     * @return Returns SOAPFaultSubCode.
+     */
+    public SOAPFaultSubCode createSOAPFaultSubCode(SOAPFaultSubCode parent,
+                                                   OMXMLParserWrapper builder);
+
+
+    /*========================
+      =  SOAPFaultReason     =
+      ======================== */
+
+    /**
+     * Reason eii under SOAPFault (parent)
+     *
+     * @param parent
+     * @return Returns SOAPFaultReason.
+     */
+    public SOAPFaultReason createSOAPFaultReason(SOAPFault parent) throws SOAPProcessingException;
+
+    /**
+     * Reason eii under SOAPFault (parent)
+     *
+     * @param parent
+     * @param builder
+     * @return Returns SOAPFaultReason.
+     */
+    public SOAPFaultReason createSOAPFaultReason(SOAPFault parent,
+                                                 OMXMLParserWrapper builder);
+
+    /*========================
+      =  SOAPFaultReasonText     =
+      ======================== */
+
+    /**
+     * SubCode eii under SubCode (parent)
+     *
+     * @param parent
+     * @return Returns SOAPFaultText.
+     */
+    public SOAPFaultText createSOAPFaultText(SOAPFaultReason parent) throws SOAPProcessingException;
+
+    /**
+     * SubCode eii under SubCode (parent)
+     *
+     * @param parent
+     * @param builder
+     * @return Returns SOAPFaultText.
+     */
+    public SOAPFaultText createSOAPFaultText(SOAPFaultReason parent,
+                                             OMXMLParserWrapper builder);
+
+
+    /*========================
+      =  SOAPFaultNode       =
+      ======================== */
+
+    /**
+     * Node eii under SOAPFault (parent)
+     *
+     * @param parent
+     * @return Returns SOAPFaultNode.
+     */
+    public SOAPFaultNode createSOAPFaultNode(SOAPFault parent) throws SOAPProcessingException;
+
+    /**
+     * Node eii under SOAPFault (parent)
+     *
+     * @param parent
+     * @param builder
+     * @return Returns SOAPFaultNode.
+     */
+    public SOAPFaultNode createSOAPFaultNode(SOAPFault parent,
+                                             OMXMLParserWrapper builder);
+
+    /*========================
+      =  SOAPFaultRole       =
+      ======================== */
+
+    /**
+     * Role eii under SOAPFault (parent)
+     *
+     * @param parent
+     * @return Returns SOAPFaultRole.
+     */
+    public SOAPFaultRole createSOAPFaultRole(SOAPFault parent) throws SOAPProcessingException;
+
+    /**
+     * Role eii under SOAPFault (parent)
+     *
+     * @param parent
+     * @param builder
+     * @return Returns SOAPFaultRole.
+     */
+    public SOAPFaultRole createSOAPFaultRole(SOAPFault parent,
+                                             OMXMLParserWrapper builder);
+
+    /*========================
+      =  SOAPFaultDetail     =
+      ======================== */
+
+    /**
+     * Detail eii under SOAPFault (parent)
+     *
+     * @param parent
+     * @return Returns SOAPFaultDetail.
+     */
+    public SOAPFaultDetail createSOAPFaultDetail(SOAPFault parent) throws SOAPProcessingException;
+
+    /**
+     * Role eii under SOAPFault (parent)
+     *
+     * @param parent
+     * @param builder
+     * @return Returns SOAPFaultDetail.
+     */
+    public SOAPFaultDetail createSOAPFaultDetail(SOAPFault parent,
+                                                 OMXMLParserWrapper builder);
+
+
+    /**
+     * Method getDefaultEnvelope
+     *
+     * @return Returns SOAPEnvelope.
+     */
+    public SOAPEnvelope getDefaultEnvelope() throws SOAPProcessingException;
+
+    public SOAPEnvelope getDefaultFaultEnvelope() throws SOAPProcessingException;
+    
+}
diff --git a/src/org/apache/ws/commons/soap/SOAPFault.java b/src/org/apache/ws/commons/soap/SOAPFault.java
new file mode 100644
index 0000000..9a3373c
--- /dev/null
+++ b/src/org/apache/ws/commons/soap/SOAPFault.java
@@ -0,0 +1,107 @@
+/*
+ * Copyright 2004,2005 The Apache Software Foundation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      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.
+ */
+
+package org.apache.ws.commons.soap;
+
+import org.apache.ws.commons.om.OMElement;
+import org.apache.ws.commons.om.OMException;
+
+
+/**
+ * An element in the <CODE>SOAPBody</CODE> object that contains
+ * error and/or status information. This information may relate to
+ * errors in the <CODE>OMMessage</CODE> object or to problems
+ * that are not related to the content in the message itself.
+ * Problems not related to the message itself are generally errors
+ * in processing, such as the inability to communicate with an
+ * upstream server.
+ * <P>
+ * The <CODE>SOAPFault</CODE> interface provides methods for
+ * retrieving the information contained in a <CODE>
+ * SOAPFault</CODE> object and for setting the fault code, the
+ * fault actor, and a string describing the fault. B fault code is
+ * one of the codes defined in the SOAP 1.1 specification that
+ * describe the fault. An actor is an intermediate recipient to
+ * whom a message was routed. The message path may include one or
+ * more actors, or, if no actors are specified, the message goes
+ * only to the default actor, which is the final intended
+ * recipient.
+ */
+public interface SOAPFault extends OMElement {
+
+    /**
+     * SOAPFaultCode is a mandatory item in a Fault, in SOAP 1.2 specification
+     *
+     * @param soapFaultCode
+     */
+    public void setCode(SOAPFaultCode soapFaultCode) throws SOAPProcessingException;
+
+    public SOAPFaultCode getCode();
+
+    /**
+     * SOAPFaultReason is a mandatory item in a Fault, in SOAP 1.2 specification
+     *
+     * @param reason
+     */
+    public void setReason(SOAPFaultReason reason) throws SOAPProcessingException;
+
+    public SOAPFaultReason getReason();
+
+    /**
+     * SOAPFaultNode is an optional item in a Fault, in SOAP 1.2 specification
+     *
+     * @param node
+     */
+    public void setNode(SOAPFaultNode node) throws SOAPProcessingException;
+
+    public SOAPFaultNode getNode();
+
+    /**
+     * SOAPFaultRoleImpl is an optional item in a Fault, in SOAP 1.2 specification
+     *
+     * @param role
+     */
+    public void setRole(SOAPFaultRole role) throws SOAPProcessingException;
+
+    public SOAPFaultRole getRole();
+
+    /**
+     * SOAPFaultRoleImpl is an optional item in a Fault, in SOAP 1.2 specification
+     *
+     * @param detail
+     */
+    public void setDetail(SOAPFaultDetail detail) throws SOAPProcessingException;
+
+    public SOAPFaultDetail getDetail();
+
+    /**
+     * Returns Exception if there is one in the SOAP fault.
+     * <p/>
+     * If the exception is like;
+     * <SOAPFault>
+     * <Detail>
+     * <Exception> stack trace goes here </Exception>
+     * </Detail>
+     * </SOAPFault>
+     *
+     * @return Returns Exception.
+     * @throws org.apache.ws.commons.om.OMException
+     *
+     */
+    public Exception getException() throws OMException;
+
+    public void setException(Exception e) throws OMException;
+}
diff --git a/src/org/apache/ws/commons/soap/SOAPFaultCode.java b/src/org/apache/ws/commons/soap/SOAPFaultCode.java
new file mode 100644
index 0000000..de8508d
--- /dev/null
+++ b/src/org/apache/ws/commons/soap/SOAPFaultCode.java
@@ -0,0 +1,46 @@
+/*
+ * Copyright 2004,2005 The Apache Software Foundation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      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.
+ */
+
+package org.apache.ws.commons.soap;
+
+import org.apache.ws.commons.om.OMElement;
+
+public interface SOAPFaultCode extends OMElement {
+    /**
+     * Eran Chinthaka (chinthaka@apache.org)
+     */
+
+    /**
+     * @param value
+     */
+    public void setValue(SOAPFaultValue value) throws SOAPProcessingException;
+
+    /**
+     * @return Returns SOAPFaultValue.
+     */
+    public SOAPFaultValue getValue();
+
+    /**
+     * @param value
+     */
+    public void setSubCode(SOAPFaultSubCode value) throws SOAPProcessingException;
+
+    /**
+     * @return Returns SOAPFaultSubCode.
+     */
+    public SOAPFaultSubCode getSubCode();
+
+}
diff --git a/src/org/apache/ws/commons/soap/SOAPFaultDetail.java b/src/org/apache/ws/commons/soap/SOAPFaultDetail.java
new file mode 100644
index 0000000..c5a5ab1
--- /dev/null
+++ b/src/org/apache/ws/commons/soap/SOAPFaultDetail.java
@@ -0,0 +1,42 @@
+/*
+ * Copyright 2004,2005 The Apache Software Foundation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      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.
+ */
+
+package org.apache.ws.commons.soap;
+
+import org.apache.ws.commons.om.OMElement;
+
+import java.util.Iterator;
+
+
+/**
+ * The Detail element information item is intended for carrying application
+ * specific error information related to the SOAP Body .
+ * <p/>
+ * The Detail element information item has:
+ * A [local name] of Detail .
+ * A [namespace name] of http://www.w3.org/2003/05/soap-envelope .
+ * Zero or more attribute information items in its [attributes] property.
+ * Zero or more child element information items in its [children] property.
+ */
+public interface SOAPFaultDetail extends OMElement {
+    /**
+     * Eran Chinthaka (chinthaka@apache.org)
+     */
+    public void addDetailEntry(OMElement detailElement);
+
+    public Iterator getAllDetailEntries();
+
+}
diff --git a/src/org/apache/ws/commons/soap/SOAPFaultNode.java b/src/org/apache/ws/commons/soap/SOAPFaultNode.java
new file mode 100644
index 0000000..f00aaa3
--- /dev/null
+++ b/src/org/apache/ws/commons/soap/SOAPFaultNode.java
@@ -0,0 +1,39 @@
+/*
+ * Copyright 2004,2005 The Apache Software Foundation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      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.
+ */
+
+package org.apache.ws.commons.soap;
+
+import org.apache.ws.commons.om.OMElement;
+
+public interface SOAPFaultNode extends OMElement {
+    /**
+     * Eran Chinthaka (chinthaka@apache.org)
+     */
+
+    /**
+     * each SOAP node is identified by a URI. The value of the Node element
+     * information item is the URI that identifies the SOAP node that generated
+     * the fault. SOAP nodes that do not act as the ultimate SOAP receiver MUST
+     * include this element information item. An ultimate SOAP receiver MAY
+     * include this element information item to indicate explicitly that it
+     * generated the fault.
+     *
+     * @param uri
+     */
+    public void setNodeValue(String uri);
+
+    public String getNodeValue();
+}
diff --git a/src/org/apache/ws/commons/soap/SOAPFaultReason.java b/src/org/apache/ws/commons/soap/SOAPFaultReason.java
new file mode 100644
index 0000000..f0a1155
--- /dev/null
+++ b/src/org/apache/ws/commons/soap/SOAPFaultReason.java
@@ -0,0 +1,29 @@
+/*
+ * Copyright 2004,2005 The Apache Software Foundation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      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.
+ */
+
+package org.apache.ws.commons.soap;
+
+import org.apache.ws.commons.om.OMElement;
+
+public interface SOAPFaultReason extends OMElement {
+    /**
+     * Eran Chinthaka (chinthaka@apache.org)
+     */
+
+    public void setSOAPText(SOAPFaultText soapFaultText) throws SOAPProcessingException;
+
+    public SOAPFaultText getSOAPText();
+}
diff --git a/src/org/apache/ws/commons/soap/SOAPFaultRole.java b/src/org/apache/ws/commons/soap/SOAPFaultRole.java
new file mode 100644
index 0000000..7eee7ef
--- /dev/null
+++ b/src/org/apache/ws/commons/soap/SOAPFaultRole.java
@@ -0,0 +1,44 @@
+/*
+ * Copyright 2004,2005 The Apache Software Foundation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      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.
+ */
+
+package org.apache.ws.commons.soap;
+
+import org.apache.ws.commons.om.OMElement;
+
+
+/**
+ * The Role element information item identifies the role the node was operating
+ * in at the point the fault occurred.
+ * <p/>
+ * The Role element information item has:
+ * A [local name] of Role .
+ * A [namespace name] of http://www.w3.org/2003/05/soap-envelope .
+ */
+public interface SOAPFaultRole extends OMElement {
+    /**
+     * Eran Chinthaka (chinthaka@apache.org)
+     */
+    
+    /**
+     * The value of the Role element information item MUST be one of the roles
+     * assumed by the node during processing of the message
+     *
+     * @param uri
+     */
+    public void setRoleValue(String uri);
+
+    public String getRoleValue();
+}
diff --git a/src/org/apache/ws/commons/soap/SOAPFaultSubCode.java b/src/org/apache/ws/commons/soap/SOAPFaultSubCode.java
new file mode 100644
index 0000000..c394b59
--- /dev/null
+++ b/src/org/apache/ws/commons/soap/SOAPFaultSubCode.java
@@ -0,0 +1,44 @@
+/*
+ * Copyright 2004,2005 The Apache Software Foundation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      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.
+ */
+
+package org.apache.ws.commons.soap;
+
+import org.apache.ws.commons.om.OMElement;
+
+public interface SOAPFaultSubCode extends OMElement {
+    /**
+     * Eran Chinthaka (chinthaka@apache.org)
+     */
+
+    /**
+     * Fault SubCode contain only one mandatory Value child. This value child contains a QName
+     *
+     * @param soapFaultSubCodeValue
+     */
+    public void setValue(SOAPFaultValue soapFaultSubCodeValue) throws SOAPProcessingException;
+
+    public SOAPFaultValue getValue();
+
+
+    /**
+     * Fault SubCode can contain an optional SubCode
+     *
+     * @param subCode
+     */
+    public void setSubCode(SOAPFaultSubCode subCode) throws SOAPProcessingException;
+
+    public SOAPFaultSubCode getSubCode();
+}
diff --git a/src/org/apache/ws/commons/soap/SOAPFaultText.java b/src/org/apache/ws/commons/soap/SOAPFaultText.java
new file mode 100644
index 0000000..4bfcec8
--- /dev/null
+++ b/src/org/apache/ws/commons/soap/SOAPFaultText.java
@@ -0,0 +1,38 @@
+/*
+ * Copyright 2004,2005 The Apache Software Foundation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      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.
+ */
+
+package org.apache.ws.commons.soap;
+
+import org.apache.ws.commons.om.OMElement;
+
+public interface SOAPFaultText extends OMElement {
+    /**
+     * Eran Chinthaka (chinthaka@apache.org)
+     */
+
+    /**
+     * lang is a mandatory attribute within the SOAPFaultText which must have
+     * SOAP12Constants.SOAP_FAULT_TEXT_LANG_ATTR_NS_URI as the namespace URI and
+     * SOAP12constants.SOAP_FAULT_TEXT_LANG_ATTR_NS_PREFIX or a capitalization thereof as the prefix
+     *
+     * @param lang
+     */
+    public void setLang(String lang);
+
+    public String getLang();
+
+
+}
diff --git a/src/org/apache/ws/commons/soap/SOAPFaultValue.java b/src/org/apache/ws/commons/soap/SOAPFaultValue.java
new file mode 100644
index 0000000..e769a61
--- /dev/null
+++ b/src/org/apache/ws/commons/soap/SOAPFaultValue.java
@@ -0,0 +1,25 @@
+/*
+ * Copyright 2004,2005 The Apache Software Foundation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      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.
+ */
+
+package org.apache.ws.commons.soap;
+
+import org.apache.ws.commons.om.OMElement;
+
+public interface SOAPFaultValue extends OMElement {
+    /**
+     * Eran Chinthaka (chinthaka@apache.org)
+     */
+}
diff --git a/src/org/apache/ws/commons/soap/SOAPHeader.java b/src/org/apache/ws/commons/soap/SOAPHeader.java
new file mode 100644
index 0000000..1ad45c0
--- /dev/null
+++ b/src/org/apache/ws/commons/soap/SOAPHeader.java
@@ -0,0 +1,128 @@
+/*
+ * Copyright 2004,2005 The Apache Software Foundation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      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.
+ */
+
+package org.apache.ws.commons.soap;
+
+import org.apache.ws.commons.om.OMElement;
+import org.apache.ws.commons.om.OMException;
+import org.apache.ws.commons.om.OMNamespace;
+
+import java.util.ArrayList;
+import java.util.Iterator;
+
+/**
+ * Interface SOAPHeader
+ */
+public interface SOAPHeader extends OMElement {
+    /**
+     * Creates a new <CODE>SOAPHeaderBlock</CODE> object initialized with the
+     * specified name and adds it to this <CODE>SOAPHeader</CODE> object.
+     *
+     * @param localName
+     * @param ns
+     * @return the new <CODE>SOAPHeaderBlock</CODE> object that was inserted
+     *         into this <CODE>SOAPHeader</CODE> object
+     * @throws org.apache.ws.commons.om.OMException
+     *             if a SOAP error occurs
+     */
+    public abstract SOAPHeaderBlock addHeaderBlock(String localName,
+            OMNamespace ns) throws OMException;
+
+    /**
+     * Returns a list of all the <CODE>SOAPHeaderBlock</CODE> objects in this
+     * <CODE>SOAPHeader</CODE> object that have the the specified role. An
+     * role is a global attribute that indicates the intermediate parties to
+     * whom the message should be sent. An role receives the message and then
+     * sends it to the next role. The default role is the ultimate intended
+     * recipient for the message, so if no role attribute is included in a
+     * <CODE>SOAPHeader</CODE> object, the message is sent to its ultimate
+     * destination.
+     *
+     * @param role
+     *            a <CODE>String</CODE> giving the URI of the role for which
+     *            to search
+     * @return Returns an <CODE>Iterator</CODE> object over all the <CODE>
+     *         SOAPHeaderBlock</CODE> objects that contain the specified role
+     * @see #extractHeaderBlocks(java.lang.String)
+     *      extractHeaderBlocks(java.lang.String)
+     */
+    public abstract Iterator examineHeaderBlocks(String role);
+
+    /**
+     * Returns a list of all the <CODE>SOAPHeaderBlock</CODE> objects in this
+     * <CODE>SOAPHeader</CODE> object that have the the specified role and
+     * detaches them from this <CODE>SOAPHeader</CODE> object.
+     * <P>
+     * This method allows an role to process only the parts of the <CODE>
+     * SOAPHeader</CODE> object that apply to it and to remove them before
+     * passing the message on to the next role.
+     *
+     * @param role
+     *            a <CODE>String</CODE> giving the URI of the role for which
+     *            to search
+     * @return Returns an <CODE>Iterator</CODE> object over all the <CODE>
+     *         SOAPHeaderBlock</CODE> objects that contain the specified role
+     * @see #examineHeaderBlocks(java.lang.String)
+     *      examineHeaderBlocks(java.lang.String)
+     */
+    public abstract Iterator extractHeaderBlocks(String role);
+
+    /**
+     * Returns an <code>Iterator</code> over all the
+     * <code>SOAPHeaderBlock</code> objects in this <code>SOAPHeader</code>
+     * object that have the specified role and that have a MustUnderstand
+     * attribute whose value is equivalent to <code>true</code>.
+     *
+     * @param role
+     *            a <code>String</code> giving the URI of the role for which
+     *            to search
+     * @return Returns an <code>Iterator</code> object over all the
+     *         <code>SOAPHeaderBlock</code> objects that contain the specified
+     *         role and are marked as MustUnderstand.
+     */
+    public abstract Iterator examineMustUnderstandHeaderBlocks(String role);
+
+    /**
+     * Returns an <code>Iterator</code> over all the
+     * <code>SOAPHeaderBlock</code> objects in this <code>SOAPHeader</code>
+     * object.
+     *
+     * @return an <code>Iterator</code> object over all the
+     *         <code>SOAPHeaderBlock</code> objects contained by this
+     *         <code>SOAPHeader</code>. If there are no header blocks then an
+     *         empty iterator is returned.
+     */
+    public abstract Iterator examineAllHeaderBlocks();
+
+    /**
+     * Returns an <code>Iterator</code> over all the
+     * <code>SOAPHeaderBlock</code> objects in this <code>SOAPHeader </code>
+     * object and detaches them from this <code>SOAPHeader</code> object.
+     *
+     * @return Returns an <code>Iterator</code> object over all the
+     *         <code>SOAPHeaderBlock</code> objects contained by this
+     *         <code>SOAPHeader</code>
+     */
+    public abstract Iterator extractAllHeaderBlocks();
+
+    /**
+     * Return all the Headers that has the Namespace URI to given NS URI.
+     *
+     * @param nsURI
+     * @return Returns ArrayList.
+     */
+    public ArrayList getHeaderBlocksWithNSURI(String nsURI);
+}
diff --git a/src/org/apache/ws/commons/soap/SOAPHeaderBlock.java b/src/org/apache/ws/commons/soap/SOAPHeaderBlock.java
new file mode 100644
index 0000000..e3368aa
--- /dev/null
+++ b/src/org/apache/ws/commons/soap/SOAPHeaderBlock.java
@@ -0,0 +1,89 @@
+/*
+ * Copyright 2004,2005 The Apache Software Foundation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      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.
+ */
+
+package org.apache.ws.commons.soap;
+
+import org.apache.ws.commons.om.OMElement;
+
+/**
+ * <P>An object representing the contents in the SOAP header part of the SOAP
+ * envelope. The immediate children of a <CODE> SOAPHeader</CODE> object can be
+ * represented only as <CODE> SOAPHeaderBlock</CODE> objects.</P> <P>B
+ * <CODE>SOAPHeaderBlock</CODE> object can have other <CODE>OMElement</CODE>
+ * objects as its children.</P>
+ */
+public interface SOAPHeaderBlock extends OMElement {
+    /**
+     * Sets the actor associated with this <CODE> SOAPHeaderBlock</CODE> object
+     * to the specified actor.
+     *
+     * @param roleURI a <CODE>String</CODE> giving the URI of the actor to set
+     * @throws java.lang.IllegalArgumentException
+     *          if there is a problem in setting the actor.
+     * @see #getRole() getRole()
+     */
+    public abstract void setRole(String roleURI);
+
+    /**
+     * Returns the uri of the actor associated with this <CODE>
+     * SOAPHeaderBlock</CODE> object.
+     *
+     * @return a <CODE>String</CODE> giving the URI of the actor
+     * @see #setRole(java.lang.String) setRole(java.lang.String)
+     */
+    public abstract String getRole();
+
+    /**
+     * Sets the mustUnderstand attribute for this <CODE> SOAPHeaderBlock</CODE>
+     * object to be on or off. <P>If the mustUnderstand attribute is on, the
+     * actor who receives the <CODE>SOAPHeaderBlock</CODE> must process it
+     * correctly. This ensures, for example, that if the <CODE>
+     * SOAPHeaderBlock</CODE> object modifies the message, that the message is
+     * being modified correctly.</P>
+     *
+     * @param mustUnderstand <CODE>true</CODE> to set the mustUnderstand
+     *                       attribute on; <CODE>false</CODE> to turn if off
+     * @throws java.lang.IllegalArgumentException
+     *          if there is a problem in setting the actor.
+     * @see #getMustUnderstand() getMustUnderstand()
+     */
+    public abstract void setMustUnderstand(boolean mustUnderstand);
+
+    public abstract void setMustUnderstand(String mustUnderstand) throws SOAPProcessingException;
+
+    /**
+     * Returns whether the mustUnderstand attribute for this
+     * <CODE>SOAPHeaderBlock</CODE> object is turned on.
+     *
+     * @return <CODE>true</CODE> if the mustUnderstand attribute of this
+     *         <CODE>SOAPHeaderBlock</CODE> object is turned on;
+     *         <CODE>false</CODE> otherwise
+     */
+    public abstract boolean getMustUnderstand() throws SOAPProcessingException;
+
+
+    public abstract boolean isProcessed();
+
+    /**
+     * We need to know whether all the mustUnderstand headers have been
+     * processed by the node. This will done by a specific validation handler at
+     * the end of the execution chain. For this all the handlers who process a
+     * particular header block must explicitly say that he processesd the header
+     * by calling setProcessed()
+     */
+    public abstract void setProcessed();
+
+}
diff --git a/src/org/apache/ws/commons/soap/SOAPMessage.java b/src/org/apache/ws/commons/soap/SOAPMessage.java
new file mode 100644
index 0000000..ba1b1ee
--- /dev/null
+++ b/src/org/apache/ws/commons/soap/SOAPMessage.java
@@ -0,0 +1,26 @@
+/*
+ * Copyright 2004,2005 The Apache Software Foundation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      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.
+ */
+
+package org.apache.ws.commons.soap;
+
+import org.apache.ws.commons.om.OMDocument;
+
+public interface SOAPMessage extends OMDocument {
+
+    public SOAPEnvelope getSOAPEnvelope() throws SOAPProcessingException;
+    public void setSOAPEnvelope(SOAPEnvelope envelope) throws SOAPProcessingException;
+
+}
diff --git a/src/org/apache/ws/commons/soap/SOAPProcessingException.java b/src/org/apache/ws/commons/soap/SOAPProcessingException.java
new file mode 100644
index 0000000..b7c06eb
--- /dev/null
+++ b/src/org/apache/ws/commons/soap/SOAPProcessingException.java
@@ -0,0 +1,64 @@
+/*
+ * Copyright 2004,2005 The Apache Software Foundation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      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.
+ */
+
+package org.apache.ws.commons.soap;
+
+import org.apache.ws.commons.om.OMException;
+
+public class SOAPProcessingException extends OMException {
+
+    private String soapFaultCode;
+
+    /**
+     * Eran Chinthaka (chinthaka@apache.org)
+     */
+    public SOAPProcessingException(String message) {
+        super(message);
+    }
+
+    public SOAPProcessingException(Throwable cause) {
+        super(cause);
+    }
+
+    /**
+     *
+     * @param messageText - this will appear as the Text in the Reason information item of SOAP Fault
+     * @param faultCode - this will appear as the Value in the Code information item of SOAP Fault
+     * @param cause - this will appear under the Detail information item of SOAP Fault
+     */
+    public SOAPProcessingException(String messageText, String faultCode, Throwable cause) {
+        super(messageText, cause);
+        this.soapFaultCode = faultCode;
+    }
+
+    /**
+     *
+     * @param messageText - this will appear as the Text in the Reason information item of SOAP Fault
+     * @param faultCode - this will appear as the Value in the Code information item of SOAP Fault
+     */
+    public SOAPProcessingException(String messageText, String faultCode) {
+        super(messageText);
+        this.soapFaultCode = faultCode;
+    }
+
+    public String getFaultCode() {
+        return soapFaultCode;
+    }
+
+    public void setFaultCode(String soapFaultCode) {
+        this.soapFaultCode = soapFaultCode;
+    }
+}
diff --git a/src/org/apache/ws/commons/soap/impl/llom/SOAPBodyImpl.java b/src/org/apache/ws/commons/soap/impl/llom/SOAPBodyImpl.java
new file mode 100644
index 0000000..3c249e0
--- /dev/null
+++ b/src/org/apache/ws/commons/soap/impl/llom/SOAPBodyImpl.java
@@ -0,0 +1,157 @@
+/*
+ * Copyright 2004,2005 The Apache Software Foundation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      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.
+ */
+
+package org.apache.ws.commons.soap.impl.llom;
+
+import org.apache.ws.commons.om.OMConstants;
+import org.apache.ws.commons.om.OMElement;
+import org.apache.ws.commons.om.OMException;
+import org.apache.ws.commons.om.OMNode;
+import org.apache.ws.commons.om.OMXMLParserWrapper;
+import org.apache.ws.commons.soap.SOAP11Constants;
+import org.apache.ws.commons.soap.SOAP12Constants;
+import org.apache.ws.commons.soap.SOAPBody;
+import org.apache.ws.commons.soap.SOAPConstants;
+import org.apache.ws.commons.soap.SOAPEnvelope;
+import org.apache.ws.commons.soap.SOAPFault;
+import org.apache.ws.commons.soap.SOAPProcessingException;
+
+/**
+ * Class SOAPBodyImpl
+ */
+public abstract class SOAPBodyImpl extends SOAPElement
+        implements SOAPBody, OMConstants {
+    /**
+     * Field hasSOAPFault
+     */
+    private boolean hasSOAPFault = false;
+
+    /**
+     * @param envelope
+     */
+    public SOAPBodyImpl(SOAPEnvelope envelope) throws SOAPProcessingException {
+        super(envelope, SOAPConstants.BODY_LOCAL_NAME, true);
+
+    }
+
+    /**
+     * Constructor SOAPBodyImpl
+     *
+     * @param envelope
+     * @param builder
+     */
+    public SOAPBodyImpl(SOAPEnvelope envelope, OMXMLParserWrapper builder) {
+        super(envelope, SOAPConstants.BODY_LOCAL_NAME, builder);
+    }
+
+    /**
+     * Creates a new <code>SOAPFault</code> object and adds it to
+     * this <code>SOAPBody</code> object.
+     *
+     * @param e
+     * @return the new <code>SOAPFault</code> object
+     * @throws org.apache.ws.commons.om.OMException
+     *                     if there is a SOAP error
+     * @throws OMException
+     */
+    public abstract SOAPFault addFault(Exception e) throws OMException;
+
+    /**
+     * Indicates whether a <code>SOAPFault</code> object exists in
+     * this <code>SOAPBody</code> object.
+     *
+     * @return <code>true</code> if a <code>SOAPFault</code> object exists in
+     *         this <code>SOAPBody</code> object; <code>false</code>
+     *         otherwise
+     */
+    public boolean hasFault() {
+        if (hasSOAPFault) {
+            return true;
+        } else {
+            OMElement element = getFirstElement();
+            if (element != null
+                    &&
+                    SOAPConstants.SOAPFAULT_LOCAL_NAME.equals(
+                            element.getLocalName())
+                    &&
+                    (SOAP11Constants.SOAP_ENVELOPE_NAMESPACE_URI.equals(
+                            element.getNamespace().getName())
+                    ||
+                    SOAP12Constants.SOAP_ENVELOPE_NAMESPACE_URI.equals(
+                            element.getNamespace().getName()))) {  //added this line
+                hasSOAPFault = true;
+                return true;
+            } else {
+                return false;
+            }
+        }
+    }
+
+    /**
+     * Returns the <code>SOAPFault</code> object in this <code>SOAPBody</code>
+     * object.
+     *
+     * @return the <code>SOAPFault</code> object in this <code>SOAPBody</code>
+     *         object
+     */
+    public SOAPFault getFault() {
+        OMElement element = getFirstElement();
+        if (hasSOAPFault) {
+            return (SOAPFault) element;
+        } else if (element != null
+                &&
+                SOAPConstants.SOAPFAULT_LOCAL_NAME.equals(
+                        element.getLocalName())
+                &&
+                (SOAP11Constants.SOAP_ENVELOPE_NAMESPACE_URI.equals(
+                        element.getNamespace().getName())
+                ||
+                SOAP12Constants.SOAP_ENVELOPE_NAMESPACE_URI.equals(
+                        element.getNamespace().getName()))) {     //added this line
+            hasSOAPFault = true;
+            return (SOAPFault) element;
+        } else {
+            return null;
+        }
+
+    }
+
+    /**
+     * @param soapFault
+     * @throws org.apache.ws.commons.om.OMException
+     *
+     * @throws OMException
+     */
+    public void addFault(SOAPFault soapFault) throws OMException {
+        if (hasSOAPFault) {
+            throw new OMException(
+                    "SOAP Body already has a SOAP Fault and there can not be more than one SOAP fault");
+        }
+        addChild(soapFault);
+        hasSOAPFault = true;
+    }
+
+    protected void checkParent(OMElement parent) throws SOAPProcessingException {
+        if (!(parent instanceof SOAPEnvelopeImpl)) {
+            throw new SOAPProcessingException(
+                    "Expecting an implementation of SOAP Envelope as the parent. But received some other implementation");
+        }
+    }
+
+    public OMNode detach() throws OMException {
+        throw new SOAPProcessingException("Can not detach SOAP Body, SOAP Envelope must have a Body !!");
+    }
+}
diff --git a/src/org/apache/ws/commons/soap/impl/llom/SOAPElement.java b/src/org/apache/ws/commons/soap/impl/llom/SOAPElement.java
new file mode 100644
index 0000000..0128018
--- /dev/null
+++ b/src/org/apache/ws/commons/soap/impl/llom/SOAPElement.java
@@ -0,0 +1,79 @@
+/*
+ * Copyright 2004,2005 The Apache Software Foundation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      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.
+ */
+
+package org.apache.ws.commons.soap.impl.llom;
+
+import org.apache.ws.commons.om.OMElement;
+import org.apache.ws.commons.om.OMNamespace;
+import org.apache.ws.commons.om.OMXMLParserWrapper;
+import org.apache.ws.commons.om.impl.llom.OMElementImpl;
+import org.apache.ws.commons.soap.SOAPProcessingException;
+
+public abstract class SOAPElement extends OMElementImpl {
+
+
+    /**
+     * @param parent
+     * @param localName
+     * @param extractNamespaceFromParent     
+     */
+    protected SOAPElement(OMElement parent,
+                          String localName,
+                          boolean extractNamespaceFromParent) throws SOAPProcessingException {
+        super(localName, null, parent);
+        if (parent == null) {
+            throw new SOAPProcessingException(
+                    " Can not create " + localName +
+                    " element without a parent !!");
+        }
+        checkParent(parent);
+
+        if (extractNamespaceFromParent) {
+            this.ns = parent.getNamespace();
+        }
+        this.localName = localName;
+    }
+
+
+    protected SOAPElement(OMElement parent,
+                          String localName,
+                          OMXMLParserWrapper builder) {
+        super(localName, null, parent, builder);
+    }
+
+    /**
+     * Caution : This Constructor is meant to be used only by the SOAPEnvelope.
+     * <p/>
+     * Reasons : This can be used to create a SOAP Element programmatically. But we need to make sure that the user
+     * always passes a parent for the element being created. But SOAP Envelope has no parent.
+     *
+     * @param localName
+     * @param ns
+     */
+    protected SOAPElement(String localName, OMNamespace ns) {
+        super(localName, ns);
+
+    }
+
+    /**
+     * This has to be implemented by all the derived classes to check for the correct parent.
+     */
+    protected abstract void checkParent(OMElement parent) throws SOAPProcessingException;
+
+
+    
+
+}
diff --git a/src/org/apache/ws/commons/soap/impl/llom/SOAPEnvelopeImpl.java b/src/org/apache/ws/commons/soap/impl/llom/SOAPEnvelopeImpl.java
new file mode 100644
index 0000000..b2ae015
--- /dev/null
+++ b/src/org/apache/ws/commons/soap/impl/llom/SOAPEnvelopeImpl.java
@@ -0,0 +1,166 @@
+/*
+ * Copyright 2004,2005 The Apache Software Foundation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      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.
+ */
+
+package org.apache.ws.commons.soap.impl.llom;
+
+import org.apache.ws.commons.om.OMAbstractFactory;
+import org.apache.ws.commons.om.OMConstants;
+import org.apache.ws.commons.om.OMElement;
+import org.apache.ws.commons.om.OMException;
+import org.apache.ws.commons.om.OMNamespace;
+import org.apache.ws.commons.om.OMNode;
+import org.apache.ws.commons.om.OMXMLParserWrapper;
+import org.apache.ws.commons.om.impl.OMOutputImpl;
+import org.apache.ws.commons.soap.SOAP11Constants;
+import org.apache.ws.commons.soap.SOAP12Constants;
+import org.apache.ws.commons.soap.SOAPBody;
+import org.apache.ws.commons.soap.SOAPConstants;
+import org.apache.ws.commons.soap.SOAPEnvelope;
+import org.apache.ws.commons.soap.SOAPFactory;
+import org.apache.ws.commons.soap.SOAPHeader;
+import org.apache.ws.commons.soap.SOAPProcessingException;
+import org.apache.ws.commons.soap.impl.llom.factory.SOAPLinkedListImplFactory;
+
+import javax.xml.namespace.QName;
+import javax.xml.stream.XMLStreamException;
+
+/**
+ * Class SOAPEnvelopeImpl
+ */
+public class SOAPEnvelopeImpl extends SOAPElement
+        implements SOAPEnvelope, OMConstants {
+    SOAPFactory factory;
+
+    /**
+     * @param builder
+     */
+    public SOAPEnvelopeImpl(OMXMLParserWrapper builder, SOAPFactory factory) {
+        super(null, SOAPConstants.SOAPENVELOPE_LOCAL_NAME, builder);
+        this.factory = factory;
+    }
+
+    /**
+     * @param ns
+     */
+    public SOAPEnvelopeImpl(OMNamespace ns, SOAPFactory factory) {
+        super(SOAPConstants.SOAPENVELOPE_LOCAL_NAME, ns);
+        this.factory = factory;
+    }
+
+    /**
+     * Returns the <CODE>SOAPHeader</CODE> object for this <CODE>
+     * SOAPEnvelope</CODE> object. <P> This SOAPHeader will just be a container
+     * for all the headers in the <CODE>OMMessage</CODE> </P>
+     *
+     * @return the <CODE>SOAPHeader</CODE> object or <CODE> null</CODE> if there
+     *         is none
+     * @throws org.apache.ws.commons.om.OMException
+     *                     if there is a problem obtaining
+     *                     the <CODE>SOAPHeader</CODE>
+     *                     object
+     * @throws OMException
+     */
+    public SOAPHeader getHeader() throws OMException {
+        SOAPHeader header =
+                (SOAPHeader) getFirstChildWithName(
+                        new QName(SOAPConstants.HEADER_LOCAL_NAME));
+        if (builder == null && header == null) {
+            inferFactory();
+            header = factory.createSOAPHeader(this);
+            addChild(header);
+        }
+        return header;
+    }
+
+    private void inferFactory() {
+        if (factory instanceof SOAPLinkedListImplFactory && ns != null) {
+            if (SOAP12Constants.SOAP_ENVELOPE_NAMESPACE_URI.equals(ns.getName())) {
+                factory = OMAbstractFactory.getSOAP12Factory();
+            } else if (SOAP11Constants.SOAP_ENVELOPE_NAMESPACE_URI.equals(ns.getName())) {
+                factory = OMAbstractFactory.getSOAP11Factory();
+            }
+        }
+    }
+
+    public void addChild(OMNode child) {
+        if ((child instanceof OMElement) && !(child instanceof SOAPHeader || child instanceof SOAPBody)) {
+            throw new SOAPProcessingException("SOAP Envelope can not have children other than SOAP Header and Body", SOAP12Constants.FAULT_CODE_SENDER);
+        } else {
+            super.addChild(child);
+        }
+    }
+
+    /**
+     * Returns the <CODE>SOAPBody</CODE> object associated with this
+     * <CODE>SOAPEnvelope</CODE> object. <P> This SOAPBody will just be a
+     * container for all the BodyElements in the <CODE>OMMessage</CODE> </P>
+     *
+     * @return the <CODE>SOAPBody</CODE> object for this <CODE>
+     *         SOAPEnvelope</CODE> object or <CODE>null</CODE> if there is none
+     * @throws org.apache.ws.commons.om.OMException
+     *                     if there is a problem obtaining
+     *                     the <CODE>SOAPBody</CODE> object
+     * @throws OMException
+     */
+    public SOAPBody getBody() throws OMException {
+        //check for the first element
+        OMElement element = getFirstElement();
+        if (element != null) {
+            if (SOAPConstants.BODY_LOCAL_NAME.equals(element.getLocalName())) {
+                return (SOAPBody) element;
+            } else {      // if not second element SHOULD be the body
+                OMNode node = element.getNextOMSibling();
+                while (node != null && node.getType() != OMNode.ELEMENT_NODE) {
+                    node = node.getNextOMSibling();
+                }
+                element = (OMElement) node;
+
+                if (node != null &&
+                        SOAPConstants.BODY_LOCAL_NAME.equals(element.getLocalName())) {
+                    return (SOAPBody) element;
+                } else {
+                    throw new OMException("SOAPEnvelope must contain a body element which is either first or second child element of the SOAPEnvelope.");
+                }
+            }
+        }
+        return null;
+    }
+
+    /**
+     * Method detach
+     *
+     * @throws OMException
+     */
+    public OMNode detach() throws OMException {
+        throw new OMException("Root Element can not be detached");
+    }
+
+    protected void checkParent(OMElement parent) throws SOAPProcessingException {
+        // here do nothing as SOAPEnvelope doesn't have a parent !!!
+    }
+
+    protected void serialize(OMOutputImpl omOutput, boolean cache) throws XMLStreamException {
+
+        if (!omOutput.isIgnoreXMLDeclaration()) {
+            String charSetEncoding = omOutput.getCharSetEncoding();
+            String xmlVersion = omOutput.getXmlVersion();
+            omOutput.getXmlStreamWriter().writeStartDocument(charSetEncoding == null ?
+                    OMConstants.DEFAULT_CHAR_SET_ENCODING : charSetEncoding,
+                    xmlVersion == null ? OMConstants.DEFAULT_XML_VERSION : xmlVersion);
+        }
+        super.serialize(omOutput, cache);
+    }
+}
diff --git a/src/org/apache/ws/commons/soap/impl/llom/SOAPFaultCodeImpl.java b/src/org/apache/ws/commons/soap/impl/llom/SOAPFaultCodeImpl.java
new file mode 100644
index 0000000..c2a77cc
--- /dev/null
+++ b/src/org/apache/ws/commons/soap/impl/llom/SOAPFaultCodeImpl.java
@@ -0,0 +1,121 @@
+/*
+ * Copyright 2004,2005 The Apache Software Foundation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      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.
+ */
+
+package org.apache.ws.commons.soap.impl.llom;
+
+import org.apache.ws.commons.om.OMXMLParserWrapper;
+import org.apache.ws.commons.om.impl.OMNodeEx;
+import org.apache.ws.commons.om.impl.OMOutputImpl;
+import org.apache.ws.commons.om.impl.llom.OMSerializerUtil;
+import org.apache.ws.commons.om.impl.llom.serialize.StreamWriterToContentHandlerConverter;
+import org.apache.ws.commons.om.util.ElementHelper;
+import org.apache.ws.commons.soap.SOAP12Constants;
+import org.apache.ws.commons.soap.SOAPFault;
+import org.apache.ws.commons.soap.SOAPFaultCode;
+import org.apache.ws.commons.soap.SOAPFaultSubCode;
+import org.apache.ws.commons.soap.SOAPFaultValue;
+import org.apache.ws.commons.soap.SOAPProcessingException;
+
+import javax.xml.stream.XMLStreamException;
+
+public abstract class SOAPFaultCodeImpl extends SOAPElement implements SOAPFaultCode {
+
+
+    /**
+     * Constructor OMElementImpl
+     *
+     * @param parent
+     * @param builder
+     */
+    public SOAPFaultCodeImpl(SOAPFault parent, OMXMLParserWrapper builder) {
+        super(parent, SOAP12Constants.SOAP_FAULT_CODE_LOCAL_NAME, builder);
+    }
+
+    /**
+     * @param parent
+     */
+    public SOAPFaultCodeImpl(SOAPFault parent,
+                             boolean extractNamespaceFromParent) throws SOAPProcessingException {
+        super(parent,
+                SOAP12Constants.SOAP_FAULT_CODE_LOCAL_NAME,
+                extractNamespaceFromParent);
+    }
+
+    /**
+     * Eran Chinthaka (chinthaka@apache.org)
+     */
+    public void setValue(SOAPFaultValue value) throws SOAPProcessingException {
+        ElementHelper.setNewElement(this, value, value);
+    }
+
+    public SOAPFaultValue getValue() {
+        return (SOAPFaultValue) ElementHelper.getChildWithName(this,
+                SOAP12Constants.SOAP_FAULT_VALUE_LOCAL_NAME);
+    }
+
+    public void setSubCode(SOAPFaultSubCode value) throws SOAPProcessingException {
+        ElementHelper.setNewElement(this, getSubCode(), value);
+    }
+
+    public SOAPFaultSubCode getSubCode() {
+        return (SOAPFaultSubCode) ElementHelper.getChildWithName(this,
+                SOAP12Constants.SOAP_FAULT_SUB_CODE_LOCAL_NAME);
+    }
+
+    protected void serialize(OMOutputImpl omOutput, boolean cache) throws XMLStreamException {
+        // select the builder
+        short builderType = PULL_TYPE_BUILDER;    // default is pull type
+        if (builder != null) {
+            builderType = this.builder.getBuilderType();
+        }
+        if ((builderType == PUSH_TYPE_BUILDER)
+                && (builder.getRegisteredContentHandler() == null)) {
+            builder.registerExternalContentHandler(new StreamWriterToContentHandlerConverter(omOutput));
+        }
+
+
+        if (!cache) {
+            //No caching
+            if (this.firstChild != null) {
+                OMSerializerUtil.serializeStartpart(this, omOutput);
+                ((OMNodeEx)firstChild).serializeAndConsume(omOutput);
+                OMSerializerUtil.serializeEndpart(omOutput);
+            } else if (!this.done) {
+                if (builderType == PULL_TYPE_BUILDER) {
+                    OMSerializerUtil.serializeByPullStream(this, omOutput);
+                } else {
+                    OMSerializerUtil.serializeStartpart(this, omOutput);
+                    builder.setCache(cache);
+                    builder.next();
+                    OMSerializerUtil.serializeEndpart(omOutput);
+                }
+            } else {
+                OMSerializerUtil.serializeNormal(this, omOutput, cache);
+            }
+            // do not serialise the siblings
+
+
+        } else {
+            //Cached
+            OMSerializerUtil.serializeNormal(this, omOutput, cache);
+
+            // do not serialise the siblings
+        }
+
+
+    }
+
+}
diff --git a/src/org/apache/ws/commons/soap/impl/llom/SOAPFaultDetailImpl.java b/src/org/apache/ws/commons/soap/impl/llom/SOAPFaultDetailImpl.java
new file mode 100644
index 0000000..9f273ac
--- /dev/null
+++ b/src/org/apache/ws/commons/soap/impl/llom/SOAPFaultDetailImpl.java
@@ -0,0 +1,97 @@
+/*
+ * Copyright 2004,2005 The Apache Software Foundation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      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.
+ */
+
+package org.apache.ws.commons.soap.impl.llom;
+
+import org.apache.ws.commons.om.OMElement;
+import org.apache.ws.commons.om.OMXMLParserWrapper;
+import org.apache.ws.commons.om.impl.OMNodeEx;
+import org.apache.ws.commons.om.impl.llom.OMSerializerUtil;
+import org.apache.ws.commons.om.impl.llom.serialize.StreamWriterToContentHandlerConverter;
+import org.apache.ws.commons.soap.SOAP12Constants;
+import org.apache.ws.commons.soap.SOAPFault;
+import org.apache.ws.commons.soap.SOAPFaultDetail;
+import org.apache.ws.commons.soap.SOAPProcessingException;
+
+import javax.xml.stream.XMLStreamException;
+import java.util.Iterator;
+
+public abstract class SOAPFaultDetailImpl extends SOAPElement implements SOAPFaultDetail {
+
+    protected SOAPFaultDetailImpl(SOAPFault parent,
+                                  boolean extractNamespaceFromParent) throws SOAPProcessingException {
+        super(parent,
+                SOAP12Constants.SOAP_FAULT_DETAIL_LOCAL_NAME,
+                extractNamespaceFromParent);
+    }
+
+    protected SOAPFaultDetailImpl(SOAPFault parent,
+                                  OMXMLParserWrapper builder) {
+        super(parent, SOAP12Constants.SOAP_FAULT_DETAIL_LOCAL_NAME, builder);
+    }
+
+    public void addDetailEntry(OMElement detailElement) {
+        this.addChild(detailElement);
+    }
+
+    public Iterator getAllDetailEntries() {
+        return this.getChildren();
+    }
+
+    protected void serialize(org.apache.ws.commons.om.impl.OMOutputImpl omOutput, boolean cache) throws XMLStreamException {
+        // select the builder
+        short builderType = PULL_TYPE_BUILDER;    // default is pull type
+        if (builder != null) {
+            builderType = this.builder.getBuilderType();
+        }
+        if ((builderType == PUSH_TYPE_BUILDER)
+                && (builder.getRegisteredContentHandler() == null)) {
+            builder.registerExternalContentHandler(new StreamWriterToContentHandlerConverter(omOutput));
+        }
+
+
+        if (!cache) {
+            //No caching
+            if (this.firstChild != null) {
+                OMSerializerUtil.serializeStartpart(this, omOutput);
+                ((OMNodeEx)firstChild).serializeAndConsume(omOutput);
+                OMSerializerUtil.serializeEndpart(omOutput);
+            } else if (!this.done) {
+                if (builderType == PULL_TYPE_BUILDER) {
+                    OMSerializerUtil.serializeByPullStream(this, omOutput);
+                } else {
+                    OMSerializerUtil.serializeStartpart(this, omOutput);
+                    builder.setCache(cache);
+                    builder.next();
+                    OMSerializerUtil.serializeEndpart(omOutput);
+                }
+            } else {
+                OMSerializerUtil.serializeNormal(this, omOutput, cache);
+            }
+            // do not serialise the siblings
+
+
+        } else {
+            //Cached
+            OMSerializerUtil.serializeNormal(this, omOutput, cache);
+
+            // do not serialise the siblings
+        }
+
+
+    }
+
+}
diff --git a/src/org/apache/ws/commons/soap/impl/llom/SOAPFaultImpl.java b/src/org/apache/ws/commons/soap/impl/llom/SOAPFaultImpl.java
new file mode 100644
index 0000000..5ee20ec
--- /dev/null
+++ b/src/org/apache/ws/commons/soap/impl/llom/SOAPFaultImpl.java
@@ -0,0 +1,236 @@
+/*
+ * Copyright 2004,2005 The Apache Software Foundation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      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.
+ */
+
+package org.apache.ws.commons.soap.impl.llom;
+
+import org.apache.ws.commons.om.OMConstants;
+import org.apache.ws.commons.om.OMElement;
+import org.apache.ws.commons.om.OMException;
+import org.apache.ws.commons.om.OMNode;
+import org.apache.ws.commons.om.OMXMLParserWrapper;
+import org.apache.ws.commons.om.impl.OMNodeEx;
+import org.apache.ws.commons.om.impl.llom.OMElementImpl;
+import org.apache.ws.commons.om.impl.llom.OMSerializerUtil;
+import org.apache.ws.commons.om.impl.llom.serialize.StreamWriterToContentHandlerConverter;
+import org.apache.ws.commons.soap.SOAP12Constants;
+import org.apache.ws.commons.soap.SOAPBody;
+import org.apache.ws.commons.soap.SOAPConstants;
+import org.apache.ws.commons.soap.SOAPFault;
+import org.apache.ws.commons.soap.SOAPFaultCode;
+import org.apache.ws.commons.soap.SOAPFaultDetail;
+import org.apache.ws.commons.soap.SOAPFaultNode;
+import org.apache.ws.commons.soap.SOAPFaultReason;
+import org.apache.ws.commons.soap.SOAPFaultRole;
+import org.apache.ws.commons.soap.SOAPProcessingException;
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+
+import javax.xml.namespace.QName;
+import javax.xml.stream.XMLStreamException;
+import java.io.PrintWriter;
+import java.io.StringWriter;
+import java.util.Iterator;
+
+/**
+ * Class SOAPFaultImpl
+ */
+public abstract class SOAPFaultImpl extends SOAPElement
+        implements SOAPFault, OMConstants {
+
+    protected Exception e;
+   private Log log = LogFactory.getLog(getClass());
+
+    /**
+     * Constructor SOAPFaultImpl
+     *
+     * @param parent
+     * @param e
+     */
+    public SOAPFaultImpl(SOAPBody parent, Exception e) throws SOAPProcessingException {
+        super(parent, SOAPConstants.SOAPFAULT_LOCAL_NAME, true);
+        setException(e);
+    }
+
+    public void setException(Exception e) {
+        this.e = e;
+        putExceptionToSOAPFault(e);
+    }
+
+    public SOAPFaultImpl(SOAPBody parent) throws SOAPProcessingException {
+        super(parent, SOAPConstants.SOAPFAULT_LOCAL_NAME, true);
+    }
+
+    /**
+     * Constructor SOAPFaultImpl
+     *
+     * @param parent
+     * @param builder
+     */
+    public SOAPFaultImpl(SOAPBody parent, OMXMLParserWrapper builder) {
+        super(parent, SOAPConstants.SOAPFAULT_LOCAL_NAME, builder);
+    }
+
+
+    protected abstract SOAPFaultDetail getNewSOAPFaultDetail(SOAPFault fault) throws SOAPProcessingException;
+
+    // --------------- Getters and Settors --------------------------- //
+
+    public void setCode(SOAPFaultCode soapFaultCode) throws SOAPProcessingException {
+        setNewElement(getCode(), soapFaultCode);
+    }
+
+    public SOAPFaultCode getCode() {
+        return (SOAPFaultCode) this.getChildWithName(
+                SOAP12Constants.SOAP_FAULT_CODE_LOCAL_NAME);
+    }
+
+    public void setReason(SOAPFaultReason reason) throws SOAPProcessingException {
+        setNewElement(getReason(), reason);
+    }
+
+    public SOAPFaultReason getReason() {
+        return (SOAPFaultReason) this.getChildWithName(
+                SOAP12Constants.SOAP_FAULT_REASON_LOCAL_NAME);
+    }
+
+    public void setNode(SOAPFaultNode node) throws SOAPProcessingException {
+        setNewElement(getNode(), node);
+    }
+
+    public SOAPFaultNode getNode() {
+        return (SOAPFaultNode) this.getChildWithName(
+                SOAP12Constants.SOAP_FAULT_NODE_LOCAL_NAME);
+    }
+
+    public void setRole(SOAPFaultRole role) throws SOAPProcessingException {
+        setNewElement(getRole(), role);
+    }
+
+    public SOAPFaultRole getRole() {
+        return (SOAPFaultRoleImpl) this.getChildWithName(
+                SOAP12Constants.SOAP_FAULT_ROLE_LOCAL_NAME);
+    }
+
+    public void setDetail(SOAPFaultDetail detail) throws SOAPProcessingException {
+        setNewElement(getDetail(), detail);
+    }
+
+    public SOAPFaultDetail getDetail() {
+        return (SOAPFaultDetail) this.getChildWithName(
+                SOAP12Constants.SOAP_FAULT_DETAIL_LOCAL_NAME);
+    }
+
+    /**
+     * If exception detailElement is not there we will return null
+     */
+    public Exception getException() throws OMException {
+        SOAPFaultDetail detail = getDetail();
+        if (detail == null) {
+            return null;
+        }
+
+        OMElement exceptionElement = getDetail().getFirstChildWithName(
+                new QName(SOAPConstants.SOAP_FAULT_DETAIL_EXCEPTION_ENTRY));
+        if (exceptionElement != null && exceptionElement.getText() != null) {
+            return new Exception(exceptionElement.getText());
+        }
+        return null;
+    }
+
+    protected void putExceptionToSOAPFault(Exception e) throws SOAPProcessingException {
+        StringWriter sw = new StringWriter();
+        e.printStackTrace(new PrintWriter(sw));
+        sw.flush();
+        getDetail();
+        if (getDetail() == null) {
+            setDetail(getNewSOAPFaultDetail(this));
+
+        }
+        OMElement faultDetailEnty = new OMElementImpl(
+                SOAPConstants.SOAP_FAULT_DETAIL_EXCEPTION_ENTRY,
+                this.getNamespace());
+        faultDetailEnty.setText(sw.getBuffer().toString());
+        getDetail().addChild(faultDetailEnty);
+    }
+
+    protected void setNewElement(OMElement myElement, OMElement newElement) {
+        if (myElement != null) {
+            myElement.discard();
+        }
+        if (newElement != null && newElement.getParent() != null) {
+            newElement.discard();
+        }
+        this.addChild(newElement);
+        myElement = newElement;
+    }
+
+    protected OMElement getChildWithName(String childName) {
+        Iterator childrenIter = getChildren();
+        while (childrenIter.hasNext()) {
+            OMNode node = (OMNode) childrenIter.next();
+            if (node.getType() == OMNode.ELEMENT_NODE &&
+                    childName.equals(((OMElement) node).getLocalName())) {
+                return (OMElement) node;
+            }
+        }
+        return null;
+    }
+
+    protected void serialize(org.apache.ws.commons.om.impl.OMOutputImpl omOutput, boolean cache) throws XMLStreamException {
+        // select the builder
+        short builderType = PULL_TYPE_BUILDER;    // default is pull type
+        if (builder != null) {
+            builderType = this.builder.getBuilderType();
+        }
+        if ((builderType == PUSH_TYPE_BUILDER)
+                && (builder.getRegisteredContentHandler() == null)) {
+            builder.registerExternalContentHandler(new StreamWriterToContentHandlerConverter(omOutput));
+        }
+
+
+        // this is a special case. This fault element may contain its children in any order. But spec mandates a specific order
+        // the overriding of the method will facilitate that. Not sure this is the best method to do this :(
+        build();
+
+        OMSerializerUtil.serializeStartpart(this, omOutput);
+        SOAPFaultCode faultCode = getCode();
+        if (faultCode != null) {
+            ((OMNodeEx)faultCode).serialize(omOutput);
+        }
+        SOAPFaultReason faultReason = getReason();
+        if (faultReason != null) {
+            ((OMNodeEx)faultReason).serialize(omOutput);
+        }
+
+        serializeFaultNode(omOutput);
+
+        SOAPFaultRole faultRole = getRole();
+        if (faultRole != null) {
+            ((OMNodeEx)faultRole).serialize(omOutput);
+        }
+
+        SOAPFaultDetail faultDetail = getDetail();
+        if (faultDetail != null) {
+            ((OMNodeEx)faultDetail).serialize(omOutput);
+        }
+
+        OMSerializerUtil.serializeEndpart(omOutput);
+    }
+
+    protected abstract void serializeFaultNode(org.apache.ws.commons.om.impl.OMOutputImpl omOutput) throws XMLStreamException;
+        
+
+}
diff --git a/src/org/apache/ws/commons/soap/impl/llom/SOAPFaultNodeImpl.java b/src/org/apache/ws/commons/soap/impl/llom/SOAPFaultNodeImpl.java
new file mode 100644
index 0000000..554c2cd
--- /dev/null
+++ b/src/org/apache/ws/commons/soap/impl/llom/SOAPFaultNodeImpl.java
@@ -0,0 +1,91 @@
+/*
+ * Copyright 2004,2005 The Apache Software Foundation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      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.
+ */
+
+package org.apache.ws.commons.soap.impl.llom;
+
+import org.apache.ws.commons.om.OMXMLParserWrapper;
+import org.apache.ws.commons.om.impl.OMNodeEx;
+import org.apache.ws.commons.om.impl.llom.OMSerializerUtil;
+import org.apache.ws.commons.om.impl.llom.serialize.StreamWriterToContentHandlerConverter;
+import org.apache.ws.commons.soap.SOAP12Constants;
+import org.apache.ws.commons.soap.SOAPFault;
+import org.apache.ws.commons.soap.SOAPFaultNode;
+import org.apache.ws.commons.soap.SOAPProcessingException;
+
+import javax.xml.stream.XMLStreamException;
+
+public abstract class SOAPFaultNodeImpl extends SOAPElement implements SOAPFaultNode {
+
+    public SOAPFaultNodeImpl(SOAPFault parent) throws SOAPProcessingException {
+        super(parent, SOAP12Constants.SOAP_FAULT_NODE_LOCAL_NAME, true);
+    }
+
+    public SOAPFaultNodeImpl(SOAPFault parent, OMXMLParserWrapper builder) {
+        super(parent, SOAP12Constants.SOAP_FAULT_NODE_LOCAL_NAME, builder);
+    }
+
+    public void setNodeValue(String uri) {
+        this.setText(uri);
+    }
+
+    public String getNodeValue() {
+        return this.getText();
+    }
+
+    protected void serialize(org.apache.ws.commons.om.impl.OMOutputImpl omOutput, boolean cache) throws XMLStreamException {
+            // select the builder
+            short builderType = PULL_TYPE_BUILDER;    // default is pull type
+            if (builder != null) {
+                builderType = this.builder.getBuilderType();
+            }
+            if ((builderType == PUSH_TYPE_BUILDER)
+                    && (builder.getRegisteredContentHandler() == null)) {
+                builder.registerExternalContentHandler(new StreamWriterToContentHandlerConverter(omOutput));
+            }
+
+
+            if (!cache) {
+                //No caching
+                if (this.firstChild != null) {
+                    OMSerializerUtil.serializeStartpart(this, omOutput);
+                    ((OMNodeEx)firstChild).serializeAndConsume(omOutput);
+                    OMSerializerUtil.serializeEndpart(omOutput);
+                } else if (!this.done) {
+                    if (builderType == PULL_TYPE_BUILDER) {
+                        OMSerializerUtil.serializeByPullStream(this, omOutput);
+                    } else {
+                        OMSerializerUtil.serializeStartpart(this, omOutput);
+                        builder.setCache(cache);
+                        builder.next();
+                        OMSerializerUtil.serializeEndpart(omOutput);
+                    }
+                } else {
+                    OMSerializerUtil.serializeNormal(this, omOutput, cache);
+                }
+                // do not serialise the siblings
+
+
+            } else {
+                //Cached
+                OMSerializerUtil.serializeNormal(this, omOutput, cache);
+
+                // do not serialise the siblings
+            }
+
+
+        }
+    
+}
diff --git a/src/org/apache/ws/commons/soap/impl/llom/SOAPFaultReasonImpl.java b/src/org/apache/ws/commons/soap/impl/llom/SOAPFaultReasonImpl.java
new file mode 100644
index 0000000..f429a6e
--- /dev/null
+++ b/src/org/apache/ws/commons/soap/impl/llom/SOAPFaultReasonImpl.java
@@ -0,0 +1,111 @@
+/*
+ * Copyright 2004,2005 The Apache Software Foundation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      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.
+ */
+
+package org.apache.ws.commons.soap.impl.llom;
+
+import org.apache.ws.commons.om.OMElement;
+import org.apache.ws.commons.om.OMXMLParserWrapper;
+import org.apache.ws.commons.om.impl.OMNodeEx;
+import org.apache.ws.commons.om.impl.llom.OMSerializerUtil;
+import org.apache.ws.commons.om.impl.llom.serialize.StreamWriterToContentHandlerConverter;
+import org.apache.ws.commons.om.util.ElementHelper;
+import org.apache.ws.commons.soap.SOAP12Constants;
+import org.apache.ws.commons.soap.SOAPFault;
+import org.apache.ws.commons.soap.SOAPFaultReason;
+import org.apache.ws.commons.soap.SOAPFaultText;
+import org.apache.ws.commons.soap.SOAPProcessingException;
+
+import javax.xml.stream.XMLStreamException;
+
+public abstract class SOAPFaultReasonImpl extends SOAPElement implements SOAPFaultReason {
+    protected SOAPFaultText text;
+
+    /**
+     * Constructor OMElementImpl
+     *
+     * @param parent
+     * @param builder
+     */
+    public SOAPFaultReasonImpl(SOAPFault parent, OMXMLParserWrapper builder) {
+        super(parent, SOAP12Constants.SOAP_FAULT_REASON_LOCAL_NAME, builder);
+    }
+
+    /**
+     * @param parent
+     */
+    public SOAPFaultReasonImpl(OMElement parent,
+                               boolean extractNamespaceFromParent) throws SOAPProcessingException {
+        super(parent,
+                SOAP12Constants.SOAP_FAULT_REASON_LOCAL_NAME,
+                extractNamespaceFromParent);
+    }
+
+    /**
+     * Eran Chinthaka (chinthaka@apache.org)
+     */
+    public void setSOAPText(SOAPFaultText soapFaultText) throws SOAPProcessingException {
+        ElementHelper.setNewElement(this, text, soapFaultText);
+    }
+
+    public SOAPFaultText getSOAPText() {
+        return (SOAPFaultText) ElementHelper.getChildWithName(this,
+                SOAP12Constants.SOAP_FAULT_TEXT_LOCAL_NAME);
+    }
+
+    protected void serialize(org.apache.ws.commons.om.impl.OMOutputImpl omOutput, boolean cache) throws XMLStreamException {
+        // select the builder
+        short builderType = PULL_TYPE_BUILDER;    // default is pull type
+        if (builder != null) {
+            builderType = this.builder.getBuilderType();
+        }
+        if ((builderType == PUSH_TYPE_BUILDER)
+                && (builder.getRegisteredContentHandler() == null)) {
+            builder.registerExternalContentHandler(new StreamWriterToContentHandlerConverter(omOutput));
+        }
+
+
+        if (!cache) {
+            //No caching
+            if (this.firstChild != null) {
+                OMSerializerUtil.serializeStartpart(this, omOutput);
+                ((OMNodeEx)firstChild).serializeAndConsume(omOutput);
+                OMSerializerUtil.serializeEndpart(omOutput);
+            } else if (!this.done) {
+                if (builderType == PULL_TYPE_BUILDER) {
+                    OMSerializerUtil.serializeByPullStream(this, omOutput);
+                } else {
+                    OMSerializerUtil.serializeStartpart(this, omOutput);
+                    builder.setCache(cache);
+                    builder.next();
+                    OMSerializerUtil.serializeEndpart(omOutput);
+                }
+            } else {
+                OMSerializerUtil.serializeNormal(this, omOutput, cache);
+            }
+            // do not serialise the siblings
+
+
+        } else {
+            //Cached
+            OMSerializerUtil.serializeNormal(this, omOutput, cache);
+
+            // do not serialise the siblings
+        }
+
+
+    }
+
+}
diff --git a/src/org/apache/ws/commons/soap/impl/llom/SOAPFaultRoleImpl.java b/src/org/apache/ws/commons/soap/impl/llom/SOAPFaultRoleImpl.java
new file mode 100644
index 0000000..38d7b60
--- /dev/null
+++ b/src/org/apache/ws/commons/soap/impl/llom/SOAPFaultRoleImpl.java
@@ -0,0 +1,94 @@
+/*
+ * Copyright 2004,2005 The Apache Software Foundation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      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.
+ */
+
+package org.apache.ws.commons.soap.impl.llom;
+
+import org.apache.ws.commons.om.OMXMLParserWrapper;
+import org.apache.ws.commons.om.impl.OMNodeEx;
+import org.apache.ws.commons.om.impl.OMOutputImpl;
+import org.apache.ws.commons.om.impl.llom.OMSerializerUtil;
+import org.apache.ws.commons.om.impl.llom.serialize.StreamWriterToContentHandlerConverter;
+import org.apache.ws.commons.soap.SOAP12Constants;
+import org.apache.ws.commons.soap.SOAPFault;
+import org.apache.ws.commons.soap.SOAPProcessingException;
+
+import javax.xml.stream.XMLStreamException;
+
+public abstract class SOAPFaultRoleImpl extends SOAPElement implements org.apache.ws.commons.soap.SOAPFaultRole {
+
+    public SOAPFaultRoleImpl(SOAPFault parent,
+                             boolean extractNamespaceFromParent) throws SOAPProcessingException {
+        super(parent,
+                SOAP12Constants.SOAP_FAULT_ROLE_LOCAL_NAME,
+                extractNamespaceFromParent);
+    }
+
+    public SOAPFaultRoleImpl(SOAPFault parent, OMXMLParserWrapper builder) {
+        super(parent, SOAP12Constants.SOAP_FAULT_ROLE_LOCAL_NAME, builder);
+    }
+
+    public void setRoleValue(String uri) {
+        this.setText(uri);
+    }
+
+    public String getRoleValue() {
+        return this.getText();
+    }
+
+    protected void serialize(OMOutputImpl omOutput, boolean cache) throws XMLStreamException {
+        // select the builder
+        short builderType = PULL_TYPE_BUILDER;    // default is pull type
+        if (builder != null) {
+            builderType = this.builder.getBuilderType();
+        }
+        if ((builderType == PUSH_TYPE_BUILDER)
+                && (builder.getRegisteredContentHandler() == null)) {
+            builder.registerExternalContentHandler(new StreamWriterToContentHandlerConverter(omOutput));
+        }
+
+
+        if (!cache) {
+            //No caching
+            if (this.firstChild != null) {
+                OMSerializerUtil.serializeStartpart(this, omOutput);
+                ((OMNodeEx)firstChild).serializeAndConsume(omOutput);
+                OMSerializerUtil.serializeEndpart(omOutput);
+            } else if (!this.done) {
+                if (builderType == PULL_TYPE_BUILDER) {
+                    OMSerializerUtil.serializeByPullStream(this, omOutput);
+                } else {
+                    OMSerializerUtil.serializeStartpart(this, omOutput);
+                    builder.setCache(cache);
+                    builder.next();
+                    OMSerializerUtil.serializeEndpart(omOutput);
+                }
+            } else {
+                OMSerializerUtil.serializeNormal(this, omOutput, cache);
+            }
+            // do not serialise the siblings
+
+
+        } else {
+            //Cached
+            OMSerializerUtil.serializeNormal(this, omOutput, cache);
+
+            // do not serialise the siblings
+        }
+
+
+    }
+
+}
diff --git a/src/org/apache/ws/commons/soap/impl/llom/SOAPFaultSubCodeImpl.java b/src/org/apache/ws/commons/soap/impl/llom/SOAPFaultSubCodeImpl.java
new file mode 100644
index 0000000..02bc336
--- /dev/null
+++ b/src/org/apache/ws/commons/soap/impl/llom/SOAPFaultSubCodeImpl.java
@@ -0,0 +1,69 @@
+/*
+ * Copyright 2004,2005 The Apache Software Foundation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      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.
+ */
+
+package org.apache.ws.commons.soap.impl.llom;
+
+import org.apache.ws.commons.om.OMElement;
+import org.apache.ws.commons.om.OMXMLParserWrapper;
+import org.apache.ws.commons.om.util.ElementHelper;
+import org.apache.ws.commons.soap.SOAP12Constants;
+import org.apache.ws.commons.soap.SOAPFaultSubCode;
+import org.apache.ws.commons.soap.SOAPFaultValue;
+import org.apache.ws.commons.soap.SOAPProcessingException;
+
+public abstract class SOAPFaultSubCodeImpl extends SOAPElement implements SOAPFaultSubCode {
+
+    protected SOAPFaultValue value;
+    protected SOAPFaultSubCode subCode;
+
+
+    protected SOAPFaultSubCodeImpl(OMElement parent, String localName) throws SOAPProcessingException {
+        super(parent, localName, true);
+    }
+
+    protected SOAPFaultSubCodeImpl(OMElement parent,
+                                   String localName,
+                                   OMXMLParserWrapper builder) {
+        super(parent, localName, builder);
+    }
+
+    public void setValue(SOAPFaultValue soapFaultSubCodeValue) throws SOAPProcessingException {
+        ElementHelper.setNewElement(this, value, soapFaultSubCodeValue);
+    }
+
+    public SOAPFaultValue getValue() {
+        if (value == null) {
+            value =
+                    (SOAPFaultValue) ElementHelper.getChildWithName(this,
+                            SOAP12Constants.SOAP_FAULT_VALUE_LOCAL_NAME);
+        }
+        return value;
+    }
+
+    public void setSubCode(SOAPFaultSubCode subCode) throws SOAPProcessingException {
+        ElementHelper.setNewElement(this, this.subCode, subCode);
+
+    }
+
+    public SOAPFaultSubCode getSubCode() {
+        if (subCode == null) {
+            subCode =
+                    (SOAPFaultSubCode) ElementHelper.getChildWithName(this,
+                            SOAP12Constants.SOAP_FAULT_SUB_CODE_LOCAL_NAME);
+        }
+        return subCode;
+    }
+}
diff --git a/src/org/apache/ws/commons/soap/impl/llom/SOAPFaultTextImpl.java b/src/org/apache/ws/commons/soap/impl/llom/SOAPFaultTextImpl.java
new file mode 100644
index 0000000..f5ad236
--- /dev/null
+++ b/src/org/apache/ws/commons/soap/impl/llom/SOAPFaultTextImpl.java
@@ -0,0 +1,70 @@
+/*
+ * Copyright 2004,2005 The Apache Software Foundation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      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.
+ */
+
+package org.apache.ws.commons.soap.impl.llom;
+
+import org.apache.ws.commons.om.OMAbstractFactory;
+import org.apache.ws.commons.om.OMAttribute;
+import org.apache.ws.commons.om.OMNamespace;
+import org.apache.ws.commons.om.OMXMLParserWrapper;
+import org.apache.ws.commons.om.impl.llom.OMAttributeImpl;
+import org.apache.ws.commons.soap.SOAP12Constants;
+import org.apache.ws.commons.soap.SOAPFaultReason;
+import org.apache.ws.commons.soap.SOAPFaultText;
+import org.apache.ws.commons.soap.SOAPProcessingException;
+
+import javax.xml.namespace.QName;
+
+public abstract class SOAPFaultTextImpl extends SOAPElement implements SOAPFaultText {
+    protected OMAttribute langAttr;
+    protected OMNamespace langNamespace = OMAbstractFactory.getOMFactory()
+            .createOMNamespace(
+                    SOAP12Constants.SOAP_FAULT_TEXT_LANG_ATTR_NS_URI,
+                    SOAP12Constants.SOAP_FAULT_TEXT_LANG_ATTR_NS_PREFIX);
+
+    protected SOAPFaultTextImpl(SOAPFaultReason parent) throws SOAPProcessingException {
+        super(parent, SOAP12Constants.SOAP_FAULT_TEXT_LOCAL_NAME, true);
+    }
+
+    protected SOAPFaultTextImpl(SOAPFaultReason parent,
+                                OMXMLParserWrapper builder) {
+        super(parent, SOAP12Constants.SOAP_FAULT_TEXT_LOCAL_NAME, builder);
+    }
+
+
+    public void setLang(String lang) {
+        //langAttr = new OMAttributeImpl(SOAP12Constants.SOAP_FAULT_TEXT_LANG_ATTR_LOCAL_NAME, parent.getNamespace(), lang);
+        langAttr =
+                new OMAttributeImpl(
+                        SOAP12Constants.SOAP_FAULT_TEXT_LANG_ATTR_LOCAL_NAME,
+                        langNamespace,
+                        lang);
+        this.addAttribute(langAttr);
+    }
+
+    public String getLang() {
+        if (langAttr == null) {
+            //langAttr = this.getFirstAttribute(new QName(SOAP12Constants.SOAP_FAULT_TEXT_LANG_ATTR_LOCAL_NAME, parent.getNamespace().getName()));
+            langAttr =
+                    this.getAttribute(
+                            new QName(langNamespace.getName(),
+                                    SOAP12Constants.SOAP_FAULT_TEXT_LANG_ATTR_LOCAL_NAME,
+                                    SOAP12Constants.SOAP_FAULT_TEXT_LANG_ATTR_NS_PREFIX));
+        }
+
+        return langAttr == null ? null : langAttr.getAttributeValue();
+    }
+}
diff --git a/src/org/apache/ws/commons/soap/impl/llom/SOAPFaultValueImpl.java b/src/org/apache/ws/commons/soap/impl/llom/SOAPFaultValueImpl.java
new file mode 100644
index 0000000..7da4ee2
--- /dev/null
+++ b/src/org/apache/ws/commons/soap/impl/llom/SOAPFaultValueImpl.java
@@ -0,0 +1,34 @@
+/*
+ * Copyright 2004,2005 The Apache Software Foundation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      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.
+ */
+
+package org.apache.ws.commons.soap.impl.llom;
+
+import org.apache.ws.commons.om.OMElement;
+import org.apache.ws.commons.om.OMXMLParserWrapper;
+import org.apache.ws.commons.soap.SOAP12Constants;
+import org.apache.ws.commons.soap.SOAPFaultValue;
+import org.apache.ws.commons.soap.SOAPProcessingException;
+
+public abstract class SOAPFaultValueImpl extends SOAPElement implements SOAPFaultValue {
+
+    protected SOAPFaultValueImpl(OMElement parent) throws SOAPProcessingException {
+        super(parent, SOAP12Constants.SOAP_FAULT_VALUE_LOCAL_NAME, true);
+    }
+
+    protected SOAPFaultValueImpl(OMElement parent, OMXMLParserWrapper builder) {
+        super(parent, SOAP12Constants.SOAP_FAULT_VALUE_LOCAL_NAME, builder);
+    }
+}
diff --git a/src/org/apache/ws/commons/soap/impl/llom/SOAPHeaderBlockImpl.java b/src/org/apache/ws/commons/soap/impl/llom/SOAPHeaderBlockImpl.java
new file mode 100644
index 0000000..307c57c
--- /dev/null
+++ b/src/org/apache/ws/commons/soap/impl/llom/SOAPHeaderBlockImpl.java
@@ -0,0 +1,111 @@
+/*
+ * Copyright 2004,2005 The Apache Software Foundation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      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.
+ */
+
+package org.apache.ws.commons.soap.impl.llom;
+
+import org.apache.ws.commons.om.OMAttribute;
+import org.apache.ws.commons.om.OMElement;
+import org.apache.ws.commons.om.OMNamespace;
+import org.apache.ws.commons.om.OMXMLParserWrapper;
+import org.apache.ws.commons.om.impl.llom.OMAttributeImpl;
+import org.apache.ws.commons.om.impl.llom.OMElementImpl;
+import org.apache.ws.commons.om.impl.llom.OMNamespaceImpl;
+import org.apache.ws.commons.soap.SOAPConstants;
+import org.apache.ws.commons.soap.SOAPHeader;
+import org.apache.ws.commons.soap.SOAPHeaderBlock;
+import org.apache.ws.commons.soap.SOAPProcessingException;
+
+import javax.xml.namespace.QName;
+
+/**
+ * Class SOAPHeaderBlockImpl
+ */
+public abstract class SOAPHeaderBlockImpl extends OMElementImpl
+        implements SOAPHeaderBlock {
+
+    private boolean processed = false;
+
+    /**
+     * @param localName
+     * @param ns
+     * @param parent     
+     */
+    public SOAPHeaderBlockImpl(String localName,
+                               OMNamespace ns,
+                               SOAPHeader parent) throws SOAPProcessingException {
+        super(localName, ns, parent);
+        this.setNamespace(ns);
+    }
+
+    /**
+     * Constructor SOAPHeaderBlockImpl.
+     *
+     * @param localName
+     * @param ns
+     * @param parent
+     * @param builder
+     */
+    public SOAPHeaderBlockImpl(String localName, OMNamespace ns,
+                               OMElement parent, OMXMLParserWrapper builder) {
+        super(localName, ns, parent, builder);
+        this.setNamespace(ns);
+    }
+
+    /**
+     * @param attributeName
+     * @param attrValue
+     * @param soapEnvelopeNamespaceURI     
+     */
+    protected void setAttribute(String attributeName,
+                                String attrValue,
+                                String soapEnvelopeNamespaceURI) {
+        OMAttribute omAttribute = this.getAttribute(
+                new QName(soapEnvelopeNamespaceURI, attributeName));
+        if (omAttribute != null) {
+            omAttribute.setAttributeValue(attrValue);
+        } else {
+            OMAttribute attribute = new OMAttributeImpl(attributeName,
+                    new OMNamespaceImpl(soapEnvelopeNamespaceURI,
+                            SOAPConstants.SOAP_DEFAULT_NAMESPACE_PREFIX),
+                    attrValue);
+            this.addAttribute(attribute);
+        }
+    }
+
+    /**
+     * Method getAttribute.
+     *
+     * @param attrName
+     * @param soapEnvelopeNamespaceURI     
+     * @return Returns String.
+     */
+    protected String getAttribute(String attrName,
+                                  String soapEnvelopeNamespaceURI) {
+        OMAttribute omAttribute = this.getAttribute(
+                new QName(soapEnvelopeNamespaceURI, attrName));
+        return (omAttribute != null)
+                ? omAttribute.getAttributeValue()
+                : null;
+    }
+
+    public boolean isProcessed() {
+        return processed;
+    }
+
+    public void setProcessed() {
+        processed = true;
+    }
+}
diff --git a/src/org/apache/ws/commons/soap/impl/llom/SOAPHeaderImpl.java b/src/org/apache/ws/commons/soap/impl/llom/SOAPHeaderImpl.java
new file mode 100644
index 0000000..0cdb128
--- /dev/null
+++ b/src/org/apache/ws/commons/soap/impl/llom/SOAPHeaderImpl.java
@@ -0,0 +1,226 @@
+/*
+ * Copyright 2004,2005 The Apache Software Foundation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      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.
+ */
+
+package org.apache.ws.commons.soap.impl.llom;
+
+import org.apache.ws.commons.om.OMElement;
+import org.apache.ws.commons.om.OMException;
+import org.apache.ws.commons.om.OMNamespace;
+import org.apache.ws.commons.om.OMNode;
+import org.apache.ws.commons.om.OMXMLParserWrapper;
+import org.apache.ws.commons.soap.SOAPConstants;
+import org.apache.ws.commons.soap.SOAPEnvelope;
+import org.apache.ws.commons.soap.SOAPHeader;
+import org.apache.ws.commons.soap.SOAPHeaderBlock;
+import org.apache.ws.commons.soap.SOAPProcessingException;
+
+import java.util.ArrayList;
+import java.util.Iterator;
+
+/**
+ * Class SOAPHeaderImpl
+ */
+public abstract class SOAPHeaderImpl extends SOAPElement implements SOAPHeader {
+    /**
+     * @param envelope
+     */
+    public SOAPHeaderImpl(SOAPEnvelope envelope) throws SOAPProcessingException {
+        super(envelope, SOAPConstants.HEADER_LOCAL_NAME, true);
+
+    }
+
+    /**
+     * Constructor SOAPHeaderImpl
+     *
+     * @param envelope
+     * @param builder
+     */
+    public SOAPHeaderImpl(SOAPEnvelope envelope, OMXMLParserWrapper builder) {
+        super(envelope, SOAPConstants.HEADER_LOCAL_NAME, builder);
+    }
+
+    /**
+     * Creates a new <CODE>SOAPHeaderBlock</CODE> object initialized with the
+     * specified name and adds it to this <CODE>SOAPHeader</CODE> object.
+     *
+     * @param localName
+     * @param ns
+     * @return the new <CODE>SOAPHeaderBlock</CODE> object that was inserted
+     *         into this <CODE>SOAPHeader</CODE> object
+     * @throws org.apache.ws.commons.om.OMException
+     *                     if a SOAP error occurs
+     * @throws OMException
+     */
+    public abstract SOAPHeaderBlock addHeaderBlock(String localName,
+                                                   OMNamespace ns)
+            throws OMException;
+
+    /**
+     * Returns a list of all the <CODE>SOAPHeaderBlock</CODE> objects in this
+     * <CODE>SOAPHeader</CODE> object that have the the specified actor. An
+     * actor is a global attribute that indicates the intermediate parties to
+     * whom the message should be sent. An actor receives the message and then
+     * sends it to the next actor. The default actor is the ultimate intended
+     * recipient for the message, so if no actor attribute is included in a
+     * <CODE>SOAPHeader</CODE> object, the message is sent to its ultimate
+     * destination.
+     *
+     * @param paramRole a <CODE>String</CODE> giving the URI of the actor for
+     *                  which to search
+     * @return an <CODE>Iterator</CODE> object over all the <CODE>
+     *         SOAPHeaderBlock</CODE> objects that contain the specified actor
+     * @see #extractHeaderBlocks(String) extractHeaderBlocks(java.lang.String)
+     */
+    public Iterator examineHeaderBlocks(String paramRole) {
+        Iterator headerBlocksIter = this.getChildren();
+        ArrayList headersWithGivenActor = new ArrayList();
+        
+        if(paramRole == null || "".equals(paramRole)){
+    		return returnAllSOAPHeaders(this.getChildren());
+    	}
+        
+        while (headerBlocksIter.hasNext()) {
+            Object o = headerBlocksIter.next();
+            if (o instanceof SOAPHeaderBlock) {
+                SOAPHeaderBlock soapHeaderBlock = (SOAPHeaderBlock) o;
+                String role = soapHeaderBlock.getRole();
+                if ((role != null) && role.equalsIgnoreCase(paramRole)) {
+                    headersWithGivenActor.add(soapHeaderBlock);
+                }
+            }
+        }
+        return headersWithGivenActor.iterator();
+    }
+
+    private Iterator returnAllSOAPHeaders(Iterator children) {
+    	ArrayList headers = new ArrayList();
+    	while (children.hasNext()) {
+            Object o = children.next();
+            if (o instanceof SOAPHeaderBlock) {
+                headers.add(o);
+            }
+        }
+    	
+    	return headers.iterator();
+		
+	}
+
+	/**
+     * Returns a list of all the <CODE>SOAPHeaderBlock</CODE> objects in this
+     * <CODE>SOAPHeader</CODE> object that have the the specified role and
+     * detaches them from this <CODE> SOAPHeader</CODE> object. <P>This method
+     * allows an role to process only the parts of the <CODE>SOAPHeader</CODE>
+     * object that apply to it and to remove them before passing the message on
+     * to the next role.
+     *
+     * @param role a <CODE>String</CODE> giving the URI of the role for which to
+     *             search
+     * @return an <CODE>Iterator</CODE> object over all the <CODE>
+     *         SOAPHeaderBlock</CODE> objects that contain the specified role
+     * @see #examineHeaderBlocks(String) examineHeaderBlocks(java.lang.String)
+     */
+    public abstract Iterator extractHeaderBlocks(String role);
+
+    /**
+     * Returns an <code>Iterator</code> over all the <code>SOAPHeaderBlock</code>
+     * objects in this <code>SOAPHeader</code> object that have the specified
+     * actor and that have a MustUnderstand attribute whose value is equivalent
+     * to <code>true</code>.
+     *
+     * @param actor a <code>String</code> giving the URI of the actor for which
+     *              to search
+     * @return an <code>Iterator</code> object over all the
+     *         <code>SOAPHeaderBlock</code> objects that contain the specified
+     *         actor and are marked as MustUnderstand
+     */
+    public Iterator examineMustUnderstandHeaderBlocks(String actor) {
+        Iterator headerBlocksIter = this.getChildren();
+        ArrayList mustUnderstandHeadersWithGivenActor = new ArrayList();
+        while (headerBlocksIter.hasNext()) {
+            Object o = headerBlocksIter.next();
+            if (o instanceof SOAPHeaderBlock) {
+                SOAPHeaderBlock soapHeaderBlock = (SOAPHeaderBlock) o;
+                String role = soapHeaderBlock.getRole();
+                boolean mustUnderstand = soapHeaderBlock.getMustUnderstand();
+                if ((role != null) && role.equalsIgnoreCase(actor) &&
+                        mustUnderstand) {
+                    mustUnderstandHeadersWithGivenActor.add(soapHeaderBlock);
+                }
+            }
+        }
+        return mustUnderstandHeadersWithGivenActor.iterator();
+    }
+
+    /**
+     * Returns an <code>Iterator</code> over all the <code>SOAPHeaderBlock</code>
+     * objects in this <code>SOAPHeader</code> object. Not that this will return
+     * elements containing the QName (http://schemas.xmlsoap.org/soap/envelope/,
+     * Header)
+     *
+     * @return an <code>Iterator</code> object over all the
+     *         <code>SOAPHeaderBlock</code> objects contained by this
+     *         <code>SOAPHeader</code>
+     */
+    public Iterator examineAllHeaderBlocks() {
+        return this.getChildrenWithName(null);
+    }
+
+    /**
+     * Returns an <code>Iterator</code> over all the <code>SOAPHeaderBlock</code>
+     * objects in this <code>SOAPHeader </code> object and detaches them from
+     * this <code>SOAPHeader</code> object.
+     *
+     * @return an <code>Iterator</code> object over all the
+     *         <code>SOAPHeaderBlock</code> objects contained by this
+     *         <code>SOAPHeader</code>
+     */
+    public Iterator extractAllHeaderBlocks() {
+        throw new UnsupportedOperationException(); // TODO implement this
+    }
+
+    public ArrayList getHeaderBlocksWithNSURI(String nsURI) {
+        ArrayList headers = null;
+        OMNode node = null;
+        OMElement header = this.getFirstElement();
+
+        if (header != null) {
+            headers = new ArrayList();
+        }
+
+        node = header;
+
+        while (node != null) {
+            if (node.getType() == OMNode.ELEMENT_NODE) {
+                header = (OMElement) node;
+                if (nsURI.equals(header.getNamespace().getName())) {
+                    headers.add(header);
+                }
+            }
+            node = node.getNextOMSibling();
+
+        }
+        return headers;
+
+    }
+
+    protected void checkParent(OMElement parent) throws SOAPProcessingException {
+        if (!(parent instanceof SOAPEnvelopeImpl)) {
+            throw new SOAPProcessingException(
+                    "Expecting an implementation of SOAP Envelope as the parent. But received some other implementation");
+        }
+    }
+
+}
diff --git a/src/org/apache/ws/commons/soap/impl/llom/SOAPMessageImpl.java b/src/org/apache/ws/commons/soap/impl/llom/SOAPMessageImpl.java
new file mode 100644
index 0000000..e793376
--- /dev/null
+++ b/src/org/apache/ws/commons/soap/impl/llom/SOAPMessageImpl.java
@@ -0,0 +1,70 @@
+/*
+ * Copyright 2004,2005 The Apache Software Foundation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      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.
+ */
+
+package org.apache.ws.commons.soap.impl.llom;
+
+import org.apache.ws.commons.om.OMElement;
+import org.apache.ws.commons.om.OMNode;
+import org.apache.ws.commons.om.OMXMLParserWrapper;
+import org.apache.ws.commons.om.impl.OMNodeEx;
+import org.apache.ws.commons.om.impl.OMOutputImpl;
+import org.apache.ws.commons.om.impl.llom.OMDocumentImpl;
+import org.apache.ws.commons.soap.SOAPEnvelope;
+import org.apache.ws.commons.soap.SOAPMessage;
+import org.apache.ws.commons.soap.SOAPProcessingException;
+
+import javax.xml.stream.XMLStreamException;
+
+public class SOAPMessageImpl extends OMDocumentImpl implements SOAPMessage {
+
+
+    public SOAPMessageImpl() {
+    }
+
+    public SOAPMessageImpl(SOAPEnvelope envelope, OMXMLParserWrapper parserWrapper) {
+        super(envelope, parserWrapper);
+    }
+
+    public SOAPMessageImpl(OMXMLParserWrapper parserWrapper) {
+        super(parserWrapper);
+    }
+
+
+    public SOAPEnvelope getSOAPEnvelope() throws SOAPProcessingException {
+        return (SOAPEnvelope) getOMDocumentElement();
+    }
+
+    public void setSOAPEnvelope(SOAPEnvelope envelope) throws SOAPProcessingException {
+        super.addChild(envelope);
+        this.documentElement = envelope;
+    }
+
+    public void setOMDocumentElement(OMElement rootElement) {
+        throw new UnsupportedOperationException("This is not allowed. Use set SOAPEnvelope instead");
+    }
+
+    public void setFirstChild(OMNode firstChild) {
+        throw new UnsupportedOperationException("This is not allowed. Use set SOAPEnvelope instead");
+    }
+
+    protected void serialize(OMOutputImpl omOutput, boolean cache, boolean includeXMLDeclaration) throws XMLStreamException {
+        if (cache) {
+            ((OMNodeEx)this.documentElement).serialize(omOutput);
+        } else {
+            ((OMNodeEx)this.documentElement).serializeAndConsume(omOutput);
+        }
+    }
+}
diff --git a/src/org/apache/ws/commons/soap/impl/llom/SOAPTextImpl.java b/src/org/apache/ws/commons/soap/impl/llom/SOAPTextImpl.java
new file mode 100644
index 0000000..8a13736
--- /dev/null
+++ b/src/org/apache/ws/commons/soap/impl/llom/SOAPTextImpl.java
@@ -0,0 +1,46 @@
+/*
+ * Copyright 2004,2005 The Apache Software Foundation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      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.
+ */
+
+package org.apache.ws.commons.soap.impl.llom;
+
+import org.apache.ws.commons.om.OMElement;
+import org.apache.ws.commons.om.OMXMLParserWrapper;
+import org.apache.ws.commons.soap.SOAP12Constants;
+import org.apache.ws.commons.soap.SOAPProcessingException;
+
+public class SOAPTextImpl extends SOAPElement {
+
+    protected SOAPTextImpl(OMElement parent) throws SOAPProcessingException {
+        super(parent, SOAP12Constants.SOAP_FAULT_TEXT_LOCAL_NAME, true);
+    }
+
+    protected SOAPTextImpl(OMElement parent, OMXMLParserWrapper builder) {
+        super(parent, SOAP12Constants.SOAP_FAULT_TEXT_LOCAL_NAME, builder);
+    }
+
+    public void setLang(String lang) {
+        // TODO : Chinthaka fix me
+    }
+
+    public String getLang() {
+        // TODO Chinthaka fix me
+        return null;
+    }
+
+    protected void checkParent(OMElement parent) throws SOAPProcessingException {
+        // do nothing
+    }
+}
diff --git a/src/org/apache/ws/commons/soap/impl/llom/builder/SOAP11BuilderHelper.java b/src/org/apache/ws/commons/soap/impl/llom/builder/SOAP11BuilderHelper.java
new file mode 100644
index 0000000..9eb96fd
--- /dev/null
+++ b/src/org/apache/ws/commons/soap/impl/llom/builder/SOAP11BuilderHelper.java
@@ -0,0 +1,174 @@
+/*
+ * Copyright 2004,2005 The Apache Software Foundation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      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.
+ */
+
+package org.apache.ws.commons.soap.impl.llom.builder;
+
+import org.apache.ws.commons.om.OMElement;
+import org.apache.ws.commons.om.OMText;
+import org.apache.ws.commons.om.impl.OMNodeEx;
+import org.apache.ws.commons.om.impl.llom.exception.OMBuilderException;
+import org.apache.ws.commons.soap.SOAP11Constants;
+import org.apache.ws.commons.soap.SOAPFactory;
+import org.apache.ws.commons.soap.SOAPFault;
+import org.apache.ws.commons.soap.SOAPFaultCode;
+import org.apache.ws.commons.soap.SOAPFaultReason;
+import org.apache.ws.commons.soap.SOAPFaultText;
+import org.apache.ws.commons.soap.SOAPFaultValue;
+import org.apache.ws.commons.soap.SOAPProcessingException;
+import org.w3c.dom.Element;
+
+import javax.xml.stream.XMLStreamException;
+import javax.xml.stream.XMLStreamReader;
+
+public class SOAP11BuilderHelper extends SOAPBuilderHelper implements SOAP11Constants {
+    private SOAPFactory factory;
+    private boolean faultcodePresent = false;
+    private boolean faultstringPresent = false;
+
+    private OMElement lastProcessedSOAPElement;
+
+    public SOAP11BuilderHelper(StAXSOAPModelBuilder builder) {
+        super(builder);
+        factory = builder.getSoapFactory();
+    }
+
+    public OMElement handleEvent(XMLStreamReader parser,
+                                 OMElement parent,
+                                 int elementLevel) throws SOAPProcessingException {
+        this.parser = parser;
+
+        OMElement element = null;
+        String localName = parser.getLocalName();
+
+        if (elementLevel == 4) {
+
+            if (SOAP_FAULT_CODE_LOCAL_NAME.equals(localName)) {
+                if (faultstringPresent) {
+                    builder.setBooleanProcessingMandatoryFaultElements(false);
+                }
+                SOAPFaultCode code = factory.createSOAPFaultCode(
+                        (SOAPFault) parent, builder);
+                SOAPFaultValue value = factory.createSOAPFaultValue(code);
+                processNamespaceData(code, true);
+                processAttributes(code);
+
+                processText(parser, value);
+                ((OMNodeEx)code).setComplete(true);
+                element = code;
+                builder.elementLevel--;
+
+                faultcodePresent = true;
+            } else if (SOAP_FAULT_STRING_LOCAL_NAME.equals(localName)) {
+                if (faultcodePresent) {
+                    builder.setBooleanProcessingMandatoryFaultElements(false);
+                }
+
+
+                SOAPFaultReason reason = factory.createSOAPFaultReason(
+                        (SOAPFault) parent, builder);
+                SOAPFaultText faultText = factory.createSOAPFaultText(reason);
+                processNamespaceData(reason, true);
+                processAttributes(reason);
+
+                processText(parser, faultText);
+                ((OMNodeEx)reason).setComplete(true);
+                element = reason;
+                builder.elementLevel--;
+
+
+                faultstringPresent = true;
+            } else if (SOAP_FAULT_ACTOR_LOCAL_NAME.equals(localName)) {
+                element =
+                        factory.createSOAPFaultRole((SOAPFault) parent,
+                                builder);
+                processNamespaceData(element, true);
+                processAttributes(element);
+            } else if (SOAP_FAULT_DETAIL_LOCAL_NAME.equals(localName)) {
+                element =
+                        factory.createSOAPFaultDetail((SOAPFault) parent,
+                                builder);
+                processNamespaceData(element, true);
+                processAttributes(element);
+            } else {
+                element =
+                        factory.createOMElement(
+                                localName, null, parent, builder);
+                processNamespaceData(element, false);
+                processAttributes(element);
+            }
+
+        } else if (elementLevel == 5) {
+
+        	String parentTagName = "";
+        	if(parent instanceof Element) {
+        		parentTagName = ((Element)parent).getTagName();
+        	} else {
+        		parentTagName = parent.getLocalName();
+        	}
+        	
+            if (parentTagName.equals(SOAP_FAULT_CODE_LOCAL_NAME)) {
+                throw new OMBuilderException(
+                        "faultcode element should not have children");
+            } else if (parentTagName.equals(
+                    SOAP_FAULT_STRING_LOCAL_NAME)) {
+                throw new OMBuilderException(
+                        "faultstring element should not have children");
+            } else if (parentTagName.equals(
+                    SOAP_FAULT_ACTOR_LOCAL_NAME)) {
+                throw new OMBuilderException(
+                        "faultactor element should not have children");
+            } else {
+                element =
+                        this.factory.createOMElement(
+                                localName, null, parent, builder);
+                processNamespaceData(element, false);
+                processAttributes(element);
+            }
+
+        } else if (elementLevel > 5) {
+            element =
+                    this.factory.createOMElement(localName,
+                            null,
+                            parent,
+                            builder);
+            processNamespaceData(element, false);
+            processAttributes(element);
+        }
+
+        return element;
+    }
+
+    private void processText(XMLStreamReader parser, OMElement value) {
+        try {
+            int token = parser.next();
+            while (token != XMLStreamReader.END_ELEMENT) {
+                if (token == XMLStreamReader.CHARACTERS) {
+                    OMText text = factory.createText(value, parser.getText());
+                    value.addChild(text);
+                } else {
+                    throw new SOAPProcessingException(
+                            "Only Characters are allowed here");
+                }
+                token = parser.next();
+            }
+
+
+        } catch (XMLStreamException e) {
+            throw new SOAPProcessingException(e);
+        }
+    }
+
+}
\ No newline at end of file
diff --git a/src/org/apache/ws/commons/soap/impl/llom/builder/SOAP12BuilderHelper.java b/src/org/apache/ws/commons/soap/impl/llom/builder/SOAP12BuilderHelper.java
new file mode 100644
index 0000000..c2c1724
--- /dev/null
+++ b/src/org/apache/ws/commons/soap/impl/llom/builder/SOAP12BuilderHelper.java
@@ -0,0 +1,321 @@
+/*
+ * Copyright 2004,2005 The Apache Software Foundation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      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.
+ */
+
+package org.apache.ws.commons.soap.impl.llom.builder;
+
+
+import org.apache.ws.commons.om.OMElement;
+import org.apache.ws.commons.om.impl.OMNodeEx;
+import org.apache.ws.commons.om.impl.llom.exception.OMBuilderException;
+import org.apache.ws.commons.soap.SOAP12Constants;
+import org.apache.ws.commons.soap.SOAPFactory;
+import org.apache.ws.commons.soap.SOAPFault;
+import org.apache.ws.commons.soap.SOAPFaultCode;
+import org.apache.ws.commons.soap.SOAPFaultReason;
+import org.apache.ws.commons.soap.SOAPFaultSubCode;
+import org.apache.ws.commons.soap.SOAPProcessingException;
+
+import javax.xml.stream.XMLStreamReader;
+import java.util.Vector;
+
+public class SOAP12BuilderHelper extends SOAPBuilderHelper {
+
+    private SOAPFactory factory;
+    private boolean codePresent = false;
+    private boolean reasonPresent = false;
+    private boolean nodePresent = false;
+    private boolean rolePresent = false;
+    private boolean detailPresent = false;
+    private boolean subcodeValuePresent = false;
+    private boolean subSubcodePresent = false;
+    private boolean valuePresent = false;
+    private boolean subcodePresent = false;
+    private boolean codeprocessing = false;
+    private boolean subCodeProcessing = false;
+    private boolean reasonProcessing = false;
+    private Vector detailElementNames;
+
+    public SOAP12BuilderHelper(StAXSOAPModelBuilder builder) {
+        super(builder);
+        factory = builder.getSoapFactory();
+    }
+
+    public OMElement handleEvent(XMLStreamReader parser,
+                                 OMElement parent,
+                                 int elementLevel) throws SOAPProcessingException {
+
+        this.parser = parser;
+        OMElement element = null;
+
+        if (elementLevel == 4) {
+            if (parser.getLocalName().equals(
+                    SOAP12Constants.SOAP_FAULT_CODE_LOCAL_NAME)) {
+                if (codePresent) {
+                    throw new OMBuilderException(
+                            "Multiple Code element encountered");
+                } else {
+                    element =
+                            factory.createSOAPFaultCode((SOAPFault) parent,
+                                    builder);
+                    codePresent = true;
+                    codeprocessing = true;
+                }
+            } else if (parser.getLocalName().equals(
+                    SOAP12Constants.SOAP_FAULT_REASON_LOCAL_NAME)) {
+                if (!codeprocessing && !subCodeProcessing) {
+                    if (codePresent) {
+                        if (reasonPresent) {
+                            throw new OMBuilderException(
+                                    "Multiple Reason Element encountered");
+                        } else {
+                            element =
+                                    factory.createSOAPFaultReason(
+                                            (SOAPFault) parent, builder);
+                            reasonPresent = true;
+                            reasonProcessing = true;
+                        }
+                    } else {
+                        throw new OMBuilderException(
+                                "Wrong element order encountred at " +
+                                parser.getLocalName());
+                    }
+                } else {
+                    if (codeprocessing) {
+                        throw new OMBuilderException(
+                                "Code doesn't have a value");
+                    } else {
+                        throw new OMBuilderException(
+                                "A subcode doesn't have a Value");
+                    }
+                }
+
+            } else if (parser.getLocalName().equals(
+                    SOAP12Constants.SOAP_FAULT_NODE_LOCAL_NAME)) {
+                if (!reasonProcessing) {
+                    if (reasonPresent && !rolePresent && !detailPresent) {
+                        if (nodePresent) {
+                            throw new OMBuilderException(
+                                    "Multiple Node element encountered");
+                        } else {
+                            element =
+                                    factory.createSOAPFaultNode(
+                                            (SOAPFault) parent, builder);
+                            nodePresent = true;
+                        }
+                    } else {
+                        throw new OMBuilderException(
+                                "wrong element order encountered at " +
+                                parser.getLocalName());
+                    }
+                } else {
+                    throw new OMBuilderException(
+                            "Reason element Should have a text");
+                }
+            } else if (parser.getLocalName().equals(
+                    SOAP12Constants.SOAP_FAULT_ROLE_LOCAL_NAME)) {
+                if (!reasonProcessing) {
+                    if (reasonPresent && !detailPresent) {
+                        if (rolePresent) {
+                            throw new OMBuilderException(
+                                    "Multiple Role element encountered");
+                        } else {
+                            element =
+                                    factory.createSOAPFaultRole(
+                                            (SOAPFault) parent, builder);
+                            rolePresent = true;
+                        }
+                    } else {
+                        throw new OMBuilderException(
+                                "Wrong element order encountered at " +
+                                parser.getLocalName());
+                    }
+                } else {
+                    throw new OMBuilderException(
+                            "Reason element should have a text");
+                }
+            } else if (parser.getLocalName().equals(
+                    SOAP12Constants.SOAP_FAULT_DETAIL_LOCAL_NAME)) {
+                if (!reasonProcessing) {
+                    if (reasonPresent) {
+                        if (detailPresent) {
+                            throw new OMBuilderException(
+                                    "Multiple detail element encountered");
+                        } else {
+                            element =
+                                    factory.createSOAPFaultDetail(
+                                            (SOAPFault) parent, builder);
+                            detailPresent = true;
+                        }
+                    } else {
+                        throw new OMBuilderException(
+                                "wrong element order encountered at " +
+                                parser.getLocalName());
+                    }
+                } else {
+                    throw new OMBuilderException(
+                            "Reason element should have a text");
+                }
+            } else {
+                throw new OMBuilderException(
+                        parser.getLocalName() +
+                        " unsupported element in SOAPFault element");
+            }
+
+        } else if (elementLevel == 5) {
+            if (parent.getLocalName().equals(
+                    SOAP12Constants.SOAP_FAULT_CODE_LOCAL_NAME)) {
+                if (parser.getLocalName().equals(
+                        SOAP12Constants.SOAP_FAULT_VALUE_LOCAL_NAME)) {
+                    if (!valuePresent) {
+                        element =
+                                factory.createSOAPFaultValue(
+                                        (SOAPFaultCode) parent, builder);
+                        valuePresent = true;
+                        codeprocessing = false;
+                    } else {
+                        throw new OMBuilderException(
+                                "Multiple value Encountered in code element");
+                    }
+
+                } else if (parser.getLocalName().equals(
+                        SOAP12Constants.SOAP_FAULT_SUB_CODE_LOCAL_NAME)) {
+                    if (!subcodePresent) {
+                        if (valuePresent) {
+                            element =
+                                    factory.createSOAPFaultSubCode(
+                                            (SOAPFaultCode) parent, builder);
+                            subcodePresent = true;
+                            subCodeProcessing = true;
+                        } else {
+                            throw new OMBuilderException(
+                                    "Value should present before the subcode");
+                        }
+
+                    } else {
+                        throw new OMBuilderException(
+                                "multiple subcode Encountered in code element");
+                    }
+                } else {
+                    throw new OMBuilderException(
+                            parser.getLocalName() +
+                            " is not supported inside the code element");
+                }
+
+            } else if (parent.getLocalName().equals(
+                    SOAP12Constants.SOAP_FAULT_REASON_LOCAL_NAME)) {
+                if (parser.getLocalName().equals(
+                        SOAP12Constants.SOAP_FAULT_TEXT_LOCAL_NAME)) {
+                    element =
+                            factory.createSOAPFaultText(
+                                    (SOAPFaultReason) parent, builder);
+                    ((OMNodeEx)element).setComplete(false);
+                    reasonProcessing = false;
+                    builder.setBooleanProcessingMandatoryFaultElements(false);
+                } else {
+                    throw new OMBuilderException(
+                            parser.getLocalName() +
+                            " is not supported inside the reason");
+                }
+            } else if (parent.getLocalName().equals(
+                    SOAP12Constants.SOAP_FAULT_DETAIL_LOCAL_NAME)) {
+                element =
+                        this.factory.createOMElement(
+                                parser.getLocalName(), null, parent, builder);
+                builder.setProcessingDetailElements(true);
+                detailElementNames = new Vector();
+                detailElementNames.add(parser.getLocalName());
+
+            } else {
+                throw new OMBuilderException(
+                        parent.getLocalName() +
+                        " should not have child element");
+            }
+
+
+        } else if (elementLevel > 5) {
+            if (parent.getLocalName().equals(
+                    SOAP12Constants.SOAP_FAULT_SUB_CODE_LOCAL_NAME)) {
+                if (parser.getLocalName().equals(
+                        SOAP12Constants.SOAP_FAULT_VALUE_LOCAL_NAME)) {
+                    if (subcodeValuePresent) {
+                        throw new OMBuilderException(
+                                "multiple subCode value encountered");
+                    } else {
+                        element =
+                                factory.createSOAPFaultValue(
+                                        (SOAPFaultSubCode) parent, builder);
+                        subcodeValuePresent = true;
+                        subSubcodePresent = false;
+                        subCodeProcessing = false;
+                    }
+                } else if (parser.getLocalName().equals(
+                        SOAP12Constants.SOAP_FAULT_SUB_CODE_LOCAL_NAME)) {
+                    if (subcodeValuePresent) {
+                        if (!subSubcodePresent) {
+                            element =
+                                    factory.createSOAPFaultSubCode(
+                                            (SOAPFaultSubCode) parent,
+                                            builder);
+                            subcodeValuePresent = false;
+                            subSubcodePresent = true;
+                            subCodeProcessing = true;
+                        } else {
+                            throw new OMBuilderException(
+                                    "multiple subcode encountered");
+                        }
+                    } else {
+                        throw new OMBuilderException(
+                                "Value should present before the subcode");
+                    }
+                } else {
+                    throw new OMBuilderException(
+                            parser.getLocalName() +
+                            " is not supported inside the subCode element");
+                }
+            } else if (builder.isProcessingDetailElements()) {
+                int detailElementLevel = 0;
+                boolean localNameExist = false;
+                for (int i = 0; i < detailElementNames.size(); i++) {
+                    if (parent.getLocalName().equals(
+                            detailElementNames.get(i))) {
+                        localNameExist = true;
+                        detailElementLevel = i + 1;
+                    }
+                }
+                if (localNameExist) {
+                    detailElementNames.setSize(detailElementLevel);
+                    element =
+                            this.factory.createOMElement(
+                                    parser.getLocalName(),
+                                    null,
+                                    parent,
+                                    builder);
+                    detailElementNames.add(parser.getLocalName());
+                }
+
+            } else {
+                throw new OMBuilderException(
+                        parent.getLocalName() +
+                        " should not have child at element level " +
+                        elementLevel);
+            }
+        }
+
+        processNamespaceData(element, false);
+        processAttributes(element);
+        return element;
+    }
+}
\ No newline at end of file
diff --git a/src/org/apache/ws/commons/soap/impl/llom/builder/SOAPBuilderHelper.java b/src/org/apache/ws/commons/soap/impl/llom/builder/SOAPBuilderHelper.java
new file mode 100644
index 0000000..040ba25
--- /dev/null
+++ b/src/org/apache/ws/commons/soap/impl/llom/builder/SOAPBuilderHelper.java
@@ -0,0 +1,101 @@
+/*
+ * Copyright 2004,2005 The Apache Software Foundation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      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.
+ */
+
+package org.apache.ws.commons.soap.impl.llom.builder;
+
+import org.apache.ws.commons.om.OMElement;
+import org.apache.ws.commons.om.OMNamespace;
+import org.apache.ws.commons.om.impl.llom.exception.OMBuilderException;
+import org.apache.ws.commons.soap.SOAP11Constants;
+import org.apache.ws.commons.soap.SOAP12Constants;
+import org.apache.ws.commons.soap.SOAPProcessingException;
+
+import javax.xml.stream.XMLStreamReader;
+
+public abstract class SOAPBuilderHelper {
+    protected StAXSOAPModelBuilder builder;
+    protected XMLStreamReader parser;
+
+    protected SOAPBuilderHelper(StAXSOAPModelBuilder builder) {
+        this.builder = builder;
+    }
+
+    public abstract OMElement handleEvent(XMLStreamReader parser,
+                                          OMElement element,
+                                          int elementLevel) throws SOAPProcessingException;
+
+    protected void processNamespaceData(OMElement node, boolean isSOAPElement) {
+        int namespaceCount = parser.getNamespaceCount();
+        for (int i = 0; i < namespaceCount; i++) {
+            node.declareNamespace(parser.getNamespaceURI(i),
+                    parser.getNamespacePrefix(i));
+        }
+
+        // set the own namespace
+        String namespaceURI = parser.getNamespaceURI();
+        String prefix = parser.getPrefix();
+        OMNamespace namespace = null;
+        if (namespaceURI != null && namespaceURI.length() > 0) {
+            if (prefix == null) {
+                // this means, this elements has a default namespace or it has inherited a default namespace from its parent
+                namespace = node.findNamespace(namespaceURI, "");
+                if (namespace == null) {
+                    namespace = node.declareNamespace(namespaceURI, "");
+                }
+            } else {
+                namespace = node.findNamespace(namespaceURI, prefix);
+            }
+            node.setNamespace(namespace);
+        } else {
+
+        }
+
+
+
+        // TODO we got to have this to make sure OM reject mesagess that are not name space qualified
+        // But got to comment this to interop with Axis.1.x
+        // if (namespace == null) {
+        // throw new OMException("All elements must be namespace qualified!");
+        // }
+        if (isSOAPElement) {
+            if (node.getNamespace() != null &&
+                    !node.getNamespace().getName().equals(
+                            SOAP11Constants.SOAP_ENVELOPE_NAMESPACE_URI) &&
+                    !node.getNamespace().getName().equals(
+                            SOAP12Constants.SOAP_ENVELOPE_NAMESPACE_URI)) {
+                throw new OMBuilderException("invalid SOAP namespace URI");
+            }
+        }
+
+    }
+
+    protected void processAttributes(OMElement node) {
+        int attribCount = parser.getAttributeCount();
+        for (int i = 0; i < attribCount; i++) {
+            OMNamespace ns = null;
+            String uri = parser.getAttributeNamespace(i);
+            if (uri.hashCode() != 0) {
+                ns = node.findNamespace(uri,
+                        parser.getAttributePrefix(i));
+            }
+
+            // todo if the attributes are supposed to namespace qualified all the time
+            // todo then this should throw an exception here
+            node.addAttribute(parser.getAttributeLocalName(i),
+                    parser.getAttributeValue(i), ns);
+        }
+    }
+}
diff --git a/src/org/apache/ws/commons/soap/impl/llom/builder/StAXSOAPModelBuilder.java b/src/org/apache/ws/commons/soap/impl/llom/builder/StAXSOAPModelBuilder.java
new file mode 100644
index 0000000..fbefe39
--- /dev/null
+++ b/src/org/apache/ws/commons/soap/impl/llom/builder/StAXSOAPModelBuilder.java
@@ -0,0 +1,427 @@
+/*
+ * Copyright 2004,2005 The Apache Software Foundation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      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.
+ */
+
+package org.apache.ws.commons.soap.impl.llom.builder;
+
+import org.apache.ws.commons.om.OMAbstractFactory;
+import org.apache.ws.commons.om.OMDocument;
+import org.apache.ws.commons.om.OMElement;
+import org.apache.ws.commons.om.OMException;
+import org.apache.ws.commons.om.OMNamespace;
+import org.apache.ws.commons.om.OMNode;
+import org.apache.ws.commons.om.impl.OMNodeEx;
+import org.apache.ws.commons.om.impl.llom.builder.StAXOMBuilder;
+import org.apache.ws.commons.soap.SOAP11Constants;
+import org.apache.ws.commons.soap.SOAP12Constants;
+import org.apache.ws.commons.soap.SOAPBody;
+import org.apache.ws.commons.soap.SOAPConstants;
+import org.apache.ws.commons.soap.SOAPEnvelope;
+import org.apache.ws.commons.soap.SOAPFactory;
+import org.apache.ws.commons.soap.SOAPHeader;
+import org.apache.ws.commons.soap.SOAPMessage;
+import org.apache.ws.commons.soap.SOAPProcessingException;
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+
+import javax.xml.stream.XMLStreamReader;
+
+/**
+ * Class StAXSOAPModelBuilder
+ */
+public class StAXSOAPModelBuilder extends StAXOMBuilder {
+
+    SOAPMessage soapMessage;
+    /**
+     * Field envelope
+     */
+    private SOAPEnvelope envelope;
+    private OMNamespace envelopeNamespace;
+
+
+    private SOAPFactory soapFactory;
+
+    /**
+     * Field headerPresent
+     */
+    private boolean headerPresent = false;
+
+    /**
+     * Field bodyPresent
+     */
+    private boolean bodyPresent = false;
+
+    /**
+     * Field log
+     */
+    private Log log = LogFactory.getLog(getClass());
+
+    /**
+     * element level 1 = envelope level element level 2 = Header or Body level
+     * element level 3 = HeaderElement or BodyElement level
+     */
+    protected int elementLevel = 0;
+
+    private boolean processingFault = false;
+
+
+    //added
+    /* This is used to indicate whether detail element is processing in soap 1.2 builderhelper
+    */
+    private boolean processingDetailElements = false;
+
+    private SOAPBuilderHelper builderHelper;
+    private String senderfaultCode;
+    private String receiverfaultCode;
+    private boolean processingMandatoryFaultElements;
+    
+    // We need to have soap factory, temporary, until we find out the correct SOAP version. If user has not provided
+    // a SOAP factory, internally we are creating a default one. This flag will be set if we create one internally, to
+    // warn that this should be replaced later.
+    private boolean isTempSOAPFactory = true;
+
+    /**
+     * Constructor StAXSOAPModelBuilder
+     * soapVersion parameter is to give the soap version from the transport. For example, in HTTP case
+     * you can identify the version of the soap message u have recd by looking at the HTTP headers. 
+     * It is used to check whether the actual soap message contained is of that version.
+     * If one is creates the builder from the transport, then can just pass null for version.
+     *
+     * @param parser
+     * @param soapVersion   parameter is to give the soap version for the transport.  
+     */
+    public StAXSOAPModelBuilder(XMLStreamReader parser, String soapVersion) {
+        super(parser);
+        soapFactory = OMAbstractFactory.getDefaultSOAPFactory();
+        isTempSOAPFactory = true;
+        soapMessage = soapFactory.createSOAPMessage(this);
+        this.document = soapMessage;
+        if(parser.getCharacterEncodingScheme() != null) {
+            document.setCharsetEncoding(parser.getCharacterEncodingScheme());
+        }
+        identifySOAPVersion(soapVersion);
+    }
+
+    /**
+     * @param parser
+     * @param factory
+     * @param soapVersion parameter is to give the soap version from the transport. For example, in
+     *                    HTTP case you can identify the version of the soap message u have recd by looking at
+     *                    the HTTP headers. It is used to check whether the actual soap message 
+     *                    contained is of that version.If one is creates the builder from the transport, 
+     *                    then can just pass null for version.
+     */
+    public StAXSOAPModelBuilder(XMLStreamReader parser, SOAPFactory factory, String soapVersion) {
+        super(factory, parser);
+        soapFactory = factory;
+        isTempSOAPFactory = false;
+        soapMessage = soapFactory.createSOAPMessage(this);
+        this.document = soapMessage;
+        identifySOAPVersion(soapVersion);
+    }
+
+    protected void identifySOAPVersion(String soapVersionURIFromTransport) {
+
+        SOAPEnvelope soapEnvelope = getSOAPEnvelope();
+        if (soapEnvelope == null) {
+            throw new SOAPProcessingException("SOAP Message does not contain an Envelope",
+                    SOAPConstants.FAULT_CODE_VERSION_MISMATCH);
+        }
+
+        envelopeNamespace = soapEnvelope.getNamespace();
+        String namespaceName = envelopeNamespace.getName();
+        if ((soapVersionURIFromTransport != null) && !(soapVersionURIFromTransport.equals(namespaceName))) {
+            throw new SOAPProcessingException("Transport level information does not match with SOAP" +
+                    " Message namespace URI", SOAPConstants.FAULT_CODE_VERSION_MISMATCH);
+
+        }
+        if(isTempSOAPFactory) {
+	        if (SOAP12Constants.SOAP_ENVELOPE_NAMESPACE_URI.equals(namespaceName)) {
+	            soapFactory = OMAbstractFactory.getSOAP12Factory();
+	            log.debug("Starting to process SOAP 1.2 message");
+	        } else if (SOAP11Constants.SOAP_ENVELOPE_NAMESPACE_URI.equals(namespaceName)) {
+	            soapFactory = OMAbstractFactory.getSOAP11Factory();
+	            log.debug("Starting to process SOAP 1.1 message");
+	
+	        } else {
+	            throw new SOAPProcessingException("Only SOAP 1.1 or SOAP 1.2 messages are supported in the" +
+	                    " system", SOAPConstants.FAULT_CODE_VERSION_MISMATCH);
+	        }
+        }
+    }
+
+    /**
+     * Method getSOAPEnvelope.
+     *
+     * @return Returns SOAPEnvelope.
+     * @throws OMException
+     */
+    public SOAPEnvelope getSOAPEnvelope() throws OMException {
+        while ((envelope == null) && !done) {
+            next();
+        }
+        return envelope;
+    }
+
+    /**
+     * Method createOMElement.
+     *
+     * @return Returns OMNode.
+     * @throws OMException
+     */
+    protected OMNode createOMElement() throws OMException {
+        elementLevel++;
+        OMElement node;
+        String elementName = parser.getLocalName();
+        if (lastNode == null) {
+            node = constructNode(null, elementName, true);
+            setSOAPEnvelope(node);
+        } else if (lastNode.isComplete()) {
+            node =
+                    constructNode((OMElement) lastNode.getParent(),
+                            elementName,
+                            false);
+            ((OMNodeEx) lastNode).setNextOMSibling(node);
+            ((OMNodeEx) node).setPreviousOMSibling(lastNode);
+        } else {
+            OMElement e = (OMElement) lastNode;
+            node = constructNode((OMElement) lastNode, elementName, false);
+            e.setFirstChild(node);
+        }
+
+
+        log.debug("Build the OMElelment " + node.getLocalName() +
+                "By the StaxSOAPModelBuilder");
+        return node;
+    }
+
+    protected void setSOAPEnvelope(OMElement node) {
+        soapMessage.setSOAPEnvelope((SOAPEnvelope) node);
+        soapMessage.setXMLVersion(parser.getVersion());
+        soapMessage.setCharsetEncoding(parser.getCharacterEncodingScheme());
+    }
+
+    /**
+     * Method constructNode
+     *
+     * @param parent
+     * @param elementName
+     * @param isEnvelope
+     */
+    protected OMElement constructNode(OMElement parent, String elementName,
+                                      boolean isEnvelope) {
+        OMElement element = null;
+        if (parent == null) {
+            if (!elementName.equalsIgnoreCase(SOAPConstants.SOAPENVELOPE_LOCAL_NAME)) {
+                throw new SOAPProcessingException("First Element must contain the local name, "
+                        + SOAPConstants.SOAPENVELOPE_LOCAL_NAME, SOAPConstants.FAULT_CODE_VERSION_MISMATCH);
+            }
+            envelope = soapFactory.createSOAPEnvelope(this);
+            element = envelope;
+            processNamespaceData(element, true);
+            // fill in the attributes
+            processAttributes(element);
+
+        } else if (elementLevel == 2) {
+
+            // this is either a header or a body
+            if (elementName.equals(SOAPConstants.HEADER_LOCAL_NAME)) {
+                if (headerPresent) {
+                    throw new SOAPProcessingException("Multiple headers encountered!", getSenderFaultCode());
+                }
+                if (bodyPresent) {
+                    throw new SOAPProcessingException("Header Body wrong order!", getSenderFaultCode());
+                }
+                headerPresent = true;
+                element =
+                        soapFactory.createSOAPHeader((SOAPEnvelope) parent,
+                                this);
+
+                processNamespaceData(element, true);
+                processAttributes(element);
+
+            } else if (elementName.equals(SOAPConstants.BODY_LOCAL_NAME)) {
+                if (bodyPresent) {
+                    throw new SOAPProcessingException("Multiple body elements encountered", getSenderFaultCode());
+                }
+                bodyPresent = true;
+                element =
+                        soapFactory.createSOAPBody((SOAPEnvelope) parent,
+                                this);
+
+                processNamespaceData(element, true);
+                processAttributes(element);
+
+            } else {
+                throw new SOAPProcessingException(elementName
+                        +
+                        " is not supported here. Envelope can not have elements other than Header and Body.", getSenderFaultCode());
+            }
+        } else if ((elementLevel == 3)
+                &&
+                parent.getLocalName().equalsIgnoreCase(SOAPConstants.HEADER_LOCAL_NAME)) {
+
+            // this is a headerblock
+            try {
+                element =
+                        soapFactory.createSOAPHeaderBlock(elementName, null,
+                                (SOAPHeader) parent, this);
+            } catch (SOAPProcessingException e) {
+                throw new SOAPProcessingException("Can not create SOAPHeader block", getReceiverFaultCode(), e);
+            }
+            processNamespaceData(element, false);
+            processAttributes(element);
+
+        } else if ((elementLevel == 3) &&
+                parent.getLocalName().equalsIgnoreCase(SOAPConstants.BODY_LOCAL_NAME) &&
+                elementName.equalsIgnoreCase(SOAPConstants.BODY_FAULT_LOCAL_NAME)) {
+
+            // this is a headerblock
+            element = soapFactory.createSOAPFault((SOAPBody) parent, this);
+            processNamespaceData(element, false);
+            processAttributes(element);
+
+
+            processingFault = true;
+            processingMandatoryFaultElements = true;
+            if (SOAP12Constants.SOAP_ENVELOPE_NAMESPACE_URI.equals(envelopeNamespace.getName())) {
+                builderHelper = new SOAP12BuilderHelper(this);
+            } else if (SOAP11Constants.SOAP_ENVELOPE_NAMESPACE_URI.equals(envelopeNamespace.getName())) {
+                builderHelper = new SOAP11BuilderHelper(this);
+            }
+
+        } else if (elementLevel > 3 && processingFault) {
+            element = builderHelper.handleEvent(parser, parent, elementLevel);
+        } else {
+
+            // this is neither of above. Just create an element
+            element = soapFactory.createOMElement(elementName, null,
+                    parent, this);
+            processNamespaceData(element, false);
+            processAttributes(element);
+
+        }
+        return element;
+    }
+
+    private String getSenderFaultCode() {
+        if (senderfaultCode == null) {
+            senderfaultCode = SOAP12Constants.SOAP_ENVELOPE_NAMESPACE_URI.equals(envelopeNamespace.getName()) ? SOAP12Constants.FAULT_CODE_SENDER : SOAP11Constants.FAULT_CODE_SENDER;
+        }
+        return senderfaultCode;
+    }
+
+    private String getReceiverFaultCode() {
+        if (receiverfaultCode == null) {
+            receiverfaultCode = SOAP12Constants.SOAP_ENVELOPE_NAMESPACE_URI.equals(envelopeNamespace.getName()) ? SOAP12Constants.FAULT_CODE_RECEIVER : SOAP11Constants.FAULT_CODE_RECEIVER;
+        }
+        return receiverfaultCode;
+    }
+
+    public void endElement() {
+        if (lastNode.isComplete()) {
+            OMElement parent = (OMElement) lastNode.getParent();
+            ((OMNodeEx) parent).setComplete(true);
+            lastNode = parent;
+        } else {
+            OMNode e = lastNode;
+            ((OMNodeEx) e).setComplete(true);
+        }
+        elementLevel--;
+    }
+
+    /**
+     * Method createDTD.
+     * Overriding the default behaviour as a SOAPMessage should not have a DTD.
+     */
+    protected OMNode createDTD() throws OMException {
+        throw new OMException("SOAP message MUST NOT contain a Document Type Declaration(DTD)");
+    }
+
+    /**
+     * Method createPI.
+     * Overriding the default behaviour as a SOAP Message should not have a PI.
+     */
+    protected OMNode createPI() throws OMException {
+        throw new OMException("SOAP message MUST NOT contain Processing Instructions(PI)");
+    }
+
+    /**
+     * Method getDocumentElement.
+     *
+     * @return Returns OMElement.
+     */
+    public OMElement getDocumentElement() {
+        return getSOAPEnvelope();
+    }
+
+    /**
+     * Method processNamespaceData.
+     *
+     * @param node
+     * @param isSOAPElement
+     */
+    protected void processNamespaceData(OMElement node, boolean isSOAPElement) {
+
+        super.processNamespaceData(node, isSOAPElement);
+
+        if (isSOAPElement) {
+            if (node.getNamespace() != null &&
+                    !node.getNamespace().getName().equals(SOAP11Constants.SOAP_ENVELOPE_NAMESPACE_URI) &&
+                    !node.getNamespace().getName().equals(SOAP12Constants.SOAP_ENVELOPE_NAMESPACE_URI)) {
+                throw new SOAPProcessingException("invalid SOAP namespace URI. " +
+                        "Only " + SOAP11Constants.SOAP_ENVELOPE_NAMESPACE_URI +
+                        " and " + SOAP12Constants.SOAP_ENVELOPE_NAMESPACE_URI +
+                        " are supported.", SOAP12Constants.FAULT_CODE_SENDER);
+            }
+        }
+
+    }
+
+/*these three methods to set and check detail element processing or mandatory fault element are present
+*/
+
+    public OMNamespace getEnvelopeNamespace() {
+        return envelopeNamespace;
+    }
+
+    public void setBooleanProcessingMandatoryFaultElements(boolean value) {
+        this.processingMandatoryFaultElements = value;
+    }
+
+    public boolean isProcessingDetailElements() {
+        return processingDetailElements;
+    }
+
+    public void setProcessingDetailElements(boolean value) {
+        processingDetailElements = value;
+    }
+
+    public SOAPMessage getSoapMessage() {
+        return soapMessage;
+    }
+
+    public OMDocument getDocument() {
+        return (OMDocument) this.soapMessage;
+    }
+
+	/**
+	 * @return Returns the soapFactory.
+	 */
+	protected SOAPFactory getSoapFactory() {
+		return soapFactory;
+	}
+
+}
diff --git a/src/org/apache/ws/commons/soap/impl/llom/factory/SOAPLinkedListImplFactory.java b/src/org/apache/ws/commons/soap/impl/llom/factory/SOAPLinkedListImplFactory.java
new file mode 100644
index 0000000..42ae89e
--- /dev/null
+++ b/src/org/apache/ws/commons/soap/impl/llom/factory/SOAPLinkedListImplFactory.java
@@ -0,0 +1,235 @@
+/*
+ * Copyright 2004,2005 The Apache Software Foundation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      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.
+ */
+
+package org.apache.ws.commons.soap.impl.llom.factory;
+
+import org.apache.ws.commons.om.OMNamespace;
+import org.apache.ws.commons.om.OMXMLParserWrapper;
+import org.apache.ws.commons.om.impl.llom.factory.OMLinkedListImplFactory;
+import org.apache.ws.commons.soap.SOAPBody;
+import org.apache.ws.commons.soap.SOAPEnvelope;
+import org.apache.ws.commons.soap.SOAPFactory;
+import org.apache.ws.commons.soap.SOAPFault;
+import org.apache.ws.commons.soap.SOAPFaultCode;
+import org.apache.ws.commons.soap.SOAPFaultDetail;
+import org.apache.ws.commons.soap.SOAPFaultNode;
+import org.apache.ws.commons.soap.SOAPFaultReason;
+import org.apache.ws.commons.soap.SOAPFaultRole;
+import org.apache.ws.commons.soap.SOAPFaultSubCode;
+import org.apache.ws.commons.soap.SOAPFaultText;
+import org.apache.ws.commons.soap.SOAPFaultValue;
+import org.apache.ws.commons.soap.SOAPHeader;
+import org.apache.ws.commons.soap.SOAPHeaderBlock;
+import org.apache.ws.commons.soap.SOAPMessage;
+import org.apache.ws.commons.soap.SOAPProcessingException;
+import org.apache.ws.commons.soap.impl.llom.SOAPEnvelopeImpl;
+import org.apache.ws.commons.soap.impl.llom.SOAPMessageImpl;
+
+public class SOAPLinkedListImplFactory extends OMLinkedListImplFactory implements SOAPFactory {
+    public String getSoapVersionURI() {
+        throw new UnsupportedOperationException();
+    }
+
+    public SOAPMessage createSOAPMessage(OMXMLParserWrapper builder) {
+        return new SOAPMessageImpl(builder);
+    }
+
+    
+    public SOAPMessage createSOAPMessage(SOAPEnvelope envelope, OMXMLParserWrapper parserWrapper) {
+        return new SOAPMessageImpl(envelope, parserWrapper);
+    }
+
+    /**
+     * Eran Chinthaka (chinthaka@apache.org)
+     */
+
+    public SOAPEnvelope createSOAPEnvelope(OMXMLParserWrapper builder) {
+        return new SOAPEnvelopeImpl(builder, this);
+    }
+
+    public SOAPEnvelope createSOAPEnvelope() {
+        throw new UnsupportedOperationException();
+    }
+
+    public SOAPHeader createSOAPHeader(SOAPEnvelope envelope) throws SOAPProcessingException {
+        throw new UnsupportedOperationException();
+    }
+
+    public SOAPHeader createSOAPHeader(SOAPEnvelope envelope,
+                                       OMXMLParserWrapper builder) {
+        throw new UnsupportedOperationException();
+
+    }
+
+    public SOAPHeaderBlock createSOAPHeaderBlock(String localName,
+                                                 OMNamespace ns,
+                                                 SOAPHeader parent) throws SOAPProcessingException {
+        throw new UnsupportedOperationException();
+
+    }
+
+    public SOAPHeaderBlock createSOAPHeaderBlock(String localName,
+                                                 OMNamespace ns,
+                                                 SOAPHeader parent,
+                                                 OMXMLParserWrapper builder) throws SOAPProcessingException {
+        throw new UnsupportedOperationException();
+
+    }
+
+
+    public SOAPFault createSOAPFault(SOAPBody parent, Exception e) throws SOAPProcessingException {
+        throw new UnsupportedOperationException();
+    }
+
+    public SOAPFault createSOAPFault(SOAPBody parent) throws SOAPProcessingException {
+        throw new UnsupportedOperationException();
+    }
+
+    public SOAPFault createSOAPFault(SOAPBody parent,
+                                     OMXMLParserWrapper builder) {
+        throw new UnsupportedOperationException();
+    }
+
+    public SOAPBody createSOAPBody(SOAPEnvelope envelope) throws SOAPProcessingException {
+        throw new UnsupportedOperationException();
+    }
+
+    public SOAPBody createSOAPBody(SOAPEnvelope envelope,
+                                   OMXMLParserWrapper builder) {
+        throw new UnsupportedOperationException();
+    }
+
+    public SOAPFaultCode createSOAPFaultCode(SOAPFault parent) throws SOAPProcessingException {
+        throw new UnsupportedOperationException();
+    }
+
+    public SOAPFaultCode createSOAPFaultCode(SOAPFault parent,
+                                             OMXMLParserWrapper builder) {
+        throw new UnsupportedOperationException();
+    }
+
+    public SOAPFaultValue createSOAPFaultValue(SOAPFaultCode parent) throws SOAPProcessingException {
+        throw new UnsupportedOperationException();
+    }
+
+    public SOAPFaultValue createSOAPFaultValue(SOAPFaultCode parent,
+                                               OMXMLParserWrapper builder) {
+        throw new UnsupportedOperationException();
+    }
+
+    //added
+    public SOAPFaultValue createSOAPFaultValue(SOAPFaultSubCode parent) throws SOAPProcessingException {
+        throw new UnsupportedOperationException();
+    }
+
+    //added
+    public SOAPFaultValue createSOAPFaultValue(SOAPFaultSubCode parent,
+                                               OMXMLParserWrapper builder) {
+        throw new UnsupportedOperationException();
+    }
+
+    //changed
+    public SOAPFaultSubCode createSOAPFaultSubCode(SOAPFaultCode parent) throws SOAPProcessingException {
+        throw new UnsupportedOperationException();
+    }
+
+    //changed
+    public SOAPFaultSubCode createSOAPFaultSubCode(SOAPFaultCode parent,
+                                                   OMXMLParserWrapper builder) {
+        throw new UnsupportedOperationException();
+    }
+
+    public SOAPFaultSubCode createSOAPFaultSubCode(SOAPFaultSubCode parent) throws SOAPProcessingException {
+        throw new UnsupportedOperationException();
+    }
+
+    public SOAPFaultSubCode createSOAPFaultSubCode(SOAPFaultSubCode parent,
+                                                   OMXMLParserWrapper builder) {
+        throw new UnsupportedOperationException();
+    }
+
+    public SOAPFaultReason createSOAPFaultReason(SOAPFault parent) throws SOAPProcessingException {
+        throw new UnsupportedOperationException();
+    }
+
+    public SOAPFaultReason createSOAPFaultReason(SOAPFault parent,
+                                                 OMXMLParserWrapper builder) {
+        throw new UnsupportedOperationException();
+    }
+
+    public SOAPFaultText createSOAPFaultText(SOAPFaultReason parent) throws SOAPProcessingException {
+        throw new UnsupportedOperationException();
+    }
+
+    public SOAPFaultText createSOAPFaultText(SOAPFaultReason parent,
+                                             OMXMLParserWrapper builder) {
+        throw new UnsupportedOperationException();
+    }
+
+    public SOAPFaultNode createSOAPFaultNode(SOAPFault parent) throws SOAPProcessingException {
+        throw new UnsupportedOperationException();
+    }
+
+    public SOAPFaultNode createSOAPFaultNode(SOAPFault parent,
+                                             OMXMLParserWrapper builder) {
+        throw new UnsupportedOperationException();
+    }
+
+    public SOAPFaultRole createSOAPFaultRole(SOAPFault parent) throws SOAPProcessingException {
+        throw new UnsupportedOperationException();
+    }
+
+    public SOAPFaultRole createSOAPFaultRole(SOAPFault parent,
+                                             OMXMLParserWrapper builder) {
+        throw new UnsupportedOperationException();
+    }
+
+    public SOAPFaultDetail createSOAPFaultDetail(SOAPFault parent) throws SOAPProcessingException {
+        throw new UnsupportedOperationException();
+    }
+
+    public SOAPFaultDetail createSOAPFaultDetail(SOAPFault parent,
+                                                 OMXMLParserWrapper builder) {
+        throw new UnsupportedOperationException();
+    }
+
+
+    /**
+     * Method getDefaultEnvelope
+     *
+     * @return Returns SOAPEnvelope.
+     */
+    public SOAPEnvelope getDefaultEnvelope() throws SOAPProcessingException {
+        throw new UnsupportedOperationException();
+    }
+
+    public SOAPEnvelope getDefaultFaultEnvelope() throws SOAPProcessingException {
+        SOAPEnvelope defaultEnvelope = getDefaultEnvelope();
+        SOAPFault fault = createSOAPFault(defaultEnvelope.getBody());
+
+        SOAPFaultCode faultCode = createSOAPFaultCode(fault);
+        SOAPFaultValue value = createSOAPFaultValue(faultCode);
+
+        SOAPFaultReason reason = createSOAPFaultReason(fault);
+        SOAPFaultText faultText = createSOAPFaultText(reason);
+
+        SOAPFaultNode faultNode = createSOAPFaultNode(fault);
+        SOAPFaultRole faultRole = createSOAPFaultRole(fault);
+        SOAPFaultDetail faultDetail = createSOAPFaultDetail(fault);
+
+        return defaultEnvelope;
+    }
+}
diff --git a/src/org/apache/ws/commons/soap/impl/llom/soap11/SOAP11BodyImpl.java b/src/org/apache/ws/commons/soap/impl/llom/soap11/SOAP11BodyImpl.java
new file mode 100644
index 0000000..bfa4db7
--- /dev/null
+++ b/src/org/apache/ws/commons/soap/impl/llom/soap11/SOAP11BodyImpl.java
@@ -0,0 +1,47 @@
+/*
+ * Copyright 2004,2005 The Apache Software Foundation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      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.
+ */
+
+package org.apache.ws.commons.soap.impl.llom.soap11;
+
+import org.apache.ws.commons.om.OMException;
+import org.apache.ws.commons.om.OMXMLParserWrapper;
+import org.apache.ws.commons.soap.SOAPEnvelope;
+import org.apache.ws.commons.soap.SOAPFault;
+import org.apache.ws.commons.soap.SOAPProcessingException;
+import org.apache.ws.commons.soap.impl.llom.SOAPBodyImpl;
+
+public class SOAP11BodyImpl extends SOAPBodyImpl {
+    /**
+     * @param envelope
+     */
+    public SOAP11BodyImpl(SOAPEnvelope envelope) throws SOAPProcessingException {
+        super(envelope);
+    }
+
+    /**
+     * Constructor SOAPBodyImpl
+     *
+     * @param envelope
+     * @param builder
+     */
+    public SOAP11BodyImpl(SOAPEnvelope envelope, OMXMLParserWrapper builder) {
+        super(envelope, builder);
+    }
+
+    public SOAPFault addFault(Exception e) throws OMException {
+        return new SOAP11Factory().createSOAPFault(this, e);
+    }
+}
diff --git a/src/org/apache/ws/commons/soap/impl/llom/soap11/SOAP11Factory.java b/src/org/apache/ws/commons/soap/impl/llom/soap11/SOAP11Factory.java
new file mode 100644
index 0000000..64850aa
--- /dev/null
+++ b/src/org/apache/ws/commons/soap/impl/llom/soap11/SOAP11Factory.java
@@ -0,0 +1,207 @@
+/*
+ * Copyright 2004,2005 The Apache Software Foundation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      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.
+ */
+
+package org.apache.ws.commons.soap.impl.llom.soap11;
+
+import org.apache.ws.commons.om.OMNamespace;
+import org.apache.ws.commons.om.OMXMLParserWrapper;
+import org.apache.ws.commons.om.impl.llom.OMNamespaceImpl;
+import org.apache.ws.commons.soap.SOAP11Constants;
+import org.apache.ws.commons.soap.SOAPBody;
+import org.apache.ws.commons.soap.SOAPEnvelope;
+import org.apache.ws.commons.soap.SOAPFault;
+import org.apache.ws.commons.soap.SOAPFaultCode;
+import org.apache.ws.commons.soap.SOAPFaultDetail;
+import org.apache.ws.commons.soap.SOAPFaultNode;
+import org.apache.ws.commons.soap.SOAPFaultReason;
+import org.apache.ws.commons.soap.SOAPFaultRole;
+import org.apache.ws.commons.soap.SOAPFaultSubCode;
+import org.apache.ws.commons.soap.SOAPFaultText;
+import org.apache.ws.commons.soap.SOAPFaultValue;
+import org.apache.ws.commons.soap.SOAPHeader;
+import org.apache.ws.commons.soap.SOAPHeaderBlock;
+import org.apache.ws.commons.soap.SOAPProcessingException;
+import org.apache.ws.commons.soap.impl.llom.SOAPEnvelopeImpl;
+import org.apache.ws.commons.soap.impl.llom.factory.SOAPLinkedListImplFactory;
+
+public class SOAP11Factory extends SOAPLinkedListImplFactory {
+    /**
+     * Eran Chinthaka (chinthaka@apache.org)
+     */
+
+    public String getSoapVersionURI() {
+        return SOAP11Constants.SOAP_ENVELOPE_NAMESPACE_URI;
+    }
+
+    public SOAPEnvelope createSOAPEnvelope() {
+        return new SOAPEnvelopeImpl(
+                new OMNamespaceImpl(
+                        SOAP11Constants.SOAP_ENVELOPE_NAMESPACE_URI,
+                        SOAP11Constants.SOAP_DEFAULT_NAMESPACE_PREFIX),
+                this);
+    }
+
+    public SOAPHeader createSOAPHeader(SOAPEnvelope envelope) throws SOAPProcessingException {
+        return new SOAP11HeaderImpl(envelope);
+    }
+
+    public SOAPHeader createSOAPHeader(SOAPEnvelope envelope,
+                                       OMXMLParserWrapper builder) {
+        return new SOAP11HeaderImpl(envelope, builder);
+    }
+
+    public SOAPHeaderBlock createSOAPHeaderBlock(String localName,
+                                                 OMNamespace ns,
+                                                 SOAPHeader parent) throws SOAPProcessingException {
+        return new SOAP11HeaderBlockImpl(localName, ns, parent);
+    }
+
+    public SOAPHeaderBlock createSOAPHeaderBlock(String localName,
+                                                 OMNamespace ns,
+                                                 SOAPHeader parent,
+                                                 OMXMLParserWrapper builder) throws SOAPProcessingException {
+        return new SOAP11HeaderBlockImpl(localName, ns, parent, builder);
+    }
+
+    public SOAPFault createSOAPFault(SOAPBody parent, Exception e) throws SOAPProcessingException {
+        return new SOAP11FaultImpl(parent, e);
+    }
+
+    public SOAPFault createSOAPFault(SOAPBody parent) throws SOAPProcessingException {
+        return new SOAP11FaultImpl(parent);
+    }
+
+    public SOAPFault createSOAPFault(SOAPBody parent,
+                                     OMXMLParserWrapper builder) {
+        return new SOAP11FaultImpl(parent, builder);
+    }
+
+    public SOAPBody createSOAPBody(SOAPEnvelope envelope) throws SOAPProcessingException {
+        return new SOAP11BodyImpl(envelope);
+    }
+
+    public SOAPBody createSOAPBody(SOAPEnvelope envelope,
+                                   OMXMLParserWrapper builder) {
+        return new SOAP11BodyImpl(envelope, builder);
+    }
+
+    public SOAPFaultCode createSOAPFaultCode(SOAPFault parent) throws SOAPProcessingException {
+        return new SOAP11FaultCodeImpl(parent);
+    }
+
+    public SOAPFaultCode createSOAPFaultCode(SOAPFault parent,
+                                             OMXMLParserWrapper builder) {
+        return new SOAP11FaultCodeImpl(parent, builder);
+    }
+
+    public SOAPFaultValue createSOAPFaultValue(SOAPFaultCode parent) throws SOAPProcessingException {
+        return new SOAP11FaultValueImpl(parent);
+    }
+
+    public SOAPFaultValue createSOAPFaultValue(SOAPFaultCode parent,
+                                               OMXMLParserWrapper builder) {
+        return new SOAP11FaultValueImpl(parent, builder);
+    }
+
+    //added
+    public SOAPFaultValue createSOAPFaultValue(SOAPFaultSubCode parent) throws SOAPProcessingException {
+        return new SOAP11FaultValueImpl(parent);
+    }
+
+    //added
+    public SOAPFaultValue createSOAPFaultValue(SOAPFaultSubCode parent,
+                                               OMXMLParserWrapper builder) {
+        return new SOAP11FaultValueImpl(parent, builder);
+    }
+
+    //changed
+    public SOAPFaultSubCode createSOAPFaultSubCode(SOAPFaultCode parent) throws SOAPProcessingException {
+        return new SOAP11FaultSubCodeImpl(parent);
+    }
+
+    //changed
+    public SOAPFaultSubCode createSOAPFaultSubCode(SOAPFaultCode parent,
+                                                   OMXMLParserWrapper builder) {
+        return new SOAP11FaultSubCodeImpl(parent, builder);
+    }
+
+    public SOAPFaultSubCode createSOAPFaultSubCode(SOAPFaultSubCode parent) throws SOAPProcessingException {
+        return new SOAP11FaultSubCodeImpl(parent);
+    }
+
+    public SOAPFaultSubCode createSOAPFaultSubCode(SOAPFaultSubCode parent,
+                                                   OMXMLParserWrapper builder) {
+        return new SOAP11FaultSubCodeImpl(parent, builder);
+    }
+
+    public SOAPFaultReason createSOAPFaultReason(SOAPFault parent) throws SOAPProcessingException {
+        return new SOAP11FaultReasonImpl(parent);
+    }
+
+    public SOAPFaultReason createSOAPFaultReason(SOAPFault parent,
+                                                 OMXMLParserWrapper builder) {
+        return new SOAP11FaultReasonImpl(parent, builder);
+    }
+
+    public SOAPFaultText createSOAPFaultText(SOAPFaultReason parent) throws SOAPProcessingException {
+        return new SOAP11FaultTextImpl(parent);
+    }
+
+    public SOAPFaultText createSOAPFaultText(SOAPFaultReason parent,
+                                             OMXMLParserWrapper builder) {
+        return new SOAP11FaultTextImpl(parent, builder);
+    }
+
+    public SOAPFaultNode createSOAPFaultNode(SOAPFault parent) throws SOAPProcessingException {
+        return new SOAP11FaultNodeImpl(parent);
+    }
+
+    public SOAPFaultNode createSOAPFaultNode(SOAPFault parent,
+                                             OMXMLParserWrapper builder) {
+        return new SOAP11FaultNodeImpl(parent, builder);
+    }
+
+    public SOAPFaultRole createSOAPFaultRole(SOAPFault parent) throws SOAPProcessingException {
+        return new SOAP11FaultRoleImpl(parent);
+    }
+
+    public SOAPFaultRole createSOAPFaultRole(SOAPFault parent,
+                                             OMXMLParserWrapper builder) {
+        return new SOAP11FaultRoleImpl(parent, builder);
+    }
+
+    public SOAPFaultDetail createSOAPFaultDetail(SOAPFault parent) throws SOAPProcessingException {
+        return new SOAP11FaultDetailImpl(parent);
+    }
+
+    public SOAPFaultDetail createSOAPFaultDetail(SOAPFault parent,
+                                                 OMXMLParserWrapper builder) {
+        return new SOAP11FaultDetailImpl(parent, builder);
+    }
+
+    public SOAPEnvelope getDefaultEnvelope() throws SOAPProcessingException {
+        OMNamespace ns =
+                new OMNamespaceImpl(
+                        SOAP11Constants.SOAP_ENVELOPE_NAMESPACE_URI,
+                        SOAP11Constants.SOAP_DEFAULT_NAMESPACE_PREFIX);
+        SOAPEnvelopeImpl env = new SOAPEnvelopeImpl(ns, this);
+        createSOAPHeader(env);
+        createSOAPBody(env);
+        return env;
+    }
+
+
+}
diff --git a/src/org/apache/ws/commons/soap/impl/llom/soap11/SOAP11FaultCodeImpl.java b/src/org/apache/ws/commons/soap/impl/llom/soap11/SOAP11FaultCodeImpl.java
new file mode 100644
index 0000000..d26572a
--- /dev/null
+++ b/src/org/apache/ws/commons/soap/impl/llom/soap11/SOAP11FaultCodeImpl.java
@@ -0,0 +1,109 @@
+/*
+ * Copyright 2004,2005 The Apache Software Foundation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      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.
+ */
+
+package org.apache.ws.commons.soap.impl.llom.soap11;
+
+import org.apache.ws.commons.om.OMElement;
+import org.apache.ws.commons.om.OMXMLParserWrapper;
+import org.apache.ws.commons.om.impl.llom.OMSerializerUtil;
+import org.apache.ws.commons.om.impl.llom.serialize.StreamWriterToContentHandlerConverter;
+import org.apache.ws.commons.soap.SOAP11Constants;
+import org.apache.ws.commons.soap.SOAPFault;
+import org.apache.ws.commons.soap.SOAPFaultSubCode;
+import org.apache.ws.commons.soap.SOAPFaultValue;
+import org.apache.ws.commons.soap.SOAPProcessingException;
+import org.apache.ws.commons.soap.impl.llom.SOAPFaultCodeImpl;
+
+import javax.xml.stream.XMLStreamException;
+import javax.xml.stream.XMLStreamWriter;
+
+public class SOAP11FaultCodeImpl extends SOAPFaultCodeImpl {
+    /**
+     * Constructor OMElementImpl
+     *
+     * @param parent
+     * @param builder
+     */
+    public SOAP11FaultCodeImpl(SOAPFault parent, OMXMLParserWrapper builder) {
+        super(parent, builder);
+    }
+
+    /**
+     * @param parent
+     */
+    public SOAP11FaultCodeImpl(SOAPFault parent) throws SOAPProcessingException {
+        super(parent, false);
+    }
+
+
+    public void setSubCode(SOAPFaultSubCode subCode) throws SOAPProcessingException {
+        if (!(subCode instanceof SOAP11FaultSubCodeImpl)) {
+            throw new SOAPProcessingException(
+                    "Expecting SOAP 1.1 implementation of SOAP Fault Sub Code. But received some other implementation");
+        }
+        super.setSubCode(subCode);
+    }
+
+    public void setValue(SOAPFaultValue value) throws SOAPProcessingException {
+        if (!(value instanceof SOAP11FaultValueImpl)) {
+            throw new SOAPProcessingException(
+                    "Expecting SOAP 1.1 implementation of SOAP Fault Value. But received some other implementation");
+        }
+        super.setValue(value);
+    }
+
+    protected void checkParent(OMElement parent) throws SOAPProcessingException {
+        if (!(parent instanceof SOAP11FaultImpl)) {
+            throw new SOAPProcessingException(
+                    "Expecting SOAP 1.1 implementation of SOAP Fault as the parent. But received some other implementation");
+        }
+    }
+
+    protected void serialize(org.apache.ws.commons.om.impl.OMOutputImpl omOutput, boolean cache) throws XMLStreamException {
+
+        // select the builder
+        short builderType = PULL_TYPE_BUILDER;    // default is pull type
+        if (builder != null) {
+            builderType = this.builder.getBuilderType();
+        }
+        if ((builderType == PUSH_TYPE_BUILDER)
+                && (builder.getRegisteredContentHandler() == null)) {
+            builder.registerExternalContentHandler(
+                    new StreamWriterToContentHandlerConverter(omOutput));
+        }
+
+        XMLStreamWriter writer = omOutput.getXmlStreamWriter();
+        if (this.getNamespace() != null) {
+            String prefix = this.getNamespace().getPrefix();
+            String nameSpaceName = this.getNamespace().getName();
+            writer.writeStartElement(prefix, SOAP11Constants.SOAP_FAULT_CODE_LOCAL_NAME,
+                    nameSpaceName);
+        } else {
+            writer.writeStartElement(
+                    SOAP11Constants.SOAP_FAULT_CODE_LOCAL_NAME);
+        }
+
+        OMSerializerUtil.serializeAttributes(this, omOutput);
+        OMSerializerUtil.serializeNamespaces(this, omOutput);
+
+
+        String text = this.getValue().getText();
+        writer.writeCharacters(text);
+        writer.writeEndElement();
+    }
+
+
+}
diff --git a/src/org/apache/ws/commons/soap/impl/llom/soap11/SOAP11FaultDetailImpl.java b/src/org/apache/ws/commons/soap/impl/llom/soap11/SOAP11FaultDetailImpl.java
new file mode 100644
index 0000000..a59c728
--- /dev/null
+++ b/src/org/apache/ws/commons/soap/impl/llom/soap11/SOAP11FaultDetailImpl.java
@@ -0,0 +1,85 @@
+/*
+ * Copyright 2004,2005 The Apache Software Foundation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      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.
+ */
+
+package org.apache.ws.commons.soap.impl.llom.soap11;
+
+import org.apache.ws.commons.om.OMElement;
+import org.apache.ws.commons.om.OMXMLParserWrapper;
+import org.apache.ws.commons.om.impl.OMNodeEx;
+import org.apache.ws.commons.om.impl.llom.OMSerializerUtil;
+import org.apache.ws.commons.om.impl.llom.serialize.StreamWriterToContentHandlerConverter;
+import org.apache.ws.commons.soap.SOAP11Constants;
+import org.apache.ws.commons.soap.SOAPFault;
+import org.apache.ws.commons.soap.SOAPProcessingException;
+import org.apache.ws.commons.soap.impl.llom.SOAPFaultDetailImpl;
+
+import javax.xml.stream.XMLStreamException;
+import javax.xml.stream.XMLStreamWriter;
+
+public class SOAP11FaultDetailImpl extends SOAPFaultDetailImpl {
+    public SOAP11FaultDetailImpl(SOAPFault parent) throws SOAPProcessingException {
+        super(parent, false);
+    }
+
+    public SOAP11FaultDetailImpl(SOAPFault parent, OMXMLParserWrapper builder) {
+        super(parent, builder);
+    }
+
+    protected void checkParent(OMElement parent) throws SOAPProcessingException {
+        if (!(parent instanceof SOAP11FaultImpl)) {
+            throw new SOAPProcessingException(
+                    "Expecting SOAP 1.1 implementation of SOAP Fault as the parent. But received some other implementation");
+        }
+    }
+
+    public void serialize(org.apache.ws.commons.om.impl.OMOutputImpl omOutput, boolean cache) throws XMLStreamException {
+
+        // select the builder
+        short builderType = PULL_TYPE_BUILDER;    // default is pull type
+        if (builder != null) {
+            builderType = this.builder.getBuilderType();
+        }
+        if ((builderType == PUSH_TYPE_BUILDER)
+                && (builder.getRegisteredContentHandler() == null)) {
+            builder.registerExternalContentHandler(
+                    new StreamWriterToContentHandlerConverter(omOutput));
+        }
+        XMLStreamWriter writer = omOutput.getXmlStreamWriter();
+        if (this.getNamespace() != null) {
+            String prefix = this.getNamespace().getPrefix();
+            String nameSpaceName = this.getNamespace().getName();
+            writer.writeStartElement(prefix, SOAP11Constants.SOAP_FAULT_DETAIL_LOCAL_NAME,
+                    nameSpaceName);
+        } else {
+            writer.writeStartElement(
+                    SOAP11Constants.SOAP_FAULT_DETAIL_LOCAL_NAME);
+        }
+        OMSerializerUtil.serializeAttributes(this, omOutput);
+        OMSerializerUtil.serializeNamespaces(this, omOutput);
+
+
+        String text = this.getText();
+        writer.writeCharacters(text);
+
+
+        if (firstChild != null) {
+            ((OMNodeEx)firstChild).serializeAndConsume(omOutput);
+        }
+        writer.writeEndElement();
+    }
+
+
+}
diff --git a/src/org/apache/ws/commons/soap/impl/llom/soap11/SOAP11FaultImpl.java b/src/org/apache/ws/commons/soap/impl/llom/soap11/SOAP11FaultImpl.java
new file mode 100644
index 0000000..6011736
--- /dev/null
+++ b/src/org/apache/ws/commons/soap/impl/llom/soap11/SOAP11FaultImpl.java
@@ -0,0 +1,120 @@
+/*
+ * Copyright 2004,2005 The Apache Software Foundation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      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.
+ */
+
+package org.apache.ws.commons.soap.impl.llom.soap11;
+
+import org.apache.ws.commons.om.OMElement;
+import org.apache.ws.commons.om.OMXMLParserWrapper;
+import org.apache.ws.commons.soap.SOAPBody;
+import org.apache.ws.commons.soap.SOAPFault;
+import org.apache.ws.commons.soap.SOAPFaultCode;
+import org.apache.ws.commons.soap.SOAPFaultDetail;
+import org.apache.ws.commons.soap.SOAPFaultNode;
+import org.apache.ws.commons.soap.SOAPFaultReason;
+import org.apache.ws.commons.soap.SOAPFaultRole;
+import org.apache.ws.commons.soap.SOAPProcessingException;
+import org.apache.ws.commons.soap.impl.llom.SOAPFaultImpl;
+
+import javax.xml.stream.XMLStreamException;
+
+
+public class SOAP11FaultImpl extends SOAPFaultImpl {
+    /**
+     * Eran Chinthaka (chinthaka@apache.org)
+     */
+
+    public SOAP11FaultImpl(SOAPBody parent, Exception e) throws SOAPProcessingException {
+        super(parent, e);
+    }
+
+    public SOAP11FaultImpl(SOAPBody parent, OMXMLParserWrapper builder) {
+        super(parent, builder);
+    }
+
+    /**
+     * This is a convenience method for the SOAP Fault Impl.
+     *
+     * @param parent
+     */
+    public SOAP11FaultImpl(SOAPBody parent) throws SOAPProcessingException {
+        super(parent);
+
+    }
+
+    protected SOAPFaultDetail getNewSOAPFaultDetail(SOAPFault fault) throws SOAPProcessingException {
+        return new SOAP11FaultDetailImpl(fault);
+    }
+
+    public void serialize(org.apache.ws.commons.om.impl.OMOutputImpl omOutput) throws XMLStreamException {
+        super.serialize(omOutput);
+    }
+
+    public void serializeAndConsume(org.apache.ws.commons.om.impl.OMOutputImpl omOutput) throws XMLStreamException {
+        super.serializeAndConsume(omOutput);
+    }
+
+    public void setCode(SOAPFaultCode soapFaultCode) throws SOAPProcessingException {
+        if (!(soapFaultCode instanceof SOAP11FaultCodeImpl)) {
+            throw new SOAPProcessingException(
+                    "Expecting SOAP 1.1 implementation of SOAP Fault Code. But received some other implementation");
+        }
+        super.setCode(soapFaultCode);
+    }
+
+    public void setReason(SOAPFaultReason reason) throws SOAPProcessingException {
+        if (!(reason instanceof SOAP11FaultReasonImpl)) {
+            throw new SOAPProcessingException(
+                    "Expecting SOAP 1.1 implementation of SOAP Fault Reason. But received some other implementation");
+        }
+        super.setReason(reason);
+    }
+
+    public void setNode(SOAPFaultNode node) throws SOAPProcessingException {
+        if (!(node instanceof SOAP11FaultNodeImpl)) {
+            throw new SOAPProcessingException(
+                    "Expecting SOAP 1.1 implementation of SOAP Fault Node. But received some other implementation");
+        }
+        super.setNode(node);
+    }
+
+    public void setRole(SOAPFaultRole role) throws SOAPProcessingException {
+        if (!(role instanceof SOAP11FaultRoleImpl)) {
+            throw new SOAPProcessingException(
+                    "Expecting SOAP 1.1 implementation of SOAP Fault Role. But received some other implementation");
+        }
+        super.setRole(role);
+    }
+
+    protected void checkParent(OMElement parent) throws SOAPProcessingException {
+        if (!(parent instanceof SOAP11BodyImpl)) {
+            throw new SOAPProcessingException(
+                    "Expecting SOAP 1.1 implementation of SOAP Body as the parent. But received some other implementation");
+        }
+    }
+
+    public void setDetail(SOAPFaultDetail detail) throws SOAPProcessingException {
+        if (!(detail instanceof SOAP11FaultDetailImpl)) {
+            throw new SOAPProcessingException(
+                    "Expecting SOAP 1.1 implementation of SOAP Fault Detail. But received some other implementation");
+        }
+        super.setDetail(detail);
+    }
+
+    protected void serializeFaultNode(org.apache.ws.commons.om.impl.OMOutputImpl omOutput) throws XMLStreamException {
+        
+    }
+
+}
diff --git a/src/org/apache/ws/commons/soap/impl/llom/soap11/SOAP11FaultNodeImpl.java b/src/org/apache/ws/commons/soap/impl/llom/soap11/SOAP11FaultNodeImpl.java
new file mode 100644
index 0000000..2d01dc6
--- /dev/null
+++ b/src/org/apache/ws/commons/soap/impl/llom/soap11/SOAP11FaultNodeImpl.java
@@ -0,0 +1,42 @@
+/*
+ * Copyright 2004,2005 The Apache Software Foundation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      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.
+ */
+
+package org.apache.ws.commons.soap.impl.llom.soap11;
+
+import org.apache.ws.commons.om.OMElement;
+import org.apache.ws.commons.om.OMXMLParserWrapper;
+import org.apache.ws.commons.soap.SOAPFault;
+import org.apache.ws.commons.soap.SOAPProcessingException;
+import org.apache.ws.commons.soap.impl.llom.SOAPFaultNodeImpl;
+
+
+public class SOAP11FaultNodeImpl extends SOAPFaultNodeImpl {
+
+    public SOAP11FaultNodeImpl(SOAPFault parent) throws SOAPProcessingException {
+        super(parent);
+    }
+
+    public SOAP11FaultNodeImpl(SOAPFault parent, OMXMLParserWrapper builder) {
+        super(parent, builder);
+    }
+
+    protected void checkParent(OMElement parent) throws SOAPProcessingException {
+        if (!(parent instanceof SOAP11FaultImpl)) {
+            throw new SOAPProcessingException(
+                    "Expecting SOAP 1.1 implementation of SOAP Fault as the parent. But received some other implementation");
+        }
+    }
+}
diff --git a/src/org/apache/ws/commons/soap/impl/llom/soap11/SOAP11FaultReasonImpl.java b/src/org/apache/ws/commons/soap/impl/llom/soap11/SOAP11FaultReasonImpl.java
new file mode 100644
index 0000000..06beef6
--- /dev/null
+++ b/src/org/apache/ws/commons/soap/impl/llom/soap11/SOAP11FaultReasonImpl.java
@@ -0,0 +1,96 @@
+/*
+ * Copyright 2004,2005 The Apache Software Foundation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      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.
+ */
+
+package org.apache.ws.commons.soap.impl.llom.soap11;
+
+import org.apache.ws.commons.om.OMElement;
+import org.apache.ws.commons.om.OMXMLParserWrapper;
+import org.apache.ws.commons.om.impl.OMOutputImpl;
+import org.apache.ws.commons.om.impl.llom.OMSerializerUtil;
+import org.apache.ws.commons.om.impl.llom.serialize.StreamWriterToContentHandlerConverter;
+import org.apache.ws.commons.soap.SOAP11Constants;
+import org.apache.ws.commons.soap.SOAPFault;
+import org.apache.ws.commons.soap.SOAPFaultText;
+import org.apache.ws.commons.soap.SOAPProcessingException;
+import org.apache.ws.commons.soap.impl.llom.SOAPFaultReasonImpl;
+
+import javax.xml.stream.XMLStreamException;
+import javax.xml.stream.XMLStreamWriter;
+
+public class SOAP11FaultReasonImpl extends SOAPFaultReasonImpl {
+    /**
+     * Eran Chinthaka (chinthaka@apache.org)
+     */
+
+    public SOAP11FaultReasonImpl(SOAPFault parent, OMXMLParserWrapper builder) {
+        super(parent, builder);
+    }
+
+    /**
+     * @param parent
+     */
+    public SOAP11FaultReasonImpl(SOAPFault parent) throws SOAPProcessingException {
+        super(parent, false);
+    }
+
+    public void setSOAPText(SOAPFaultText soapFaultText) throws SOAPProcessingException {
+        if (!(soapFaultText instanceof SOAP11FaultTextImpl)) {
+            throw new SOAPProcessingException(
+                    "Expecting SOAP 1.1 implementation of SOAP Fault Text. But received some other implementation");
+        }
+        super.setSOAPText(soapFaultText);
+    }
+
+    protected void checkParent(OMElement parent) throws SOAPProcessingException {
+        if (!(parent instanceof SOAP11FaultImpl)) {
+            throw new SOAPProcessingException(
+                    "Expecting SOAP 1.1 implementation of SOAP Fault as the parent. But received some other implementation");
+        }
+    }
+
+    protected void serialize(OMOutputImpl omOutput, boolean cache) throws XMLStreamException {
+
+        // select the builder
+        short builderType = PULL_TYPE_BUILDER;    // default is pull type
+        if (builder != null) {
+            builderType = this.builder.getBuilderType();
+        }
+        if ((builderType == PUSH_TYPE_BUILDER)
+                && (builder.getRegisteredContentHandler() == null)) {
+            builder.registerExternalContentHandler(
+                    new StreamWriterToContentHandlerConverter(omOutput));
+        }
+
+        XMLStreamWriter writer = omOutput.getXmlStreamWriter();
+        if (this.getNamespace() != null) {
+            String prefix = this.getNamespace().getPrefix();
+            String nameSpaceName = this.getNamespace().getName();
+            writer.writeStartElement(prefix, SOAP11Constants.SOAP_FAULT_STRING_LOCAL_NAME,
+                    nameSpaceName);
+        } else {
+            writer.writeStartElement(
+                    SOAP11Constants.SOAP_FAULT_STRING_LOCAL_NAME);
+        }
+        OMSerializerUtil.serializeAttributes(this, omOutput);
+        OMSerializerUtil.serializeNamespaces(this, omOutput);
+
+        String text = this.getSOAPText().getText();
+        writer.writeCharacters(text);
+        writer.writeEndElement();
+    }
+
+
+}
diff --git a/src/org/apache/ws/commons/soap/impl/llom/soap11/SOAP11FaultRoleImpl.java b/src/org/apache/ws/commons/soap/impl/llom/soap11/SOAP11FaultRoleImpl.java
new file mode 100644
index 0000000..e987305
--- /dev/null
+++ b/src/org/apache/ws/commons/soap/impl/llom/soap11/SOAP11FaultRoleImpl.java
@@ -0,0 +1,79 @@
+/*
+ * Copyright 2004,2005 The Apache Software Foundation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      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.
+ */
+
+package org.apache.ws.commons.soap.impl.llom.soap11;
+
+import org.apache.ws.commons.om.OMElement;
+import org.apache.ws.commons.om.OMXMLParserWrapper;
+import org.apache.ws.commons.om.impl.llom.OMSerializerUtil;
+import org.apache.ws.commons.om.impl.llom.serialize.StreamWriterToContentHandlerConverter;
+import org.apache.ws.commons.soap.SOAP11Constants;
+import org.apache.ws.commons.soap.SOAPFault;
+import org.apache.ws.commons.soap.SOAPProcessingException;
+import org.apache.ws.commons.soap.impl.llom.SOAPFaultRoleImpl;
+
+import javax.xml.stream.XMLStreamException;
+import javax.xml.stream.XMLStreamWriter;
+
+public class SOAP11FaultRoleImpl extends SOAPFaultRoleImpl {
+    public SOAP11FaultRoleImpl(SOAPFault parent) throws SOAPProcessingException {
+        super(parent, false);
+    }
+
+    public SOAP11FaultRoleImpl(SOAPFault parent, OMXMLParserWrapper builder) {
+        super(parent, builder);
+    }
+
+    protected void checkParent(OMElement parent) throws SOAPProcessingException {
+        if (!(parent instanceof SOAP11FaultImpl)) {
+            throw new SOAPProcessingException(
+                    "Expecting SOAP 1.1 implementation of SOAP Fault as the parent. But received some other implementation");
+        }
+    }
+
+    protected void serialize(org.apache.ws.commons.om.impl.OMOutputImpl omOutput, boolean cache) throws XMLStreamException {
+
+        // select the builder
+        short builderType = PULL_TYPE_BUILDER;    // default is pull type
+        if (builder != null) {
+            builderType = this.builder.getBuilderType();
+        }
+        if ((builderType == PUSH_TYPE_BUILDER)
+                && (builder.getRegisteredContentHandler() == null)) {
+            builder.registerExternalContentHandler(
+                    new StreamWriterToContentHandlerConverter(omOutput));
+        }
+
+        XMLStreamWriter writer = omOutput.getXmlStreamWriter();
+        if (this.getNamespace() != null) {
+            String prefix = this.getNamespace().getPrefix();
+            String nameSpaceName = this.getNamespace().getName();
+            writer.writeStartElement(prefix, SOAP11Constants.SOAP_FAULT_ACTOR_LOCAL_NAME,
+                    nameSpaceName);
+        } else {
+            writer.writeStartElement(
+                    SOAP11Constants.SOAP_FAULT_ACTOR_LOCAL_NAME);
+        }
+        OMSerializerUtil.serializeAttributes(this, omOutput);
+        OMSerializerUtil.serializeNamespaces(this, omOutput);
+
+        String text = this.getText();
+        writer.writeCharacters(text);
+        writer.writeEndElement();
+    }
+
+
+}
diff --git a/src/org/apache/ws/commons/soap/impl/llom/soap11/SOAP11FaultSubCodeImpl.java b/src/org/apache/ws/commons/soap/impl/llom/soap11/SOAP11FaultSubCodeImpl.java
new file mode 100644
index 0000000..1285e0d
--- /dev/null
+++ b/src/org/apache/ws/commons/soap/impl/llom/soap11/SOAP11FaultSubCodeImpl.java
@@ -0,0 +1,71 @@
+/*
+ * Copyright 2004,2005 The Apache Software Foundation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      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.
+ */
+
+package org.apache.ws.commons.soap.impl.llom.soap11;
+
+import org.apache.ws.commons.om.OMElement;
+import org.apache.ws.commons.om.OMXMLParserWrapper;
+import org.apache.ws.commons.soap.SOAP12Constants;
+import org.apache.ws.commons.soap.SOAPFaultCode;
+import org.apache.ws.commons.soap.SOAPFaultSubCode;
+import org.apache.ws.commons.soap.SOAPFaultValue;
+import org.apache.ws.commons.soap.SOAPProcessingException;
+import org.apache.ws.commons.soap.impl.llom.SOAPFaultSubCodeImpl;
+
+public class SOAP11FaultSubCodeImpl extends SOAPFaultSubCodeImpl {
+    //changed
+    public SOAP11FaultSubCodeImpl(SOAPFaultCode parent) throws SOAPProcessingException {
+        super(parent, SOAP12Constants.SOAP_FAULT_SUB_CODE_LOCAL_NAME);
+    }
+
+    //changed
+    public SOAP11FaultSubCodeImpl(SOAPFaultCode parent,
+                                  OMXMLParserWrapper builder) {
+        super(parent, SOAP12Constants.SOAP_FAULT_SUB_CODE_LOCAL_NAME, builder);
+    }
+
+    public SOAP11FaultSubCodeImpl(SOAPFaultSubCode parent) throws SOAPProcessingException {
+        super(parent, SOAP12Constants.SOAP_FAULT_SUB_CODE_LOCAL_NAME);
+    }
+
+    public SOAP11FaultSubCodeImpl(SOAPFaultSubCode parent,
+                                  OMXMLParserWrapper builder) {
+        super(parent, SOAP12Constants.SOAP_FAULT_SUB_CODE_LOCAL_NAME, builder);
+    }
+
+    protected void checkParent(OMElement parent) throws SOAPProcessingException {
+        if (!(parent instanceof SOAP11FaultSubCodeImpl) ||
+                (parent instanceof SOAP11FaultCodeImpl)) {
+            throw new SOAPProcessingException("Expecting SOAP 1.1 implementation of SOAP FaultSubCode or SOAP FaultCode as the parent. But received some other implementation");
+        }
+    }
+
+    public void setSubCode(SOAPFaultSubCode subCode) throws SOAPProcessingException {
+        if (!((parent instanceof SOAP11FaultSubCodeImpl) || (parent instanceof SOAP11FaultCodeImpl))) {
+            throw new SOAPProcessingException("Expecting SOAP 1.1 implementation of SOAP Fault Sub Code. But received some other implementation");
+        }
+        super.setSubCode(subCode);
+    }
+
+    public void setValue(SOAPFaultValue soapFaultSubCodeValue) throws SOAPProcessingException {
+        if (!(soapFaultSubCodeValue instanceof SOAP11FaultValueImpl)) {
+            throw new SOAPProcessingException("Expecting SOAP 1.1 implementation of SOAP Fault Value. But received some other implementation");
+        }
+        super.setValue(soapFaultSubCodeValue);
+    }
+
+
+}
diff --git a/src/org/apache/ws/commons/soap/impl/llom/soap11/SOAP11FaultTextImpl.java b/src/org/apache/ws/commons/soap/impl/llom/soap11/SOAP11FaultTextImpl.java
new file mode 100644
index 0000000..f76efc8
--- /dev/null
+++ b/src/org/apache/ws/commons/soap/impl/llom/soap11/SOAP11FaultTextImpl.java
@@ -0,0 +1,41 @@
+/*
+ * Copyright 2004,2005 The Apache Software Foundation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      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.
+ */
+
+package org.apache.ws.commons.soap.impl.llom.soap11;
+
+import org.apache.ws.commons.om.OMElement;
+import org.apache.ws.commons.om.OMXMLParserWrapper;
+import org.apache.ws.commons.soap.SOAPFaultReason;
+import org.apache.ws.commons.soap.SOAPProcessingException;
+import org.apache.ws.commons.soap.impl.llom.SOAPFaultTextImpl;
+
+public class SOAP11FaultTextImpl extends SOAPFaultTextImpl {
+    public SOAP11FaultTextImpl(SOAPFaultReason parent) throws SOAPProcessingException {
+        super(parent);
+    }
+
+    public SOAP11FaultTextImpl(SOAPFaultReason parent,
+                               OMXMLParserWrapper builder) {
+        super(parent, builder);
+    }
+
+    protected void checkParent(OMElement parent) throws SOAPProcessingException {
+        if (!(parent instanceof SOAP11FaultReasonImpl)) {
+            throw new SOAPProcessingException(
+                    "Expecting SOAP 1.1 implementation of SOAP FaultReason as the parent. But received some other implementation");
+        }
+    }
+}
diff --git a/src/org/apache/ws/commons/soap/impl/llom/soap11/SOAP11FaultValueImpl.java b/src/org/apache/ws/commons/soap/impl/llom/soap11/SOAP11FaultValueImpl.java
new file mode 100644
index 0000000..96bf6fa
--- /dev/null
+++ b/src/org/apache/ws/commons/soap/impl/llom/soap11/SOAP11FaultValueImpl.java
@@ -0,0 +1,42 @@
+/*
+ * Copyright 2004,2005 The Apache Software Foundation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      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.
+ */
+
+package org.apache.ws.commons.soap.impl.llom.soap11;
+
+import org.apache.ws.commons.om.OMElement;
+import org.apache.ws.commons.om.OMXMLParserWrapper;
+import org.apache.ws.commons.soap.SOAPProcessingException;
+import org.apache.ws.commons.soap.impl.llom.SOAPFaultValueImpl;
+
+public class SOAP11FaultValueImpl extends SOAPFaultValueImpl {
+    public SOAP11FaultValueImpl(OMElement parent) throws SOAPProcessingException {
+        super(parent);
+    }
+
+    public SOAP11FaultValueImpl(OMElement parent, OMXMLParserWrapper builder) {
+        super(parent, builder);
+    }
+
+
+    protected void checkParent(OMElement parent) throws SOAPProcessingException {
+        if (!((parent instanceof SOAP11FaultSubCodeImpl) ||
+                (parent instanceof SOAP11FaultCodeImpl))) {
+            throw new SOAPProcessingException(
+                    "Expecting SOAP 1.1 implementation of SOAP FaultSubCode or SOAP FaultCode as the parent. But received some other implementation." +
+                    parent.getClass());
+        }
+    }
+}
diff --git a/src/org/apache/ws/commons/soap/impl/llom/soap11/SOAP11HeaderBlockImpl.java b/src/org/apache/ws/commons/soap/impl/llom/soap11/SOAP11HeaderBlockImpl.java
new file mode 100644
index 0000000..572eff0
--- /dev/null
+++ b/src/org/apache/ws/commons/soap/impl/llom/soap11/SOAP11HeaderBlockImpl.java
@@ -0,0 +1,129 @@
+/*
+ * Copyright 2004,2005 The Apache Software Foundation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      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.
+ */
+
+package org.apache.ws.commons.soap.impl.llom.soap11;
+
+import org.apache.ws.commons.om.OMElement;
+import org.apache.ws.commons.om.OMNamespace;
+import org.apache.ws.commons.om.OMXMLParserWrapper;
+import org.apache.ws.commons.soap.SOAP11Constants;
+import org.apache.ws.commons.soap.SOAPConstants;
+import org.apache.ws.commons.soap.SOAPHeader;
+import org.apache.ws.commons.soap.SOAPProcessingException;
+import org.apache.ws.commons.soap.impl.llom.SOAPHeaderBlockImpl;
+
+public class SOAP11HeaderBlockImpl extends SOAPHeaderBlockImpl {
+    /**
+     * @param localName
+     * @param ns
+     */
+    public SOAP11HeaderBlockImpl(String localName,
+                                 OMNamespace ns,
+                                 SOAPHeader parent) throws SOAPProcessingException {
+        super(localName, ns, parent);
+        checkParent(parent);
+    }
+
+    /**
+     * Constructor SOAPHeaderBlockImpl
+     *
+     * @param localName
+     * @param ns
+     * @param parent
+     * @param builder
+     */
+    public SOAP11HeaderBlockImpl(String localName,
+                                 OMNamespace ns,
+                                 OMElement parent,
+                                 OMXMLParserWrapper builder) {
+        super(localName, ns, parent, builder);
+    }
+
+
+    protected void checkParent(OMElement parent) throws SOAPProcessingException {
+        if (!(parent instanceof SOAP11HeaderImpl)) {
+            throw new SOAPProcessingException(
+                    "Expecting SOAP 1.1 implementation of SOAP Body as the parent. But received some other implementation");
+        }
+    }
+
+    public void setRole(String roleURI) {
+        setAttribute(SOAP11Constants.ATTR_ACTOR,
+                roleURI,
+                SOAP11Constants.SOAP_ENVELOPE_NAMESPACE_URI);
+
+    }
+
+    public String getRole() {
+        return getAttribute(SOAP11Constants.ATTR_ACTOR,
+                SOAP11Constants.SOAP_ENVELOPE_NAMESPACE_URI);
+    }
+
+    public void setMustUnderstand(boolean mustUnderstand) {
+        setAttribute(SOAPConstants.ATTR_MUSTUNDERSTAND,
+                mustUnderstand ? "1" : "0",
+                SOAP11Constants.SOAP_ENVELOPE_NAMESPACE_URI);
+    }
+
+    public void setMustUnderstand(String mustUnderstand) throws SOAPProcessingException {
+        if (SOAPConstants.ATTR_MUSTUNDERSTAND_TRUE.equals(mustUnderstand) ||
+                SOAPConstants.ATTR_MUSTUNDERSTAND_FALSE.equals(mustUnderstand) ||
+                SOAPConstants.ATTR_MUSTUNDERSTAND_0.equals(mustUnderstand) ||
+                SOAPConstants.ATTR_MUSTUNDERSTAND_1.equals(mustUnderstand)) {
+            setAttribute(SOAPConstants.ATTR_MUSTUNDERSTAND,
+                    mustUnderstand,
+                    SOAP11Constants.SOAP_ENVELOPE_NAMESPACE_URI);
+        } else {
+            throw new SOAPProcessingException(
+                    "mustUndertand should be one of \"true\", \"false\", \"0\" or \"1\" ");
+        }
+    }
+
+    /**
+     * Returns whether the mustUnderstand attribute for this
+     * <CODE>SOAPHeaderBlock</CODE> object is turned on.
+     *
+     * @return <CODE>true</CODE> if the mustUnderstand attribute of
+     *         this <CODE>SOAPHeaderBlock</CODE> object is turned on;
+     *         <CODE>false</CODE> otherwise
+     */
+    public boolean getMustUnderstand() throws SOAPProcessingException {
+        String mustUnderstand = "";
+        if ((mustUnderstand =
+                getAttribute(SOAPConstants.ATTR_MUSTUNDERSTAND,
+                        SOAP11Constants.SOAP_ENVELOPE_NAMESPACE_URI))
+                != null) {
+            if (SOAPConstants.ATTR_MUSTUNDERSTAND_TRUE.equalsIgnoreCase(
+                    mustUnderstand) ||
+                    SOAPConstants.ATTR_MUSTUNDERSTAND_1.equalsIgnoreCase(
+                            mustUnderstand)) {
+                return true;
+            } else if (SOAPConstants.ATTR_MUSTUNDERSTAND_FALSE.equalsIgnoreCase(
+                    mustUnderstand) ||
+                    SOAPConstants.ATTR_MUSTUNDERSTAND_0.equalsIgnoreCase(
+                            mustUnderstand)) {
+                return false;
+            } else {
+                throw new SOAPProcessingException(
+                        "Invalid value found in mustUnderstand value of " +
+                        this.getLocalName() +
+                        " header block");
+            }
+        }
+        return false;
+
+    }
+}
diff --git a/src/org/apache/ws/commons/soap/impl/llom/soap11/SOAP11HeaderImpl.java b/src/org/apache/ws/commons/soap/impl/llom/soap11/SOAP11HeaderImpl.java
new file mode 100644
index 0000000..dcf03bb
--- /dev/null
+++ b/src/org/apache/ws/commons/soap/impl/llom/soap11/SOAP11HeaderImpl.java
@@ -0,0 +1,82 @@
+/*
+ * Copyright 2004,2005 The Apache Software Foundation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      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.
+ */
+
+package org.apache.ws.commons.soap.impl.llom.soap11;
+
+import org.apache.ws.commons.om.OMException;
+import org.apache.ws.commons.om.OMNamespace;
+import org.apache.ws.commons.om.OMXMLParserWrapper;
+import org.apache.ws.commons.om.impl.OMNodeEx;
+import org.apache.ws.commons.om.impl.llom.traverse.OMChildrenWithSpecificAttributeIterator;
+import org.apache.ws.commons.soap.SOAP11Constants;
+import org.apache.ws.commons.soap.SOAPEnvelope;
+import org.apache.ws.commons.soap.SOAPHeaderBlock;
+import org.apache.ws.commons.soap.SOAPProcessingException;
+import org.apache.ws.commons.soap.impl.llom.SOAPHeaderImpl;
+
+import javax.xml.namespace.QName;
+import java.util.Iterator;
+
+public class SOAP11HeaderImpl extends SOAPHeaderImpl {
+    /**
+     * @param envelope
+     */
+    public SOAP11HeaderImpl(SOAPEnvelope envelope) throws SOAPProcessingException {
+        super(envelope);
+    }
+
+    /**
+     * Constructor SOAPHeaderImpl
+     *
+     * @param envelope
+     * @param builder
+     */
+    public SOAP11HeaderImpl(SOAPEnvelope envelope, OMXMLParserWrapper builder) {
+        super(envelope, builder);
+    }
+
+    public SOAPHeaderBlock addHeaderBlock(String localName, OMNamespace ns) throws OMException {
+        if (ns == null || ns.getName() == null || "".equals(ns.getName())) {
+            throw new OMException(
+                    "All the SOAP Header blocks should be namespace qualified");
+        }
+
+        OMNamespace namespace = findNamespace(ns.getName(), ns.getPrefix());
+        if (namespace != null) {
+            ns = namespace;
+        }
+
+        SOAPHeaderBlock soapHeaderBlock = null;
+        try {
+            soapHeaderBlock = new SOAP11HeaderBlockImpl(localName, ns, this);
+        } catch (SOAPProcessingException e) {
+            throw new OMException(e);
+        }
+        ((OMNodeEx)soapHeaderBlock).setComplete(true);
+        return soapHeaderBlock;
+    }
+
+    public Iterator extractHeaderBlocks(String role) {
+        return new OMChildrenWithSpecificAttributeIterator(getFirstOMChild(),
+                new QName(SOAP11Constants.SOAP_ENVELOPE_NAMESPACE_URI,
+                        SOAP11Constants.ATTR_ACTOR),
+                role,
+                true);
+
+    }
+
+
+}
diff --git a/src/org/apache/ws/commons/soap/impl/llom/soap12/SOAP12BodyImpl.java b/src/org/apache/ws/commons/soap/impl/llom/soap12/SOAP12BodyImpl.java
new file mode 100644
index 0000000..0b3cbba
--- /dev/null
+++ b/src/org/apache/ws/commons/soap/impl/llom/soap12/SOAP12BodyImpl.java
@@ -0,0 +1,48 @@
+/*
+ * Copyright 2004,2005 The Apache Software Foundation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      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.
+ */
+
+package org.apache.ws.commons.soap.impl.llom.soap12;
+
+import org.apache.ws.commons.om.OMException;
+import org.apache.ws.commons.om.OMXMLParserWrapper;
+import org.apache.ws.commons.soap.SOAPEnvelope;
+import org.apache.ws.commons.soap.SOAPFault;
+import org.apache.ws.commons.soap.SOAPProcessingException;
+import org.apache.ws.commons.soap.impl.llom.SOAPBodyImpl;
+
+public class SOAP12BodyImpl extends SOAPBodyImpl {
+    /**
+     * @param envelope
+     */
+    public SOAP12BodyImpl(SOAPEnvelope envelope) throws SOAPProcessingException {
+        super(envelope);
+    }
+
+    /**
+     * Constructor SOAPBodyImpl
+     *
+     * @param envelope
+     * @param builder
+     */
+    public SOAP12BodyImpl(SOAPEnvelope envelope, OMXMLParserWrapper builder) {
+        super(envelope, builder);
+    }
+
+    public SOAPFault addFault(Exception e) throws OMException {
+        SOAPFault soapFault = new SOAP12FaultImpl(this, e);
+        return soapFault;
+    }
+}
diff --git a/src/org/apache/ws/commons/soap/impl/llom/soap12/SOAP12Factory.java b/src/org/apache/ws/commons/soap/impl/llom/soap12/SOAP12Factory.java
new file mode 100644
index 0000000..2ebaffc
--- /dev/null
+++ b/src/org/apache/ws/commons/soap/impl/llom/soap12/SOAP12Factory.java
@@ -0,0 +1,207 @@
+/*
+ * Copyright 2004,2005 The Apache Software Foundation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      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.
+ */
+
+package org.apache.ws.commons.soap.impl.llom.soap12;
+
+import org.apache.ws.commons.om.OMNamespace;
+import org.apache.ws.commons.om.OMXMLParserWrapper;
+import org.apache.ws.commons.om.impl.llom.OMNamespaceImpl;
+import org.apache.ws.commons.soap.SOAP12Constants;
+import org.apache.ws.commons.soap.SOAPBody;
+import org.apache.ws.commons.soap.SOAPEnvelope;
+import org.apache.ws.commons.soap.SOAPFault;
+import org.apache.ws.commons.soap.SOAPFaultCode;
+import org.apache.ws.commons.soap.SOAPFaultDetail;
+import org.apache.ws.commons.soap.SOAPFaultNode;
+import org.apache.ws.commons.soap.SOAPFaultReason;
+import org.apache.ws.commons.soap.SOAPFaultRole;
+import org.apache.ws.commons.soap.SOAPFaultSubCode;
+import org.apache.ws.commons.soap.SOAPFaultText;
+import org.apache.ws.commons.soap.SOAPFaultValue;
+import org.apache.ws.commons.soap.SOAPHeader;
+import org.apache.ws.commons.soap.SOAPHeaderBlock;
+import org.apache.ws.commons.soap.SOAPProcessingException;
+import org.apache.ws.commons.soap.impl.llom.SOAPEnvelopeImpl;
+import org.apache.ws.commons.soap.impl.llom.factory.SOAPLinkedListImplFactory;
+
+public class SOAP12Factory extends SOAPLinkedListImplFactory {
+    /**
+     * Eran Chinthaka (chinthaka@apache.org)
+     */
+
+    public String getSoapVersionURI() {
+        return SOAP12Constants.SOAP_ENVELOPE_NAMESPACE_URI;
+    }
+
+    public SOAPEnvelope createSOAPEnvelope() {
+        return new SOAPEnvelopeImpl(
+                new OMNamespaceImpl(
+                        SOAP12Constants.SOAP_ENVELOPE_NAMESPACE_URI,
+                        SOAP12Constants.SOAP_DEFAULT_NAMESPACE_PREFIX),
+                this);
+    }
+
+    public SOAPHeader createSOAPHeader(SOAPEnvelope envelope) throws SOAPProcessingException {
+        return new SOAP12HeaderImpl(envelope);
+    }
+
+    public SOAPHeader createSOAPHeader(SOAPEnvelope envelope,
+                                       OMXMLParserWrapper builder) {
+        return new SOAP12HeaderImpl(envelope, builder);
+    }
+
+    public SOAPHeaderBlock createSOAPHeaderBlock(String localName,
+                                                 OMNamespace ns,
+                                                 SOAPHeader parent) throws SOAPProcessingException {
+        return new SOAP12HeaderBlockImpl(localName, ns, parent);
+    }
+
+    public SOAPHeaderBlock createSOAPHeaderBlock(String localName,
+                                                 OMNamespace ns,
+                                                 SOAPHeader parent,
+                                                 OMXMLParserWrapper builder) throws SOAPProcessingException {
+        return new SOAP12HeaderBlockImpl(localName, ns, parent, builder);
+    }
+
+    public SOAPFault createSOAPFault(SOAPBody parent, Exception e) throws SOAPProcessingException {
+        return new SOAP12FaultImpl(parent, e);
+    }
+
+    public SOAPFault createSOAPFault(SOAPBody parent) throws SOAPProcessingException {
+        return new SOAP12FaultImpl(parent);
+    }
+
+    public SOAPFault createSOAPFault(SOAPBody parent,
+                                     OMXMLParserWrapper builder) {
+        return new SOAP12FaultImpl(parent, builder);
+    }
+
+    public SOAPBody createSOAPBody(SOAPEnvelope envelope) throws SOAPProcessingException {
+        return new SOAP12BodyImpl(envelope);
+    }
+
+    public SOAPBody createSOAPBody(SOAPEnvelope envelope,
+                                   OMXMLParserWrapper builder) {
+        return new SOAP12BodyImpl(envelope, builder);
+    }
+
+    public SOAPFaultCode createSOAPFaultCode(SOAPFault parent) throws SOAPProcessingException {
+        return new SOAP12FaultCodeImpl(parent);
+    }
+
+    public SOAPFaultCode createSOAPFaultCode(SOAPFault parent,
+                                             OMXMLParserWrapper builder) {
+        return new SOAP12FaultCodeImpl(parent, builder);
+    }
+
+    public SOAPFaultValue createSOAPFaultValue(SOAPFaultCode parent) throws SOAPProcessingException {
+        return new SOAP12FaultValueImpl(parent);
+    }
+
+    public SOAPFaultValue createSOAPFaultValue(SOAPFaultCode parent,
+                                               OMXMLParserWrapper builder) {
+        return new SOAP12FaultValueImpl(parent, builder);
+    }
+
+    //added
+    public SOAPFaultValue createSOAPFaultValue(SOAPFaultSubCode parent) throws SOAPProcessingException {
+        return new SOAP12FaultValueImpl(parent);
+    }
+
+    //added
+    public SOAPFaultValue createSOAPFaultValue(SOAPFaultSubCode parent,
+                                               OMXMLParserWrapper builder) {
+        return new SOAP12FaultValueImpl(parent, builder);
+    }
+
+    //changed
+    public SOAPFaultSubCode createSOAPFaultSubCode(SOAPFaultCode parent) throws SOAPProcessingException {
+        return new SOAP12FaultSubCodeImpl(parent);
+    }
+
+    //changed
+    public SOAPFaultSubCode createSOAPFaultSubCode(SOAPFaultCode parent,
+                                                   OMXMLParserWrapper builder) {
+        return new SOAP12FaultSubCodeImpl(parent, builder);
+    }
+
+    public SOAPFaultSubCode createSOAPFaultSubCode(SOAPFaultSubCode parent) throws SOAPProcessingException {
+        return new SOAP12FaultSubCodeImpl(parent);
+    }
+
+    public SOAPFaultSubCode createSOAPFaultSubCode(SOAPFaultSubCode parent,
+                                                   OMXMLParserWrapper builder) {
+        return new SOAP12FaultSubCodeImpl(parent, builder);
+    }
+
+    public SOAPFaultReason createSOAPFaultReason(SOAPFault parent) throws SOAPProcessingException {
+        return new SOAP12FaultReasonImpl(parent);
+    }
+
+    public SOAPFaultReason createSOAPFaultReason(SOAPFault parent,
+                                                 OMXMLParserWrapper builder) {
+        return new SOAP12FaultReasonImpl(parent, builder);
+    }
+
+    public SOAPFaultText createSOAPFaultText(SOAPFaultReason parent) throws SOAPProcessingException {
+        return new SOAP12FaultTextImpl(parent);
+    }
+
+    public SOAPFaultText createSOAPFaultText(SOAPFaultReason parent,
+                                             OMXMLParserWrapper builder) {
+        return new SOAP12FaultTextImpl(parent, builder);
+    }
+
+    public SOAPFaultNode createSOAPFaultNode(SOAPFault parent) throws SOAPProcessingException {
+        return new SOAP12FaultNodeImpl(parent);
+    }
+
+    public SOAPFaultNode createSOAPFaultNode(SOAPFault parent,
+                                             OMXMLParserWrapper builder) {
+        return new SOAP12FaultNodeImpl(parent, builder);
+    }
+
+    public SOAPFaultRole createSOAPFaultRole(SOAPFault parent) throws SOAPProcessingException {
+        return new SOAP12FaultRoleImpl(parent);
+    }
+
+    public SOAPFaultRole createSOAPFaultRole(SOAPFault parent,
+                                             OMXMLParserWrapper builder) {
+        return new SOAP12FaultRoleImpl(parent, builder);
+    }
+
+    public SOAPFaultDetail createSOAPFaultDetail(SOAPFault parent) throws SOAPProcessingException {
+        return new SOAP12FaultDetailImpl(parent);
+    }
+
+    public SOAPFaultDetail createSOAPFaultDetail(SOAPFault parent,
+                                                 OMXMLParserWrapper builder) {
+        return new SOAP12FaultDetailImpl(parent, builder);
+    }
+
+    public SOAPEnvelope getDefaultEnvelope() throws SOAPProcessingException {
+        OMNamespace ns =
+                new OMNamespaceImpl(
+                        SOAP12Constants.SOAP_ENVELOPE_NAMESPACE_URI,
+                        SOAP12Constants.SOAP_DEFAULT_NAMESPACE_PREFIX);
+        SOAPEnvelopeImpl env = new SOAPEnvelopeImpl(ns, this);
+        createSOAPHeader(env);
+        createSOAPBody(env);
+
+        return env;
+    }
+
+}
diff --git a/src/org/apache/ws/commons/soap/impl/llom/soap12/SOAP12FaultCodeImpl.java b/src/org/apache/ws/commons/soap/impl/llom/soap12/SOAP12FaultCodeImpl.java
new file mode 100644
index 0000000..a150291
--- /dev/null
+++ b/src/org/apache/ws/commons/soap/impl/llom/soap12/SOAP12FaultCodeImpl.java
@@ -0,0 +1,71 @@
+/*
+ * Copyright 2004,2005 The Apache Software Foundation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      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.
+ */
+
+package org.apache.ws.commons.soap.impl.llom.soap12;
+
+import org.apache.ws.commons.om.OMElement;
+import org.apache.ws.commons.om.OMXMLParserWrapper;
+import org.apache.ws.commons.soap.SOAPFault;
+import org.apache.ws.commons.soap.SOAPFaultSubCode;
+import org.apache.ws.commons.soap.SOAPFaultValue;
+import org.apache.ws.commons.soap.SOAPProcessingException;
+import org.apache.ws.commons.soap.impl.llom.SOAPFaultCodeImpl;
+
+public class SOAP12FaultCodeImpl extends SOAPFaultCodeImpl {
+    /**
+     * Eran Chinthaka (chinthaka@apache.org)
+     */
+    /**
+     * Constructor OMElementImpl
+     *
+     * @param parent
+     * @param builder
+     */
+    public SOAP12FaultCodeImpl(SOAPFault parent, OMXMLParserWrapper builder) {
+        super(parent, builder);
+    }
+
+    /**
+     * @param parent
+     */
+    public SOAP12FaultCodeImpl(SOAPFault parent) throws SOAPProcessingException {
+        super(parent, true);
+    }
+
+
+    public void setSubCode(SOAPFaultSubCode subCode) throws SOAPProcessingException {
+        if (!(subCode instanceof SOAP12FaultSubCodeImpl)) {
+            throw new SOAPProcessingException(
+                    "Expecting SOAP 1.2 implementation of SOAP Fault Sub Code. But received some other implementation");
+        }
+        super.setSubCode(subCode);
+    }
+
+    public void setValue(SOAPFaultValue value) throws SOAPProcessingException {
+        if (!(value instanceof SOAP12FaultValueImpl)) {
+            throw new SOAPProcessingException(
+                    "Expecting SOAP 1.2 implementation of SOAP Fault Value. But received some other implementation");
+        }
+        super.setValue(value);
+    }
+
+    protected void checkParent(OMElement parent) throws SOAPProcessingException {
+        if (!(parent instanceof SOAP12FaultImpl)) {
+            throw new SOAPProcessingException(
+                    "Expecting SOAP 1.2 implementation of SOAP Fault as the parent. But received some other implementation");
+        }
+    }
+}
diff --git a/src/org/apache/ws/commons/soap/impl/llom/soap12/SOAP12FaultDetailImpl.java b/src/org/apache/ws/commons/soap/impl/llom/soap12/SOAP12FaultDetailImpl.java
new file mode 100644
index 0000000..d3a8576
--- /dev/null
+++ b/src/org/apache/ws/commons/soap/impl/llom/soap12/SOAP12FaultDetailImpl.java
@@ -0,0 +1,41 @@
+/*
+ * Copyright 2004,2005 The Apache Software Foundation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      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.
+ */
+
+package org.apache.ws.commons.soap.impl.llom.soap12;
+
+import org.apache.ws.commons.om.OMElement;
+import org.apache.ws.commons.om.OMXMLParserWrapper;
+import org.apache.ws.commons.soap.SOAPFault;
+import org.apache.ws.commons.soap.SOAPProcessingException;
+import org.apache.ws.commons.soap.impl.llom.SOAPFaultDetailImpl;
+
+
+public class SOAP12FaultDetailImpl extends SOAPFaultDetailImpl {
+    public SOAP12FaultDetailImpl(SOAPFault parent) throws SOAPProcessingException {
+        super(parent, true);
+    }
+
+    public SOAP12FaultDetailImpl(SOAPFault parent, OMXMLParserWrapper builder) {
+        super(parent, builder);
+    }
+
+    protected void checkParent(OMElement parent) throws SOAPProcessingException {
+        if (!(parent instanceof SOAP12FaultImpl)) {
+            throw new SOAPProcessingException(
+                    "Expecting SOAP 1.2 implementation of SOAP Fault as the parent. But received some other implementation");
+        }
+    }
+}
diff --git a/src/org/apache/ws/commons/soap/impl/llom/soap12/SOAP12FaultImpl.java b/src/org/apache/ws/commons/soap/impl/llom/soap12/SOAP12FaultImpl.java
new file mode 100644
index 0000000..f1fe461
--- /dev/null
+++ b/src/org/apache/ws/commons/soap/impl/llom/soap12/SOAP12FaultImpl.java
@@ -0,0 +1,116 @@
+/*
+ * Copyright 2004,2005 The Apache Software Foundation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      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.
+ */
+
+package org.apache.ws.commons.soap.impl.llom.soap12;
+
+import org.apache.ws.commons.om.OMElement;
+import org.apache.ws.commons.om.OMXMLParserWrapper;
+import org.apache.ws.commons.om.impl.OMNodeEx;
+import org.apache.ws.commons.soap.SOAPBody;
+import org.apache.ws.commons.soap.SOAPFault;
+import org.apache.ws.commons.soap.SOAPFaultCode;
+import org.apache.ws.commons.soap.SOAPFaultDetail;
+import org.apache.ws.commons.soap.SOAPFaultNode;
+import org.apache.ws.commons.soap.SOAPFaultReason;
+import org.apache.ws.commons.soap.SOAPFaultRole;
+import org.apache.ws.commons.soap.SOAPProcessingException;
+import org.apache.ws.commons.soap.impl.llom.SOAPFaultImpl;
+
+import javax.xml.stream.XMLStreamException;
+
+
+public class SOAP12FaultImpl extends SOAPFaultImpl {
+    /**
+     * Eran Chinthaka (chinthaka@apache.org)
+     */
+
+    public SOAP12FaultImpl(SOAPBody parent, Exception e) throws SOAPProcessingException {
+        super(parent, e);
+    }
+
+    public SOAP12FaultImpl(SOAPBody parent, OMXMLParserWrapper builder) {
+        super(parent, builder);
+    }
+
+    /**
+     * This is a convenience method for the SOAP Fault Impl.
+     *
+     * @param parent
+     */
+    public SOAP12FaultImpl(SOAPBody parent) throws SOAPProcessingException {
+        super(parent);
+    }
+
+    protected SOAPFaultDetail getNewSOAPFaultDetail(SOAPFault fault) {
+        return new SOAP12FaultDetailImpl(fault);
+
+    }
+
+    public void setCode(SOAPFaultCode soapFaultCode) throws SOAPProcessingException {
+        if (!(soapFaultCode instanceof SOAP12FaultCodeImpl)) {
+            throw new SOAPProcessingException(
+                    "Expecting SOAP 1.2 implementation of SOAP Fault Code. But received some other implementation");
+        }
+        super.setCode(soapFaultCode);
+    }
+
+
+    public void setReason(SOAPFaultReason reason) throws SOAPProcessingException {
+        if (!(reason instanceof SOAP12FaultReasonImpl)) {
+            throw new SOAPProcessingException(
+                    "Expecting SOAP 1.2 implementation of SOAP Fault Reason. But received some other implementation");
+        }
+        super.setReason(reason);
+    }
+
+    public void setNode(SOAPFaultNode node) throws SOAPProcessingException {
+        if (!(node instanceof SOAP12FaultNodeImpl)) {
+            throw new SOAPProcessingException(
+                    "Expecting SOAP 1.2 implementation of SOAP Fault Node. But received some other implementation");
+        }
+        super.setNode(node);
+    }
+
+    public void setRole(SOAPFaultRole role) throws SOAPProcessingException {
+        if (!(role instanceof SOAP12FaultRoleImpl)) {
+            throw new SOAPProcessingException(
+                    "Expecting SOAP 1.2 implementation of SOAP Fault Role. But received some other implementation");
+        }
+        super.setRole(role);
+    }
+
+    public void setDetail(SOAPFaultDetail detail) throws SOAPProcessingException {
+        if (!(detail instanceof SOAP12FaultDetailImpl)) {
+            throw new SOAPProcessingException(
+                    "Expecting SOAP 1.2 implementation of SOAP Fault Detail. But received some other implementation");
+        }
+        super.setDetail(detail);
+    }
+
+    protected void checkParent(OMElement parent) throws SOAPProcessingException {
+        if (!(parent instanceof SOAP12BodyImpl)) {
+            throw new SOAPProcessingException(
+                    "Expecting SOAP 1.2 implementation of SOAP Body as the parent. But received some other implementation");
+        }
+    }
+
+    protected void serializeFaultNode(org.apache.ws.commons.om.impl.OMOutputImpl omOutput) throws XMLStreamException {
+        SOAPFaultNode faultNode = getNode();
+        if (faultNode != null) {
+            ((OMNodeEx)faultNode).serialize(omOutput);
+        }
+    }
+}
diff --git a/src/org/apache/ws/commons/soap/impl/llom/soap12/SOAP12FaultNodeImpl.java b/src/org/apache/ws/commons/soap/impl/llom/soap12/SOAP12FaultNodeImpl.java
new file mode 100644
index 0000000..180c250
--- /dev/null
+++ b/src/org/apache/ws/commons/soap/impl/llom/soap12/SOAP12FaultNodeImpl.java
@@ -0,0 +1,41 @@
+/*
+ * Copyright 2004,2005 The Apache Software Foundation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      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.
+ */
+
+package org.apache.ws.commons.soap.impl.llom.soap12;
+
+import org.apache.ws.commons.om.OMElement;
+import org.apache.ws.commons.om.OMXMLParserWrapper;
+import org.apache.ws.commons.soap.SOAPFault;
+import org.apache.ws.commons.soap.SOAPProcessingException;
+import org.apache.ws.commons.soap.impl.llom.SOAPFaultNodeImpl;
+
+
+public class SOAP12FaultNodeImpl extends SOAPFaultNodeImpl {
+    public SOAP12FaultNodeImpl(SOAPFault parent) throws SOAPProcessingException {
+        super(parent);
+    }
+
+    public SOAP12FaultNodeImpl(SOAPFault parent, OMXMLParserWrapper builder) {
+        super(parent, builder);
+    }
+
+    protected void checkParent(OMElement parent) throws SOAPProcessingException {
+        if (!(parent instanceof SOAP12FaultImpl)) {
+            throw new SOAPProcessingException(
+                    "Expecting SOAP 1.2 implementation of SOAP Fault as the parent. But received some other implementation");
+        }
+    }
+}
diff --git a/src/org/apache/ws/commons/soap/impl/llom/soap12/SOAP12FaultReasonImpl.java b/src/org/apache/ws/commons/soap/impl/llom/soap12/SOAP12FaultReasonImpl.java
new file mode 100644
index 0000000..0304a27
--- /dev/null
+++ b/src/org/apache/ws/commons/soap/impl/llom/soap12/SOAP12FaultReasonImpl.java
@@ -0,0 +1,55 @@
+/*
+ * Copyright 2004,2005 The Apache Software Foundation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      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.
+ */
+
+package org.apache.ws.commons.soap.impl.llom.soap12;
+
+import org.apache.ws.commons.om.OMElement;
+import org.apache.ws.commons.om.OMXMLParserWrapper;
+import org.apache.ws.commons.soap.SOAPFault;
+import org.apache.ws.commons.soap.SOAPFaultText;
+import org.apache.ws.commons.soap.SOAPProcessingException;
+import org.apache.ws.commons.soap.impl.llom.SOAPFaultReasonImpl;
+
+public class SOAP12FaultReasonImpl extends SOAPFaultReasonImpl {
+    /**
+     * Eran Chinthaka (chinthaka@apache.org)
+     */
+    public SOAP12FaultReasonImpl(SOAPFault parent, OMXMLParserWrapper builder) {
+        super(parent, builder);
+    }
+
+    /**
+     * @param parent
+     */
+    public SOAP12FaultReasonImpl(SOAPFault parent) throws SOAPProcessingException {
+        super(parent, true);
+    }
+
+    public void setSOAPText(SOAPFaultText soapFaultText) throws SOAPProcessingException {
+        if (!(soapFaultText instanceof SOAP12FaultTextImpl)) {
+            throw new SOAPProcessingException(
+                    "Expecting SOAP 1.2 implementation of SOAP Fault Text. But received some other implementation");
+        }
+        super.setSOAPText(soapFaultText);
+    }
+
+    protected void checkParent(OMElement parent) throws SOAPProcessingException {
+        if (!(parent instanceof SOAP12FaultImpl)) {
+            throw new SOAPProcessingException(
+                    "Expecting SOAP 1.2 implementation of SOAP Fault as the parent. But received some other implementation");
+        }
+    }
+}
diff --git a/src/org/apache/ws/commons/soap/impl/llom/soap12/SOAP12FaultRoleImpl.java b/src/org/apache/ws/commons/soap/impl/llom/soap12/SOAP12FaultRoleImpl.java
new file mode 100644
index 0000000..31b799b
--- /dev/null
+++ b/src/org/apache/ws/commons/soap/impl/llom/soap12/SOAP12FaultRoleImpl.java
@@ -0,0 +1,40 @@
+/*
+ * Copyright 2004,2005 The Apache Software Foundation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      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.
+ */
+
+package org.apache.ws.commons.soap.impl.llom.soap12;
+
+import org.apache.ws.commons.om.OMElement;
+import org.apache.ws.commons.om.OMXMLParserWrapper;
+import org.apache.ws.commons.soap.SOAPFault;
+import org.apache.ws.commons.soap.SOAPProcessingException;
+import org.apache.ws.commons.soap.impl.llom.SOAPFaultRoleImpl;
+
+public class SOAP12FaultRoleImpl extends SOAPFaultRoleImpl {
+    public SOAP12FaultRoleImpl(SOAPFault parent) throws SOAPProcessingException {
+        super(parent, true);
+    }
+
+    public SOAP12FaultRoleImpl(SOAPFault parent, OMXMLParserWrapper builder) {
+        super(parent, builder);
+    }
+
+    protected void checkParent(OMElement parent) throws SOAPProcessingException {
+        if (!(parent instanceof SOAP12FaultImpl)) {
+            throw new SOAPProcessingException(
+                    "Expecting SOAP 1.2 implementation of SOAP Fault as the parent. But received some other implementation");
+        }
+    }
+}
diff --git a/src/org/apache/ws/commons/soap/impl/llom/soap12/SOAP12FaultSubCodeImpl.java b/src/org/apache/ws/commons/soap/impl/llom/soap12/SOAP12FaultSubCodeImpl.java
new file mode 100644
index 0000000..69184d8
--- /dev/null
+++ b/src/org/apache/ws/commons/soap/impl/llom/soap12/SOAP12FaultSubCodeImpl.java
@@ -0,0 +1,72 @@
+/*
+ * Copyright 2004,2005 The Apache Software Foundation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      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.
+ */
+
+package org.apache.ws.commons.soap.impl.llom.soap12;
+
+import org.apache.ws.commons.om.OMElement;
+import org.apache.ws.commons.om.OMXMLParserWrapper;
+import org.apache.ws.commons.soap.SOAP12Constants;
+import org.apache.ws.commons.soap.SOAPFaultCode;
+import org.apache.ws.commons.soap.SOAPFaultSubCode;
+import org.apache.ws.commons.soap.SOAPFaultValue;
+import org.apache.ws.commons.soap.SOAPProcessingException;
+import org.apache.ws.commons.soap.impl.llom.SOAPFaultSubCodeImpl;
+
+public class SOAP12FaultSubCodeImpl extends SOAPFaultSubCodeImpl {
+    //changed
+    public SOAP12FaultSubCodeImpl(SOAPFaultCode parent) throws SOAPProcessingException {
+        super(parent, SOAP12Constants.SOAP_FAULT_SUB_CODE_LOCAL_NAME);
+    }
+
+    //changed
+    public SOAP12FaultSubCodeImpl(SOAPFaultCode parent,
+                                  OMXMLParserWrapper builder) {
+        super(parent, SOAP12Constants.SOAP_FAULT_SUB_CODE_LOCAL_NAME, builder);
+    }
+
+    public SOAP12FaultSubCodeImpl(SOAPFaultSubCode parent) throws SOAPProcessingException {
+        super(parent, SOAP12Constants.SOAP_FAULT_SUB_CODE_LOCAL_NAME);
+    }
+
+    public SOAP12FaultSubCodeImpl(SOAPFaultSubCode parent,
+                                  OMXMLParserWrapper builder) {
+        super(parent, SOAP12Constants.SOAP_FAULT_SUB_CODE_LOCAL_NAME, builder);
+    }
+
+    protected void checkParent(OMElement parent) throws SOAPProcessingException {
+        if (!((parent instanceof SOAP12FaultSubCodeImpl) ||
+                (parent instanceof SOAP12FaultCodeImpl))) {
+            throw new SOAPProcessingException(
+                    "Expecting SOAP 1.2 implementation of SOAP FaultSubCode or SOAP FaultCodeValue as the parent. But received some other implementation");
+        }
+    }
+
+    public void setSubCode(SOAPFaultSubCode subCode) throws SOAPProcessingException {
+        if (!(subCode instanceof SOAP12FaultSubCodeImpl)) {
+            throw new SOAPProcessingException(
+                    "Expecting SOAP 1.2 implementation of SOAP Fault Sub Code. But received some other implementation");
+        }
+        super.setSubCode(subCode);
+    }
+
+    public void setValue(SOAPFaultValue soapFaultSubCodeValue) throws SOAPProcessingException {
+        if (!(soapFaultSubCodeValue instanceof SOAP12FaultValueImpl)) {
+            throw new SOAPProcessingException(
+                    "Expecting SOAP 1.2 implementation of SOAP Fault Value. But received some other implementation");
+        }
+        super.setValue(soapFaultSubCodeValue);
+    }
+}
diff --git a/src/org/apache/ws/commons/soap/impl/llom/soap12/SOAP12FaultTextImpl.java b/src/org/apache/ws/commons/soap/impl/llom/soap12/SOAP12FaultTextImpl.java
new file mode 100644
index 0000000..e235165
--- /dev/null
+++ b/src/org/apache/ws/commons/soap/impl/llom/soap12/SOAP12FaultTextImpl.java
@@ -0,0 +1,41 @@
+/*
+ * Copyright 2004,2005 The Apache Software Foundation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      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.
+ */
+
+package org.apache.ws.commons.soap.impl.llom.soap12;
+
+import org.apache.ws.commons.om.OMElement;
+import org.apache.ws.commons.om.OMXMLParserWrapper;
+import org.apache.ws.commons.soap.SOAPFaultReason;
+import org.apache.ws.commons.soap.SOAPProcessingException;
+import org.apache.ws.commons.soap.impl.llom.SOAPFaultTextImpl;
+
+public class SOAP12FaultTextImpl extends SOAPFaultTextImpl {
+    public SOAP12FaultTextImpl(SOAPFaultReason parent) throws SOAPProcessingException {
+        super(parent);
+    }
+
+    public SOAP12FaultTextImpl(SOAPFaultReason parent,
+                               OMXMLParserWrapper builder) {
+        super(parent, builder);
+    }
+
+    protected void checkParent(OMElement parent) throws SOAPProcessingException {
+        if (!(parent instanceof SOAP12FaultReasonImpl)) {
+            throw new SOAPProcessingException(
+                    "Expecting SOAP 1.2 implementation of SOAP FaultReason as the parent. But received some other implementation");
+        }
+    }
+}
diff --git a/src/org/apache/ws/commons/soap/impl/llom/soap12/SOAP12FaultValueImpl.java b/src/org/apache/ws/commons/soap/impl/llom/soap12/SOAP12FaultValueImpl.java
new file mode 100644
index 0000000..ed042ba
--- /dev/null
+++ b/src/org/apache/ws/commons/soap/impl/llom/soap12/SOAP12FaultValueImpl.java
@@ -0,0 +1,41 @@
+/*
+ * Copyright 2004,2005 The Apache Software Foundation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      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.
+ */
+
+package org.apache.ws.commons.soap.impl.llom.soap12;
+
+import org.apache.ws.commons.om.OMElement;
+import org.apache.ws.commons.om.OMXMLParserWrapper;
+import org.apache.ws.commons.soap.SOAPProcessingException;
+import org.apache.ws.commons.soap.impl.llom.SOAPFaultValueImpl;
+
+
+public class SOAP12FaultValueImpl extends SOAPFaultValueImpl {
+    public SOAP12FaultValueImpl(OMElement parent) throws SOAPProcessingException {
+        super(parent);
+    }
+
+    public SOAP12FaultValueImpl(OMElement parent, OMXMLParserWrapper builder) {
+        super(parent, builder);
+    }
+
+    protected void checkParent(OMElement parent) throws SOAPProcessingException {
+        if (!((parent instanceof SOAP12FaultSubCodeImpl) ||
+                (parent instanceof SOAP12FaultCodeImpl))) {
+            throw new SOAPProcessingException(
+                    "Expecting SOAP 1.2 implementation of SOAP FaultSubCode or SOAP FaultCode as the parent. But received some other implementation");
+        }
+    }
+}
diff --git a/src/org/apache/ws/commons/soap/impl/llom/soap12/SOAP12HeaderBlockImpl.java b/src/org/apache/ws/commons/soap/impl/llom/soap12/SOAP12HeaderBlockImpl.java
new file mode 100644
index 0000000..4cd3502
--- /dev/null
+++ b/src/org/apache/ws/commons/soap/impl/llom/soap12/SOAP12HeaderBlockImpl.java
@@ -0,0 +1,125 @@
+/*
+ * Copyright 2004,2005 The Apache Software Foundation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      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.
+ */
+
+package org.apache.ws.commons.soap.impl.llom.soap12;
+
+import org.apache.ws.commons.om.OMElement;
+import org.apache.ws.commons.om.OMNamespace;
+import org.apache.ws.commons.om.OMXMLParserWrapper;
+import org.apache.ws.commons.soap.SOAP12Constants;
+import org.apache.ws.commons.soap.SOAPConstants;
+import org.apache.ws.commons.soap.SOAPHeader;
+import org.apache.ws.commons.soap.SOAPProcessingException;
+import org.apache.ws.commons.soap.impl.llom.SOAPHeaderBlockImpl;
+
+public class SOAP12HeaderBlockImpl extends SOAPHeaderBlockImpl {
+    /**
+     * Eran Chinthaka (chinthaka@apache.org)
+     */
+    /**
+     * @param localName
+     * @param ns
+     */
+    public SOAP12HeaderBlockImpl(String localName,
+                                 OMNamespace ns,
+                                 SOAPHeader parent) throws SOAPProcessingException {
+        super(localName, ns, parent);
+        checkParent(parent);
+    }
+
+    /**
+     * Constructor SOAPHeaderBlockImpl
+     *
+     * @param localName
+     * @param ns
+     * @param parent
+     * @param builder
+     */
+    public SOAP12HeaderBlockImpl(String localName,
+                                 OMNamespace ns,
+                                 SOAPHeader parent,
+                                 OMXMLParserWrapper builder) {
+        super(localName, ns, parent, builder);
+
+    }
+
+    protected void checkParent(OMElement parent) throws SOAPProcessingException {
+        if (!(parent instanceof SOAP12HeaderImpl)) {
+            throw new SOAPProcessingException(
+                    "Expecting SOAP 1.2 implementation of SOAP Body as the parent. But received some other implementation");
+        }
+    }
+
+    public void setRole(String roleURI) {
+        setAttribute(SOAP12Constants.SOAP_ROLE,
+                roleURI,
+                SOAP12Constants.SOAP_ENVELOPE_NAMESPACE_URI);
+    }
+
+    public String getRole() {
+        return getAttribute(SOAP12Constants.SOAP_ROLE,
+                SOAP12Constants.SOAP_ENVELOPE_NAMESPACE_URI);
+
+    }
+
+    public void setMustUnderstand(boolean mustUnderstand) {
+        setAttribute(SOAPConstants.ATTR_MUSTUNDERSTAND,
+                mustUnderstand ? "1" : "0",
+                SOAP12Constants.SOAP_ENVELOPE_NAMESPACE_URI);
+
+    }
+
+    public void setMustUnderstand(String mustUnderstand) throws SOAPProcessingException {
+        if (SOAPConstants.ATTR_MUSTUNDERSTAND_TRUE.equals(mustUnderstand) ||
+                SOAPConstants.ATTR_MUSTUNDERSTAND_FALSE.equals(mustUnderstand) ||
+                SOAPConstants.ATTR_MUSTUNDERSTAND_0.equals(mustUnderstand) ||
+                SOAPConstants.ATTR_MUSTUNDERSTAND_1.equals(mustUnderstand)) {
+            setAttribute(SOAPConstants.ATTR_MUSTUNDERSTAND,
+                    mustUnderstand,
+                    SOAP12Constants.SOAP_ENVELOPE_NAMESPACE_URI);
+        } else {
+            throw new SOAPProcessingException(
+                    "mustUndertand should be one of \"true\", \"false\", \"0\" or \"1\" ");
+        }
+    }
+
+    public boolean getMustUnderstand() throws SOAPProcessingException {
+        String mustUnderstand = "";
+        if ((mustUnderstand =
+                getAttribute(SOAPConstants.ATTR_MUSTUNDERSTAND,
+                        SOAP12Constants.SOAP_ENVELOPE_NAMESPACE_URI))
+                != null) {
+            if (SOAPConstants.ATTR_MUSTUNDERSTAND_TRUE.equalsIgnoreCase(
+                    mustUnderstand) ||
+                    SOAPConstants.ATTR_MUSTUNDERSTAND_1.equalsIgnoreCase(
+                            mustUnderstand)) {
+                return true;
+            } else if (SOAPConstants.ATTR_MUSTUNDERSTAND_FALSE.equalsIgnoreCase(
+                    mustUnderstand) ||
+                    SOAPConstants.ATTR_MUSTUNDERSTAND_0.equalsIgnoreCase(
+                            mustUnderstand)) {
+                return false;
+            } else {
+                throw new SOAPProcessingException(
+                        "Invalid value found in mustUnderstand value of " +
+                        this.getLocalName() +
+                        " header block");
+            }
+        }
+        return false;
+
+    }
+}
diff --git a/src/org/apache/ws/commons/soap/impl/llom/soap12/SOAP12HeaderImpl.java b/src/org/apache/ws/commons/soap/impl/llom/soap12/SOAP12HeaderImpl.java
new file mode 100644
index 0000000..0f6be40
--- /dev/null
+++ b/src/org/apache/ws/commons/soap/impl/llom/soap12/SOAP12HeaderImpl.java
@@ -0,0 +1,85 @@
+/*
+ * Copyright 2004,2005 The Apache Software Foundation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      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.
+ */
+
+package org.apache.ws.commons.soap.impl.llom.soap12;
+
+import org.apache.ws.commons.om.OMException;
+import org.apache.ws.commons.om.OMNamespace;
+import org.apache.ws.commons.om.OMXMLParserWrapper;
+import org.apache.ws.commons.om.impl.OMNodeEx;
+import org.apache.ws.commons.om.impl.llom.traverse.OMChildrenWithSpecificAttributeIterator;
+import org.apache.ws.commons.soap.SOAP12Constants;
+import org.apache.ws.commons.soap.SOAPEnvelope;
+import org.apache.ws.commons.soap.SOAPHeaderBlock;
+import org.apache.ws.commons.soap.SOAPProcessingException;
+import org.apache.ws.commons.soap.impl.llom.SOAPHeaderImpl;
+
+import javax.xml.namespace.QName;
+import java.util.Iterator;
+
+public class SOAP12HeaderImpl extends SOAPHeaderImpl {
+    /**
+     * Eran Chinthaka (chinthaka@apache.org)
+     */
+
+    /**
+     * @param envelope
+     */
+    public SOAP12HeaderImpl(SOAPEnvelope envelope) throws SOAPProcessingException {
+        super(envelope);
+    }
+
+    /**
+     * Constructor SOAPHeaderImpl
+     *
+     * @param envelope
+     * @param builder
+     */
+    public SOAP12HeaderImpl(SOAPEnvelope envelope, OMXMLParserWrapper builder) {
+        super(envelope, builder);
+    }
+
+    public SOAPHeaderBlock addHeaderBlock(String localName, OMNamespace ns) throws OMException {
+        if (ns == null || ns.getName() == null || "".equals(ns.getName())) {
+            throw new OMException(
+                    "All the SOAP Header blocks should be namespace qualified");
+        }
+
+        OMNamespace namespace = findNamespace(ns.getName(), ns.getPrefix());
+        if (namespace != null) {
+            ns = namespace;
+        }
+
+        SOAPHeaderBlock soapHeaderBlock = null;
+        try {
+            soapHeaderBlock = new SOAP12HeaderBlockImpl(localName, ns, this);
+        } catch (SOAPProcessingException e) {
+            throw new OMException(e);
+        }
+        ((OMNodeEx)soapHeaderBlock).setComplete(true);
+        return soapHeaderBlock;
+    }
+
+
+    public Iterator extractHeaderBlocks(String role) {
+        return new OMChildrenWithSpecificAttributeIterator(getFirstOMChild(),
+                new QName(SOAP12Constants.SOAP_ENVELOPE_NAMESPACE_URI,
+                        SOAP12Constants.SOAP_ROLE),
+                role,
+                true);
+    }
+
+}
diff --git a/test/org/apache/ws/commons/attachments/Base64Test.java b/test/org/apache/ws/commons/attachments/Base64Test.java
new file mode 100644
index 0000000..b44acf4
--- /dev/null
+++ b/test/org/apache/ws/commons/attachments/Base64Test.java
@@ -0,0 +1,52 @@
+/*
+ * Copyright 2004,2005 The Apache Software Foundation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      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.
+ */
+
+package org.apache.ws.commons.attachments;
+
+import junit.framework.TestCase;
+
+import java.io.ByteArrayInputStream;
+import java.io.ByteArrayOutputStream;
+import java.io.ObjectInputStream;
+import java.io.ObjectOutputStream;
+
+import org.apache.ws.commons.om.util.Base64;
+
+public class Base64Test extends TestCase {
+
+    Object expectedObject;
+
+    ByteArrayInputStream byteStream;
+
+    /*
+     * Class under test for String encode(byte[])
+     */
+
+    public void testEncodebyteArray() throws Exception {
+        Object actualObject;
+        String expectedBase64;
+        expectedObject = new String("Lanka Software Foundation");
+        ByteArrayOutputStream byteStream = new ByteArrayOutputStream();
+        ObjectOutputStream objectOutStream = new ObjectOutputStream(byteStream);
+        objectOutStream.writeObject(expectedObject);
+        expectedBase64 = Base64.encode(byteStream.toByteArray());
+        byte[] tempa = Base64.decode(expectedBase64);
+        ObjectInputStream objectInStream = new ObjectInputStream(
+                new ByteArrayInputStream(tempa));
+        actualObject = objectInStream.readObject();
+        assertEquals("Base64 Encoding Check", expectedObject, actualObject);
+    }
+}
\ No newline at end of file
diff --git a/test/org/apache/ws/commons/attachments/ImageSampleTest.java b/test/org/apache/ws/commons/attachments/ImageSampleTest.java
new file mode 100644
index 0000000..2c6adaa
--- /dev/null
+++ b/test/org/apache/ws/commons/attachments/ImageSampleTest.java
@@ -0,0 +1,141 @@
+/*
+ * Copyright 2004,2005 The Apache Software Foundation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      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.
+ */
+
+package org.apache.ws.commons.attachments;
+
+import org.apache.ws.commons.attachments.utils.ImageDataSource;
+import org.apache.ws.commons.attachments.utils.ImageIO;
+import org.apache.ws.commons.om.AbstractTestCase;
+import org.apache.ws.commons.om.OMElement;
+import org.apache.ws.commons.om.OMOutputFormat;
+import org.apache.ws.commons.om.OMText;
+import org.apache.ws.commons.om.impl.llom.OMElementImpl;
+import org.apache.ws.commons.om.impl.llom.OMNamespaceImpl;
+import org.apache.ws.commons.om.impl.llom.OMTextImpl;
+import org.apache.ws.commons.om.impl.llom.mtom.MTOMStAXSOAPModelBuilder;
+
+import javax.activation.DataHandler;
+import javax.xml.stream.XMLInputFactory;
+import javax.xml.stream.XMLStreamReader;
+import java.awt.*;
+import java.io.BufferedReader;
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.FileOutputStream;
+import java.io.InputStream;
+import java.io.InputStreamReader;
+
+public class ImageSampleTest extends AbstractTestCase {
+
+    public ImageSampleTest(String testName) {
+        super(testName);
+    }
+
+    /*
+     * @see TestCase#setUp()
+     */
+    Image expectedImage;
+
+    MTOMStAXSOAPModelBuilder builder;
+
+    DataHandler expectedDH;
+
+    File outMTOMFile;
+
+    File outBase64File;
+
+    String outFileName = "target/ActualImageMTOMOut.bin";
+
+    String outBase64FileName = "target/OMSerializeBase64Out.xml";
+
+    String imageInFileName = "mtom/img/test.jpg";
+
+    String imageOutFileName = "target/testOut.jpg";
+
+    String inMimeFileName = "mtom/ImageMTOMOut.bin";
+
+    String contentTypeString = "multipart/Related; type=\"application/xop+xml\";start=\"<SOAPPart>\"; boundary=\"----=_AxIs2_Def_boundary_=42214532\"";
+
+
+
+    public void testImageSampleSerialize() throws Exception {
+
+        outMTOMFile = new File(outFileName);
+        outBase64File = new File(outBase64FileName);
+        OMOutputFormat mtomOutputFormat = new OMOutputFormat();
+        mtomOutputFormat.setDoOptimize(true); 
+        OMOutputFormat baseOutputFormat = new OMOutputFormat();
+        baseOutputFormat.setDoOptimize(false);
+
+        OMNamespaceImpl soap = new OMNamespaceImpl(
+                "http://schemas.xmlsoap.org/soap/envelope/", "soap");
+        OMElement envelope = new OMElementImpl("Envelope", soap);
+        OMElement body = new OMElementImpl("Body", soap);
+
+        OMNamespaceImpl dataName = new OMNamespaceImpl(
+                "http://www.example.org/stuff", "m");
+        OMElement data = new OMElementImpl("data", dataName);
+
+        expectedImage =
+                new ImageIO().loadImage(
+                        new FileInputStream(
+                                getTestResourceFile(imageInFileName)));
+        ImageDataSource dataSource = new ImageDataSource("WaterLilies.jpg",
+                expectedImage);
+        expectedDH = new DataHandler(dataSource);
+        OMText binaryNode = new OMTextImpl(expectedDH, true);
+
+        envelope.addChild(body);
+        body.addChild(data);
+        data.addChild(binaryNode);
+
+        envelope.serializeAndConsume(new FileOutputStream(outBase64File), baseOutputFormat);
+        envelope.serializeAndConsume(new FileOutputStream(outMTOMFile), mtomOutputFormat);
+    }
+
+    public void testImageSampleDeserialize() throws Exception {
+        InputStream inStream = new FileInputStream(
+                getTestResourceFile(inMimeFileName));
+        MIMEHelper mimeHelper = new MIMEHelper(inStream, contentTypeString);
+        XMLStreamReader reader = XMLInputFactory.newInstance()
+                .createXMLStreamReader(
+                        new BufferedReader(
+                                new InputStreamReader(
+                                        mimeHelper
+                .getSOAPPartInputStream())));
+        builder = new MTOMStAXSOAPModelBuilder(reader, mimeHelper, null);
+        OMElement root = builder.getDocumentElement();
+        OMElement body = (OMElement) root.getFirstOMChild();
+        OMElement data = (OMElement) body.getFirstOMChild();
+        OMText blob = (OMText) data.getFirstOMChild();
+        /*
+         * Following is the procedure the user has to follow to read objects in
+         * OBBlob User has to know the object type & whether it is serializable.
+         * If it is not he has to use a Custom Defined DataSource to get the
+         * Object.
+         */
+
+        DataHandler actualDH;
+        actualDH = (DataHandler)blob.getDataHandler();
+        Image actualObject = new ImageIO().loadImage(actualDH.getDataSource()
+                .getInputStream());
+        FileOutputStream imageOutStream = new FileOutputStream(
+                new File(imageOutFileName));
+        new ImageIO().saveImage("image/jpeg", actualObject, imageOutStream);
+
+    }
+
+}
\ No newline at end of file
diff --git a/test/org/apache/ws/commons/attachments/MIMEHelperTest.java b/test/org/apache/ws/commons/attachments/MIMEHelperTest.java
new file mode 100644
index 0000000..fde7e94
--- /dev/null
+++ b/test/org/apache/ws/commons/attachments/MIMEHelperTest.java
@@ -0,0 +1,36 @@
+/*
+ * Copyright 2004,2005 The Apache Software Foundation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      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.
+ */
+
+package org.apache.ws.commons.attachments;
+
+import junit.framework.TestCase;
+
+public class MIMEHelperTest extends TestCase {
+
+
+    public void testMIMEHelper() {
+    }
+
+    public void testGetAttachmentSpecType() {
+    }
+
+    public void testGetSOAPPartInputStream() {
+    }
+
+    public void testGetDataHandler() {
+    }
+
+}
\ No newline at end of file
diff --git a/test/org/apache/ws/commons/om/AbstractOMSerializationTest.java b/test/org/apache/ws/commons/om/AbstractOMSerializationTest.java
new file mode 100644
index 0000000..32d7d07
--- /dev/null
+++ b/test/org/apache/ws/commons/om/AbstractOMSerializationTest.java
@@ -0,0 +1,178 @@
+/*
+ * Copyright 2004,2005 The Apache Software Foundation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      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.
+ */
+
+package org.apache.ws.commons.om;
+
+import org.apache.ws.commons.om.impl.llom.builder.StAXOMBuilder;
+import org.apache.ws.commons.om.impl.llom.factory.OMXMLBuilderFactory;
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.custommonkey.xmlunit.Diff;
+import org.custommonkey.xmlunit.XMLTestCase;
+import org.w3c.dom.Document;
+import org.xml.sax.InputSource;
+import org.xml.sax.SAXException;
+
+import javax.xml.parsers.DocumentBuilder;
+import javax.xml.parsers.DocumentBuilderFactory;
+import javax.xml.parsers.ParserConfigurationException;
+import javax.xml.stream.XMLInputFactory;
+import javax.xml.stream.XMLStreamException;
+import javax.xml.transform.Result;
+import javax.xml.transform.Source;
+import javax.xml.transform.Transformer;
+import javax.xml.transform.TransformerConfigurationException;
+import javax.xml.transform.TransformerException;
+import javax.xml.transform.TransformerFactory;
+import javax.xml.transform.dom.DOMSource;
+import javax.xml.transform.stream.StreamResult;
+import java.io.ByteArrayInputStream;
+import java.io.ByteArrayOutputStream;
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.InputStreamReader;
+
+public class AbstractOMSerializationTest extends XMLTestCase {
+
+    protected boolean ignoreXMLDeclaration = true;
+    protected boolean ignoreDocument = false;
+    protected Log log = LogFactory.getLog(getClass());
+
+
+    /**
+     * @param xmlString - remember this is not the file path. this is the xml string
+     */
+    public Diff getDiffForComparison(String xmlString) throws Exception {
+        return getDiffForComparison(new ByteArrayInputStream(xmlString.getBytes()));
+    }
+
+    public Diff getDiffForComparison(File xmlFile) throws Exception {
+        return getDiffForComparison(new FileInputStream(xmlFile));
+    }
+
+    public String getSerializedOM(String xmlString) throws Exception {
+        try {
+            XMLInputFactory factory = XMLInputFactory.newInstance();
+
+            ByteArrayInputStream byteArrayInputStream = new ByteArrayInputStream(xmlString.getBytes());
+            StAXOMBuilder staxOMBuilder = OMXMLBuilderFactory.
+                    createStAXOMBuilder(OMAbstractFactory.getOMFactory(),
+                            factory.createXMLStreamReader(byteArrayInputStream));
+            staxOMBuilder.setDoDebug(true);
+            OMElement rootElement = staxOMBuilder.getDocumentElement();
+
+            ByteArrayOutputStream baos = new ByteArrayOutputStream();
+
+            OMOutputFormat format = new OMOutputFormat();
+            format.setIgnoreXMLDeclaration(ignoreXMLDeclaration);
+
+            ((OMDocument) rootElement.getParent()).serialize(baos, format);
+
+            return new String(baos.toByteArray());
+        } catch (Exception e) {
+            throw e;
+        }
+    }
+
+    public Diff getDiffForComparison(InputStream inStream) throws Exception {
+
+        try {
+            XMLInputFactory factory = XMLInputFactory.newInstance();
+
+            StAXOMBuilder staxOMBuilder = OMXMLBuilderFactory.
+                    createStAXOMBuilder(OMAbstractFactory.getOMFactory(),
+                            factory.createXMLStreamReader(inStream));
+            staxOMBuilder.setDoDebug(true);
+            OMElement rootElement = staxOMBuilder.getDocumentElement();
+
+            ByteArrayOutputStream baos = new ByteArrayOutputStream();
+
+            if (ignoreDocument) {
+                rootElement.serialize(baos);
+            } else {
+                ((OMDocument) rootElement.getParent()).serialize(baos);
+            }
+
+            InputSource resultXML = new InputSource(new InputStreamReader(
+                    new ByteArrayInputStream(baos.toByteArray())));
+
+            Document dom2 = newDocument(resultXML);
+            Document dom1 = newDocument(inStream);
+
+            return compareXML(dom1, dom2);
+        } catch (XMLStreamException e) {
+            fail(e.getMessage());
+            throw new Exception(e);
+        } catch (ParserConfigurationException e) {
+            fail(e.getMessage());
+            throw new Exception(e);
+        } catch (SAXException e) {
+            fail(e.getMessage());
+            throw new Exception(e);
+        } catch (IOException e) {
+            fail(e.getMessage());
+            throw new Exception(e);
+        }
+    }
+
+    public Document newDocument(InputSource in)
+            throws ParserConfigurationException, SAXException, IOException {
+        DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
+        dbf.setNamespaceAware(true);
+        DocumentBuilder db = dbf.newDocumentBuilder();
+        return db.parse(in);
+    }
+
+    public Document newDocument(InputStream in)
+            throws ParserConfigurationException, SAXException, IOException {
+        DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
+        dbf.setNamespaceAware(true);
+        DocumentBuilder db = dbf.newDocumentBuilder();
+        return db.parse(in);
+    }
+
+    public Document newDocument(String xml)
+            throws ParserConfigurationException, SAXException, IOException {
+        DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
+        dbf.setNamespaceAware(true);
+        DocumentBuilder db = dbf.newDocumentBuilder();
+        return db.parse(new ByteArrayInputStream(xml.getBytes()));
+    }
+
+    public String writeXmlFile(Document doc) {
+        try {
+            // Prepare the DOM document for writing
+            Source source = new DOMSource(doc);
+
+            ByteArrayOutputStream baos = new ByteArrayOutputStream();
+            Result result = new StreamResult(baos);
+
+            // Write the DOM document to the file
+            Transformer xformer = TransformerFactory.newInstance().newTransformer();
+            xformer.transform(source, result);
+            return new String(baos.toByteArray());
+        } catch (TransformerConfigurationException e) {
+            log.error(e.getMessage(), e);
+        } catch (TransformerException e) {
+            log.error(e.getMessage(), e);
+        }
+        return null;
+
+    }
+
+}
diff --git a/test/org/apache/ws/commons/om/AbstractTestCase.java b/test/org/apache/ws/commons/om/AbstractTestCase.java
new file mode 100644
index 0000000..e9eafc5
--- /dev/null
+++ b/test/org/apache/ws/commons/om/AbstractTestCase.java
@@ -0,0 +1,71 @@
+/*
+ * Copyright 2004,2005 The Apache Software Foundation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      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.
+ */
+
+package org.apache.ws.commons.om;
+
+import junit.framework.TestCase;
+
+import java.io.File;
+
+/**
+ * Abstract base class for test cases.
+ */
+public abstract class AbstractTestCase
+        extends TestCase {
+    protected String testDir = "test" + File.separator;
+    protected String sampleDir = "samples" + File.separator;
+    protected String outDir = "target" + File.separator + "generated" +
+            File.separator +
+            "samples" +
+            File.separator;
+    protected String tempDir = "target" + File.separator + "generated" +
+            File.separator +
+            "temp";
+    protected String testResourceDir = "test-resources";
+
+    /**
+     * Basedir for all file I/O. Important when running tests from
+     * the reactor.
+     */
+    public String basedir = System.getProperty("basedir");
+
+    /**
+     * @param testName
+     */
+    public AbstractTestCase(String testName) {
+        super(testName);
+        if (basedir == null) {
+            basedir = new File(".").getAbsolutePath();
+        }
+        testDir = new File(basedir, testDir).getAbsolutePath();
+        sampleDir = new File(basedir, sampleDir).getAbsolutePath();
+        outDir = new File(basedir, outDir).getAbsolutePath();
+        tempDir = new File(basedir, tempDir).getAbsolutePath();
+    }
+
+    public File getTestResourceFile(String relativePath) {
+        return new File(testResourceDir, relativePath);
+    }
+
+    public File getTempOutputFile(String filename) {
+        File f = new File(tempDir);
+        if(!f.exists()) {
+            f.mkdirs();
+        }
+        return new File(f, filename);
+    }
+}
+
diff --git a/test/org/apache/ws/commons/om/AttrNsTest.java b/test/org/apache/ws/commons/om/AttrNsTest.java
new file mode 100644
index 0000000..3c8abb0
--- /dev/null
+++ b/test/org/apache/ws/commons/om/AttrNsTest.java
@@ -0,0 +1,86 @@
+/*
+ * Copyright 2004,2005 The Apache Software Foundation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      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.
+ */
+
+package org.apache.ws.commons.om;
+
+import org.apache.ws.commons.om.impl.llom.builder.StAXOMBuilder;
+import org.custommonkey.xmlunit.Diff;
+import org.w3c.dom.Document;
+
+import javax.xml.namespace.QName;
+import java.io.ByteArrayInputStream;
+
+public class AttrNsTest extends AbstractOMSerializationTest {
+
+    private String attrNamespaceTestXML = "<?xml version='1.0' encoding='UTF-8'?>\n" +
+            "<foo xmlns:a=\"http://opensource.lk\">" +
+            "    <bar1 b:attr=\"test attr value1\" xmlns:b=\"http://opensource.lk/ns1\">test1</bar1>" +
+            "    <bar2 b:attr=\"test attr value2\" xmlns:b=\"http://opensource.lk/ns1\">test2</bar2>" +
+            "</foo>";
+
+    public void testAttributeNamespaces() throws Exception {
+        ignoreXMLDeclaration = true;
+        ignoreDocument = true;
+
+        Document document1 = newDocument(attrNamespaceTestXML);
+        String serializedOM = getSerializedOM(attrNamespaceTestXML);
+        Document document2 = newDocument(serializedOM);
+
+        Diff diff = compareXML(document1, document2);
+        assertXMLEqual(diff, true);
+    }
+    
+
+    /**
+     * Test method to test the XML namespace
+     * @throws Exception
+     */
+	public void testAttr() throws Exception{
+		String xml = "<wsp:Policy xml:base=\"uri:thisBase\" " +
+			"xmlns:wsp=\"http://schemas.xmlsoap.org/ws/2004/09/policy\">" + 
+		"</wsp:Policy>";
+		
+		ByteArrayInputStream bais = new ByteArrayInputStream(xml.getBytes());
+		StAXOMBuilder builder = new StAXOMBuilder(bais);
+		OMElement elem = builder.getDocumentElement();
+		elem.build();
+		assertEquals("Attribute value mismatch", "uri:thisBase", elem.getAttributeValue(new QName(OMConstants.XMLNS_URI,"base")));
+		
+		OMAttribute attr = elem.getAttribute(new QName(OMConstants.XMLNS_URI,"base"));
+		
+		assertEquals("Attribute namespace mismatch", OMConstants.XMLNS_URI, attr.getNamespace().getName());
+	}
+
+    /**
+     * Test method to test the XML namespace of an attr without
+     * any other ns declarations in the element
+     * @throws Exception
+     */
+	public void testAttrWithoutElementNS() throws Exception{
+		String xml = "<Policy xml:base=\"uri:thisBase\"></Policy>";
+		
+		ByteArrayInputStream bais = new ByteArrayInputStream(xml.getBytes());
+		StAXOMBuilder builder = new StAXOMBuilder(bais);
+		OMElement elem = builder.getDocumentElement();
+		elem.build();
+		assertEquals("Attribute value mismatch", "uri:thisBase", elem.getAttributeValue(new QName(OMConstants.XMLNS_URI,"base")));
+		
+		OMAttribute attr = elem.getAttribute(new QName(OMConstants.XMLNS_URI,"base"));
+		
+		assertEquals("Attribute namespace mismatch", OMConstants.XMLNS_URI, attr.getNamespace().getName());
+	}
+
+}
diff --git a/test/org/apache/ws/commons/om/BadInputTest.java b/test/org/apache/ws/commons/om/BadInputTest.java
new file mode 100644
index 0000000..eda38eb
--- /dev/null
+++ b/test/org/apache/ws/commons/om/BadInputTest.java
@@ -0,0 +1,136 @@
+/*
+ * Copyright 2004,2005 The Apache Software Foundation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      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.
+ */
+
+package org.apache.ws.commons.om;
+
+import org.apache.ws.commons.soap.SOAPEnvelope;
+
+public class BadInputTest extends OMTestCase {
+
+    public BadInputTest(String testName) {
+        super(testName);
+    }
+
+
+    //done
+    public void testEnvelopeMissing() throws Exception {
+        try {
+            SOAPEnvelope soapEnvelope =
+                    (SOAPEnvelope) OMTestUtils.getOMBuilder(
+                            getTestResourceFile(TestConstants.BAD_ENVELOPE_MISSING))
+                    .getDocumentElement();
+            OMTestUtils.walkThrough(soapEnvelope);
+            fail("this must failed gracefully with OMException or AxisFault");
+        } catch (OMException e) {
+            return;
+        }
+
+    }
+
+    //done
+    public void testHeaderBodyWrongOrder() throws Exception {
+        try {
+            SOAPEnvelope soapEnvelope =
+                    (SOAPEnvelope) OMTestUtils.getOMBuilder(
+                            getTestResourceFile(TestConstants.BAD_HEADER_BODY_WRONG_ORDER))
+                    .getDocumentElement();
+            OMTestUtils.walkThrough(soapEnvelope);
+            fail("this must failed gracefully with OMException or AxisFault");
+        } catch (OMException e) {
+            return;
+        }
+    }
+
+    //done
+    //    public void testNotnamespaceQualified() throws Exception {
+    //        try {
+    //            SOAPEnvelope soapEnvelope =
+    //                    (SOAPEnvelope) OMTestUtils.getOMBuilder(new File(dir, "notnamespaceQualified.xml")).getDocumentElement();
+    //            OMTestUtils.walkThrough(soapEnvelope);
+    //            fail("this must failed gracefully with OMException or AxisFault");
+    //        } catch (OMException e) {
+    //            return;
+    //        } catch (AxisFault e) {
+    //            return;
+    //        }
+    //
+    //    }
+    //done
+    //    public void testBodyNotQualified() throws Exception {
+    //        try {
+    //            SOAPEnvelope soapEnvelope =
+    //                    (SOAPEnvelope) OMTestUtils.getOMBuilder(new File(dir, "bodyNotQualified.xml")).getDocumentElement();
+    //            OMTestUtils.walkThrough(soapEnvelope);
+    //            fail("this must failed gracefully with OMException or AxisFault");
+    //        } catch (OMException e) {
+    //            //we are OK!
+    //            return;
+    //        } catch (AxisFault e) {
+    //            //we are OK here too!
+    //            return;
+    //        }
+    //
+    //    }
+
+    //done
+    public void testTwoBodymessage() throws Exception {
+        try {
+            SOAPEnvelope soapEnvelope =
+                    (SOAPEnvelope) OMTestUtils.getOMBuilder(
+                            getTestResourceFile(TestConstants.BAD_TWO_BODY))
+                    .getDocumentElement();
+            OMTestUtils.walkThrough(soapEnvelope);
+            fail("this must failed gracefully with OMException or AxisFault");
+        } catch (OMException e) {
+            return;
+        }
+
+    }
+
+    //done
+    public void testTwoheaders() throws Exception {
+        try {
+            SOAPEnvelope soapEnvelope =
+                    (SOAPEnvelope) OMTestUtils.getOMBuilder(
+                            getTestResourceFile(TestConstants.BAD_TWO_HEADERS))
+                    .getDocumentElement();
+            OMTestUtils.walkThrough(soapEnvelope);
+            fail("this must failed gracefully with OMException or AxisFault");
+        } catch (OMException e) {
+            return;
+        }
+
+    }
+
+    //done
+    public void testWrongSoapNs() throws Exception {
+        try {
+            SOAPEnvelope soapEnvelope =
+                    (SOAPEnvelope) OMTestUtils.getOMBuilder(
+                            getTestResourceFile(TestConstants.BAD_WRONG_SOAP_NS))
+                    .getDocumentElement();
+            OMTestUtils.walkThrough(soapEnvelope);
+            fail("this must failed gracefully with OMException or AxisFault");
+        } catch (OMException e) {
+            return;
+        }
+
+    }
+
+
+
+
+}
diff --git a/test/org/apache/ws/commons/om/CompareOMWithDOMTest.java b/test/org/apache/ws/commons/om/CompareOMWithDOMTest.java
new file mode 100644
index 0000000..0a35403
--- /dev/null
+++ b/test/org/apache/ws/commons/om/CompareOMWithDOMTest.java
@@ -0,0 +1,57 @@
+/*
+ * Copyright 2004,2005 The Apache Software Foundation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      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.
+ */
+
+package org.apache.ws.commons.om;
+
+import org.apache.ws.commons.soap.SOAPEnvelope;
+import org.w3c.dom.Document;
+
+import javax.xml.parsers.DocumentBuilder;
+import javax.xml.parsers.DocumentBuilderFactory;
+import java.io.File;
+
+/**
+ * @version $Rev: $ $Date: $
+ */
+public class CompareOMWithDOMTest extends AbstractTestCase {
+    /**
+     * @param testName
+     */
+    public CompareOMWithDOMTest(String testName) {
+        super(testName);
+    }
+
+    public void testAllMessagesInSOAP() throws OMException, Exception {
+        File dir = new File(testResourceDir, "soap");
+        File[] files = dir.listFiles();
+        if (files != null) {
+            for (int i = 0; i < files.length; i++) {
+                if (files[i].isFile() && files[i].getName().endsWith(".xml") && !files[i].getName().startsWith("wrong")) {
+                    SOAPEnvelope soapEnvelope = (SOAPEnvelope) OMTestUtils.getOMBuilder(
+                            files[i])
+                            .getDocumentElement();
+                    DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
+                    dbf.setNamespaceAware(true);
+                    DocumentBuilder builder = dbf.newDocumentBuilder();
+                    Document doc = builder.parse(files[i].getAbsolutePath());
+                    OMTestUtils.compare(doc.getDocumentElement(),
+                            soapEnvelope);
+                }
+            }
+
+        }
+    }
+}
diff --git a/test/org/apache/ws/commons/om/DefaultNamespaceTest.java b/test/org/apache/ws/commons/om/DefaultNamespaceTest.java
new file mode 100644
index 0000000..1a090a6
--- /dev/null
+++ b/test/org/apache/ws/commons/om/DefaultNamespaceTest.java
@@ -0,0 +1,52 @@
+package org.apache.ws.commons.om;
+
+import org.custommonkey.xmlunit.XMLTestCase;
+
+import javax.xml.namespace.QName;
+
+/*
+ * Copyright 2001-2004 The Apache Software Foundation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      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.
+ *
+ */
+
+public class DefaultNamespaceTest extends XMLTestCase {
+
+    public void testDefaultNamespace() throws Exception {
+
+        String expectedXML = "<Foo xmlns=\"http://defaultNsUri.org\"><Bar xmlns=\"\"></Bar><Baz></Baz></Foo>";
+
+        OMFactory factory = OMAbstractFactory.getOMFactory();
+        OMElement foo = factory.createOMElement(new QName("http://defaultNsUri.org", "Foo"), null);
+        factory.createOMElement("Bar", null, foo);
+        factory.createOMElement(new QName("http://defaultNsUri.org", "Baz"), foo);
+        assertXMLEqual(expectedXML, foo.toString());
+    }
+
+    public void test() {
+        OMFactory factory = OMAbstractFactory.getOMFactory();
+
+        String nsURI = "http://test.org";
+        String nsPrefix = "testPrefix";
+        OMElement element = factory.createOMElement("DocElement", null);
+
+        OMElement foo = factory.createOMElement(new QName(nsURI, "Foo", nsPrefix), element);
+        factory.createOMElement(new QName(nsURI+1, "Bar", nsPrefix), element);
+
+        factory.createOMElement(new QName(nsURI+2, "Baz", nsPrefix), foo);
+        factory.createOMElement(new QName(nsURI, "Baz", nsPrefix), foo);
+
+    }
+
+}
diff --git a/test/org/apache/ws/commons/om/IteratorTest.java b/test/org/apache/ws/commons/om/IteratorTest.java
new file mode 100644
index 0000000..0540c18
--- /dev/null
+++ b/test/org/apache/ws/commons/om/IteratorTest.java
@@ -0,0 +1,184 @@
+/*
+ * Copyright 2004,2005 The Apache Software Foundation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      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.
+ */
+
+package org.apache.ws.commons.om;
+
+import org.apache.ws.commons.om.impl.llom.builder.StAXOMBuilder;
+import org.apache.ws.commons.om.impl.llom.factory.OMLinkedListImplFactory;
+
+import javax.xml.namespace.QName;
+import javax.xml.stream.XMLInputFactory;
+import java.io.FileReader;
+import java.util.Iterator;
+
+public class IteratorTest extends AbstractTestCase {
+    private OMElement envelope = null;
+
+    public IteratorTest(String testName) {
+        super(testName);
+    }
+
+    protected void setUp() throws Exception {
+        //lets use a plain OM factory
+        envelope =
+                new StAXOMBuilder(new OMLinkedListImplFactory(),
+                        XMLInputFactory.newInstance().createXMLStreamReader(
+                                new FileReader(
+                                        getTestResourceFile(
+                                                "soap/soapmessage1.xml")))).getDocumentElement();
+    }
+
+    protected void tearDown() throws Exception {
+        envelope = null;
+    }
+
+    /**
+     * Test the plain iterator which includes all the
+     * children (including the texts)
+     */
+    public void testIterator() {
+        OMElement elt = envelope;
+        Iterator iter = elt.getChildren();
+        int counter = 0;
+        while (iter.hasNext()) {
+            counter ++;
+            assertNotNull("Must return not null objects!",iter.next());
+        }
+        assertEquals("This element should contain only five children including the text ",5,counter);
+    }
+
+    /**
+     * Test the element iterator
+     */
+    public void testElementIterator() {
+        OMElement elt = envelope;
+        Iterator iter = elt.getChildElements();
+        int counter = 0;
+        while (iter.hasNext()) {
+            counter ++;
+            Object o = iter.next();
+            assertNotNull("Must return not null objects!",o);
+            assertTrue("All these should be elements!",((OMNode)o).getType()==OMNode.ELEMENT_NODE);
+        }
+        assertEquals("This element should contain only two elements ",2,counter);
+    }
+
+    /**
+     * Test the element iterator
+     */
+    public void testElementQNameIterator() {
+        OMElement elt = envelope;
+        QName qname = new QName("http://schemas.xmlsoap.org/soap/envelope/","body");
+        Iterator iter = elt.getChildrenWithName(qname);
+        int counter = 0;
+        while (iter.hasNext()) {
+            counter ++;
+            Object o = iter.next();
+            assertNotNull("Must return not null objects!",o);
+            assertTrue("All these should be elements!",((OMNode)o).getType()==OMNode.ELEMENT_NODE);
+        }
+        assertEquals("This element should contain only one element with the given QName ",1,counter);
+    }
+
+    /**
+     * test the remove exception behavior
+     */
+    public void testIteratorRemove1() {
+        OMElement elt = envelope;
+        Iterator iter = elt.getChildren();
+
+        //this is supposed to throw an illegal state exception
+        try {
+            iter.remove();
+            fail("remove should throw an exception");
+        } catch (IllegalStateException e) {
+            //ok. this is what should happen
+        }
+
+    }
+
+    /**
+     * test the remove exception behavior, consecutive remove calls
+     */
+    public void testIteratorRemove2() {
+        OMElement elt = envelope;
+        Iterator iter = elt.getChildren();
+        if (iter.hasNext()) {
+            iter.next();
+        }
+        iter.remove();
+
+        //this call must generate an exception
+        try {
+            iter.remove();
+            fail("calling remove twice without a call to next is prohibited");
+        } catch (IllegalStateException e) {
+            //ok if we come here :)
+        }
+
+    }
+
+    /**
+     * Remove all!
+     */
+    public void testIteratorRemove3() {
+        OMElement elt = envelope;
+        Iterator iter = elt.getChildren();
+        while (iter.hasNext()) {
+            iter.next();
+            iter.remove();
+        }
+        iter = elt.getChildren();
+        if (iter.hasNext()) {
+            //we shouldn't reach here!
+            fail("No children should remain after removing all!");
+        }
+
+
+    }
+
+    /**
+     * test whether the children count reduces.
+     */
+    public void testIteratorRemove4() {
+        OMElement elt = envelope;
+        Iterator iter = elt.getChildren();
+        int firstChildrenCount = 0;
+        int secondChildrenCount = 0;
+        while (iter.hasNext()) {
+            assertNotNull(iter.next());
+            firstChildrenCount++;
+        }
+
+        //remove the last node
+        iter.remove();
+
+        //reloop and check the count
+        //Note- here we should get a fresh iterator since there is no method to
+        //reset the iterator
+        iter = elt.getChildren(); //reset the iterator
+        while (iter.hasNext()) {
+            assertNotNull(iter.next());
+            secondChildrenCount++;
+        }
+        assertEquals("children count must reduce from 1",
+                firstChildrenCount - 1,
+                secondChildrenCount);
+
+    }
+
+
+}
diff --git a/test/org/apache/ws/commons/om/MIMEOutputUtilsTest.java b/test/org/apache/ws/commons/om/MIMEOutputUtilsTest.java
new file mode 100644
index 0000000..9986b2c
--- /dev/null
+++ b/test/org/apache/ws/commons/om/MIMEOutputUtilsTest.java
@@ -0,0 +1,91 @@
+/*
+ * Copyright 2004,2005 The Apache Software Foundation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      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.
+ */
+
+package org.apache.ws.commons.om;
+
+import junit.framework.TestCase;
+import org.apache.ws.commons.attachments.ByteArrayDataSource;
+import org.apache.ws.commons.om.impl.MIMEOutputUtils;
+import org.apache.ws.commons.soap.SOAP12Constants;
+import org.apache.ws.commons.soap.SOAPFactory;
+
+import javax.activation.DataHandler;
+import javax.mail.MessagingException;
+import javax.mail.internet.MimeBodyPart;
+import javax.mail.internet.MimeMessage;
+import javax.mail.internet.MimeMultipart;
+import java.io.ByteArrayInputStream;
+import java.io.ByteArrayOutputStream;
+import java.io.IOException;
+import java.util.Properties;
+
+public class MIMEOutputUtilsTest extends TestCase {
+    byte[] buffer;
+    byte[] byteArray = new byte[]{13, 56, 65, 32, 12, 12, 7, -3, -2, -1,
+                                  98};
+
+    protected void setUp() throws Exception {
+        super.setUp();
+        SOAPFactory factory = OMAbstractFactory.getSOAP11Factory();
+        ByteArrayOutputStream outStream;
+        String boundary;
+        
+        OMOutputFormat omOutput = new OMOutputFormat();
+        boundary = omOutput.getMimeBoundary();
+
+        String contentType = org.apache.ws.commons.om.impl.MIMEOutputUtils
+				.getContentTypeForMime(boundary, omOutput.getRootContentId(),
+						omOutput.getCharSetEncoding(),SOAP12Constants.SOAP_12_CONTENT_TYPE);
+        DataHandler dataHandler;
+        dataHandler = new DataHandler(new ByteArrayDataSource(byteArray));
+        OMText textData = factory.createText(dataHandler, true);
+        assertNotNull(textData.getContentID());
+
+        DataHandler dataHandler2 = new DataHandler(
+                "Apache Software Foundation", "text/plain");
+        OMText text = factory.createText(dataHandler2, true);
+        assertNotNull(text.getContentID());
+        outStream = new ByteArrayOutputStream();
+        outStream.write(("Content-Type: " + contentType).getBytes());
+        outStream.write(new byte[]{13,10});
+        outStream.write(new byte[]{13,10});
+
+        MIMEOutputUtils.startWritingMime(outStream, boundary);
+        MimeBodyPart part1 = MIMEOutputUtils.createMimeBodyPart(textData);
+        MIMEOutputUtils.writeBodyPart(outStream, part1, boundary);
+        MimeBodyPart part2 = MIMEOutputUtils.createMimeBodyPart(text);
+        MIMEOutputUtils.writeBodyPart(outStream, part2, boundary);
+        MIMEOutputUtils.finishWritingMime(outStream);
+        buffer = outStream.toByteArray();
+    }
+
+    public void testMIMEWriting() throws IOException, MessagingException {
+        ByteArrayInputStream inStream = new ByteArrayInputStream(buffer);
+        Properties props = new Properties();
+        javax.mail.Session session = javax.mail.Session
+                .getInstance(props, null);
+        MimeMessage mimeMessage = new MimeMessage(session, inStream);
+        DataHandler dh = mimeMessage.getDataHandler();
+        MimeMultipart multiPart = new MimeMultipart(dh.getDataSource());
+        MimeBodyPart mimeBodyPart0 = (MimeBodyPart) multiPart.getBodyPart(0);
+        Object object0 = mimeBodyPart0.getContent();
+        assertNotNull(object0);
+        MimeBodyPart mimeBodyPart1 = (MimeBodyPart) multiPart.getBodyPart(1);
+        Object object1 = mimeBodyPart1.getContent();
+        assertNotNull(object1);
+        assertEquals(multiPart.getCount(),2);
+    }
+}
\ No newline at end of file
diff --git a/test/org/apache/ws/commons/om/MessagesTest.java b/test/org/apache/ws/commons/om/MessagesTest.java
new file mode 100644
index 0000000..7f11a09
--- /dev/null
+++ b/test/org/apache/ws/commons/om/MessagesTest.java
@@ -0,0 +1,62 @@
+/*
+ * Copyright 2004,2005 The Apache Software Foundation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      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.
+ */
+
+package org.apache.ws.commons.om;
+
+import org.apache.ws.commons.soap.SOAPEnvelope;
+
+public class MessagesTest extends OMTestCase {
+    SOAPEnvelope soapEnvelope;
+
+    public MessagesTest(String testName) {
+        super(testName);
+    }
+
+    public void testMessageWithLotOfWhiteSpaces() throws OMException,
+            Exception {
+        soapEnvelope =
+                (SOAPEnvelope) OMTestUtils.getOMBuilder(
+                        getTestResourceFile(TestConstants.WHITESPACE_MESSAGE))
+                .getDocumentElement();
+        OMTestUtils.walkThrough(soapEnvelope);
+    }
+
+    public void testMinimalMessage() throws OMException, Exception {
+        soapEnvelope =
+                (SOAPEnvelope) OMTestUtils.getOMBuilder(
+                        getTestResourceFile(TestConstants.MINIMAL_MESSAGE))
+                .getDocumentElement();
+        OMTestUtils.walkThrough(soapEnvelope);
+    }
+
+    public void testReallyBigMessage() throws OMException, Exception {
+        soapEnvelope =
+                (SOAPEnvelope) OMTestUtils.getOMBuilder(
+                        getTestResourceFile(TestConstants.REALLY_BIG_MESSAGE))
+                .getDocumentElement();
+        OMTestUtils.walkThrough(soapEnvelope);
+    }
+
+    public void testEmptyBodiedMessage() throws OMException, Exception {
+        soapEnvelope =
+                (SOAPEnvelope) OMTestUtils.getOMBuilder(
+                        getTestResourceFile(TestConstants.EMPTY_BODY_MESSAGE))
+                .getDocumentElement();
+        OMTestUtils.walkThrough(soapEnvelope);
+    }
+
+
+}
diff --git a/test/org/apache/ws/commons/om/OMBlankElementTest.java b/test/org/apache/ws/commons/om/OMBlankElementTest.java
new file mode 100644
index 0000000..003ff24
--- /dev/null
+++ b/test/org/apache/ws/commons/om/OMBlankElementTest.java
@@ -0,0 +1,56 @@
+/*
+ * Copyright 2004,2005 The Apache Software Foundation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      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.
+ */
+
+package org.apache.ws.commons.om;
+
+import junit.framework.TestCase;
+
+import javax.xml.stream.XMLStreamException;
+import java.io.StringWriter;
+
+
+public class OMBlankElementTest extends TestCase {
+
+
+	public OMBlankElementTest(String name) {
+		super(name);
+	}
+
+	public void testBlankOMElem() {
+		try {
+			//We should not get anything as the return value here: the output of the serialization
+			String value = buildBlankOMElem();
+			assertNull("There's a serialized output for a blank XML element that cannot exist", value);
+		} catch (Exception e) {
+			//An exception is thrown trying to serializeAndConsume a blank element
+			assertTrue(true);
+		}
+	}
+
+
+
+	String buildBlankOMElem() throws XMLStreamException {
+		OMFactory factory = OMAbstractFactory.getOMFactory();
+		OMNamespace namespace1 = factory.createOMNamespace("","");
+		OMElement elem1 = factory.createOMElement("",namespace1);
+
+		StringWriter writer = new StringWriter();
+		elem1.build();
+		elem1.serialize(writer);
+		writer.flush();
+		return writer.toString();
+	}
+}
diff --git a/test/org/apache/ws/commons/om/OMBodyTest.java b/test/org/apache/ws/commons/om/OMBodyTest.java
new file mode 100644
index 0000000..8318115
--- /dev/null
+++ b/test/org/apache/ws/commons/om/OMBodyTest.java
@@ -0,0 +1,62 @@
+/*
+ * Copyright 2004,2005 The Apache Software Foundation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      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.
+ */
+
+package org.apache.ws.commons.om;
+
+import org.apache.ws.commons.soap.SOAPBody;
+import org.apache.ws.commons.soap.SOAPProcessingException;
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+
+public class OMBodyTest extends OMTestCase implements OMConstants {
+    SOAPBody soapBody;
+    private Log log = LogFactory.getLog(getClass());
+
+    public OMBodyTest(String testName) {
+        super(testName);
+    }
+
+    /*
+     * @see TestCase#setUp()
+     */
+    protected void setUp() throws Exception {
+        super.setUp();
+        soapBody = soapEnvelope.getBody();
+    }
+
+    /*
+     * Class under test for SOAPFault addFault()
+     */
+    public void testAddFault() {
+        log.info("Adding SOAP fault to body ....");
+        try {
+            soapBody.addChild(
+                    soapFactory.createSOAPFault(soapBody,
+                            new Exception("Testing soap fault")));
+        } catch (SOAPProcessingException e) {
+            log.info(e.getMessage());
+            fail(e.getMessage());
+        }
+        log.info("\t checking for SOAP Fault ...");
+        assertTrue("SOAP body has no SOAP fault", soapBody.hasFault());
+        log.info("\t checking for not-nullity ...");
+        assertTrue("SOAP body has no SOAP fault", soapBody.getFault() != null);
+
+        //SimpleOMSerializer simpleOMSerializer = new SimpleOMSerializer();
+        //simpleOMSerializer.serializeAndConsume(soapBody, System.out);
+    }
+
+}
diff --git a/test/org/apache/ws/commons/om/OMDocumentTest.java b/test/org/apache/ws/commons/om/OMDocumentTest.java
new file mode 100644
index 0000000..b84546e
--- /dev/null
+++ b/test/org/apache/ws/commons/om/OMDocumentTest.java
@@ -0,0 +1,95 @@
+/*
+ * Copyright 2004,2005 The Apache Software Foundation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      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.
+ */
+
+package org.apache.ws.commons.om;
+
+import junit.framework.TestCase;
+import org.apache.ws.commons.om.impl.llom.builder.StAXOMBuilder;
+
+import javax.xml.stream.XMLInputFactory;
+import javax.xml.stream.XMLStreamException;
+import javax.xml.stream.XMLStreamReader;
+import java.io.ByteArrayOutputStream;
+import java.io.StringReader;
+import java.util.Iterator;
+
+public class OMDocumentTest extends TestCase {
+    private String sampleXML = "<?xml version='1.0' encoding='utf-8'?>" +
+            "<!--This is some comments at the start of the document-->" +
+            "<?PITarget PIData?>" +
+            "<Axis2>" +
+            "    <ProjectName>The Apache Web Sevices Project</ProjectName>" +
+            "</Axis2>";
+
+    public void testOMDocument() throws XMLStreamException {
+        // read the string in to the builder
+        OMDocument omDocument = getSampleOMDocument(sampleXML);
+
+        // serialise it to a string
+        String outXML = "";
+        ByteArrayOutputStream outStream = new ByteArrayOutputStream();
+        omDocument.serializeAndConsume(outStream);
+        outXML = new String(outStream.toByteArray());
+
+        // again load that to another builder
+        OMDocument secondDocument = getSampleOMDocument(outXML);
+
+        // check for the comment and the PI
+        boolean commentFound = false;
+        boolean piFound = false;
+        Iterator children = secondDocument.getChildren();
+        while (children.hasNext()) {
+            OMNode omNode = (OMNode) children.next();
+            if (omNode instanceof OMComment) {
+                commentFound = true;
+            } else if (omNode instanceof OMProcessingInstruction) {
+                piFound = true;
+            } else if (omNode instanceof OMElement && !commentFound && !piFound) {
+               fail("OMElement should come after Comment and PI");
+
+            }
+        }
+        assertTrue(commentFound && piFound);
+
+
+    }
+
+    private OMDocument getSampleOMDocument(String xml) {
+        try {
+            XMLStreamReader xmlStreamReader = XMLInputFactory.newInstance().createXMLStreamReader(new StringReader(xml));
+            StAXOMBuilder builder = new StAXOMBuilder(xmlStreamReader);
+            return builder.getDocument();
+        } catch (XMLStreamException e) {
+            throw new UnsupportedOperationException();
+        }
+    }
+
+//    private OMDocument getSampleOMDocument() {
+//        OMFactory omFactory = OMAbstractFactory.getOMFactory();
+//        OMDocument omDocument = omFactory.createOMDocument();
+//        omFactory.createOMComment(omDocument, "This is some comments at the start of the document");
+//        omDocument.setCharsetEncoding("utf-8");
+//        omFactory.createOMProcessingInstruction(omDocument, "PITarget", "PIData");
+//
+//        OMElement documentElement = omFactory.createOMElement("Axis2", null, omDocument);
+//        omDocument.setDocumentElement(documentElement);
+//        omFactory.createOMElement("ProjectName", null, documentElement);
+//        documentElement.getFirstElement().setText("The Apache Web Sevices Project");
+//
+//        return omDocument;
+//    }
+
+}
diff --git a/test/org/apache/ws/commons/om/OMElementCloneTest.java b/test/org/apache/ws/commons/om/OMElementCloneTest.java
new file mode 100644
index 0000000..2b8f5d0
--- /dev/null
+++ b/test/org/apache/ws/commons/om/OMElementCloneTest.java
@@ -0,0 +1,89 @@
+package org.apache.ws.commons.om;
+
+import org.apache.ws.commons.om.impl.llom.builder.StAXOMBuilder;
+import org.apache.ws.commons.soap.SOAPBody;
+import org.apache.ws.commons.soap.SOAPEnvelope;
+import org.custommonkey.xmlunit.XMLTestCase;
+import org.w3c.dom.Document;
+import org.xml.sax.SAXException;
+
+import javax.xml.parsers.DocumentBuilder;
+import javax.xml.parsers.DocumentBuilderFactory;
+import javax.xml.parsers.ParserConfigurationException;
+import java.io.ByteArrayInputStream;
+import java.io.File;
+import java.io.IOException;
+
+/*
+ * Copyright 2001-2004 The Apache Software Foundation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      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.
+ *
+ */
+
+public class OMElementCloneTest extends XMLTestCase {
+
+    File dir = new File(TestConstants.TEST_RESOURCES, TestConstants.SOAP_DIR);
+
+    public void testElementCloningWithoutUsingOMElementMethod() throws Exception {
+        SOAPEnvelope soapEnvelope =
+                (SOAPEnvelope) OMTestUtils.getOMBuilder(
+                        new File(dir, TestConstants.SOAPMESSAGE))
+                        .getDocumentElement();
+        SOAPBody body = soapEnvelope.getBody();
+
+        OMElement firstClonedBodyElement = new StAXOMBuilder(body.getXMLStreamReader()).getDocumentElement();
+        OMElement secondClonedBodyElement = new StAXOMBuilder(body.getXMLStreamReader()).getDocumentElement();
+
+        // first check whether both have the same information
+        assertXMLEqual(newDocument(body.toString()), newDocument(firstClonedBodyElement.toString()));
+        assertXMLEqual(newDocument(body.toString()), newDocument(secondClonedBodyElement.toString()));
+        assertXMLEqual(newDocument(firstClonedBodyElement.toString()), newDocument(secondClonedBodyElement.toString()));
+
+        // lets check some links. They must not be equal
+        assertNotSame(body.getParent(), firstClonedBodyElement.getParent());
+        assertNotSame(body.getParent(), secondClonedBodyElement.getParent());
+        assertNotSame(firstClonedBodyElement.getParent(), secondClonedBodyElement.getParent());
+
+    }
+
+    public void testElementCloningUsingOMElementMethod() throws Exception {
+        SOAPEnvelope soapEnvelope =
+                (SOAPEnvelope) OMTestUtils.getOMBuilder(
+                        new File(dir, TestConstants.SOAPMESSAGE))
+                        .getDocumentElement();
+        SOAPBody body = soapEnvelope.getBody();
+
+        OMElement firstClonedBodyElement = body.cloneOMElement();
+        OMElement secondClonedBodyElement = body.cloneOMElement();
+
+        // first check whether both have the same information
+        assertXMLEqual(newDocument(body.toString()), newDocument(firstClonedBodyElement.toString()));
+        assertXMLEqual(newDocument(body.toString()), newDocument(secondClonedBodyElement.toString()));
+        assertXMLEqual(newDocument(firstClonedBodyElement.toString()), newDocument(secondClonedBodyElement.toString()));
+
+        // lets check some links. They must not be equal
+        assertNotSame(body.getParent(), firstClonedBodyElement.getParent());
+        assertNotSame(body.getParent(), secondClonedBodyElement.getParent());
+        assertNotSame(firstClonedBodyElement.getParent(), secondClonedBodyElement.getParent());
+
+    }
+
+    public Document newDocument(String xml)
+            throws ParserConfigurationException, SAXException, IOException {
+        DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
+        dbf.setNamespaceAware(true);
+        DocumentBuilder db = dbf.newDocumentBuilder();
+        return db.parse(new ByteArrayInputStream(xml.getBytes()));
+    }
+}
diff --git a/test/org/apache/ws/commons/om/OMElementQNameTest.java b/test/org/apache/ws/commons/om/OMElementQNameTest.java
new file mode 100644
index 0000000..ca1a813
--- /dev/null
+++ b/test/org/apache/ws/commons/om/OMElementQNameTest.java
@@ -0,0 +1,88 @@
+/** (C) Copyright 2005 Hewlett-Packard Development Company, LP
+
+ This library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Lesser General Public
+ License as published by the Free Software Foundation; either
+ version 2.1 of the License, or (at your option) any later version.
+
+ This library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public
+ License along with this library; if not, write to the Free Software
+ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+
+ For more information: www.smartfrog.org
+
+ */
+package org.apache.ws.commons.om;
+
+import org.apache.ws.commons.om.util.ElementHelper;
+
+import javax.xml.namespace.QName;
+
+/**
+ * created 03-Nov-2005 11:46:32
+ */
+
+public class OMElementQNameTest extends OMTestCase {
+
+    OMElement element;
+
+    private static final String WSA= "http://schemas.xmlsoap.org/ws/2004/03/addressing";
+    private static final String SOAPENV = "http://schemas.xmlsoap.org/soap/envelope/";
+
+    public OMElementQNameTest(String testName) {
+        super(testName);
+    }
+
+    protected void setUp() throws Exception {
+        super.setUp();
+        element = OMTestUtils.getOMBuilder(
+                        getTestResourceFile(TestConstants.SOAP_SOAPMESSAGE1))
+                        .getDocumentElement();
+    }
+
+    public void testSimpleQName() throws Exception {
+        QName result = element.resolveQName("wsa:To");
+        assertEquals(WSA,result.getNamespaceURI());
+        assertEquals("wsa", result.getPrefix());
+        assertEquals("To", result.getLocalPart());
+    }
+
+    public void testDefaultQName() throws Exception {
+        QName result = element.resolveQName("localonly");
+        assertEquals(SOAPENV, result.getNamespaceURI());
+        assertEquals("soapenv", result.getPrefix());
+        assertEquals("localonly", result.getLocalPart());
+    }
+
+    public void testDefaultQNameCanBeLocal() throws Exception {
+        ElementHelper helper=new ElementHelper(element);
+        QName result = helper.resolveQName("localonly",false);
+        assertEquals("", result.getNamespaceURI());
+        assertEquals("localonly", result.getLocalPart());
+    }
+
+    public void testNoLocal() throws Exception {
+        assertResolvesToNull("wsa:");
+    }
+
+    public void testNoMatch() throws Exception {
+        assertResolvesToNull("wsa2005:To");
+    }
+
+    public void testNothing() throws Exception {
+        assertResolvesToNull(":");
+    }
+
+
+
+    private void assertResolvesToNull(String qname) {
+        QName result = element.resolveQName(qname);
+        assertNull("Expected "+qname+" to resolve to null",result);
+    }
+
+}
diff --git a/test/org/apache/ws/commons/om/OMNavigatorTest.java b/test/org/apache/ws/commons/om/OMNavigatorTest.java
new file mode 100644
index 0000000..12070e0
--- /dev/null
+++ b/test/org/apache/ws/commons/om/OMNavigatorTest.java
@@ -0,0 +1,103 @@
+/*
+ * Copyright 2004,2005 The Apache Software Foundation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      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.
+ */
+
+package org.apache.ws.commons.om;
+
+import org.apache.ws.commons.om.impl.llom.OMNavigator;
+import org.apache.ws.commons.soap.SOAPEnvelope;
+import org.apache.ws.commons.soap.impl.llom.builder.StAXSOAPModelBuilder;
+
+import javax.xml.stream.XMLInputFactory;
+import javax.xml.stream.XMLOutputFactory;
+import javax.xml.stream.XMLStreamReader;
+import javax.xml.stream.XMLStreamWriter;
+import java.io.File;
+import java.io.FileOutputStream;
+import java.io.FileReader;
+
+public class OMNavigatorTest extends AbstractTestCase {
+    private SOAPEnvelope envelope = null;
+    private OMXMLParserWrapper builder;
+    private File tempFile;
+    private XMLStreamWriter output;
+
+    public OMNavigatorTest(String testName) {
+        super(testName);
+    }
+
+    protected void setUp() throws Exception {
+        XMLStreamReader xmlStreamReader = XMLInputFactory.newInstance().
+                createXMLStreamReader(
+                        new FileReader(
+                                getTestResourceFile(TestConstants.SOAP_SOAPMESSAGE1)));
+        builder = new StAXSOAPModelBuilder(xmlStreamReader, null);
+        envelope = (SOAPEnvelope) builder.getDocumentElement();
+        tempFile = File.createTempFile("temp", "xml");
+        output =
+                XMLOutputFactory.newInstance().createXMLStreamWriter(
+                        new FileOutputStream(tempFile));
+    }
+
+    public void testnavigatorFullyBuilt() throws Exception {
+        assertNotNull(envelope);
+        //dump the out put to a  temporary file
+        envelope.serialize(output);
+
+        //now the OM is fully created -> test the navigation
+        OMNavigator navigator = new OMNavigator(envelope);
+        OMNode node = null;
+        while (navigator.isNavigable()) {
+            node = navigator.next();
+            assertNotNull(node);
+        }
+    }
+
+    public void testnavigatorHalfBuilt() {
+        assertNotNull(envelope);
+        //now the OM is not fully created. Try to navigate it
+        OMNavigator navigator = new OMNavigator(envelope);
+        OMNode node = null;
+        while (navigator.isNavigable()) {
+            node = navigator.next();
+            assertNotNull(node);
+        }
+    }
+
+    public void testnavigatorHalfBuiltStep() {
+        assertNotNull(envelope);
+
+        //now the OM is not fully created
+        OMNavigator navigator = new OMNavigator(envelope);
+        OMNode node = null;
+        while (!navigator.isCompleted()) {
+            if (navigator.isNavigable()) {
+                node = navigator.next();
+            } else {
+                builder.next();
+                navigator.step();
+                node = navigator.next();
+            }
+            assertNotNull(node);
+
+        }
+
+    }
+
+    protected void tearDown() throws Exception {
+        tempFile.delete();
+    }
+
+}
diff --git a/test/org/apache/ws/commons/om/OMTest.java b/test/org/apache/ws/commons/om/OMTest.java
new file mode 100644
index 0000000..64617bf
--- /dev/null
+++ b/test/org/apache/ws/commons/om/OMTest.java
@@ -0,0 +1,142 @@
+/*
+ * Copyright 2004,2005 The Apache Software Foundation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      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.
+ */
+
+package org.apache.ws.commons.om;
+
+import org.apache.ws.commons.soap.SOAPEnvelope;
+import org.apache.ws.commons.soap.impl.llom.builder.StAXSOAPModelBuilder;
+
+import javax.xml.stream.XMLInputFactory;
+import javax.xml.stream.XMLStreamReader;
+import java.io.File;
+import java.io.FileReader;
+import java.util.Iterator;
+
+/**
+ * This test case tests the basic expectations of the engine from the OM.
+ */
+public class OMTest extends AbstractTestCase {
+    private SOAPEnvelope envelope;
+
+    /**
+     * Constructor.
+     */
+    public OMTest(String testName) {
+        super(testName);
+    }
+
+    protected void setUp() throws Exception {
+        File file = getTestResourceFile(TestConstants.SAMPLE1);
+        XMLStreamReader parser = XMLInputFactory.newInstance()
+                .createXMLStreamReader(new FileReader(file));
+        OMXMLParserWrapper builder = new StAXSOAPModelBuilder(parser, null);
+        envelope = (SOAPEnvelope) builder.getDocumentElement();
+    }
+
+    /**
+     * Sometime the hasNext() in the childeren iterator is true yet the next() is null
+     */
+    public void testNullInChilderen() {
+        isNullChildrenThere(envelope);
+    }
+
+    /**
+     * the envelope is completly namesapce qulified so all the OMElements got to have namespace values not null
+     */
+    public void test4MissingNamespaces() {
+        isNameSpacesMissing(envelope);
+    }
+
+    public void isNullChildrenThere(OMElement omeleent) {
+        Iterator it = omeleent.getChildren();
+        while (it.hasNext()) {
+            OMNode node = (OMNode) it.next();
+            assertNotNull(node);
+            if (node.getType() == OMNode.ELEMENT_NODE) {
+                isNullChildrenThere((OMElement) node);
+            }
+        }
+    }
+
+    public void isNameSpacesMissing(OMElement omeleent) {
+        OMNamespace omns = omeleent.getNamespace();
+        assertNotNull(omns);
+        assertNotNull(omns.getName());
+        Iterator it = omeleent.getChildren();
+        while (it.hasNext()) {
+            OMNode node = (OMNode) it.next();
+            if (node != null && node.getType() == OMNode.ELEMENT_NODE) {
+                isNameSpacesMissing((OMElement) node);
+            }
+        }
+    }
+
+    public void testRootNotCompleteInPartialBuild() throws Exception {
+        assertFalse("Root should not be complete", envelope.isComplete());
+    }
+
+    /**
+     * Assumption - The fed XML has at least two children under the root element
+     *
+     * @throws Exception
+     */
+    public void testFirstChildDetach() throws Exception {
+        OMElement root = envelope;
+        assertFalse("Root should not be complete", root.isComplete());
+        OMNode oldFirstChild = root.getFirstOMChild();
+        assertNotNull(oldFirstChild);
+        oldFirstChild.detach();
+        OMNode newFirstChild = root.getFirstOMChild();
+        assertNotNull(newFirstChild);
+        assertNotSame(oldFirstChild, newFirstChild);
+    }
+
+    //todo this is wrong correct this
+    public void testAdditionOfaCompletelyNewElement() throws Exception {
+
+        //        OMElement root= envelope;
+        //
+        //        OMNamespace soapenv= root.findNamespace("http://schemas.xmlsoap.org/soap/envelope/", "soapenv");
+        //        OMNamespace wsa= root.findNamespace("http://schemas.xmlsoap.org/ws/2004/03/addressing", "wsa");
+        //        if (wsa==null)
+        //            wsa= root.declareNamespace("http://schemas.xmlsoap.org/ws/2004/03/addressing", "wsa");
+        //
+        //        //Assumption - A RelatesTo Element does not exist in the input document
+        //        OMElement relatesTo= fac.createOMElement ("RelatesTo", wsa);
+        //        relatesTo.addAttribute(fac.createOMAttribute("RelationshipType", null, "wsa:Reply", relatesTo));
+        //        relatesTo.addAttribute(fac.createOMAttribute("mustUnderstand", soapenv, "0", relatesTo));
+        //        relatesTo.addChild(fac.createText(relatesTo, "uuid:3821F4F0-D020-11D8-A10A-E4EE6425FCB0"));
+        //        relatesTo.setComplete(true);
+        //
+        //        root.addChild(relatesTo);
+        //
+        //        QName name = new QName(wsa.getName(),"RelatesTo",wsa.getPrefix());
+        //
+        //        Iterator children = root.getChildrenWithName(name);
+        //        //this should contain only one child!
+        //        if (children.hasNext()){
+        //            OMElement newlyAddedElement = (OMElement)children.next();
+        //
+        //            assertNotNull(newlyAddedElement);
+        //
+        //            assertEquals(newlyAddedElement.getLocalName(),"RelatesTo");
+        //            //todo put the other assert statements here
+        //        }else{
+        //            assertFalse("New child not added",true);
+        //        }
+
+    }
+}
diff --git a/test/org/apache/ws/commons/om/OMTestCase.java b/test/org/apache/ws/commons/om/OMTestCase.java
new file mode 100644
index 0000000..4348755
--- /dev/null
+++ b/test/org/apache/ws/commons/om/OMTestCase.java
@@ -0,0 +1,73 @@
+/*
+ * Copyright 2004,2005 The Apache Software Foundation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      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.
+ */
+
+package org.apache.ws.commons.om;
+
+import org.apache.ws.commons.soap.SOAPEnvelope;
+import org.apache.ws.commons.soap.SOAPFactory;
+import org.apache.ws.commons.soap.impl.llom.builder.StAXSOAPModelBuilder;
+
+import javax.xml.stream.XMLInputFactory;
+import javax.xml.stream.XMLOutputFactory;
+import javax.xml.stream.XMLStreamException;
+import javax.xml.stream.XMLStreamReader;
+import javax.xml.stream.XMLStreamWriter;
+import java.io.FileReader;
+import java.io.InputStream;
+import java.io.OutputStream;
+
+public abstract class OMTestCase extends AbstractTestCase {
+    protected StAXSOAPModelBuilder builder;
+    protected OMFactory ombuilderFactory;
+    protected SOAPFactory soapFactory;
+
+    protected SOAPEnvelope soapEnvelope;
+
+    public OMTestCase(String testName) {
+        super(testName);
+        ombuilderFactory = OMAbstractFactory.getOMFactory();
+        soapFactory = OMAbstractFactory.getSOAP11Factory();
+    }
+
+    protected void setUp() throws Exception {
+        super.setUp();
+        soapEnvelope = (SOAPEnvelope) getOMBuilder("").getDocumentElement();
+    }
+
+    protected StAXSOAPModelBuilder getOMBuilder(String fileName) throws Exception {
+        if ("".equals(fileName) || fileName == null) {
+            fileName = TestConstants.SOAP_SOAPMESSAGE;
+        }
+        XMLStreamReader parser = XMLInputFactory.newInstance()
+                .createXMLStreamReader(
+                        new FileReader(getTestResourceFile(fileName)));
+        builder = new StAXSOAPModelBuilder(parser, null);
+        return builder;
+    }
+
+    protected StAXSOAPModelBuilder getOMBuilder(InputStream in) throws Exception {
+        XMLStreamReader parser = XMLInputFactory.newInstance()
+                .createXMLStreamReader(in);
+        builder = new StAXSOAPModelBuilder(parser, null);
+        return builder;
+    }
+
+    protected XMLStreamWriter getStAXStreamWriter(OutputStream out) throws XMLStreamException {
+        return XMLOutputFactory.newInstance().createXMLStreamWriter(out);
+    }
+
+
+}
diff --git a/test/org/apache/ws/commons/om/OMTestUtils.java b/test/org/apache/ws/commons/om/OMTestUtils.java
new file mode 100644
index 0000000..a69e419
--- /dev/null
+++ b/test/org/apache/ws/commons/om/OMTestUtils.java
@@ -0,0 +1,121 @@
+/*
+ * Copyright 2004,2005 The Apache Software Foundation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      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.
+ */
+
+package org.apache.ws.commons.om;
+
+import junit.framework.TestCase;
+import org.apache.ws.commons.om.impl.llom.factory.OMXMLBuilderFactory;
+import org.apache.ws.commons.soap.SOAPEnvelope;
+import org.w3c.dom.Attr;
+import org.w3c.dom.Element;
+import org.w3c.dom.NamedNodeMap;
+import org.w3c.dom.Node;
+import org.w3c.dom.NodeList;
+
+import javax.xml.stream.XMLInputFactory;
+import javax.xml.stream.XMLStreamReader;
+import java.io.File;
+import java.io.FileReader;
+import java.util.Iterator;
+
+public class OMTestUtils {
+    public static OMXMLParserWrapper getOMBuilder(File file) throws Exception {
+        XMLStreamReader parser = XMLInputFactory.newInstance()
+                .createXMLStreamReader(new FileReader(file));
+        return OMXMLBuilderFactory.createStAXSOAPModelBuilder(
+                OMAbstractFactory.getSOAP11Factory(), parser);
+    }
+
+    public static void walkThrough(OMElement omEle) {
+        Iterator attibIt = omEle.getAllAttributes();
+        if (attibIt != null) {
+            while (attibIt.hasNext()) {
+                TestCase.assertNotNull("once the has next is not null, the " +
+                        "element should not be null",
+                        attibIt.next());
+            }
+        }
+        Iterator it = omEle.getChildren();
+        if (it != null) {
+            while (it.hasNext()) {
+                OMNode ele = (OMNode) it.next();
+                TestCase.assertNotNull("once the has next is not null, the " +
+                        "element should not be null", ele);
+                if (ele instanceof OMElement) {
+                    walkThrough((OMElement) ele);
+                }
+            }
+        }
+    }
+
+    public static void compare(Element ele, OMElement omele) throws Exception {
+        if (ele == null && omele == null) {
+            return;
+        } else if (ele != null && omele != null) {
+            TestCase.assertEquals("Element name not correct",
+                    ele.getLocalName(),
+                    omele.getLocalName());
+            if (omele.getNamespace() != null) {
+                TestCase.assertEquals("Namespace URI not correct",
+                        ele.getNamespaceURI(),
+                        omele.getNamespace().getName());
+
+            }
+
+            //go through the attributes
+            NamedNodeMap map = ele.getAttributes();
+            Iterator attIterator = omele.getAllAttributes();
+            OMAttribute omattribute;
+            while (attIterator != null && attIterator.hasNext() && map == null) {
+                omattribute = (OMAttribute) attIterator.next();
+                Node node = map.getNamedItemNS(
+                        omattribute.getNamespace().getName(),
+                        omattribute.getLocalName());
+                if (node.getNodeType() == Node.ATTRIBUTE_NODE) {
+                    Attr attr = (Attr) node;
+                    TestCase.assertEquals(attr.getValue(),
+                            omattribute.getAttributeValue());
+                } else {
+                    throw new OMException("return type is not a Attribute");
+                }
+
+            }
+            Iterator it = omele.getChildren();
+            NodeList list = ele.getChildNodes();
+            for (int i = 0; i < list.getLength(); i++) {
+                Node node = list.item(i);
+                if (node.getNodeType() == Node.ELEMENT_NODE) {
+                    TestCase.assertTrue(it.hasNext());
+                    OMNode tempOmNode = (OMNode) it.next();
+                    while (tempOmNode.getType() != OMNode.ELEMENT_NODE) {
+                        TestCase.assertTrue(it.hasNext());
+                        tempOmNode = (OMNode) it.next();
+                    }
+                    compare((Element) node, (OMElement) tempOmNode);
+                }
+            }
+
+
+        } else {
+            throw new Exception("One is null");
+        }
+    }
+
+    public static SOAPEnvelope createOM(File file) throws Exception {
+        return (SOAPEnvelope) getOMBuilder(file).getDocumentElement();
+    }
+
+}
diff --git a/test/org/apache/ws/commons/om/SpacesTest.java b/test/org/apache/ws/commons/om/SpacesTest.java
new file mode 100644
index 0000000..8df59ed
--- /dev/null
+++ b/test/org/apache/ws/commons/om/SpacesTest.java
@@ -0,0 +1,98 @@
+/*
+ * Copyright 2004,2005 The Apache Software Foundation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      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.
+ */
+
+package org.apache.ws.commons.om;
+
+import org.apache.ws.commons.om.impl.llom.builder.StAXOMBuilder;
+import org.apache.ws.commons.om.impl.llom.factory.OMXMLBuilderFactory;
+import org.custommonkey.xmlunit.Diff;
+import org.custommonkey.xmlunit.XMLTestCase;
+import org.w3c.dom.Document;
+import org.xml.sax.InputSource;
+import org.xml.sax.SAXException;
+
+import javax.xml.parsers.DocumentBuilder;
+import javax.xml.parsers.DocumentBuilderFactory;
+import javax.xml.parsers.ParserConfigurationException;
+import javax.xml.stream.XMLInputFactory;
+import javax.xml.stream.XMLStreamException;
+import java.io.ByteArrayInputStream;
+import java.io.ByteArrayOutputStream;
+import java.io.FileInputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.InputStreamReader;
+
+public class SpacesTest extends XMLTestCase {
+    private String filePath = "test-resources/xml/spaces.xml";
+
+
+    private OMElement rootElement;
+
+    protected void setUp() throws Exception {
+    }
+
+    public void testCData() throws Exception {
+        checkOMConformance(new FileInputStream(filePath));
+    }
+
+    private void checkOMConformance(InputStream iStream) throws Exception {
+        try {
+            XMLInputFactory factory = XMLInputFactory.newInstance();
+
+            StAXOMBuilder staxOMBuilder = OMXMLBuilderFactory.
+                    createStAXOMBuilder(OMAbstractFactory.getOMFactory(),
+                            factory.createXMLStreamReader(
+                                    iStream));
+            staxOMBuilder.setDoDebug(true);
+            rootElement = staxOMBuilder.getDocumentElement();
+
+            ByteArrayOutputStream baos = new ByteArrayOutputStream();
+            ((OMDocument) rootElement.getParent()).serialize(baos);
+
+            InputSource resultXML = new InputSource(new InputStreamReader(
+                    new ByteArrayInputStream(baos.toByteArray())));
+
+            Document dom1 = newDocument(new InputSource(new FileInputStream(filePath)));
+            Document dom2 = newDocument(resultXML);
+
+            Diff diff = compareXML(dom1, dom2);
+            assertXMLEqual(diff, true);
+        } catch (XMLStreamException e) {
+            fail(e.getMessage());
+            throw new Exception(e);
+        } catch (ParserConfigurationException e) {
+            fail(e.getMessage());
+            throw new Exception(e);
+        } catch (SAXException e) {
+            fail(e.getMessage());
+            throw new Exception(e);
+        } catch (IOException e) {
+            fail(e.getMessage());
+            throw new Exception(e);
+        }
+    }
+
+    public Document newDocument(InputSource in)
+            throws ParserConfigurationException, SAXException, IOException {
+        DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
+        dbf.setNamespaceAware(true);
+        DocumentBuilder db = dbf.newDocumentBuilder();
+        return db.parse(in);
+    }
+
+
+}
diff --git a/test/org/apache/ws/commons/om/StaxParserTest.java b/test/org/apache/ws/commons/om/StaxParserTest.java
new file mode 100644
index 0000000..d445ac9
--- /dev/null
+++ b/test/org/apache/ws/commons/om/StaxParserTest.java
@@ -0,0 +1,221 @@
+/*
+ * Copyright 2004,2005 The Apache Software Foundation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      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.
+ */
+
+package org.apache.ws.commons.om;
+
+import org.apache.ws.commons.om.impl.llom.factory.OMXMLBuilderFactory;
+
+import javax.xml.stream.XMLInputFactory;
+import javax.xml.stream.XMLOutputFactory;
+import javax.xml.stream.XMLStreamException;
+import javax.xml.stream.XMLStreamReader;
+import javax.xml.stream.XMLStreamWriter;
+import java.io.ByteArrayInputStream;
+import java.util.Iterator;
+
+public class StaxParserTest extends AbstractTestCase {
+
+    XMLStreamReader parser1;
+    XMLStreamReader parser2;
+    XMLStreamReader parser3;
+    XMLStreamReader parser4;
+    String xmlDocument = "<purchase-order xmlns=\"http://openuri.org/easypo\">" +
+            "<customer>" +
+            "    <name>Gladys Kravitz</name>" +
+            "    <address>Anytown, PA</address>" +
+            "  </customer>" +
+            "  <date>2005-03-06T14:06:12.697+06:00</date>" +
+            "</purchase-order>";
+
+    public StaxParserTest(String testName) {
+        super(testName);
+    }
+
+    protected void setUp() throws Exception {
+        //make the parsers
+        //Parser 1 is a plain parser from the stax implementation
+        parser1 =
+                XMLInputFactory.newInstance().createXMLStreamReader(
+                        new ByteArrayInputStream(xmlDocument.getBytes()));
+
+        //parser 2 is one of our parsers taken with cache. i.e. when the parser
+        //proceeds the object model will be built
+        OMXMLParserWrapper builder = OMXMLBuilderFactory.createStAXOMBuilder(
+                OMAbstractFactory.getSOAP11Factory(),
+                XMLInputFactory.newInstance().createXMLStreamReader(
+                        new ByteArrayInputStream(xmlDocument.getBytes())));
+        parser2 = builder.getDocumentElement().getXMLStreamReader();
+
+        //same as parser2 but this time the parser is not a caching parser. Once the
+        //parser proceeds, it's gone forever.
+        OMXMLParserWrapper builder2 = OMXMLBuilderFactory.createStAXOMBuilder(
+                OMAbstractFactory.getSOAP11Factory(),
+                XMLInputFactory.newInstance().createXMLStreamReader(
+                        new ByteArrayInputStream(xmlDocument.getBytes())));
+        parser3 =
+                builder2.getDocumentElement().getXMLStreamReaderWithoutCaching();
+
+        //parser4 is another instance of our parser accessing the same stream as parser3.
+        // Note - The implementation returns a *new* instance but with reference to
+        //the same underlying stream!
+        parser4 = builder2.getDocumentElement().getXMLStreamReaderWithoutCaching();
+
+    }
+
+    public void testParserEventsWithCache() throws Exception {
+
+        //check the initial event
+        assertEquals(parser1.getEventType(), parser2.getEventType());
+
+        //check the other events
+        while (parser1.hasNext()) {
+
+            int parser1Event = parser1.next();
+            int parser2Event = parser2.next();
+            assertEquals(parser1Event, parser2Event);
+
+        }
+
+
+    }
+
+    public void testParserEventsWithoutCache() throws Exception {
+
+        assertEquals(parser1.getEventType(), parser3.getEventType());
+
+        while (parser1.hasNext()) {
+            int parser1Event = parser1.next();
+            int parser2Event = parser3.next();
+            assertEquals(parser1Event, parser2Event);
+        }
+
+
+    }
+
+    public void testParserEvents2WithCache() throws Exception {
+        while (parser1.hasNext()) {
+            int parser1Event = parser1.getEventType();
+            int parser2Event = parser2.getEventType();
+            parser1.next();
+            parser2.next();
+            assertEquals(parser1Event, parser2Event);
+        }
+
+
+    }
+
+
+    public void testParserBehaviornonCaching() throws Exception{
+
+        OMXMLParserWrapper builder2 = OMXMLBuilderFactory.createStAXOMBuilder(
+                OMAbstractFactory.getOMFactory(),
+                XMLInputFactory.newInstance().createXMLStreamReader(
+                        new ByteArrayInputStream(xmlDocument.getBytes())));
+
+        OMElement documentElement = builder2.getDocumentElement();
+        XMLStreamReader originalParser =
+                documentElement.getXMLStreamReaderWithoutCaching();
+
+        //consume the parser. this should force the xml stream to be exhausted without
+        //building the tree
+        while(originalParser.hasNext()){
+            originalParser.next();
+        }
+
+        //try to find the children of the document element. This should produce an
+        //error since the underlying stream is fully consumed without building the object tree
+        Iterator childElements = documentElement.getChildElements();
+        try {
+            while (childElements.hasNext()) {
+                childElements.next();
+                fail("The stream should've been consumed by now!");
+            }
+        } catch (Exception e) {
+            //if we are here without failing, then we are successful
+        }
+    }
+
+
+    public void testParserBehaviorCaching() throws Exception{
+
+        OMXMLParserWrapper builder2 = OMXMLBuilderFactory.createStAXOMBuilder(
+                OMAbstractFactory.getSOAP11Factory(),
+                XMLInputFactory.newInstance().createXMLStreamReader(
+                        new ByteArrayInputStream(xmlDocument.getBytes())));
+
+        OMElement documentElement = builder2.getDocumentElement();
+        XMLStreamReader originalParser =
+                documentElement.getXMLStreamReader();
+
+        //consume the parser. this should force the xml stream to be exhausted but the
+        //tree to be fully built
+        while(originalParser.hasNext()){
+            originalParser.next();
+        }
+
+        //try to find the children of the document element. This should *NOT* produce an
+        //error even when the underlying stream is fully consumed , the object tree is already complete
+        Iterator childElements = documentElement.getChildElements();
+        int count = 0;
+        try {
+            while (childElements.hasNext()) {
+                childElements.next();
+                count++;
+            }
+        } catch (Exception e) {
+            fail("The object tree needs to be built and traversing the children is to be a success!");
+        }
+
+        assertEquals("Number of elements need to be 2",count,2);
+    }
+
+
+    public void testParserBehaviorNonCaching2() throws Exception{
+
+        OMXMLParserWrapper builder2 = OMXMLBuilderFactory.createStAXOMBuilder(
+                OMAbstractFactory.getSOAP11Factory(),
+                XMLInputFactory.newInstance().createXMLStreamReader(
+                        new ByteArrayInputStream(xmlDocument.getBytes())));
+
+        OMElement documentElement = builder2.getDocumentElement();
+
+        XMLStreamReader originalParser =
+                documentElement.getXMLStreamReaderWithoutCaching();
+
+        //consume the parser. this should force the xml stream to be exhausted without
+        //building the tree
+        while(originalParser.hasNext()){
+            originalParser.next();
+        }
+
+        //try to find the children of the document element. This should produce an
+        //error since the underlying stream is fully consumed without building the object tree
+        Iterator childElements = documentElement.getChildElements();
+        try {
+            XMLStreamWriter writer =
+                    XMLOutputFactory.newInstance().
+                            createXMLStreamWriter(System.out);
+            documentElement.serializeAndConsume(writer);
+            fail("Stream should be consumed by now");
+        }catch(XMLStreamException e){
+           //wea re cool
+        } catch (Exception e) {
+           fail("This should throw an XMLStreamException");
+        }
+    }
+
+}
+
diff --git a/test/org/apache/ws/commons/om/TestConstants.java b/test/org/apache/ws/commons/om/TestConstants.java
new file mode 100644
index 0000000..3943193
--- /dev/null
+++ b/test/org/apache/ws/commons/om/TestConstants.java
@@ -0,0 +1,44 @@
+/*
+ * Copyright 2005 The Apache Software Foundation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      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.
+ */
+package org.apache.ws.commons.om;
+
+/**
+ * All the various files
+ * created 03-Nov-2005 12:02:12
+ */
+
+public class TestConstants {
+    public static final String TEST_RESOURCES = "test-resources";
+    public static final String SOAP_DIR = "soap";
+    public static final String SOAPMESSAGE = "soapmessage.xml";
+    public static final String SOAP_SOAPMESSAGE = "soap/soapmessage.xml";
+    public static final String SOAP_SOAPMESSAGE1 = "soap/soapmessage1.xml";
+    public static final String SAMPLE1 = "soap/sample1.xml";
+    public static final String WHITESPACE_MESSAGE = "soap/whitespacedMessage.xml";
+    public static final String MINIMAL_MESSAGE = "soap/minimalMessage.xml";
+    public static final String REALLY_BIG_MESSAGE = "soap/reallyReallyBigMessage.xml";
+    public static final String EMPTY_BODY_MESSAGE = "soap/emtyBodymessage.xml";
+    public static final String BAD_WRONG_SOAP_NS = "badsoap/wrongSoapNs.xml";
+    public static final String BAD_TWO_HEADERS = "badsoap/twoheaders.xml";
+    public static final String BAD_TWO_BODY = "badsoap/twoBodymessage.xml";
+    public static final String BAD_ENVELOPE_MISSING = "badsoap/envelopeMissing.xml";
+    public static final String BAD_HEADER_BODY_WRONG_ORDER = "badsoap/haederBodyWrongOrder.xml";
+
+    private TestConstants() {
+    }
+
+
+}
diff --git a/test/org/apache/ws/commons/om/factory/OMLinkedListImplFactoryTest.java b/test/org/apache/ws/commons/om/factory/OMLinkedListImplFactoryTest.java
new file mode 100644
index 0000000..3bead0c
--- /dev/null
+++ b/test/org/apache/ws/commons/om/factory/OMLinkedListImplFactoryTest.java
@@ -0,0 +1,235 @@
+/*
+ * Copyright 2004,2005 The Apache Software Foundation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      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.
+ */
+
+package org.apache.ws.commons.om.factory;
+
+import org.apache.ws.commons.om.AbstractTestCase;
+import org.apache.ws.commons.om.OMAbstractFactory;
+import org.apache.ws.commons.om.OMElement;
+import org.apache.ws.commons.om.OMNamespace;
+import org.apache.ws.commons.om.OMTestUtils;
+import org.apache.ws.commons.om.OMText;
+import org.apache.ws.commons.om.OMXMLParserWrapper;
+import org.apache.ws.commons.soap.SOAP11Constants;
+import org.apache.ws.commons.soap.SOAPBody;
+import org.apache.ws.commons.soap.SOAPConstants;
+import org.apache.ws.commons.soap.SOAPEnvelope;
+import org.apache.ws.commons.soap.SOAPFactory;
+import org.apache.ws.commons.soap.SOAPFault;
+import org.apache.ws.commons.soap.SOAPHeader;
+import org.apache.ws.commons.soap.SOAPHeaderBlock;
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+
+/**
+ * User: Eran Chinthaka (eran.chinthaka@gmail.com)
+ * Date: Feb 8, 2005
+ * Time: 11:06:09 AM
+ * All Rights Reserved.
+ */
+public class OMLinkedListImplFactoryTest extends AbstractTestCase {
+
+    private Log log = LogFactory.getLog(getClass());
+
+    public OMLinkedListImplFactoryTest(String testName) {
+        super(testName);
+    }
+
+    SOAPFactory omFactory;
+    OMNamespace namespace;
+    String nsUri = "http://www.apache.org/~chinthaka";
+    String nsPrefix = "myhome";
+
+    protected void setUp() throws Exception {
+        super.setUp();
+        omFactory = OMAbstractFactory.getSOAP11Factory();
+        namespace = omFactory.createOMNamespace(nsUri, nsPrefix);
+    }
+
+    public void testCreateOMElementWithNoBuilder() {
+        OMElement omElement = omFactory.createOMElement("chinthaka",
+                namespace);
+        assertTrue(
+                "Programatically created OMElement should have done = true ",
+                omElement.isComplete());
+
+    }
+
+    public void testCreateOMElement() {
+        try {
+            OMXMLParserWrapper omBuilder = OMTestUtils.getOMBuilder(
+                    getTestResourceFile("soap/whitespacedMessage.xml"));
+            OMElement documentElement = omBuilder.getDocumentElement();
+            OMElement child = omFactory.createOMElement("child",
+                    namespace,
+                    documentElement,
+                    omBuilder);
+            assertTrue(
+                    "OMElement with a builder should start with done = false ",
+                    !child.isComplete());
+            assertTrue("This OMElement must have a builder ",
+                    child.getBuilder() instanceof OMXMLParserWrapper);
+
+        } catch (Exception e) {
+            log.info(e.getMessage());
+        }
+    }
+
+    public void testCreateOMNamespace() {
+        assertTrue("OMNamespace uri not correct",
+                nsUri.equals(namespace.getName()));   // here equalsIgnoreCase should not be used as case does matter
+        assertTrue("OMNamespace prefix not correct",
+                nsPrefix.equals(namespace.getPrefix()));  // here equalsIgnoreCase should not be used as case does matter
+    }
+
+    public void testCreateText() {
+        OMElement omElement = omFactory.createOMElement("chinthaka",
+                namespace);
+        String text = "sampleText";
+        OMText omText = omFactory.createText(omElement, text);
+        assertTrue("Programatically created OMText should have done = true ",
+                omText.isComplete());
+        assertTrue(
+                "Programatically created OMText should have correct text value ",
+                text.equals(omText.getText()));
+
+    }
+
+    public void testCreateSOAPBody() {
+        try {
+            OMXMLParserWrapper omBuilder = OMTestUtils.getOMBuilder(
+                    getTestResourceFile("soap/minimalMessage.xml"));
+            SOAPEnvelope soapEnvelope = (SOAPEnvelope) omBuilder.getDocumentElement();
+            SOAPBody soapBodyOne = omFactory.createSOAPBody(soapEnvelope);
+            assertTrue(
+                    "Programatically created SOAPBody should have done = true ",
+                    soapBodyOne.isComplete());
+            soapBodyOne.detach();
+            SOAPBody soapBodyTwo = omFactory.createSOAPBody(soapEnvelope,
+                    omBuilder);
+            assertTrue(
+                    "SOAPBody with a builder should start with done = false ",
+                    !soapBodyTwo.isComplete());
+            assertTrue("This SOAPBody must have a builder ",
+                    soapBodyTwo.getBuilder() instanceof OMXMLParserWrapper);
+
+
+        } catch (Exception e) {
+            log.info(e.getMessage());
+        }
+    }
+
+    public void testCreateSOAPEnvelope() {
+        try {
+            omFactory.createOMNamespace(
+                    SOAP11Constants.SOAP_ENVELOPE_NAMESPACE_URI,
+                    SOAPConstants.SOAP_DEFAULT_NAMESPACE_PREFIX);
+            SOAPEnvelope soapEnvelopeTwo = omFactory.createSOAPEnvelope();
+            assertTrue(
+                    "Programatically created SOAPEnvelope should have done = true ",
+                    soapEnvelopeTwo.isComplete());
+            SOAPEnvelope soapEnvelope = omFactory.createSOAPEnvelope(
+                    OMTestUtils.getOMBuilder(
+                            getTestResourceFile("soap/minimalMessage.xml")));
+            assertTrue(
+                    "SOAPEnvelope with a builder should start with done = false ",
+                    !soapEnvelope.isComplete());
+            assertTrue("This SOAPEnvelope must have a builder ",
+                    soapEnvelope.getBuilder() instanceof OMXMLParserWrapper);
+
+
+        } catch (Exception e) {
+            log.info(e.getMessage());
+        }
+    }
+
+    public void testCreateSOAPHeader() {
+        try {
+            OMXMLParserWrapper omBuilder = OMTestUtils.getOMBuilder(
+                    getTestResourceFile("soap/minimalMessage.xml"));
+            SOAPEnvelope soapEnvelope = (SOAPEnvelope) omBuilder.getDocumentElement();
+            SOAPHeader soapHeader = omFactory.createSOAPHeader(soapEnvelope);
+            assertTrue(
+                    "Programatically created SOAPHeader should have done = true ",
+                    soapHeader.isComplete());
+            soapHeader.detach();
+            SOAPHeader soapHeaderTwo = omFactory.createSOAPHeader(soapEnvelope,
+                    omBuilder);
+            assertTrue(
+                    "SOAPHeader with a builder should start with done = false ",
+                    !soapHeaderTwo.isComplete());
+            assertTrue("This SOAPHeader must have a builder ",
+                    soapHeaderTwo.getBuilder() instanceof OMXMLParserWrapper);
+
+
+        } catch (Exception e) {
+            log.info(e.getMessage());
+        }
+    }
+
+    public void testCreateSOAPHeaderBlock() {
+        try {
+            OMXMLParserWrapper omBuilder = OMTestUtils.getOMBuilder(
+                    getTestResourceFile("soap/soapmessage.xml"));
+            SOAPEnvelope soapEnvelope = (SOAPEnvelope) omBuilder.getDocumentElement();
+            SOAPHeader soapHeader = soapEnvelope.getHeader();
+            SOAPHeaderBlock soapHeaderBlock = omFactory.createSOAPHeaderBlock(
+                    "soapHeaderBlockOne", namespace, soapHeader);
+            assertTrue(
+                    "Programatically created SOAPHeaderBlock should have done = true ",
+                    soapHeaderBlock.isComplete());
+            SOAPHeaderBlock soapHeaderBlockTwo = omFactory.createSOAPHeaderBlock(
+                    "soapHeaderBlockOne", namespace, soapHeader, omBuilder);
+            assertTrue(
+                    "SOAPHeaderBlock with a builder should start with done = false ",
+                    !soapHeaderBlockTwo.isComplete());
+            assertTrue("This SOAPHeaderBlock must have a builder ",
+                    soapHeaderBlockTwo.getBuilder() instanceof OMXMLParserWrapper);
+
+
+        } catch (Exception e) {
+            log.info(e.getMessage());
+        }
+    }
+
+    public void testCreateSOAPFault() {
+        try {
+            OMXMLParserWrapper omBuilder = OMTestUtils.getOMBuilder(
+                    getTestResourceFile("soap/soapmessage.xml"));
+            SOAPEnvelope soapEnvelope = (SOAPEnvelope) omBuilder.getDocumentElement();
+            SOAPBody soapBody = soapEnvelope.getBody();
+            SOAPFault soapFault = omFactory.createSOAPFault(soapBody,
+                    new Exception(" this is just a test "));
+            assertTrue(
+                    "Programatically created SOAPFault should have done = true ",
+                    soapFault.isComplete());
+            soapFault.detach();
+            SOAPFault soapFaultTwo = omFactory.createSOAPFault(soapBody,
+                    omBuilder);
+            assertTrue(
+                    "SOAPFault with a builder should start with done = false ",
+                    !soapFaultTwo.isComplete());
+            assertTrue("This SOAPFault must have a builder ",
+                    soapFaultTwo.getBuilder() instanceof OMXMLParserWrapper);
+
+
+        } catch (Exception e) {
+            log.info(e.getMessage());
+        }
+    }
+
+
+}
diff --git a/test/org/apache/ws/commons/om/impl/OMBlankElementTest.java b/test/org/apache/ws/commons/om/impl/OMBlankElementTest.java
new file mode 100644
index 0000000..c14e4a8
--- /dev/null
+++ b/test/org/apache/ws/commons/om/impl/OMBlankElementTest.java
@@ -0,0 +1,64 @@
+package org.apache.ws.commons.om.impl;
+
+import junit.framework.TestCase;
+import org.apache.ws.commons.om.OMAbstractFactory;
+import org.apache.ws.commons.om.OMElement;
+import org.apache.ws.commons.om.OMException;
+import org.apache.ws.commons.om.OMFactory;
+import org.apache.ws.commons.om.OMNamespace;
+
+import javax.xml.stream.XMLStreamException;
+import java.io.StringWriter;
+
+public class OMBlankElementTest extends TestCase {
+
+    public OMBlankElementTest(String name) {
+        super(name);
+    }
+
+    public void testBlankOMElem() throws XMLStreamException {
+        try {
+            //We should not get anything as the return value here: the output of the serialization
+            String value = buildBlankOMElem();
+            assertNull(
+                "There's a serialized output for a blank XML element that cannot exist",
+                value);
+        } catch (OMException e) {
+        }
+    }
+
+    String buildBlankOMElem() throws XMLStreamException {
+        OMFactory factory = OMAbstractFactory.getOMFactory();
+        OMNamespace namespace1 = factory.createOMNamespace("", "");
+        OMElement elem1 = factory.createOMElement("", namespace1);
+
+        StringWriter writer = new StringWriter();
+        elem1.build();
+        elem1.serialize(writer);
+        writer.flush();
+        return writer.toString();
+    }
+
+    public void testOMElemWithWhiteSpace() throws XMLStreamException {
+        try {
+            //We should not get anything as the return value here: the output of the serialization
+            String value = buildWithWhiteSpaceOMElem();
+            assertNull(
+                "There's a serialized output for a blank XML element that cannot exist",
+                value);
+        } catch (OMException e) {
+        }
+    }
+
+    String buildWithWhiteSpaceOMElem() throws XMLStreamException {
+        OMFactory factory = OMAbstractFactory.getOMFactory();
+        OMNamespace namespace1 = factory.createOMNamespace("  ", "");
+        OMElement elem1 = factory.createOMElement("  ", namespace1);
+
+        StringWriter writer = new StringWriter();
+        elem1.build();
+        elem1.serialize(writer);
+        writer.flush();
+        return writer.toString();
+    }
+}
diff --git a/test/org/apache/ws/commons/om/impl/builder/StAXOMBuilderTest.java b/test/org/apache/ws/commons/om/impl/builder/StAXOMBuilderTest.java
new file mode 100644
index 0000000..cfa76ab
--- /dev/null
+++ b/test/org/apache/ws/commons/om/impl/builder/StAXOMBuilderTest.java
@@ -0,0 +1,71 @@
+/*
+ * Copyright 2004,2005 The Apache Software Foundation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      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.
+ */
+
+package org.apache.ws.commons.om.impl.builder;
+
+import org.apache.ws.commons.om.AbstractTestCase;
+import org.apache.ws.commons.om.OMAbstractFactory;
+import org.apache.ws.commons.om.OMElement;
+import org.apache.ws.commons.om.OMNode;
+import org.apache.ws.commons.om.OMText;
+import org.apache.ws.commons.om.impl.llom.builder.StAXOMBuilder;
+import org.apache.ws.commons.om.impl.llom.factory.OMXMLBuilderFactory;
+
+import javax.xml.stream.XMLInputFactory;
+import java.io.FileReader;
+import java.util.Iterator;
+
+public class StAXOMBuilderTest extends AbstractTestCase {
+    StAXOMBuilder stAXOMBuilder;
+    FileReader testFile;
+    private OMElement rootElement;
+
+    /**
+     * Constructor.
+     */
+    public StAXOMBuilderTest(String testName) {
+        super(testName);
+    }
+
+    protected void setUp() throws Exception {
+        testFile = new FileReader(getTestResourceFile("non_soap.xml"));
+        stAXOMBuilder =
+                OMXMLBuilderFactory.createStAXOMBuilder(
+                        OMAbstractFactory.getSOAP11Factory(),
+                        XMLInputFactory.newInstance().createXMLStreamReader(
+                                testFile));
+    }
+
+    public void testGetRootElement() throws Exception {
+        rootElement = stAXOMBuilder.getDocumentElement();
+        assertTrue("Root element can not be null", rootElement != null);
+        assertTrue(" Name of the root element is wrong",
+                rootElement.getLocalName().equalsIgnoreCase("Root"));
+        // get the first OMElement child
+        OMNode omnode = rootElement.getFirstOMChild();
+        while (omnode instanceof OMText) {
+            omnode = omnode.getNextOMSibling();
+        }
+        Iterator children = ((OMElement) omnode).getChildren();
+        int childrenCount = 0;
+        while (children.hasNext()) {
+            OMNode node = (OMNode) children.next();
+            if (node instanceof OMElement)
+                childrenCount++;
+        }
+        assertTrue(childrenCount == 5);
+    }
+}
\ No newline at end of file
diff --git a/test/org/apache/ws/commons/om/impl/llom/OMDocumentSerilizationTest.java b/test/org/apache/ws/commons/om/impl/llom/OMDocumentSerilizationTest.java
new file mode 100644
index 0000000..94d858f
--- /dev/null
+++ b/test/org/apache/ws/commons/om/impl/llom/OMDocumentSerilizationTest.java
@@ -0,0 +1,131 @@
+/*
+ * Copyright 2004,2005 The Apache Software Foundation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      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.
+ */
+
+package org.apache.ws.commons.om.impl.llom;
+
+import junit.framework.TestCase;
+import org.apache.ws.commons.om.OMAbstractFactory;
+import org.apache.ws.commons.om.OMDocument;
+import org.apache.ws.commons.om.OMElement;
+import org.apache.ws.commons.om.OMFactory;
+import org.apache.ws.commons.om.OMNamespace;
+import org.apache.ws.commons.om.OMOutputFormat;
+
+import javax.xml.stream.XMLStreamException;
+import java.io.ByteArrayOutputStream;
+import java.io.UnsupportedEncodingException;
+
+/**
+ * This tests the serializeAndConsume method
+ */
+public class OMDocumentSerilizationTest extends TestCase {
+
+    private OMDocument document;
+    private String xmlDeclStart = "<?xml";
+    private String encoding = "encoding='UTF-8'";
+    private String encoding_UTF16 = "encoding='UTF-16'";
+    private String encoding2 = "encoding=\"UTF-8\"";
+    private String encoding2_UTF16 = "encoding=\"UTF-16\"";
+    private String version = "version='1.0'";
+    private String version_11 = "version='1.1'";
+    private String version2 = "version=\"1.0\"";
+    private String version2_11 = "version=\"1.1\"";
+
+    public void setUp() {
+        OMFactory factory = OMAbstractFactory.getOMFactory();
+
+        OMNamespace namespace = factory.createOMNamespace("http://testuri.org","test");
+        OMElement documentElement = factory.createOMElement("DocumentElement",namespace);
+
+        OMElement child1 = factory.createOMElement("Child1",namespace);
+        child1.setText("TestText");
+        documentElement.addChild(child1);
+
+        document = factory.createOMDocument();
+        document.setOMDocumentElement(documentElement);
+
+    }
+
+    public OMDocumentSerilizationTest(String name) {
+        super(name);
+    }
+
+
+    public void testXMLDecleration() throws XMLStreamException {
+        ByteArrayOutputStream baos = new ByteArrayOutputStream();
+        document.serializeAndConsume(baos);
+
+        String xmlDocument = new String(baos.toByteArray());
+
+        assertTrue("XML Declaration missing",-1<xmlDocument.indexOf(xmlDeclStart));
+    }
+
+    public void testExcludeXMLDeclaration() throws XMLStreamException {
+        ByteArrayOutputStream baos = new ByteArrayOutputStream();
+        OMOutputFormat format = new OMOutputFormat();
+        format.setIgnoreXMLDeclaration(true);
+        document.serializeAndConsume(baos, format);
+
+        String xmlDocument = new String(baos.toByteArray());
+
+        assertTrue(
+                "XML Declaration is included when serilizing without the declaration",
+                -1 == xmlDocument.indexOf(xmlDeclStart));
+    }
+
+    public void testCharsetEncoding() throws XMLStreamException {
+        ByteArrayOutputStream baos = new ByteArrayOutputStream();
+        document.serializeAndConsume(baos);
+
+        String xmlDocument = new String(baos.toByteArray());
+
+        assertTrue("Charset declaration missing",-1 < xmlDocument.indexOf(encoding) ||
+                                                 -1 < xmlDocument.indexOf(encoding.toLowerCase()) ||
+                                                 -1 < xmlDocument.indexOf(encoding2.toLowerCase()) ||
+                                                 -1 < xmlDocument.indexOf(encoding2));
+    }
+
+    public void testCharsetEncodingUTF_16() throws XMLStreamException, UnsupportedEncodingException {
+        ByteArrayOutputStream baos = new ByteArrayOutputStream();
+        OMOutputFormat format = new OMOutputFormat();
+        format.setCharSetEncoding("UTF-16");
+        document.serializeAndConsume(baos, format);
+
+        String xmlDocument = new String(baos.toByteArray(),"UTF-16");
+        assertTrue("Charset declaration missing",-1<xmlDocument.indexOf(encoding_UTF16) ||
+                                                 -1<xmlDocument.indexOf(encoding2_UTF16));
+    }
+
+
+    public void testXMLVersion() throws XMLStreamException {
+        ByteArrayOutputStream baos = new ByteArrayOutputStream();
+        document.serializeAndConsume(baos);
+
+        String xmlDocument = new String(baos.toByteArray());
+        assertTrue("Charset declaration missing",-1<xmlDocument.indexOf(version) ||
+                                                 -1<xmlDocument.indexOf(version2));
+    }
+
+    public void testXMLVersion_11() throws XMLStreamException {
+        ByteArrayOutputStream baos = new ByteArrayOutputStream();
+        document.setXMLVersion("1.1");
+        document.serializeAndConsume(baos);
+
+        String xmlDocument = new String(baos.toByteArray());
+        assertTrue("Charset declaration missing",-1<xmlDocument.indexOf(version_11) ||
+                                                 -1<xmlDocument.indexOf(version2_11));
+    }
+}
diff --git a/test/org/apache/ws/commons/om/impl/llom/OMOutputTest.java b/test/org/apache/ws/commons/om/impl/llom/OMOutputTest.java
new file mode 100644
index 0000000..df0894c
--- /dev/null
+++ b/test/org/apache/ws/commons/om/impl/llom/OMOutputTest.java
@@ -0,0 +1,109 @@
+/*
+ * Copyright 2004,2005 The Apache Software Foundation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      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.
+ */
+
+package org.apache.ws.commons.om.impl.llom;
+
+import org.apache.ws.commons.attachments.ByteArrayDataSource;
+import org.apache.ws.commons.om.AbstractTestCase;
+import org.apache.ws.commons.om.OMAttribute;
+import org.apache.ws.commons.om.OMElement;
+import org.apache.ws.commons.om.OMOutputFormat;
+
+import javax.activation.DataHandler;
+import java.io.File;
+import java.io.FileOutputStream;
+
+public class OMOutputTest extends AbstractTestCase {
+
+    /**
+     * @param testName
+     */
+    public OMOutputTest(String testName) {
+        super(testName);
+    }
+
+    String outFileName;
+
+    String outBase64FileName;
+
+    OMElement envelope;
+
+    File outMTOMFile;
+
+    File outBase64File;
+
+    /*
+     * @see TestCase#setUp()
+     */
+    protected void setUp() throws Exception {
+        super.setUp();
+        DataHandler dataHandler;
+
+        outFileName = "OMSerializeMTOMOut.txt";
+        outBase64FileName = "OMSerializeBase64Out.xml";
+        outMTOMFile = getTempOutputFile(outFileName);
+        outBase64File = getTempOutputFile(outBase64FileName);
+
+        OMNamespaceImpl soap = new OMNamespaceImpl(
+                "http://schemas.xmlsoap.org/soap/envelope/", "soap");
+        envelope = new OMElementImpl("Envelope", soap);
+        OMElement body = new OMElementImpl("Body", soap);
+
+        OMNamespaceImpl dataName = new OMNamespaceImpl(
+                "http://www.example.org/stuff", "m");
+        OMElement data = new OMElementImpl("data", dataName);
+
+        OMNamespaceImpl mime = new OMNamespaceImpl(
+                "http://www.w3.org/2003/06/xmlmime", "m");
+
+        OMElement text = new OMElementImpl("name", dataName);
+        OMAttribute cType1 = new OMAttributeImpl("contentType", mime,
+                "text/plain");
+        text.addAttribute(cType1);
+        byte[] byteArray = new byte[]{13, 56, 65, 32, 12, 12, 7, -3, -2, -1,
+                                      98};
+        dataHandler = new DataHandler(new ByteArrayDataSource(byteArray));
+        OMTextImpl textData = new OMTextImpl(dataHandler, false);
+
+        envelope.addChild(body);
+        body.addChild(data);
+        data.addChild(text);
+        text.addChild(textData);
+    }
+
+    /*
+     * @see TestCase#tearDown()
+     */
+    protected void tearDown() throws Exception {
+        super.tearDown();
+        if (this.outMTOMFile.exists()) {
+            this.outMTOMFile.delete();
+        }
+        if (this.outBase64File.exists()) {
+            this.outBase64File.delete();
+        }
+    }
+
+    public void testComplete() throws Exception {
+        OMOutputFormat mtomOutputFormat = new OMOutputFormat();
+        mtomOutputFormat.setDoOptimize(true);
+        OMOutputFormat baseOutputFormat = new OMOutputFormat();
+        baseOutputFormat.setDoOptimize(false);
+        
+        envelope.serializeAndConsume(new FileOutputStream(outBase64File), baseOutputFormat);
+        envelope.serializeAndConsume(new FileOutputStream(outMTOMFile), mtomOutputFormat);
+    }
+}
\ No newline at end of file
diff --git a/test/org/apache/ws/commons/om/impl/llom/mtom/MTOMStAXSOAPModelBuilderTest.java b/test/org/apache/ws/commons/om/impl/llom/mtom/MTOMStAXSOAPModelBuilderTest.java
new file mode 100644
index 0000000..3fe795f
--- /dev/null
+++ b/test/org/apache/ws/commons/om/impl/llom/mtom/MTOMStAXSOAPModelBuilderTest.java
@@ -0,0 +1,98 @@
+/*
+ * Copyright 2004,2005 The Apache Software Foundation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      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.
+ */
+
+package org.apache.ws.commons.om.impl.llom.mtom;
+
+import org.apache.ws.commons.attachments.MIMEHelper;
+import org.apache.ws.commons.om.AbstractTestCase;
+import org.apache.ws.commons.om.OMElement;
+import org.apache.ws.commons.om.OMText;
+import org.apache.ws.commons.om.OMXMLParserWrapper;
+import org.apache.ws.commons.soap.SOAP12Constants;
+
+import javax.activation.DataHandler;
+import javax.xml.stream.XMLInputFactory;
+import javax.xml.stream.XMLStreamReader;
+import java.io.BufferedReader;
+import java.io.FileInputStream;
+import java.io.InputStream;
+import java.io.InputStreamReader;
+import java.util.Iterator;
+
+public class MTOMStAXSOAPModelBuilderTest extends AbstractTestCase {
+    MIMEHelper mimeHelper;
+
+    String inFileName;
+
+    OMXMLParserWrapper builder;
+
+    /**
+     * @param testName
+     */
+    public MTOMStAXSOAPModelBuilderTest(String testName) {
+        super(testName);
+    }
+
+    String contentTypeString = "multipart/Related; type=\"application/xop+xml\"; boundary=\"----=_AxIs2_Def_boundary_=42214532\"; start=\"SOAPPart\"";
+
+    protected void setUp() throws Exception {
+        super.setUp();
+        inFileName = "mtom/MTOMBuilderTestIn.txt";
+        InputStream inStream = new FileInputStream(getTestResourceFile(inFileName));
+        mimeHelper = new MIMEHelper(inStream, contentTypeString);
+        XMLStreamReader reader = XMLInputFactory.newInstance()
+                .createXMLStreamReader(new BufferedReader(new InputStreamReader(mimeHelper
+                .getSOAPPartInputStream())));
+        builder = new MTOMStAXSOAPModelBuilder(reader, mimeHelper, SOAP12Constants.SOAP_ENVELOPE_NAMESPACE_URI);
+    }
+
+    public void testCreateOMElement() throws Exception {
+        OMElement root = builder.getDocumentElement();
+//        System.out.println(root.getLocalName() + " : "
+//                + root.getNamespace().getName());
+        OMElement body = (OMElement) root.getFirstOMChild();
+//        System.out.println(body.getLocalName() + " : "
+//                + body.getNamespace().getName());
+
+        OMElement data = (OMElement) body.getFirstOMChild();
+//        System.out.println(data.getLocalName() + " : "
+//                + data.getNamespace().getName());
+        Iterator childIt = data.getChildren();
+        //while (childIt.hasNext()) {
+        OMElement child = (OMElement) childIt.next();
+        OMText blob = (OMText) child.getFirstOMChild();
+        /*
+         * Following is the procedure the user has to follow to read objects in
+         * OBBlob User has to know the object type & whether it is serializable.
+         * If it is not he has to use a Custom Defined DataSource to get the
+         * Object.
+         */
+        byte[] expectedObject = new byte[]{13, 56, 65, 32, 12, 12, 7, -3, -2,
+                                           -1, 98};
+        DataHandler actualDH;
+        actualDH = (DataHandler)blob.getDataHandler();
+        //ByteArrayInputStream object = (ByteArrayInputStream) actualDH
+        //.getContent();
+        //byte[] actualObject= null;
+        //  object.read(actualObject,0,10);
+
+        //  assertEquals("Object check", expectedObject[5],actualObject[5] );
+    }
+
+    public void testGetDataHandler() {
+    }
+
+}
\ No newline at end of file
diff --git a/test/org/apache/ws/commons/om/impl/serializer/ElementSerializerTest.java b/test/org/apache/ws/commons/om/impl/serializer/ElementSerializerTest.java
new file mode 100644
index 0000000..95fd306
--- /dev/null
+++ b/test/org/apache/ws/commons/om/impl/serializer/ElementSerializerTest.java
@@ -0,0 +1,132 @@
+/*
+ * Copyright 2004,2005 The Apache Software Foundation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      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.
+ */
+
+package org.apache.ws.commons.om.impl.serializer;
+
+import org.apache.ws.commons.om.AbstractTestCase;
+import org.apache.ws.commons.om.OMAbstractFactory;
+import org.apache.ws.commons.om.OMElement;
+import org.apache.ws.commons.om.OMFactory;
+import org.apache.ws.commons.om.OMNamespace;
+import org.apache.ws.commons.om.OMNode;
+import org.apache.ws.commons.om.OMText;
+import org.apache.ws.commons.om.OMXMLParserWrapper;
+import org.apache.ws.commons.om.impl.llom.factory.OMXMLBuilderFactory;
+import org.apache.ws.commons.soap.SOAPBody;
+import org.apache.ws.commons.soap.SOAPEnvelope;
+
+import javax.xml.stream.XMLInputFactory;
+import javax.xml.stream.XMLOutputFactory;
+import javax.xml.stream.XMLStreamReader;
+import javax.xml.stream.XMLStreamWriter;
+import java.io.File;
+import java.io.FileOutputStream;
+import java.io.FileReader;
+
+public class ElementSerializerTest extends AbstractTestCase {
+    private XMLStreamReader reader;
+    private XMLStreamWriter writer;
+    private OMXMLParserWrapper builder;
+    private File tempFile;
+
+    public ElementSerializerTest(String testName) {
+        super(testName);
+    }
+
+    protected void setUp() throws Exception {
+        reader =
+                XMLInputFactory.newInstance().
+                createXMLStreamReader(
+                        new FileReader(
+                                getTestResourceFile("soap/soapmessage.xml")));
+        tempFile = File.createTempFile("temp", "xml");
+        writer = XMLOutputFactory.newInstance().
+                createXMLStreamWriter(new FileOutputStream(tempFile));
+        builder =
+                OMXMLBuilderFactory.createStAXSOAPModelBuilder(
+                        OMAbstractFactory.getSOAP11Factory(), reader);
+    }
+
+    public void testElementSerilization() throws Exception {
+        OMElement elt = builder.getDocumentElement();
+        elt.serialize(writer);
+
+    }
+
+    public void testElementSerilizationCacheOff() throws Exception {
+        OMElement elt = builder.getDocumentElement();
+        elt.serialize(writer);
+
+    }
+
+    public void testElementSerilizationChild() throws Exception {
+        OMElement elt = builder.getDocumentElement();
+        OMNode node = elt.getFirstOMChild().getNextOMSibling();
+        node.serialize(writer);
+
+    }
+
+    public void testElementSerilizationSOAPBodyCacheOff() throws Exception {
+        SOAPEnvelope env = (SOAPEnvelope) builder.getDocumentElement();
+        OMNode node = env.getBody();
+        node.serialize(writer);
+    }
+
+    public void testElement() throws Exception {
+        SOAPEnvelope env = (SOAPEnvelope) builder.getDocumentElement();
+        SOAPBody body = env.getBody();
+        body.serialize(writer);
+    }
+
+    public void testCompleteElement() throws Exception {
+        SOAPEnvelope env = (SOAPEnvelope) builder.getDocumentElement();
+        env.serialize(writer);
+    }
+
+    public void testDualNamespaces1() throws Exception {
+        OMFactory factory = OMAbstractFactory.getOMFactory();
+        OMNamespace ns1 = factory.createOMNamespace("bar", "x");
+        OMNamespace ns2 = factory.createOMNamespace("bar", "y");
+        OMElement root = factory.createOMElement("root", ns1);
+        OMElement elt11 = factory.createOMElement("foo1", ns1);
+        OMElement elt12 = factory.createOMElement("foo2", ns1);
+        OMElement elt21 = factory.createOMElement("yuck", ns2);
+        OMElement elt22 = factory.createOMElement("yuck", ns2);
+        elt11.addChild(elt21);
+        elt12.addChild(elt22);
+        root.addChild(elt11);
+        root.addChild(elt12);
+        root.serialize(writer);
+    }
+
+    public void testDualNamespaces2() throws Exception {
+        OMFactory factory = OMAbstractFactory.getOMFactory();
+        OMNamespace ns1 = factory.createOMNamespace("bar", "x");
+        OMElement root = factory.createOMElement("root", ns1);
+        OMNamespace ns2 = root.declareNamespace("bar", "y");
+        OMElement elt1 = factory.createOMElement("foo", ns1);
+        OMElement elt2 = factory.createOMElement("yuck", ns2);
+        OMText txt1 = factory.createText(elt2, "blah");
+        elt2.addChild(txt1);
+        elt1.addChild(elt2);
+        root.addChild(elt1);
+        root.serialize(writer);
+    }
+
+    protected void tearDown() throws Exception {
+        tempFile.delete();
+    }
+}
diff --git a/test/org/apache/ws/commons/om/impl/serializer/NoNamespaceSerializerTest.java b/test/org/apache/ws/commons/om/impl/serializer/NoNamespaceSerializerTest.java
new file mode 100644
index 0000000..aa67091
--- /dev/null
+++ b/test/org/apache/ws/commons/om/impl/serializer/NoNamespaceSerializerTest.java
@@ -0,0 +1,150 @@
+/*
+ * Copyright 2004,2005 The Apache Software Foundation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      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.
+ */
+
+package org.apache.ws.commons.om.impl.serializer;
+
+import junit.framework.TestCase;
+import org.apache.ws.commons.om.OMAbstractFactory;
+import org.apache.ws.commons.om.OMElement;
+import org.apache.ws.commons.om.OMXMLParserWrapper;
+import org.apache.ws.commons.om.impl.llom.factory.OMXMLBuilderFactory;
+import org.apache.ws.commons.soap.SOAPEnvelope;
+import org.apache.ws.commons.soap.SOAPFactory;
+
+import javax.xml.stream.XMLInputFactory;
+import javax.xml.stream.XMLOutputFactory;
+import javax.xml.stream.XMLStreamReader;
+import javax.xml.stream.XMLStreamWriter;
+import java.io.ByteArrayInputStream;
+import java.io.InputStreamReader;
+
+public class NoNamespaceSerializerTest extends TestCase {
+
+    private String xmlTextOne = "<soapenv:Envelope xmlns:soapenv=\"http://schemas.xmlsoap.org/soap/envelope/\">" +
+            "<soapenv:Body>\n" +
+            "   <ns1:getBalance xmlns:ns1=\"http://localhost:8081/axis/services/BankPort/\">\n" +
+            "      <accountNo href=\"#id0\"/>\n" +
+            "   </ns1:getBalance>\n" +
+            " </soapenv:Body></soapenv:Envelope>";
+
+    private String xmlText2 = "<purchase-order xmlns=\"http://openuri.org/easypo\">\n" +
+            "  <customer>\n" +
+            "    <name>Gladys Kravitz</name>\n" +
+            "    <address>Anytown, PA</address>\n" +
+            "  </customer>\n" +
+            "  <date>2005-03-06T14:06:12.697+06:00</date>\n" +
+            "</purchase-order>";
+
+    private String xmlTextTwo = "<soapenv:Envelope xmlns:soapenv=\"http://schemas.xmlsoap.org/soap/envelope/\">" +
+            "<soapenv:Body>\n" +
+            "   <getBalance xmlns=\"http://localhost:8081/axis/services/BankPort/\">\n" +
+            "      <accountNo href=\"#id0\"/>\n" +
+            "   </getBalance>\n" +
+            " </soapenv:Body></soapenv:Envelope>";
+
+    private XMLStreamReader readerOne;
+    private XMLStreamReader readerTwo;
+    private XMLStreamWriter writer;
+
+    // private OMXMLParserWrapper builder;
+    // private File tempFile;
+
+    private OMXMLParserWrapper builderOne;
+    private OMXMLParserWrapper builderTwo;
+    // private File tempFile;
+
+
+
+    protected void setUp() throws Exception {
+        readerOne =
+                XMLInputFactory.newInstance().
+                createXMLStreamReader(
+                        new InputStreamReader(
+                                new ByteArrayInputStream(xmlTextOne.getBytes())));
+        readerTwo =
+                XMLInputFactory.newInstance().
+                createXMLStreamReader(
+                        new InputStreamReader(
+                                new ByteArrayInputStream(xmlTextTwo.getBytes())));
+        writer = XMLOutputFactory.newInstance().
+                createXMLStreamWriter(System.out);
+        builderOne =
+                OMXMLBuilderFactory.createStAXSOAPModelBuilder(
+                        OMAbstractFactory.getSOAP11Factory(), readerOne);
+        builderTwo =
+                OMXMLBuilderFactory.createStAXSOAPModelBuilder(
+                        OMAbstractFactory.getSOAP11Factory(), readerTwo);
+    }
+
+
+//    public void testSerilizationWithCacheOff() throws Exception {
+//        SOAPEnvelope env = (SOAPEnvelope) builderOne.getDocumentElement();
+//        env.serializeAndConsume(writer, false);
+//        writer.flush();
+//
+//
+//    }
+//
+//    public void testSerilizationWithCacheOn() throws Exception {
+//        SOAPEnvelope env = (SOAPEnvelope) builderOne.getDocumentElement();
+//        env.serializeAndConsume(writer, true);
+//        writer.flush();
+//    }
+
+
+    public void testSerilizationWithDefaultNamespaces() throws Exception {
+        SOAPEnvelope env = (SOAPEnvelope) builderTwo.getDocumentElement();
+        env.serialize(writer);
+        OMElement balanceElement = env.getBody().getFirstElement();
+        assertEquals("Deafualt namespace has not been set properly",
+                balanceElement.getNamespace().getName(),
+                "http://localhost:8081/axis/services/BankPort/");
+
+        OMElement accountNo = balanceElement.getFirstElement();
+        assertEquals(
+                "Deafualt namespace of children has not been set properly",
+                accountNo.getNamespace().getName(),
+                "http://localhost:8081/axis/services/BankPort/");
+
+    }
+
+    public void submitPurchaseOrderTest()
+            throws Exception {
+        SOAPFactory omFactory = OMAbstractFactory.getSOAP11Factory();
+        SOAPEnvelope env = omFactory.getDefaultEnvelope();
+        OMXMLParserWrapper builder = OMXMLBuilderFactory.createStAXOMBuilder(
+                omFactory,
+                XMLInputFactory.newInstance().
+                createXMLStreamReader(
+                        new InputStreamReader(
+                                new ByteArrayInputStream(xmlText2.getBytes()))));
+        env.getBody().addChild(builder.getDocumentElement());
+
+        env.serialize(System.out);
+    }
+
+    public void testSerilizationWithCacheOn() throws Exception {
+        SOAPEnvelope env = (SOAPEnvelope) builderOne.getDocumentElement();
+        env.serialize(writer);
+        writer.flush();
+    }
+
+    public void testSerilizationWithCacheOff() throws Exception {
+        SOAPEnvelope env = (SOAPEnvelope) builderOne.getDocumentElement();
+        env.serialize(writer);
+        writer.flush();
+    }
+}
diff --git a/test/org/apache/ws/commons/om/impl/serializer/OMSerializerTest.java b/test/org/apache/ws/commons/om/impl/serializer/OMSerializerTest.java
new file mode 100644
index 0000000..b2d95ba
--- /dev/null
+++ b/test/org/apache/ws/commons/om/impl/serializer/OMSerializerTest.java
@@ -0,0 +1,114 @@
+/*
+ * Copyright 2004,2005 The Apache Software Foundation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      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.
+ */
+
+package org.apache.ws.commons.om.impl.serializer;
+
+import org.apache.ws.commons.om.AbstractTestCase;
+import org.apache.ws.commons.om.OMAbstractFactory;
+import org.apache.ws.commons.om.OMXMLParserWrapper;
+import org.apache.ws.commons.om.impl.llom.factory.OMXMLBuilderFactory;
+import org.apache.ws.commons.om.impl.llom.serialize.StreamingOMSerializer;
+import org.apache.ws.commons.soap.SOAPBody;
+import org.apache.ws.commons.soap.SOAPEnvelope;
+
+import javax.xml.stream.XMLInputFactory;
+import javax.xml.stream.XMLOutputFactory;
+import javax.xml.stream.XMLStreamException;
+import javax.xml.stream.XMLStreamReader;
+import javax.xml.stream.XMLStreamWriter;
+import java.io.File;
+import java.io.FileReader;
+
+public class OMSerializerTest extends AbstractTestCase {
+    private XMLStreamReader reader;
+    private XMLStreamWriter writer;
+    private File tempFile;
+
+    public OMSerializerTest(String testName) {
+        super(testName);
+    }
+
+    protected void setUp() throws Exception {
+        reader =
+                XMLInputFactory.newInstance().
+                        createXMLStreamReader(
+                                new FileReader(
+                                        getTestResourceFile("soap/soapmessage.xml")));
+        tempFile = File.createTempFile("temp", "xml");
+//        writer =
+//                XMLOutputFactory.newInstance().
+//                        createXMLStreamWriter(new FileOutputStream(tempFile));
+        writer =
+                XMLOutputFactory.newInstance().
+                        createXMLStreamWriter(System.out);
+    }
+
+    public void testRawSerializer() throws Exception {
+        StreamingOMSerializer serializer = new StreamingOMSerializer();
+        //serializer.setNamespacePrefixStack(new Stack());
+        serializer.serialize(reader, writer);
+        writer.flush();
+
+
+    }
+
+    public void testElementPullStream1() throws Exception {
+        OMXMLParserWrapper builder = OMXMLBuilderFactory.createStAXSOAPModelBuilder(
+                OMAbstractFactory.getSOAP11Factory(),
+                reader);
+        SOAPEnvelope env = (SOAPEnvelope) builder.getDocumentElement();
+        StreamingOMSerializer serializer = new StreamingOMSerializer();
+        serializer.serialize(env.getXMLStreamReaderWithoutCaching(), writer);
+        writer.flush();
+    }
+
+    public void testElementPullStream1WithCacheOff() throws Exception {
+        OMXMLParserWrapper builder = OMXMLBuilderFactory.createStAXSOAPModelBuilder(
+                OMAbstractFactory.getSOAP11Factory(),
+                reader);
+
+        SOAPEnvelope env = (SOAPEnvelope) builder.getDocumentElement();
+        env.serializeAndConsume(writer);
+        writer.flush();
+
+        //now we should not be able to serilaize anything ! this should throw
+        //an error
+        try {
+           env.serializeAndConsume(writer);
+           fail();
+        } catch (XMLStreamException e) {
+           assertTrue(true);
+        } catch (Exception e) {
+           assertTrue(true);
+        }
+    }
+
+    public void testElementPullStream2() throws Exception {
+        OMXMLParserWrapper builder = OMXMLBuilderFactory.createStAXSOAPModelBuilder(
+                OMAbstractFactory.getSOAP11Factory(),
+                reader);
+        SOAPEnvelope env = (SOAPEnvelope) builder.getDocumentElement();
+        SOAPBody body = env.getBody();
+        StreamingOMSerializer serializer = new StreamingOMSerializer();
+        serializer.serialize(body.getXMLStreamReaderWithoutCaching(),
+                writer);
+        writer.flush();
+    }
+
+    protected void tearDown() throws Exception {
+        tempFile.delete();
+    }
+}
diff --git a/test/org/apache/ws/commons/om/impl/serializer/PreserveEnvelopeTest.java b/test/org/apache/ws/commons/om/impl/serializer/PreserveEnvelopeTest.java
new file mode 100644
index 0000000..3c34d41
--- /dev/null
+++ b/test/org/apache/ws/commons/om/impl/serializer/PreserveEnvelopeTest.java
@@ -0,0 +1,97 @@
+package org.apache.ws.commons.om.impl.serializer;
+
+import org.apache.ws.commons.om.OMElement;
+import org.apache.ws.commons.om.impl.llom.builder.StAXOMBuilder;
+import org.custommonkey.xmlunit.XMLTestCase;
+
+import javax.xml.stream.XMLStreamException;
+import java.io.ByteArrayInputStream;
+
+	public class PreserveEnvelopeTest extends XMLTestCase{
+
+		
+		 private String originalXML = "<Assertion xmlns=\"urn:oasis:names:tc:SAML:1.0:assertion\" xmlns:saml=\"urn:oasis:names:tc:SAML:1.0:assertion\" xmlns:samlp=\"urn:oasis:names:tc:SAML:1.0:protocol\" AssertionID=\"ef98507718ea606c6ae1e89d2c0865ee\" IssueInstant=\"2006-01-03T15:09:35.164Z\" Issuer=\"C=US,O=National Center for Supercomputing Applications,CN=Hemapani Srinath Perera\" MajorVersion=\"1\" MinorVersion=\"1\"><Conditions NotBefore=\"2006-01-03T15:09:35.164Z\" NotOnOrAfter=\"2006-01-03T15:39:35.164Z\"><AudienceRestrictionCondition><Audience>http://www.extreme.indiana.edu/lead/TestCMD_Simple_Tue_Jan_03_10_09_27_EST_2006_142825</Audience></AudienceRestrictionCondition></Conditions><AuthorizationDecisionStatement Decision=\"Permit\" Resource=\"http://www.extreme.indiana.edu/lead/TestCMD_Simple_Tue_Jan_03_10_09_27_EST_2006_142825\"><Subject><NameIdentifier>/C=US/O=Indiana University/OU=Computer Science/CN=Hemapani Srinath Perera</NameIdentifier><SubjectConfirmation><ConfirmationMethod>urn:oasis:names:tc:SAML:1.0:cm:bearer</ConfirmationMethod></SubjectConfirmation></Subject><Action Namespace=\"http://www.extreme.indiana.edu/lead\">Run</Action></AuthorizationDecisionStatement><ds:Signature xmlns:ds=\"http://www.w3.org/2000/09/xmldsig#\">\n" +
+	     "<ds:SignedInfo>\n" +
+	     "<ds:CanonicalizationMethod Algorithm=\"http://www.w3.org/2001/10/xml-exc-c14n#\"></ds:CanonicalizationMethod>\n" +
+	     "<ds:SignatureMethod Algorithm=\"http://www.w3.org/2000/09/xmldsig#rsa-sha1\"></ds:SignatureMethod>\n" +
+	     "<ds:Reference URI=\"#ef98507718ea606c6ae1e89d2c0865ee\">\n" +
+	     "<ds:Transforms>\n" +
+	     "<ds:Transform Algorithm=\"http://www.w3.org/2000/09/xmldsig#enveloped-signature\"></ds:Transform>\n" +
+	     "<ds:Transform Algorithm=\"http://www.w3.org/2001/10/xml-exc-c14n#\"><ec:InclusiveNamespaces xmlns:ec=\"http://www.w3.org/2001/10/xml-exc-c14n#\" PrefixList=\"code ds kind rw saml samlp typens #default\"></ec:InclusiveNamespaces></ds:Transform>\n" +
+	     "</ds:Transforms>\n" +
+	     "<ds:DigestMethod Algorithm=\"http://www.w3.org/2000/09/xmldsig#sha1\"></ds:DigestMethod>\n" +
+	     "<ds:DigestValue>0bqebD+zkADcbXleyxpFUySp7cY=</ds:DigestValue>\n" +
+	     "</ds:Reference>\n" +
+	     "</ds:SignedInfo>\n" +
+	     "<ds:SignatureValue>\n" +
+	     "HVZDR4InypCICJxbCSrZJsikcpSACZRTt5Ly2gfLBUpdVeq6koHAKo8WGrGHbZVzNFAmxj3i52jQ\n" +
+	     "aYeO0J6LIA==\n" +
+	     "</ds:SignatureValue>\n" +
+	     "<ds:KeyInfo>\n" +
+	     "<ds:X509Data>\n" +
+	     "<ds:X509Certificate>\n" +
+	     "MIIClDCCAXygAwIBAwICBEkwDQYJKoZIhvcNAQEEBQAwaTELMAkGA1UEBhMCVVMxODA2BgNVBAoT\n" +
+	     "L05hdGlvbmFsIENlbnRlciBmb3IgU3VwZXJjb21wdXRpbmcgQXBwbGljYXRpb25zMSAwHgYDVQQD\n" +
+	     "ExdIZW1hcGFuaSBTcmluYXRoIFBlcmVyYTAeFw0wNjAxMDMxNDM2MTFaFw0wNjAxMDQwMjQxMTFa\n" +
+	     "MHkxCzAJBgNVBAYTAlVTMTgwNgYDVQQKEy9OYXRpb25hbCBDZW50ZXIgZm9yIFN1cGVyY29tcHV0\n" +
+	     "aW5nIEFwcGxpY2F0aW9uczEgMB4GA1UEAxMXSGVtYXBhbmkgU3JpbmF0aCBQZXJlcmExDjAMBgNV\n" +
+	     "BAMTBXByb3h5MFwwDQYJKoZIhvcNAQEBBQADSwAwSAJBALyBo53oJTrVjs/RCFLJaMKektAqeNCi\n" +
+	     "IAhEx+pE0BxL23WV8mhxUNDJevO7lkRuwuDWchbobq8S1WNRYrbOqRkCAwEAATANBgkqhkiG9w0B\n" +
+	     "AQQFAAOCAQEAEZRsxz1izBa8SNw7x1nCttjTDnRM102CTad/uq3vihKmOauBo8lFqklT2xoFv+Nx\n" +
+	     "WX1FXT5AAqedITtUn99zk3Sr5c/SgdO59NxSaWgqxTOd7koZUmz8Sta9IK7d1fDFhDie2W2EtUMk\n" +
+	     "QX0Rr7KHReF6a0knQ+kGlhDuA2YN27CpNg+gBTq0+p1yaVA79qf2BVDYBklPG2N5tWn2GekHoUMs\n" +
+	     "7nlU9WlUI0tRUKuGGdQ+2WLTW0w2UuqsJuHvDaquZRnTOjhdiRw5/Mg62LqkSwo99Dc3JiJusqoY\n" +
+	     "16Unq8wp5gVJbj36UoVvqnVOyBltseIaU5bLS5LIrv11hXA6fg==\n" +
+	     "</ds:X509Certificate>\n" +
+	     "<ds:X509Certificate>\n" +
+	     "MIIEVzCCAz+gAwIBAgICBEkwDQYJKoZIhvcNAQEEBQAwaTELMAkGA1UEBhMCVVMxODA2BgNVBAoT\n" +
+	     "L05hdGlvbmFsIENlbnRlciBmb3IgU3VwZXJjb21wdXRpbmcgQXBwbGljYXRpb25zMSAwHgYDVQQD\n" +
+	     "ExdDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw0wNTEwMjUxOTMxMzRaFw0wNzEwMjUxOTMxMzRa\n" +
+	     "MGkxCzAJBgNVBAYTAlVTMTgwNgYDVQQKEy9OYXRpb25hbCBDZW50ZXIgZm9yIFN1cGVyY29tcHV0\n" +
+	     "aW5nIEFwcGxpY2F0aW9uczEgMB4GA1UEAxMXSGVtYXBhbmkgU3JpbmF0aCBQZXJlcmEwggEiMA0G\n" +
+	     "CSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQC/pkVn4ZUEM5BjfocwiiQVF4ivFpJJ8u1m8vq0WNlc\n" +
+	     "bw4rjMOet1YArC46fZ1Gg652A1dF92+8hHNeBa6chll5HRZkx5FLN7XEGY4EcHhXA6lHmjklpf8N\n" +
+	     "Iy6/91ElOT1pVoLRpOeJ1TFT/nQxMBMJbMyhycrUV49M8oL3O/CYAm1YVQjCtdieK/ibFXzgP2iX\n" +
+	     "R8oOrAX/Ogp+FilUkdrZlhhhzV/NdGdQrPQxxpWbXsLOgiyEU4W1BWSHHI1E1cs0KUoYvaboAYaq\n" +
+	     "E+0WZlhqDxQy3SKOZVPYk9fJu9+qAb0gaDIgtN4FrZFYvTrlNMcrmyaC2ozr43nxwVMlq9dnAgMB\n" +
+	     "AAGjggEHMIIBAzAJBgNVHRMEAjAAMAsGA1UdDwQEAwIE8DAdBgNVHQ4EFgQU90FgTLg4k1yN3yJu\n" +
+	     "d4TZIbxUGigwgZMGA1UdIwSBizCBiIAU8r6NqmFJES25W3IkKhjSwoXGmIGhbaRrMGkxCzAJBgNV\n" +
+	     "BAYTAlVTMTgwNgYDVQQKEy9OYXRpb25hbCBDZW50ZXIgZm9yIFN1cGVyY29tcHV0aW5nIEFwcGxp\n" +
+	     "Y2F0aW9uczEgMB4GA1UEAxMXQ2VydGlmaWNhdGlvbiBBdXRob3JpdHmCAQAwNAYDVR0fBC0wKzAp\n" +
+	     "oCegJYYjaHR0cDovL2NhLm5jc2EudWl1Yy5lZHUvNGE2Y2Q4YjEucjAwDQYJKoZIhvcNAQEEBQAD\n" +
+	     "ggEBAHnFMFeZTHjuq/juH3qw1jDrr4IuKnljuLHWSi8GuMt1mxOs/vR7rMg0OAs16gMJP3X2uSK5\n" +
+	     "0miXqsbZ4AQuBJqo5Pm8UaSzeJlBle02SUvt2Fxhze9odLgoUXHp/1hKm9blHbp5cZqlbsmckk8y\n" +
+	     "4xOPgNYh1G3oxdv2OcadmJBMlYwcBK+TkO8GbemqXqdFt6itGkkhLGQdspw9c1r38bXd9lhLbVR8\n" +
+	     "7yif8ffqIgouVe/wj3NIjSbxgjff88Hz6CCuOWiafvfpgmrU906yOZqe6jBDBTKF5xmqyCNKKFAJ\n" +
+	     "UbmPCX2vMKCpWrLU+MotR2HSbljslSUhfKCjHvFb/AA=\n" +
+	     "</ds:X509Certificate>\n" +
+	     "</ds:X509Data>\n" +
+	     "</ds:KeyInfo></ds:Signature></Assertion>";
+
+
+		 
+		 public void testOMNS() {
+		        try {
+		        	StAXOMBuilder builder = new StAXOMBuilder(new ByteArrayInputStream(originalXML.getBytes()));
+		            OMElement documentElement = builder.getDocumentElement();
+		            //assertXMLEqual(originalXML, documentElement.toString());
+		            
+		            String outstr  = documentElement.toString();
+		            System.out.println(outstr);
+		            assertTrue(outstr.indexOf("xmlns:saml=") > 0);
+		            assertTrue(outstr.indexOf("<Assertion") == 0);
+		            
+		        } catch (XMLStreamException e) {
+		            e.printStackTrace();
+
+		        }
+		    }
+		 
+
+
+	}
+
+
+
+
+
diff --git a/test/org/apache/ws/commons/om/impl/streamwrapper/OMStaxStreamingWrapperTest.java b/test/org/apache/ws/commons/om/impl/streamwrapper/OMStaxStreamingWrapperTest.java
new file mode 100644
index 0000000..aa61273
--- /dev/null
+++ b/test/org/apache/ws/commons/om/impl/streamwrapper/OMStaxStreamingWrapperTest.java
@@ -0,0 +1,229 @@
+/*
+ * Copyright 2004,2005 The Apache Software Foundation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      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.
+ */
+
+package org.apache.ws.commons.om.impl.streamwrapper;
+
+import org.apache.ws.commons.om.AbstractTestCase;
+import org.apache.ws.commons.om.OMAbstractFactory;
+import org.apache.ws.commons.om.OMXMLParserWrapper;
+import org.apache.ws.commons.om.impl.llom.factory.OMXMLBuilderFactory;
+import org.apache.ws.commons.soap.SOAPEnvelope;
+
+import javax.xml.stream.XMLInputFactory;
+import javax.xml.stream.XMLStreamReader;
+import java.io.File;
+import java.io.FileReader;
+
+public class OMStaxStreamingWrapperTest extends AbstractTestCase {
+    private SOAPEnvelope envelope = null;
+    private File tempFile;
+    private XMLStreamReader parser;
+
+    public OMStaxStreamingWrapperTest(String testName) {
+        super(testName);
+    }
+
+    protected void setUp() throws Exception {
+        XMLStreamReader xmlStreamReader = XMLInputFactory.newInstance().
+                createXMLStreamReader(
+                        new FileReader(
+                                getTestResourceFile("soap/soapmessage1.xml")));
+        OMXMLParserWrapper builder = OMXMLBuilderFactory.createStAXSOAPModelBuilder(
+                OMAbstractFactory.getSOAP11Factory(), xmlStreamReader);
+        envelope = (SOAPEnvelope) builder.getDocumentElement();
+        tempFile = File.createTempFile("temp", "xml");
+
+    }
+
+
+    //    public void testWrapperFullOM() throws Exception {
+    //        assertNotNull(envelope);
+    //        //this serializing will cause the OM to fully build!
+    //        XMLStreamWriter writer = XMLOutputFactory.newInstance().createXMLStreamWriter(new FileOutputStream(tempFile));
+    //        envelope.serializeAndConsume(writer,true);
+    //        parser = envelope.getXMLStreamReader(false);
+    //        while (parser.hasNext()) {
+    //            int event = parser.next();
+    //            assertTrue(event > 0);
+    //        }
+    //
+    //    }
+
+    public void testWrapperHalfOM() throws Exception {
+        assertNotNull(envelope);
+        parser = envelope.getXMLStreamReaderWithoutCaching();
+        while (parser.hasNext()) {
+            int event = parser.next();
+            assertTrue(event > 0);
+        }
+    }
+
+    //    public void testWrapperHalfOMWithCacheOff() throws Exception {
+    //        assertNotNull(envelope);
+    //        parser = envelope.getXMLStreamReader(true);
+    //        while (parser.hasNext()) {
+    //            int event = parser.next();
+    //            assertTrue(event > 0);
+    //        }
+    //    }
+    //
+    //    public void testWrapperElementEventGenerationWithHalfOMWithCacheOff() throws XMLStreamException {
+    //        assertNotNull(envelope);
+    //        parser = envelope.getXMLStreamReader(true);
+    //        while (parser.hasNext()) {
+    //            int event = parser.next();
+    //            assertTrue(event > 0);
+    //            if (event == XMLStreamConstants.START_ELEMENT) {
+    //                checkStartElement(parser);
+    //            } else if (event == XMLStreamConstants.CHARACTERS) {
+    //                checkCharacters(parser);
+    //            }
+    //        }
+    //
+    //
+    //    }
+    //
+    //    public void testWrapperElementEventGenerationWithHalfOM() throws Exception {
+    //        assertNotNull(envelope);
+    //        parser = envelope.getXMLStreamReader(false);
+    //        while (parser.hasNext()) {
+    //            int event = parser.next();
+    //            assertTrue(event > 0);
+    //            if (event == XMLStreamConstants.START_ELEMENT) {
+    //                checkStartElement(parser);
+    //            } else if (event == XMLStreamConstants.CHARACTERS) {
+    //                checkCharacters(parser);
+    //            }
+    //        }
+    //
+    //
+    //    }
+    //
+    //    private void checkCharacters(XMLStreamReader wrapper) {
+    //        assertFalse(wrapper.isStartElement());
+    //        assertFalse(wrapper.isEndElement());
+    //        assertFalse(wrapper.isWhiteSpace());
+    //        assertFalse(wrapper.hasName());
+    //        assertTrue(wrapper.isCharacters());
+    //
+    //        assertNotNull(wrapper.getText());
+    //        assertTrue(wrapper.getTextLength() > 0);
+    //    }
+    //
+    //    private void checkStartElement(XMLStreamReader wrapper) {
+    //        assertTrue(wrapper.isStartElement());
+    //        assertTrue(wrapper.hasName());
+    //        assertFalse(wrapper.isEndElement());
+    //        assertFalse(wrapper.isCharacters());
+    //        assertFalse(wrapper.isWhiteSpace());
+    //
+    //        //at the start element event these need to be supplied
+    //        assertNotNull(wrapper.getLocalName());
+    //        assertNotNull(wrapper.getName());
+    //        assertNotNull(wrapper.getNamespaceURI());
+    //        //prefix may be null
+    //        wrapper.getPrefix();
+    //
+    //        //todo add the other checks here
+    //        int attribCount = wrapper.getAttributeCount();
+    //        for (int i = 0; i < attribCount; i++) {
+    //            assertNotNull(wrapper.getAttributeLocalName(i));
+    //            assertNotNull(wrapper.getAttributeValue(i));
+    //            assertNotNull(wrapper.getAttributeName(i));
+    //            wrapper.getAttributePrefix(i);
+    //            wrapper.getAttributeNamespace(i);
+    //            //todo add the other checks here
+    //        }
+    //
+    //
+    //    }
+    //
+    //    public void testWrapperElementEventGenerationWithHalfOMWithCacheOff() throws XMLStreamException {
+    //        assertNotNull(envelope);
+    //        parser = envelope.getXMLStreamReader(true);
+    //        while (parser.hasNext()) {
+    //            int event = parser.next();
+    //            assertTrue(event > 0);
+    //            if (event == XMLStreamConstants.START_ELEMENT) {
+    //                checkStartElement(parser);
+    //            } else if (event == XMLStreamConstants.CHARACTERS) {
+    //                checkCharacters(parser);
+    //            }
+    //        }
+    //
+    //
+    //    }
+    //
+    //    public void testWrapperElementEventGenerationWithHalfOM() throws Exception {
+    //        assertNotNull(envelope);
+    //        parser = envelope.getXMLStreamReader(false);
+    //        while (parser.hasNext()) {
+    //            int event = parser.next();
+    //            assertTrue(event > 0);
+    //            if (event == XMLStreamConstants.START_ELEMENT) {
+    //                checkStartElement(parser);
+    //            } else if (event == XMLStreamConstants.CHARACTERS) {
+    //                checkCharacters(parser);
+    //            }
+    //        }
+    //
+    //
+    //    }
+    //
+    //    private void checkCharacters(XMLStreamReader wrapper) {
+    //        assertFalse(wrapper.isStartElement());
+    //        assertFalse(wrapper.isEndElement());
+    //        assertFalse(wrapper.isWhiteSpace());
+    //        assertFalse(wrapper.hasName());
+    //        assertTrue(wrapper.isCharacters());
+    //
+    //        assertNotNull(wrapper.getText());
+    //        assertTrue(wrapper.getTextLength() > 0);
+    //    }
+    //
+    //    private void checkStartElement(XMLStreamReader wrapper) {
+    //        assertTrue(wrapper.isStartElement());
+    //        assertTrue(wrapper.hasName());
+    //        assertFalse(wrapper.isEndElement());
+    //        assertFalse(wrapper.isCharacters());
+    //        assertFalse(wrapper.isWhiteSpace());
+    //
+    //        //at the start element event these need to be supplied
+    //        assertNotNull(wrapper.getLocalName());
+    //        assertNotNull(wrapper.getName());
+    //        assertNotNull(wrapper.getNamespaceURI());
+    //        //prefix may be null
+    //        wrapper.getPrefix();
+    //
+    //        //todo add the other checks here
+    //        int attribCount = wrapper.getAttributeCount();
+    //        for (int i = 0; i < attribCount; i++) {
+    //            assertNotNull(wrapper.getAttributeLocalName(i));
+    //            assertNotNull(wrapper.getAttributeValue(i));
+    //            assertNotNull(wrapper.getAttributeName(i));
+    //            wrapper.getAttributePrefix(i);
+    //            wrapper.getAttributeNamespace(i);
+    //            //todo add the other checks here
+    //        }
+    //
+    //
+    //    }
+
+
+    protected void tearDown() throws Exception {
+        tempFile.delete();
+    }
+}
diff --git a/test/org/apache/ws/commons/om/impl/streamwrapper/OmStAXBuilderTest.java b/test/org/apache/ws/commons/om/impl/streamwrapper/OmStAXBuilderTest.java
new file mode 100644
index 0000000..75754df
--- /dev/null
+++ b/test/org/apache/ws/commons/om/impl/streamwrapper/OmStAXBuilderTest.java
@@ -0,0 +1,66 @@
+/*
+ * Copyright 2004,2005 The Apache Software Foundation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      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.
+ */
+
+package org.apache.ws.commons.om.impl.streamwrapper;
+
+import org.apache.ws.commons.om.AbstractTestCase;
+import org.apache.ws.commons.om.OMAbstractFactory;
+import org.apache.ws.commons.om.OMXMLParserWrapper;
+import org.apache.ws.commons.om.impl.llom.factory.OMXMLBuilderFactory;
+import org.apache.ws.commons.soap.SOAPEnvelope;
+import org.apache.ws.commons.soap.SOAPFactory;
+
+import javax.xml.stream.XMLInputFactory;
+import javax.xml.stream.XMLStreamReader;
+import java.io.File;
+import java.io.FileOutputStream;
+import java.io.FileReader;
+
+public class OmStAXBuilderTest extends AbstractTestCase {
+    private SOAPFactory factory = null;
+    private OMXMLParserWrapper builder;
+    private File tempFile;
+
+    public OmStAXBuilderTest(String testName) {
+        super(testName);
+    }
+
+    protected void setUp() throws Exception {
+        factory = OMAbstractFactory.getSOAP11Factory();
+        XMLStreamReader reader = XMLInputFactory.newInstance().
+                createXMLStreamReader(
+                        new FileReader(
+                                getTestResourceFile("soap/soapmessage.xml")));
+        builder =
+                OMXMLBuilderFactory.createStAXSOAPModelBuilder(factory,
+                        reader);
+        tempFile = File.createTempFile("temp", "xml");
+    }
+
+    public void testStaxBuilder() throws Exception {
+        SOAPEnvelope envelope = (SOAPEnvelope) builder.getDocumentElement();
+        assertNotNull(envelope);
+        envelope.serialize(new FileOutputStream(tempFile));
+
+
+    }
+
+    protected void tearDown() throws Exception {
+        tempFile.delete();
+    }
+
+
+}
diff --git a/test/org/apache/ws/commons/om/impl/traverse/OMChildrenWithSpecificAttributeIteratorTest.java b/test/org/apache/ws/commons/om/impl/traverse/OMChildrenWithSpecificAttributeIteratorTest.java
new file mode 100644
index 0000000..fbd7050
--- /dev/null
+++ b/test/org/apache/ws/commons/om/impl/traverse/OMChildrenWithSpecificAttributeIteratorTest.java
@@ -0,0 +1,109 @@
+/*
+ * Copyright 2004,2005 The Apache Software Foundation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      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.
+ */
+
+package org.apache.ws.commons.om.impl.traverse;
+
+import junit.framework.TestCase;
+import org.apache.ws.commons.om.OMAbstractFactory;
+import org.apache.ws.commons.om.OMElement;
+import org.apache.ws.commons.om.OMFactory;
+import org.apache.ws.commons.om.OMNamespace;
+import org.apache.ws.commons.om.impl.llom.traverse.OMChildrenWithSpecificAttributeIterator;
+
+import javax.xml.namespace.QName;
+import java.util.Iterator;
+
+public class OMChildrenWithSpecificAttributeIteratorTest extends TestCase {
+
+    public OMChildrenWithSpecificAttributeIteratorTest(String testName) {
+        super(testName);
+    }
+
+    public void testChildrenRetrievalWithDetaching() {
+
+        OMFactory factory = OMAbstractFactory.getOMFactory();
+        OMNamespace testNamespace = factory.createOMNamespace("http://test.ws.org", "test");
+        OMElement documentElement = getSampleDocumentElement(testNamespace);
+
+        Iterator childrenIter = new OMChildrenWithSpecificAttributeIterator(
+                documentElement.getFirstOMChild(), new QName(testNamespace.getName(), "myAttr",
+                testNamespace.getPrefix()), "Axis2", true);
+
+        int childCount = getChidrenCount(childrenIter);
+        assertEquals("Iterator must return 5 children with the given attribute", childCount, 5);
+
+        Iterator children = documentElement.getChildren();
+        childCount = getChidrenCount(children);
+        assertEquals("Iterator must return only one child, having detached the other children", childCount, 1);
+
+    }
+
+    public void testChildrenRetrievalWithNoDetaching() {
+
+        OMFactory factory = OMAbstractFactory.getOMFactory();
+        OMNamespace testNamespace = factory.createOMNamespace("http://test.ws.org", "test");
+        OMElement documentElement = getSampleDocumentElement(testNamespace);
+
+        Iterator childrenIter = new OMChildrenWithSpecificAttributeIterator(
+                documentElement.getFirstOMChild(), new QName(testNamespace.getName(), "myAttr",
+                testNamespace.getPrefix()), "Axis2", false);
+
+        int childCount = getChidrenCount(childrenIter);
+        assertEquals("Iterator must return 5 children with the given attribute", childCount, 5);
+
+        Iterator children = documentElement.getChildren();
+        childCount = getChidrenCount(children);
+        assertEquals("Iterator must return 6 children, having not detached the children", childCount, 6);
+
+    }
+
+    private OMElement getSampleDocumentElement(OMNamespace testNamespace){
+        OMFactory factory = OMAbstractFactory.getOMFactory();
+
+        OMElement documentElement = factory.createOMElement("Employees", testNamespace);
+        documentElement.declareNamespace(testNamespace);
+
+        OMElement employee;
+        OMElement name;
+
+        for (int i = 0; i < 5; i++) {
+            employee = factory.createOMElement("Employee", testNamespace, documentElement);
+            name = factory.createOMElement("Name"+i, testNamespace);
+            employee.addAttribute("myAttr", "Axis2", testNamespace);
+            name.setText("Apache Developer");
+            employee.addChild(name);
+        }
+
+        //adding one more child with the given attr
+        employee = factory.createOMElement("Employee", testNamespace, documentElement);
+        name = factory.createOMElement("Name", testNamespace);
+        name.addAttribute("myAttr", "Un-Related Value", testNamespace);
+        name.setText("Apache Developer");
+        employee.addChild(name);
+
+        return documentElement;
+    }
+
+    private int getChidrenCount(Iterator childrenIter) {
+        int childCount = 0;
+        while (childrenIter.hasNext()) {
+        	childrenIter.next();
+            childCount++;
+        }
+
+        return childCount;
+    }
+}
diff --git a/test/org/apache/ws/commons/om/infoset/XMLConformanceTest.java b/test/org/apache/ws/commons/om/infoset/XMLConformanceTest.java
new file mode 100644
index 0000000..91e979d
--- /dev/null
+++ b/test/org/apache/ws/commons/om/infoset/XMLConformanceTest.java
@@ -0,0 +1,53 @@
+/*
+ * Copyright 2004,2005 The Apache Software Foundation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      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.
+ */
+
+package org.apache.ws.commons.om.infoset;
+
+import junit.framework.Test;
+import junit.framework.TestCase;
+import junit.framework.TestSuite;
+
+import java.io.File;
+
+public class XMLConformanceTest extends TestCase {
+
+    public static Test suite() throws Exception {
+        TestSuite suite = new TestSuite();
+
+        File testSuiteDirectory = new File("test-resources/XMLSuite/xmlconf");
+        if (testSuiteDirectory.exists()) {
+            ProcessDir(testSuiteDirectory, suite);
+        }
+        return suite;
+    }
+
+    private static void ProcessDir(File dir, TestSuite suite) throws Exception {
+        if (dir.isDirectory()) {
+            //process all children
+            String[] children = dir.list();
+            for (int i = 0; i < children.length; i++) {
+                File child = (new File(dir, children[i]));
+                ProcessDir(child, suite);
+            }
+        } else {
+            //check if it's xml file
+            String absPath = dir.getAbsolutePath();
+            if (absPath.endsWith(".xml")) {
+                suite.addTest(new XMLConformanceUnit(absPath, "testSingleFileConformance"));
+            }
+        }
+    }
+}
diff --git a/test/org/apache/ws/commons/om/infoset/XMLConformanceUnit.java b/test/org/apache/ws/commons/om/infoset/XMLConformanceUnit.java
new file mode 100644
index 0000000..a1d9b08
--- /dev/null
+++ b/test/org/apache/ws/commons/om/infoset/XMLConformanceUnit.java
@@ -0,0 +1,110 @@
+/*
+ * Copyright 2004,2005 The Apache Software Foundation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      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.
+ */
+
+package org.apache.ws.commons.om.infoset;
+
+import org.apache.ws.commons.om.OMAbstractFactory;
+import org.apache.ws.commons.om.OMDocument;
+import org.apache.ws.commons.om.OMElement;
+import org.apache.ws.commons.om.impl.llom.builder.StAXOMBuilder;
+import org.apache.ws.commons.om.impl.llom.factory.OMXMLBuilderFactory;
+import org.custommonkey.xmlunit.Diff;
+import org.custommonkey.xmlunit.XMLTestCase;
+import org.w3c.dom.Document;
+import org.xml.sax.EntityResolver;
+import org.xml.sax.InputSource;
+import org.xml.sax.SAXException;
+
+import javax.xml.parsers.DocumentBuilder;
+import javax.xml.parsers.DocumentBuilderFactory;
+import javax.xml.parsers.ParserConfigurationException;
+import javax.xml.stream.XMLInputFactory;
+import java.io.ByteArrayInputStream;
+import java.io.ByteArrayOutputStream;
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.FileReader;
+import java.io.IOException;
+import java.io.InputStreamReader;
+
+public class XMLConformanceUnit extends XMLTestCase implements EntityResolver {
+
+    private String filePath;
+    private File directory;
+
+    public XMLConformanceUnit(String filePath, String testName) {
+        super(testName);
+        this.filePath = filePath;
+        this.directory = new File(filePath).getParentFile();
+    }
+
+    public void testSingleFileConformance()
+            throws Exception {
+        OMElement rootElement;
+
+        System.out.println("XML File:" + filePath);
+        XMLInputFactory factory = XMLInputFactory.newInstance();
+//        factory.setProperty("report-cdata-event", Boolean.TRUE);
+        StAXOMBuilder staxOMBuilder = OMXMLBuilderFactory.
+                createStAXOMBuilder(OMAbstractFactory.getOMFactory(),
+                        factory.createXMLStreamReader(
+                                new FileInputStream(filePath)));
+        rootElement = staxOMBuilder.getDocumentElement();
+
+        ByteArrayOutputStream baos = new ByteArrayOutputStream();
+        ((OMDocument)rootElement.getParent()).serialize(baos);
+
+        InputSource resultXML = new InputSource(new InputStreamReader(
+                new ByteArrayInputStream(baos.toByteArray())));
+
+        Document dom1 = newDocument(new InputSource(new FileReader(filePath)));
+        Document dom2 = newDocument(resultXML);
+
+        Diff diff = compareXML(dom1, dom2);
+        assertXMLEqual(diff, true);
+    }
+
+    /**
+     * Method newDocument
+     *
+     * @param in
+     * @return
+     * @throws javax.xml.parsers.ParserConfigurationException
+     *
+     * @throws org.xml.sax.SAXException
+     * @throws java.io.IOException
+     */
+    public Document newDocument(InputSource in)
+            throws ParserConfigurationException, SAXException, IOException {
+        DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
+        dbf.setNamespaceAware(true);
+        DocumentBuilder db = dbf.newDocumentBuilder();
+        db.setEntityResolver(this);
+        return db.parse(in);
+    }
+
+    public InputSource resolveEntity(String publicId, String systemId) throws SAXException, IOException {
+        File f = new File(directory, systemId.substring(systemId.lastIndexOf('/')));
+        return new InputSource(new FileInputStream(f));
+    }
+
+    public String getName() {
+        String name = filePath;
+        if(name.lastIndexOf("xmlconf")!=-1)
+            name = name.substring(name.lastIndexOf("xmlconf"));
+        return name.replace('\\','/');
+    }
+}
diff --git a/test/org/apache/ws/commons/soap/SOAPBodyTest.java b/test/org/apache/ws/commons/soap/SOAPBodyTest.java
new file mode 100644
index 0000000..823c636
--- /dev/null
+++ b/test/org/apache/ws/commons/soap/SOAPBodyTest.java
@@ -0,0 +1,154 @@
+/*
+ * Copyright 2004,2005 The Apache Software Foundation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      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.
+ */
+
+package org.apache.ws.commons.soap;
+
+import org.apache.ws.commons.om.OMException;
+
+public class SOAPBodyTest extends SOAPBodyTestCase {
+
+    public SOAPBodyTest(String testName) {
+        super(testName);
+    }
+
+    protected void setUp() throws Exception {
+        super.setUp();
+    }
+
+    //SOAP 1.1 Body Test (Programaticaly created)----------------------------------------------------------------------------------
+    public void testSOAP11AddFault1() {
+        soap11Body.addFault(new Exception("This an exception for testing"));
+        assertTrue(
+                "SOAP 1.1 Body Test:- After calling addFault method, SOAP body has no fault",
+                soap11Body.hasFault());
+
+    }
+
+    public void testSOAP11addFault2() {
+        soap11Body.addFault(soap11Factory.createSOAPFault(soap11Body));
+        assertTrue(
+                "SOAP 1.1 Body Test:- After calling addFault method, SOAP body has no fault",
+                soap11Body.hasFault());
+
+
+    }
+
+    public void testSOAP11HasFault() {
+        assertFalse(
+                "SOAP 1.1 Body Test:- After creating a soap body it has a fault",
+                soap11Body.hasFault());
+        soap11Body.addFault(new Exception("This an exception for testing"));
+        assertTrue(
+                "SOAP 1.1 Body Test:- After calling addFault method, hasFault method returns false",
+                soap11Body.hasFault());
+    }
+
+    public void testSOAP11GetFault() {
+        assertTrue(
+                "SOAP 1.1 Body Test:- After creating a soap body it has a fault",
+                soap11Body.getFault() == null);
+        soap11Body.addFault(new Exception("This an exception for testing"));
+        assertFalse(
+                "SOAP 1.1 Body Test:- After calling addFault method, getFault method returns null",
+                soap11Body.getFault() == null);
+    }
+
+    //SOAP 1.2 Body Test (Programaticaly Created)----------------------------------------------------------------------------------
+    public void testSOAP12AddFault1() {
+        soap12Body.addFault(new Exception("This an exception for testing"));
+        assertTrue(
+                "SOAP 1.2 Body Test:- After calling addFault method, SOAP body has no fault",
+                soap12Body.hasFault());
+
+    }
+
+    public void testSOAP12AddFault2() {
+        soap12Body.addFault(soap12Factory.createSOAPFault(soap12Body));
+        assertTrue(
+                "SOAP 1.2 Body Test:- After calling addFault method, SOAP body has no fault",
+                soap12Body.hasFault());
+    }
+
+    public void testSOAP12HasFault() {
+        assertFalse(
+                "SOAP 1.2 Body Test:- After creating a soap body it has a fault",
+                soap12Body.hasFault());
+        soap12Body.addFault(new Exception("This an exception for testing"));
+        assertTrue(
+                "SOAP 1.2 Body Test:- After calling addFault method, hasFault method returns false",
+                soap12Body.hasFault());
+    }
+
+    public void testSOAP12GetFault() {
+        assertTrue(
+                "SOAP 1.2 Body Test:- After creating a soap body it has a fault",
+                soap12Body.getFault() == null);
+        soap12Body.addFault(new Exception("This an exception for testing"));
+        assertFalse(
+                "SOAP 1.2 Body Test:- After calling addFault method, getFault method returns null",
+                soap12Body.getFault() == null);
+    }
+
+    //SOAP 1.1 Body Test (With Parser)-------------------------------------------------------------------------------------------
+    public void testSOAP11HasFaultWithParser() {
+        assertTrue(
+                "SOAP 1.1 Body Test With parser :- hasFault method returns false",
+                soap11BodyWithParser.hasFault());
+    }
+
+    public void testSOAP11GetFaultWithParser() {
+        assertFalse(
+                "SOAP 1.1 Body Test With parser :- getFault method returns null",
+                soap11BodyWithParser.getFault() == null);
+        assertTrue(
+                "SOAP 1.1 Body Test With parser : - SOAP fault name mismatch",
+                soap11BodyWithParser.getFault().getLocalName().equals(
+                        SOAPConstants.SOAPFAULT_LOCAL_NAME));
+    }
+
+    //SOAP 1.2 Body Test (With Parser)-------------------------------------------------------------------------------------------------
+    public void testSOAP12HasFaultWithParser() {
+        assertTrue(
+                "SOAP 1.2 Body Test With parser :- hasFault method returns false",
+                soap12BodyWithParser.hasFault());
+    }
+
+    public void testSOAP12GetFaultWithParser() {
+        assertFalse(
+                "SOAP 1.2 Body Test With parser :- getFault method returns null",
+                soap12BodyWithParser.getFault() == null);
+        assertTrue(
+                "SOAP 1.2 Body Test With parser : - SOAP fault name mismatch",
+                soap12BodyWithParser.getFault().getLocalName().equals(
+                        SOAPConstants.SOAPFAULT_LOCAL_NAME));
+    }
+
+    public void testSOAPBodyDetachment(){
+        try {
+            soap11Body.detach();
+            fail("Detachment of SOAP Body is not allowed !!");
+        } catch (OMException e) {
+            assertTrue(true);
+        }
+
+        try {
+            soap12Body.detach();
+            fail("Detachment of SOAP Body is not allowed !!");
+        } catch (OMException e) {
+            assertTrue(true);
+        }
+    }
+}
diff --git a/test/org/apache/ws/commons/soap/SOAPBodyTestCase.java b/test/org/apache/ws/commons/soap/SOAPBodyTestCase.java
new file mode 100644
index 0000000..a8771fc
--- /dev/null
+++ b/test/org/apache/ws/commons/soap/SOAPBodyTestCase.java
@@ -0,0 +1,40 @@
+/*
+ * Copyright 2004,2005 The Apache Software Foundation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      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.
+ */
+
+package org.apache.ws.commons.soap;
+
+public class SOAPBodyTestCase extends SOAPTestCase {
+    protected SOAPBody soap11Body;
+    protected SOAPBody soap12Body;
+
+    protected SOAPBody soap11BodyWithParser;
+    protected SOAPBody soap12BodyWithParser;
+
+    public SOAPBodyTestCase(String testName) {
+        super(testName);
+
+    }
+
+    protected void setUp() throws Exception {
+        super.setUp();
+        soap11Body = soap11Factory.createSOAPBody(soap11Envelope);
+        soap12Body = soap12Factory.createSOAPBody(soap12Envelope);
+
+        soap11BodyWithParser = soap11EnvelopeWithParser.getBody();
+        soap12BodyWithParser = soap12EnvelopeWithParser.getBody();
+    }
+
+}
diff --git a/test/org/apache/ws/commons/soap/SOAPEnvelopeTest.java b/test/org/apache/ws/commons/soap/SOAPEnvelopeTest.java
new file mode 100644
index 0000000..38cb408
--- /dev/null
+++ b/test/org/apache/ws/commons/soap/SOAPEnvelopeTest.java
@@ -0,0 +1,105 @@
+/*
+ * Copyright 2004,2005 The Apache Software Foundation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      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.
+ */
+
+package org.apache.ws.commons.soap;
+
+
+public class SOAPEnvelopeTest extends SOAPTestCase {
+    protected SOAPEnvelope soap11Envelope;
+    protected SOAPEnvelope soap12Envelope;
+
+    public SOAPEnvelopeTest(String testName) {
+        super(testName);
+        soap11Envelope = soap11Factory.getDefaultEnvelope();
+        soap12Envelope = soap12Factory.getDefaultEnvelope();
+    }
+
+    //SOAP 1.1 Envelope Test (Programaticaly Created)-----------------------------------------------
+    public void testSOAP11GetHeader() {
+        SOAPHeader header = soap11Envelope.getHeader();
+        assertTrue("SOAP 1.1 Header Test : - Header local name mismatch",
+                header.getLocalName().equals(SOAPConstants.HEADER_LOCAL_NAME));
+        assertTrue("SOAP 1.1 Header Test : - Header namespace mismatch",
+                header.getNamespace().getName().equals(
+                        SOAP11Constants.SOAP_ENVELOPE_NAMESPACE_URI));
+    }
+
+    public void testSOAP11GetBody() {
+        SOAPBody body = soap11Envelope.getBody();
+        assertTrue("SOAP 1.1 Body Test : - Body local name mismatch",
+                body.getLocalName().equals(SOAPConstants.BODY_LOCAL_NAME));
+        assertTrue("SOAP 1.1 Body Test : - Body namespace mismatch",
+                body.getNamespace().getName().equals(
+                        SOAP11Constants.SOAP_ENVELOPE_NAMESPACE_URI));
+    }
+
+    //SOAP 1.2 Envelope Test (Programaticaly Created)-------------------------------------------------
+    public void testSOAP12GetHeader() {
+        SOAPHeader header = soap12Envelope.getHeader();
+        assertTrue("SOAP 1.2 Header Test : - Header local name mismatch",
+                header.getLocalName().equals(SOAPConstants.HEADER_LOCAL_NAME));
+        assertTrue("SOAP 1.2 Header Test : - Header namespace mismatch",
+                header.getNamespace().getName().equals(
+                        SOAP12Constants.SOAP_ENVELOPE_NAMESPACE_URI));
+    }
+
+    public void testSOAP12GetBody() {
+        SOAPBody body = soap12Envelope.getBody();
+        assertTrue("SOAP 1.2 Body Test : - Body local name mismatch",
+                body.getLocalName().equals(SOAPConstants.BODY_LOCAL_NAME));
+        assertTrue("SOAP 1.2 Body Test : - Body namespace mismatch",
+                body.getNamespace().getName().equals(
+                        SOAP12Constants.SOAP_ENVELOPE_NAMESPACE_URI));
+    }
+
+    //SOAP 1.1 Envelope Test (With Parser)-----------------------------------------------------------------
+    public void testSOAP11GetHeaderWithParser() {
+        SOAPHeader header = soap11EnvelopeWithParser.getHeader();
+        assertTrue("SOAP 1.1 Header Test : - Header local name mismatch",
+                header.getLocalName().equals(SOAPConstants.HEADER_LOCAL_NAME));
+        assertTrue("SOAP 1.1 Header Test : - Header namespace mismatch",
+                header.getNamespace().getName().equals(
+                        SOAP11Constants.SOAP_ENVELOPE_NAMESPACE_URI));
+    }
+
+    public void testSOAP11GetBodyWithParser() {
+        SOAPBody body = soap11EnvelopeWithParser.getBody();
+        assertTrue("SOAP 1.1 Body Test : - Body local name mismatch",
+                body.getLocalName().equals(SOAPConstants.BODY_LOCAL_NAME));
+        assertTrue("SOAP 1.1 Body Test : - Body namespace mismatch",
+                body.getNamespace().getName().equals(
+                        SOAP11Constants.SOAP_ENVELOPE_NAMESPACE_URI));
+    }
+
+    //SOAP 1.2 Envelope Test (With Parser)--------------------------------------------------------------------
+    public void testSOAP12GetHeaderWithParser() {
+        SOAPHeader header = soap12EnvelopeWithParser.getHeader();
+        assertTrue("SOAP 1.2 Header Test : - Header local name mismatch",
+                header.getLocalName().equals(SOAPConstants.HEADER_LOCAL_NAME));
+        assertTrue("SOAP 1.2 Header Test : - Header namespace mismatch",
+                header.getNamespace().getName().equals(
+                        SOAP12Constants.SOAP_ENVELOPE_NAMESPACE_URI));
+    }
+
+    public void testSOAP12GetBodyWithParser() {
+        SOAPBody body = soap12EnvelopeWithParser.getBody();
+        assertTrue("SOAP 1.2 Body Test : - Body local name mismatch",
+                body.getLocalName().equals(SOAPConstants.BODY_LOCAL_NAME));
+        assertTrue("SOAP 1.2 Body Test : - Body namespace mismatch",
+                body.getNamespace().getName().equals(
+                        SOAP12Constants.SOAP_ENVELOPE_NAMESPACE_URI));
+    }
+}
diff --git a/test/org/apache/ws/commons/soap/SOAPFaultCodeTest.java b/test/org/apache/ws/commons/soap/SOAPFaultCodeTest.java
new file mode 100644
index 0000000..681c9c5
--- /dev/null
+++ b/test/org/apache/ws/commons/soap/SOAPFaultCodeTest.java
@@ -0,0 +1,163 @@
+/*
+ * Copyright 2004,2005 The Apache Software Foundation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      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.
+ */
+
+package org.apache.ws.commons.soap;
+
+
+public class SOAPFaultCodeTest extends SOAPFaultCodeTestCase {
+
+    public SOAPFaultCodeTest(String testName) {
+        super(testName);
+    }
+
+    protected void setUp() throws Exception {
+        super.setUp();
+    }
+
+    //SOAP 1.1 Fault Code Test (Programaticaly Created)
+    public void testSOAP11SetValue() {
+        soap11FaultCode.setValue(
+                soap11Factory.createSOAPFaultValue(soap11FaultCode));
+        assertFalse(
+                "SOAP 1.1 Fault Code Test :- After calling setValue method, getValue method returns null",
+                soap11FaultCode.getValue() == null);
+        try {
+            soap11FaultCode.setValue(
+                    soap12Factory.createSOAPFaultValue(soap12FaultCode));
+            fail("SOAP12FaultValue should not be inserted to SOAP11FaultCode");
+        } catch (SOAPProcessingException e) {
+            assertTrue(true);
+        }
+
+    }
+
+    public void testSOAP11GetValue() {
+        assertTrue(
+                "SOAP 1.1 Fault Code Test :- After creating soapfaultcode, it has a value",
+                soap11FaultCode.getValue() == null);
+        soap11FaultCode.setValue(
+                soap11Factory.createSOAPFaultValue(soap11FaultCode));
+        assertFalse(
+                "SOAP 1.1 Fault Code Test :- After calling setValue method, getValue method returns null",
+                soap11FaultCode.getValue() == null);
+    }
+
+    //SOAP 1.2 Fault Code Test (Programaticaly Created)
+    public void testSOAP12SetValue() {
+        soap12FaultCode.setValue(
+                soap12Factory.createSOAPFaultValue(soap12FaultCode));
+        assertFalse(
+                "SOAP 1.2 Fault Code Test :- After calling setValue method, getValue method returns null",
+                soap12FaultCode.getValue() == null);
+        try {
+            soap12FaultCode.setValue(
+                    soap11Factory.createSOAPFaultValue(soap11FaultCode));
+            fail("SOAP11FaultValue should not be inserted to SOAP12FaultCode");
+        } catch (SOAPProcessingException e) {
+            assertTrue(true);
+        }
+
+        try {
+            soap12FaultCode.setValue(
+                    soap12Factory.createSOAPFaultValue(
+                            soap12Factory.createSOAPFaultSubCode(
+                                    soap12FaultCode)));
+        } catch (Exception e) {
+            fail(
+                    "SOAP 1.2 Fault Code Test :- When calling setValue method, parent of value element mismatch");
+        }
+    }
+
+    public void testSOAP12GetValue() {
+        assertTrue(
+                "SOAP 1.2 Fault Code Test :- After creating soapfaultcode, it has a value",
+                soap12FaultCode.getValue() == null);
+        soap12FaultCode.setValue(
+                soap12Factory.createSOAPFaultValue(soap12FaultCode));
+        assertFalse(
+                "SOAP 1.2 Fault Code Test :- After calling setValue method, getValue method returns null",
+                soap12FaultCode.getValue() == null);
+    }
+
+    public void testSOAP12SetSubCode() {
+        soap12FaultCode.setSubCode(
+                soap12Factory.createSOAPFaultSubCode(soap12FaultCode));
+        assertFalse(
+                "SOAP 1.2 Fault Code Test :- After calling setSubCode method, getSubCode method returns null",
+                soap12FaultCode.getSubCode() == null);
+        try {
+            soap12FaultCode.setSubCode(
+                    soap11Factory.createSOAPFaultSubCode(soap11FaultCode));
+            fail(
+                    "SOAP11FaultSubCode should not be inserted to SOAP12FaultCode");
+        } catch (SOAPProcessingException e) {
+            assertTrue(true);
+        }
+
+        try {
+            soap12FaultCode.setSubCode(
+                    soap12Factory.createSOAPFaultSubCode(
+                            soap12Factory.createSOAPFaultSubCode(
+                                    soap12FaultCode)));
+        } catch (Exception e) {
+            fail(
+                    "SOAP 1.2 Fault Code Test :- When calling setSubCode method, parent of subcode element mismatch");
+        }
+    }
+
+    public void testSOAP12GetSubCode() {
+        assertTrue(
+                "SOAP 1.2 Fault Code Test :- After creating soapfaultcode, it has a subcode",
+                soap12FaultCode.getSubCode() == null);
+        soap12FaultCode.setSubCode(
+                soap12Factory.createSOAPFaultSubCode(soap12FaultCode));
+        assertFalse(
+                "SOAP 1.2 Fault Code Test :- After calling setSubCode method, getSubCode method returns null",
+                soap12FaultCode.getSubCode() == null);
+    }
+
+    //SOAP 1.1 Fault Code Test (With Parser)
+    public void testSOAP11GetValueWithParser() {
+        assertFalse(
+                "SOAP 1.1 Fault Code Test with parser : - getValue method returns null",
+                soap11FaultCodeWithParser.getValue() == null);
+        assertTrue(
+                "SOAP 1.1 Fault Code Test with parser : - Value local name mismatch",
+                soap11FaultCodeWithParser.getValue().getLocalName().equals(
+                        SOAP12Constants.SOAP_FAULT_VALUE_LOCAL_NAME));
+    }
+
+    //SOAP 1.2 Fault Code Test (With Parser)
+    public void testSOAP12GetValueWithParser() {
+        assertFalse(
+                "SOAP 1.2 Fault Code Test with parser : - getValue method returns null",
+                soap12FaultCodeWithParser.getValue() == null);
+        assertTrue(
+                "SOAP 1.2 Fault Code Test with parser : - Value local name mismatch",
+                soap12FaultCodeWithParser.getValue().getLocalName().equals(
+                        SOAP12Constants.SOAP_FAULT_VALUE_LOCAL_NAME));
+    }
+
+    public void testSOAP12GetSubCodeWithParser() {
+        assertFalse(
+                "SOAP 1.2 Fault Code Test with parser :- getSubCode method returns null",
+                soap12FaultCodeWithParser.getSubCode() == null);
+        assertTrue(
+                "SOAP 1.2 Fault Code Test with parser : - subcode local name mismatch",
+                soap12FaultCodeWithParser.getSubCode().getLocalName().equals(
+                        SOAP12Constants.SOAP_FAULT_SUB_CODE_LOCAL_NAME));
+    }
+}
diff --git a/test/org/apache/ws/commons/soap/SOAPFaultCodeTestCase.java b/test/org/apache/ws/commons/soap/SOAPFaultCodeTestCase.java
new file mode 100644
index 0000000..270f65d
--- /dev/null
+++ b/test/org/apache/ws/commons/soap/SOAPFaultCodeTestCase.java
@@ -0,0 +1,41 @@
+/*
+ * Copyright 2004,2005 The Apache Software Foundation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      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.
+ */
+
+package org.apache.ws.commons.soap;
+
+public class SOAPFaultCodeTestCase extends SOAPFaultTestCase {
+
+    protected SOAPFaultCode soap11FaultCode;
+    protected SOAPFaultCode soap12FaultCode;
+
+    protected SOAPFaultCode soap11FaultCodeWithParser;
+    protected SOAPFaultCode soap12FaultCodeWithParser;
+
+    public SOAPFaultCodeTestCase(String testName) {
+        super(testName);
+    }
+
+    protected void setUp() throws Exception {
+        super.setUp();
+
+        soap11FaultCode = soap11Factory.createSOAPFaultCode(soap11Fault);
+        soap12FaultCode = soap12Factory.createSOAPFaultCode(soap12Fault);
+
+        soap11FaultCodeWithParser = soap11FaultWithParser.getCode();
+        soap12FaultCodeWithParser = soap12FaultWithParser.getCode();
+    }
+
+}
diff --git a/test/org/apache/ws/commons/soap/SOAPFaultDetailTest.java b/test/org/apache/ws/commons/soap/SOAPFaultDetailTest.java
new file mode 100644
index 0000000..75b0d7f
--- /dev/null
+++ b/test/org/apache/ws/commons/soap/SOAPFaultDetailTest.java
@@ -0,0 +1,223 @@
+/*
+ * Copyright 2004,2005 The Apache Software Foundation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      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.
+ */
+
+package org.apache.ws.commons.soap;
+
+import org.apache.ws.commons.om.OMElement;
+import org.apache.ws.commons.om.OMNamespace;
+import org.apache.ws.commons.om.OMText;
+
+import java.util.Iterator;
+
+public class SOAPFaultDetailTest extends SOAPFaultTestCase {
+    protected SOAPFaultDetail soap11FaultDetail;
+    protected SOAPFaultDetail soap12FaultDetail;
+    protected SOAPFaultDetail soap11FaultDetailWithParser;
+    protected SOAPFaultDetail soap12FaultDetailWithParser;
+    protected OMNamespace omNamespace;
+
+    public SOAPFaultDetailTest(String testName) {
+        super(testName);
+        omNamespace =
+                omFactory.createOMNamespace("http://www.test.org", "test");
+    }
+
+    protected void setUp() throws Exception {
+        super.setUp();
+        soap11FaultDetail = soap11Factory.createSOAPFaultDetail(soap11Fault);
+        soap12FaultDetail = soap12Factory.createSOAPFaultDetail(soap12Fault);
+        soap11FaultDetailWithParser = soap11FaultWithParser.getDetail();
+        soap12FaultDetailWithParser = soap12FaultWithParser.getDetail();
+    }
+
+    //SOAP 1.1 Fault Detail Test (Programaticaly Created)
+    public void testSOAP11AddDetailEntry() {
+        soap11FaultDetail.addDetailEntry(
+                omFactory.createOMElement("DetailEntry1", omNamespace));
+        soap11FaultDetail.addDetailEntry(
+                omFactory.createOMElement("DetailEntry2", omNamespace));
+        Iterator iterator = soap11FaultDetail.getAllDetailEntries();
+        OMElement detailEntry1 = (OMElement) iterator.next();
+        assertFalse(
+                "SOAP 1.1 Fault Detail Test : - After calling addDetailEntry method twice, getAllDetailEntries method returns empty iterator",
+                detailEntry1 == null);
+        assertTrue(
+                "SOAP 1.1 Fault Detail Test : - detailEntry1 local name mismatch",
+                detailEntry1.getLocalName().equals("DetailEntry1"));
+        assertTrue(
+                "SOAP 1.1 Fault Detail Test : - detailEntry1 namespace uri mismatch",
+                detailEntry1.getNamespace().getName().equals(
+                        "http://www.test.org"));
+        OMElement detailEntry2 = (OMElement) iterator.next();
+        assertFalse(
+                "SOAP 1.1 Fault Detail Test : - After calling addDetailEntry method twice, getAllDetailEntries method returns an iterator with only one object",
+                detailEntry2 == null);
+        assertTrue(
+                "SOAP 1.1 Fault Detail Test : - detailEntry2 local name mismatch",
+                detailEntry2.getLocalName().equals("DetailEntry2"));
+        assertTrue(
+                "SOAP 1.1 Fault Detail Test : - detailEntry2 namespace uri mismatch",
+                detailEntry2.getNamespace().getName().equals(
+                        "http://www.test.org"));
+        assertTrue(
+                "SOAP 1.1 Fault Detail Test : - After calling addDetailEntry method twice, getAllDetailEntries method returns an iterator with three objects",
+                iterator.next() == null);
+    }
+
+    public void testSOAP11GetAllDetailEntries() {
+        Iterator iterator = soap11FaultDetail.getAllDetailEntries();
+        assertTrue(
+                "SOAP 1.1 Fault Detail Test : - After creating SOAP11FaultDetail element, it has DetailEntries",
+                iterator.next() == null);
+        soap11FaultDetail.addDetailEntry(
+                omFactory.createOMElement("DetailEntry", omNamespace));
+        iterator = soap11FaultDetail.getAllDetailEntries();
+        OMElement detailEntry = (OMElement) iterator.next();
+        assertFalse(
+                "SOAP 1.1 Fault Detail Test : - After calling addDetailEntry method, getAllDetailEntries method returns empty iterator",
+                detailEntry == null);
+        assertTrue(
+                "SOAP 1.1 Fault Detail Test : - detailEntry local name mismatch",
+                detailEntry.getLocalName().equals("DetailEntry"));
+        assertTrue(
+                "SOAP 1.1 Fault Detail Test : - detailEntry namespace uri mismatch",
+                detailEntry.getNamespace().getName().equals(
+                        "http://www.test.org"));
+        assertTrue(
+                "SOAP 1.1 Fault Detail Test : - After calling addDetailEntry method once, getAllDetailEntries method returns an iterator with two objects",
+                iterator.next() == null);
+    }
+
+    //SOAP 1.2 Fault Detail Test (Programaticaly Created)
+    public void testSOAP12AddDetailEntry() {
+        soap12FaultDetail.addDetailEntry(
+                omFactory.createOMElement("DetailEntry1", omNamespace));
+        soap12FaultDetail.addDetailEntry(
+                omFactory.createOMElement("DetailEntry2", omNamespace));
+        Iterator iterator = soap12FaultDetail.getAllDetailEntries();
+        OMElement detailEntry1 = (OMElement) iterator.next();
+        assertFalse(
+                "SOAP 1.2 Fault Detail Test : - After calling addDetailEntry method twice, getAllDetailEntries method returns empty iterator",
+                detailEntry1 == null);
+        assertTrue(
+                "SOAP 1.2 Fault Detail Test : - detailEntry1 local name mismatch",
+                detailEntry1.getLocalName().equals("DetailEntry1"));
+        assertTrue(
+                "SOAP 1.2 Fault Detail Test : - detailEntry1 namespace uri mismatch",
+                detailEntry1.getNamespace().getName().equals(
+                        "http://www.test.org"));
+        OMElement detailEntry2 = (OMElement) iterator.next();
+        assertFalse(
+                "SOAP 1.2 Fault Detail Test : - After calling addDetailEntry method twice, getAllDetailEntries method returns an iterator with only one object",
+                detailEntry2 == null);
+        assertTrue(
+                "SOAP 1.2 Fault Detail Test : - detailEntry2 local name mismatch",
+                detailEntry2.getLocalName().equals("DetailEntry2"));
+        assertTrue(
+                "SOAP 1.2 Fault Detail Test : - detailEntry2 namespace uri mismatch",
+                detailEntry2.getNamespace().getName().equals(
+                        "http://www.test.org"));
+        assertTrue(
+                "SOAP 1.2 Fault Detail Test : - After calling addDetailEntry method twice, getAllDetailEntries method returns an iterator with three objects",
+                iterator.next() == null);
+    }
+
+    public void testSOAP12GetAllDetailEntries() {
+        Iterator iterator = soap12FaultDetail.getAllDetailEntries();
+        assertTrue(
+                "SOAP 1.2 Fault Detail Test : - After creating SOAP11FaultDetail element, it has DetailEntries",
+                iterator.next() == null);
+        soap12FaultDetail.addDetailEntry(
+                omFactory.createOMElement("DetailEntry", omNamespace));
+        iterator = soap12FaultDetail.getAllDetailEntries();
+        OMElement detailEntry = (OMElement) iterator.next();
+        assertFalse(
+                "SOAP 1.2 Fault Detail Test : - After calling addDetailEntry method, getAllDetailEntries method returns empty iterator",
+                detailEntry == null);
+        assertTrue(
+                "SOAP 1.2 Fault Detail Test : - detailEntry local name mismatch",
+                detailEntry.getLocalName().equals("DetailEntry"));
+        assertTrue(
+                "SOAP 1.2 Fault Detail Test : - detailEntry namespace uri mismatch",
+                detailEntry.getNamespace().getName().equals(
+                        "http://www.test.org"));
+        assertTrue(
+                "SOAP 1.2 Fault Detail Test : - After calling addDetailEntry method once, getAllDetailEntries method returns an iterator with two objects",
+                iterator.next() == null);
+    }
+
+    //SOAP 1.1 Fault Detail Test (With Parser)
+    public void testSOAP11GetAllDetailEntriesWithParser() {
+        Iterator iterator = soap11FaultDetailWithParser.getAllDetailEntries();
+        OMText textEntry = (OMText) iterator.next();
+        assertFalse(
+                "SOAP 1.1 Fault Detail Test With Parser : - getAllDetailEntries method returns empty iterator",
+                textEntry == null);
+        assertTrue(
+                "SOAP 1.1 Fault Detail Test With Parser : - text value mismatch",
+                textEntry.getText().trim().equals("Details of error"));
+        OMElement detailEntry1 = (OMElement) iterator.next();
+        assertFalse(
+                "SOAP 1.1 Fault Detail Test With Parser : - getAllDetailEntries method returns an itrator without detail entries",
+                detailEntry1 == null);
+        assertTrue(
+                "SOAP 1.1 Fault Detail Test With Parser : - detailEntry1 localname mismatch",
+                detailEntry1.getLocalName().equals("MaxTime"));
+        iterator.next();
+        OMElement detailEntry2 = (OMElement) iterator.next();
+        assertFalse(
+                "SOAP 1.1 Fault Detail Test With Parser : - getAllDetailEntries method returns an itrator with only one detail entries",
+                detailEntry2 == null);
+        assertTrue(
+                "SOAP 1.1 Fault Detail Test With Parser : - detailEntry2 localname mismatch",
+                detailEntry2.getLocalName().equals("AveTime"));
+        iterator.next();
+        assertTrue(
+                "SOAP 1.1 Fault Detail Test With Parser : - getAllDetailEntries method returns an itrator with more than two detail entries",
+                iterator.next() == null);
+    }
+
+    //SOAP 1.2 Fault Detail Test (With Parser)
+    public void testSOAP12GetAllDetailEntriesWithParser() {
+        Iterator iterator = soap12FaultDetailWithParser.getAllDetailEntries();
+        OMText textEntry = (OMText) iterator.next();
+        assertFalse(
+                "SOAP 1.2 Fault Detail Test With Parser : - getAllDetailEntries method returns empty iterator",
+                textEntry == null);
+        assertTrue(
+                "SOAP 1.2 Fault Detail Test With Parser : - text value mismatch",
+                textEntry.getText().trim().equals("Details of error"));
+        OMElement detailEntry1 = (OMElement) iterator.next();
+        assertFalse(
+                "SOAP 1.2 Fault Detail Test With Parser : - getAllDetailEntries method returns an itrator without detail entries",
+                detailEntry1 == null);
+        assertTrue(
+                "SOAP 1.2 Fault Detail Test With Parser : - detailEntry1 localname mismatch",
+                detailEntry1.getLocalName().equals("MaxTime"));
+        iterator.next();
+        OMElement detailEntry2 = (OMElement) iterator.next();
+        assertFalse(
+                "SOAP 1.2 Fault Detail Test With Parser : - getAllDetailEntries method returns an itrator with only one detail entries",
+                detailEntry2 == null);
+        assertTrue(
+                "SOAP 1.2 Fault Detail Test With Parser : - detailEntry2 localname mismatch",
+                detailEntry2.getLocalName().equals("AveTime"));
+        iterator.next();
+        assertTrue(
+                "SOAP 1.2 Fault Detail Test With Parser : - getAllDetailEntries method returns an itrator with more than two detail entries",
+                iterator.next() == null);
+    }
+}
diff --git a/test/org/apache/ws/commons/soap/SOAPFaultNodeTest.java b/test/org/apache/ws/commons/soap/SOAPFaultNodeTest.java
new file mode 100644
index 0000000..b8d6420
--- /dev/null
+++ b/test/org/apache/ws/commons/soap/SOAPFaultNodeTest.java
@@ -0,0 +1,78 @@
+/*
+ * Copyright 2004,2005 The Apache Software Foundation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      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.
+ */
+
+package org.apache.ws.commons.soap;
+
+public class SOAPFaultNodeTest extends SOAPFaultTestCase {
+    protected SOAPFaultNode soap11FaultNode;
+    protected SOAPFaultNode soap12FaultNode;
+    protected SOAPFaultNode soap12FaultNodeWithParser;
+
+    public SOAPFaultNodeTest(String testName) {
+        super(testName);
+    }
+
+    protected void setUp() throws Exception {
+        super.setUp();
+        soap11FaultNode = soap11Factory.createSOAPFaultNode(soap11Fault);
+        soap12FaultNode = soap12Factory.createSOAPFaultNode(soap12Fault);
+        soap12FaultNodeWithParser = soap12FaultWithParser.getNode();
+    }
+
+    //SOAP 1.1 Fault Node Test (Programaticaly Created)
+    public void testSOAP11SetNodeValue() {
+        soap11FaultNode.setNodeValue("This is only a test");
+        assertTrue(
+                "SOAP 1.1 Fault Node Test : - After calling setNodeValue method, getNodeValue method returns incorrect value",
+                soap11FaultNode.getNodeValue().equals("This is only a test"));
+    }
+
+    public void testSOAP11GetNodeValue() {
+        assertTrue(
+                "SOAP 1.1 Fault Node Test : - After creating SOAPFaultNode, it has a value",
+                soap11FaultNode.getNodeValue().equals(""));
+        soap11FaultNode.setNodeValue("This is only a test");
+        assertTrue(
+                "SOAP 1.1 Fault Node Test : - After calling setNodeValue method, getNodeValue method returns incorrect value",
+                soap11FaultNode.getNodeValue().equals("This is only a test"));
+    }
+
+    //SOAP 1.2 Fault Node Test (Programaticaly Created)
+    public void testSOAP12SetNodeValue() {
+        soap12FaultNode.setNodeValue("This is only a test");
+        assertTrue(
+                "SOAP 1.2 Fault Node Test : - After calling setNodeValue method, getNodeValue method returns incorrect value",
+                soap12FaultNode.getNodeValue().equals("This is only a test"));
+    }
+
+    public void testSOAP12GetNodeValue() {
+        assertTrue(
+                "SOAP 1.2 Fault Node Test : - After creating SOAPFaultNode, it has a value",
+                soap12FaultNode.getNodeValue().equals(""));
+        soap12FaultNode.setNodeValue("This is only a test");
+        assertTrue(
+                "SOAP 1.2 Fault Node Test : - After calling setNodeValue method, getNodeValue method returns incorrect value",
+                soap12FaultNode.getNodeValue().equals("This is only a test"));
+    }
+
+    //SOAP 1.2 Fault Node Test (With Parser)
+    public void testSOAP12GetNodeValueWithParser() {
+        assertTrue(
+                "SOAP 1.2 Fault Node Test With Parser : - getNodeValue method returns incorrect value",
+                soap12FaultNodeWithParser.getNodeValue().trim().equals(
+                        "http://www.w3.org/2003/05/soap-envelope/role/ultimateReceiver"));
+    }
+}
diff --git a/test/org/apache/ws/commons/soap/SOAPFaultReasonTest.java b/test/org/apache/ws/commons/soap/SOAPFaultReasonTest.java
new file mode 100644
index 0000000..22f3ef8
--- /dev/null
+++ b/test/org/apache/ws/commons/soap/SOAPFaultReasonTest.java
@@ -0,0 +1,97 @@
+/*
+ * Copyright 2004,2005 The Apache Software Foundation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      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.
+ */
+
+package org.apache.ws.commons.soap;
+
+public class SOAPFaultReasonTest extends SOAPFaultReasonTestCase {
+
+    public SOAPFaultReasonTest(String testName) {
+        super(testName);
+    }
+
+    protected void setUp() throws Exception {
+        super.setUp();
+    }
+
+    //SOAP 1.1 Fault Reason Test (Programaticaly Created)
+    public void testSOAP11SetSOAPText() {
+        soap11FaultReason.setSOAPText(
+                soap11Factory.createSOAPFaultText(soap11FaultReason));
+        assertFalse(
+                "SOAP 1.1 FaultReason Test : - After calling setSOAPText, getSOAPText returns null",
+                soap11FaultReason.getSOAPText() == null);
+        try {
+            soap11FaultReason.setSOAPText(
+                    soap12Factory.createSOAPFaultText(soap12FaultReason));
+            fail("SOAP12FaultText should not be added to SOAP11FaultReason");
+
+        } catch (Exception e) {
+            assertTrue(true);
+        }
+    }
+
+    public void testSOAP11GetSOAPText() {
+        assertTrue(
+                "SOAP 1.1 FaultReason Test : - After creating SOAP11FaultReason, it has a SOAPFaultText",
+                soap11FaultReason.getSOAPText() == null);
+        soap11FaultReason.setSOAPText(
+                soap11Factory.createSOAPFaultText(soap11FaultReason));
+        assertFalse(
+                "SOAP 1.1 FaultReason Test : - After calling setSOAPText, getSOAPText returns null",
+                soap11FaultReason.getSOAPText() == null);
+    }
+
+    //SOAP 1.2 Fault Reason Test (Programaticaly Created)
+    public void testSOAP12SetSOAPText() {
+        soap12FaultReason.setSOAPText(
+                soap12Factory.createSOAPFaultText(soap12FaultReason));
+        assertFalse(
+                "SOAP 1.2 FaultReason Test : - After calling setSOAPText, getSOAPText returns null",
+                soap12FaultReason.getSOAPText() == null);
+        try {
+            soap12FaultReason.setSOAPText(
+                    soap11Factory.createSOAPFaultText(soap11FaultReason));
+            fail("SOAP11FaultText should not be added to SOAP12FaultReason");
+        } catch (Exception e) {
+            assertTrue(true);
+        }
+    }
+
+    public void testSOAP12GetSOAPText() {
+        assertTrue(
+                "SOAP 1.2 FaultReason Test : - After creating SOAP12FaultReason, it has a SOAPFaultText",
+                soap12FaultReason.getSOAPText() == null);
+        soap12FaultReason.setSOAPText(
+                soap12Factory.createSOAPFaultText(soap12FaultReason));
+        assertFalse(
+                "SOAP 1.2 FaultReason Test : - After calling setSOAPText, getSOAPText returns null",
+                soap12FaultReason.getSOAPText() == null);
+    }
+
+    //SOAP 1.1 Fault Reason Test (With Parser)
+    public void testSOAP11GetSOAPTextWithParser() {
+        assertFalse(
+                "SOAP 1.1 FaultReason Test With Parser : - getSOAPText method returns null",
+                soap11FaultReasonWithParser.getSOAPText() == null);
+    }
+
+    //SOAP 1.2 Fault Reason Test (With Parser)
+    public void testSOAP12GetSOAPTextWithParser() {
+        assertFalse(
+                "SOAP 1.2 FaultReason Test With Parser : - getSOAPText method returns null",
+                soap12FaultReasonWithParser.getSOAPText() == null);
+    }
+}
diff --git a/test/org/apache/ws/commons/soap/SOAPFaultReasonTestCase.java b/test/org/apache/ws/commons/soap/SOAPFaultReasonTestCase.java
new file mode 100644
index 0000000..c0f57c9
--- /dev/null
+++ b/test/org/apache/ws/commons/soap/SOAPFaultReasonTestCase.java
@@ -0,0 +1,38 @@
+/*
+ * Copyright 2004,2005 The Apache Software Foundation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      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.
+ */
+
+package org.apache.ws.commons.soap;
+
+public class SOAPFaultReasonTestCase extends SOAPFaultTestCase {
+
+    protected SOAPFaultReason soap11FaultReason;
+    protected SOAPFaultReason soap12FaultReason;
+    protected SOAPFaultReason soap11FaultReasonWithParser;
+    protected SOAPFaultReason soap12FaultReasonWithParser;
+
+    public SOAPFaultReasonTestCase(String testName) {
+        super(testName);
+    }
+
+    protected void setUp() throws Exception {
+        super.setUp();
+        soap11FaultReason = soap11Factory.createSOAPFaultReason(soap11Fault);
+        soap12FaultReason = soap12Factory.createSOAPFaultReason(soap12Fault);
+        soap11FaultReasonWithParser = soap11FaultWithParser.getReason();
+        soap12FaultReasonWithParser = soap12FaultWithParser.getReason();
+    }
+
+}
diff --git a/test/org/apache/ws/commons/soap/SOAPFaultRoleTest.java b/test/org/apache/ws/commons/soap/SOAPFaultRoleTest.java
new file mode 100644
index 0000000..38ff478
--- /dev/null
+++ b/test/org/apache/ws/commons/soap/SOAPFaultRoleTest.java
@@ -0,0 +1,89 @@
+/*
+ * Copyright 2004,2005 The Apache Software Foundation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      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.
+ */
+
+package org.apache.ws.commons.soap;
+
+public class SOAPFaultRoleTest extends SOAPFaultTestCase {
+
+    protected SOAPFaultRole soap11FaultRole;
+    protected SOAPFaultRole soap12FaultRole;
+    protected SOAPFaultRole soap11FaultRoleWithParser;
+    protected SOAPFaultRole soap12FaultRoleWithParser;
+
+    public SOAPFaultRoleTest(String testName) {
+        super(testName);
+    }
+
+    protected void setUp() throws Exception {
+        super.setUp();
+        soap11FaultRole = soap11Factory.createSOAPFaultRole(soap11Fault);
+        soap12FaultRole = soap12Factory.createSOAPFaultRole(soap12Fault);
+        soap11FaultRoleWithParser = soap11FaultWithParser.getRole();
+        soap12FaultRoleWithParser = soap12FaultWithParser.getRole();
+    }
+
+    //SOAP 1.1 Fault Role Test (Programaticaly Created)
+    public void testSOAP11SetRoleValue() {
+        soap11FaultRole.setRoleValue("This is only a test");
+        assertTrue(
+                "SOAP 1.1 Fault Role Test : - After calling setRoleValue method, getRoleValue method returns incorrect value",
+                soap11FaultRole.getRoleValue().trim().equals("This is only a test"));
+    }
+
+    public void testSOAP11GetRoleValue() {
+        assertTrue(
+                "SOAP 1.1 Fault Role Test : - After creating SOAPFaultRole, it has a value",
+                soap11FaultRole.getRoleValue().equals(""));
+        soap11FaultRole.setRoleValue("This is only a test");
+        assertTrue(
+                "SOAP 1.1 Fault Role Test : - After calling setRoleValue method, getRoleValue method returns incorrect value",
+                soap11FaultRole.getRoleValue().trim().equals("This is only a test"));
+    }
+
+    //SOAP 1.2 Fault Role Test (Programaticaly Created)
+    public void testSOAP12SetRoleValue() {
+        soap12FaultRole.setRoleValue("This is only a test");
+        assertTrue(
+                "SOAP 1.2 Fault Role Test : - After calling setRoleValue method, getRoleValue method returns incorrect value",
+                soap12FaultRole.getRoleValue().trim().equals("This is only a test"));
+    }
+
+    public void testSOAP12GetRoleValue() {
+        assertTrue(
+                "SOAP 1.2 Fault Role Test : - After creating SOAPFaultRole, it has a value",
+                soap12FaultRole.getRoleValue().trim().equals(""));
+        soap12FaultRole.setRoleValue("This is only a test");
+        assertTrue(
+                "SOAP 1.2 Fault Role Test : - After calling setRoleValue method, getRoleValue method returns incorrect value",
+                soap12FaultRole.getRoleValue().trim().equals("This is only a test"));
+    }
+
+    //SOAP 1.1 Fault Role Test (With Parser)
+    public void testSOAP11GetRoleValueWithParser() {
+        assertTrue(
+                "SOAP 1.1 Fault Role Test With Parser : - getRoleValue method returns incorrect value",
+                soap11FaultRoleWithParser.getRoleValue().trim().equals(
+                        "http://schemas.xmlsoap.org/soap/envelope/actor/ultimateReceiver"));
+    }
+
+    //SOAP 1.2 Fault Role Test (With Parser)
+    public void testSOAP12GetRoleValueWithParser() {
+        assertTrue(
+                "SOAP 1.2 Fault Role Test With Parser : - getRoleValue method returns incorrect value",
+                soap12FaultRoleWithParser.getRoleValue().trim().equals(
+                        "ultimateReceiver"));
+    }
+}
diff --git a/test/org/apache/ws/commons/soap/SOAPFaultSubCodeTest.java b/test/org/apache/ws/commons/soap/SOAPFaultSubCodeTest.java
new file mode 100644
index 0000000..22bab48
--- /dev/null
+++ b/test/org/apache/ws/commons/soap/SOAPFaultSubCodeTest.java
@@ -0,0 +1,180 @@
+/*
+ * Copyright 2004,2005 The Apache Software Foundation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      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.
+ */
+
+package org.apache.ws.commons.soap;
+
+
+public class SOAPFaultSubCodeTest extends SOAPFaultSubCodeTestCase {
+
+    public SOAPFaultSubCodeTest(String testName) {
+        super(testName);
+    }
+
+    protected void setUp() throws Exception {
+        super.setUp();
+    }
+
+    //SOAP Fault SubCode(In Fault Code) Test (Programaticaly Created)
+    public void testSetValueInFaultCode() {
+        soap12FaultSubCodeInCode.setValue(
+                soap12Factory.createSOAPFaultValue(soap12FaultSubCodeInCode));
+        assertFalse(
+                "SOAP 1.2 Subcode Test In Fault Code : - After calling setValue method, getValue method returns null",
+                soap12FaultSubCodeInCode.getValue() == null);
+        try {
+            soap12FaultSubCodeInCode.setValue(
+                    soap12Factory.createSOAPFaultValue(soap12FaultCode));
+        } catch (SOAPProcessingException e) {
+            fail(
+                    "SOAP 1.2 SOAPFaultSubCode Test In FaultCode : - FaultValue whose parent is FaultCode should not be set in to FaultSubCode, as a child");
+        }
+    }
+
+    public void testGetValueInFaultCode() {
+        assertTrue(
+                "After creating SOAP12FaultSubCode In Fault Code, it has a FaultValue",
+                soap12FaultSubCodeInCode.getValue() == null);
+        soap12FaultSubCodeInCode.setValue(
+                soap12Factory.createSOAPFaultValue(soap12FaultSubCodeInCode));
+        assertFalse(
+                "SOAP 1.2 SOAPFaultSubCode Test In FaultCode : - After calling setValue method, getValue method returns null",
+                soap12FaultSubCodeInCode.getValue() == null);
+    }
+
+    public void testsetSubCodeInFaultCode() {
+        soap12FaultSubCodeInCode.setSubCode(
+                soap12Factory.createSOAPFaultSubCode(soap12FaultSubCodeInCode));
+        assertFalse(
+                "SOAP 1.2 Subcode Test In Fault Code : - After calling setSubCode method, getSubCode method returns null",
+                soap12FaultSubCodeInCode.getSubCode() == null);
+        try {
+            soap12FaultSubCodeInCode.setSubCode(
+                    soap12Factory.createSOAPFaultSubCode(soap12FaultCode));
+        } catch (SOAPProcessingException e) {
+            fail(
+                    "SOAP 1.2 SOAPFaultSubCode Test In FaultCode : - FaultSubCode whose parent is FaultCode should not be set in to FaultSubCode, as a child");
+        }
+    }
+
+    public void testGetSubCodeInFaultCode() {
+        //soap12FaultSubCodeInCode has a SubCode because a SubCode was created in setUp method of super class
+//        assertTrue("After creating SOAP12FaultSubCode In Fault Code, it has a FaultSubCode",soap12FaultSubCodeInCode.getSubCode() == null);
+        soap12FaultSubCodeInCode.setSubCode(
+                soap12Factory.createSOAPFaultSubCode(soap12FaultSubCodeInCode));
+        assertFalse(
+                "SOAP 1.2 SOAPFaultSubCode Test In FaultCode : - After calling setSubCode method, getSubCode method returns null",
+                soap12FaultSubCodeInCode.getSubCode() == null);
+    }
+
+    //SOAP Fault SubCode(In Fault SubCode) Test (Programaticaly Created)
+    public void testSetValueInFaultSubCode() {
+        soap12FaultSubCodeInSubCode.setValue(
+                soap12Factory.createSOAPFaultValue(soap12FaultSubCodeInSubCode));
+        assertFalse(
+                "SOAP 1.2 Subcode Test In Fault SubCode : - After calling setValue method, getValue method returns null",
+                soap12FaultSubCodeInSubCode.getValue() == null);
+        try {
+            soap12FaultSubCodeInSubCode.setValue(
+                    soap12Factory.createSOAPFaultValue(soap12FaultCode));
+        } catch (SOAPProcessingException e) {
+            fail(
+                    "SOAP 1.2 SOAPFaultSubCode Test In FaultCode : - FaultValue whose parent is FaultCode should not be set in to FaultSubCode, as a child");
+        }
+    }
+
+    public void testGetValueInFaultSubCode() {
+        assertTrue(
+                "After creating SOAP12FaultSubCode In Fault SubCode, it has a Fault Value",
+                soap12FaultSubCodeInSubCode.getValue() == null);
+        soap12FaultSubCodeInSubCode.setValue(
+                soap12Factory.createSOAPFaultValue(soap12FaultSubCodeInSubCode));
+        assertFalse(
+                "SOAP 1.2 SOAPFaultSubCode Test In FaultSubCode : - After calling setValue method, getValue method returns null",
+                soap12FaultSubCodeInSubCode.getValue() == null);
+    }
+
+    public void testsetSubCodeInFaultSubCode() {
+        soap12FaultSubCodeInSubCode.setSubCode(
+                soap12Factory.createSOAPFaultSubCode(
+                        soap12FaultSubCodeInSubCode));
+        assertFalse(
+                "SOAP 1.2 Subcode Test In Fault SubCode : - After calling setSubCode method, getSubCode method returns null",
+                soap12FaultSubCodeInSubCode.getSubCode() == null);
+        try {
+            soap12FaultSubCodeInSubCode.setSubCode(
+                    soap12Factory.createSOAPFaultSubCode(soap12FaultCode));
+        } catch (SOAPProcessingException e) {
+            fail(
+                    "SOAP 1.2 SOAPFaultSubCode Test In FaultSubCode : - FaultSubCode whose parent is FaultCode should not be set in to FaultSubCode, as a child");
+        }
+    }
+
+    public void testGetSubCodeInFaultSubCode() {
+        assertTrue(
+                "After creating SOAP12FaultSubCode In Fault SubCode, it has a FaultSubCode",
+                soap12FaultSubCodeInSubCode.getSubCode() == null);
+        soap12FaultSubCodeInSubCode.setSubCode(
+                soap12Factory.createSOAPFaultSubCode(
+                        soap12FaultSubCodeInSubCode));
+        assertFalse(
+                "SOAP 1.2 SOAPFaultSubCode Test In FaultSubCode : - After calling setSubCode method, getSubCode method returns null",
+                soap12FaultSubCodeInSubCode.getSubCode() == null);
+    }
+
+    //SOAP Fault SubCode(In Fault Code) Test (With Parser)
+    public void testGetValueInFaultCodeWithParser() {
+        assertFalse(
+                "SOAP 1.2 SOAPFaultSubCode Test In FaultCode With Parser : - getValue method returns null",
+                soap12FaultSubCodeInFaultCodeWithParser.getValue() == null);
+        assertTrue(
+                "SOAP 1.2 SOAPFaultSubCode Test In FaultCode With Parser : - Value text mismatch",
+                soap12FaultSubCodeInFaultCodeWithParser.getValue().getText()
+                .equals("m:MessageTimeout In First Subcode"));
+    }
+
+    public void testGetSubCodeInFaultCodeWithParser() {
+        assertFalse(
+                "SOAP 1.2 SOAPFaultSubCode Test In FaultCode With Parser : - getSubCode method returns null",
+                soap12FaultSubCodeInFaultCodeWithParser.getSubCode() == null);
+        assertTrue(
+                "SOAP 1.2 SOAPFaultSubCode Test In FaultCode With Parser : - SubCode local name mismatch",
+                soap12FaultSubCodeInFaultCodeWithParser.getSubCode()
+                .getLocalName()
+                .equals(SOAP12Constants.SOAP_FAULT_SUB_CODE_LOCAL_NAME));
+    }
+
+    //SOAP Fault SubCode(In Fault SubCode) Test (With Parser)
+    public void testGetValueInFaultSubCodeWithParser() {
+        assertFalse(
+                "SOAP 1.2 SOAPFaultSubCode Test In FaultSubCode With Parser : - getValue method returns null",
+                soap12FaultSubCodeInSubCodeWithParser.getValue() == null);
+        assertTrue(
+                "SOAP 1.2 SOAPFaultSubCode Test In FaultSubCode With Parser : - Value text mismatch",
+                soap12FaultSubCodeInSubCodeWithParser.getValue().getText()
+                .equals("m:MessageTimeout In Second Subcode"));
+    }
+
+    public void testGetSubCodeInFaultSubCodeWithParser() {
+        assertFalse(
+                "SOAP 1.2 SOAPFaultSubCode Test In FaultSubCode With Parser : - getSubCode method returns null",
+                soap12FaultSubCodeInSubCodeWithParser.getSubCode() == null);
+        assertTrue(
+                "SOAP 1.2 SOAPFaultSubCode Test In FaultSubCode With Parser : - SubCode local name mismatch",
+                soap12FaultSubCodeInSubCodeWithParser.getSubCode()
+                .getLocalName()
+                .equals(SOAP12Constants.SOAP_FAULT_SUB_CODE_LOCAL_NAME));
+    }
+}
diff --git a/test/org/apache/ws/commons/soap/SOAPFaultSubCodeTestCase.java b/test/org/apache/ws/commons/soap/SOAPFaultSubCodeTestCase.java
new file mode 100644
index 0000000..1e5c859
--- /dev/null
+++ b/test/org/apache/ws/commons/soap/SOAPFaultSubCodeTestCase.java
@@ -0,0 +1,62 @@
+/*
+ * Copyright 2004,2005 The Apache Software Foundation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      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.
+ */
+
+package org.apache.ws.commons.soap;
+
+public class SOAPFaultSubCodeTestCase extends SOAPFaultCodeTestCase {
+    protected SOAPFaultValue soap11FaultValue;
+    protected SOAPFaultValue soap12FaultValueInFaultCode;
+    protected SOAPFaultSubCode soap12FaultSubCodeInCode;
+
+    protected SOAPFaultValue soap12FaultValueInFaultSubCode;
+    protected SOAPFaultSubCode soap12FaultSubCodeInSubCode;
+
+    protected SOAPFaultValue soap11FaultValueWithParser;
+    protected SOAPFaultValue soap12FaultValueInFaultCodeWithParser;
+    protected SOAPFaultSubCode soap12FaultSubCodeInFaultCodeWithParser;
+
+    protected SOAPFaultValue soap12FaultValueInFaultSubCodeWithParser;
+    protected SOAPFaultSubCode soap12FaultSubCodeInSubCodeWithParser;
+
+    public SOAPFaultSubCodeTestCase(String testName) {
+        super(testName);
+    }
+
+    protected void setUp() throws Exception {
+        super.setUp();
+        soap11FaultValue = soap11Factory.createSOAPFaultValue(soap11FaultCode);
+
+        soap12FaultValueInFaultCode =
+                soap12Factory.createSOAPFaultValue(soap12FaultCode);
+        soap12FaultSubCodeInCode =
+                soap12Factory.createSOAPFaultSubCode(soap12FaultCode);
+
+
+        soap12FaultSubCodeInSubCode =
+                soap12Factory.createSOAPFaultSubCode(soap12FaultSubCodeInCode);
+
+        soap11FaultValueWithParser = soap11FaultCodeWithParser.getValue();
+        soap12FaultValueInFaultCodeWithParser =
+                soap12FaultCodeWithParser.getValue();
+        soap12FaultSubCodeInFaultCodeWithParser =
+                soap12FaultCodeWithParser.getSubCode();
+
+        soap12FaultValueInFaultSubCodeWithParser =
+                soap12FaultSubCodeInFaultCodeWithParser.getValue();
+        soap12FaultSubCodeInSubCodeWithParser =
+                soap12FaultSubCodeInFaultCodeWithParser.getSubCode();
+    }
+}
diff --git a/test/org/apache/ws/commons/soap/SOAPFaultTest.java b/test/org/apache/ws/commons/soap/SOAPFaultTest.java
new file mode 100644
index 0000000..3bec61b
--- /dev/null
+++ b/test/org/apache/ws/commons/soap/SOAPFaultTest.java
@@ -0,0 +1,416 @@
+/*
+ * Copyright 2004,2005 The Apache Software Foundation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      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.
+ */
+
+package org.apache.ws.commons.soap;
+
+import org.apache.ws.commons.om.OMAbstractFactory;
+
+public class SOAPFaultTest extends SOAPFaultTestCase {
+
+    public SOAPFaultTest(String testName) {
+        super(testName);
+    }
+
+    protected void setUp() throws Exception {
+        super.setUp();
+    }
+
+    //SOAP 1.1 Fault Test (Programaticaly created)-----------------------------------------------------------------------------------
+    public void testSOAP11SetCode() {
+        soap11Fault.setCode(soap11Factory.createSOAPFaultCode(soap11Fault));
+        assertNotNull(
+                "SOAP 1.1 Fault Test:- After calling setCode method, Fault has no code",
+                soap11Fault.getCode());
+        try {
+            soap11Fault.setCode(soap12Factory.createSOAPFaultCode(soap12Fault));
+            fail("SOAP12FaultCode should not not be set in to a SOAP11Fault");
+        } catch (Exception e) {
+        }
+    }
+
+    public void testSOAP11GetCode() {
+        assertTrue(
+                "SOAP 1.1 Fault Test:- After creating a SOAP11Fault, it has a code",
+                soap11Fault.getCode() == null);
+        soap11Fault.setCode(soap11Factory.createSOAPFaultCode(soap11Fault));
+        assertFalse(
+                "SOAP 1.1 Fault Test:- After calling setCode method, Fault has no code",
+                soap11Fault.getCode() == null);
+    }
+
+    public void testSOAP11SetReason() {
+        soap11Fault.setReason(soap11Factory.createSOAPFaultReason(soap11Fault));
+        assertFalse(
+                "SOAP 1.1 Fault Test:- After calling setReason method, Fault has no reason",
+                soap11Fault.getReason() == null);
+        try {
+            soap11Fault.setReason(
+                    soap12Factory.createSOAPFaultReason(soap12Fault));
+            fail("SOAP12FaultReason should not be set in to a SOAP11Fault");
+
+        } catch (Exception e) {
+            assertTrue(true);
+        }
+    }
+
+    public void testSOAP11GetReason() {
+        assertTrue(
+                "SOAP 1.1 Fault Test:- After creating a SOAP11Fault, it has a reason",
+                soap11Fault.getReason() == null);
+        soap11Fault.setReason(soap11Factory.createSOAPFaultReason(soap11Fault));
+        assertFalse(
+                "SOAP 1.1 Fault Test:- After calling setReason method, Fault has no reason",
+                soap11Fault.getReason() == null);
+    }
+
+    public void testSOAP11SetNode() {
+        soap11Fault.setNode(soap11Factory.createSOAPFaultNode(soap11Fault));
+        assertFalse(
+                "SOAP 1.1 Fault Test:- After calling setNode method, Fault has no node",
+                soap11Fault.getNode() == null);
+        try {
+            soap11Fault.setNode(soap12Factory.createSOAPFaultNode(soap12Fault));
+            fail("SOAP12FaultNode should not be set in to a SOAP11Fault");
+
+        } catch (Exception e) {
+            assertTrue(true);
+
+        }
+    }
+
+    public void testSOAP11GetNode() {
+        assertTrue(
+                "SOAP 1.1 Fault Test:- After creating a SOAP11Fault, it has a node",
+                soap11Fault.getNode() == null);
+        soap11Fault.setNode(soap11Factory.createSOAPFaultNode(soap11Fault));
+        assertFalse(
+                "SOAP 1.1 Fault Test:- After calling setNode method, Fault has no node",
+                soap11Fault.getNode() == null);
+    }
+
+    public void testSOAP11SetRole() {
+        soap11Fault.setRole(soap11Factory.createSOAPFaultRole(soap11Fault));
+        assertFalse(
+                "SOAP 1.1 Fault Test:- After calling setRole method, Fault has no role",
+                soap11Fault.getRole() == null);
+        try {
+            soap11Fault.setRole(soap12Factory.createSOAPFaultRole(soap12Fault));
+            fail("SOAP12FaultRole should not be set in to a SOAP11Fault");
+        } catch (Exception e) {
+            assertTrue(true);
+        }
+    }
+
+    public void testSOAP11GetRole() {
+        assertTrue(
+                "SOAP 1.1 Fault Test:- After creating a SOAP11Fault, it has a role",
+                soap11Fault.getRole() == null);
+        soap11Fault.setRole(soap11Factory.createSOAPFaultRole(soap11Fault));
+        assertFalse(
+                "SOAP 1.1 Fault Test:- After calling setRole method, Fault has no role",
+                soap11Fault.getRole() == null);
+    }
+
+    public void testSOAP11SetDetail() {
+        soap11Fault.setDetail(soap11Factory.createSOAPFaultDetail(soap11Fault));
+        assertFalse(
+                "SOAP 1.1 Fault Test:- After calling setDetail method, Fault has no detail",
+                soap11Fault.getDetail() == null);
+        try {
+            soap11Fault.setDetail(
+                    soap12Factory.createSOAPFaultDetail(soap12Fault));
+            fail("SOAP12FaultDetail should not be set in to a SOAP11Fault");
+        } catch (Exception e) {
+            assertTrue(true);
+        }
+    }
+
+    public void testSOAP11GetDetail() {
+        assertTrue(
+                "SOAP 1.1 Fault Test:- After creating a SOAP11Fault, it has a detail",
+                soap11Fault.getDetail() == null);
+        soap11Fault.setDetail(soap11Factory.createSOAPFaultDetail(soap11Fault));
+        assertFalse(
+                "SOAP 1.1 Fault Test:- After calling setDetail method, Fault has no detail",
+                soap11Fault.getDetail() == null);
+    }
+
+    //SOAP 1.2 Fault Test ((Programaticaly created)--------------------------------------------------------------------------------
+    public void testSOAP12SetCode() {
+        soap12Fault.setCode(soap12Factory.createSOAPFaultCode(soap12Fault));
+        assertFalse(
+                "SOAP 1.2 Fault Test:- After calling setCode method, Fault has no code",
+                soap12Fault.getCode() == null);
+        assertTrue("SOAP 1.2 Fault Test:- Code local name mismatch",
+                soap12Fault.getCode().getLocalName().equals(
+                        SOAP12Constants.SOAP_FAULT_CODE_LOCAL_NAME));
+        try {
+            soap12Fault.setCode(soap11Factory.createSOAPFaultCode(soap11Fault));
+            fail("SOAP11FaultCode should not be set in to a SOAP12Fault");
+        } catch (Exception e) {
+            assertTrue(true);
+        }
+    }
+
+    public void testSOAP12GetCode() {
+        assertTrue(
+                "SOAP 1.2 Fault Test:- After creating a SOAP12Fault, it has a code",
+                soap12Fault.getCode() == null);
+        soap12Fault.setCode(soap12Factory.createSOAPFaultCode(soap12Fault));
+        assertFalse(
+                "SOAP 1.2 Fault Test:- After calling setCode method, Fault has no code",
+                soap12Fault.getCode() == null);
+        assertTrue("SOAP 1.2 Fault Test:- Fault code local name mismatch",
+                soap12Fault.getCode().getLocalName().equals(
+                        SOAP12Constants.SOAP_FAULT_CODE_LOCAL_NAME));
+    }
+
+    public void testSOAP12SetReason() {
+        soap12Fault.setReason(soap12Factory.createSOAPFaultReason(soap12Fault));
+        assertFalse(
+                "SOAP 1.2 Fault Test:- After calling setReason method, Fault has no reason",
+                soap12Fault.getReason() == null);
+        assertTrue("SOAP 1.2 Fault Test:- Fault reason local name mismatch",
+                soap12Fault.getReason().getLocalName().equals(
+                        SOAP12Constants.SOAP_FAULT_REASON_LOCAL_NAME));
+        try {
+            soap12Fault.setReason(
+                    soap11Factory.createSOAPFaultReason(soap11Fault));
+            fail("SOAP11FaultReason should not be set in to a SOAP12Fault");
+
+        } catch (Exception e) {
+            assertTrue(true);
+        }
+    }
+
+    public void testSOAP12GetReason() {
+        assertTrue(
+                "SOAP 1.2 Fault Test:- After creating a SOAP12Fault, it has a reason",
+                soap12Fault.getReason() == null);
+        soap12Fault.setReason(soap12Factory.createSOAPFaultReason(soap12Fault));
+        assertFalse(
+                "SOAP 1.2 Fault Test:- After calling setReason method, Fault has no reason",
+                soap12Fault.getReason() == null);
+        assertTrue("SOAP 1.2 Fault Test:- Fault reason local name mismatch",
+                soap12Fault.getReason().getLocalName().equals(
+                        SOAP12Constants.SOAP_FAULT_REASON_LOCAL_NAME));
+    }
+
+    public void testSOAP12SetNode() {
+        soap12Fault.setNode(soap12Factory.createSOAPFaultNode(soap12Fault));
+        assertFalse(
+                "SOAP 1.2 Fault Test:- After calling setNode method, Fault has no node",
+                soap12Fault.getNode() == null);
+        assertTrue("SOAP 1.2 Fault Test:- Fault node local name mismatch",
+                soap12Fault.getNode().getLocalName().equals(
+                        SOAP12Constants.SOAP_FAULT_NODE_LOCAL_NAME));
+        try {
+            soap12Fault.setNode(soap11Factory.createSOAPFaultNode(soap11Fault));
+            fail("SOAP11FaultNode should nott be set in to a SOAP12Fault");
+
+        } catch (Exception e) {
+            assertTrue(true);
+        }
+    }
+
+    public void testSOAP12GetNode() {
+        assertTrue(
+                "SOAP 1.2 Fault Test:- After creating a SOAP12Fault, it has a node",
+                soap12Fault.getNode() == null);
+        soap12Fault.setNode(soap12Factory.createSOAPFaultNode(soap12Fault));
+        assertFalse(
+                "SOAP 1.2 Fault Test:- After calling setNode method, Fault has no node",
+                soap12Fault.getNode() == null);
+        assertTrue("SOAP 1.2 Fault Test:- Fault node local name mismatch",
+                soap12Fault.getNode().getLocalName().equals(
+                        SOAP12Constants.SOAP_FAULT_NODE_LOCAL_NAME));
+    }
+
+    public void testSOAP12SetRole() {
+        soap12Fault.setRole(soap12Factory.createSOAPFaultRole(soap12Fault));
+        assertFalse(
+                "SOAP 1.2 :- After calling setRole method, Fault has no role",
+                soap12Fault.getRole() == null);
+        assertTrue("SOAP 1.2 Fault Test:- Fault role local name mismatch",
+                soap12Fault.getRole().getLocalName().equals(
+                        SOAP12Constants.SOAP_FAULT_ROLE_LOCAL_NAME));
+        try {
+            soap12Fault.setRole(soap11Factory.createSOAPFaultRole(soap11Fault));
+            fail("SOAP11FaultRole should not be set in to a SOAP12Fault");
+        } catch (Exception e) {
+            assertTrue(true);
+        }
+    }
+
+    public void testSOAP12GetRole() {
+        assertTrue(
+                "SOAP 1.2 Fault Test:- After creating a SOAP11Fault, it has a role",
+                soap12Fault.getRole() == null);
+        soap12Fault.setRole(soap12Factory.createSOAPFaultRole(soap12Fault));
+        assertFalse(
+                "SOAP 1.2 Fault Test:- After calling setRole method, Fault has no role",
+                soap12Fault.getRole() == null);
+        assertTrue("SOAP 1.2 Fault Test:- Fault role local name mismatch",
+                soap12Fault.getRole().getLocalName().equals(
+                        SOAP12Constants.SOAP_FAULT_ROLE_LOCAL_NAME));
+    }
+
+    public void testSOAP12SetDetail() {
+        soap12Fault.setDetail(soap12Factory.createSOAPFaultDetail(soap12Fault));
+        assertFalse(
+                "SOAP 1.2 Fault Test:- After calling setDetaile method, Fault has no detail",
+                soap12Fault.getDetail() == null);
+        assertTrue("SOAP 1.2 Fault Test:- Fault detail local name mismatch",
+                soap12Fault.getDetail().getLocalName().equals(
+                        SOAP12Constants.SOAP_FAULT_DETAIL_LOCAL_NAME));
+        try {
+            soap12Fault.setDetail(
+                    soap11Factory.createSOAPFaultDetail(soap11Fault));
+            fail("SOAP11FaultDetail should not be set in to a SOAP12Fault");
+
+        } catch (Exception e) {
+            assertTrue(true);
+        }
+    }
+
+    public void testSOAP12GetDetail() {
+        assertTrue(
+                "SOAP 1.2 Fault Test:- After creating a SOAP12Fault, it has a detail",
+                soap12Fault.getDetail() == null);
+        soap12Fault.setDetail(soap12Factory.createSOAPFaultDetail(soap12Fault));
+        assertFalse(
+                "SOAP 1.2 Fault Test:- After calling setDetail method, Fault has no detail",
+                soap12Fault.getDetail() == null);
+        assertTrue("SOAP 1.2 Fault Test:- Fault detail local name mismatch",
+                soap12Fault.getDetail().getLocalName().equals(
+                        SOAP12Constants.SOAP_FAULT_DETAIL_LOCAL_NAME));
+    }
+
+    //SOAP 1.1 Fault Test (With parser)
+    public void testSOAP11GetCodeWithParser() {
+        assertFalse(
+                "SOAP 1.1 Fault Test with parser: - getCode method returns null",
+                soap11FaultWithParser.getCode() == null);
+    }
+
+    public void testSOAP11GetRoleWithParser() {
+        assertFalse(
+                "SOAP 1.1 Fault Test with parser: - getRole method returns null",
+                soap11FaultWithParser.getRole() == null);
+    }
+
+    public void testSOAP11GetDetailWithParser() {
+        assertFalse(
+                "SOAP 1.1 Fault Test with parser: - getDetail method returns null",
+                soap11FaultWithParser.getDetail() == null);
+    }
+
+    //SOAP 1.2 Fault Test (With parser)
+    public void testSOAP12GetCodeWithParser() {
+        assertFalse(
+                "SOAP 1.2 Fault Test with parser: - getCode method returns null",
+                soap12FaultWithParser.getCode() == null);
+        assertTrue(
+                "SOAP 1.2 Fault Test with parser: - Fault code local name mismatch",
+                soap12FaultWithParser.getCode().getLocalName().equals(
+                        SOAP12Constants.SOAP_FAULT_CODE_LOCAL_NAME));
+    }
+
+    public void testSOAP12GetReasonWithParser() {
+        assertFalse(
+                "SOAP 1.2 Fault Test with parser: - getReason method returns null",
+                soap12FaultWithParser.getReason() == null);
+        assertTrue(
+                "SOAP 1.2 Fault Test with parser: - Fault reason local name mismatch",
+                soap12FaultWithParser.getReason().getLocalName().equals(
+                        SOAP12Constants.SOAP_FAULT_REASON_LOCAL_NAME));
+    }
+
+    public void testSOAP12GetNodeWithParser() {
+        assertFalse(
+                "SOAP 1.2 Fault Test with parser: - getNode method returns null",
+                soap12FaultWithParser.getNode() == null);
+        assertTrue(
+                "SOAP 1.2 Fault Test with parser: - Fault node local name mismatch",
+                soap12FaultWithParser.getNode().getLocalName().equals(
+                        SOAP12Constants.SOAP_FAULT_NODE_LOCAL_NAME));
+    }
+
+    public void testSOAP12GetRoleWithParser() {
+        assertFalse(
+                "SOAP 1.2 Fault Test with parser: - getRole method returns null",
+                soap12FaultWithParser.getRole() == null);
+        assertTrue(
+                "SOAP 1.2 Fault Test with parser: - Fault role local name mismatch",
+                soap12FaultWithParser.getRole().getLocalName().equals(
+                        SOAP12Constants.SOAP_FAULT_ROLE_LOCAL_NAME));
+    }
+
+    public void testSOAP12GetDetailWithParser() {
+        assertFalse(
+                "SOAP 1.2 Fault Test with parser: - getDetail method returns null",
+                soap12FaultWithParser.getDetail() == null);
+        assertTrue(
+                "SOAP 1.2 Fault Test with parser: - Fault detail local name mismatch",
+                soap12FaultWithParser.getDetail().getLocalName().equals(
+                        SOAP12Constants.SOAP_FAULT_DETAIL_LOCAL_NAME));
+    }
+
+    public void testMoreChildrenAddition() {
+        try {
+            SOAPFactory soapFactory = OMAbstractFactory.getSOAP12Factory();
+            SOAPEnvelope envelope = soapFactory.getDefaultFaultEnvelope();
+
+            assertNotNull("Default FaultEnvelope must have a SOAPFault in it",
+                    envelope.getBody().getFault());
+            assertNotNull(
+                    "Default FaultEnvelope must have a SOAPFaultCode in it",
+                    envelope.getBody().getFault().getCode());
+            assertNotNull(
+                    "Default FaultEnvelope must have a SOAPFaultCodeValue in it",
+                    envelope.getBody().getFault().getCode().getValue());
+            assertNotNull(
+                    "Default FaultEnvelope must have a SOAPFaultReason in it",
+                    envelope.getBody().getFault().getReason());
+            assertNotNull(
+                    "Default FaultEnvelope must have a SOAPFaultText in it",
+                    envelope.getBody().getFault().getReason().getSOAPText());
+
+            SOAPEnvelope soapEnvelope = soapFactory.getDefaultFaultEnvelope();
+            String errorCodeString = "Some Error occurred !!";
+            soapEnvelope.getBody().getFault().getCode().getValue().setText(
+                    errorCodeString);
+
+            SOAPFaultCode code = soapEnvelope.getBody().getFault().getCode();
+            envelope.getBody().getFault().setCode(code);
+
+            assertTrue("Parent Value of Code has not been set to new fault",
+                    code.getParent() == envelope.getBody().getFault());
+            assertTrue("Parent Value of Code is still pointing to old fault",
+                    code.getParent() != soapEnvelope.getBody().getFault());
+            assertNull("Old fault must not have a fault code",
+                    soapEnvelope.getBody().getFault().getCode());
+            assertEquals("The SOAP Code value must be " + errorCodeString,
+                    errorCodeString,
+                    envelope.getBody().getFault().getCode().getValue().getText());
+
+        } catch (Exception e) {
+            fail(e.getMessage());
+        }
+
+
+    }
+}
\ No newline at end of file
diff --git a/test/org/apache/ws/commons/soap/SOAPFaultTestCase.java b/test/org/apache/ws/commons/soap/SOAPFaultTestCase.java
new file mode 100644
index 0000000..d70d559
--- /dev/null
+++ b/test/org/apache/ws/commons/soap/SOAPFaultTestCase.java
@@ -0,0 +1,42 @@
+/*
+ * Copyright 2004,2005 The Apache Software Foundation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      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.
+ */
+
+package org.apache.ws.commons.soap;
+
+import org.apache.ws.commons.om.OMAbstractFactory;
+
+public class SOAPFaultTestCase extends SOAPBodyTestCase {
+    protected SOAPFault soap11Fault;
+    protected SOAPFault soap12Fault;
+    protected SOAPFault soap11FaultWithParser;
+    protected SOAPFault soap12FaultWithParser;
+
+    public SOAPFaultTestCase(String testName) {
+        super(testName);
+    }
+
+    protected void setUp() throws Exception {
+        super.setUp();
+        soap11Fault =
+                OMAbstractFactory.getSOAP11Factory().createSOAPFault(
+                        soap11Body);
+        soap12Fault =
+                OMAbstractFactory.getSOAP12Factory().createSOAPFault(
+                        soap12Body);
+        soap11FaultWithParser = soap11BodyWithParser.getFault();
+        soap12FaultWithParser = soap12BodyWithParser.getFault();
+    }
+}
diff --git a/test/org/apache/ws/commons/soap/SOAPFaultTextTest.java b/test/org/apache/ws/commons/soap/SOAPFaultTextTest.java
new file mode 100644
index 0000000..eda4163
--- /dev/null
+++ b/test/org/apache/ws/commons/soap/SOAPFaultTextTest.java
@@ -0,0 +1,177 @@
+/*
+ * Copyright 2004,2005 The Apache Software Foundation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      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.
+ */
+
+package org.apache.ws.commons.soap;
+
+import org.apache.ws.commons.om.OMAttribute;
+
+public class SOAPFaultTextTest extends SOAPFaultReasonTestCase {
+    protected SOAPFaultText soap11FaultText;
+    protected SOAPFaultText soap12FaultText;
+    protected SOAPFaultText soap11FaultTextWithParser;
+    protected SOAPFaultText soap12FaultTextWithParser;
+
+    public SOAPFaultTextTest(String testName) {
+        super(testName);
+    }
+
+    protected void setUp() throws Exception {
+        super.setUp();
+        soap11FaultText = soap11Factory.createSOAPFaultText(soap11FaultReason);
+        soap12FaultText = soap12Factory.createSOAPFaultText(soap12FaultReason);
+        soap11FaultTextWithParser = soap11FaultReasonWithParser.getSOAPText();
+        soap12FaultTextWithParser = soap12FaultReasonWithParser.getSOAPText();
+    }
+
+    //SOAP 1.1 Fault Text Test (Programaticaly Created)
+    public void testSOAP11SetLang() {
+        soap11FaultText.setLang("en");
+        assertTrue(
+                "SOAP 1.1 Fault Text Test : - After calling setLang method, Lang attribute value mismatch",
+                soap11FaultText.getLang().equals("en"));
+        OMAttribute langAttribute = (OMAttribute) soap11FaultText.getAllAttributes()
+                .next();
+        assertTrue(
+                "SOAP 1.1 Fault Text Test : - After calling setLang method, Lang attribute local name mismaatch",
+                langAttribute.getLocalName().equals(
+                        SOAP12Constants.SOAP_FAULT_TEXT_LANG_ATTR_LOCAL_NAME));
+        assertTrue(
+                "SOAP 1.1 Fault Text Test : - After calling setLang method, Lang attribute namespace prefix mismatch",
+                langAttribute.getNamespace().getPrefix().equals(
+                        SOAP12Constants.SOAP_FAULT_TEXT_LANG_ATTR_NS_PREFIX));
+        assertTrue(
+                "SOAP 1.1 Fault Text Test : - After calling setLang method, Lang attribute namespace uri mismatch",
+                langAttribute.getNamespace().getName().equals(
+                        SOAP12Constants.SOAP_FAULT_TEXT_LANG_ATTR_NS_URI));
+    }
+
+    public void testSOAP11GetLang() {
+
+
+        assertNull(
+                "SOAP 1.1 Fault Text Test : - After creating SOAPFaultText, it has a Lnag attribute",
+                soap11FaultText.getLang());
+
+        soap11FaultText.setLang("en");
+        assertTrue(
+                "SOAP 1.1 Fault Text Test : - After calling setLang method, Lang attribute value mismatch",
+                soap11FaultText.getLang().equals("en"));
+    }
+
+    public void testSOAP11SetText() {
+        soap11FaultText.setText("This is only a test");
+        assertTrue(
+                "SOAP 1.1 Fault Text Test : - After calling setText method, getText method return incorrect string",
+                soap11FaultText.getText().equals("This is only a test"));
+    }
+
+    public void testSOAP11GetText() {
+        assertTrue(
+                "SOAP 1.1 Fault Text Test : - After creating SOAPFaultText, it has a text",
+                soap11FaultText.getText().equals(""));
+        soap11FaultText.setText("This is only a test");
+        assertTrue(
+                "SOAP 1.1 Fault Text Test : - After calling setText method, getText method return incorrect string",
+                soap11FaultText.getText().equals("This is only a test"));
+    }
+
+    //SOAP 1.2 Fault Text Test (Programaticaly Created)
+    public void testSOAP12SetLang() {
+        soap12FaultText.setLang("en");
+        assertTrue(
+                "SOAP 1.2 Fault Text Test : - After calling setLang method, Lang attribute value mismatch",
+                soap12FaultText.getLang().equals("en"));
+        OMAttribute langAttribute = (OMAttribute) soap12FaultText.getAllAttributes()
+                .next();
+        assertTrue(
+                "SOAP 1.2 Fault Text Test : - After calling setLang method, Lang attribute local name mismaatch",
+                langAttribute.getLocalName().equals(
+                        SOAP12Constants.SOAP_FAULT_TEXT_LANG_ATTR_LOCAL_NAME));
+        assertTrue(
+                "SOAP 1.2 Fault Text Test : - After calling setLang method, Lang attribute namespace prefix mismatch",
+                langAttribute.getNamespace().getPrefix().equals(
+                        SOAP12Constants.SOAP_FAULT_TEXT_LANG_ATTR_NS_PREFIX));
+        assertTrue(
+                "SOAP 1.2 Fault Text Test : - After calling setLang method, Lang attribute namespace uri mismatch",
+                langAttribute.getNamespace().getName().equals(
+                        SOAP12Constants.SOAP_FAULT_TEXT_LANG_ATTR_NS_URI));
+    }
+
+    public void testSOAP12GetLang() {
+
+        assertNull(
+                "SOAP 1.2 Fault Text Test : - After creating SOAPFaultText, it has a Lnag attribute",
+                soap12FaultText.getLang());
+
+        soap12FaultText.setLang("en");
+        assertTrue(
+                "SOAP 1.2 Fault Text Test : - After calling setLang method, Lang attribute value mismatch",
+                soap12FaultText.getLang().equals("en"));
+    }
+
+    public void testSOAP12SetText() {
+        soap12FaultText.setText("This is only a test");
+        assertTrue(
+                "SOAP 1.2 Fault Text Test : - After calling setText method, getText method return incorrect string",
+                soap12FaultText.getText().equals("This is only a test"));
+    }
+
+    public void testSOAP12GetText() {
+        assertTrue(
+                "SOAP 1.2 Fault Text Test : - After creating SOAPFaultText, it has a text",
+                soap12FaultText.getText().equals(""));
+        soap12FaultText.setText("This is only a test");
+        assertTrue(
+                "SOAP 1.2 Fault Text Test : - After calling setText method, getText method return incorrect string",
+                soap12FaultText.getText().equals("This is only a test"));
+    }
+
+    //SOAP 1.1 Fault Text Test (With Parser)
+    public void testSOAP11GetTextWithParser() {
+        assertTrue(
+                "SOAP 1.1 Fault Text Test With Parser : - getText method returns incorrect string",
+                soap11FaultTextWithParser.getText().trim().equals("Sender Timeout"));
+    }
+
+    //SOAP 1.2 Fault Text Test (With Parser)
+    public void testSOAP12GetLangWithParser() {
+        assertTrue(
+                "SOAP 1.2 Fault Text Test With Parser : - getLang method returns incorrect string",
+                soap12FaultTextWithParser.getLang().equals("en"));
+        OMAttribute langAttribute = (OMAttribute) soap12FaultTextWithParser.getAllAttributes()
+                .next();
+        assertTrue(
+                "SOAP 1.2 Fault Text Test With Parser : - Lang attribute local name mismaatch",
+                langAttribute.getLocalName().equals(
+                        SOAP12Constants.SOAP_FAULT_TEXT_LANG_ATTR_LOCAL_NAME));
+        assertTrue(
+                "SOAP 1.2 Fault Text Test With Parser : - Lang attribute namespace prefix mismatch",
+                langAttribute.getNamespace().getPrefix().equals(
+                        SOAP12Constants.SOAP_FAULT_TEXT_LANG_ATTR_NS_PREFIX));
+        assertTrue(
+                "SOAP 1.2 Fault Text Test With Parser : - Lang attribute namespace uri mismatch",
+                langAttribute.getNamespace().getName().equals(
+                        SOAP12Constants.SOAP_FAULT_TEXT_LANG_ATTR_NS_URI));
+    }
+
+    public void testSOAP12GetTextWithParser() {
+    	
+        assertTrue(
+                "SOAP 1.2 Fault Text Test With Parser : - getText method returns incorrect string",
+                soap12FaultTextWithParser.getText().equals("Sender Timeout"));
+        													
+    }
+}
diff --git a/test/org/apache/ws/commons/soap/SOAPFaultValueTest.java b/test/org/apache/ws/commons/soap/SOAPFaultValueTest.java
new file mode 100644
index 0000000..009f080
--- /dev/null
+++ b/test/org/apache/ws/commons/soap/SOAPFaultValueTest.java
@@ -0,0 +1,118 @@
+/*
+ * Copyright 2004,2005 The Apache Software Foundation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      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.
+ */
+
+package org.apache.ws.commons.soap;
+
+public class SOAPFaultValueTest extends SOAPFaultSubCodeTestCase {
+
+    public SOAPFaultValueTest(String testName) {
+        super(testName);
+    }
+
+    protected void setUp() throws Exception {
+        super.setUp();
+        soap12FaultValueInFaultSubCode =
+                soap12Factory.createSOAPFaultValue(soap12FaultSubCodeInCode);
+    }
+
+    //SOAP 1.1 Fault Value Test (Programaticaly Created)
+    public void testSOAP11setText() {
+        soap11FaultValue.setText("This is only Test");
+        assertTrue("SOAP 1.1 Fault Value Test : - value text mismatch",
+                soap11FaultValue.getText().equals("This is only Test"));
+    }
+
+    public void testSOAP11GetText() {
+        assertTrue(
+                "SOAP 1.1 Fault Value Test : - After creating Fault Value, it has a text",
+                soap11FaultValue.getText().equals(""));
+        soap11FaultValue.setText("This is only Test");
+        assertFalse(
+                "SOAP 1.1 Fault Value Test : - After calling setText method, getText method returns null",
+                soap11FaultValue.getText().equals(""));
+        assertTrue("SOAP 1.1 Fault Value Test : - value text mismatch",
+                soap11FaultValue.getText().equals("This is only Test"));
+    }
+
+    //SOAP 1.2 Fault Value(In Fault Code) Test (Programaticaly Created)
+    public void testSOAP12setTextInFaultCode() {
+        soap12FaultValueInFaultCode.setText("This is only Test");
+        assertTrue(
+                "SOAP 1.2 Fault Value Test in Fault Code : - value text mismatch",
+                soap12FaultValueInFaultCode.getText().equals(
+                        "This is only Test"));
+    }
+
+    public void testSOAP12GetTextInFaultCode() {
+        assertTrue(
+                "SOAP 1.2 Fault Value Test in Fault Code : - After creating Fault Value, it has a text",
+                soap12FaultValueInFaultCode.getText().equals(""));
+        soap12FaultValueInFaultCode.setText("This is only Test");
+        assertFalse(
+                "SOAP 1.2 Fault Value Test in Fault Code : - After calling setText method, getText method returns null",
+                soap12FaultValueInFaultCode.getText().equals(""));
+        assertTrue(
+                "SOAP 1.2 Fault Value Test in Fault Code : - value text mismatch",
+                soap12FaultValueInFaultCode.getText().equals(
+                        "This is only Test"));
+    }
+
+    //SOAP 1.2 Fault Value(In Fault SubCode) Test (Programaticaly Created)
+    public void testSOAP12setTextInFaultSubCode() {
+        soap12FaultValueInFaultSubCode.setText("This is only Test");
+        assertTrue(
+                "SOAP 1.2 Fault Value Test in Fault SubCode : - value text mismatch",
+                soap12FaultValueInFaultSubCode.getText().equals(
+                        "This is only Test"));
+    }
+
+    public void testSOAP12GetTextInFaultSubCode() {
+        assertTrue(
+                "SOAP 1.2 Fault Value Test in Fault SubCode : - After creating Fault Value, it has a text",
+                soap12FaultValueInFaultSubCode.getText().equals(""));
+        soap12FaultValueInFaultSubCode.setText("This is only Test");
+        assertFalse(
+                "SOAP 1.2 Fault Value Test in Fault SubCode : - After calling setText method, getText method returns null",
+                soap12FaultValueInFaultSubCode.getText().equals(""));
+        assertTrue(
+                "SOAP 1.2 Fault Value Test in Fault SubCode : - value text mismatch",
+                soap12FaultValueInFaultSubCode.getText().equals(
+                        "This is only Test"));
+    }
+
+    //SOAP 1.1 Fault Value Test (With Parser)
+    public void testSOAP11GetTextWithParser() {
+        assertTrue(
+                "SOAP 1.1 Fault Value Test with parser : - value text mismatch",
+                soap11FaultValueWithParser.getText().trim().equals("env:Sender"));
+    }
+
+    //SOAP 1.2 Fault Value(In Fault Code) Test (With Parser)
+    public void testSOAP12setTextWithParserInFaultCode() {
+        assertTrue(
+                "SOAP 1.2 Fault Value Test with parser in Fault Code : - value text mismatch",
+                soap12FaultValueInFaultCodeWithParser.getText().equals(
+                        "env:Sender"));
+    }
+
+    //SOAP 1.2 Fault Value(In Fault SubCode) Test (With Parser)
+    public void testSOAP12setTextWithParserInFaultSubCode() {
+        assertTrue(
+                "SOAP 1.2 Fault Value Test with parser in Fault SubCode : - value text mismatch",
+                soap12FaultValueInFaultSubCodeWithParser.getText().equals(
+                        "m:MessageTimeout In First Subcode"));
+    }
+}
diff --git a/test/org/apache/ws/commons/soap/SOAPHeaderBlockTest.java b/test/org/apache/ws/commons/soap/SOAPHeaderBlockTest.java
new file mode 100644
index 0000000..aba3b7f
--- /dev/null
+++ b/test/org/apache/ws/commons/soap/SOAPHeaderBlockTest.java
@@ -0,0 +1,238 @@
+/*
+ * Copyright 2004,2005 The Apache Software Foundation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      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.
+ */
+
+package org.apache.ws.commons.soap;
+
+import java.util.Iterator;
+
+public class SOAPHeaderBlockTest extends SOAPHeaderTestCase {
+    protected SOAPHeaderBlock soap11HeaderBlock;
+    protected SOAPHeaderBlock soap12HeaderBlock;
+    protected SOAPHeaderBlock soap11HeaderBlock1WithParser;
+    protected SOAPHeaderBlock soap12HeaderBlock1WithParser;
+    protected SOAPHeaderBlock soap11HeaderBlock2WithParser;
+    protected SOAPHeaderBlock soap12HeaderBlock2WithParser;
+    protected SOAPHeaderBlock soap11HeaderBlock3WithParser;
+    protected SOAPHeaderBlock soap12HeaderBlock3WithParser;
+
+    public SOAPHeaderBlockTest(String testName) {
+        super(testName);
+    }
+
+    protected void setUp() throws Exception {
+        super.setUp();
+        soap11HeaderBlock =
+                soap11Factory.createSOAPHeaderBlock("testHeaderBlock",
+                        namespace,
+                        soap11Header);
+        soap12HeaderBlock =
+                soap12Factory.createSOAPHeaderBlock("testHeaderBlock",
+                        namespace,
+                        soap12Header);
+        Iterator iterator = soap11HeaderWithParser.examineAllHeaderBlocks();
+        iterator.next();
+        soap11HeaderBlock1WithParser = (SOAPHeaderBlock) iterator.next();
+        iterator.next();
+        soap11HeaderBlock2WithParser = (SOAPHeaderBlock) iterator.next();
+        iterator.next();
+        soap11HeaderBlock3WithParser = (SOAPHeaderBlock) iterator.next();
+
+        iterator = soap12HeaderWithParser.examineAllHeaderBlocks();
+        iterator.next();
+        soap12HeaderBlock1WithParser = (SOAPHeaderBlock) iterator.next();
+        iterator.next();
+        soap12HeaderBlock2WithParser = (SOAPHeaderBlock) iterator.next();
+        iterator.next();
+        soap12HeaderBlock3WithParser = (SOAPHeaderBlock) iterator.next();
+    }
+
+    //SOAP 1.1 SOAPHeaderBlock Test (Programaticaly Created)
+    public void testSOAP11SetRole() {
+        soap11HeaderBlock.setRole(
+                "http://schemas.xmlsoap.org/soap/envelope/actor/next");
+        assertTrue(
+                "SOAP 1.1 HeaderBlock Test : - After calling setRole method, getRole method returns incorrect role value",
+                soap11HeaderBlock.getRole().equals(
+                        "http://schemas.xmlsoap.org/soap/envelope/actor/next"));
+        try {
+            soap11HeaderBlock.setRole("Any Value");
+        } catch (Exception e) {
+            fail(
+                    "SOAP 1.1 HeaderBlock Test : - role value can not be set to any value");
+        }
+    }
+
+    public void testSOAP11GetRole() {
+        assertTrue(
+                "SOAP 1.1 HeaderBlock Test : - After creating SOAPHeaderBlock, it has a role",
+                soap11HeaderBlock.getRole() == null);
+        soap11HeaderBlock.setRole(
+                "http://schemas.xmlsoap.org/soap/envelope/actor/next");
+        assertTrue(
+                "SOAP 1.1 HeaderBlock Test : - After calling setRole method, getRole method returns incorrect role value",
+                soap11HeaderBlock.getRole().equals(
+                        "http://schemas.xmlsoap.org/soap/envelope/actor/next"));
+    }
+
+    public void testSOAP11SetMustUnderstand() {
+        soap11HeaderBlock.setMustUnderstand(true);
+        assertTrue(
+                "SOAP 1.1 HeaderBlock Test : - After setting MustUnderstand true calling setMustUnderstand method , getMustUnderstand method returns false",
+                soap11HeaderBlock.getMustUnderstand());
+        soap11HeaderBlock.setMustUnderstand(false);
+        assertFalse(
+                "SOAP 1.1 HeaderBlock Test : - After setting MustUnderstand false calling setMustUnderstand method , getMustUnderstand method returns true",
+                soap11HeaderBlock.getMustUnderstand());
+        soap11HeaderBlock.setMustUnderstand("1");
+        assertTrue(
+                "SOAP 1.1 HeaderBlock Test : - After setting MustUnderstand \"1\" calling setMustUnderstand method , getMustUnderstand method returns false",
+                soap11HeaderBlock.getMustUnderstand());
+        soap11HeaderBlock.setMustUnderstand("0");
+        assertFalse(
+                "SOAP 1.1 HeaderBlock Test : - After setting MustUnderstand \"0\" calling setMustUnderstand method , getMustUnderstand method returns true",
+                soap11HeaderBlock.getMustUnderstand());
+        try {
+            soap11HeaderBlock.setMustUnderstand("true");
+        } catch (Exception e) {
+            fail(
+                    "SOAP 1.1 HeaderBlock Test : - MustUnderstatnd value can not be set to any value rather than 1 or 0");
+        }
+    }
+
+    public void testSOAP11GetMustUnderstand() {
+        assertFalse(
+                "SOAP 1.1 HeaderBlock Test : - After creating SOAPHeaderBlock, default MustUnderstand value true",
+                soap11HeaderBlock.getMustUnderstand());
+        soap11HeaderBlock.setMustUnderstand(true);
+        assertTrue(
+                "SOAP 1.1 HeaderBlock Test : - After setting MustUnderstand true calling setMustUnderstand method , getMustUnderstand method returns false",
+                soap11HeaderBlock.getMustUnderstand());
+    }
+
+    //SOAP 1.2 SOAPHeaderBlock Test (Programaticaly Created)
+    public void testSOAP12SetRole() {
+        soap12HeaderBlock.setRole(
+                "http://www.w3.org/2003/05/soap-envelope/role/ultimateReceiver");
+        assertTrue(
+                "SOAP 1.2 HeaderBlock Test : - After calling setRole method, getRole method returns incorrect role value",
+                soap12HeaderBlock.getRole().equals(
+                        "http://www.w3.org/2003/05/soap-envelope/role/ultimateReceiver"));
+        try {
+            soap12HeaderBlock.setRole("Any Value");
+        } catch (Exception e) {
+            fail(
+                    "SOAP 1.2 HeaderBlock Test : - role value can not be set to any value");
+        }
+    }
+
+    public void testSOAP12GetRole() {
+        assertTrue(
+                "SOAP 1.2 HeaderBlock Test : - After creating SOAPHeaderBlock, it has a role",
+                soap12HeaderBlock.getRole() == null);
+        soap12HeaderBlock.setRole(
+                "http://www.w3.org/2003/05/soap-envelope/role/ultimateReceiver");
+        assertTrue(
+                "SOAP 1.2 HeaderBlock Test : - After calling setRole method, getRole method returns incorrect role value",
+                soap12HeaderBlock.getRole().equals(
+                        "http://www.w3.org/2003/05/soap-envelope/role/ultimateReceiver"));
+    }
+
+    public void testSOAP12SetMustUnderstand() {
+        soap12HeaderBlock.setMustUnderstand(true);
+        assertTrue(
+                "SOAP 1.2 HeaderBlock Test : - After setting MustUnderstand true calling setMustUnderstand method , getMustUnderstand method returns false",
+                soap12HeaderBlock.getMustUnderstand());
+        soap12HeaderBlock.setMustUnderstand(false);
+        assertFalse(
+                "SOAP 1.2 HeaderBlock Test : - After setting MustUnderstand false calling setMustUnderstand method , getMustUnderstand method returns true",
+                soap12HeaderBlock.getMustUnderstand());
+        soap12HeaderBlock.setMustUnderstand("true");
+        assertTrue(
+                "SOAP 1.2 HeaderBlock Test : - After setting MustUnderstand \"true\" calling setMustUnderstand method , getMustUnderstand method returns false",
+                soap12HeaderBlock.getMustUnderstand());
+        soap12HeaderBlock.setMustUnderstand("false");
+        assertFalse(
+                "SOAP 1.2 HeaderBlock Test : - After setting MustUnderstand \"false\" calling setMustUnderstand method , getMustUnderstand method returns true",
+                soap12HeaderBlock.getMustUnderstand());
+        soap12HeaderBlock.setMustUnderstand("1");
+        assertTrue(
+                "SOAP 1.2 HeaderBlock Test : - After setting MustUnderstand \"1\" calling setMustUnderstand method , getMustUnderstand method returns false",
+                soap12HeaderBlock.getMustUnderstand());
+        soap12HeaderBlock.setMustUnderstand("0");
+        assertFalse(
+                "SOAP 1.2 HeaderBlock Test : - After setting MustUnderstand \"0\" calling setMustUnderstand method , getMustUnderstand method returns true",
+                soap12HeaderBlock.getMustUnderstand());
+        try {
+            soap12HeaderBlock.setMustUnderstand("otherValue");
+            fail(
+                    "SOAP 1.2 HeaderBlock Test : - MustUnderstatnd value can not be set to any value rather than 1 , 0 , true , false");
+
+        } catch (Exception e) {
+            assertTrue(true);
+        }
+    }
+
+    public void testSOAP12GetMustUnderstand() {
+        assertFalse(
+                "SOAP 1.2 HeaderBlock Test : - After creating SOAPHeaderBlock, default MustUnderstand value true",
+                soap12HeaderBlock.getMustUnderstand());
+        soap12HeaderBlock.setMustUnderstand(true);
+        assertTrue(
+                "SOAP 1.2 HeaderBlock Test : - After setting MustUnderstand true calling setMustUnderstand method , getMustUnderstand method returns false",
+                soap12HeaderBlock.getMustUnderstand());
+    }
+
+    //SOAP 1.1 SOAPHeaderBlock Test (With Parser)
+    public void testSOAP11GetRoleWithParser() {
+        assertTrue(
+                "SOAP 1.1 HeaderBlock Test Wiht Parser : - getRole method returns incorrect role value",
+                soap11HeaderBlock1WithParser.getRole().equals(
+                        "http://schemas.xmlsoap.org/soap/actor/next"));
+    }
+
+    public void testSOAP11GetMustUnderstandWithParser() {
+        assertTrue(
+                "SOAP 1.1 HeaderBlock Test Wiht Parser : - getMustUnderstatnd method returns incorrect value",
+                soap11HeaderBlock2WithParser.getMustUnderstand());
+        assertFalse(
+                "SOAP 1.1 HeaderBlock Test Wiht Parser : - getMustUnderstatnd method returns incorrect value",
+                soap11HeaderBlock3WithParser.getMustUnderstand());
+
+    }
+
+    //SOAP 1.2 SOAPHeaderBlock Test (With Parser)
+    public void testSOAP12GetRoleWithParser() {
+        assertTrue(
+                "SOAP 1.2 HeaderBlock Test Wiht Parser : - getRole method returns incorrect role value",
+                soap12HeaderBlock1WithParser.getRole().equals(
+                        "http://www.w3.org/2003/05/soap-envelope/role/ultimateReceiver"));
+    }
+
+    public void testSOAP12GetMustUnderstandWithParser() {
+        assertTrue(
+                "SOAP 1.2 HeaderBlock Test Wiht Parser : - getMustUnderstatnd method returns incorrect value",
+                soap12HeaderBlock1WithParser.getMustUnderstand());
+        assertFalse(
+                "SOAP 1.2 HeaderBlock Test Wiht Parser : - getMustUnderstatnd method returns incorrect value",
+                soap12HeaderBlock2WithParser.getMustUnderstand());
+        try {
+            soap12HeaderBlock3WithParser.getMustUnderstand();
+        } catch (Exception e) {
+            fail(
+                    "SOAP 1.2 HeaderBlock Test Wiht Parser : - getMustUnderstatnd method should returns exception when mustunderstand value is incorrect");
+        }
+    }
+}
diff --git a/test/org/apache/ws/commons/soap/SOAPHeaderTest.java b/test/org/apache/ws/commons/soap/SOAPHeaderTest.java
new file mode 100644
index 0000000..52d610c
--- /dev/null
+++ b/test/org/apache/ws/commons/soap/SOAPHeaderTest.java
@@ -0,0 +1,465 @@
+/*
+ * Copyright 2004,2005 The Apache Software Foundation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      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.
+ */
+
+package org.apache.ws.commons.soap;
+
+import java.util.ArrayList;
+import java.util.Iterator;
+
+public class SOAPHeaderTest extends SOAPHeaderTestCase {
+    protected boolean isThereException;
+
+    public SOAPHeaderTest(String testName) {
+        super(testName);
+    }
+
+    protected void setUp() throws Exception {
+        super.setUp();
+    }
+
+    //SOAP 1.1 Header Test (Programaticaly Created)--------------------------------------------------------------------------------
+    public void testSOAP11AddHeadearBlock() {
+        soap11Header.addHeaderBlock("echoOk1", namespace);
+        soap11Header.addHeaderBlock("echoOk2", namespace);
+        Iterator iterator = soap11Header.getChildren();
+        SOAPHeaderBlock headerBlock1 = (SOAPHeaderBlock) iterator.next();
+        assertFalse(
+                "SOAP 1.1 Header Test : - After calling addHeaderBlock method twice, getChildren method returns empty iterator",
+                headerBlock1 == null);
+        assertTrue("SOAP 1.1 Header Test : - HeaderBlock1 local name mismatch",
+                headerBlock1.getLocalName().equals("echoOk1"));
+        assertTrue(
+                "SOAP 1.1 Header Test : - HeaderBlock1 namespace uri mismatch",
+                headerBlock1.getNamespace().getName().equals(
+                        "http://www.example.org"));
+
+        SOAPHeaderBlock headerBlock2 = (SOAPHeaderBlock) iterator.next();
+        assertFalse(
+                "SOAP 1.1 Header Test : - After calling addHeaderBlock method twice, getChildren method returns an iterator with only one object",
+                headerBlock2 == null);
+        assertTrue("SOAP 1.1 Header Test : - HeaderBlock2 local name mismatch",
+                headerBlock2.getLocalName().equals("echoOk2"));
+        assertTrue(
+                "SOAP 1.1 Header Test : - HeaderBlock2 namespace uri mismatch",
+                headerBlock2.getNamespace().getName().equals(
+                        "http://www.example.org"));
+
+        assertTrue(
+                "SOAP 1.1 Header Test : - After calling addHeaderBlock method twice, getChildren method returns an iterator with more than two object",
+                iterator.next() == null);
+    }
+
+    public void testSOAP11ExamineHeaderBlocks() {
+        soap11Header.addHeaderBlock("echoOk1", namespace).setRole(
+                "http://schemas.xmlsoap.org/soap/envelope/actor/ultimateReceiver");
+        soap11Header.addHeaderBlock("echoOk2", namespace).setRole(
+                "http://schemas.xmlsoap.org/soap/envelope/actor/next");
+        Iterator iterator = soap11Header.examineHeaderBlocks(
+                "http://schemas.xmlsoap.org/soap/envelope/actor/next");
+        iterator.hasNext();
+        SOAPHeaderBlock headerBlockWithRole1 = (SOAPHeaderBlock) iterator.next();
+        assertTrue(
+                "SOAP 1.1 Header Test : - headerBlockWithRole local name mismatch",
+                headerBlockWithRole1.getLocalName().equals("echoOk2"));
+        assertTrue(
+                "SOAP 1.1 Header Test : - headerBlockWithRole role value mismatch",
+                headerBlockWithRole1.getRole().equals(
+                        "http://schemas.xmlsoap.org/soap/envelope/actor/next"));
+
+
+        assertFalse(
+                "SOAP 1.1 Header Test : - header has three headerBlocks with the given role, but examineHeaderBlocks(String role) method returns an iterator with more than three objects",
+                iterator.hasNext());
+    }
+
+//    public void testSOAP11ExtractHeaderBlocks() {
+
+//    }
+
+
+
+    public void testSOAP11ExamineAllHeaderBlocks() {
+        soap11Header.addHeaderBlock("echoOk1", namespace);
+        soap11Header.addHeaderBlock("echoOk2", namespace);
+        Iterator iterator = soap11Header.examineAllHeaderBlocks();
+        iterator.hasNext();
+        SOAPHeaderBlock headerBlock1 = (SOAPHeaderBlock) iterator.next();
+        assertFalse(
+                "SOAP 1.1 Header Test : - After calling addHeaderBlock method twice, examineAllHeaderBlocks method returns empty iterator",
+                headerBlock1 == null);
+        assertTrue("SOAP 1.1 Header Test : - HeaderBlock1 local name mismatch",
+                headerBlock1.getLocalName().equals("echoOk1"));
+        assertTrue(
+                "SOAP 1.1 Header Test : - HeaderBlock1 namespace uri mismatch",
+                headerBlock1.getNamespace().getName().equals(
+                        "http://www.example.org"));
+
+        iterator.hasNext();
+        SOAPHeaderBlock headerBlock2 = (SOAPHeaderBlock) iterator.next();
+        assertFalse(
+                "SOAP 1.1 Header Test : - After calling addHeaderBlock method twice, examineAllHeaderBlocks method returns an iterator with only one object",
+                headerBlock2 == null);
+        assertTrue("SOAP 1.1 Header Test : - HeaderBlock2 local name mismatch",
+                headerBlock2.getLocalName().equals("echoOk2"));
+        assertTrue(
+                "SOAP 1.1 Header Test : - HeaderBlock2 namespace uri mismatch",
+                headerBlock2.getNamespace().getName().equals(
+                        "http://www.example.org"));
+
+        assertFalse(
+                "SOAP 1.1 Header Test : - After calling addHeaderBlock method twice, examineAllHeaderBlocks method returns an iterator with more than two object",
+                iterator.hasNext());
+
+    }
+
+//    public void testSOAP11ExtractAllHeaderBlocks() {
+//
+//    }
+
+
+    public void testSOAP11getHeaderBlocksWithNSURI() {
+        soap11Header.addHeaderBlock("echoOk1", namespace);
+        soap11Header.addHeaderBlock("echoOk2",
+                omFactory.createOMNamespace("http://www.test1.org", "test1"));
+        ArrayList arrayList = soap11Header.getHeaderBlocksWithNSURI(
+                "http://www.test1.org");
+        assertTrue(
+                "SOAP 1.1 Header Test : - getHeaderBlocksWithNSURI returns an arrayList of incorrect size",
+                arrayList.size() == 1);
+        assertTrue(
+                "SOAP 1.1 Header Test : - headerBlock of given namespace uri mismatch",
+                ((SOAPHeaderBlock) arrayList.get(0)).getNamespace().getName()
+                .equals("http://www.test1.org"));
+    }
+
+    //SOAP 1.2 Header Test (Programaticaly Created)----------------------------------------------------------------------------------
+    public void testSOAP12AddHeadearBlock() {
+        soap12Header.addHeaderBlock("echoOk1", namespace);
+        soap12Header.addHeaderBlock("echoOk2", namespace);
+        Iterator iterator = soap12Header.getChildren();
+        SOAPHeaderBlock headerBlock1 = (SOAPHeaderBlock) iterator.next();
+        assertFalse(
+                "SOAP 1.2 Header Test : - After calling addHeaderBlock method, getChildren method returns empty iterator",
+                headerBlock1 == null);
+        assertTrue("SOAP 1.2 Header Test : - HeaderBlock1 local name mismatch",
+                headerBlock1.getLocalName().equals("echoOk1"));
+        assertTrue(
+                "SOAP 1.2 Header Test : - HeaderBlock1 namespace uri mismatch",
+                headerBlock1.getNamespace().getName().equals(
+                        "http://www.example.org"));
+
+        SOAPHeaderBlock headerBlock2 = (SOAPHeaderBlock) iterator.next();
+        assertFalse(
+                "SOAP 1.2 Header Test : - After calling addHeaderBlock method, getChildren method returns an iterator with only one object",
+                headerBlock2 == null);
+        assertTrue("SOAP 1.2 Header Test : - HeaderBlock2 local name mismatch",
+                headerBlock2.getLocalName().equals("echoOk2"));
+        assertTrue(
+                "SOAP 1.2 Header Test : - HeaderBlock2 namespace uri mismatch",
+                headerBlock2.getNamespace().getName().equals(
+                        "http://www.example.org"));
+
+        assertTrue(
+                "SOAP 1.2 Header Test : - After calling addHeaderBlock method twice, getChildren method returns an iterator with more than two elements",
+                iterator.next() == null);
+    }
+
+    public void testSOAP12ExamineHeaderBlocks() {
+        soap12Header.addHeaderBlock("echoOk1", namespace);
+        soap12Header.addHeaderBlock("echoOk2", namespace).setRole(
+                "http://schemas.xmlsoap.org/soap/envelope/actor/ultimateReceiver");
+        Iterator iterator = soap12Header.examineHeaderBlocks(
+                "http://schemas.xmlsoap.org/soap/envelope/actor/ultimateReceiver");
+        iterator.hasNext();
+        SOAPHeaderBlock headerBlockWithRole = (SOAPHeaderBlock) iterator.next();
+        assertTrue(
+                "SOAP 1.2 Header Test : - headerBlockWithRole local name mismatch",
+                headerBlockWithRole.getLocalName().equals("echoOk2"));
+        assertTrue(
+                "SOAP 1.2 Header Test : - headerBlockWithRole role value mismatch",
+                headerBlockWithRole.getRole().equals(
+                        "http://schemas.xmlsoap.org/soap/envelope/actor/ultimateReceiver"));
+
+        assertFalse(
+                "SOAP 1.2 Header Test : - header has one headerBlock with role, but examineHeaderBlocks(String role) method returns an iterator with more than one object",
+                iterator.hasNext());
+
+    }
+
+
+    public void testSOAP12ExamineMustUnderstandHeaderBlocks() {
+        soap12Header.addHeaderBlock("echoOk1", namespace).setRole(
+                "http://www.w3.org/2003/05/soap-envelope/role/ultimateReceiver");
+
+        SOAPHeaderBlock headerBlock1 = soap12Header.addHeaderBlock("echoOk2",
+                namespace);
+        headerBlock1.setRole(
+                "http://www.w3.org/2003/05/soap-envelope/role/ultimateReceiver");
+        headerBlock1.setMustUnderstand(true);
+
+        soap12Header.addHeaderBlock("echoOk3", namespace).setMustUnderstand(
+                true);
+
+        Iterator iterator = soap12Header.examineMustUnderstandHeaderBlocks(
+                "http://www.w3.org/2003/05/soap-envelope/role/ultimateReceiver");
+        iterator.hasNext();
+        SOAPHeaderBlock headerBlock = (SOAPHeaderBlock) iterator.next();
+        assertFalse(
+                "SOAP 1.2 Header Test : - examineMustUnderstandHeaderBlocks method returns empty iterator",
+                headerBlock == null);
+        assertTrue("SOAP 1.2 Header Test : - HeaderBlock local name mismatch",
+                headerBlock.getLocalName().equals("echoOk2"));
+        assertTrue("SOAP 1.2 Header Test : - HeaderBlock role value mismatch",
+                headerBlock.getRole().equals(
+                        "http://www.w3.org/2003/05/soap-envelope/role/ultimateReceiver"));
+        assertFalse(
+                "SOAP 1.2 Header Test : - examineMustUnderstandHeaderBlocks method returns an iterator with more than one object",
+                iterator.hasNext());
+    }
+
+    public void testSOAP12ExamineAllHeaderBlocks() {
+        soap12Header.addHeaderBlock("echoOk1", namespace);
+        soap12Header.addHeaderBlock("echoOk2", namespace);
+        Iterator iterator = soap12Header.examineAllHeaderBlocks();
+        iterator.hasNext();
+        SOAPHeaderBlock headerBlock1 = (SOAPHeaderBlock) iterator.next();
+        assertFalse(
+                "SOAP 1.2 Header Test : - After calling addHeaderBlock method twice, examineAllHeaderBlocks method returns empty iterator",
+                headerBlock1 == null);
+        assertTrue("SOAP 1.2 Header Test : - HeaderBlock1 local name mismatch",
+                headerBlock1.getLocalName().equals("echoOk1"));
+        assertTrue(
+                "SOAP 1.2 Header Test : - HeaderBlock1 namespace uri mismatch",
+                headerBlock1.getNamespace().getName().equals(
+                        "http://www.example.org"));
+
+        SOAPHeaderBlock headerBlock2 = (SOAPHeaderBlock) iterator.next();
+        assertFalse(
+                "SOAP 1.2 Header Test : - After calling addHeaderBlock method twice, examineAllHeaderBlocks method returns an iterator with only one object",
+                headerBlock2 == null);
+        assertTrue("SOAP 1.2 Header Test : - HeaderBlock2 local name mismatch",
+                headerBlock2.getLocalName().equals("echoOk2"));
+        assertTrue(
+                "SOAP 1.2 Header Test : - HeaderBlock2 namespace uri mismatch",
+                headerBlock2.getNamespace().getName().equals(
+                        "http://www.example.org"));
+
+        assertFalse(
+                "SOAP 1.2 Header Test : - After calling addHeaderBlock method twice, examineAllHeaderBlocks method returns an iterator with more than two object",
+                iterator.hasNext());
+    }
+//    public void testSOAP12ExtractAllHeaderBlocks() {
+//
+//    }
+
+    public void testSOAP12getHeaderBlocksWithNSURI() {
+        soap12Header.addHeaderBlock("echoOk1", namespace);
+        soap12Header.addHeaderBlock("echoOk2",
+                omFactory.createOMNamespace("http://www.test1.org", "test1"));
+        ArrayList arrayList = soap12Header.getHeaderBlocksWithNSURI(
+                "http://www.test1.org");
+        assertTrue(
+                "SOAP 1.2 Header Test : - getHeaderBlocksWithNSURI returns an arrayList of incorrect size",
+                arrayList.size() == 1);
+        assertTrue(
+                "SOAP 1.2 Header Test : - headerBlock of given namespace uri, mismatch",
+                ((SOAPHeaderBlock) arrayList.get(0)).getNamespace().getName()
+                .equals("http://www.test1.org"));
+    }
+
+    //SOAP 1.1 Header Test (With Parser)---------------------------------------------------------------------------------------------
+    public void testSOAP11ExamineHeaderBlocksWithParser() {
+        Iterator iterator = soap11HeaderWithParser.examineHeaderBlocks(
+                "http://schemas.xmlsoap.org/soap/actor/next");
+        iterator.hasNext();
+        SOAPHeaderBlock headerBlock1 = (SOAPHeaderBlock) iterator.next();
+        assertEquals(
+                "SOAP 1.1 Header Test With Parser : - headerBlock1 localname mismatch",
+                headerBlock1.getLocalName(),
+                "From");
+        assertTrue(
+                "SOAP 1.1 Header Test With Parser : - headerBlock1 role value mismatch",
+                headerBlock1.getRole().equals(
+                        "http://schemas.xmlsoap.org/soap/actor/next"));
+        iterator.hasNext();
+        SOAPHeaderBlock headerBlock2 = (SOAPHeaderBlock) iterator.next();
+        assertTrue(
+                "SOAP 1.1 Header Test With Parser : - headerBlock2 localname mmismatch",
+                headerBlock2.getLocalName().equals("MessageID"));
+        assertTrue(
+                "SOAP 1.1 Header Test With Parser : - headerBlock2 role value mmismatch",
+                headerBlock2.getRole().equals(
+                        "http://schemas.xmlsoap.org/soap/actor/next"));
+
+        assertFalse(
+                "SOAP 1.1 Header Test With Parser : - examineHeaderBlocks(String role) method returns an iterator with more than two objects",
+                iterator.hasNext());
+    }
+
+    public void testSOAP11ExamineMustUnderstandHeaderBlocksWithParser() {
+        Iterator iterator = soap11HeaderWithParser.examineMustUnderstandHeaderBlocks(
+                "http://schemas.xmlsoap.org/soap/actor/next");
+        iterator.hasNext();
+        SOAPHeaderBlock headerBlock1 = (SOAPHeaderBlock) iterator.next();
+        assertTrue(
+                "SOAP 1.1 Header Test With Parser : - headerBlock1 localname mmismatch",
+                headerBlock1.getLocalName().equals("MessageID"));
+        assertTrue(
+                "SOAP 1.1 Header Test With Parser : - headerBlock1 role value mmismatch",
+                headerBlock1.getRole().equals(
+                        "http://schemas.xmlsoap.org/soap/actor/next"));
+
+        assertFalse(
+                "SOAP 1.1 Header Test With Parser : - examineMustUnderstandHeaderBlocks(String role) method returns an iterator with more than one objects",
+                iterator.hasNext());
+    }
+
+    public void testSOAP11ExamineAllHeaderBlocksWithParser() {
+        Iterator iterator = soap11HeaderWithParser.examineAllHeaderBlocks();
+        iterator.hasNext();
+        SOAPHeaderBlock headerBlock1 = (SOAPHeaderBlock) iterator.next();
+        assertTrue(
+                "SOAP 1.1 Header Test With Parser : - headerBlock1 localname mmismatch",
+                headerBlock1.getLocalName().equals("From"));
+        iterator.hasNext();
+        SOAPHeaderBlock headerBlock2 = (SOAPHeaderBlock) iterator.next();
+        assertTrue(
+                "SOAP 1.1 Header Test With Parser : - headerBlock1 localname mmismatch",
+                headerBlock2.getLocalName().equals("MessageID"));
+        iterator.hasNext();
+        SOAPHeaderBlock headerBlock3 = (SOAPHeaderBlock) iterator.next();
+        assertTrue(
+                "SOAP 1.1 Header Test With Parser : - headerBlock1 localname mmismatch",
+                headerBlock3.getLocalName().equals("To"));
+
+        assertFalse(
+                "SOAP 1.1 Header Test With Parser : - examineAllHeaderBlocks method returns an iterator with more than three objects",
+                iterator.hasNext());
+    }
+
+    public void testSOAP11getHeaderBlocksWithNSURIWithParser() {
+        ArrayList arrayList = soap11HeaderWithParser.getHeaderBlocksWithNSURI(
+                "http://example.org/ts-tests");
+        assertTrue(
+                "SOAP 1.1 Header Test With Parser : - getHeaderBlocksWithNSURI returns an arrayList of incorrect size",
+                arrayList.size() == 1);
+        assertTrue(
+                "SOAP 1.1 Header Test With Parser : - headerBlock of given namespace uri, local name mismatch",
+                ((SOAPHeaderBlock) arrayList.get(0)).getLocalName().equals(
+                        "MessageID"));
+        assertTrue(
+                "SOAP 1.1 Header Test With Parser : - headerBlock of given namespace uri, mismatch",
+                ((SOAPHeaderBlock) arrayList.get(0)).getNamespace().getName()
+                .equals("http://example.org/ts-tests"));
+    }
+
+    //SOAP 1.2 Header Test (With Parser)-------------------------------------------------------------------------------------------
+    public void testSOAP12ExamineHeaderBlocksWithParser() {
+        Iterator iterator = soap12HeaderWithParser.examineHeaderBlocks(
+                "http://www.w3.org/2003/05/soap-envelope/role/ultimateReceiver");
+        iterator.hasNext();
+        SOAPHeaderBlock headerBlock1 = (SOAPHeaderBlock) iterator.next();
+        assertTrue(
+                "SOAP 1.2 Header Test With Parser : - headerBlock1 localname mmismatch",
+                headerBlock1.getLocalName().equals("echoOk"));
+        assertTrue(
+                "SOAP 1.2 Header Test With Parser : - headerBlock1 role value mmismatch",
+                headerBlock1.getRole().equals(
+                        "http://www.w3.org/2003/05/soap-envelope/role/ultimateReceiver"));
+        iterator.hasNext();
+        SOAPHeaderBlock headerBlock2 = (SOAPHeaderBlock) iterator.next();
+        assertTrue(
+                "SOAP 1.2 Header Test With Parser : - headerBlock2 localname mmismatch",
+                headerBlock2.getLocalName().equals("echoOk2"));
+        assertTrue(
+                "SOAP 1.2 Header Test With Parser : - headerBlock2 role value mmismatch",
+                headerBlock2.getRole().equals(
+                        "http://www.w3.org/2003/05/soap-envelope/role/ultimateReceiver"));
+
+        assertFalse(
+                "SOAP 1.2 Header Test With Parser : - examineHeaderBlocks(String role) method returns an iterator with more than two objects",
+                iterator.hasNext());
+    }
+
+    public void testSOAP12ExamineMustUnderstandHeaderBlocksWithParser() {
+        Iterator iterator = soap12HeaderWithParser.examineMustUnderstandHeaderBlocks(
+                "http://www.w3.org/2003/05/soap-envelope/role/ultimateReceiver");
+        iterator.hasNext();
+        SOAPHeaderBlock headerBlock1 = (SOAPHeaderBlock) iterator.next();
+        assertEquals(
+                "SOAP 1.2 Header Test With Parser : - headerBlock localname mmismatch",
+                headerBlock1.getLocalName(),
+                "echoOk");
+        assertEquals(
+                "SOAP 1.2 Header Test With Parser : - headerBlock role value mmismatch",
+                headerBlock1.getRole(),
+                "http://www.w3.org/2003/05/soap-envelope/role/ultimateReceiver");
+
+        iterator.hasNext();
+        SOAPHeaderBlock headerBlock2 = (SOAPHeaderBlock) iterator.next();
+        assertEquals(
+                "SOAP 1.2 Header Test With Parser : - headerBlock localname mmismatch",
+                headerBlock2.getLocalName(),
+                "echoOk2");
+        assertEquals(
+                "SOAP 1.2 Header Test With Parser : - headerBlock role value mmismatch",
+                headerBlock1.getRole(),
+                "http://www.w3.org/2003/05/soap-envelope/role/ultimateReceiver");
+
+        assertFalse(
+                "SOAP 1.2 Header Test With Parser : - examineMustUnderstandHeaderBlocks(String role) method returns an iterator with more than one objects",
+                iterator.hasNext());
+    }
+
+    public void testSOAP12ExamineAllHeaderBlocksWithParser() {
+        Iterator iterator = soap12HeaderWithParser.examineAllHeaderBlocks();
+        iterator.next();
+        SOAPHeaderBlock headerBlock1 = (SOAPHeaderBlock) iterator.next();
+        assertTrue(
+                "SOAP 1.2 Header Test With Parser : - headerBlock1 localname mmismatch",
+                headerBlock1.getLocalName().equals("echoOk"));
+        iterator.next();
+        SOAPHeaderBlock headerBlock2 = (SOAPHeaderBlock) iterator.next();
+        assertTrue(
+                "SOAP 1.2 Header Test With Parser : - headerBlock1 localname mmismatch",
+                headerBlock2.getLocalName().equals("echoOk1"));
+        iterator.next();
+        SOAPHeaderBlock headerBlock3 = (SOAPHeaderBlock) iterator.next();
+        assertTrue(
+                "SOAP 1.2 Header Test With Parser : - headerBlock1 localname mmismatch",
+                headerBlock3.getLocalName().equals("echoOk2"));
+
+        assertFalse(
+                "SOAP 1.2 Header Test With Parser : - examineAllHeaderBlocks method returns an iterator with more than three objects",
+                iterator.hasNext());
+    }
+
+    public void testSOAP12getHeaderBlocksWithNSURIWithParser() {
+        ArrayList arrayList = soap12HeaderWithParser.getHeaderBlocksWithNSURI(
+                "http://example.org/ts-tests");
+        assertTrue(
+                "SOAP 1.2 Header Test With Parser : - getHeaderBlocksWithNSURI returns an arrayList of incorrect size",
+                arrayList.size() == 1);
+        assertTrue(
+                "SOAP 1.2 Header Test With Parser : - headerBlock of given namespace uri, local name mismatch",
+                ((SOAPHeaderBlock) arrayList.get(0)).getLocalName().equals(
+                        "echoOk"));
+        assertTrue(
+                "SOAP 1.2 Header Test With Parser : - headerBlock of given namespace uri, mismatch",
+                ((SOAPHeaderBlock) arrayList.get(0)).getNamespace().getName()
+                .equals("http://example.org/ts-tests"));
+    }
+}
diff --git a/test/org/apache/ws/commons/soap/SOAPHeaderTestCase.java b/test/org/apache/ws/commons/soap/SOAPHeaderTestCase.java
new file mode 100644
index 0000000..1f86efb
--- /dev/null
+++ b/test/org/apache/ws/commons/soap/SOAPHeaderTestCase.java
@@ -0,0 +1,41 @@
+/*
+ * Copyright 2004,2005 The Apache Software Foundation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      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.
+ */
+
+package org.apache.ws.commons.soap;
+
+import org.apache.ws.commons.om.OMNamespace;
+
+public class SOAPHeaderTestCase extends SOAPTestCase {
+    protected SOAPHeader soap11Header;
+    protected SOAPHeader soap12Header;
+    protected SOAPHeader soap11HeaderWithParser;
+    protected SOAPHeader soap12HeaderWithParser;
+    protected OMNamespace namespace;
+
+    public SOAPHeaderTestCase(String testName) {
+        super(testName);
+        namespace =
+                omFactory.createOMNamespace("http://www.example.org", "test");
+    }
+
+    protected void setUp() throws Exception {
+        super.setUp();
+        soap11Header = soap11Factory.createSOAPHeader(soap11Envelope);
+        soap12Header = soap12Factory.createSOAPHeader(soap12Envelope);
+        soap11HeaderWithParser = soap11EnvelopeWithParser.getHeader();
+        soap12HeaderWithParser = soap12EnvelopeWithParser.getHeader();
+    }
+}
diff --git a/test/org/apache/ws/commons/soap/SOAPMessageTest.java b/test/org/apache/ws/commons/soap/SOAPMessageTest.java
new file mode 100644
index 0000000..192d596
--- /dev/null
+++ b/test/org/apache/ws/commons/soap/SOAPMessageTest.java
@@ -0,0 +1,38 @@
+/*
+ * Copyright 2004,2005 The Apache Software Foundation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      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.
+ */
+
+package org.apache.ws.commons.soap;
+
+import org.apache.ws.commons.om.OMTestCase;
+import org.apache.ws.commons.soap.impl.llom.builder.StAXSOAPModelBuilder;
+
+public class SOAPMessageTest extends OMTestCase {
+
+    public SOAPMessageTest(String testName) {
+        super(testName);
+    }
+
+    public void testSOAPMessageCreation(){
+        try {
+            StAXSOAPModelBuilder soapBuilder = getOMBuilder("");
+            SOAPMessage soapMessage = soapBuilder.getSoapMessage();
+            assertNotNull(soapMessage);
+            assertNotNull(soapMessage.getSOAPEnvelope());
+        } catch (Exception e) {
+            fail("Exception thrown "+ e);
+        }
+    }
+}
diff --git a/test/org/apache/ws/commons/soap/SOAPTestCase.java b/test/org/apache/ws/commons/soap/SOAPTestCase.java
new file mode 100644
index 0000000..41845f2
--- /dev/null
+++ b/test/org/apache/ws/commons/soap/SOAPTestCase.java
@@ -0,0 +1,84 @@
+/*
+ * Copyright 2004,2005 The Apache Software Foundation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      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.
+ */
+
+package org.apache.ws.commons.soap;
+
+import org.apache.ws.commons.om.AbstractTestCase;
+import org.apache.ws.commons.om.OMAbstractFactory;
+import org.apache.ws.commons.om.OMFactory;
+import org.apache.ws.commons.soap.impl.llom.builder.StAXSOAPModelBuilder;
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+
+import javax.xml.stream.XMLInputFactory;
+import javax.xml.stream.XMLStreamException;
+import javax.xml.stream.XMLStreamReader;
+import java.io.FileNotFoundException;
+import java.io.FileReader;
+
+public class SOAPTestCase extends AbstractTestCase {
+    protected SOAPFactory soap11Factory;
+    protected SOAPFactory soap12Factory;
+    protected OMFactory omFactory;
+
+    protected SOAPEnvelope soap11Envelope;
+    protected SOAPEnvelope soap12Envelope;
+
+    protected SOAPEnvelope soap11EnvelopeWithParser;
+    protected SOAPEnvelope soap12EnvelopeWithParser;
+
+    protected static final String SOAP11_FILE_NAME = "soap/soap11/soap11message.xml";
+    protected static final String SOAP12_FILE_NAME = "soap/soap12message.xml";
+    private Log log = LogFactory.getLog(getClass());
+    /**
+     * @param testName
+     */
+    public SOAPTestCase(String testName) {
+        super(testName);
+        soap11Factory = OMAbstractFactory.getSOAP11Factory();
+        soap12Factory = OMAbstractFactory.getSOAP12Factory();
+        omFactory = OMAbstractFactory.getOMFactory();
+    }
+
+    protected void setUp() throws Exception {
+        super.setUp();
+
+        soap11Envelope = soap11Factory.createSOAPEnvelope();
+        soap12Envelope = soap12Factory.createSOAPEnvelope();
+
+        soap11EnvelopeWithParser =
+                (SOAPEnvelope) this.getSOAPBuilder(SOAP11_FILE_NAME)
+                .getDocumentElement();
+        soap12EnvelopeWithParser =
+                (SOAPEnvelope) this.getSOAPBuilder(SOAP12_FILE_NAME)
+                .getDocumentElement();
+    }
+
+    protected StAXSOAPModelBuilder getSOAPBuilder(String fileName) {
+        XMLStreamReader parser = null;
+        try {
+            parser =
+                    XMLInputFactory.newInstance().createXMLStreamReader(
+                            new FileReader(getTestResourceFile(fileName)));
+        } catch (XMLStreamException e) {
+            log.info(e.getMessage());
+        } catch (FileNotFoundException e) {
+            log.info(e.getMessage());
+        }
+        return new StAXSOAPModelBuilder(parser, null);
+    }
+
+}
diff --git a/test/org/apache/ws/commons/soap/WrongEnvelopeNamespaceTester.java b/test/org/apache/ws/commons/soap/WrongEnvelopeNamespaceTester.java
new file mode 100644
index 0000000..b987625
--- /dev/null
+++ b/test/org/apache/ws/commons/soap/WrongEnvelopeNamespaceTester.java
@@ -0,0 +1,49 @@
+/*
+ * Copyright 2004,2005 The Apache Software Foundation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      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.
+ */
+
+package org.apache.ws.commons.soap;
+
+import junit.framework.TestCase;
+import org.apache.ws.commons.om.impl.llom.builder.StAXBuilder;
+import org.apache.ws.commons.soap.impl.llom.builder.StAXSOAPModelBuilder;
+
+import javax.xml.stream.XMLInputFactory;
+import javax.xml.stream.XMLStreamReader;
+import java.io.FileInputStream;
+import java.io.FileNotFoundException;
+
+public class WrongEnvelopeNamespaceTester extends TestCase {
+    public void testCode() {
+        try {
+            String filename = "test-resources/soap/wrongEnvelopeNamespace.xml";
+            XMLStreamReader xmlr = XMLInputFactory.newInstance()
+                    .createXMLStreamReader(new FileInputStream(filename));
+            StAXBuilder builder = new StAXSOAPModelBuilder(xmlr, null); //exception here
+            fail("Builder must fail here due to wrong SOAP namespace");
+        } catch (SOAPProcessingException e) {
+            assertTrue(true);
+        } catch (FileNotFoundException e) {
+            fail("Only SOAPProcessingException can be thrown here");
+        }catch (Exception e) {
+            fail("Only SOAPProcessingException can be thrown here");
+        }
+    }
+
+    public static void main(String[] args) {
+        WrongEnvelopeNamespaceTester tester = new WrongEnvelopeNamespaceTester();
+        tester.testCode();
+    }
+}
diff --git a/test/org/apache/ws/commons/soap/impl/llom/CharacterEncodingTest.java b/test/org/apache/ws/commons/soap/impl/llom/CharacterEncodingTest.java
new file mode 100644
index 0000000..66f4778
--- /dev/null
+++ b/test/org/apache/ws/commons/soap/impl/llom/CharacterEncodingTest.java
@@ -0,0 +1,140 @@
+/*
+ * Copyright 2004,2005 The Apache Software Foundation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      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.
+ */
+
+package org.apache.ws.commons.soap.impl.llom;
+import junit.framework.TestCase;
+import org.apache.ws.commons.om.OMAbstractFactory;
+import org.apache.ws.commons.om.OMElement;
+import org.apache.ws.commons.om.OMNamespace;
+import org.apache.ws.commons.om.OMOutputFormat;
+import org.apache.ws.commons.soap.SOAPEnvelope;
+import org.apache.ws.commons.soap.SOAPFactory;
+import org.apache.ws.commons.soap.impl.llom.builder.StAXSOAPModelBuilder;
+
+import javax.xml.stream.FactoryConfigurationError;
+import javax.xml.stream.XMLInputFactory;
+import javax.xml.stream.XMLStreamException;
+import java.io.ByteArrayInputStream;
+import java.io.ByteArrayOutputStream;
+import java.io.IOException;
+
+
+/**
+ * Test for serialization and deserialization using UTF-16
+ * character encoding 
+ */
+public class CharacterEncodingTest extends TestCase {
+
+	public static final String UTF_16 = "utf-16";
+	
+	public CharacterEncodingTest(String name) {
+		super(name);
+	}
+	
+	public void runTest(String value, String expected) throws XMLStreamException, FactoryConfigurationError, IOException {
+		
+		SOAPFactory factory = OMAbstractFactory.getSOAP12Factory();
+		SOAPEnvelope envelope = factory.getDefaultEnvelope();
+		String ns = "http://testuri.org";
+		OMNamespace namespace = factory.createOMNamespace(ns,"tst");
+		
+		String ln = "Child";
+		
+		OMElement bodyChild = factory.createOMElement(ln,namespace);
+		bodyChild.addChild(factory.createText(value));
+		
+		envelope.getBody().addChild(bodyChild);
+
+
+		ByteArrayOutputStream byteOutStr = new ByteArrayOutputStream();
+		
+		OMOutputFormat outputFormat = new OMOutputFormat();
+        outputFormat.setCharSetEncoding(UTF_16);
+		envelope.serialize(byteOutStr, outputFormat);
+		
+		ByteArrayInputStream byteInStr = new ByteArrayInputStream(byteOutStr.toByteArray());
+		
+		StAXSOAPModelBuilder builder = new StAXSOAPModelBuilder(XMLInputFactory.newInstance().createXMLStreamReader(byteInStr, UTF_16),null);
+
+		SOAPEnvelope resultEnv = builder.getSOAPEnvelope();
+		
+		OMElement bodyChildResult = resultEnv.getBody().getFirstElement();
+		
+		assertNotNull("No child in body element", bodyChildResult);
+		
+		String result = bodyChildResult.getText();
+		
+		assertNotNull("No value for testParam param", result);
+		
+		assertEquals("Expected result not received.", expected, result);
+	
+		
+	}
+	
+    private void runtest(String value) throws Exception {
+        runTest(value, value);
+    }
+    
+    public void testSimpleString() throws Exception {
+        runtest("a simple string");
+    }
+    
+    public void testStringWithApostrophes() throws Exception {
+        runtest("this isn't a simple string");
+    }
+    
+    public void testStringWithEntities() throws Exception {
+        runTest("&amp;&lt;&gt;&apos;&quot;", "&amp;&lt;&gt;&apos;&quot;");
+    }
+    
+    public void testStringWithRawEntities() throws Exception {
+        runTest("&<>'\"", "&<>'\"");
+    }
+    public void testStringWithLeadingAndTrailingSpaces() throws Exception {
+        runtest("          centered          ");
+    }
+    
+    public void testWhitespace() throws Exception {
+        runtest(" \n \t "); // note: \r fails
+    }
+    
+    public void testFrenchAccents() throws Exception {
+        runtest("\u00e0\u00e2\u00e4\u00e7\u00e8\u00e9\u00ea\u00eb\u00ee\u00ef\u00f4\u00f6\u00f9\u00fb\u00fc");
+    }
+    
+    public void testGermanUmlauts() throws Exception {
+        runtest(" Some text \u00df with \u00fc special \u00f6 chars \u00e4.");
+    }
+    
+    public void testWelcomeUnicode() throws Exception {
+        // welcome in several languages
+        runtest(
+          "Chinese (trad.) : \u6b61\u8fce  ");
+    }
+
+    public void testWelcomeUnicode2() throws Exception {
+        // welcome in several languages
+        runtest(
+          "Greek : \u03ba\u03b1\u03bb\u03ce\u03c2 \u03bf\u03c1\u03af\u03c3\u03b1\u03c4\u03b5");
+    }
+
+    public void testWelcomeUnicode3() throws Exception {
+        // welcome in several languages
+        runtest(
+          "Japanese : \u3088\u3046\u3053\u305d");
+    }
+	
+}
diff --git a/test/org/apache/ws/commons/soap/impl/llom/OMElementTest.java b/test/org/apache/ws/commons/soap/impl/llom/OMElementTest.java
new file mode 100644
index 0000000..57a3066
--- /dev/null
+++ b/test/org/apache/ws/commons/soap/impl/llom/OMElementTest.java
@@ -0,0 +1,128 @@
+/*
+ * Copyright 2004,2005 The Apache Software Foundation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      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.
+ */
+
+package org.apache.ws.commons.soap.impl.llom;
+
+import org.apache.ws.commons.om.OMAbstractFactory;
+import org.apache.ws.commons.om.OMConstants;
+import org.apache.ws.commons.om.OMElement;
+import org.apache.ws.commons.om.OMFactory;
+import org.apache.ws.commons.om.OMNamespace;
+import org.apache.ws.commons.om.OMTestCase;
+import org.apache.ws.commons.om.OMText;
+import org.apache.ws.commons.soap.SOAPEnvelope;
+import org.apache.ws.commons.soap.impl.llom.builder.StAXSOAPModelBuilder;
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+
+import javax.xml.namespace.QName;
+import java.util.Iterator;
+
+public class OMElementTest extends OMTestCase implements OMConstants {
+    private static final String WSA_URI = "http://schemas.xmlsoap.org/ws/2004/03/addressing";
+    private static final String WSA_TO = "To";
+    private Log log = LogFactory.getLog(getClass());
+
+    OMFactory factory = OMAbstractFactory.getOMFactory();
+    private OMElement firstElement;
+    private OMElement secondElement;
+
+
+    public OMElementTest(String testName) {
+        super(testName);
+    }
+
+    /*
+     * @see TestCase#setUp()
+     */
+    protected void setUp() throws Exception {
+       OMNamespace testingNamespace = factory.createOMNamespace(
+                        "http://testing.ws.org", "ws");
+        firstElement = factory.createOMElement("FirstElement", testingNamespace);
+        secondElement = factory.createOMElement("SecondElement", factory.createOMNamespace(
+                                "http://moretesting.ws.org", "ws"), firstElement);
+    }
+
+    public void testGetText() {
+        try {
+            StAXSOAPModelBuilder soapBuilder = getOMBuilder(
+                    "soap/OMElementTest.xml");
+            SOAPEnvelope soapEnvelope = (SOAPEnvelope) soapBuilder.getDocumentElement();
+            OMElement wsaTo = soapEnvelope.getHeader().getFirstChildWithName(
+                    new QName(WSA_URI, WSA_TO));
+
+            String expectedString = "http://localhost:8081/axis/services/BankPort";
+            assertEquals("getText is not returning the correct value",
+                    wsaTo.getText().trim(),
+                    expectedString);
+        } catch (Exception e) {
+            log.info(e.getMessage());
+        }
+    }
+
+    public void testConstructors(){
+
+        try {
+            factory.createOMElement("", null);
+            fail("This should fail as OMElement should not be allowed to create without a local name ");
+        } catch (Exception e) {
+            assertTrue(true);
+        }
+
+        assertTrue("Namespace having same information, declared in the same context, should share" +
+                " the same namespace object",firstElement.getNamespace() != secondElement.getNamespace());
+        assertEquals("OMElement children addition has not worked properly", secondElement, firstElement.getFirstElement());
+
+        OMNamespace testNamespace2 = factory.createOMNamespace("ftp://anotherTest.ws.org", "ws");
+        firstElement.declareNamespace(testNamespace2);
+
+        OMNamespace inheritedSecondNamespace = secondElement.findNamespace(testNamespace2.getName(),
+                testNamespace2.getPrefix());
+        assertNotNull("Children should inherit namespaces declared in parent", inheritedSecondNamespace);
+        assertEquals("inherited namespace uri should be equal", inheritedSecondNamespace.getName(), testNamespace2.getName());
+        assertEquals("inherited namespace prefix should be equal", inheritedSecondNamespace.getPrefix(), testNamespace2.getPrefix());
+
+
+    }
+
+    public void testChildDetachment() {
+        OMNamespace testNamespace2 = factory.createOMNamespace("ftp://anotherTest.ws.org", "ws");
+        
+        secondElement.detach();
+        assertTrue("OMElement children detachment has not worked properly", !secondElement.equals(firstElement.getFirstElement()));
+        assertNull("First Element should not contain elements after detaching. ", firstElement.getFirstElement());
+        assertNull("First Element should not contain elements after detaching. ", firstElement.getFirstOMChild());
+        assertNull(secondElement.findNamespace(testNamespace2.getName(), testNamespace2.getPrefix()));
+
+        firstElement.addChild(secondElement);
+        firstElement.setText("Some Sample Text");
+
+        assertTrue("First added child must be the first child", secondElement.equals(firstElement.getFirstOMChild()));
+        Iterator children = firstElement.getChildren();
+        int childCount = 0;
+        while (children.hasNext()) {
+        	children.next();
+            childCount++;
+        }
+        assertEquals("Children count should be two", childCount, 2);
+
+        secondElement.detach();
+        assertTrue("First child should be the text child", firstElement.getFirstOMChild() instanceof OMText);
+
+
+    }
+
+}
diff --git a/test/org/apache/ws/commons/soap/impl/llom/OMEnvelopeTest.java b/test/org/apache/ws/commons/soap/impl/llom/OMEnvelopeTest.java
new file mode 100644
index 0000000..c1886ec
--- /dev/null
+++ b/test/org/apache/ws/commons/soap/impl/llom/OMEnvelopeTest.java
@@ -0,0 +1,82 @@
+/*
+ * Copyright 2004,2005 The Apache Software Foundation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      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.
+ */
+
+package org.apache.ws.commons.soap.impl.llom;
+
+import org.apache.ws.commons.om.OMAbstractFactory;
+import org.apache.ws.commons.om.OMTestCase;
+import org.apache.ws.commons.om.OMTestUtils;
+import org.apache.ws.commons.soap.SOAPBody;
+import org.apache.ws.commons.soap.SOAPEnvelope;
+import org.apache.ws.commons.soap.SOAPHeader;
+import org.apache.ws.commons.soap.SOAPProcessingException;
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+
+public class OMEnvelopeTest extends OMTestCase {
+    private Log log = LogFactory.getLog(getClass());
+    public OMEnvelopeTest(String testName) {
+        super(testName);
+    }
+
+    protected void setUp() throws Exception {
+        super.setUp();
+    }
+
+    public void testGetHeader1() {
+        SOAPHeader header = soapEnvelope.getHeader();
+        assertTrue("Header information retrieved not correct",
+                (header != null &&
+                header.getLocalName().equalsIgnoreCase("Header")));
+    }
+
+    public void testGetBody1() {
+        SOAPBody body = soapEnvelope.getBody();
+        assertTrue("Header information retrieved not correct",
+                (body != null && body.getLocalName().equalsIgnoreCase("Body")));
+    }
+
+    private SOAPEnvelope getSecondEnvelope() throws Exception {
+        return (SOAPEnvelope) OMTestUtils.getOMBuilder(
+                getTestResourceFile("soap/sample1.xml"))
+                .getDocumentElement();
+    }
+
+    public void testGetHeader2() throws Exception {
+        SOAPHeader header = getSecondEnvelope().getHeader();
+        assertTrue("Header information retrieved not correct",
+                (header != null &&
+                header.getLocalName().equalsIgnoreCase("Header")));
+    }
+
+    public void testGetBody2() throws Exception {
+        SOAPBody body = getSecondEnvelope().getBody();
+        assertTrue("Header information retrieved not correct",
+                (body != null && body.getLocalName().equalsIgnoreCase("Body")));
+    }
+
+    public void testDefaultEnveleope() {
+        SOAPEnvelope env = null;
+        try {
+            env = OMAbstractFactory.getSOAP11Factory().getDefaultEnvelope();
+        } catch (SOAPProcessingException e) {
+            log.info(e.getMessage());
+            fail(e.getMessage());
+        }
+        assertNotNull(env);
+        assertNotNull("Body should not be null", env.getBody());
+    }
+}
diff --git a/test/org/apache/ws/commons/soap/impl/llom/OMHeaderBlockTest.java b/test/org/apache/ws/commons/soap/impl/llom/OMHeaderBlockTest.java
new file mode 100644
index 0000000..ffbdfcb
--- /dev/null
+++ b/test/org/apache/ws/commons/soap/impl/llom/OMHeaderBlockTest.java
@@ -0,0 +1,59 @@
+/*
+ * Copyright 2004,2005 The Apache Software Foundation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      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.
+ */
+
+package org.apache.ws.commons.soap.impl.llom;
+
+import org.apache.ws.commons.om.OMTestCase;
+import org.apache.ws.commons.soap.SOAPHeader;
+import org.apache.ws.commons.soap.SOAPHeaderBlock;
+
+import java.util.Iterator;
+
+public class OMHeaderBlockTest extends OMTestCase {
+    SOAPHeader soapHeader;
+    SOAPHeaderBlock soapHeaderElement;
+
+    public OMHeaderBlockTest(String testName) {
+        super(testName);
+    }
+
+    protected void setUp() throws Exception {
+        super.setUp();
+        soapHeader = soapEnvelope.getHeader();
+        Iterator headerElementIter = soapHeader.examineAllHeaderBlocks();
+        if (headerElementIter.hasNext()) {
+            soapHeaderElement = (SOAPHeaderBlock) headerElementIter.next();
+        }
+    }
+
+    public void testSetAndGetActor() {
+        String newActorURI = "http://newActor.org";
+        soapHeaderElement.setRole(newActorURI);
+        assertTrue("Actor was not properly set",
+                soapHeaderElement.getRole().equalsIgnoreCase(newActorURI));
+    }
+
+    public void testSetAndGetMustUnderstand() {
+        soapHeaderElement.setMustUnderstand(false);
+        assertTrue("MustUnderstand was not properly set",
+                !soapHeaderElement.getMustUnderstand());
+    }
+
+    public void testGetMustUnderstand() {
+        //TODO Implement getMustUnderstand().
+    }
+
+}
diff --git a/test/org/apache/ws/commons/soap/impl/llom/OMHeaderTest.java b/test/org/apache/ws/commons/soap/impl/llom/OMHeaderTest.java
new file mode 100644
index 0000000..2cc86e4
--- /dev/null
+++ b/test/org/apache/ws/commons/soap/impl/llom/OMHeaderTest.java
@@ -0,0 +1,85 @@
+/*
+ * Copyright 2004,2005 The Apache Software Foundation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      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.
+ */
+
+package org.apache.ws.commons.soap.impl.llom;
+
+import org.apache.ws.commons.om.OMTestCase;
+import org.apache.ws.commons.om.impl.llom.OMNamespaceImpl;
+import org.apache.ws.commons.soap.SOAPHeader;
+import org.apache.ws.commons.soap.SOAPHeaderBlock;
+
+import java.util.Iterator;
+
+public class OMHeaderTest extends OMTestCase {
+    SOAPHeader soapHeader;
+
+    public OMHeaderTest(String testName) {
+        super(testName);
+    }
+
+    public static void main(String[] args) {
+    }
+
+    /*
+     * @see TestCase#setUp()
+     */
+    protected void setUp() throws Exception {
+        super.setUp();
+        soapHeader = soapEnvelope.getHeader();
+    }
+
+    public void testAddHeaderElement() {
+        String newElementName = "MyHeaderElement";
+        SOAPHeaderBlock soapHeaderElement = soapHeader.addHeaderBlock(
+                newElementName,
+                new OMNamespaceImpl("http://opensource.lk", "lsf"));
+        assertTrue(
+                "Header Element added has different parent than it should have",
+                soapHeaderElement.getParent() == soapHeader);
+        assertTrue(
+                "Header Element added has different localname than it was given",
+                soapHeaderElement.getLocalName().equalsIgnoreCase(
+                        newElementName));
+    }
+
+    public void testExamineHeaderElements() {
+    }
+
+    public void testExtractHeaderElements() {
+        //TODO Implement extractHeaderBlocks().
+    }
+
+    public void testExamineMustUnderstandHeaderElements() {
+        //TODO Implement examineMustUnderstandHeaderBlocks().
+    }
+
+    public void testExamineAllHeaderElements() {
+        Iterator iterator = soapHeader.examineAllHeaderBlocks();
+        int headerElementCount = 0;
+        while (iterator.hasNext()) {
+            iterator.next();
+            headerElementCount++;
+        }
+        assertTrue(
+                "Number of header elements in the header differs from expected value of 3",
+                headerElementCount == 3);
+    }
+
+    public void testExtractAllHeaderElements() {
+        //TODO Implement extractAllHeaderBlocks().
+    }
+
+}
diff --git a/test/org/apache/ws/commons/soap/impl/llom/builder/StAXSOAPModelBuilderTest.java b/test/org/apache/ws/commons/soap/impl/llom/builder/StAXSOAPModelBuilderTest.java
new file mode 100644
index 0000000..2a12e96
--- /dev/null
+++ b/test/org/apache/ws/commons/soap/impl/llom/builder/StAXSOAPModelBuilderTest.java
@@ -0,0 +1,560 @@
+package org.apache.ws.commons.soap.impl.llom.builder;
+
+import junit.framework.TestCase;
+import org.apache.ws.commons.om.OMAttribute;
+import org.apache.ws.commons.om.OMElement;
+import org.apache.ws.commons.om.OMXMLParserWrapper;
+import org.apache.ws.commons.soap.SOAP11Constants;
+import org.apache.ws.commons.soap.SOAP12Constants;
+import org.apache.ws.commons.soap.SOAPBody;
+import org.apache.ws.commons.soap.SOAPConstants;
+import org.apache.ws.commons.soap.SOAPEnvelope;
+import org.apache.ws.commons.soap.SOAPFault;
+import org.apache.ws.commons.soap.SOAPFaultCode;
+import org.apache.ws.commons.soap.SOAPFaultDetail;
+import org.apache.ws.commons.soap.SOAPFaultNode;
+import org.apache.ws.commons.soap.SOAPFaultReason;
+import org.apache.ws.commons.soap.SOAPFaultRole;
+import org.apache.ws.commons.soap.SOAPFaultSubCode;
+import org.apache.ws.commons.soap.SOAPFaultText;
+import org.apache.ws.commons.soap.SOAPFaultValue;
+import org.apache.ws.commons.soap.SOAPHeader;
+import org.apache.ws.commons.soap.SOAPHeaderBlock;
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+
+import javax.xml.stream.XMLInputFactory;
+import javax.xml.stream.XMLStreamException;
+import javax.xml.stream.XMLStreamReader;
+import java.io.StringReader;
+import java.util.Iterator;
+
+public class StAXSOAPModelBuilderTest extends TestCase {
+
+    private Log log = LogFactory.getLog(getClass());
+    public void setUp() {
+
+    }
+
+    public void testStAXSOAPModelBuilder() {
+        String soap12Message =
+                "<env:Envelope xmlns:env=\"http://www.w3.org/2003/05/soap-envelope\">\n" +
+                "   <env:Header>\n" +
+                "       <test:echoOk xmlns:test=\"http://example.org/ts-tests\"\n" +
+                "                    env:role=\"http://www.w3.org/2003/05/soap-envelope/role/ultimateReceiver\"\n" +
+                "                    env:mustUnderstand=\"true\">\n" +
+                "                       foo\n" +
+                "       </test:echoOk>\n" +
+                "   </env:Header>\n" +
+                "   <env:Body>\n" +
+                "       <env:Fault>\n" +
+                "           <env:Code>\n" +
+                "               <env:Value>env:Sender</env:Value>\n" +
+                "               <env:Subcode>\n" +
+                "                   <env:Value>m:MessageTimeout</env:Value>\n" +
+                "                   <env:Subcode>\n" +
+                "                       <env:Value>m:MessageTimeout</env:Value>\n" +
+                "                   </env:Subcode>\n" +
+                "               </env:Subcode>\n" +
+                "           </env:Code>\n" +
+                "           <env:Reason>\n" +
+                "               <env:Text>Sender Timeout</env:Text>\n" +
+                "           </env:Reason>\n" +
+                "           <env:Node>\n" +
+                "               http://www.w3.org/2003/05/soap-envelope/role/ultimateReceiver\n" +
+                "           </env:Node>\n" +
+                "           <env:Role>\n" +
+                "               ultimateReceiver\n" +
+                "           </env:Role>\n" +
+                "           <env:Detail xmlns:m=\"http:www.sample.org\">\n" +
+                "               Details of error\n" +
+                "               <m:MaxTime m:detail=\"This is only a test\">\n" +
+                "                   P5M\n" +
+                "               </m:MaxTime>\n" +
+                "               <m:AveTime>\n" +
+                "                   <m:Time>\n" +
+                "                       P3M\n" +
+                "                   </m:Time>\n" +
+                "               </m:AveTime>\n" +
+                "           </env:Detail>\n" +
+                "       </env:Fault>\n" +
+                "   </env:Body>\n" +
+                "</env:Envelope>";
+
+        String soap11Message =
+                "<?xml version='1.0' ?>" +
+                "<env:Envelope xmlns:env=\"http://schemas.xmlsoap.org/soap/envelope/\">\n" +
+                "   <env:Header>\n" +
+                "       <test:echoOk xmlns:test=\"http://example.org/ts-tests\"\n" +
+                "                    env:actor=\"http://schemas.xmlsoap.org/soap/actor/next\"\n" +
+                "                    env:mustUnderstand=\"1\"" +
+                "       >\n" +
+                "                       foo\n" +
+                "       </test:echoOk>\n" +
+                "   </env:Header>\n" +
+                "   <env:Body>\n" +
+                "       <env:Fault>\n" +
+                "           <env:faultcode>\n" +
+                "               env:Sender\n" +
+                "           </env:faultcode>\n" +
+                "           <env:faultstring>\n" +
+                "               Sender Timeout\n" +
+                "           </env:faultstring>\n" +
+                "           <env:faultactor>\n" +
+                "               http://schemas.xmlsoap.org/soap/envelope/actor/ultimateReceiver\n" +
+                "           </env:faultactor>\n" +
+                "           <env:detail xmlns:m=\"http:www.sample.org\">\n" +
+                "               Details of error\n" +
+                "               <m:MaxTime m:detail=\"This is only a test\">\n" +
+                "                   P5M\n" +
+                "               </m:MaxTime>\n" +
+                "               <m:AveTime>\n" +
+                "                   <m:Time>\n" +
+                "                       P3M\n" +
+                "                   </m:Time>\n" +
+                "               </m:AveTime>\n" +
+                "           </env:detail>\n" +
+                "           <n:Test xmlns:n=\"http:www.Test.org\">\n" +
+                "               <n:TestElement>\n" +
+                "                   This is only a test\n" +
+                "               </n:TestElement>\n" +
+                "           </n:Test>\n" +
+                "       </env:Fault>\n" +
+                "   </env:Body>\n" +
+                "</env:Envelope>";
+
+
+        try {
+            XMLStreamReader sopa12Parser = XMLInputFactory.newInstance()
+                    .createXMLStreamReader(new StringReader(soap12Message));
+            OMXMLParserWrapper soap12Builder = new StAXSOAPModelBuilder(sopa12Parser, null);
+            SOAPEnvelope soap12Envelope = (SOAPEnvelope) soap12Builder.getDocumentElement();
+//            soap12Envelope.build();
+//            XMLStreamWriter writer = XMLOutputFactory.newInstance().createXMLStreamWriter(System.out);
+//            soap12Envelope.serializeAndConsume(writer);
+//		    writer.flush();
+
+            assertTrue("SOAP 1.2 :- envelope local name mismatch",
+                    soap12Envelope.getLocalName().equals(
+                            SOAPConstants.SOAPENVELOPE_LOCAL_NAME));
+            assertTrue("SOAP 1.2 :- envelope namespace uri mismatch",
+                    soap12Envelope.getNamespace().getName().equals(
+                            SOAP12Constants.SOAP_ENVELOPE_NAMESPACE_URI));
+
+            SOAPHeader header = soap12Envelope.getHeader();
+            assertTrue("SOAP 1.2 :- Header local name mismatch",
+                    header.getLocalName().equals(
+                            SOAPConstants.HEADER_LOCAL_NAME));
+            assertTrue("SOAP 1.2 :- Header namespace uri mismatch",
+                    header.getNamespace().getName().equals(
+                            SOAP12Constants.SOAP_ENVELOPE_NAMESPACE_URI));
+
+            SOAPHeaderBlock headerBlock = (SOAPHeaderBlock) header.getFirstElement();
+            assertTrue("SOAP 1.2 :- Header block name mismatch",
+                    headerBlock.getLocalName().equals("echoOk"));
+            assertTrue("SOAP 1.2 :- Header block name space uri mismatch",
+                    headerBlock.getNamespace().getName().equals(
+                            "http://example.org/ts-tests"));
+            assertEquals("SOAP 1.2 :- Header block text mismatch",headerBlock.getText().trim(),"foo");
+
+            Iterator headerBlockAttributes = headerBlock.getAllAttributes();
+            OMAttribute roleAttribute = (OMAttribute) headerBlockAttributes.next();
+            assertTrue("SOAP 1.2 :- Role attribute name mismatch",
+                    roleAttribute.getLocalName().equals(
+                            SOAP12Constants.SOAP_ROLE));
+            
+
+            assertTrue("SOAP 1.2 :- Role value mismatch",
+                    roleAttribute.getAttributeValue().trim().equals(
+                            SOAP12Constants.SOAP_ENVELOPE_NAMESPACE_URI + "/" +
+                    SOAP12Constants.SOAP_ROLE +
+                    "/" +
+                    "ultimateReceiver"));
+            assertTrue("SOAP 1.2 :- Role attribute namespace uri mismatch",
+                    roleAttribute.getNamespace().getName().equals(
+                            SOAP12Constants.SOAP_ENVELOPE_NAMESPACE_URI));
+
+            OMAttribute mustUnderstandAttribute = (OMAttribute) headerBlockAttributes.next();
+            assertTrue("SOAP 1.2 :- Mustunderstand attribute name mismatch",
+                    mustUnderstandAttribute.getLocalName().equals(
+                            SOAPConstants.ATTR_MUSTUNDERSTAND));
+            assertTrue("SOAP 1.2 :- Mustunderstand value mismatch",
+                    mustUnderstandAttribute.getAttributeValue().equals(
+                            SOAPConstants.ATTR_MUSTUNDERSTAND_TRUE));
+            assertTrue(
+                    "SOAP 1.2 :- Mustunderstand attribute namespace uri mismatch",
+                    mustUnderstandAttribute.getNamespace().getName().equals(
+                            SOAP12Constants.SOAP_ENVELOPE_NAMESPACE_URI));
+
+            SOAPBody body = soap12Envelope.getBody();
+            assertTrue("SOAP 1.2 :- Body local name mismatch",
+                    body.getLocalName().equals(SOAPConstants.BODY_LOCAL_NAME));
+            assertTrue("SOAP 1.2 :- Body namespace uri mismatch",
+                    body.getNamespace().getName().equals(
+                            SOAP12Constants.SOAP_ENVELOPE_NAMESPACE_URI));
+
+            SOAPFault fault = body.getFault();
+            assertTrue("SOAP 1.2 :- Fault local name mismatch",
+                    fault.getLocalName().equals(
+                            SOAPConstants.SOAPFAULT_LOCAL_NAME));
+            assertTrue("SOAP 1.2 :- Fault namespace uri mismatch",
+                    fault.getNamespace().getName().equals(
+                            SOAP12Constants.SOAP_ENVELOPE_NAMESPACE_URI));
+
+            Iterator iteratorInFault = fault.getChildren();
+
+            iteratorInFault.next();
+            SOAPFaultCode code = (SOAPFaultCode) iteratorInFault.next();
+            assertTrue("SOAP 1.2 :- Fault code local name mismatch",
+                    code.getLocalName().equals(
+                            SOAP12Constants.SOAP_FAULT_CODE_LOCAL_NAME));
+            assertTrue("SOAP 1.2 :- Fault code namespace uri mismatch",
+                    code.getNamespace().getName().equals(
+                            SOAP12Constants.SOAP_ENVELOPE_NAMESPACE_URI));
+
+            Iterator iteratorInCode = code.getChildren();
+
+            iteratorInCode.next();
+            SOAPFaultValue value1 = (SOAPFaultValue) iteratorInCode.next();
+            assertTrue("SOAP 1.2 :- Fault code value local name mismatch",
+                    value1.getLocalName().equals(
+                            SOAP12Constants.SOAP_FAULT_VALUE_LOCAL_NAME));
+            assertTrue("SOAP 1.2 :- Fault code namespace uri mismatch",
+                    value1.getNamespace().getName().equals(
+                            SOAP12Constants.SOAP_ENVELOPE_NAMESPACE_URI));
+            assertTrue("SOAP 1.2 :- Value1 text mismatch",
+                    value1.getText().equals("env:Sender"));
+
+            iteratorInCode.next();
+            SOAPFaultSubCode subCode1 = (SOAPFaultSubCode) iteratorInCode.next();
+            assertTrue("SOAP 1.2 :- Fault sub code local name mismatch",
+                    subCode1.getLocalName().equals(
+                            SOAP12Constants.SOAP_FAULT_SUB_CODE_LOCAL_NAME));
+            assertTrue("SOAP 1.2 :- Fault subcode namespace uri mismatch",
+                    subCode1.getNamespace().getName().equals(
+                            SOAP12Constants.SOAP_ENVELOPE_NAMESPACE_URI));
+
+            Iterator iteratorInSubCode1 = subCode1.getChildren();
+
+            iteratorInSubCode1.next();
+            SOAPFaultValue value2 = (SOAPFaultValue) iteratorInSubCode1.next();
+            assertTrue("SOAP 1.2 :- Fault code value local name mismatch",
+                    value2.getLocalName().equals(
+                            SOAP12Constants.SOAP_FAULT_VALUE_LOCAL_NAME));
+            assertTrue("SOAP 1.2 :- Fault code namespace uri mismatch",
+                    value2.getNamespace().getName().equals(
+                            SOAP12Constants.SOAP_ENVELOPE_NAMESPACE_URI));
+            assertTrue("SOAP 1.2 :- Value2 text mismatch",
+                    value2.getText().equals("m:MessageTimeout"));
+
+            iteratorInSubCode1.next();
+            SOAPFaultSubCode subCode2 = (SOAPFaultSubCode) iteratorInSubCode1.next();
+            assertTrue("SOAP 1.2 :- Fault sub code local name mismatch",
+                    subCode2.getLocalName().equals(
+                            SOAP12Constants.SOAP_FAULT_SUB_CODE_LOCAL_NAME));
+            assertTrue("SOAP 1.2 :- Fault subcode namespace uri mismatch",
+                    subCode2.getNamespace().getName().equals(
+                            SOAP12Constants.SOAP_ENVELOPE_NAMESPACE_URI));
+
+            Iterator iteratorInSubCode2 = subCode2.getChildren();
+
+            iteratorInSubCode2.next();
+            SOAPFaultValue value3 = (SOAPFaultValue) iteratorInSubCode2.next();
+            assertTrue("SOAP 1.2 :- Fault code value local name mismatch",
+                    value3.getLocalName().equals(
+                            SOAP12Constants.SOAP_FAULT_VALUE_LOCAL_NAME));
+            assertTrue("SOAP 1.2 :- Fault code namespace uri mismatch",
+                    value3.getNamespace().getName().equals(
+                            SOAP12Constants.SOAP_ENVELOPE_NAMESPACE_URI));
+            assertTrue("SOAP 1.2 :- Value2 text mismatch",
+                    value3.getText().equals("m:MessageTimeout"));
+
+            iteratorInFault.next();
+            SOAPFaultReason reason = (SOAPFaultReason) iteratorInFault.next();
+            assertTrue("SOAP 1.2 :- Fault reason local name mismatch",
+                    reason.getLocalName().equals(
+                            SOAP12Constants.SOAP_FAULT_REASON_LOCAL_NAME));
+            assertTrue("SOAP 1.2 :- Fault reason namespace uri mismatch",
+                    reason.getNamespace().getName().equals(
+                            SOAP12Constants.SOAP_ENVELOPE_NAMESPACE_URI));
+
+            Iterator iteratorInReason = reason.getChildren();
+
+            iteratorInReason.next();
+            SOAPFaultText text = (SOAPFaultText) iteratorInReason.next();
+            assertTrue("SOAP 1.2 :- Fault text local name mismatch",
+                    text.getLocalName().equals(
+                            SOAP12Constants.SOAP_FAULT_TEXT_LOCAL_NAME));
+            assertTrue("SOAP 1.2 :- Text namespace uri mismatch",
+                    text.getNamespace().getName().equals(
+                            SOAP12Constants.SOAP_ENVELOPE_NAMESPACE_URI));
+            assertTrue("SOAP 1.2 :- Text value mismatch",
+                    text.getText().equals("Sender Timeout"));
+
+            iteratorInFault.next();
+            SOAPFaultNode node = (SOAPFaultNode) iteratorInFault.next();
+            assertTrue("SOAP 1.2 :- Fault node local name mismatch",
+                    node.getLocalName().equals(
+                            SOAP12Constants.SOAP_FAULT_NODE_LOCAL_NAME));
+            assertTrue("SOAP 1.2 :- Fault node namespace uri mismatch",
+                    node.getNamespace().getName().equals(
+                            SOAP12Constants.SOAP_ENVELOPE_NAMESPACE_URI));
+            assertTrue("SOAP 1.2 :- Node value mismatch",
+                    node.getText().trim().equals(
+                            "http://www.w3.org/2003/05/soap-envelope/role/ultimateReceiver"));
+
+            iteratorInFault.next();
+            SOAPFaultRole role = (SOAPFaultRole) iteratorInFault.next();
+            assertTrue("SOAP 1.2 :- Fault role local name mismatch",
+                    role.getLocalName().equals(
+                            SOAP12Constants.SOAP_FAULT_ROLE_LOCAL_NAME));
+            assertTrue("SOAP 1.2 :- Fault role namespace uri mismatch",
+                    role.getNamespace().getName().equals(
+                            SOAP12Constants.SOAP_ENVELOPE_NAMESPACE_URI));
+            assertTrue("SOAP 1.2 :- Role value mismatch",
+                    role.getText().trim().equals("ultimateReceiver"));
+
+            iteratorInFault.next();
+            SOAPFaultDetail detail = (SOAPFaultDetail) iteratorInFault.next();
+            assertTrue("SOAP 1.2 :- Fault detail local name mismatch",
+                    detail.getLocalName().equals(
+                            SOAP12Constants.SOAP_FAULT_DETAIL_LOCAL_NAME));
+            assertTrue("SOAP 1.2 :- Fault detail namespace uri mismatch",
+                    detail.getNamespace().getName().equals(
+                            SOAP12Constants.SOAP_ENVELOPE_NAMESPACE_URI));
+
+            assertTrue("SOAP 1.2 :- Text in detail mismatch",
+                    detail.getText().trim().equals("Details of error"));
+
+            Iterator iteratorInDetail = detail.getChildren();
+
+            iteratorInDetail.next();
+            OMElement element1 = (OMElement) iteratorInDetail.next();
+            assertTrue("SOAP 1.2 :- MaxTime element mismatch",
+                    element1.getLocalName().equals("MaxTime"));
+            assertTrue("SOAP 1.2 :- MaxTime element namespace mismatch",
+                    element1.getNamespace().getName().equals(
+                            "http:www.sample.org"));
+            assertTrue("SOAP 1.2 :- Text value in MaxTime element mismatch",
+                    element1.getText().trim().equals("P5M"));
+
+            Iterator attributeIterator = element1.getAllAttributes();
+            OMAttribute attributeInMaxTime = (OMAttribute) attributeIterator.next();
+            assertTrue("SOAP 1.2 :- Attribute local name mismatch",
+                    attributeInMaxTime.getLocalName().equals("detail"));
+            assertTrue("SOAP 1.2 :- Attribute namespace mismatch",
+                    attributeInMaxTime.getNamespace().getName().equals(
+                            "http:www.sample.org"));
+            assertTrue("SOAP 1.2 :- Attribute value mismatch",
+                    attributeInMaxTime.getAttributeValue().trim().equals("This is only a test"));
+
+            iteratorInDetail.next();
+            OMElement element2 = (OMElement) iteratorInDetail.next();
+            assertTrue("SOAP 1.2 :- AveTime element mismatch",
+                    element2.getLocalName().equals("AveTime"));
+            assertTrue("SOAP 1.2 :- AveTime element namespace mismatch",
+                    element2.getNamespace().getName().equals(
+                            "http:www.sample.org"));
+
+            Iterator iteratorInAveTimeElement = element2.getChildren();
+
+            iteratorInAveTimeElement.next();
+            OMElement element21 = (OMElement) iteratorInAveTimeElement.next();
+            assertTrue("SOAP 1.2 :- Time element mismatch",
+                    element21.getLocalName().equals("Time"));
+            assertTrue("SOAP 1.2 :- Time element namespace mismatch",
+                    element21.getNamespace().getName().equals(
+                            "http:www.sample.org"));
+            assertTrue("SOAP 1.2 :- Text value in Time element mismatch",
+                    element21.getText().trim().equals("P3M"));
+
+            XMLStreamReader sopa11Parser = XMLInputFactory.newInstance()
+                    .createXMLStreamReader(new StringReader(soap11Message));
+            OMXMLParserWrapper soap11Builder = new StAXSOAPModelBuilder(sopa11Parser, null);
+            SOAPEnvelope soap11Envelope = (SOAPEnvelope) soap11Builder.getDocumentElement();
+//            soap11Envelope.build();
+//            writer = XMLOutputFactory.newInstance().createXMLStreamWriter(System.out);
+//            soap11Envelope.serializeAndConsume(writer);
+//		    writer.flush();
+
+            assertTrue("SOAP 1.1 :- envelope local name mismatch",
+                    soap11Envelope.getLocalName().equals(
+                            SOAPConstants.SOAPENVELOPE_LOCAL_NAME));
+            assertTrue("SOAP 1.1 :- envelope namespace uri mismatch",
+                    soap11Envelope.getNamespace().getName().equals(
+                            SOAP11Constants.SOAP_ENVELOPE_NAMESPACE_URI));
+
+            header = soap11Envelope.getHeader();
+            assertTrue("SOAP 1.1 :- Header local name mismatch",
+                    header.getLocalName().equals(
+                            SOAPConstants.HEADER_LOCAL_NAME));
+            assertTrue("SOAP 1.1 :- Header namespace uri mismatch",
+                    header.getNamespace().getName().equals(
+                            SOAP11Constants.SOAP_ENVELOPE_NAMESPACE_URI));
+
+            headerBlock = (SOAPHeaderBlock) header.getFirstElement();
+            assertTrue("SOAP 1.1 :- Header block name mismatch",
+                    headerBlock.getLocalName().equals("echoOk"));
+            assertTrue("SOAP 1.1 :- Header block name space uri mismatch",
+                    headerBlock.getNamespace().getName().equals(
+                            "http://example.org/ts-tests"));
+            assertTrue("SOAP 1.1 :- Headaer block text mismatch",
+                    headerBlock.getText().trim().equals("foo"));
+
+            headerBlockAttributes = headerBlock.getAllAttributes();
+
+            mustUnderstandAttribute =
+                    (OMAttribute) headerBlockAttributes.next();
+            assertTrue("SOAP 1.1 :- Mustunderstand attribute name mismatch",
+                    mustUnderstandAttribute.getLocalName().equals(
+                            SOAPConstants.ATTR_MUSTUNDERSTAND));
+            assertTrue("SOAP 1.1 :- Mustunderstand value mismatch",
+                    mustUnderstandAttribute.getAttributeValue().equals(
+                            SOAPConstants.ATTR_MUSTUNDERSTAND_1));
+            assertTrue(
+                    "SOAP 1.1 :- Mustunderstand attribute namespace uri mismatch",
+                    mustUnderstandAttribute.getNamespace().getName().equals(
+                            SOAP11Constants.SOAP_ENVELOPE_NAMESPACE_URI));
+
+            OMAttribute actorAttribute = (OMAttribute) headerBlockAttributes.next();
+            assertTrue("SOAP 1.1 :- Actor attribute name mismatch",
+                    actorAttribute.getLocalName().equals(
+                            SOAP11Constants.ATTR_ACTOR));
+            assertTrue("SOAP 1.1 :- Actor value mismatch",
+                    actorAttribute.getAttributeValue().trim().equals(
+                            "http://schemas.xmlsoap.org/soap/" +
+                    SOAP11Constants.ATTR_ACTOR +
+                    "/" +
+                    "next"));
+            assertTrue("SOAP 1.1 :- Actor attribute namespace uri mismatch",
+                    actorAttribute.getNamespace().getName().equals(
+                            SOAP11Constants.SOAP_ENVELOPE_NAMESPACE_URI));
+
+            body = soap11Envelope.getBody();
+            assertTrue("SOAP 1.1 :- Body local name mismatch",
+                    body.getLocalName().equals(SOAPConstants.BODY_LOCAL_NAME));
+            assertTrue("SOAP 1.1 :- Body namespace uri mismatch",
+                    body.getNamespace().getName().equals(
+                            SOAP11Constants.SOAP_ENVELOPE_NAMESPACE_URI));
+
+            fault = body.getFault();
+            assertTrue("SOAP 1.1 :- Fault namespace uri mismatch",
+                    fault.getNamespace().getName().equals(
+                            SOAP11Constants.SOAP_ENVELOPE_NAMESPACE_URI));
+
+            iteratorInFault = fault.getChildren();
+
+            iteratorInFault.next();
+            code = (SOAPFaultCode) iteratorInFault.next();
+            assertEquals("SOAP Fault code local name mismatch",
+                    code.getLocalName(),
+                    (SOAP12Constants.SOAP_FAULT_CODE_LOCAL_NAME));
+            assertTrue("SOAP 1.1 :- Fault code namespace uri mismatch",
+                    code.getNamespace().getName().equals(
+                            SOAP11Constants.SOAP_ENVELOPE_NAMESPACE_URI));
+            assertEquals("SOAP 1.1 :- Fault code value mismatch", code.getValue().getText().trim(),
+                    "env:Sender");
+
+            iteratorInFault.next();
+            reason = (SOAPFaultReason) iteratorInFault.next();
+            assertTrue("SOAP 1.1 :- Fault string local name mismatch",
+                    reason.getLocalName().equals(
+                            SOAP12Constants.SOAP_FAULT_REASON_LOCAL_NAME));
+            assertTrue("SOAP 1.2 :- Fault string namespace uri mismatch",
+                    reason.getNamespace().getName().equals(
+                            SOAP11Constants.SOAP_ENVELOPE_NAMESPACE_URI));
+            assertTrue("SOAP 1.1 :- Fault string value mismatch",
+                    reason.getSOAPText().getText().trim().equals("Sender Timeout"));
+
+            iteratorInFault.next();
+            role = (SOAPFaultRole) iteratorInFault.next();
+            assertTrue("SOAP 1.1 :- Fault actor local name mismatch",
+                    role.getLocalName().equals(
+                            SOAP12Constants.SOAP_FAULT_ROLE_LOCAL_NAME));
+            assertTrue("SOAP 1.1 :- Fault actor namespace uri mismatch",
+                    role.getNamespace().getName().equals(
+                            SOAP11Constants.SOAP_ENVELOPE_NAMESPACE_URI));
+            assertTrue("SOAP 1.1 :- Actor value mismatch",
+                    role.getText().trim().equals(
+                            "http://schemas.xmlsoap.org/soap/envelope/actor/ultimateReceiver"));
+
+            iteratorInFault.next();
+            detail = (SOAPFaultDetail) iteratorInFault.next();
+            assertTrue("SOAP 1.1 :- Fault detail local name mismatch",
+                    detail.getLocalName().equals(
+                            SOAP12Constants.SOAP_FAULT_DETAIL_LOCAL_NAME));
+            assertTrue("SOAP 1.1 :- Fault detail namespace uri mismatch",
+                    detail.getNamespace().getName().equals(
+                            SOAP11Constants.SOAP_ENVELOPE_NAMESPACE_URI));
+            assertTrue("SOAP 1.2 :- Text in detail mismatch",
+                    detail.getText().trim().equals("Details of error"));
+
+            iteratorInDetail = detail.getChildren();
+
+            iteratorInDetail.next();
+            element1 = (OMElement) iteratorInDetail.next();
+            assertTrue("SOAP 1.1 :- MaxTime element mismatch",
+                    element1.getLocalName().equals("MaxTime"));
+            assertTrue("SOAP 1.1 :- MaxTime element namespace mismatch",
+                    element1.getNamespace().getName().equals(
+                            "http:www.sample.org"));
+            assertTrue("SOAP 1.1 :- Text value in MaxTime element mismatch",
+                    element1.getText().trim().equals("P5M"));
+
+            attributeIterator = element1.getAllAttributes();
+            attributeInMaxTime = (OMAttribute) attributeIterator.next();
+            assertTrue("SOAP 1.1 :- Attribute local name mismatch",
+                    attributeInMaxTime.getLocalName().equals("detail"));
+            assertTrue("SOAP 1.1 :- Attribute namespace mismatch",
+                    attributeInMaxTime.getNamespace().getName().equals(
+                            "http:www.sample.org"));
+            assertTrue("SOAP 1.1 :- Attribute value mismatch",
+                    attributeInMaxTime.getAttributeValue().equals("This is only a test"));
+
+            iteratorInDetail.next();
+            element2 = (OMElement) iteratorInDetail.next();
+            assertTrue("SOAP 1.1 :- AveTime element mismatch",
+                    element2.getLocalName().equals("AveTime"));
+            assertTrue("SOAP 1.1 :- AveTime element namespace mismatch",
+                    element2.getNamespace().getName().equals(
+                            "http:www.sample.org"));
+
+            iteratorInAveTimeElement = element2.getChildren();
+
+            iteratorInAveTimeElement.next();
+            element21 = (OMElement) iteratorInAveTimeElement.next();
+            assertTrue("SOAP 1.1 :- Time element mismatch",
+                    element21.getLocalName().equals("Time"));
+            assertTrue("SOAP 1.1 :- Time element namespace mismatch",
+                    element21.getNamespace().getName().equals(
+                            "http:www.sample.org"));
+            assertTrue("SOAP 1.1 :- Text value in Time element mismatch",
+                    element21.getText().trim().equals("P3M"));
+
+            iteratorInFault.next();
+            OMElement testElement = (OMElement) iteratorInFault.next();
+            assertTrue("SOAP 1.1 :- Test element mismatch",
+                    testElement.getLocalName().equals("Test"));
+            assertTrue("SOAP 1.1 :- Test element namespace mismatch",
+                    testElement.getNamespace().getName().equals(
+                            "http:www.Test.org"));
+
+            OMElement childOfTestElement = testElement.getFirstElement();
+            assertTrue("SOAP 1.1 :- Test element child local name mismatch",
+                    childOfTestElement.getLocalName().equals("TestElement"));
+            assertTrue("SOAP 1.1 :- Test element child namespace mismatch",
+                    childOfTestElement.getNamespace().getName().equals(
+                            "http:www.Test.org"));
+            assertTrue("SOAP 1.1 :- Test element child value mismatch",
+                    childOfTestElement.getText().trim().equals("This is only a test"));
+
+        } catch (XMLStreamException e) {
+            log.info(e.getMessage());
+            fail("Test failed. Reason -> " + e.getMessage());
+        } catch (Exception e) {
+            log.info(e.getMessage());
+            fail("Test failed. Reason -> " + e.getMessage());
+
+        }
+    }
+}
diff --git a/test/org/apache/ws/commons/soap/impl/llom/soap11/SOAP11SerializerTest.java b/test/org/apache/ws/commons/soap/impl/llom/soap11/SOAP11SerializerTest.java
new file mode 100644
index 0000000..0b70a19
--- /dev/null
+++ b/test/org/apache/ws/commons/soap/impl/llom/soap11/SOAP11SerializerTest.java
@@ -0,0 +1,51 @@
+/*
+ * Copyright 2004,2005 The Apache Software Foundation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      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.
+ */
+
+package org.apache.ws.commons.soap.impl.llom.soap11;
+
+import org.apache.ws.commons.om.OMTestCase;
+import org.apache.ws.commons.soap.SOAPEnvelope;
+import org.apache.ws.commons.soap.impl.llom.builder.StAXSOAPModelBuilder;
+
+import javax.xml.stream.XMLOutputFactory;
+import javax.xml.stream.XMLStreamWriter;
+public class SOAP11SerializerTest extends OMTestCase {
+
+    public SOAP11SerializerTest(String testName) {
+        super(testName);
+    }
+
+    protected StAXSOAPModelBuilder getOMBuilder(String fileName) throws Exception {
+        return super.getOMBuilder(fileName);
+    }
+
+    protected void setUp() throws Exception {
+        super.setUp();
+        soapEnvelope =
+                (SOAPEnvelope) getOMBuilder("soap/soap11/soap11fault.xml")
+                .getDocumentElement();
+    }
+
+    public void testSerialize() throws Exception {
+        XMLStreamWriter output = XMLOutputFactory.newInstance().
+                createXMLStreamWriter(System.out);
+        soapEnvelope.serialize(output);
+
+        output = XMLOutputFactory.newInstance().
+                createXMLStreamWriter(System.out);
+        soapEnvelope.serializeAndConsume(output);
+    }
+}
diff --git a/test/org/apache/ws/commons/xpath/AXIOMXPathTest.java b/test/org/apache/ws/commons/xpath/AXIOMXPathTest.java
new file mode 100644
index 0000000..ccae7de
--- /dev/null
+++ b/test/org/apache/ws/commons/xpath/AXIOMXPathTest.java
@@ -0,0 +1,56 @@
+/*
+ * Copyright 2004,2005 The Apache Software Foundation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      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.
+ */
+
+
+package org.apache.ws.commons.xpath;
+
+import junit.framework.Test;
+import junit.framework.TestSuite;
+import org.apache.ws.commons.om.impl.llom.builder.StAXOMBuilder;
+import org.apache.ws.commons.om.xpath.DocumentNavigator;
+import org.jaxen.FunctionCallException;
+import org.jaxen.Navigator;
+
+import javax.xml.stream.XMLInputFactory;
+import javax.xml.stream.XMLStreamReader;
+import java.io.FileInputStream;
+
+public class AXIOMXPathTest extends XPathTestBase {
+    public AXIOMXPathTest(String name) {
+        super(name);
+    }
+
+    public static Test suite() {
+        return new TestSuite(AXIOMXPathTest.class);
+    }
+
+    public Navigator getNavigator() {
+        return new DocumentNavigator();
+    }
+
+    public Object getDocument(String uri) throws Exception {
+        try {
+            XMLStreamReader parser =
+                    XMLInputFactory.newInstance().createXMLStreamReader(
+                            new FileInputStream(uri));
+            StAXOMBuilder builder =
+                    new StAXOMBuilder(parser);
+            return builder.getDocumentElement();
+        } catch (Exception e) {
+            throw new FunctionCallException(e);
+        }
+    }
+}
diff --git a/test/org/apache/ws/commons/xpath/XPathTestBase.java b/test/org/apache/ws/commons/xpath/XPathTestBase.java
new file mode 100644
index 0000000..0cf3ec0
--- /dev/null
+++ b/test/org/apache/ws/commons/xpath/XPathTestBase.java
@@ -0,0 +1,1810 @@
+/*
+ * $Header: /home/projects/jaxen/scm/jaxen/src/java/test/org/jaxen/XPathTestBase.java,v 1.36 2005/06/17 13:22:31 elharo Exp $
+ * $Revision: 1.36 $
+ * $Date: 2005/06/17 13:22:31 $
+ *
+ * ====================================================================
+ *
+ * Copyright (C) 2000-2002 bob mcwhirter & James Strachan.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions, and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions, and the disclaimer that follows
+ *    these conditions in the documentation and/or other materials
+ *    provided with the distribution.
+ *
+ * 3. The name "Jaxen" must not be used to endorse or promote products
+ *    derived from this software without prior written permission.  For
+ *    written permission, please contact license@jaxen.org.
+ *
+ * 4. Products derived from this software may not be called "Jaxen", nor
+ *    may "Jaxen" appear in their name, without prior written permission
+ *    from the Jaxen Project Management (pm@jaxen.org).
+ *
+ * In addition, we request (but do not require) that you include in the
+ * end-user documentation provided with the redistribution and/or in the
+ * software itself an acknowledgement equivalent to the following:
+ *     "This product includes software developed by the
+ *      Jaxen Project (http://www.jaxen.org/)."
+ * Alternatively, the acknowledgment may be graphical using the logos
+ * available at http://www.jaxen.org/
+ *
+ * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED.  IN NO EVENT SHALL THE Jaxen AUTHORS OR THE PROJECT
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+ * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+ * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+ * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ *
+ * ====================================================================
+ * This software consists of voluntary contributions made by many
+ * individuals on behalf of the Jaxen Project and was originally
+ * created by bob mcwhirter <bob@werken.com> and
+ * James Strachan <jstrachan@apache.org>.  For more information on the
+ * Jaxen Project, please see <http://www.jaxen.org/>.
+ *
+ * $Id: XPathTestBase.java,v 1.36 2005/06/17 13:22:31 elharo Exp $
+ */
+
+
+package org.apache.ws.commons.xpath;
+
+import junit.framework.TestCase;
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.jaxen.BaseXPath;
+import org.jaxen.Context;
+import org.jaxen.ContextSupport;
+import org.jaxen.FunctionCallException;
+import org.jaxen.JaxenException;
+import org.jaxen.Navigator;
+import org.jaxen.SimpleNamespaceContext;
+import org.jaxen.SimpleVariableContext;
+import org.jaxen.UnsupportedAxisException;
+import org.jaxen.XPath;
+import org.jaxen.XPathFunctionContext;
+import org.jaxen.function.StringFunction;
+import org.jaxen.pattern.Pattern;
+import org.jaxen.saxpath.helpers.XPathReaderFactory;
+
+import java.util.ArrayList;
+import java.util.Iterator;
+import java.util.List;
+
+public abstract class XPathTestBase extends TestCase
+{
+    protected static String VAR_URI   = "http://jaxen.org/test-harness/var";
+    protected static String TESTS_ROOT = "test-resources/";
+    protected static String TESTS_XML = TESTS_ROOT + "xml/test/tests.xml";
+
+    protected static boolean verbose = false;
+    protected static boolean debug = false;
+    private ContextSupport contextSupport;
+    private Log log = LogFactory.getLog(getClass());
+
+    public XPathTestBase(String name)
+    {
+        super(name);
+    }
+
+    public void setUp()
+    {
+        this.contextSupport = null;
+        System.setProperty(XPathReaderFactory.DRIVER_PROPERTY,
+                "");
+        log("-----------------------------");
+    }
+
+    public void log(String text)
+    {
+        log(verbose,
+                text);
+    }
+
+    public void log(boolean actualVerbose,
+                    String text)
+    {
+        if (actualVerbose) log.info(text);
+    }
+
+    protected void assertCountXPath(int expectedSize, Object context, String xpathStr) throws JaxenException
+    {
+        assertCountXPath2(expectedSize, context, xpathStr);
+    }
+
+    protected Object assertCountXPath2(int expectedSize, Object context, String xpathStr) throws JaxenException
+    {
+        log(debug,
+                "  Select :: " + xpathStr);
+        BaseXPath xpath = new BaseXPath(xpathStr, getNavigator());
+        List results = xpath.selectNodes(getContext(context));
+        log(debug,
+                "    Expected Size :: " + expectedSize);
+        log(debug,
+                "    Result Size   :: " + results.size());
+        if (expectedSize != results.size())
+        {
+            log(debug,
+                    "      ## FAILED");
+            log(debug,
+                    "      ## xpath: " + xpath + " = " + xpath.debug());
+            Iterator resultIter = results.iterator();
+            while (resultIter.hasNext())
+            {
+                log(debug,
+                        "      --> " + resultIter.next());
+            }
+        }
+        assertEquals(xpathStr,
+                expectedSize,
+                results.size());
+        if (expectedSize > 0)
+        {
+            return results.get(0);
+        }
+        return null;
+    }
+
+    protected void assertInvalidXPath(Object context, String xpathStr)
+    {
+        try
+        {
+            log(debug,
+                    "  Select :: " + xpathStr);
+            BaseXPath xpath = new BaseXPath(xpathStr, getNavigator());
+            List results = xpath.selectNodes(getContext(context));
+            log(debug,
+                    "    Result Size   :: " + results.size());
+            fail("An exception was expected.");
+        }
+        catch (UnsupportedAxisException e)
+        {
+            log(debug,
+                    "      ## SKIPPED -- Unsupported Axis");
+        }
+        catch (JaxenException e)
+        {
+            log(debug, "    Caught expected exception " + e.getMessage());
+        }
+    }
+
+    protected void assertValueOfXPath(String expected, Object context, String xpathStr) throws JaxenException
+    {
+        try
+        {
+            BaseXPath xpath = new BaseXPath(xpathStr, getNavigator());
+            Object node = xpath.evaluate(getContext(context));
+            String result = StringFunction.evaluate(node,
+                    getNavigator());
+            log(debug,
+                    "  Select :: " + xpathStr);
+            log(debug,
+                    "    Expected :: " + expected);
+            log(debug,
+                    "    Result   :: " + result);
+            if (!expected.equals(result))
+            {
+                log(debug,
+                        "      ## FAILED");
+                log(debug,
+                        "      ## xpath: " + xpath + " = " + xpath.debug());
+            }
+            assertEquals(xpathStr,
+                    expected,
+                    result);
+        }
+        catch (UnsupportedAxisException e)
+        {
+            log(debug,
+                    "      ## SKIPPED -- Unsupported Axis ");
+        }
+    }
+
+    protected Context getContext(Object contextNode)
+    {
+        Context context = new Context(getContextSupport());
+        List list = new ArrayList(1);
+        list.add(contextNode);
+        context.setNodeSet(list);
+        return context;
+    }
+
+    public ContextSupport getContextSupport()
+    {
+        if (this.contextSupport == null)
+        {
+            this.contextSupport = new ContextSupport(new SimpleNamespaceContext(),
+                    XPathFunctionContext.getInstance(),
+                    new SimpleVariableContext(),
+                    getNavigator());
+        }
+        return this.contextSupport;
+    }
+
+    public abstract Navigator getNavigator();
+
+    public abstract Object getDocument(String url) throws Exception;
+
+    public void testGetNodeType() throws FunctionCallException, UnsupportedAxisException
+    {
+        Navigator nav = getNavigator();
+        Object document = nav.getDocument(TESTS_ROOT + "xml/testNamespaces.xml");
+        int count = 0;
+        Iterator descendantOrSelfAxisIterator = nav.getDescendantOrSelfAxisIterator(document);
+        while (descendantOrSelfAxisIterator.hasNext())
+        {
+            Object node = descendantOrSelfAxisIterator.next();
+            Iterator namespaceAxisIterator = nav.getNamespaceAxisIterator(node);
+            while (namespaceAxisIterator.hasNext())
+            {
+                count++;
+                assertEquals("Node type mismatch", Pattern.NAMESPACE_NODE, nav.getNodeType(namespaceAxisIterator.next()));
+            }
+        }
+        assertEquals(25, count);
+    }
+
+
+    /* test for jaxen-24
+    */
+    public void testid53371() throws JaxenException
+    {
+        Navigator nav = getNavigator();
+        String url = TESTS_ROOT + "xml/jaxen24.xml";
+        log("Document [" + url + "]");
+        Object document = nav.getDocument(url);
+        XPath contextpath = new BaseXPath("/body/div", nav);
+        log("Initial Context :: " + contextpath);
+        List list = contextpath.selectNodes(document);
+        Iterator iter = list.iterator();
+        while (iter.hasNext())
+        {
+            Object context = iter.next();
+            assertCountXPath(1, context, "preceding::*[1]");
+            assertValueOfXPath("span", context, "local-name(preceding::*[1])");
+        }
+    }
+
+    /* jaxen-58
+    */
+    public void testid53391() throws JaxenException
+    {
+        Navigator nav = getNavigator();
+        String url = TESTS_ROOT + "xml/jaxen24.xml";
+        log("Document [" + url + "]");
+        Object document = nav.getDocument(url);
+        XPath contextpath = new BaseXPath("/", nav);
+        log("Initial Context :: " + contextpath);
+        List list = contextpath.selectNodes(document);
+        Iterator iter = list.iterator();
+        while (iter.hasNext())
+        {
+            Object context = iter.next();
+            assertCountXPath(0, context, "//preceding::x");
+            assertCountXPath(0, context, "//following::x");
+            assertCountXPath(0, context, "/descendant::*/preceding::x");
+            assertCountXPath(0, context, "/descendant::node()/preceding::x");
+        }
+    }
+
+    /* test for jaxen-3
+    */
+    public void testid53430() throws JaxenException
+    {
+        Navigator nav = getNavigator();
+        String url = TESTS_ROOT + "xml/simple.xml";
+        log("Document [" + url + "]");
+        Object document = nav.getDocument(url);
+        XPath contextpath = new BaseXPath("/", nav);
+        log("Initial Context :: " + contextpath);
+        List list = contextpath.selectNodes(document);
+        Iterator iter = list.iterator();
+        while (iter.hasNext())
+        {
+            Object context = iter.next();
+            assertValueOfXPath("abd", context, "string()");
+        }
+    }
+
+    public void testid53441() throws JaxenException
+    {
+        Navigator nav = getNavigator();
+        String url = TESTS_ROOT + "xml/simple.xml";
+        log("Document [" + url + "]");
+        Object document = nav.getDocument(url);
+        XPath contextpath = new BaseXPath("/root", nav);
+        log("Initial Context :: " + contextpath);
+        List list = contextpath.selectNodes(document);
+        Iterator iter = list.iterator();
+        while (iter.hasNext())
+        {
+            Object context = iter.next();
+            assertValueOfXPath("abd", context, "string()");
+        }
+    }
+
+    public void testid53452() throws JaxenException
+    {
+        Navigator nav = getNavigator();
+        String url = TESTS_ROOT + "xml/simple.xml";
+        log("Document [" + url + "]");
+        Object document = nav.getDocument(url);
+        XPath contextpath = new BaseXPath("/root/a", nav);
+        log("Initial Context :: " + contextpath);
+        List list = contextpath.selectNodes(document);
+        Iterator iter = list.iterator();
+        while (iter.hasNext())
+        {
+            Object context = iter.next();
+            assertValueOfXPath("a", context, "string()");
+        }
+    }
+
+    public void testid53463() throws JaxenException
+    {
+        Navigator nav = getNavigator();
+        String url = TESTS_ROOT + "xml/simple.xml";
+        log("Document [" + url + "]");
+        Object document = nav.getDocument(url);
+        XPath contextpath = new BaseXPath("/root/c", nav);
+        log("Initial Context :: " + contextpath);
+        List list = contextpath.selectNodes(document);
+        Iterator iter = list.iterator();
+        while (iter.hasNext())
+        {
+            Object context = iter.next();
+            assertValueOfXPath("d", context, "string()");
+        }
+    }
+
+    /* test for jaxen-3
+    */
+    public void testid53482() throws JaxenException
+    {
+        Navigator nav = getNavigator();
+        String url = TESTS_ROOT + "xml/jaxen3.xml";
+        log("Document [" + url + "]");
+        Object document = nav.getDocument(url);
+        XPath contextpath = new BaseXPath("/", nav);
+        log("Initial Context :: " + contextpath);
+        List list = contextpath.selectNodes(document);
+        Iterator iter = list.iterator();
+        while (iter.hasNext())
+        {
+            Object context = iter.next();
+            assertCountXPath(1, context, "/Configuration/hostname/attrlist/hostname[. = 'CE-A'] ");
+        }
+    }
+
+    /* parser test cases all of which should fail
+    */
+    public void testid53502() throws JaxenException
+    {
+        Navigator nav = getNavigator();
+        String url = TESTS_ROOT + "xml/numbers.xml";
+        log("Document [" + url + "]");
+        Object document = nav.getDocument(url);
+        XPath contextpath = new BaseXPath("/", nav);
+        log("Initial Context :: " + contextpath);
+        List list = contextpath.selectNodes(document);
+        Iterator iter = list.iterator();
+        while (iter.hasNext())
+        {
+            Object context = iter.next();
+            /* repeated xpaths, jaxen-35
+            */
+            assertInvalidXPath(context, "/numbers numbers");
+            /* invalid xpath, jaxen-34
+            */
+            assertInvalidXPath(context, "/a/b[c > d]efg");
+            /* invalid xpath, jaxen-27
+            */
+            assertInvalidXPath(context, "/inv/child::");
+            /* invalid xpath, jaxen-26
+            */
+            assertInvalidXPath(context, "/invoice/@test[abcd");
+            assertInvalidXPath(context, "/invoice/@test[abcd > x");
+            /* unterminated string
+            */
+            assertInvalidXPath(context, "string-length('a");
+            /* various edge cases where code threw no exception
+            */
+            assertInvalidXPath(context, "/descendant::()");
+            assertInvalidXPath(context, "(1 + 1");
+        }
+    }
+
+    /* test cases for the use of underscores in names
+    */
+    public void testid53602() throws JaxenException
+    {
+        Navigator nav = getNavigator();
+        String url = TESTS_ROOT + "xml/underscore.xml";
+        log("Document [" + url + "]");
+        Object document = nav.getDocument(url);
+        XPath contextpath = new BaseXPath("/", nav);
+        log("Initial Context :: " + contextpath);
+        List list = contextpath.selectNodes(document);
+        Iterator iter = list.iterator();
+        while (iter.hasNext())
+        {
+            Object context = iter.next();
+            assertCountXPath(1, context, "/root/@a");
+            assertCountXPath(1, context, "/root/@_a");
+            assertCountXPath(1, context, "/root/b");
+            assertCountXPath(1, context, "/root/_b");
+            assertValueOfXPath("1", context, "/root/@a");
+            assertValueOfXPath("2", context, "/root/@_a");
+            assertValueOfXPath("1", context, "/root/b");
+            assertValueOfXPath("2", context, "/root/_b");
+        }
+    }
+
+    /* test cases for the use of = with node-sets
+    */
+    public void testid53662() throws JaxenException
+    {
+        Navigator nav = getNavigator();
+        String url = TESTS_ROOT + "xml/web.xml";
+        log("Document [" + url + "]");
+        Object document = nav.getDocument(url);
+        XPath contextpath = new BaseXPath("/", nav);
+        log("Initial Context :: " + contextpath);
+        List list = contextpath.selectNodes(document);
+        Iterator iter = list.iterator();
+        while (iter.hasNext())
+        {
+            Object context = iter.next();
+            assertValueOfXPath("true", context, "/web-app/servlet/servlet-name = 'file'");
+            assertValueOfXPath("true", context, "/web-app/servlet/servlet-name = 'snoop'");
+        }
+    }
+
+    public void testid53685() throws JaxenException
+    {
+        Navigator nav = getNavigator();
+        String url = TESTS_ROOT + "xml/numbers.xml";
+        log("Document [" + url + "]");
+        Object document = nav.getDocument(url);
+        XPath contextpath = new BaseXPath("/", nav);
+        log("Initial Context :: " + contextpath);
+        List list = contextpath.selectNodes(document);
+        Iterator iter = list.iterator();
+        while (iter.hasNext())
+        {
+            Object context = iter.next();
+            assertValueOfXPath("true", context, "/numbers/set/nr = '-3'");
+            assertValueOfXPath("true", context, "/numbers/set/nr = -3");
+            assertValueOfXPath("true", context, "/numbers/set/nr = 24");
+            assertValueOfXPath("true", context, "/numbers/set/nr/@value = '9999'");
+            assertValueOfXPath("true", context, "/numbers/set/nr/@value = 9999.0");
+            assertValueOfXPath("true", context, "/numbers/set/nr/@value = 66");
+        }
+    }
+
+    /* test basic math...
+    */
+    public void testid53733() throws JaxenException
+    {
+        Navigator nav = getNavigator();
+        String url = TESTS_ROOT + "xml/numbers.xml";
+        log("Document [" + url + "]");
+        Object document = nav.getDocument(url);
+        XPath contextpath = new BaseXPath("/", nav);
+        log("Initial Context :: " + contextpath);
+        List list = contextpath.selectNodes(document);
+        Iterator iter = list.iterator();
+        while (iter.hasNext())
+        {
+            Object context = iter.next();
+            assertValueOfXPath("true", context, "(8 * 2 + 1) = 17");
+            assertValueOfXPath("true", context, "(1 + 8 * 2) = 17");
+            assertValueOfXPath("true", context, "(7 - 3 + 1) = 5");
+            assertValueOfXPath("true", context, "(8 - 4 + 5 - 6) = 3");
+            /* left-assoc tests, comments show WRONG evaluation
+            */
+            /* 3 - 2 - 1 != 2
+            */
+            assertValueOfXPath("0", context, "3 - 2 - 1");
+            /* 8 div 4 div 2 != 4
+            */
+            assertValueOfXPath("1", context, "8 div 4 div 2");
+            /* 3 mod 5 mod 7 != 1
+            */
+            assertValueOfXPath("3", context, "3 mod 7 mod 5");
+            /* 1=(2=2) is true
+            */
+            assertValueOfXPath("false", context, "1 = 2 = 2");
+            /*  2!=(3!=1) => 2!=1 => true, (2!=3)!=1 => 1!=1 => false
+            */
+            assertValueOfXPath("false", context, "2 != 3 != 1");
+            /* 3 > (2 > 1) is true
+            */
+            assertValueOfXPath("false", context, "3 > 2 > 1");
+            /* 3 >= (2 >= 2) is true
+            */
+            assertValueOfXPath("false", context, "3 >= 2 >= 2");
+            /* 1 < (2 < 3) is false
+            */
+            assertValueOfXPath("true", context, "1 < 2 < 3");
+            /* 0 <= (2 <= 3) is true
+            */
+            assertValueOfXPath("true", context, "2 <= 2 <= 3");
+        }
+    }
+
+    /* test cases for preceding axis with different node types
+    */
+    public void testid53850() throws JaxenException
+    {
+        Navigator nav = getNavigator();
+        String url = TESTS_ROOT + "xml/pi2.xml";
+        log("Document [" + url + "]");
+        Object document = nav.getDocument(url);
+        XPath contextpath = new BaseXPath("/a/c", nav);
+        log("Initial Context :: " + contextpath);
+        List list = contextpath.selectNodes(document);
+        Iterator iter = list.iterator();
+        while (iter.hasNext())
+        {
+            Object context = iter.next();
+            assertCountXPath(1, context, "//processing-instruction()");
+            assertCountXPath(1, context, "preceding-sibling::*");
+            assertCountXPath(5, context, "preceding-sibling::node()");
+            assertCountXPath(1, context, "preceding-sibling::*[1]");
+            assertCountXPath(1, context, "preceding-sibling::processing-instruction()");
+            assertValueOfXPath("order-by=\"x\"", context, "preceding-sibling::processing-instruction()");
+            assertValueOfXPath("foo", context, "preceding-sibling::*[1]");
+            assertValueOfXPath("order-by=\"x\"", context, "preceding-sibling::node()[2]");
+        }
+    }
+
+    public void testid53911() throws JaxenException
+    {
+        Navigator nav = getNavigator();
+        String url = TESTS_ROOT + "xml/id.xml";
+        log("Document [" + url + "]");
+        Object document = nav.getDocument(url);
+        XPath contextpath = new BaseXPath("/", nav);
+        log("Initial Context :: " + contextpath);
+        List list = contextpath.selectNodes(document);
+        SimpleVariableContext varContext = new SimpleVariableContext();
+        varContext.setVariableValue(null, "foobar", "foobar");
+        varContext.setVariableValue(null, "foo", "foo");
+        getContextSupport().setVariableContext(varContext);
+        Iterator iter = list.iterator();
+        while (iter.hasNext())
+        {
+            Object context = iter.next();
+            assertValueOfXPath("foobar", context, "$foobar");
+            assertCountXPath(1, context, "/foo[@id=$foobar]");
+            assertCountXPath(0, context, "/foo[@id='$foobar']");
+            assertCountXPath(1, context, "/foo[concat($foo, 'bar')=@id]");
+            assertCountXPath(0, context, "CD_Library/artist[@name=$artist]");
+        }
+    }
+
+    public void testid53957() throws JaxenException
+    {
+        Navigator nav = getNavigator();
+        String url = TESTS_ROOT + "xml/id.xml";
+        log("Document [" + url + "]");
+        Object document = nav.getDocument(url);
+        XPath contextpath = new BaseXPath("/", nav);
+        log("Initial Context :: " + contextpath);
+        List list = contextpath.selectNodes(document);
+        Iterator iter = list.iterator();
+        while (iter.hasNext())
+        {
+            Object context = iter.next();
+            /* attributes have a parent: their element
+            */
+            assertCountXPath(1, context, "/foo/@id/parent::foo");
+        }
+    }
+
+    /* attributes can also be used as context nodes
+    */
+    public void testid53975() throws JaxenException
+    {
+        Navigator nav = getNavigator();
+        String url = TESTS_ROOT + "xml/id.xml";
+        log("Document [" + url + "]");
+        Object document = nav.getDocument(url);
+        XPath contextpath = new BaseXPath("/foo/@id", nav);
+        log("Initial Context :: " + contextpath);
+        List list = contextpath.selectNodes(document);
+        Iterator iter = list.iterator();
+        while (iter.hasNext())
+        {
+            Object context = iter.next();
+            assertCountXPath(1, context, "parent::foo");
+        }
+    }
+
+    public void testid53992() throws JaxenException
+    {
+        Navigator nav = getNavigator();
+        String url = TESTS_ROOT + "xml/pi.xml";
+        log("Document [" + url + "]");
+        Object document = nav.getDocument(url);
+        XPath contextpath = new BaseXPath("/", nav);
+        log("Initial Context :: " + contextpath);
+        List list = contextpath.selectNodes(document);
+        Iterator iter = list.iterator();
+        while (iter.hasNext())
+        {
+            Object context = iter.next();
+            assertCountXPath(3, context, "//processing-instruction()");
+            assertCountXPath(2, context, "//processing-instruction('cheese')");
+            try
+            {
+                Object result = assertCountXPath2(1, context, "//processing-instruction('toast')");
+                assertValueOfXPath("is tasty", result, "string()");
+            }
+            catch (UnsupportedAxisException e)
+            {
+                log(debug, "      ## SKIPPED -- Unsupported Axis");
+            }
+        }
+    }
+
+    /* test evaluate() extension function
+    */
+    public void testid54032() throws JaxenException
+    {
+        Navigator nav = getNavigator();
+        String url = TESTS_ROOT + "xml/evaluate.xml";
+        log("Document [" + url + "]");
+        Object document = nav.getDocument(url);
+        XPath contextpath = new BaseXPath("/", nav);
+        log("Initial Context :: " + contextpath);
+        List list = contextpath.selectNodes(document);
+        Iterator iter = list.iterator();
+        while (iter.hasNext())
+        {
+            Object context = iter.next();
+            assertCountXPath(3, context, "evaluate('//jumps/*')");
+            assertCountXPath(1, context, "evaluate('//jumps/object/dog')");
+            assertCountXPath(0, context, "evaluate('//jumps/object')/evaluate");
+            assertCountXPath(1, context, "evaluate('//jumps/object')/dog");
+            assertCountXPath(1, context, "evaluate('//jumps/*')/dog");
+            assertCountXPath(1, context, "//metatest[ evaluate(@select) = . ]");
+        }
+    }
+
+    public void testid54082() throws JaxenException
+    {
+        Navigator nav = getNavigator();
+        String url = TESTS_ROOT + "xml/numbers.xml";
+        log("Document [" + url + "]");
+        Object document = nav.getDocument(url);
+        XPath contextpath = new BaseXPath("/numbers/set[1]", nav);
+        log("Initial Context :: " + contextpath);
+        List list = contextpath.selectNodes(document);
+        Iterator iter = list.iterator();
+        while (iter.hasNext())
+        {
+            Object context = iter.next();
+            assertCountXPath(1, context, "*[-3 = .]");
+            assertValueOfXPath("true", context, "54 < *");
+            assertValueOfXPath("true", context, "55 <= *");
+            assertValueOfXPath("false", context, "69 < *");
+            assertValueOfXPath("true", context, "-2 > *");
+            assertValueOfXPath("true", context, "-3 >= *");
+            assertValueOfXPath("false", context, "-4 >= *");
+        }
+    }
+
+    /* TODO
+    This context should work, but needs a fixed version of saxpath to parse the right-hand side
+    of the greater-than expression.
+    <context select="/numbers/set[2]">
+      <valueOf select="1 &gt; nr/@value">false</valueOf>
+      <valueOf select="55 &gt; nr/@value">false</valueOf>
+      <valueOf select="55 &gt;= nr/@value">true</valueOf>
+      <valueOf select="1000000 &gt; nr/@value">true</valueOf>
+    </context>
+    
+    */
+    /* test sibling axes 
+    */
+    public void testid54145() throws JaxenException
+    {
+        Navigator nav = getNavigator();
+        String url = TESTS_ROOT + "xml/axis.xml";
+        log("Document [" + url + "]");
+        Object document = nav.getDocument(url);
+        XPath contextpath = new BaseXPath("/root", nav);
+        log("Initial Context :: " + contextpath);
+        List list = contextpath.selectNodes(document);
+        Iterator iter = list.iterator();
+        while (iter.hasNext())
+        {
+            Object context = iter.next();
+            assertCountXPath(0, context, "preceding-sibling::*");
+        }
+    }
+
+    public void testid54156() throws JaxenException
+    {
+        Navigator nav = getNavigator();
+        String url = TESTS_ROOT + "xml/axis.xml";
+        log("Document [" + url + "]");
+        Object document = nav.getDocument(url);
+        XPath contextpath = new BaseXPath("/root/a/a.3", nav);
+        log("Initial Context :: " + contextpath);
+        List list = contextpath.selectNodes(document);
+        Iterator iter = list.iterator();
+        while (iter.hasNext())
+        {
+            Object context = iter.next();
+            assertCountXPath(2, context, "preceding::*");
+        }
+    }
+
+    public void testid54168() throws JaxenException
+    {
+        Navigator nav = getNavigator();
+        String url = TESTS_ROOT + "xml/axis.xml";
+        log("Document [" + url + "]");
+        Object document = nav.getDocument(url);
+        XPath contextpath = new BaseXPath("/root/a/a.3", nav);
+        log("Initial Context :: " + contextpath);
+        List list = contextpath.selectNodes(document);
+        Iterator iter = list.iterator();
+        while (iter.hasNext())
+        {
+            Object context = iter.next();
+            assertCountXPath(2, context, "preceding-sibling::*");
+        }
+    }
+
+    public void testid54180() throws JaxenException
+    {
+        Navigator nav = getNavigator();
+        String url = TESTS_ROOT + "xml/axis.xml";
+        log("Document [" + url + "]");
+        Object document = nav.getDocument(url);
+        XPath contextpath = new BaseXPath("/", nav);
+        log("Initial Context :: " + contextpath);
+        List list = contextpath.selectNodes(document);
+        Iterator iter = list.iterator();
+        while (iter.hasNext())
+        {
+            Object context = iter.next();
+            assertValueOfXPath("a.2", context, "name(/root/a/a.3/preceding-sibling::*[1])");
+            assertValueOfXPath("a.1", context, "name(/root/a/a.3/preceding-sibling::*[2])");
+        }
+    }
+
+    public void testid54197() throws JaxenException
+    {
+        Navigator nav = getNavigator();
+        String url = TESTS_ROOT + "xml/axis.xml";
+        log("Document [" + url + "]");
+        Object document = nav.getDocument(url);
+        XPath contextpath = new BaseXPath("/", nav);
+        log("Initial Context :: " + contextpath);
+        List list = contextpath.selectNodes(document);
+        Iterator iter = list.iterator();
+        while (iter.hasNext())
+        {
+            Object context = iter.next();
+            assertValueOfXPath("a.4", context, "name(/root/a/a.3/following-sibling::*[1])");
+            assertValueOfXPath("a.5", context, "name(/root/a/a.3/following-sibling::*[2])");
+        }
+    }
+
+    public void testid54219() throws JaxenException
+    {
+        Navigator nav = getNavigator();
+        String url = TESTS_ROOT + "xml/web.xml";
+        log("Document [" + url + "]");
+        Object document = nav.getDocument(url);
+        XPath contextpath = new BaseXPath("/", nav);
+        log("Initial Context :: " + contextpath);
+        List list = contextpath.selectNodes(document);
+        Iterator iter = list.iterator();
+        while (iter.hasNext())
+        {
+            Object context = iter.next();
+            assertValueOfXPath("snoop", context, "/web-app/servlet[1]/servlet-name");
+            assertValueOfXPath("snoop", context, "/web-app/servlet[1]/servlet-name/text()");
+            assertValueOfXPath("file", context, "/web-app/servlet[2]/servlet-name");
+            assertValueOfXPath("file", context, "/web-app/servlet[2]/servlet-name/text()");
+        }
+    }
+
+    public void testid54249() throws JaxenException
+    {
+        Navigator nav = getNavigator();
+        String url = TESTS_ROOT + "xml/web.xml";
+        log("Document [" + url + "]");
+        Object document = nav.getDocument(url);
+        XPath contextpath = new BaseXPath("/web-app/servlet[1]", nav);
+        log("Initial Context :: " + contextpath);
+        List list = contextpath.selectNodes(document);
+        Iterator iter = list.iterator();
+        while (iter.hasNext())
+        {
+            Object context = iter.next();
+            assertValueOfXPath("snoop", context, "servlet-name");
+            assertValueOfXPath("snoop", context, "servlet-name/text()");
+        }
+    }
+
+    public void testid54266() throws JaxenException
+    {
+        Navigator nav = getNavigator();
+        String url = TESTS_ROOT + "xml/web.xml";
+        log("Document [" + url + "]");
+        Object document = nav.getDocument(url);
+        XPath contextpath = new BaseXPath("/web-app/servlet[2]/servlet-name", nav);
+        log("Initial Context :: " + contextpath);
+        List list = contextpath.selectNodes(document);
+        Iterator iter = list.iterator();
+        while (iter.hasNext())
+        {
+            Object context = iter.next();
+            assertCountXPath(3, context, "preceding::*");
+        }
+    }
+
+    public void testid54278() throws JaxenException
+    {
+        Navigator nav = getNavigator();
+        String url = TESTS_ROOT + "xml/web.xml";
+        log("Document [" + url + "]");
+        Object document = nav.getDocument(url);
+        XPath contextpath = new BaseXPath("/web-app/servlet[2]/servlet-name", nav);
+        log("Initial Context :: " + contextpath);
+        List list = contextpath.selectNodes(document);
+        Iterator iter = list.iterator();
+        while (iter.hasNext())
+        {
+            Object context = iter.next();
+            assertCountXPath(13, context, "following::*");
+        }
+    }
+
+    /* test name
+    */
+    public void testid54298() throws JaxenException
+    {
+        Navigator nav = getNavigator();
+        String url = TESTS_ROOT + "xml/web.xml";
+        log("Document [" + url + "]");
+        Object document = nav.getDocument(url);
+        XPath contextpath = new BaseXPath("/", nav);
+        log("Initial Context :: " + contextpath);
+        List list = contextpath.selectNodes(document);
+        Iterator iter = list.iterator();
+        while (iter.hasNext())
+        {
+            Object context = iter.next();
+            try
+            {
+                Object result = assertCountXPath2(1, context, "*");
+                assertValueOfXPath("web-app", result, "name()");
+            }
+            catch (UnsupportedAxisException e)
+            {
+                log(debug, "      ## SKIPPED -- Unsupported Axis");
+            }
+            /* NOTE that the child::node() tests only work if the
+              XML document does not comments or PIs
+
+            */
+            try
+            {
+                Object result = assertCountXPath2(1, context, "./*");
+                assertValueOfXPath("web-app", result, "name()");
+            }
+            catch (UnsupportedAxisException e)
+            {
+                log(debug, "      ## SKIPPED -- Unsupported Axis");
+            }
+            try
+            {
+                Object result = assertCountXPath2(1, context, "child::*");
+                assertValueOfXPath("web-app", result, "name()");
+            }
+            catch (UnsupportedAxisException e)
+            {
+                log(debug, "      ## SKIPPED -- Unsupported Axis");
+            }
+            try
+            {
+                Object result = assertCountXPath2(1, context, "/*");
+                assertValueOfXPath("web-app", result, "name()");
+            }
+            catch (UnsupportedAxisException e)
+            {
+                log(debug, "      ## SKIPPED -- Unsupported Axis");
+            }
+            try
+            {
+                Object result = assertCountXPath2(1, context, "/child::node()");
+                assertValueOfXPath("web-app", result, "name(.)");
+            }
+            catch (UnsupportedAxisException e)
+            {
+                log(debug, "      ## SKIPPED -- Unsupported Axis");
+            }
+            try
+            {
+                Object result = assertCountXPath2(1, context, "child::node()");
+                assertValueOfXPath("web-app", result, "name(.)");
+            }
+            catch (UnsupportedAxisException e)
+            {
+                log(debug, "      ## SKIPPED -- Unsupported Axis");
+            }
+            /* empty names
+            */
+            assertValueOfXPath("", context, "name()");
+            assertValueOfXPath("", context, "name(.)");
+            assertValueOfXPath("", context, "name(parent::*)");
+            assertValueOfXPath("", context, "name(/)");
+            assertValueOfXPath("", context, "name(/.)");
+            assertValueOfXPath("", context, "name(/self::node())");
+            /* name of root elemet
+            */
+            assertValueOfXPath("web-app", context, "name(node())");
+            assertValueOfXPath("web-app", context, "name(/node())");
+            assertValueOfXPath("web-app", context, "name(/*)");
+            assertValueOfXPath("web-app", context, "name(/child::*)");
+            assertValueOfXPath("web-app", context, "name(/child::node())");
+            assertValueOfXPath("web-app", context, "name(/child::node())");
+            assertValueOfXPath("web-app", context, "name(child::node())");
+            assertValueOfXPath("web-app", context, "name(./*)");
+            assertValueOfXPath("web-app", context, "name(*)");
+        }
+    }
+
+    public void testid54467() throws JaxenException
+    {
+        Navigator nav = getNavigator();
+        String url = TESTS_ROOT + "xml/web.xml";
+        log("Document [" + url + "]");
+        Object document = nav.getDocument(url);
+        XPath contextpath = new BaseXPath("/*", nav);
+        log("Initial Context :: " + contextpath);
+        List list = contextpath.selectNodes(document);
+        Iterator iter = list.iterator();
+        while (iter.hasNext())
+        {
+            Object context = iter.next();
+            /* empty names
+            */
+            assertValueOfXPath("", context, "name(..)");
+            assertValueOfXPath("", context, "name(parent::node())");
+            assertValueOfXPath("", context, "name(parent::*)");
+            /* name of root elemet
+            */
+            assertValueOfXPath("web-app", context, "name()");
+            assertValueOfXPath("web-app", context, "name(.)");
+            assertValueOfXPath("web-app", context, "name(../*)");
+            assertValueOfXPath("web-app", context, "name(../child::node())");
+        }
+    }
+
+    /* test predicates
+    */
+    public void testid54522() throws JaxenException
+    {
+        Navigator nav = getNavigator();
+        String url = TESTS_ROOT + "xml/nitf.xml";
+        log("Document [" + url + "]");
+        Object document = nav.getDocument(url);
+        XPath contextpath = new BaseXPath("/nitf/head/docdata", nav);
+        log("Initial Context :: " + contextpath);
+        List list = contextpath.selectNodes(document);
+        Iterator iter = list.iterator();
+        while (iter.hasNext())
+        {
+            Object context = iter.next();
+            assertCountXPath(1, context, "doc-id[@regsrc='AP' and @id-string='D76UIMO80']");
+        }
+    }
+
+    public void testid54534() throws JaxenException
+    {
+        Navigator nav = getNavigator();
+        String url = TESTS_ROOT + "xml/nitf.xml";
+        log("Document [" + url + "]");
+        Object document = nav.getDocument(url);
+        XPath contextpath = new BaseXPath("/nitf/head", nav);
+        log("Initial Context :: " + contextpath);
+        List list = contextpath.selectNodes(document);
+        Iterator iter = list.iterator();
+        while (iter.hasNext())
+        {
+            Object context = iter.next();
+            assertCountXPath(1, context, "meta[@name='ap-cycle']");
+            assertCountXPath(1, context, "meta[@content='AP']");
+            assertCountXPath(8, context, "meta[@name and @content]");
+            assertCountXPath(1, context, "meta[@name='ap-cycle' and @content='AP']");
+            assertCountXPath(7, context, "meta[@name != 'ap-cycle']");
+        }
+    }
+
+    public void testid54570() throws JaxenException
+    {
+        Navigator nav = getNavigator();
+        String url = TESTS_ROOT + "xml/nitf.xml";
+        log("Document [" + url + "]");
+        Object document = nav.getDocument(url);
+        XPath contextpath = new BaseXPath("/", nav);
+        log("Initial Context :: " + contextpath);
+        List list = contextpath.selectNodes(document);
+        Iterator iter = list.iterator();
+        while (iter.hasNext())
+        {
+            Object context = iter.next();
+            assertCountXPath(1, context, "/nitf/head/meta[@name='ap-cycle']");
+            assertCountXPath(1, context, "/nitf/head/meta[@content='AP']");
+            assertCountXPath(8, context, "/nitf/head/meta[@name and @content]");
+            assertCountXPath(1, context, "/nitf/head/meta[@name='ap-cycle' and @content='AP']");
+            assertCountXPath(7, context, "/nitf/head/meta[@name != 'ap-cycle']");
+        }
+    }
+
+    public void testid54614() throws JaxenException
+    {
+        Navigator nav = getNavigator();
+        String url = TESTS_ROOT + "xml/moreover.xml";
+        log("Document [" + url + "]");
+        Object document = nav.getDocument(url);
+        XPath contextpath = new BaseXPath("/", nav);
+        log("Initial Context :: " + contextpath);
+        List list = contextpath.selectNodes(document);
+        Iterator iter = list.iterator();
+        while (iter.hasNext())
+        {
+            Object context = iter.next();
+            assertCountXPath(1, context, "/child::node()");
+            assertCountXPath(1, context, "/*");
+            assertCountXPath(20, context, "/*/article");
+            assertCountXPath(221, context, "//*");
+            assertCountXPath(20, context, "//*[local-name()='article']");
+            assertCountXPath(20, context, "//article");
+            assertCountXPath(20, context, "/*/*[@code]");
+            assertCountXPath(1, context, "/moreovernews/article[@code='13563275']");
+            try
+            {
+                BaseXPath xpath = new BaseXPath("/moreovernews/article[@code='13563275']", getNavigator());
+                List results = xpath.selectNodes(getContext(context));
+                Object result = results.get(0);
+                assertValueOfXPath("http://c.moreover.com/click/here.pl?x13563273", result, "url");
+            }
+            catch (UnsupportedAxisException e)
+            {
+                log(debug, "      ## SKIPPED -- Unsupported Axis");
+            }
+            try
+            {
+                BaseXPath xpath = new BaseXPath("/*/article[@code='13563275']", getNavigator());
+                List results = xpath.selectNodes(getContext(context));
+                Object result = results.get(0);
+                assertValueOfXPath("http://c.moreover.com/click/here.pl?x13563273", result, "url");
+            }
+            catch (UnsupportedAxisException e)
+            {
+                log(debug, "      ## SKIPPED -- Unsupported Axis");
+            }
+            try
+            {
+                BaseXPath xpath = new BaseXPath("//article[@code='13563275']", getNavigator());
+                List results = xpath.selectNodes(getContext(context));
+                Object result = results.get(0);
+                assertValueOfXPath("http://c.moreover.com/click/here.pl?x13563273", result, "url");
+            }
+            catch (UnsupportedAxisException e)
+            {
+                log(debug, "      ## SKIPPED -- Unsupported Axis");
+            }
+            try
+            {
+                BaseXPath xpath = new BaseXPath("//*[@code='13563275']", getNavigator());
+                List results = xpath.selectNodes(getContext(context));
+                Object result = results.get(0);
+                assertValueOfXPath("http://c.moreover.com/click/here.pl?x13563273", result, "url");
+            }
+            catch (UnsupportedAxisException e)
+            {
+                log(debug, "      ## SKIPPED -- Unsupported Axis");
+            }
+            try
+            {
+                BaseXPath xpath = new BaseXPath("/child::node()/child::node()[@code='13563275']", getNavigator());
+                List results = xpath.selectNodes(getContext(context));
+                Object result = results.get(0);
+                assertValueOfXPath("http://c.moreover.com/click/here.pl?x13563273", result, "url");
+            }
+            catch (UnsupportedAxisException e)
+            {
+                log(debug, "      ## SKIPPED -- Unsupported Axis");
+            }
+            try
+            {
+                BaseXPath xpath = new BaseXPath("/*/*[@code='13563275']", getNavigator());
+                List results = xpath.selectNodes(getContext(context));
+                Object result = results.get(0);
+                assertValueOfXPath("http://c.moreover.com/click/here.pl?x13563273", result, "url");
+            }
+            catch (UnsupportedAxisException e)
+            {
+                log(debug, "      ## SKIPPED -- Unsupported Axis");
+            }
+        }
+    }
+
+    /* test other node types
+    */
+    public void testid54747() throws JaxenException
+    {
+        Navigator nav = getNavigator();
+        String url = TESTS_ROOT + "xml/contents.xml";
+        log("Document [" + url + "]");
+        Object document = nav.getDocument(url);
+        XPath contextpath = new BaseXPath("/", nav);
+        log("Initial Context :: " + contextpath);
+        List list = contextpath.selectNodes(document);
+        Iterator iter = list.iterator();
+        while (iter.hasNext())
+        {
+            Object context = iter.next();
+            assertCountXPath(3, context, "processing-instruction()");
+            assertCountXPath(3, context, "/processing-instruction()");
+            assertCountXPath(1, context, "/comment()");
+            assertCountXPath(1, context, "comment()");
+            assertCountXPath(2, context, "/child::node()/comment()");
+            assertCountXPath(2, context, "/*/comment()");
+            assertCountXPath(3, context, "//comment()");
+        }
+    }
+
+    /* test positioning
+    */
+    public void testid54802() throws JaxenException
+    {
+        Navigator nav = getNavigator();
+        String url = TESTS_ROOT + "xml/fibo.xml";
+        log("Document [" + url + "]");
+        Object document = nav.getDocument(url);
+        XPath contextpath = new BaseXPath("/", nav);
+        log("Initial Context :: " + contextpath);
+        List list = contextpath.selectNodes(document);
+        Iterator iter = list.iterator();
+        while (iter.hasNext())
+        {
+            Object context = iter.next();
+            assertCountXPath(9, context, "/*/fibonacci[position() < 10]");
+            assertValueOfXPath("196417", context, "sum(//fibonacci)");
+            assertValueOfXPath("325", context, "sum(//fibonacci/@index)");
+            assertValueOfXPath("1", context, "/*/fibonacci[2]");
+            assertValueOfXPath("75025", context, "/*/fibonacci[ count(/*/fibonacci) ]");
+            assertValueOfXPath("46368", context, "/*/fibonacci[ count(/*/fibonacci) - 1 ]");
+        }
+    }
+
+    /* test number functions
+    */
+    /* test Axes 
+    */
+    public void testid54853() throws JaxenException
+    {
+        Navigator nav = getNavigator();
+        String url = TESTS_ROOT + "xml/web.xml";
+        log("Document [" + url + "]");
+        Object document = nav.getDocument(url);
+        XPath contextpath = new BaseXPath("/", nav);
+        log("Initial Context :: " + contextpath);
+        List list = contextpath.selectNodes(document);
+        Iterator iter = list.iterator();
+        while (iter.hasNext())
+        {
+            Object context = iter.next();
+            assertCountXPath(19, context, "descendant-or-self::*");
+            assertCountXPath(19, context, "descendant::*");
+            assertCountXPath(19, context, "/descendant::*");
+            assertCountXPath(19, context, "/descendant-or-self::*");
+            assertCountXPath(2, context, "/descendant::servlet");
+            assertCountXPath(2, context, "/descendant-or-self::servlet");
+            assertCountXPath(2, context, "descendant-or-self::servlet");
+            assertCountXPath(2, context, "descendant::servlet");
+            assertCountXPath(2, context, "/*/servlet");
+            assertValueOfXPath("2", context, "count(/*/servlet)");
+            assertCountXPath(2, context, "//servlet");
+            assertValueOfXPath("2", context, "count(//servlet)");
+        }
+    }
+
+    public void testid54932() throws JaxenException
+    {
+        Navigator nav = getNavigator();
+        String url = TESTS_ROOT + "xml/web.xml";
+        log("Document [" + url + "]");
+        Object document = nav.getDocument(url);
+        XPath contextpath = new BaseXPath("/web-app", nav);
+        log("Initial Context :: " + contextpath);
+        List list = contextpath.selectNodes(document);
+        Iterator iter = list.iterator();
+        while (iter.hasNext())
+        {
+            Object context = iter.next();
+            assertCountXPath(2, context, "/descendant::servlet");
+            assertCountXPath(2, context, "/descendant-or-self::servlet");
+            assertCountXPath(2, context, "descendant-or-self::servlet");
+            assertCountXPath(2, context, "descendant::servlet");
+        }
+    }
+
+    public void testid54968() throws JaxenException
+    {
+        Navigator nav = getNavigator();
+        String url = TESTS_ROOT + "xml/much_ado.xml";
+        log("Document [" + url + "]");
+        Object document = nav.getDocument(url);
+        XPath contextpath = new BaseXPath("/", nav);
+        log("Initial Context :: " + contextpath);
+        List list = contextpath.selectNodes(document);
+        Iterator iter = list.iterator();
+        while (iter.hasNext())
+        {
+            Object context = iter.next();
+            assertCountXPath(5, context, "/descendant::ACT");
+            assertCountXPath(5, context, "descendant::ACT");
+            assertValueOfXPath("Much Ado about Nothing", context, "/PLAY/TITLE");
+            assertValueOfXPath("4", context, "2+2");
+            assertValueOfXPath("21", context, "5 * 4 + 1");
+            assertValueOfXPath("5", context, "count(descendant::ACT)");
+            assertValueOfXPath("35", context, "10 + count(descendant::ACT) * 5");
+            assertValueOfXPath("75", context, "(10 + count(descendant::ACT)) * 5");
+        }
+    }
+
+    public void testid55020() throws JaxenException
+    {
+        Navigator nav = getNavigator();
+        String url = TESTS_ROOT + "xml/much_ado.xml";
+        log("Document [" + url + "]");
+        Object document = nav.getDocument(url);
+        XPath contextpath = new BaseXPath("/PLAY/ACT[2]/SCENE[1]", nav);
+        log("Initial Context :: " + contextpath);
+        List list = contextpath.selectNodes(document);
+        Iterator iter = list.iterator();
+        while (iter.hasNext())
+        {
+            Object context = iter.next();
+            assertCountXPath(5, context, "/descendant::ACT");
+            assertCountXPath(5, context, "../../descendant::ACT");
+            assertCountXPath(141, context, "/PLAY/ACT[2]/SCENE[1]/descendant::SPEAKER");
+            assertCountXPath(141, context, "descendant::SPEAKER");
+            assertValueOfXPath("646", context, "count(descendant::*)+1");
+            assertValueOfXPath("142", context, "count(descendant::SPEAKER)+1");
+            assertValueOfXPath("2", context, "count(ancestor::*)");
+            assertValueOfXPath("1", context, "count(ancestor::PLAY)");
+            assertValueOfXPath("3", context, "count(ancestor-or-self::*)");
+            assertValueOfXPath("1", context, "count(ancestor-or-self::PLAY)");
+            assertValueOfXPath("6", context, "5+count(ancestor::*)-1");
+        }
+    }
+
+    public void testid55090() throws JaxenException
+    {
+        Navigator nav = getNavigator();
+        String url = TESTS_ROOT + "xml/much_ado.xml";
+        log("Document [" + url + "]");
+        Object document = nav.getDocument(url);
+        XPath contextpath = new BaseXPath("/", nav);
+        log("Initial Context :: " + contextpath);
+        List list = contextpath.selectNodes(document);
+        Iterator iter = list.iterator();
+        while (iter.hasNext())
+        {
+            Object context = iter.next();
+            /* Test correct predicate application
+            */
+            assertValueOfXPath("5", context, "count(/PLAY/ACT/SCENE[1])");
+        }
+    }
+
+    /* test axis node ordering
+    */
+    public void testid55112() throws JaxenException
+    {
+        Navigator nav = getNavigator();
+        String url = TESTS_ROOT + "xml/web.xml";
+        log("Document [" + url + "]");
+        Object document = nav.getDocument(url);
+        XPath contextpath = new BaseXPath("/", nav);
+        log("Initial Context :: " + contextpath);
+        List list = contextpath.selectNodes(document);
+        Iterator iter = list.iterator();
+        while (iter.hasNext())
+        {
+            Object context = iter.next();
+            /* Reported as Jira issue JAXEN-24
+            */
+            assertCountXPath(1, context, "//servlet-mapping/preceding::*[1][name()='description']");
+            assertCountXPath(1, context, "/web-app/servlet//description/following::*[1][name()='servlet-mapping']");
+            assertCountXPath(1, context, "/web-app/servlet//description/following::*[2][name()='servlet-name']");
+        }
+    }
+
+    /* test document function
+    */
+    public void testid55150() throws JaxenException
+    {
+        Navigator nav = getNavigator();
+        String url = TESTS_ROOT + "xml/text.xml";
+        log("Document [" + url + "]");
+        Object document = nav.getDocument(url);
+        XPath contextpath = new BaseXPath("/", nav);
+        log("Initial Context :: " + contextpath);
+        List list = contextpath.selectNodes(document);
+        Iterator iter = list.iterator();
+        while (iter.hasNext())
+        {
+            Object context = iter.next();
+            try
+            {
+                Object result = assertCountXPath2(1, context, "document('test-resources/xml/web.xml')");
+                assertValueOfXPath("snoop", result, "/web-app/servlet[1]/servlet-name");
+                assertValueOfXPath("snoop", result, "/web-app/servlet[1]/servlet-name/text()");
+            }
+            catch (UnsupportedAxisException e)
+            {
+                log(debug, "      ## SKIPPED -- Unsupported Axis");
+            }
+            assertValueOfXPath("snoop", context, "document('test-resources/xml/web.xml')/web-app/servlet[1]/servlet-name");
+        }
+    }
+
+    /* Test to check if the context changes when an extension function is used.
+    First test is an example, second is the actual test.
+    
+    */
+    public void testid55189() throws JaxenException
+    {
+        Navigator nav = getNavigator();
+        String url = TESTS_ROOT + "xml/text.xml";
+        log("Document [" + url + "]");
+        Object document = nav.getDocument(url);
+        XPath contextpath = new BaseXPath("/foo/bar/cheese[1]", nav);
+        log("Initial Context :: " + contextpath);
+        List list = contextpath.selectNodes(document);
+        Iterator iter = list.iterator();
+        while (iter.hasNext())
+        {
+            Object context = iter.next();
+            assertValueOfXPath("3foo3", context, "concat(./@id,'foo',@id)");
+            assertValueOfXPath("3snoop3", context, "concat(./@id,document('test-resources/xml/web.xml')/web-app/servlet[1]/servlet-name,./@id)");
+        }
+    }
+
+    public void testid55211() throws JaxenException
+    {
+        Navigator nav = getNavigator();
+        String url = TESTS_ROOT + "xml/message.xml";
+        log("Document [" + url + "]");
+        Object document = nav.getDocument(url);
+        XPath contextpath = new BaseXPath("/", nav);
+        log("Initial Context :: " + contextpath);
+        List list = contextpath.selectNodes(document);
+        Iterator iter = list.iterator();
+        while (iter.hasNext())
+        {
+            Object context = iter.next();
+            assertValueOfXPath("Pruefgebiete", context, "/message/body/data/items/item[name/text()='parentinfo']/value");
+            assertValueOfXPath("Pruefgebiete", context, "document('test-resources/xml/message.xml')/message/body/data/items/item[name/text()='parentinfo']/value");
+        }
+    }
+
+    /* test behaviour of AbsoluteLocationPath
+    */
+    public void testid55183() throws JaxenException
+    {
+        Navigator nav = getNavigator();
+        String url = TESTS_ROOT + "xml/simple.xml";
+        log("Document [" + url + "]");
+        Object document = nav.getDocument(url);
+        XPath contextpath = new BaseXPath("/root/a", nav);
+        log("Initial Context :: " + contextpath);
+        List list = contextpath.selectNodes(document);
+        Iterator iter = list.iterator();
+        while (iter.hasNext())
+        {
+            Object context = iter.next();
+            assertValueOfXPath("ab", context, "concat( ., /root/b )");
+            assertValueOfXPath("ba", context, "concat( ../b, . )");
+            assertValueOfXPath("ba", context, "concat( /root/b, . )");
+            assertValueOfXPath("db", context, "concat( /root/c/d, ../b )");
+        }
+    }
+
+    /* test the translate() function
+    */
+    public void testid55268() throws JaxenException
+    {
+        Navigator nav = getNavigator();
+        String url = TESTS_ROOT + "xml/simple.xml";
+        log("Document [" + url + "]");
+        Object document = nav.getDocument(url);
+        XPath contextpath = new BaseXPath("/", nav);
+        log("Initial Context :: " + contextpath);
+        List list = contextpath.selectNodes(document);
+        Iterator iter = list.iterator();
+        while (iter.hasNext())
+        {
+            Object context = iter.next();
+            assertValueOfXPath("", context, "translate( '', '', '' )");
+            assertValueOfXPath("abcd", context, "translate( 'abcd', '', '' )");
+            assertValueOfXPath("abcd", context, "translate( 'abcd', 'abcd', 'abcd' )");
+            assertValueOfXPath("abcd", context, "translate( 'abcd', 'dcba', 'dcba' )");
+            assertValueOfXPath("dcba", context, "translate( 'abcd', 'abcd', 'dcba' )");
+            assertValueOfXPath("ab", context, "translate( 'abcd', 'abcd', 'ab' )");
+            assertValueOfXPath("cd", context, "translate( 'abcd', 'cdab', 'cd' )");
+            assertValueOfXPath("xy", context, "translate( 'abcd', 'acbd', 'xy' )");
+            assertValueOfXPath("abcd", context, "translate( 'abcd', 'abcdb', 'abcdb' )");
+            assertValueOfXPath("abcd", context, "translate( 'abcd', 'abcd', 'abcdb' )");
+        }
+    }
+
+    public void testid55331() throws JaxenException
+    {
+        Navigator nav = getNavigator();
+        String url = TESTS_ROOT + "xml/simple.xml";
+        log("Document [" + url + "]");
+        Object document = nav.getDocument(url);
+        XPath contextpath = new BaseXPath("/", nav);
+        log("Initial Context :: " + contextpath);
+        List list = contextpath.selectNodes(document);
+        Iterator iter = list.iterator();
+        while (iter.hasNext())
+        {
+            Object context = iter.next();
+            assertValueOfXPath("234", context, "substring('12345', 1.5, 2.6)");
+            assertValueOfXPath("12", context, "substring('12345', 0, 3)");
+            assertValueOfXPath("", context, "substring('12345', 0 div 0, 3)");
+            assertValueOfXPath("", context, "substring('12345', 1, 0 div 0)");
+            assertValueOfXPath("12345", context, "substring('12345', -42, 1 div 0)");
+            assertValueOfXPath("", context, "substring('12345', -1 div 0, 1 div 0)");
+            assertValueOfXPath("345", context, "substring('12345', 3)");
+            assertValueOfXPath("12345", context, "substring('12345',1,15)");
+        }
+    }
+
+    /* Some tests for the normalize-space() function
+    */
+    public void testid55382() throws JaxenException
+    {
+        Navigator nav = getNavigator();
+        String url = TESTS_ROOT + "xml/simple.xml";
+        log("Document [" + url + "]");
+        Object document = nav.getDocument(url);
+        XPath contextpath = new BaseXPath("/", nav);
+        log("Initial Context :: " + contextpath);
+        List list = contextpath.selectNodes(document);
+        Iterator iter = list.iterator();
+        while (iter.hasNext())
+        {
+            Object context = iter.next();
+            assertValueOfXPath("abc", context, "normalize-space('    abc    ')");
+            assertValueOfXPath("a b c", context, "normalize-space(' a  b  c  ')");
+            assertValueOfXPath("a b c", context, "normalize-space(' a \n b \n  c')");
+            /* Next test case addresses issue JAXEN-22
+            */
+            assertValueOfXPath("", context, "normalize-space(' ')");
+            /* Next test case addresses issue JAXEN-29
+            */
+            assertValueOfXPath("", context, "normalize-space('')");
+        }
+    }
+
+    /* test cases for String extension functions
+    */
+    public void testid55429() throws JaxenException
+    {
+        Navigator nav = getNavigator();
+        String url = TESTS_ROOT + "xml/web.xml";
+        log("Document [" + url + "]");
+        Object document = nav.getDocument(url);
+        XPath contextpath = new BaseXPath("/web-app/servlet[1]", nav);
+        log("Initial Context :: " + contextpath);
+        List list = contextpath.selectNodes(document);
+        Iterator iter = list.iterator();
+        while (iter.hasNext())
+        {
+            Object context = iter.next();
+            assertValueOfXPath("SNOOPSERVLET", context, "upper-case( servlet-class )");
+            assertValueOfXPath("snoopservlet", context, "lower-case( servlet-class )");
+            assertValueOfXPath("SNOOPSERVLET", context, "upper-case( servlet-class, 'fr' )");
+            assertValueOfXPath("SNOOPSERVLET", context, "upper-case( servlet-class, 'fr-CA' )");
+            assertValueOfXPath("SNOOPSERVLET", context, "upper-case( servlet-class, 'es-ES-Traditional_WIN' )");
+            assertValueOfXPath("true", context, "ends-with( servlet-class, 'Servlet' )");
+            assertValueOfXPath("false", context, "ends-with( servlet-class, 'S' )");
+        }
+    }
+
+    /* test cases for the lang() function
+    */
+    public void testid55485() throws JaxenException
+    {
+        Navigator nav = getNavigator();
+        String url = TESTS_ROOT + "xml/lang.xml";
+        log("Document [" + url + "]");
+        Object document = nav.getDocument(url);
+        XPath contextpath = new BaseXPath("/", nav);
+        log("Initial Context :: " + contextpath);
+        List list = contextpath.selectNodes(document);
+        Iterator iter = list.iterator();
+        while (iter.hasNext())
+        {
+            Object context = iter.next();
+            assertCountXPath(0, context, "/e1/e2[lang('hr')]");
+//            assertCountXPath(1, context, "/e1/e2/e3[lang('en')]");
+//            assertCountXPath(1, context, "/e1/e2/e3[lang('en-US')]");
+            assertCountXPath(0, context, "/e1/e2/e3[lang('en-GB')]");
+            assertCountXPath(2, context, "/e1/e2/e3[lang('hu')]");
+            assertCountXPath(0, context, "/e1/e2/e3[lang('hu-HU')]");
+            assertCountXPath(1, context, "/e1/e2/e3[lang('es')]");
+            assertCountXPath(0, context, "/e1/e2/e3[lang('es-BR')]");
+        }
+    }
+
+    /* test namespace
+    */
+    public void testid55235() throws JaxenException
+    {
+        Navigator nav = getNavigator();
+        String url = TESTS_ROOT + "xml/namespaces.xml";
+        log("Document [" + url + "]");
+        Object document = nav.getDocument(url);
+        XPath contextpath = new BaseXPath("/", nav);
+        log("Initial Context :: " + contextpath);
+        List list = contextpath.selectNodes(document);
+        SimpleNamespaceContext nsContext = new SimpleNamespaceContext();
+        nsContext.addNamespace("alias", "http://fooNamespace/");
+        nsContext.addNamespace("bar", "http://barNamespace/");
+        nsContext.addNamespace("voo", "http://fooNamespace/");
+        nsContext.addNamespace("foo", "http://fooNamespace/");
+        getContextSupport().setNamespaceContext(nsContext);
+        Iterator iter = list.iterator();
+        while (iter.hasNext())
+        {
+            Object context = iter.next();
+            assertCountXPath(1, context, "/*");
+            assertCountXPath(1, context, "/foo:a");
+            assertCountXPath(1, context, "/foo:a/b");
+            assertCountXPath(1, context, "/voo:a/b/c");
+            assertCountXPath(1, context, "/voo:a/bar:f");
+            assertCountXPath(1, context, "/*[namespace-uri()='http://fooNamespace/' and local-name()='a']");
+            assertCountXPath(1, context, "/*[local-name()='a' and namespace-uri()='http://fooNamespace/']/*[local-name()='x' and namespace-uri()='http://fooNamespace/']");
+            assertCountXPath(1, context, "/*[local-name()='a' and namespace-uri()='http://fooNamespace/']/*[local-name()='x' and namespace-uri()='http://fooNamespace/']/*[local-name()='y' and namespace-uri()='http://fooNamespace/']");
+        }
+    }
+
+    /* the prefix here and in the document have no relation; it's their
+    namespace-uri binding that counts 
+    */
+    public void testid55615() throws JaxenException
+    {
+        Navigator nav = getNavigator();
+        String url = TESTS_ROOT + "xml/namespaces.xml";
+        log("Document [" + url + "]");
+        Object document = nav.getDocument(url);
+        XPath contextpath = new BaseXPath("/", nav);
+        log("Initial Context :: " + contextpath);
+        List list = contextpath.selectNodes(document);
+        SimpleNamespaceContext nsContext = new SimpleNamespaceContext();
+        nsContext.addNamespace("foo", "http://somethingElse/");
+        getContextSupport().setNamespaceContext(nsContext);
+        Iterator iter = list.iterator();
+        while (iter.hasNext())
+        {
+            Object context = iter.next();
+            assertCountXPath(0, context, "/foo:a/b/c");
+        }
+    }
+
+    public void testid55632() throws JaxenException
+    {
+        Navigator nav = getNavigator();
+        String url = TESTS_ROOT + "xml/namespaces.xml";
+        log("Document [" + url + "]");
+        Object document = nav.getDocument(url);
+        XPath contextpath = new BaseXPath("/", nav);
+        log("Initial Context :: " + contextpath);
+        List list = contextpath.selectNodes(document);
+        SimpleNamespaceContext nsContext = new SimpleNamespaceContext();
+        nsContext.addNamespace("alias", "http://fooNamespace/");
+        nsContext.addNamespace("bar", "http://barNamespace/");
+        nsContext.addNamespace("foo", "http://fooNamespace/");
+        getContextSupport().setNamespaceContext(nsContext);
+        Iterator iter = list.iterator();
+        while (iter.hasNext())
+        {
+            Object context = iter.next();
+            assertValueOfXPath("Hello", context, "/foo:a/b/c");
+            assertValueOfXPath("Hey", context, "/foo:a/foo:d/foo:e");
+            assertValueOfXPath("Hey3", context, "/foo:a/alias:x/alias:y");
+            assertValueOfXPath("Hey3", context, "/foo:a/foo:x/foo:y");
+            assertValueOfXPath("Hey3", context, "/*[local-name()='a' and namespace-uri()='http://fooNamespace/']/*[local-name()='x' and namespace-uri()='http://fooNamespace/']/*[local-name()='y' and namespace-uri()='http://fooNamespace/']");
+        }
+    }
+
+    public void testid55676() throws JaxenException
+    {
+        Navigator nav = getNavigator();
+        String url = TESTS_ROOT + "xml/defaultNamespace.xml";
+        log("Document [" + url + "]");
+        Object document = nav.getDocument(url);
+        XPath contextpath = new BaseXPath("/", nav);
+        log("Initial Context :: " + contextpath);
+        List list = contextpath.selectNodes(document);
+        Iterator iter = list.iterator();
+        while (iter.hasNext())
+        {
+            Object context = iter.next();
+            /* NOTE: /a/b/c selects elements in no namespace only!
+            */
+            assertCountXPath(0, context, "/a/b/c");
+            /*
+                The following test uses an unbound prefix 'x' and should throw an exception.
+                Addresses issue JAXEN-18.
+                Turns out this isn't really tested as the test didn't fail when the exception wasn't thrown.
+              <test select="/x:a/x:b/x:c" count="0" exception="true"/>
+
+            */
+        }
+    }
+
+    public void testid55692() throws JaxenException
+    {
+        Navigator nav = getNavigator();
+        String url = TESTS_ROOT + "xml/defaultNamespace.xml";
+        log("Document [" + url + "]");
+        Object document = nav.getDocument(url);
+        XPath contextpath = new BaseXPath("/", nav);
+        log("Initial Context :: " + contextpath);
+        List list = contextpath.selectNodes(document);
+        SimpleNamespaceContext nsContext = new SimpleNamespaceContext();
+        nsContext.addNamespace("dummy", "http://dummyNamespace/");
+        getContextSupport().setNamespaceContext(nsContext);
+        Iterator iter = list.iterator();
+        while (iter.hasNext())
+        {
+            Object context = iter.next();
+            assertCountXPath(1, context, "/dummy:a/dummy:b/dummy:c");
+        }
+    }
+
+    public void testid55716() throws JaxenException
+    {
+        Navigator nav = getNavigator();
+        String url = TESTS_ROOT + "xml/text.xml";
+        log("Document [" + url + "]");
+        Object document = nav.getDocument(url);
+        XPath contextpath = new BaseXPath("/", nav);
+        log("Initial Context :: " + contextpath);
+        List list = contextpath.selectNodes(document);
+        Iterator iter = list.iterator();
+        while (iter.hasNext())
+        {
+            Object context = iter.next();
+            assertCountXPath(3, context, "/foo/bar/text()");
+            assertValueOfXPath("baz", context, "normalize-space(/foo/bar/text())");
+        }
+    }
+
+    public void testid55739() throws JaxenException
+    {
+        Navigator nav = getNavigator();
+        String url = TESTS_ROOT + "xml/testNamespaces.xml";
+        log("Document [" + url + "]");
+        Object document = nav.getDocument(url);
+        XPath contextpath = new BaseXPath("/", nav);
+        log("Initial Context :: " + contextpath);
+        List list = contextpath.selectNodes(document);
+        Iterator iter = list.iterator();
+        while (iter.hasNext())
+        {
+            Object context = iter.next();
+            /* the root is not an element, so no namespaces
+            */
+            assertCountXPath(0, context, "namespace::*");
+            assertCountXPath(0, context, "/namespace::*");
+            /* must count the default xml: prefix as well
+            */
+            assertCountXPath(3, context, "/Template/Application1/namespace::*");
+            assertCountXPath(3, context, "/Template/Application2/namespace::*");
+            /* every element has separate copies
+            */
+            assertCountXPath(25, context, "//namespace::*");
+        }
+    }
+
+    public void testid55797() throws JaxenException
+    {
+        Navigator nav = getNavigator();
+        String url = TESTS_ROOT + "xml/testNamespaces.xml";
+        log("Document [" + url + "]");
+        Object document = nav.getDocument(url);
+        XPath contextpath = new BaseXPath("/Template/Application1", nav);
+        log("Initial Context :: " + contextpath);
+        List list = contextpath.selectNodes(document);
+        Iterator iter = list.iterator();
+        while (iter.hasNext())
+        {
+            Object context = iter.next();
+            /* must count the default xml: prefix as well
+            */
+            assertCountXPath(3, context, "namespace::*");
+            assertCountXPath(0, context, "/namespace::*");
+            assertCountXPath(3, context, "/Template/Application1/namespace::*");
+            assertCountXPath(3, context, "/Template/Application2/namespace::*");
+            assertCountXPath(25, context, "//namespace::*");
+            assertCountXPath(8, context, "//namespace::xplt");
+            /* the name test literally matches the prefix as given in the
+              document, and does not use the uri
+            */
+            assertCountXPath(0, context, "//namespace::somethingelse");
+        }
+    }
+
+    public void testid55873() throws JaxenException
+    {
+        Navigator nav = getNavigator();
+        String url = TESTS_ROOT + "xml/testNamespaces.xml";
+        log("Document [" + url + "]");
+        Object document = nav.getDocument(url);
+        XPath contextpath = new BaseXPath("/", nav);
+        log("Initial Context :: " + contextpath);
+        List list = contextpath.selectNodes(document);
+        Iterator iter = list.iterator();
+        while (iter.hasNext())
+        {
+            Object context = iter.next();
+            /* namespace nodes have their element as their parent
+            */
+            assertCountXPath(1, context, "/Template/namespace::xml/parent::Template");
+        }
+    }
+
+    /* namespace nodes can also be used as context nodes
+    */
+    public void testid55893() throws JaxenException
+    {
+        Navigator nav = getNavigator();
+        String url = TESTS_ROOT + "xml/testNamespaces.xml";
+        log("Document [" + url + "]");
+        Object document = nav.getDocument(url);
+        XPath contextpath = new BaseXPath("/Template/namespace::xml", nav);
+        log("Initial Context :: " + contextpath);
+        List list = contextpath.selectNodes(document);
+        Iterator iter = list.iterator();
+        while (iter.hasNext())
+        {
+            Object context = iter.next();
+            assertCountXPath(1, context, "parent::Template");
+        }
+    }
+}            
+        
\ No newline at end of file
