diff --git a/MainPage.xaml.cpp b/MainPage.xaml.cpp
index 96ab01177c130593040a24d5aa538726c998307b..6d025ff73eea5251cea89f2f394bc2243d8a01e8 100644
--- a/MainPage.xaml.cpp
+++ b/MainPage.xaml.cpp
@@ -51,6 +51,9 @@ MainPage::MainPage()
 {
     InitializeComponent();
 
+
+
+
     Window::Current->SizeChanged += ref new WindowSizeChangedEventHandler(this, &MainPage::OnResize);
 
     _welcomeFrame_->Navigate(TypeName(RingClientUWP::Views::WelcomePage::typeid));
@@ -73,11 +76,11 @@ MainPage::MainPage()
                        Platform::Object^>(this, &MainPage::DisplayProperties_DpiChanged));
 
     visibilityChangedEventToken = Window::Current->VisibilityChanged +=
-        ref new WindowVisibilityChangedEventHandler(this, &MainPage::Application_VisibilityChanged);
+                                      ref new WindowVisibilityChangedEventHandler(this, &MainPage::Application_VisibilityChanged);
     applicationSuspendingEventToken = Application::Current->Suspending +=
-        ref new SuspendingEventHandler(this, &MainPage::Application_Suspending);
+                                          ref new SuspendingEventHandler(this, &MainPage::Application_Suspending);
     applicationResumingEventToken = Application::Current->Resuming +=
-        ref new EventHandler<Object^>(this, &MainPage::Application_Resuming);
+                                        ref new EventHandler<Object^>(this, &MainPage::Application_Resuming);
 }
 
 void
@@ -123,6 +126,7 @@ RingClientUWP::MainPage::OnNavigatedTo(NavigationEventArgs ^ e)
 {
     RingD::instance->startDaemon();
     showLoadingOverlay(true, false);
+
 }
 
 void
