diff --git a/util/test/allocator/Makefile.am b/util/test/allocator/Makefile.am
index ac9a558..734cb69 100644
--- a/util/test/allocator/Makefile.am
+++ b/util/test/allocator/Makefile.am
@@ -4,9 +4,9 @@
 # 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.
@@ -15,14 +15,17 @@
 TESTS = allocator_test
 check_PROGRAMS = allocator_test
 noinst_PROGRAMS = allocator_test
-allocator_test_SOURCES = allocator_test.c ../util/create_env.c
+allocator_test_SOURCES = allocator_test.cc
 
 allocator_test_LDADD   =   \
-                    $(top_builddir)/src/libaxutil.la 
+                    $(top_builddir)/src/libaxutil.la \
+					$(top_builddir)/$(GTEST)/libgtest.a \
+					$(top_builddir)/$(GTEST)/libgtest_main.a
+
 
 INCLUDES = -I$(top_builddir)/include \
 			-I ../../../axiom/include \
 			-I ../../../include \
-		 	-I ../../../test/cutest/include
+			-I $(GTEST_DIR)/include
 
 
diff --git a/util/test/allocator/allocator_test.c b/util/test/allocator/allocator_test.c
deleted file mode 100644
index e696022..0000000
--- a/util/test/allocator/allocator_test.c
+++ /dev/null
@@ -1,107 +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 <axutil_log_default.h>
-#include <axutil_error_default.h>
-#include <axiom_node.h>
-#include <stdio.h>
-#include <cut_defs.h>
-#include "../util/create_env.h"
-
-unsigned char buffer[1024];
-
-void test_base64(axutil_env_t *env)
-{  
-    axis2_status_t status = AXIS2_FAILURE;
-    axutil_base64_binary_t *base64_binary;
-    axutil_base64_binary_t *plain_base64_binary;
-    const char *encoded_binary;
-    unsigned char * get_binary = NULL;
-    int plain_binary_len, b_len;
-    unsigned char * plain_binary = NULL;
-	FILE *in = fopen("test","rb");
-	CUT_ASSERT(in != NULL);
-    if (!in) return;
-	
-    plain_binary_len = fread(buffer,1,sizeof(buffer),in);
-    fclose(in);
-    plain_binary = buffer;
-    CUT_ASSERT(plain_binary_len != 0);
-    if (plain_binary_len == 0 ) return;
-	
-    base64_binary = axutil_base64_binary_create(env);
-    CUT_ASSERT(base64_binary != NULL);
-
-    plain_base64_binary = axutil_base64_binary_create_with_plain_binary(env,
-                                                                        plain_binary,
-                                                                        plain_binary_len); 
-    CUT_ASSERT(plain_base64_binary != NULL);
-
-    encoded_binary = axutil_base64_binary_get_encoded_binary(plain_base64_binary,env);
-    CUT_ASSERT(encoded_binary != NULL);
-
-    status = axutil_base64_binary_set_plain_binary(base64_binary,env,plain_binary,
-                                                   plain_binary_len);
-    CUT_ASSERT(status == AXIS2_SUCCESS);
-    plain_binary = axutil_base64_binary_get_plain_binary(base64_binary,env,&b_len);
-    CUT_ASSERT(plain_binary != NULL);
-    status = axutil_base64_binary_set_encoded_binary(base64_binary,env,encoded_binary);
-    CUT_ASSERT(status == AXIS2_SUCCESS);
-    get_binary = (unsigned char *) axutil_base64_binary_get_encoded_binary(base64_binary,env);
-    CUT_ASSERT(get_binary != NULL);
-    b_len = axutil_base64_binary_get_encoded_binary_len(base64_binary,env);
-    CUT_ASSERT(b_len != 0);
-		
-    axutil_base64_binary_free(base64_binary, env);
-	base64_binary = axutil_base64_binary_create_with_encoded_binary(env, encoded_binary);
-    CUT_ASSERT(base64_binary != NULL);
-    if (base64_binary != NULL)
-	{
-		int binary_len;
-		get_binary = axutil_base64_binary_get_plain_binary(base64_binary,env, &binary_len);
-		CUT_ASSERT(binary_len == plain_binary_len);
-        CUT_ASSERT(memcmp(get_binary, plain_binary, plain_binary_len) == 0);
-        axutil_base64_binary_free(base64_binary, env);
-	}
-		
-    /* To avoid warning of not using cut_ptr_equal */
-    CUT_ASSERT_PTR_EQUAL(NULL, NULL, 0);
-    /* To avoid warning of not using cut_int_equal */
-    CUT_ASSERT_INT_EQUAL(0, 0, 0);
-    /* To avoid warning of not using cut_str_equal */
-    CUT_ASSERT_STR_EQUAL("", "", 0);
-
-	axutil_base64_binary_free(plain_base64_binary, env);
-}
-
-int main()
-{
-    axutil_env_t *env = cut_setup_env("Base64");
-    CUT_ASSERT(env != NULL);
-    test_base64(env);
-    axutil_env_free(env);
-    CUT_RETURN_ON_FAILURE(-1);
-    return 0;
-}
-
-
-
-
-
-
-
-
diff --git a/util/test/allocator/allocator_test.cc b/util/test/allocator/allocator_test.cc
new file mode 100644
index 0000000..b678f4e
--- /dev/null
+++ b/util/test/allocator/allocator_test.cc
@@ -0,0 +1,112 @@
+/*
+* 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 <axutil_log_default.h>
+#include <axutil_error_default.h>
+#include <axiom_node.h>
+#include <stdio.h>
+#include "../util/create_env.h"
+
+unsigned char buffer[1024];
+
+class TestAllocator: public ::testing::Test
+{
+
+    protected:
+        void SetUp()
+        {
+
+            m_allocator = axutil_allocator_init(NULL);
+            m_axis_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_axis_log);
+
+        }
+
+        void TearDown()
+        {
+            axutil_env_free(m_env);
+        }
+
+
+        axutil_allocator_t *m_allocator = NULL;
+        axutil_env_t *m_env = NULL;
+        axutil_error_t *m_error = NULL;
+        axutil_log_t *m_axis_log = NULL;
+
+};
+
+
+TEST_F(TestAllocator, test_base64)
+{
+
+    axis2_status_t status = AXIS2_FAILURE;
+    axutil_base64_binary_t *base64_binary;
+    axutil_base64_binary_t *plain_base64_binary;
+    const char *encoded_binary;
+    unsigned char * get_binary = NULL;
+    int plain_binary_len, b_len;
+    unsigned char * plain_binary = NULL;
+	FILE *in = fopen("test","rb");
+    ASSERT_NE(in, nullptr);
+
+    plain_binary_len = fread(buffer,1,sizeof(buffer),in);
+    fclose(in);
+    plain_binary = buffer;
+    ASSERT_NE(plain_binary_len, 0);
+
+    base64_binary = axutil_base64_binary_create(m_env);
+    ASSERT_NE(base64_binary, nullptr);
+
+    plain_base64_binary = axutil_base64_binary_create_with_plain_binary(m_env,
+                                                                        plain_binary,
+                                                                        plain_binary_len); 
+    ASSERT_NE(plain_base64_binary, nullptr);
+
+    encoded_binary = axutil_base64_binary_get_encoded_binary(plain_base64_binary, m_env);
+    ASSERT_NE(encoded_binary, nullptr);
+
+    status = axutil_base64_binary_set_plain_binary(base64_binary,m_env,plain_binary,
+                                                   plain_binary_len);
+    ASSERT_EQ(status, AXIS2_SUCCESS);
+    plain_binary = axutil_base64_binary_get_plain_binary(base64_binary,m_env,&b_len);
+    ASSERT_NE(plain_binary, nullptr);
+    status = axutil_base64_binary_set_encoded_binary(base64_binary,m_env,encoded_binary);
+    ASSERT_EQ(status, AXIS2_SUCCESS);
+    get_binary = (unsigned char *) axutil_base64_binary_get_encoded_binary(base64_binary,m_env);
+    ASSERT_NE(get_binary, nullptr);
+    b_len = axutil_base64_binary_get_encoded_binary_len(base64_binary,m_env);
+    ASSERT_NE(b_len, 0);
+
+    axutil_base64_binary_free(base64_binary, m_env);
+	base64_binary = axutil_base64_binary_create_with_encoded_binary(m_env, encoded_binary);
+    ASSERT_NE(base64_binary, nullptr);
+    if (base64_binary != nullptr)
+	{
+		int binary_len;
+		get_binary = axutil_base64_binary_get_plain_binary(base64_binary,m_env, &binary_len);
+		ASSERT_EQ(binary_len, plain_binary_len);
+        ASSERT_EQ(memcmp(get_binary, plain_binary, plain_binary_len), 0);
+        axutil_base64_binary_free(base64_binary, m_env);
+	}
+
+	axutil_base64_binary_free(plain_base64_binary, m_env);
+}
+
diff --git a/util/test/date_time/Makefile.am b/util/test/date_time/Makefile.am
index c34e0bb..2f4e608 100644
--- a/util/test/date_time/Makefile.am
+++ b/util/test/date_time/Makefile.am
@@ -4,9 +4,9 @@
 # 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.
@@ -15,15 +15,16 @@
 TESTS = date_time_test
 noinst_PROGRAMS = date_time_test
 check_PROGRAMS = date_time_test
-date_time_test_SOURCES = date_time_test.c ../util/create_env.c
+date_time_test_SOURCES = date_time_test.cc
 
 date_time_test_LDADD   =   \
-                    $(top_builddir)/src/libaxutil.la 
+				$(top_builddir)/src/libaxutil.la \
+				$(top_builddir)/$(GTEST)/libgtest.a \
+				$(top_builddir)/$(GTEST)/libgtest_main.a
 
-INCLUDES = -I$(top_builddir)/include \
-			-I$(CUTEST_HOME)/include \
+AM_CPPFLAGS = -I$(top_builddir)/include \
 			-I ../../../axiom/include \
 			-I ../../../include \
-		 	-I ../../../test/cutest/include
+			-I $(GTEST_DIR)/include
 
 
diff --git a/util/test/date_time/date_time_test.c b/util/test/date_time/date_time_test.c
deleted file mode 100644
index 11469f1..0000000
--- a/util/test/date_time/date_time_test.c
+++ /dev/null
@@ -1,118 +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 <axutil_date_time.h>
-#include <time.h>
-#include <axutil_date_time_util.h>
-#include <stdio.h>
-#include <axutil_env.h>
-#include "../util/create_env.h"
-#include <cut_defs.h>
-
-/** @brief test_rand 
- *  *   deserialize and serialize the time 
- *   */
-
-void test_date_time(axutil_env_t *env)
-{
-    axutil_date_time_t *date_time = NULL;
-    axutil_date_time_t *ref = NULL;
-    axutil_date_time_t *date_time_offset = NULL;
-    axis2_char_t *time_str = "22:45:12";
-    axis2_char_t *date_str = "2000-12-12";
-    axis2_char_t *date_time_str = "2000-11-11T12:30:24";
-    axis2_status_t status = AXIS2_FAILURE;
-    axutil_date_time_comp_result_t compare_res = AXIS2_DATE_TIME_COMP_RES_FAILURE;
-    axis2_char_t *t_str = NULL, *d_str = NULL, *dt_str = NULL;
-    int year , month , date , hour , min , sec , msec;
-    
-    date_time_offset = axutil_date_time_create_with_offset(env, 100);
-    CUT_ASSERT(date_time_offset != NULL);
-    if (date_time_offset != NULL) axutil_date_time_free(date_time_offset, env);
-    date_time = axutil_date_time_create(env);
-    CUT_ASSERT(date_time != NULL);
-    if(date_time)
-    {
-        status = axutil_date_time_deserialize_time(date_time, env, time_str);
-        CUT_ASSERT(status == AXIS2_SUCCESS);
-        status = axutil_date_time_deserialize_date(date_time, env, date_str);
-        CUT_ASSERT(status == AXIS2_SUCCESS);
-        status = axutil_date_time_deserialize_date_time(date_time, env, date_time_str);
-        CUT_ASSERT(status == AXIS2_SUCCESS);
-
-        ref = axutil_date_time_create(env);
-        CUT_ASSERT(ref != NULL);
-        if(ref)
-        {
-            compare_res = axutil_date_time_compare(date_time, env, ref);
-            CUT_ASSERT(compare_res != AXIS2_DATE_TIME_COMP_RES_FAILURE);
-
-            status = axutil_date_time_deserialize_date_time(ref, env, date_time_str);
-            CUT_ASSERT(status == AXIS2_SUCCESS);
-            compare_res = axutil_date_time_compare(date_time, env, ref);
-            CUT_ASSERT(compare_res == AXIS2_DATE_TIME_COMP_RES_EQUAL);
-            axutil_date_time_free(ref, env);
-        }
-        status = axutil_date_time_set_date_time(date_time, env, 2008, 1, 8, 12, 18, 57, 799);
-        CUT_ASSERT(status == AXIS2_SUCCESS);
-
-        t_str = axutil_date_time_serialize_time(date_time, env);
-        CUT_ASSERT(t_str != NULL);
-        d_str = axutil_date_time_serialize_date(date_time, env);
-        CUT_ASSERT(d_str != NULL);
-        dt_str = axutil_date_time_serialize_date_time(date_time, env);
-        CUT_ASSERT(d_str != NULL);
-        year = axutil_date_time_get_year(date_time,env);
-        month=axutil_date_time_get_month(date_time,env);
-        date = axutil_date_time_get_date(date_time,env);
-        hour = axutil_date_time_get_hour(date_time,env);
-        min  = axutil_date_time_get_minute(date_time,env);
-        sec  = axutil_date_time_get_second(date_time,env);
-        msec = axutil_date_time_get_msec(date_time,env);
-        CUT_ASSERT(year == 2008);
-        CUT_ASSERT(month == 1);
-        CUT_ASSERT(date == 8);
-        CUT_ASSERT(hour == 12);
-        CUT_ASSERT(min == 18);
-        CUT_ASSERT(sec == 57);
-        CUT_ASSERT(msec == 799); 
-        
-        /* To avoid warning of not using cut_ptr_equal */
-        CUT_ASSERT_PTR_EQUAL(NULL, NULL, 0);
-        /* To avoid warning of not using cut_int_equal */
-        CUT_ASSERT_INT_EQUAL(0, 0, 0);
-        /* To avoid warning of not using cut_str_equal */
-        CUT_ASSERT_STR_EQUAL("", "", 0);
-
-        axutil_date_time_free(date_time,env);
-   }
-}
-
-int main()
-{
-    axutil_env_t *env = NULL;
-    env = cut_setup_env("Date Time");
-    CUT_ASSERT(env != NULL);
-    if (env) 
-    {
-        test_date_time(env);
-        axutil_env_free(env);
-    }
-    CUT_RETURN_ON_FAILURE(-1);
-    return 0;
-}
-
diff --git a/util/test/date_time/date_time_test.cc b/util/test/date_time/date_time_test.cc
new file mode 100644
index 0000000..37d4538
--- /dev/null
+++ b/util/test/date_time/date_time_test.cc
@@ -0,0 +1,127 @@
+/*
+* 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 <axutil_date_time.h>
+#include <time.h>
+#include <axutil_date_time_util.h>
+#include <stdio.h>
+#include <axutil_env.h>
+#include "../util/create_env.h"
+
+class TestDateTime: public ::testing::Test
+{
+
+    protected:
+        void SetUp()
+        {
+
+            m_allocator = axutil_allocator_init(NULL);
+            m_axis_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_axis_log);
+
+        }
+
+        void TearDown()
+        {
+            axutil_env_free(m_env);
+        }
+
+
+        axutil_allocator_t *m_allocator = NULL;
+        axutil_env_t *m_env = NULL;
+        axutil_error_t *m_error = NULL;
+        axutil_log_t *m_axis_log = NULL;
+
+};
+
+
+/** @brief test_rand 
+ *  *   deserialize and serialize the time 
+ *   */
+
+TEST_F(TestDateTime, test_date_time) {
+
+    axutil_date_time_t *date_time = NULL;
+    axutil_date_time_t *ref = NULL;
+    axutil_date_time_t *date_time_offset = NULL;
+    axis2_char_t *time_str = "22:45:12";
+    axis2_char_t *date_str = "2000-12-12";
+    axis2_char_t *date_time_str = "2000-11-11T12:30:24";
+    axis2_status_t status = AXIS2_FAILURE;
+    axutil_date_time_comp_result_t compare_res = AXIS2_DATE_TIME_COMP_RES_FAILURE;
+    axis2_char_t *t_str = NULL, *d_str = NULL, *dt_str = NULL;
+    int year , month , day, hour , min , sec , msec;
+
+    date_time_offset = axutil_date_time_create_with_offset(m_env, 100);
+    ASSERT_NE(date_time_offset, nullptr);
+    if (date_time_offset != nullptr) axutil_date_time_free(date_time_offset, m_env);
+    date_time = axutil_date_time_create(m_env);
+    ASSERT_NE(date_time, nullptr);
+    if(date_time)
+    {
+        status = axutil_date_time_deserialize_time(date_time, m_env, time_str);
+        ASSERT_EQ(status, AXIS2_SUCCESS);
+        status = axutil_date_time_deserialize_date(date_time, m_env, date_str);
+        ASSERT_EQ(status, AXIS2_SUCCESS);
+        status = axutil_date_time_deserialize_date_time(date_time, m_env, date_time_str);
+        ASSERT_EQ(status, AXIS2_SUCCESS);
+
+        ref = axutil_date_time_create(m_env);
+        ASSERT_NE(ref, nullptr);
+        if(ref)
+        {
+            compare_res = axutil_date_time_compare(date_time, m_env, ref);
+            ASSERT_NE(compare_res, AXIS2_DATE_TIME_COMP_RES_FAILURE);
+
+            status = axutil_date_time_deserialize_date_time(ref, m_env, date_time_str);
+            ASSERT_EQ(status, AXIS2_SUCCESS);
+            compare_res = axutil_date_time_compare(date_time, m_env, ref);
+            ASSERT_EQ(compare_res, AXIS2_DATE_TIME_COMP_RES_EQUAL);
+            axutil_date_time_free(ref, m_env);
+        }
+        status = axutil_date_time_set_date_time(date_time, m_env, 2008, 1, 8, 12, 18, 57, 799);
+        ASSERT_EQ(status, AXIS2_SUCCESS);
+
+        t_str = axutil_date_time_serialize_time(date_time, m_env);
+        ASSERT_NE(t_str, nullptr);
+        d_str = axutil_date_time_serialize_date(date_time, m_env);
+        ASSERT_NE(d_str, nullptr);
+        dt_str = axutil_date_time_serialize_date_time(date_time, m_env);
+        ASSERT_NE(dt_str, nullptr);
+        year = axutil_date_time_get_year(date_time, m_env);
+        month=axutil_date_time_get_month(date_time, m_env);
+        day = axutil_date_time_get_day(date_time, m_env);
+        hour = axutil_date_time_get_hour(date_time, m_env);
+        min  = axutil_date_time_get_minute(date_time, m_env);
+        sec  = axutil_date_time_get_second(date_time, m_env);
+        msec = axutil_date_time_get_msec(date_time, m_env);
+        ASSERT_EQ(year, 2008);
+        ASSERT_EQ(month, 1);
+        ASSERT_EQ(day, 8);
+        ASSERT_EQ(hour, 12);
+        ASSERT_EQ(min, 18);
+        ASSERT_EQ(sec, 57);
+        ASSERT_EQ(msec, 799);
+
+        axutil_date_time_free(date_time,m_env);
+   }
+}
+
diff --git a/util/test/duration/Makefile.am b/util/test/duration/Makefile.am
index b9d489d..b0dacb4 100644
--- a/util/test/duration/Makefile.am
+++ b/util/test/duration/Makefile.am
@@ -4,9 +4,9 @@
 # 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.
