diff --git a/Event.cpp b/Event.cpp
index fab2995e31f051cddc3b42b948b4f497cc18472b..f722cb249dd0185a3b8394da413cd3e5792e0cc1 100644
--- a/Event.cpp
+++ b/Event.cpp
@@ -72,11 +72,11 @@ EventData& EventData::operator=(const EventData& src)
 {
     this->double_start = src.double_start;
     this->start = src.start;
-    this->elapsed_time = 0.0; 
-    this->count = 0;
+    this->elapsed_time = src.elapsed_time; 
+    this->count = src.count;
     // this->ifCUDA = 0;
     this->event_name = src.event_name;
-    this->ifStart = false, this->ifEnd = false;
+    this->ifStart = src.ifStart, this->ifEnd = src.ifEnd;
     this->if_mode_set = src.if_mode_set;
     this->ifCUDAinit = src.ifCUDAinit;
 
@@ -84,8 +84,11 @@ EventData& EventData::operator=(const EventData& src)
     this->mode = src.mode;
 
     #ifdef INCLUDE_GPU_TIMER
+        this->InitEventsCUDA();
         this->gpu_start = src.gpu_start;
         this->gpu_end   = src.gpu_end;
+
+        // printf("Copied %e, ori %e\n", Ellapsed(this->gpu_start, this->gpu_end), Ellapsed(src.gpu_start, src.gpu_end));
     #endif
 
     return *this;
diff --git a/Jikan.h b/Jikan.h
index a005d4ba4032949c100d801d7a4676af1d8c368a..8c9c792a790139d00ff241299c86c89719441ad5 100644
--- a/Jikan.h
+++ b/Jikan.h
@@ -1,7 +1,7 @@
 #pragma once
 
 //------------------------- Jikan-config ---------------------------------------------
-//#define TIMER_ON
+#define TIMER_ON
 #define INCLUDE_GPU_TIMER
 #define INCLUDE_MPI
 // #define INCLUDE_OPEN_MP
diff --git a/JikanDepths.cpp b/JikanDepths.cpp
index 5c6de17e62a25ae27da93053ecc316988ece0564..7198133a3efddaab60bb00c7ceb3c140233cdb78 100644
--- a/JikanDepths.cpp
+++ b/JikanDepths.cpp
@@ -93,15 +93,6 @@ void Jikan::JikanStart(const string& name, const int& mode)
     bool ExistFlag, ifMPI, ifOpenMP;
     ExistFlag = this->ifContains(name);
 
-    #ifdef INCLUDE_OPEN_MP
-    #pragma omp master
-    {
-    #endif
-        (this->Events)[name].ifStart = true;
-    #ifdef INCLUDE_OPEN_MP
-    }
-    #endif
-
     if(!ExistFlag)
     {
         #ifdef INCLUDE_OPEN_MP
@@ -114,6 +105,18 @@ void Jikan::JikanStart(const string& name, const int& mode)
         }
         #endif
     }
+
+    #ifdef INCLUDE_OPEN_MP
+    #pragma omp master
+    {
+    #endif
+        (this->Events)[name].ifStart = true;
+        // printf("(this->Events)[name].ifStart = %d\n", (this->Events)[name].ifStart);
+    #ifdef INCLUDE_OPEN_MP
+    }
+    #endif
+
+    // printf("118 (this->Events)[name].ifStart = %d\n", (this->Events)[name].ifStart);
     // else
     // {
     //     bool ifStart = (this->Events)[name].ifStart;
@@ -165,10 +168,14 @@ void Jikan::JikanStart(const string& name, const int& mode)
     #pragma omp master
     {
     #endif
+        // printf("170 (this->Events)[name].ifStart = %d\n", (this->Events)[name].ifStart);
         this->StartEvent(name);
+        // printf("(this->Events)[name].ifStart = %d\n", (this->Events)[name].ifStart);
      #ifdef INCLUDE_OPEN_MP
     }
     #endif
+
+    // printf("177 (this->Events)[name].ifStart = %d\n", (this->Events)[name].ifStart);
 }
 
 void Jikan::JikanEnd(const string& name)
@@ -179,11 +186,16 @@ void Jikan::JikanEnd(const string& name)
     ExistFlag = this->ifContains(name);
     ifStart = (this->Events)[name].ifStart;
 
+    // printf("JikanEnd\n");
+
     if((!ExistFlag) || (!ifStart))
+    {
+        // printf("ExistFlag = %d, ifStart = %d\n", ExistFlag, ifStart);
         return;
+    }
 
     ifMPI = (this->Events)[name].mode[0], ifOpenMP = (this->Events)[name].mode[1], ifCUDA = (this->Events)[name].mode[2];
-
+    // printf("JikanEnd:: ifCUDA = %d\n", ifCUDA);
     #ifdef INCLUDE_OPEN_MP
     #pragma omp master
     {
@@ -216,13 +228,12 @@ void Jikan::JikanEnd(const string& name)
         if(ifMPI)
             this->BarrierMPI();
 
-        (this->Events)[name].ifStart = false;
-
         this->EndEvent(name);
     #ifdef INCLUDE_OPEN_MP
     }
     #endif
     //---------------------------------------------------------------------------------------
