diff --git a/Globals.h b/Globals.h
index 1f4755b8fd664e13451466ef5e7daf9776fb8c1e..18766cb24ff59e4caba372dc95981c83cc464d8e 100644
--- a/Globals.h
+++ b/Globals.h
@@ -1,6 +1,15 @@
 namespace RingClientUWP
 {
 /* public enumerations. */
-public enum class CallStatus { NONE, INCOMING_RINGING, OUTGOING_RINGING, SEARCHING, IN_PROGRESS, ENDED, TERMINATING };
+public enum class CallStatus {
+    NONE,
+    INCOMING_RINGING,
+    OUTGOING_RINGING,
+    SEARCHING,
+    IN_PROGRESS,
+    PAUSED,
+    ENDED,
+    TERMINATING
+};
 
 }
\ No newline at end of file
diff --git a/MainPage.xaml.cpp b/MainPage.xaml.cpp
index 666c07cb380a2e2d8a2c492eff4eec882b23a598..96ab01177c130593040a24d5aa538726c998307b 100644
--- a/MainPage.xaml.cpp
+++ b/MainPage.xaml.cpp
@@ -295,11 +295,44 @@ MainPage::Application_VisibilityChanged(Object^ sender, VisibilityChangedEventAr
 {
     if (e->Visible) {
         WriteLine("->Visible");
-        //Video::VideoManager::instance->
+        auto isPreviewing = Video::VideoManager::instance->captureManager()->isPreviewing;
+        bool isInCall = false;
+        for (auto item : SmartPanelItemsViewModel::instance->itemsList) {
+            if (item->_callId && item->_callStatus == CallStatus::IN_PROGRESS) {
+                isInCall = true;
+                break;
+            }
+        }
+        if (isInCall) {
+            /*if (RingD::instance->currentCallId)
+                RingD::instance->unPauseCall(RingD::instance->currentCallId);*/
+            Video::VideoManager::instance->captureManager()->InitializeCameraAsync();
+            Video::VideoManager::instance->captureManager()->videoFrameCopyInvoker->Start();
+        }
     }
     else {
         WriteLine("->Invisible");
-        //Video::VideoManager::instance->captureManager()->CleanupCameraAsync();
+        auto isPreviewing = Video::VideoManager::instance->captureManager()->isPreviewing;
+        bool isInCall = false;
+        for (auto item : SmartPanelItemsViewModel::instance->itemsList) {
+            if (item->_callId && item->_callStatus == CallStatus::IN_PROGRESS) {
+                isInCall = true;
+                RingD::instance->currentCallId = item->_callId;
+                break;
+            }
+        }
+        if (isInCall) {
+            /*if (RingD::instance->currentCallId) {
+                WriteLine("Pausing call: " + RingD::instance->currentCallId);
+                RingD::instance->pauseCall(RingD::instance->currentCallId);
+            }*/
+            if (isPreviewing) {
+                Video::VideoManager::instance->captureManager()->StopPreviewAsync();
+                if (Video::VideoManager::instance->captureManager()->captureTaskTokenSource)
+                    Video::VideoManager::instance->captureManager()->captureTaskTokenSource->cancel();
+                Video::VideoManager::instance->captureManager()->videoFrameCopyInvoker->Stop();
+            }
+        }
     }
 }
 
@@ -347,11 +380,7 @@ MainPage::BeginExtendedExecution()
                 Video::VideoManager::instance->captureManager()->CleanupCameraAsync()
                     .then([](){
                     WriteLine("Hang up calls...");
-                    for (auto item : SmartPanelItemsViewModel::instance->itemsList) {
-                        if (item->_callId && item->_callStatus != CallStatus::NONE) {
-                            DRing::hangUp(Utils::toString(item->_callId));
-                        }
-                    }
+                    DRing::fini();
                 });
                 break;
 
diff --git a/RingD.cpp b/RingD.cpp
index 6a688f311342461ea4310de76585a400446bd39a..63e9a454efc6967da8f3f5581ebb0d3f1c2c3f66 100644
--- a/RingD.cpp
+++ b/RingD.cpp
@@ -204,6 +204,18 @@ void RingClientUWP::RingD::hangUpCall2(String ^ callId)
     tasksList_.push(ref new RingD::Task(Request::HangUpCall, callId));
 }
 
