diff --git a/daemon/face/datagram-face.hpp b/daemon/face/datagram-face.hpp
index 4b75a0e..6a7accb 100644
--- a/daemon/face/datagram-face.hpp
+++ b/daemon/face/datagram-face.hpp
@@ -16,10 +16,17 @@
 {
 public:
   typedef T protocol;
-  
+
+  /** \brief Construct datagram face
+   *
+   * \param uri         FaceUri for the face
+   * \param socket      Protocol-specific socket for the created face
+   * \param isOnDemand  If true, the face can be closed after it remains
+   *                    unused for a certain amount of time.
+   */
   DatagramFace(const FaceUri& uri,
                const shared_ptr<typename protocol::socket>& socket,
-               bool isPermanent);
+               bool isOnDemand);
 
   virtual
   ~DatagramFace();
@@ -42,12 +49,6 @@
   handleReceive(const boost::system::error_code& error,
                 size_t nBytesReceived);
 
-  void
-  setPermanent(bool isPermanent);
-  
-  bool
-  isPermanent() const;
-
   /**
    * \brief Set m_hasBeenUsedRecently to false
    */
@@ -56,9 +57,11 @@
   
   bool
   hasBeenUsedRecently() const;
+
+  void
+  setOnDemand(bool isOnDemand);
   
 protected:
-
   void
   receiveDatagram(const uint8_t* buffer,
                   size_t nBytesReceived,
@@ -74,27 +77,21 @@
   shared_ptr<typename protocol::socket> m_socket;
   uint8_t m_inputBuffer[MAX_NDN_PACKET_SIZE];
 
-  /**
-   * If false, the face can be closed after it remains unused for a certain
-   * amount of time
-   */
-  bool m_isPermanent;
-  
   bool m_hasBeenUsedRecently;
 
   NFD_LOG_INCLASS_DECLARE();
-
 };
 
 template <class T>
 inline
 DatagramFace<T>::DatagramFace(const FaceUri& uri,
                               const shared_ptr<typename DatagramFace::protocol::socket>& socket,
-                              bool isPermanent)
+                              bool isOnDemand)
   : Face(uri)
   , m_socket(socket)
-  , m_isPermanent(isPermanent)
 {
+  setOnDemand(isOnDemand);
+
   m_socket->async_receive(boost::asio::buffer(m_inputBuffer, MAX_NDN_PACKET_SIZE), 0,
                           bind(&DatagramFace<T>::handleReceive, this, _1, _2));
 }
@@ -298,16 +295,9 @@
 
 template <class T>
 inline void
-DatagramFace<T>::setPermanent(bool isPermanent)
+DatagramFace<T>::setOnDemand(bool isOnDemand)
 {
-  m_isPermanent = isPermanent;
-}
-
-template <class T>
-inline bool
-DatagramFace<T>::isPermanent() const
-{
-  return m_isPermanent;
+  Face::setOnDemand(isOnDemand);
 }
 
 template <class T>
diff --git a/daemon/face/face.cpp b/daemon/face/face.cpp
index 1fb1109..08853aa 100644
--- a/daemon/face/face.cpp
+++ b/daemon/face/face.cpp
@@ -22,6 +22,7 @@
   : m_id(INVALID_FACEID)
   , m_isLocal(isLocal)
   , m_uri(uri)
