diff --git a/debug-tools/create-cert.cc b/debug-tools/create-cert.cc
index 09861d3..5941783 100644
--- a/debug-tools/create-cert.cc
+++ b/debug-tools/create-cert.cc
@@ -6,64 +6,50 @@
  */
 
 #include <ndn-cxx/security/key-chain.hpp>
+#include <ndn-cxx/security/signing-helpers.hpp>
+#include <ndn-cxx/util/io.hpp>
+#include <iostream>
 
 using namespace ndn;
+using ndn::security::Certificate;
+using ndn::security::pib::Identity;
+using ndn::security::pib::Key;
+
+void
+generateCertificate(KeyChain& keyChain, Name name) {
+  try {
+    keyChain.getPib().getIdentity(name);
+  } catch (ndn::security::pib::Pib::Error&) {
+    Identity id = keyChain.createIdentity(name);
+    Key key = id.getDefaultKey();
+    Certificate cert = Certificate(key.getDefaultCertificate());
+
+    ndn::SignatureInfo signatureInfo;
+    signatureInfo.setValidityPeriod(ndn::security::ValidityPeriod(
+      time::system_clock::now(), time::system_clock::now() + time::days(7300)));
+
+    keyChain.sign(cert, security::signingByIdentity("/ndn/test").setSignatureInfo(signatureInfo));
+    keyChain.setDefaultCertificate(key, cert);
+
+    std::cout << "Generated cert " << cert.getName() << " with KeyLocator " << cert.getKeyLocator().value() << std::endl;
+  }
+}
 
 int
 main()
 {
-  KeyChain keyChain("sqlite3", "file");
-  std::vector<CertificateSubjectDescription> subjectDescription;
+  KeyChain keyChain;
 
-  Name root("/ndn");
-  Name rootCertName = keyChain.createIdentity(root);
+  // Root certificate
+  generateCertificate(keyChain, "/ndn/test");
 
-  Name test("/ndn/test");
-  Name testKeyName = keyChain.generateRsaKeyPairAsDefault(test, true);
-  shared_ptr<IdentityCertificate> testCert =
-    keyChain.prepareUnsignedIdentityCertificate(testKeyName, root,
-                                                time::system_clock::now(),
-                                                time::system_clock::now() + time::days(7300),
-                                                subjectDescription);
-  keyChain.signByIdentity(*testCert, root);
-  keyChain.addCertificateAsIdentityDefault(*testCert);
+  // Test certificates
+  generateCertificate(keyChain, "/ndn/test/alice");
+  generateCertificate(keyChain, "/ndn/test/bob");
+  generateCertificate(keyChain, "/ndn/test/cathy");
 
-  Name alice("/ndn/test/alice");
-  if(!keyChain.doesIdentityExist(alice))
-    {
-      Name aliceKeyName = keyChain.generateRsaKeyPairAsDefault(alice, true);
-      shared_ptr<IdentityCertificate> aliceCert =
-        keyChain.prepareUnsignedIdentityCertificate(aliceKeyName, test,
-                                                    time::system_clock::now(),
-                                                    time::system_clock::now() + time::days(7300),
-                                                    subjectDescription);
-      keyChain.signByIdentity(*aliceCert, test);
-      keyChain.addCertificateAsIdentityDefault(*aliceCert);
-    }
-
-  Name bob("/ndn/test/bob");
-  if(!keyChain.doesIdentityExist(bob))
-    {
-      Name bobKeyName = keyChain.generateRsaKeyPairAsDefault(bob, true);
-      shared_ptr<IdentityCertificate> bobCert =
-        keyChain.prepareUnsignedIdentityCertificate(bobKeyName, test,
-                                                    time::system_clock::now(),
-                                                    time::system_clock::now() + time::days(7300),
-                                                    subjectDescription);
-      keyChain.signByIdentity(*bobCert, test);
-      keyChain.addCertificateAsIdentityDefault(*bobCert);
-    }
-
-  Name cathy("/ndn/test/cathy");
-  if(!keyChain.doesIdentityExist(cathy))
-    {
-      Name cathyKeyName = keyChain.generateRsaKeyPairAsDefault(cathy, true);
-      shared_ptr<IdentityCertificate> cathyCert =
-        keyChain.prepareUnsignedIdentityCertificate(cathyKeyName, test,
-                                                    time::system_clock::now(),
-                                                    time::system_clock::now() + time::days(7300),
-                                                    subjectDescription);
-      keyChain.signByIdentity(*cathyCert, test);
-      keyChain.addCertificateAsIdentityDefault(*cathyCert);
-    }
+  std::ofstream file("security/test-anchor.cert");
+  ndn::io::saveBlock(keyChain.getPib().getIdentity("/ndn/test")
+                             .getDefaultKey().getDefaultCertificate().wireEncode(),
+                     file);
 }
diff --git a/debug-tools/dump-cert.cc b/debug-tools/dump-cert.cc
deleted file mode 100644
index 7050175..0000000
--- a/debug-tools/dump-cert.cc
+++ /dev/null
@@ -1,40 +0,0 @@
-/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil -*- */
-/**
- * Copyright (C) 2013 Regents of the University of California.
- * @author: Yingdi Yu <yingdi@cs.ucla.edu>
- * See COPYING for copyright and distribution information.
- */
-
-#include "common.hpp"
-#include <ndn-cxx/security/key-chain.hpp>
-#include <ndn-cxx/face.hpp>
-
-using namespace ndn;
-
-int
-main()
-{
-  Name root("/ndn");
-  Name test("/ndn/test");
-  Name alice("/ndn/test/alice");
-  Name bob("/ndn/test/bob");
-  Name cathy("/ndn/test/cathy");
-
-  KeyChain keyChain("sqlite3", "file");
-
-  if (!keyChain.doesIdentityExist(root) ||
-      !keyChain.doesIdentityExist(test) ||
-      !keyChain.doesIdentityExist(alice) ||
-      !keyChain.doesIdentityExist(bob) ||
-      !keyChain.doesIdentityExist(cathy))
-    return 1;
-
-  Face face;
-
-  face.put(*keyChain.getCertificate(keyChain.getDefaultCertificateNameForIdentity(test)));
-  face.put(*keyChain.getCertificate(keyChain.getDefaultCertificateNameForIdentity(alice)));
-  face.put(*keyChain.getCertificate(keyChain.getDefaultCertificateNameForIdentity(bob)));
-  face.put(*keyChain.getCertificate(keyChain.getDefaultCertificateNameForIdentity(cathy)));
-
-  face.getIoService().run();
-}