@@ -263,27 +267,27 @@ void RingClientUWP::MainPage::OnstateChange(Platform::String ^callId, RingClient
 void
 MainPage::Application_Suspending(Object^, Windows::ApplicationModel::SuspendingEventArgs^ e)
 {
-    WriteLine("Application_Suspending");
+    RingDebug::instance->WriteLine("Application_Suspending");
     if (Frame->CurrentSourcePageType.Name ==
             Interop::TypeName(MainPage::typeid).Name) {
         auto deferral = e->SuspendingOperation->GetDeferral();
         BeginExtendedExecution()
-            .then([=](task<void> previousTask) {
+        .then([=](task<void> previousTask) {
             try {
                 previousTask.get();
             }
             catch (Exception^ e) {
-                WriteLine("Exception: Extended Execution Begin");
+                RingDebug::instance->WriteLine("Exception: Extended Execution Begin");
             }
         })
-            .then([this, deferral](task<void> previousTask) {
+        .then([this, deferral](task<void> previousTask) {
             try {
                 previousTask.get();
-                WriteLine("deferral->Complete()");
+                RingDebug::instance->WriteLine("deferral->Complete()");
                 deferral->Complete();
             }
             catch (Exception^ e) {
-                WriteLine("Exception: Extended Execution");
+                RingDebug::instance->WriteLine("Exception: Extended Execution");
                 deferral->Complete();
             }
         });
@@ -294,7 +298,7 @@ void
 MainPage::Application_VisibilityChanged(Object^ sender, VisibilityChangedEventArgs^ e)
 {
     if (e->Visible) {
-        WriteLine("->Visible");
+        RingDebug::instance->WriteLine("->Visible");
         auto isPreviewing = Video::VideoManager::instance->captureManager()->isPreviewing;
         bool isInCall = false;
         for (auto item : SmartPanelItemsViewModel::instance->itemsList) {
@@ -311,7 +315,7 @@ MainPage::Application_VisibilityChanged(Object^ sender, VisibilityChangedEventAr
         }
     }
     else {
-        WriteLine("->Invisible");
+        RingDebug::instance->WriteLine("->Invisible");
         auto isPreviewing = Video::VideoManager::instance->captureManager()->isPreviewing;
         bool isInCall = false;
         for (auto item : SmartPanelItemsViewModel::instance->itemsList) {
@@ -338,7 +342,7 @@ MainPage::Application_VisibilityChanged(Object^ sender, VisibilityChangedEventAr
 
 void MainPage::Application_Resuming(Object^, Object^)
 {
-    WriteLine("Application_Resuming");
+    RingDebug::instance->WriteLine("Application_Resuming");
 }
 
 void
@@ -353,7 +357,7 @@ void
 MainPage::ClearExtendedExecution()
 {
     if (session != nullptr) {
-        WriteLine("End Extended Execution");
+        RingDebug::instance->WriteLine("End Extended Execution");
         session->Revoked -= sessionRevokedToken;
     }
 }
@@ -367,31 +371,31 @@ MainPage::BeginExtendedExecution()
     newSession->Reason = ExtendedExecutionReason::SavingData;
     newSession->Description = "Extended Execution";
     sessionRevokedToken = (newSession->Revoked += ref new TypedEventHandler<Object^,
-        ExtendedExecutionRevokedEventArgs^>(this, &MainPage::SessionRevoked));
+                           ExtendedExecutionRevokedEventArgs^>(this, &MainPage::SessionRevoked));
     return create_task(newSession->RequestExtensionAsync())
-        .then([=](ExtendedExecutionResult result){
+    .then([=](ExtendedExecutionResult result) {
         try {
             switch (result)
             {
             case ExtendedExecutionResult::Allowed:
                 session = newSession;
-                WriteLine("Request Extended Execution Allowed");
-                WriteLine("Clean up camera...");
+                RingDebug::instance->WriteLine("Request Extended Execution Allowed");
+                RingDebug::instance->WriteLine("Clean up camera...");
                 Video::VideoManager::instance->captureManager()->CleanupCameraAsync()
-                    .then([](){
-                    WriteLine("Hang up calls...");
+                .then([]() {
+                    RingDebug::instance->WriteLine("Hang up calls...");
                     DRing::fini();
                 });
                 break;
 
-                default:
+            default:
             case ExtendedExecutionResult::Denied:
-                WriteLine("Request Extended Execution Denied");
+                RingDebug::instance->WriteLine("Request Extended Execution Denied");
                 break;
             }
         }
         catch (Exception^ e) {
-            WriteLine("Exception: Extended Execution Request");
+            RingDebug::instance->WriteLine("Exception: Extended Execution Request");
         }
     });
 }
\ No newline at end of file
diff --git a/RingDebug.cpp b/RingDebug.cpp
index c5475b263fd1d4424e05c71ffb883963e23c71f2..2524ff0697d577be8a924acc64c12e05fdfce081 100644
--- a/RingDebug.cpp
+++ b/RingDebug.cpp
@@ -56,7 +56,18 @@ RingDebug::print(const std::string& message,
     /* fire the event. */
     auto line = ref new String(wString.c_str(), wString.length());
     messageToScreen(line);
-    FileIO::AppendTextAsync(_logFile, line+"\n");
+    FileIO::AppendTextAsync(_logFile, line + "\n");
+}
+
+void RingClientUWP::RingDebug::WriteLine(String^ str)
+{
+    /* save in file */
+    FileIO::AppendTextAsync(_videoFile, str + "\n");
+
+    /* screen in visual studio console */
+    std::wstringstream wStringstream;
+    wStringstream << str->Data() << "\n";
+    OutputDebugString(wStringstream.str().c_str());
 }
 
 RingClientUWP::RingDebug::RingDebug()
@@ -70,5 +81,10 @@ RingClientUWP::RingDebug::RingDebug()
         this->_logFile = file;
     });
 
+    task<StorageFile^>(storageFolder->CreateFileAsync("video.log", CreationCollisionOption::ReplaceExisting)).then([this](StorageFile^ file)
+    {
+        this->_videoFile = file;
+    });
+
 }
 
diff --git a/RingDebug.h b/RingDebug.h
index 61e0c2d58cd0d76c20c6cb7beda53bb06274629c..20467badd281a746ba0847328eabcbe86f0a42e1 100644
--- a/RingDebug.h
+++ b/RingDebug.h
@@ -43,6 +43,7 @@ public:
     }
 
     property StorageFile^ _logFile;
+    property StorageFile^ _videoFile;
 
     /* properties */
 
@@ -51,6 +52,8 @@ internal:
     enum class Type { MSG, WNG, ERR };
     void print(const std::string& message, const Type& type = Type::MSG);
 
+    void WriteLine(String^ str);
+
     /* event */
     event debugMessageToScreen^ messageToScreen;
 
diff --git a/Video.cpp b/Video.cpp
index 84ad568d15827ba868382daf3428df16dd1e9108..e9e71a06ffdcc80b1edd8182946b3a0a7f4c70af 100644
--- a/Video.cpp
+++ b/Video.cpp
@@ -145,7 +145,7 @@ Resolution::Resolution(Video::Size^ size):
 String^
 Resolution::name()
 {
-   return size()->width().ToString() + "x" + size()->height().ToString();
+    return size()->width().ToString() + "x" + size()->height().ToString();
 }
 
 Rate^
@@ -193,12 +193,12 @@ Resolution::setFormat(String^ format)
 bool
 Resolution::setActiveRate(Rate^ rate)
 {
-   if (m_currentRate == rate)
-      return false;
+    if (m_currentRate == rate)
+        return false;
 
-   m_currentRate = rate;
-   // set camera device rate here
-   return true;
+    m_currentRate = rate;
+    // set camera device rate here
+    return true;
 }
 
 /************************************************************
@@ -222,7 +222,7 @@ Device::id()
 Vector<Channel^>^
 Device::channelList()
 {
-   return m_channels;
+    return m_channels;
 }
 
 String^
@@ -261,7 +261,7 @@ bool
 Device::isActive()
 {
     return false;
-   //return Video::DeviceModel::instance().activeDevice() == this;
+    //return Video::DeviceModel::instance().activeDevice() == this;
 }
 
 void
@@ -270,12 +270,12 @@ Device::SetDeviceProperties(String^ format, int width, int height, int rate)
     auto rl = m_currentChannel->resolutionList();
     for (auto res : rl) {
         if (res->format() == format &&
-            res->size()->width() == width &&
-            res->size()->height() == height &&
-            res->activeRate()->value() == rate)
+                res->size()->width() == width &&
+                res->size()->height() == height &&
+                res->activeRate()->value() == rate)
         {
             m_currentChannel->setCurrentResolution(res);
-            WriteLine("SetDeviceProperties");
+            RingDebug::instance->WriteLine("SetDeviceProperties");
             return;
         }
     }
diff --git a/VideoCaptureManager.cpp b/VideoCaptureManager.cpp
index 85be407d427f45dca85bd6eca5922bdd8d8c0941..5f7d8742f655ac5016312ff1c8e7751a87ecda8a 100644
--- a/VideoCaptureManager.cpp
+++ b/VideoCaptureManager.cpp
@@ -42,7 +42,9 @@ VideoCaptureManager::VideoCaptureManager():
     , mirroringPreview(false)
     , displayOrientation(DisplayOrientations::Portrait)
     , displayRequest(ref new Windows::System::Display::DisplayRequest())
-    , RotationKey({ 0xC380465D, 0x2271, 0x428C,{ 0x9B, 0x83, 0xEC, 0xEA, 0x3B, 0x4A, 0x85, 0xC1 } })
+    , RotationKey( {
+    0xC380465D, 0x2271, 0x428C, { 0x9B, 0x83, 0xEC, 0xEA, 0x3B, 0x4A, 0x85, 0xC1 }
+})
 {
     deviceList = ref new Vector<Device^>();
     InitializeCopyFrameDispatcher();
@@ -58,10 +60,10 @@ VideoCaptureManager::getSettings(String^ device)
 void
 VideoCaptureManager::MediaCapture_Failed(Capture::MediaCapture^, Capture::MediaCaptureFailedEventArgs^ errorEventArgs)
 {
-    WriteLine("MediaCapture_Failed");
+    RingDebug::instance->WriteLine("MediaCapture_Failed");
     std::wstringstream ss;
     ss << "MediaCapture_Failed: 0x" << errorEventArgs->Code << ": " << errorEventArgs->Message->Data();
-    WriteLine(ref new String(ss.str().c_str()));
+    RingDebug::instance->WriteLine(ref new String(ss.str().c_str()));
 
     if (captureTaskTokenSource)
         captureTaskTokenSource->cancel();
@@ -71,7 +73,7 @@ VideoCaptureManager::MediaCapture_Failed(Capture::MediaCapture^, Capture::MediaC
 task<void>
 VideoCaptureManager::CleanupCameraAsync()
 {
-    WriteLine("CleanupCameraAsync");
+    RingDebug::instance->WriteLine("CleanupCameraAsync");
 
     std::vector<task<void>> taskList;
 
@@ -87,7 +89,7 @@ VideoCaptureManager::CleanupCameraAsync()
     }
 
     return when_all(taskList.begin(), taskList.end())
-        .then([this]()
+           .then([this]()
     {
         if (mediaCapture.Get() != nullptr)
         {
@@ -105,18 +107,18 @@ VideoCaptureManager::EnumerateWebcamsAsync()
     deviceList->Clear();
 
     return create_task(DeviceInformation::FindAllAsync(DeviceClass::VideoCapture))
-        .then([this](task<DeviceInformationCollection^> findTask)
+           .then([this](task<DeviceInformationCollection^> findTask)
     {
         try {
             devInfoCollection = findTask.get();
             if (devInfoCollection == nullptr || devInfoCollection->Size == 0) {
-                WriteLine("No WebCams found.");
+                RingDebug::instance->WriteLine("No WebCams found.");
             }
             else {
                 for (unsigned int i = 0; i < devInfoCollection->Size; i++) {
                     AddVideoDevice(i);
                 }
-                WriteLine("Enumerating Webcams completed successfully.");
+                RingDebug::instance->WriteLine("Enumerating Webcams completed successfully.");
             }
         }
         catch (Platform::Exception^ e) {
@@ -128,20 +130,20 @@ VideoCaptureManager::EnumerateWebcamsAsync()
 task<void>
 VideoCaptureManager::StartPreviewAsync()
 {
-    WriteLine("StartPreviewAsync");
+    RingDebug::instance->RingDebug::instance->WriteLine("StartPreviewAsync");
     displayRequest->RequestActive();
 
     auto sink = getSink();
     sink->Source = mediaCapture.Get();
 
     return create_task(mediaCapture->StartPreviewAsync())
-        .then([this](task<void> previewTask)
+           .then([this](task<void> previewTask)
     {
         try {
             previewTask.get();
             isPreviewing = true;
             startPreviewing();
-            WriteLine("StartPreviewAsync DONE");
+            RingDebug::instance->WriteLine("StartPreviewAsync DONE");
         }
         catch (Exception ^e) {
             WriteException(e);
@@ -152,21 +154,21 @@ VideoCaptureManager::StartPreviewAsync()
 task<void>
 VideoCaptureManager::StopPreviewAsync()
 {
-    WriteLine("StopPreviewAsync");
+    RingDebug::instance->WriteLine("StopPreviewAsync");
 
     if (captureTaskTokenSource)
         captureTaskTokenSource->cancel();
 
     if (mediaCapture.Get()) {
         return create_task(mediaCapture->StopPreviewAsync())
-            .then([this](task<void> stopTask)
+               .then([this](task<void> stopTask)
         {
             try {
                 stopTask.get();
                 isPreviewing = false;
                 stopPreviewing();
                 displayRequest->RequestRelease();
-                WriteLine("StopPreviewAsync DONE");
+                RingDebug::instance->WriteLine("StopPreviewAsync DONE");
             }
             catch (Exception ^e) {
                 WriteException(e);
@@ -174,14 +176,14 @@ VideoCaptureManager::StopPreviewAsync()
         });
     }
     else {
-        return create_task([](){});
+        return create_task([]() {});
     }
 }
 
 task<void>
 VideoCaptureManager::InitializeCameraAsync()
 {
-    WriteLine("InitializeCameraAsync");
+    RingDebug::instance->WriteLine("InitializeCameraAsync");
 
     if (captureTaskTokenSource)
         captureTaskTokenSource->cancel();
@@ -191,27 +193,27 @@ VideoCaptureManager::InitializeCameraAsync()
     auto devInfo = devInfoCollection->GetAt(0); //preferences - video capture device
 
     mediaCaptureFailedEventToken = mediaCapture->Failed +=
-        ref new Capture::MediaCaptureFailedEventHandler(this, &VideoCaptureManager::MediaCapture_Failed);
+                                       ref new Capture::MediaCaptureFailedEventHandler(this, &VideoCaptureManager::MediaCapture_Failed);
 
     if (devInfo == nullptr)
-        return create_task([](){});
+        return create_task([]() {});
 
     auto settings = ref new MediaCaptureInitializationSettings();
     settings->VideoDeviceId = devInfo->Id;
 
     return create_task(mediaCapture->InitializeAsync(settings))
-        .then([this](task<void> initTask)
+           .then([this](task<void> initTask)
     {
         try {
             initTask.get();
             SetCaptureSettings();
             isInitialized = true;
-            WriteLine("InitializeCameraAsync DONE");
+            RingDebug::instance->WriteLine("InitializeCameraAsync DONE");
             return StartPreviewAsync();
         }
         catch (Exception ^e) {
             WriteException(e);
-            return create_task([](){});
+            return create_task([]() {});
         }
     });
 }
@@ -219,7 +221,7 @@ VideoCaptureManager::InitializeCameraAsync()
 void
 VideoCaptureManager::AddVideoDevice(uint8_t index)
 {
-    WriteLine("GetDeviceCaps " + index.ToString());
+    RingDebug::instance->WriteLine("GetDeviceCaps " + index.ToString());
     Platform::Agile<Windows::Media::Capture::MediaCapture^> mc;
     mc = ref new MediaCapture();
 
@@ -232,7 +234,7 @@ VideoCaptureManager::AddVideoDevice(uint8_t index)
     settings->VideoDeviceId = devInfo->Id;
 
     create_task(mc->InitializeAsync(settings))
-        .then([=](task<void> initTask)
+    .then([=](task<void> initTask)
     {
         try {
             initTask.get();
@@ -254,9 +256,9 @@ VideoCaptureManager::AddVideoDevice(uint8_t index)
                 String^ format = vidprops->Subtype;
                 resolution->setFormat(format);
                 channel->resolutionList()->Append(resolution);
-                WriteLine(devInfo->Name + " "
-                    + width.ToString() + "x" + height.ToString()
-                    + " " + frame_rate.ToString() + "FPS" + " " + format);
+                RingDebug::instance->WriteLine(devInfo->Name + " "
+                                               + width.ToString() + "x" + height.ToString()
+                                               + " " + frame_rate.ToString() + "FPS" + " " + format);
             }
             device->channelList()->Append(channel);
             device->setCurrentChannel(device->channelList()->GetAt(0));
@@ -277,7 +279,7 @@ VideoCaptureManager::AddVideoDevice(uint8_t index)
             }
             this->deviceList->Append(device);
             this->activeDevice = deviceList->GetAt(0);
-            WriteLine("GetDeviceCaps DONE");
+            RingDebug::instance->WriteLine("GetDeviceCaps DONE");
             DRing::addVideoDevice(Utils::toString(device->name()));
         }
         catch (Platform::Exception^ e) {
@@ -302,7 +304,7 @@ VideoCaptureManager::InitializeCopyFrameDispatcher()
         isRendering = false;
     }
     catch (Exception^ e) {
-        WriteLine(e->ToString());
+        RingDebug::instance->WriteLine(e->ToString());
     }
 }
 
@@ -314,7 +316,7 @@ VideoCaptureManager::CopyFrame(Object^ sender, Object^ e)
             create_task(VideoCaptureManager::CopyFrameAsync());
         }
         catch(Platform::COMException^ e) {
-            WriteLine(e->ToString());
+            RingDebug::instance->WriteLine(e->ToString());
         }
     }
 }
@@ -334,7 +336,7 @@ VideoCaptureManager::CopyFrameAsync()
             captureTaskTokenSource = new cancellation_token_source();
         }
         return create_task(mediaCapture->GetPreviewFrameAsync(videoFrame), captureTaskTokenSource->get_token())
-            .then([this](VideoFrame^ currentFrame)
+               .then([this](VideoFrame^ currentFrame)
         {
             try {
                 isRendering = true;
@@ -347,7 +349,7 @@ VideoCaptureManager::CopyFrameAsync()
 
                     Microsoft::WRL::ComPtr<IMemoryBufferByteAccess> byteAccess;
                     if (SUCCEEDED(reinterpret_cast<IUnknown*>(reference)->QueryInterface(
-                        IID_PPV_ARGS(&byteAccess)))) {
+                                      IID_PPV_ARGS(&byteAccess)))) {
                         byte* data;
                         unsigned capacity;
                         byteAccess->GetBuffer(&data, &capacity);
@@ -360,7 +362,7 @@ VideoCaptureManager::CopyFrameAsync()
                             for (int row = 0; row < desc.Height; row++) {
                                 for (int col = 0; col < desc.Width; col++) {
                                     auto currPixel = desc.StartIndex + desc.Stride * row
-                                        + BYTES_PER_PIXEL * col;
+                                                     + BYTES_PER_PIXEL * col;
                                     buf[currPixel + 0] = data[currPixel + 0];
                                     buf[currPixel + 1] = data[currPixel + 1];
                                     buf[currPixel + 2] = data[currPixel + 2];
@@ -377,7 +379,7 @@ VideoCaptureManager::CopyFrameAsync()
 
             }
             catch (Exception^ e) {
-                WriteLine("failed to copy frame to daemon's buffer");
+                RingDebug::instance->WriteLine("failed to copy frame to daemon's buffer");
             }
         }).then([=](task<void> previousTask) {
             try {
@@ -385,7 +387,7 @@ VideoCaptureManager::CopyFrameAsync()
                 isRendering = false;
             }
             catch (Platform::Exception^ e) {
-                WriteLine( "Caught exception from previous task.\n" );
+                RingDebug::instance->WriteLine( "Caught exception from previous task.\n" );
             }
         });
     }
@@ -407,5 +409,5 @@ VideoCaptureManager::SetCaptureSettings()
     vp->Subtype = res->format();
     auto encodingProperties = static_cast<IMediaEncodingProperties^>(vp);
     create_task(mediaCapture->VideoDeviceController->SetMediaStreamPropertiesAsync(
-        MediaStreamType::VideoPreview, encodingProperties));
+                    MediaStreamType::VideoPreview, encodingProperties));
 }
\ No newline at end of file
diff --git a/VideoPage.xaml.cpp b/VideoPage.xaml.cpp
index 783f4638e6081409e729613975e4fa7bb120c3e0..99a1a3cb866f71aa2d1a3283a898fb773b6a99eb 100644
--- a/VideoPage.xaml.cpp
+++ b/VideoPage.xaml.cpp
@@ -73,12 +73,12 @@ VideoPage::VideoPage()
                         previousTask.get();
                     }
                     catch (Platform::Exception^ e) {
-                        WriteLine( "Caught exception from previous task.\n" );
+                        RingDebug::instance->WriteLine( "Caught exception from previous task.\n" );
                     }
                 });
             }
             catch(Platform::COMException^ e) {
-                WriteLine(e->ToString());
+                RingDebug::instance->WriteLine(e->ToString());
             }
         }));
     });