+  , m_isOnDemand(false)
 {
   onReceiveInterest += bind(&increaseCounter<Interest>, _1, boost::ref(m_counters.getInInterest()));
   onReceiveData     += bind(&increaseCounter<Data>,     _1, boost::ref(m_counters.getInData()));
@@ -74,7 +75,7 @@
 Face::decodeAndDispatchInput(const Block& element)
 {
   /// \todo Ensure lazy field decoding process
-  
+
   if (element.type() == tlv::Interest)
     {
       shared_ptr<Interest> i = make_shared<Interest>();
@@ -89,7 +90,7 @@
     }
   else
     return false;
-  
+
   return true;
 }
 
diff --git a/daemon/face/face.hpp b/daemon/face/face.hpp
index 1efcb35..e1ef2f8 100644
--- a/daemon/face/face.hpp
+++ b/daemon/face/face.hpp
@@ -106,6 +106,11 @@
   virtual bool
   isUp() const;
 
+  /** \brief Get whether face is created on demand or explicitly via FaceManagement protocol
+   */
+  bool
+  isOnDemand() const;
+
   const FaceCounters&
   getCounters() const;
 
@@ -120,6 +125,9 @@
   FaceCounters&
   getMutableCounters();
 
+  void
+  setOnDemand(bool isOnDemand);
+
 private:
   void
   setId(FaceId faceId);
@@ -130,6 +138,7 @@
   bool m_isLocal; // for scoping purposes
   FaceCounters m_counters;
   FaceUri m_uri;
+  bool m_isOnDemand;
 
   // allow setting FaceId
   friend class FaceTable;
@@ -160,6 +169,18 @@
   return m_uri;
 }
 
+inline void
+Face::setOnDemand(bool isOnDemand)
+{
+  m_isOnDemand = isOnDemand;
+}
+
+inline bool
+Face::isOnDemand() const
+{
+  return m_isOnDemand;
+}
+
 } // namespace nfd
 
 #endif // NFD_FACE_FACE_HPP
diff --git a/daemon/face/multicast-udp-face.cpp b/daemon/face/multicast-udp-face.cpp
index 62b20eb..f0e752b 100644
--- a/daemon/face/multicast-udp-face.cpp
+++ b/daemon/face/multicast-udp-face.cpp
@@ -12,7 +12,7 @@
 
 
 MulticastUdpFace::MulticastUdpFace(const shared_ptr<MulticastUdpFace::protocol::socket>& socket)
-  : DatagramFace<protocol>(FaceUri(socket->local_endpoint()), socket, true)
+  : DatagramFace<protocol>(FaceUri(socket->local_endpoint()), socket, false)
 {
   NFD_LOG_DEBUG("Face creation. Multicast group: "
                 << m_socket->local_endpoint());
diff --git a/daemon/face/stream-face.hpp b/daemon/face/stream-face.hpp
index a623665..f6c008a 100644
--- a/daemon/face/stream-face.hpp
+++ b/daemon/face/stream-face.hpp
@@ -26,7 +26,8 @@
    */
   explicit
   StreamFace(const FaceUri& uri,
-             const shared_ptr<typename protocol::socket>& socket);
+             const shared_ptr<typename protocol::socket>& socket,
+             bool isOnDemand);
 
   virtual
   ~StreamFace();
@@ -99,11 +100,13 @@
 template<class T, class FaceBase>
 inline
 StreamFace<T, FaceBase>::StreamFace(const FaceUri& uri,
-                                    const shared_ptr<typename StreamFace::protocol::socket>& socket)
+                                    const shared_ptr<typename StreamFace::protocol::socket>& socket,
+                                    bool isOnDemand)
   : FaceBase(uri)
   , m_socket(socket)
   , m_inputBufferSize(0)
 {
+  FaceBase::setOnDemand(isOnDemand);
   StreamFaceValidator<T, FaceBase>::validateSocket(*socket);
   m_socket->async_receive(boost::asio::buffer(m_inputBuffer, MAX_NDN_PACKET_SIZE), 0,
                           bind(&StreamFace<T, FaceBase>::handleReceive, this, _1, _2));
diff --git a/daemon/face/tcp-channel.cpp b/daemon/face/tcp-channel.cpp
index c27f1df..28fdfa5 100644
--- a/daemon/face/tcp-channel.cpp
+++ b/daemon/face/tcp-channel.cpp
@@ -112,15 +112,16 @@
 
 void
 TcpChannel::createFace(const shared_ptr<ip::tcp::socket>& socket,
-                       const FaceCreatedCallback& onFaceCreated)
+                       const FaceCreatedCallback& onFaceCreated,
+                       bool isOnDemand)
 {
   tcp::Endpoint remoteEndpoint = socket->remote_endpoint();
 
   shared_ptr<Face> face;
   if (socket->local_endpoint().address().is_loopback())
-    face = make_shared<TcpLocalFace>(boost::cref(socket));
+    face = make_shared<TcpLocalFace>(boost::cref(socket), isOnDemand);
   else
-    face = make_shared<TcpFace>(boost::cref(socket));
+    face = make_shared<TcpFace>(boost::cref(socket), isOnDemand);
 
   face->onFail += bind(&TcpChannel::afterFaceFailed, this, remoteEndpoint);
 
@@ -164,7 +165,7 @@
 
   NFD_LOG_DEBUG("[" << m_localEndpoint << "] "
                 "<< Connection from " << socket->remote_endpoint());
-  createFace(socket, onFaceCreated);
+  createFace(socket, onFaceCreated, true);
 }
 
 void
