diff --git a/daemon/README.rst b/daemon/README.rst
index c6365f1baa02cdaa3bb269daea79ef851f8ea99e..8d62ab64868ebefbf3aea8dc6f6b720444bc50ab 100644
--- a/daemon/README.rst
+++ b/daemon/README.rst
@@ -711,30 +711,44 @@ The daemon provides an interface for dynamic loading of :ref:`daemon modules <mo
 Cache configuration
 ^^^^^^^^^^^^^^^^^^^
 
-The cache in Knot DNS Resolver is persistent with LMDB backend, this means that the daemon doesn't lose
+The default cache in Knot DNS Resolver is persistent with LMDB backend, this means that the daemon doesn't lose
 the cached data on restart or crash to avoid cold-starts. The cache may be reused between cache
 daemons or manipulated from other processes, making for example synchronised load-balanced recursors possible.
 
 .. envvar:: cache.size (number)
 
-   Get/set the cache maximum size in bytes. Note that this is only a hint to the backend,
+   Set the cache maximum size in bytes. Note that this is only a hint to the backend,
    which may or may not respect it. See :func:`cache.open()`.
 
    .. code-block:: lua
 
-	print(cache.size)
 	cache.size = 100 * MB -- equivalent to `cache.open(100 * MB)`
 
+.. envvar:: cache.current_size (number)
+
+   Get the maximum size in bytes.
+
+   .. code-block:: lua
+
+	print(cache.current_size)
+
 .. envvar:: cache.storage (string)
 
-   Get or change the cache storage backend configuration, see :func:`cache.backends()` for
+   Set the cache storage backend configuration, see :func:`cache.backends()` for
    more information. If the new storage configuration is invalid, it is not set.
 
    .. code-block:: lua
 
-	print(cache.storage)
 	cache.storage = 'lmdb://.'
 
+.. envvar:: cache.current_storage (string)
+
+   Get the storage backend configuration.
+
+   .. code-block:: lua
+
+	print(cache.storage)
+
 .. function:: cache.backends()
 
    :return: map of backends
diff --git a/daemon/lua/sandbox.lua b/daemon/lua/sandbox.lua
index b76f068a4ae96cf73bbc78a0bb453adbd31ba2a8..3c67349ec47bc350ee48894c06a1412495a020c4 100644
--- a/daemon/lua/sandbox.lua
+++ b/daemon/lua/sandbox.lua
@@ -106,30 +106,26 @@ setmetatable(modules, {
 })
 
 -- Syntactic sugar for cache
--- `#cache -> cache.count()`
 -- `cache[x] -> cache.get(x)`
 -- `cache.{size|storage} = value`
 setmetatable(cache, {
-	__len = function (t)
-		return t.count()
-	end,
 	__index = function (t, k)
-		if type(k) == 'number' then
-			return rawget(t, k) or (rawget(t, 'current_size') and t.get(k))
-		end
+		local res = rawget(t, k)
+		if res and not rawget(t, 'current_size') then return res end
+		-- Beware: t.get returns empty table on failure to find.
+		-- That would be confusing here (breaking kresc), so return nil instead.
+		res = t.get(k)
+		if res and next(res) ~= nil then return res else return nil end
 	end,
 	__newindex = function (t,k,v)
 		-- Defaults
-		if type(k) == number then
-			local storage = rawget(t, 'current_storage')
-			if not storage then storage = 'lmdb://' end
-			local size = rawget(t, 'current_size')
-			if not size then size = 10*MB end
-		end
+		local storage = rawget(t, 'current_storage')
+		if not storage then storage = 'lmdb://' end
+		local size = rawget(t, 'current_size')
+		if not size then size = 10*MB end
 		-- Declarative interface for cache
 		if     k == 'size'    then t.open(v, storage)
-		elseif k == 'storage' then t.open(size, v)
-		else   rawset(t, k, v) end
+		elseif k == 'storage' then t.open(size, v) end
 	end
 })