diff --git a/src/applications/maniphest/editor/ManiphestEditEngine.php b/src/applications/maniphest/editor/ManiphestEditEngine.php
--- a/src/applications/maniphest/editor/ManiphestEditEngine.php
+++ b/src/applications/maniphest/editor/ManiphestEditEngine.php
@@ -69,6 +69,14 @@
     return pht('Set Sail for Adventure');
   }
 
+  public function getCommentFieldPlaceholderText($object) {
+    if ($object->getStatus() === ManiphestTaskStatus::STATUS_CLOSED_DUPLICATE) {
+      return pht('This task is closed as a duplicate. '.
+      'Only comment if you think that this task is not a duplicate.');
+    }
+    return '';
+  }
+
   protected function getObjectViewURI($object) {
     return '/'.$object->getMonogram();
   }
diff --git a/src/applications/pholio/controller/PholioMockViewController.php b/src/applications/pholio/controller/PholioMockViewController.php
--- a/src/applications/pholio/controller/PholioMockViewController.php
+++ b/src/applications/pholio/controller/PholioMockViewController.php
@@ -223,7 +223,7 @@
 
     $form = id(new PhabricatorApplicationTransactionCommentView())
       ->setUser($viewer)
-      ->setObjectPHID($mock->getPHID())
+      ->setObject($mock)
       ->setFormID($comment_form_id)
       ->setDraft($draft)
       ->setHeaderText($title)
diff --git a/src/applications/ponder/controller/PonderQuestionViewController.php b/src/applications/ponder/controller/PonderQuestionViewController.php
--- a/src/applications/ponder/controller/PonderQuestionViewController.php
+++ b/src/applications/ponder/controller/PonderQuestionViewController.php
@@ -60,7 +60,7 @@
 
     $add_comment = id(new PhabricatorApplicationTransactionCommentView())
       ->setUser($viewer)
-      ->setObjectPHID($question->getPHID())
+      ->setObject($question)
       ->setShowPreview(false)
       ->setAction($this->getApplicationURI("/question/comment/{$id}/"))
       ->setSubmitButtonName(pht('Comment'));
diff --git a/src/applications/ponder/view/PonderAnswerView.php b/src/applications/ponder/view/PonderAnswerView.php
--- a/src/applications/ponder/view/PonderAnswerView.php
+++ b/src/applications/ponder/view/PonderAnswerView.php
@@ -121,7 +121,7 @@
 
     $comment_view = id(new PhabricatorApplicationTransactionCommentView())
       ->setUser($viewer)
-      ->setObjectPHID($answer->getPHID())
+      ->setObject($answer)
       ->setShowPreview(false)
       ->setHeaderText(pht('Answer Comment'))
       ->setAction("/ponder/answer/comment/{$id}/")
diff --git a/src/applications/slowvote/controller/PhabricatorSlowvotePollController.php b/src/applications/slowvote/controller/PhabricatorSlowvotePollController.php
--- a/src/applications/slowvote/controller/PhabricatorSlowvotePollController.php
+++ b/src/applications/slowvote/controller/PhabricatorSlowvotePollController.php
@@ -154,7 +154,7 @@
 
     return id(new PhabricatorApplicationTransactionCommentView())
       ->setUser($viewer)
-      ->setObjectPHID($poll->getPHID())
+      ->setObject($poll)
       ->setDraft($draft)
       ->setHeaderText($add_comment_header)
       ->setAction($this->getApplicationURI('/comment/'.$poll->getID().'/'))
diff --git a/src/applications/transactions/editengine/PhabricatorEditEngine.php b/src/applications/transactions/editengine/PhabricatorEditEngine.php
--- a/src/applications/transactions/editengine/PhabricatorEditEngine.php
+++ b/src/applications/transactions/editengine/PhabricatorEditEngine.php
@@ -339,7 +339,17 @@
     return null;
   }
 