@@ -193,7 +194,7 @@
   NFD_LOG_DEBUG("[" << m_localEndpoint << "] "
                 ">> Connection to " << socket->remote_endpoint());
 
-  createFace(socket, onFaceCreated);
+  createFace(socket, onFaceCreated, false);
 }
 
 void
diff --git a/daemon/face/tcp-channel.hpp b/daemon/face/tcp-channel.hpp
index 61a9c05..3c56cb1 100644
--- a/daemon/face/tcp-channel.hpp
+++ b/daemon/face/tcp-channel.hpp
@@ -88,7 +88,8 @@
 private:
   void
   createFace(const shared_ptr<boost::asio::ip::tcp::socket>& socket,
-             const FaceCreatedCallback& onFaceCreated);
+             const FaceCreatedCallback& onFaceCreated,
+             bool isOnDemand);
 
   void
   afterFaceFailed(tcp::Endpoint &endpoint);
diff --git a/daemon/face/tcp-face.cpp b/daemon/face/tcp-face.cpp
index 6f85a21..c543011 100644
--- a/daemon/face/tcp-face.cpp
+++ b/daemon/face/tcp-face.cpp
@@ -16,15 +16,15 @@
 NFD_LOG_INCLASS_2TEMPLATE_SPECIALIZATION_DEFINE(StreamFace,
                                                 TcpLocalFace::protocol, LocalFace, "TcpLocalFace");
 
-TcpFace::TcpFace(const shared_ptr<TcpFace::protocol::socket>& socket)
-  : StreamFace<protocol>(FaceUri(socket->remote_endpoint()), socket)
+TcpFace::TcpFace(const shared_ptr<TcpFace::protocol::socket>& socket, bool isOnDemand)
+  : StreamFace<protocol>(FaceUri(socket->remote_endpoint()), socket, isOnDemand)
 {
 }
 
 //
 
-TcpLocalFace::TcpLocalFace(const shared_ptr<TcpLocalFace::protocol::socket>& socket)
-  : StreamFace<protocol, LocalFace>(FaceUri(socket->remote_endpoint()), socket)
+TcpLocalFace::TcpLocalFace(const shared_ptr<TcpLocalFace::protocol::socket>& socket, bool isOnDemand)
+  : StreamFace<protocol, LocalFace>(FaceUri(socket->remote_endpoint()), socket, isOnDemand)
 {
 }
 
diff --git a/daemon/face/tcp-face.hpp b/daemon/face/tcp-face.hpp
index 1686403..92ab627 100644
--- a/daemon/face/tcp-face.hpp
+++ b/daemon/face/tcp-face.hpp
@@ -22,7 +22,7 @@
   typedef boost::asio::ip::tcp protocol;
 
   explicit
-  TcpFace(const shared_ptr<protocol::socket>& socket);
+  TcpFace(const shared_ptr<protocol::socket>& socket, bool isOnDemand);
 };
 
 //
@@ -38,7 +38,7 @@
   typedef boost::asio::ip::tcp protocol;
 
   explicit
