diff --git a/shareholder_register.post_update.php b/shareholder_register.post_update.php
index 4bde995dd5cd682308d79ea454475c9158837558..f663b0d43a39930d4a2ff854d96066c4d0bfd078 100644
--- a/shareholder_register.post_update.php
+++ b/shareholder_register.post_update.php
@@ -7,6 +7,7 @@
 
 use Drupal\shareholder_register\Entity\Share;
 use Drupal\shareholder_register\Entity\ShareTransaction;
+use Drupal\shareholder_register\Entity\ShareTransactionGroup;
 use Drupal\shareholder_register\Entity\Shareholder;
 use Drupal\shareholder_register\Entity\ShareIssue;
 use Drupal\shareholder_register\Entity\ShareType;
@@ -182,3 +183,31 @@ function shareholder_register_post_update_load_request_shareholder_number_templa
     $config_storage->write('mail_template.template.mail_shareholder_number', $source->read('mail_template.template.mail_shareholder_number'));
   }
 }
+
+/**
+ * Create transaction groups for historical issue transactions without group.
+ */
+function shareholder_register_post_update_create_share_transaction_groups(&$sandbox) {
+  $invalid_transaction_ids = \Drupal::entityQuery('share_transaction')
+    ->condition('state', 'valid')
+    ->condition('transaction_group', FALSE, 'is null')
+    ->execute();
+  $count = 0;
+  if (count($invalid_transaction_ids)) {
+    foreach (ShareTransaction::loadMultiple($invalid_transaction_ids) as $t) {
+      if ($t->getQuantity() > 0) {
+        $group = ShareTransactionGroup::create([
+                   'type' => 'issue',
+                 ]);
+        $group->save();
+        $t->set('transaction_group', $group);
+        $t->save();
+
+        $count++;
+      }
+    }
+  }
+  if ($count) {
+    return "{$count} groups created";
+  }
+}