diff --git a/mod/silverbox/box.c b/mod/silverbox/box.c
index 4bfc0c2c2276130f78115758807d734d449bac4a..d21c088c83477d6649a94af6d6434cde17a26b9c 100644
--- a/mod/silverbox/box.c
+++ b/mod/silverbox/box.c
@@ -86,10 +86,12 @@ box_hook_t *before_commit_update_hook;
 static void
 run_hooks(struct box_txn *txn, box_hook_t *hook)
 {
-	for (int i = 0; hook[i] != NULL; i++) {
-		int result = (*hook[i])(txn);
-		if (result != ERR_CODE_OK)
-			box_raise(result, "hook returned error");
+	if (hook != NULL) {
+		for (int i = 0; hook[i] != NULL; i++) {
+			int result = (*hook[i])(txn);
+			if (result != ERR_CODE_OK)
+				box_raise(result, "hook returned error");
+		}
 	}
 }
 
@@ -1221,7 +1223,20 @@ mod_init(void)
 				      cfg.rows_per_wal, cfg.wal_fsync_delay, cfg.snap_io_rate_limit,
 				      cfg.wal_writer_inbox_size, init_storage ? RECOVER_READONLY : 0, NULL);
 
-	custom_init(); /* initialize hashes _after_ starting wal writer */
+	/* initialize hashes _after_ starting wal writer */
+	if (cfg.memcached != 0) {
+		int n = cfg.memcached_namespace > 0 ? cfg.memcached_namespace : MEMCACHED_NAMESPACE;
+		namespace[n].enabled = true;
+		namespace[n].index[0].map.str_map = kh_init(lstr2ptr_map, NULL);
+		namespace[n].index[0].find = index_find_hash_str;
+		namespace[n].index[0].remove = index_remove_hash_str;
+		namespace[n].index[0].replace = index_replace_hash_str;
+		memcached_index = &namespace[n].index[0];
+		memcached_index->key_position = 0;
+		memcached_index->type = INDEX_STR;
+	} else {
+		custom_init();
+	}
 
 	if (init_storage)
 		return;
@@ -1238,11 +1253,6 @@ mod_init(void)
 	}
 
 	if (cfg.memcached != 0) {
-		int n = cfg.memcached_namespace > 0 ? cfg.memcached_namespace : MEMCACHED_NAMESPACE;
-		memcached_index = &namespace[n].index[0];
-		memcached_index->key_position = 0;
-		memcached_index->type = INDEX_STR;
-
 		fiber_server(tcp_server, cfg.primary_port, memcached_handler, NULL, memcached_bound_to_primary);
 	} else {
 		if (cfg.secondary_port != 0)