diff --git a/src/box/bootstrap.snap b/src/box/bootstrap.snap
index b1ec58e4174747b1135ff6841e2fc8b1a7c99e19..85579a7c1fa829b6739a333bbd8003d8ab6b4858 100644
Binary files a/src/box/bootstrap.snap and b/src/box/bootstrap.snap differ
diff --git a/src/box/lua/upgrade.lua b/src/box/lua/upgrade.lua
index eb5efbc5f0dec31cc3be136291430c9f391f5626..dc328ba42564db933c55bb7539169210c5eb12d1 100644
--- a/src/box/lua/upgrade.lua
+++ b/src/box/lua/upgrade.lua
@@ -10,6 +10,10 @@ local ADMIN = 1
 local PUBLIC = 2
 -- role 'REPLICATION'
 local REPLICATION = 3
+-- role 'SUPER'
+-- choose a fancy id to not clash with any existing role or
+-- user during upgrade
+local SUPER = 31
 
 --------------------------------------------------------------------------------
 -- Utils
@@ -929,6 +933,11 @@ local function upgrade_to_1_7_7()
     --
     _priv:upsert({ADMIN, ADMIN, 'universe', 0, 4294967295},
                  {{ "|", 5, 4294967295}})
+    --
+    -- create role 'super' and grant it all privileges on universe
+    --
+    _user:replace{SUPER, ADMIN, 'super', 'role', setmap({})}
+    _priv:replace({ADMIN, SUPER, 'universe', 0, 4294967295})
 end
 
 local function get_version()