@@ -15,15 +15,16 @@
 TESTS = duration_test
 check_PROGRAMS = duration_test
 noinst_PROGRAMS = duration_test
-duration_test_SOURCES = duration_test.c ../util/create_env.c
+duration_test_SOURCES = duration_test.cc
 
 duration_test_LDADD   =   \
-                    $(top_builddir)/src/libaxutil.la 
+				$(top_builddir)/src/libaxutil.la \
+				$(top_builddir)/$(GTEST)/libgtest.a \
+				$(top_builddir)/$(GTEST)/libgtest_main.a
 
-INCLUDES = -I$(top_builddir)/include \
-			-I$(CUTEST_HOME)/include \
+AM_CPPFLAGS = -I$(top_builddir)/include \
 			-I ../../../axiom/include \
 			-I ../../../include \
-		 	-I ../../../test/cutest/include
+			-I $(GTEST_DIR)/include
 
 
diff --git a/util/test/duration/duration_test.c b/util/test/duration/duration_test.c
deleted file mode 100644
index 4af0c4b..0000000
--- a/util/test/duration/duration_test.c
+++ /dev/null
@@ -1,160 +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 <axutil_duration.h>
-#include <cut_defs.h>
-#include "../util/create_env.h"
-
-/** @brief test duration
- *  create duration from values and retrieve values
- */
-void test_duration(axutil_env_t *env)
-{ 
-    axis2_status_t status = AXIS2_FAILURE;
-    axis2_char_t * duration_str = "P3Y12M23DT11H45M45.000000S";
-    axis2_char_t * duration_str1 = "-P3Y12M23DT11H45M45.000000S";
-    int year,month,day,hour,minute;
-    double second;
-    axutil_duration_t * duration;
-    axutil_duration_t * duration_one;
-    axutil_duration_t * duration_two;
-    axutil_duration_t * duration_three;
-    axutil_duration_t * duration_four;
-    axis2_bool_t is_negative = AXIS2_FALSE;
-    axis2_char_t *serialize, *serialize1;
-
-    duration = axutil_duration_create_from_values(env,AXIS2_TRUE,3,12,23,11,45,45.00);
-	CUT_ASSERT(duration != NULL);
-    duration_one = axutil_duration_create_from_values(env,AXIS2_FALSE,7,11,2,23,11,50.00);
-	CUT_ASSERT(duration_one != NULL);
-    duration_two = axutil_duration_create_from_string(env,duration_str);
-	CUT_ASSERT(duration_two != NULL);
-    duration_three = axutil_duration_create(env);
-	CUT_ASSERT(duration_three != NULL);
-    duration_four  = axutil_duration_create(env);
-	CUT_ASSERT(duration_four != NULL);
-
-    year = axutil_duration_get_years(duration,env);
-    month = axutil_duration_get_months(duration,env);
-    day = axutil_duration_get_days(duration,env);
-    hour = axutil_duration_get_hours(duration,env);
-    minute = axutil_duration_get_mins(duration,env);
-    second = axutil_duration_get_seconds(duration,env);
-    is_negative = axutil_duration_get_is_negative(duration,env);
-
-    status = axutil_duration_deserialize_duration(duration_three,env,duration_str);
-    CUT_ASSERT(status == AXIS2_SUCCESS);
-    status = axutil_duration_deserialize_duration(duration_four,env,duration_str1);
-    CUT_ASSERT(status == AXIS2_SUCCESS);
-    serialize = axutil_duration_serialize_duration(duration_three,env);
-    CUT_ASSERT(serialize != NULL);
-	CUT_ASSERT(strcmp(duration_str, serialize) == 0);
-    serialize1 = axutil_duration_serialize_duration(duration_four,env);
-    CUT_ASSERT(serialize1 != NULL);
-	CUT_ASSERT(strcmp(duration_str1, serialize1) == 0);
-    status  = axutil_duration_set_duration(duration,env,AXIS2_TRUE,3,12,23,11,45,56.00);
-    CUT_ASSERT(status == AXIS2_SUCCESS);
-        
-    /* To avoid warning of not using cut_ptr_equal */
-    CUT_ASSERT_PTR_EQUAL(NULL, NULL, 0);
-    /* To avoid warning of not using cut_int_equal */
-    CUT_ASSERT_INT_EQUAL(0, 0, 0);
-    /* To avoid warning of not using cut_str_equal */
-    CUT_ASSERT_STR_EQUAL("", "", 0);
-
-    axutil_duration_free(duration,env);
-    axutil_duration_free(duration_one,env);
-    axutil_duration_free(duration_two,env);
-    axutil_duration_free(duration_three,env);
-    axutil_duration_free(duration_four,env);
-}
-
-/** @brief set values
- *  set values for the duration and get the values 
- */
-void set_values(axutil_env_t *env)
-{
-    axis2_status_t status;
-    axutil_duration_t * duration;
-    axutil_duration_t * duration_one;
-    int get_year,get_month,get_day,get_hour,get_minute;
-    axis2_bool_t is_negative;
-    double get_second;
-
-    duration  = axutil_duration_create(env);
-	CUT_ASSERT(duration != NULL);
-	if ( duration == NULL ) return;
-    duration_one = axutil_duration_create_from_values(env,AXIS2_TRUE,5,9,29,59,21,49);
-	CUT_ASSERT(duration_one != NULL);
-
-    status = axutil_duration_set_is_negative(duration,env,AXIS2_TRUE);
-	CUT_ASSERT(status == AXIS2_SUCCESS);
-    if (status != AXIS2_SUCCESS)
-    {
-        axutil_duration_free(duration,env);
-        axutil_duration_free(duration_one,env);
-        return;
-    }
-    is_negative = axutil_duration_get_is_negative(duration,env);
-	CUT_ASSERT(is_negative == AXIS2_TRUE);
-    if (!is_negative)
-    {
-        axutil_duration_free(duration,env);
-        axutil_duration_free(duration_one,env);
-        return;
-    }
-
-    status = axutil_duration_set_years(duration,env,5);
-    CUT_ASSERT(status == AXIS2_SUCCESS);
-    get_year = axutil_duration_get_years(duration,env);
-	CUT_ASSERT(get_year == 5);
-    status = axutil_duration_set_months(duration,env,9);
-    CUT_ASSERT(status == AXIS2_SUCCESS);
-    get_month = axutil_duration_get_months(duration,env);
-	CUT_ASSERT(get_month == 9);
-    status = axutil_duration_set_days(duration,env,29);
-    CUT_ASSERT(status == AXIS2_SUCCESS);
-    get_day = axutil_duration_get_days(duration,env);
-	CUT_ASSERT(get_day == 29);
-    status = axutil_duration_set_hours(duration,env,59);
-    CUT_ASSERT(status == AXIS2_SUCCESS);
-    get_hour = axutil_duration_get_hours(duration,env);
- 	CUT_ASSERT(get_hour == 59);
-    status = axutil_duration_set_mins(duration,env,21);
-    CUT_ASSERT(status == AXIS2_SUCCESS);
-    get_minute = axutil_duration_get_mins(duration,env);
-  	CUT_ASSERT(get_minute == 21);
-    status = axutil_duration_set_seconds(duration,env,49);
-    CUT_ASSERT(status == AXIS2_SUCCESS);
-    get_second = axutil_duration_get_seconds(duration,env);
-  	CUT_ASSERT(get_second == 49);
-    CUT_ASSERT(axutil_duration_compare(duration_one,duration,env));
-    axutil_duration_free(duration,env);
-    axutil_duration_free(duration_one,env);
-}
-int main()
-{
-    axutil_env_t *env = cut_setup_env("Duration");
-    CUT_ASSERT(env != NULL);
-	if (env) {
-       test_duration(env);
-       set_values(env);
-       axutil_env_free(env);
-	}
-    CUT_RETURN_ON_FAILURE(-1);
-    return 0;
-}
diff --git a/util/test/duration/duration_test.cc b/util/test/duration/duration_test.cc
new file mode 100644
index 0000000..db28b1d
--- /dev/null
+++ b/util/test/duration/duration_test.cc
@@ -0,0 +1,162 @@
+/*
+* 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 <axutil_duration.h>
+#include "../util/create_env.h"
+
+
+class TestDuration: public ::testing::Test
+{
+
+    protected:
+        void SetUp()
+        {
+
+            m_allocator = axutil_allocator_init(NULL);
+            m_axis_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_axis_log);
+
+        }
+
+        void TearDown()
+        {
+            axutil_env_free(m_env);
+        }
+
+
+        axutil_allocator_t *m_allocator = NULL;
+        axutil_env_t *m_env = NULL;
+        axutil_error_t *m_error = NULL;
+        axutil_log_t *m_axis_log = NULL;
+
+};
+
+
+/** @brief test duration
+ *  create duration from values and retrieve values
+ */
+
+TEST_F(TestDuration, test_duration) {
+
+    axis2_status_t status = AXIS2_FAILURE;
+    axis2_char_t * duration_str = "P3Y12M23DT11H45M45.000000S";
+    axis2_char_t * duration_str1 = "-P3Y12M23DT11H45M45.000000S";
+    int year,month,day,hour,minute;
+    double second;
+    axutil_duration_t * duration;
+    axutil_duration_t * duration_one;
+    axutil_duration_t * duration_two;
+    axutil_duration_t * duration_three;
+    axutil_duration_t * duration_four;
+    axis2_bool_t is_negative = AXIS2_FALSE;
+    axis2_char_t *serialize, *serialize1;
+
+    duration = axutil_duration_create_from_values(m_env,AXIS2_TRUE,3,12,23,11,45,45.00);
+	ASSERT_NE(duration, nullptr);
+    duration_one = axutil_duration_create_from_values(m_env,AXIS2_FALSE,7,11,2,23,11,50.00);
+	ASSERT_NE(duration_one, nullptr);
+    duration_two = axutil_duration_create_from_string(m_env,duration_str);
+	ASSERT_NE(duration_two, nullptr);
+    duration_three = axutil_duration_create(m_env);
+	ASSERT_NE(duration_three, nullptr);
+    duration_four  = axutil_duration_create(m_env);
+	ASSERT_NE(duration_four, nullptr);
+
+    year = axutil_duration_get_years(duration, m_env);
+    month = axutil_duration_get_months(duration, m_env);
+    day = axutil_duration_get_days(duration, m_env);
+    hour = axutil_duration_get_hours(duration, m_env);
+    minute = axutil_duration_get_mins(duration, m_env);
+    second = axutil_duration_get_seconds(duration, m_env);
+    is_negative = axutil_duration_get_is_negative(duration, m_env);
+
+    status = axutil_duration_deserialize_duration(duration_three, m_env,duration_str);
+    ASSERT_EQ(status, AXIS2_SUCCESS);
+    status = axutil_duration_deserialize_duration(duration_four, m_env,duration_str1);
+    ASSERT_EQ(status, AXIS2_SUCCESS);
+    serialize = axutil_duration_serialize_duration(duration_three, m_env);
+    ASSERT_NE(serialize, nullptr);
+	ASSERT_STREQ(duration_str, serialize);
+    serialize1 = axutil_duration_serialize_duration(duration_four, m_env);
+    ASSERT_NE(serialize1, nullptr);
+	ASSERT_STREQ(duration_str1, serialize1);
+    status  = axutil_duration_set_duration(duration,m_env,AXIS2_TRUE,3,12,23,11,45,56.00);
+    ASSERT_EQ(status, AXIS2_SUCCESS);
+
+
+    axutil_duration_free(duration, m_env);
+    axutil_duration_free(duration_one, m_env);
+    axutil_duration_free(duration_two, m_env);
+    axutil_duration_free(duration_three, m_env);
+    axutil_duration_free(duration_four, m_env);
+}
+
+/** @brief set values
+ *  set values for the duration and get the values
+ */
+TEST_F(TestDuration, test_set_values) {
+
+    axis2_status_t status;
+    axutil_duration_t * duration;
+    axutil_duration_t * duration_one;
+    int get_year,get_month,get_day,get_hour,get_minute;
+    axis2_bool_t is_negative;
+    double get_second;
+
+    duration  = axutil_duration_create(m_env);
+    ASSERT_NE(duration, nullptr);
+    duration_one = axutil_duration_create_from_values(m_env,AXIS2_TRUE,5,9,29,59,21,49);
+    ASSERT_NE(duration_one, nullptr);
+
+    status = axutil_duration_set_is_negative(duration,m_env,AXIS2_TRUE);
+    ASSERT_EQ(status, AXIS2_SUCCESS);
+
+    is_negative = axutil_duration_get_is_negative(duration, m_env);
+    ASSERT_EQ(is_negative, AXIS2_TRUE);
+
+    status = axutil_duration_set_years(duration, m_env,5);
+    ASSERT_EQ(status, AXIS2_SUCCESS);
+    get_year = axutil_duration_get_years(duration, m_env);
+    ASSERT_EQ(get_year, 5);
+    status = axutil_duration_set_months(duration, m_env,9);
+    ASSERT_EQ(status, AXIS2_SUCCESS);
+    get_month = axutil_duration_get_months(duration, m_env);
+    ASSERT_EQ(get_month, 9);
+    status = axutil_duration_set_days(duration, m_env,29);
+    ASSERT_EQ(status, AXIS2_SUCCESS);
+    get_day = axutil_duration_get_days(duration, m_env);
+    ASSERT_EQ(get_day, 29);
+    status = axutil_duration_set_hours(duration, m_env,59);
+    ASSERT_EQ(status, AXIS2_SUCCESS);
+    get_hour = axutil_duration_get_hours(duration, m_env);
+    ASSERT_EQ(get_hour, 59);
+    status = axutil_duration_set_mins(duration, m_env,21);
+    ASSERT_EQ(status, AXIS2_SUCCESS);
+    get_minute = axutil_duration_get_mins(duration, m_env);
+    ASSERT_EQ(get_minute, 21);
+    status = axutil_duration_set_seconds(duration, m_env,49);
+    ASSERT_EQ(status, AXIS2_SUCCESS);
+    get_second = axutil_duration_get_seconds(duration, m_env);
+    ASSERT_EQ(get_second, 49);
+    ASSERT_TRUE(axutil_duration_compare(duration_one,duration, m_env));
+    axutil_duration_free(duration, m_env);
+    axutil_duration_free(duration_one, m_env);
+}
diff --git a/util/test/link_list/Makefile.am b/util/test/link_list/Makefile.am
index 706f93e..5545013 100644
--- a/util/test/link_list/Makefile.am
+++ b/util/test/link_list/Makefile.am
@@ -4,9 +4,9 @@
 # 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.
