diff --git a/src/call.cpp b/src/call.cpp
index 139ace45b361b210b5ae7e2f85358b92be0f97c3..5d2191e797ef38f2d9c65d1c3bbabbcf55aac4ce 100644
--- a/src/call.cpp
+++ b/src/call.cpp
@@ -1079,6 +1079,17 @@ void Call::setDialNumber(const ContactMethod* number)
     setDialNumber(number->uri());
 }
 
+void Call::setPeerContactMethod(ContactMethod* cm)
+{
+   //Change the peerContactMethod only when creating a Call
+   if (!cm || lifeCycleState() != Call::LifeCycleState::CREATION) {
+      qDebug() << "Trying to change the contact method on a non-dialing call";
+      return;
+   }
+   d_ptr->m_pPeerContactMethod = cm;
+   setDialNumber(cm->uri());
+}
+
 ///Set the recording path
 void CallPrivate::setRecordingPath(const QString& path)
 {
@@ -1583,24 +1594,33 @@ void CallPrivate::hold()
 void CallPrivate::call()
 {
     Q_ASSERT_IS_IN_PROGRESS;
+    auto peerCM = q_ptr->peerContactMethod();
 
     // Calls to empty URI should not be allowed, dring will go crazy
-    if (!m_pDialNumber || m_pDialNumber->uri().isEmpty()) {
+    if (peerCM->uri().isEmpty()) {
         qDebug() << "Trying to call an empty URI";
-        changeCurrentState(Call::State::FAILURE);
+        changeCurrentState(Call::State::ABORTED);
         if (!m_pDialNumber)
             emit q_ptr->dialNumberChanged(QString());
         else
             m_pDialNumber.reset();
-        q_ptr->setPeerName(tr("Failure"));
+        q_ptr->setPeerName(tr("Aborted"));
         emit q_ptr->changed();
         return;
     }
 
-    // Trying to find a valid account
+    // Try to set the account from the associated ContactMethod
+    if (auto tryingAcc = peerCM->account()) {
+        // make sure account exist in the model and that it's READY
+        if (AccountModel::instance()->getById(tryingAcc->id()) &&
+            (tryingAcc->registrationState() == Account::RegistrationState::READY))
+            m_Account = tryingAcc;
+    }
+
+    // Otherwise set default account
     if (!m_Account) {
         qDebug() << "Account is not set, taking the first registered.";
-        m_Account = AvailableAccountModel::currentDefaultAccount(m_pDialNumber.get());
+        m_Account = AvailableAccountModel::currentDefaultAccount(peerCM);
         if (!m_Account) {
             qDebug() << "Trying to call "
                      << (m_pTransferNumber ? static_cast<QString>(m_pTransferNumber->uri()) : "ERROR")
@@ -1608,42 +1628,47 @@ void CallPrivate::call()
             throw tr("No account registered!");
         }
     }
-    qDebug() << "account = " << m_Account << " " << m_Account->alias();
 
     // Normal case
-    qDebug() << "Calling " << q_ptr->peerContactMethod()->uri() << " with account " << m_Account
+    qDebug() << "Calling " << peerCM->uri() << " with account " << m_Account
              << ", CallId: " << q_ptr
              << ", ConfId: " << q_ptr;
     m_Direction = Call::Direction::OUTGOING;
 
     // Warning: m_pDialNumber can become nullptr when linking directly
-    const auto& uri = m_pDialNumber->uri();
-    m_pPeerContactMethod = PhoneDirectoryModel::instance()->getNumber(uri, q_ptr->account());
+    URI uri {peerCM->uri()};
+    if (!m_pPeerContactMethod)
+        m_pPeerContactMethod = PhoneDirectoryModel::instance()->getNumber(uri, q_ptr->account());
+
+    // m_pDialNumber is now discarded
+    m_pDialNumber.reset();
+
+    //Refresh peerCM
+    peerCM = q_ptr->peerContactMethod();
+
     m_DringId = DBus::CallManager::instance().placeCall(m_Account->id(), uri);
 
     // This can happen when the daemon cannot allocate memory
     if (m_DringId.isEmpty()) {
         changeCurrentState(Call::State::FAILURE);
-        qWarning() << "Creating the call to " << m_pDialNumber->uri() << " failed";
-        m_DringId = "FAILED"; // TODO once the ABORTED state is implemented, use it
+        qWarning() << "Creating the call to " << peerCM->uri() << " failed";
+        m_DringId = "FAILED";
         return;
     }
     setObjectName("Call:"+m_DringId);
 
     if (PersonModel::instance()->hasCollections()) {
-        if (auto contact = m_pPeerContactMethod->contact())
+        if (auto contact = peerCM->contact())
             m_PeerName = contact->formattedName();
     }
 
     setStartTimeStamp();
     CallModel::instance()->registerCall(q_ptr);
 
-    connect(m_pPeerContactMethod, SIGNAL(presentChanged(bool)), this, SLOT(updated()));
-    m_pPeerContactMethod->addCall(q_ptr);
+    connect(peerCM, SIGNAL(presentChanged(bool)), this, SLOT(updated()));
+    peerCM->addCall(q_ptr);
 
-    // m_pDialNumber is now deprecated by m_pPeerContactMethod
     emit q_ptr->dialNumberChanged(QString());
-    m_pDialNumber.reset();
 }
 
 ///Transfer the call
diff --git a/src/call.h b/src/call.h
index dba5b7b4d918ebdd92488f201a4c509d34d647f4..a391e07837ab60bf08364456dbfcb6fc476d9109 100644
--- a/src/call.h
+++ b/src/call.h
@@ -269,7 +269,7 @@ public:
    Q_PROPERTY( Certificate*       certificate        READ certificate                               )
 
    //Read/write properties
-   Q_PROPERTY( ContactMethod*     peerContactMethod  READ peerContactMethod                         )
+   Q_PROPERTY( ContactMethod*     peerContactMethod  READ peerContactMethod WRITE setPeerContactMethod)
    Q_PROPERTY( QString            peerName           READ peerName          WRITE setPeerName       )
    Q_PROPERTY( QString            transferNumber     READ transferNumber    WRITE setTransferNumber )
    Q_PROPERTY( QString            dialNumber         READ dialNumber        WRITE setDialNumber      NOTIFY dialNumberChanged(QString))
@@ -324,6 +324,7 @@ public:
    void setTransferNumber ( const QString&     number     );
    void setDialNumber     ( const QString&     number     );
    void setDialNumber     ( const ContactMethod* number   );
+   void setPeerContactMethod( ContactMethod* cm           );
    void setPeerName       ( const QString&     name       );
    void setAccount        ( Account*           account    );
 
diff --git a/src/uri.cpp b/src/uri.cpp
index 0f1cadd6595dbf1d581689817840b6123dfba1ec..11d7cf96def1e11383dd8a6dd9dc185ace12d98d 100644
--- a/src/uri.cpp
+++ b/src/uri.cpp
@@ -99,13 +99,33 @@ m_IsHNParsed(false),m_Port(-1),m_Transport(URI::Transport::NOT_SET)
 {
 }
 
+///Default constructor
+URI::URI() : QString(), d_ptr(new URIPrivate(this))
+{
+
+}
+
 ///Constructor
-URI::URI(const QString& other):QString(), d_ptr(new URIPrivate(this))
+URI::URI(const QString& other) : URI()
 {
    d_ptr->m_Stripped              = URIPrivate::strip(other,d_ptr->m_HeaderType);
    (*static_cast<QString*>(this)) = d_ptr->m_Stripped                           ;
 }
 
+///Copy constructor
+URI::URI(const URI& o) : URI()
+{
+   d_ptr->commonCopyConstructor(o);
+}
+
+///Destructor
+URI::~URI()
+{
+   (*static_cast<QString*>(this)) = QString();
+   d_ptr->m_Stripped = QString();
+//    delete d_ptr;
+}
+
 void URIPrivate::commonCopyConstructor(const URI& o)
 {
    //TODO see if a copy on write kind of algo could be used for this
@@ -125,20 +145,6 @@ void URIPrivate::commonCopyConstructor(const URI& o)
    (*static_cast<QString*>(q_ptr)) = o.d_ptr->m_Stripped;
 }
 
-///Copy constructor
-URI::URI(const URI& o):QString(), d_ptr(new URIPrivate(this))
-{
-   d_ptr->commonCopyConstructor(o);
-}
-
-///Destructor
-URI::~URI()
-{
-   (*static_cast<QString*>(this)) = QString();
-   d_ptr->m_Stripped = QString();
-//    delete d_ptr;
-}
-
 /// Copy operator, make sure the cache is also copied
 URI& URI::operator=(const URI& o)
 {
diff --git a/src/uri.h b/src/uri.h
index 050893dda6716dba319b4271b2e67205648f8c60..ff061e26147c932380e994eb53d455c5ed1613a2 100644
--- a/src/uri.h
+++ b/src/uri.h
@@ -81,12 +81,16 @@ class LIB_EXPORT URI : public QString
    friend class URIPrivate;
 public:
 
+   ///Default constructor
+   URI();
+
    /**
     * Default copy constructor
     * @param other an URI string
     */
-   URI(const QString& other);
    URI(const URI&     other);
+
+   URI(const QString& other);
    virtual ~URI();
 
    ///@enum SchemeType The very first part of the URI followed by a ':'