diff --git a/patches/jtorctl.patch b/patches/jtorctl.patch
index 167af82d2..7d346eff0 100644
--- a/patches/jtorctl.patch
+++ b/patches/jtorctl.patch
@@ -1,8 +1,125 @@
+diff --git a/net/freehaven/tor/control/TorControlCommands.java b/net/freehaven/tor/control/TorControlCommands.java
+index 36482d5..14486e3 100644
+--- a/net/freehaven/tor/control/TorControlCommands.java
++++ b/net/freehaven/tor/control/TorControlCommands.java
+@@ -144,5 +144,8 @@ public interface TorControlCommands {
+ "No such OR",
+ };
+
++ public static final String HS_ADDRESS = "onionAddress";
++ public static final String HS_PRIVKEY = "onionPrivKey";
++
+ }
+
diff --git a/net/freehaven/tor/control/TorControlConnection.java b/net/freehaven/tor/control/TorControlConnection.java
-index 9524612..38b1879 100644
+index 9524612..c0f2070 100644
--- a/net/freehaven/tor/control/TorControlConnection.java
+++ b/net/freehaven/tor/control/TorControlConnection.java
-@@ -740,7 +740,7 @@ public class TorControlConnection implements TorControlCommands {
+@@ -736,11 +736,111 @@ public class TorControlConnection implements TorControlCommands {
+ sendAndWaitForResponse("TAKEOWNERSHIP\r\n", null);
+ }
+
++ /**
++ * Tells Tor to generate and set up a new onion service using the best
++ * supported algorithm.
++ *
++ * ADD_ONION was added in Tor 0.2.7.1-alpha.
++ */
++ public Map addOnion(Map portLines)
++ throws IOException {
++ return addOnion("NEW:BEST", portLines, null);
++ }
++
++ /**
++ * Tells Tor to generate and set up a new onion service using the best
++ * supported algorithm.
++ *
++ * ADD_ONION was added in Tor 0.2.7.1-alpha.
++ */
++ public Map addOnion(Map portLines,
++ boolean ephemeral, boolean detach)
++ throws IOException {
++ return addOnion("NEW:BEST", portLines, ephemeral, detach);
++ }
++
++ /**
++ * Tells Tor to set up an onion service using the provided private key.
++ *
++ * ADD_ONION was added in Tor 0.2.7.1-alpha.
++ */
++ public Map addOnion(String privKey,
++ Map portLines)
++ throws IOException {
++ return addOnion(privKey, portLines, null);
++ }
++
++ /**
++ * Tells Tor to set up an onion service using the provided private key.
++ *
++ * ADD_ONION was added in Tor 0.2.7.1-alpha.
++ */
++ public Map addOnion(String privKey,
++ Map portLines,
++ boolean ephemeral, boolean detach)
++ throws IOException {
++ List flags = new ArrayList();
++ if (ephemeral)
++ flags.add("DiscardPK");
++ if (detach)
++ flags.add("Detach");
++ return addOnion(privKey, portLines, flags);
++ }
++
++ /**
++ * Tells Tor to set up an onion service.
++ *
++ * ADD_ONION was added in Tor 0.2.7.1-alpha.
++ */
++ public Map addOnion(String privKey,
++ Map portLines,
++ List flags)
++ throws IOException {
++ if (privKey.indexOf(':') < 0)
++ throw new IllegalArgumentException("Invalid privKey");
++ if (portLines == null || portLines.size() < 1)
++ throw new IllegalArgumentException("Must provide at least one port line");
++ StringBuilder b = new StringBuilder();
++ b.append("ADD_ONION ").append(privKey);
++ if (flags != null && flags.size() > 0) {
++ b.append(" Flags=");
++ String separator = "";
++ for (String flag : flags) {
++ b.append(separator).append(flag);
++ separator = ",";
++ }
++ }
++ for (Map.Entry portLine : portLines.entrySet()) {
++ int virtPort = portLine.getKey();
++ String target = portLine.getValue();
++ b.append(" Port=").append(virtPort);
++ if (target != null && target.length() > 0)
++ b.append(",").append(target);
++ }
++ b.append("\r\n");
++ List lst = sendAndWaitForResponse(b.toString(), null);
++ Map ret = new HashMap();
++ ret.put(HS_ADDRESS, (lst.get(0)).msg.split("=", 2)[1]);
++ if (lst.size() > 2)
++ ret.put(HS_PRIVKEY, (lst.get(1)).msg.split("=", 2)[1]);
++ return ret;
++ }
++
++ /**
++ * Tells Tor to take down an onion service previously set up with
++ * addOnion(). The hostname excludes the .onion extension.
++ *
++ * DEL_ONION was added in Tor 0.2.7.1-alpha.
++ */
++ public void delOnion(String hostname) throws IOException {
++ sendAndWaitForResponse("DEL_ONION " + hostname + "\r\n", null);
++ }
++
+ /** Tells Tor to forget any cached client state relating to the hidden
* service with the given hostname (excluding the .onion extension).
*/
public void forgetHiddenService(String hostname) throws IOException {