+    (this->Events)[name].ifStart = false;
 }
 
 void Jikan::GenerateTypedOutputData(const string& EventType, string& EventTypeString)
@@ -299,6 +310,7 @@ void Jikan::StartEvent(const string& name)
     if((ifCUDA))
     {
         #ifdef INCLUDE_GPU_TIMER
+            // printf("StartCUDASync\n");
             this->StartCUDASync(name);
         #endif
     }
@@ -319,6 +331,7 @@ void Jikan::EndEvent(const string& name)
     if((ifCUDA))
     {
         #ifdef INCLUDE_GPU_TIMER
+            // printf("EndCUDASync\n");
             this->EndCUDASync(name);
         #endif
     }
diff --git a/ToJSON.cpp b/ToJSON.cpp
index 8241654fd09287e84d8688852c049017fa1e942e..828d45800177b681581fa2fe46a538ee6235bea9 100644
--- a/ToJSON.cpp
+++ b/ToJSON.cpp
@@ -2,6 +2,7 @@
 #include "Event.h"
 
 #include <fstream>
+#include <sstream>
 
 using namespace std;
 
@@ -35,37 +36,45 @@ string JSON::StartTypedBlock(const string& name)
     return row;
 }
 
-bool JSON::GenerateRow(EventData Event, string &ResRow, const string& EndRowJSON)
+string Number2String(const double Val)
 {
-    string EventModeName = JSON::StartSubRow("Event mode") + "\"" + Event.GetEventModeName() + "\"" + JSON::SeparateSubRows;
-
-    char AccurateValue[256]; 
-    sprintf(AccurateValue, "%.10e", Event.elapsed_time);
+    ostringstream StrTSValue;
+    StrTSValue << Val << scientific;
+    string NumberAsString = StrTSValue.str();
 
-    string FullElapsedTime = JSON::StartSubRow(string("Full elapsed time")) + string(AccurateValue) + JSON::SeparateSubRows;
+    return NumberAsString;
+}
 
-    AccurateValue[0] = '\0';
+bool JSON::GenerateRow(EventData Event, string &ResRow, const string& EndRowJSON)
+{
+    string EventModeName = JSON::StartSubRow("Event mode") + "\"" + Event.GetEventModeName() + "\"" + JSON::SeparateSubRows;
+    string FullElapsedTime = JSON::StartSubRow(string("Full elapsed time")) + Number2String(Event.elapsed_time) + JSON::SeparateSubRows;
 
     double mean_elapsed = Event.GetMeanElapsedTime();
-    sprintf(AccurateValue, "%.10e", mean_elapsed);
-    string MeanElapsedTime = JSON::StartSubRow(string("Mean elapsed time")) + string(AccurateValue) + JSON::SeparateSubRows;
+    string MeanElapsedTime = JSON::StartSubRow(string("Mean elapsed time")) + Number2String(mean_elapsed) + JSON::SeparateSubRows;
     string TimeSeries = JSON::StartSubRow(string("Time series")) + "[";
 
     int TimeSeriesLen = Event.time_series.size();
     for (int i = 0; i < TimeSeriesLen - 1; i++)
     {
-        AccurateValue[0] = '\0';
-        sprintf(AccurateValue, "%.10e", Event.time_series[i]);
-        TimeSeries += string(AccurateValue) + ", ";
+        // ostringstream StrTSValue;
+        // StrTSValue << Event.time_series[i];
+        // string strObj = StrTSValue.str();
+        // // printf("Event.time_series[i] = %e, AccurateValue %s\n", Event.time_series[i], AccurateValue);
+        // TimeSeries += strObj + ", ";
+
+        TimeSeries += Number2String(Event.time_series[i]) + ", ";
     }
 
     if(TimeSeriesLen != 0)
     {
-        AccurateValue[0] = '\0';
-        sprintf(AccurateValue, "%.10e", Event.time_series[TimeSeriesLen - 1]);
-        TimeSeries += string(AccurateValue);
+        // ostringstream StrTSValue;
+        // StrTSValue << Event.time_series[TimeSeriesLen - 1];
+        // string strObj = StrTSValue.str();
+        TimeSeries += Number2String(Event.time_series[TimeSeriesLen - 1]);
     }
     TimeSeries += "]" ;
+    // printf("TimeSeries %s\n", TimeSeries.c_str());
 
     string JSONrow = JSON::StartSubRow(Event.event_name) + "{" + EventModeName + FullElapsedTime + MeanElapsedTime + TimeSeries + EndRowJSON;
     
@@ -77,7 +86,7 @@ bool JSON::GenerateRow(EventData Event, string &ResRow, const string& EndRowJSON
 bool JSON::WriteOutput(const string& Filename, const string& OutputData)
 {
     ofstream file;
-    file.open(Filename);
+    file.open(Filename.c_str(), ios::out);
 
     if (!file) 
     {
@@ -87,7 +96,10 @@ bool JSON::WriteOutput(const string& Filename, const string& OutputData)
     }
 
     file << OutputData;
+    // file.write((char *)&OutputData, sizeof(string));
     file.close();
 
+    // printf("OutputData %s\n", OutputData.c_str());
+
     return true;
 }