@@ -15,15 +15,16 @@
 TESTS = link_list_test
 check_PROGRAMS = link_list_test
 noinst_PROGRAMS = link_list_test
-link_list_test_SOURCES = link_list_test.c ../util/create_env.c
+link_list_test_SOURCES = link_list_test.cc 
 
 link_list_test_LDADD   =   \
-                    $(top_builddir)/src/libaxutil.la 
+				$(top_builddir)/src/libaxutil.la \
+				$(top_builddir)/$(GTEST)/libgtest.a \
+				$(top_builddir)/$(GTEST)/libgtest_main.a
 
-INCLUDES = -I$(top_builddir)/include \
-			-I$(CUTEST_HOME)/include \
+AM_CPPFLAGS = -I$(top_builddir)/include \
 			-I ../../../axiom/include \
 			-I ../../../include \
-		 	-I ../../../test/cutest/include
+			-I $(GTEST_DIR)/include
 
 
diff --git a/util/test/link_list/link_list_test.c b/util/test/link_list/link_list_test.c
deleted file mode 100644
index d5640ff..0000000
--- a/util/test/link_list/link_list_test.c
+++ /dev/null
@@ -1,106 +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 <axutil_linked_list.h>
-#include <cut_defs.h>
-#include "../util/create_env.h"
-
-axutil_env_t *env = NULL;
-axutil_linked_list_t * linked_list = NULL;
-entry_t *entry = NULL;
-
-void test_link_list(axutil_env_t *env,char * first_item,char * second_item,char * third_item,char *last_item,char *array)
-{ 
-    int index_of_item;
-	int index_of_last_item;
-	entry_t * entry;
-	void *get_item;
-	axis2_status_t status;
-	axis2_bool_t bresult;
-	void **array_from_list;
-	
-	linked_list = axutil_linked_list_create(env);
-    CUT_ASSERT(linked_list != NULL);
-    if (!linked_list) return;
-    status = axutil_linked_list_add_first(linked_list,env,(void *)first_item);
-	CUT_ASSERT(status = AXIS2_SUCCESS);
-    bresult = axutil_linked_list_contains(linked_list,env,(void *)second_item);
-	CUT_ASSERT(bresult == AXIS2_FALSE);
-    status = axutil_linked_list_add(linked_list,env,(void *)third_item);
-	CUT_ASSERT(status = AXIS2_SUCCESS);
-    status = axutil_linked_list_add_last(linked_list,env,(void *)last_item);
-	CUT_ASSERT(status = AXIS2_SUCCESS);
- 	CUT_ASSERT(axutil_linked_list_size(linked_list,env) == 3);
-    index_of_item = axutil_linked_list_index_of(linked_list,env,third_item);
-    CUT_ASSERT(index_of_item == 1);
-    index_of_last_item = axutil_linked_list_last_index_of(linked_list,env,last_item);
-    CUT_ASSERT(index_of_last_item == 2);
-    entry = axutil_linked_list_get_entry(linked_list,env,0);
-    CUT_ASSERT(entry != NULL);
-    get_item = axutil_linked_list_get(linked_list,env,1);
-    CUT_ASSERT(get_item != NULL);
-	CUT_ASSERT(strcmp((char*)get_item, third_item) == 0);
-    get_item = axutil_linked_list_set(linked_list,env,1,(void *)array);
-    CUT_ASSERT(get_item != NULL);
-	CUT_ASSERT(strcmp((char*)get_item, third_item) == 0);
-    array_from_list = axutil_linked_list_to_array(linked_list,env);
-	CUT_ASSERT(array_from_list != NULL);
-    status = axutil_linked_list_add_at_index(linked_list,env,1,(void *)second_item);
-	CUT_ASSERT(status == AXIS2_SUCCESS);
-    get_item = axutil_linked_list_remove_at_index(linked_list,env,1);
-	CUT_ASSERT(get_item != NULL);
-    bresult = axutil_linked_list_check_bounds_inclusive(linked_list,env,1);
-	CUT_ASSERT(bresult == AXIS2_TRUE);
-    status = axutil_linked_list_remove_entry(linked_list,env,entry);
- 	CUT_ASSERT(status == AXIS2_SUCCESS);
-    get_item = axutil_linked_list_remove_first(linked_list,env);
-	CUT_ASSERT(get_item != NULL);
-    get_item = axutil_linked_list_remove_last(linked_list,env);
-	CUT_ASSERT(get_item != NULL);
-	CUT_ASSERT(axutil_linked_list_size(linked_list,env) == 0);
-
-    bresult = axutil_linked_list_remove(linked_list,env,(void *)third_item);
- 	CUT_ASSERT(bresult == AXIS2_FALSE);
-    
-    /* To avoid warning of not using cut_ptr_equal */
-    CUT_ASSERT_PTR_EQUAL(NULL, NULL, 0);
-    /* To avoid warning of not using cut_int_equal */
-    CUT_ASSERT_INT_EQUAL(0, 0, 0);
-    /* To avoid warning of not using cut_str_equal */
-    CUT_ASSERT_STR_EQUAL("", "", 0);
-
-    axutil_linked_list_free(linked_list,env);
-}
-
-int main()
-{
-    axutil_env_t *env = cut_setup_env("Link list");
-	CUT_ASSERT(env != NULL);
-	if (env) {
-        test_link_list(env,"first entry","secnd entry","third entry","last entry" ,"test");
-        axutil_env_free(env);
-    }
-    CUT_RETURN_ON_FAILURE(-1);
-    return 0;
-}
-
-
-
-
-
-
-
diff --git a/util/test/link_list/link_list_test.cc b/util/test/link_list/link_list_test.cc
new file mode 100644
index 0000000..e415410
--- /dev/null
+++ b/util/test/link_list/link_list_test.cc
@@ -0,0 +1,114 @@
+/*
+* 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 <axutil_linked_list.h>
+#include "../util/create_env.h"
+
+
+class TestLinkedList: public ::testing::Test
+{
+
+    protected:
+        void SetUp()
+        {
+
+            m_allocator = axutil_allocator_init(NULL);
+            m_axis_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_axis_log);
+
+        }
+
+        void TearDown()
+        {
+            axutil_env_free(m_env);
+        }
+
+
+        axutil_allocator_t *m_allocator = NULL;
+        axutil_env_t *m_env = NULL;
+        axutil_error_t *m_error = NULL;
+        axutil_log_t *m_axis_log = NULL;
+
+};
+
+
+TEST_F(TestLinkedList, test_link_list)
+{
+    char *first_item = "first entry";
+    char *second_item = "secnd entry";
+    char *third_item = "third entry";
+    char *last_item = "last entry";
+    char *array = "test";
+
+    axutil_linked_list_t * linked_list = NULL;
+    int index_of_item;
+	int index_of_last_item;
+	entry_t * entry;
+	void *get_item;
+	axis2_status_t status;
+	axis2_bool_t bresult;
+	void **array_from_list;
+
+	linked_list = axutil_linked_list_create(m_env);
+    ASSERT_NE(linked_list, nullptr);
+    status = axutil_linked_list_add_first(linked_list,m_env,(void *)first_item);
+    ASSERT_EQ(status, AXIS2_SUCCESS);
+    bresult = axutil_linked_list_contains(linked_list,m_env,(void *)second_item);
+	ASSERT_EQ(bresult, AXIS2_FALSE);
+    status = axutil_linked_list_add(linked_list,m_env,(void *)third_item);
+    ASSERT_EQ(status, AXIS2_SUCCESS);
+    status = axutil_linked_list_add_last(linked_list,m_env,(void *)last_item);
+    ASSERT_EQ(status, AXIS2_SUCCESS);
+ 	ASSERT_EQ(axutil_linked_list_size(linked_list,m_env), 3);
+    index_of_item = axutil_linked_list_index_of(linked_list,m_env,third_item);
+    ASSERT_EQ(index_of_item, 1);
+    index_of_last_item = axutil_linked_list_last_index_of(linked_list,m_env,last_item);
+    ASSERT_EQ(index_of_last_item, 2);
+    entry = axutil_linked_list_get_entry(linked_list,m_env,0);
+    ASSERT_NE(entry, nullptr);
+    get_item = axutil_linked_list_get(linked_list,m_env,1);
+    ASSERT_NE(get_item, nullptr);
+	ASSERT_EQ(strcmp((char*)get_item, third_item), 0);
+    get_item = axutil_linked_list_set(linked_list,m_env,1,(void *)array);
+    ASSERT_NE(get_item, nullptr);
+	ASSERT_EQ(strcmp((char*)get_item, third_item), 0);
+    array_from_list = axutil_linked_list_to_array(linked_list,m_env);
+	ASSERT_NE(array_from_list, nullptr);
+    status = axutil_linked_list_add_at_index(linked_list,m_env,1,(void *)second_item);
+    ASSERT_EQ(status, AXIS2_SUCCESS);
+    get_item = axutil_linked_list_remove_at_index(linked_list,m_env,1);
+	ASSERT_NE(get_item, nullptr);
+    bresult = axutil_linked_list_check_bounds_inclusive(linked_list,m_env,1);
+	ASSERT_EQ(bresult, AXIS2_TRUE);
+    status = axutil_linked_list_remove_entry(linked_list,m_env,entry);
+    ASSERT_EQ(status, AXIS2_SUCCESS);
+    get_item = axutil_linked_list_remove_first(linked_list,m_env);
+	ASSERT_NE(get_item, nullptr);
+    get_item = axutil_linked_list_remove_last(linked_list,m_env);
+	ASSERT_NE(get_item, nullptr);
+	ASSERT_EQ(axutil_linked_list_size(linked_list,m_env), 0);
+
+    bresult = axutil_linked_list_remove(linked_list,m_env,(void *)third_item);
+ 	ASSERT_EQ(bresult, AXIS2_FALSE);
+
+    axutil_linked_list_free(linked_list,m_env);
+}
+
diff --git a/util/test/properties/Makefile.am b/util/test/properties/Makefile.am
index 6304468..0d91018 100644
--- a/util/test/properties/Makefile.am
+++ b/util/test/properties/Makefile.am
@@ -4,25 +4,26 @@
 # 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.
 TESTS = property_test
-check_PROGRAMS = property_test 
-noinst_PROGRAMS = property_test 
-property_test_SOURCES = property_test.c ../util/create_env.c
+check_PROGRAMS = property_test
+noinst_PROGRAMS = property_test
+property_test_SOURCES = property_test.cc
 
 property_test_LDADD   =   \
-                    $(top_builddir)/src/libaxutil.la 
+					$(top_builddir)/src/libaxutil.la \
+					$(top_builddir)/$(GTEST)/libgtest.a \
+					$(top_builddir)/$(GTEST)/libgtest_main.a
 
-INCLUDES = -I$(top_builddir)/include \
+AM_CPPFLAGS = -I$(top_builddir)/include \
 			-I ../../../axiom/include \
 			-I ../../../include \
-		 	-I ../../../cutest/include
-
+			-I $(GTEST_DIR)/include
 
diff --git a/util/test/properties/property_test.c b/util/test/properties/property_test.c
deleted file mode 100644
index 639f32c..0000000
--- a/util/test/properties/property_test.c
+++ /dev/null
@@ -1,150 +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 <axutil_env.h>
-#include "../util/create_env.h"
-#include <axutil_string.h>
-#include <axutil_properties.h>
-
-void printProperties(axutil_properties_t * properties, axutil_env_t *env)
-{
-    axutil_hash_t* all_properties = NULL;
-    all_properties = axutil_properties_get_all(properties,env);
-    if(all_properties)
-    {
-       axutil_hash_index_t *hi = NULL;
-       axis2_char_t *key = NULL;
-       axis2_char_t *value = NULL;
-       for(hi = axutil_hash_first(all_properties, env); hi; hi = axutil_hash_next(env, hi))
-        {
-          axutil_hash_this(hi, (void *)&key, NULL, (void *)&value);
-            if(key)
-            {
-                if(!value)
-                {
-                    value = axutil_strdup(env, "");
-                }
-                printf("%s=%s\n", key, value);
-            }
-        }
-    }
-}
-/** @brief test properties
-  * read file and give the output
-  */
-axis2_status_t test_properties(axutil_env_t *env)
-{ 
-    axutil_hash_t* all_properties = NULL;
-    axis2_status_t status = AXIS2_FAILURE;
-    axis2_char_t* input_filename = "test.doc";
-    axutil_properties_t * properties = NULL;
-    axis2_status_t  store_properties ;
-    axis2_status_t  load_properties ;
-    axis2_char_t * key = "key";
-    axis2_char_t * value = "value";
-    FILE *input = fopen("input.doc","rb");
-    FILE *output = fopen("output.doc","wb");
-	
-    if (!input)
-    {
-        printf("Can't open input.doc\n");
-        return AXIS2_FAILURE;
-    }
-    if (!output)
-    {
-        printf("Can't open output.doc\n");
-        return AXIS2_FAILURE;
-    }
-
-    properties = axutil_properties_create(env);
-    if(!properties)
-    {
-        printf("Properties are not created\n");
-        axutil_properties_free(properties,env);
-        return AXIS2_FAILURE;
-    }
-    else
-    printf("The the axutil_properties_create is successfull\n");
-    status = axutil_properties_set_property(properties,env, key, value);
-    if (status == AXIS2_SUCCESS)
-        printf("The test axutil_properties_set_property is successful\n");
-    else
-        printf("The test axutil_properties_set_property failed\n") ;
-		
-    printProperties(properties, env);
-	store_properties = AXIS2_SUCCESS;
-/* Not used, program aborts on Windows with MSVC (Visual Studio 2008 Express Edition)
-	store_properties = axutil_properties_store(properties,env,output);
-    if(!store_properties)
-    {
-        printf("Can not store the properties\n");
-        axutil_properties_free(properties,env);
-        return AXIS2_FAILURE;
-    }
-    else 
-    printf("The test axutil_properties_store is successfull\n");
-*/    
-    load_properties = axutil_properties_load(properties,env,input_filename);   
-    if(!load_properties)
-    {
-        printf("Properties can't be loaded\n");
-        axutil_properties_free(properties,env);
-        return AXIS2_FAILURE;
-    }
-    else 
-    printf("The test axutil_properties_load is successfull\n");
-    printProperties(properties, env);
-
-    all_properties = axutil_properties_get_all(properties,env);
-    if(!all_properties)
-    {
-        printf("Can't call properties_get_all\n");
-        axutil_properties_free(properties,env);
-        return AXIS2_FAILURE;
-    }
-    else
-    printf("The test axutil_properties_get_all is successfull\n");
-    
-    axutil_properties_free(properties,env);   
- 
-    return AXIS2_SUCCESS;
-}
-
-int main()
-{
-    axutil_env_t *env = NULL;
-    int status = AXIS2_SUCCESS;
-    env = create_environment();
-    status = test_properties(env);
-    
-    if(status == AXIS2_FAILURE)
-    {
-        printf(" The test is failed\n");
-    }
-    
-    axutil_env_free(env);
-    return 0;
-}
-
-
-
-
-
-
-
-
-
diff --git a/util/test/properties/property_test.cc b/util/test/properties/property_test.cc
new file mode 100644
index 0000000..3845e57
--- /dev/null
+++ b/util/test/properties/property_test.cc
@@ -0,0 +1,128 @@
+/*
+* 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 <axutil_env.h>
+#include "../util/create_env.h"
+#include <axutil_string.h>
+#include <axutil_properties.h>
+
+void printProperties(axutil_properties_t * properties, axutil_env_t *env)
+{
+    axutil_hash_t* all_properties = NULL;
+    all_properties = axutil_properties_get_all(properties,env);
+    if(all_properties)
+    {
+       axutil_hash_index_t *hi = NULL;
+       axis2_char_t *key = NULL;
+       axis2_char_t *value = NULL;
+       for(hi = axutil_hash_first(all_properties, env); hi; hi = axutil_hash_next(env, hi))
+        {
+          axutil_hash_this(hi, (const void **)&key, NULL, (void **)&value);
+            if(key)
+            {
+                if(!value)
+                {
+                    value = (axis2_char_t *) axutil_strdup(env, "");
+                }
+                printf("%s=%s\n", key, value);
+            }
+        }
+    }
+}
+
+class TestProperties: public ::testing::Test
+{
+
+    protected:
+        void SetUp()
+        {
+
+            m_allocator = axutil_allocator_init(NULL);
+            m_axis_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_axis_log);
+
+        }
+
+        void TearDown()
+        {
+            axutil_env_free(m_env);
+        }
+
+
+        axutil_allocator_t *m_allocator = NULL;
+        axutil_env_t *m_env = NULL;
+        axutil_error_t *m_error = NULL;
+        axutil_log_t *m_axis_log = NULL;
+
+};
+
+
+/** @brief test properties
+  * read file and give the output
+  */
+TEST_F(TestProperties, test_properties)
+{
+    axutil_hash_t* all_properties = NULL;
+    axis2_status_t status = AXIS2_FAILURE;
+    axis2_char_t* input_filename = "test.doc";
+    axutil_properties_t * properties = NULL;
+    axis2_status_t  store_properties ;
+    axis2_status_t  load_properties ;
+    axis2_char_t * key = "key";
+    axis2_char_t * value = "value";
+    FILE *input = fopen("input.doc","rb");
+    FILE *output = fopen("output.doc","wb");
+
+    ASSERT_NE(input, nullptr);
+    ASSERT_NE(output, nullptr);
+
+    properties = axutil_properties_create(m_env);
+    ASSERT_NE(properties, nullptr);
+
+    status = axutil_properties_set_property(properties,m_env, key, value);
+    ASSERT_EQ(status, AXIS2_SUCCESS);
+
+    printProperties(properties, m_env);
+
+	store_properties = AXIS2_SUCCESS;
+/* Not used, program aborts on Windows with MSVC (Visual Studio 2008 Express Edition)
+	store_properties = axutil_properties_store(properties,env,output);
+    if(!store_properties)
+    {
+        printf("Can not store the properties\n");
+        axutil_properties_free(properties,env);
+        return AXIS2_FAILURE;
+    }
+    else 
+    printf("The test axutil_properties_store is successfull\n");
+*/
+    load_properties = axutil_properties_load(properties,m_env,input_filename);   
+    ASSERT_NE(load_properties, 0);
+
+    printProperties(properties, m_env);
+
+    all_properties = axutil_properties_get_all(properties,m_env);
+    ASSERT_NE(all_properties, nullptr);
+
+    axutil_properties_free(properties,m_env);
+
+}
+
diff --git a/util/test/rand/Makefile.am b/util/test/rand/Makefile.am
index f5c527e..61913e1 100644
--- a/util/test/rand/Makefile.am
+++ b/util/test/rand/Makefile.am
@@ -4,9 +4,9 @@
 # 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.
