diff --git a/sbroad-cartridge/cartridge/roles/sbroad-router.lua b/sbroad-cartridge/cartridge/roles/sbroad-router.lua
index 517f26d26b914e9e37150d7ed372e3922b4f6faf..522c12834deb076cdbcd91e4e49a3301576c2449 100644
--- a/sbroad-cartridge/cartridge/roles/sbroad-router.lua
+++ b/sbroad-cartridge/cartridge/roles/sbroad-router.lua
@@ -1,3 +1,4 @@
+local sbroad_common = require('sbroad.init')
 local sbroad_router = require('sbroad.router')
 
 local function init(opts) -- luacheck: no unused args
@@ -6,12 +7,13 @@ local function init(opts) -- luacheck: no unused args
         rawset(_G, 'sbroad', {})
     end
 
-    _G.sbroad.calculate_bucket_id = sbroad_router.calculate_bucket_id
+    _G.sbroad.calculate_bucket_id = sbroad_common.calculate_bucket_id
     _G.sbroad.execute = sbroad_router.execute
     _G.sbroad.trace = sbroad_router.trace
 
     sbroad_router.init()
-    sbroad_router.init_statistics()
+    sbroad_common.init()
+    sbroad_common.init_statistics()
 
     return true
 end
@@ -25,5 +27,5 @@ return {
     role_name = 'sbroad-router',
     init = init,
     apply_config = apply_config,
-    dependencies = {'cartridge.roles.vshard-router'},
+    dependencies = {'cartridge.roles.vshard-router'}
 }
diff --git a/sbroad-cartridge/cartridge/roles/sbroad-storage.lua b/sbroad-cartridge/cartridge/roles/sbroad-storage.lua
index 2bc8aa3ffdd6de0719a25ff5252cf29ce5dd4c8a..2a409b8f00558c0daf076442ed2cabb90acbc38f 100644
--- a/sbroad-cartridge/cartridge/roles/sbroad-storage.lua
+++ b/sbroad-cartridge/cartridge/roles/sbroad-storage.lua
@@ -1,8 +1,17 @@
+local sbroad_common = require('sbroad.init')
 local sbroad_storage = require('sbroad.storage')
 
 local function init(opts) -- luacheck: no unused args
+    if rawget(_G, 'sbroad') == nil then
+        rawset(_G, 'sbroad', {})
+    end
+
+    _G.sbroad.calculate_bucket_id = sbroad_common.calculate_bucket_id
+
+    sbroad_common.init()
+    sbroad_common.init_statistics()
     sbroad_storage.init()
-    sbroad_storage.init_statistics()
+
     return true
 end
 
@@ -16,6 +25,7 @@ return {
     init = init,
     apply_config = apply_config,
     dependencies = {
-        "cartridge.roles.vshard-storage",
+        'cartridge.roles.vshard-storage',
+        'cartridge.roles.vshard-router',
     },
 }
diff --git a/sbroad-cartridge/src/init.lua b/sbroad-cartridge/src/init.lua
index 9b2df1740438fdfa21e0cc82c9f67802abe9f9f1..cdb7178ce8f4b22e6f0fc0e2133cb3ab64ec8912 100644
--- a/sbroad-cartridge/src/init.lua
+++ b/sbroad-cartridge/src/init.lua
@@ -1,5 +1,70 @@
-require 'sbroad.core'
+require('sbroad.core')
+
 local cartridge = require('cartridge')
+local checks = require('checks')
+
+local function init ()
+    box.schema.func.create(
+        'libsbroad.calculate_bucket_id',
+        { if_not_exists = true, language = 'C' }
+    )
+
+    box.schema.func.create("BUCKET_ID", {
+        language = "Lua",
+        body = [[
+            function(x)
+                return box.func["libsbroad.calculate_bucket_id"]:call({ x })
+            end
+        ]],
+        if_not_exists = true,
+        param_list = {"string"},
+        returns = "unsigned",
+        aggregate = "none",
+        exports = {"SQL"},
+    })
+
+    box.schema.func.create(
+        'libsbroad.calculate_bucket_id_by_dict',
+        { if_not_exists = true, language = 'C' }
+    )
+
+    box.schema.func.create(
+        'libsbroad.init_statistics',
+        { if_not_exists = true, language = 'C' }
+    )
+end
+
+local function calculate_bucket_id(values, space_name) -- luacheck: no unused args
+    checks('string|table', '?string')
+
+    local has_err, result = pcall(function ()
+       if type(values) == 'table' and space_name == nil then
+           return false, error("space_name is required")
+       end
+
+       return true
+    end)
+
+    if has_err == false then
+        return nil, result
+    end
+
+    has_err, result = pcall(
+        function()
+            return box.func["libsbroad.calculate_bucket_id"]:call({ values,  space_name })
+        end
+    )
+
+    if has_err == false then
+        return nil, result
+    end
+
+    return result
+end
+
+local function init_statistics ()
+    box.func["libsbroad.init_statistics"]:call({})
+end
 
 _G.get_jaeger_agent_host = function()
     local cfg = cartridge.config_get_readonly()
