diff --git a/ndn-cxx/security/transform.hpp b/ndn-cxx/security/transform.hpp
index c3d41a3..91fda3b 100644
--- a/ndn-cxx/security/transform.hpp
+++ b/ndn-cxx/security/transform.hpp
@@ -1,6 +1,6 @@
 /* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
 /*
- * Copyright (c) 2013-2018 Regents of the University of California.
+ * Copyright (c) 2013-2019 Regents of the University of California.
  *
  * This file is part of ndn-cxx library (NDN C++ library with eXperimental eXtensions).
  *
@@ -37,7 +37,6 @@
 
 #include "ndn-cxx/security/transform/block-cipher.hpp"
 #include "ndn-cxx/security/transform/digest-filter.hpp"
-#include "ndn-cxx/security/transform/hmac-filter.hpp"
 #include "ndn-cxx/security/transform/private-key.hpp"
 #include "ndn-cxx/security/transform/public-key.hpp"
 #include "ndn-cxx/security/transform/signer-filter.hpp"
diff --git a/ndn-cxx/security/transform/hmac-filter.cpp b/ndn-cxx/security/transform/hmac-filter.cpp
deleted file mode 100644
index 205b480..0000000
--- a/ndn-cxx/security/transform/hmac-filter.cpp
+++ /dev/null
@@ -1,103 +0,0 @@
-/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
-/*
- * Copyright (c) 2013-2019 Regents of the University of California.
- *
- * This file is part of ndn-cxx library (NDN C++ library with eXperimental eXtensions).
- *
- * ndn-cxx library is free software: you can redistribute it and/or modify it under the
- * terms of the GNU Lesser General Public License as published by the Free Software
- * Foundation, either version 3 of the License, or (at your option) any later version.
- *
- * ndn-cxx library is distributed in the hope that it will be useful, but WITHOUT ANY
- * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A
- * PARTICULAR PURPOSE.  See the GNU Lesser General Public License for more details.
- *
- * You should have received copies of the GNU General Public License and GNU Lesser
- * General Public License along with ndn-cxx, e.g., in COPYING.md file.  If not, see
- * <http://www.gnu.org/licenses/>.
- *
- * See AUTHORS.md for complete list of ndn-cxx authors and contributors.
- */
-
-#include "ndn-cxx/security/transform/hmac-filter.hpp"
-#include "ndn-cxx/security/impl/openssl-helper.hpp"
-
-#include <boost/lexical_cast.hpp>
-
-namespace ndn {
-namespace security {
-namespace transform {
-
-class HmacFilter::Impl
-{
-public:
-  Impl()
-    : key(nullptr)
-  {
-  }
-
-  ~Impl()
-  {
-    EVP_PKEY_free(key);
-  }
-
-public:
-  detail::EvpMdCtx ctx;
-  EVP_PKEY* key;
-};
-
-
-HmacFilter::HmacFilter(DigestAlgorithm algo, const uint8_t* key, size_t keyLen)
-  : m_impl(make_unique<Impl>())
-{
-  BOOST_ASSERT(key != nullptr);
-  BOOST_ASSERT(keyLen > 0);
-
-  const EVP_MD* md = detail::digestAlgorithmToEvpMd(algo);
-  if (md == nullptr)
-    NDN_THROW(Error(getIndex(), "Unsupported digest algorithm " + boost::lexical_cast<std::string>(algo)));
-
-  m_impl->key = EVP_PKEY_new_mac_key(EVP_PKEY_HMAC, nullptr, key, static_cast<int>(keyLen));
-  if (m_impl->key == nullptr)
-    NDN_THROW(Error(getIndex(), "Failed to create HMAC key"));
-
-  if (EVP_DigestSignInit(m_impl->ctx, nullptr, md, nullptr, m_impl->key) != 1)
-    NDN_THROW(Error(getIndex(), "Failed to initialize HMAC context with " +
-                    boost::lexical_cast<std::string>(algo) + " digest"));
-}
-
-HmacFilter::~HmacFilter() = default;
-
-size_t
-HmacFilter::convert(const uint8_t* buf, size_t size)
-{
-  if (EVP_DigestSignUpdate(m_impl->ctx, buf, size) != 1)
-    NDN_THROW(Error(getIndex(), "Failed to accept more input"));
-
-  return size;
-}
-
-void
-HmacFilter::finalize()
-{
-  auto buffer = make_unique<OBuffer>(EVP_MAX_MD_SIZE);
-  size_t hmacLen = 0;
-
-  if (EVP_DigestSignFinal(m_impl->ctx, buffer->data(), &hmacLen) != 1)
-    NDN_THROW(Error(getIndex(), "Failed to finalize HMAC"));
-
-  buffer->erase(buffer->begin() + hmacLen, buffer->end());
-  setOutputBuffer(std::move(buffer));
-
-  flushAllOutput();
-}
-
-unique_ptr<Transform>
-hmacFilter(DigestAlgorithm algo, const uint8_t* key, size_t keyLen)
-{
-  return make_unique<HmacFilter>(algo, key, keyLen);
-}
-
-} // namespace transform
-} // namespace security
-} // namespace ndn
diff --git a/ndn-cxx/security/transform/hmac-filter.hpp b/ndn-cxx/security/transform/hmac-filter.hpp
deleted file mode 100644
index 2254ba7..0000000
--- a/ndn-cxx/security/transform/hmac-filter.hpp
+++ /dev/null
@@ -1,76 +0,0 @@
-/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
-/*
- * Copyright (c) 2013-2019 Regents of the University of California.
- *
- * This file is part of ndn-cxx library (NDN C++ library with eXperimental eXtensions).
- *
- * ndn-cxx library is free software: you can redistribute it and/or modify it under the
- * terms of the GNU Lesser General Public License as published by the Free Software
- * Foundation, either version 3 of the License, or (at your option) any later version.
- *
- * ndn-cxx library is distributed in the hope that it will be useful, but WITHOUT ANY
- * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A
- * PARTICULAR PURPOSE.  See the GNU Lesser General Public License for more details.
- *
- * You should have received copies of the GNU General Public License and GNU Lesser
- * General Public License along with ndn-cxx, e.g., in COPYING.md file.  If not, see
- * <http://www.gnu.org/licenses/>.
- *
- * See AUTHORS.md for complete list of ndn-cxx authors and contributors.
- */
-
-#ifndef NDN_CXX_SECURITY_TRANSFORM_HMAC_FILTER_HPP
-#define NDN_CXX_SECURITY_TRANSFORM_HMAC_FILTER_HPP
-
-#include "ndn-cxx/security/transform/transform-base.hpp"
-#include "ndn-cxx/security/security-common.hpp"
-
-namespace ndn {
-namespace security {
-namespace transform {
-
-/**
- * @brief The module to generate HMAC for input data.
- *
- * @deprecated Use SignerFilter and VerifierFilter.
- */
-class HmacFilter : public Transform
-{
-public:
-  /**
-   * @brief Create a module to generate HMAC using digest algorithm @p algo and key @p key
-   * @pre @p key must not be nullptr, and @p size must be a positive integer.
-   */
-  HmacFilter(DigestAlgorithm algo, const uint8_t* key, size_t keyLen);
-
-  ~HmacFilter();
-
-private:
-  /**
-   * @brief Write data @p buf into HMAC signer
-   *
-   * @return The number of bytes that are actually accepted
-   */
-  size_t
-  convert(const uint8_t* buf, size_t size) final;
-
-  /**
-   * @brief Finalize HMAC calculation and write the HMAC into next module.
-   */
-  void
-  finalize() final;
-
-private:
-  class Impl;
-  const unique_ptr<Impl> m_impl;
-};
-
-[[deprecated("use signerFilter and verifierFilter")]]
-unique_ptr<Transform>
-hmacFilter(DigestAlgorithm algo, const uint8_t* key, size_t keyLen);
-
-} // namespace transform
-} // namespace security
-} // namespace ndn
-
-#endif // NDN_CXX_SECURITY_TRANSFORM_HMAC_FILTER_HPP
diff --git a/tests/unit/security/transform.t.cpp b/tests/unit/security/transform.t.cpp
index 07958cd..901839b 100644
--- a/tests/unit/security/transform.t.cpp
+++ b/tests/unit/security/transform.t.cpp
@@ -1,6 +1,6 @@
 /* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
 /*
- * Copyright (c) 2013-2018 Regents of the University of California.
+ * Copyright (c) 2013-2019 Regents of the University of California.
  *
  * This file is part of ndn-cxx library (NDN C++ library with eXperimental eXtensions).
  *
@@ -65,9 +65,6 @@
   transform::DigestFilter* digestFilter = nullptr;
   BOOST_CHECK(digestFilter == nullptr);
 
-  transform::HmacFilter* hmacFilter = nullptr;
-  BOOST_CHECK(hmacFilter == nullptr);
-
   transform::BlockCipher* blockCipher = nullptr;
   BOOST_CHECK(blockCipher == nullptr);
 
diff --git a/tests/unit/security/transform/hmac-filter.t.cpp b/tests/unit/security/transform/hmac-filter.t.cpp
deleted file mode 100644
index 650c024..0000000
--- a/tests/unit/security/transform/hmac-filter.t.cpp
+++ /dev/null
@@ -1,111 +0,0 @@
-/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
-/*
- * Copyright (c) 2013-2018 Regents of the University of California.
- *
- * This file is part of ndn-cxx library (NDN C++ library with eXperimental eXtensions).
- *
- * ndn-cxx library is free software: you can redistribute it and/or modify it under the
- * terms of the GNU Lesser General Public License as published by the Free Software
- * Foundation, either version 3 of the License, or (at your option) any later version.
- *
- * ndn-cxx library is distributed in the hope that it will be useful, but WITHOUT ANY
- * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A
- * PARTICULAR PURPOSE.  See the GNU Lesser General Public License for more details.
- *
- * You should have received copies of the GNU General Public License and GNU Lesser
- * General Public License along with ndn-cxx, e.g., in COPYING.md file.  If not, see
- * <http://www.gnu.org/licenses/>.
- *
- * See AUTHORS.md for complete list of ndn-cxx authors and contributors.
- */
-
-#include "ndn-cxx/security/transform/hmac-filter.hpp"
-
-#include "ndn-cxx/encoding/buffer-stream.hpp"
-#include "ndn-cxx/security/transform/buffer-source.hpp"
-#include "ndn-cxx/security/transform/step-source.hpp"
-#include "ndn-cxx/security/transform/stream-sink.hpp"
-
-#include "tests/boost-test.hpp"
-
-namespace ndn {
-namespace security {
-namespace transform {
-namespace tests {
-
-BOOST_AUTO_TEST_SUITE(Security)
-BOOST_AUTO_TEST_SUITE(Transform)
-BOOST_AUTO_TEST_SUITE(TestHmacFilter)
-
-static const uint8_t key[] = {
-  0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
-  0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f
-};
-static const uint8_t data[] = {
-  0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
-  0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f
-};
-static const uint8_t digest[] = {
-  0x9f, 0x3a, 0xa2, 0x88, 0x26, 0xb3, 0x74, 0x85,
-  0xca, 0x05, 0x01, 0x4d, 0x71, 0x42, 0xb3, 0xea,
-  0x3f, 0xfb, 0xda, 0x5a, 0x35, 0xbf, 0xd2, 0x0f,
-  0x2f, 0x9c, 0x8f, 0xcc, 0x6d, 0x30, 0x48, 0x54
-};
-
-BOOST_AUTO_TEST_CASE(Basic)
-{
-  OBufferStream os;
-  bufferSource(data, sizeof(data)) >> hmacFilter(DigestAlgorithm::SHA256, key, sizeof(key)) >> streamSink(os);
-
-  ConstBufferPtr buf = os.buf();
-  BOOST_CHECK_EQUAL_COLLECTIONS(digest, digest + sizeof(digest), buf->begin(), buf->end());
-}
-
-BOOST_AUTO_TEST_CASE(StepByStep)
-{
-  OBufferStream os;
-  StepSource source;
-  source >> hmacFilter(DigestAlgorithm::SHA256, key, sizeof(key)) >> streamSink(os);
-  source.write(data, 1);
-  source.write(data + 1, 2);
-  source.write(data + 3, 3);
-  source.write(data + 6, 4);
-  source.write(data + 10, 5);
-  source.write(data + 15, 1);
-  source.end();
-
-  ConstBufferPtr buf = os.buf();
-  BOOST_CHECK_EQUAL_COLLECTIONS(digest, digest + sizeof(digest), buf->begin(), buf->end());
-}
-
-BOOST_AUTO_TEST_CASE(EmptyInput)
-{
-  const uint8_t digest[] = {
-    0x07, 0xEF, 0xF8, 0xB3, 0x26, 0xB7, 0x79, 0x8C,
-    0x9C, 0xCF, 0xCB, 0xDB, 0xE5, 0x79, 0x48, 0x9A,
-    0xC7, 0x85, 0xA7, 0x99, 0x5A, 0x04, 0x61, 0x8B,
-    0x1A, 0x28, 0x13, 0xC2, 0x67, 0x44, 0x77, 0x7D
-  };
-
-  OBufferStream os;
-  StepSource source;
-  source >> hmacFilter(DigestAlgorithm::SHA256, key, sizeof(key)) >> streamSink(os);
-  source.end();
-
-  ConstBufferPtr buf = os.buf();
-  BOOST_CHECK_EQUAL_COLLECTIONS(digest, digest + sizeof(digest), buf->begin(), buf->end());
-}
-
-BOOST_AUTO_TEST_CASE(InvalidAlgorithm)
-{
-  BOOST_CHECK_THROW(HmacFilter(DigestAlgorithm::NONE, key, sizeof(key)), Error);
-}
-
-BOOST_AUTO_TEST_SUITE_END() // TestHmacFilter
-BOOST_AUTO_TEST_SUITE_END() // Transform
-BOOST_AUTO_TEST_SUITE_END() // Security
-
-} // namespace tests
-} // namespace transform
-} // namespace security
-} // namespace ndn