@@ -15,15 +15,16 @@
 TESTS = rand_test
 check_PROGRAMS = rand_test
 noinst_PROGRAMS = rand_test
-rand_test_SOURCES = rand_test.c ../util/create_env.c
+rand_test_SOURCES = rand_test.cc
 
 rand_test_LDADD   =   \
-                    $(top_builddir)/src/libaxutil.la 
+				$(top_builddir)/src/libaxutil.la \
+				$(top_builddir)/$(GTEST)/libgtest.a \
+				$(top_builddir)/$(GTEST)/libgtest_main.a
 
-INCLUDES = -I$(top_builddir)/include \
-			-I$(CUTEST_HOME)/include \
+AM_CPPFLAGS = -I$(top_builddir)/include \
 			-I ../../../axiom/include \
 			-I ../../../include \
-		 	-I ../../../test/cutest/include
+			-I $(GTEST_DIR)/include
 
 
diff --git a/util/test/rand/rand_test.c b/util/test/rand/rand_test.c
deleted file mode 100644
index e94a74a..0000000
--- a/util/test/rand/rand_test.c
+++ /dev/null
@@ -1,61 +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 "../util/create_env.h"
-#include <axutil_rand.h>
-#include <cut_defs.h>
-
-/** @brief test_rand 
- *   create random variable and get it's value 
- */
-
-void test_rand(axutil_env_t *env)
-{    
-    int rand_number,rand_value,start = 2,end = 8,rand_range;
-    unsigned seed = 10;
-    
-    rand_number = axutil_rand(&seed);
-    printf("rand_number : %d\n", rand_number);    
-    rand_range = axutil_rand_with_range(&seed,start,end);
-    printf("rand_range : %d\n", rand_range);    
-    CUT_ASSERT(rand_range != -1);
-    CUT_ASSERT(rand_range >= start && rand_range <= end);
-    rand_value = axutil_rand_get_seed_value_based_on_time(env);
-    printf("rand_based_on_time : %d\n", rand_value);    
-    
-    /* To avoid warning of not using cut_ptr_equal */
-    CUT_ASSERT_PTR_EQUAL(NULL, NULL, 0);
-    /* To avoid warning of not using cut_int_equal */
-    CUT_ASSERT_INT_EQUAL(0, 0, 0);
-    /* To avoid warning of not using cut_str_equal */
-    CUT_ASSERT_STR_EQUAL("", "", 0);
-
-}
-
-int main()
-{
-    axutil_env_t *env = cut_setup_env("Rand");
-	CUT_ASSERT(env != NULL);
-	if (env) {
-        test_rand(env);
-        axutil_env_free(env);
-    }
-    CUT_RETURN_ON_FAILURE(-1);
-    return 0;
-}
-
-
diff --git a/util/test/rand/rand_test.cc b/util/test/rand/rand_test.cc
new file mode 100644
index 0000000..fcbcf90
--- /dev/null
+++ b/util/test/rand/rand_test.cc
@@ -0,0 +1,73 @@
+/*
+* 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 "../util/create_env.h"
+#include <axutil_rand.h>
+
+class TestRand: public ::testing::Test
+{
+
+    protected:
+        void SetUp()
+        {
+
+            m_allocator = axutil_allocator_init(NULL);
+            m_axis_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_axis_log);
+
+        }
+
+        void TearDown()
+        {
+            axutil_env_free(m_env);
+        }
+
+
+        axutil_allocator_t *m_allocator = NULL;
+        axutil_env_t *m_env = NULL;
+        axutil_error_t *m_error = NULL;
+        axutil_log_t *m_axis_log = NULL;
+
+};
+
+
+/** @brief test_rand
+ *   create random variable and get it's value
+ */
+
+TEST_F(TestRand, test_rand)
+{
+
+    int rand_number,rand_value,start = 2,end = 8,rand_range;
+    unsigned seed = 10;
+
+    rand_number = axutil_rand(&seed);
+    printf("rand_number : %d\n", rand_number);
+    rand_range = axutil_rand_with_range(&seed,start,end);
+    printf("rand_range : %d\n", rand_range);
+    ASSERT_NE(rand_range, -1);
+    ASSERT_GE(rand_range, start);
+    ASSERT_LE(rand_range, end);
+    rand_value = axutil_rand_get_seed_value_based_on_time(m_env);
+    printf("rand_based_on_time : %d\n", rand_value);
+
+
+}
diff --git a/util/test/stack/Makefile.am b/util/test/stack/Makefile.am
index ed1b08f..62268b2 100644
--- a/util/test/stack/Makefile.am
+++ b/util/test/stack/Makefile.am
@@ -4,26 +4,27 @@
 # 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.
 TESTS = stack_test
-check_PROGRAMS = stack_test 
-noinst_PROGRAMS = stack_test 
-stack_test_SOURCES = stack_test.c ../util/create_env.c
+check_PROGRAMS = stack_test
+noinst_PROGRAMS = stack_test
+stack_test_SOURCES = stack_test.cc
 
 stack_test_LDADD   =   \
-                    $(top_builddir)/src/libaxutil.la 
+				$(top_builddir)/src/libaxutil.la  \
+				$(top_builddir)/$(GTEST)/libgtest.a \
+				$(top_builddir)/$(GTEST)/libgtest_main.a
 
-INCLUDES = -I$(top_builddir)/include \
-			-I$(CUTEST_HOME)/include \
+AM_CPPFLAGS = -I$(top_builddir)/include \
 			-I ../../../axiom/include \
 			-I ../../../include \
