diff --git a/src/lsa/adj-lsa.cpp b/src/lsa/adj-lsa.cpp
index 3d49533..e6d2f6e 100644
--- a/src/lsa/adj-lsa.cpp
+++ b/src/lsa/adj-lsa.cpp
@@ -1,6 +1,6 @@
 /* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
 /*
- * Copyright (c) 2014-2021,  The University of Memphis,
+ * Copyright (c) 2014-2022,  The University of Memphis,
  *                           Regents of the University of California,
  *                           Arizona Board of Regents.
  *
@@ -62,7 +62,7 @@
   totalLength += Lsa::wireEncode(block);
 
   totalLength += block.prependVarNumber(totalLength);
-  totalLength += block.prependVarNumber(ndn::tlv::nlsr::AdjacencyLsa);
+  totalLength += block.prependVarNumber(nlsr::tlv::AdjacencyLsa);
 
   return totalLength;
 }
@@ -92,7 +92,7 @@
 {
   m_wire = wire;
 
-  if (m_wire.type() != ndn::tlv::nlsr::AdjacencyLsa) {
+  if (m_wire.type() != nlsr::tlv::AdjacencyLsa) {
     NDN_THROW(Error("AdjacencyLsa", m_wire.type()));
   }
 
@@ -100,7 +100,7 @@
 
   auto val = m_wire.elements_begin();
 
-  if (val != m_wire.elements_end() && val->type() == ndn::tlv::nlsr::Lsa) {
+  if (val != m_wire.elements_end() && val->type() == nlsr::tlv::Lsa) {
     Lsa::wireDecode(*val);
     ++val;
   }
@@ -110,7 +110,7 @@
 
   AdjacencyList adl;
   for (; val != m_wire.elements_end(); ++val) {
-    if (val->type() == ndn::tlv::nlsr::Adjacency) {
+    if (val->type() == nlsr::tlv::Adjacency) {
       adl.insert(Adjacent(*val));
     }
     else {
@@ -148,9 +148,9 @@
     for (const auto& adjacent : alsa->getAdl()) {
       addAdjacent(adjacent);
     }
-    return std::make_tuple(true, std::list<ndn::Name>{}, std::list<ndn::Name>{});
+    return {true, std::list<ndn::Name>{}, std::list<ndn::Name>{}};
   }
-  return std::make_tuple(false, std::list<ndn::Name>{}, std::list<ndn::Name>{});
+  return {false, std::list<ndn::Name>{}, std::list<ndn::Name>{}};
 }
 
 std::ostream&
diff --git a/src/lsa/coordinate-lsa.cpp b/src/lsa/coordinate-lsa.cpp
index f61fb29..fb268b2 100644
--- a/src/lsa/coordinate-lsa.cpp
+++ b/src/lsa/coordinate-lsa.cpp
@@ -1,6 +1,6 @@
 /* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
 /*
- * Copyright (c) 2014-2021,  The University of Memphis,
+ * Copyright (c) 2014-2022,  The University of Memphis,
  *                           Regents of the University of California,
  *                           Arizona Board of Regents.
  *
@@ -65,16 +65,15 @@
   size_t totalLength = 0;
 
   for (auto it = m_hyperbolicAngles.rbegin(); it != m_hyperbolicAngles.rend(); ++it) {
-    totalLength += ndn::encoding::prependDoubleBlock(block, ndn::tlv::nlsr::HyperbolicAngle, *it);
+    totalLength += ndn::encoding::prependDoubleBlock(block, nlsr::tlv::HyperbolicAngle, *it);
   }
 
-  totalLength += ndn::encoding::prependDoubleBlock(block, ndn::tlv::nlsr::HyperbolicRadius,
-                                                   m_hyperbolicRadius);
+  totalLength += ndn::encoding::prependDoubleBlock(block, nlsr::tlv::HyperbolicRadius, m_hyperbolicRadius);
 
   totalLength += Lsa::wireEncode(block);
 
   totalLength += block.prependVarNumber(totalLength);
-  totalLength += block.prependVarNumber(ndn::tlv::nlsr::CoordinateLsa);
+  totalLength += block.prependVarNumber(nlsr::tlv::CoordinateLsa);
 
   return totalLength;
 }
@@ -104,7 +103,7 @@
 {
   m_wire = wire;
 
-  if (m_wire.type() != ndn::tlv::nlsr::CoordinateLsa) {
+  if (m_wire.type() != nlsr::tlv::CoordinateLsa) {
     NDN_THROW(Error("CoordinateLsa", m_wire.type()));
   }
 
@@ -112,7 +111,7 @@
 
   auto val = m_wire.elements_begin();
 
-  if (val != m_wire.elements_end() && val->type() == ndn::tlv::nlsr::Lsa) {
+  if (val != m_wire.elements_end() && val->type() == nlsr::tlv::Lsa) {
     Lsa::wireDecode(*val);
     ++val;
   }
@@ -120,7 +119,7 @@
     NDN_THROW(Error("Missing required Lsa field"));
   }
 
-  if (val != m_wire.elements_end() && val->type() == ndn::tlv::nlsr::HyperbolicRadius) {
+  if (val != m_wire.elements_end() && val->type() == nlsr::tlv::HyperbolicRadius) {
     m_hyperbolicRadius = ndn::encoding::readDouble(*val);
     ++val;
   }
@@ -130,7 +129,7 @@
 
   std::vector<double> angles;
   for (; val != m_wire.elements_end(); ++val) {
-    if (val->type() == ndn::tlv::nlsr::HyperbolicAngle) {
+    if (val->type() == nlsr::tlv::HyperbolicAngle) {
       angles.push_back(ndn::encoding::readDouble(*val));
     }
     else {
@@ -164,9 +163,9 @@
     for (const auto& angle : clsa->getCorTheta()) {
       m_hyperbolicAngles.push_back(angle);
     }
-    return std::make_tuple(true, std::list<ndn::Name>{}, std::list<ndn::Name>{});
+    return {true, std::list<ndn::Name>{}, std::list<ndn::Name>{}};
   }
-  return std::make_tuple(false, std::list<ndn::Name>{}, std::list<ndn::Name>{});
+  return {false, std::list<ndn::Name>{}, std::list<ndn::Name>{}};
 }
 
 std::ostream&
diff --git a/src/lsa/lsa.cpp b/src/lsa/lsa.cpp
index 738607e..66e5b2d 100644
--- a/src/lsa/lsa.cpp
+++ b/src/lsa/lsa.cpp
@@ -49,15 +49,15 @@
   size_t totalLength = 0;
 
   totalLength += prependStringBlock(encoder,
-                                    ndn::tlv::nlsr::ExpirationTime,
+                                    nlsr::tlv::ExpirationTime,
                                     ndn::time::toString(m_expirationTimePoint));
 
-  totalLength += prependNonNegativeIntegerBlock(encoder, ndn::tlv::nlsr::SequenceNumber, m_seqNo);
+  totalLength += prependNonNegativeIntegerBlock(encoder, nlsr::tlv::SequenceNumber, m_seqNo);
 
   totalLength += m_originRouter.wireEncode(encoder);
 
   totalLength += encoder.prependVarNumber(totalLength);
-  totalLength += encoder.prependVarNumber(ndn::tlv::nlsr::Lsa);
+  totalLength += encoder.prependVarNumber(nlsr::tlv::Lsa);
 
   return totalLength;
 }
@@ -84,7 +84,7 @@
 
   ++val;
 
-  if (val != baseWire.elements_end() && val->type() == ndn::tlv::nlsr::SequenceNumber) {
+  if (val != baseWire.elements_end() && val->type() == nlsr::tlv::SequenceNumber) {
     m_seqNo = ndn::readNonNegativeInteger(*val);
     ++val;
   }
@@ -92,7 +92,7 @@
     NDN_THROW(Error("Missing required SequenceNumber field"));
   }
 
-  if (val != baseWire.elements_end() && val->type() == ndn::tlv::nlsr::ExpirationTime) {
+  if (val != baseWire.elements_end() && val->type() == nlsr::tlv::ExpirationTime) {
     m_expirationTimePoint = ndn::time::fromString(readString(*val));
   }
   else {
diff --git a/src/lsa/name-lsa.cpp b/src/lsa/name-lsa.cpp
index 53281e1..f578a06 100644
--- a/src/lsa/name-lsa.cpp
+++ b/src/lsa/name-lsa.cpp
@@ -1,6 +1,6 @@
 /* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
 /*
- * Copyright (c) 2014-2021,  The University of Memphis,
+ * Copyright (c) 2014-2022,  The University of Memphis,
  *                           Regents of the University of California,
  *                           Arizona Board of Regents.
  *
@@ -54,7 +54,7 @@
   totalLength += Lsa::wireEncode(block);
 
   totalLength += block.prependVarNumber(totalLength);
-  totalLength += block.prependVarNumber(ndn::tlv::nlsr::NameLsa);
+  totalLength += block.prependVarNumber(nlsr::tlv::NameLsa);
 
   return totalLength;
 }
@@ -84,7 +84,7 @@
 {
   m_wire = wire;
 
-  if (m_wire.type() != ndn::tlv::nlsr::NameLsa) {
+  if (m_wire.type() != nlsr::tlv::NameLsa) {
     NDN_THROW(Error("NameLsa", m_wire.type()));
   }
 
@@ -92,7 +92,7 @@
 
   auto val = m_wire.elements_begin();
 
-  if (val != m_wire.elements_end() && val->type() == ndn::tlv::nlsr::Lsa) {
+  if (val != m_wire.elements_end() && val->type() == nlsr::tlv::Lsa) {
     Lsa::wireDecode(*val);
     ++val;
   }
@@ -164,7 +164,7 @@
     updated = true;
   }
 
-  return std::make_tuple(updated, namesToAdd, namesToRemove);
+  return {updated, namesToAdd, namesToRemove};
 }
 
 std::ostream&
