diff --git a/core/stat.c b/core/stat.c
index c515cd0d1be53bf3ece5061f33a6c4a82ff3f602..96b0ef0fe5b2a53d68847adbb0414e6ced9f7dd3 100644
--- a/core/stat.c
+++ b/core/stat.c
@@ -44,11 +44,11 @@ static int stats_max = 0;
 static int base = 0;
 
 int
-stat_register(char **name, size_t count)
+stat_register(char **name, size_t max_idx)
 {
 	int initial_base = base;
 
-	for (int i = 0; i < count; i++, name++, base++) {
+	for (int i = 0; i < max_idx; i++, name++, base++) {
 		if (stats_size <= base) {
 			stats_size += 1024;
 			stats = realloc(stats, sizeof(*stats) * stats_size);
@@ -83,13 +83,13 @@ stat_print(struct tbuf *buf)
 	int max_len = 0;
 	tbuf_printf(buf, "statistics:\n");
 
-	for (int i = 0; i < stats_max; i++) {
+	for (int i = 0; i <= stats_max; i++) {
 		if (stats[i].name == NULL)
 			continue;
 		max_len = MAX(max_len, strlen(stats[i].name));
 	}
 
-	for (int i = 0; i < stats_max; i++) {
+	for (int i = 0; i <= stats_max; i++) {
 		if (stats[i].name == NULL)
 			continue;
 
@@ -108,7 +108,7 @@ stat_print(struct tbuf *buf)
 void
 stat_age(ev_timer *timer, int events __unused__)
 {
-	for (int i = 0; i < stats_max; i++) {
+	for (int i = 0; i <= stats_max; i++) {
 		if (stats[i].name == NULL)
 			continue;
 
diff --git a/mod/silverbox/box.c b/mod/silverbox/box.c
index 66d6d4419aa34e1bddd5be06a1acb6ed1bef9096..458ec4ff648feb16c0c5a31c2c02ab31124724f6 100644
--- a/mod/silverbox/box.c
+++ b/mod/silverbox/box.c
@@ -1639,13 +1639,11 @@ memcached_bound_to_primary(void *data __unused__)
 {
 	box_bound_to_primary(NULL);
 
-	if (0 && !cfg.remote_hot_standby) {
-		struct fiber *expire =
-			fiber_create("memecached_expire", -1, -1, memcached_expire, NULL);
-		if (expire == NULL)
-			panic("can't stared expire fiber");
-		fiber_call(expire);
-	}
+	struct fiber *expire =
+		fiber_create("memecached_expire", -1, -1, memcached_expire, NULL);
+	if (expire == NULL)
+		panic("can't start the expire fiber");
+	fiber_call(expire);
 }
 
 static void
@@ -1749,6 +1747,10 @@ mod_init(void)
 	if (cfg.memcached != 0) {
 		if (cfg.secondary_port != 0)
 			panic("in memcached mode secondary_port must be 0");
+		if (cfg.remote_hot_standby)
+			panic("remote replication is not supported in memcached mode.");
+
+		memcached_init();
 	}
 
 	title("loading");
diff --git a/mod/silverbox/box.h b/mod/silverbox/box.h
index 505ed884ce8365c568964c1582a140296acddc99..888af4cfcb9e2d9652d4c941734b97eab5a71190 100644
--- a/mod/silverbox/box.h
+++ b/mod/silverbox/box.h
@@ -189,5 +189,6 @@ void *next_field(void *f);
 void append_field(struct tbuf *b, void *f);
 void *tuple_field(struct box_tuple *tuple, size_t i);
 
+void memcached_init(void);
 void memcached_expire(void *data __unused__);
 #endif
diff --git a/mod/silverbox/memcached.c b/mod/silverbox/memcached.c
index f8a5ca1268f48e70cb8516204b92734b5c9c9e7b..a818f8840071708eb3e3d5f9caa142328165c42c 100644
--- a/mod/silverbox/memcached.c
+++ b/mod/silverbox/memcached.c
@@ -46,7 +46,8 @@
 #define STAT(_)					\
         _(MEMC_GET, 1)				\
         _(MEMC_GET_MISS, 2)			\
-	_(MEMC_GET_HIT, 3)
+	_(MEMC_GET_HIT, 3)			\
+	_(MEMC_EXPIRED_KEYS, 4)
 
 ENUM(memcached_stat, STAT);
 STRS(memcached_stat, STAT);
@@ -64,7 +65,7 @@ struct meta {
 } __packed__;
 
 
-#line 68 "mod/silverbox/memcached.c"
+#line 69 "mod/silverbox/memcached.c"
 static const int memcached_start = 1;
 static const int memcached_first_final = 197;
 static const int memcached_error = 0;
@@ -72,7 +73,7 @@ static const int memcached_error = 0;
 static const int memcached_en_main = 1;
 
 
-#line 67 "mod/silverbox/memcached.rl"
+#line 68 "mod/silverbox/memcached.rl"
 
 
 
@@ -261,12 +262,12 @@ memcached_dispatch(struct box_txn *txn)
 })
 
 	
-#line 265 "mod/silverbox/memcached.c"
+#line 266 "mod/silverbox/memcached.c"
 	{
 	cs = memcached_start;
 	}
 
-#line 270 "mod/silverbox/memcached.c"
+#line 271 "mod/silverbox/memcached.c"
 	{
 	if ( p == pe )
 		goto _test_eof;
@@ -324,7 +325,7 @@ case 5:
 		goto st0;
 	goto tr15;
 tr15:
-#line 476 "mod/silverbox/memcached.rl"
+#line 477 "mod/silverbox/memcached.rl"
 	{
 			fstart = p;
 			for (; p < pe && *p != ' ' && *p != '\r' && *p != '\n'; p++);
@@ -341,7 +342,7 @@ case 5:
 	if ( ++p == pe )
 		goto _test_eof6;
 case 6:
-#line 345 "mod/silverbox/memcached.c"
+#line 346 "mod/silverbox/memcached.c"
 	if ( (*p) == 32 )
 		goto st7;
 	goto st0;
@@ -355,49 +356,49 @@ case 7:
 		goto tr17;
 	goto st0;
 tr17:
-#line 475 "mod/silverbox/memcached.rl"
+#line 476 "mod/silverbox/memcached.rl"
 	{ fstart = p; }
 	goto st8;
 st8:
 	if ( ++p == pe )
 		goto _test_eof8;
 case 8:
-#line 366 "mod/silverbox/memcached.c"
+#line 367 "mod/silverbox/memcached.c"
 	if ( (*p) == 32 )
 		goto tr18;
 	if ( 48 <= (*p) && (*p) <= 57 )
 		goto st8;
 	goto st0;
 tr18:
-#line 499 "mod/silverbox/memcached.rl"
+#line 500 "mod/silverbox/memcached.rl"
 	{flags = natoq(fstart, p);}
 	goto st9;
 st9:
 	if ( ++p == pe )
 		goto _test_eof9;
 case 9:
-#line 380 "mod/silverbox/memcached.c"
+#line 381 "mod/silverbox/memcached.c"
 	if ( (*p) == 32 )
 		goto st9;
 	if ( 48 <= (*p) && (*p) <= 57 )
 		goto tr21;
 	goto st0;
 tr21:
-#line 475 "mod/silverbox/memcached.rl"
+#line 476 "mod/silverbox/memcached.rl"
 	{ fstart = p; }
 	goto st10;
 st10:
 	if ( ++p == pe )
 		goto _test_eof10;
 case 10:
-#line 394 "mod/silverbox/memcached.c"
+#line 395 "mod/silverbox/memcached.c"
 	if ( (*p) == 32 )
 		goto tr22;
 	if ( 48 <= (*p) && (*p) <= 57 )
 		goto st10;
 	goto st0;
 tr22:
-#line 492 "mod/silverbox/memcached.rl"
+#line 493 "mod/silverbox/memcached.rl"
 	{
 			exptime = natoq(fstart, p);
 			if (exptime > 0 && exptime <= 60*60*24*30)
@@ -408,21 +409,21 @@ case 10:
 	if ( ++p == pe )
 		goto _test_eof11;
 case 11:
-#line 412 "mod/silverbox/memcached.c"
+#line 413 "mod/silverbox/memcached.c"
 	if ( (*p) == 32 )
 		goto st11;
 	if ( 48 <= (*p) && (*p) <= 57 )
 		goto tr25;
 	goto st0;
 tr25:
-#line 475 "mod/silverbox/memcached.rl"
+#line 476 "mod/silverbox/memcached.rl"
 	{ fstart = p; }
 	goto st12;
 st12:
 	if ( ++p == pe )
 		goto _test_eof12;
 case 12:
-#line 426 "mod/silverbox/memcached.c"
+#line 427 "mod/silverbox/memcached.c"
 	switch( (*p) ) {
 		case 10: goto tr26;
 		case 13: goto tr27;
@@ -432,11 +433,11 @@ case 12:
 		goto st12;
 	goto st0;
 tr26:
-#line 500 "mod/silverbox/memcached.rl"
+#line 501 "mod/silverbox/memcached.rl"
 	{bytes = natoq(fstart, p);}
-#line 532 "mod/silverbox/memcached.rl"
+#line 533 "mod/silverbox/memcached.rl"
 	{ p++; }
-#line 505 "mod/silverbox/memcached.rl"
+#line 506 "mod/silverbox/memcached.rl"
 	{
 			size_t parsed = p - (u8 *)fiber->rbuf->data;
 			while (fiber->rbuf->len - parsed < bytes + 2) {
@@ -457,13 +458,13 @@ case 12:
 				goto exit;
 			}
 		}
-#line 526 "mod/silverbox/memcached.rl"
+#line 527 "mod/silverbox/memcached.rl"
 	{
 			done = true;
 			stats.bytes_read += p - (u8 *)fiber->rbuf->data;
 			tbuf_peek(fiber->rbuf, p - (u8 *)fiber->rbuf->data);
 		}
-#line 260 "mod/silverbox/memcached.rl"
+#line 261 "mod/silverbox/memcached.rl"
 	{
 			key = read_field(keys);
 			struct box_tuple *tuple = find(key);
@@ -474,9 +475,9 @@ case 12:
 		}
 	goto st197;
 tr30:
-#line 532 "mod/silverbox/memcached.rl"
+#line 533 "mod/silverbox/memcached.rl"
 	{ p++; }
-#line 505 "mod/silverbox/memcached.rl"
+#line 506 "mod/silverbox/memcached.rl"
 	{
 			size_t parsed = p - (u8 *)fiber->rbuf->data;
 			while (fiber->rbuf->len - parsed < bytes + 2) {
@@ -497,13 +498,13 @@ case 12:
 				goto exit;
 			}
 		}
-#line 526 "mod/silverbox/memcached.rl"
+#line 527 "mod/silverbox/memcached.rl"
 	{
 			done = true;
 			stats.bytes_read += p - (u8 *)fiber->rbuf->data;
 			tbuf_peek(fiber->rbuf, p - (u8 *)fiber->rbuf->data);
 		}
-#line 260 "mod/silverbox/memcached.rl"
+#line 261 "mod/silverbox/memcached.rl"
 	{
 			key = read_field(keys);
 			struct box_tuple *tuple = find(key);
@@ -514,11 +515,11 @@ case 12:
 		}
 	goto st197;
 tr39:
-#line 534 "mod/silverbox/memcached.rl"
+#line 535 "mod/silverbox/memcached.rl"
 	{ noreply = true; }
-#line 532 "mod/silverbox/memcached.rl"
+#line 533 "mod/silverbox/memcached.rl"
 	{ p++; }
-#line 505 "mod/silverbox/memcached.rl"
+#line 506 "mod/silverbox/memcached.rl"
 	{
 			size_t parsed = p - (u8 *)fiber->rbuf->data;
 			while (fiber->rbuf->len - parsed < bytes + 2) {
@@ -539,13 +540,13 @@ case 12:
 				goto exit;
 			}
 		}
-#line 526 "mod/silverbox/memcached.rl"
+#line 527 "mod/silverbox/memcached.rl"
 	{
 			done = true;
 			stats.bytes_read += p - (u8 *)fiber->rbuf->data;
 			tbuf_peek(fiber->rbuf, p - (u8 *)fiber->rbuf->data);
 		}
-#line 260 "mod/silverbox/memcached.rl"
+#line 261 "mod/silverbox/memcached.rl"
 	{
 			key = read_field(keys);
 			struct box_tuple *tuple = find(key);
@@ -556,11 +557,11 @@ case 12:
 		}
 	goto st197;
 tr58:
-#line 500 "mod/silverbox/memcached.rl"
+#line 501 "mod/silverbox/memcached.rl"
 	{bytes = natoq(fstart, p);}
-#line 532 "mod/silverbox/memcached.rl"
+#line 533 "mod/silverbox/memcached.rl"
 	{ p++; }
-#line 505 "mod/silverbox/memcached.rl"
+#line 506 "mod/silverbox/memcached.rl"
 	{
 			size_t parsed = p - (u8 *)fiber->rbuf->data;
 			while (fiber->rbuf->len - parsed < bytes + 2) {
@@ -581,13 +582,13 @@ case 12:
 				goto exit;
 			}
 		}
-#line 526 "mod/silverbox/memcached.rl"
+#line 527 "mod/silverbox/memcached.rl"
 	{
 			done = true;
 			stats.bytes_read += p - (u8 *)fiber->rbuf->data;
 			tbuf_peek(fiber->rbuf, p - (u8 *)fiber->rbuf->data);
 		}
-#line 289 "mod/silverbox/memcached.rl"
+#line 290 "mod/silverbox/memcached.rl"
 	{
 			struct tbuf *b;
 			void *value;
@@ -616,9 +617,9 @@ case 12:
 		}
 	goto st197;
 tr62:
-#line 532 "mod/silverbox/memcached.rl"
+#line 533 "mod/silverbox/memcached.rl"
 	{ p++; }
-#line 505 "mod/silverbox/memcached.rl"
+#line 506 "mod/silverbox/memcached.rl"
 	{
 			size_t parsed = p - (u8 *)fiber->rbuf->data;
 			while (fiber->rbuf->len - parsed < bytes + 2) {
@@ -639,13 +640,13 @@ case 12:
 				goto exit;
 			}
 		}
-#line 526 "mod/silverbox/memcached.rl"
+#line 527 "mod/silverbox/memcached.rl"
 	{
 			done = true;
 			stats.bytes_read += p - (u8 *)fiber->rbuf->data;
 			tbuf_peek(fiber->rbuf, p - (u8 *)fiber->rbuf->data);
 		}
-#line 289 "mod/silverbox/memcached.rl"
+#line 290 "mod/silverbox/memcached.rl"
 	{
 			struct tbuf *b;
 			void *value;
@@ -674,11 +675,11 @@ case 12:
 		}
 	goto st197;
 tr71:
-#line 534 "mod/silverbox/memcached.rl"
+#line 535 "mod/silverbox/memcached.rl"
 	{ noreply = true; }
-#line 532 "mod/silverbox/memcached.rl"
+#line 533 "mod/silverbox/memcached.rl"
 	{ p++; }
-#line 505 "mod/silverbox/memcached.rl"
+#line 506 "mod/silverbox/memcached.rl"
 	{
 			size_t parsed = p - (u8 *)fiber->rbuf->data;
 			while (fiber->rbuf->len - parsed < bytes + 2) {
@@ -699,13 +700,13 @@ case 12:
 				goto exit;
 			}
 		}
-#line 526 "mod/silverbox/memcached.rl"
+#line 527 "mod/silverbox/memcached.rl"
 	{
 			done = true;
 			stats.bytes_read += p - (u8 *)fiber->rbuf->data;
 			tbuf_peek(fiber->rbuf, p - (u8 *)fiber->rbuf->data);
 		}
-#line 289 "mod/silverbox/memcached.rl"
+#line 290 "mod/silverbox/memcached.rl"
 	{
 			struct tbuf *b;
 			void *value;
@@ -734,11 +735,11 @@ case 12:
 		}
 	goto st197;
 tr91:
-#line 501 "mod/silverbox/memcached.rl"
+#line 502 "mod/silverbox/memcached.rl"
 	{cas = natoq(fstart, p);}
-#line 532 "mod/silverbox/memcached.rl"
+#line 533 "mod/silverbox/memcached.rl"
 	{ p++; }
-#line 505 "mod/silverbox/memcached.rl"
+#line 506 "mod/silverbox/memcached.rl"
 	{
 			size_t parsed = p - (u8 *)fiber->rbuf->data;
 			while (fiber->rbuf->len - parsed < bytes + 2) {
@@ -759,13 +760,13 @@ case 12:
 				goto exit;
 			}
 		}
-#line 526 "mod/silverbox/memcached.rl"
+#line 527 "mod/silverbox/memcached.rl"
 	{
 			done = true;
 			stats.bytes_read += p - (u8 *)fiber->rbuf->data;
 			tbuf_peek(fiber->rbuf, p - (u8 *)fiber->rbuf->data);
 		}
-#line 278 "mod/silverbox/memcached.rl"
+#line 279 "mod/silverbox/memcached.rl"
 	{
 			key = read_field(keys);
 			struct box_tuple *tuple = find(key);
@@ -778,9 +779,9 @@ case 12:
 		}
 	goto st197;
 tr95:
-#line 532 "mod/silverbox/memcached.rl"
+#line 533 "mod/silverbox/memcached.rl"
 	{ p++; }
-#line 505 "mod/silverbox/memcached.rl"
+#line 506 "mod/silverbox/memcached.rl"
 	{
 			size_t parsed = p - (u8 *)fiber->rbuf->data;
 			while (fiber->rbuf->len - parsed < bytes + 2) {
@@ -801,13 +802,13 @@ case 12:
 				goto exit;
 			}
 		}
-#line 526 "mod/silverbox/memcached.rl"
+#line 527 "mod/silverbox/memcached.rl"
 	{
 			done = true;
 			stats.bytes_read += p - (u8 *)fiber->rbuf->data;
 			tbuf_peek(fiber->rbuf, p - (u8 *)fiber->rbuf->data);
 		}
-#line 278 "mod/silverbox/memcached.rl"
+#line 279 "mod/silverbox/memcached.rl"
 	{
 			key = read_field(keys);
 			struct box_tuple *tuple = find(key);
@@ -820,11 +821,11 @@ case 12:
 		}
 	goto st197;
 tr105:
-#line 534 "mod/silverbox/memcached.rl"
+#line 535 "mod/silverbox/memcached.rl"
 	{ noreply = true; }
-#line 532 "mod/silverbox/memcached.rl"
+#line 533 "mod/silverbox/memcached.rl"
 	{ p++; }
-#line 505 "mod/silverbox/memcached.rl"
+#line 506 "mod/silverbox/memcached.rl"
 	{
 			size_t parsed = p - (u8 *)fiber->rbuf->data;
 			while (fiber->rbuf->len - parsed < bytes + 2) {
@@ -845,13 +846,13 @@ case 12:
 				goto exit;
 			}
 		}
-#line 526 "mod/silverbox/memcached.rl"
+#line 527 "mod/silverbox/memcached.rl"
 	{
 			done = true;
 			stats.bytes_read += p - (u8 *)fiber->rbuf->data;
 			tbuf_peek(fiber->rbuf, p - (u8 *)fiber->rbuf->data);
 		}
-#line 278 "mod/silverbox/memcached.rl"
+#line 279 "mod/silverbox/memcached.rl"
 	{
 			key = read_field(keys);
 			struct box_tuple *tuple = find(key);
@@ -864,17 +865,17 @@ case 12:
 		}
 	goto st197;
 tr118:
-#line 502 "mod/silverbox/memcached.rl"
+#line 503 "mod/silverbox/memcached.rl"
 	{incr = natoq(fstart, p);}
-#line 532 "mod/silverbox/memcached.rl"
+#line 533 "mod/silverbox/memcached.rl"
 	{ p++; }
-#line 526 "mod/silverbox/memcached.rl"
+#line 527 "mod/silverbox/memcached.rl"
 	{
 			done = true;
 			stats.bytes_read += p - (u8 *)fiber->rbuf->data;
 			tbuf_peek(fiber->rbuf, p - (u8 *)fiber->rbuf->data);
 		}
-#line 316 "mod/silverbox/memcached.rl"
+#line 317 "mod/silverbox/memcached.rl"
 	{
 			struct meta *m;
 			struct tbuf *b;
@@ -927,15 +928,15 @@ case 12:
 		}
 	goto st197;
 tr122:
-#line 532 "mod/silverbox/memcached.rl"
+#line 533 "mod/silverbox/memcached.rl"
 	{ p++; }
-#line 526 "mod/silverbox/memcached.rl"
+#line 527 "mod/silverbox/memcached.rl"
 	{
 			done = true;
 			stats.bytes_read += p - (u8 *)fiber->rbuf->data;
 			tbuf_peek(fiber->rbuf, p - (u8 *)fiber->rbuf->data);
 		}
-#line 316 "mod/silverbox/memcached.rl"
+#line 317 "mod/silverbox/memcached.rl"
 	{
 			struct meta *m;
 			struct tbuf *b;
@@ -988,17 +989,17 @@ case 12:
 		}
 	goto st197;
 tr132:
-#line 534 "mod/silverbox/memcached.rl"
+#line 535 "mod/silverbox/memcached.rl"
 	{ noreply = true; }
-#line 532 "mod/silverbox/memcached.rl"
+#line 533 "mod/silverbox/memcached.rl"
 	{ p++; }
-#line 526 "mod/silverbox/memcached.rl"
+#line 527 "mod/silverbox/memcached.rl"
 	{
 			done = true;
 			stats.bytes_read += p - (u8 *)fiber->rbuf->data;
 			tbuf_peek(fiber->rbuf, p - (u8 *)fiber->rbuf->data);
 		}
-#line 316 "mod/silverbox/memcached.rl"
+#line 317 "mod/silverbox/memcached.rl"
 	{
 			struct meta *m;
 			struct tbuf *b;
@@ -1051,15 +1052,15 @@ case 12:
 		}
 	goto st197;
 tr141:
-#line 532 "mod/silverbox/memcached.rl"
+#line 533 "mod/silverbox/memcached.rl"
 	{ p++; }
-#line 526 "mod/silverbox/memcached.rl"
+#line 527 "mod/silverbox/memcached.rl"
 	{
 			done = true;
 			stats.bytes_read += p - (u8 *)fiber->rbuf->data;
 			tbuf_peek(fiber->rbuf, p - (u8 *)fiber->rbuf->data);
 		}
-#line 367 "mod/silverbox/memcached.rl"
+#line 368 "mod/silverbox/memcached.rl"
 	{
 			key = read_field(keys);
 			struct box_tuple *tuple = find(key);
@@ -1074,21 +1075,21 @@ case 12:
 		}
 	goto st197;
 tr146:
-#line 492 "mod/silverbox/memcached.rl"
+#line 493 "mod/silverbox/memcached.rl"
 	{
 			exptime = natoq(fstart, p);
 			if (exptime > 0 && exptime <= 60*60*24*30)
 				exptime = exptime + ev_now();
 		}
-#line 532 "mod/silverbox/memcached.rl"
+#line 533 "mod/silverbox/memcached.rl"
 	{ p++; }
-#line 526 "mod/silverbox/memcached.rl"
+#line 527 "mod/silverbox/memcached.rl"
 	{
 			done = true;
 			stats.bytes_read += p - (u8 *)fiber->rbuf->data;
 			tbuf_peek(fiber->rbuf, p - (u8 *)fiber->rbuf->data);
 		}
-#line 367 "mod/silverbox/memcached.rl"
+#line 368 "mod/silverbox/memcached.rl"
 	{
 			key = read_field(keys);
 			struct box_tuple *tuple = find(key);
@@ -1103,17 +1104,17 @@ case 12:
 		}
 	goto st197;
 tr157:
-#line 534 "mod/silverbox/memcached.rl"
+#line 535 "mod/silverbox/memcached.rl"
 	{ noreply = true; }
-#line 532 "mod/silverbox/memcached.rl"
+#line 533 "mod/silverbox/memcached.rl"
 	{ p++; }
-#line 526 "mod/silverbox/memcached.rl"
+#line 527 "mod/silverbox/memcached.rl"
 	{
 			done = true;
 			stats.bytes_read += p - (u8 *)fiber->rbuf->data;
 			tbuf_peek(fiber->rbuf, p - (u8 *)fiber->rbuf->data);
 		}
-#line 367 "mod/silverbox/memcached.rl"
+#line 368 "mod/silverbox/memcached.rl"
 	{
 			key = read_field(keys);
 			struct box_tuple *tuple = find(key);
@@ -1128,15 +1129,15 @@ case 12:
 		}
 	goto st197;
 tr169:
-#line 532 "mod/silverbox/memcached.rl"
+#line 533 "mod/silverbox/memcached.rl"
 	{ p++; }
-#line 526 "mod/silverbox/memcached.rl"
+#line 527 "mod/silverbox/memcached.rl"
 	{
 			done = true;
 			stats.bytes_read += p - (u8 *)fiber->rbuf->data;
 			tbuf_peek(fiber->rbuf, p - (u8 *)fiber->rbuf->data);
 		}
-#line 457 "mod/silverbox/memcached.rl"
+#line 458 "mod/silverbox/memcached.rl"
 	{
 			if (flush_delay > 0) {
 				struct fiber *f = fiber_create("flush_all", -1, -1, flush_all, (void *)flush_delay);
@@ -1148,17 +1149,17 @@ case 12:
 		}
 	goto st197;
 tr174:
-#line 503 "mod/silverbox/memcached.rl"
+#line 504 "mod/silverbox/memcached.rl"
 	{flush_delay = natoq(fstart, p);}
-#line 532 "mod/silverbox/memcached.rl"
+#line 533 "mod/silverbox/memcached.rl"
 	{ p++; }
-#line 526 "mod/silverbox/memcached.rl"
+#line 527 "mod/silverbox/memcached.rl"
 	{
 			done = true;
 			stats.bytes_read += p - (u8 *)fiber->rbuf->data;
 			tbuf_peek(fiber->rbuf, p - (u8 *)fiber->rbuf->data);
 		}
-#line 457 "mod/silverbox/memcached.rl"
+#line 458 "mod/silverbox/memcached.rl"
 	{
 			if (flush_delay > 0) {
 				struct fiber *f = fiber_create("flush_all", -1, -1, flush_all, (void *)flush_delay);
@@ -1170,17 +1171,17 @@ case 12:
 		}
 	goto st197;
 tr185:
-#line 534 "mod/silverbox/memcached.rl"
+#line 535 "mod/silverbox/memcached.rl"
 	{ noreply = true; }
-#line 532 "mod/silverbox/memcached.rl"
+#line 533 "mod/silverbox/memcached.rl"
 	{ p++; }
-#line 526 "mod/silverbox/memcached.rl"
+#line 527 "mod/silverbox/memcached.rl"
 	{
 			done = true;
 			stats.bytes_read += p - (u8 *)fiber->rbuf->data;
 			tbuf_peek(fiber->rbuf, p - (u8 *)fiber->rbuf->data);
 		}
-#line 457 "mod/silverbox/memcached.rl"
+#line 458 "mod/silverbox/memcached.rl"
 	{
 			if (flush_delay > 0) {
 				struct fiber *f = fiber_create("flush_all", -1, -1, flush_all, (void *)flush_delay);
@@ -1192,15 +1193,15 @@ case 12:
 		}
 	goto st197;
 tr195:
-#line 532 "mod/silverbox/memcached.rl"
+#line 533 "mod/silverbox/memcached.rl"
 	{ p++; }
-#line 526 "mod/silverbox/memcached.rl"
+#line 527 "mod/silverbox/memcached.rl"
 	{
 			done = true;
 			stats.bytes_read += p - (u8 *)fiber->rbuf->data;
 			tbuf_peek(fiber->rbuf, p - (u8 *)fiber->rbuf->data);
 		}
-#line 380 "mod/silverbox/memcached.rl"
+#line 381 "mod/silverbox/memcached.rl"
 	{
 			txn->op = SELECT;
 			fiber_register_cleanup((void *)txn_cleanup, txn);
@@ -1279,25 +1280,25 @@ case 12:
 		}
 	goto st197;
 tr213:
-#line 532 "mod/silverbox/memcached.rl"
+#line 533 "mod/silverbox/memcached.rl"
 	{ p++; }
-#line 526 "mod/silverbox/memcached.rl"
+#line 527 "mod/silverbox/memcached.rl"
 	{
 			done = true;
 			stats.bytes_read += p - (u8 *)fiber->rbuf->data;
 			tbuf_peek(fiber->rbuf, p - (u8 *)fiber->rbuf->data);
 		}
-#line 471 "mod/silverbox/memcached.rl"
+#line 472 "mod/silverbox/memcached.rl"
 	{
 			return 0;
 		}
 	goto st197;
 tr233:
-#line 500 "mod/silverbox/memcached.rl"
+#line 501 "mod/silverbox/memcached.rl"
 	{bytes = natoq(fstart, p);}
-#line 532 "mod/silverbox/memcached.rl"
+#line 533 "mod/silverbox/memcached.rl"
 	{ p++; }
-#line 505 "mod/silverbox/memcached.rl"
+#line 506 "mod/silverbox/memcached.rl"
 	{
 			size_t parsed = p - (u8 *)fiber->rbuf->data;
 			while (fiber->rbuf->len - parsed < bytes + 2) {
@@ -1318,13 +1319,13 @@ case 12:
 				goto exit;
 			}
 		}
-#line 526 "mod/silverbox/memcached.rl"
+#line 527 "mod/silverbox/memcached.rl"
 	{
 			done = true;
 			stats.bytes_read += p - (u8 *)fiber->rbuf->data;
 			tbuf_peek(fiber->rbuf, p - (u8 *)fiber->rbuf->data);
 		}
-#line 269 "mod/silverbox/memcached.rl"
+#line 270 "mod/silverbox/memcached.rl"
 	{
 			key = read_field(keys);
 			struct box_tuple *tuple = find(key);
@@ -1335,9 +1336,9 @@ case 12:
 		}
 	goto st197;
 tr237:
-#line 532 "mod/silverbox/memcached.rl"
+#line 533 "mod/silverbox/memcached.rl"
 	{ p++; }
-#line 505 "mod/silverbox/memcached.rl"
+#line 506 "mod/silverbox/memcached.rl"
 	{
 			size_t parsed = p - (u8 *)fiber->rbuf->data;
 			while (fiber->rbuf->len - parsed < bytes + 2) {
@@ -1358,13 +1359,13 @@ case 12:
 				goto exit;
 			}
 		}
-#line 526 "mod/silverbox/memcached.rl"
+#line 527 "mod/silverbox/memcached.rl"
 	{
 			done = true;
 			stats.bytes_read += p - (u8 *)fiber->rbuf->data;
 			tbuf_peek(fiber->rbuf, p - (u8 *)fiber->rbuf->data);
 		}
-#line 269 "mod/silverbox/memcached.rl"
+#line 270 "mod/silverbox/memcached.rl"
 	{
 			key = read_field(keys);
 			struct box_tuple *tuple = find(key);
@@ -1375,11 +1376,11 @@ case 12:
 		}
 	goto st197;
 tr246:
-#line 534 "mod/silverbox/memcached.rl"
+#line 535 "mod/silverbox/memcached.rl"
 	{ noreply = true; }
-#line 532 "mod/silverbox/memcached.rl"
+#line 533 "mod/silverbox/memcached.rl"
 	{ p++; }
-#line 505 "mod/silverbox/memcached.rl"
+#line 506 "mod/silverbox/memcached.rl"
 	{
 			size_t parsed = p - (u8 *)fiber->rbuf->data;
 			while (fiber->rbuf->len - parsed < bytes + 2) {
@@ -1400,13 +1401,13 @@ case 12:
 				goto exit;
 			}
 		}
-#line 526 "mod/silverbox/memcached.rl"
+#line 527 "mod/silverbox/memcached.rl"
 	{
 			done = true;
 			stats.bytes_read += p - (u8 *)fiber->rbuf->data;
 			tbuf_peek(fiber->rbuf, p - (u8 *)fiber->rbuf->data);
 		}
-#line 269 "mod/silverbox/memcached.rl"
+#line 270 "mod/silverbox/memcached.rl"
 	{
 			key = read_field(keys);
 			struct box_tuple *tuple = find(key);
@@ -1417,11 +1418,11 @@ case 12:
 		}
 	goto st197;
 tr263:
-#line 500 "mod/silverbox/memcached.rl"
+#line 501 "mod/silverbox/memcached.rl"
 	{bytes = natoq(fstart, p);}
-#line 532 "mod/silverbox/memcached.rl"
+#line 533 "mod/silverbox/memcached.rl"
 	{ p++; }
-#line 505 "mod/silverbox/memcached.rl"
+#line 506 "mod/silverbox/memcached.rl"
 	{
 			size_t parsed = p - (u8 *)fiber->rbuf->data;
 			while (fiber->rbuf->len - parsed < bytes + 2) {
@@ -1442,22 +1443,22 @@ case 12:
 				goto exit;
 			}
 		}
-#line 526 "mod/silverbox/memcached.rl"
+#line 527 "mod/silverbox/memcached.rl"
 	{
 			done = true;
 			stats.bytes_read += p - (u8 *)fiber->rbuf->data;
 			tbuf_peek(fiber->rbuf, p - (u8 *)fiber->rbuf->data);
 		}
-#line 255 "mod/silverbox/memcached.rl"
+#line 256 "mod/silverbox/memcached.rl"
 	{
 			key = read_field(keys);
 			STORE;
 		}
 	goto st197;
 tr267:
-#line 532 "mod/silverbox/memcached.rl"
+#line 533 "mod/silverbox/memcached.rl"
 	{ p++; }
-#line 505 "mod/silverbox/memcached.rl"
+#line 506 "mod/silverbox/memcached.rl"
 	{
 			size_t parsed = p - (u8 *)fiber->rbuf->data;
 			while (fiber->rbuf->len - parsed < bytes + 2) {
@@ -1478,24 +1479,24 @@ case 12:
 				goto exit;
 			}
 		}
-#line 526 "mod/silverbox/memcached.rl"
+#line 527 "mod/silverbox/memcached.rl"
 	{
 			done = true;
 			stats.bytes_read += p - (u8 *)fiber->rbuf->data;
 			tbuf_peek(fiber->rbuf, p - (u8 *)fiber->rbuf->data);
 		}
-#line 255 "mod/silverbox/memcached.rl"
+#line 256 "mod/silverbox/memcached.rl"
 	{
 			key = read_field(keys);
 			STORE;
 		}
 	goto st197;
 tr276:
-#line 534 "mod/silverbox/memcached.rl"
+#line 535 "mod/silverbox/memcached.rl"
 	{ noreply = true; }
-#line 532 "mod/silverbox/memcached.rl"
+#line 533 "mod/silverbox/memcached.rl"
 	{ p++; }
-#line 505 "mod/silverbox/memcached.rl"
+#line 506 "mod/silverbox/memcached.rl"
 	{
 			size_t parsed = p - (u8 *)fiber->rbuf->data;
 			while (fiber->rbuf->len - parsed < bytes + 2) {
@@ -1516,28 +1517,28 @@ case 12:
 				goto exit;
 			}
 		}
-#line 526 "mod/silverbox/memcached.rl"
+#line 527 "mod/silverbox/memcached.rl"
 	{
 			done = true;
 			stats.bytes_read += p - (u8 *)fiber->rbuf->data;
 			tbuf_peek(fiber->rbuf, p - (u8 *)fiber->rbuf->data);
 		}
-#line 255 "mod/silverbox/memcached.rl"
+#line 256 "mod/silverbox/memcached.rl"
 	{
 			key = read_field(keys);
 			STORE;
 		}
 	goto st197;
 tr281:
-#line 532 "mod/silverbox/memcached.rl"
+#line 533 "mod/silverbox/memcached.rl"
 	{ p++; }
-#line 526 "mod/silverbox/memcached.rl"
+#line 527 "mod/silverbox/memcached.rl"
 	{
 			done = true;
 			stats.bytes_read += p - (u8 *)fiber->rbuf->data;
 			tbuf_peek(fiber->rbuf, p - (u8 *)fiber->rbuf->data);
 		}
-#line 467 "mod/silverbox/memcached.rl"
+#line 468 "mod/silverbox/memcached.rl"
 	{
 			print_stats();
 		}
@@ -1546,33 +1547,33 @@ case 12:
 	if ( ++p == pe )
 		goto _test_eof197;
 case 197:
-#line 1550 "mod/silverbox/memcached.c"
+#line 1551 "mod/silverbox/memcached.c"
 	goto st0;
 tr27:
-#line 500 "mod/silverbox/memcached.rl"
+#line 501 "mod/silverbox/memcached.rl"
 	{bytes = natoq(fstart, p);}
 	goto st13;
 tr40:
-#line 534 "mod/silverbox/memcached.rl"
+#line 535 "mod/silverbox/memcached.rl"
 	{ noreply = true; }
 	goto st13;
 st13:
 	if ( ++p == pe )
 		goto _test_eof13;
 case 13:
-#line 1564 "mod/silverbox/memcached.c"
+#line 1565 "mod/silverbox/memcached.c"
 	if ( (*p) == 10 )
 		goto tr30;
 	goto st0;
 tr28:
-#line 500 "mod/silverbox/memcached.rl"
+#line 501 "mod/silverbox/memcached.rl"
 	{bytes = natoq(fstart, p);}
 	goto st14;
 st14:
 	if ( ++p == pe )
 		goto _test_eof14;
 case 14:
-#line 1576 "mod/silverbox/memcached.c"
+#line 1577 "mod/silverbox/memcached.c"
 	switch( (*p) ) {
 		case 32: goto st14;
 		case 110: goto st15;
@@ -1665,18 +1666,18 @@ case 26:
 		goto tr45;
 	goto st0;
 tr45:
-#line 540 "mod/silverbox/memcached.rl"
+#line 541 "mod/silverbox/memcached.rl"
 	{append = true; }
 	goto st27;
 tr209:
-#line 541 "mod/silverbox/memcached.rl"
+#line 542 "mod/silverbox/memcached.rl"
 	{append = false;}
 	goto st27;
 st27:
 	if ( ++p == pe )
 		goto _test_eof27;
 case 27:
-#line 1680 "mod/silverbox/memcached.c"
+#line 1681 "mod/silverbox/memcached.c"
 	switch( (*p) ) {
 		case 13: goto st0;
 		case 32: goto st27;
@@ -1685,7 +1686,7 @@ case 27:
 		goto st0;
 	goto tr46;
 tr46:
-#line 476 "mod/silverbox/memcached.rl"
+#line 477 "mod/silverbox/memcached.rl"
 	{
 			fstart = p;
 			for (; p < pe && *p != ' ' && *p != '\r' && *p != '\n'; p++);
@@ -1702,7 +1703,7 @@ case 27:
 	if ( ++p == pe )
 		goto _test_eof28;
 case 28:
-#line 1706 "mod/silverbox/memcached.c"
+#line 1707 "mod/silverbox/memcached.c"
 	if ( (*p) == 32 )
 		goto st29;
 	goto st0;
@@ -1716,49 +1717,49 @@ case 29:
 		goto tr49;
 	goto st0;
 tr49:
-#line 475 "mod/silverbox/memcached.rl"
+#line 476 "mod/silverbox/memcached.rl"
 	{ fstart = p; }
 	goto st30;
 st30:
 	if ( ++p == pe )
 		goto _test_eof30;
 case 30:
-#line 1727 "mod/silverbox/memcached.c"
+#line 1728 "mod/silverbox/memcached.c"
 	if ( (*p) == 32 )
 		goto tr50;
 	if ( 48 <= (*p) && (*p) <= 57 )
 		goto st30;
 	goto st0;
 tr50:
-#line 499 "mod/silverbox/memcached.rl"
+#line 500 "mod/silverbox/memcached.rl"
 	{flags = natoq(fstart, p);}
 	goto st31;
 st31:
 	if ( ++p == pe )
 		goto _test_eof31;
 case 31:
-#line 1741 "mod/silverbox/memcached.c"
+#line 1742 "mod/silverbox/memcached.c"
 	if ( (*p) == 32 )
 		goto st31;
 	if ( 48 <= (*p) && (*p) <= 57 )
 		goto tr53;
 	goto st0;
 tr53:
-#line 475 "mod/silverbox/memcached.rl"
+#line 476 "mod/silverbox/memcached.rl"
 	{ fstart = p; }
 	goto st32;
 st32:
 	if ( ++p == pe )
 		goto _test_eof32;
 case 32:
-#line 1755 "mod/silverbox/memcached.c"
+#line 1756 "mod/silverbox/memcached.c"
 	if ( (*p) == 32 )
 		goto tr54;
 	if ( 48 <= (*p) && (*p) <= 57 )
 		goto st32;
 	goto st0;
 tr54:
-#line 492 "mod/silverbox/memcached.rl"
+#line 493 "mod/silverbox/memcached.rl"
 	{
 			exptime = natoq(fstart, p);
 			if (exptime > 0 && exptime <= 60*60*24*30)
@@ -1769,21 +1770,21 @@ case 32:
 	if ( ++p == pe )
 		goto _test_eof33;
 case 33:
-#line 1773 "mod/silverbox/memcached.c"
+#line 1774 "mod/silverbox/memcached.c"
 	if ( (*p) == 32 )
 		goto st33;
 	if ( 48 <= (*p) && (*p) <= 57 )
 		goto tr57;
 	goto st0;
 tr57:
-#line 475 "mod/silverbox/memcached.rl"
+#line 476 "mod/silverbox/memcached.rl"
 	{ fstart = p; }
 	goto st34;
 st34:
 	if ( ++p == pe )
 		goto _test_eof34;
 case 34:
-#line 1787 "mod/silverbox/memcached.c"
+#line 1788 "mod/silverbox/memcached.c"
 	switch( (*p) ) {
 		case 10: goto tr58;
 		case 13: goto tr59;
@@ -1793,30 +1794,30 @@ case 34:
 		goto st34;
 	goto st0;
 tr59:
-#line 500 "mod/silverbox/memcached.rl"
+#line 501 "mod/silverbox/memcached.rl"
 	{bytes = natoq(fstart, p);}
 	goto st35;
 tr72:
-#line 534 "mod/silverbox/memcached.rl"
+#line 535 "mod/silverbox/memcached.rl"
 	{ noreply = true; }
 	goto st35;
 st35:
 	if ( ++p == pe )
 		goto _test_eof35;
 case 35:
-#line 1808 "mod/silverbox/memcached.c"
+#line 1809 "mod/silverbox/memcached.c"
 	if ( (*p) == 10 )
 		goto tr62;
 	goto st0;
 tr60:
-#line 500 "mod/silverbox/memcached.rl"
+#line 501 "mod/silverbox/memcached.rl"
 	{bytes = natoq(fstart, p);}
 	goto st36;
 st36:
 	if ( ++p == pe )
 		goto _test_eof36;
 case 36:
-#line 1820 "mod/silverbox/memcached.c"
+#line 1821 "mod/silverbox/memcached.c"
 	switch( (*p) ) {
 		case 32: goto st36;
 		case 110: goto st37;
@@ -1906,7 +1907,7 @@ case 47:
 		goto st0;
 	goto tr76;
 tr76:
-#line 476 "mod/silverbox/memcached.rl"
+#line 477 "mod/silverbox/memcached.rl"
 	{
 			fstart = p;
 			for (; p < pe && *p != ' ' && *p != '\r' && *p != '\n'; p++);
@@ -1923,7 +1924,7 @@ case 47:
 	if ( ++p == pe )
 		goto _test_eof48;
 case 48:
-#line 1927 "mod/silverbox/memcached.c"
+#line 1928 "mod/silverbox/memcached.c"
 	if ( (*p) == 32 )
 		goto st49;
 	goto st0;
@@ -1937,49 +1938,49 @@ case 49:
 		goto tr78;
 	goto st0;
 tr78:
-#line 475 "mod/silverbox/memcached.rl"
+#line 476 "mod/silverbox/memcached.rl"
 	{ fstart = p; }
 	goto st50;
 st50:
 	if ( ++p == pe )
 		goto _test_eof50;
 case 50:
-#line 1948 "mod/silverbox/memcached.c"
+#line 1949 "mod/silverbox/memcached.c"
 	if ( (*p) == 32 )
 		goto tr79;
 	if ( 48 <= (*p) && (*p) <= 57 )
 		goto st50;
 	goto st0;
 tr79:
-#line 499 "mod/silverbox/memcached.rl"
+#line 500 "mod/silverbox/memcached.rl"
 	{flags = natoq(fstart, p);}
 	goto st51;
 st51:
 	if ( ++p == pe )
 		goto _test_eof51;
 case 51:
-#line 1962 "mod/silverbox/memcached.c"
+#line 1963 "mod/silverbox/memcached.c"
 	if ( (*p) == 32 )
 		goto st51;
 	if ( 48 <= (*p) && (*p) <= 57 )
 		goto tr82;
 	goto st0;
 tr82:
-#line 475 "mod/silverbox/memcached.rl"
+#line 476 "mod/silverbox/memcached.rl"
 	{ fstart = p; }
 	goto st52;
 st52:
 	if ( ++p == pe )
 		goto _test_eof52;
 case 52:
-#line 1976 "mod/silverbox/memcached.c"
+#line 1977 "mod/silverbox/memcached.c"
 	if ( (*p) == 32 )
 		goto tr83;
 	if ( 48 <= (*p) && (*p) <= 57 )
 		goto st52;
 	goto st0;
 tr83:
-#line 492 "mod/silverbox/memcached.rl"
+#line 493 "mod/silverbox/memcached.rl"
 	{
 			exptime = natoq(fstart, p);
 			if (exptime > 0 && exptime <= 60*60*24*30)
@@ -1990,49 +1991,49 @@ case 52:
 	if ( ++p == pe )
 		goto _test_eof53;
 case 53:
-#line 1994 "mod/silverbox/memcached.c"
+#line 1995 "mod/silverbox/memcached.c"
 	if ( (*p) == 32 )
 		goto st53;
 	if ( 48 <= (*p) && (*p) <= 57 )
 		goto tr86;
 	goto st0;
 tr86:
-#line 475 "mod/silverbox/memcached.rl"
+#line 476 "mod/silverbox/memcached.rl"
 	{ fstart = p; }
 	goto st54;
 st54:
 	if ( ++p == pe )
 		goto _test_eof54;
 case 54:
-#line 2008 "mod/silverbox/memcached.c"
+#line 2009 "mod/silverbox/memcached.c"
 	if ( (*p) == 32 )
 		goto tr87;
 	if ( 48 <= (*p) && (*p) <= 57 )
 		goto st54;
 	goto st0;
 tr87:
-#line 500 "mod/silverbox/memcached.rl"
+#line 501 "mod/silverbox/memcached.rl"
 	{bytes = natoq(fstart, p);}
 	goto st55;
 st55:
 	if ( ++p == pe )
 		goto _test_eof55;
 case 55:
-#line 2022 "mod/silverbox/memcached.c"
+#line 2023 "mod/silverbox/memcached.c"
 	if ( (*p) == 32 )
 		goto st55;
 	if ( 48 <= (*p) && (*p) <= 57 )
 		goto tr90;
 	goto st0;
 tr90:
-#line 475 "mod/silverbox/memcached.rl"
+#line 476 "mod/silverbox/memcached.rl"
 	{ fstart = p; }
 	goto st56;
 st56:
 	if ( ++p == pe )
 		goto _test_eof56;
 case 56:
-#line 2036 "mod/silverbox/memcached.c"
+#line 2037 "mod/silverbox/memcached.c"
 	switch( (*p) ) {
 		case 10: goto tr91;
 		case 13: goto tr92;
@@ -2042,30 +2043,30 @@ case 56:
 		goto st56;
 	goto st0;
 tr106:
-#line 534 "mod/silverbox/memcached.rl"
+#line 535 "mod/silverbox/memcached.rl"
 	{ noreply = true; }
 	goto st57;
 tr92:
-#line 501 "mod/silverbox/memcached.rl"
+#line 502 "mod/silverbox/memcached.rl"
 	{cas = natoq(fstart, p);}
 	goto st57;
 st57:
 	if ( ++p == pe )
 		goto _test_eof57;
 case 57:
-#line 2057 "mod/silverbox/memcached.c"
+#line 2058 "mod/silverbox/memcached.c"
 	if ( (*p) == 10 )
 		goto tr95;
 	goto st0;
 tr93:
-#line 501 "mod/silverbox/memcached.rl"
+#line 502 "mod/silverbox/memcached.rl"
 	{cas = natoq(fstart, p);}
 	goto st58;
 st58:
 	if ( ++p == pe )
 		goto _test_eof58;
 case 58:
-#line 2069 "mod/silverbox/memcached.c"
+#line 2070 "mod/silverbox/memcached.c"
 	switch( (*p) ) {
 		case 10: goto tr95;
 		case 13: goto st57;
@@ -2126,14 +2127,14 @@ case 65:
 	}
 	goto st0;
 tr107:
-#line 534 "mod/silverbox/memcached.rl"
+#line 535 "mod/silverbox/memcached.rl"
 	{ noreply = true; }
 	goto st66;
 st66:
 	if ( ++p == pe )
 		goto _test_eof66;
 case 66:
-#line 2137 "mod/silverbox/memcached.c"
+#line 2138 "mod/silverbox/memcached.c"
 	switch( (*p) ) {
 		case 10: goto tr95;
 		case 13: goto st57;
@@ -2171,18 +2172,18 @@ case 70:
 		goto tr113;
 	goto st0;
 tr113:
-#line 549 "mod/silverbox/memcached.rl"
+#line 550 "mod/silverbox/memcached.rl"
 	{incr_sign = -1;}
 	goto st71;
 tr202:
-#line 548 "mod/silverbox/memcached.rl"
+#line 549 "mod/silverbox/memcached.rl"
 	{incr_sign = 1; }
 	goto st71;
 st71:
 	if ( ++p == pe )
 		goto _test_eof71;
 case 71:
-#line 2186 "mod/silverbox/memcached.c"
+#line 2187 "mod/silverbox/memcached.c"
 	switch( (*p) ) {
 		case 13: goto st0;
 		case 32: goto st71;
@@ -2191,7 +2192,7 @@ case 71:
 		goto st0;
 	goto tr114;
 tr114:
-#line 476 "mod/silverbox/memcached.rl"
+#line 477 "mod/silverbox/memcached.rl"
 	{
 			fstart = p;
 			for (; p < pe && *p != ' ' && *p != '\r' && *p != '\n'; p++);
@@ -2208,7 +2209,7 @@ case 71:
 	if ( ++p == pe )
 		goto _test_eof72;
 case 72:
-#line 2212 "mod/silverbox/memcached.c"
+#line 2213 "mod/silverbox/memcached.c"
 	if ( (*p) == 32 )
 		goto st73;
 	goto st0;
@@ -2222,14 +2223,14 @@ case 73:
 		goto tr117;
 	goto st0;
 tr117:
-#line 475 "mod/silverbox/memcached.rl"
+#line 476 "mod/silverbox/memcached.rl"
 	{ fstart = p; }
 	goto st74;
 st74:
 	if ( ++p == pe )
 		goto _test_eof74;
 case 74:
-#line 2233 "mod/silverbox/memcached.c"
+#line 2234 "mod/silverbox/memcached.c"
 	switch( (*p) ) {
 		case 10: goto tr118;
 		case 13: goto tr119;
@@ -2239,30 +2240,30 @@ case 74:
 		goto st74;
 	goto st0;
 tr133:
-#line 534 "mod/silverbox/memcached.rl"
+#line 535 "mod/silverbox/memcached.rl"
 	{ noreply = true; }
 	goto st75;
 tr119:
-#line 502 "mod/silverbox/memcached.rl"
+#line 503 "mod/silverbox/memcached.rl"
 	{incr = natoq(fstart, p);}
 	goto st75;
 st75:
 	if ( ++p == pe )
 		goto _test_eof75;
 case 75:
-#line 2254 "mod/silverbox/memcached.c"
+#line 2255 "mod/silverbox/memcached.c"
 	if ( (*p) == 10 )
 		goto tr122;
 	goto st0;
 tr120:
-#line 502 "mod/silverbox/memcached.rl"
+#line 503 "mod/silverbox/memcached.rl"
 	{incr = natoq(fstart, p);}
 	goto st76;
 st76:
 	if ( ++p == pe )
 		goto _test_eof76;
 case 76:
-#line 2266 "mod/silverbox/memcached.c"
+#line 2267 "mod/silverbox/memcached.c"
 	switch( (*p) ) {
 		case 10: goto tr122;
 		case 13: goto st75;
@@ -2323,14 +2324,14 @@ case 83:
 	}
 	goto st0;
 tr134:
-#line 534 "mod/silverbox/memcached.rl"
+#line 535 "mod/silverbox/memcached.rl"
 	{ noreply = true; }
 	goto st84;
 st84:
 	if ( ++p == pe )
 		goto _test_eof84;
 case 84:
-#line 2334 "mod/silverbox/memcached.c"
+#line 2335 "mod/silverbox/memcached.c"
 	switch( (*p) ) {
 		case 10: goto tr122;
 		case 13: goto st75;
@@ -2377,7 +2378,7 @@ case 89:
 		goto st0;
 	goto tr140;
 tr140:
-#line 476 "mod/silverbox/memcached.rl"
+#line 477 "mod/silverbox/memcached.rl"
 	{
 			fstart = p;
 			for (; p < pe && *p != ' ' && *p != '\r' && *p != '\n'; p++);
@@ -2394,7 +2395,7 @@ case 89:
 	if ( ++p == pe )
 		goto _test_eof90;
 case 90:
-#line 2398 "mod/silverbox/memcached.c"
+#line 2399 "mod/silverbox/memcached.c"
 	switch( (*p) ) {
 		case 10: goto tr141;
 		case 13: goto st91;
@@ -2402,7 +2403,7 @@ case 90:
 	}
 	goto st0;
 tr147:
-#line 492 "mod/silverbox/memcached.rl"
+#line 493 "mod/silverbox/memcached.rl"
 	{
 			exptime = natoq(fstart, p);
 			if (exptime > 0 && exptime <= 60*60*24*30)
@@ -2410,14 +2411,14 @@ case 90:
 		}
 	goto st91;
 tr158:
-#line 534 "mod/silverbox/memcached.rl"
+#line 535 "mod/silverbox/memcached.rl"
 	{ noreply = true; }
 	goto st91;
 st91:
 	if ( ++p == pe )
 		goto _test_eof91;
 case 91:
-#line 2421 "mod/silverbox/memcached.c"
+#line 2422 "mod/silverbox/memcached.c"
 	if ( (*p) == 10 )
 		goto tr141;
 	goto st0;
@@ -2435,14 +2436,14 @@ case 92:
 		goto tr144;
 	goto st0;
 tr144:
-#line 475 "mod/silverbox/memcached.rl"
+#line 476 "mod/silverbox/memcached.rl"
 	{ fstart = p; }
 	goto st93;
 st93:
 	if ( ++p == pe )
 		goto _test_eof93;
 case 93:
-#line 2446 "mod/silverbox/memcached.c"
+#line 2447 "mod/silverbox/memcached.c"
 	switch( (*p) ) {
 		case 10: goto tr146;
 		case 13: goto tr147;
@@ -2452,7 +2453,7 @@ case 93:
 		goto st93;
 	goto st0;
 tr148:
-#line 492 "mod/silverbox/memcached.rl"
+#line 493 "mod/silverbox/memcached.rl"
 	{
 			exptime = natoq(fstart, p);
 			if (exptime > 0 && exptime <= 60*60*24*30)
@@ -2463,7 +2464,7 @@ case 93:
 	if ( ++p == pe )
 		goto _test_eof94;
 case 94:
-#line 2467 "mod/silverbox/memcached.c"
+#line 2468 "mod/silverbox/memcached.c"
 	switch( (*p) ) {
 		case 10: goto tr141;
 		case 13: goto st91;
@@ -2524,14 +2525,14 @@ case 101:
 	}
 	goto st0;
 tr159:
-#line 534 "mod/silverbox/memcached.rl"
+#line 535 "mod/silverbox/memcached.rl"
 	{ noreply = true; }
 	goto st102;
 st102:
 	if ( ++p == pe )
 		goto _test_eof102;
 case 102:
-#line 2535 "mod/silverbox/memcached.c"
+#line 2536 "mod/silverbox/memcached.c"
 	switch( (*p) ) {
 		case 10: goto tr141;
 		case 13: goto st91;
@@ -2605,18 +2606,18 @@ case 111:
 	}
 	goto st0;
 tr186:
-#line 534 "mod/silverbox/memcached.rl"
+#line 535 "mod/silverbox/memcached.rl"
 	{ noreply = true; }
 	goto st112;
 tr175:
-#line 503 "mod/silverbox/memcached.rl"
+#line 504 "mod/silverbox/memcached.rl"
 	{flush_delay = natoq(fstart, p);}
 	goto st112;
 st112:
 	if ( ++p == pe )
 		goto _test_eof112;
 case 112:
-#line 2620 "mod/silverbox/memcached.c"
+#line 2621 "mod/silverbox/memcached.c"
 	if ( (*p) == 10 )
 		goto tr169;
 	goto st0;
@@ -2634,14 +2635,14 @@ case 113:
 		goto tr172;
 	goto st0;
 tr172:
-#line 475 "mod/silverbox/memcached.rl"
+#line 476 "mod/silverbox/memcached.rl"
 	{ fstart = p; }
 	goto st114;
 st114:
 	if ( ++p == pe )
 		goto _test_eof114;
 case 114:
-#line 2645 "mod/silverbox/memcached.c"
+#line 2646 "mod/silverbox/memcached.c"
 	switch( (*p) ) {
 		case 10: goto tr174;
 		case 13: goto tr175;
@@ -2651,14 +2652,14 @@ case 114:
 		goto st114;
 	goto st0;
 tr176:
-#line 503 "mod/silverbox/memcached.rl"
+#line 504 "mod/silverbox/memcached.rl"
 	{flush_delay = natoq(fstart, p);}
 	goto st115;
 st115:
 	if ( ++p == pe )
 		goto _test_eof115;
 case 115:
-#line 2662 "mod/silverbox/memcached.c"
+#line 2663 "mod/silverbox/memcached.c"
 	switch( (*p) ) {
 		case 10: goto tr169;
 		case 13: goto st112;
@@ -2719,14 +2720,14 @@ case 122:
 	}
 	goto st0;
 tr187:
-#line 534 "mod/silverbox/memcached.rl"
+#line 535 "mod/silverbox/memcached.rl"
 	{ noreply = true; }
 	goto st123;
 st123:
 	if ( ++p == pe )
 		goto _test_eof123;
 case 123:
-#line 2730 "mod/silverbox/memcached.c"
+#line 2731 "mod/silverbox/memcached.c"
 	switch( (*p) ) {
 		case 10: goto tr169;
 		case 13: goto st112;
@@ -2757,18 +2758,18 @@ case 126:
 	}
 	goto st0;
 tr191:
-#line 545 "mod/silverbox/memcached.rl"
+#line 546 "mod/silverbox/memcached.rl"
 	{show_cas = false;}
 	goto st127;
 tr198:
-#line 546 "mod/silverbox/memcached.rl"
+#line 547 "mod/silverbox/memcached.rl"
 	{show_cas = true;}
 	goto st127;
 st127:
 	if ( ++p == pe )
 		goto _test_eof127;
 case 127:
-#line 2772 "mod/silverbox/memcached.c"
+#line 2773 "mod/silverbox/memcached.c"
 	switch( (*p) ) {
 		case 13: goto st0;
 		case 32: goto st127;
@@ -2777,7 +2778,7 @@ case 127:
 		goto st0;
 	goto tr193;
 tr193:
-#line 476 "mod/silverbox/memcached.rl"
+#line 477 "mod/silverbox/memcached.rl"
 	{
 			fstart = p;
 			for (; p < pe && *p != ' ' && *p != '\r' && *p != '\n'; p++);
@@ -2794,7 +2795,7 @@ case 127:
 	if ( ++p == pe )
 		goto _test_eof128;
 case 128:
-#line 2798 "mod/silverbox/memcached.c"
+#line 2799 "mod/silverbox/memcached.c"
 	switch( (*p) ) {
 		case 10: goto tr195;
 		case 13: goto st129;
@@ -3001,7 +3002,7 @@ case 155:
 		goto st0;
 	goto tr222;
 tr222:
-#line 476 "mod/silverbox/memcached.rl"
+#line 477 "mod/silverbox/memcached.rl"
 	{
 			fstart = p;
 			for (; p < pe && *p != ' ' && *p != '\r' && *p != '\n'; p++);
@@ -3018,7 +3019,7 @@ case 155:
 	if ( ++p == pe )
 		goto _test_eof156;
 case 156:
-#line 3022 "mod/silverbox/memcached.c"
+#line 3023 "mod/silverbox/memcached.c"
 	if ( (*p) == 32 )
 		goto st157;
 	goto st0;
@@ -3032,49 +3033,49 @@ case 157:
 		goto tr224;
 	goto st0;
 tr224:
-#line 475 "mod/silverbox/memcached.rl"
+#line 476 "mod/silverbox/memcached.rl"
 	{ fstart = p; }
 	goto st158;
 st158:
 	if ( ++p == pe )
 		goto _test_eof158;
 case 158:
-#line 3043 "mod/silverbox/memcached.c"
+#line 3044 "mod/silverbox/memcached.c"
 	if ( (*p) == 32 )
 		goto tr225;
 	if ( 48 <= (*p) && (*p) <= 57 )
 		goto st158;
 	goto st0;
 tr225:
-#line 499 "mod/silverbox/memcached.rl"
+#line 500 "mod/silverbox/memcached.rl"
 	{flags = natoq(fstart, p);}
 	goto st159;
 st159:
 	if ( ++p == pe )
 		goto _test_eof159;
 case 159:
-#line 3057 "mod/silverbox/memcached.c"
+#line 3058 "mod/silverbox/memcached.c"
 	if ( (*p) == 32 )
 		goto st159;
 	if ( 48 <= (*p) && (*p) <= 57 )
 		goto tr228;
 	goto st0;
 tr228:
-#line 475 "mod/silverbox/memcached.rl"
+#line 476 "mod/silverbox/memcached.rl"
 	{ fstart = p; }
 	goto st160;
 st160:
 	if ( ++p == pe )
 		goto _test_eof160;
 case 160:
-#line 3071 "mod/silverbox/memcached.c"
+#line 3072 "mod/silverbox/memcached.c"
 	if ( (*p) == 32 )
 		goto tr229;
 	if ( 48 <= (*p) && (*p) <= 57 )
 		goto st160;
 	goto st0;
 tr229:
-#line 492 "mod/silverbox/memcached.rl"
+#line 493 "mod/silverbox/memcached.rl"
 	{
 			exptime = natoq(fstart, p);
 			if (exptime > 0 && exptime <= 60*60*24*30)
@@ -3085,21 +3086,21 @@ case 160:
 	if ( ++p == pe )
 		goto _test_eof161;
 case 161:
-#line 3089 "mod/silverbox/memcached.c"
+#line 3090 "mod/silverbox/memcached.c"
 	if ( (*p) == 32 )
 		goto st161;
 	if ( 48 <= (*p) && (*p) <= 57 )
 		goto tr232;
 	goto st0;
 tr232:
-#line 475 "mod/silverbox/memcached.rl"
+#line 476 "mod/silverbox/memcached.rl"
 	{ fstart = p; }
 	goto st162;
 st162:
 	if ( ++p == pe )
 		goto _test_eof162;
 case 162:
-#line 3103 "mod/silverbox/memcached.c"
+#line 3104 "mod/silverbox/memcached.c"
 	switch( (*p) ) {
 		case 10: goto tr233;
 		case 13: goto tr234;
@@ -3109,30 +3110,30 @@ case 162:
 		goto st162;
 	goto st0;
 tr234:
-#line 500 "mod/silverbox/memcached.rl"
+#line 501 "mod/silverbox/memcached.rl"
 	{bytes = natoq(fstart, p);}
 	goto st163;
 tr247:
-#line 534 "mod/silverbox/memcached.rl"
+#line 535 "mod/silverbox/memcached.rl"
 	{ noreply = true; }
 	goto st163;
 st163:
 	if ( ++p == pe )
 		goto _test_eof163;
 case 163:
-#line 3124 "mod/silverbox/memcached.c"
+#line 3125 "mod/silverbox/memcached.c"
 	if ( (*p) == 10 )
 		goto tr237;
 	goto st0;
 tr235:
-#line 500 "mod/silverbox/memcached.rl"
+#line 501 "mod/silverbox/memcached.rl"
 	{bytes = natoq(fstart, p);}
 	goto st164;
 st164:
 	if ( ++p == pe )
 		goto _test_eof164;
 case 164:
-#line 3136 "mod/silverbox/memcached.c"
+#line 3137 "mod/silverbox/memcached.c"
 	switch( (*p) ) {
 		case 32: goto st164;
 		case 110: goto st165;
@@ -3224,7 +3225,7 @@ case 175:
 		goto st0;
 	goto tr252;
 tr252:
-#line 476 "mod/silverbox/memcached.rl"
+#line 477 "mod/silverbox/memcached.rl"
 	{
 			fstart = p;
 			for (; p < pe && *p != ' ' && *p != '\r' && *p != '\n'; p++);
@@ -3241,7 +3242,7 @@ case 175:
 	if ( ++p == pe )
 		goto _test_eof176;
 case 176:
-#line 3245 "mod/silverbox/memcached.c"
+#line 3246 "mod/silverbox/memcached.c"
 	if ( (*p) == 32 )
 		goto st177;
 	goto st0;
@@ -3255,49 +3256,49 @@ case 177:
 		goto tr254;
 	goto st0;
 tr254:
-#line 475 "mod/silverbox/memcached.rl"
+#line 476 "mod/silverbox/memcached.rl"
 	{ fstart = p; }
 	goto st178;
 st178:
 	if ( ++p == pe )
 		goto _test_eof178;
 case 178:
-#line 3266 "mod/silverbox/memcached.c"
+#line 3267 "mod/silverbox/memcached.c"
 	if ( (*p) == 32 )
 		goto tr255;
 	if ( 48 <= (*p) && (*p) <= 57 )
 		goto st178;
 	goto st0;
 tr255:
-#line 499 "mod/silverbox/memcached.rl"
+#line 500 "mod/silverbox/memcached.rl"
 	{flags = natoq(fstart, p);}
 	goto st179;
 st179:
 	if ( ++p == pe )
 		goto _test_eof179;
 case 179:
-#line 3280 "mod/silverbox/memcached.c"
+#line 3281 "mod/silverbox/memcached.c"
 	if ( (*p) == 32 )
 		goto st179;
 	if ( 48 <= (*p) && (*p) <= 57 )
 		goto tr258;
 	goto st0;
 tr258:
-#line 475 "mod/silverbox/memcached.rl"
+#line 476 "mod/silverbox/memcached.rl"
 	{ fstart = p; }
 	goto st180;
 st180:
 	if ( ++p == pe )
 		goto _test_eof180;
 case 180:
-#line 3294 "mod/silverbox/memcached.c"
+#line 3295 "mod/silverbox/memcached.c"
 	if ( (*p) == 32 )
 		goto tr259;
 	if ( 48 <= (*p) && (*p) <= 57 )
 		goto st180;
 	goto st0;
 tr259:
-#line 492 "mod/silverbox/memcached.rl"
+#line 493 "mod/silverbox/memcached.rl"
 	{
 			exptime = natoq(fstart, p);
 			if (exptime > 0 && exptime <= 60*60*24*30)
@@ -3308,21 +3309,21 @@ case 180:
 	if ( ++p == pe )
 		goto _test_eof181;
 case 181:
-#line 3312 "mod/silverbox/memcached.c"
+#line 3313 "mod/silverbox/memcached.c"
 	if ( (*p) == 32 )
 		goto st181;
 	if ( 48 <= (*p) && (*p) <= 57 )
 		goto tr262;
 	goto st0;
 tr262:
-#line 475 "mod/silverbox/memcached.rl"
+#line 476 "mod/silverbox/memcached.rl"
 	{ fstart = p; }
 	goto st182;
 st182:
 	if ( ++p == pe )
 		goto _test_eof182;
 case 182:
-#line 3326 "mod/silverbox/memcached.c"
+#line 3327 "mod/silverbox/memcached.c"
 	switch( (*p) ) {
 		case 10: goto tr263;
 		case 13: goto tr264;
@@ -3332,30 +3333,30 @@ case 182:
 		goto st182;
 	goto st0;
 tr264:
-#line 500 "mod/silverbox/memcached.rl"
+#line 501 "mod/silverbox/memcached.rl"
 	{bytes = natoq(fstart, p);}
 	goto st183;
 tr277:
-#line 534 "mod/silverbox/memcached.rl"
+#line 535 "mod/silverbox/memcached.rl"
 	{ noreply = true; }
 	goto st183;
 st183:
 	if ( ++p == pe )
 		goto _test_eof183;
 case 183:
-#line 3347 "mod/silverbox/memcached.c"
+#line 3348 "mod/silverbox/memcached.c"
 	if ( (*p) == 10 )
 		goto tr267;
 	goto st0;
 tr265:
-#line 500 "mod/silverbox/memcached.rl"
+#line 501 "mod/silverbox/memcached.rl"
 	{bytes = natoq(fstart, p);}
 	goto st184;
 st184:
 	if ( ++p == pe )
 		goto _test_eof184;
 case 184:
-#line 3359 "mod/silverbox/memcached.c"
+#line 3360 "mod/silverbox/memcached.c"
 	switch( (*p) ) {
 		case 32: goto st184;
 		case 110: goto st185;
@@ -3651,7 +3652,7 @@ case 196:
 	_out: {}
 	}
 
-#line 559 "mod/silverbox/memcached.rl"
+#line 560 "mod/silverbox/memcached.rl"
 
 
 	if (!done) {
@@ -3753,6 +3754,8 @@ memcached_expire(void *data __unused__)
 			i = kh_begin(map);
 
 		struct tbuf *keys_to_delete = tbuf_alloc(fiber->pool);
+		int expired_keys = 0;
+
 		for (int j = 0; j < cfg.memcached_expire_per_loop; j++, i++) {
 			if (i == kh_end(map)) {
 				i = kh_begin(map);
@@ -3774,7 +3777,9 @@ memcached_expire(void *data __unused__)
 		while (keys_to_delete->len > 0) {
 			struct box_txn *txn = txn_alloc(BOX_QUIET);
 			delete(txn, read_field(keys_to_delete));
+			expired_keys++;
 		}
+		stat_collect(stat_base, MEMC_EXPIRED_KEYS, expired_keys);
 
 		fiber_gc();
 
diff --git a/mod/silverbox/memcached.rl b/mod/silverbox/memcached.rl
index 28c64356916a3da5cc1c312e216b0a60a477cbf9..4df75b1ba53d6b9f2494d101f3c07df244c5d5aa 100644
--- a/mod/silverbox/memcached.rl
+++ b/mod/silverbox/memcached.rl
@@ -44,7 +44,8 @@
 #define STAT(_)					\
         _(MEMC_GET, 1)				\
         _(MEMC_GET_MISS, 2)			\
-	_(MEMC_GET_HIT, 3)
+	_(MEMC_GET_HIT, 3)			\
+	_(MEMC_EXPIRED_KEYS, 4)
 
 ENUM(memcached_stat, STAT);
 STRS(memcached_stat, STAT);
@@ -657,6 +658,8 @@ memcached_expire(void *data __unused__)
 			i = kh_begin(map);
 
 		struct tbuf *keys_to_delete = tbuf_alloc(fiber->pool);
+		int expired_keys = 0;
+
 		for (int j = 0; j < cfg.memcached_expire_per_loop; j++, i++) {
 			if (i == kh_end(map)) {
 				i = kh_begin(map);
@@ -678,7 +681,9 @@ memcached_expire(void *data __unused__)
 		while (keys_to_delete->len > 0) {
 			struct box_txn *txn = txn_alloc(BOX_QUIET);
 			delete(txn, read_field(keys_to_delete));
+			expired_keys++;
 		}
+		stat_collect(stat_base, MEMC_EXPIRED_KEYS, expired_keys);
 
 		fiber_gc();