-		 	-I ../../../test/cutest/include
+			-I $(GTEST_DIR)/include
 
 
diff --git a/util/test/stack/stack_test.c b/util/test/stack/stack_test.c
deleted file mode 100644
index 09e8d41..0000000
--- a/util/test/stack/stack_test.c
+++ /dev/null
@@ -1,64 +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 "../util/create_env.h"
-#include <cut_defs.h>
-#include <axutil_stack.h>
-
-void test_stack(axutil_env_t * env, char * value)
-{
-    axutil_stack_t * stack = NULL;
-    axis2_status_t status = AXIS2_FAILURE;
-    void * get_value = NULL;
-	
-    stack = axutil_stack_create(env);
-	CUT_ASSERT(stack != NULL);
-    if (!stack)
-    {
-        return;
-    }
-    status = axutil_stack_push(stack,env,(void *)value);
-    CUT_ASSERT(status == AXIS2_SUCCESS);
-    CUT_ASSERT(axutil_stack_size(stack,env) == 1);
-    CUT_ASSERT(value == (char *)axutil_stack_get(stack,env));
-    get_value = axutil_stack_get_at(stack,env,0);
-    CUT_ASSERT(strcmp(value,get_value) == 0);
-    CUT_ASSERT(strcmp(value,(char *)axutil_stack_pop(stack,env)) == 0);
-    CUT_ASSERT(axutil_stack_size(stack,env) == 0);
-    
-    /* To avoid warning of not using cut_ptr_equal */
-    CUT_ASSERT_PTR_EQUAL(NULL, NULL, 0);
-    /* To avoid warning of not using cut_int_equal */
-    CUT_ASSERT_INT_EQUAL(0, 0, 0);
-    /* To avoid warning of not using cut_str_equal */
-    CUT_ASSERT_STR_EQUAL("", "", 0);
-
-    axutil_stack_free(stack,env);
-}
-int main()
-{
-    char value[10] = "test\n";
-    axutil_env_t *env = cut_setup_env("Stack");
-	CUT_ASSERT(env != NULL);
-	if (env) {
-        test_stack(env,value);
-        axutil_env_free(env);
-    }
-    CUT_RETURN_ON_FAILURE(-1);
-    return 0;
-}
-
diff --git a/util/test/stack/stack_test.cc b/util/test/stack/stack_test.cc
new file mode 100644
index 0000000..673458c
--- /dev/null
+++ b/util/test/stack/stack_test.cc
@@ -0,0 +1,71 @@
+/*
+* 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 "../util/create_env.h"
+#include <axutil_stack.h>
+
+class TestStack: public ::testing::Test
+{
+
+    protected:
+        void SetUp()
+        {
+
+            m_allocator = axutil_allocator_init(NULL);
+            m_axis_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_axis_log);
+
+        }
+
+        void TearDown()
+        {
+            axutil_env_free(m_env);
+        }
+
+
+        axutil_allocator_t *m_allocator = NULL;
+        axutil_env_t *m_env = NULL;
+        axutil_error_t *m_error = NULL;
+        axutil_log_t *m_axis_log = NULL;
+
+};
+
+TEST_F(TestStack, test_om_build)
+{
+    axutil_stack_t * stack = NULL;
+    axis2_status_t status = AXIS2_FAILURE;
+    void * get_value = NULL;
+    char value[10] = "test\n";
+
+    stack = axutil_stack_create(m_env);
+    ASSERT_NE(stack, nullptr);
+    status = axutil_stack_push(stack,m_env,(void *)value);
+    ASSERT_EQ(status, AXIS2_SUCCESS);
+    ASSERT_EQ(axutil_stack_size(stack,m_env), 1);
+    ASSERT_EQ(value, (char *)axutil_stack_get(stack,m_env));
+    get_value = axutil_stack_get_at(stack,m_env,0);
+    ASSERT_STREQ(value,(const char *)get_value);
+    ASSERT_STREQ(value,(char *)axutil_stack_pop(stack,m_env));
+    ASSERT_EQ(axutil_stack_size(stack,m_env), 0);
+
+    axutil_stack_free(stack,m_env);
+}
+
diff --git a/util/test/string_util/Makefile.am b/util/test/string_util/Makefile.am
index 6910171..c380073 100644
--- a/util/test/string_util/Makefile.am
+++ b/util/test/string_util/Makefile.am
@@ -4,26 +4,27 @@
 # 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.
 TESTS = string_util_test
-noinst_PROGRAMS = string_util_test 
-check_PROGRAMS = string_util_test 
-string_util_test_SOURCES = string_util_test.c ../util/create_env.c
+noinst_PROGRAMS = string_util_test
+check_PROGRAMS = string_util_test
+string_util_test_SOURCES = string_util_test.cc
 
 string_util_test_LDADD   =   \
-                    $(top_builddir)/src/libaxutil.la 
+				$(top_builddir)/src/libaxutil.la \
+				$(top_builddir)/$(GTEST)/libgtest.a \
+				$(top_builddir)/$(GTEST)/libgtest_main.a
 
-INCLUDES = -I$(top_builddir)/include \
-			-I$(CUTEST_HOME)/include \
+AM_CPPFLAGS = -I$(top_builddir)/include \
 			-I ../../../axiom/include \
 			-I ../../../include \
-		 	-I ../../../test/cutest/include
+			-I $(GTEST_DIR)/include
 
 
diff --git a/util/test/string_util/string_util_test.c b/util/test/string_util/string_util_test.c
deleted file mode 100644
index 2006971..0000000
--- a/util/test/string_util/string_util_test.c
+++ /dev/null
@@ -1,83 +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 <string.h>   
-#include "../util/create_env.h"
-#include <axutil_string_util.h>
-#include <axutil_array_list.h>
-#include <cut_defs.h>
-
-/** @brief test string 
- *  tokenize a string  
- */
-
-void test_string(axutil_env_t *env)
-{   
-    int delim = ' ';
-    void *token = NULL;
-    void *last_token_string = NULL;
-    void *first_token_string = NULL;
-    axutil_array_list_t * first_token, * last_token;
-    axis2_char_t * in =  "this is a test string";
-    
-    axutil_array_list_t * tokenize = axutil_tokenize(env, in, delim);
-	CUT_ASSERT(tokenize != NULL);
-    if(!tokenize) return;
-    token  = axutil_array_list_get(tokenize,env,4);
-	CUT_ASSERT(token != NULL);
- 	CUT_ASSERT(strcmp(token, "string") == 0);
-
-    first_token = axutil_first_token(env,in,delim);
-	CUT_ASSERT(first_token != NULL);
-    if(first_token)
-    {
-        first_token_string = axutil_array_list_get(first_token,env,1);
-		CUT_ASSERT(first_token_string != NULL);
- 	    CUT_ASSERT(strcmp(first_token_string, "is a test string") == 0);
-    }
-    
-    last_token = axutil_last_token(env,in,delim);
- 	CUT_ASSERT(last_token != NULL);
-    if(last_token)
-    {
-        last_token_string = axutil_array_list_get(last_token,env,1);
- 		CUT_ASSERT(last_token_string != NULL);
- 	    CUT_ASSERT(strcmp(last_token_string, "string") == 0);
-    }
-    
-    /* To avoid warning of not using cut_ptr_equal */
-    CUT_ASSERT_PTR_EQUAL(NULL, NULL, 0);
-    /* To avoid warning of not using cut_int_equal */
-    CUT_ASSERT_INT_EQUAL(0, 0, 0);
-    /* To avoid warning of not using cut_str_equal */
-    CUT_ASSERT_STR_EQUAL("", "", 0);
-
-}
-int main()
-{
-    axutil_env_t *env = cut_setup_env("String util");
-	CUT_ASSERT(env != NULL);
-	if (env) {
-        test_string(env);
-        axutil_env_free(env);
-    }
-    CUT_RETURN_ON_FAILURE(-1);
-    return 0;
-}
-
-
-
diff --git a/util/test/string_util/string_util_test.cc b/util/test/string_util/string_util_test.cc
new file mode 100644
index 0000000..e1b5a16
--- /dev/null
+++ b/util/test/string_util/string_util_test.cc
@@ -0,0 +1,92 @@
+/*
+* 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 <string.h>   
+#include "../util/create_env.h"
+#include <axutil_string_util.h>
+#include <axutil_array_list.h>
+
+class TestString: public ::testing::Test
+{
+
+
+    protected:
+        void SetUp()
+        {
+
+            m_allocator = axutil_allocator_init(NULL);
+            m_axis_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_axis_log);
+
+        }
+
+        void TearDown()
+        {
+            axutil_env_free(m_env);
+        }
+
+
+        axutil_allocator_t *m_allocator = NULL;
+        axutil_env_t *m_env = NULL;
+        axutil_error_t *m_error = NULL;
+        axutil_log_t *m_axis_log = NULL;
+
+};
+
+
+/** @brief test string 
+ *  tokenize a string  
+ */
+
+TEST_F(TestString, test_string)
+{
+    int delim = ' ';
+    void *token = NULL;
+    void *last_token_string = NULL;
+    void *first_token_string = NULL;
+    axutil_array_list_t * first_token, * last_token;
+    axis2_char_t * in =  "this is a test string";
+
+    axutil_array_list_t * tokenize = axutil_tokenize(m_env, in, delim);
+    ASSERT_NE(tokenize, nullptr);
+    token  = axutil_array_list_get(tokenize,m_env,4);
+    ASSERT_NE(token, nullptr);
+ 	ASSERT_STREQ((const char *)token, "string");
+
+    first_token = axutil_first_token(m_env,in,delim);
+    ASSERT_NE(first_token, nullptr);
+    if(first_token)
+    {
+        first_token_string = axutil_array_list_get(first_token,m_env,1);
+        ASSERT_NE(first_token_string, nullptr);
+ 	    ASSERT_STREQ((const char *)first_token_string, "is a test string");
+    }
+
+    last_token = axutil_last_token(m_env,in,delim);
+ 	ASSERT_NE(last_token, nullptr);
+    if(last_token)
+    {
+        last_token_string = axutil_array_list_get(last_token,m_env,1);
+ 		ASSERT_NE(last_token_string, nullptr);
+ 	    ASSERT_STREQ((const char *)last_token_string, "string");
+    }
+
+}
diff --git a/util/test/uri/Makefile.am b/util/test/uri/Makefile.am
index dfac9a8..00dd8b0 100644
--- a/util/test/uri/Makefile.am
+++ b/util/test/uri/Makefile.am
@@ -4,26 +4,27 @@
 # 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.
 TESTS = uri_test
-check_PROGRAMS = uri_test 
-noinst_PROGRAMS = uri_test 
-uri_test_SOURCES = uri_test.c ../util/create_env.c
+check_PROGRAMS = uri_test
+noinst_PROGRAMS = uri_test
+uri_test_SOURCES = uri_test.cc
 
 uri_test_LDADD   =   \
-                    $(top_builddir)/src/libaxutil.la 
+				$(top_builddir)/src/libaxutil.la \
+				$(top_builddir)/$(GTEST)/libgtest.a \
+				$(top_builddir)/$(GTEST)/libgtest_main.a
 
-INCLUDES = -I$(top_builddir)/include \
-			-I$(CUTEST_HOME)/include \
+AM_CPPFLAGS = -I$(top_builddir)/include \
 			-I ../../../axiom/include \
 			-I ../../../include \
-		 	-I ../../../test/cutest/include
+			-I $(GTEST_DIR)/include
 
 
diff --git a/util/test/uri/uri_test.c b/util/test/uri/uri_test.c
deleted file mode 100644
index 1449cd3..0000000
--- a/util/test/uri/uri_test.c
+++ /dev/null
@@ -1,98 +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 <axutil_uri.h>
-#include <cut_defs.h>
-#include "../util/create_env.h"
-/** @brief test uri 
- *  * create URI and get the values of it's components  
- *   */
-void test_uri(axutil_env_t *env)
-{   
-    axis2_char_t * uri_str = "http://user:pass@example.com:80/foo?bar#item5";
-    axis2_char_t * host = "home.netscape.com:443";
-    axis2_char_t * uri_str_base = "http://user:pass@example.com:80/foo?bar";
-    axis2_char_t * scheme_str = "http";
-    axutil_uri_t * base = NULL;
-    axutil_uri_t * hostinfo = NULL;
-    axutil_uri_t * uri = NULL;
-    axutil_uri_t * clone = NULL;
-    axutil_uri_t * rel = NULL;
-    axis2_port_t scheme_port;
-    axis2_port_t port;
-	axis2_char_t * str;
-
-    hostinfo = axutil_uri_parse_hostinfo(env,host);
-    CUT_ASSERT_PTR_NOT_EQUAL(hostinfo, NULL, 0);
-    
-    scheme_port = axutil_uri_port_of_scheme(scheme_str); 
-    CUT_ASSERT_INT_NOT_EQUAL(scheme_port, 0, 0);
-    
-    uri = axutil_uri_parse_string(env,uri_str);    
-    CUT_ASSERT_PTR_NOT_EQUAL(uri, NULL, 0);
-    str = axutil_uri_get_protocol(uri,env);
-	CUT_ASSERT_STR_EQUAL(str, "http", 0);
-    port = axutil_uri_get_port(uri,env);
-    CUT_ASSERT_INT_EQUAL(port, 80, 0);
-    str = axutil_uri_get_path(uri,env);
-	CUT_ASSERT_STR_EQUAL(str, "/foo", 0);
-    str = axutil_uri_get_host(uri,env);
-	CUT_ASSERT_STR_EQUAL(str, "example.com", 0);
-
-    base = axutil_uri_parse_string(env,uri_str_base);
-    CUT_ASSERT_PTR_NOT_EQUAL(base, NULL, 0);
-	if (base)
-    {
-        str = axutil_uri_to_string(base,env,0);
-		CUT_ASSERT_STR_EQUAL(str, "http://user:XXXXXXXX@example.com/foo?bar", 0);
-    }
-
-    clone = axutil_uri_clone(uri,env);
-    CUT_ASSERT_PTR_NOT_EQUAL(clone, NULL, 0);
-	if (clone)
-    {
-        str = axutil_uri_to_string(clone,env,0);
-		CUT_ASSERT_STR_EQUAL(str, "http://user:XXXXXXXX@example.com/foo?bar#item5", 0);
-        axutil_uri_free(clone,env);
-   }
-    
-    rel = axutil_uri_resolve_relative(env,base,uri);
-    CUT_ASSERT_PTR_NOT_EQUAL(rel, NULL, 0);
-	if (rel)
-    {
-        str = axutil_uri_to_string(rel,env,0);
-		CUT_ASSERT_STR_EQUAL(str, "http://user:XXXXXXXX@example.com/foo?bar#item5", 0);
-    }
-    
-    axutil_uri_free(uri,env);
-}
-
-int main()
-{   
-    axutil_env_t *env = cut_setup_env("Uri");
-	CUT_ASSERT(env != NULL);
-	if (env) {
-        test_uri(env);
-        axutil_env_free(env);
-    }
-    CUT_RETURN_ON_FAILURE(-1);
-    return 0;
-}
-
-
-
-
diff --git a/util/test/uri/uri_test.cc b/util/test/uri/uri_test.cc
new file mode 100644
index 0000000..1204feb
--- /dev/null
+++ b/util/test/uri/uri_test.cc
@@ -0,0 +1,112 @@
+/*
+* 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 <axutil_uri.h>
+#include "../util/create_env.h"
+
+class TestURI: public ::testing::Test
+{
+
+    protected:
+        void SetUp()
+        {
+
+            m_allocator = axutil_allocator_init(NULL);
+            m_axis_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_axis_log);
+
+        }
+
+        void TearDown()
+        {
+            axutil_env_free(m_env);
+        }
+
+
+        axutil_allocator_t *m_allocator = NULL;
+        axutil_env_t *m_env = NULL;
+        axutil_error_t *m_error = NULL;
+        axutil_log_t *m_axis_log = NULL;
+
+};
+
+/** @brief test uri 
+ *  * create URI and get the values of it's components  
+ *   */
+TEST_F(TestURI, test_uri)
+{
+    axis2_char_t * uri_str = "http://user:pass@example.com:80/foo?bar#item5";
+    axis2_char_t * host = "home.netscape.com:443";
+    axis2_char_t * uri_str_base = "http://user:pass@example.com:80/foo?bar";
+    axis2_char_t * scheme_str = "http";
+    axutil_uri_t * base = NULL;
+    axutil_uri_t * hostinfo = NULL;
+    axutil_uri_t * uri = NULL;
+    axutil_uri_t * clone = NULL;
+    axutil_uri_t * rel = NULL;
+    axis2_port_t scheme_port;
+    axis2_port_t port;
+	axis2_char_t * str;
+
+    hostinfo = axutil_uri_parse_hostinfo(m_env,host);
+    ASSERT_NE(hostinfo, nullptr);
+
+    scheme_port = axutil_uri_port_of_scheme(scheme_str); 
+    ASSERT_NE(scheme_port, 0);
+
+    uri = axutil_uri_parse_string(m_env,uri_str);    
+    ASSERT_NE(uri, nullptr);
+    str = axutil_uri_get_protocol(uri,m_env);
+    ASSERT_STREQ(str, "http");
+    port = axutil_uri_get_port(uri,m_env);
+    ASSERT_EQ(port, 80);
+    str = axutil_uri_get_path(uri,m_env);
+    ASSERT_STREQ(str, "/foo");
+    str = axutil_uri_get_host(uri,m_env);
+    ASSERT_STREQ(str, "example.com");
+
+    base = axutil_uri_parse_string(m_env,uri_str_base);
+    ASSERT_NE(base, nullptr);
+	if (base)
+    {
+        str = axutil_uri_to_string(base,m_env,0);
+        ASSERT_STREQ(str, "http://user:XXXXXXXX@example.com/foo?bar");
+    }
+
+    clone = axutil_uri_clone(uri,m_env);
+    ASSERT_NE(clone, nullptr);
+	if (clone)
+    {
+        str = axutil_uri_to_string(clone,m_env,0);
+        ASSERT_STREQ(str, "http://user:XXXXXXXX@example.com/foo?bar#item5");
+        axutil_uri_free(clone,m_env);
+   }
+
+    rel = axutil_uri_resolve_relative(m_env,base,uri);
+    ASSERT_NE(rel, nullptr);
+	if (rel)
+    {
+        str = axutil_uri_to_string(rel,m_env,0);
+        ASSERT_STREQ(str, "http://user:XXXXXXXX@example.com/foo?bar#item5");
+    }
+
+    axutil_uri_free(uri,m_env);
+}
diff --git a/util/test/url/Makefile.am b/util/test/url/Makefile.am
index c5f6c70..d2e37bd 100644
--- a/util/test/url/Makefile.am
+++ b/util/test/url/Makefile.am
@@ -4,26 +4,27 @@
 # 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.
 TESTS = url_test
-noinst_PROGRAMS = url_test 
-check_PROGRAMS = url_test 
-url_test_SOURCES = url_test.c ../util/create_env.c
+noinst_PROGRAMS = url_test
+check_PROGRAMS = url_test
+url_test_SOURCES = url_test.cc
 
 url_test_LDADD   =   \
-                    $(top_builddir)/src/libaxutil.la 
+				$(top_builddir)/src/libaxutil.la \
+				$(top_builddir)/$(GTEST)/libgtest.a \
+				$(top_builddir)/$(GTEST)/libgtest_main.a
 
-INCLUDES = -I$(top_builddir)/include \
-			-I$(CUTEST_HOME)/include \
+AM_CPPFLAGS = -I$(top_builddir)/include \
 			-I ../../../axiom/include \
 			-I ../../../include \
