diff --git a/src/util/dummy-client-face.cpp b/src/util/dummy-client-face.cpp
index 911d3bb..f6150b3 100644
--- a/src/util/dummy-client-face.cpp
+++ b/src/util/dummy-client-face.cpp
@@ -43,28 +43,28 @@
     }
   }
 
-  virtual void
+  void
   close() override
   {
   }
 
-  virtual void
+  void
   pause() override
   {
   }
 
-  virtual void
+  void
   resume() override
   {
   }
 
-  virtual void
+  void
   send(const Block& wire) override
   {
     onSendBlock(wire);
   }
 
-  virtual void
+  void
   send(const Block& header, const Block& payload) override
   {
     EncodingBuffer encoder(header.size() + payload.size(), header.size() + payload.size());
diff --git a/src/util/dummy-client-face.hpp b/src/util/dummy-client-face.hpp
index 7d661a7..41d843e 100644
--- a/src/util/dummy-client-face.hpp
+++ b/src/util/dummy-client-face.hpp
@@ -111,7 +111,7 @@
   void
   enableRegistrationReply();
 
-  virtual void
+  void
   doProcessEvents(const time::milliseconds& timeout, bool keepThread) override;
 
 public:
diff --git a/src/util/face-uri.cpp b/src/util/face-uri.cpp
index acdbc11..fea4e16 100644
--- a/src/util/face-uri.cpp
+++ b/src/util/face-uri.cpp
@@ -241,7 +241,7 @@
 class IpHostCanonizeProvider : public CanonizeProvider
 {
 public:
-  virtual std::set<std::string>
+  std::set<std::string>
   getSchemes() const override
   {
     std::set<std::string> schemes;
@@ -251,7 +251,7 @@
     return schemes;
   }
 
-  virtual bool
+  bool
   isCanonical(const FaceUri& faceUri) const override
   {
     if (faceUri.getPort().empty()) {
@@ -276,7 +276,7 @@
            this->checkAddress(addr).first;
   }
 
-  virtual void
+  void
   canonize(const FaceUri& faceUri,
            const FaceUri::CanonizeSuccessCallback& onSuccess,
            const FaceUri::CanonizeFailureCallback& onFailure,
@@ -402,7 +402,7 @@
   }
 
 protected:
-  virtual std::pair<bool, std::string>
+  std::pair<bool, std::string>
   checkAddress(const dns::IpAddress& ipAddress) const override
   {
     if (ipAddress.is_multicast()) {
@@ -415,7 +415,7 @@
 class EtherCanonizeProvider : public CanonizeProvider
 {
 public:
-  virtual std::set<std::string>
+  std::set<std::string>
   getSchemes() const override
   {
     std::set<std::string> schemes;
@@ -423,7 +423,7 @@
     return schemes;
   }
 
-  virtual bool
+  bool
   isCanonical(const FaceUri& faceUri) const override
   {
     if (!faceUri.getPort().empty()) {
@@ -437,7 +437,7 @@
     return addr.toString() == faceUri.getHost();
   }
 
-  virtual void
+  void
   canonize(const FaceUri& faceUri,
            const FaceUri::CanonizeSuccessCallback& onSuccess,
            const FaceUri::CanonizeFailureCallback& onFailure,
@@ -458,13 +458,13 @@
 class UdpDevCanonizeProvider : public CanonizeProvider
 {
 public:
-  virtual std::set<std::string>
+  std::set<std::string>
   getSchemes() const override
   {
     return {"udp4+dev", "udp6+dev"};
   }
 
-  virtual bool
+  bool
   isCanonical(const FaceUri& faceUri) const override
   {
     if (faceUri.getPort().empty()) {
@@ -476,7 +476,7 @@
     return true;
   }
 
-  virtual void
+  void
   canonize(const FaceUri& faceUri,
            const FaceUri::CanonizeSuccessCallback& onSuccess,
            const FaceUri::CanonizeFailureCallback& onFailure,
diff --git a/src/util/in-memory-storage-fifo.hpp b/src/util/in-memory-storage-fifo.hpp
index 3710284..2bc1880 100644
--- a/src/util/in-memory-storage-fifo.hpp
+++ b/src/util/in-memory-storage-fifo.hpp
@@ -47,18 +47,18 @@
   /** @brief Removes one Data packet from in-memory storage based on FIFO
    *  @return{ whether the Data was removed }
    */
-  virtual bool
+  bool
   evictItem() override;
 
   /** @brief Update the entry after a entry is successfully inserted, add it to the cleanupIndex
    */
-  virtual void
+  void
   afterInsert(InMemoryStorageEntry* entry) override;
 
   /** @brief Update the entry or other data structures before a entry is successfully erased,
    *  erase it from the cleanupIndex
    */
-  virtual void
+  void
   beforeErase(InMemoryStorageEntry* entry) override;
 
 private:
diff --git a/src/util/in-memory-storage-lfu.hpp b/src/util/in-memory-storage-lfu.hpp
index d866a29..8a21d4c 100644
--- a/src/util/in-memory-storage-lfu.hpp
+++ b/src/util/in-memory-storage-lfu.hpp
@@ -51,24 +51,24 @@
    *  frequently accessed Data packet
    *  @return{ whether the Data was removed }
    */
-  virtual bool
+  bool
   evictItem() override;
 
   /** @brief Update the entry when the entry is returned by the find() function,
    *  increment the frequency according to LFU
    */
-  virtual void
+  void
   afterAccess(InMemoryStorageEntry* entry) override;
 
   /** @brief Update the entry after a entry is successfully inserted, add it to the cleanupIndex
    */
-  virtual void
+  void
   afterInsert(InMemoryStorageEntry* entry) override;
 
   /** @brief Update the entry or other data structures before a entry is successfully erased,
    *  erase it from the cleanupIndex
    */
-  virtual void
+  void
   beforeErase(InMemoryStorageEntry* entry) override;
 
 private:
diff --git a/src/util/in-memory-storage-lru.hpp b/src/util/in-memory-storage-lru.hpp
index 4787398..48b79a8 100644
--- a/src/util/in-memory-storage-lru.hpp
+++ b/src/util/in-memory-storage-lru.hpp
@@ -49,24 +49,24 @@
    *  recently accessed Data packet
    *  @return{ whether the Data was removed }
    */
-  virtual bool
+  bool
   evictItem() override;
 
   /** @brief Update the entry when the entry is returned by the find() function,
    *  update the last used time according to LRU
    */
-  virtual void
+  void
   afterAccess(InMemoryStorageEntry* entry) override;
 
   /** @brief Update the entry after a entry is successfully inserted, add it to the cleanupIndex
    */
-  virtual void
+  void
   afterInsert(InMemoryStorageEntry* entry) override;
 
   /** @brief Update the entry or other data structures before a entry is successfully erased,
    *  erase it from the cleanupIndex
    */
-  virtual void
+  void
   beforeErase(InMemoryStorageEntry* entry) override;
 
 private:
diff --git a/src/util/in-memory-storage-persistent.hpp b/src/util/in-memory-storage-persistent.hpp
index 3265f52..7e1a977 100644
--- a/src/util/in-memory-storage-persistent.hpp
+++ b/src/util/in-memory-storage-persistent.hpp
@@ -45,7 +45,7 @@
    *
    *  @return false
    */
-  virtual bool
+  bool
   evictItem() override;
 };
 
diff --git a/src/util/indented-stream.hpp b/src/util/indented-stream.hpp
index 31e5839..32b60e8 100644
--- a/src/util/indented-stream.hpp
+++ b/src/util/indented-stream.hpp
@@ -56,7 +56,6 @@
 public:
   IndentedStream(std::ostream& os, const std::string& indent);
 
-  virtual
   ~IndentedStream() override;
 
 private:
@@ -66,7 +65,7 @@
   public:
     StreamBuf(std::ostream& os, const std::string& indent);
 
-    virtual int
+    int
     sync() override;
 
   private:
diff --git a/src/util/notification-subscriber.hpp b/src/util/notification-subscriber.hpp
index bc7345c..9b86fe1 100644
--- a/src/util/notification-subscriber.hpp
+++ b/src/util/notification-subscriber.hpp
@@ -190,13 +190,13 @@
   signal::Signal<NotificationSubscriber, Notification> onNotification;
 
 private:
-  virtual bool
+  bool
   hasSubscriber() const override
   {
     return !onNotification.isEmpty();
   }
 
-  virtual bool
+  bool
   decodeAndDeliver(const Data& data) override
   {
     Notification notification;
diff --git a/src/util/time-unit-test-clock.hpp b/src/util/time-unit-test-clock.hpp
index 253e1e7..f099b84 100644
--- a/src/util/time-unit-test-clock.hpp
+++ b/src/util/time-unit-test-clock.hpp
@@ -89,13 +89,13 @@
   setNow(const nanoseconds& timeSinceEpoch);
 
 public: // CustomClock<BaseClock>
-  virtual std::string
+  std::string
   getSince() const override;
 
-  virtual typename BaseClock::time_point
+  typename BaseClock::time_point
   getNow() const override;
 
-  virtual boost::posix_time::time_duration
+  boost::posix_time::time_duration
   toPosixDuration(const typename BaseClock::duration& duration) const override;
 
 private:
