diff --git a/Account.cpp b/Account.cpp
index cdbd9e2..adbecb6 100644
--- a/Account.cpp
+++ b/Account.cpp
@@ -43,7 +43,7 @@
 {
     CoreApplicationView^ view = CoreApplication::MainView;
     view->CoreWindow->Dispatcher->RunAsync(
-        CoreDispatcherPriority::Normal,
+        CoreDispatcherPriority::High,
         ref new DispatchedHandler([this, propertyName]()
     {
         PropertyChanged(this, ref new PropertyChangedEventArgs(propertyName));
diff --git a/Call.cpp b/Call.cpp
index 6cc2fe3..1854a8f 100644
--- a/Call.cpp
+++ b/Call.cpp
@@ -44,7 +44,7 @@
 {
     CoreApplicationView^ view = CoreApplication::MainView;
     view->CoreWindow->Dispatcher->RunAsync(
-        CoreDispatcherPriority::Normal,
+        CoreDispatcherPriority::High,
         ref new DispatchedHandler([this, propertyName]()
     {
         PropertyChanged(this, ref new PropertyChangedEventArgs(propertyName));
@@ -52,17 +52,18 @@
     }));
 }
 
-void RingClientUWP::Call::refuse()
-{
-    RingD::instance->refuseIncommingCall(this);
-}
-
-void RingClientUWP::Call::accept()
-{
-    RingD::instance->acceptIncommingCall(this);
-}
-
-void RingClientUWP::Call::cancel()
-{
-    RingD::instance->cancelOutGoingCall(this);
-}
+//void RingClientUWP::Call::refuse()
+//{
+//    RingD::instance->refuseIncommingCall(this);
+//}
+//
+//void RingClientUWP::Call::accept()
+//{
+//    RingD::instance->acceptIncommingCall(this);
+//}
+//
+//void RingClientUWP::Call::cancel()
+//{
+//    MSG_("!2--->> cancel");
+//    RingD::instance->cancelOutGoingCall(this);
+//}
diff --git a/Call.h b/Call.h
index dfebe21..fc96d3a 100644
--- a/Call.h
+++ b/Call.h
@@ -56,9 +56,9 @@
     void NotifyPropertyChanged(String^ propertyName);
 
 internal:
-    void refuse();
-    void accept();
-    void cancel();
+    //void refuse();
+    //void accept();
+    //void cancel();
 
 private:
     CallStatus state_;
diff --git a/CallsViewModel.h b/CallsViewModel.h
index 24ddbb0..21c68ff 100644
--- a/CallsViewModel.h
+++ b/CallsViewModel.h
@@ -44,7 +44,7 @@
     /* functions */
     Call^ addNewCall(String^ accountId, String^ callId, String^ from);
     void clearCallsList();
-    void setState(String^ callId, String^ state, int code); // used ?
+    //void setState(String^ callId, String^ state, int code); // used ?
     Call^ findCall(String^ callId);
 
     /* properties */
diff --git a/Contact.cpp b/Contact.cpp
index 155a7ff..2d94ec1 100644
--- a/Contact.cpp
+++ b/Contact.cpp
@@ -52,7 +52,7 @@
 
     String^ fileContents = Utils::toPlatformString(Utils::getStringFromFile(Utils::toString(messagesFile)));
 
-    CoreApplication::MainView->CoreWindow->Dispatcher->RunAsync(CoreDispatcherPriority::Normal,
+    CoreApplication::MainView->CoreWindow->Dispatcher->RunAsync(CoreDispatcherPriority::High,
     ref new DispatchedHandler([=]() {
         if (fileContents != nullptr)
             DestringifyConversation(fileContents);
@@ -72,7 +72,7 @@
 {
     CoreApplicationView^ view = CoreApplication::MainView;
     view->CoreWindow->Dispatcher->RunAsync(
-        CoreDispatcherPriority::Normal,
+        CoreDispatcherPriority::High,
         ref new DispatchedHandler([this, propertyName]()
     {
         PropertyChanged(this, ref new PropertyChangedEventArgs(propertyName));
diff --git a/ContactsViewModel.cpp b/ContactsViewModel.cpp
index cb98f58..067f295 100644
--- a/ContactsViewModel.cpp
+++ b/ContactsViewModel.cpp
@@ -118,7 +118,7 @@
 
     String^ fileContents = Utils::toPlatformString(Utils::getStringFromFile(Utils::toString(contactsFile)));
 
-    CoreApplication::MainView->CoreWindow->Dispatcher->RunAsync(CoreDispatcherPriority::Normal,
+    CoreApplication::MainView->CoreWindow->Dispatcher->RunAsync(CoreDispatcherPriority::High,
     ref new DispatchedHandler([=]() {
         if (fileContents != nullptr)
             Destringify(fileContents);
diff --git a/LoadingPage.xaml.cpp b/LoadingPage.xaml.cpp
index a8d24bc..ac0b6cf 100644
--- a/LoadingPage.xaml.cpp
+++ b/LoadingPage.xaml.cpp
@@ -53,13 +53,13 @@
     {
         if (config_exists) {
             RingD::instance->hasConfig = true;
-            this->Dispatcher->RunAsync(Windows::UI::Core::CoreDispatcherPriority::Normal, ref new Windows::UI::Core::DispatchedHandler([this] () {
+            this->Dispatcher->RunAsync(Windows::UI::Core::CoreDispatcherPriority::High, ref new Windows::UI::Core::DispatchedHandler([this] () {
                 this->Frame->Navigate(Windows::UI::Xaml::Interop::TypeName(MainPage::typeid));
             }));
         }
         else {
             RingD::instance->hasConfig = false;
-            this->Dispatcher->RunAsync(Windows::UI::Core::CoreDispatcherPriority::Normal, ref new Windows::UI::Core::DispatchedHandler([this] () {
+            this->Dispatcher->RunAsync(Windows::UI::Core::CoreDispatcherPriority::High, ref new Windows::UI::Core::DispatchedHandler([this] () {
                 this->Frame->Navigate(Windows::UI::Xaml::Interop::TypeName(Wizard::typeid));
             }));
         }
diff --git a/RingD.cpp b/RingD.cpp
index 38033d8..fba4158 100644
--- a/RingD.cpp
+++ b/RingD.cpp
@@ -126,6 +126,7 @@
 
 void RingClientUWP::RingD::placeCall(Contact^ contact)
 {
+    MSG_("!--->> placeCall");
     auto to = contact->ringID_;
     auto accountId = AccountsViewModel::instance->selectedAccount->accountID_;
 
@@ -134,6 +135,8 @@
 
     auto callId2 = DRing::placeCall(accountId2, to2);
 
+
+
     if (callId2 == "") {
         WNG_("call not created, the daemon didn't return a call Id");
         return;
@@ -141,6 +144,13 @@
 
     auto callId = Utils::toPlatformString(callId2);
 
+
+    //auto con = ContactsViewModel::instance->findContactByName(to);
+    auto item = SmartPanelItemsViewModel::instance->findItem(contact);
+    item->_callId = callId;
+    MSG_("$1 place call with id : " + Utils::toString(item->_callId));
+
+
     auto call = CallsViewModel::instance->addNewCall(accountId, callId, to);
     call->isOutGoing = true;
 
@@ -156,7 +166,15 @@
 void
 RingClientUWP::RingD::cancelOutGoingCall(Call^ call)
 {
-    tasksList_.push(ref new RingD::Task(Request::CancelOutGoingCall, call));
+    MSG_("1!--->> cancelOutGoingCall");
+    if (call)
+        tasksList_.push(ref new RingD::Task(Request::CancelOutGoingCall, call));
+}
+
+void RingClientUWP::RingD::cancelOutGoingCall2(String ^ callId)
+{
+    MSG_("$1 cancelOutGoingCall2 : " + Utils::toString(callId));
+    tasksList_.push(ref new RingD::Task(Request::HangUpCall, callId, 0));
 }
 
 void
@@ -165,6 +183,12 @@
     tasksList_.push(ref new RingD::Task(Request::HangUpCall, call));
 }
 
+void RingClientUWP::RingD::hangUpCall2(String ^ callId)
+{
+    MSG_("$1 hangUpCall2 : "+Utils::toString(callId));
+    tasksList_.push(ref new RingD::Task(Request::HangUpCall, callId, 0));
+}
+
 void
 RingClientUWP::RingD::startDaemon()
 {
@@ -199,10 +223,16 @@
                 from2 = Utils::TrimRingId(from2);
 
                 CoreApplication::MainView->CoreWindow->Dispatcher->RunAsync(
-                    CoreDispatcherPriority::Normal, ref new DispatchedHandler([=]()
+                    CoreDispatcherPriority::High, ref new DispatchedHandler([=]()
                 {
                     incomingCall(accountId2, callId2, from2);
                     stateChange(callId2, CallStatus::INCOMING_RINGING, 0);
+
+
+                    auto contact = ContactsViewModel::instance->findContactByName(from2);
+                    auto item = SmartPanelItemsViewModel::instance->findItem(contact);
+                    item->_callId = callId2;
+
                 }));
             }),
             DRing::exportable_callback<DRing::CallSignal::StateChange>([this](
@@ -222,7 +252,7 @@
 
 
                 CoreApplication::MainView->CoreWindow->Dispatcher->RunAsync(
-                    CoreDispatcherPriority::Low, ref new DispatchedHandler([=]()
+                    CoreDispatcherPriority::High, ref new DispatchedHandler([=]()
                 {
                     stateChange(callId2, state3, code);
                 }));
@@ -243,7 +273,7 @@
                     MSG_("payload = " + i.second);
                     auto payload = Utils::toPlatformString(i.second);
                     CoreApplication::MainView->CoreWindow->Dispatcher->RunAsync(
-                        CoreDispatcherPriority::Low, ref new DispatchedHandler([=]()
+                        CoreDispatcherPriority::High, ref new DispatchedHandler([=]()
                     {
                         incomingAccountMessage(accountId2, from2, payload);
                     }));
@@ -282,7 +312,7 @@
 
                     auto payload = Utils::toPlatformString(i.second);
                     CoreApplication::MainView->CoreWindow->Dispatcher->RunAsync(
-                        CoreDispatcherPriority::Low, ref new DispatchedHandler([=]()
+                        CoreDispatcherPriority::High, ref new DispatchedHandler([=]()
                     {
                         incomingAccountMessage(accountId2, from2, payload);
                     }));
@@ -294,7 +324,7 @@
             {
                 MSG_("<RegistrationStateChanged>: ID = " + account_id + "state = " + state);
                 if (state == DRing::Account::States::REGISTERED) {
-                    CoreApplication::MainView->CoreWindow->Dispatcher->RunAsync(CoreDispatcherPriority::Normal,
+                    CoreApplication::MainView->CoreWindow->Dispatcher->RunAsync(CoreDispatcherPriority::High,
                     ref new DispatchedHandler([=]() {
                         auto frame = dynamic_cast<Frame^>(Window::Current->Content);
                         dynamic_cast<RingClientUWP::MainPage^>(frame->Content)->showLoadingOverlay(false, false);
@@ -303,14 +333,14 @@
             }),
             DRing::exportable_callback<DRing::ConfigurationSignal::AccountsChanged>([this]()
             {
-                CoreApplication::MainView->CoreWindow->Dispatcher->RunAsync(CoreDispatcherPriority::Normal,
+                CoreApplication::MainView->CoreWindow->Dispatcher->RunAsync(CoreDispatcherPriority::High,
                 ref new DispatchedHandler([=]() {
                     reloadAccountList();
                 }));
             }),
             DRing::exportable_callback<DRing::Debug::MessageSend>([&](const std::string& toto)
             {
-                dispatcher->RunAsync(CoreDispatcherPriority::Normal,
+                dispatcher->RunAsync(CoreDispatcherPriority::High,
                 ref new DispatchedHandler([=]() {
                     RingDebug::instance->print(toto);
                 }));
@@ -359,9 +389,9 @@
         {
             DRing::exportable_callback<DRing::VideoSignal::GetCameraInfo>
             ([this](const std::string& device,
-                    std::vector<std::string> *formats,
-                    std::vector<unsigned> *sizes,
-                    std::vector<unsigned> *rates) {
+            std::vector<std::string> *formats,
+            std::vector<unsigned> *sizes,
+            std::vector<unsigned> *rates) {
                 MSG_("\n<GetCameraInfo>\n");
                 auto device_list = VideoManager::instance->captureManager()->deviceList;
 
@@ -384,7 +414,7 @@
                     std::string format,
                     const int width,
                     const int height,
-                    const int rate) {
+            const int rate) {
                 MSG_("\n<SetParameters>\n");
                 VideoManager::instance->captureManager()->activeDevice->SetDeviceProperties(
                     Utils::toPlatformString(format),width,height,rate);
@@ -392,7 +422,7 @@
             DRing::exportable_callback<DRing::VideoSignal::StartCapture>
             ([&](const std::string& device) {
                 MSG_("\n<StartCapture>\n");
-                dispatcher->RunAsync(CoreDispatcherPriority::Normal,
+                dispatcher->RunAsync(CoreDispatcherPriority::High,
                 ref new DispatchedHandler([=]() {
                     VideoManager::instance->captureManager()->InitializeCameraAsync();
                     VideoManager::instance->captureManager()->videoFrameCopyInvoker->Start();
@@ -401,7 +431,7 @@
             DRing::exportable_callback<DRing::VideoSignal::StopCapture>
             ([&]() {
                 MSG_("\n<StopCapture>\n");
-                dispatcher->RunAsync(CoreDispatcherPriority::Normal,
+                dispatcher->RunAsync(CoreDispatcherPriority::High,
                 ref new DispatchedHandler([=]() {
                     VideoManager::instance->captureManager()->StopPreviewAsync();
                     if (VideoManager::instance->captureManager()->captureTaskTokenSource)
@@ -425,7 +455,7 @@
                 tasksList_.push(ref new RingD::Task(Request::AddSIPAccount));
             }
             else {
-                CoreApplication::MainView->CoreWindow->Dispatcher->RunAsync(CoreDispatcherPriority::Normal,
+                CoreApplication::MainView->CoreWindow->Dispatcher->RunAsync(CoreDispatcherPriority::High,
                 ref new DispatchedHandler([=]() {
                     reloadAccountList();
                 }));
@@ -487,6 +517,12 @@
         case Request::CancelOutGoingCall:
         case Request::HangUpCall:
         {
+
+            MSG_("1!--->> Request::CancelOutGoingCall");
+            auto id = task->_callId;
+            DRing::hangUp(Utils::toString(id));
+            return;
+
             auto callId = task->_call->callId;
             auto callId2 = Utils::toString(callId);
             DRing::hangUp(callId2);
diff --git a/RingD.h b/RingD.h
index 06334a6..7a22790 100644
--- a/RingD.h
+++ b/RingD.h
@@ -52,6 +52,9 @@
         }
     }
 
+    void cancelOutGoingCall2(String^ callId); // marche
+
+
 internal:
     /* functions */
     void startDaemon();
@@ -63,7 +66,10 @@
     void acceptIncommingCall(Call^ call);
     void placeCall(Contact^ contact);
     void cancelOutGoingCall(Call^ call);
+    /*void cancelOutGoingCall2(String^ callId);*/ // marche pas
+
     void hangUpCall(Call^ call);
+    void hangUpCall2(String^ callId);
 
     /* TODO : move members */
     bool hasConfig;
@@ -96,9 +102,14 @@
             request = r;
             _call = c;
         }
+        Task(Request r, String^ c, int i) {
+            request = r;
+            _callId = c;
+        }
     public:
         property Request request;
         property Call^ _call;
+        property String^ _callId;
     };
 
     /* functions */
diff --git a/RingDebug.h b/RingDebug.h
index 2398085..c7cee0a 100644
--- a/RingDebug.h
+++ b/RingDebug.h
@@ -68,13 +68,13 @@
     OutputDebugString(wStringstream.str().c_str());
 }
 
-#define MSG_(cstr) CoreApplication::MainView->CoreWindow->Dispatcher->RunAsync(CoreDispatcherPriority::Low, \
+#define MSG_(cstr) CoreApplication::MainView->CoreWindow->Dispatcher->RunAsync(CoreDispatcherPriority::High, \
 ref new DispatchedHandler([=]() { RingDebug::instance->print(cstr); }))
 
-#define WNG_(cstr) CoreApplication::MainView->CoreWindow->Dispatcher->RunAsync(CoreDispatcherPriority::Low, \
+#define WNG_(cstr) CoreApplication::MainView->CoreWindow->Dispatcher->RunAsync(CoreDispatcherPriority::High, \
 ref new DispatchedHandler([=]() { RingDebug::instance->print(std::string(cstr), RingDebug::Type::WNG); }))
 
-#define ERR_(cstr) CoreApplication::MainView->CoreWindow->Dispatcher->RunAsync(CoreDispatcherPriority::Low, \
+#define ERR_(cstr) CoreApplication::MainView->CoreWindow->Dispatcher->RunAsync(CoreDispatcherPriority::High, \
 ref new DispatchedHandler([=]() { RingDebug::instance->print(std::string(cstr), RingDebug::Type::ERR); }))
 
 }
diff --git a/SmartPanel.xaml.cpp b/SmartPanel.xaml.cpp
index e091474..d1d01f5 100644
--- a/SmartPanel.xaml.cpp
+++ b/SmartPanel.xaml.cpp
@@ -108,6 +108,7 @@
 
     RingD::instance->calling += ref new RingClientUWP::Calling([&](
     Call^ call) {
+        MSG_("!--->> Calling lambda from smartpanel");
         auto from = call->from;
         auto contact = ContactsViewModel::instance->findContactByName(from);
 
@@ -124,6 +125,7 @@
         }
 
         call->state = CallStatus::SEARCHING;
+        MSG_("!--->> should be Searching");
 
         item->_call = call;
     });
@@ -321,40 +323,63 @@
 void RingClientUWP::Views::SmartPanel::_rejectIncomingCallBtn__Click(Platform::Object^ sender, Windows::UI::Xaml::RoutedEventArgs^ e)
 {
     auto button = dynamic_cast<Button^>(e->OriginalSource);
-    auto item = dynamic_cast<SmartPanelItem^>(button->DataContext);
-    auto call = item->_call;
-
-    call->refuse();
+    if (button) {
+        auto item = dynamic_cast<SmartPanelItem^>(button->DataContext);
+        if (item) {
+            auto call = item->_call;
+            if (call)
+                RingD::instance->refuseIncommingCall(call);
+            //call->refuse();
+        }
+    }
 }
 
 
 void RingClientUWP::Views::SmartPanel::_acceptIncomingCallBtn__Click(Platform::Object^ sender, Windows::UI::Xaml::RoutedEventArgs^ e)
 {
     auto button = dynamic_cast<Button^>(e->OriginalSource);
-    auto item = dynamic_cast<SmartPanelItem^>(button->DataContext);
-    auto call = item->_call;
-
-    call->accept();
+    if (button) {
+        auto item = dynamic_cast<SmartPanelItem^>(button->DataContext);
+        if (item) {
+            auto call = item->_call;
+            if (call)
+                RingD::instance->acceptIncommingCall(call);
+            //call->accept();
+        }
+    }
 }
 
 void
 SmartPanel::_callContact__Click(Platform::Object^ sender, Windows::UI::Xaml::RoutedEventArgs^ e)
 {
+    MSG_("!--->> _callContact__Click");
     auto button = dynamic_cast<Button^>(e->OriginalSource);
-    auto item = dynamic_cast<SmartPanelItem^>(button->DataContext);
-    auto contact = item->_contact;
-
-    RingD::instance->placeCall(contact);
+    if (button) {
+        auto item = dynamic_cast<SmartPanelItem^>(button->DataContext);
+        if (item) {
+            auto contact = item->_contact;
+            if (contact)
+                RingD::instance->placeCall(contact);
+        }
+    }
 }
 
 
 void RingClientUWP::Views::SmartPanel::_cancelCallBtn__Click(Platform::Object^ sender, Windows::UI::Xaml::RoutedEventArgs^ e)
 {
     auto button = dynamic_cast<Button^>(e->OriginalSource);
-    auto item = dynamic_cast<SmartPanelItem^>(button->DataContext);
-    auto call = item->_call;
+    if (button) {
+        auto item = dynamic_cast<SmartPanelItem^>(button->DataContext);
+        if (item) {
+            auto call = item->_call;
+            RingD::instance->cancelOutGoingCall2(item->_callId);
 
-    call->cancel();
+            return;
+            if (call)
+                RingD::instance->cancelOutGoingCall(call);
+            //call->cancel();
+        }
+    }
 }
 
 
diff --git a/SmartPanelItem.cpp b/SmartPanelItem.cpp
index d93b454..35c77de 100644
--- a/SmartPanelItem.cpp
+++ b/SmartPanelItem.cpp
@@ -33,6 +33,8 @@
 {
     /* create an empty call to avoid the call bar */
     _call = ref new Call("", "", "");
+    _callId = "";
+
 }
 
 void
@@ -40,7 +42,7 @@
 {
     CoreApplicationView^ view = CoreApplication::MainView;
     view->CoreWindow->Dispatcher->RunAsync(
-        CoreDispatcherPriority::Normal,
+        CoreDispatcherPriority::High,
         ref new DispatchedHandler([this, propertyName]()
     {
         PropertyChanged(this, ref new PropertyChangedEventArgs(propertyName));
diff --git a/SmartPanelItem.h b/SmartPanelItem.h
index 0803fb1..45a7e39 100644
--- a/SmartPanelItem.h
+++ b/SmartPanelItem.h
@@ -57,6 +57,8 @@
         }
     }
 
+    property String^ _callId;
+
 protected:
     void NotifyPropertyChanged(String^ propertyName);
 
diff --git a/SmartPanelItemsViewModel.h b/SmartPanelItemsViewModel.h
index 7bcdfe7..029b165 100644
--- a/SmartPanelItemsViewModel.h
+++ b/SmartPanelItemsViewModel.h
@@ -73,6 +73,7 @@
     SmartPanelItem^ currentItem_;
     SmartPanelItem^ oldItem_;
 
+
 };
 }
 }
diff --git a/UserPreferences.cpp b/UserPreferences.cpp
index c9fd121..96d3afd 100644
--- a/UserPreferences.cpp
+++ b/UserPreferences.cpp
@@ -50,7 +50,7 @@
 
     String^ fileContents = Utils::toPlatformString(Utils::getStringFromFile(Utils::toString(preferencesFile)));
 
-    CoreApplication::MainView->CoreWindow->Dispatcher->RunAsync(CoreDispatcherPriority::Normal,
+    CoreApplication::MainView->CoreWindow->Dispatcher->RunAsync(CoreDispatcherPriority::High,
     ref new DispatchedHandler([=]() {
         if (fileContents != nullptr) {
             Destringify(fileContents);
diff --git a/VideoPage.xaml.cpp b/VideoPage.xaml.cpp
index ee44f93..657d1c1 100644
--- a/VideoPage.xaml.cpp
+++ b/VideoPage.xaml.cpp
@@ -61,14 +61,14 @@
     VideoManager::instance->rendererManager()->writeVideoFrame +=
         ref new WriteVideoFrame([this](String^ id, uint8_t* buf, int width, int height)
     {
-        CoreApplication::MainView->CoreWindow->Dispatcher->RunAsync(CoreDispatcherPriority::Normal,
+        CoreApplication::MainView->CoreWindow->Dispatcher->RunAsync(CoreDispatcherPriority::High,
         ref new DispatchedHandler([=]() {
             try {
                 if (!VideoManager::instance->rendererManager()->renderers->Size)
                     return;
                 VideoManager::instance->rendererManager()->renderer(id)->isRendering = true;
                 create_task(WriteFrameAsSoftwareBitmapAsync(id, buf, width, height))
-                    .then([=](task<void> previousTask) {
+                .then([=](task<void> previousTask) {
                     try {
                         previousTask.get();
                     }
@@ -88,8 +88,8 @@
     {
         PreviewImage->Visibility = Windows::UI::Xaml::Visibility::Visible;
         PreviewImage->FlowDirection = VideoManager::instance->captureManager()->mirroringPreview ?
-            Windows::UI::Xaml::FlowDirection::RightToLeft :
-            Windows::UI::Xaml::FlowDirection::LeftToRight;
+                                      Windows::UI::Xaml::FlowDirection::RightToLeft :
+                                      Windows::UI::Xaml::FlowDirection::LeftToRight;
     });
 
     VideoManager::instance->captureManager()->stopPreviewing +=
@@ -205,8 +205,15 @@
     auto item = SmartPanelItemsViewModel::instance->_selectedItem;
     auto call = item->_call;
 
-    if (call)
-        RingD::instance->hangUpCall(call);
+    /*if (call)
+        RingD::instance->hangUpCall(call);*/
+
+    if (item->_callId != "") {
+        MSG_("$1 item->callid != vide ");
+        RingD::instance->hangUpCall2(item->_callId);
+        item->_callId = "";
+    }
+
     pressHangUpCall();
 }
 
@@ -325,7 +332,7 @@
 
     auto sbSource = ref new Media::Imaging::SoftwareBitmapSource();
     return create_task(sbSource->SetBitmapAsync(frame))
-        .then([this, sbSource]()
+           .then([this, sbSource]()
     {
         try {
             IncomingVideoImage->Source = sbSource;
diff --git a/Wizard.xaml.cpp b/Wizard.xaml.cpp
index b706b59..13c9556 100644
--- a/Wizard.xaml.cpp
+++ b/Wizard.xaml.cpp
@@ -38,7 +38,7 @@
     std::string str(wstr.begin(), wstr.end());
     RingD::instance->hasConfig = false;
     RingD::instance->accountName = std::string(wstr.begin(), wstr.end());
-    this->Dispatcher->RunAsync(Windows::UI::Core::CoreDispatcherPriority::Normal, ref new Windows::UI::Core::DispatchedHandler([this] () {
+    this->Dispatcher->RunAsync(Windows::UI::Core::CoreDispatcherPriority::High, ref new Windows::UI::Core::DispatchedHandler([this] () {
         this->Frame->Navigate(Windows::UI::Xaml::Interop::TypeName(RingClientUWP::MainPage::typeid));
     }));
 }
diff --git a/pch.h b/pch.h
index 7a002b4..20d873b 100644
--- a/pch.h
+++ b/pch.h
@@ -26,6 +26,7 @@
 #include <sstream>
 #include <string>
 
+
 /* required by generated headers. */
 #include "App.xaml.h"
 #include "Account.h"
