diff --git a/css/seven.label-help.css b/css/seven.label-help.css
new file mode 100644
index 0000000..347e1a3
--- /dev/null
+++ b/css/seven.label-help.css
@@ -0,0 +1,9 @@
+table th .label-description {
+  text-transform: none;
+  font-weight: normal;
+}
+
+div.description.label-description,
+.form-item .description.label-description {
+  margin: 0 0 .2rem;
+}
diff --git a/label_help.libraries.yml b/label_help.libraries.yml
new file mode 100644
index 0000000..e2a151e
--- /dev/null
+++ b/label_help.libraries.yml
@@ -0,0 +1,6 @@
+seven:
+  version: VERSION
+  css:
+    theme:
+      css/seven.label-help.css: {}
+
diff --git a/label_help.module b/label_help.module
index 3bca983..1de4d11 100644
--- a/label_help.module
+++ b/label_help.module
@@ -5,20 +5,37 @@ use Drupal\Core\Form\FormStateInterface;
 
 /**
  * @file
- * This is the file description for the Label Help module.
+ * Label Help module.
  *
- * In normal rendering of textarea form fields that are text-format-enabled,
- * the field's help text gets placed below the text format selector and tips.
- * This means that website users are unlikely to notice and read the help text.
- * This module creates help text to be placed directly below the field's
- * label.
+ * Adds an additional textfield for all Field API field types to appear
+ * between the field's label and the field input itself on Drupal forms.
  */
 
 /**
+ * Implements hook_theme().
+ */
+function label_help_theme() {
+  return [
+    'label_help' => [
+      'variables' => [
+        'content' => NULL
+      ],
+    ],
+  ];
+}
+
+/**
  * Implements hook_form_alter().
  */
 function label_help_form_alter(&$form, &$form_state, $form_id) {
   $children = array_intersect_key($form, array_flip(Element::children($form)));
+
+  // Add theme overrides.
+  $theme = \Drupal::theme()->getActiveTheme()->getName();
+  if ($theme == 'seven') {
+    $form['#attached']['library'][] = 'label_help/seven';
+  }
+
   foreach ($children as $key => $item) {
     $form_object = $form_state->getFormObject();
     if (!method_exists($form_object, 'getEntity')) {
@@ -35,47 +52,101 @@ function label_help_form_alter(&$form, &$form_state, $form_id) {
     $form_entity_get_field_definition_method = new ReflectionMethod($form_entity, 'getFieldDefinition');
     $field = $form_object->getEntity()->getFieldDefinition($key);
 
-    $label_help = NULL;
+    $content = NULL;
     if (method_exists($field, 'getThirdPartySetting')) {
-      $label_help = $field->getThirdPartySetting('label_help', 'label_help_description');
+      $content = $field->getThirdPartySetting('label_help', 'label_help_description');
     }
-    if (!is_null($label_help)) {
-      $theme_option = array(
-        'description at top' => $label_help,
-      );
-      // Put comments above the label for field forms of type 'container'
-      // that are specifically configured.
-      if (isset($item['#type']) && $item['#type'] == 'container') {
-        // For reasons best known to the lunatics who designed the Forms API,
-        // $form[$key][$item['#language']][0]['#theme_options'] has to be set to get
-        // this working for textarea fields, and
-        // form[$key][$item['#language']][0]['value']['#theme_options'] has to be set
-        // to get this working for one-line text fields, and
-        // form[$key][$item['#language']][0]['default']['#theme_options'] has to be set
-        // to get this working for some other fields.
-        $label_help_markup = t('<div class="description label-description">@label_help</div>', ['@label_help' => $label_help]);
-        if (isset($form[$key]['widget'][0]['value'])) {
-          $form[$key]['widget'][0]['value']['#label_suffix'] = $label_help_markup;
-        }
-        elseif (isset($form[$key]['widget'][0]['#title'])) {
-          $form[$key]['widget'][0]['#label_suffix'] = $label_help_markup;
+    if (is_null($content) || strlen($content) === 0) {
+      continue;
+    }
+
+    // Provide themable markup for the help text.
+    $renderer = \Drupal::service('renderer');
+    $element = [
+      '#theme' => 'label_help',
+      '#content' => [
+        '#markup' => $content,
+      ],
+    ];
+    $markup = $renderer->renderRoot($element);
+
+    // Most Drupal 8 entity edit forms have fields of type 'container' with
+    // an inner widget where the form element itself is attached. Attempt to
+    // leverage #label_suffix where possible and fallback to alternate
+    // solutions for widget types like details and fieldsets that do not
+    // support #label_suffix.
+    if (isset($item['#type']) && $item['#type'] == 'container') {
+
+      // Special case for multi-value fields, which lack #label_suffix
+      // support, appends the help text straight to the field title so it
+      // appears in the table header, instead of inside the draggable row.
+      if (!empty($item['widget']['#cardinality_multiple'])) {
+        $form[$key]['widget']['#title'] .= $markup;
+      }
+
+      // Special case for containers whose first element is to be rendered as
+      // a fieldset either via #type (eg, Link fields) or #theme_wrappers (eg,
+      // Date fields). Drupal's fieldset.html.twig do not support the
+      // #label_prefix, so use #field_prefix instead, but be careful to not
+      // overwrite content when the #field_prefix is alread defined.
+      elseif ((!empty($item['widget'][0]['#type']) && $item['widget'][0]['#type'] == 'fieldset') || (!empty($item['widget'][0]['#theme_wrappers']) && $item['widget'][0]['#theme_wrappers'][0] == 'fieldset')) {
+
+        // Prepend to existing value when #field_prefix is defined.
+        if (!empty($item['widget'][0]['#field_prefix'])) {
+          $form[$key]['widget'][0]['#field_prefix'] = $markup . $item['widget'][0]['#field_prefix'];
+        } else {
+          $form[$key]['widget'][0]['#field_prefix'] = $markup;
         }
-        elseif (isset($form[$key]['widget']['#title'])) {
-          $form[$key]['widget']['#label_suffix'] = $label_help_markup;
+      }
+
+      // Special case for containers with a details widget, specified
+      // either via #type or #theme_wrappers (eg Entity Browser or Address
+      // fields). Drupal's details.html.twig does not support #label_prefix,
+      // so we use #description instead, but be careful to not overwrite
+      // content when the #description is alread defined.
+      elseif ((!empty($item['widget']['#type']) && $item['widget']['#type'] == 'details') || (!empty($item['widget']['#theme_wrappers']) && $item['widget']['#theme_wrappers'][0] == 'details')) {
+        if (!empty($item['widget']['#description'])) {
+          $form[$key]['widget']['#description'] = $markup . $item['widget']['#description'];
+        } else {
+          $form[$key]['widget']['#description'] = $markup;
         }
-        elseif (isset($form[$key]['widget']['target_id']['#title'])) {
-          $form[$key]['widget']['target_id']['#label_suffix'] = $label_help_markup;
+      }
+
+      // Special case for containers whose first element is rendered as a
+      // details widget, specified either via #type or #theme_wrappers (eg
+      // Address fields). Drupal's details.html.twig does not support
+      // #label_prefix, so we use #description instead, but be careful to not
+      // overwrite content when the #description is alread defined.
+      elseif ((!empty($item['widget'][0]['#type']) && $item['widget'][0]['#type'] == 'details') || (!empty($item['widget'][0]['#theme_wrappers']) && $item['widget'][0]['#theme_wrappers'][0] == 'details')) {
+        if (!empty($item['widget'][0]['#description'])) {
+          $form[$key]['widget'][0]['#description'] = $markup . $item['widget'][0]['#description'];
+        } else {
+          $form[$key]['widget'][0]['#description'] = $markup;
         }
-        // One more for cshs module.
-//        elseif (isset($form[$key][$item['#language']][0]['tid'])) {
-//          $form[$key][$item['#language']][0]['tid']['#theme_options'] = $theme_option;
-//        }
       }
-      // Move comments to the top for other field forms that
-      // are specifically configured.
-      else {
-        $form[$key]['widget']['#label_suffix'] = $label_help_markup;
+
+      elseif (isset($item['widget'][0]['value'])) {
+        $form[$key]['widget'][0]['value']['#label_suffix'] = $markup;
       }
+
+      // Format used by cshs module.
+      elseif (isset($item['widget'][0]['target_id']['#title'])) {
+        $form[$key]['widget'][0]['target_id']['#label_suffix'] = $markup;
+      }
+      elseif (isset($item['widget'][0]['#title'])) {
+        $form[$key]['widget'][0]['#label_suffix'] = $markup;
+      }
+      elseif (isset($item['widget']['#title'])) {
+        $form[$key]['widget']['#label_suffix'] = $markup;
+      }
+      elseif (isset($item['widget']['target_id']['#title'])) {
+        $form[$key]['widget']['target_id']['#label_suffix'] = $markup;
+      }
+    }
+    // Move comments to the top for other field forms that
+    // are specifically configured.
+    else {
+      $form[$key]['widget']['#label_suffix'] = $markup;
     }
   }
 }
diff --git a/templates/label-help.html.twig b/templates/label-help.html.twig
new file mode 100644
index 0000000..f484276
--- /dev/null
+++ b/templates/label-help.html.twig
@@ -0,0 +1,12 @@
+{#
+/**
+ * @file
+ * Default theme implementation for the label help markup.
+ *
+ * Available variables:
+ * - content:  the content to display.
+ *
+ * @ingroup themeable
+ */
+#}
+<div class="description label-description">{{ content }}</div>
