diff --git a/axiom/test/soap/Makefile.am b/axiom/test/soap/Makefile.am
index 7469fdc..afd6ae5 100644
--- a/axiom/test/soap/Makefile.am
+++ b/axiom/test/soap/Makefile.am
@@ -17,12 +17,16 @@
 check_PROGRAMS = test_soap
 SUBDIRS =
 AM_CFLAGS = -g -O2
-test_soap_SOURCES = test_soap.c
+test_soap_SOURCES = test_soap.cc
 
 test_soap_LDADD   =	../../../util/src/libaxutil.la \
 			$(top_builddir)/src/parser/$(WRAPPER_DIR)/libaxis2_parser.la \
-			$(top_builddir)/src/om/libaxis2_axiom.la 
+			$(top_builddir)/src/om/libaxis2_axiom.la \
+			$(top_builddir)/$(GTEST)/libgtest.a \
+			$(top_builddir)/$(GTEST)/libgtest_main.a
 
-INCLUDES = -I$(top_builddir)/include \
+AM_CPPFLAGS = -I$(top_builddir)/include \
             -I$(top_builddir)/src/parser \
-			-I ../../../util/include
+			-I ../../../util/include \
+			-I $(GTEST_DIR)/include
+
diff --git a/axiom/test/soap/test_soap.c b/axiom/test/soap/test_soap.c
deleted file mode 100644
index 13f90e6..0000000
--- a/axiom/test/soap/test_soap.c
+++ /dev/null
@@ -1,550 +0,0 @@
-
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#include <axiom_stax_builder.h>
-#include <axiom_document.h>
-#include <axiom_node.h>
-#include <axiom_element.h>
-#include <axiom_text.h>
-#include <axutil_stream.h>
-#include <axutil_log_default.h>
-#include <axutil_error_default.h>
-#include <axiom_xml_reader.h>
-#include <stdio.h>
-#include <axiom_xml_writer.h>
-#include <axiom_soap_builder.h>
-#include <axiom_soap_const.h>
-#include <axiom_soap_envelope.h>
-#include <axiom_soap_body.h>
-#include <axiom_soap_header.h>
-#include <axiom_soap_header_block.h>
-#include <axiom_soap_fault.h>
-#include <axiom_soap_fault_code.h>
-#include <axiom_soap_fault_role.h>
-#include <axiom_soap_fault_value.h>
-#include <axiom_soap_fault_detail.h>
-#include <axiom_soap_fault_role.h>
-#include <axiom_soap_fault_node.h>
-
-FILE *f = NULL;
-int
-read_soap(
-    char *buffer,
-    int size,
-    void *ctx)
-{
-    int len = 0;
-    char *pos = NULL;
-    len = fread(buffer, sizeof(char), size, f);
-    if (buffer)
-        pos = strstr(buffer, "---");
-    if (pos)
-    {
-        len = pos - buffer;
-        *pos = '\0';
-    }
-    printf("buffer = %s\n", buffer);
-    return len;
-}
-
-/*int read_soap(char *buffer, int size, void *ctx)
-{
-    return fread(buffer, sizeof(char), size, f);
-}*/
-
-int
-close_soap(
-    void *ctx)
-{
-    fclose(f);
-    return AXIS2_TRUE;
-}
-
-int
-printnode(
-    axiom_node_t * om_node,
-    const axutil_env_t * env)
-{
-    axiom_element_t *om_ele = NULL;
-    axis2_char_t *localname = NULL;
-    axiom_namespace_t *om_ns = NULL;
-    axis2_char_t *uri = NULL;
-    axis2_char_t *prefix = NULL;
-    AXIS2_ENV_CHECK(env, AXIS2_FAILURE);
-    if (!om_node)
-        return AXIS2_FAILURE;
-
-    if (axiom_node_get_node_type(om_node, env) == AXIOM_ELEMENT)
-    {
-        om_ele = (axiom_element_t *) axiom_node_get_data_element(om_node, env);
-        if (!om_ele)
-            return AXIS2_FAILURE;
-
-        localname = axiom_element_get_localname(om_ele, env);
-        if (localname)
-            printf("\n %s \n", localname);
-        om_ns = axiom_element_get_namespace(om_ele, env, om_node);
-
-        if (om_ns)
-        {
-            prefix = axiom_namespace_get_prefix(om_ns, env);
-            uri = axiom_namespace_get_uri(om_ns, env);
-
-            printf("\n uri %s \n prefix %s \n", uri, prefix);
-        }
-    }
-    return 0;
-}
-
-int
-build_soap(
-    const axutil_env_t * env,
-    const char *filename,
-    const axis2_char_t * uri)
-{
-    axiom_stax_builder_t *om_builder = NULL;
-
-    axiom_xml_reader_t *xml_reader = NULL;
-
-    axiom_soap_builder_t *soap_builder = NULL;
-    axiom_soap_envelope_t *soap_envelope = NULL;
-
-    axiom_node_t *om_node = NULL;
-    axis2_char_t *buffer = NULL;
-
-    axiom_xml_writer_t *xml_writer = NULL;
-    axiom_output_t *om_output = NULL;
-
-    axiom_soap_body_t *soap_body = NULL;
-    axiom_soap_header_t *soap_header = NULL;
-    axiom_children_qname_iterator_t *children_iter = NULL;
-
-    int status = AXIS2_SUCCESS;
-
-    if (!filename)
-        return -1;
-    f = fopen(filename, "r");
-    if (!f)
-        return -1;
-    printf(" \n\n _________ Test SOAP BUILD ___________ \n\n ");
-
-    xml_reader =
-        axiom_xml_reader_create_for_io(env, read_soap, close_soap, NULL, NULL);
-    if (!xml_reader)
-    {
-        printf("%s \n", axutil_error_get_message(env->error));
-        return AXIS2_FAILURE;
-    }
-
-    om_builder = axiom_stax_builder_create(env, xml_reader);
-    if (!om_builder)
-    {
-        axiom_xml_reader_free(xml_reader, env);
-        printf("%s \n", axutil_error_get_message(env->error));
-        return AXIS2_FAILURE;
-    }
-
-    soap_builder = axiom_soap_builder_create(env, om_builder, uri);
-    if (!soap_builder)
-    {
-        printf("%s \n", axutil_error_get_message(env->error));
-        return AXIS2_FAILURE;
-    }
-    soap_envelope = axiom_soap_builder_get_soap_envelope(soap_builder, env);
-    if (!soap_envelope)
-    {
-        axiom_soap_builder_free(soap_builder, env);
-        printf("%s \n", axutil_error_get_message(env->error));
-        return AXIS2_FAILURE;
-    }
-
-    om_node = axiom_soap_envelope_get_base_node(soap_envelope, env);
-
-    if (om_node)
-        printnode(om_node, env);
-
-    soap_header = axiom_soap_envelope_get_header(soap_envelope, env);
-    if (soap_header)
-    {
-        om_node = axiom_soap_header_get_base_node(soap_header, env);
-        if (om_node)
-            printnode(om_node, env);
-
-        children_iter =
-            axiom_soap_header_examine_all_header_blocks(soap_header, env);
-        if (children_iter)
-        {
-            /*while (axiom_children_iterator_has_next(children_iter, env))
-               {
-               om_node = axiom_children_iterator_next(children_iter, env);
-               if (om_node)
-               printnode(om_node, env);
-               } */
-        }
-    }
-
-    soap_body = axiom_soap_envelope_get_body(soap_envelope, env);
-    if (soap_body)
-    {
-        if (axiom_soap_body_has_fault(soap_body, env));
-        printf("axiom_soap_body_has_fault\n");
-        om_node = axiom_soap_body_get_base_node(soap_body, env);
-        if (om_node)
-            printnode(om_node, env);
-        else
-            printf("\n\n soap body base node null \n\n");
-    }
-    else
-    {
-        printf("%s \n", axutil_error_get_message(env->error));
-        printf("\n\n ERROR soap_body NULL.\n\n");
-        return AXIS2_FAILURE;
-    }
-
-    if (axiom_soap_body_has_fault(soap_body, env))
-    {
-        printf("\n\nsoap body  has a fault element\n\n\n ");
-    }
-
-    om_node = axiom_soap_body_get_base_node(soap_body, env);
-    if (om_node)
-    {
-        while (!(axiom_node_is_complete(om_node, env)))
-        {
-            status = axiom_soap_builder_next(soap_builder, env);
-            if (status == AXIS2_FAILURE)
-            {
-                printf("failure %s", axutil_error_get_message(env->error));
-                return AXIS2_FAILURE;
-            }
-        }
-    }
-
-    xml_writer =
-        axiom_xml_writer_create_for_memory(env, NULL, AXIS2_FALSE, AXIS2_FALSE,
-                                           AXIS2_XML_PARSER_TYPE_BUFFER);
-    if (!xml_writer)
-    {
-        axiom_soap_builder_free(soap_builder, env);
-        return AXIS2_FAILURE;
-    }
-
-    om_output = axiom_output_create(env, xml_writer);
-    if (!om_output)
-    {
-        axiom_soap_builder_free(soap_builder, env);
-        axiom_xml_writer_free(xml_writer, env);
-        return AXIS2_FAILURE;
-    }
-
-    axiom_soap_envelope_serialize(soap_envelope, env, om_output, AXIS2_FALSE);
-
-    buffer = (axis2_char_t *) axiom_xml_writer_get_xml(xml_writer, env);
-
-    printf("\n\nThe serialized xml is >>>>>>>>>>>>>\n\n\n%s \n\n\n", buffer);
-
-    if (buffer)
-        AXIS2_FREE(env->allocator, buffer);
-
-    axiom_soap_envelope_free(soap_envelope, env);
-
-    printf(" \n __________ END TEST SOAP BUILD ____________ \n");
-
-    return AXIS2_SUCCESS;
-}
-
-int
-build_soap_programatically(
-    const axutil_env_t * env)
-{
-    axiom_soap_envelope_t *soap_envelope = NULL;
-    axiom_soap_body_t *soap_body = NULL;
-    axiom_soap_header_t *soap_header = NULL;
-    axiom_soap_fault_t *soap_fault = NULL;
-    axiom_soap_fault_code_t *fault_code = NULL;
-    axiom_soap_header_block_t *hb1 = NULL;
-
-    axiom_namespace_t *env_ns = NULL;
-    axiom_namespace_t *test_ns = NULL;
-    axiom_namespace_t *role_ns = NULL;
-
-    axiom_xml_writer_t *xml_writer = NULL;
-    axiom_output_t *om_output = NULL;
-
-    axis2_char_t *buffer = NULL;
-    axiom_node_t *hb_node = NULL;
-    axiom_element_t *hb_ele = NULL;
-
-    printf(" \n ____________ BUILD SOAP PROGRAMATICALLY _______________ \n");
-
-    env_ns =
-        axiom_namespace_create(env, "http://www.w3.org/2003/05/soap-envelope",
-                               "env");
-    if (!env_ns)
-        return AXIS2_FAILURE;
-
-    soap_envelope = axiom_soap_envelope_create(env, env_ns);
-    if (!soap_envelope)
-        return AXIS2_FAILURE;
-
-    soap_header = axiom_soap_header_create_with_parent(env, soap_envelope);
-    if (!soap_header)
-        return AXIS2_FAILURE;
-
-    test_ns =
-        axiom_namespace_create(env, "http://example.org/ts-tests", "test");
-
-    role_ns =
-        axiom_namespace_create(env,
-                               "http://www.w3.org/2003/05/soap-envelope/role/next",
-                               "role");
-
-    hb1 =
-        axiom_soap_header_block_create_with_parent(env, "echoOk", role_ns,
-                                                   soap_header);
-
-    hb_node = axiom_soap_header_block_get_base_node(hb1, env);
-
-    hb_ele = axiom_node_get_data_element(hb_node, env);
-
-    axiom_element_set_namespace(hb_ele, env, test_ns, hb_node);
-
-    soap_body = axiom_soap_body_create_with_parent(env, soap_envelope);
-
-    soap_fault = axiom_soap_fault_create_with_parent(env, soap_body);
-
-    fault_code = axiom_soap_fault_code_create_with_parent(env, soap_fault);
-
-    xml_writer =
-        axiom_xml_writer_create_for_memory(env, NULL, AXIS2_FALSE, AXIS2_FALSE,
-                                           AXIS2_XML_PARSER_TYPE_BUFFER);
-
-    om_output = axiom_output_create(env, xml_writer);
-
-    axiom_soap_envelope_serialize(soap_envelope, env, om_output, AXIS2_FALSE);
-
-    buffer = (axis2_char_t *) axiom_xml_writer_get_xml(xml_writer, env);
-
-    printf("%s \n", buffer);
-
-    axiom_soap_envelope_free(soap_envelope, env);
-
-    AXIS2_FREE(env->allocator, buffer);
-
-    buffer = NULL;
-
-    axiom_output_free(om_output, env);
-
-    printf("\n __________ END BUILD SOAP PROGRAMATICALLY ____________\n");
-
-    return AXIS2_SUCCESS;
-}
-
-int
-create_soap_fault(
-    const axutil_env_t * env)
-{
-    axiom_soap_envelope_t *soap_envelope = NULL;
-    axiom_soap_body_t *soap_body = NULL;
-    axiom_soap_fault_t *soap_fault = NULL;
-    axiom_xml_writer_t *xml_writer = NULL;
-    axiom_output_t *om_output = NULL;
-    axis2_char_t *buffer = NULL;
-    axis2_char_t *exception_text = NULL;
-    axis2_status_t status = 0;
-
-    soap_envelope =
-        axiom_soap_envelope_create_default_soap_fault_envelope(env,
-                                                               "Fault Code",
-                                                               "Fault Reason",
-                                                               AXIOM_SOAP11,
-                                                               NULL, NULL);
-    soap_body = axiom_soap_envelope_get_body(soap_envelope, env);
-    soap_fault = axiom_soap_body_get_fault(soap_body, env);
-
-    axiom_soap_fault_detail_create_with_parent(env, soap_fault);
-    axiom_soap_fault_role_create_with_parent(env, soap_fault);
-    xml_writer =
-        axiom_xml_writer_create_for_memory(env, NULL, AXIS2_FALSE, AXIS2_FALSE,
-                                           AXIS2_XML_PARSER_TYPE_BUFFER);
-    om_output = axiom_output_create(env, xml_writer);
-    axiom_soap_envelope_serialize(soap_envelope, env, om_output, AXIS2_FALSE);
-    buffer = (axis2_char_t *) axiom_xml_writer_get_xml(xml_writer, env);
-    printf("\n Testing Create soap fault \n %s \n", buffer);
-
-    status = axiom_soap_fault_set_exception(soap_fault, env, "MyNewException");
-    exception_text = axiom_soap_fault_get_exception(soap_fault, env);
-
-    printf(" Testing soap fault set exception \n");
-    printf("Actual = %s Expected = %s |", exception_text, "MyNewException");
-    if (status && (0 == strcmp(exception_text, "MyNewException")))
-        printf("SUCCESS\n");
-    else
-        printf("FAILURE\n");
-
-    axiom_soap_envelope_free(soap_envelope, env);
-    axiom_output_free(om_output, env);
-    return 0;
-}
-
-int
-create_soap_fault_with_exception(
-    const axutil_env_t * env)
-{
-    axiom_soap_envelope_t *soap_envelope = NULL;
-    axiom_soap_body_t *soap_body = NULL;
-    axiom_soap_fault_t *soap_fault = NULL;
-    axiom_xml_writer_t *xml_writer = NULL;
-    axiom_output_t *om_output = NULL;
-    axis2_char_t *exception_text = NULL;
-
-    soap_envelope =
-        axiom_soap_envelope_create_default_soap_fault_envelope(env,
-                                                               "Fault Code",
-                                                               "Fault Reason",
-                                                               AXIOM_SOAP11,
-                                                               NULL, NULL);
-    soap_body = axiom_soap_envelope_get_body(soap_envelope, env);
-    soap_fault =
-        axiom_soap_fault_create_with_exception(env, soap_body, "MyException");
-
-    axiom_soap_fault_detail_create_with_parent(env, soap_fault);
-    axiom_soap_fault_role_create_with_parent(env, soap_fault);
-    xml_writer =
-        axiom_xml_writer_create_for_memory(env, NULL, AXIS2_FALSE, AXIS2_FALSE,
-                                           AXIS2_XML_PARSER_TYPE_BUFFER);
-    om_output = axiom_output_create(env, xml_writer);
-    axiom_soap_envelope_serialize(soap_envelope, env, om_output, AXIS2_FALSE);
-
-    exception_text = axiom_soap_fault_get_exception(soap_fault, env);
-    printf(" Testing Create soap fault with exception \n");
-    printf("Actual = %s Expected = %s |", exception_text, "MyException");
-    if (0 == strcmp(exception_text, "MyException"))
-        printf("SUCCESS\n");
-    else
-        printf("FAILURE\n");
-
-    axiom_soap_envelope_free(soap_envelope, env);
-    axiom_output_free(om_output, env);
-    return 0;
-}
-
-int
-test_soap_fault_node(
-    const axutil_env_t * env)
-{
-    axiom_soap_envelope_t *soap_envelope = NULL;
-    axiom_soap_body_t *soap_body = NULL;
-    axiom_soap_fault_t *soap_fault = NULL;
-    axis2_char_t *node_text = NULL;
-    axiom_soap_fault_node_t *fault_node = NULL;
-    axis2_status_t status = 0;
-
-    printf("Testing soap fault node \n");
-    soap_envelope =
-        axiom_soap_envelope_create_default_soap_fault_envelope(env,
-                                                               "env:Receiver",
-                                                               "Something went wrong!",
-                                                               AXIOM_SOAP12,
-                                                               NULL, NULL);
-    soap_body = axiom_soap_envelope_get_body(soap_envelope, env);
-    soap_fault = axiom_soap_body_get_fault(soap_body, env);
-
-    fault_node = axiom_soap_fault_node_create_with_parent(env, soap_fault);
-    status = axiom_soap_fault_node_set_value(fault_node, env, "MyFaultNode");
-    node_text = axiom_soap_fault_node_get_value(fault_node, env);
-
-    printf("Actual = %s Expected = %s |", node_text, "MyFaultNode");
-    if (0 == strcmp(node_text, "MyFaultNode"))
-        printf("SUCCESS\n");
-    else
-        printf("FAILURE\n");
-    axiom_soap_envelope_free(soap_envelope, env);
-    return 0;
-}
-
-int
-test_soap_fault_value(
-    const axutil_env_t * env)
-{
-    axiom_soap_envelope_t *soap_envelope = NULL;
-    axiom_soap_body_t *soap_body = NULL;
-    axiom_soap_fault_t *soap_fault = NULL;
-    axiom_soap_fault_code_t *soap_code = NULL;
-    axiom_soap_fault_value_t *value = NULL;
-    axis2_char_t *value_text = NULL;
-
-    printf("TEST SOAP FAULT VALUE\n");
-    soap_envelope =
-        axiom_soap_envelope_create_default_soap_fault_envelope(env,
-                                                               "env:Receiver",
-                                                               "Something went wrong!",
-                                                               AXIOM_SOAP12,
-                                                               NULL, NULL);
-    soap_body = axiom_soap_envelope_get_body(soap_envelope, env);
-    soap_fault = axiom_soap_body_get_fault(soap_body, env);
-    soap_code = axiom_soap_fault_get_code(soap_fault, env);
-    value = axiom_soap_fault_code_get_value(soap_code, env);
-    value_text = axiom_soap_fault_value_get_text(value, env);
-
-    printf("Actual = %s Expected = %s |", value_text, "env:Receiver");
-    if (0 == strcmp(value_text, "env:Receiver"))
-        printf("SUCCESS\n");
-    else
-        printf("FAILURE\n");
-
-    axiom_soap_envelope_free(soap_envelope, env);
-    return 0;
-}
-
-int
-main(
-    int argc,
-    char *argv[])
-{
-    axutil_env_t *env = NULL;
-    axutil_allocator_t *allocator = NULL;
-    axutil_error_t *error = NULL;
-    axutil_log_t *log = NULL;
-    const axis2_char_t *uri = AXIOM_SOAP12_SOAP_ENVELOPE_NAMESPACE_URI;
-    const char *filename = "../resources/xml/soap/test.xml";
-    if (argc > 1)
-        filename = argv[1];
-    if (argc > 2)
-    {
-        if (axutil_strcmp(argv[2], "0") == 0)
-            uri = AXIOM_SOAP11_SOAP_ENVELOPE_NAMESPACE_URI;
-        else if (axutil_strcmp(argv[2], "1") == 0)
-            uri = AXIOM_SOAP12_SOAP_ENVELOPE_NAMESPACE_URI;
-    }
-    allocator = axutil_allocator_init(NULL);
-    log = axutil_log_create(allocator, NULL, "test_soap.log");
-    log->level = AXIS2_LOG_LEVEL_DEBUG;
-    error = axutil_error_create(allocator);
-    env = axutil_env_create_with_error_log(allocator, error, log);
-
-    axutil_error_init();
-    /*build_soap_programatically(env);   */
-    build_soap(env, filename, uri);
-    create_soap_fault(env);
-    create_soap_fault_with_exception(env);
-    test_soap_fault_node(env);
-    test_soap_fault_value(env);
-    axutil_env_free(env);
-    return 0;
-}
diff --git a/axiom/test/soap/test_soap.cc b/axiom/test/soap/test_soap.cc
new file mode 100644
index 0000000..6fb0333
--- /dev/null
+++ b/axiom/test/soap/test_soap.cc
@@ -0,0 +1,484 @@
+
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include <gtest/gtest.h>
+
+#include <axiom_stax_builder.h>
+#include <axiom_document.h>
+#include <axiom_node.h>
+#include <axiom_element.h>
+#include <axiom_text.h>
+#include <axutil_stream.h>
+#include <axutil_log_default.h>
+#include <axutil_error_default.h>
+#include <axiom_xml_reader.h>
+#include <stdio.h>
+#include <axiom_xml_writer.h>
+#include <axiom_soap_builder.h>
+#include <axiom_soap_const.h>
+#include <axiom_soap_envelope.h>
+#include <axiom_soap_body.h>
+#include <axiom_soap_header.h>
+#include <axiom_soap_header_block.h>
+#include <axiom_soap_fault.h>
+#include <axiom_soap_fault_code.h>
+#include <axiom_soap_fault_role.h>
+#include <axiom_soap_fault_value.h>
+#include <axiom_soap_fault_detail.h>
+#include <axiom_soap_fault_role.h>
+#include <axiom_soap_fault_node.h>
+
+FILE *f = NULL;
+int
+read_soap(
+    char *buffer,
+    int size,
+    void *ctx)
+{
+    int len = 0;
+    char *pos = NULL;
+    len = fread(buffer, sizeof(char), size, f);
+    if (buffer)
+        pos = strstr(buffer, "---");
+    if (pos)
+    {
+        len = pos - buffer;
+        *pos = '\0';
+    }
+    printf("buffer = %s\n", buffer);
+    return len;
+}
+
+
+/*int read_soap(char *buffer, int size, void *ctx)
+{
+    return fread(buffer, sizeof(char), size, f);
+}*/
+
+int
+close_soap(
+    void *ctx)
+{
+    fclose(f);
+    return AXIS2_TRUE;
+}
+
+int
+printnode(
+    axiom_node_t * om_node,
+    const axutil_env_t * env)
+{
+    axiom_element_t *om_ele = NULL;
+    axis2_char_t *localname = NULL;
+    axiom_namespace_t *om_ns = NULL;
+    axis2_char_t *uri = NULL;
+    axis2_char_t *prefix = NULL;
+    AXIS2_ENV_CHECK(env, AXIS2_FAILURE);
+    if (!om_node)
+        return AXIS2_FAILURE;
+
+    if (axiom_node_get_node_type(om_node, env) == AXIOM_ELEMENT)
+    {
+        om_ele = (axiom_element_t *) axiom_node_get_data_element(om_node, env);
+        if (!om_ele)
+            return AXIS2_FAILURE;
+
+        localname = axiom_element_get_localname(om_ele, env);
+        if (localname)
+            printf("\n %s \n", localname);
+        om_ns = axiom_element_get_namespace(om_ele, env, om_node);
+
+        if (om_ns)
+        {
+            prefix = axiom_namespace_get_prefix(om_ns, env);
+            uri = axiom_namespace_get_uri(om_ns, env);
+
+            printf("\n uri %s \n prefix %s \n", uri, prefix);
+        }
+    }
+    return 0;
+}
+
+
+/* FIXME 
+ * These tests exercise code, but don't actually check that the output is
+ * correct.  They didn't when they were in the old test format, either.
+ */
+
+class TestSOAP: public ::testing::Test
+{
+    protected:
+        void SetUp()
+        {
+            m_allocator = axutil_allocator_init(NULL);
+            m_log = axutil_log_create(m_allocator, NULL, NULL);
+            m_error = axutil_error_create(m_allocator);
+            m_env = axutil_env_create_with_error_log(m_allocator, m_error, m_log);
+        }
+
+        void TearDown()
+        {
+            axutil_env_free(m_env);
+        }
+
+        axutil_env_t *m_env = NULL;
+        axutil_allocator_t *m_allocator = NULL;
+        axutil_error_t *m_error = NULL;
+        axutil_log_t *m_log = NULL;
+
+};
+
+
+TEST_F(TestSOAP, test_build_soap) {
+
+    const axis2_char_t *uri = AXIOM_SOAP12_SOAP_ENVELOPE_NAMESPACE_URI;
+    const char *filename = "../resources/xml/soap/test.xml";
+
+    axiom_stax_builder_t *om_builder = NULL;
+
+    axiom_xml_reader_t *xml_reader = NULL;
+
+    axiom_soap_builder_t *soap_builder = NULL;
+    axiom_soap_envelope_t *soap_envelope = NULL;
+
+    axiom_node_t *om_node = NULL;
+    axis2_char_t *buffer = NULL;
+
+    axiom_xml_writer_t *xml_writer = NULL;
+    axiom_output_t *om_output = NULL;
+
+    axiom_soap_body_t *soap_body = NULL;
+    axiom_soap_header_t *soap_header = NULL;
+    axiom_children_qname_iterator_t *children_iter = NULL;
+
+    int status = AXIS2_SUCCESS;
+
+    f = fopen(filename, "r");
+    ASSERT_NE(f, nullptr);
+
+    printf(" \n\n _________ Test SOAP BUILD ___________ \n\n ");
+
+    xml_reader =
+        axiom_xml_reader_create_for_io(m_env, read_soap, close_soap, NULL, NULL);
+
+    ASSERT_NE(xml_reader, nullptr);
+
+    om_builder = axiom_stax_builder_create(m_env, xml_reader);
+    ASSERT_NE(om_builder, nullptr);
+
+    soap_builder = axiom_soap_builder_create(m_env, om_builder, uri);
+    ASSERT_NE(soap_builder, nullptr);
+
+    soap_envelope = axiom_soap_builder_get_soap_envelope(soap_builder, m_env);
+    ASSERT_NE(soap_envelope, nullptr);
+
+    om_node = axiom_soap_envelope_get_base_node(soap_envelope, m_env);
+    ASSERT_NE(om_node, nullptr);
+    printnode(om_node, m_env);
+
+    soap_header = axiom_soap_envelope_get_header(soap_envelope, m_env);
+    ASSERT_NE(soap_header, nullptr);
+    om_node = axiom_soap_header_get_base_node(soap_header, m_env);
+    ASSERT_NE(om_node, nullptr);
+    printnode(om_node, m_env);
+
+    /* FIXME JIRA: AXIS2C-1695 */
+    /*
+    children_iter =
+        axiom_soap_header_examine_all_header_blocks(soap_header, m_env);
+    if (children_iter)
+    {
+        while (axiom_children_iterator_has_next(children_iter, env))
+            {
+            om_node = axiom_children_iterator_next(children_iter, env);
+            if (om_node)
+            printnode(om_node, env);
+            }
+    }
+    */
+
+    soap_body = axiom_soap_envelope_get_body(soap_envelope, m_env);
+    ASSERT_NE(soap_body, nullptr);
+    if (axiom_soap_body_has_fault(soap_body, m_env))
+        printf("axiom_soap_body_has_fault\n");
+    om_node = axiom_soap_body_get_base_node(soap_body, m_env);
+    ASSERT_NE(om_node, nullptr);
+    printnode(om_node, m_env);
+
+    if (axiom_soap_body_has_fault(soap_body, m_env))
+    {
+        printf("\n\nsoap body  has a fault element\n\n\n ");
+    }
+
+    om_node = axiom_soap_body_get_base_node(soap_body, m_env);
+    ASSERT_NE(om_node, nullptr);
+    while (!(axiom_node_is_complete(om_node, m_env)))
+    {
+        status = axiom_soap_builder_next(soap_builder, m_env);
+        ASSERT_NE(status, AXIS2_FAILURE);
+    }
+
+    xml_writer =
+        axiom_xml_writer_create_for_memory(m_env, NULL, AXIS2_FALSE, AXIS2_FALSE,
+                                           AXIS2_XML_PARSER_TYPE_BUFFER);
+    ASSERT_NE(xml_writer, nullptr);
+
+    om_output = axiom_output_create(m_env, xml_writer);
+    ASSERT_NE(om_output, nullptr);
+
+    axiom_soap_envelope_serialize(soap_envelope, m_env, om_output, AXIS2_FALSE);
+
+    buffer = (axis2_char_t *) axiom_xml_writer_get_xml(xml_writer, m_env);
+
+    printf("\n\nThe serialized xml is >>>>>>>>>>>>>\n\n\n%s \n\n\n", buffer);
+
+    if (buffer)
+        AXIS2_FREE(m_env->allocator, buffer);
+
+    axiom_soap_envelope_free(soap_envelope, m_env);
+
+    printf(" \n __________ END TEST SOAP BUILD ____________ \n");
+}
+
+
+TEST_F(TestSOAP, test_build_programatically) {
+    axiom_soap_envelope_t *soap_envelope = NULL;
+    axiom_soap_body_t *soap_body = NULL;
+    axiom_soap_header_t *soap_header = NULL;
+    axiom_soap_fault_t *soap_fault = NULL;
+    axiom_soap_fault_code_t *fault_code = NULL;
+    axiom_soap_header_block_t *hb1 = NULL;
+
+    axiom_namespace_t *env_ns = NULL;
+    axiom_namespace_t *test_ns = NULL;
+    axiom_namespace_t *role_ns = NULL;
+
+    axiom_xml_writer_t *xml_writer = NULL;
+    axiom_output_t *om_output = NULL;
+
+    axis2_char_t *buffer = NULL;
+    axiom_node_t *hb_node = NULL;
+    axiom_element_t *hb_ele = NULL;
+
+    printf(" \n ____________ BUILD SOAP PROGRAMATICALLY _______________ \n");
+
+    env_ns =
+        axiom_namespace_create(m_env, "http://www.w3.org/2003/05/soap-envelope",
+                               "env");
+    if (!env_ns)
+    ASSERT_NE(env_ns, nullptr);
+
+    soap_envelope = axiom_soap_envelope_create(m_env, env_ns);
+    ASSERT_NE(soap_envelope, nullptr);
+
+    soap_header = axiom_soap_header_create_with_parent(m_env, soap_envelope);
+    ASSERT_NE(soap_header, nullptr);
+
+    test_ns =
+        axiom_namespace_create(m_env, "http://example.org/ts-tests", "test");
+
+    role_ns =
+        axiom_namespace_create(m_env,
+                               "http://www.w3.org/2003/05/soap-envelope/role/next",
+                               "role");
+
+    hb1 =
+        axiom_soap_header_block_create_with_parent(m_env, "echoOk", role_ns,
+                                                   soap_header);
+
+    hb_node = axiom_soap_header_block_get_base_node(hb1, m_env);
+
+    hb_ele = (axiom_element_t*) axiom_node_get_data_element(hb_node, m_env);
+
+    axiom_element_set_namespace(hb_ele, m_env, test_ns, hb_node);
+
+    soap_body = axiom_soap_body_create_with_parent(m_env, soap_envelope);
+
+    soap_fault = axiom_soap_fault_create_with_parent(m_env, soap_body);
+
+    fault_code = axiom_soap_fault_code_create_with_parent(m_env, soap_fault);
+
+    xml_writer =
+        axiom_xml_writer_create_for_memory(m_env, NULL, AXIS2_FALSE, AXIS2_FALSE,
+                                           AXIS2_XML_PARSER_TYPE_BUFFER);
+
+    om_output = axiom_output_create(m_env, xml_writer);
+
+    axiom_soap_envelope_serialize(soap_envelope, m_env, om_output, AXIS2_FALSE);
+
+    buffer = (axis2_char_t *) axiom_xml_writer_get_xml(xml_writer, m_env);
+
+    printf("%s \n", buffer);
+
+    axiom_soap_envelope_free(soap_envelope, m_env);
+
+    AXIS2_FREE(m_env->allocator, buffer);
+
+    buffer = NULL;
+
+    /* FIXME this causes a double free?
+     * axiom_output_free(om_output, m_env);
+     */
+
+    printf("\n __________ END BUILD SOAP PROGRAMATICALLY ____________\n");
+
+}
+
+
+TEST_F(TestSOAP, test_create_soap_fault) {
+    axiom_soap_envelope_t *soap_envelope = NULL;
+    axiom_soap_body_t *soap_body = NULL;
+    axiom_soap_fault_t *soap_fault = NULL;
+    axiom_xml_writer_t *xml_writer = NULL;
+    axiom_output_t *om_output = NULL;
+    axis2_char_t *buffer = NULL;
+    axis2_char_t *exception_text = NULL;
+    axis2_status_t status = 0;
+
+    soap_envelope =
+        axiom_soap_envelope_create_default_soap_fault_envelope(m_env,
+                                                               "Fault Code",
+                                                               "Fault Reason",
+                                                               AXIOM_SOAP11,
+                                                               NULL, NULL);
+    soap_body = axiom_soap_envelope_get_body(soap_envelope, m_env);
+    soap_fault = axiom_soap_body_get_fault(soap_body, m_env);
+
+    axiom_soap_fault_detail_create_with_parent(m_env, soap_fault);
+    axiom_soap_fault_role_create_with_parent(m_env, soap_fault);
+    xml_writer =
+        axiom_xml_writer_create_for_memory(m_env, NULL, AXIS2_FALSE, AXIS2_FALSE,
+                                           AXIS2_XML_PARSER_TYPE_BUFFER);
+    om_output = axiom_output_create(m_env, xml_writer);
+    axiom_soap_envelope_serialize(soap_envelope, m_env, om_output, AXIS2_FALSE);
+    buffer = (axis2_char_t *) axiom_xml_writer_get_xml(xml_writer, m_env);
+    printf("\n Testing Create soap fault \n %s \n", buffer);
+
+    status = axiom_soap_fault_set_exception(soap_fault, m_env, "MyNewException");
+    exception_text = axiom_soap_fault_get_exception(soap_fault, m_env);
+
+    printf(" Testing soap fault set exception \n");
+    printf("Actual = %s Expected = %s |", exception_text, "MyNewException");
+    if (status && (0 == strcmp(exception_text, "MyNewException")))
+        printf("SUCCESS\n");
+    else
+        printf("FAILURE\n");
+
+    axiom_soap_envelope_free(soap_envelope, m_env);
+    axiom_output_free(om_output, m_env);
+}
+
+TEST_F(TestSOAP, test_create_soap_fault_with_exception) {
+    axiom_soap_envelope_t *soap_envelope = NULL;
+    axiom_soap_body_t *soap_body = NULL;
+    axiom_soap_fault_t *soap_fault = NULL;
+    axiom_xml_writer_t *xml_writer = NULL;
+    axiom_output_t *om_output = NULL;
+    axis2_char_t *exception_text = NULL;
+
+    soap_envelope =
+        axiom_soap_envelope_create_default_soap_fault_envelope(m_env,
+                                                               "Fault Code",
+                                                               "Fault Reason",
+                                                               AXIOM_SOAP11,
+                                                               NULL, NULL);
+    soap_body = axiom_soap_envelope_get_body(soap_envelope, m_env);
+    soap_fault =
+        axiom_soap_fault_create_with_exception(m_env, soap_body, "MyException");
+
+    axiom_soap_fault_detail_create_with_parent(m_env, soap_fault);
+    axiom_soap_fault_role_create_with_parent(m_env, soap_fault);
+    xml_writer =
+        axiom_xml_writer_create_for_memory(m_env, NULL, AXIS2_FALSE, AXIS2_FALSE,
+                                           AXIS2_XML_PARSER_TYPE_BUFFER);
+    om_output = axiom_output_create(m_env, xml_writer);
+    axiom_soap_envelope_serialize(soap_envelope, m_env, om_output, AXIS2_FALSE);
+
+    exception_text = axiom_soap_fault_get_exception(soap_fault, m_env);
+    printf(" Testing Create soap fault with exception \n");
+    printf("Actual = %s Expected = %s |", exception_text, "MyException");
+    if (0 == strcmp(exception_text, "MyException"))
+        printf("SUCCESS\n");
+    else
+        printf("FAILURE\n");
+
+    axiom_soap_envelope_free(soap_envelope, m_env);
+    axiom_output_free(om_output, m_env);
+}
+
+TEST_F(TestSOAP, test_soap_fault_node) {
+    axiom_soap_envelope_t *soap_envelope = NULL;
+    axiom_soap_body_t *soap_body = NULL;
+    axiom_soap_fault_t *soap_fault = NULL;
+    axis2_char_t *node_text = NULL;
+    axiom_soap_fault_node_t *fault_node = NULL;
+    axis2_status_t status = 0;
+
+    printf("Testing soap fault node \n");
+    soap_envelope =
+        axiom_soap_envelope_create_default_soap_fault_envelope(m_env,
+                                                               "env:Receiver",
+                                                               "Something went wrong!",
+                                                               AXIOM_SOAP12,
+                                                               NULL, NULL);
+    soap_body = axiom_soap_envelope_get_body(soap_envelope, m_env);
+    soap_fault = axiom_soap_body_get_fault(soap_body, m_env);
+
+    fault_node = axiom_soap_fault_node_create_with_parent(m_env, soap_fault);
+    status = axiom_soap_fault_node_set_value(fault_node, m_env, "MyFaultNode");
+    node_text = axiom_soap_fault_node_get_value(fault_node, m_env);
+
+    printf("Actual = %s Expected = %s |", node_text, "MyFaultNode");
+    if (0 == strcmp(node_text, "MyFaultNode"))
+        printf("SUCCESS\n");
+    else
+        printf("FAILURE\n");
+    axiom_soap_envelope_free(soap_envelope, m_env);
+}
+
+
+TEST_F(TestSOAP, test_soap_fault_value) {
+    axiom_soap_envelope_t *soap_envelope = NULL;
+    axiom_soap_body_t *soap_body = NULL;
+    axiom_soap_fault_t *soap_fault = NULL;
+    axiom_soap_fault_code_t *soap_code = NULL;
+    axiom_soap_fault_value_t *value = NULL;
+    axis2_char_t *value_text = NULL;
+
+    printf("TEST SOAP FAULT VALUE\n");
+    soap_envelope =
+        axiom_soap_envelope_create_default_soap_fault_envelope(m_env,
+                                                               "env:Receiver",
+                                                               "Something went wrong!",
+                                                               AXIOM_SOAP12,
+                                                               NULL, NULL);
+    soap_body = axiom_soap_envelope_get_body(soap_envelope, m_env);
+    soap_fault = axiom_soap_body_get_fault(soap_body, m_env);
+    soap_code = axiom_soap_fault_get_code(soap_fault, m_env);
+    value = axiom_soap_fault_code_get_value(soap_code, m_env);
+    value_text = axiom_soap_fault_value_get_text(value, m_env);
+
+    printf("Actual = %s Expected = %s |", value_text, "env:Receiver");
+    if (0 == strcmp(value_text, "env:Receiver"))
+        printf("SUCCESS\n");
+    else
+        printf("FAILURE\n");
+
+    axiom_soap_envelope_free(soap_envelope, m_env);
+}
+
