diff --git a/.jenkins.d/40-standalone-header-compilation.sh b/.jenkins.d/40-standalone-header-compilation.sh
index cc09253..770e036 100755
--- a/.jenkins.d/40-standalone-header-compilation.sh
+++ b/.jenkins.d/40-standalone-header-compilation.sh
@@ -6,7 +6,7 @@
 # (similar to running all test cases), instead of failing at the first error.
 
 CXX=${CXX:-g++}
-STD=-std=c++11
+STD=-std=c++14
 CXXFLAGS="-O2 -Wall -Wno-unused-local-typedef $(pkg-config --cflags libndn-cxx)"
 INCLUDEDIR="$(pkg-config --variable=includedir libndn-cxx)"/ndn-cxx
 
diff --git a/.waf-tools/default-compiler-flags.py b/.waf-tools/default-compiler-flags.py
index e9fdcc6..e690290 100644
--- a/.waf-tools/default-compiler-flags.py
+++ b/.waf-tools/default-compiler-flags.py
@@ -39,7 +39,7 @@
 
     conf.areCustomCxxflagsPresent = (len(conf.env.CXXFLAGS) > 0)
 
-    # General flags are always applied (e.g., selecting C++11 mode)
+    # General flags are always applied (e.g., selecting C++ language standard)
     generalFlags = conf.flags.getGeneralFlags(conf)
     conf.add_supported_cxxflags(generalFlags['CXXFLAGS'])
     conf.add_supported_linkflags(generalFlags['LINKFLAGS'])
