diff --git a/tester/liblinphone_tester.c b/tester/liblinphone_tester.c
index 171f4eae9ae335be8c93b4091cda79a77138523b..addf9956637fb7b89d33286a9528a5c4845cbb08 100644
--- a/tester/liblinphone_tester.c
+++ b/tester/liblinphone_tester.c
@@ -25,6 +25,8 @@
 #include "CUnit/CUCurses.h"
 #endif
 
+extern int liblinphone_tester_use_log_file;
+
 #ifdef ANDROID
 
 #include <android/log.h>
@@ -115,6 +117,8 @@ static void liblinphone_tester_qnx_log_handler(OrtpLogLevel lev, const char *fmt
 }
 #endif /* __QNX__ */
 
+
+
 void helper(const char *name) {
 	liblinphone_tester_fprintf(stderr,"%s --help\n"
 			"\t\t\t--verbose\n"
@@ -127,6 +131,7 @@ void helper(const char *name) {
 			"\t\t\t--suite <suite name>\n"
 			"\t\t\t--test <test name>\n"
 			"\t\t\t--dns-hosts </etc/hosts -like file to used to override DNS names (default: tester_hosts)>\n"
+			"\t\t\t--log-file <output log file path>\n"
 #if HAVE_CU_CURSES
 			"\t\t\t--curses\n"
 #endif
@@ -148,7 +153,7 @@ int main (int argc, char *argv[])
 	int ret;
 	const char *suite_name=NULL;
 	const char *test_name=NULL;
-
+	FILE* log_file=NULL;
 #if defined(ANDROID)
 	linphone_core_set_log_handler(linphone_android_ortp_log_handler);
 #elif defined(__QNX__)
@@ -193,7 +198,18 @@ int main (int argc, char *argv[])
 			suite_name = argv[i];
 			liblinphone_tester_list_suite_tests(suite_name);
 			return 0;
-		} else {
+		} else if (strcmp(argv[i],"--log-file")==0){
+			CHECK_ARG("--log-file", ++i, argc);
+			log_file=fopen(argv[i],"w");
+			if (!log_file) {
+				ms_fatal("Cannot open file [%s] for writting logs because [%s]",argv[i],strerror(errno));
+			} else {
+				liblinphone_tester_use_log_file=1;
+				liblinphone_tester_fprintf(stdout,"Redirecting traces to file [%s]",argv[i]);
+				linphone_core_set_log_file(log_file);
+			}
+
+		}else {
 			liblinphone_tester_fprintf(stderr, "Unknown option \"%s\"\n", argv[i]); \
 			helper(argv[0]);
 			return -1;
diff --git a/tester/tester.c b/tester/tester.c
index 971bf5d6397fe90ddc9e7866307fe0c794d0d93c..8b2066e5333613b18e108834bf8288d7f79c6ae1 100644
--- a/tester/tester.c
+++ b/tester/tester.c
@@ -17,7 +17,7 @@
  */
 
 #include <stdio.h>
-#include "CUnit/Basic.h"
+#include "CUnit/TestRun.h"
 #include "linphonecore.h"
 #include "private.h"
 #include "liblinphone_tester.h"
@@ -40,6 +40,7 @@ const char* auth_domain="sip.example.org";
 const char* test_username="liblinphone_tester";
 const char* test_password="secret";
 const char* test_route="sip2.linphone.org";
+int liblinphone_tester_use_log_file=0;
 
 #if WINAPI_FAMILY_PHONE_APP
 const char *liblinphone_tester_file_prefix="Assets";
@@ -140,7 +141,7 @@ static LinphoneCore* configure_lc_from(LinphoneCoreVTable* v_table, const char*
 		lp_config_set_string(config, "sip",   "root_ca"    , rootcapath);
 		lc = linphone_core_new_with_config(v_table, config, user_data);
 	} else {
-		lc = linphone_core_new(v_table,NULL,*filepath!='\0' ? filepath : NULL, user_data);
+		lc = linphone_core_new(v_table,NULL,(filepath!=NULL&&filepath[0]!='\0') ? filepath : NULL, user_data);
 
 		linphone_core_set_ring(lc, ringpath);
 		linphone_core_set_ringback(lc, ringbackpath);
@@ -422,6 +423,56 @@ void liblinphone_tester_uninit(void) {
 	}
 }
 
+/*derivated from cunit*/
+static void test_complete_message_handler(const CU_pTest pTest,
+                                                const CU_pSuite pSuite,
+                                                const CU_pFailureRecord pFailureList) {
+    int i;
+    CU_pFailureRecord pFailure = pFailureList;
+	if (pFailure) {
+		if (liblinphone_tester_use_log_file) ms_warning("Suite [%s], Test [%s] had failures:", pSuite->pName, pTest->pName);
+		liblinphone_tester_fprintf(stdout,"\nSuite [%s], Test [%s] had failures:", pSuite->pName, pTest->pName);
+	} else {
+		if (liblinphone_tester_use_log_file) ms_warning(" passed");
+		liblinphone_tester_fprintf(stdout," passed");
+	}
+      for (i = 1 ; (NULL != pFailure) ; pFailure = pFailure->pNext, i++) {
+    	  if (liblinphone_tester_use_log_file) ms_warning("\n    %d. %s:%u  - %s", i,
+            (NULL != pFailure->strFileName) ? pFailure->strFileName : "",
+            pFailure->uiLineNumber,
+            (NULL != pFailure->strCondition) ? pFailure->strCondition : "");
+    	  liblinphone_tester_fprintf(stdout,"\n    %d. %s:%u  - %s", i,
+            (NULL != pFailure->strFileName) ? pFailure->strFileName : "",
+            pFailure->uiLineNumber,
+            (NULL != pFailure->strCondition) ? pFailure->strCondition : "");
+      }
+ }
+
+
+static void test_all_tests_complete_message_handler(const CU_pFailureRecord pFailure) {
+  if (liblinphone_tester_use_log_file) ms_warning("\n\n %s",CU_get_run_results_string());
+  liblinphone_tester_fprintf(stdout,"\n\n %s",CU_get_run_results_string());
+}
+
+static void test_suite_init_failure_message_handler(const CU_pSuite pSuite) {
+	if (liblinphone_tester_use_log_file) ms_warning("Suite initialization failed for [%s].", pSuite->pName);
+    liblinphone_tester_fprintf(stdout,"Suite initialization failed for [%s].", pSuite->pName);
+}
+
+static void test_suite_cleanup_failure_message_handler(const CU_pSuite pSuite) {
+	if (liblinphone_tester_use_log_file) ms_warning("Suite cleanup failed for '%s'.", pSuite->pName);
+	liblinphone_tester_fprintf(stdout,"Suite cleanup failed for [%s].", pSuite->pName);
+}
+
+static void test_start_message_handler(const CU_pTest pTest, const CU_pSuite pSuite) {
+	if (liblinphone_tester_use_log_file) ms_warning("Suite [%s] Test [%s]", pSuite->pName,pTest->pName);
+	liblinphone_tester_fprintf(stdout,"\nSuite [%s] Test [%s]\n", pSuite->pName,pTest->pName);
+}
+static void test_suite_start_message_handler(const CU_pSuite pSuite) {
+	if (liblinphone_tester_use_log_file) ms_warning("Suite [%s]", pSuite->pName);
+	liblinphone_tester_fprintf(stdout,"\nSuite [%s]", pSuite->pName);
+}
+
 int liblinphone_tester_run_tests(const char *suite_name, const char *test_name) {
 	int i;
 	int ret;
@@ -433,6 +484,14 @@ int liblinphone_tester_run_tests(const char *suite_name, const char *test_name)
 		run_test_suite(test_suite[i]);
 	}
 
+	CU_set_test_start_handler(test_start_message_handler);
+	CU_set_test_complete_handler(test_complete_message_handler);
+	CU_set_all_test_complete_handler(test_all_tests_complete_message_handler);
+	CU_set_suite_init_failure_handler(test_suite_init_failure_message_handler);
+	CU_set_suite_cleanup_failure_handler(test_suite_cleanup_failure_message_handler);
+	CU_set_suite_start_handler(test_suite_start_message_handler);
+
+
 #if !HAVE_CU_GET_SUITE
 	if( suite_name ){
 		ms_warning("Tester compiled without CU_get_suite() function, running all tests instead of suite '%s'\n", suite_name);
@@ -440,7 +499,6 @@ int liblinphone_tester_run_tests(const char *suite_name, const char *test_name)
 #else
 	if (suite_name){
 		CU_pSuite suite;
-		CU_basic_set_mode(CU_BRM_VERBOSE);
 		suite=CU_get_suite(suite_name);
 		if (!suite) {
 			ms_error("Could not find suite '%s'. Available suites are:", suite_name);
@@ -454,11 +512,11 @@ int liblinphone_tester_run_tests(const char *suite_name, const char *test_name)
 				liblinphone_tester_list_suite_tests(suite->pName);
 				return -2;
 			} else {
-				CU_ErrorCode err= CU_basic_run_test(suite, test);
+				CU_ErrorCode err= CU_run_test(suite, test);
 				if (err != CUE_SUCCESS) ms_error("CU_basic_run_test error %d", err);
 			}
 		} else {
-			CU_basic_run_suite(suite);
+			CU_run_suite(suite);
 		}
 	}
 	else
@@ -473,8 +531,7 @@ int liblinphone_tester_run_tests(const char *suite_name, const char *test_name)
 #endif
 		{
 			/* Run all tests using the CUnit Basic interface */
-			CU_basic_set_mode(CU_BRM_VERBOSE);
-			CU_basic_run_tests();
+			CU_run_all_tests();
 		}
 	}
 
@@ -483,7 +540,7 @@ int liblinphone_tester_run_tests(const char *suite_name, const char *test_name)
 	/* Redisplay list of failed tests on end */
 	if (CU_get_number_of_failure_records()){
 		CU_basic_show_failures(CU_get_failure_list());
-		printf("\n");
+		liblinphone_tester_fprintf(stdout,"\n");
 	}
 
 	CU_cleanup_registry();