diff --git a/patches/jtorctl.patch b/patches/jtorctl.patch
index 167af82d22592834bed17fe41098c3096168988e..7d346eff0c87e66b18defd0d28b53e4d4de93af8 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.
++     * <p/>
++     * ADD_ONION was added in Tor 0.2.7.1-alpha.
++     */
++    public Map<String,String> addOnion(Map<Integer,String> 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.
++     * <p/>
++     * ADD_ONION was added in Tor 0.2.7.1-alpha.
++     */
++    public Map<String,String> addOnion(Map<Integer,String> 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.
++     * <p/>
++     * ADD_ONION was added in Tor 0.2.7.1-alpha.
++     */
++    public Map<String,String> addOnion(String privKey,
++                                       Map<Integer,String> portLines)
++                                       throws IOException {
++        return addOnion(privKey, portLines, null);
++    }
++
++    /**
++     * Tells Tor to set up an onion service using the provided private key.
++     * <p/>
++     * ADD_ONION was added in Tor 0.2.7.1-alpha.
++     */
++    public Map<String,String> addOnion(String privKey,
++                                       Map<Integer,String> portLines,
++                                       boolean ephemeral, boolean detach)
++                                       throws IOException {
++        List<String> flags = new ArrayList<String>();
++        if (ephemeral)
++            flags.add("DiscardPK");
++        if (detach)
++            flags.add("Detach");
++        return addOnion(privKey, portLines, flags);
++    }
++
++    /**
++     * Tells Tor to set up an onion service.
++     * <p/>
++     * ADD_ONION was added in Tor 0.2.7.1-alpha.
++     */
++    public Map<String,String> addOnion(String privKey,
++                                       Map<Integer,String> portLines,
++                                       List<String> 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<Integer,String> 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<ReplyLine> lst = sendAndWaitForResponse(b.toString(), null);
++        Map<String,String> ret = new HashMap<String,String>();
++        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.
++     * <p/>
++     * 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 {