@@ -128,7 +128,7 @@
     """
     def getGeneralFlags(self, conf):
         flags = super(GccBasicFlags, self).getGeneralFlags(conf)
-        flags['CXXFLAGS'] += ['-std=c++11']
+        flags['CXXFLAGS'] += ['-std=c++14']
         return flags
 
     def getDebugFlags(self, conf):
diff --git a/COPYING.md b/COPYING.md
index 4fed631..38657b5 100644
--- a/COPYING.md
+++ b/COPYING.md
@@ -1,17 +1,17 @@
-ndn-cxx LICENSE
-======================
+ndn-cxx is licensed under the terms of the GNU Lesser General Public License,
+version 3 or later.
 
-ndn-cxx library is licensed under conditions of GNU Lesser General Public License.
+ndn-cxx relies on third-party software, licensed under the following licenses:
 
-The library relies on third-party software and library, licensed under the following
-licenses:
+- The Boost libraries are licensed under the terms of the
+  [Boost Software License, Version 1.0](https://www.boost.org/users/license.html)
 
-- Boost libraries licensed under conditions of
-  [Boost Software License 1.0](http://www.boost.org/users/license.html)
+- optional-lite by Martin Moene is licensed under the
+  [MIT License](https://github.com/martinmoene/optional-lite/blob/master/LICENSE)
 
-- SQLite is in [public domain](http://www.sqlite.org/copyright.html)
+- SQLite is in the [public domain](https://www.sqlite.org/copyright.html)
 
-- waf build system is licensed under conditions of
+- The waf build system is licensed under the terms of the
   [BSD license](https://github.com/named-data/ndn-cxx/blob/master/waf)
 
 
@@ -20,68 +20,67 @@
 license definitions and are used in accordance with GPL license exception for "System
 Libraries":
 
-- OpenSSL is licensed under an [Apache-style licence](http://www.openssl.org/source/license.html)
+- OpenSSL is licensed under an
+  [Apache-style license](https://www.openssl.org/source/license.html)
 
-- (OS X platform only) OS X Security Framework is licensed under
-[Apple Public Source License](http://www.opensource.apple.com/license/apsl/)
+- (macOS platform only) The macOS Security Framework is licensed under the
+  [Apple Public Source License](https://opensource.apple.com/apsl)
 
 
 The LGPL and GPL licenses are provided below in this file.  For more information
-about these licenses, see http://www.gnu.org/licenses/
+about these licenses, see https://www.gnu.org/licenses/
 
+--------------------------------------------------------------------------------
 
-----------------------------------------------------------------------------------
-
-GNU LESSER GENERAL PUBLIC LICENSE
-=================================
+### GNU LESSER GENERAL PUBLIC LICENSE
 
 Version 3, 29 June 2007
 
-Copyright &copy; 2007 Free Software Foundation, Inc. &lt;<http://fsf.org/>&gt;
+Copyright (C) 2007 Free Software Foundation, Inc.
+<https://fsf.org/>
 
-Everyone is permitted to copy and distribute verbatim copies
-of this license document, but changing it is not allowed.
+Everyone is permitted to copy and distribute verbatim copies of this
+license document, but changing it is not allowed.
 
+This version of the GNU Lesser General Public License incorporates the
+terms and conditions of version 3 of the GNU General Public License,
+supplemented by the additional permissions listed below.
 
-This version of the GNU Lesser General Public License incorporates
-the terms and conditions of version 3 of the GNU General Public
-License, supplemented by the additional permissions listed below.
+#### 0. Additional Definitions.
 
-### 0. Additional Definitions.
+As used herein, "this License" refers to version 3 of the GNU Lesser
+General Public License, and the "GNU GPL" refers to version 3 of the
+GNU General Public License.
 
-As used herein, &ldquo;this License&rdquo; refers to version 3 of the GNU Lesser
-General Public License, and the &ldquo;GNU GPL&rdquo; refers to version 3 of the GNU
-General Public License.
+"The Library" refers to a covered work governed by this License, other
+than an Application or a Combined Work as defined below.
 
-&ldquo;The Library&rdquo; refers to a covered work governed by this License,
-other than an Application or a Combined Work as defined below.
-
-An &ldquo;Application&rdquo; is any work that makes use of an interface provided
+An "Application" is any work that makes use of an interface provided
 by the Library, but which is not otherwise based on the Library.
 Defining a subclass of a class defined by the Library is deemed a mode
 of using an interface provided by the Library.
 
-A &ldquo;Combined Work&rdquo; is a work produced by combining or linking an
-Application with the Library.  The particular version of the Library
-with which the Combined Work was made is also called the &ldquo;Linked
-Version&rdquo;.
+A "Combined Work" is a work produced by combining or linking an
+Application with the Library. The particular version of the Library
+with which the Combined Work was made is also called the "Linked
+Version".
 
-The &ldquo;Minimal Corresponding Source&rdquo; for a Combined Work means the
+The "Minimal Corresponding Source" for a Combined Work means the
 Corresponding Source for the Combined Work, excluding any source code
 for portions of the Combined Work that, considered in isolation, are
 based on the Application, and not on the Linked Version.
 
-The &ldquo;Corresponding Application Code&rdquo; for a Combined Work means the
+The "Corresponding Application Code" for a Combined Work means the
 object code and/or source code for the Application, including any data
 and utility programs needed for reproducing the Combined Work from the
 Application, but excluding the System Libraries of the Combined Work.
 
-### 1. Exception to Section 3 of the GNU GPL.
+#### 1. Exception to Section 3 of the GNU GPL.
 
 You may convey a covered work under sections 3 and 4 of this License
 without being bound by section 3 of the GNU GPL.
 
-### 2. Conveying Modified Versions.
+#### 2. Conveying Modified Versions.
 
 If you modify a copy of the Library, and, in your modifications, a
 facility refers to a function or data to be supplied by an Application
@@ -89,107 +88,101 @@
 facility is invoked), then you may convey a copy of the modified
 version:
 
-* a) under this License, provided that you make a good faith effort to
-ensure that, in the event an Application does not supply the
-function or data, the facility still operates, and performs
-whatever part of its purpose remains meaningful, or
+-   a) under this License, provided that you make a good faith effort
+    to ensure that, in the event an Application does not supply the
+    function or data, the facility still operates, and performs
+    whatever part of its purpose remains meaningful, or
+-   b) under the GNU GPL, with none of the additional permissions of
+    this License applicable to that copy.
 
-* b) under the GNU GPL, with none of the additional permissions of
-this License applicable to that copy.
+#### 3. Object Code Incorporating Material from Library Header Files.
 
-### 3. Object Code Incorporating Material from Library Header Files.
-
-The object code form of an Application may incorporate material from
-a header file that is part of the Library.  You may convey such object
+The object code form of an Application may incorporate material from a
+header file that is part of the Library. You may convey such object
 code under terms of your choice, provided that, if the incorporated
 material is not limited to numerical parameters, data structure
 layouts and accessors, or small macros, inline functions and templates
 (ten or fewer lines in length), you do both of the following:
 
-* a) Give prominent notice with each copy of the object code that the
-Library is used in it and that the Library and its use are
-covered by this License.
-* b) Accompany the object code with a copy of the GNU GPL and this license
-document.
+-   a) Give prominent notice with each copy of the object code that
+    the Library is used in it and that the Library and its use are
+    covered by this License.
+-   b) Accompany the object code with a copy of the GNU GPL and this
+    license document.
 
-### 4. Combined Works.
+#### 4. Combined Works.
 
-You may convey a Combined Work under terms of your choice that,
-taken together, effectively do not restrict modification of the
-portions of the Library contained in the Combined Work and reverse
-engineering for debugging such modifications, if you also do each of
-the following:
+You may convey a Combined Work under terms of your choice that, taken
+together, effectively do not restrict modification of the portions of
+the Library contained in the Combined Work and reverse engineering for
+debugging such modifications, if you also do each of the following:
 
-* a) Give prominent notice with each copy of the Combined Work that
-the Library is used in it and that the Library and its use are
-covered by this License.
+-   a) Give prominent notice with each copy of the Combined Work that
+    the Library is used in it and that the Library and its use are
+    covered by this License.
+-   b) Accompany the Combined Work with a copy of the GNU GPL and this
+    license document.
+-   c) For a Combined Work that displays copyright notices during
+    execution, include the copyright notice for the Library among
+    these notices, as well as a reference directing the user to the
+    copies of the GNU GPL and this license document.
+-   d) Do one of the following:
+    -   0) Convey the Minimal Corresponding Source under the terms of
+        this License, and the Corresponding Application Code in a form
+        suitable for, and under terms that permit, the user to
+        recombine or relink the Application with a modified version of
+        the Linked Version to produce a modified Combined Work, in the
+        manner specified by section 6 of the GNU GPL for conveying
+        Corresponding Source.
+    -   1) Use a suitable shared library mechanism for linking with
+        the Library. A suitable mechanism is one that (a) uses at run
+        time a copy of the Library already present on the user's
+        computer system, and (b) will operate properly with a modified
+        version of the Library that is interface-compatible with the
+        Linked Version.
+-   e) Provide Installation Information, but only if you would
+    otherwise be required to provide such information under section 6
+    of the GNU GPL, and only to the extent that such information is
+    necessary to install and execute a modified version of the
+    Combined Work produced by recombining or relinking the Application
+    with a modified version of the Linked Version. (If you use option
+    4d0, the Installation Information must accompany the Minimal
+    Corresponding Source and Corresponding Application Code. If you
+    use option 4d1, you must provide the Installation Information in
+    the manner specified by section 6 of the GNU GPL for conveying
+    Corresponding Source.)
 
-* b) Accompany the Combined Work with a copy of the GNU GPL and this license
-document.
+#### 5. Combined Libraries.
 
-* c) For a Combined Work that displays copyright notices during
-execution, include the copyright notice for the Library among
-these notices, as well as a reference directing the user to the
-copies of the GNU GPL and this license document.
-
-* d) Do one of the following:
-    - 0) Convey the Minimal Corresponding Source under the terms of this
-License, and the Corresponding Application Code in a form
-suitable for, and under terms that permit, the user to
-recombine or relink the Application with a modified version of
-the Linked Version to produce a modified Combined Work, in the
-manner specified by section 6 of the GNU GPL for conveying
-Corresponding Source.
-    - 1) Use a suitable shared library mechanism for linking with the
-Library.  A suitable mechanism is one that (a) uses at run time
-a copy of the Library already present on the user's computer
-system, and (b) will operate properly with a modified version
-of the Library that is interface-compatible with the Linked
-Version.
-
-* e) Provide Installation Information, but only if you would otherwise
-be required to provide such information under section 6 of the
-GNU GPL, and only to the extent that such information is
-necessary to install and execute a modified version of the
-Combined Work produced by recombining or relinking the
-Application with a modified version of the Linked Version. (If
-you use option 4d0, the Installation Information must accompany
-the Minimal Corresponding Source and Corresponding Application
-Code. If you use option 4d1, you must provide the Installation
-Information in the manner specified by section 6 of the GNU GPL
-for conveying Corresponding Source.)
-
-### 5. Combined Libraries.
-
-You may place library facilities that are a work based on the
-Library side by side in a single library together with other library
+You may place library facilities that are a work based on the Library
+side by side in a single library together with other library
 facilities that are not Applications and are not covered by this
 License, and convey such a combined library under terms of your
 choice, if you do both of the following:
 
-* a) Accompany the combined library with a copy of the same work based
-on the Library, uncombined with any other library facilities,
-conveyed under the terms of this License.
-* b) Give prominent notice with the combined library that part of it
-is a work based on the Library, and explaining where to find the
-accompanying uncombined form of the same work.
+-   a) Accompany the combined library with a copy of the same work
+    based on the Library, uncombined with any other library
+    facilities, conveyed under the terms of this License.
+-   b) Give prominent notice with the combined library that part of it
+    is a work based on the Library, and explaining where to find the
+    accompanying uncombined form of the same work.
 
-### 6. Revised Versions of the GNU Lesser General Public License.
+#### 6. Revised Versions of the GNU Lesser General Public License.
 
 The Free Software Foundation may publish revised and/or new versions
 of the GNU Lesser General Public License from time to time. Such new
 versions will be similar in spirit to the present version, but may
 differ in detail to address new problems or concerns.
 
-Each version is given a distinguishing version number. If the
-Library as you received it specifies that a certain numbered version
-of the GNU Lesser General Public License &ldquo;or any later version&rdquo;
-applies to it, you have the option of following the terms and
-conditions either of that published version or of any later version
-published by the Free Software Foundation. If the Library as you
-received it does not specify a version number of the GNU Lesser
-General Public License, you may choose any version of the GNU Lesser
-General Public License ever published by the Free Software Foundation.
+Each version is given a distinguishing version number. If the Library
+as you received it specifies that a certain numbered version of the
+GNU Lesser General Public License "or any later version" applies to
+it, you have the option of following the terms and conditions either
+of that published version or of any later version published by the
+Free Software Foundation. If the Library as you received it does not
+specify a version number of the GNU Lesser General Public License, you
+may choose any version of the GNU Lesser General Public License ever
+published by the Free Software Foundation.
 
 If the Library as you received it specifies that a proxy can decide
 whether future versions of the GNU Lesser General Public License shall
@@ -197,204 +190,210 @@
 permanent authorization for you to choose that version for the
 Library.
 
-GNU GENERAL PUBLIC LICENSE
-==========================
+--------------------------------------------------------------------------------
+
+### GNU GENERAL PUBLIC LICENSE
 
 Version 3, 29 June 2007
 
-> Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/>
-  Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed.
+Copyright (C) 2007 Free Software Foundation, Inc.
+<https://fsf.org/>
 
-# Preamble
+Everyone is permitted to copy and distribute verbatim copies of this
+license document, but changing it is not allowed.
 
-  The GNU General Public License is a free, copyleft license for
+### Preamble
+
+The GNU General Public License is a free, copyleft license for
 software and other kinds of works.
 
-  The licenses for most software and other practical works are designed
-to take away your freedom to share and change the works.  By contrast,
-the GNU General Public License is intended to guarantee your freedom to
-share and change all versions of a program--to make sure it remains free
-software for all its users.  We, the Free Software Foundation, use the
-GNU General Public License for most of our software; it applies also to
-any other work released this way by its authors.  You can apply it to
-your programs, too.
+The licenses for most software and other practical works are designed
+to take away your freedom to share and change the works. By contrast,
+the GNU General Public License is intended to guarantee your freedom
+to share and change all versions of a program--to make sure it remains
+free software for all its users. We, the Free Software Foundation, use
+the GNU General Public License for most of our software; it applies
+also to any other work released this way by its authors. You can apply
+it to your programs, too.
 
-  When we speak of free software, we are referring to freedom, not
-price.  Our General Public Licenses are designed to make sure that you
+When we speak of free software, we are referring to freedom, not
+price. Our General Public Licenses are designed to make sure that you
 have the freedom to distribute copies of free software (and charge for
 them if you wish), that you receive source code or can get it if you
 want it, that you can change the software or use pieces of it in new
 free programs, and that you know you can do these things.
 
-  To protect your rights, we need to prevent others from denying you
-these rights or asking you to surrender the rights.  Therefore, you have
-certain responsibilities if you distribute copies of the software, or if
-you modify it: responsibilities to respect the freedom of others.
+To protect your rights, we need to prevent others from denying you
+these rights or asking you to surrender the rights. Therefore, you
+have certain responsibilities if you distribute copies of the
+software, or if you modify it: responsibilities to respect the freedom
+of others.
 
-  For example, if you distribute copies of such a program, whether
+For example, if you distribute copies of such a program, whether
 gratis or for a fee, you must pass on to the recipients the same
-freedoms that you received.  You must make sure that they, too, receive
-or can get the source code.  And you must show them these terms so they
+freedoms that you received. You must make sure that they, too, receive
+or can get the source code. And you must show them these terms so they
 know their rights.
 
-  Developers that use the GNU GPL protect your rights with two steps:
+Developers that use the GNU GPL protect your rights with two steps:
 (1) assert copyright on the software, and (2) offer you this License
 giving you legal permission to copy, distribute and/or modify it.
 
-  For the developers' and authors' protection, the GPL clearly explains
-that there is no warranty for this free software.  For both users' and
+For the developers' and authors' protection, the GPL clearly explains
+that there is no warranty for this free software. For both users' and
 authors' sake, the GPL requires that modified versions be marked as
 changed, so that their problems will not be attributed erroneously to
 authors of previous versions.
 
-  Some devices are designed to deny users access to install or run
-modified versions of the software inside them, although the manufacturer
-can do so.  This is fundamentally incompatible with the aim of
-protecting users' freedom to change the software.  The systematic
-pattern of such abuse occurs in the area of products for individuals to
-use, which is precisely where it is most unacceptable.  Therefore, we
-have designed this version of the GPL to prohibit the practice for those
-products.  If such problems arise substantially in other domains, we
-stand ready to extend this provision to those domains in future versions
-of the GPL, as needed to protect the freedom of users.
+Some devices are designed to deny users access to install or run
+modified versions of the software inside them, although the
+manufacturer can do so. This is fundamentally incompatible with the
+aim of protecting users' freedom to change the software. The
+systematic pattern of such abuse occurs in the area of products for
+individuals to use, which is precisely where it is most unacceptable.
+Therefore, we have designed this version of the GPL to prohibit the
+practice for those products. If such problems arise substantially in
+other domains, we stand ready to extend this provision to those
+domains in future versions of the GPL, as needed to protect the
+freedom of users.
 
-  Finally, every program is threatened constantly by software patents.
+Finally, every program is threatened constantly by software patents.
 States should not allow patents to restrict development and use of
-software on general-purpose computers, but in those that do, we wish to
-avoid the special danger that patents applied to a free program could
-make it effectively proprietary.  To prevent this, the GPL assures that
-patents cannot be used to render the program non-free.
+software on general-purpose computers, but in those that do, we wish
+to avoid the special danger that patents applied to a free program
+could make it effectively proprietary. To prevent this, the GPL
+assures that patents cannot be used to render the program non-free.
 
-  The precise terms and conditions for copying, distribution and
+The precise terms and conditions for copying, distribution and
 modification follow.
 
-# TERMS AND CONDITIONS
+### TERMS AND CONDITIONS
 
-## 0. Definitions.
+#### 0. Definitions.
 
-  _"This License"_ refers to version 3 of the GNU General Public License.
+"This License" refers to version 3 of the GNU General Public License.
 
-  _"Copyright"_ also means copyright-like laws that apply to other kinds of
-works, such as semiconductor masks.
+"Copyright" also means copyright-like laws that apply to other kinds
+of works, such as semiconductor masks.
 
-  _"The Program"_ refers to any copyrightable work licensed under this
-License.  Each licensee is addressed as _"you"_.  _"Licensees"_ and
+"The Program" refers to any copyrightable work licensed under this
+License. Each licensee is addressed as "you". "Licensees" and
 "recipients" may be individuals or organizations.
 
-  To _"modify"_ a work means to copy from or adapt all or part of the work
-in a fashion requiring copyright permission, other than the making of an
-exact copy.  The resulting work is called a _"modified version"_ of the
-earlier work or a work _"based on"_ the earlier work.
+To "modify" a work means to copy from or adapt all or part of the work
+in a fashion requiring copyright permission, other than the making of
+an exact copy. The resulting work is called a "modified version" of
+the earlier work or a work "based on" the earlier work.
 
-  A _"covered work"_ means either the unmodified Program or a work based
+A "covered work" means either the unmodified Program or a work based
 on the Program.
 
-  To _"propagate"_ a work means to do anything with it that, without
+To "propagate" a work means to do anything with it that, without
 permission, would make you directly or secondarily liable for
 infringement under applicable copyright law, except executing it on a
-computer or modifying a private copy.  Propagation includes copying,
+computer or modifying a private copy. Propagation includes copying,
 distribution (with or without modification), making available to the
 public, and in some countries other activities as well.
 
-  To _"convey"_ a work means any kind of propagation that enables other
-parties to make or receive copies.  Mere interaction with a user through
-a computer network, with no transfer of a copy, is not conveying.
+To "convey" a work means any kind of propagation that enables other
+parties to make or receive copies. Mere interaction with a user
+through a computer network, with no transfer of a copy, is not
+conveying.
 
-  An interactive user interface displays "Appropriate Legal Notices"
-to the extent that it includes a convenient and prominently visible
+An interactive user interface displays "Appropriate Legal Notices" to
+the extent that it includes a convenient and prominently visible
 feature that (1) displays an appropriate copyright notice, and (2)
 tells the user that there is no warranty for the work (except to the
 extent that warranties are provided), that licensees may convey the
-work under this License, and how to view a copy of this License.  If
+work under this License, and how to view a copy of this License. If
 the interface presents a list of user commands or options, such as a
 menu, a prominent item in the list meets this criterion.
 
-## 1. Source Code.
+#### 1. Source Code.
 
-  The _"source code"_ for a work means the preferred form of the work
-for making modifications to it. _"Object code"_ means any non-source
-form of a work.
+The "source code" for a work means the preferred form of the work for
+making modifications to it. "Object code" means any non-source form of
+a work.
 
-  A _"Standard Interface"_ means an interface that either is an official
+A "Standard Interface" means an interface that either is an official
 standard defined by a recognized standards body, or, in the case of
 interfaces specified for a particular programming language, one that
 is widely used among developers working in that language.
 
-  The _"System Libraries"_ of an executable work include anything, other
+The "System Libraries" of an executable work include anything, other
 than the work as a whole, that (a) is included in the normal form of
 packaging a Major Component, but which is not part of that Major
 Component, and (b) serves only to enable use of the work with that
 Major Component, or to implement a Standard Interface for which an
-implementation is available to the public in source code form.  A
+implementation is available to the public in source code form. A
 "Major Component", in this context, means a major essential component
 (kernel, window system, and so on) of the specific operating system
 (if any) on which the executable work runs, or a compiler used to
 produce the work, or an object code interpreter used to run it.
 
-  The _"Corresponding Source"_ for a work in object code form means all
+The "Corresponding Source" for a work in object code form means all
 the source code needed to generate, install, and (for an executable
 work) run the object code and to modify the work, including scripts to
-control those activities.  However, it does not include the work's
+control those activities. However, it does not include the work's
 System Libraries, or general-purpose tools or generally available free
 programs which are used unmodified in performing those activities but
-which are not part of the work.  For example, Corresponding Source
+which are not part of the work. For example, Corresponding Source
 includes interface definition files associated with source files for
 the work, and the source code for shared libraries and dynamically
 linked subprograms that the work is specifically designed to require,
 such as by intimate data communication or control flow between those
 subprograms and other parts of the work.
 
-  The Corresponding Source need not include anything that users
-can regenerate automatically from other parts of the Corresponding
-Source.
+The Corresponding Source need not include anything that users can
+regenerate automatically from other parts of the Corresponding Source.
 
-  The Corresponding Source for a work in source code form is that
-same work.
+The Corresponding Source for a work in source code form is that same
+work.
 
-## 2. Basic Permissions.
+#### 2. Basic Permissions.
 
-  All rights granted under this License are granted for the term of
+All rights granted under this License are granted for the term of
 copyright on the Program, and are irrevocable provided the stated
-conditions are met.  This License explicitly affirms your unlimited
-permission to run the unmodified Program.  The output from running a
+conditions are met. This License explicitly affirms your unlimited
+permission to run the unmodified Program. The output from running a
 covered work is covered by this License only if the output, given its
-content, constitutes a covered work.  This License acknowledges your
+content, constitutes a covered work. This License acknowledges your
 rights of fair use or other equivalent, as provided by copyright law.
 
-  You may make, run and propagate covered works that you do not
-convey, without conditions so long as your license otherwise remains
-in force.  You may convey covered works to others for the sole purpose
-of having them make modifications exclusively for you, or provide you
-with facilities for running those works, provided that you comply with
-the terms of this License in conveying all material for which you do
-not control copyright.  Those thus making or running the covered works
-for you must do so exclusively on your behalf, under your direction
-and control, on terms that prohibit them from making any copies of
-your copyrighted material outside their relationship with you.
+You may make, run and propagate covered works that you do not convey,
+without conditions so long as your license otherwise remains in force.
+You may convey covered works to others for the sole purpose of having
+them make modifications exclusively for you, or provide you with
+facilities for running those works, provided that you comply with the
+terms of this License in conveying all material for which you do not
+control copyright. Those thus making or running the covered works for
+you must do so exclusively on your behalf, under your direction and
+control, on terms that prohibit them from making any copies of your
+copyrighted material outside their relationship with you.
 
-  Conveying under any other circumstances is permitted solely under
-the conditions stated below.  Sublicensing is not allowed; section 10
-makes it unnecessary.
+Conveying under any other circumstances is permitted solely under the
+conditions stated below. Sublicensing is not allowed; section 10 makes
+it unnecessary.
 
-## 3. Protecting Users' Legal Rights From Anti-Circumvention Law.
+#### 3. Protecting Users' Legal Rights From Anti-Circumvention Law.
 
-  No covered work shall be deemed part of an effective technological
+No covered work shall be deemed part of an effective technological
 measure under any applicable law fulfilling obligations under article
 11 of the WIPO copyright treaty adopted on 20 December 1996, or
 similar laws prohibiting or restricting circumvention of such
 measures.
 
-  When you convey a covered work, you waive any legal power to forbid
-circumvention of technological measures to the extent such circumvention
-is effected by exercising rights under this License with respect to
-the covered work, and you disclaim any intention to limit operation or
-modification of the work as a means of enforcing, against the work's
-users, your or third parties' legal rights to forbid circumvention of
-technological measures.
+When you convey a covered work, you waive any legal power to forbid
+circumvention of technological measures to the extent such
+circumvention is effected by exercising rights under this License with
+respect to the covered work, and you disclaim any intention to limit
+operation or modification of the work as a means of enforcing, against
+the work's users, your or third parties' legal rights to forbid
+circumvention of technological measures.
 
-## 4. Conveying Verbatim Copies.
+#### 4. Conveying Verbatim Copies.
 
-  You may convey verbatim copies of the Program's source code as you
+You may convey verbatim copies of the Program's source code as you
 receive it, in any medium, provided that you conspicuously and
 appropriately publish on each copy an appropriate copyright notice;
 keep intact all notices stating that this License and any
@@ -402,59 +401,56 @@
 keep intact all notices of the absence of any warranty; and give all
 recipients a copy of this License along with the Program.
 
-  You may charge any price or no price for each copy that you convey,
+You may charge any price or no price for each copy that you convey,
 and you may offer support or warranty protection for a fee.
 
-## 5. Conveying Modified Source Versions.
+#### 5. Conveying Modified Source Versions.
 
-  You may convey a work based on the Program, or the modifications to
+You may convey a work based on the Program, or the modifications to
 produce it from the Program, in the form of source code under the
-terms of section 4, provided that you also meet all of these conditions:
+terms of section 4, provided that you also meet all of these
+conditions:
 
-    a) The work must carry prominent notices stating that you modified
+-   a) The work must carry prominent notices stating that you modified
     it, and giving a relevant date.
-
-    b) The work must carry prominent notices stating that it is
-    released under this License and any conditions added under section
-    7.  This requirement modifies the requirement in section 4 to
-    "keep intact all notices".
-
-    c) You must license the entire work, as a whole, under this
-    License to anyone who comes into possession of a copy.  This
+-   b) The work must carry prominent notices stating that it is
+    released under this License and any conditions added under
+    section 7. This requirement modifies the requirement in section 4
+    to "keep intact all notices".
+-   c) You must license the entire work, as a whole, under this
+    License to anyone who comes into possession of a copy. This
     License will therefore apply, along with any applicable section 7
     additional terms, to the whole of the work, and all its parts,
-    regardless of how they are packaged.  This License gives no
+    regardless of how they are packaged. This License gives no
     permission to license the work in any other way, but it does not
     invalidate such permission if you have separately received it.
-
-    d) If the work has interactive user interfaces, each must display
+-   d) If the work has interactive user interfaces, each must display
     Appropriate Legal Notices; however, if the Program has interactive
     interfaces that do not display Appropriate Legal Notices, your
     work need not make them do so.
 
-  A compilation of a covered work with other separate and independent
+A compilation of a covered work with other separate and independent
 works, which are not by their nature extensions of the covered work,
 and which are not combined with it such as to form a larger program,
 in or on a volume of a storage or distribution medium, is called an
 "aggregate" if the compilation and its resulting copyright are not
 used to limit the access or legal rights of the compilation's users
-beyond what the individual works permit.  Inclusion of a covered work
+beyond what the individual works permit. Inclusion of a covered work
 in an aggregate does not cause this License to apply to the other
 parts of the aggregate.
 
-## 6. Conveying Non-Source Forms.
+#### 6. Conveying Non-Source Forms.
 
-  You may convey a covered work in object code form under the terms
-of sections 4 and 5, provided that you also convey the
-machine-readable Corresponding Source under the terms of this License,
-in one of these ways:
+You may convey a covered work in object code form under the terms of
+sections 4 and 5, provided that you also convey the machine-readable
+Corresponding Source under the terms of this License, in one of these
+ways:
 
-    a) Convey the object code in, or embodied in, a physical product
+-   a) Convey the object code in, or embodied in, a physical product
     (including a physical distribution medium), accompanied by the
     Corresponding Source fixed on a durable physical medium
     customarily used for software interchange.
-
-    b) Convey the object code in, or embodied in, a physical product
+-   b) Convey the object code in, or embodied in, a physical product
     (including a physical distribution medium), accompanied by a
     written offer, valid for at least three years and valid for as
     long as you offer spare parts or customer support for that product
@@ -463,196 +459,190 @@
     product that is covered by this License, on a durable physical
     medium customarily used for software interchange, for a price no
     more than your reasonable cost of physically performing this
-    conveying of source, or (2) access to copy the
-    Corresponding Source from a network server at no charge.
-
-    c) Convey individual copies of the object code with a copy of the
-    written offer to provide the Corresponding Source.  This
+    conveying of source, or (2) access to copy the Corresponding
+    Source from a network server at no charge.
+-   c) Convey individual copies of the object code with a copy of the
+    written offer to provide the Corresponding Source. This
     alternative is allowed only occasionally and noncommercially, and
     only if you received the object code with such an offer, in accord
     with subsection 6b.
-
-    d) Convey the object code by offering access from a designated
+-   d) Convey the object code by offering access from a designated
     place (gratis or for a charge), and offer equivalent access to the
     Corresponding Source in the same way through the same place at no
-    further charge.  You need not require recipients to copy the
-    Corresponding Source along with the object code.  If the place to
+    further charge. You need not require recipients to copy the
+    Corresponding Source along with the object code. If the place to
     copy the object code is a network server, the Corresponding Source
     may be on a different server (operated by you or a third party)
     that supports equivalent copying facilities, provided you maintain
     clear directions next to the object code saying where to find the
-    Corresponding Source.  Regardless of what server hosts the
+    Corresponding Source. Regardless of what server hosts the
     Corresponding Source, you remain obligated to ensure that it is
     available for as long as needed to satisfy these requirements.
+-   e) Convey the object code using peer-to-peer transmission,
+    provided you inform other peers where the object code and
+    Corresponding Source of the work are being offered to the general
+    public at no charge under subsection 6d.
 
-    e) Convey the object code using peer-to-peer transmission, provided
-    you inform other peers where the object code and Corresponding
-    Source of the work are being offered to the general public at no
-    charge under subsection 6d.
-
-  A separable portion of the object code, whose source code is excluded
+A separable portion of the object code, whose source code is excluded
 from the Corresponding Source as a System Library, need not be
 included in conveying the object code work.
 
-  A _"User Product"_ is either (1) a _"consumer product"_, which means any
-tangible personal property which is normally used for personal, family,
-or household purposes, or (2) anything designed or sold for incorporation
-into a dwelling.  In determining whether a product is a consumer product,
-doubtful cases shall be resolved in favor of coverage.  For a particular
-product received by a particular user, "normally used" refers to a
-typical or common use of that class of product, regardless of the status
-of the particular user or of the way in which the particular user
-actually uses, or expects or is expected to use, the product.  A product
-is a consumer product regardless of whether the product has substantial
-commercial, industrial or non-consumer uses, unless such uses represent
-the only significant mode of use of the product.
+A "User Product" is either (1) a "consumer product", which means any
+tangible personal property which is normally used for personal,
+family, or household purposes, or (2) anything designed or sold for
+incorporation into a dwelling. In determining whether a product is a
+consumer product, doubtful cases shall be resolved in favor of
+coverage. For a particular product received by a particular user,
+"normally used" refers to a typical or common use of that class of
+product, regardless of the status of the particular user or of the way
+in which the particular user actually uses, or expects or is expected
+to use, the product. A product is a consumer product regardless of
+whether the product has substantial commercial, industrial or
+non-consumer uses, unless such uses represent the only significant
+mode of use of the product.
 
-  _"Installation Information"_ for a User Product means any methods,
-procedures, authorization keys, or other information required to install
-and execute modified versions of a covered work in that User Product from
-a modified version of its Corresponding Source.  The information must
-suffice to ensure that the continued functioning of the modified object
-code is in no case prevented or interfered with solely because
-modification has been made.
+"Installation Information" for a User Product means any methods,
+procedures, authorization keys, or other information required to
+install and execute modified versions of a covered work in that User
+Product from a modified version of its Corresponding Source. The
+information must suffice to ensure that the continued functioning of
+the modified object code is in no case prevented or interfered with
+solely because modification has been made.
 
-  If you convey an object code work under this section in, or with, or
+If you convey an object code work under this section in, or with, or
 specifically for use in, a User Product, and the conveying occurs as
 part of a transaction in which the right of possession and use of the
 User Product is transferred to the recipient in perpetuity or for a
 fixed term (regardless of how the transaction is characterized), the
 Corresponding Source conveyed under this section must be accompanied
-by the Installation Information.  But this requirement does not apply
+by the Installation Information. But this requirement does not apply
 if neither you nor any third party retains the ability to install
 modified object code on the User Product (for example, the work has
 been installed in ROM).
 
-  The requirement to provide Installation Information does not include a
-requirement to continue to provide support service, warranty, or updates
-for a work that has been modified or installed by the recipient, or for
-the User Product in which it has been modified or installed.  Access to a
-network may be denied when the modification itself materially and
-adversely affects the operation of the network or violates the rules and
-protocols for communication across the network.
+The requirement to provide Installation Information does not include a
+requirement to continue to provide support service, warranty, or
+updates for a work that has been modified or installed by the
+recipient, or for the User Product in which it has been modified or
+installed. Access to a network may be denied when the modification
+itself materially and adversely affects the operation of the network
+or violates the rules and protocols for communication across the
+network.
 
-  Corresponding Source conveyed, and Installation Information provided,
+Corresponding Source conveyed, and Installation Information provided,
 in accord with this section must be in a format that is publicly
 documented (and with an implementation available to the public in
 source code form), and must require no special password or key for
 unpacking, reading or copying.
 
-## 7. Additional Terms.
+#### 7. Additional Terms.
 
-  _"Additional permissions"_ are terms that supplement the terms of this
+"Additional permissions" are terms that supplement the terms of this
 License by making exceptions from one or more of its conditions.
 Additional permissions that are applicable to the entire Program shall
 be treated as though they were included in this License, to the extent
-that they are valid under applicable law.  If additional permissions
+that they are valid under applicable law. If additional permissions
 apply only to part of the Program, that part may be used separately
 under those permissions, but the entire Program remains governed by
 this License without regard to the additional permissions.
 
-  When you convey a copy of a covered work, you may at your option
+When you convey a copy of a covered work, you may at your option
 remove any additional permissions from that copy, or from any part of
-it.  (Additional permissions may be written to require their own
-removal in certain cases when you modify the work.)  You may place
+it. (Additional permissions may be written to require their own
+removal in certain cases when you modify the work.) You may place
 additional permissions on material, added by you to a covered work,
 for which you have or can give appropriate copyright permission.
 
-  Notwithstanding any other provision of this License, for material you
-add to a covered work, you may (if authorized by the copyright holders of
-that material) supplement the terms of this License with terms:
+Notwithstanding any other provision of this License, for material you
+add to a covered work, you may (if authorized by the copyright holders
+of that material) supplement the terms of this License with terms:
 
-    a) Disclaiming warranty or limiting liability differently from the
+-   a) Disclaiming warranty or limiting liability differently from the
     terms of sections 15 and 16 of this License; or
-
-    b) Requiring preservation of specified reasonable legal notices or
+-   b) Requiring preservation of specified reasonable legal notices or
     author attributions in that material or in the Appropriate Legal
     Notices displayed by works containing it; or
-
-    c) Prohibiting misrepresentation of the origin of that material, or
-    requiring that modified versions of such material be marked in
+-   c) Prohibiting misrepresentation of the origin of that material,
+    or requiring that modified versions of such material be marked in
     reasonable ways as different from the original version; or
-
-    d) Limiting the use for publicity purposes of names of licensors or
-    authors of the material; or
-
-    e) Declining to grant rights under trademark law for use of some
+-   d) Limiting the use for publicity purposes of names of licensors
+    or authors of the material; or
+-   e) Declining to grant rights under trademark law for use of some
     trade names, trademarks, or service marks; or
+-   f) Requiring indemnification of licensors and authors of that
+    material by anyone who conveys the material (or modified versions
+    of it) with contractual assumptions of liability to the recipient,
+    for any liability that these contractual assumptions directly
+    impose on those licensors and authors.
 
-    f) Requiring indemnification of licensors and authors of that
-    material by anyone who conveys the material (or modified versions of
-    it) with contractual assumptions of liability to the recipient, for
-    any liability that these contractual assumptions directly impose on
-    those licensors and authors.
-
-  All other non-permissive additional terms are considered "further
-restrictions" within the meaning of section 10.  If the Program as you
+All other non-permissive additional terms are considered "further
+restrictions" within the meaning of section 10. If the Program as you
 received it, or any part of it, contains a notice stating that it is
 governed by this License along with a term that is a further
-restriction, you may remove that term.  If a license document contains
+restriction, you may remove that term. If a license document contains
 a further restriction but permits relicensing or conveying under this
 License, you may add to a covered work material governed by the terms
 of that license document, provided that the further restriction does
 not survive such relicensing or conveying.
 
-  If you add terms to a covered work in accord with this section, you
+If you add terms to a covered work in accord with this section, you
 must place, in the relevant source files, a statement of the
 additional terms that apply to those files, or a notice indicating
 where to find the applicable terms.
 
-  Additional terms, permissive or non-permissive, may be stated in the
-form of a separately written license, or stated as exceptions;
-the above requirements apply either way.
+Additional terms, permissive or non-permissive, may be stated in the
+form of a separately written license, or stated as exceptions; the
+above requirements apply either way.
 
-## 8. Termination.
+#### 8. Termination.
 
-  You may not propagate or modify a covered work except as expressly
-provided under this License.  Any attempt otherwise to propagate or
+You may not propagate or modify a covered work except as expressly
+provided under this License. Any attempt otherwise to propagate or
 modify it is void, and will automatically terminate your rights under
 this License (including any patent licenses granted under the third
 paragraph of section 11).
 
-  However, if you cease all violation of this License, then your
-license from a particular copyright holder is reinstated (a)
-provisionally, unless and until the copyright holder explicitly and
-finally terminates your license, and (b) permanently, if the copyright
-holder fails to notify you of the violation by some reasonable means
-prior to 60 days after the cessation.
+However, if you cease all violation of this License, then your license
+from a particular copyright holder is reinstated (a) provisionally,
+unless and until the copyright holder explicitly and finally
+terminates your license, and (b) permanently, if the copyright holder
+fails to notify you of the violation by some reasonable means prior to
+60 days after the cessation.
 
-  Moreover, your license from a particular copyright holder is
+Moreover, your license from a particular copyright holder is
 reinstated permanently if the copyright holder notifies you of the
 violation by some reasonable means, this is the first time you have
 received notice of violation of this License (for any work) from that
 copyright holder, and you cure the violation prior to 30 days after
 your receipt of the notice.
 
-  Termination of your rights under this section does not terminate the
+Termination of your rights under this section does not terminate the
 licenses of parties who have received copies or rights from you under
-this License.  If your rights have been terminated and not permanently
+this License. If your rights have been terminated and not permanently
 reinstated, you do not qualify to receive new licenses for the same
 material under section 10.
 
-## 9. Acceptance Not Required for Having Copies.
+#### 9. Acceptance Not Required for Having Copies.
 
-  You are not required to accept this License in order to receive or
-run a copy of the Program.  Ancillary propagation of a covered work
+You are not required to accept this License in order to receive or run
+a copy of the Program. Ancillary propagation of a covered work
 occurring solely as a consequence of using peer-to-peer transmission
-to receive a copy likewise does not require acceptance.  However,
+to receive a copy likewise does not require acceptance. However,
 nothing other than this License grants you permission to propagate or
-modify any covered work.  These actions infringe copyright if you do
-not accept this License.  Therefore, by modifying or propagating a
+modify any covered work. These actions infringe copyright if you do
+not accept this License. Therefore, by modifying or propagating a
 covered work, you indicate your acceptance of this License to do so.
 
-## 10. Automatic Licensing of Downstream Recipients.
+#### 10. Automatic Licensing of Downstream Recipients.
 
-  Each time you convey a covered work, the recipient automatically
+Each time you convey a covered work, the recipient automatically
 receives a license from the original licensors, to run, modify and
-propagate that work, subject to this License.  You are not responsible
+propagate that work, subject to this License. You are not responsible
 for enforcing compliance by third parties with this License.
 
-  An _"entity transaction"_ is a transaction transferring control of an
+An "entity transaction" is a transaction transferring control of an
 organization, or substantially all assets of one, or subdividing an
-organization, or merging organizations.  If propagation of a covered
+organization, or merging organizations. If propagation of a covered
 work results from an entity transaction, each party to that
 transaction who receives a copy of the work also receives whatever
 licenses to the work the party's predecessor in interest had or could
@@ -660,43 +650,43 @@
 Corresponding Source of the work from the predecessor in interest, if
 the predecessor has it or can get it with reasonable efforts.
 
-  You may not impose any further restrictions on the exercise of the
-rights granted or affirmed under this License.  For example, you may
+You may not impose any further restrictions on the exercise of the
+rights granted or affirmed under this License. For example, you may
 not impose a license fee, royalty, or other charge for exercise of
 rights granted under this License, and you may not initiate litigation
 (including a cross-claim or counterclaim in a lawsuit) alleging that
 any patent claim is infringed by making, using, selling, offering for
 sale, or importing the Program or any portion of it.
 
-## 11. Patents.
+#### 11. Patents.
 
-  A _"contributor"_ is a copyright holder who authorizes use under this
-License of the Program or a work on which the Program is based.  The
+A "contributor" is a copyright holder who authorizes use under this
+License of the Program or a work on which the Program is based. The
 work thus licensed is called the contributor's "contributor version".
 
-  A contributor's _"essential patent claims"_ are all patent claims
-owned or controlled by the contributor, whether already acquired or
+A contributor's "essential patent claims" are all patent claims owned
+or controlled by the contributor, whether already acquired or
 hereafter acquired, that would be infringed by some manner, permitted
 by this License, of making, using, or selling its contributor version,
 but do not include claims that would be infringed only as a
-consequence of further modification of the contributor version.  For
+consequence of further modification of the contributor version. For
 purposes of this definition, "control" includes the right to grant
 patent sublicenses in a manner consistent with the requirements of
 this License.
 
-  Each contributor grants you a non-exclusive, worldwide, royalty-free
+Each contributor grants you a non-exclusive, worldwide, royalty-free
 patent license under the contributor's essential patent claims, to
 make, use, sell, offer for sale, import and otherwise run, modify and
 propagate the contents of its contributor version.
 
-  In the following three paragraphs, a "patent license" is any express
+In the following three paragraphs, a "patent license" is any express
 agreement or commitment, however denominated, not to enforce a patent
 (such as an express permission to practice a patent or covenant not to
-sue for patent infringement).  To "grant" such a patent license to a
+sue for patent infringement). To "grant" such a patent license to a
 party means to make such an agreement or commitment not to enforce a
 patent against the party.
 
-  If you convey a covered work, knowingly relying on a patent license,
+If you convey a covered work, knowingly relying on a patent license,
 and the Corresponding Source of the work is not available for anyone
 to copy, free of charge and under the terms of this License, through a
 publicly available network server or other readily accessible means,
@@ -704,13 +694,13 @@
 available, or (2) arrange to deprive yourself of the benefit of the
 patent license for this particular work, or (3) arrange, in a manner
 consistent with the requirements of this License, to extend the patent
-license to downstream recipients.  "Knowingly relying" means you have
+license to downstream recipients. "Knowingly relying" means you have
 actual knowledge that, but for the patent license, your conveying the
 covered work in a country, or your recipient's use of the covered work
 in a country, would infringe one or more identifiable patents in that
 country that you have reason to believe are valid.
 
-  If, pursuant to or in connection with a single transaction or
+If, pursuant to or in connection with a single transaction or
 arrangement, you convey, or propagate by procuring conveyance of, a
 covered work, and grant a patent license to some of the parties
 receiving the covered work authorizing them to use, propagate, modify
@@ -718,159 +708,162 @@
 you grant is automatically extended to all recipients of the covered
 work and works based on it.
 
-  A patent license is "discriminatory" if it does not include within
-the scope of its coverage, prohibits the exercise of, or is
-conditioned on the non-exercise of one or more of the rights that are
-specifically granted under this License.  You may not convey a covered
-work if you are a party to an arrangement with a third party that is
-in the business of distributing software, under which you make payment
-to the third party based on the extent of your activity of conveying
-the work, and under which the third party grants, to any of the
-parties who would receive the covered work from you, a discriminatory
-patent license (a) in connection with copies of the covered work
-conveyed by you (or copies made from those copies), or (b) primarily
-for and in connection with specific products or compilations that
-contain the covered work, unless you entered into that arrangement,
-or that patent license was granted, prior to 28 March 2007.
+A patent license is "discriminatory" if it does not include within the
+scope of its coverage, prohibits the exercise of, or is conditioned on
+the non-exercise of one or more of the rights that are specifically
+granted under this License. You may not convey a covered work if you
+are a party to an arrangement with a third party that is in the
+business of distributing software, under which you make payment to the
+third party based on the extent of your activity of conveying the
+work, and under which the third party grants, to any of the parties
+who would receive the covered work from you, a discriminatory patent
+license (a) in connection with copies of the covered work conveyed by
+you (or copies made from those copies), or (b) primarily for and in
+connection with specific products or compilations that contain the
+covered work, unless you entered into that arrangement, or that patent
+license was granted, prior to 28 March 2007.
 
-  Nothing in this License shall be construed as excluding or limiting
+Nothing in this License shall be construed as excluding or limiting
 any implied license or other defenses to infringement that may
 otherwise be available to you under applicable patent law.
 
-## 12. No Surrender of Others' Freedom.
+#### 12. No Surrender of Others' Freedom.
 
-  If conditions are imposed on you (whether by court order, agreement or
+If conditions are imposed on you (whether by court order, agreement or
 otherwise) that contradict the conditions of this License, they do not
-excuse you from the conditions of this License.  If you cannot convey a
-covered work so as to satisfy simultaneously your obligations under this
-License and any other pertinent obligations, then as a consequence you may
-not convey it at all.  For example, if you agree to terms that obligate you
-to collect a royalty for further conveying from those to whom you convey
-the Program, the only way you could satisfy both those terms and this
-License would be to refrain entirely from conveying the Program.
+excuse you from the conditions of this License. If you cannot convey a
+covered work so as to satisfy simultaneously your obligations under
+this License and any other pertinent obligations, then as a
+consequence you may not convey it at all. For example, if you agree to
+terms that obligate you to collect a royalty for further conveying
+from those to whom you convey the Program, the only way you could
+satisfy both those terms and this License would be to refrain entirely
+from conveying the Program.
 
-## 13. Use with the GNU Affero General Public License.
+#### 13. Use with the GNU Affero General Public License.
 
-  Notwithstanding any other provision of this License, you have
+Notwithstanding any other provision of this License, you have
 permission to link or combine any covered work with a work licensed
 under version 3 of the GNU Affero General Public License into a single
-combined work, and to convey the resulting work.  The terms of this
+combined work, and to convey the resulting work. The terms of this
 License will continue to apply to the part which is the covered work,
 but the special requirements of the GNU Affero General Public License,
 section 13, concerning interaction through a network will apply to the
 combination as such.
 
-## 14. Revised Versions of this License.
+#### 14. Revised Versions of this License.
 
-  The Free Software Foundation may publish revised and/or new versions of
-the GNU General Public License from time to time.  Such new versions will
-be similar in spirit to the present version, but may differ in detail to
-address new problems or concerns.
+The Free Software Foundation may publish revised and/or new versions
+of the GNU General Public License from time to time. Such new versions
+will be similar in spirit to the present version, but may differ in
+detail to address new problems or concerns.
 
-  Each version is given a distinguishing version number.  If the
-Program specifies that a certain numbered version of the GNU General
-Public License "or any later version" applies to it, you have the
-option of following the terms and conditions either of that numbered
-version or of any later version published by the Free Software
-Foundation.  If the Program does not specify a version number of the
-GNU General Public License, you may choose any version ever published
-by the Free Software Foundation.
+Each version is given a distinguishing version number. If the Program
+specifies that a certain numbered version of the GNU General Public
+License "or any later version" applies to it, you have the option of
+following the terms and conditions either of that numbered version or
+of any later version published by the Free Software Foundation. If the
+Program does not specify a version number of the GNU General Public
+License, you may choose any version ever published by the Free
+Software Foundation.
 
-  If the Program specifies that a proxy can decide which future
-versions of the GNU General Public License can be used, that proxy's
-public statement of acceptance of a version permanently authorizes you
-to choose that version for the Program.
+If the Program specifies that a proxy can decide which future versions
+of the GNU General Public License can be used, that proxy's public
+statement of acceptance of a version permanently authorizes you to
+choose that version for the Program.
 
-  Later license versions may give you additional or different
-permissions.  However, no additional obligations are imposed on any
+Later license versions may give you additional or different
+permissions. However, no additional obligations are imposed on any
 author or copyright holder as a result of your choosing to follow a
 later version.
 
-## 15. Disclaimer of Warranty.
+#### 15. Disclaimer of Warranty.
 
-  THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY
-APPLICABLE LAW.  EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT
-HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY
-OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,
-THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
-PURPOSE.  THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM
-IS WITH YOU.  SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF
-ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
+THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY
+APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT
+HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT
+WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT
+LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND
+PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE
+DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR
+CORRECTION.
 
-## 16. Limitation of Liability.
+#### 16. Limitation of Liability.
 
-  IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
-WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS
-THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY
-GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE
-USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF
-DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD
-PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),
-EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF
-SUCH DAMAGES.
+IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
+WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR
+CONVEYS THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,
+INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES
+ARISING OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT
+NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR
+LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM
+TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER
+PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
 
-## 17. Interpretation of Sections 15 and 16.
+#### 17. Interpretation of Sections 15 and 16.
 
-  If the disclaimer of warranty and limitation of liability provided
+If the disclaimer of warranty and limitation of liability provided
 above cannot be given local legal effect according to their terms,
 reviewing courts shall apply local law that most closely approximates
 an absolute waiver of all civil liability in connection with the
 Program, unless a warranty or assumption of liability accompanies a
 copy of the Program in return for a fee.
 
-# END OF TERMS AND CONDITIONS
---------------------------------------------------------------------------
+END OF TERMS AND CONDITIONS
 
+### How to Apply These Terms to Your New Programs
 
-# How to Apply These Terms to Your New Programs
-
-  If you develop a new program, and you want it to be of the greatest
+If you develop a new program, and you want it to be of the greatest
 possible use to the public, the best way to achieve this is to make it
-free software which everyone can redistribute and change under these terms.
+free software which everyone can redistribute and change under these
+terms.
 
-  To do so, attach the following notices to the program.  It is safest
-to attach them to the start of each source file to most effectively
-state the exclusion of warranty; and each file should have at least
-the "copyright" line and a pointer to where the full notice is found.
+To do so, attach the following notices to the program. It is safest to
+attach them to the start of each source file to most effectively state
+the exclusion of warranty; and each file should have at least the
+"copyright" line and a pointer to where the full notice is found.
 
-    <one line to give the program's name and a brief idea of what it does.>
-    Copyright (C) <year>  <name of author>
+        <one line to give the program's name and a brief idea of what it does.>
+        Copyright (C) <year>  <name of author>
 
-    This program is free software: you can redistribute it and/or modify
-    it under the terms of the GNU General Public License as published by
-    the Free Software Foundation, either version 3 of the License, or
-    (at your option) any later version.
+        This program is free software: you can redistribute it and/or modify
+        it under the terms of the GNU General Public License as published by
+        the Free Software Foundation, either version 3 of the License, or
+        (at your option) any later version.
 
-    This program 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 General Public License for more details.
+        This program 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 General Public License for more details.
 
-    You should have received a copy of the GNU General Public License
-    along with this program.  If not, see <http://www.gnu.org/licenses/>.
+        You should have received a copy of the GNU General Public License
+        along with this program.  If not, see <https://www.gnu.org/licenses/>.
 
-Also add information on how to contact you by electronic and paper mail.
+Also add information on how to contact you by electronic and paper
+mail.
 
-  If the program does terminal interaction, make it output a short
+If the program does terminal interaction, make it output a short
 notice like this when it starts in an interactive mode:
 
-    <program>  Copyright (C) <year>  <name of author>
-    This program comes with ABSOLUTELY NO WARRANTY; for details type 'show w'.
-    This is free software, and you are welcome to redistribute it
-    under certain conditions; type 'show c' for details.
+        <program>  Copyright (C) <year>  <name of author>
+        This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
+        This is free software, and you are welcome to redistribute it
+        under certain conditions; type `show c' for details.
 
-  The hypothetical commands _'show w'_ and _'show c'_ should show the appropriate
-parts of the General Public License.  Of course, your program's commands
-might be different; for a GUI interface, you would use an "about box".
+The hypothetical commands \`show w' and \`show c' should show the
+appropriate parts of the General Public License. Of course, your
+program's commands might be different; for a GUI interface, you would
+use an "about box".
 
-  You should also get your employer (if you work as a programmer) or school,
-if any, to sign a "copyright disclaimer" for the program, if necessary.
-For more information on this, and how to apply and follow the GNU GPL, see
-<http://www.gnu.org/licenses/>.
+You should also get your employer (if you work as a programmer) or
+school, if any, to sign a "copyright disclaimer" for the program, if
+necessary. For more information on this, and how to apply and follow
+the GNU GPL, see <https://www.gnu.org/licenses/>.
 
-  The GNU General Public License does not permit incorporating your program
-into proprietary programs.  If your program is a subroutine library, you
-may consider it more useful to permit linking proprietary applications with
-the library.  If this is what you want to do, use the GNU Lesser General
-Public License instead of this License.  But first, please read
-<http://www.gnu.org/philosophy/why-not-lgpl.html>.
+The GNU General Public License does not permit incorporating your
+program into proprietary programs. If your program is a subroutine
+library, you may consider it more useful to permit linking proprietary
+applications with the library. If this is what you want to do, use the
+GNU Lesser General Public License instead of this License. But first,
+please read <https://www.gnu.org/licenses/why-not-lgpl.html>.
diff --git a/docs/doxygen.conf.in b/docs/doxygen.conf.in
index d3d4c5a..30dd69b 100644
--- a/docs/doxygen.conf.in
+++ b/docs/doxygen.conf.in
@@ -2050,13 +2050,18 @@
 # This tag requires that the tag ENABLE_PREPROCESSING is set to YES.
 
 PREDEFINED             = DOXYGEN \
+                         BOOST_CONCEPT_ASSERT(x)= \
+                         BOOST_CONCEPT_REQUIRES(x)= \
                          NDN_CXX_DECLARE_WIRE_ENCODE_INSTANTIATIONS(x)= \
                          NDN_LOG_INIT(x)= \
+                         NDN_LOG_MEMBER_DECL()= \
+                         NDN_LOG_MEMBER_DECL_SPECIALIZED(x)= \
+                         NDN_LOG_MEMBER_INIT(x,y)= \
+                         NDN_LOG_MEMBER_INIT_SPECIALIZED(x,y)= \
                          PUBLIC_WITH_TESTS_ELSE_PROTECTED=protected \
                          PUBLIC_WITH_TESTS_ELSE_PRIVATE=private \
                          PROTECTED_WITH_TESTS_ELSE_PRIVATE=private \
-                         VIRTUAL_WITH_TESTS= \
-                         BOOST_CONCEPT_ASSERT(x)=
+                         VIRTUAL_WITH_TESTS=
 
 # If the MACRO_EXPANSION and EXPAND_ONLY_PREDEF tags are set to YES then this
 # tag can be used to specify a list of macro names that should be expanded. The
diff --git a/src/common.hpp b/src/common.hpp
index 7b5d4c8..6de1e07 100644
--- a/src/common.hpp
+++ b/src/common.hpp
@@ -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).
  *
@@ -44,15 +44,14 @@
 #define NDN_CXX_PROTECTED_WITH_TESTS_ELSE_PRIVATE private
 #endif
 
-// require C++11
-#if __cplusplus < 201103L && !defined(__GXX_EXPERIMENTAL_CXX0X__)
-#  error "ndn-cxx applications must be compiled using the C++11 standard (-std=c++11)"
+// require C++14
+#if __cplusplus < 201402L
+#error "ndn-cxx applications must be compiled using the C++14 standard (-std=c++14)"
 #endif
 
 #include <algorithm>
 #include <cstddef>
 #include <cstdint>
-#include <exception>
 #include <functional>
 #include <iosfwd>
 #include <limits>
@@ -68,9 +67,8 @@
 using std::shared_ptr;
 using std::unique_ptr;
 using std::weak_ptr;
-using std::bad_weak_ptr;
 using std::make_shared;
-using std::enable_shared_from_this;
+using std::make_unique;
 
 using std::static_pointer_cast;
 using std::dynamic_pointer_cast;
diff --git a/src/data.hpp b/src/data.hpp
index 2368017..d70f509 100644
--- a/src/data.hpp
+++ b/src/data.hpp
@@ -30,9 +30,9 @@
 
 namespace ndn {
 
-/** @brief Represents a Data packet
+/** @brief Represents a Data packet.
  */
-class Data : public PacketBase, public enable_shared_from_this<Data>
+class Data : public PacketBase, public std::enable_shared_from_this<Data>
 {
 public:
   class Error : public tlv::Error
@@ -234,14 +234,14 @@
   /** @deprecated Use @c getFinalBlock
    *  @sa MetaInfo::getFinalBlockId
    */
-  NDN_CXX_DEPRECATED
+  [[deprecated("use getFinalBlock")]]
   name::Component
   getFinalBlockId() const;
 
   /** @deprecated Use @c setFinalBlock
    *  @sa MetaInfo::setFinalBlockId
    */
-  NDN_CXX_DEPRECATED
+  [[deprecated("use setFinalBlock")]]
   Data&
   setFinalBlockId(const name::Component& finalBlockId);
 
diff --git a/src/encoding/tlv.hpp b/src/encoding/tlv.hpp
index 10961c5..fc664c6 100644
--- a/src/encoding/tlv.hpp
+++ b/src/encoding/tlv.hpp
@@ -106,7 +106,8 @@
   Any                       = 19,
 };
 
-constexpr int NameComponent NDN_CXX_DEPRECATED = GenericNameComponent;
+[[deprecated("use GenericNameComponent")]]
+constexpr int NameComponent = GenericNameComponent;
 
 enum SignatureTypeValue : uint16_t {
   DigestSha256 = 0,
@@ -519,7 +520,6 @@
   }
 }
 
-
 } // namespace tlv
 } // namespace ndn
 
diff --git a/src/interest.hpp b/src/interest.hpp
index 5fc1c42..7d0705e 100644
--- a/src/interest.hpp
+++ b/src/interest.hpp
@@ -39,7 +39,7 @@
 
 /** @brief Represents an Interest packet.
  */
-class Interest : public PacketBase, public enable_shared_from_this<Interest>
+class Interest : public PacketBase, public std::enable_shared_from_this<Interest>
 {
 public:
   class Error : public tlv::Error
@@ -272,21 +272,21 @@
 public: // Selectors (deprecated)
   /** @brief Check if Interest has any selector present.
    */
-  NDN_CXX_DEPRECATED
+  [[deprecated]]
   bool
   hasSelectors() const
   {
     return !m_selectors.empty();
   }
 
-  NDN_CXX_DEPRECATED
+  [[deprecated]]
   const Selectors&
   getSelectors() const
   {
     return m_selectors;
   }
 
-  NDN_CXX_DEPRECATED
+  [[deprecated]]
   Interest&
   setSelectors(const Selectors& selectors)
   {
@@ -295,14 +295,14 @@
     return *this;
   }
 
-  NDN_CXX_DEPRECATED
+  [[deprecated]]
   int
   getMinSuffixComponents() const
   {
     return m_selectors.getMinSuffixComponents();
   }
 
-  NDN_CXX_DEPRECATED
+  [[deprecated]]
   Interest&
   setMinSuffixComponents(int minSuffixComponents)
   {
@@ -311,14 +311,14 @@
     return *this;
   }
 
-  NDN_CXX_DEPRECATED
+  [[deprecated]]
   int
   getMaxSuffixComponents() const
   {
     return m_selectors.getMaxSuffixComponents();
   }
 
-  NDN_CXX_DEPRECATED
+  [[deprecated]]
   Interest&
   setMaxSuffixComponents(int maxSuffixComponents)
   {
@@ -327,14 +327,14 @@
     return *this;
   }
 
-  NDN_CXX_DEPRECATED
+  [[deprecated]]
   const KeyLocator&
   getPublisherPublicKeyLocator() const
   {
     return m_selectors.getPublisherPublicKeyLocator();
   }
 
-  NDN_CXX_DEPRECATED
+  [[deprecated]]
   Interest&
   setPublisherPublicKeyLocator(const KeyLocator& keyLocator)
   {
@@ -343,14 +343,14 @@
     return *this;
   }
 
-  NDN_CXX_DEPRECATED
+  [[deprecated]]
   const Exclude&
   getExclude() const
   {
     return m_selectors.getExclude();
   }
 
-  NDN_CXX_DEPRECATED
+  [[deprecated]]
   Interest&
   setExclude(const Exclude& exclude)
   {
@@ -359,14 +359,14 @@
     return *this;
   }
 
-  NDN_CXX_DEPRECATED
+  [[deprecated]]
   int
   getChildSelector() const
   {
     return m_selectors.getChildSelector();
   }
 
-  NDN_CXX_DEPRECATED
+  [[deprecated]]
   Interest&
   setChildSelector(int childSelector)
   {
diff --git a/src/meta-info.hpp b/src/meta-info.hpp
index 911b1a3..3c3c59e 100644
--- a/src/meta-info.hpp
+++ b/src/meta-info.hpp
@@ -34,7 +34,7 @@
 const time::milliseconds DEFAULT_FRESHNESS_PERIOD = time::milliseconds::zero();
 
 /**
- * An MetaInfo holds the meta info which is signed inside the data packet.
+ * A MetaInfo holds the meta info which is signed inside the data packet.
  *
  * The class allows experimentation with application-defined meta information blocks,
  * which slightly violates NDN-TLV specification.  When using the application-defined
@@ -138,7 +138,7 @@
    *  If FinalBlockId element is omitted, returns a default-constructed @c name::Component.
    *  This is indistinguishable from having an empty GenericNameComponent as FinalBlockId.
    */
-  NDN_CXX_DEPRECATED
+  [[deprecated("use getFinalBlock")]]
   name::Component
   getFinalBlockId() const
   {
@@ -151,7 +151,7 @@
    *  Passing a default-constructed @c name::Component removes FinalBlockId element.
    *  This API does not support adding an empty GenericNameComponent as FinalBlockId.
    */
-  NDN_CXX_DEPRECATED
+  [[deprecated("use setFinalBlock")]]
   MetaInfo&
   setFinalBlockId(const name::Component& finalBlockId);
 
diff --git a/src/mgmt/status-dataset-context.cpp b/src/mgmt/status-dataset-context.cpp
index 2abbaa7..c8671cd 100644
--- a/src/mgmt/status-dataset-context.cpp
+++ b/src/mgmt/status-dataset-context.cpp
@@ -86,7 +86,7 @@
                    makeBinaryBlock(tlv::Content, m_buffer->buf(), m_buffer->size()),
                    m_expiry, false);
 
-      m_buffer = std::make_shared<EncodingBuffer>();
+      m_buffer = make_shared<EncodingBuffer>();
     }
   }
 }
diff --git a/src/transport/stream-transport-impl.hpp b/src/transport/stream-transport-impl.hpp
index c8f1527..d2c232b 100644
--- a/src/transport/stream-transport-impl.hpp
+++ b/src/transport/stream-transport-impl.hpp
@@ -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).
  *
@@ -31,13 +31,13 @@
 
 namespace ndn {
 
-/** \brief implementation detail of a Boost.Asio-based stream-oriented transport
+/** \brief Implementation detail of a Boost.Asio-based stream-oriented transport.
  *  \tparam BaseTransport a subclass of Transport
- *  \tparam Protocol a Boost.Asio stream-oriented protocol, including boost::asio::ip::tcp
- *                   and boost::asio::local::stream_protocol
+ *  \tparam Protocol a Boost.Asio stream-oriented protocol, e.g. boost::asio::ip::tcp
+ *                   or boost::asio::local::stream_protocol
  */
 template<typename BaseTransport, typename Protocol>
-class StreamTransportImpl : public enable_shared_from_this<StreamTransportImpl<BaseTransport, Protocol>>
+class StreamTransportImpl : public std::enable_shared_from_this<StreamTransportImpl<BaseTransport, Protocol>>
 {
 public:
   typedef StreamTransportImpl<BaseTransport, Protocol> Impl;
diff --git a/src/util/backports-optional.hpp b/src/util/backports-optional.hpp
deleted file mode 100644
index 73e1068..0000000
--- a/src/util/backports-optional.hpp
+++ /dev/null
@@ -1,333 +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.
- */
-
-/** \file
- *  \brief C++17 std::optional backport implemented using boost::optional
- *  \sa http://open-std.org/JTC1/SC22/WG21/docs/papers/2016/n4594.pdf section 20.6
- *  \sa http://en.cppreference.com/w/cpp/utility/optional
- *
- *  Differences from C++17 include:
- *  \li No constructor and operator= taking a T&&,
- *      because boost::optional lacks a move constructor as of Boost 1.54
- *  \li No constructor, operator=, emplace, and make_optional with std::initializer_list
- *  \li In-place constructor and emplace require copyable arguments,
- *      because boost::in_place requires such
- *  \li Move constructor may or may not exist (it's implicitly defined when available),
- *      because boost::optional lacks a move constructor as of Boost 1.54
- *  \li Non-const operator-> and operator* are not constexpr
- *  \li value() is not constexpr
- *  \li swap is declared without noexcept specification
- *  \li No comparison operators with const T& or nullopt_t
- *  \li No specialized std::hash support
- */
-
-#ifndef NDN_UTIL_BACKPORTS_OPTIONAL_HPP
-#define NDN_UTIL_BACKPORTS_OPTIONAL_HPP
-
-#include "backports.hpp"
-
-#if (__cplusplus > 201402L) && NDN_CXX_HAS_INCLUDE(<optional>)
-#  include <optional>
-#  define NDN_CXX_HAVE_STD_OPTIONAL
-#elif (__cplusplus > 201103L) && NDN_CXX_HAS_INCLUDE(<experimental/optional>)
-#  include <experimental/optional>
-#  if __cpp_lib_experimental_optional >= 201411
-#    define NDN_CXX_HAVE_EXPERIMENTAL_OPTIONAL
-#  endif
-#endif
-
-#if defined(NDN_CXX_HAVE_STD_OPTIONAL)
-
-namespace ndn {
-using std::optional;
-using std::in_place;
-using std::nullopt;
-using std::bad_optional_access;
-using std::make_optional;
-} // namespace ndn
-
-#elif defined(NDN_CXX_HAVE_EXPERIMENTAL_OPTIONAL)
-
-namespace ndn {
-using std::experimental::optional;
-using std::experimental::in_place;
-using std::experimental::nullopt;
-using std::experimental::bad_optional_access;
-using std::experimental::make_optional;
-
-template<typename T, typename... Args>
-constexpr optional<T>
-make_optional(Args&&... args)
-{
-  return optional<T>(in_place, std::forward<Args>(args)...);
-}
-} // namespace ndn
-
-#else
-
-#include <boost/none.hpp>
-#include <boost/optional.hpp>
-#include <boost/utility/typed_in_place_factory.hpp>
-
-namespace ndn {
-
-template<typename T>
-class optional;
-
-struct in_place_t
-{
-};
-constexpr in_place_t in_place{};
-
-class nullopt_t
-{
-public:
-  constexpr explicit
-  nullopt_t(int)
-  {
-  }
-};
-constexpr nullopt_t nullopt{0};
-
-using boost::bad_optional_access;
-
-template<typename T>
-constexpr bool
-operator==(const optional<T>& lhs, const optional<T>& rhs);
-
-template<typename T>
-constexpr bool
-operator!=(const optional<T>& lhs, const optional<T>& rhs);
-
-template<typename T>
-constexpr bool
-operator<(const optional<T>& lhs, const optional<T>& rhs);
-
-template<typename T>
-constexpr bool
-operator<=(const optional<T>& lhs, const optional<T>& rhs);
-
-template<typename T>
-constexpr bool
-operator>(const optional<T>& lhs, const optional<T>& rhs);
-
-template<typename T>
-constexpr bool
-operator>=(const optional<T>& lhs, const optional<T>& rhs);
-
-template<typename T>
-class optional
-{
-public:
-  static_assert(!std::is_same<typename std::remove_cv<T>::type, in_place_t>::value &&
-                !std::is_same<typename std::remove_cv<T>::type, nullopt_t>::value &&
-                !std::is_reference<T>::value,
-                "Invalid instantiation of optional<T>");
-
-  typedef T value_type;
-
-  constexpr
-  optional() noexcept
-  {
-  }
-
-  constexpr
-  optional(nullopt_t) noexcept
-  {
-  }
-
-  constexpr
-  optional(const T& value)
-    : m_boostOptional(value)
-  {
-  }
-
-  template<typename... Args>
-  constexpr explicit
-  optional(in_place_t, Args&&... args)
-    : m_boostOptional(boost::in_place<T>(std::forward<Args>(args)...))
-  {
-  }
-
-  optional&
-  operator=(nullopt_t) noexcept
-  {
-    m_boostOptional = boost::none;
-    return *this;
-  }
-
-  optional&
-  operator=(const optional& other)
-  {
-    m_boostOptional = other.m_boostOptional;
-    return *this;
-  }
-
-  template<typename U,
-           typename = typename std::enable_if<std::is_same<typename std::decay<U>::type, T>::value>::type>
-  optional&
-  operator=(U&& value)
-  {
-    m_boostOptional = std::forward<U>(value);
-    return *this;
-  }
-
-public: // observers
-  constexpr const T*
-  operator->() const
-  {
-    return m_boostOptional.get_ptr();
-  }
-
-  T*
-  operator->()
-  {
-    return m_boostOptional.get_ptr();
-  }
-
-  constexpr const T&
-  operator*() const
-  {
-    return m_boostOptional.get();
-  }
-
-  T&
-  operator*()
-  {
-    return m_boostOptional.get();
-  }
-
-  constexpr explicit
-  operator bool() const noexcept
-  {
-    return static_cast<bool>(m_boostOptional);
-  }
-
-  const T&
-  value() const
-  {
-    return const_cast<optional*>(this)->value();
-  }
-
-  T&
-  value()
-  {
-    return m_boostOptional.value();
-  }
-
-  template<typename U>
-  constexpr T
-  value_or(U&& default_value) const
-  {
-    return m_boostOptional.value_or(default_value);
-  }
-
-public: // modifiers
-  void
-  swap(optional& other)
-  {
-    boost::swap(m_boostOptional, other.m_boostOptional);
-  }
-
-  void
-  reset() noexcept
-  {
-    m_boostOptional = boost::none;
-  }
-
-  template<typename... Args>
-  void
-  emplace(Args&&... args)
-  {
-    m_boostOptional = boost::in_place<T>(std::forward<Args>(args)...);
-  }
-
-private:
-  boost::optional<T> m_boostOptional;
-
-  friend bool operator==<T>(const optional<T>&, const optional<T>&);
-  friend bool operator!=<T>(const optional<T>&, const optional<T>&);
-  friend bool operator< <T>(const optional<T>&, const optional<T>&);
-  friend bool operator<=<T>(const optional<T>&, const optional<T>&);
-  friend bool operator> <T>(const optional<T>&, const optional<T>&);
-  friend bool operator>=<T>(const optional<T>&, const optional<T>&);
-};
-
-template<typename T>
-constexpr bool
-operator==(const optional<T>& lhs, const optional<T>& rhs)
-{
-  return operator==(lhs.m_boostOptional, rhs.m_boostOptional);
-}
-
-template<typename T>
-constexpr bool
-operator!=(const optional<T>& lhs, const optional<T>& rhs)
-{
-  return operator!=(lhs.m_boostOptional, rhs.m_boostOptional);
-}
-
-template<typename T>
-constexpr bool
-operator<(const optional<T>& lhs, const optional<T>& rhs)
-{
-  return operator<(lhs.m_boostOptional, rhs.m_boostOptional);
-}
-
-template<typename T>
-constexpr bool
-operator<=(const optional<T>& lhs, const optional<T>& rhs)
-{
-  return operator<=(lhs.m_boostOptional, rhs.m_boostOptional);
-}
-
-template<typename T>
-constexpr bool
-operator>(const optional<T>& lhs, const optional<T>& rhs)
-{
-  return operator>(lhs.m_boostOptional, rhs.m_boostOptional);
-}
-
-template<typename T>
-constexpr bool
-operator>=(const optional<T>& lhs, const optional<T>& rhs)
-{
-  return operator>=(lhs.m_boostOptional, rhs.m_boostOptional);
-}
-
-template<typename T>
-constexpr optional<typename std::decay<T>::type>
-make_optional(T&& value)
-{
-  return optional<typename std::decay<T>::type>(std::forward<T>(value));
-}
-
-template<typename T, typename... Args>
-constexpr optional<T>
-make_optional(Args&&... args)
-{
-  return optional<T>(in_place, std::forward<Args>(args)...);
-}
-
-} // namespace ndn
-
-#endif
-#endif // NDN_UTIL_BACKPORTS_OPTIONAL_HPP
diff --git a/src/util/backports-ostream-joiner.hpp b/src/util/backports-ostream-joiner.hpp
index 75d53dd..1ba1380 100644
--- a/src/util/backports-ostream-joiner.hpp
+++ b/src/util/backports-ostream-joiner.hpp
@@ -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).
  *
@@ -29,7 +29,7 @@
 
 #include "backports.hpp"
 
-#if (__cplusplus >= 201402L) && NDN_CXX_HAS_INCLUDE(<experimental/iterator>)
+#if NDN_CXX_HAS_INCLUDE(<experimental/iterator>)
 #  include <experimental/iterator>
 #  if __cpp_lib_experimental_ostream_joiner >= 201411
 #    define NDN_CXX_HAVE_EXPERIMENTAL_OSTREAM_JOINER
diff --git a/src/util/backports.hpp b/src/util/backports.hpp
index 18a011ea..70f62f3 100644
--- a/src/util/backports.hpp
+++ b/src/util/backports.hpp
@@ -24,10 +24,6 @@
 
 #include "../common.hpp"
 
-#ifndef NDN_CXX_HAVE_STD_TO_STRING
-#include <boost/lexical_cast.hpp>
-#endif
-
 #ifdef __has_cpp_attribute
 #  define NDN_CXX_HAS_CPP_ATTRIBUTE(x) __has_cpp_attribute(x)
 #else
@@ -40,40 +36,6 @@
 #  define NDN_CXX_HAS_INCLUDE(x) 0
 #endif
 
-#if (__cplusplus >= 201402L) && NDN_CXX_HAS_CPP_ATTRIBUTE(deprecated)
-#  define NDN_CXX_DEPRECATED_MSG(msg) [[deprecated(msg)]]
-#elif NDN_CXX_HAS_CPP_ATTRIBUTE(gnu::deprecated)
-#  define NDN_CXX_DEPRECATED_MSG(msg) [[gnu::deprecated(msg)]]
-#elif defined(__GNUC__)
-#  define NDN_CXX_DEPRECATED_MSG(msg) __attribute__((deprecated(msg)))
-#else
-#  define NDN_CXX_DEPRECATED_MSG(msg)
-#endif
-
-/** \brief Mark a type, variable, or function as deprecated.
- *
- *  To deprecate a type \c DeprecatedType:
- *  \code
- *  typedef ModernType DeprecatedType NDN_CXX_DEPRECATED;
- *  \endcode
- *  This macro can only be applied to a typedef, not directly on a class.
- *
- *  To deprecate a variable or class member \c deprecatedVar:
- *  \code
- *  int deprecatedVar NDN_CXX_DEPRECATED;
- *  \endcode
- *
- *  To deprecate a function \c deprecatedFunc:
- *  \code
- *  NDN_CXX_DEPRECATED
- *  void
- *  deprecatedFunc(int a, NamedEnum b)
- *  {
- *  }
- *  \endcode
- */
-#define NDN_CXX_DEPRECATED NDN_CXX_DEPRECATED_MSG("")
-
 #if (__cplusplus > 201402L) && NDN_CXX_HAS_CPP_ATTRIBUTE(fallthrough)
 #  define NDN_CXX_FALLTHROUGH [[fallthrough]]
 #elif NDN_CXX_HAS_CPP_ATTRIBUTE(clang::fallthrough)
@@ -86,18 +48,14 @@
 #  define NDN_CXX_FALLTHROUGH ((void)0)
 #endif
 
-namespace ndn {
+#include "backports-ostream-joiner.hpp"
+#include "nonstd/optional.hpp"
 
-#if __cpp_lib_make_unique >= 201304
-using std::make_unique;
-#else
-template<typename T, typename ...Args>
-inline unique_ptr<T>
-make_unique(Args&&... args)
-{
-  return unique_ptr<T>(new T(std::forward<Args>(args)...));
-}
-#endif // __cpp_lib_make_unique
+#ifndef NDN_CXX_HAVE_STD_TO_STRING
+#include <boost/lexical_cast.hpp>
+#endif
+
+namespace ndn {
 
 #ifdef NDN_CXX_HAVE_STD_TO_STRING
 using std::to_string;
@@ -128,9 +86,14 @@
 }
 #endif // __cpp_lib_clamp
 
-} // namespace ndn
+using ::nonstd::optional;
+using ::nonstd::bad_optional_access;
+using ::nonstd::nullopt;
+using ::nonstd::nullopt_t;
+using ::nonstd::in_place;
+using ::nonstd::in_place_t;
+using ::nonstd::make_optional;
 
-#include "backports-optional.hpp"
-#include "backports-ostream-joiner.hpp"
+} // namespace ndn
 
 #endif // NDN_UTIL_BACKPORTS_HPP
diff --git a/src/util/nonstd/optional.hpp b/src/util/nonstd/optional.hpp
new file mode 100644
index 0000000..8a4a31a
--- /dev/null
+++ b/src/util/nonstd/optional.hpp
@@ -0,0 +1,1205 @@
+//
+// Copyright (c) 2014-2017 Martin Moene
+//
+// https://github.com/martinmoene/optional-lite
+//
+// This code is licensed under the MIT License (MIT).
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+// THE SOFTWARE.
+
+#pragma once
+
+#ifndef NONSTD_OPTIONAL_LITE_HPP
+#define NONSTD_OPTIONAL_LITE_HPP
+
+#define  optional_lite_VERSION "2.3.2"
+
+// Compiler detection (C++20 is speculative):
+// Note: MSVC supports C++14 since it supports C++17.
+
+#ifdef _MSVC_LANG
+# define optional_MSVC_LANG  _MSVC_LANG
+#else
+# define optional_MSVC_LANG  0
+#endif
+
+#define optional_CPP11             (__cplusplus == 201103L )
+#define optional_CPP11_OR_GREATER  (__cplusplus >= 201103L || optional_MSVC_LANG >= 201103L )
+#define optional_CPP14_OR_GREATER  (__cplusplus >= 201402L || optional_MSVC_LANG >= 201703L )
+#define optional_CPP17_OR_GREATER  (__cplusplus >= 201703L || optional_MSVC_LANG >= 201703L )
+#define optional_CPP20_OR_GREATER  (__cplusplus >= 202000L || optional_MSVC_LANG >= 202000L )
+
+// use C++17 std::optional if available:
+
+#if defined( __has_include )
+# define optional_HAS_INCLUDE( arg )  __has_include( arg )
+#else
+# define optional_HAS_INCLUDE( arg )  0
+#endif
+
+#define optional_HAVE_STD_OPTIONAL  ( optional_CPP17_OR_GREATER && optional_HAS_INCLUDE( <optional> ) )
+
+#if optional_HAVE_STD_OPTIONAL
+
+#include <optional>
+
+namespace nonstd {
+
+    using std::optional;
+    using std::bad_optional_access;
+    using std::hash;
+
+    using std::nullopt;
+    using std::nullopt_t;
+    using std::in_place;
+    using std::in_place_type;
+    using std::in_place_index;
+    using std::in_place_t;
+    using std::in_place_type_t;
+    using std::in_place_index_t;
+
+    using std::operator==;
+    using std::operator!=;
+    using std::operator<;
+    using std::operator<=;
+    using std::operator>;
+    using std::operator>=;
+    using std::make_optional;
+    using std::swap;
+}
+
+#else // C++17 std::optional
+
+#include <cassert>
+#include <stdexcept>
+#include <utility>
+
+// optional-lite alignment configuration:
+
+#ifndef  optional_CONFIG_MAX_ALIGN_HACK
+# define optional_CONFIG_MAX_ALIGN_HACK  0
+#endif
+
+#ifndef  optional_CONFIG_ALIGN_AS
+// no default, used in #if defined()
+#endif
+
+#ifndef  optional_CONFIG_ALIGN_AS_FALLBACK
+# define optional_CONFIG_ALIGN_AS_FALLBACK  double
+#endif
+
+// Compiler warning suppression:
+
+#ifdef __clang__
+# pragma clang diagnostic push
+# pragma clang diagnostic ignored "-Wundef"
+#elif defined __GNUC__
+# pragma GCC   diagnostic push
+# pragma GCC   diagnostic ignored "-Wundef"
+#endif
+
+// half-open range [lo..hi):
+#define optional_BETWEEN( v, lo, hi ) ( lo <= v && v < hi )
+
+#if defined(_MSC_VER) && !defined(__clang__)
+# define optional_COMPILER_MSVC_VERSION   (_MSC_VER / 10 - 10 * ( 5 + (_MSC_VER < 1900)) )
+#else
+# define optional_COMPILER_MSVC_VERSION   0
+#endif
+
+#define optional_COMPILER_VERSION( major, minor, patch )  ( 10 * (10 * major + minor ) + patch )
+
+#if defined __GNUC__
+# define optional_COMPILER_GNUC_VERSION   optional_COMPILER_VERSION(__GNUC__, __GNUC_MINOR__, __GNUC_PATCHLEVEL__)
+#else
+# define optional_COMPILER_GNUC_VERSION   0
+#endif
+
+#if defined __clang__
+# define optional_COMPILER_CLANG_VERSION  optional_COMPILER_VERSION(__clang_major__, __clang_minor__, __clang_patchlevel__)
+#else
+# define optional_COMPILER_CLANG_VERSION  0
+#endif
+
+#if optional_BETWEEN(optional_COMPILER_MSVC_VERSION, 70, 140 )
+# pragma warning( push )
+# pragma warning( disable: 4345 )   // initialization behavior changed
+#endif
+
+#if optional_BETWEEN(optional_COMPILER_MSVC_VERSION, 70, 150 )
+# pragma warning( push )
+# pragma warning( disable: 4814 )   // in C++14 'constexpr' will not imply 'const'
+#endif
+
+// Presence of language and library features:
+
+#define optional_HAVE(FEATURE) ( optional_HAVE_##FEATURE )
+
+// Presence of C++11 language features:
+
+#if optional_CPP11_OR_GREATER || optional_COMPILER_MSVC_VERSION >= 100
+# define optional_HAVE_AUTO  1
+# define optional_HAVE_NULLPTR  1
+# define optional_HAVE_STATIC_ASSERT  1
+#endif
+
+#if optional_CPP11_OR_GREATER || optional_COMPILER_MSVC_VERSION >= 120
+# define optional_HAVE_DEFAULT_FUNCTION_TEMPLATE_ARG  1
+# define optional_HAVE_INITIALIZER_LIST  1
+#endif
+
+#if optional_CPP11_OR_GREATER || optional_COMPILER_MSVC_VERSION >= 140
+# define optional_HAVE_ALIAS_TEMPLATE  1
+# define optional_HAVE_CONSTEXPR_11  1
+# define optional_HAVE_ENUM_CLASS  1
+# define optional_HAVE_EXPLICIT_CONVERSION  1
+# define optional_HAVE_IS_DEFAULT  1
+# define optional_HAVE_IS_DELETE  1
+# define optional_HAVE_NOEXCEPT  1
+# define optional_HAVE_REF_QUALIFIER  1
+#endif
+
+// Presence of C++14 language features:
+
+#if optional_CPP14_OR_GREATER
+# define optional_HAVE_CONSTEXPR_14  1
+#endif
+
+// Presence of C++17 language features:
+
+#if optional_CPP17_OR_GREATER
+# define optional_HAVE_ENUM_CLASS_CONSTRUCTION_FROM_UNDERLYING_TYPE  1
+#endif
+
+// Presence of C++ library features:
+
+#if optional_COMPILER_GNUC_VERSION
+# define optional_HAVE_TR1_TYPE_TRAITS  1
+# define optional_HAVE_TR1_ADD_POINTER  1
+#endif
+
+#if optional_CPP11_OR_GREATER || optional_COMPILER_MSVC_VERSION >= 90
+# define optional_HAVE_TYPE_TRAITS  1
+# define optional_HAVE_STD_ADD_POINTER  1
+#endif
+
+#if optional_CPP11_OR_GREATER || optional_COMPILER_MSVC_VERSION >= 110
+# define optional_HAVE_ARRAY  1
+#endif
+
+#if optional_CPP11_OR_GREATER || optional_COMPILER_MSVC_VERSION >= 120
+# define optional_HAVE_CONDITIONAL  1
+#endif
+
+#if optional_CPP11_OR_GREATER || optional_COMPILER_MSVC_VERSION >= 140 || (optional_COMPILER_MSVC_VERSION >= 90 && _HAS_CPP0X)
+# define optional_HAVE_CONTAINER_DATA_METHOD  1
+#endif
+
+#if optional_CPP11_OR_GREATER || optional_COMPILER_MSVC_VERSION >= 120
+# define optional_HAVE_REMOVE_CV  1
+#endif
+
+#if optional_CPP11_OR_GREATER || optional_COMPILER_MSVC_VERSION >= 140
+# define optional_HAVE_SIZED_TYPES  1
+#endif
+
+// For the rest, consider VC14 as C++11 for optional-lite:
+
+#if optional_COMPILER_MSVC_VERSION >= 140
+# undef  optional_CPP11_OR_GREATER
+# define optional_CPP11_OR_GREATER  1
+#endif
+
+// C++ feature usage:
+
+#if optional_HAVE( CONSTEXPR_11 )
+# define optional_constexpr  constexpr
+#else
+# define optional_constexpr  /*constexpr*/
+#endif
+
+#if optional_HAVE( CONSTEXPR_14 )
+# define optional_constexpr14  constexpr
+#else
+# define optional_constexpr14  /*constexpr*/
+#endif
+
+#if optional_HAVE( NOEXCEPT )
+# define optional_noexcept  noexcept
+#else
+# define optional_noexcept  /*noexcept*/
+#endif
+
+#if optional_HAVE( NULLPTR )
+# define optional_nullptr  nullptr
+#else
+# define optional_nullptr  NULL
+#endif
+
+#if optional_HAVE( REF_QUALIFIER )
+# define optional_ref_qual  &
+# define optional_refref_qual  &&
+#else
+# define optional_ref_qual  /*&*/
+# define optional_refref_qual  /*&&*/
+#endif
+
+// additional includes:
+
+#if optional_CPP11_OR_GREATER
+# include <functional>
+#endif
+
+#if optional_HAVE( INITIALIZER_LIST )
+# include <initializer_list>
+#endif
+
+#if optional_HAVE( TYPE_TRAITS )
+# include <type_traits>
+#elif optional_HAVE( TR1_TYPE_TRAITS )
+# include <tr1/type_traits>
+#endif
+
+// type traits needed:
+
+namespace nonstd { namespace optional_lite { namespace detail {
+
+#if optional_HAVE( CONDITIONAL )
+    using std::conditional;
+#else
+    template< bool B, typename T, typename F > struct conditional              { typedef T type; };
+    template<         typename T, typename F > struct conditional<false, T, F> { typedef F type; };
+#endif // optional_HAVE_CONDITIONAL
+
+}}}
+
+//
+// in_place: code duplicated in any-lite, optional-lite, variant-lite:
+//
+
+#ifndef nonstd_lite_HAVE_IN_PLACE_TYPES
+
+namespace nonstd {
+
+namespace detail {
+
+template< class T >
+struct in_place_type_tag {};
+
+template< std::size_t I >
+struct in_place_index_tag {};
+
+} // namespace detail
+
+struct in_place_t {};
+
+template< class T >
+inline in_place_t in_place( detail::in_place_type_tag<T> = detail::in_place_type_tag<T>() )
+{
+    return in_place_t();
+}
+
+template< std::size_t I >
+inline in_place_t in_place( detail::in_place_index_tag<I> = detail::in_place_index_tag<I>() )
+{
+    return in_place_t();
+}
+
+template< class T >
+inline in_place_t in_place_type( detail::in_place_type_tag<T> = detail::in_place_type_tag<T>() )
+{
+    return in_place_t();
+}
+
+template< std::size_t I >
+inline in_place_t in_place_index( detail::in_place_index_tag<I> = detail::in_place_index_tag<I>() )
+{
+    return in_place_t();
+}
+
+// mimic templated typedef:
+
+#define nonstd_lite_in_place_type_t( T)  nonstd::in_place_t(&)( nonstd::detail::in_place_type_tag<T>  )
+#define nonstd_lite_in_place_index_t(T)  nonstd::in_place_t(&)( nonstd::detail::in_place_index_tag<I> )
+
+#define nonstd_lite_HAVE_IN_PLACE_TYPES  1
+
+} // namespace nonstd
+
+#endif // nonstd_lite_HAVE_IN_PLACE_TYPES
+
+//
+// optional:
+//
+
+namespace nonstd { namespace optional_lite {
+
+/// class optional
+
+template< typename T >
+class optional;
+
+namespace detail {
+
+// C++11 emulation:
+
+struct nulltype{};
+
+template< typename Head, typename Tail >
+struct typelist
+{
+    typedef Head head;
+    typedef Tail tail;
+};
+
+#if optional_CONFIG_MAX_ALIGN_HACK
+
+// Max align, use most restricted type for alignment:
+
+#define optional_UNIQUE(  name )       optional_UNIQUE2( name, __LINE__ )
+#define optional_UNIQUE2( name, line ) optional_UNIQUE3( name, line )
+#define optional_UNIQUE3( name, line ) name ## line
+
+#define optional_ALIGN_TYPE( type ) \
+    type optional_UNIQUE( _t ); struct_t< type > optional_UNIQUE( _st )
+
+template< typename T >
+struct struct_t { T _; };
+
+union max_align_t
+{
+    optional_ALIGN_TYPE( char );
+    optional_ALIGN_TYPE( short int );
+    optional_ALIGN_TYPE( int );
+    optional_ALIGN_TYPE( long int  );
+    optional_ALIGN_TYPE( float  );
+    optional_ALIGN_TYPE( double );
+    optional_ALIGN_TYPE( long double );
+    optional_ALIGN_TYPE( char * );
+    optional_ALIGN_TYPE( short int * );
+    optional_ALIGN_TYPE( int *  );
+    optional_ALIGN_TYPE( long int * );
+    optional_ALIGN_TYPE( float * );
+    optional_ALIGN_TYPE( double * );
+    optional_ALIGN_TYPE( long double * );
+    optional_ALIGN_TYPE( void * );
+
+#ifdef HAVE_LONG_LONG
+    optional_ALIGN_TYPE( long long );
+#endif
+
+    struct Unknown;
+
+    Unknown ( * optional_UNIQUE(_) )( Unknown );
+    Unknown * Unknown::* optional_UNIQUE(_);
+    Unknown ( Unknown::* optional_UNIQUE(_) )( Unknown );
+
+    struct_t< Unknown ( * )( Unknown)         > optional_UNIQUE(_);
+    struct_t< Unknown * Unknown::*            > optional_UNIQUE(_);
+    struct_t< Unknown ( Unknown::* )(Unknown) > optional_UNIQUE(_);
+};
+
+#undef optional_UNIQUE
+#undef optional_UNIQUE2
+#undef optional_UNIQUE3
+
+#undef optional_ALIGN_TYPE
+
+#elif defined( optional_CONFIG_ALIGN_AS ) // optional_CONFIG_MAX_ALIGN_HACK
+
+// Use user-specified type for alignment:
+
+#define optional_ALIGN_AS( unused ) \
+    optional_CONFIG_ALIGN_AS
+
+#else // optional_CONFIG_MAX_ALIGN_HACK
+
+// Determine POD type to use for alignment:
+
+#define optional_ALIGN_AS( to_align ) \
+    typename type_of_size< alignment_types, alignment_of< to_align >::value >::type
+
+template <typename T>
+struct alignment_of;
+
+template <typename T>
+struct alignment_of_hack
+{
+    char c;
+    T t;
+    alignment_of_hack();
+};
+
+template <unsigned A, unsigned S>
+struct alignment_logic
+{
+    enum { value = A < S ? A : S };
+};
+
+template< typename T >
+struct alignment_of
+{
+    enum { value = alignment_logic<
+        sizeof( alignment_of_hack<T> ) - sizeof(T), sizeof(T) >::value, };
+};
+
+template< typename List, size_t N >
+struct type_of_size
+{
+    typedef typename conditional<
+        N == sizeof( typename List::head ),
+            typename List::head,
+            typename type_of_size<typename List::tail, N >::type >::type type;
+};
+
+template< size_t N >
+struct type_of_size< nulltype, N >
+{
+    typedef optional_CONFIG_ALIGN_AS_FALLBACK type;
+};
+
+template< typename T>
+struct struct_t { T _; };
+
+#define optional_ALIGN_TYPE( type ) \
+    typelist< type , typelist< struct_t< type >
+
+struct Unknown;
+
+typedef
+    optional_ALIGN_TYPE( char ),
+    optional_ALIGN_TYPE( short ),
+    optional_ALIGN_TYPE( int ),
+    optional_ALIGN_TYPE( long ),
+    optional_ALIGN_TYPE( float ),
+    optional_ALIGN_TYPE( double ),
+    optional_ALIGN_TYPE( long double ),
+
+    optional_ALIGN_TYPE( char *),
+    optional_ALIGN_TYPE( short * ),
+    optional_ALIGN_TYPE( int * ),
+    optional_ALIGN_TYPE( long * ),
+    optional_ALIGN_TYPE( float * ),
+    optional_ALIGN_TYPE( double * ),
+    optional_ALIGN_TYPE( long double * ),
+
+    optional_ALIGN_TYPE( Unknown ( * )( Unknown ) ),
+    optional_ALIGN_TYPE( Unknown * Unknown::*     ),
+    optional_ALIGN_TYPE( Unknown ( Unknown::* )( Unknown ) ),
+
+    nulltype
+    > > > > > > >    > > > > > > >
+    > > > > > > >    > > > > > > >
+    > > > > > >
+    alignment_types;
+
+#undef optional_ALIGN_TYPE
+
+#endif // optional_CONFIG_MAX_ALIGN_HACK
+
+/// C++03 constructed union to hold value.
+
+template< typename T >
+union storage_t
+{
+private:
+    friend class optional<T>;
+
+    typedef T value_type;
+
+    storage_t() {}
+
+    storage_t( value_type const & v )
+    {
+        construct_value( v );
+    }
+
+    void construct_value( value_type const & v )
+    {
+        ::new( value_ptr() ) value_type( v );
+    }
+
+#if optional_CPP11_OR_GREATER
+
+    storage_t( value_type && v )
+    {
+        construct_value( std::move( v ) );
+    }
+
+    void construct_value( value_type && v )
+    {
+        ::new( value_ptr() ) value_type( std::move( v ) );
+    }
+
+#endif
+
+    void destruct_value()
+    {
+        value_ptr()->~T();
+    }
+
+    value_type const * value_ptr() const
+    {
+        return as<value_type>();
+    }
+
+    value_type * value_ptr()
+    {
+        return as<value_type>();
+    }
+
+    value_type const & value() const optional_ref_qual
+    {
+        return * value_ptr();
+    }
+
+    value_type & value() optional_ref_qual
+    {
+        return * value_ptr();
+    }
+
+#if optional_CPP11_OR_GREATER
+
+    value_type const && value() const optional_refref_qual
+    {
+        return * value_ptr();
+    }
+
+    value_type && value() optional_refref_qual
+    {
+        return * value_ptr();
+    }
+
+#endif
+
+#if optional_CPP11_OR_GREATER
+
+    using aligned_storage_t = typename std::aligned_storage< sizeof(value_type), alignof(value_type) >::type;
+    aligned_storage_t data;
+
+#elif optional_CONFIG_MAX_ALIGN_HACK
+
+    typedef struct { unsigned char data[ sizeof(value_type) ]; } aligned_storage_t;
+
+    max_align_t hack;
+    aligned_storage_t data;
+
+#else
+    typedef optional_ALIGN_AS(value_type) align_as_type;
+
+    typedef struct { align_as_type data[ 1 + ( sizeof(value_type) - 1 ) / sizeof(align_as_type) ]; } aligned_storage_t;
+    aligned_storage_t data;
+
+#   undef optional_ALIGN_AS
+
+#endif // optional_CONFIG_MAX_ALIGN_HACK
+
+    void * ptr() optional_noexcept
+    {
+        return &data;
+    }
+
+    void const * ptr() const optional_noexcept
+    {
+        return &data;
+    }
+
+    template <typename U>
+    U * as()
+    {
+        return reinterpret_cast<U*>( ptr() );
+    }
+
+    template <typename U>
+    U const * as() const
+    {
+        return reinterpret_cast<U const *>( ptr() );
+    }
+};
+
+} // namespace detail
+
+/// disengaged state tag
+
+struct nullopt_t
+{
+    struct init{};
+    optional_constexpr nullopt_t( init ) {}
+};
+
+#if optional_HAVE( CONSTEXPR_11 )
+constexpr nullopt_t nullopt{ nullopt_t::init{} };
+#else
+// extra parenthesis to prevent the most vexing parse:
+const nullopt_t nullopt(( nullopt_t::init() ));
+#endif
+
+/// optional access error
+
+class bad_optional_access : public std::logic_error
+{
+public:
+  explicit bad_optional_access()
+  : logic_error( "bad optional access" ) {}
+};
+
+/// optional
+
+template< typename T>
+class optional
+{
+private:
+    typedef void (optional::*safe_bool)() const;
+
+public:
+    typedef T value_type;
+
+    optional_constexpr optional() optional_noexcept
+    : has_value_( false )
+    , contained()
+    {}
+
+    optional_constexpr optional( nullopt_t ) optional_noexcept
+    : has_value_( false )
+    , contained()
+    {}
+
+    optional( optional const & rhs )
+    : has_value_( rhs.has_value() )
+    {
+        if ( rhs.has_value() )
+            contained.construct_value( rhs.contained.value() );
+    }
+
+#if optional_CPP11_OR_GREATER
+    optional_constexpr14 optional( optional && rhs ) noexcept( std::is_nothrow_move_constructible<T>::value )
+    : has_value_( rhs.has_value() )
+    {
+        if ( rhs.has_value() )
+            contained.construct_value( std::move( rhs.contained.value() ) );
+    }
+#endif
+
+    optional_constexpr optional( value_type const & value )
+    : has_value_( true )
+    , contained( value )
+    {}
+
+#if optional_CPP11_OR_GREATER
+
+    optional_constexpr optional( value_type && value )
+    : has_value_( true )
+    , contained( std::move( value ) )
+    {}
+
+    template< class... Args >
+    optional_constexpr explicit optional( nonstd_lite_in_place_type_t(T), Args&&... args )
+    : has_value_( true )
+    , contained( T( std::forward<Args>(args)...) )
+    {}
+
+    template< class U, class... Args >
+    optional_constexpr explicit optional( nonstd_lite_in_place_type_t(T), std::initializer_list<U> il, Args&&... args )
+    : has_value_( true )
+    , contained( T( il, std::forward<Args>(args)...) )
+    {}
+
+#endif // optional_CPP11_OR_GREATER
+
+    ~optional()
+    {
+        if ( has_value() )
+            contained.destruct_value();
+    }
+
+    // assignment
+
+    optional & operator=( nullopt_t ) optional_noexcept
+    {
+        reset();
+        return *this;
+    }
+
+    optional & operator=( optional const & rhs )
+#if optional_CPP11_OR_GREATER
+        noexcept( std::is_nothrow_move_assignable<T>::value && std::is_nothrow_move_constructible<T>::value )
+#endif
+    {
+        if      ( has_value() == true  && rhs.has_value() == false ) reset();
+        else if ( has_value() == false && rhs.has_value() == true  ) initialize( *rhs );
+        else if ( has_value() == true  && rhs.has_value() == true  ) contained.value() = *rhs;
+        return *this;
+    }
+
+#if optional_CPP11_OR_GREATER
+
+    optional & operator=( optional && rhs ) noexcept
+    {
+        if      ( has_value() == true  && rhs.has_value() == false ) reset();
+        else if ( has_value() == false && rhs.has_value() == true  ) initialize( std::move( *rhs ) );
+        else if ( has_value() == true  && rhs.has_value() == true  ) contained.value() = std::move( *rhs );
+        return *this;
+    }
+
+    template< class U,
+        typename = typename std::enable_if< std::is_same< typename std::decay<U>::type, T>::value >::type >
+    optional & operator=( U && v )
+    {
+        if ( has_value() ) contained.value() = std::forward<U>( v );
+        else               initialize( T( std::forward<U>( v ) ) );
+        return *this;
+    }
+
+    template< class... Args >
+    void emplace( Args&&... args )
+    {
+        *this = nullopt;
+        initialize( T( std::forward<Args>(args)...) );
+    }
+
+    template< class U, class... Args >
+    void emplace( std::initializer_list<U> il, Args&&... args )
+    {
+        *this = nullopt;
+        initialize( T( il, std::forward<Args>(args)...) );
+    }
+
+#endif // optional_CPP11_OR_GREATER
+
+    // swap
+
+    void swap( optional & rhs )
+#if optional_CPP11_OR_GREATER
+    noexcept( std::is_nothrow_move_constructible<T>::value && noexcept( std::swap( std::declval<T&>(), std::declval<T&>() ) ) )
+#endif
+    {
+        using std::swap;
+        if      ( has_value() == true  && rhs.has_value() == true  ) { swap( **this, *rhs ); }
+        else if ( has_value() == false && rhs.has_value() == true  ) { initialize( *rhs ); rhs.reset(); }
+        else if ( has_value() == true  && rhs.has_value() == false ) { rhs.initialize( **this ); reset(); }
+    }
+
+    // observers
+
+    optional_constexpr value_type const * operator ->() const
+    {
+        return assert( has_value() ),
+            contained.value_ptr();
+    }
+
+    optional_constexpr14 value_type * operator ->()
+    {
+        return assert( has_value() ),
+            contained.value_ptr();
+    }
+
+    optional_constexpr value_type const & operator *() const optional_ref_qual
+    {
+        return assert( has_value() ),
+            contained.value();
+    }
+
+    optional_constexpr14 value_type & operator *() optional_ref_qual
+    {
+        return assert( has_value() ),
+            contained.value();
+    }
+
+#if optional_CPP11_OR_GREATER
+
+    optional_constexpr value_type const && operator *() const optional_refref_qual
+    {
+        return assert( has_value() ),
+            std::move( contained.value() );
+    }
+
+    optional_constexpr14 value_type && operator *() optional_refref_qual
+    {
+        return assert( has_value() ),
+            std::move( contained.value() );
+    }
+
+#endif
+
+#if optional_CPP11_OR_GREATER
+    optional_constexpr explicit operator bool() const optional_noexcept
+    {
+        return has_value();
+    }
+#else
+    optional_constexpr operator safe_bool() const optional_noexcept
+    {
+        return has_value() ? &optional::this_type_does_not_support_comparisons : 0;
+    }
+#endif
+
+    optional_constexpr bool has_value() const optional_noexcept
+    {
+        return has_value_;
+    }
+
+    optional_constexpr14 value_type const & value() const optional_ref_qual
+    {
+        if ( ! has_value() )
+            throw bad_optional_access();
+
+        return contained.value();
+    }
+
+    optional_constexpr14 value_type & value() optional_ref_qual
+    {
+        if ( ! has_value() )
+            throw bad_optional_access();
+
+        return contained.value();
+    }
+
+#if optional_HAVE( REF_QUALIFIER )
+
+    optional_constexpr14 value_type const && value() const optional_refref_qual
+    {
+        if ( ! has_value() )
+            throw bad_optional_access();
+
+        return std::move( contained.value() );
+    }
+
+    optional_constexpr14 value_type && value() optional_refref_qual
+    {
+        if ( ! has_value() )
+            throw bad_optional_access();
+
+        return std::move( contained.value() );
+    }
+
+#endif
+
+#if optional_CPP11_OR_GREATER
+
+    template< class U >
+    optional_constexpr value_type value_or( U && v ) const optional_ref_qual
+    {
+        return has_value() ? contained.value() : static_cast<T>(std::forward<U>( v ) );
+    }
+
+    template< class U >
+    optional_constexpr value_type value_or( U && v ) const optional_refref_qual
+    {
+        return has_value() ? std::move( contained.value() ) : static_cast<T>(std::forward<U>( v ) );
+    }
+
+#else
+
+    template< class U >
+    optional_constexpr value_type value_or( U const & v ) const
+    {
+        return has_value() ? contained.value() : static_cast<value_type>( v );
+    }
+
+#endif // optional_CPP11_OR_GREATER
+
+    // modifiers
+
+    void reset() optional_noexcept
+    {
+        if ( has_value() )
+            contained.destruct_value();
+
+        has_value_ = false;
+    }
+
+private:
+    void this_type_does_not_support_comparisons() const {}
+
+    template< typename V >
+    void initialize( V const & value )
+    {
+        assert( ! has_value()  );
+        contained.construct_value( value );
+        has_value_ = true;
+    }
+
+#if optional_CPP11_OR_GREATER
+    template< typename V >
+    void initialize( V && value )
+    {
+        assert( ! has_value()  );
+        contained.construct_value( std::move( value ) );
+        has_value_ = true;
+    }
+#endif
+
+private:
+    bool has_value_;
+    detail::storage_t< value_type > contained;
+
+};
+
+// Relational operators
+
+template< typename T, typename U >
+inline optional_constexpr bool operator==( optional<T> const & x, optional<U> const & y )
+{
+    return bool(x) != bool(y) ? false : !bool( x ) ? true : *x == *y;
+}
+
+template< typename T, typename U >
+inline optional_constexpr bool operator!=( optional<T> const & x, optional<U> const & y )
+{
+    return !(x == y);
+}
+
+template< typename T, typename U >
+inline optional_constexpr bool operator<( optional<T> const & x, optional<U> const & y )
+{
+    return (!y) ? false : (!x) ? true : *x < *y;
+}
+
+template< typename T, typename U >
+inline optional_constexpr bool operator>( optional<T> const & x, optional<U> const & y )
+{
+    return (y < x);
+}
+
+template< typename T, typename U >
+inline optional_constexpr bool operator<=( optional<T> const & x, optional<U> const & y )
+{
+    return !(y < x);
+}
+
+template< typename T, typename U >
+inline optional_constexpr bool operator>=( optional<T> const & x, optional<U> const & y )
+{
+    return !(x < y);
+}
+
+// Comparison with nullopt
+
+template< typename T >
+inline optional_constexpr bool operator==( optional<T> const & x, nullopt_t ) optional_noexcept
+{
+    return (!x);
+}
+
+template< typename T >
+inline optional_constexpr bool operator==( nullopt_t, optional<T> const & x ) optional_noexcept
+{
+    return (!x);
+}
+
+template< typename T >
+inline optional_constexpr bool operator!=( optional<T> const & x, nullopt_t ) optional_noexcept
+{
+    return bool(x);
+}
+
+template< typename T >
+inline optional_constexpr bool operator!=( nullopt_t, optional<T> const & x ) optional_noexcept
+{
+    return bool(x);
+}
+
+template< typename T >
+inline optional_constexpr bool operator<( optional<T> const &, nullopt_t ) optional_noexcept
+{
+    return false;
+}
+
+template< typename T >
+inline optional_constexpr bool operator<( nullopt_t, optional<T> const & x ) optional_noexcept
+{
+    return bool(x);
+}
+
+template< typename T >
+inline optional_constexpr bool operator<=( optional<T> const & x, nullopt_t ) optional_noexcept
+{
+    return (!x);
+}
+
+template< typename T >
+inline optional_constexpr bool operator<=( nullopt_t, optional<T> const & ) optional_noexcept
+{
+    return true;
+}
+
+template< typename T >
+inline optional_constexpr bool operator>( optional<T> const & x, nullopt_t ) optional_noexcept
+{
+    return bool(x);
+}
+
+template< typename T >
+inline optional_constexpr bool operator>( nullopt_t, optional<T> const & ) optional_noexcept
+{
+    return false;
+}
+
+template< typename T >
+inline optional_constexpr bool operator>=( optional<T> const &, nullopt_t ) optional_noexcept
+{
+    return true;
+}
+
+template< typename T >
+inline optional_constexpr bool operator>=( nullopt_t, optional<T> const & x ) optional_noexcept
+{
+    return (!x);
+}
+
+// Comparison with T
+
+template< typename T, typename U >
+inline optional_constexpr bool operator==( optional<T> const & x, U const & v )
+{
+    return bool(x) ? *x == v : false;
+}
+
+template< typename T, typename U >
+inline optional_constexpr bool operator==( U const & v, optional<T> const & x )
+{
+    return bool(x) ? v == *x : false;
+}
+
+template< typename T, typename U >
+inline optional_constexpr bool operator!=( optional<T> const & x, U const & v )
+{
+    return bool(x) ? *x != v : true;
+}
+
+template< typename T, typename U >
+inline optional_constexpr bool operator!=( U const & v, optional<T> const & x )
+{
+    return bool(x) ? v != *x : true;
+}
+
+template< typename T, typename U >
+inline optional_constexpr bool operator<( optional<T> const & x, U const & v )
+{
+    return bool(x) ? *x < v : true;
+}
+
+template< typename T, typename U >
+inline optional_constexpr bool operator<( U const & v, optional<T> const & x )
+{
+    return bool(x) ? v < *x : false;
+}
+
+template< typename T, typename U >
+inline optional_constexpr bool operator<=( optional<T> const & x, U const & v )
+{
+    return bool(x) ? *x <= v : true;
+}
+
+template< typename T, typename U >
+inline optional_constexpr bool operator<=( U const & v, optional<T> const & x )
+{
+    return bool(x) ? v <= *x : false;
+}
+
+template< typename T, typename U >
+inline optional_constexpr bool operator>( optional<T> const & x, U const & v )
+{
+    return bool(x) ? *x > v : false;
+}
+
+template< typename T, typename U >
+inline optional_constexpr bool operator>( U const & v, optional<T> const & x )
+{
+    return bool(x) ? v > *x : true;
+}
+
+template< typename T, typename U >
+inline optional_constexpr bool operator>=( optional<T> const & x, U const & v )
+{
+    return bool(x) ? *x >= v : false;
+}
+
+template< typename T, typename U >
+inline optional_constexpr bool operator>=( U const & v, optional<T> const & x )
+{
+    return bool(x) ? v >= *x : true;
+}
+
+// Specialized algorithms
+
+template< typename T >
+void swap( optional<T> & x, optional<T> & y )
+#if optional_CPP11_OR_GREATER
+    noexcept( noexcept( x.swap(y) ) )
+#endif
+{
+    x.swap( y );
+}
+
+#if optional_CPP11_OR_GREATER
+
+template< class T >
+optional_constexpr optional< typename std::decay<T>::type > make_optional( T && v )
+{
+    return optional< typename std::decay<T>::type >( std::forward<T>( v ) );
+}
+
+template< class T, class...Args >
+optional_constexpr optional<T> make_optional( Args&&... args )
+{
+    return optional<T>( in_place, std::forward<Args>(args)...);
+}
+
+template< class T, class U, class... Args >
+optional_constexpr optional<T> make_optional( std::initializer_list<U> il, Args&&... args )
+{
+    return optional<T>( in_place, il, std::forward<Args>(args)...);
+}
+
+#else
+
+template< typename T >
+optional<T> make_optional( T const & v )
+{
+    return optional<T>( v );
+}
+
+#endif // optional_CPP11_OR_GREATER
+
+} // namespace optional
+
+using namespace optional_lite;
+
+} // namespace nonstd
+
+#if optional_CPP11_OR_GREATER
+
+// specialize the std::hash algorithm:
+
+namespace std {
+
+template< class T >
+struct hash< nonstd::optional<T> >
+{
+public:
+    std::size_t operator()( nonstd::optional<T> const & v ) const optional_noexcept
+    {
+        return bool( v ) ? hash<T>()( *v ) : 0;
+    }
+};
+
+} //namespace std
+
+#endif // optional_CPP11_OR_GREATER
+
+#ifdef __clang__
+# pragma clang diagnostic pop
+#elif defined __GNUC__
+# pragma GCC   diagnostic pop
+#endif
+
+#endif // have C++17 std::optional
+
+#endif // NONSTD_OPTIONAL_LITE_HPP
diff --git a/src/util/segment-fetcher.hpp b/src/util/segment-fetcher.hpp
index 13fbd3d..3b81cb4 100644
--- a/src/util/segment-fetcher.hpp
+++ b/src/util/segment-fetcher.hpp
@@ -162,7 +162,7 @@
    * @param errorCallback       Callback to be fired when an error occurs (@see Errors)
    * @return A shared_ptr to the constructed SegmentFetcher
    */
-  NDN_CXX_DEPRECATED_MSG("Use SegmentFetcher::start instead")
+  [[deprecated("use SegmentFetcher::start instead")]]
   static
   shared_ptr<SegmentFetcher>
   fetch(Face& face,
@@ -189,7 +189,7 @@
    * @param errorCallback       Callback to be fired when an error occurs (@see Errors)
    * @return A shared_ptr to the constructed SegmentFetcher
    */
-  NDN_CXX_DEPRECATED_MSG("Use SegmentFetcher::start instead")
+  [[deprecated("use SegmentFetcher::start instead")]]
   static
   shared_ptr<SegmentFetcher>
   fetch(Face& face,
diff --git a/tests/unit-tests/util/backports.t.cpp b/tests/unit-tests/util/backports.t.cpp
index 629c3ee..7a124e0 100644
--- a/tests/unit-tests/util/backports.t.cpp
+++ b/tests/unit-tests/util/backports.t.cpp
@@ -30,84 +30,6 @@
 BOOST_AUTO_TEST_SUITE(Util)
 BOOST_AUTO_TEST_SUITE(TestBackports)
 
-namespace deprecated_test {
-
-// Deprecate a variable.
-static int g_deprecatedVar NDN_CXX_DEPRECATED = 0;
-
-// Deprecate an enum member (a variable).
-enum NamedEnum
-{
-  ModernEnumMember,
-};
-constexpr NamedEnum DeprecatedEnumMember NDN_CXX_DEPRECATED = ModernEnumMember;
-
-// Deprecate a type.
-class ModernType
-{
-public:
-  // Deprecate a function.
-  NDN_CXX_DEPRECATED
-  void
-  deprecatedFunc(int a, NamedEnum b)
-  {
-  }
-};
-typedef ModernType DeprecatedType NDN_CXX_DEPRECATED;
-
-} // namespace deprecated_test
-
-BOOST_AUTO_TEST_CASE(Deprecated)
-{
-  using namespace deprecated_test;
-  DeprecatedType instance;
-  instance.deprecatedFunc(g_deprecatedVar, DeprecatedEnumMember);
-  BOOST_CHECK(true);
-}
-
-BOOST_AUTO_TEST_CASE(MakeUnique)
-{
-  std::unique_ptr<int> v0 = make_unique<int>();
-  std::unique_ptr<int> v1 = make_unique<int>(1728);
-  BOOST_CHECK_EQUAL(*v0, 0);
-  BOOST_CHECK_EQUAL(*v1, 1728);
-
-  auto str = make_unique<std::string>("meow");
-  BOOST_CHECK_EQUAL(*str, "meow");
-
-  class Movable
-  {
-  public:
-    Movable()
-      : value(42)
-    {
-    }
-
-    Movable(const Movable&) = delete;
-    Movable(Movable&&) = default;
-
-  public:
-    int value;
-  };
-
-  class Container
-  {
-  public:
-    explicit
-    Container(Movable m)
-      : m(std::move(m))
-    {
-    }
-
-  public:
-    Movable m;
-  };
-
-  Movable m;
-  auto ptr = make_unique<Container>(std::move(m));
-  BOOST_CHECK_EQUAL(ptr->m.value, 42);
-}
-
 BOOST_AUTO_TEST_CASE(Clamp)
 {
   int x = clamp(5, 1, 10);
@@ -129,187 +51,6 @@
   BOOST_CHECK_EQUAL(x, 10);
 }
 
-BOOST_AUTO_TEST_SUITE(Optional)
-
-BOOST_AUTO_TEST_CASE(Construct)
-{
-  optional<int> o1;
-  BOOST_CHECK_EQUAL(static_cast<bool>(o1), false);
-
-  optional<int> o2(1);
-  BOOST_CHECK_EQUAL(static_cast<bool>(o2), true);
-  BOOST_CHECK_EQUAL(o2.value(), 1);
-
-  optional<int> o3(o2);
-  BOOST_CHECK_EQUAL(static_cast<bool>(o3), true);
-  BOOST_CHECK_EQUAL(static_cast<bool>(o2), true);
-  BOOST_CHECK_EQUAL(o3.value(), 1);
-
-  optional<std::pair<int, int>> o4(in_place, 41, 42);
-  BOOST_CHECK_EQUAL(static_cast<bool>(o4), true);
-  BOOST_CHECK_EQUAL(o4.value().first, 41);
-  BOOST_CHECK_EQUAL(o4.value().second, 42);
-}
-
-BOOST_AUTO_TEST_CASE(Assign)
-{
-  optional<int> o1;
-  BOOST_CHECK_EQUAL(static_cast<bool>(o1), false);
-
-  optional<int> o2(2);
-  o1 = o2;
-  BOOST_CHECK_EQUAL(static_cast<bool>(o1), true);
-  BOOST_CHECK_EQUAL(o1.value(), 2);
-
-  o1 = nullopt;
-  BOOST_CHECK_EQUAL(static_cast<bool>(o1), false);
-
-  o1 = 18763;
-  BOOST_CHECK_EQUAL(static_cast<bool>(o1), true);
-  BOOST_CHECK_EQUAL(o1.value(), 18763);
-}
-
-BOOST_AUTO_TEST_CASE(Access)
-{
-  optional<int> o1(1);
-  BOOST_CHECK_EQUAL(*o1, 1);
-
-  optional<std::string> o2("abc");
-  BOOST_CHECK_EQUAL(o2->size(), 3);
-}
-
-BOOST_AUTO_TEST_CASE(HasValue)
-{
-  optional<int> o1;
-  BOOST_CHECK_EQUAL(static_cast<bool>(o1), false);
-  BOOST_CHECK_EQUAL(!o1, true);
-  if (o1) {
-    BOOST_ERROR("o1 should evaluate to false");
-  }
-
-  optional<int> o2(1);
-  BOOST_CHECK_EQUAL(static_cast<bool>(o2), true);
-  BOOST_CHECK_EQUAL(!o2, false);
-  if (o2) {
-  }
-  else {
-    BOOST_ERROR("o2 should evaluate to true");
-  }
-}
-
-BOOST_AUTO_TEST_CASE(Value)
-{
-  optional<int> o1;
-  BOOST_CHECK_THROW(o1.value(), bad_optional_access);
-
-  optional<int> o2(2);
-  BOOST_CHECK_NO_THROW(o2.value());
-}
-
-BOOST_AUTO_TEST_CASE(ValueOr)
-{
-  optional<int> o1;
-  BOOST_CHECK_EQUAL(o1.value_or(3.0), 3);
-
-  optional<int> o2(2);
-  BOOST_CHECK_EQUAL(o2.value_or(3.0), 2);
-}
-
-BOOST_AUTO_TEST_CASE(Swap)
-{
-  optional<int> o1;
-  optional<int> o2(2);
-
-  o1.swap(o2);
-  BOOST_CHECK_EQUAL(static_cast<bool>(o1), true);
-  BOOST_CHECK_EQUAL(o1.value(), 2);
-  BOOST_CHECK_EQUAL(static_cast<bool>(o2), false);
-}
-
-BOOST_AUTO_TEST_CASE(Reset)
-{
-  optional<int> o1(1);
-  o1.reset();
-  BOOST_CHECK_EQUAL(static_cast<bool>(o1), false);
-}
-
-BOOST_AUTO_TEST_CASE(Emplace)
-{
-  optional<std::pair<int, int>> o1;
-  o1.emplace(11, 12);
-  BOOST_CHECK_EQUAL(static_cast<bool>(o1), true);
-  BOOST_CHECK_EQUAL(o1.value().first, 11);
-  BOOST_CHECK_EQUAL(o1.value().second, 12);
-}
-
-BOOST_AUTO_TEST_CASE(Compare)
-{
-  optional<int> o0a;
-  optional<int> o0b;
-  optional<int> o1a(1);
-  optional<int> o1b(1);
-  optional<int> o2(2);
-
-  BOOST_CHECK_EQUAL(o0a == o0b, true);
-  BOOST_CHECK_EQUAL(o0a != o0b, false);
-  BOOST_CHECK_EQUAL(o0a <  o0b, false);
-  BOOST_CHECK_EQUAL(o0a <= o0b, true);
-  BOOST_CHECK_EQUAL(o0a >  o0b, false);
-  BOOST_CHECK_EQUAL(o0a >= o0b, true);
-
-  BOOST_CHECK_EQUAL(o1a == o1b, true);
-  BOOST_CHECK_EQUAL(o1a != o1b, false);
-  BOOST_CHECK_EQUAL(o1a <  o1b, false);
-  BOOST_CHECK_EQUAL(o1a <= o1b, true);
-  BOOST_CHECK_EQUAL(o1a >  o1b, false);
-  BOOST_CHECK_EQUAL(o1a >= o1b, true);
-
-  BOOST_CHECK_EQUAL(o0a == o1a, false);
-  BOOST_CHECK_EQUAL(o0a != o1a, true);
-  BOOST_CHECK_EQUAL(o0a <  o1a, true);
-  BOOST_CHECK_EQUAL(o0a <= o1a, true);
-  BOOST_CHECK_EQUAL(o0a >  o1a, false);
-  BOOST_CHECK_EQUAL(o0a >= o1a, false);
-
-  BOOST_CHECK_EQUAL(o1a == o0a, false);
-  BOOST_CHECK_EQUAL(o1a != o0a, true);
-  BOOST_CHECK_EQUAL(o1a <  o0a, false);
-  BOOST_CHECK_EQUAL(o1a <= o0a, false);
-  BOOST_CHECK_EQUAL(o1a >  o0a, true);
-  BOOST_CHECK_EQUAL(o1a >= o0a, true);
-
-  BOOST_CHECK_EQUAL(o1a == o2, false);
-  BOOST_CHECK_EQUAL(o1a != o2, true);
-  BOOST_CHECK_EQUAL(o1a <  o2, true);
-  BOOST_CHECK_EQUAL(o1a <= o2, true);
-  BOOST_CHECK_EQUAL(o1a >  o2, false);
-  BOOST_CHECK_EQUAL(o1a >= o2, false);
-
-  BOOST_CHECK_EQUAL(o2 == o1a, false);
-  BOOST_CHECK_EQUAL(o2 != o1a, true);
-  BOOST_CHECK_EQUAL(o2 <  o1a, false);
-  BOOST_CHECK_EQUAL(o2 <= o1a, false);
-  BOOST_CHECK_EQUAL(o2 >  o1a, true);
-  BOOST_CHECK_EQUAL(o2 >= o1a, true);
-}
-
-BOOST_AUTO_TEST_CASE(MakeOptional)
-{
-  auto o1 = make_optional(1);
-  static_assert(std::is_same<decltype(o1), optional<int>>::value, "o1 must be optional<int>");
-  BOOST_CHECK_EQUAL(static_cast<bool>(o1), true);
-  BOOST_CHECK_EQUAL(o1.value(), 1);
-
-  auto o2 = make_optional<std::pair<int, int>>(21, 22);
-  static_assert(std::is_same<decltype(o2), optional<std::pair<int, int>>>::value,
-                "o2 must be optional<std::pair<int, int>>");
-  BOOST_CHECK_EQUAL(static_cast<bool>(o2), true);
-  BOOST_CHECK_EQUAL(o2.value().first, 21);
-  BOOST_CHECK_EQUAL(o2.value().second, 22);
-}
-
-BOOST_AUTO_TEST_SUITE_END() // Optional
-
 BOOST_AUTO_TEST_CASE(OstreamJoiner)
 {
   boost::test_tools::output_test_stream os;
