diff --git a/config/schema/search_api_autocomplete.schema.yml b/config/schema/search_api_autocomplete.schema.yml
index e076750..c77f5cf 100644
--- a/config/schema/search_api_autocomplete.schema.yml
+++ b/config/schema/search_api_autocomplete.schema.yml
@@ -105,6 +105,9 @@ plugin.plugin_configuration.search_api_autocomplete_suggester.live_results:
     suggest_keys:
       type: boolean
       label: 'Whether to suggest keywords instead of result links'
+    group_suggestions_by_field:
+      type: string
+      label: 'The field to group the suggestions by in the autocomplete results'  
     view_modes:
       type: sequence
       label: 'The view modes to use for displaying results'
diff --git a/css/search_api_autocomplete.css b/css/search_api_autocomplete.css
index cb406a0..c629c3d 100644
--- a/css/search_api_autocomplete.css
+++ b/css/search_api_autocomplete.css
@@ -10,6 +10,15 @@
   border: 0;
 }
 
+.search-api-autocomplete-search .ui-autocomplete-group.ui-menu-divider {
+  font-size: 16px;
+  height: auto;
+  font-weight: bold;
+  padding: 0.2em 0.4em;
+  margin: 0.8em 0 0.2em;
+  line-height: 1.5;
+}
+
 .search-api-autocomplete-search .ui-menu-item-wrapper.ui-state-active .search-api-autocomplete-suggestion {
   color: #FFF;
   background: #0072B9;
diff --git a/js/search_api_autocomplete.js b/js/search_api_autocomplete.js
index 2944758..8d0fcf0 100644
--- a/js/search_api_autocomplete.js
+++ b/js/search_api_autocomplete.js
@@ -62,6 +62,30 @@
         if (!uiAutocomplete) {
           return;
         }
+
+        uiAutocomplete.widget().menu("option", "items", "> :not(.ui-autocomplete-group)");
+
+        uiAutocomplete._renderMenu = function(ul, items) {
+          var that = this;
+          var currentGroup = '';
+
+          $.each(items, function(index, item) {
+            var li;
+            if (typeof item.group === 'undefined' || item.group == null) {
+              item.group = '';
+            }
+
+            if (item.group !== currentGroup) {
+              ul.append("<li class='ui-autocomplete-group ui-menu-divider' aria-label='" + item.group + "'>" + item.group + "</li>");
+              currentGroup = item.group;
+            }
+            li = that._renderItemData(ul, item);
+            if (item.group) {
+              li.attr("aria-label", item.group + " : " + item.value);
+            }
+          });
+        };
+
         const $element = uiAutocomplete.menu.element;
         $element.data('search-api-autocomplete-input-id', this.id);
         $element.addClass('search-api-autocomplete-search');
diff --git a/search_api_autocomplete.module b/search_api_autocomplete.module
index d59cca5..6f418a8 100644
--- a/search_api_autocomplete.module
+++ b/search_api_autocomplete.module
@@ -25,6 +25,7 @@ function search_api_autocomplete_theme() {
     'variables' => [
       'keys' => NULL,
       'url' => NULL,
+      'group' => NULL,
       'label' => NULL,
       'note' => NULL,
       'results_count' => NULL,
diff --git a/src/Controller/AutocompleteController.php b/src/Controller/AutocompleteController.php
index d2bd4a2..9ea4b4d 100644
--- a/src/Controller/AutocompleteController.php
+++ b/src/Controller/AutocompleteController.php
@@ -182,12 +182,14 @@ class AutocompleteController extends ControllerBase implements ContainerInjectio
               'value' => $trimmed_label,
               'url' => $url,
               'label' => $label,
+              'group' => $suggestion->getGroupLabel(),
             ];
           }
           else {
             $matches[] = [
               'value' => trim($suggestion->getSuggestedKeys()),
               'label' => $label,
+              'group' => $suggestion->getGroupLabel(),
             ];
           }
         }
diff --git a/src/Plugin/search_api_autocomplete/suggester/LiveResults.php b/src/Plugin/search_api_autocomplete/suggester/LiveResults.php
index 36c1df5..9e8d751 100644
--- a/src/Plugin/search_api_autocomplete/suggester/LiveResults.php
+++ b/src/Plugin/search_api_autocomplete/suggester/LiveResults.php
@@ -127,6 +127,7 @@ class LiveResults extends SuggesterPluginBase implements PluginFormInterface {
         'field' => '',
       ],
       'suggest_keys' => FALSE,