-  TcpLocalFace(const shared_ptr<protocol::socket>& socket);
+  TcpLocalFace(const shared_ptr<protocol::socket>& socket, bool isOnDemand);
 };
 
 
diff --git a/daemon/face/udp-channel.cpp b/daemon/face/udp-channel.cpp
index 9151830..390b412 100644
--- a/daemon/face/udp-channel.cpp
+++ b/daemon/face/udp-channel.cpp
@@ -80,7 +80,7 @@
 {
   ChannelFaceMap::iterator i = m_channelFaces.find(remoteEndpoint);
   if (i != m_channelFaces.end()) {
-    i->second->setPermanent(true);
+    i->second->setOnDemand(false);
     onFaceCreated(i->second);
     return;
   }
@@ -104,7 +104,7 @@
     throw Error("Failed to properly configure the socket. Check the address ("
                 + std::string(e.what()) + ")");
   }
-  createFace(clientSocket, onFaceCreated, true);
+  createFace(clientSocket, onFaceCreated, false);
 }
 
 void
@@ -157,11 +157,11 @@
 shared_ptr<UdpFace>
 UdpChannel::createFace(const shared_ptr<ip::udp::socket>& socket,
                        const FaceCreatedCallback& onFaceCreated,
-                       bool isPermanent)
+                       bool isOnDemand)
 {
   udp::Endpoint remoteEndpoint = socket->remote_endpoint();
 
-  shared_ptr<UdpFace> face = make_shared<UdpFace>(boost::cref(socket), isPermanent);
+  shared_ptr<UdpFace> face = make_shared<UdpFace>(boost::cref(socket), isOnDemand);
   face->onFail += bind(&UdpChannel::afterFaceFailed, this, remoteEndpoint);
 
   onFaceCreated(face);
@@ -204,7 +204,7 @@
 
     face = createFace(clientSocket,
                       onFaceCreatedNewPeerCallback,
-                      false);
+                      true);
   }
 
   //Passing the message to the correspondent face
@@ -233,7 +233,7 @@
   while (next != m_channelFaces.end()) {
     ChannelFaceMap::iterator it = next;
     next++;
-    if (!it->second->isPermanent() &&
+    if (it->second->isOnDemand() &&
         !it->second->hasBeenUsedRecently()) {
       //face has been idle since the last time closeIdleFaces
       //has been called. Going to close it
diff --git a/daemon/face/udp-channel.hpp b/daemon/face/udp-channel.hpp
index 26c6cae..0243dd6 100644
--- a/daemon/face/udp-channel.hpp
+++ b/daemon/face/udp-channel.hpp
@@ -96,7 +96,7 @@
   shared_ptr<UdpFace>
   createFace(const shared_ptr<boost::asio::ip::udp::socket>& socket,
              const FaceCreatedCallback& onFaceCreated,
-             bool isPermanent);
+             bool isOnDemand);
   void
   afterFaceFailed(udp::Endpoint& endpoint);
 
@@ -152,7 +152,7 @@
   bool m_isListening;
   
   /**
-   * \brief every time m_idleFaceTimeout expires all the idle (and not permanent)
+   * \brief every time m_idleFaceTimeout expires all the idle (and on-demand)
    *        faces will be removed
    */
   time::seconds m_idleFaceTimeout;
diff --git a/daemon/face/udp-face.cpp b/daemon/face/udp-face.cpp
index d9ba1f3..7de4d34 100644
--- a/daemon/face/udp-face.cpp
+++ b/daemon/face/udp-face.cpp
@@ -11,10 +11,10 @@
 NFD_LOG_INCLASS_TEMPLATE_SPECIALIZATION_DEFINE(DatagramFace, UdpFace::protocol, "UdpFace");
 
 UdpFace::UdpFace(const shared_ptr<UdpFace::protocol::socket>& socket,
-                 bool isPermanent)
+                 bool isOnDemand)
   : DatagramFace<protocol>(FaceUri(socket->remote_endpoint()),
                            socket,
-                           isPermanent)
+                           isOnDemand)
 {
 }
 