diff --git a/src/box/user.cc b/src/box/user.cc
index a0cbf4e981f716f10671ee4a652eea062d35d0be..7fa66da8f1c11d8a3a9d3d40b2b5cac265d6e201 100644
--- a/src/box/user.cc
+++ b/src/box/user.cc
@@ -408,20 +408,22 @@ user_cache_replace(struct user_def *def)
 void
 user_cache_delete(uint32_t uid)
 {
-	struct user *user = user_by_id(uid);
-	if (user) {
+	mh_int_t k = mh_i32ptr_find(user_registry, uid, NULL);
+	if (k != mh_end(user_registry)) {
+		struct user *user = (struct user *)
+			mh_i32ptr_node(user_registry, k)->val;
 		assert(user->auth_token > ADMIN);
 		auth_token_put(user->auth_token);
 		assert(user_map_is_empty(&user->roles));
 		assert(user_map_is_empty(&user->users));
+		user_destroy(user);
 		/*
 		 * Sic: we don't have to remove a deleted
 		 * user from users hash of roles, since
 		 * to drop a user, one has to revoke
 		 * all privileges from them first.
 		 */
-		user_destroy(user);
-		mh_i32ptr_del(user_registry, uid, NULL);
+		mh_i32ptr_del(user_registry, k, NULL);
 	}
 }
 
diff --git a/test/box-py/bootstrap.result b/test/box-py/bootstrap.result
index ae8fb487cb40f75ea78cdd663e83efd53a95e57e..5e51aa2ed481a8dd5664babeaca33f26b08df1b2 100644
--- a/test/box-py/bootstrap.result
+++ b/test/box-py/bootstrap.result
@@ -115,6 +115,7 @@ box.space._user:select{}
   - [1, 1, 'admin', 'user', {}]
   - [2, 1, 'public', 'role', {}]
   - [3, 1, 'replication', 'role', {}]
+  - [31, 1, 'super', 'role', {}]
 ...
 box.space._func:select{}
 ---
@@ -135,4 +136,5 @@ box.space._priv:select{}
   - [1, 2, 'space', 330, 2]
   - [1, 3, 'space', 320, 2]
   - [1, 3, 'universe', 0, 1]
+  - [1, 31, 'universe', 0, 4294967295]
 ...
diff --git a/test/box/access.result b/test/box/access.result
index 45d384519f7678da6c4ea57c9c888914c720358d..afbed171d415019b10cb98c831cb5a9533b3c2eb 100644
--- a/test/box/access.result
+++ b/test/box/access.result
@@ -95,7 +95,7 @@ end;
 ...
 usermax();
 ---
-- error: User 'user28' is not found
+- error: User 'user27' is not found
 ...
 test_run:cmd("setopt delimiter ''");
 ---
@@ -145,7 +145,7 @@ box.schema.user.disable("rich")
 ...
 box.space['_user']:delete{uid}
 ---
-- [5, 1, 'rich', 'user', {}]
+- [33, 1, 'rich', 'user', {}]
 ...
 box.schema.user.drop('test')
 ---
@@ -421,7 +421,7 @@ box.schema.user.create('user1')
 ...
 box.space._user.index.name:select{'user1'}
 ---
-- - [4, 1, 'user1', 'user', {}]
+- - [32, 1, 'user1', 'user', {}]
 ...
 session.su('user1')
 ---
@@ -434,14 +434,14 @@ session.su('admin')
 ...
 box.space._user.index.name:select{'user1'}
 ---
-- - [4, 1, 'user1', 'user', {'chap-sha1': 'CRO/LiziDOIb+xlhrxJNSSBFjl8='}]
+- - [32, 1, 'user1', 'user', {'chap-sha1': 'CRO/LiziDOIb+xlhrxJNSSBFjl8='}]
 ...
 box.schema.user.passwd('user1', 'extra_new_password')
 ---
 ...
 box.space._user.index.name:select{'user1'}
 ---
-- - [4, 1, 'user1', 'user', {'chap-sha1': 'nMc3F1oaUtz37IYbgGYYPZawmfE='}]
+- - [32, 1, 'user1', 'user', {'chap-sha1': 'nMc3F1oaUtz37IYbgGYYPZawmfE='}]
 ...
 box.schema.user.passwd('invalid_user', 'some_password')
 ---
@@ -484,8 +484,8 @@ box.schema.user.grant('user', 'read,write', 'universe')
 ...
 box.space._priv:select{id}
 ---
-- - [1, 4, 'role', 2, 4]
-  - [1, 4, 'universe', 0, 27]
+- - [1, 32, 'role', 2, 4]
+  - [1, 32, 'universe', 0, 27]
 ...
 box.schema.user.grant('user', 'read', 'universe')
 ---
@@ -493,40 +493,40 @@ box.schema.user.grant('user', 'read', 'universe')
 ...
 box.space._priv:select{id}
 ---
-- - [1, 4, 'role', 2, 4]
-  - [1, 4, 'universe', 0, 27]
+- - [1, 32, 'role', 2, 4]
+  - [1, 32, 'universe', 0, 27]
 ...
 box.schema.user.revoke('user', 'write', 'universe')
 ---
 ...
 box.space._priv:select{id}
 ---
-- - [1, 4, 'role', 2, 4]
-  - [1, 4, 'universe', 0, 25]
+- - [1, 32, 'role', 2, 4]
+  - [1, 32, 'universe', 0, 25]
 ...
 box.schema.user.revoke('user', 'read', 'universe')
 ---
 ...
 box.space._priv:select{id}
 ---
-- - [1, 4, 'role', 2, 4]
-  - [1, 4, 'universe', 0, 24]
+- - [1, 32, 'role', 2, 4]
+  - [1, 32, 'universe', 0, 24]
 ...
 box.schema.user.grant('user', 'write', 'universe')
 ---
 ...
 box.space._priv:select{id}
 ---
-- - [1, 4, 'role', 2, 4]
-  - [1, 4, 'universe', 0, 26]
+- - [1, 32, 'role', 2, 4]
+  - [1, 32, 'universe', 0, 26]
 ...
 box.schema.user.grant('user', 'read', 'universe')
 ---
 ...
 box.space._priv:select{id}
 ---
-- - [1, 4, 'role', 2, 4]
-  - [1, 4, 'universe', 0, 27]
+- - [1, 32, 'role', 2, 4]
+  - [1, 32, 'universe', 0, 27]
 ...
 box.schema.user.drop('user')
 ---
@@ -1066,3 +1066,54 @@ box.schema.user.drop('test1')
 s:drop()
 ---
 ...
+--
+-- gh-3022 role 'super'
+--
+box.schema.user.grant('guest', 'super')
+---
+...
+box.session.su('guest')
+---
+...
+_ = box.schema.space.create('test')
+---
+...
+box.space.test:drop()
+---
+...
+_ = box.schema.user.create('test')
+---
+...
+box.schema.user.drop('test')
+---
+...
+_ = box.schema.func.create('test')
+---
+...
+box.schema.func.drop('test')
+---
+...
+box.session.su('admin')
+---
+...
+box.schema.user.revoke('guest', 'super')
+---
+...
+box.session.su('guest')
+---
+...
+box.schema.space.create('test')
+---
+- error: Write access is denied for user 'guest' to space '_schema'
+...
+box.schema.user.create('test')
+---
+- error: Read access is denied for user 'guest' to space '_user'
+...
+box.schema.func.create('test')
+---
+- error: Read access is denied for user 'guest' to space '_func'
+...
+box.session.su('admin')
+---
+...
diff --git a/test/box/access.test.lua b/test/box/access.test.lua
index a5c4cd57169deba434ce250633c8276090e32e64..8f366ddde729a88dd1b44fdf1ff5d42fdd00fb3a 100644
--- a/test/box/access.test.lua
+++ b/test/box/access.test.lua
@@ -406,3 +406,23 @@ session.su("admin")
 box.schema.user.drop('test')
 box.schema.user.drop('test1')
 s:drop()
+
+--
+-- gh-3022 role 'super'
+--
+
+box.schema.user.grant('guest', 'super')
+box.session.su('guest')
+_ = box.schema.space.create('test')
+box.space.test:drop()
+_ = box.schema.user.create('test')
+box.schema.user.drop('test')
+_ = box.schema.func.create('test')
+box.schema.func.drop('test')
+box.session.su('admin')
+box.schema.user.revoke('guest', 'super')
+box.session.su('guest')
+box.schema.space.create('test')
+box.schema.user.create('test')
+box.schema.func.create('test')
+box.session.su('admin')
diff --git a/test/box/access_bin.result b/test/box/access_bin.result
index 31f25c61ce4b6c0a350b66ca4a7e655794fda222..e3b5e3fdba297d2f6398975724b338d67221cf5a 100644
--- a/test/box/access_bin.result
+++ b/test/box/access_bin.result
@@ -174,7 +174,7 @@ box.schema.user.drop('test')
 ...
 c.space.test:insert{1}
 ---
-- error: User '4' is not found
+- error: User '32' is not found
 ...
 c:close()
 ---
diff --git a/test/box/access_misc.result b/test/box/access_misc.result
index 56460689865888d98bc3a9a2b32b9a16b3250dad..53e86a3359f2a9e16de46d886ba1e006d5db132b 100644
--- a/test/box/access_misc.result
+++ b/test/box/access_misc.result
@@ -355,7 +355,7 @@ uid = box.space._user:insert{maxuid+1, session.uid(), 'someone', 'user', EMPTY_M
 ...
 box.space._user:delete(uid)
 ---
-- [5, 4, 'someone', 'user', {}]
+- [33, 32, 'someone', 'user', {}]
 ...
 session.su('admin')
 ---
@@ -626,6 +626,7 @@ box.space._user:select()
   - [1, 1, 'admin', 'user', {}]
   - [2, 1, 'public', 'role', {}]
   - [3, 1, 'replication', 'role', {}]
+  - [31, 1, 'super', 'role', {}]
 ...
 box.space._space:select()
 ---
diff --git a/test/box/access_sysview.result b/test/box/access_sysview.result
index e82cc462e17935d7c71db6c3045169ba495b4955..5f16ed10bd3266e36ede23ae5e65c19de7b61172 100644
--- a/test/box/access_sysview.result
+++ b/test/box/access_sysview.result
@@ -234,11 +234,11 @@ box.session.su('guest')
 ...
 #box.space._vuser:select{}
 ---
-- 4
+- 5
 ...
 #box.space._vpriv:select{}
 ---
-- 13
+- 14
 ...
 #box.space._vfunc:select{}
 ---
diff --git a/test/box/sequence.result b/test/box/sequence.result
index 3564a52235f3e3493560a13a189cfbb933931c57..48669650e9e8bca869d78ab81cd158713799ab1c 100644
--- a/test/box/sequence.result
+++ b/test/box/sequence.result
@@ -1293,7 +1293,7 @@ box.schema.user.grant('user', 'write', 'sequence', 'seq') -- ok
 ...
 box.space._priv.index.object:select{'sequence'}
 ---
-- - [1, 4, 'sequence', 1, 2]
+- - [1, 32, 'sequence', 1, 2]
 ...
 box.space._sequence:delete(sq.id) -- error: sequence has grants
 ---
diff --git a/test/xlog/upgrade.result b/test/xlog/upgrade.result
index 3802f0e3e451df963ad72035794ba27e32842bdf..113c06671832ea9c9663e4b80f2488cf75e2c1c3 100644
--- a/test/xlog/upgrade.result
+++ b/test/xlog/upgrade.result
@@ -151,6 +151,7 @@ box.space._user:select()
   - [3, 1, 'replication', 'role', {}]
   - [4, 1, 'someuser', 'user', {'chap-sha1': '2qvbQIHM4zMWhAmm2xGeGNjqoHM='}]
   - [5, 1, 'somerole', 'role', {}]
+  - [31, 1, 'super', 'role', {}]
 ...
 box.space._func:select()
 ---
@@ -185,6 +186,7 @@ box.space._priv:select()
   - [1, 4, 'space', 513, 3]
   - [1, 4, 'universe', 0, 24]
   - [1, 5, 'space', 512, 3]
+  - [1, 31, 'universe', 0, 4294967295]
 ...
 box.space._vspace ~= nil
 ---