diff --git a/CHANGELOG.txt b/CHANGELOG.txt
index 66668e1..937cee0 100644
--- a/CHANGELOG.txt
+++ b/CHANGELOG.txt
@@ -6,6 +6,7 @@ This is the first full Drupal 8 port.
  - The procedural API is gone. The hook is replaced by an annotated plugin type,
    and the custom tag table with a config entity type.
  - Custom tags use Twig templates instead of HTML and PHP code.
+ - Removed all special tag properties (nocode, plain, selfclosing).
 
 
 2012-02-19
diff --git a/README.md b/README.md
index d35b01f..8098a92 100644
--- a/README.md
+++ b/README.md
@@ -63,13 +63,6 @@ function {module}_theme() {
 }
 ```
 
-If your tag is self-closing or "empty" (in that it consists only of an opening
-tag like `[hr]`), it must contain the following:
-
-```yaml
-selfclosing: true
-```
-
 Optionally, you may declare
 [CSS/JS libraries](https://www.drupal.org/developing/api/8/assets) defined in
 `*.libraries.yml`) that will be added whenever the tag is rendered:
diff --git a/config/schema/xbbcode.schema.yml b/config/schema/xbbcode.schema.yml
index a70a23b..3818d4a 100644
--- a/config/schema/xbbcode.schema.yml
+++ b/config/schema/xbbcode.schema.yml
@@ -56,9 +56,6 @@ xbbcode_tag:
     name:
       type: string
       label: 'Default name'
-    selfclosing:
-      type: boolean
-      label: 'Self-closing'
     attached:
       type: mapping
       mapping:
diff --git a/src/Annotation/XBBCodeTag.php b/src/Annotation/XBBCodeTag.php
index 3fdbe41..992a36a 100644
--- a/src/Annotation/XBBCodeTag.php
+++ b/src/Annotation/XBBCodeTag.php
@@ -66,11 +66,6 @@ class XBBCodeTag extends Plugin {
   protected $sample;
 
   /**
-   * Self-closing.
-   */
-  protected $selfclosing = FALSE;
-
-  /**
    * The default settings for the tag.
    *
    * @var array (optional)
diff --git a/src/Element.php b/src/Element.php
index 536466b..32d9309 100644
--- a/src/Element.php
+++ b/src/Element.php
@@ -93,7 +93,6 @@ class Element implements ElementInterface {
     $this->offset = $tag->offset;
   }
 
-
   /**
    * {@inheritdoc}
    */
@@ -127,7 +126,7 @@ class Element implements ElementInterface {
    */
   public function outerSource() {
     // Reconstruct the source:
-    return $this->element . ($this->closer ? ($this->source . $this->closer->element) : '');
+    return $this->element . $this->source . $this->closer->element;
   }
 
 }
diff --git a/src/Entity/TagEntity.php b/src/Entity/TagEntity.php
index 2ffc8f1..96df709 100644
--- a/src/Entity/TagEntity.php
+++ b/src/Entity/TagEntity.php
@@ -43,7 +43,6 @@ use Drupal\Core\Config\Entity\ConfigEntityBase;
  *     "description",
  *     "sample",
  *     "name",
- *     "selfclosing",
  *     "attached",
  *     "editable",
  *     "template_code",
@@ -68,13 +67,6 @@ class TagEntity extends ConfigEntityBase {
   protected $name;
 
   /**
-   * Whether or not this expects a closing tag.
-   *
-   * @var boolean
-   */
-  protected $selfclosing = FALSE;
-
-  /**
    * Any attachments required to render this tag.
    *
    * @var array
@@ -171,16 +163,6 @@ class TagEntity extends ConfigEntityBase {
   }
 
   /**
-   * Whether the tag is self-closing.
-   *
-   * @return bool
-   *   Tag is self-closing.
-   */
-  public function isSelfclosing() {
-    return $this->selfclosing;
-  }
-
-  /**
    * Return the attachments for this tag.
    *
    * @return array
diff --git a/src/Form/TagForm.php b/src/Form/TagForm.php
index a95c1e3..c995115 100644
--- a/src/Form/TagForm.php
+++ b/src/Form/TagForm.php
@@ -101,13 +101,6 @@ abstract class TagForm extends EntityForm {
       '#rows' => max(5, count(explode("\n", $tag->getSample()))),
     ];
 
-    $form['selfclosing'] = [
-      '#type' => 'checkbox',
-      '#title' => $this->t('Self-closing'),
-      '#default_value' => $tag->isSelfclosing(),
-      '#description' => $this->t('The tag is self-closing and requires no closing tag, like <code>[hr]</code>).'),
-    ];
-
     $form['editable'] = [
       '#type' => 'value',
       '#value' => TRUE,
@@ -120,7 +113,7 @@ abstract class TagForm extends EntityForm {
       '#default_value' => $tag->getTemplateCode(),
       '#description' => $this->t('The template for rendering this tag.'),
       '#required' => TRUE,
-      '#rows' => max(5, count(explode("\n", $tag->getTemplateCode()))),
+      '#rows' => max(15, count(explode("\n", $tag->getTemplateCode()))),
     ];
 
     $form['help'] = [
@@ -130,11 +123,13 @@ abstract class TagForm extends EntityForm {
       <p>The following variables are available for use:</p>
       <dl>
         <dt><code>tag.content</code></dt>
-        <dd>The text between opening and closing tags, if the tag is not self-closing. Example: <code>[url=http://www.drupal.org]<strong>Drupal</strong>[/url]</code></dd>
+        <dd>The text between opening and closing tags. Example: <code>[url=http://www.drupal.org]<strong>Drupal</strong>[/url]</code></dd>
         <dt><code>tag.option</code></dt>
         <dd>The single tag attribute, if one is entered. Example: <code>[url=<strong>http://www.drupal.org</strong>]Drupal[/url]</code>.</dd>
         <dt><code>tag.attr.*</code></dt>
         <dd>A named tag attribute. Example: <strong>{{ tag.attr.by }}}</strong> for <code>[quote&nbsp;by=<strong>Author</strong>&nbsp;date=2008]Text[/quote]</code>.</dd>
+        <dt><code>tag.source</code></dt>
+        <dd>The original text content of the tag. Example: <code>[code]<strong>[i]...[/i]</strong>[/code]</code>.</dd>
       </dl>'),
     ];
 
diff --git a/src/Plugin/Derivative/TagPluginDeriver.php b/src/Plugin/Derivative/TagPluginDeriver.php
index bccb860..a931e50 100644
--- a/src/Plugin/Derivative/TagPluginDeriver.php
+++ b/src/Plugin/Derivative/TagPluginDeriver.php
@@ -57,7 +57,6 @@ class TagPluginDeriver extends DeriverBase implements ContainerDeriverInterface
         'description' => $tag->getDescription(),
         'sample' => $tag->getSample(),
         'name' => $tag->getName(),
-        'selfclosing' => $tag->isSelfclosing(),
         'attached' => $tag->getAttachments(),
       ] + $base_plugin_definition;
     }
diff --git a/src/Plugin/Filter/XBBCodeFilter.php b/src/Plugin/Filter/XBBCodeFilter.php
index 58a4d44..22ba9e8 100644
--- a/src/Plugin/Filter/XBBCodeFilter.php
+++ b/src/Plugin/Filter/XBBCodeFilter.php
@@ -102,7 +102,6 @@ class XBBCodeFilter extends FilterBase {
           $this->tagsByName[$plugin->getName()] = $plugin;
         }
       }
-      ksort($this->tagsByName);
     }
     if (isset($name)) {
       if (isset($this->tagsByName[$name])) {
@@ -252,7 +251,6 @@ class XBBCodeFilter extends FilterBase {
     foreach ($matches as $match) {
       $tag = new Element($match);
       if ($this->tagsByName($tag->name)) {
-        $tag->selfclosing = $this->tagsByName($tag->name)->isSelfclosing();
         $tags[] = $tag;
         $open_by_name[$tag->name] = 0;
       }
@@ -264,20 +262,14 @@ class XBBCodeFilter extends FilterBase {
       // Add text before the new tag to the parent.
       end($stack)->advance($text, $tag->start);
 
-      // Case 1: The tag is opening and not self-closing.
-      if (!$tag->closing && !$tag->selfclosing) {
+      // Case 1: The tag is opening.
+      if (!$tag->closing) {
         // Stack the open tag, and increment the tracker.
         array_push($stack, $tag);
         $open_by_name[$tag->name]++;
       }
 
-      // Case 2: The tag is self-closing.
-      elseif ($tag->selfclosing) {
-        end($stack)->append($tag, $tag->end);
-        $found_tags[$tag->name] = $tag->name;
-      }
-
-      // Case 3: The tag closes an existing tag.
+      // Case 2: The tag closes an existing tag.
       elseif ($open_by_name[$tag->name]) {
         $open_by_name[$tag->name]--;
 
diff --git a/src/Plugin/TagPlugin.php b/src/Plugin/TagPlugin.php
index 41a5f48..1052247 100644
--- a/src/Plugin/TagPlugin.php
+++ b/src/Plugin/TagPlugin.php
@@ -151,13 +151,6 @@ abstract class TagPlugin extends PluginBase implements TagPluginInterface {
   /**
    * {@inheritdoc}
    */
-  public function isSelfclosing() {
-    return $this->pluginDefinition['selfclosing'];
-  }
-
-  /**
-   * {@inheritdoc}
-   */
   public function getAttachments() {
     return $this->pluginDefinition['attached'];
   }
diff --git a/src/Plugin/TagPluginInterface.php b/src/Plugin/TagPluginInterface.php
index 944bae9..2085e1f 100644
--- a/src/Plugin/TagPluginInterface.php
+++ b/src/Plugin/TagPluginInterface.php
@@ -53,14 +53,6 @@ interface TagPluginInterface extends ConfigurablePluginInterface, PluginInspecti
   public function getDefaultName();
 
   /**
-   * Returns TRUE if the tag is self-closing.
-   *
-   * @return bool
-   *   Plugin is self-closing.
-   */
-  public function isSelfclosing();
-
-  /**
    * Process a tag match.
    *
    * @param ElementInterface $tag
diff --git a/src/TagPluginCollection.php b/src/TagPluginCollection.php
index b04b112..83b4ad4 100644
--- a/src/TagPluginCollection.php
+++ b/src/TagPluginCollection.php
@@ -84,6 +84,13 @@ class TagPluginCollection extends DefaultLazyPluginCollection {
   /**
    * {@inheritdoc}
    */
+  public function sortHelper($a, $b) {
+    return strnatcasecmp($this->get($a)->getName(), $this->get($b)->getName());
+  }
+
+  /**
+   * {@inheritdoc}
+   */
   public function getConfiguration() {
     $configuration = parent::getConfiguration();
 
diff --git a/templates/xbbcode-tag-list.html.twig b/templates/xbbcode-tag-list.html.twig
index 45011ea..255c74d 100644
--- a/templates/xbbcode-tag-list.html.twig
+++ b/templates/xbbcode-tag-list.html.twig
@@ -10,4 +10,4 @@
     <li>{{ item|trim }}</li>
   {% endfor %}
 </ul>
-{% endspaceless %}
\ No newline at end of file
+{% endspaceless %}
