diff --git a/composer.json b/composer.json
index ff26cc96..c514441d 100644
--- a/composer.json
+++ b/composer.json
@@ -9,7 +9,8 @@
   "require-dev": {
     "drupal/devel": "5.x-dev",
     "drupal/classy": "^1.0",
-    "drupal/stable": "^2.0"
+    "drupal/stable": "^2.0",
+    "drupal/field_group": "3.x-dev"
   },
   "authors": [
     {
diff --git a/ds.info.yml b/ds.info.yml
index de318d1d..88cbb119 100644
--- a/ds.info.yml
+++ b/ds.info.yml
@@ -8,4 +8,5 @@ dependencies:
   - drupal:layout_discovery
 test_dependencies:
   - classy:classy
-  - stable:stable
\ No newline at end of file
+  - stable:stable
+  - field_group:field_group
\ No newline at end of file
diff --git a/ds.module b/ds.module
index f9bdf0c6..a474447a 100644
--- a/ds.module
+++ b/ds.module
@@ -106,11 +106,6 @@ function ds_theme_registry_alter(&$theme_registry) {
     }
   }
 
-  // Run field group preprocess before ds_entity_view.
-  /*if (function_exists('field_group_build_entity_groups')) {
-    array_unshift($theme_registry['ds_entity_view']['preprocess functions'], 'field_group_build_entity_groups');
-  }*/
-
   // Remove ds_preprocess_field in case field templates is not enabled.
   if (!\Drupal::config('ds.settings')->get('field_template')) {
     $key = array_search('ds_preprocess_field', $theme_registry['field']['preprocess functions']);
@@ -143,6 +138,13 @@ function ds_module_implements_alter(&$implementations, $hook) {
   if ($hook == 'entity_view_display_alter') {
     unset($implementations['node']);
   }
+
+  // Make sure that we are after field_group for entity_view_alter.
+  if ($hook == 'entity_view_alter') {
+    $group = $implementations['ds'];
+    unset($implementations['ds']);
+    $implementations['ds'] = $group;
+  }
 }
 
 /**
diff --git a/modules/ds_extras/ds_extras.module b/modules/ds_extras/ds_extras.module
index 35768734..a3fe5621 100644
--- a/modules/ds_extras/ds_extras.module
+++ b/modules/ds_extras/ds_extras.module
@@ -28,19 +28,6 @@ function ds_extras_layout_alter(&$definitions) {
   }
 }
 
-/**
- * Implements hook_module_implements_alter().
- */
-function ds_extras_module_implements_alter(&$implementations, $hook) {
-  // Extra fields.
-  $extra_fields_hooks = [
-    'field_extra_fields',
-  ];
-  if (!\Drupal::config('ds_extras.settings')->get('fields_extra') && in_array($hook, $extra_fields_hooks)) {
-    unset($implementations['ds_extras']);
-  }
-}
-
 /**
  * Implements hook_form_FORM_ID_alter().
  */
diff --git a/src/EntityViewAlter.php b/src/EntityViewAlter.php
index 106ad849..886ae5a0 100644
--- a/src/EntityViewAlter.php
+++ b/src/EntityViewAlter.php
@@ -6,6 +6,8 @@ use Drupal\Core\Cache\CacheableMetadata;
 use Drupal\Core\Entity\Display\EntityDisplayInterface;
 use Drupal\Core\Entity\EntityInterface;
 use Drupal\Core\Render\Element;
+use Drupal\Core\Site\Settings;
+use Drupal\field_group\FormatterHelper;
 
 class EntityViewAlter implements EntityViewAlterInterface {
 
@@ -78,8 +80,8 @@ class EntityViewAlter implements EntityViewAlterInterface {
 
     $this->addDsFields($build, $entity, $bundle, $view_mode, $display, $manage_display_settings, $field_permissions);
     $this->implementUiLimit($build, $display);
+    $this->buildFieldGroups($build, $entity, $display);
     $this->moveFieldsIntoRegions($build, $manage_display_settings);
-
   }
 
   /**
@@ -236,6 +238,32 @@ class EntityViewAlter implements EntityViewAlterInterface {
         }
       }
     }
+  }
+
+  /**
+   * Build Field Groups, if any.
+   *
+   * @param $build
+   * @param \Drupal\Core\Entity\EntityInterface $entity
+   * @param \Drupal\Core\Entity\Display\EntityDisplayInterface $display
+   */
+  protected function buildFieldGroups(&$build, EntityInterface $entity, EntityDisplayInterface $display) {
+    if (\Drupal::moduleHandler()->moduleExists('field_group')) {
 
+      // There's a chance field_attach_groups hasn't been called yet. Not 100%
+      // sure why that happens, but might be due to the following core bug:
+      // https://www.drupal.org/project/drupal/issues/3120298
+      // Manual testing is fine, but FieldGroupTest didn't work at all, so
+      // we manually call it here. It's wrapped in a setting where the default
+      // value comes from \Drupal::state('ds_call_field_group_attach');
+      // which returns FALSE by default, but is set to TRUE in the test.
+      $ds_call_field_group_attach_default = \Drupal::state()->get('ds_call_field_group_attach', FALSE);
+      if (Settings::get('ds_call_field_group_attach', $ds_call_field_group_attach_default)) {
+        field_group_entity_view_alter($build, $entity, $display);
+      }
+
+      field_group_build_entity_groups($build);
+    }
   }
+
 }
\ No newline at end of file
diff --git a/tests/src/Functional/FieldGroupTest.php b/tests/src/Functional/FieldGroupTest.php
index 0aa38a70..0696e0a8 100644
--- a/tests/src/Functional/FieldGroupTest.php
+++ b/tests/src/Functional/FieldGroupTest.php
@@ -7,26 +7,22 @@ use Drupal\Tests\field_group\Functional\FieldGroupTestTrait;
 /**
  * Tests for field group integration with Display Suite.
  *
- * @group ds_disabled
+ * @group ds_single
  */
 class FieldGroupTest extends TestBase {
 
-  //use FieldGroupTestTrait;
+  use FieldGroupTestTrait;
+
+  protected function setUp(): void {
+    parent::setUp();
+    \Drupal::state()->set('ds_call_field_group_attach', TRUE);
+  }
 
   /**
    * Test tabs.
    */
   public function testFieldPlugin() {
 
-    // add
-    // "drupal/field_group": "3.x-dev",
-    // to composer.json to bring it back
-    // and
-    // test_dependencies:
-    //  - field_group:field_group
-    // in ds.info.yml
-    return;
-
     // Create a node.
     $settings = ['type' => 'article', 'promote' => 1];
     $node = $this->drupalCreateNode($settings);
diff --git a/tests/src/Functional/TestBase.php b/tests/src/Functional/TestBase.php
index 6a59bda2..45ea050b 100644
--- a/tests/src/Functional/TestBase.php
+++ b/tests/src/Functional/TestBase.php
@@ -37,12 +37,12 @@ abstract class TestBase extends BrowserTestBase {
     'field_ui',
     'taxonomy',
     'block',
+    'field_group',
     'ds',
     'ds_extras',
     'ds_test',
     'ds_switch_view_mode',
     'layout_discovery',
-    //'field_group',
   ];
 
   /**
