diff --git a/src/main/java/com/googlesource/gerrit/plugins/its/phabricator/PhabricatorItsFacade.java b/src/main/java/com/googlesource/gerrit/plugins/its/phabricator/PhabricatorItsFacade.java
index 7d4a3c8..5d171de 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/its/phabricator/PhabricatorItsFacade.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/its/phabricator/PhabricatorItsFacade.java
@@ -61,7 +61,7 @@
       throws IOException {
     int task_id = Integer.parseInt(bugId);
     try {
-      conduit.maniphestUpdate(task_id, comment);
+      conduit.maniphestEdit(task_id, comment);
     } catch (ConduitException e) {
       throw new IOException("Could not update message for task " + task_id, e);
     }
@@ -122,7 +122,7 @@
                 projectPhids.add(jsonElement.getAsString());
               }
 
-              conduit.maniphestUpdate(taskId, projectPhids);
+              conduit.maniphestEdit(taskId, projectPhids);
             } catch (ConduitException e) {
               throw new IOException("Error on conduit", e);
             }
diff --git a/src/main/java/com/googlesource/gerrit/plugins/its/phabricator/conduit/Conduit.java b/src/main/java/com/googlesource/gerrit/plugins/its/phabricator/conduit/Conduit.java
index fa49281..d2d4ae2 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/its/phabricator/conduit/Conduit.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/its/phabricator/conduit/Conduit.java
@@ -21,7 +21,7 @@
 import com.googlesource.gerrit.plugins.its.phabricator.conduit.results.ConduitConnect;
 import com.googlesource.gerrit.plugins.its.phabricator.conduit.results.ConduitPing;
 import com.googlesource.gerrit.plugins.its.phabricator.conduit.results.ManiphestInfo;
-import com.googlesource.gerrit.plugins.its.phabricator.conduit.results.ManiphestUpdate;
+import com.googlesource.gerrit.plugins.its.phabricator.conduit.results.ManiphestEdit;
 import com.googlesource.gerrit.plugins.its.phabricator.conduit.results.ProjectInfo;
 import com.googlesource.gerrit.plugins.its.phabricator.conduit.results.QueryResult;
 
@@ -31,14 +31,15 @@
 import java.io.UnsupportedEncodingException;
 import java.security.MessageDigest;
 import java.security.NoSuchAlgorithmException;
+import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.HashMap;
+import java.util.List;
 import java.util.Map;
 import java.util.Map.Entry;
 
 import javax.xml.bind.DatatypeConverter;
 
-
 /**
  * Bindings for Phabricator's Conduit API
  * <p/>
@@ -174,35 +175,47 @@
   }
 
   /**
-   * Runs the API's 'maniphest.update' method
+   * Runs the API's 'maniphest.edit' method
    */
