diff --git a/RingConsolePanel.xaml.cpp b/RingConsolePanel.xaml.cpp
index 1976dc2bf392a00bfab76f2cc841ceacebde3ca4..18292d198b0f9b5f945509a1c685a028737bd2c3 100644
--- a/RingConsolePanel.xaml.cpp
+++ b/RingConsolePanel.xaml.cpp
@@ -21,6 +21,7 @@
 
 using namespace RingClientUWP;
 using namespace RingClientUWP::Views;
+using namespace RingClientUWP::ViewModel;
 using namespace Windows::ApplicationModel::Core;
 using namespace Windows::UI::Core;
 using namespace Windows::UI::Xaml::Documents;
@@ -88,26 +89,87 @@ void RingConsolePanel::_sendDbgCmd__KeyDown(Platform::Object^ sender, Windows::U
 /*\ ADD EACH NEW COMMAND TO THE HELP LIST \*/
 void RingConsolePanel::sendCommand()
 {
-    auto cmdInput = _tBoxDbg_->Text;
+    auto inputConst_str = Utils::toString(_tBoxDbg_->Text);
+    if (inputConst_str.empty())
+        return;
+
+    auto inputConst_cstr = inputConst_str.c_str();
+    char* input_cstr = _strdup(inputConst_cstr); // full string
+    char* input_cstr_nextToken; // tokenized string
+    char* cmd_cstr = strtok_s(input_cstr, " ", &input_cstr_nextToken);
+    char* parameter1_cstr = strtok_s(input_cstr_nextToken, " ", &input_cstr_nextToken);
+    // parameter2...
+
+    if (!cmd_cstr)
+        return;
+
+    std::string input(cmd_cstr);
+    std::string parameter1;
+
+    if (parameter1_cstr)
+        parameter1 = parameter1_cstr;
+
+    free(input_cstr);
+    free(input_cstr_nextToken);
+    //free((char*)inputConst_cstr);
+
     addCommandToHistory();
     historyLevel++;
     _tBoxDbg_->Text = "";
     currentCmd = "";
     historyLevel = historyCmds.Size;
 
-    if (cmdInput->IsEmpty()) {
-        return;
-    }
-    else if (cmdInput == "help") {
+    if (input == "help") {
         MSG_(">> Help :");
         MSG_("use PgUp/PgDown for crawling commands history.");
+        MSG_("getCallsList, switchDebug, killCall [callId, -all], getAccountInfo, getContactsList, placeCall [contact name]");
         return;
     }
+    else if (input == "getCallsList") {
+        RingD::instance->getCallsList();
+        return;
+    }
+    else if (input == "switchDebug") {
+        MSG_(">> switching dameon debug output");
+        RingD::instance->switchDebug();
+        return;
+    }
+    else if (input == "killCall") {
+        if (parameter1.empty()) {
+            MSG_("callId missing");
+            return;
+        }
+        RingD::instance->killCall(Utils::toPlatformString(parameter1));
+        return;
+    }
+    else if (input == "getAccountInfo") {
+        auto id = AccountListItemsViewModel::instance->_selectedItem->_account->accountID_;
+        MSG_("id : "+Utils::toString(id));
+        return;
+    }
+    else if (input == "getContactsList") {
+        auto list = ContactsViewModel::instance->contactsList;
+        MSG_("list of calls returned by the daemon :");
+        for (auto contact : list) {
+            MSG_("name : " + Utils::toString(contact->name_));
+            MSG_("ringId : " + Utils::toString(contact->ringID_));
+        }
+        return;
+    }
+    else if (input == "placeCall") {
+        if (parameter1.empty()) {
+            MSG_("contact name missing");
+            return;
+        }
+        auto contact = ContactsViewModel::instance->findContactByName(Utils::toPlatformString(parameter1));
+        if (!contact) {
+            MSG_("contact "+parameter1+" not found");
+            return;
+        }
+        RingD::instance->placeCall(contact);
+    }
 
-    std::wstring wStr(cmdInput->Begin());
-    std::string result(wStr.begin(), wStr.end());
-
-    MSG_(">> error, command \'" + result + "\' not found");
+    MSG_(">> error, command \'" + input + "\' not found");
 }
 
 void RingConsolePanel::addCommandToHistory()
diff --git a/RingD.cpp b/RingD.cpp
index 4e48cb8172275468e765ff2acc4570b1cf23a4cb..788e6ca9bd25e4e70a02cbc93be1e76fdfd25b9d 100644
--- a/RingD.cpp
+++ b/RingD.cpp
@@ -366,6 +366,10 @@ void RingClientUWP::RingD::registerThisDevice(String ^ pin, String ^ archivePass
 void
 RingClientUWP::RingD::startDaemon()
 {
+    if (daemonRunning) {
+        ERR_("daemon already runnging");
+        return;
+    }
     //eraseCacheFolder();
     editModeOn_ = true;
 
@@ -424,7 +428,6 @@ RingClientUWP::RingD::startDaemon()
                 if (state3 == CallStatus::ENDED)
                     DRing::hangUp(callId); // solve a bug in the daemon API.
 
-
                 CoreApplication::MainView->CoreWindow->Dispatcher->RunAsync(
                     CoreDispatcherPriority::High, ref new DispatchedHandler([=]()
                 {
@@ -517,8 +520,9 @@ RingClientUWP::RingD::startDaemon()
             }),
             DRing::exportable_callback<DRing::Debug::MessageSend>([&](const std::string& toto)
             {
-                dispatcher->RunAsync(CoreDispatcherPriority::High,
-                ref new DispatchedHandler([=]() {
+                if (debugModeOn_)
+                    dispatcher->RunAsync(CoreDispatcherPriority::High,
+                    ref new DispatchedHandler([=]() {
                     RingDebug::instance->print(toto);
                 }));
             }),
@@ -666,9 +670,9 @@ RingClientUWP::RingD::startDaemon()
         DRing::init(static_cast<DRing::InitFlag>(DRing::DRING_FLAG_CONSOLE_LOG |
                     DRing::DRING_FLAG_DEBUG));
 
+        daemonRunning_ = DRing::start();
 
-
-        if (!DRing::start()) {
+        if (!daemonRunning_) {
             ERR_("\ndaemon didn't start.\n");
             return;
         }
@@ -704,7 +708,7 @@ RingClientUWP::RingD::startDaemon()
             });
 
 
-            while (true) {
+            while (daemonRunning) {
                 DRing::pollEvents();
                 dequeueTasks();
                 Sleep(5);
@@ -804,6 +808,7 @@ RingD::dequeueTasks()
             deviceDetails.insert(std::make_pair(DRing::Account::ConfProperties::ARCHIVE_PASSWORD, password));
             DRing::addAccount(deviceDetails);
         }
+        break;
         case Request::GetKnownDevices:
         {
             auto accountId = task->_accountId;
@@ -852,6 +857,28 @@ RingD::dequeueTasks()
             DRing::removeAccount(accountId2);
             break;
         }
+        case Request::GetCallsList:
+        {
+            auto callsList = DRing::getCallList();
+            MSG_("list of calls returned by the daemon :");
+            for (auto call : callsList)
+                MSG_(call);
+            MSG_("[EOL]"); // end of list
+            break;
+        }
+        case Request::KillCall:
+        {
+            auto callId = task->_callId;
+            auto callId2 = Utils::toString(callId);
+            MSG_("asking daemon to kill : " + callId2);
+            DRing::hangUp(callId2);
+            break;
+        }
+        case Request::switchDebug:
+        {
+            debugModeOn_ = !debugModeOn_;
+            break;
+        }
         default:
             break;
         }
@@ -859,6 +886,42 @@ RingD::dequeueTasks()
     }
 }
 
+void RingClientUWP::RingD::getCallsList()
+{
+    auto task = ref new RingD::Task(Request::GetCallsList);
+
+    tasksList_.push(task);
+
+}
+
+void RingClientUWP::RingD::killCall(String ^ callId)
+{
+    if (callId == "-all") {
+        auto callsList = DRing::getCallList();
+
+        for (auto call : callsList) {
+            auto task = ref new RingD::Task(Request::KillCall);
+            task->_callId = Utils::toPlatformString(call);
+
+            tasksList_.push(task);
+        }
+        return;
+    }
+
+    auto task = ref new RingD::Task(Request::KillCall);
+    task->_callId = callId;
+
+    tasksList_.push(task);
+
+}
+
+void RingClientUWP::RingD::switchDebug()
+{
+    auto task = ref new RingD::Task(Request::switchDebug);
+
+    tasksList_.push(task);
+}
+
 RingClientUWP::CallStatus RingClientUWP::RingD::translateCallStatus(String^ state)
 {
     if (state == "INCOMING")
diff --git a/RingD.h b/RingD.h
index b61d1339abb04579f4c25c38bcb8c24170d70c2b..d46fcbc0f1ce6e5f00f4d0ad4077661b4292d65a 100644
--- a/RingD.h
+++ b/RingD.h
@@ -99,6 +99,9 @@ internal:
     void updateAccount(String^ accountId);
     void deleteAccount(String^ accountId);
     void registerThisDevice(String^ pin, String^ archivePassword);
+    void getCallsList();
+    void killCall(String^ callId);
+    void switchDebug();
 
     /* TODO : move members */
     String ^ currentCallId; // to save ongoing call id during visibility change
@@ -130,7 +133,10 @@ private:
         GetKnownDevices,
         ExportOnRing,
         UpdateAccount,
-        DeleteAccount
+        DeleteAccount,
+        GetCallsList,
+        KillCall,
+        switchDebug,
     };
 
 
@@ -175,5 +181,6 @@ private:
     std::queue<Task^> tasksList_;
     StartingStatus startingStatus_ = StartingStatus::NORMAL;
     bool editModeOn_ = false;
+    bool debugModeOn_ = true;
 };
 }
\ No newline at end of file
diff --git a/Utils.h b/Utils.h
index c597e1cb90e37ca742c3514e727839352ec10f0b..aacef25abef04d36ac384fbfa030fd5f15988233 100644
--- a/Utils.h
+++ b/Utils.h
@@ -171,52 +171,87 @@ TrimFrom(Platform::String^ s)
 }
 
 Platform::String^
-GetNewGUID()
+TrimCmd(Platform::String^ s)
 {
-    GUID result;
-    HRESULT hr = CoCreateGuid(&result);
+    const WCHAR* first = s->Begin();
+    const WCHAR* last = s->End();
 
-    if (SUCCEEDED(hr)) {
-        Guid guid(result);
-        return guid.ToString();
-    }
+    while (first != last && last[0] != '\ ' )
+            --last;
 
-    throw Exception::CreateException(hr);
-}
+            //last--;
 
-std::string
-getStringFromFile(const std::string& filename)
-{
-    std::ifstream file(filename);
-    return std::string((std::istreambuf_iterator<char>(file)),
-                       (std::istreambuf_iterator<char>()));
-}
+            return ref new Platform::String(first, sizeof(last));
+        }
 
-inline Map<String^,String^>^
-convertMap(const std::map<std::string, std::string>& m)
-{
-    auto temp = ref new Map<String^,String^>;
-    for (const auto& pair : m) {
-        temp->Insert(
+            Platform::String^
+            TrimParameter(Platform::String^ s)
+            {
+            const WCHAR* first = s->Begin();
+            const WCHAR* last = s->End();
+
+            while (first != last && *first != '[')
+                    ++first;
+
+                    while (first != last && last[-1] != ']')
+            --last;
+
+            first++;
+            last--;
+
+            if (static_cast<unsigned int>(last - first) > 0)
+            return ref new Platform::String(first, static_cast<unsigned int>(last - first));
+            else
+            return "";
+        }
+
+            Platform::String^
+            GetNewGUID()
+            {
+            GUID result;
+            HRESULT hr = CoCreateGuid(&result);
+
+            if (SUCCEEDED(hr)) {
+            Guid guid(result);
+            return guid.ToString();
+        }
+
+            throw Exception::CreateException(hr);
+        }
+
+            std::string
+            getStringFromFile(const std::string& filename)
+            {
+            std::ifstream file(filename);
+            return std::string((std::istreambuf_iterator<char>(file)),
+            (std::istreambuf_iterator<char>()));
+        }
+
+            inline Map<String^,String^>^
+            convertMap(const std::map<std::string, std::string>& m)
+            {
+            auto temp = ref new Map<String^,String^>;
+            for (const auto& pair : m) {
+            temp->Insert(
             Utils::toPlatformString(pair.first),
             Utils::toPlatformString(pair.second)
-        );
-    }
-    return temp;
-}
+            );
+        }
+            return temp;
+        }
 
-inline std::map<std::string, std::string>
-convertMap(Map<String^,String^>^ m)
-{
-    std::map<std::string, std::string> temp;
-    for (const auto& pair : m) {
-        temp.insert(
+            inline std::map<std::string, std::string>
+            convertMap(Map<String^,String^>^ m)
+            {
+            std::map<std::string, std::string> temp;
+            for (const auto& pair : m) {
+            temp.insert(
             std::make_pair(
-                Utils::toString(pair->Key),
-                Utils::toString(pair->Value)));
-    }
-    return temp;
-}
+            Utils::toString(pair->Key),
+            Utils::toString(pair->Value)));
+        }
+            return temp;
+        }
 
-}
-}
+        }
+        }