-		 	-I ../../../test/cutest/include
+			-I $(GTEST_DIR)/include
 
 
diff --git a/util/test/url/url_test.c b/util/test/url/url_test.c
deleted file mode 100644
index 0c47a16..0000000
--- a/util/test/url/url_test.c
+++ /dev/null
@@ -1,80 +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 <axutil_url.h>
-#include <cut_defs.h>
-#include "../util/create_env.h"
-
-/** @brief test url 
- * create URL and get the values of it's components  
- */
-
-void test_url(axutil_env_t *env)
-{
-    axutil_url_t * url;
-    axis2_char_t *url_str = "https://issues.apache.org/jira/secure/ManageAttachments.jspa?id=12386356";
-    axis2_char_t *set_server = "www.yahoo.com";
-    axis2_char_t *set_protocol = "file";
-    axis2_char_t *set_path = "/bar/";
-    axis2_port_t set_port = 80;
-    axis2_char_t *get_protocol;
-    axis2_char_t *get_server;
-    axis2_port_t get_port;
-    axis2_char_t *get_path;
-    axis2_status_t status;
-
-    url = axutil_url_parse_string(env,url_str);
-    CUT_ASSERT_PTR_NOT_EQUAL(url, NULL, 1);
-
-    status = axutil_url_set_protocol(url,env,set_protocol);   
-    CUT_ASSERT_INT_EQUAL(status, AXIS2_SUCCESS, 0);
-    status = axutil_url_set_server(url,env,set_server);    
-    CUT_ASSERT_INT_EQUAL(status, AXIS2_SUCCESS, 0);
-    status = axutil_url_set_port(url,env,set_port);    
-    CUT_ASSERT_INT_EQUAL(status, AXIS2_SUCCESS, 0);
-	status = axutil_url_set_path(url,env,set_path);   
-    CUT_ASSERT_INT_EQUAL(status, AXIS2_SUCCESS, 0);
-  
-    get_protocol = axutil_url_get_protocol(url,env);
- 	CUT_ASSERT_STR_EQUAL(get_protocol, set_protocol, 0);
-
-    get_server = axutil_url_get_server(url,env);
-	CUT_ASSERT_STR_EQUAL(get_server, "www.yahoo.com:80", 0);
-    
-    get_port = axutil_url_get_port(url,env);
-    CUT_ASSERT_INT_EQUAL(get_port,set_port,0);
- 
-    get_path = axutil_url_get_path(url,env);
-	CUT_ASSERT_STR_EQUAL(get_path, set_path, 0);
-
-    axutil_url_free(url,env);
-}
-
-int main()
-{
-    axutil_env_t *env = cut_setup_env("Url");
-	CUT_ASSERT(env != NULL);
-	if (env) {
-        test_url(env);    
-        axutil_env_free(env);
-     }
-    CUT_RETURN_ON_FAILURE(-1);  
-    return 0;
-}
-
-
-
diff --git a/util/test/url/url_test.cc b/util/test/url/url_test.cc
new file mode 100644
index 0000000..6d5c4b6
--- /dev/null
+++ b/util/test/url/url_test.cc
@@ -0,0 +1,96 @@
+/*
+* 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 <axutil_url.h>
+#include "../util/create_env.h"
+
+class TestURL: public ::testing::Test
+{
+
+    protected:
+        void SetUp()
+        {
+
+            m_allocator = axutil_allocator_init(NULL);
+            m_axis_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_axis_log);
+
+        }
+
+        void TearDown()
+        {
+            axutil_env_free(m_env);
+        }
+
+
+        axutil_allocator_t *m_allocator = NULL;
+        axutil_env_t *m_env = NULL;
+        axutil_error_t *m_error = NULL;
+        axutil_log_t *m_axis_log = NULL;
+
+};
+
+
+
+/** @brief test url 
+ * create URL and get the values of it's components  
+ */
+TEST_F(TestURL, test_url)
+{
+    axutil_url_t * url;
+    axis2_char_t *url_str = "https://issues.apache.org/jira/secure/ManageAttachments.jspa?id=12386356";
+    axis2_char_t *set_server = "www.yahoo.com";
+    axis2_char_t *set_protocol = "file";
+    axis2_char_t *set_path = "/bar/";
+    axis2_port_t set_port = 80;
+    axis2_char_t *get_protocol;
+    axis2_char_t *get_server;
+    axis2_port_t get_port;
+    axis2_char_t *get_path;
+    axis2_status_t status;
+
+    url = axutil_url_parse_string(m_env,url_str);
+    ASSERT_NE(url, nullptr);
+
+    status = axutil_url_set_protocol(url,m_env,set_protocol);   
+    ASSERT_EQ(status, AXIS2_SUCCESS);
+    status = axutil_url_set_server(url,m_env,set_server);    
+    ASSERT_EQ(status, AXIS2_SUCCESS);
+    status = axutil_url_set_port(url,m_env,set_port);    
+    ASSERT_EQ(status, AXIS2_SUCCESS);
+	status = axutil_url_set_path(url,m_env,set_path);   
+    ASSERT_EQ(status, AXIS2_SUCCESS);
+
+    get_protocol = axutil_url_get_protocol(url,m_env);
+    ASSERT_STREQ(get_protocol, set_protocol);
+
+    get_server = axutil_url_get_server(url,m_env);
+    ASSERT_STREQ(get_server, "www.yahoo.com:80");
+
+    get_port = axutil_url_get_port(url,m_env);
+    ASSERT_EQ(get_port,set_port);
+
+    get_path = axutil_url_get_path(url,m_env);
+	ASSERT_STREQ(get_path, set_path);
+
+    axutil_url_free(url,m_env);
+}
+
diff --git a/util/test/util/Makefile.am b/util/test/util/Makefile.am
index 0f04995..169fc08 100644
--- a/util/test/util/Makefile.am
+++ b/util/test/util/Makefile.am
@@ -4,30 +4,43 @@
 # 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.
 TESTS = test_thread test_util
-noinst_PROGRAMS = test_util test_thread
+noinst_PROGRAMS = test_util test_thread test_md5 test_string
 noinst_HEADERS = test_log.h \
                  test_thread.h \
 		 create_env.h\
                  test_md5.h
 check_PROGRAMS = test_util test_thread
 SUBDIRS =
-test_util_SOURCES = test_util.c test_log.c test_md5.c create_env.c
-test_thread_SOURCES = test_thread.c
+test_util_SOURCES = test_util.cc test_log.cc
+test_thread_SOURCES = test_thread.cc
+test_md5_SOURCES = test_md5.cc
+test_string_SOURCES = test_string.cc
 
-test_util_LDADD   =  $(top_builddir)/src/libaxutil.la 
+test_util_LDADD   =  $(top_builddir)/src/libaxutil.la \
+				$(top_builddir)/$(GTEST)/libgtest.a \
+				$(top_builddir)/$(GTEST)/libgtest_main.a
 
-test_thread_LDADD   =  $(top_builddir)/src/libaxutil.la 
+test_thread_LDADD   =  $(top_builddir)/src/libaxutil.la  \
+				$(top_builddir)/$(GTEST)/libgtest.a \
+				$(top_builddir)/$(GTEST)/libgtest_main.a
 
-INCLUDES = -I$(top_builddir)/include \
-			 -I$(CUTEST_HOME)/include \
-		 	-I ../../../test/cutest/include
-EXTRA_DIST = test_string.c
+test_md5_LDADD   =  $(top_builddir)/src/libaxutil.la  \
+				$(top_builddir)/$(GTEST)/libgtest.a \
+				$(top_builddir)/$(GTEST)/libgtest_main.a
+
+test_string_LDADD   =  $(top_builddir)/src/libaxutil.la  \
+				$(top_builddir)/$(GTEST)/libgtest.a \
+				$(top_builddir)/$(GTEST)/libgtest_main.a
+
+AM_CPPFLAGS = -I$(top_builddir)/include \
+			-I $(GTEST_DIR)/include
+
diff --git a/util/test/util/test_log.c b/util/test/util/test_log.cc
similarity index 100%
rename from util/test/util/test_log.c
rename to util/test/util/test_log.cc
diff --git a/util/test/util/test_md5.c b/util/test/util/test_md5.cc
similarity index 62%
rename from util/test/util/test_md5.c
rename to util/test/util/test_md5.cc
index 6defd46..423d88e 100644
--- a/util/test/util/test_md5.c
+++ b/util/test/util/test_md5.cc
@@ -16,10 +16,15 @@
  * limitations under the License.
  */
 
+#include <gtest/gtest.h>
+
 #include "test_md5.h"
 #include <stdio.h>
 #include <axutil_string.h>
 #include <axutil_md5.h>
+#include <axutil_log_default.h>
+#include <axutil_log.h>
+#include <axutil_error_default.h>
 
 /* Digests a string and prints the result.
  */
@@ -41,15 +46,44 @@
   printf ("\n");
 }
 
-void test_md5(const axutil_env_t *env)
+class TestMD5: public ::testing::Test
 {
+
+    protected:
+        void SetUp()
+        {
+
+            m_allocator = axutil_allocator_init(NULL);
+            m_axis_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_axis_log);
+
+        }
+
+        void TearDown()
+        {
+            axutil_env_free(m_env);
+        }
+
+
+        axutil_allocator_t *m_allocator = NULL;
+        axutil_env_t *m_env = NULL;
+        axutil_error_t *m_error = NULL;
+        axutil_log_t *m_axis_log = NULL;
+
+};
+
+TEST_F(TestMD5, test_md5)
+{
+
     printf ("\nMD5 test suite:\n");
     printf ("test confirmation: Rivest, R., \"The MD5 Message-Digest Algorithm\", RFC 1321, April 1992.\n");
-    MDString ("", env);
-    MDString ("a", env);
-    MDString ("abc", env);
-    MDString ("message digest", env);
-    MDString ("abcdefghijklmnopqrstuvwxyz", env);
-    MDString ("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789", env);
-    MDString ("12345678901234567890123456789012345678901234567890123456789012345678901234567890", env);
+    MDString ("", m_env);
+    MDString ("a", m_env);
+    MDString ("abc", m_env);
+    MDString ("message digest", m_env);
+    MDString ("abcdefghijklmnopqrstuvwxyz", m_env);
+    MDString ("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789", m_env);
+    MDString ("12345678901234567890123456789012345678901234567890123456789012345678901234567890", m_env);
 }
diff --git a/util/test/util/test_string.c b/util/test/util/test_string.c
deleted file mode 100644
index 709a96a..0000000
--- a/util/test/util/test_string.c
+++ /dev/null
@@ -1,75 +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 <stdio.h>
-#include <axutil_error_default.h>
-#include <axutil_log.h>
-#include <axutil_string.h>
-
-void
-test_strltrim(
-    const axutil_env_t * env)
-{
-    axis2_char_t *s = axutil_strdup(env, "    abcd efgh    ");
-    axis2_char_t *trimmed = NULL;
-    trimmed = axutil_strltrim(env, s, " \t\r\n");
-    CUT_ASSERT_STR_EQUAL(trimmed, "abcd efgh    ", 0);
-    if (trimmed)
-        AXIS2_FREE(env->allocator, trimmed);
-    if (s)
-        AXIS2_FREE(env->allocator, s);
-}
-
-void
-test_strrtrim(
-    const axutil_env_t * env)
-{
-    axis2_char_t *s = axutil_strdup(env, "    abcd efgh    ");
-    axis2_char_t *trimmed = NULL;
-    trimmed = axutil_strrtrim(env, s, " \t\r\n");
-    CUT_ASSERT_STR_EQUAL(trimmed, "    abcd efgh", 0);
-    if (trimmed)
-        AXIS2_FREE(env->allocator, trimmed);
-    if (s)
-        AXIS2_FREE(env->allocator, s);
-}
-
-void
-test_strtrim(
-    const axutil_env_t * env)
-{
-    axis2_char_t *s = axutil_strdup(env, "    abcd efgh    ");
-    axis2_char_t *trimmed = NULL;
-    trimmed = axutil_strtrim(env, s, " \t\r\n");
-    CUT_ASSERT_STR_EQUAL(trimmed, "abcd efgh", 0);
-    if (trimmed)
-        AXIS2_FREE(env->allocator, trimmed);
-    if (s)
-        AXIS2_FREE(env->allocator, s);
-}
-
-void
-run_test_string(
-    axutil_env_t * env)
-{
-    if (!env)
-        return;
-    test_strltrim(env);
-    test_strrtrim(env);
-    test_strtrim(env);
-}
diff --git a/util/test/util/test_string.cc b/util/test/util/test_string.cc
new file mode 100644
index 0000000..485b410
--- /dev/null
+++ b/util/test/util/test_string.cc
@@ -0,0 +1,92 @@
+
+/*
+ * 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 <stdio.h>
+#include <axutil_error_default.h>
+#include <axutil_log.h>
+#include <axutil_log_default.h>
+#include <axutil_string.h>
+
+class TestString: public ::testing::Test
+{
+
+
+    protected:
+        void SetUp()
+        {
+
+            m_allocator = axutil_allocator_init(NULL);
+            m_axis_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_axis_log);
+
+        }
+
+        void TearDown()
+        {
+            axutil_env_free(m_env);
+        }
+
+
+        axutil_allocator_t *m_allocator = NULL;
+        axutil_env_t *m_env = NULL;
+        axutil_error_t *m_error = NULL;
+        axutil_log_t *m_axis_log = NULL;
+
+};
+
+
+TEST_F(TestString, test_strltrim)
+{
+
+    axis2_char_t *s = (axis2_char_t*) axutil_strdup(m_env, "    abcd efgh    ");
+    axis2_char_t *trimmed = NULL;
+    trimmed = axutil_strltrim(m_env, s, " \t\r\n");
+    ASSERT_STREQ(trimmed, "abcd efgh    ");
+    if (trimmed)
+        AXIS2_FREE(m_env->allocator, trimmed);
+    if (s)
+        AXIS2_FREE(m_env->allocator, s);
+}
+
+TEST_F(TestString, test_strrtrim)
+{
+    axis2_char_t *s = (axis2_char_t*) axutil_strdup(m_env, "    abcd efgh    ");
+    axis2_char_t *trimmed = NULL;
+    trimmed = axutil_strrtrim(m_env, s, " \t\r\n");
+    ASSERT_STREQ(trimmed, "    abcd efgh");
+    if (trimmed)
+        AXIS2_FREE(m_env->allocator, trimmed);
+    if (s)
+        AXIS2_FREE(m_env->allocator, s);
+}
+
+TEST_F(TestString, test_strtrim)
+{
+    axis2_char_t *s = (axis2_char_t*) axutil_strdup(m_env, "    abcd efgh    ");
+    axis2_char_t *trimmed = NULL;
+    trimmed = axutil_strtrim(m_env, s, " \t\r\n");
+    ASSERT_STREQ(trimmed, "abcd efgh");
+    if (trimmed)
+        AXIS2_FREE(m_env->allocator, trimmed);
+    if (s)
+        AXIS2_FREE(m_env->allocator, s);
+}
diff --git a/util/test/util/test_thread.c b/util/test/util/test_thread.cc
similarity index 72%
rename from util/test/util/test_thread.c
rename to util/test/util/test_thread.cc
index 4bddd7f..5a73ba4 100644
--- a/util/test/util/test_thread.c
+++ b/util/test/util/test_thread.cc
@@ -16,6 +16,8 @@
  * limitations under the License.
  */
 
+#include <gtest/gtest.h>
+
 #include <stdio.h>
 #include <string.h>
 #include <axutil_error_default.h>
@@ -24,7 +26,6 @@
 #include <axutil_allocator.h>
 #include <axutil_utils.h>
 #include "test_thread.h"
-#include <cut_defs.h>
 
 const axutil_env_t *env = NULL;
 static axutil_thread_mutex_t *thread_lock = NULL;
