diff --git a/src/applications/phid/view/PHUIHandleListView.php b/src/applications/phid/view/PHUIHandleListView.php
--- a/src/applications/phid/view/PHUIHandleListView.php
+++ b/src/applications/phid/view/PHUIHandleListView.php
@@ -38,9 +38,13 @@
   }
 
   protected function getTagName() {
-    // TODO: It would be nice to render this with a proper <ul />, at least in
-    // block mode, but don't stir the waters up too much for now.
-    return 'span';
+    if ($this->getAsText()) {
+      return null;
+    } else {
+      // TODO: It would be nice to render this with a proper <ul />, at least
+      // in block mode, but don't stir the waters up too much for now.
+      return 'span';
+    }
   }
 
   protected function getTagContent() {
diff --git a/src/view/AphrontTagView.php b/src/view/AphrontTagView.php
--- a/src/view/AphrontTagView.php
+++ b/src/view/AphrontTagView.php
@@ -92,6 +92,15 @@
   final public function render() {
     $this->willRender();
 
+    // A tag view may render no tag at all. For example, the HandleListView is
+    // a container which renders a tag in HTML mode, but can also render in
+    // text mode without producing a tag. When a tag view has no tag name, just
+    // return the tag content as though the view did not exist.
+    $tag_name = $this->getTagName();
+    if ($tag_name === null) {
+      return $this->getTagContent();
+    }
+
     $attributes = $this->getTagAttributes();
 
     $implode = array('class', 'sigil');
@@ -147,7 +156,7 @@
     }
 
     return javelin_tag(
-      $this->getTagName(),
+      $tag_name,
       $attributes,
       $this->getTagContent());
   }