diff --git a/daemon/face/udp-face.hpp b/daemon/face/udp-face.hpp
index 038c7c3..6c1e3a8 100644
--- a/daemon/face/udp-face.hpp
+++ b/daemon/face/udp-face.hpp
@@ -22,7 +22,7 @@
   typedef boost::asio::ip::udp protocol;
 
   UdpFace(const shared_ptr<protocol::socket>& socket,
-          bool isPermanent);
+          bool isOnDemand);
 
   //@todo if needed by other datagramFaces, it could be moved to datagram-face.hpp
   /**
diff --git a/daemon/face/udp-factory.cpp b/daemon/face/udp-factory.cpp
index 5fcfd1c..7352a99 100644
--- a/daemon/face/udp-factory.cpp
+++ b/daemon/face/udp-factory.cpp
@@ -60,7 +60,7 @@
 
 shared_ptr<MulticastUdpFace>
 UdpFactory::createMulticastFace(const udp::Endpoint& localEndpoint,
-                                       const udp::Endpoint& multicastEndpoint)
+                                const udp::Endpoint& multicastEndpoint)
 {
   //checking if the local and musticast endpoint are already in use for a multicast face
   shared_ptr<MulticastUdpFace> multicastFace = findMulticastFace(localEndpoint);
diff --git a/daemon/face/unix-stream-face.cpp b/daemon/face/unix-stream-face.cpp
index 43e2369..2753f57 100644
--- a/daemon/face/unix-stream-face.cpp
+++ b/daemon/face/unix-stream-face.cpp
@@ -16,7 +16,7 @@
                                                 "UnixStreamFace");
 
 UnixStreamFace::UnixStreamFace(const shared_ptr<UnixStreamFace::protocol::socket>& socket)
-  : StreamFace<protocol, LocalFace>(FaceUri(socket->local_endpoint()), socket)
+  : StreamFace<protocol, LocalFace>(FaceUri(socket->local_endpoint()), socket, true)
 {
 }
 
diff --git a/daemon/face/unix-stream-face.hpp b/daemon/face/unix-stream-face.hpp
index 8492f54..02ccbb5 100644
--- a/daemon/face/unix-stream-face.hpp
+++ b/daemon/face/unix-stream-face.hpp
@@ -25,7 +25,6 @@
 public:
   typedef boost::asio::local::stream_protocol protocol;
 
-  explicit
   UnixStreamFace(const shared_ptr<protocol::socket>& socket);
 };
 
diff --git a/daemon/mgmt/face-manager.cpp b/daemon/mgmt/face-manager.cpp
index e4769ff..28f8a16 100644
--- a/daemon/mgmt/face-manager.cpp
+++ b/daemon/mgmt/face-manager.cpp
@@ -655,7 +655,9 @@
 {
   ndn::nfd::FaceEventNotification faceCreated(ndn::nfd::FACE_EVENT_CREATED,
                                               face->getId(),
-                                              face->getUri().toString());
+                                              face->getUri().toString(),
+                                              (face->isLocal() ? ndn::nfd::FACE_IS_LOCAL : 0) |
+                                              (face->isOnDemand() ? ndn::nfd::FACE_IS_ON_DEMAND : 0));
 
   m_notificationStream.postNotification(faceCreated);
 }
@@ -665,7 +667,9 @@
 {
   ndn::nfd::FaceEventNotification faceDestroyed(ndn::nfd::FACE_EVENT_DESTROYED,
                                                 face->getId(),
-                                                face->getUri().toString());
+                                                face->getUri().toString(),
+                                                (face->isLocal() ? ndn::nfd::FACE_IS_LOCAL : 0) |
+                                                (face->isOnDemand() ? ndn::nfd::FACE_IS_ON_DEMAND : 0));
 
   m_notificationStream.postNotification(faceDestroyed);
 }