-
+  /**
+   * Set default placeholder plain text in the comment textarea of the engine.
+   * To be overwritten by conditions defined in the child EditEngine class.
+   *
+   * @param  object Object in which the comment textarea is displayed.
+   * @return string Placeholder text to display in the comment textarea.
+   * @task text
+   */
+  public function getCommentFieldPlaceholderText($object) {
+    return '';
+  }
 
   /**
    * Return a human-readable header describing what this engine is used to do,
@@ -1664,10 +1674,11 @@
 
     $view = id(new PhabricatorApplicationTransactionCommentView())
       ->setUser($viewer)
-      ->setObjectPHID($object_phid)
       ->setHeaderText($header_text)
       ->setAction($comment_uri)
       ->setRequiresMFA($requires_mfa)
+      ->setObject($object)
+      ->setEditEngine($this)
       ->setSubmitButtonName($button_text);
 
     $draft = PhabricatorVersionedDraft::loadDraft(
diff --git a/src/applications/transactions/view/PhabricatorApplicationTransactionCommentView.php b/src/applications/transactions/view/PhabricatorApplicationTransactionCommentView.php
--- a/src/applications/transactions/view/PhabricatorApplicationTransactionCommentView.php
+++ b/src/applications/transactions/view/PhabricatorApplicationTransactionCommentView.php
@@ -15,11 +15,12 @@
   private $draft;
   private $requestURI;
   private $showPreview = true;
-  private $objectPHID;
+  private $object;
   private $headerText;
   private $noPermission;
   private $fullWidth;
   private $infoView;
+  private $editEngine;
   private $editEngineLock;
   private $noBorder;
   private $requiresMFA;
@@ -30,13 +31,19 @@
   private $commentActionGroups = array();
   private $transactionTimeline;
 
-  public function setObjectPHID($object_phid) {
-    $this->objectPHID = $object_phid;
+  /**
+   * Set object in which this comment textarea field is displayed
+   */
+  public function setObject($object) {
+    $this->object = $object;
     return $this;
   }
 
-  public function getObjectPHID() {
-    return $this->objectPHID;
+  /**
+   * Get object in which this comment textarea is displayed
+   */
+  public function getObject() {
+    return $this->object;
   }
 
   public function setShowPreview($show_preview) {
@@ -150,6 +157,15 @@
     return $this->noPermission;
   }
 
+  public function setEditEngine(PhabricatorEditEngine $edit_engine) {
+    $this->editEngine = $edit_engine;
+    return $this;
+  }
+
+  public function getEditEngine() {
+    return $this->editEngine;
+  }
+
   public function setEditEngineLock(PhabricatorEditEngineLock $lock) {
     $this->editEngineLock = $lock;
     return $this;
@@ -295,6 +311,15 @@
 
   private function renderCommentPanel() {
     $viewer = $this->getViewer();
+    $engine = $this->getEditEngine();
+    // In a few rare cases PhabricatorApplicationTransactionCommentView gets
+    // initiated in a View or Controller class. Don't crash in that case.
+    if ($engine) {
+      $placeholder_text = $engine
+        ->getCommentFieldPlaceholderText($this->getObject());
+    } else {
+      $placeholder_text = '';
+    }
 
     $remarkup_control = id(new PhabricatorRemarkupControl())
       ->setViewer($viewer)
@@ -302,6 +327,7 @@
       ->addClass('phui-comment-fullwidth-control')
       ->addClass('phui-comment-textarea-control')
       ->setCanPin(true)
+      ->setPlaceholder($placeholder_text)
       ->setName('comment');
 
     $draft_comment = '';
@@ -331,7 +357,7 @@
     }
     $remarkup_control->setRemarkupMetadata($draft_metadata);
 
-    if (!$this->getObjectPHID()) {
+    if (!$this->getObject()->getPHID()) {
       throw new PhutilInvalidStateException('setObjectPHID', 'render');
     }
 
@@ -345,7 +371,7 @@
       ->setFullWidth($this->fullWidth)
       ->setMetadata(
         array(
-          'objectPHID' => $this->getObjectPHID(),
+          'objectPHID' => $this->getObject()->getPHID(),
         ))
       ->setAction($this->getAction())
       ->setID($this->getFormID())