diff --git a/src/certificate.cpp b/src/certificate.cpp
index 8909baa5e07982d2824d466e451b86107df4e66d..c53a49b72f9de2c271eeeec6a4684364d8bf63f9 100644
--- a/src/certificate.cpp
+++ b/src/certificate.cpp
@@ -87,7 +87,8 @@ public:
  */
 enum class LoadingType {
    FROM_PATH,
-   FROM_CONTENT
+   FROM_CONTENT,
+   FROM_ID
 };
 
 class CertificatePrivate
@@ -105,6 +106,7 @@ public:
    Certificate::Type m_Type       ;
    QByteArray        m_Content    ;
    LoadingType       m_LoadingType;
+   QByteArray        m_Id         ;
 
    mutable DetailsCache* m_pDetailsCache;
    mutable ChecksCache*  m_pCheckCache  ;
@@ -293,6 +295,9 @@ void CertificatePrivate::loadDetails()
          case LoadingType::FROM_CONTENT:
             d = DBus::ConfigurationManager::instance().getCertificateDetailsRaw(m_Content);
             break;
+         case LoadingType::FROM_ID:
+            d = DBus::ConfigurationManager::instance().getCertificateDetails(m_Id);
+            break;
       }
       m_pDetailsCache = new DetailsCache(d);
    }
@@ -309,6 +314,9 @@ void CertificatePrivate::loadChecks()
          case LoadingType::FROM_CONTENT:
             checks = DBus::ConfigurationManager::instance().validateCertificateRaw(QString(),m_Content);
             break;
+         case LoadingType::FROM_ID:
+            checks = DBus::ConfigurationManager::instance().validateCertificate(QString(),m_Id,QString());
+            break;
       }
       m_pCheckCache = new ChecksCache(checks);
    }
@@ -321,6 +329,11 @@ Certificate::Certificate(const QUrl& path, Type type, const QUrl& privateKey) :
    d_ptr->m_Type = type;
 }
 
+Certificate::Certificate(const QString& id) : ItemBase<QObject>(CertificateModel::instance()),d_ptr(new CertificatePrivate(LoadingType::FROM_ID))
+{
+   d_ptr->m_Id = id.toLatin1();
+}
+
 Certificate::Certificate(const QByteArray& content, Type type): ItemBase<QObject>(CertificateModel::instance()),d_ptr(new CertificatePrivate(LoadingType::FROM_CONTENT))
 {
    d_ptr->m_Content = content;
@@ -332,6 +345,44 @@ Certificate::~Certificate()
 
 }
 
