diff --git a/app/models/tag_group.rb b/app/models/tag_group.rb
index 1fd5711f820..cf83c9ff2da 100644
--- a/app/models/tag_group.rb
+++ b/app/models/tag_group.rb
@@ -13,6 +13,7 @@ class TagGroup < ActiveRecord::Base
 
   before_create :init_permissions
   before_save :apply_permissions
+  before_save :remove_parent_from_group
 
   after_commit { DiscourseTagging.clear_cache! }
 
@@ -73,6 +74,10 @@ class TagGroup < ActiveRecord::Base
     end
   end
 
+  def remove_parent_from_group
+    tags.delete(parent_tag) if tags.include?(parent_tag)
+  end
+
   def self.visible(guardian)
     if guardian.is_staff?
       TagGroup
diff --git a/spec/models/tag_group_spec.rb b/spec/models/tag_group_spec.rb
index f1261943791..bfca9d3b354 100644
--- a/spec/models/tag_group_spec.rb
+++ b/spec/models/tag_group_spec.rb
@@ -101,6 +101,22 @@ describe TagGroup do
       expect_same_tag_names(tag_group.reload.tags, [tag, 'new-tag'])
     end
 
+    it "removes parent tag as group member" do
+      parent = Fabricate(:tag)
+      tag_group.tags = [tag, parent]
+      tag_group.update!(parent_tag: parent)
+      tag_group.reload
+      expect_same_tag_names(tag_group.tags, [tag])
+      expect_same_tag_names([tag_group.parent_tag], [parent])
+    end
+
+    it "removes parent tag as group member when creating the group" do
+      parent = Fabricate(:tag)
+      tg = Fabricate(:tag_group, tags: [tag, parent], parent_tag: parent)
+      expect_same_tag_names(tg.tags, [tag])
+      expect_same_tag_names([tg.parent_tag], [parent])
+    end
+
     context 'with synonyms' do
       fab!(:synonym) { Fabricate(:tag, name: 'synonym', target_tag: tag) }