+      'group_suggestions_by_field' => '',
       'view_modes' => [],
     ];
   }
@@ -161,6 +162,14 @@ class LiveResults extends SuggesterPluginBase implements PluginFormInterface {
       '#description' => $this->t('By default, the found results will be displayed to the visitor as links to those results. When this option is enabled, the label of the result will be instead presented as a suggestion for search keywords.'),
     ];
 
+    $form['group_suggestions_by_field'] = [
+      '#type' => 'select',
+      '#title' => $this->t('Group suggestions by field'),
+      '#options' => ['' => $this->t('- None -')] + $options,
+      '#default_value' => $this->configuration['group_suggestions_by_field'],
+      '#description' => $this->t('Select the field to group the suggestions by in the autocomplete results. See <a href="https://jqueryui.com/autocomplete/#categories">here</a> for more details.'),
+    ];
+
     $form['view_modes'] = [
       '#type' => 'fieldset',
       '#title' => $this->t('View modes'),
@@ -331,6 +340,7 @@ class LiveResults extends SuggesterPluginBase implements PluginFormInterface {
     $suggestions = [];
     $view_modes = $this->configuration['view_modes'];
     $suggest_keys = $this->configuration['suggest_keys'];
+    $group_suggestions_field = $this->configuration['group_suggestions_by_field'] ?: NULL;
     $highlight_field = NULL;
     if ($this->isHighlightingEnabled()) {
       $highlight_field = $this->configuration['highlight']['field'];
@@ -366,6 +376,13 @@ class LiveResults extends SuggesterPluginBase implements PluginFormInterface {
 
       $datasource_id = $item->getDatasourceId();
       $bundle = $datasource->getItemBundle($object);
+      // If the suggestions should be grouped by a field, get the label of the
+      // group for this result item.
+      $group_label = NULL;
+      if ($group_suggestions_field) {
+        $group_label = $item->getField($group_suggestions_field)->getValues()[0];
+      }
+
       // Use highlighted field, if configured.
       if ($highlight_field) {
         $highlighted_fields = $item->getExtraData('highlighted_fields');
@@ -374,7 +391,7 @@ class LiveResults extends SuggesterPluginBase implements PluginFormInterface {
             '#type' => 'markup',
             '#markup' => Xss::filterAdmin($highlighted_fields[$highlight_field][0]),
           ];
-          $suggestions[] = $factory->createUrlSuggestion($url, NULL, $highlighted_field);
+          $suggestions[] = $factory->createUrlSuggestion($url, NULL, $highlighted_field, $group_label);
           continue;
         }
       }
@@ -383,13 +400,13 @@ class LiveResults extends SuggesterPluginBase implements PluginFormInterface {
         // Return the item label as suggested keywords, if one can be retrieved.
         $label = $datasource->getItemLabel($object);
         if ($label) {
-          $suggestions[] = $factory->createFromSuggestedKeys($label);
+          $suggestions[] = $factory->createFromSuggestedKeys($label, NULL, $group_label);
         }
       }
       elseif (empty($view_modes[$datasource_id][$bundle])) {
         // If no view mode was selected for this bundle, just use the label.
         $label = $datasource->getItemLabel($object);
-        $suggestions[] = $factory->createUrlSuggestion($url, $label);
+        $suggestions[] = $factory->createUrlSuggestion($url, $label, NULL, $group_label);
       }
       else {
         $view_mode = $view_modes[$datasource_id][$bundle];
@@ -398,10 +415,14 @@ class LiveResults extends SuggesterPluginBase implements PluginFormInterface {
           // Add the excerpt to the render array to allow adding it to view
           // modes.
           $render['#search_api_excerpt'] = $item->getExcerpt();
-          $suggestions[] = $factory->createUrlSuggestion($url, NULL, $render);
+          $suggestions[] = $factory->createUrlSuggestion($url, NULL, $render, $group_label);
         }
       }
     }
+    // Sort the suggestions by the group label field.
+    if ($group_suggestions_field) {
+      $suggestions = $factory->sortSuggestionsByGroup($suggestions);
+    }
 
     return $suggestions;
   }
diff --git a/src/Suggestion/Suggestion.php b/src/Suggestion/Suggestion.php
index 887b14f..5fbb1bc 100644
--- a/src/Suggestion/Suggestion.php
+++ b/src/Suggestion/Suggestion.php
@@ -37,6 +37,13 @@ class Suggestion implements SuggestionInterface {
    */
   protected $label;
 
+  /**
+   * The label of the group to group the suggestion by.
+   *
+   * @var string|null
+   */
+  protected $groupLabel;
+
   /**
    * A suggested prefix for the entered input.
    *
@@ -83,6 +90,8 @@ class Suggestion implements SuggestionInterface {
    *   (optional) The prefix for the suggestion.
    * @param string|null $label
    *   (optional) The label for the suggestion.
+   * @param string|null $group_label
+   *   (optional) The label of the group to group the suggestion by.
    * @param string|null $suggestion_prefix
    *   (optional) The suggested prefix.
    * @param string|null $user_input
@@ -94,11 +103,12 @@ class Suggestion implements SuggestionInterface {
    * @param array|null $render
    *   (optional) The render array.
    */
-  public function __construct($suggested_keys = NULL, Url $url = NULL, $prefix = NULL, $label = NULL, $suggestion_prefix = NULL, $user_input = NULL, $suggestion_suffix = NULL, $results_count = NULL, array $render = NULL) {
+  public function __construct($suggested_keys = NULL, Url $url = NULL, $prefix = NULL, $label = NULL, $group_label = NULL, $suggestion_prefix = NULL, $user_input = NULL, $suggestion_suffix = NULL, $results_count = NULL, array $render = NULL) {
     $this->suggestedKeys = $suggested_keys;
     $this->url = $url;
     $this->prefix = $prefix;
     $this->label = $label;
+    $this->groupLabel = $group_label;
     $this->suggestionPrefix = $suggestion_prefix;
     $this->userInput = $user_input;
     $this->suggestionSuffix = $suggestion_suffix;
@@ -140,6 +150,13 @@ class Suggestion implements SuggestionInterface {
     return $this->label;
   }
 
+  /**
+   * {@inheritdoc}
+   */
+  public function getGroupLabel() {
+    return $this->groupLabel;
+  }
+
   /**
    * {@inheritdoc}
    */
@@ -207,6 +224,15 @@ class Suggestion implements SuggestionInterface {
     return $this;
   }
 
+  /**
+   * {@inheritdoc}
+   */
+  public function setGroupLabel($group_label) {
+    $this->groupLabel = $group_label;
+    return $this;
+  }
+    
+
   /**
    * {@inheritdoc}
    */
@@ -258,6 +284,7 @@ class Suggestion implements SuggestionInterface {
       '#theme' => 'search_api_autocomplete_suggestion',
       '#keys' => $this->getSuggestedKeys(),
       '#url' => $this->getUrl(),
+      '#group' => $this->getGroupLabel(),
       '#note' => $this->getPrefix(),
       '#label' => $this->getLabel(),
       '#results_count' => $this->getResultsCount(),
diff --git a/src/Suggestion/SuggestionFactory.php b/src/Suggestion/SuggestionFactory.php
index 131adfb..32044e0 100644
--- a/src/Suggestion/SuggestionFactory.php
+++ b/src/Suggestion/SuggestionFactory.php
@@ -35,11 +35,13 @@ class SuggestionFactory {
    *   The suggested keywords.
    * @param int|null $results_count
    *   (optional) The estimated number of results.
+   * @param string|null $group_label
+   *   (optional) The label of the group to group the suggestion by.
    *
    * @return \Drupal\search_api_autocomplete\Suggestion\SuggestionInterface
    *   An autocomplete suggestion.
    */
-  public function createFromSuggestedKeys($suggested_keys, $results_count = NULL) {
+  public function createFromSuggestedKeys($suggested_keys, $results_count = NULL, $group_label = NULL) {
     $suggestion = new Suggestion($suggested_keys);
 
     $lowercase_input = mb_strtolower($this->userInput);
@@ -65,6 +67,9 @@ class SuggestionFactory {
     if ($results_count !== NULL) {
       $suggestion->setResultsCount($results_count);
     }
+    if ($group_label !== NULL) {
+      $suggestion->setGroupLabel($group_label);
+    }
 
     return $suggestion;
   }
@@ -76,11 +81,13 @@ class SuggestionFactory {
    *   The suggestion suffix.
    * @param int|null $results_count
    *   (optional) The estimated number of results.
+   * @param string|null $group_label
+   *   (optional) The label of the group to group the suggestion by.
    *
    * @return \Drupal\search_api_autocomplete\Suggestion\SuggestionInterface
    *   An autocomplete suggestion.
    */
-  public function createFromSuggestionSuffix($suggestion_suffix, $results_count = NULL) {
+  public function createFromSuggestionSuffix($suggestion_suffix, $results_count = NULL, $group_label = NULL) {
     $suggestion = new Suggestion();
 
     $suggestion->setUserInput($this->userInput);
@@ -88,6 +95,9 @@ class SuggestionFactory {
     if ($results_count !== NULL) {
       $suggestion->setResultsCount($results_count);
     }
+    if ($group_label !== NULL) {
+      $suggestion->setGroupLabel($group_label);
+    }
 
     return $suggestion;
   }
@@ -102,11 +112,13 @@ class SuggestionFactory {
    *   $render isn't given.
    * @param array|null $render
    *   (optional) The render array that should be displayed for this suggestion.
+   * @param string|null $group_label
+   *   (optional) The label of the group to group the suggestion by.
    *
    * @return \Drupal\search_api_autocomplete\Suggestion\SuggestionInterface
    *   An autocomplete suggestion.
    */
-  public function createUrlSuggestion(Url $url, $label = NULL, array $render = NULL) {
+  public function createUrlSuggestion(Url $url, $label = NULL, array $render = NULL, $group_label = NULL) {
     $suggestion = new Suggestion(NULL, $url);
 
     if ($label !== NULL) {
@@ -115,8 +127,28 @@ class SuggestionFactory {
     if ($render !== NULL) {
       $suggestion->setRender($render);
     }
+    if ($group_label !== NULL) {
+      $suggestion->setGroupLabel($group_label);
+    }
 
     return $suggestion;
   }
 
+  /**
+   * Sort the suggestions by the group label.
+   *
+   * @param array $suggestions
+   *   An array of suggestions.
+   *
+   * @return array
+   *   The sorted suggestions.
+   */
+  public function sortSuggestionsByGroup(array $suggestions): array {
+    usort($suggestions, function ($a, $b) {
+      return strcmp($a->getGroupLabel(), $b->getGroupLabel());
+    });
+
+    return $suggestions;
+  }  
+
 }
diff --git a/src/Suggestion/SuggestionInterface.php b/src/Suggestion/SuggestionInterface.php
index 72cb74e..2c3bc3a 100644
--- a/src/Suggestion/SuggestionInterface.php
+++ b/src/Suggestion/SuggestionInterface.php
@@ -53,6 +53,14 @@ interface SuggestionInterface extends RenderableInterface {
    */
   public function getLabel();
 
+  /**
+   * Retrieves the label of the group to group the suggestion by.
+   *
+   * @return string
+   *   The suggestion's group label.
+   */
+  public function getGroupLabel();
+
   /**
    * Retrieves the prefix suggested for the entered keys.
    *
@@ -137,6 +145,16 @@ interface SuggestionInterface extends RenderableInterface {
    */
   public function setLabel($label);
 
+  /**
+   * Sets the label of the group to group the suggestion by.
+   *
+   * @param string|null $group_label
+   *   The new group label.
+   *
+   * @return $this
+   */
+  public function setGroupLabel($group_label);
+
   /**
    * Sets the suggestion prefix.
    *
diff --git a/templates/search-api-autocomplete-suggestion.html.twig b/templates/search-api-autocomplete-suggestion.html.twig
index 36a92a5..5b5dda3 100644
--- a/templates/search-api-autocomplete-suggestion.html.twig
+++ b/templates/search-api-autocomplete-suggestion.html.twig
@@ -30,6 +30,9 @@
   {% if note %}
     <span class="autocomplete-suggestion-note">{{ note }}</span>
   {% endif %}
+  {% if group %}
+    <span class="autocomplete-suggestion-group" style="display: none">{{ group }}</span>
+  {% endif %}
   {% if label %}
     <span class="autocomplete-suggestion-label">{{ label }}</span>
   {% endif %}