+bool Certificate::hasRemote() const
+{
+   return ! d_ptr->m_Id.isEmpty();
+}
+
+QByteArray Certificate::remoteId() const
+{
+   return d_ptr->m_Id;
+}
+
+/**
+ * Register this certificate in the daemon
+ */
+bool Certificate::pin()
+{
+   if (hasRemote())
+      return true;
+
+   switch(d_ptr->m_LoadingType) {
+      case LoadingType::FROM_PATH:
+         DBus::ConfigurationManager::instance().addCertificate(d_ptr->m_Id); //FIXME wrong function, wait for daemon implementation
+         break;
+      case LoadingType::FROM_CONTENT:
+         DBus::ConfigurationManager::instance().addCertificate(d_ptr->m_Path.toString().toLatin1());
+         break;
+      case LoadingType::FROM_ID:
+//          return DBus::ConfigurationManager::instance().addCertificateRemote(d_ptr->m_Id); //FIXME
+         break;
+   }
+   //TODO use the new pinning API
+   return false;
+}
+
+bool Certificate::unpin() const
+{
+   return false;//TODO
+}
+
 QString Certificate::getName(Certificate::Checks check)
 {
    return CertificatePrivate::m_slChecksName[check];
diff --git a/src/certificate.h b/src/certificate.h
index 7ae7e8f566d6a5a0fe537260ef54aa75a3a0104f..3637232f54c91dfbe85363930aeee8a407dfbd10 100644
--- a/src/certificate.h
+++ b/src/certificate.h
@@ -60,6 +60,9 @@ public:
    Q_PROPERTY(CheckValues authorityMatch                      READ authorityMatch                      )
    Q_PROPERTY(CheckValues hasExpectedOwner                    READ hasExpectedOwner                    )
    Q_PROPERTY(bool        isActivated                         READ isActivated                         )
+   Q_PROPERTY(bool        hasRemote                           READ hasRemote                           )
+   Q_PROPERTY(QByteArray  remoteId                            READ remoteId                            )
+   Q_PROPERTY(QUrl        path                                READ path              WRITE setPath     )
 
    Q_PROPERTY(QDateTime  expirationDate                       READ expirationDate           )
    Q_PROPERTY(QDateTime  activationDate                       READ activationDate           )
@@ -204,6 +207,8 @@ public:
    QVariant detailResult                ( Certificate::Details detail ) const;
    QAbstractItemModel* model            (                             ) const;
    QAbstractItemModel* checksModel      (                             ) const;
+   bool hasRemote                       (                             ) const;
+   QByteArray remoteId                  (                             ) const;
 
    static QString getName        (Certificate::Checks   check  );
    static QString getName        (Certificate::Details details );
@@ -257,8 +262,13 @@ public:
    //Setter
    void setPath(const QUrl& path);
 
+   //Mutator
+   Q_INVOKABLE bool pin();
+   Q_INVOKABLE bool unpin() const;
+
 private:
    explicit Certificate(const QUrl& path, Type type = Type::NONE, const QUrl& privateKey = QUrl());
+   Certificate(const QString& id);
    Certificate(const QByteArray& content, Type type = Type::CALL);
    virtual ~Certificate();
    CertificatePrivate* d_ptr;
diff --git a/src/certificatemodel.cpp b/src/certificatemodel.cpp
index 8f9c05e63113fdf827d238d7a6759bea54e02ded..33a759902352556606e029ffb056500b00b1a628 100644
--- a/src/certificatemodel.cpp
+++ b/src/certificatemodel.cpp
@@ -468,9 +468,9 @@ Certificate* CertificateModel::getCertificate(const QUrl& path, Account* a)
 Certificate* CertificateModel::getCertificate(const QUrl& path, Certificate::Type type)
 {
    Q_UNUSED(type)
-   const QString p = path.path();
+   const QString id = path.path();
 
-   Certificate* cert = d_ptr->m_hCertificates[p];
+   Certificate* cert = d_ptr->m_hCertificates[id];
 
    //The certificate is not loaded yet
    if (!cert) {
@@ -484,6 +484,22 @@ Certificate* CertificateModel::getCertificate(const QUrl& path, Certificate::Typ
    return cert;
 }
 
+Certificate* CertificateModel::getCertificateFromId(const QString& id)
+{
+   Certificate* cert = d_ptr->m_hCertificates[id];
+
+   //The certificate is not loaded yet
+   if (!cert) {
+      cert = new Certificate(id);
+      d_ptr->m_hCertificates[id.toLatin1()] = cert;
+
+      //Add it to the model
+      d_ptr->addToTree(cert);
+   }
+
+   return cert;
+}
+
 //TODO Make this private
 Certificate* CertificateModel::getCertificateFromContent(const QByteArray& rawContent, Account* a, bool save, const QString& category)
 {
diff --git a/src/certificatemodel.h b/src/certificatemodel.h
index ad29b7d77e6037034153ac41f7d33c05039c1f5b..d0f33887c3529ae6c9f1a47bd44c1b6b6259073b 100644
--- a/src/certificatemodel.h
+++ b/src/certificatemodel.h
@@ -32,6 +32,7 @@ class LIB_EXPORT CertificateModel : public QAbstractItemModel, public Collection
 public:
    friend class CertificateProxyModel;
    friend class CertificateNode;
+   friend class DaemonCertificateCollectionPrivate;
 
    enum class Role {
       NodeType       = 100,
@@ -85,6 +86,7 @@ public:
    static CertificateModel* instance();
 
 private:
+   Certificate* getCertificateFromId(const QString& id);
 
    //Backend interface
    virtual void collectionAddedCallback(CollectionInterface* collection) override;
diff --git a/src/daemoncertificatecollection.cpp b/src/daemoncertificatecollection.cpp
index 7b8ab240ce6a4fd86b57abdbb3f81bfc13cdd106..ac7f3da61a453995c7277d909b190572afe98405 100644
--- a/src/daemoncertificatecollection.cpp
+++ b/src/daemoncertificatecollection.cpp
@@ -19,6 +19,7 @@
 
 //Ring
 #include "certificate.h"
+#include "certificatemodel.h"
 
 //Dring
 #include "dbus/configurationmanager.h"
@@ -41,15 +42,31 @@ private:
    virtual QVector<Certificate*> items() const override;
 };
 
-class DaemonCertificateCollectionPrivate
+class DaemonCertificateCollectionPrivate : public QObject
 {
+   Q_OBJECT
 public:
+   DaemonCertificateCollectionPrivate(DaemonCertificateCollection* parent);
+
+   //Attributes
+   DaemonCertificateCollection* q_ptr;
+
+public Q_SLOTS:
+   void slotCertificateAdded(const QString& id);
+   void slotCertificateExpired(const QString& id);
 };
 
+DaemonCertificateCollectionPrivate::DaemonCertificateCollectionPrivate(DaemonCertificateCollection* parent) : QObject(), q_ptr(parent)
+{
+   ConfigurationManagerInterface& configurationManager = DBus::ConfigurationManager::instance();
+   connect(&configurationManager,&ConfigurationManagerInterface::certificateAdded  ,this,&DaemonCertificateCollectionPrivate::slotCertificateAdded  );
+   connect(&configurationManager,&ConfigurationManagerInterface::certificateExpired,this,&DaemonCertificateCollectionPrivate::slotCertificateExpired);
+}
+
 DaemonCertificateCollection::DaemonCertificateCollection(CollectionMediator<Certificate>* mediator, const QString& path) :
-CollectionInterface(new DaemonCertificateEditor(mediator,path),nullptr),d_ptr(new DaemonCertificateCollectionPrivate())
+CollectionInterface(new DaemonCertificateEditor(mediator,path),nullptr),d_ptr(new DaemonCertificateCollectionPrivate(this))
 {
-   
+
 }
 
 DaemonCertificateCollection::~DaemonCertificateCollection()
@@ -57,6 +74,18 @@ DaemonCertificateCollection::~DaemonCertificateCollection()
    delete d_ptr;
 }
 
+void DaemonCertificateCollectionPrivate::slotCertificateAdded(const QString& id)
+{
+   qDebug() << "\n\nCERTIFICATE ADDED" << id;
+   Certificate* cert = CertificateModel::instance()->getCertificateFromId(id);
+   q_ptr->editor<Certificate>()->addExisting(cert);
+}
+
+void DaemonCertificateCollectionPrivate::slotCertificateExpired(const QString& id)
+{
+   qDebug() << "\n\nCERTIFICATE EXPIRED" << id;
+}
+
 bool DaemonCertificateCollection::load()
 {
    ConfigurationManagerInterface& configurationManager = DBus::ConfigurationManager::instance();
@@ -76,7 +105,7 @@ bool DaemonCertificateCollection::clear()
 
 QString DaemonCertificateCollection::name() const
 {
-   return QObject::tr("Local certificate store");
+   return QObject::tr("Ring certificate store");
 }
 
 QString DaemonCertificateCollection::category() const
@@ -104,10 +133,8 @@ FlagPack<CollectionInterface::SupportedFeatures> DaemonCertificateCollection::su
    return
       CollectionInterface::SupportedFeatures::NONE     |
       CollectionInterface::SupportedFeatures::LOAD     |
-      CollectionInterface::SupportedFeatures::CLEAR    |
       CollectionInterface::SupportedFeatures::REMOVE   |
-      CollectionInterface::SupportedFeatures::LISTABLE |
-      CollectionInterface::SupportedFeatures::ADD      ;
+      CollectionInterface::SupportedFeatures::LISTABLE ;
 }
 
 
@@ -130,8 +157,7 @@ bool DaemonCertificateEditor::save( const Certificate* item)
 
 bool DaemonCertificateEditor::remove( const Certificate* item)
 {
-   Q_UNUSED(item)
-   return false;
+   return item->unpin();
 }
 
 bool DaemonCertificateEditor::edit( Certificate* item)
@@ -149,6 +175,7 @@ bool DaemonCertificateEditor::addNew( const Certificate* item)
 bool DaemonCertificateEditor::addExisting( const Certificate* item)
 {
    Q_UNUSED(item)
+   m_lItems << const_cast<Certificate*>(item);
    return false;
 }
 
@@ -156,3 +183,5 @@ QVector<Certificate*> DaemonCertificateEditor::items() const
 {
    return m_lItems;
 }
+
+#include <daemoncertificatecollection.moc>