security: MemoryIdentityStorage: Implemented addIdentity, setDefaultIdentity.
diff --git a/ndn-cpp/security/identity/identity-storage.hpp b/ndn-cpp/security/identity/identity-storage.hpp
index 52ec3b4..daead73 100644
--- a/ndn-cpp/security/identity/identity-storage.hpp
+++ b/ndn-cpp/security/identity/identity-storage.hpp
@@ -137,7 +137,7 @@
 
   /**
    * Get the default identity. 
-   * @param return The name of default identity.
+   * @param return The name of default identity, or an empty name if there is no default.
    */
   virtual Name 
   getDefaultIdentity() = 0;
@@ -170,7 +170,8 @@
   getDefaultCertificateNameForKey(const Name& keyName) = 0;
 
   /**
-   * Set the default identity.
+   * Set the default identity.  If the identityName does not exist, then clear the default identity
+   * so that getDefaultIdentity() returns an empty name.
    * @param identityName The default identity name.
    */
   virtual void 
diff --git a/ndn-cpp/security/identity/memory-identity-storage.cpp b/ndn-cpp/security/identity/memory-identity-storage.cpp
index a7acf84..1e4f0fc 100644
--- a/ndn-cpp/security/identity/memory-identity-storage.cpp
+++ b/ndn-cpp/security/identity/memory-identity-storage.cpp
@@ -6,6 +6,7 @@
  */
 
 #include <stdexcept>
+#include "../security-exception.hpp"
 #include "memory-identity-storage.hpp"
 
 using namespace std;
@@ -20,17 +21,18 @@
 bool 
 MemoryIdentityStorage::doesIdentityExist(const Name& identityName)
 {
-#if 1
-  throw std::runtime_error("MemoryIdentityStorage::doesIdentityExist not implemented");
-#endif
+  string identityUri = identityName.toUri();
+  return find(identityStore_.begin(), identityStore_.end(), identityUri) != identityStore_.end();
 }
 
 void
 MemoryIdentityStorage::addIdentity(const Name& identityName)
 {
-#if 1
-  throw std::runtime_error("MemoryIdentityStorage::addIdentity not implemented");
-#endif
+  string identityUri = identityName.toUri();
+  if (find(identityStore_.begin(), identityStore_.end(), identityUri) != identityStore_.end())
+    throw SecurityException("Identity already exists: " + identityUri);
+  
+  identityStore_.push_back(identityUri);
 }
 
 bool 
@@ -129,9 +131,7 @@
 Name 
 MemoryIdentityStorage::getDefaultIdentity()
 {
-#if 1
-  throw std::runtime_error("MemoryIdentityStorage::getDefaultIdentity not implemented");
-#endif
+  return Name(defaultIdentity_);
 }
 
 Name 
@@ -153,9 +153,12 @@
 void 
 MemoryIdentityStorage::setDefaultIdentity(const Name& identityName)
 {
-#if 1
-  throw std::runtime_error("MemoryIdentityStorage::setDefaultIdentity not implemented");
-#endif
+  string identityUri = identityName.toUri();
+  if (find(identityStore_.begin(), identityStore_.end(), identityUri) != identityStore_.end())
+    defaultIdentity_ = identityUri;
+  else
+    // The identity doesn't exist, so clear the default.
+    defaultIdentity_.clear();
 }
 
 void 
diff --git a/ndn-cpp/security/identity/memory-identity-storage.hpp b/ndn-cpp/security/identity/memory-identity-storage.hpp
index b5b085a..dc8509d 100644
--- a/ndn-cpp/security/identity/memory-identity-storage.hpp
+++ b/ndn-cpp/security/identity/memory-identity-storage.hpp
@@ -8,6 +8,7 @@
 #ifndef NDN_MEMORY_IDENTITY_STORAGE_HPP
 #define	NDN_MEMORY_IDENTITY_STORAGE_HPP
 
+#include <vector>
 #include "identity-storage.hpp"
 
 namespace ndn {
@@ -132,7 +133,7 @@
 
   /**
    * Get the default identity. 
-   * @param return The name of default identity.
+   * @param return The name of default identity, or an empty name if there is no default.
    */
   virtual Name 
   getDefaultIdentity();
@@ -154,7 +155,8 @@
   getDefaultCertificateNameForKey(const Name& keyName);
 
   /**
-   * Set the default identity.
+   * Set the default identity.  If the identityName does not exist, then clear the default identity
+   * so that getDefaultIdentity() returns an empty name.
    * @param identityName The default identity name.
    */
   virtual void 
@@ -175,6 +177,10 @@
    */
   virtual void 
   setDefaultCertificateNameForKey(const Name& keyName, const Name& certificateName);  
+  
+private:
+  std::vector<std::string> identityStore_; /**< A list of name URI. */
+  std::string defaultIdentity_;            /**< The default identity in identityStore_, or "" if not defined. */
 };
 
 }
diff --git a/tests/test-encode-decode-data.cpp b/tests/test-encode-decode-data.cpp
index 452afbe..7521221 100644
--- a/tests/test-encode-decode-data.cpp
+++ b/tests/test-encode-decode-data.cpp
@@ -242,9 +242,11 @@
     KeyChain keyChain(shared_ptr<IdentityManager>(new IdentityManager(identityStorage, privateKeyStorage)));
     
     // Initialize the storage.
-    Name keyName("/testname/DSK-123");
-    Name certificateName = keyName;
-    certificateName.append(Name("ID-CERT/0"));
+    Name identityName("/testname");
+    Name keyName = Name(identityName).append(Name("DSK-123"));
+    Name certificateName = Name(keyName).append(Name("ID-CERT/0"));
+    identityStorage->addIdentity(identityName);
+    identityStorage->setDefaultIdentity(identityName);
     privateKeyStorage->setKeyPairForKeyName
       (keyName, DEFAULT_PUBLIC_KEY_DER, sizeof(DEFAULT_PUBLIC_KEY_DER), DEFAULT_PRIVATE_KEY_DER, sizeof(DEFAULT_PRIVATE_KEY_DER));