diff --git a/src/Form/CategoryForm.php b/src/Form/CategoryForm.php
index 2a80113..78d6ffc 100644
--- a/src/Form/CategoryForm.php
+++ b/src/Form/CategoryForm.php
@@ -94,6 +94,25 @@ class CategoryForm extends EntityForm {
   /**
    * {@inheritdoc}
    */
+  public function validateForm(array &$form, FormStateInterface $form_state) {
+    $recipients_chosen = FALSE;
+    $mass_contact_category = $this->entity;
+    foreach ($this->groupingMethodManager->getDefinitions() as $definition) {
+      if (!$plugin = $mass_contact_category->getGroupingCategories($definition['id'])) {
+        $plugin = $this->groupingMethodManager->createInstance($definition['id'], []);
+      }
+      if ($form['recipients'][$plugin->getPluginId()]['categories']['#value']) {
+        $recipients_chosen = TRUE;
+      }
+    }
+    if (!($recipients_chosen)) {
+      $form_state->setErrorByName('', $this->t('At least one recipient is required.'), 'error');
+    }
+  }
+
+  /**
+   * {@inheritdoc}
+   */
   public function save(array $form, FormStateInterface $form_state) {
     /** @var \Drupal\mass_contact\Entity\MassContactCategoryInterface $mass_contact_category */
     $mass_contact_category = $this->entity;
diff --git a/src/MassContact.php b/src/MassContact.php
index 2fd26d6..641dcd8 100644
--- a/src/MassContact.php
+++ b/src/MassContact.php
@@ -231,10 +231,16 @@ class MassContact implements MassContactInterface {
     $recipients = [];
     if (!empty($categories)) {
       foreach ($categories as $category) {
+        $category_recipients = [];
         foreach ($category->getRecipients() as $plugin_id => $config) {
           $grouping = $category->getGroupingCategories($plugin_id);
-          $recipients += $grouping->getRecipients($config['categories']);
+          if (!empty($config['categories'])) {
+            // Only If values were chosen for this grouping in this category,
+            // we gather recipients.
+            $category_recipients[$plugin_id] = $grouping->getRecipients($config['categories']);
+          }
         }
+        $recipients += count($category_recipients) > 1 ? call_user_func_array('array_intersect', $category_recipients) : reset($category_recipients);
       }
 
       // Filter out users that have opted out only if sender has chosen to
diff --git a/src/Plugin/MassContact/GroupingMethod/Role.php b/src/Plugin/MassContact/GroupingMethod/Role.php
index f3ef7f6..113bc02 100644
--- a/src/Plugin/MassContact/GroupingMethod/Role.php
+++ b/src/Plugin/MassContact/GroupingMethod/Role.php
@@ -146,7 +146,7 @@ class Role extends GroupingBase implements ContainerFactoryPluginInterface {
         'OR' => $this->t('Any'),
         'AND' => $this->t('All'),
       ],
-      '#description' => $this->t('Choose <em>any</em> to return recipients with any of the categories, choose <em>all</em> to return recipients matching all of the categories.'),
+      '#description' => $this->t('Choose <em>any</em> to return recipients with any of the roles, choose <em>all</em> to return recipients with all of the roles.'),
       '#default_value' => $this->configuration['conjunction'],
     ];
   }
diff --git a/tests/src/Functional/Form/CategoryFormTest.php b/tests/src/Functional/Form/CategoryFormTest.php
index ff61732..3535188 100644
--- a/tests/src/Functional/Form/CategoryFormTest.php
+++ b/tests/src/Functional/Form/CategoryFormTest.php
@@ -28,12 +28,15 @@ class CategoryFormTest extends MassContactTestBase {
     $this->assertSession()->addressEquals('/admin/config/mass-contact');
 
     $this->assertSession()->linkExists(t('Categories'));
-    $this->assertSession()->linkByHrefExists('/admin/config/mass-contact/settings');
+    $this->assertSession()
+      ->linkByHrefExists('/admin/config/mass-contact/settings');
     $this->clickLink(t('Categories'));
-    $this->assertSession()->addressEquals('/admin/config/mass-contact/category');
+    $this->assertSession()
+      ->addressEquals('/admin/config/mass-contact/category');
     $this->assertSession()->linkExists(t('Add category'));
     $this->clickLink(t('Add category'));
-    $this->assertSession()->addressEquals('/admin/config/mass-contact/category/add');
+    $this->assertSession()
+      ->addressEquals('/admin/config/mass-contact/category/add');
 
     // Create a category via the UI.
     $edit = [
@@ -67,7 +70,9 @@ class CategoryFormTest extends MassContactTestBase {
     $edit['recipients[role][conjunction]'] = 'OR';
     $this->drupalPostForm(NULL, $edit, t('Save'));
 
-    \Drupal::entityTypeManager()->getStorage('mass_contact_category')->resetCache();
+    \Drupal::entityTypeManager()
+      ->getStorage('mass_contact_category')
+      ->resetCache();
     /** @var \Drupal\mass_contact\Entity\MassContactCategoryInterface $category */
     $category = MassContactCategory::load($edit['id']);
     $this->assertEquals($edit['label'], $category->label());
@@ -81,6 +86,17 @@ class CategoryFormTest extends MassContactTestBase {
       'conjunction' => 'OR',
     ];
     $this->assertEquals($expected, $category->getRecipients()['role']);
+
+    // Test that when no recipients are selected, a validation error is thrown.
+    $this->drupalGet('/admin/config/mass-contact/category/add');
+    // Create a category via the UI.
+    $edit = [
+      'id' => Unicode::strtolower($this->randomMachineName()),
+      'label' => $this->randomString(),
+    ];
+    $this->drupalPostForm(NULL, $edit, t('Save'));
+    $this->assertSession()
+      ->pageTextContains('At least one recipient is required.');
   }
 
-}
+}
\ No newline at end of file