@@ -20,3 +85,9 @@ _G.get_jaeger_agent_port = function()
 
     return cfg["jaeger_agent_port"]
 end
+
+return {
+    init = init,
+    init_statistics = init_statistics,
+    calculate_bucket_id = calculate_bucket_id,
+}
diff --git a/sbroad-cartridge/src/router.lua b/sbroad-cartridge/src/router.lua
index 25375da36cb6a485c665ba4b36b7827bbc790109..211039e1260b9ca042e26c14491839b4badc2112 100644
--- a/sbroad-cartridge/src/router.lua
+++ b/sbroad-cartridge/src/router.lua
@@ -3,7 +3,6 @@ require('sbroad')
 
 local vshard = require('vshard')
 local cartridge = require('cartridge')
-local checks = require('checks')
 
 _G.get_schema = function()
     return cartridge.get_schema()
@@ -203,64 +202,16 @@ local function init()
         { if_not_exists = true, language = 'C' }
     )
 
-    box.schema.func.create(
-        'libsbroad.calculate_bucket_id',
-        { if_not_exists = true, language = 'C' }
-    )
-
-    box.schema.func.create(
-        'libsbroad.calculate_bucket_id_by_dict',
-        { if_not_exists = true, language = 'C' }
-    )
-
     box.schema.func.create(
         'libsbroad.dispatch_query',
         { if_not_exists = true, language = 'C' }
     )
-
-    box.schema.func.create(
-        'libsbroad.init_statistics',
-        { if_not_exists = true, language = 'C' }
-    )
-
-end
-
-local function calculate_bucket_id(values, space_name) -- luacheck: no unused args
-    checks('string|table', '?string')
-
-    local has_err, result = pcall(function ()
-       if type(values) == 'table' and space_name == nil then
-           return false, error("space_name is required")
-       end
-
-       return true
-    end)
-
-    if has_err == false then
-        return nil, result
-    end
-
-    has_err, result = pcall(
-        function()
-            return box.func["libsbroad.calculate_bucket_id"]:call({ values,  space_name })
-        end
-    )
-
-    if has_err == false then
-        return nil, result
-    end
-
-    return result
 end
 
 local function invalidate_cache ()
     box.func["libsbroad.invalidate_coordinator_cache"]:call({})
 end
 
-local function init_statistics ()
-    box.func["libsbroad.init_statistics"]:call({})
-end
-
 local function trace(query, params, context, id)
     local has_err, parser_res = pcall(
         function()
@@ -284,6 +235,4 @@ return {
     invalidate_cache = invalidate_cache,
     execute = execute,
     trace = trace,
-    calculate_bucket_id = calculate_bucket_id,
-    init_statistics = init_statistics
 }
diff --git a/sbroad-cartridge/src/storage.lua b/sbroad-cartridge/src/storage.lua
index 648d8d0513a530c708752c78d12257440ad736c2..3610c48d31337f0e36cf1753cf1b04185f5b7cdb 100644
--- a/sbroad-cartridge/src/storage.lua
+++ b/sbroad-cartridge/src/storage.lua
@@ -87,23 +87,13 @@ local function init()
         'libsbroad.invalidate_segment_cache',
         { if_not_exists = true, language = 'C' }
     )
-
-    box.schema.func.create(
-        'libsbroad.init_statistics',
-        { if_not_exists = true, language = 'C' }
-    )
 end
 
 local function invalidate_cache()
     box.func["libsbroad.invalidate_segment_cache"]:call({})
 end
 
-local function init_statistics()
-    box.func["libsbroad.init_statistics"]:call({})
-end
-
 return {
     init = init,
     invalidate_cache = invalidate_cache,
-    init_statistics = init_statistics
 }