diff --git a/app/controllers/groups_controller.rb b/app/controllers/groups_controller.rb
index 01c8fa2739f363240e96f772a3e3662d92263c89..b61f4e9a2db408f6348e05a01f3c4f10bc01f9cf 100644
--- a/app/controllers/groups_controller.rb
+++ b/app/controllers/groups_controller.rb
@@ -42,6 +42,8 @@ def show
       @notification_setting = current_user.notification_settings_for(group)
     end
 
+    @nested_groups = group.children
+
     setup_projects
 
     respond_to do |format|
diff --git a/app/services/groups/create_service.rb b/app/services/groups/create_service.rb
index 2bccd584dde1e4c5eb023ba0d5248bc547db862d..febeb661fb5f3bb5622a5c06591e19d223dde4df 100644
--- a/app/services/groups/create_service.rb
+++ b/app/services/groups/create_service.rb
@@ -12,6 +12,13 @@ def execute
         return @group
       end
 
+      if @group.parent && !can?(current_user, :admin_group, @group.parent)
+        @group.parent = nil
+        @group.errors.add(:parent_id, 'manage access required to create subgroup')
+
+        return @group
+      end
+
       @group.name ||= @group.path.dup
       @group.save
       @group.add_owner(current_user)
diff --git a/app/views/groups/show.html.haml b/app/views/groups/show.html.haml
index 52ce26a20b1fbf367df797f5361836b17d0c0ff6..9ef88f233c54d1d84124abcd2108f491ad022c48 100644
--- a/app/views/groups/show.html.haml
+++ b/app/views/groups/show.html.haml
@@ -32,6 +32,10 @@
         %li
           = link_to "#shared", 'data-toggle' => 'tab' do
             Shared Projects
+      - if @nested_groups.present?
+        %li
+          = link_to "#groups", 'data-toggle' => 'tab' do
+            Subgroups
     .nav-controls
       = form_tag request.path, method: :get, class: 'project-filter-form', id: 'project-filter-form' do |f|
         = search_field_tag :filter_projects, nil, placeholder: 'Filter by name', class: 'projects-list-filter form-control', spellcheck: false
@@ -47,3 +51,8 @@
     - if @shared_projects.present?
       .tab-pane#shared
         = render "shared_projects", projects: @shared_projects
+
+    - if @nested_groups.present?
+      .tab-pane#groups
+        %ul.content-list
+          = render partial: 'shared/groups/group', collection: @nested_groups
diff --git a/changelogs/unreleased/dz-nested-group-misc.yml b/changelogs/unreleased/dz-nested-group-misc.yml
new file mode 100644
index 0000000000000000000000000000000000000000..9c9d0b1c644afd52fe81fcb7fd79f3e83cd4b275
--- /dev/null
+++ b/changelogs/unreleased/dz-nested-group-misc.yml
@@ -0,0 +1,4 @@
+---
+title: Show nested groups tab on group page
+merge_request: 8308
+author:
diff --git a/spec/features/groups_spec.rb b/spec/features/groups_spec.rb
index 4b19886274e0e537faa5818b255914c70ede767d..a515c92db3795da7a8ba8031a2a054d2a71614ea 100644
--- a/spec/features/groups_spec.rb
+++ b/spec/features/groups_spec.rb
@@ -107,4 +107,17 @@
       expect(page).to have_css('.group-home-desc a[rel]')
     end
   end
+
+  describe 'group page with nested groups', js: true do
+    let!(:group) { create(:group) }
+    let!(:nested_group) { create(:group, parent: group) }
+    let!(:path)  { group_path(group) }
+
+    it 'has nested groups tab with nested groups inside' do
+      visit path
+      click_link 'Subgroups'
+
+      expect(page).to have_content(nested_group.full_name)
+    end
+  end
 end
diff --git a/spec/services/groups/create_service_spec.rb b/spec/services/groups/create_service_spec.rb
index 71a0b8e2a12b03c580f84a293e2eb01e2acef5a7..14717a7455d3de3d56ea5709b00ec163b55b5e65 100644
--- a/spec/services/groups/create_service_spec.rb
+++ b/spec/services/groups/create_service_spec.rb
@@ -1,11 +1,12 @@
 require 'spec_helper'
 
-describe Groups::CreateService, services: true do
-  let!(:user)         { create(:user) }
+describe Groups::CreateService, '#execute', services: true do
+  let!(:user) { create(:user) }
   let!(:group_params) { { path: "group_path", visibility_level: Gitlab::VisibilityLevel::PUBLIC } }
 
-  describe "execute" do
-    let!(:service) { described_class.new(user, group_params ) }
+  describe 'visibility level restrictions' do
+    let!(:service) { described_class.new(user, group_params) }
+
     subject { service.execute }
 
     context "create groups without restricted visibility level" do
@@ -14,7 +15,29 @@
 
     context "cannot create group with restricted visibility level" do
       before { allow_any_instance_of(ApplicationSetting).to receive(:restricted_visibility_levels).and_return([Gitlab::VisibilityLevel::PUBLIC]) }
+
       it { is_expected.not_to be_persisted }
     end
   end
+
+  describe 'creating subgroup' do
+    let!(:group) { create(:group) }
+    let!(:service) { described_class.new(user, group_params.merge(parent_id: group.id)) }
+
+    subject { service.execute }
+
+    context 'as group owner' do
+      before { group.add_owner(user) }
+
+      it { is_expected.to be_persisted }
+    end
+
+    context 'as guest' do
+      it 'does not save group and returns an error' do
+        is_expected.not_to be_persisted
+        expect(subject.errors[:parent_id].first).to eq('manage access required to create subgroup')
+        expect(subject.parent_id).to be_nil
+      end
+    end
+  end
 end