diff --git a/src/management/nfd-fib-management-options.hpp b/src/management/nfd-fib-management-options.hpp
index 16d688e..b2f8485 100644
--- a/src/management/nfd-fib-management-options.hpp
+++ b/src/management/nfd-fib-management-options.hpp
@@ -32,13 +32,13 @@
   {
     wireDecode(block);
   }
-  
-  const Name& 
+
+  const Name&
   getName () const
   {
     return m_name;
   }
-  
+
   FibManagementOptions&
   setName (const Name &name)
   {
@@ -46,8 +46,8 @@
     m_wire.reset ();
     return *this;
   }
-  
-  uint64_t 
+
+  uint64_t
   getFaceId () const
   {
     return m_faceId;
@@ -61,7 +61,7 @@
     return *this;
   }
 
-  uint64_t 
+  uint64_t
   getCost () const
   {
     return m_cost;
@@ -75,7 +75,7 @@
     return *this;
   }
 
-  const Name& 
+  const Name&
   getStrategy () const
   {
     return m_strategy;
@@ -88,17 +88,17 @@
     m_wire.reset ();
     return *this;
   }
-  
+
   template<bool T>
   size_t
   wireEncode(EncodingImpl<T> &block) const;
-  
+
   const Block&
   wireEncode () const;
-  
-  void 
+
+  void
   wireDecode (const Block &wire);
-  
+
 private:
   Name m_name;
   uint64_t m_faceId;