@@ -56,14 +57,11 @@
     allocator = env->allocator;
 
     control = axutil_thread_once_init(allocator);
-    CUT_ASSERT_PTR_NOT_EQUAL(control, NULL, 0);
+    ASSERT_NE(control, nullptr);
 
     thread_lock =
         axutil_thread_mutex_create(allocator, AXIS2_THREAD_MUTEX_DEFAULT);
-    CUT_ASSERT_PTR_NOT_EQUAL(thread_lock, NULL, 0);
-    /* To avoid warning of not using cut_str_equal */
-    CUT_ASSERT_STR_EQUAL("", "", 0);
-
+    ASSERT_NE(thread_lock, nullptr);
 }
 
 void *AXIS2_CALL
@@ -74,9 +72,9 @@
     int i  = *((int *) param);
     printf("thread data = %d \n", i);
 	param_data = i;
-	
+
     axutil_thread_once(control, init_func);
-    CUT_ASSERT(value==1);
+    EXPECT_EQ(value, 1);
     axutil_thread_mutex_lock(thread_lock);
     printf("x = %d \n", ++x);
     axutil_thread_mutex_unlock(thread_lock);
@@ -96,28 +94,28 @@
         *j = NULL;
 
     allocator = env->allocator;
-    i = AXIS2_MALLOC(allocator, sizeof(int));
+    i = (int*)AXIS2_MALLOC(allocator, sizeof(int));
     *i = 5;
     param_data = -1;
     t1 = axutil_thread_create(allocator, NULL, test_function, (void *) i);
-    CUT_ASSERT_PTR_NOT_EQUAL(t1, NULL, 0);
+    ASSERT_NE(t1, nullptr);
     AXIS2_SLEEP(1);
-    CUT_ASSERT_INT_EQUAL(param_data, *i, 0);
+    ASSERT_EQ(param_data, *i);
 
 
-    j = AXIS2_MALLOC(allocator, sizeof(int));
+    j = (int*)AXIS2_MALLOC(allocator, sizeof(int));
     *j = 25;
     param_data = -1;
     t2 = axutil_thread_create(allocator, NULL, test_function, (void *) j);
-    CUT_ASSERT_PTR_NOT_EQUAL(t2, NULL, 0);
+    ASSERT_NE(t2, nullptr);
     AXIS2_SLEEP(1);
-    CUT_ASSERT_INT_EQUAL(param_data, *j, 0);
+    ASSERT_EQ(param_data, *j);
 
     rv = axutil_thread_join(t1);
-    CUT_ASSERT_INT_EQUAL(rv, AXIS2_SUCCESS, 0);
+    ASSERT_EQ(rv, AXIS2_SUCCESS);
 
     rv = axutil_thread_join(t2);
-    CUT_ASSERT_INT_EQUAL(rv, AXIS2_SUCCESS, 0);
+    ASSERT_EQ(rv, AXIS2_SUCCESS);
 
 }
 
@@ -140,17 +138,17 @@
 
     allocator = env->allocator;
     attr = axutil_threadattr_create(allocator);
-    CUT_ASSERT_PTR_NOT_EQUAL(attr, NULL, 1);
+    ASSERT_NE(attr, nullptr);
     rv = axutil_threadattr_detach_set(attr, 1);
-    CUT_ASSERT_INT_EQUAL(rv, AXIS2_SUCCESS, 1);
+    ASSERT_EQ(rv, AXIS2_SUCCESS);
     t3 = axutil_thread_create(allocator, attr, test_function2, NULL);
-    CUT_ASSERT_PTR_NOT_EQUAL(t3, NULL, 1);
+    ASSERT_NE(t3, nullptr);
 
     /*
      * thread is already detached - should return AXIS2_FAILURE
      */
     rv = axutil_thread_detach(t3);
-    CUT_ASSERT_INT_EQUAL(rv, AXIS2_FAILURE, 1);
+    ASSERT_EQ(rv, AXIS2_FAILURE);
  }
 
 void
@@ -163,41 +161,69 @@
 
     allocator = env->allocator;
     attr = axutil_threadattr_create(allocator);
-    CUT_ASSERT_PTR_NOT_EQUAL(attr, NULL, 1);
+    ASSERT_NE(attr, nullptr);
 
     t4 = axutil_thread_create(allocator, attr, test_function2, NULL);
-    CUT_ASSERT_PTR_NOT_EQUAL(t4, NULL, 1);
+    ASSERT_NE(t4, nullptr);
     /*
      * thread is not detached yet - should return AXIS2_SUCCESS
      */
     rv = axutil_thread_detach(t4);
-    CUT_ASSERT_INT_EQUAL(rv, AXIS2_SUCCESS, 1);
+    ASSERT_EQ(rv, AXIS2_SUCCESS);
 }
 
 void
 check_locks(
     )
 {
-    CUT_ASSERT_INT_EQUAL(x, 2, 0);
+    ASSERT_EQ(x, 2);
 }
 
 void
 check_thread_once(
     )
 {
-    CUT_ASSERT_INT_EQUAL(value, 1, 0);
+    ASSERT_EQ(value, 1);
 }
 
-void
-run_test_thread(
-    const axutil_env_t * env)
+class TestThread: public ::testing::Test
 {
-    test_thread_init(env);
-    test_axutil_thread_create(env);
+
+    protected:
+        void SetUp()
+        {
+
+            m_allocator = axutil_allocator_init(NULL);
+            m_axis_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_axis_log);
+
+        }
+
+        void TearDown()
+        {
+            axutil_env_free(m_env);
+        }
+
+
+        axutil_allocator_t *m_allocator = NULL;
+        axutil_env_t *m_env = NULL;
+        axutil_error_t *m_error = NULL;
+        axutil_log_t *m_axis_log = NULL;
+
+};
+
+
+TEST_F(TestThread, test_thread)
+{
+
+    test_thread_init(m_env);
+    test_axutil_thread_create(m_env);
     check_locks();
     check_thread_once();
-    test_axutil_thread_detach(env);
-    test_axutil_thread_detach2(env);
+    test_axutil_thread_detach(m_env);
+    test_axutil_thread_detach2(m_env);
 
 #if defined (WIN32)
     Sleep(1000);                /*to give time for detached threads to execute */
@@ -207,17 +233,3 @@
 
     axutil_thread_mutex_destroy(thread_lock);
 }