+void RingClientUWP::RingD::pauseCall(String ^ callId)
+{
+    MSG_("$1 pauseCall : " + Utils::toString(callId));
+    tasksList_.push(ref new RingD::Task(Request::PauseCall, callId));
+}
+
+void RingClientUWP::RingD::unPauseCall(String ^ callId)
+{
+    MSG_("$1 unPauseCall : " + Utils::toString(callId));
+    tasksList_.push(ref new RingD::Task(Request::UnPauseCall, callId));
+}
+
 void RingClientUWP::RingD::askToRefreshKnownDevices(String^ accountId)
 {
     auto task = ref new RingD::Task(Request::GetKnownDevices);
@@ -422,10 +434,6 @@ RingClientUWP::RingD::startDaemon()
             ([this](const std::string &id, const std::string &shmPath, bool isMixer) {
                 MSG_("<DecodingStopped>");
                 MSG_("Removing renderer id:" + id);
-                /*auto Id = Utils::toPlatformString(id);
-                auto renderer = Video::VideoManager::instance->rendererManager()->renderer(Id);
-                if (renderer)
-                    renderer->isRendering = false;*/
                 Video::VideoManager::instance->rendererManager()->removeRenderer(Utils::toPlatformString(id));
             })
         };
@@ -534,6 +542,7 @@ RingD::RingD()
 {
     localFolder_ = Utils::toString(ApplicationData::Current->LocalFolder->Path);
     callIdsList_ = ref new Vector<String^>();
+    currentCallId = nullptr;
 }
 
 void
@@ -583,6 +592,16 @@ RingD::dequeueTasks()
             DRing::hangUp(Utils::toString(callId));
         }
         break;
+        case Request::PauseCall:
+        {
+            DRing::hold(Utils::toString(task->_callId));
+        }
+        break;
+        case Request::UnPauseCall:
+        {
+            DRing::unhold(Utils::toString(task->_callId));
+        }
+        break;
         case Request::RegisterDevice:
         {
             auto pin = Utils::toString(_pin);
diff --git a/RingD.h b/RingD.h
index bcf6cdc123f5e453d7a5c634319359ba0de4769b..f78355bae9e9eba585d34f45a7b51505949d0bcc 100644
--- a/RingD.h
+++ b/RingD.h
@@ -90,12 +90,15 @@ internal:
     Vector<String^>^ translateKnownRingDevices(const std::map<std::string, std::string> devices);
 
     void hangUpCall2(String^ callId);
+    void pauseCall(String ^ callId);
+    void unPauseCall(String ^ callId);
     void askToRefreshKnownDevices(String^ accountId);
     void askToExportOnRing(String^ accountId, String^ password);
 
     /* TODO : move members */
     ///bool hasConfig; // replaced by startingStatus
     std::string accountName;
+    String ^ currentCallId; // to save ongoing call id during visibility change
 
     /* events */
     event IncomingCall^ incomingCall;
@@ -116,6 +119,8 @@ private:
         AcceptIncommingCall,
         CancelOutGoingCall,
         HangUpCall,
+        PauseCall,
+        UnPauseCall,
         RegisterDevice,
         GetKnownDevices,
         ExportOnRing
diff --git a/VideoPage.xaml.cpp b/VideoPage.xaml.cpp
index df268a506dd3d74881c0f23e3bc47e32c08fbe51..783f4638e6081409e729613975e4fa7bb120c3e0 100644
--- a/VideoPage.xaml.cpp
+++ b/VideoPage.xaml.cpp
@@ -208,6 +208,12 @@ void RingClientUWP::Views::VideoPage::_btnHangUp__Tapped(Platform::Object^ sende
 
 void RingClientUWP::Views::VideoPage::_btnPause__Tapped(Platform::Object^ sender, Windows::UI::Xaml::Input::TappedRoutedEventArgs^ e)
 {
+    /*auto item = SmartPanelItemsViewModel::instance->_selectedItem;
+    if (item->_callStatus == CallStatus::IN_PROGRESS)
+        RingD::instance->pauseCall(item->_callId);
+    else if (item->_callStatus == CallStatus::PAUSED)
+        RingD::instance->unPauseCall(item->_callId);*/
+
     pauseCall();
 }