diff --git a/tests/tools/nfdc/face-module.t.cpp b/tests/tools/nfdc/face-module.t.cpp
index 33e022c..22de100 100644
--- a/tests/tools/nfdc/face-module.t.cpp
+++ b/tests/tools/nfdc/face-module.t.cpp
@@ -1,6 +1,6 @@
 /* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
 /*
- * Copyright (c) 2014-2017,  Regents of the University of California,
+ * Copyright (c) 2014-2018,  Regents of the University of California,
  *                           Arizona Board of Regents,
  *                           Colorado State University,
  *                           University Pierre & Marie Curie, Sorbonne University,
@@ -42,11 +42,13 @@
 
 const std::string NONQUERY_OUTPUT =
   "faceid=134 remote=udp4://233.252.0.4:6363 local=udp4://192.0.2.1:6363"
+    " congestion={base-marking-interval=12345ms default-threshold=54321B}"
     " counters={in={22562i 22031d 63n 2522915B} out={30121i 20940d 1218n 1353592B}}"
     " flags={non-local permanent multi-access}\n"
   "faceid=745 remote=fd://75 local=unix:///var/run/nfd.sock"
+    " congestion={base-marking-interval=100ms default-threshold=65536B}"
     " counters={in={18998i 26701d 147n 4672308B} out={34779i 17028d 1176n 8957187B}}"
-    " flags={local on-demand point-to-point local-fields lp-reliability}\n";
+    " flags={local on-demand point-to-point local-fields lp-reliability congestion-marking}\n";
 
 BOOST_AUTO_TEST_CASE(NormalNonQuery)
 {
@@ -58,6 +60,8 @@
             .setFaceScope(ndn::nfd::FACE_SCOPE_NON_LOCAL)
             .setFacePersistency(ndn::nfd::FACE_PERSISTENCY_PERMANENT)
             .setLinkType(ndn::nfd::LINK_TYPE_MULTI_ACCESS)
+            .setBaseCongestionMarkingInterval(12345_ms)
+            .setDefaultCongestionThreshold(54321)
             .setNInInterests(22562)
             .setNInData(22031)
             .setNInNacks(63)
@@ -73,8 +77,11 @@
             .setFaceScope(ndn::nfd::FACE_SCOPE_LOCAL)
             .setFacePersistency(ndn::nfd::FACE_PERSISTENCY_ON_DEMAND)
             .setLinkType(ndn::nfd::LINK_TYPE_POINT_TO_POINT)
+            .setBaseCongestionMarkingInterval(100_ms)
+            .setDefaultCongestionThreshold(65536)
             .setFlagBit(ndn::nfd::BIT_LOCAL_FIELDS_ENABLED, true)
             .setFlagBit(ndn::nfd::BIT_LP_RELIABILITY_ENABLED, true)
+            .setFlagBit(ndn::nfd::BIT_CONGESTION_MARKING_ENABLED, true)
             .setNInInterests(18998)
             .setNInData(26701)
             .setNInNacks(147)
@@ -94,6 +101,7 @@
 
 const std::string QUERY_OUTPUT =
   "faceid=177 remote=tcp4://53.239.9.114:6363 local=tcp4://164.0.31.106:20396"
+    " congestion={base-marking-interval=555ms default-threshold=10000B}"
     " counters={in={2325i 1110d 79n 4716834B} out={2278i 485d 841n 308108B}}"
     " flags={non-local persistent point-to-point}\n";
 
@@ -116,6 +124,8 @@
            .setFaceScope(ndn::nfd::FACE_SCOPE_NON_LOCAL)
            .setFacePersistency(ndn::nfd::FACE_PERSISTENCY_PERSISTENT)
            .setLinkType(ndn::nfd::LINK_TYPE_POINT_TO_POINT)
+           .setBaseCongestionMarkingInterval(555_ms)
+           .setDefaultCongestionThreshold(10000)
            .setNInInterests(2325)
            .setNInData(1110)
            .setNInNacks(79)
@@ -159,15 +169,145 @@
 
 BOOST_FIXTURE_TEST_SUITE(ShowCommand, ExecuteCommandFixture)
 
-const std::string NORMAL_OUTPUT = std::string(R"TEXT(
-  faceid=256
-  remote=udp4://84.67.35.111:6363
-   local=udp4://79.91.49.215:6363
-counters={in={28975i 28232d 212n 13307258B} out={19525i 30993d 1038n 6231946B}}
-   flags={non-local on-demand point-to-point}
+const std::string NORMAL_ALL_CONGESTION_OUTPUT = std::string(R"TEXT(
+    faceid=256
+    remote=udp4://84.67.35.111:6363
+     local=udp4://79.91.49.215:6363
+congestion={base-marking-interval=123ms default-threshold=10000B}
+  counters={in={28975i 28232d 212n 13307258B} out={19525i 30993d 1038n 6231946B}}
+     flags={non-local on-demand point-to-point}
 )TEXT").substr(1);
 
-BOOST_AUTO_TEST_CASE(Normal)
+BOOST_AUTO_TEST_CASE(NormalAllCongestionParams)
+{
+  this->processInterest = [this] (const Interest& interest) {
+    BOOST_CHECK(Name("/localhost/nfd/faces/query").isPrefixOf(interest.getName()));
+    BOOST_CHECK_EQUAL(interest.getName().size(), 5);
+    FaceQueryFilter filter(interest.getName().at(4).blockFromValue());
+    BOOST_CHECK_EQUAL(filter, FaceQueryFilter().setFaceId(256));
+
+    FaceStatus payload;
+    payload.setFaceId(256)
+           .setRemoteUri("udp4://84.67.35.111:6363")
+           .setLocalUri("udp4://79.91.49.215:6363")
+           .setFaceScope(ndn::nfd::FACE_SCOPE_NON_LOCAL)
+           .setFacePersistency(ndn::nfd::FACE_PERSISTENCY_ON_DEMAND)
+           .setLinkType(ndn::nfd::LINK_TYPE_POINT_TO_POINT)
+           .setBaseCongestionMarkingInterval(123_ms)
+           .setDefaultCongestionThreshold(10000)
+           .setNInInterests(28975)
+           .setNInData(28232)
+           .setNInNacks(212)
+           .setNOutInterests(19525)
+           .setNOutData(30993)
+           .setNOutNacks(1038)
+           .setNInBytes(13307258)
+           .setNOutBytes(6231946);
+
+    this->sendDataset(interest.getName(), payload);
+  };
+
+  this->execute("face show 256");
+  BOOST_CHECK_EQUAL(exitCode, 0);
+  BOOST_CHECK(out.is_equal(NORMAL_ALL_CONGESTION_OUTPUT));
+  BOOST_CHECK(err.is_empty());
+}
+
+const std::string NORMAL_INTERVAL_CONGESTION_OUTPUT = std::string(R"TEXT(
+    faceid=256
+    remote=udp4://84.67.35.111:6363
+     local=udp4://79.91.49.215:6363
+congestion={base-marking-interval=123ms}
+  counters={in={28975i 28232d 212n 13307258B} out={19525i 30993d 1038n 6231946B}}
+     flags={non-local on-demand point-to-point}
+)TEXT").substr(1);
+
+BOOST_AUTO_TEST_CASE(NormalIntervalCongestionParams)
+{
+  this->processInterest = [this] (const Interest& interest) {
+    BOOST_CHECK(Name("/localhost/nfd/faces/query").isPrefixOf(interest.getName()));
+    BOOST_CHECK_EQUAL(interest.getName().size(), 5);
+    FaceQueryFilter filter(interest.getName().at(4).blockFromValue());
+    BOOST_CHECK_EQUAL(filter, FaceQueryFilter().setFaceId(256));
+
+    FaceStatus payload;
+    payload.setFaceId(256)
+           .setRemoteUri("udp4://84.67.35.111:6363")
+           .setLocalUri("udp4://79.91.49.215:6363")
+           .setFaceScope(ndn::nfd::FACE_SCOPE_NON_LOCAL)
+           .setFacePersistency(ndn::nfd::FACE_PERSISTENCY_ON_DEMAND)
+           .setLinkType(ndn::nfd::LINK_TYPE_POINT_TO_POINT)
+           .setBaseCongestionMarkingInterval(123_ms)
+           .setNInInterests(28975)
+           .setNInData(28232)
+           .setNInNacks(212)
+           .setNOutInterests(19525)
+           .setNOutData(30993)
+           .setNOutNacks(1038)
+           .setNInBytes(13307258)
+           .setNOutBytes(6231946);
+
+    this->sendDataset(interest.getName(), payload);
+  };
+
+  this->execute("face show 256");
+  BOOST_CHECK_EQUAL(exitCode, 0);
+  BOOST_CHECK(out.is_equal(NORMAL_INTERVAL_CONGESTION_OUTPUT));
+  BOOST_CHECK(err.is_empty());
+}
+
+const std::string NORMAL_THRESHOLD_CONGESTION_OUTPUT = std::string(R"TEXT(
+    faceid=256
+    remote=udp4://84.67.35.111:6363
+     local=udp4://79.91.49.215:6363
+congestion={default-threshold=10000B}
+  counters={in={28975i 28232d 212n 13307258B} out={19525i 30993d 1038n 6231946B}}
+     flags={non-local on-demand point-to-point}
+)TEXT").substr(1);
+
+BOOST_AUTO_TEST_CASE(NormalThresholdCongestionParams)
+{
+  this->processInterest = [this] (const Interest& interest) {
+    BOOST_CHECK(Name("/localhost/nfd/faces/query").isPrefixOf(interest.getName()));
+    BOOST_CHECK_EQUAL(interest.getName().size(), 5);
+    FaceQueryFilter filter(interest.getName().at(4).blockFromValue());
+    BOOST_CHECK_EQUAL(filter, FaceQueryFilter().setFaceId(256));
+
+    FaceStatus payload;
+    payload.setFaceId(256)
+           .setRemoteUri("udp4://84.67.35.111:6363")
+           .setLocalUri("udp4://79.91.49.215:6363")
+           .setFaceScope(ndn::nfd::FACE_SCOPE_NON_LOCAL)
+           .setFacePersistency(ndn::nfd::FACE_PERSISTENCY_ON_DEMAND)
+           .setLinkType(ndn::nfd::LINK_TYPE_POINT_TO_POINT)
+           .setDefaultCongestionThreshold(10000)
+           .setNInInterests(28975)
+           .setNInData(28232)
+           .setNInNacks(212)
+           .setNOutInterests(19525)
+           .setNOutData(30993)
+           .setNOutNacks(1038)
+           .setNInBytes(13307258)
+           .setNOutBytes(6231946);
+
+    this->sendDataset(interest.getName(), payload);
+  };
+
+  this->execute("face show 256");
+  BOOST_CHECK_EQUAL(exitCode, 0);
+  BOOST_CHECK(out.is_equal(NORMAL_THRESHOLD_CONGESTION_OUTPUT));
+  BOOST_CHECK(err.is_empty());
+}
+
+const std::string NORMAL_NO_CONGESTION_OUTPUT = std::string(R"TEXT(
+    faceid=256
+    remote=udp4://84.67.35.111:6363
+     local=udp4://79.91.49.215:6363
+  counters={in={28975i 28232d 212n 13307258B} out={19525i 30993d 1038n 6231946B}}
+     flags={non-local on-demand point-to-point}
+)TEXT").substr(1);
+
+BOOST_AUTO_TEST_CASE(NormalNoCongestionParams)
 {
   this->processInterest = [this] (const Interest& interest) {
     BOOST_CHECK(Name("/localhost/nfd/faces/query").isPrefixOf(interest.getName()));
@@ -196,7 +336,7 @@
 
   this->execute("face show 256");
   BOOST_CHECK_EQUAL(exitCode, 0);
-  BOOST_CHECK(out.is_equal(NORMAL_OUTPUT));
+  BOOST_CHECK(out.is_equal(NORMAL_NO_CONGESTION_OUTPUT));
   BOOST_CHECK(err.is_empty());
 }
 
@@ -228,7 +368,9 @@
 {
 protected:
   void
-  respond409(const Interest& interest, FacePersistency persistency, bool enableLpReliability = false)
+  respond409(const Interest& interest, FacePersistency persistency,
+             bool enableLpReliability = false,
+             bool enableCongestionMarking = false)
   {
     MOCK_NFD_MGMT_REQUIRE_COMMAND_IS("/localhost/nfd/faces/create");
     ControlParameters body;
@@ -240,6 +382,9 @@
     if (enableLpReliability) {
       body.setFlagBit(ndn::nfd::BIT_LP_RELIABILITY_ENABLED, true, false);
     }
+    if (enableCongestionMarking) {
+      body.setFlagBit(ndn::nfd::BIT_CONGESTION_MARKING_ENABLED, true, false);
+    }
     this->failCommand(interest, 409, "conflict-409", body);
   }
 };
@@ -269,7 +414,7 @@
   BOOST_CHECK_EQUAL(exitCode, 0);
   BOOST_CHECK(out.is_equal("face-created id=2130 local=udp4://179.63.153.45:28835 "
                            "remote=udp4://159.242.33.78:6363 persistency=persistent "
-                           "reliability=off\n"));
+                           "reliability=off congestion-marking=off\n"));
   BOOST_CHECK(err.is_empty());
 }
 
@@ -291,15 +436,21 @@
         .setUri("udp4://22.91.89.51:19903")
         .setLocalUri("udp4://98.68.23.71:6363")
         .setFacePersistency(FacePersistency::FACE_PERSISTENCY_PERMANENT)
-        .setFlagBit(ndn::nfd::BIT_LP_RELIABILITY_ENABLED, true, false);
+        .setBaseCongestionMarkingInterval(100_ms)
+        .setDefaultCongestionThreshold(65536)
+        .setFlagBit(ndn::nfd::BIT_LP_RELIABILITY_ENABLED, true, false)
+        .setFlagBit(ndn::nfd::BIT_CONGESTION_MARKING_ENABLED, true, false);
     this->succeedCommand(interest, resp);
   };
 
-  this->execute("face create udp://22.91.89.51:19903 permanent local udp://98.68.23.71 reliability on");
+  this->execute("face create udp://22.91.89.51:19903 permanent local udp://98.68.23.71 reliability on "
+                "congestion-marking on congestion-marking-interval 100 "
+                "default-congestion-threshold 65536");
   BOOST_CHECK_EQUAL(exitCode, 0);
   BOOST_CHECK(out.is_equal("face-created id=301 local=udp4://98.68.23.71:6363 "
                            "remote=udp4://22.91.89.51:19903 persistency=permanent "
-                           "reliability=on\n"));
+                           "reliability=on congestion-marking=on "
+                           "congestion-marking-interval=100ms default-congestion-threshold=65536B\n"));
   BOOST_CHECK(err.is_empty());
 }
 
@@ -332,7 +483,7 @@
   BOOST_CHECK_EQUAL(exitCode, 0);
   BOOST_CHECK(out.is_equal("face-updated id=1172 local=udp4://68.62.26.57:24087 "
                            "remote=udp4://100.77.30.65:6363 persistency=persistent "
-                           "reliability=off\n"));
+                           "reliability=off congestion-marking=off\n"));
   BOOST_CHECK(err.is_empty());
 }
 
@@ -347,7 +498,7 @@
   BOOST_CHECK_EQUAL(exitCode, 0);
   BOOST_CHECK(out.is_equal("face-exists id=1172 local=udp4://68.62.26.57:24087 "
                            "remote=udp4://100.77.30.65:6363 persistency=permanent "
-                           "reliability=off\n"));
+                           "reliability=off congestion-marking=off\n"));
   BOOST_CHECK(err.is_empty());
 }
 
@@ -362,7 +513,7 @@
   BOOST_CHECK_EQUAL(exitCode, 0);
   BOOST_CHECK(out.is_equal("face-exists id=1172 local=udp4://68.62.26.57:24087 "
                            "remote=udp4://100.77.30.65:6363 persistency=persistent "
-                           "reliability=off\n"));
+                           "reliability=off congestion-marking=off\n"));
   BOOST_CHECK(err.is_empty());
 }
 
@@ -393,7 +544,7 @@
   BOOST_CHECK_EQUAL(exitCode, 0);
   BOOST_CHECK(out.is_equal("face-updated id=1172 local=udp4://68.62.26.57:24087 "
                            "remote=udp4://100.77.30.65:6363 persistency=persistent "
-                           "reliability=on\n"));
+                           "reliability=on congestion-marking=off\n"));
   BOOST_CHECK(err.is_empty());
 }
 
@@ -424,7 +575,79 @@
   BOOST_CHECK_EQUAL(exitCode, 0);
   BOOST_CHECK(out.is_equal("face-updated id=1172 local=udp4://68.62.26.57:24087 "
                            "remote=udp4://100.77.30.65:6363 persistency=persistent "
-                           "reliability=off\n"));
+                           "reliability=off congestion-marking=off\n"));
+  BOOST_CHECK(err.is_empty());
+}
+
+BOOST_AUTO_TEST_CASE(EnablingCongestionMarking)
+{
+  bool hasUpdateCommand = false;
+  this->processInterest = [this, &hasUpdateCommand] (const Interest& interest) {
+    if (parseCommand(interest, "/localhost/nfd/faces/create")) {
+      this->respond409(interest, FacePersistency::FACE_PERSISTENCY_PERSISTENT);
+      return;
+    }
+
+    ControlParameters req = MOCK_NFD_MGMT_REQUIRE_COMMAND_IS("/localhost/nfd/faces/update");
+    hasUpdateCommand = true;
+    BOOST_REQUIRE(req.hasFaceId());
+    BOOST_CHECK_EQUAL(req.getFaceId(), 1172);
+    BOOST_CHECK(req.hasFlagBit(ndn::nfd::BIT_CONGESTION_MARKING_ENABLED));
+    BOOST_CHECK(req.getFlagBit(ndn::nfd::BIT_CONGESTION_MARKING_ENABLED));
+    BOOST_CHECK(!req.hasBaseCongestionMarkingInterval());
+    BOOST_CHECK(!req.hasDefaultCongestionThreshold());
+
+    ControlParameters resp;
+    resp.setFaceId(1172)
+        .setFacePersistency(FacePersistency::FACE_PERSISTENCY_PERSISTENT)
+        .setBaseCongestionMarkingInterval(100_ms)
+        .setDefaultCongestionThreshold(65536)
+        .setFlagBit(ndn::nfd::BIT_CONGESTION_MARKING_ENABLED, true, false);
+    this->succeedCommand(interest, resp);
+  };
+
+  this->execute("face create udp://100.77.30.65 congestion-marking on");
+  BOOST_CHECK_EQUAL(exitCode, 0);
+  BOOST_CHECK(out.is_equal("face-updated id=1172 local=udp4://68.62.26.57:24087 "
+                           "remote=udp4://100.77.30.65:6363 persistency=persistent "
+                           "reliability=off congestion-marking=on "
+                           "congestion-marking-interval=100ms default-congestion-threshold=65536B\n"));
+  BOOST_CHECK(err.is_empty());
+}
+
+BOOST_AUTO_TEST_CASE(DisablingCongestionMarking)
+{
+  bool hasUpdateCommand = false;
+  this->processInterest = [this, &hasUpdateCommand] (const Interest& interest) {
+    if (parseCommand(interest, "/localhost/nfd/faces/create")) {
+      this->respond409(interest, FacePersistency::FACE_PERSISTENCY_PERSISTENT, false, true);
+      return;
+    }
+
+    ControlParameters req = MOCK_NFD_MGMT_REQUIRE_COMMAND_IS("/localhost/nfd/faces/update");
+    hasUpdateCommand = true;
+    BOOST_REQUIRE(req.hasFaceId());
+    BOOST_CHECK_EQUAL(req.getFaceId(), 1172);
+    BOOST_CHECK(req.hasFlagBit(ndn::nfd::BIT_CONGESTION_MARKING_ENABLED));
+    BOOST_CHECK(!req.getFlagBit(ndn::nfd::BIT_CONGESTION_MARKING_ENABLED));
+    BOOST_CHECK(!req.hasBaseCongestionMarkingInterval());
+    BOOST_CHECK(!req.hasDefaultCongestionThreshold());
+
+    ControlParameters resp;
+    resp.setFaceId(1172)
+        .setFacePersistency(FacePersistency::FACE_PERSISTENCY_PERSISTENT)
+        .setBaseCongestionMarkingInterval(100_ms)
+        .setDefaultCongestionThreshold(65536)
+        .setFlagBit(ndn::nfd::BIT_CONGESTION_MARKING_ENABLED, false, false);
+    this->succeedCommand(interest, resp);
+  };
+
+  this->execute("face create udp://100.77.30.65 congestion-marking off");
+  BOOST_CHECK_EQUAL(exitCode, 0);
+  BOOST_CHECK(out.is_equal("face-updated id=1172 local=udp4://68.62.26.57:24087 "
+                           "remote=udp4://100.77.30.65:6363 persistency=persistent "
+                           "reliability=off congestion-marking=off "
+                           "congestion-marking-interval=100ms default-congestion-threshold=65536B\n"));
   BOOST_CHECK(err.is_empty());
 }
 
@@ -512,7 +735,7 @@
   BOOST_CHECK_EQUAL(exitCode, 0);
   BOOST_CHECK(out.is_equal("face-destroyed id=10156 local=tcp4://151.26.163.27:22967 "
                            "remote=tcp4://198.57.27.40:6363 persistency=persistent "
-                           "reliability=off\n"));
+                           "reliability=off congestion-marking=off\n"));
   BOOST_CHECK(err.is_empty());
 }
 
@@ -536,7 +759,7 @@
   BOOST_CHECK_EQUAL(exitCode, 0);
   BOOST_CHECK(out.is_equal("face-destroyed id=2249 local=tcp4://30.99.87.98:31414 "
                            "remote=tcp4://32.121.182.82:6363 persistency=persistent "
-                           "reliability=off\n"));
+                           "reliability=off congestion-marking=off\n"));
   BOOST_CHECK(err.is_empty());
 }
 
@@ -614,6 +837,7 @@
       <faceScope>non-local</faceScope>
       <facePersistency>permanent</facePersistency>
       <linkType>multi-access</linkType>
+      <congestion/>
       <flags/>
       <packetCounters>
         <incomingPackets>
@@ -639,9 +863,14 @@
       <faceScope>local</faceScope>
       <facePersistency>on-demand</facePersistency>
       <linkType>point-to-point</linkType>
+      <congestion>
+        <baseMarkingInterval>PT0.100S</baseMarkingInterval>
+        <defaultThreshold>65536</defaultThreshold>
+      </congestion>
       <flags>
         <localFieldsEnabled/>
         <lpReliabilityEnabled/>
+        <congestionMarkingEnabled/>
       </flags>
       <packetCounters>
         <incomingPackets>
@@ -669,8 +898,9 @@
     " counters={in={22562i 22031d 63n 2522915B} out={30121i 20940d 1218n 1353592B}}"
     " flags={non-local permanent multi-access}\n"
   "  faceid=745 remote=fd://75 local=unix:///var/run/nfd.sock"
+    " congestion={base-marking-interval=100ms default-threshold=65536B}"
     " counters={in={18998i 26701d 147n 4672308B} out={34779i 17028d 1176n 8957187B}}"
-    " flags={local on-demand point-to-point local-fields lp-reliability}\n";
+    " flags={local on-demand point-to-point local-fields lp-reliability congestion-marking}\n";
 
 BOOST_FIXTURE_TEST_CASE(Status, StatusFixture<FaceModule>)
 {
@@ -697,8 +927,11 @@
           .setFaceScope(ndn::nfd::FACE_SCOPE_LOCAL)
           .setFacePersistency(ndn::nfd::FACE_PERSISTENCY_ON_DEMAND)
           .setLinkType(ndn::nfd::LINK_TYPE_POINT_TO_POINT)
+          .setBaseCongestionMarkingInterval(100_ms)
+          .setDefaultCongestionThreshold(65536)
           .setFlagBit(ndn::nfd::BIT_LOCAL_FIELDS_ENABLED, true)
           .setFlagBit(ndn::nfd::BIT_LP_RELIABILITY_ENABLED, true)
+          .setFlagBit(ndn::nfd::BIT_CONGESTION_MARKING_ENABLED, true)
           .setNInInterests(18998)
           .setNInData(26701)
           .setNInNacks(147)
diff --git a/tests/tools/nfdc/format-helpers.t.cpp b/tests/tools/nfdc/format-helpers.t.cpp
index 6184401..a94d2ba 100644
--- a/tests/tools/nfdc/format-helpers.t.cpp
+++ b/tests/tools/nfdc/format-helpers.t.cpp
@@ -1,6 +1,6 @@
 /* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
-/**
- * Copyright (c) 2014-2017,  Regents of the University of California,
+/*
+ * Copyright (c) 2014-2018,  Regents of the University of California,
  *                           Arizona Board of Regents,
  *                           Colorado State University,
  *                           University Pierre & Marie Curie, Sorbonne University,
@@ -48,6 +48,30 @@
                           " surround XML &lt;element&gt; tag name"));
 }
 
+BOOST_AUTO_TEST_CASE(DurationFormatting)
+{
+  time::nanoseconds d1 = 53000_s + 87_ms + 3_us;
+  BOOST_CHECK_EQUAL(xml::formatDuration(d1), "PT53000.087S");
+
+  time::nanoseconds d2 = 56_s;
+  BOOST_CHECK_EQUAL(xml::formatDuration(d2), "PT56S");
+
+  time::nanoseconds d3 = 3_min;
+  BOOST_CHECK_EQUAL(xml::formatDuration(d3), "PT180S");
+
+  time::nanoseconds d4 = 0_ns;
+  BOOST_CHECK_EQUAL(xml::formatDuration(d4), "PT0S");
+
+  time::nanoseconds d5 = 1_ms;
+  BOOST_CHECK_EQUAL(xml::formatDuration(d5), "PT0.001S");
+
+  time::nanoseconds d6 = -53_s - 250_ms;
+  BOOST_CHECK_EQUAL(xml::formatDuration(d6), "-PT53.250S");
+
+  time::nanoseconds d7 = 1_us;
+  BOOST_CHECK_EQUAL(xml::formatDuration(d7), "PT0S");
+}
+
 BOOST_AUTO_TEST_SUITE_END() // Xml
 
 BOOST_AUTO_TEST_SUITE(Text)