-
-int
-main(
-    void)
-{
-    axutil_env_t *env = cut_setup_env("util thread");
-	CUT_ASSERT(env != NULL);
-	if (env) {
-       run_test_thread(env);
-       axutil_env_free(env);
-    }
-    CUT_RETURN_ON_FAILURE(-1);
-    return 0;
-}
diff --git a/util/test/util/test_util.c b/util/test/util/test_util.c
deleted file mode 100644
index aa2c5bb..0000000
--- a/util/test/util/test_util.c
+++ /dev/null
@@ -1,265 +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 <stdio.h>
-#include <axutil_hash.h>
-#include <axutil_string.h>
-#include <axutil_error_default.h>
-#include <axutil_array_list.h>
-#include <platforms/axutil_platform_auto_sense.h>
-#include <axutil_uuid_gen.h>
-#include <axutil_log_default.h>
-#include <axutil_log.h>
-#include <axutil_dir_handler.h>
-#include <axutil_file.h>
-#include <cut_defs.h>
-#include "axutil_log.h"
-#include "test_thread.h"
-#include "test_log.h"
-#include "test_md5.h"
-#include "test_string.c"
-
-extern void
-run_test_string(
-    axutil_env_t * env);
-	
-typedef struct a
-{
-    axis2_char_t *value;
-}
-a;
-
-void
-test_hash_get(
-    const axutil_env_t * env)
-{
-    axutil_hash_t *ht;
-    a *a1,
-    *a2,
-    *a3,
-    *a4;
-
-    axutil_hash_index_t *i = 0;
-    void *v = NULL;
-
-    char *key1 = "key1";
-    char *key2 = "key2";
-    char *key3 = "key3";
-    char *key4 = "key4";
-
-    a1 = (a *) AXIS2_MALLOC(env->allocator, sizeof(a));
-    a2 = (a *) AXIS2_MALLOC(env->allocator, sizeof(a));
-    a3 = (a *) AXIS2_MALLOC(env->allocator, sizeof(a));
-    a4 = (a *) AXIS2_MALLOC(env->allocator, sizeof(a));
-
-    a1->value = axutil_strdup(env, "value1");
-    a2->value = axutil_strdup(env, "value2");
-    a3->value = axutil_strdup(env, "value3");
-    a4->value = axutil_strdup(env, "value4");
-
-    ht = axutil_hash_make(env);
-
-    axutil_hash_set(ht, key1, AXIS2_HASH_KEY_STRING, a1);
-    axutil_hash_set(ht, key2, AXIS2_HASH_KEY_STRING, a2);
-    axutil_hash_set(ht, key3, AXIS2_HASH_KEY_STRING, a3);
-    axutil_hash_set(ht, key4, AXIS2_HASH_KEY_STRING, a4);
-
-    axutil_hash_set(ht, key2, AXIS2_HASH_KEY_STRING, NULL);
-    axutil_hash_set(ht, key2, AXIS2_HASH_KEY_STRING, a2);
-    for (i = axutil_hash_first(ht, env); i; i = axutil_hash_next(env, i))
-    {
-        axutil_hash_this(i, NULL, NULL, &v);
-        printf("\n %s \n", ((a *) v)->value);
-    }
-
-    CUT_ASSERT_STR_EQUAL(
-           ((a *) axutil_hash_get(ht, key1, AXIS2_HASH_KEY_STRING))->value, "value1", 0);
-
-    CUT_ASSERT_STR_EQUAL(
-           ((a *) axutil_hash_get(ht, key2, AXIS2_HASH_KEY_STRING))->value, "value2", 0);
-
-    CUT_ASSERT_STR_EQUAL(
-           ((a *) axutil_hash_get(ht, key3, AXIS2_HASH_KEY_STRING))->value, "value3", 0);
-
-    CUT_ASSERT_STR_EQUAL(
-           ((a *) axutil_hash_get(ht, key4, AXIS2_HASH_KEY_STRING))->value, "value4", 0);
-
-    axutil_hash_free(ht, env);
-    AXIS2_FREE(env->allocator, a1->value);
-    AXIS2_FREE(env->allocator, a2->value);
-    AXIS2_FREE(env->allocator, a3->value);
-    AXIS2_FREE(env->allocator, a4->value);
-    AXIS2_FREE(env->allocator, a1);
-    AXIS2_FREE(env->allocator, a2);
-    AXIS2_FREE(env->allocator, a3);
-    AXIS2_FREE(env->allocator, a4);
-}
-
-void
-test_axutil_dir_handler_list_service_or_module_dirs(axutil_env_t *env)
-{
-    int i,
-     isize;
-    axutil_file_t *file = NULL;
-    axis2_char_t *filename = NULL;
-
-    axis2_char_t *pathname = axutil_strdup(env, "/tmp/test/");
-
-    axutil_array_list_t *arr_folders =
-        axutil_dir_handler_list_service_or_module_dirs(env, pathname);
-    if (arr_folders == NULL)
-    {
-        printf("List of folders is NULL\n");
-        return;
-    }
-
-    isize = axutil_array_list_size(arr_folders, env);
-    printf("Folder array size = %d \n", isize);
-
-    for (i = 0; i < isize; ++i)
-    {
-        file = (axutil_file_t *) axutil_array_list_get(arr_folders, env, i);
-        filename = axutil_file_get_name(file, env);
-        printf("filename = %s \n", filename);
-    }
-    printf
-        ("----end of test_axutil_dir_handler_list_service_or_module_dirs----\n");
-
-}
-
-/**
-  * This test is intended to test whether given two files are equal or not.
-  * Spaces and new lines are ignored in comparing
-  */
-void test_file_diff(
-    const axutil_env_t * env)
-{
-}
-
-void
-test_array_list(
-    const axutil_env_t * env)
-{
-    axutil_array_list_t *al;
-    a *entry = NULL;
-    int size;
-
-    al = axutil_array_list_create(env, 1);
-	CUT_ASSERT_PTR_NOT_EQUAL(al, NULL, 1);
-    CUT_ASSERT_INT_EQUAL(axutil_array_list_size(al, env), 0, 0);
-
-    entry = (a *) AXIS2_MALLOC(env->allocator, sizeof(a));
-    entry->value = axutil_strdup(env, "value1");
-    axutil_array_list_add(al, env, (void *) entry);
-
-    entry = (a *) AXIS2_MALLOC(env->allocator, sizeof(a));
-    entry->value = axutil_strdup(env, "value2");
-    axutil_array_list_add(al, env, (void *) entry);
-
-    entry = (a *) AXIS2_MALLOC(env->allocator, sizeof(a));
-    entry->value = axutil_strdup(env, "value3");
-    axutil_array_list_add(al, env, (void *) entry);
-
-    entry = (a *) AXIS2_MALLOC(env->allocator, sizeof(a));
-    entry->value = axutil_strdup(env, "value4");
-    axutil_array_list_add(al, env, (void *) entry);
-
-    entry = (a *) AXIS2_MALLOC(env->allocator, sizeof(a));
-    entry->value = axutil_strdup(env, "value5");
-    axutil_array_list_add(al, env, (void *) entry);
-
-    entry = (a *) AXIS2_MALLOC(env->allocator, sizeof(a));
-    entry->value = axutil_strdup(env, "value6");
-    axutil_array_list_add(al, env, (void *) entry);
-
-    entry = (a *) AXIS2_MALLOC(env->allocator, sizeof(a));
-    entry->value = axutil_strdup(env, "value7");
-    axutil_array_list_set(al, env, 3, (void *) entry);
-    axutil_array_list_remove(al, env, 2);
-
-    entry = (a *) axutil_array_list_get(al, env, 0);
-    CUT_ASSERT_STR_EQUAL(entry->value, "value1", 0);
-
-    entry = (a *) axutil_array_list_get(al, env, 2);
-    CUT_ASSERT_STR_EQUAL(entry->value, "value7", 0);
-    size = axutil_array_list_size(al, env);
-    CUT_ASSERT_INT_EQUAL(size, 5, 0);
-}
-
-void
-test_uuid_gen(
-    const axutil_env_t * env)
-{
-    char *uuid = NULL;
-    printf("starting uuid_gen test...\n");
-    uuid = axutil_uuid_gen(env);
-    printf("Generated UUID 1:%s\n", uuid);
-    AXIS2_FREE(env->allocator, uuid);
-    uuid = axutil_uuid_gen(env);
-    printf("Generated UUID 2:%s\n", uuid);
-    AXIS2_FREE(env->allocator, uuid);
-    printf("finished uuid_gen test...\n");
-}
-
-void
-test_log_write(void)
-{
-    axutil_error_t *error = NULL;
-    axutil_log_t *log22 = NULL;
-    axutil_env_t *env = NULL;
-    axutil_allocator_t *allocator = axutil_allocator_init(NULL);
-    CUT_ASSERT_PTR_NOT_EQUAL(allocator, NULL, 1);
-    error = axutil_error_create(allocator);
-    CUT_ASSERT_PTR_NOT_EQUAL(error, NULL, 1);
-    log22 = axutil_log_create(allocator, NULL, NULL);
-    CUT_ASSERT_PTR_NOT_EQUAL(log22, NULL, 1);
-    log22->level = AXIS2_LOG_LEVEL_DEBUG;
-    env = axutil_env_create_with_error_log(allocator, error, log22);
-    CUT_ASSERT_PTR_NOT_EQUAL(env, NULL, 1);
-
-    AXIS2_LOG_CRITICAL(env->log, AXIS2_LOG_SI, "log1 %s", "test1");
-    AXIS2_LOG_ERROR(env->log, AXIS2_LOG_SI, "log2 %d", 2);
-    AXIS2_LOG_WARNING(env->log, AXIS2_LOG_SI, "log3 %s", "test3");
-    AXIS2_LOG_INFO(env->log, AXIS2_LOG_SI, "log4 %s %s", "info1", "info2");
-    AXIS2_LOG_DEBUG(env->log, AXIS2_LOG_SI, "log5 %s %d", "test", 5);
-    axutil_env_free(env);
-
-}
-
-int
-main(
-    void)
-{
-    axutil_env_t *env = cut_setup_env("util");
-    CUT_ASSERT(env != NULL);
-    if (env) 
-    {
-        test_hash_get(env);
-        test_file_diff(env);
-        test_array_list(env);
-        test_uuid_gen(env);
-        test_md5(env);
-        run_test_log();
-        run_test_string(env);
-        test_axutil_dir_handler_list_service_or_module_dirs(env);
-        axutil_env_free(env);
-    }
-    CUT_RETURN_ON_FAILURE(-1);
-    return 0;
-}
-
diff --git a/util/test/util/test_util.cc b/util/test/util/test_util.cc
new file mode 100644
index 0000000..1096324
--- /dev/null
+++ b/util/test/util/test_util.cc
@@ -0,0 +1,261 @@
+
+/*
+ * 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 <stdio.h>
+#include <axutil_hash.h>
+#include <axutil_string.h>
+#include <axutil_error_default.h>
+#include <axutil_array_list.h>
+#include <platforms/axutil_platform_auto_sense.h>
+#include <axutil_uuid_gen.h>
+#include <axutil_log_default.h>
+#include <axutil_log.h>
+#include <axutil_dir_handler.h>
+#include <axutil_file.h>
+#include "axutil_log.h"
+#include "test_thread.h"
+#include "test_log.h"
+#include "test_md5.h"
+
+extern void
+run_test_string(
+    axutil_env_t * env);
+
+typedef struct a
+{
+    axis2_char_t *value;
+}
+a;
+
+class TestUtil: public ::testing::Test
+{
+
+    protected:
+        void SetUp()
+        {
+
+            m_allocator = axutil_allocator_init(NULL);
+            m_axis_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_axis_log);
+
+        }
+
+        void TearDown()
+        {
+            axutil_env_free(m_env);
+        }
+
+
+        axutil_allocator_t *m_allocator = NULL;
+        axutil_env_t *m_env = NULL;
+        axutil_error_t *m_error = NULL;
+        axutil_log_t *m_axis_log = NULL;
+
+};
+
+
+TEST_F(TestUtil, test_hash_get)
+{
+
+    axutil_hash_t *ht;
+    a *a1,
+    *a2,
+    *a3,
+    *a4;
+
+    axutil_hash_index_t *i = 0;
+    void *v = NULL;
+
+    char *key1 = "key1";
+    char *key2 = "key2";
+    char *key3 = "key3";
+    char *key4 = "key4";
+
+    a1 = (a *) AXIS2_MALLOC(m_env->allocator, sizeof(a));
+    a2 = (a *) AXIS2_MALLOC(m_env->allocator, sizeof(a));
+    a3 = (a *) AXIS2_MALLOC(m_env->allocator, sizeof(a));
+    a4 = (a *) AXIS2_MALLOC(m_env->allocator, sizeof(a));
+
+    a1->value = (axis2_char_t*) axutil_strdup(m_env, "value1");
+    a2->value = (axis2_char_t*) axutil_strdup(m_env, "value2");
+    a3->value = (axis2_char_t*) axutil_strdup(m_env, "value3");
+    a4->value = (axis2_char_t*) axutil_strdup(m_env, "value4");
+
+    ht = axutil_hash_make(m_env);
+
+    axutil_hash_set(ht, key1, AXIS2_HASH_KEY_STRING, a1);
+    axutil_hash_set(ht, key2, AXIS2_HASH_KEY_STRING, a2);
+    axutil_hash_set(ht, key3, AXIS2_HASH_KEY_STRING, a3);
+    axutil_hash_set(ht, key4, AXIS2_HASH_KEY_STRING, a4);
+
+    axutil_hash_set(ht, key2, AXIS2_HASH_KEY_STRING, NULL);
+    axutil_hash_set(ht, key2, AXIS2_HASH_KEY_STRING, a2);
+    for (i = axutil_hash_first(ht, m_env); i; i = axutil_hash_next(m_env, i))
+    {
+        axutil_hash_this(i, NULL, NULL, &v);
+        printf("\n %s \n", ((a *) v)->value);
+    }
+
+    ASSERT_STREQ(((a *) axutil_hash_get(ht, key1, AXIS2_HASH_KEY_STRING))->value, "value1");
+    ASSERT_STREQ(((a *) axutil_hash_get(ht, key2, AXIS2_HASH_KEY_STRING))->value, "value2");
+    ASSERT_STREQ(((a *) axutil_hash_get(ht, key3, AXIS2_HASH_KEY_STRING))->value, "value3");
+    ASSERT_STREQ(((a *) axutil_hash_get(ht, key4, AXIS2_HASH_KEY_STRING))->value, "value4");
+
+    axutil_hash_free(ht, m_env);
+    AXIS2_FREE(m_env->allocator, a1->value);
+    AXIS2_FREE(m_env->allocator, a2->value);
+    AXIS2_FREE(m_env->allocator, a3->value);
+    AXIS2_FREE(m_env->allocator, a4->value);
+    AXIS2_FREE(m_env->allocator, a1);
+    AXIS2_FREE(m_env->allocator, a2);
+    AXIS2_FREE(m_env->allocator, a3);
+    AXIS2_FREE(m_env->allocator, a4);
+}
+
+TEST_F(TestUtil, test_axutil_dir_handler_list_service_or_module_dirs)
+{
+    int i,
+     isize;
+    axutil_file_t *file = NULL;
+    axis2_char_t *filename = NULL;
+
+    axis2_char_t *pathname = (axis2_char_t*) axutil_strdup(m_env, "/tmp/test/");
+
+    axutil_array_list_t *arr_folders =
+        axutil_dir_handler_list_service_or_module_dirs(m_env, pathname);
+    if (arr_folders == NULL)
+    {
+        printf("List of folders is NULL\n");
+        return;
+    }
+
+    isize = axutil_array_list_size(arr_folders, m_env);
+    printf("Folder array size = %d \n", isize);
+
+    for (i = 0; i < isize; ++i)
+    {
+        file = (axutil_file_t *) axutil_array_list_get(arr_folders, m_env, i);
+        filename = axutil_file_get_name(file, m_env);
+        printf("filename = %s \n", filename);
+    }
+    printf
+        ("----end of test_axutil_dir_handler_list_service_or_module_dirs----\n");
+
+}
+
+/**
+  * This test is intended to test whether given two files are equal or not.
+  * Spaces and new lines are ignored in comparing
+  */
+TEST_F(TestUtil, test_file_diff)
+{
+    /* TODO */
+}
+
+TEST_F(TestUtil, test_array_list)
+{
+
+    axutil_array_list_t *al;
+    a *entry = NULL;
+    int size;
+
+    al = axutil_array_list_create(m_env, 1);
+	ASSERT_NE(al, nullptr);
+    ASSERT_EQ(axutil_array_list_size(al, m_env), 0);
+
+    entry = (a *) AXIS2_MALLOC(m_env->allocator, sizeof(a));
+    entry->value = (axis2_char_t*) axutil_strdup(m_env, "value1");
+    axutil_array_list_add(al, m_env, (void *) entry);
+
+    entry = (a *) AXIS2_MALLOC(m_env->allocator, sizeof(a));
+    entry->value = (axis2_char_t*) axutil_strdup(m_env, "value2");
+    axutil_array_list_add(al, m_env, (void *) entry);
+
+    entry = (a *) AXIS2_MALLOC(m_env->allocator, sizeof(a));
+    entry->value = (axis2_char_t*) axutil_strdup(m_env, "value3");
+    axutil_array_list_add(al, m_env, (void *) entry);
+
+    entry = (a *) AXIS2_MALLOC(m_env->allocator, sizeof(a));
+    entry->value = (axis2_char_t*) axutil_strdup(m_env, "value4");
+    axutil_array_list_add(al, m_env, (void *) entry);
+
+    entry = (a *) AXIS2_MALLOC(m_env->allocator, sizeof(a));
+    entry->value = (axis2_char_t*) axutil_strdup(m_env, "value5");
+    axutil_array_list_add(al, m_env, (void *) entry);
+
+    entry = (a *) AXIS2_MALLOC(m_env->allocator, sizeof(a));
+    entry->value = (axis2_char_t*) axutil_strdup(m_env, "value6");
+    axutil_array_list_add(al, m_env, (void *) entry);
+
+    entry = (a *) AXIS2_MALLOC(m_env->allocator, sizeof(a));
+    entry->value = (axis2_char_t*) axutil_strdup(m_env, "value7");
+    axutil_array_list_set(al, m_env, 3, (void *) entry);
+    axutil_array_list_remove(al, m_env, 2);
+
+    entry = (a *) axutil_array_list_get(al, m_env, 0);
+    ASSERT_STREQ(entry->value, "value1");
+
+    entry = (a *) axutil_array_list_get(al, m_env, 2);
+    ASSERT_STREQ(entry->value, "value7");
+    size = axutil_array_list_size(al, m_env);
+    ASSERT_EQ(size, 5);
+}
+
+
+TEST_F(TestUtil, test_uuid_gen)
+{
+    char *uuid = NULL;
+    printf("starting uuid_gen test...\n");
+    uuid = axutil_uuid_gen(m_env);
+    printf("Generated UUID 1:%s\n", uuid);
+    AXIS2_FREE(m_env->allocator, uuid);
+    uuid = axutil_uuid_gen(m_env);
+    printf("Generated UUID 2:%s\n", uuid);
+    AXIS2_FREE(m_env->allocator, uuid);
+    printf("finished uuid_gen test...\n");
+}
+
+
+TEST_F(TestUtil, test_log_write)
+{
+    axutil_error_t *error = NULL;
+    axutil_log_t *log22 = NULL;
+    axutil_env_t *env = NULL;
+    axutil_allocator_t *allocator = axutil_allocator_init(NULL);
+    ASSERT_NE(allocator, nullptr);
+    error = axutil_error_create(allocator);
+    ASSERT_NE(error, nullptr);
+    log22 = axutil_log_create(allocator, NULL, NULL);
+    ASSERT_NE(log22, nullptr);
+    log22->level = AXIS2_LOG_LEVEL_DEBUG;
+    env = axutil_env_create_with_error_log(allocator, error, log22);
+    ASSERT_NE(env, nullptr);
+
+    AXIS2_LOG_CRITICAL(env->log, AXIS2_LOG_SI, "log1 %s", "test1");
+    AXIS2_LOG_ERROR(env->log, AXIS2_LOG_SI, "log2 %d", 2);
+    AXIS2_LOG_WARNING(env->log, AXIS2_LOG_SI, "log3 %s", "test3");
+    AXIS2_LOG_INFO(env->log, AXIS2_LOG_SI, "log4 %s %s", "info1", "info2");
+    AXIS2_LOG_DEBUG(env->log, AXIS2_LOG_SI, "log5 %s %d", "test", 5);
+    axutil_env_free(env);
+
+}
+
diff --git a/util/test/utils/Makefile.am b/util/test/utils/Makefile.am
index a102afd..42c274e 100644
--- a/util/test/utils/Makefile.am
+++ b/util/test/utils/Makefile.am
@@ -4,26 +4,27 @@
 # 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.
 TESTS = utils_test
-check_PROGRAMS = utils_test 
-noinst_PROGRAMS = utils_test 
-utils_test_SOURCES = utils_test.c ../util/create_env.c
+check_PROGRAMS = utils_test
+noinst_PROGRAMS = utils_test
+utils_test_SOURCES = utils_test.cc
 
 utils_test_LDADD   =   \
-                    $(top_builddir)/src/libaxutil.la 
+				$(top_builddir)/src/libaxutil.la \
+				$(top_builddir)/$(GTEST)/libgtest.a \
+				$(top_builddir)/$(GTEST)/libgtest_main.a
 
-INCLUDES = -I$(top_builddir)/include \
-			-I$(CUTEST_HOME)/include \
+AM_CPPFLAGS = -I$(top_builddir)/include \
 			-I ../../../axiom/include \
 			-I ../../../include \
-		 	-I ../../../test/cutest/include
+			-I $(GTEST_DIR)/include
 
 
diff --git a/util/test/utils/utils_test.c b/util/test/utils/utils_test.c
deleted file mode 100644
index 76cde51..0000000
--- a/util/test/utils/utils_test.c
+++ /dev/null
@@ -1,54 +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 "../util/create_env.h"
-#include <axutil_utils.h>
-#include <cut_defs.h>
-
-axis2_char_t * request = "This is a request";
-axis2_char_t * s = "<root>This is a & in xml string</root>";
-axis2_char_t c = 'c';
-
-/** @brief test utils 
- *  test quote string  
- */
-
-void test_utils(axutil_env_t *env)
-{
-    axis2_char_t **op, *quote_string;
-    int hexit;
-    op = axutil_parse_request_url_for_svc_and_op(env,request);
-	CUT_ASSERT_PTR_NOT_EQUAL(op, NULL, 0);
-    quote_string = axutil_xml_quote_string(env,s,1);
-    CUT_ASSERT_STR_EQUAL(quote_string, "&lt;root&gt;This is a &amp; in xml string&lt;/root&gt;", 0);
-    hexit = axutil_hexit(c);
-    CUT_ASSERT_INT_EQUAL(hexit,12, 0);
-}
-int main()
-{
-    axutil_env_t *env = cut_setup_env("util");
-	CUT_ASSERT(env != NULL);
-	if (env) {
-       test_utils(env);
-       axutil_env_free(env);
-    }
-    CUT_RETURN_ON_FAILURE(-1);
-    return 0;
-}
-
-
-
diff --git a/util/test/utils/utils_test.cc b/util/test/utils/utils_test.cc
new file mode 100644
index 0000000..8cb2d80
--- /dev/null
+++ b/util/test/utils/utils_test.cc
@@ -0,0 +1,71 @@
+/*
+* 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 "../util/create_env.h"
+#include <axutil_utils.h>
+
+class TestUtils: public ::testing::Test
+{
+
+    protected:
+        void SetUp()
+        {
+
+            m_allocator = axutil_allocator_init(NULL);
+            m_axis_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_axis_log);
+
+        }
+
+        void TearDown()
+        {
+            axutil_env_free(m_env);
+        }
+
+
+        axutil_allocator_t *m_allocator = NULL;
+        axutil_env_t *m_env = NULL;
+        axutil_error_t *m_error = NULL;
+        axutil_log_t *m_axis_log = NULL;
+
+};
+
+
+/** @brief test utils 
+ *  test quote string  
+ */
+
+TEST_F(TestUtils, test_utils)
+{
+
+    axis2_char_t * request = "This is a request";
+    axis2_char_t * s = "<root>This is a & in xml string</root>";
+    axis2_char_t c = 'c';
+    axis2_char_t **op, *quote_string;
+    int hexit;
+    op = axutil_parse_request_url_for_svc_and_op(m_env,request);
+    ASSERT_NE(op, nullptr);
+    quote_string = axutil_xml_quote_string(m_env,s,1);
+    ASSERT_STREQ(quote_string, "&lt;root&gt;This is a &amp; in xml string&lt;/root&gt;");
+    hexit = axutil_hexit(c);
+    ASSERT_EQ(hexit, 12);
+}
+