-  public ManiphestUpdate maniphestUpdate(int taskId, String comment) throws ConduitException {
-    return maniphestUpdate(taskId, comment, null);
+  public ManiphestEdit maniphestEdit(int taskId, String comment) throws ConduitException {
+    return maniphestEdit(taskId, comment, null);
   }
 
   /**
-   * Runs the API's 'maniphest.update' method
+   * Runs the API's 'maniphest.edit' method
    */
-  public ManiphestUpdate maniphestUpdate(int taskId, Iterable<String> projects) throws ConduitException {
-    return maniphestUpdate(taskId, null, projects);
+  public ManiphestEdit maniphestEdit(int taskId, Iterable<String> projects) throws ConduitException {
+    return maniphestEdit(taskId, null, projects);
   }
 
   /**
-   * Runs the API's 'maniphest.update' method
+   * Runs the API's 'maniphest.edit' method
    */
-  public ManiphestUpdate maniphestUpdate(int taskId, String comment, Iterable<String> projects) throws ConduitException {
-    Map<String, Object> params = new HashMap<>();
+  public ManiphestEdit maniphestEdit(int taskId, String comment, Iterable<String> projects) throws ConduitException {
+    HashMap<String, Object> params = new HashMap<>();
     fillInSession(params);
-    params.put("id", taskId);
+    List<Object> list = new ArrayList<>();
+    HashMap<String, Object> params2 = new HashMap<>();
     if (comment != null) {
-      params.put("comments", comment);
-    }
-    if (projects != null) {
-      params.put("projectPHIDs", projects);
+      String comments = "comment";
+      params2.put("type", comments);
+      params2.put("value", comment);
     }
 
-    JsonElement callResult = conduitConnection.call("maniphest.update", params);
-    ManiphestUpdate result = gson.fromJson(callResult, ManiphestUpdate.class);
+    if (projects != null) {
+      String project = "projects.add";
+      params2.put("type", project);
+      params2.put("value", projects);
+    }
+
+    if (!params2.isEmpty()) {
+      list.add(params2);
+      params.put("transactions", list);
+    }
+    params.put("objectIdentifier", taskId);
+
+    JsonElement callResult = conduitConnection.call("maniphest.edit", params);
+    ManiphestEdit result = gson.fromJson(callResult, ManiphestEdit.class);
     return result;
   }
 
diff --git a/src/main/java/com/googlesource/gerrit/plugins/its/phabricator/conduit/results/ManiphestUpdate.java b/src/main/java/com/googlesource/gerrit/plugins/its/phabricator/conduit/results/ManiphestEdit.java
similarity index 93%
rename from src/main/java/com/googlesource/gerrit/plugins/its/phabricator/conduit/results/ManiphestUpdate.java
rename to src/main/java/com/googlesource/gerrit/plugins/its/phabricator/conduit/results/ManiphestEdit.java
index 055e8db..8323f4e 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/its/phabricator/conduit/results/ManiphestUpdate.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/its/phabricator/conduit/results/ManiphestEdit.java
@@ -14,7 +14,7 @@
 package com.googlesource.gerrit.plugins.its.phabricator.conduit.results;
 
 /**
- * Models the result for a call to maniphest.update
+ * Models the result for a call to maniphest.edit
  * <p/>
  * JSON looks like:
  * <pre>
@@ -46,6 +46,6 @@
  * }
  * </pre>
  */
-public class ManiphestUpdate extends Task {
+public class ManiphestEdit extends Task {
 
 }
diff --git a/src/main/java/com/googlesource/gerrit/plugins/its/phabricator/conduit/results/Task.java b/src/main/java/com/googlesource/gerrit/plugins/its/phabricator/conduit/results/Task.java
index f6e72b6..0392314 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/its/phabricator/conduit/results/Task.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/its/phabricator/conduit/results/Task.java
@@ -68,6 +68,8 @@
   private String dateCreated;
   private String dateModified;
   private JsonElement dependsOnTaskPHIDs;
+  private JsonElement objectIdentifier;
+  private JsonElement transactions;
 
   public int getId() {
     return id;
@@ -144,4 +146,12 @@
   public JsonElement getDependsOnTaskPHIDs() {
     return dependsOnTaskPHIDs;
   }
+
+  public JsonElement getObjectIdentifier() {
+    return objectIdentifier;
+  }
+
+  public JsonElement getTransactions() {
+    return transactions;
+  }
 }
diff --git a/src/test/java/com/googlesource/gerrit/plugins/its/phabricator/conduit/ConduitTest.java b/src/test/java/com/googlesource/gerrit/plugins/its/phabricator/conduit/ConduitTest.java
index 58ea0b8..b4936e4 100644
--- a/src/test/java/com/googlesource/gerrit/plugins/its/phabricator/conduit/ConduitTest.java
+++ b/src/test/java/com/googlesource/gerrit/plugins/its/phabricator/conduit/ConduitTest.java
@@ -35,7 +35,7 @@
 import com.googlesource.gerrit.plugins.its.phabricator.conduit.results.ConduitConnect;
 import com.googlesource.gerrit.plugins.its.phabricator.conduit.results.ConduitPing;
 import com.googlesource.gerrit.plugins.its.phabricator.conduit.results.ManiphestInfo;
-import com.googlesource.gerrit.plugins.its.phabricator.conduit.results.ManiphestUpdate;
+import com.googlesource.gerrit.plugins.its.phabricator.conduit.results.ManiphestEdit;
 import com.googlesource.gerrit.plugins.its.phabricator.conduit.results.ProjectInfo;
 
 @RunWith(PowerMockRunner.class)
@@ -245,7 +245,7 @@
     assertLogMessageContains("Trying to start new session");
   }
 
-  public void testManiphestUpdatePassComment() throws Exception {
+  public void testManiphestEditPassComment() throws Exception {
     mockConnection();
 
     resetToStrict(connection);
@@ -272,7 +272,7 @@
 
     Conduit conduit = new Conduit(URL, USERNAME, CERTIFICATE);
 
-    ManiphestUpdate maniphestUpdate = conduit.maniphestUpdate(42, "foo");
+    ManiphestEdit maniphestEdit = conduit.maniphestEdit(42, "foo");
 
     Map<String, Object> paramsConnect = paramsCaptureConnect.getValue();
     assertEquals("Usernames do not match", USERNAME, paramsConnect.get("user"));
@@ -280,12 +280,12 @@
     Map<String, Object> paramsRelevant = paramsCaptureRelevant.getValue();
     assertEquals("Task id is not set", 42, paramsRelevant.get("id"));
 
-    assertEquals("ManiphestInfo's id does not match", 42, maniphestUpdate.getId());
+    assertEquals("ManiphestInfo's id does not match", 42, maniphestEdit.getId());
 
     assertLogMessageContains("Trying to start new session");
   }
 
-  public void testManiphestUpdatePassProjects() throws Exception {
+  public void testManiphestEditPassProjects() throws Exception {
     mockConnection();
 
     resetToStrict(connection);
@@ -304,7 +304,7 @@
 
     Capture<Map<String, Object>> paramsCaptureRelevant = new Capture<>();
 
-    expect(connection.call(eq("maniphest.update"), capture(paramsCaptureRelevant)))
+    expect(connection.call(eq("maniphest.edit"), capture(paramsCaptureRelevant)))
     .andReturn(retRelevant)
     .once();
 
@@ -312,7 +312,7 @@
 
     Conduit conduit = new Conduit(URL, USERNAME, CERTIFICATE);
 
-    ManiphestUpdate maniphestUpdate = conduit.maniphestUpdate(42,
+    ManiphestEdit maniphestEdit = conduit.maniphestEdit(42,
         Arrays.asList("foo", "bar"));
 
     Map<String, Object> paramsConnect = paramsCaptureConnect.getValue();
@@ -323,12 +323,12 @@
     assertEquals("Task projects are not set", Arrays.asList("foo", "bar"),
         paramsRelevant.get("projectPHIDs"));
 
-    assertEquals("ManiphestUpdate's id does not match", 42, maniphestUpdate.getId());
+    assertEquals("ManiphestEdit's id does not match", 42, maniphestEdit.getId());
 
     assertLogMessageContains("Trying to start new session");
   }
 
-  public void testManiphestUpdatePassCommentAndProjects() throws Exception {
+  public void testManiphestEditPassCommentAndProjects() throws Exception {
     mockConnection();
 
     resetToStrict(connection);
@@ -347,7 +347,7 @@
 
     Capture<Map<String, Object>> paramsCaptureRelevant = new Capture<>();
 
-    expect(connection.call(eq("maniphest.update"), capture(paramsCaptureRelevant)))
+    expect(connection.call(eq("maniphest.edit"), capture(paramsCaptureRelevant)))
     .andReturn(retRelevant)
     .once();
 
@@ -355,7 +355,7 @@
 
     Conduit conduit = new Conduit(URL, USERNAME, CERTIFICATE);
 
-    ManiphestUpdate maniphestUpdate = conduit.maniphestUpdate(42, "baz",
+    ManiphestEdit maniphestEdit = conduit.maniphestEdit(42, "baz",
         Arrays.asList("foo", "bar"));
 
     Map<String, Object> paramsConnect = paramsCaptureConnect.getValue();
@@ -367,13 +367,13 @@
     assertEquals("Task projects are not set", Arrays.asList("foo", "bar"),
         paramsRelevant.get("projectPHIDs"));
 
-    assertEquals("ManiphestUpdate's id does not match", 42, maniphestUpdate.getId());
+    assertEquals("ManiphestUpdate's id does not match", 42, maniphestEdit.getId());
 
     assertLogMessageContains("Trying to start new session");
   }
 
 
-  public void testManiphestUpdateFailConnect() throws Exception {
+  public void testManiphestEditFailConnect() throws Exception {
     mockConnection();
 
     ConduitException conduitException = new ConduitException();
@@ -389,7 +389,7 @@
     Conduit conduit = new Conduit(URL, USERNAME, CERTIFICATE);
 
     try {
-      conduit.maniphestUpdate(42, "foo");
+      conduit.maniphestEdit(42, "foo");
       fail("no exception got thrown");
     } catch (ConduitException e) {
       assertSame(conduitException, e);
@@ -401,7 +401,7 @@
     assertLogMessageContains("Trying to start new session");
   }
 
-  public void testManiphestUpdateFailRelevant() throws Exception {
+  public void testManiphestEditFailRelevant() throws Exception {
     mockConnection();
 
     resetToStrict(connection);
@@ -419,7 +419,7 @@
 
     Capture<Map<String, Object>> paramsCaptureRelevant = new Capture<>();
 
-    expect(connection.call(eq("maniphest.update"), capture(paramsCaptureRelevant)))
+    expect(connection.call(eq("maniphest.edit"), capture(paramsCaptureRelevant)))
       .andThrow(conduitException)
       .once();
 
@@ -428,7 +428,7 @@
     Conduit conduit = new Conduit(URL, USERNAME, CERTIFICATE);
 
     try {
-      conduit.maniphestUpdate(42, "foo");
+      conduit.maniphestEdit(42, "foo");
       fail("no exception got thrown");
     } catch (ConduitException e) {
       assertSame(conduitException, e);