@@ -114,11 +114,11 @@
 {
   size_t total_len = 0;
 
-  // if (!m_strategy.empty())
-  //   {
-  //     total_len += prependNestedBlock(blk, tlv::nfd::Strategy, m_strategy);
-  //   }
-  
+  if (!m_strategy.empty())
+    {
+      total_len += prependNestedBlock(blk, tlv::nfd::Strategy, m_strategy);
+    }
+
   if (m_cost != 0)
     {
       total_len += prependNonNegativeIntegerBlock(blk, tlv::nfd::Cost, m_cost);
@@ -144,15 +144,15 @@
 
   EncodingEstimator estimator;
   size_t estimatedSize = wireEncode(estimator);
-  
+
   EncodingBuffer buffer(estimatedSize, 0);
   wireEncode(buffer);
 
   m_wire = buffer.block();
   return m_wire;
 }
-  
-inline void 
+
+inline void
 FibManagementOptions::wireDecode (const Block &wire)
 {
   m_name.clear();
@@ -164,7 +164,7 @@
 
   if (m_wire.type() != tlv::nfd::FibManagementOptions)
     throw Error("Requested decoding of FibManagementOptions, but Block is of different type");
-  
+
   m_wire.parse ();
 
   // Name
@@ -202,7 +202,7 @@
 operator << (std::ostream &os, const FibManagementOptions &option)
 {
   os << "ForwardingEntry(";
-  
+
   // Name
   os << "Prefix: " << option.getName() << ", ";
 
@@ -214,7 +214,7 @@
 
   // Strategy
   os << "Strategy: " << option.getStrategy() << ", ";
-  
+
   os << ")";
   return os;
 }
diff --git a/tests/management/test-nfd-control.cpp b/tests/management/test-nfd-control.cpp
index 79b4d39..2e53512 100644
--- a/tests/management/test-nfd-control.cpp
+++ b/tests/management/test-nfd-control.cpp
@@ -24,9 +24,13 @@
                                          0x66, 0x6f, 0x75, 0x6e, 0x64};
 
 const uint8_t TestFibManagementOptions[] = {
-  0x68, 0x1e, 0x07, 0x16, 0x08, 0x09, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x68,
+  0x68, 0x49, 0x07, 0x16, 0x08, 0x09, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x68,
   0x6f, 0x73, 0x74, 0x08, 0x03, 0x72, 0x65, 0x67, 0x08, 0x04, 0x74, 0x65,
-  0x73, 0x74, 0x69, 0x01, 0x00, 0x6a, 0x01, 0x01
+  0x73, 0x74, 0x69, 0x01, 0x00, 0x6a, 0x01, 0x01, 0x6b, 0x29, 0x07, 0x27,
+  0x08, 0x09, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x68, 0x6f, 0x73, 0x74, 0x08,
+  0x03, 0x6e, 0x66, 0x64, 0x08, 0x08, 0x73, 0x74, 0x72, 0x61, 0x74, 0x65,
+  0x67, 0x79, 0x08, 0x0b, 0x68, 0x65, 0x6c, 0x6c, 0x6f, 0x2d, 0x77, 0x6f,
+  0x72, 0x6c, 0x64
 };
 
 const uint8_t TestFaceManagementOptions[] = {
@@ -37,7 +41,7 @@
 
 // ControlResponse
 
-BOOST_AUTO_TEST_CASE (ControlResponseEncode)
+BOOST_AUTO_TEST_CASE(ControlResponseEncode)
 {
   ControlResponse controlResponse(404, "Nothing not found");
   const Block &wire = controlResponse.wireEncode();
@@ -46,10 +50,10 @@
                                   wire.begin(), wire.end());
 }
 
-BOOST_AUTO_TEST_CASE (ControlResponseDecode)
+BOOST_AUTO_TEST_CASE(ControlResponseDecode)
 {
   ControlResponse controlResponse;
-  
+
   BOOST_REQUIRE_NO_THROW(controlResponse.wireDecode(Block(TestControlResponse, sizeof(TestControlResponse))));
 
   BOOST_REQUIRE_EQUAL(controlResponse.getCode(), 404);
@@ -58,84 +62,87 @@
 
 // FibManagementOptions
 
-BOOST_AUTO_TEST_CASE (FibManagementOptionsEncoding)
+BOOST_AUTO_TEST_CASE(FibManagementOptionsEncoding)
 {
-  Name n ("/localhost/reg/test");
+  Name n("/localhost/reg/test");
   FibManagementOptions opt;
 
-  opt.setName (n);
-  opt.setFaceId (0);
-  opt.setCost (1);
+  opt.setName(n);
+  opt.setFaceId(0);
+  opt.setCost(1);
+  opt.setStrategy("/localhost/nfd/strategy/hello-world");
 
-  const Block& blk = opt.wireEncode ();
+  const Block& blk = opt.wireEncode();
 
-  BOOST_REQUIRE_EQUAL_COLLECTIONS (TestFibManagementOptions,
-                                   TestFibManagementOptions + sizeof (TestFibManagementOptions),
-                                   blk.begin (), blk.end ());
+  BOOST_REQUIRE_EQUAL_COLLECTIONS(TestFibManagementOptions,
+                                  TestFibManagementOptions + sizeof(TestFibManagementOptions),
+                                  blk.begin(), blk.end());
 }
 
-BOOST_AUTO_TEST_CASE (FibManagementOptionsFastEncoding)
+BOOST_AUTO_TEST_CASE(FibManagementOptionsFastEncoding)
 {
-  Name n ("/localhost/reg/test");
+  Name n("/localhost/reg/test");
   FibManagementOptions opt;
 
-  opt.setName (n);
-  opt.setFaceId (0);
-  opt.setCost (1);
+  opt.setName(n);
+  opt.setFaceId(0);
+  opt.setCost(1);
+  opt.setStrategy("/localhost/nfd/strategy/hello-world");
 
   EncodingBuffer blk;
 
-  BOOST_REQUIRE_NO_THROW (opt.wireEncode (blk));
+  BOOST_REQUIRE_NO_THROW(opt.wireEncode(blk));
 
-  BOOST_REQUIRE_EQUAL_COLLECTIONS (TestFibManagementOptions,
-                                   TestFibManagementOptions + sizeof (TestFibManagementOptions),
-                                   blk.begin (), blk.end ());
+  BOOST_REQUIRE_EQUAL_COLLECTIONS(TestFibManagementOptions,
+                                  TestFibManagementOptions + sizeof(TestFibManagementOptions),
+                                  blk.begin(), blk.end());
 
-  EncodingBuffer blk2 (4);
+  EncodingBuffer blk2(4);
 
-  BOOST_REQUIRE_NO_THROW (opt.wireEncode (blk2));
+  BOOST_REQUIRE_NO_THROW(opt.wireEncode(blk2));
 
-  BOOST_REQUIRE_EQUAL_COLLECTIONS (TestFibManagementOptions,
-                                   TestFibManagementOptions + sizeof (TestFibManagementOptions),
-                                   blk2.begin (), blk2.end ());
+  BOOST_REQUIRE_EQUAL_COLLECTIONS(TestFibManagementOptions,
+                                  TestFibManagementOptions + sizeof(TestFibManagementOptions),
+                                  blk2.begin(), blk2.end());
 }
 
-BOOST_AUTO_TEST_CASE (FibManagementOptionsDecoding)
+BOOST_AUTO_TEST_CASE(FibManagementOptionsDecoding)
 {
-  Block blk (TestFibManagementOptions, sizeof (TestFibManagementOptions));
-  Name n ("/localhost/reg/test");
+  Block blk(TestFibManagementOptions, sizeof(TestFibManagementOptions));
+  Name n("/localhost/reg/test");
   FibManagementOptions opt;
 
-  BOOST_REQUIRE_NO_THROW (opt.wireDecode (blk));
-  
-  BOOST_CHECK_EQUAL (opt.getName (), n);
-  BOOST_CHECK_EQUAL (opt.getFaceId (), 0);
-  BOOST_CHECK_EQUAL (opt.getCost (), 1);
+  BOOST_REQUIRE_NO_THROW(opt.wireDecode(blk));
+
+  BOOST_CHECK_EQUAL(opt.getName(), n);
+  BOOST_CHECK_EQUAL(opt.getFaceId(), 0);
+  BOOST_CHECK_EQUAL(opt.getCost(), 1);
+  BOOST_CHECK_EQUAL(opt.getStrategy().toUri(), "/localhost/nfd/strategy/hello-world");
 }
 
-BOOST_AUTO_TEST_CASE (FaceManagementOptionsFastEncoding)
+BOOST_AUTO_TEST_CASE(FaceManagementOptionsFastEncoding)
 {
   FaceManagementOptions opt;
 
-  opt.setFaceId (10);
-  opt.setUri ("tcp://1.1.1.1/hello/world");
+  opt.setFaceId(10);
+  opt.setUri("tcp://1.1.1.1/hello/world");
 
-  BOOST_REQUIRE_NO_THROW (opt.wireEncode ());
+  BOOST_REQUIRE_NO_THROW(opt.wireEncode ());
 
-  BOOST_REQUIRE_EQUAL_COLLECTIONS (TestFaceManagementOptions,
-                                   TestFaceManagementOptions + sizeof (TestFibManagementOptions),
-                                   opt.wireEncode ().begin (), opt.wireEncode ().end ());
+  BOOST_REQUIRE_EQUAL_COLLECTIONS(TestFaceManagementOptions,
+                                  TestFaceManagementOptions + sizeof(TestFaceManagementOptions),
+                                  opt.wireEncode().begin(), opt.wireEncode().end());
 }
 
-BOOST_AUTO_TEST_CASE (FaceManagementOptionsDecoding)
+BOOST_AUTO_TEST_CASE(FaceManagementOptionsDecoding)
 {
-  Block blk (TestFaceManagementOptions, sizeof (TestFaceManagementOptions));
+  Block blk(TestFaceManagementOptions, sizeof(TestFaceManagementOptions));
   FaceManagementOptions opt;
 
-  BOOST_REQUIRE_NO_THROW (opt.wireDecode (blk));
-  
-  BOOST_CHECK_EQUAL (opt.getFaceId(), 10);
-  BOOST_CHECK_EQUAL (opt.getUri(), "tcp://1.1.1.1/hello/world");
+  BOOST_REQUIRE_NO_THROW(opt.wireDecode (blk));
+
+  BOOST_CHECK_EQUAL(opt.getFaceId(), 10);
+  BOOST_CHECK_EQUAL(opt.getUri(), "tcp://1.1.1.1/hello/world");
 }
 
 BOOST_AUTO_TEST_SUITE_END()
