diff --git a/src/main/java/com/intel/jndn/management/NFD.java b/src/main/java/com/intel/jndn/management/NFD.java
index c5c8f20..d1f0450 100644
--- a/src/main/java/com/intel/jndn/management/NFD.java
+++ b/src/main/java/com/intel/jndn/management/NFD.java
@@ -20,6 +20,7 @@
 import com.intel.jndn.management.types.ForwarderStatus;
 import com.intel.jndn.management.types.LocalControlHeader;
 import com.intel.jndn.management.types.RibEntry;
+import com.intel.jndn.management.types.StrategyChoice;
 import com.intel.jndn.utils.SimpleClient;
 import com.intel.jndn.utils.SegmentedClient;
 import java.io.IOException;
@@ -148,6 +149,21 @@
   }
 
   /**
+   * Retrieve the list of strategy choice entries from the NFD; calls
+   * /localhost/nfd/rib/list which requires a local Face (all non-local packets
+   * are dropped).
+   *
+   * @param forwarder only a localhost Face
+   * @return a list of strategy choice entries, i.e. routes, see
+   * http://redmine.named-data.net/projects/nfd/wiki/StrategyChoice.
+   * @throws java.lang.Exception
+   */
+  public static List<StrategyChoice> getStrategyList(Face forwarder) throws Exception {
+    Data data = retrieveDataSet(forwarder, new Name("/localhost/nfd/strategy-choice/list"));
+    return StatusDataset.wireDecode(data.getContent(), StrategyChoice.class);
+  }
+
+  /**
    * Retrieve the {@link KeyLocator} for an NFD.
    *
    * @param forwarder only a localhost {@link Face}
@@ -442,7 +458,8 @@
    *
    * @param forwarder only a localhost Face
    * @param prefix the {@link Name} prefix
-   * @param strategy the {@link Name} of the strategy to set, e.g. /localhost/nfd/strategy/broadcast
+   * @param strategy the {@link Name} of the strategy to set, e.g.
+   * /localhost/nfd/strategy/broadcast
    * @throws Exception if the command fails
    */
   public static void setStrategy(Face forwarder, Name prefix, Name strategy) throws Exception {
diff --git a/src/main/java/com/intel/jndn/management/Strategies.java b/src/main/java/com/intel/jndn/management/Strategies.java
new file mode 100644
index 0000000..f8816be
--- /dev/null
+++ b/src/main/java/com/intel/jndn/management/Strategies.java
@@ -0,0 +1,30 @@
+/*
+ * jndn-management
+ * Copyright (c) 2015, Intel Corporation.
+ *
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms and conditions of the GNU Lesser General Public License,
+ * version 3, as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope 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.
+ */
+package com.intel.jndn.management;
+
+import net.named_data.jndn.Name;
+
+/**
+ * A reference list of the strategies available in NFD; should match
+ * <a href="http://redmine.named-data.net/projects/nfd/wiki/StrategyChoice#Strategy">
+ * http://redmine.named-data.net/projects/nfd/wiki/StrategyChoice#Strategy</a>
+ *
+ * @author Andrew Brown <andrew.brown@intel.com>
+ */
+public class Strategies {
+  public static final Name BEST_ROUTE = new Name("/localhost/nfd/strategy/best-route");
+  public static final Name BROADCAST = new Name("/localhost/nfd/strategy/broadcast");
+  public static final Name CLIENT_CONTROL = new Name("/localhost/nfd/strategy/client-control");
+  public static final Name NCC = new Name("/localhost/nfd/strategy/ncc");
+}
diff --git a/src/main/java/com/intel/jndn/management/types/StrategyChoice.java b/src/main/java/com/intel/jndn/management/types/StrategyChoice.java
new file mode 100644
index 0000000..962b699
--- /dev/null
+++ b/src/main/java/com/intel/jndn/management/types/StrategyChoice.java
@@ -0,0 +1,118 @@
+/*
+ * jndn-management
+ * Copyright (c) 2015, Intel Corporation.
+ *
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms and conditions of the GNU Lesser General Public License,
+ * version 3, as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope 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.
+ */
+package com.intel.jndn.management.types;
+
+import com.intel.jndn.management.EncodingHelper;
+import static com.intel.jndn.management.types.RibEntry.TLV_RIB_ENTRY;
+import java.nio.ByteBuffer;
+import net.named_data.jndn.Name;
+import net.named_data.jndn.encoding.EncodingException;
+import net.named_data.jndn.encoding.tlv.TlvDecoder;
+import net.named_data.jndn.encoding.tlv.TlvEncoder;
+import net.named_data.jndn.util.Blob;
+
+/**
+ * Represent a strategy choice entry.
+ *
+ * @see http://redmine.named-data.net/projects/nfd/wiki/StrategyChoice
+ * @author Andrew Brown <andrew.brown@intel.com>
+ */
+public class StrategyChoice implements Decodable {
+
+  /**
+   * TLV type, see
+   * <a href="http://redmine.named-data.net/projects/nfd/wiki/StrategyChoice#TLV-TYPE-assignments">http://redmine.named-data.net/projects/nfd/wiki/StrategyChoice#TLV-TYPE-assignments</a>
+   */
+  public final static int TLV_STRATEGY_CHOICE = 128;
+
+  /**
+   * Encode using a new TLV encoder.
+   *
+   * @return The encoded buffer.
+   */
+  public final Blob wireEncode() {
+    TlvEncoder encoder = new TlvEncoder();
+    wireEncode(encoder);
+    return new Blob(encoder.getOutput(), false);
+  }
+
+  /**
+   * Encode as part of an existing encode context.
+   *
+   * @param encoder
+   */
+  public final void wireEncode(TlvEncoder encoder) {
+    int saveLength = encoder.getLength();
+    EncodingHelper.encodeName(name, encoder);
+    EncodingHelper.encodeName(strategy, encoder);
+    encoder.writeTypeAndLength(TLV_STRATEGY_CHOICE, encoder.getLength() - saveLength);
+  }
+
+  /**
+   * Decode the input from its TLV format.
+   *
+   * @param input The input buffer to decode. This reads from position() to
+   * limit(), but does not change the position.
+   * @throws EncodingException For invalid encoding.
+   */
+  public final void wireDecode(ByteBuffer input) throws EncodingException {
+    TlvDecoder decoder = new TlvDecoder(input);
+    wireDecode(decoder);
+  }
+
+  /**
+   * Decode as part of an existing decode context.
+   *
+   * @param decoder
+   * @throws EncodingException
+   */
+  @Override
+  public final void wireDecode(TlvDecoder decoder) throws EncodingException {
+    int endOffset = decoder.readNestedTlvsStart(TLV_RIB_ENTRY);
+    strategy = EncodingHelper.decodeName(decoder);
+    name = EncodingHelper.decodeName(decoder);
+    decoder.finishNestedTlvs(endOffset);
+  }
+
+  /**
+   * @return the {@link Name} of the prefix the strategy is applied to
+   */
+  public Name getName() {
+    return name;
+  }
+
+  /**
+   * @return the {@link Name} of the strategy
+   */
+  public Name getStrategy() {
+    return strategy;
+  }
+
+  /**
+   * @param name the {@link Name} to set
+   */
+  public void setName(Name name) {
+    this.name = name;
+  }
+
+  /**
+   * @param strategy the {@link Name} to set
+   */
+  public void setStrategy(Name strategy) {
+    this.strategy = strategy;
+  }
+
+  private Name name;
+  private Name strategy;
+}
diff --git a/src/test/java/com/intel/jndn/management/StrategyTestIT.java b/src/test/java/com/intel/jndn/management/StrategyTestIT.java
new file mode 100644
index 0000000..3c63dd7
--- /dev/null
+++ b/src/test/java/com/intel/jndn/management/StrategyTestIT.java
@@ -0,0 +1,56 @@
+/*
+ * jndn-management
+ * Copyright (c) 2015, Intel Corporation.
+ *
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms and conditions of the GNU Lesser General Public License,
+ * version 3, as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope 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.
+ */
+package com.intel.jndn.management;
+
+import com.intel.jndn.management.types.StrategyChoice;
+import com.intel.jndn.mock.MockKeyChain;
+import com.intel.jndn.utils.SegmentedServer;
+import java.util.List;
+import java.util.logging.Logger;
+import static junit.framework.Assert.assertEquals;
+import net.named_data.jndn.Face;
+import net.named_data.jndn.Name;
+import net.named_data.jndn.security.KeyChain;
+import org.junit.Test;
+
+/**
+ * Test strategy management on a real, local NFD
+ *
+ * @author Andrew Brown <andrew.brown@intel.com>
+ */
+public class StrategyTestIT {
+
+  private static final Logger logger = Logger.getLogger(StrategyTestIT.class.getName());
+  Name prefix;
+  Face face;
+
+  public StrategyTestIT() throws net.named_data.jndn.security.SecurityException {
+    this.prefix = new Name("/test/strategy");
+    this.face = new Face("localhost"); // strategy commands only available on localhost
+    KeyChain mockKeyChain = MockKeyChain.configure(new Name("/test/server"));
+    face.setCommandSigningInfo(mockKeyChain, mockKeyChain.getDefaultCertificateName());
+  }
+
+  @Test
+  public void testStrategySetUnset() throws Exception {
+    List<StrategyChoice> choices = NFD.getStrategyList(face);
+    int oldSize = choices.size();
+
+    NFD.setStrategy(face, prefix, Strategies.CLIENT_CONTROL);
+    choices = NFD.getStrategyList(face);
+    assertEquals(oldSize + 1, choices.size());
+
+    NFD.unsetStrategy(face, prefix);
+  }
+}
diff --git a/src/test/java/com/intel/jndn/management/types/StrategyChoiceTest.java b/src/test/java/com/intel/jndn/management/types/StrategyChoiceTest.java
new file mode 100644
index 0000000..7783bb1
--- /dev/null
+++ b/src/test/java/com/intel/jndn/management/types/StrategyChoiceTest.java
@@ -0,0 +1,56 @@
+/*
+ * jndn-management
+ * Copyright (c) 2015, Intel Corporation.
+ *
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms and conditions of the GNU Lesser General Public License,
+ * version 3, as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope 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.
+ */
+package com.intel.jndn.management.types;
+
+import com.intel.jndn.management.Strategies;
+import java.nio.ByteBuffer;
+import junit.framework.Assert;
+import net.named_data.jndn.Name;
+import net.named_data.jndn.encoding.EncodingException;
+import net.named_data.jndn.encoding.tlv.TlvDecoder;
+import net.named_data.jndn.encoding.tlv.TlvEncoder;
+import net.named_data.jndn.util.Blob;
+import org.junit.Test;
+import static org.junit.Assert.*;
+
+/**
+ *
+ * @author Andrew Brown <andrew.brown@intel.com>
+ */
+public class StrategyChoiceTest {
+
+  public StrategyChoiceTest() {
+  }
+
+  /**
+   * Test of wireEncode method, of class StrategyChoice.
+   */
+  @Test
+  public void testEncodeDecode() throws EncodingException {
+    StrategyChoice choice = new StrategyChoice();
+    choice.setName(new Name("/a/b"));
+    choice.setStrategy(Strategies.NCC);
+
+    // encode
+    Blob encoded = choice.wireEncode();
+
+    // decode
+    StrategyChoice decoded = new StrategyChoice();
+    decoded.wireDecode(encoded.buf());
+
+    // test
+    Assert.assertEquals(choice.getName().toUri(), decoded.getName().toUri());
+    Assert.assertEquals(choice.getStrategy().toUri(), decoded.getStrategy().toUri());
+  }
+}
