diff --git a/tests/unit-tests/ims/in-memory-storage.t.cpp b/tests/unit-tests/ims/in-memory-storage.t.cpp
index 5a731b1..0cec78a 100644
--- a/tests/unit-tests/ims/in-memory-storage.t.cpp
+++ b/tests/unit-tests/ims/in-memory-storage.t.cpp
@@ -307,7 +307,7 @@
   BOOST_REQUIRE(tmp2 == tmp1);
 
   int i = 0;
-  for (;it != ims.end(); it++) {
+  for (; it != ims.end(); it++) {
     std::ostringstream convert;
     convert << i;
     Name name("/" + convert.str());
diff --git a/tests/unit-tests/security/v2/trust-anchor-container.t.cpp b/tests/unit-tests/security/v2/trust-anchor-container.t.cpp
index 30749ac..efd6ca3 100644
--- a/tests/unit-tests/security/v2/trust-anchor-container.t.cpp
+++ b/tests/unit-tests/security/v2/trust-anchor-container.t.cpp
@@ -46,16 +46,15 @@
 public:
   AnchorContainerTestFixture()
   {
-    boost::filesystem::create_directory(boost::filesystem::path(UNIT_TEST_CONFIG_PATH));
+    namespace fs = boost::filesystem;
 
-    certDirPath = boost::filesystem::path(UNIT_TEST_CONFIG_PATH) / std::string("test-cert-dir");
-    boost::filesystem::create_directory(certDirPath);
+    fs::create_directory(fs::path(UNIT_TEST_CONFIG_PATH));
 
-    certPath1 = boost::filesystem::path(UNIT_TEST_CONFIG_PATH) /
-      std::string("test-cert-dir") / std::string("trust-anchor-1.cert");
+    certDirPath = fs::path(UNIT_TEST_CONFIG_PATH) / "test-cert-dir";
+    fs::create_directory(certDirPath);
 
-    certPath2 = boost::filesystem::path(UNIT_TEST_CONFIG_PATH) /
-      std::string("test-cert-dir") / std::string("trust-anchor-2.cert");
+    certPath1 = fs::path(UNIT_TEST_CONFIG_PATH) / "test-cert-dir" / "trust-anchor-1.cert";
+    certPath2 = fs::path(UNIT_TEST_CONFIG_PATH) / "test-cert-dir" / "trust-anchor-2.cert";
 
     identity1 = addIdentity("/TestAnchorContainer/First");
     cert1 = identity1.getDefaultKey().getDefaultCertificate();
diff --git a/tests/unit-tests/security/v2/validator-config/rule.t.cpp b/tests/unit-tests/security/v2/validator-config/rule.t.cpp
index 6c2e631..bb78dfe 100644
--- a/tests/unit-tests/security/v2/validator-config/rule.t.cpp
+++ b/tests/unit-tests/security/v2/validator-config/rule.t.cpp
@@ -1,6 +1,6 @@
 /* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
 /*
- * Copyright (c) 2013-2017 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).
  *
@@ -157,9 +157,9 @@
 
 BOOST_FIXTURE_TEST_CASE_TEMPLATE(FilterAndChecker, PktType, PktTypes, RuleFixture<PktType::value>)
 {
-  std::string config = std::string("") + R"CONF(
+  std::string config = R"CONF(
       id rule-id
-      for )CONF" + (PktType::value == tlv::Data ? "data" : "interest") + R"CONF(
+      for )CONF" + (PktType::value == tlv::Data ? "data"s : "interest"s) + R"CONF(
       filter
       {
         type name
diff --git a/tests/unit-tests/transport/tcp-transport.t.cpp b/tests/unit-tests/transport/tcp-transport.t.cpp
index 2386553..02bd9c3 100644
--- a/tests/unit-tests/transport/tcp-transport.t.cpp
+++ b/tests/unit-tests/transport/tcp-transport.t.cpp
@@ -1,6 +1,6 @@
 /* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
-/**
- * Copyright (c) 2013-2016 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).
  *
@@ -45,7 +45,7 @@
   BOOST_CHECK_EXCEPTION(TcpTransport::getSocketHostAndPortFromUri("tcp://:6000"),
                         Transport::Error,
                         [] (const Transport::Error& error) {
-                          return error.what() == std::string("Malformed URI: tcp://:6000");
+                          return error.what() == "Malformed URI: tcp://:6000"s;
                         });
 }
 
@@ -70,8 +70,7 @@
   BOOST_CHECK_EXCEPTION(TcpTransport::getSocketHostAndPortFromUri("unix://"),
                         Transport::Error,
                         [] (const Transport::Error& error) {
-                          return error.what() == std::string("Cannot create TcpTransport "
-                                                             "from \"unix\" URI");
+                          return error.what() == "Cannot create TcpTransport from \"unix\" URI"s;
                         });
 }
 
@@ -80,7 +79,7 @@
   BOOST_CHECK_EXCEPTION(TcpTransport::getSocketHostAndPortFromUri("tcp"),
                         Transport::Error,
                         [] (const Transport::Error& error) {
-                          return error.what() == std::string("Malformed URI: tcp");
+                          return error.what() == "Malformed URI: tcp"s;
                         });
 }
 
diff --git a/tests/unit-tests/transport/unix-transport.t.cpp b/tests/unit-tests/transport/unix-transport.t.cpp
index f3d4cac..f60f9d7 100644
--- a/tests/unit-tests/transport/unix-transport.t.cpp
+++ b/tests/unit-tests/transport/unix-transport.t.cpp
@@ -1,6 +1,6 @@
 /* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
-/**
- * Copyright (c) 2013-2016 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).
  *
@@ -47,8 +47,7 @@
   BOOST_CHECK_EXCEPTION(UnixTransport::getSocketNameFromUri("tcp://"),
                         Transport::Error,
                         [] (const Transport::Error& error) {
-                          return error.what() == std::string("Cannot create UnixTransport "
-                                                             "from \"tcp\" URI");
+                          return error.what() == "Cannot create UnixTransport from \"tcp\" URI"s;
                         });
 }
 
@@ -57,7 +56,7 @@
   BOOST_CHECK_EXCEPTION(UnixTransport::getSocketNameFromUri("unix"),
                         Transport::Error,
                         [] (const Transport::Error& error) {
-                          return error.what() == std::string("Malformed URI: unix");
+                          return error.what() == "Malformed URI: unix"s;
                         });
 }
 
diff --git a/tests/unit-tests/util/signal.t.cpp b/tests/unit-tests/util/signal.t.cpp
index eb02324..70ab22f 100644
--- a/tests/unit-tests/util/signal.t.cpp
+++ b/tests/unit-tests/util/signal.t.cpp
@@ -1,6 +1,6 @@
 /* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
-/**
- * Copyright (c) 2013-2016 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).
  *
@@ -101,7 +101,7 @@
 
 BOOST_AUTO_TEST_CASE(TwoArguments)
 {
-  Signal<std::remove_pointer<decltype(this)>::type, int, int> sig;
+  Signal<std::remove_pointer_t<decltype(this)>, int, int> sig;
 
   int hit = 0;
   sig.connect([&hit] (int a, int b) {
@@ -138,8 +138,8 @@
   RefObject refObject;
   RefObject::s_copyCount = 0;
 
-  Signal<std::remove_pointer<decltype(this)>::type, RefObject> sig;
-  sig.connect([] (RefObject ro) {});
+  Signal<std::remove_pointer_t<decltype(this)>, RefObject> sig;
+  sig.connect([] (RefObject) {});
   sig(refObject);
 
   BOOST_CHECK_EQUAL(RefObject::s_copyCount, 1);
@@ -152,8 +152,8 @@
   RefObject refObject;
   RefObject::s_copyCount = 0;
 
-  Signal<std::remove_pointer<decltype(this)>::type, RefObject> sig;
-  sig.connect([] (const RefObject& ro) {});
+  Signal<std::remove_pointer_t<decltype(this)>, RefObject> sig;
+  sig.connect([] (const RefObject&) {});
   sig(refObject);
 
   BOOST_CHECK_EQUAL(RefObject::s_copyCount, 0);
