diff --git a/src/encoding/estimator.hpp b/src/encoding/estimator.hpp
index 364f953..11f9e39 100644
--- a/src/encoding/estimator.hpp
+++ b/src/encoding/estimator.hpp
@@ -1,6 +1,6 @@
 /* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
-/**
- * Copyright (c) 2013-2015 Regents of the University of California.
+/*
+ * Copyright (c) 2013-2018 Regents of the University of California.
  *
  * This file is part of ndn-cxx library (NDN C++ library with eXperimental eXtensions).
  *
@@ -22,7 +22,6 @@
 #ifndef NDN_ENCODING_ESTIMATOR_HPP
 #define NDN_ENCODING_ESTIMATOR_HPP
 
-#include "../common.hpp"
 #include "block.hpp"
 
 namespace ndn {
@@ -33,129 +32,118 @@
  * Interface of this class (mostly) matches interface of Encoder class
  * @sa Encoder
  */
-class Estimator
+class Estimator : noncopyable
 {
 public: // common interface between Encoder and Estimator
   /**
-   * @brief Create instance of the estimator
-   * @param totalReserve    not used (for compatibility with the Encoder)
-   * @param reserveFromBack not used (for compatibility with the Encoder)
-   */
-  explicit
-  Estimator(size_t totalReserve = 0, size_t reserveFromBack = 0);
-
-  Estimator(const Estimator&) = delete;
-
-  Estimator&
-  operator=(const Estimator&) = delete;
-
-  /**
    * @brief Prepend a byte
    */
-  size_t
-  prependByte(uint8_t value);
+  constexpr size_t
+  prependByte(uint8_t) const noexcept
+  {
+    return 1;
+  }
 
   /**
    * @brief Append a byte
    */
-  size_t
-  appendByte(uint8_t value);
+  constexpr size_t
+  appendByte(uint8_t) const noexcept
+  {
+    return 1;
+  }
 
   /**
    * @brief Prepend a byte array @p array of length @p length
    */
-  size_t
-  prependByteArray(const uint8_t* array, size_t length);
+  constexpr size_t
+  prependByteArray(const uint8_t*, size_t length) const noexcept
+  {
+    return length;
+  }
 
   /**
    * @brief Append a byte array @p array of length @p length
    */
-  size_t
-  appendByteArray(const uint8_t* array, size_t length);
+  constexpr size_t
+  appendByteArray(const uint8_t*, size_t length) const noexcept
+  {
+    return length;
+  }
 
   /**
    * @brief Prepend range of bytes from the range [@p first, @p last)
    */
   template<class Iterator>
   size_t
-  prependRange(Iterator first, Iterator last);
+  prependRange(Iterator first, Iterator last) const noexcept
+  {
+    return std::distance(first, last);
+  }
 
   /**
    * @brief Append range of bytes from the range [@p first, @p last)
    */
   template<class Iterator>
   size_t
-  appendRange(Iterator first, Iterator last);
+  appendRange(Iterator first, Iterator last) const noexcept
+  {
+    return std::distance(first, last);
+  }
 
   /**
    * @brief Prepend VarNumber @p varNumber of NDN TLV encoding
    * @sa http://named-data.net/doc/ndn-tlv/
    */
   size_t
-  prependVarNumber(uint64_t varNumber);
+  prependVarNumber(uint64_t varNumber) const noexcept;
 
   /**
    * @brief Prepend VarNumber @p varNumber of NDN TLV encoding
    * @sa http://named-data.net/doc/ndn-tlv/
    */
   size_t
-  appendVarNumber(uint64_t varNumber);
+  appendVarNumber(uint64_t varNumber) const noexcept;
 
   /**
    * @brief Prepend non-negative integer @p integer of NDN TLV encoding
    * @sa http://named-data.net/doc/ndn-tlv/
    */
   size_t
-  prependNonNegativeInteger(uint64_t integer);
+  prependNonNegativeInteger(uint64_t integer) const noexcept;
 
   /**
    * @brief Append non-negative integer @p integer of NDN TLV encoding
    * @sa http://named-data.net/doc/ndn-tlv/
    */
   size_t
-  appendNonNegativeInteger(uint64_t integer);
+  appendNonNegativeInteger(uint64_t integer) const noexcept;
 
   /**
    * @brief Prepend TLV block of type @p type and value from buffer @p array of size @p arraySize
    */
   size_t
-  prependByteArrayBlock(uint32_t type, const uint8_t* array, size_t arraySize);
+  prependByteArrayBlock(uint32_t type, const uint8_t* array, size_t arraySize) const noexcept;
 
   /**
    * @brief Append TLV block of type @p type and value from buffer @p array of size @p arraySize
    */
   size_t
-  appendByteArrayBlock(uint32_t type, const uint8_t* array, size_t arraySize);
+  appendByteArrayBlock(uint32_t type, const uint8_t* array, size_t arraySize) const noexcept;
 
   /**
    * @brief Prepend TLV block @p block
    */
   size_t
-  prependBlock(const Block& block);
+  prependBlock(const Block& block) const;
 
   /**
    * @brief Append TLV block @p block
    */
   size_t
-  appendBlock(const Block& block);
+  appendBlock(const Block& block) const;
 };
 
-
-template<class Iterator>
-inline size_t
-Estimator::prependRange(Iterator first, Iterator last)
-{
-  return std::distance(first, last);
-}
-
-
-template<class Iterator>
-inline size_t
-Estimator::appendRange(Iterator first, Iterator last)
-{
-  return prependRange(first, last);
-}
-
 } // namespace encoding
 } // namespace ndn
 
