diff --git a/cmake/compiler.cmake b/cmake/compiler.cmake
index bb1c13c4c81bedbd4d9cce49eb88b85aeae56951..4dda027c4610eabb4c268942fafa0a2efe52ca1b 100644
--- a/cmake/compiler.cmake
+++ b/cmake/compiler.cmake
@@ -99,7 +99,6 @@ macro(enable_tnt_compile_flags)
         "-Wextra"
         "-Wno-sign-compare"
         "-Wno-strict-aliasing"
-        "-Wno-error=deprecated-declarations"
     )
 
     if (CMAKE_COMPILER_IS_GNUCXX)
diff --git a/src/box/bitset_index.cc b/src/box/bitset_index.cc
index ec02153900b5dd2147f809fe6cc56f17c34a3f28..1b9070e3a5af62bba724b9e0a412e55d5d36ba62 100644
--- a/src/box/bitset_index.cc
+++ b/src/box/bitset_index.cc
@@ -219,14 +219,13 @@ BitsetIndex::replace(struct tuple *old_tuple, struct tuple *new_tuple,
 	}
 
 	if (new_tuple != NULL) {
-		const char *fb, *fe;
-		tuple_field(new_tuple, key_def->parts[0].fieldno, &fb, &fe);
-		size_t bitset_key_size = fe - fb;
-		const char *bitset_key = fb;
+		uint32_t len;
+		const char *field;
+		field = tuple_field(new_tuple, key_def->parts[0].fieldno,
+				    &len);
 
 		size_t value = tuple_to_value(new_tuple);
-		if (bitset_index_insert(&index, bitset_key,
-					bitset_key_size, value) < 0) {
+		if (bitset_index_insert(&index, field, len, value) < 0) {
 			tnt_raise(ClientError, ER_MEMORY_ISSUE, 0,
 				  "BitsetIndex", "insert");
 		}
diff --git a/src/box/box_lua.cc b/src/box/box_lua.cc
index 6791bdec1214687781e7c71916758647b756893f..bd1e0b430445cd872fc5870cbd1b281bdf239932 100644
--- a/src/box/box_lua.cc
+++ b/src/box/box_lua.cc
@@ -167,14 +167,17 @@ lbox_tuple_slice(struct lua_State *L)
 	u32 stop = end - 1;
 
 	struct tuple_iterator it;
-	const char *fb, *fe;
-	tuple_seek(&it, tuple, 0, &fb, &fe);
-	for (uint32_t field_no = 0; tuple_next(&it); field_no++) {
+	tuple_rewind(&it, tuple);
+	const char *field;
+	uint32_t len;
+	uint32_t field_no = 0;
+	while ((field = tuple_next(&it, &len))) {
 		if (field_no >= start) {
-			lua_pushlstring(L, fb, fe - fb);
+			lua_pushlstring(L, field, len);
 			if (field_no == stop)
 				break;
 		}
+		++field_no;
 	}
 	return end - start;
 }
@@ -327,15 +330,13 @@ tuple_find(struct lua_State *L, struct tuple *tuple, size_t offset,
 {
 	int top = lua_gettop(L);
 	int idx = offset;
-	if (idx >= tuple->field_count)
-		return 0;
 
 	struct tuple_iterator it;
-	const char *fb, *fe;
-	tuple_seek(&it, tuple, idx, &fb, &fe);
-	while (tuple_next(&it)) {
-		uint32_t len = fe - fb;
-		if (len == key_size && (memcmp(fb, key, len) == 0)) {
+	tuple_rewind(&it, tuple);
+	uint32_t len;
+	const char *field = tuple_seek(&it, idx, &len);
+	for (; field; field = tuple_next(&it, &len)) {
+		if (len == key_size && (memcmp(field, key, len) == 0)) {
 			lua_pushinteger(L, idx);
 			if (!all)
 				break;
@@ -401,11 +402,12 @@ lbox_tuple_unpack(struct lua_State *L)
 	struct tuple *tuple = lua_checktuple(L, 1);
 
 	struct tuple_iterator it;
-	const char *fb, *fe;
-	tuple_seek(&it, tuple, 0, &fb, &fe);
-	while (tuple_next(&it)) {
-		lua_pushlstring(L, fb, fe - fb);
-	}
+	tuple_rewind(&it, tuple);
+	const char *field;
+	uint32_t len;
+	while ((field = tuple_next(&it, &len)))
+		lua_pushlstring(L, field, len);
+
 	assert(lua_gettop(L) == tuple->field_count + 1);
 	return tuple->field_count;
 }
@@ -418,11 +420,12 @@ lbox_tuple_totable(struct lua_State *L)
 	int index = 1;
 
 	struct tuple_iterator it;
-	const char *fb, *fe;
-	tuple_seek(&it, tuple, 0, &fb, &fe);
-	while (tuple_next(&it)) {
+	tuple_rewind(&it, tuple);
+	const char *field;
+	uint32_t len;
+	while ((field = tuple_next(&it, &len))) {
 		lua_pushnumber(L, index++);
-		lua_pushlstring(L, fb, fe - fb);
+		lua_pushlstring(L, field, len);
 		lua_rawset(L, -3);
 	}
 	return 1;
@@ -445,9 +448,9 @@ lbox_tuple_index(struct lua_State *L)
 		if (i >= tuple->field_count)
 			luaL_error(L, "%s: index %d is out of bounds (0..%d)",
 				   tuplelib_name, i, tuple->field_count-1);
-		const char *fb, *fe;
-		tuple_field(tuple, i, &fb, &fe);
-		lua_pushlstring(L, fb, fe - fb);
+		uint32_t len;
+		const char *field = tuple_field(tuple, i, &len);
+		lua_pushlstring(L, field, len);
 		return 1;
 	}
 	/* If we got a string, try to find a method for it. */
@@ -507,10 +510,10 @@ lbox_tuple_next(struct lua_State *L)
 		return 1;
 	}
 
-	const char *fb, *fe;
-	tuple_field(tuple, field_no, &fb, &fe);
+	uint32_t len;
+	const char *field = tuple_field(tuple, field_no, &len);
 	lua_pushinteger(L, field_no + 1);
-	lua_pushlstring(L, fb, fe - fb);
+	lua_pushlstring(L, field, len);
 	return 2;
 }
 
diff --git a/src/box/space.cc b/src/box/space.cc
index 58e8a2d86e7f43696cf38ec4e98f22c36b86d3e2..52f6d24de887cec9c24e3f18a662295a48be3078 100644
--- a/src/box/space.cc
+++ b/src/box/space.cc
@@ -176,23 +176,27 @@ space_validate_tuple(struct space *sp, struct tuple *new_tuple)
 
 	/* Sweep through the tuple and check the field sizes. */
 	struct tuple_iterator it;
-	const char *fb, *fe;
-	tuple_seek(&it, new_tuple, 0, &fb, &fe);
-	for (uint32_t f = 0; f < sp->max_fieldno && tuple_next(&it); f++) {
+	tuple_rewind(&it, new_tuple);
+	const char *field;
+	uint32_t len;
+	uint32_t fieldno = 0;
+	while ((field = tuple_next(&it, &len))) {
+		if (fieldno == sp->max_fieldno)
+			break;
 		/*
 		 * Check fixed size fields (NUM and NUM64) and
 		 * skip undefined size fields (STRING and UNKNOWN).
 		 */
-		uint32_t len = fe - fb;
-		if (sp->field_types[f] == NUM) {
+		if (sp->field_types[fieldno] == NUM) {
 			if (len != sizeof(u32))
 				tnt_raise(ClientError, ER_KEY_FIELD_TYPE,
 					  "u32");
-		} else if (sp->field_types[f] == NUM64) {
+		} else if (sp->field_types[fieldno] == NUM64) {
 			if (len != sizeof(u64))
 				tnt_raise(ClientError, ER_KEY_FIELD_TYPE,
 					  "u64");
 		}
+		fieldno++;
 	}
 }
 
diff --git a/src/box/tuple.cc b/src/box/tuple.cc
index c0d8506a00c2ecdac131e975f32a33dd8118338e..678806eedb64886026ed989087a514ed8068a9fa 100644
--- a/src/box/tuple.cc
+++ b/src/box/tuple.cc
@@ -75,119 +75,84 @@ tuple_ref(struct tuple *tuple, int count)
 		tuple_free(tuple);
 }
 
-/** Get the next field from a tuple */
-static const char *
-next_field(const char *f)
-{
-	u32 size = load_varint32(&f);
-	return f + size;
-}
-
 /**
  * Get a field from tuple.
  *
+ * @pre field < tuple->field_count.
  * @returns field data if field exists or NULL
  */
 const char *
 tuple_field_old(struct tuple *tuple, u32 i)
 {
 	const char *field = tuple->data;
-
-	if (i >= tuple->field_count)
-		return NULL;
-
-	while (i-- > 0)
-		field = next_field(field);
-
-	return field;
+	const char *tuple_end = tuple->data + tuple->bsize;
+
+	while (field < tuple_end) {
+		if (i == 0)
+			return field;
+		uint32_t len = load_varint32(&field);
+		field += len;
+		i--;
+	}
+	return tuple_end;
 }
 
-void
-tuple_field(const struct tuple *tuple, uint32_t field_no,
-	    const char **begin, const char **end)
+const char *
+tuple_field(const struct tuple *tuple, uint32_t field_no, uint32_t *len)
 {
-	const char *data = tuple->data;
-
-	if (field_no >= tuple->field_count)
-		tnt_raise(IllegalParams, "field_no is out of range");
-
-	while (field_no-- > 0)
-		data = next_field(data);
-
-	uint32_t len = load_varint32(&data);
-	*begin = data;
-	*end = data + len;
+	const char *field = tuple_field_old((struct tuple *) tuple, field_no);
+	if (field < tuple->data + tuple->bsize) {
+		*len = load_varint32(&field);
+		return field;
+	}
+	return NULL;
 }
 
-void
-tuple_seek(struct tuple_iterator *it, const struct tuple *tuple,
-	   uint32_t field_no, const char **begin, const char **end)
+const char *
+tuple_seek(struct tuple_iterator *it, uint32_t field_no, uint32_t *len)
 {
-	const char *data = tuple->data;
-
-	if (field_no >= tuple->field_count)
-		tnt_raise(IllegalParams, "field_no is out of range");
-
-	while (field_no-- > 0)
-		data = next_field(data);
-
-	it->tuple = tuple;
-	it->cur = data;
-	it->begin = begin;
-	it->end = end;
-	*it->begin = NULL;
-	*it->end = NULL;
+	it->pos = tuple_field_old((struct tuple *) it->tuple, field_no);
+	return tuple_next(it, len);
 }
 
-struct tuple_iterator *
-tuple_next(struct tuple_iterator *it)
+const char *
+tuple_next(struct tuple_iterator *it, uint32_t *len)
 {
-	if (it->cur == it->tuple->data + it->tuple->bsize) {
-		/* No more fields in the tuple*/
-		it->cur = NULL;
-		return NULL;
-	} else if (it->cur == NULL) {
-		/* Sanity check: second call to next() is invalid */
-		tnt_raise(IllegalParams, "field_no is out of range");
-	}
-
-	uint32_t len = load_varint32(&it->cur);
-	*it->begin = it->cur;
-	*it->end = it->cur + len;
-	it->cur += len;
-
-	if (it->cur <= it->tuple->data + it->tuple->bsize) {
-		return it;
-	} else /* it->cur > it->tuple->data + it->tuple->bsize */ {
-		tnt_raise(IllegalParams, "invalid tuple");
+	const char *tuple_end = it->tuple->data + it->tuple->bsize;
+	if (it->pos < tuple_end) {
+		*len = load_varint32(&it->pos);
+		const char *field = it->pos;
+		it->pos += *len;
+		assert(it->pos <= tuple_end);
+		return field;
 	}
+	return NULL;
 }
 
-
 /** print field to tbuf */
 static void
-print_field(struct tbuf *buf, const char *f, const char *end)
+print_field(struct tbuf *buf, const char *field, uint32_t len)
 {
-	uint32_t size = (end - f);
-	switch (size) {
+	switch (len) {
 	case 2:
-		tbuf_printf(buf, "%hu", *(u16 *)f);
+		tbuf_printf(buf, "%hu", *(u16 *)field);
 		break;
 	case 4:
-		tbuf_printf(buf, "%u", *(u32 *)f);
+		tbuf_printf(buf, "%u", *(u32 *)field);
 		break;
 	case 8:
-		tbuf_printf(buf, "%" PRIu64, *(u64 *)f);
+		tbuf_printf(buf, "%" PRIu64, *(u64 *)field);
 		break;
 	default:
 		tbuf_printf(buf, "'");
-		while (size-- > 0) {
-			if (0x20 <= *(u8 *)f && *(u8 *)f < 0x7f) {
-				tbuf_printf(buf, "%c", *(u8 *) f);
+		const char *field_end = field + len;
+		while (field < field_end) {
+			if (0x20 <= *(u8 *)field && *(u8 *)field < 0x7f) {
+				tbuf_printf(buf, "%c", *(u8 *) field);
 			} else {
-				tbuf_printf(buf, "\\x%02X", *(u8 *)f);
+				tbuf_printf(buf, "\\x%02X", *(u8 *)field);
 			}
-			f++;
+			field++;
 		}
 		tbuf_printf(buf, "'");
 		break;
@@ -207,18 +172,18 @@ tuple_print(struct tbuf *buf, const struct tuple *tuple)
 	}
 
 	struct tuple_iterator it;
-	const char *fb, *fe;
-	tuple_seek(&it, tuple, 0, &fb, &fe);
-	tuple_next(&it);
-	print_field(buf, fb, fe);
+	const char *field;
+	uint32_t len;
+	tuple_rewind(&it, tuple);
+	field = tuple_next(&it, &len);
+	print_field(buf, field, len);
 	tbuf_printf(buf, ": {");
 
 	uint32_t field_no = 1;
-	for (; tuple_next(&it); field_no++) {
-		print_field(buf, fb, fe);
-		if (likely(field_no + 1 < tuple->field_count)) {
+	while ((field = tuple_next(&it, &len))) {
+		print_field(buf, field, len);
+		if (likely(++field_no < tuple->field_count))
 			tbuf_printf(buf, ", ");
-		}
 	}
 	assert (field_no == tuple->field_count);
 
diff --git a/src/box/tuple.h b/src/box/tuple.h
index e2d67798a570584128fcd35ae1afce622202ea0b..0fe896f8dcbfbe8cd868e56d01273969fa1baa65 100644
--- a/src/box/tuple.h
+++ b/src/box/tuple.h
@@ -76,69 +76,72 @@ tuple_ref(struct tuple *tuple, int count);
  *
  * @returns field data if the field exists, or NULL
  */
-__attribute__((deprecated)) const char *
+const char *
 tuple_field_old(struct tuple *tuple, u32 i);
 
 /**
  * @brief Return field data of the field
  * @param tuple tuple
  * @param field_no field number
- * @param begin pointer where the start of field data will be stored
- * @param end pointer where the end of field data + 1 will be stored
+ * @param field pointer where the start of field data will be stored
+ * @param len pointer where the len of the field will be stored
  * @throws IllegalParams if \a field_no is out of range
  */
-void
-tuple_field(const struct tuple *tuple, uint32_t field_no,
-	    const char **begin, const char **end);
+const char *
+tuple_field(const struct tuple *tuple, uint32_t field_no, uint32_t *len);
 
 /**
  * @brief Tuple Interator
  */
 struct tuple_iterator {
 	/** @cond false **/
-	/* Result */
-	const char **begin;
-	const char **end;
 	/* State */
 	const struct tuple *tuple;
-	const char *cur;
+	/** Always points to the beginning of the next field. */
+	const char *pos;
 	/** @endcond **/
 };
 
 /**
- * @brief Seek tuple iterator to position \a field_no
+ * @brief Initialize an iterator over tuple fields
  *
  * A workflow example:
  * @code
  * struct tuple_iterator it;
- * const char *fb, *fe;
- * tuple_seek(&it, tuple, 0, &fb, &fe);
- * while (tuple_next(&it)) {
- *      // field_data = fb
- *	// field_size = fe-fb
- *	lua_pushlstring(L, fb, fe - fb);
- * }
+ * tuple_rewind(&it, tuple);
+ * const char *field;
+ * uint32_t len;
+ * while ((field = tuple_next(&it, &len)))
+ *	lua_pushlstring(L, field, len);
+ *
  * @endcode
  *
- * @param it tuple iterator
- * @param tuple tuple
- * @param field_no a field number to seek
- * @param begin pointer where the start of field data will be stored
- * @param end pointer where the end of field data + 1 will be stored
+ * @param[out] it tuple iterator
+ * @param[in]  tuple tuple
  */
-void
-tuple_seek(struct tuple_iterator *it, const struct tuple *tuple,
-	   uint32_t field_no, const char **begin, const char **end);
+static inline void
+tuple_rewind(struct tuple_iterator *it, const struct tuple *tuple)
+{
+	it->tuple = tuple;
+	it->pos = tuple->data;
+}
+
+/**
+ * @brief Position the iterator at a given field no.
+ *
+ * @retval field  if the iterator has the requested field
+ * @retval NULL   otherwise (iteration is out of range)
+ */
+const char *
+tuple_seek(struct tuple_iterator *it, uint32_t field_no, uint32_t *len);
 
 /**
- * @brief Iterate to the next position
+ * @brief Iterate to the next field
  * @param it tuple iterator
- * @retval \a it if the iterator has tuple
- * @retval NULL if where is no more tuples (values of \a begin \a end
- * are not specifed in this case)
+ * @return next field or NULL if the iteration is out of range
  */
-struct tuple_iterator *
-tuple_next(struct tuple_iterator *it);
+const char *
+tuple_next(struct tuple_iterator *it, uint32_t *len);
 
 /**
  * @brief Print a tuple in yaml-compatible mode to tbuf:
diff --git a/src/memcached-grammar.cc b/src/memcached-grammar.cc
index 8f8515f4c2e652ee541958685f3ae0b46ce8e43d..a4f5c6e3065cb6c0f09b5a17dbc42f6d313fd72f 100644
--- a/src/memcached-grammar.cc
+++ b/src/memcached-grammar.cc
@@ -146,7 +146,7 @@ case 5:
 		goto st0;
 	goto tr15;
 tr15:
-#line 219 "src/memcached-grammar.rl"
+#line 222 "src/memcached-grammar.rl"
 	{
 			fstart = p;
 			for (; p < pe && *p != ' ' && *p != '\r' && *p != '\n'; p++);
@@ -176,7 +176,7 @@ case 7:
 		goto tr17;
 	goto st0;
 tr17:
-#line 218 "src/memcached-grammar.rl"
+#line 221 "src/memcached-grammar.rl"
 	{ fstart = p; }
 	goto st8;
 st8:
@@ -190,7 +190,7 @@ case 8:
 		goto st8;
 	goto st0;
 tr18:
-#line 241 "src/memcached-grammar.rl"
+#line 244 "src/memcached-grammar.rl"
 	{flags = memcached_natoq(fstart, p);}
 	goto st9;
 st9:
@@ -204,7 +204,7 @@ case 9:
 		goto tr21;
 	goto st0;
 tr21:
-#line 218 "src/memcached-grammar.rl"
+#line 221 "src/memcached-grammar.rl"
 	{ fstart = p; }
 	goto st10;
 st10:
@@ -218,7 +218,7 @@ case 10:
 		goto st10;
 	goto st0;
 tr22:
-#line 234 "src/memcached-grammar.rl"
+#line 237 "src/memcached-grammar.rl"
 	{
 			exptime = memcached_natoq(fstart, p);
 			if (exptime > 0 && exptime <= 60*60*24*30)
@@ -236,7 +236,7 @@ case 11:
 		goto tr25;
 	goto st0;
 tr25:
-#line 218 "src/memcached-grammar.rl"
+#line 221 "src/memcached-grammar.rl"
 	{ fstart = p; }
 	goto st12;
 st12:
@@ -253,11 +253,11 @@ case 12:
 		goto st12;
 	goto st0;
 tr26:
-#line 242 "src/memcached-grammar.rl"
+#line 245 "src/memcached-grammar.rl"
 	{bytes = memcached_natoq(fstart, p);}
-#line 276 "src/memcached-grammar.rl"
+#line 279 "src/memcached-grammar.rl"
 	{ p++; }
-#line 247 "src/memcached-grammar.rl"
+#line 250 "src/memcached-grammar.rl"
 	{
 			size_t parsed = p - in->pos;
 			while (ibuf_size(in) - parsed < bytes + 2) {
@@ -280,7 +280,7 @@ case 12:
 				goto exit;
 			}
 		}
-#line 270 "src/memcached-grammar.rl"
+#line 273 "src/memcached-grammar.rl"
 	{
 			done = true;
 			stats.bytes_read += p - in->pos;
@@ -297,9 +297,9 @@ case 12:
 		}
 	goto st197;
 tr30:
-#line 276 "src/memcached-grammar.rl"
+#line 279 "src/memcached-grammar.rl"
 	{ p++; }
-#line 247 "src/memcached-grammar.rl"
+#line 250 "src/memcached-grammar.rl"
 	{
 			size_t parsed = p - in->pos;
 			while (ibuf_size(in) - parsed < bytes + 2) {
@@ -322,7 +322,7 @@ case 12:
 				goto exit;
 			}
 		}
-#line 270 "src/memcached-grammar.rl"
+#line 273 "src/memcached-grammar.rl"
 	{
 			done = true;
 			stats.bytes_read += p - in->pos;
@@ -339,11 +339,11 @@ case 12:
 		}
 	goto st197;
 tr39:
-#line 278 "src/memcached-grammar.rl"
+#line 281 "src/memcached-grammar.rl"
 	{ noreply = true; }
-#line 276 "src/memcached-grammar.rl"
+#line 279 "src/memcached-grammar.rl"
 	{ p++; }
-#line 247 "src/memcached-grammar.rl"
+#line 250 "src/memcached-grammar.rl"
 	{
 			size_t parsed = p - in->pos;
 			while (ibuf_size(in) - parsed < bytes + 2) {
@@ -366,7 +366,7 @@ case 12:
 				goto exit;
 			}
 		}
-#line 270 "src/memcached-grammar.rl"
+#line 273 "src/memcached-grammar.rl"
 	{
 			done = true;
 			stats.bytes_read += p - in->pos;
@@ -383,11 +383,11 @@ case 12:
 		}
 	goto st197;
 tr58:
-#line 242 "src/memcached-grammar.rl"
+#line 245 "src/memcached-grammar.rl"
 	{bytes = memcached_natoq(fstart, p);}
-#line 276 "src/memcached-grammar.rl"
+#line 279 "src/memcached-grammar.rl"
 	{ p++; }
-#line 247 "src/memcached-grammar.rl"
+#line 250 "src/memcached-grammar.rl"
 	{
 			size_t parsed = p - in->pos;
 			while (ibuf_size(in) - parsed < bytes + 2) {
@@ -410,7 +410,7 @@ case 12:
 				goto exit;
 			}
 		}
-#line 270 "src/memcached-grammar.rl"
+#line 273 "src/memcached-grammar.rl"
 	{
 			done = true;
 			stats.bytes_read += p - in->pos;
@@ -419,33 +419,34 @@ case 12:
 #line 97 "src/memcached-grammar.rl"
 	{
 			struct tbuf *b;
-			const char *fb, *fe;
+			const char *field;
+			uint32_t field_len;
 
 			key = tbuf_read_field(keys);
 			struct tuple *tuple = memcached_find(key);
 			if (tuple == NULL) {
 				obuf_dup(out, "NOT_STORED\r\n", 12);
 			} else {
-				tuple_field(tuple, 3, &fb, &fe);
+				field = tuple_field(tuple, 3, &field_len);
 				b = tbuf_new(fiber->gc_pool);
 				if (append) {
-					tbuf_append(b, fb, fe - fb);
+					tbuf_append(b, field, field_len);
 					tbuf_append(b, data, bytes);
 				} else {
 					tbuf_append(b, data, bytes);
-					tbuf_append(b, fb, fe - fb);
+					tbuf_append(b, field, field_len);
 				}
 
-				bytes += (fe - fb);
+				bytes += field_len;
 				data = b->data;
 				STORE;
 			}
 		}
 	goto st197;
 tr62:
-#line 276 "src/memcached-grammar.rl"
+#line 279 "src/memcached-grammar.rl"
 	{ p++; }
-#line 247 "src/memcached-grammar.rl"
+#line 250 "src/memcached-grammar.rl"
 	{
 			size_t parsed = p - in->pos;
 			while (ibuf_size(in) - parsed < bytes + 2) {
@@ -468,7 +469,7 @@ case 12:
 				goto exit;
 			}
 		}
-#line 270 "src/memcached-grammar.rl"
+#line 273 "src/memcached-grammar.rl"
 	{
 			done = true;
 			stats.bytes_read += p - in->pos;
@@ -477,35 +478,36 @@ case 12:
 #line 97 "src/memcached-grammar.rl"
 	{
 			struct tbuf *b;
-			const char *fb, *fe;
+			const char *field;
+			uint32_t field_len;
 
 			key = tbuf_read_field(keys);
 			struct tuple *tuple = memcached_find(key);
 			if (tuple == NULL) {
 				obuf_dup(out, "NOT_STORED\r\n", 12);
 			} else {
-				tuple_field(tuple, 3, &fb, &fe);
+				field = tuple_field(tuple, 3, &field_len);
 				b = tbuf_new(fiber->gc_pool);
 				if (append) {
-					tbuf_append(b, fb, fe - fb);
+					tbuf_append(b, field, field_len);
 					tbuf_append(b, data, bytes);
 				} else {
 					tbuf_append(b, data, bytes);
-					tbuf_append(b, fb, fe - fb);
+					tbuf_append(b, field, field_len);
 				}
 
-				bytes += (fe - fb);
+				bytes += field_len;
 				data = b->data;
 				STORE;
 			}
 		}
 	goto st197;
 tr71:
-#line 278 "src/memcached-grammar.rl"
+#line 281 "src/memcached-grammar.rl"
 	{ noreply = true; }
-#line 276 "src/memcached-grammar.rl"
+#line 279 "src/memcached-grammar.rl"
 	{ p++; }
-#line 247 "src/memcached-grammar.rl"
+#line 250 "src/memcached-grammar.rl"
 	{
 			size_t parsed = p - in->pos;
 			while (ibuf_size(in) - parsed < bytes + 2) {
@@ -528,7 +530,7 @@ case 12:
 				goto exit;
 			}
 		}
-#line 270 "src/memcached-grammar.rl"
+#line 273 "src/memcached-grammar.rl"
 	{
 			done = true;
 			stats.bytes_read += p - in->pos;
@@ -537,35 +539,36 @@ case 12:
 #line 97 "src/memcached-grammar.rl"
 	{
 			struct tbuf *b;
-			const char *fb, *fe;
+			const char *field;
+			uint32_t field_len;
 
 			key = tbuf_read_field(keys);
 			struct tuple *tuple = memcached_find(key);
 			if (tuple == NULL) {
 				obuf_dup(out, "NOT_STORED\r\n", 12);
 			} else {
-				tuple_field(tuple, 3, &fb, &fe);
+				field = tuple_field(tuple, 3, &field_len);
 				b = tbuf_new(fiber->gc_pool);
 				if (append) {
-					tbuf_append(b, fb, fe - fb);
+					tbuf_append(b, field, field_len);
 					tbuf_append(b, data, bytes);
 				} else {
 					tbuf_append(b, data, bytes);
-					tbuf_append(b, fb, fe - fb);
+					tbuf_append(b, field, field_len);
 				}
 
-				bytes += (fe - fb);
+				bytes += field_len;
 				data = b->data;
 				STORE;
 			}
 		}
 	goto st197;
 tr91:
-#line 243 "src/memcached-grammar.rl"
+#line 246 "src/memcached-grammar.rl"
 	{cas = memcached_natoq(fstart, p);}
-#line 276 "src/memcached-grammar.rl"
+#line 279 "src/memcached-grammar.rl"
 	{ p++; }
-#line 247 "src/memcached-grammar.rl"
+#line 250 "src/memcached-grammar.rl"
 	{
 			size_t parsed = p - in->pos;
 			while (ibuf_size(in) - parsed < bytes + 2) {
@@ -588,7 +591,7 @@ case 12:
 				goto exit;
 			}
 		}
-#line 270 "src/memcached-grammar.rl"
+#line 273 "src/memcached-grammar.rl"
 	{
 			done = true;
 			stats.bytes_read += p - in->pos;
@@ -607,9 +610,9 @@ case 12:
 		}
 	goto st197;
 tr95:
-#line 276 "src/memcached-grammar.rl"
+#line 279 "src/memcached-grammar.rl"
 	{ p++; }
-#line 247 "src/memcached-grammar.rl"
+#line 250 "src/memcached-grammar.rl"
 	{
 			size_t parsed = p - in->pos;
 			while (ibuf_size(in) - parsed < bytes + 2) {
@@ -632,7 +635,7 @@ case 12:
 				goto exit;
 			}
 		}
-#line 270 "src/memcached-grammar.rl"
+#line 273 "src/memcached-grammar.rl"
 	{
 			done = true;
 			stats.bytes_read += p - in->pos;
@@ -651,11 +654,11 @@ case 12:
 		}
 	goto st197;
 tr105:
-#line 278 "src/memcached-grammar.rl"
+#line 281 "src/memcached-grammar.rl"
 	{ noreply = true; }
-#line 276 "src/memcached-grammar.rl"
+#line 279 "src/memcached-grammar.rl"
 	{ p++; }
-#line 247 "src/memcached-grammar.rl"
+#line 250 "src/memcached-grammar.rl"
 	{
 			size_t parsed = p - in->pos;
 			while (ibuf_size(in) - parsed < bytes + 2) {
@@ -678,7 +681,7 @@ case 12:
 				goto exit;
 			}
 		}
-#line 270 "src/memcached-grammar.rl"
+#line 273 "src/memcached-grammar.rl"
 	{
 			done = true;
 			stats.bytes_read += p - in->pos;
@@ -697,21 +700,22 @@ case 12:
 		}
 	goto st197;
 tr118:
-#line 244 "src/memcached-grammar.rl"
+#line 247 "src/memcached-grammar.rl"
 	{incr = memcached_natoq(fstart, p);}
-#line 276 "src/memcached-grammar.rl"
+#line 279 "src/memcached-grammar.rl"
 	{ p++; }
-#line 270 "src/memcached-grammar.rl"
+#line 273 "src/memcached-grammar.rl"
 	{
 			done = true;
 			stats.bytes_read += p - in->pos;
 			in->pos = p;
 		}
-#line 122 "src/memcached-grammar.rl"
+#line 123 "src/memcached-grammar.rl"
 	{
 			struct meta *m;
 			struct tbuf *b;
-			const char *fb, *fe;
+			const char *field;
+			uint32_t field_len;
 			u64 value;
 
 			key = tbuf_read_field(keys);
@@ -720,10 +724,11 @@ case 12:
 				obuf_dup(out, "NOT_FOUND\r\n", 11);
 			} else {
 				m = memcached_meta(tuple);
-				tuple_field(tuple, 3, &fb, &fe);
+				field = tuple_field(tuple, 3, &field_len);
 
-				if (memcached_is_numeric(fb, fe - fb)) {
-					value = memcached_natoq(fb, fe);
+				if (memcached_is_numeric(field, field_len)) {
+					value = memcached_natoq(field,
+								field + field_len);
 
 					if (incr_sign > 0) {
 						value += incr;
@@ -761,19 +766,20 @@ case 12:
 		}
 	goto st197;
 tr122:
-#line 276 "src/memcached-grammar.rl"
+#line 279 "src/memcached-grammar.rl"
 	{ p++; }
-#line 270 "src/memcached-grammar.rl"
+#line 273 "src/memcached-grammar.rl"
 	{
 			done = true;
 			stats.bytes_read += p - in->pos;
 			in->pos = p;
 		}
-#line 122 "src/memcached-grammar.rl"
+#line 123 "src/memcached-grammar.rl"
 	{
 			struct meta *m;
 			struct tbuf *b;
-			const char *fb, *fe;
+			const char *field;
+			uint32_t field_len;
 			u64 value;
 
 			key = tbuf_read_field(keys);
@@ -782,10 +788,11 @@ case 12:
 				obuf_dup(out, "NOT_FOUND\r\n", 11);
 			} else {
 				m = memcached_meta(tuple);
-				tuple_field(tuple, 3, &fb, &fe);
+				field = tuple_field(tuple, 3, &field_len);
 
-				if (memcached_is_numeric(fb, fe - fb)) {
-					value = memcached_natoq(fb, fe);
+				if (memcached_is_numeric(field, field_len)) {
+					value = memcached_natoq(field,
+								field + field_len);
 
 					if (incr_sign > 0) {
 						value += incr;
@@ -823,21 +830,22 @@ case 12:
 		}
 	goto st197;
 tr132:
-#line 278 "src/memcached-grammar.rl"
+#line 281 "src/memcached-grammar.rl"
 	{ noreply = true; }
-#line 276 "src/memcached-grammar.rl"
+#line 279 "src/memcached-grammar.rl"
 	{ p++; }
-#line 270 "src/memcached-grammar.rl"
+#line 273 "src/memcached-grammar.rl"
 	{
 			done = true;
 			stats.bytes_read += p - in->pos;
 			in->pos = p;
 		}
-#line 122 "src/memcached-grammar.rl"
+#line 123 "src/memcached-grammar.rl"
 	{
 			struct meta *m;
 			struct tbuf *b;
-			const char *fb, *fe;
+			const char *field;
+			uint32_t field_len;
 			u64 value;
 
 			key = tbuf_read_field(keys);
@@ -846,10 +854,11 @@ case 12:
 				obuf_dup(out, "NOT_FOUND\r\n", 11);
 			} else {
 				m = memcached_meta(tuple);
-				tuple_field(tuple, 3, &fb, &fe);
+				field = tuple_field(tuple, 3, &field_len);
 
-				if (memcached_is_numeric(fb, fe - fb)) {
-					value = memcached_natoq(fb, fe);
+				if (memcached_is_numeric(field, field_len)) {
+					value = memcached_natoq(field,
+								field + field_len);
 
 					if (incr_sign > 0) {
 						value += incr;
@@ -887,15 +896,15 @@ case 12:
 		}
 	goto st197;
 tr141:
-#line 276 "src/memcached-grammar.rl"
+#line 279 "src/memcached-grammar.rl"
 	{ p++; }
-#line 270 "src/memcached-grammar.rl"
+#line 273 "src/memcached-grammar.rl"
 	{
 			done = true;
 			stats.bytes_read += p - in->pos;
 			in->pos = p;
 		}
-#line 174 "src/memcached-grammar.rl"
+#line 177 "src/memcached-grammar.rl"
 	{
 			key = tbuf_read_field(keys);
 			struct tuple *tuple = memcached_find(key);
@@ -915,21 +924,21 @@ case 12:
 		}
 	goto st197;
 tr146:
-#line 234 "src/memcached-grammar.rl"
+#line 237 "src/memcached-grammar.rl"
 	{
 			exptime = memcached_natoq(fstart, p);
 			if (exptime > 0 && exptime <= 60*60*24*30)
 				exptime = exptime + ev_now();
 		}
-#line 276 "src/memcached-grammar.rl"
+#line 279 "src/memcached-grammar.rl"
 	{ p++; }
-#line 270 "src/memcached-grammar.rl"
+#line 273 "src/memcached-grammar.rl"
 	{
 			done = true;
 			stats.bytes_read += p - in->pos;
 			in->pos = p;
 		}
-#line 174 "src/memcached-grammar.rl"
+#line 177 "src/memcached-grammar.rl"
 	{
 			key = tbuf_read_field(keys);
 			struct tuple *tuple = memcached_find(key);
@@ -949,17 +958,17 @@ case 12:
 		}
 	goto st197;
 tr157:
-#line 278 "src/memcached-grammar.rl"
+#line 281 "src/memcached-grammar.rl"
 	{ noreply = true; }
-#line 276 "src/memcached-grammar.rl"
+#line 279 "src/memcached-grammar.rl"
 	{ p++; }
-#line 270 "src/memcached-grammar.rl"
+#line 273 "src/memcached-grammar.rl"
 	{
 			done = true;
 			stats.bytes_read += p - in->pos;
 			in->pos = p;
 		}
-#line 174 "src/memcached-grammar.rl"
+#line 177 "src/memcached-grammar.rl"
 	{
 			key = tbuf_read_field(keys);
 			struct tuple *tuple = memcached_find(key);
@@ -979,15 +988,15 @@ case 12:
 		}
 	goto st197;
 tr169:
-#line 276 "src/memcached-grammar.rl"
+#line 279 "src/memcached-grammar.rl"
 	{ p++; }
-#line 270 "src/memcached-grammar.rl"
+#line 273 "src/memcached-grammar.rl"
 	{
 			done = true;
 			stats.bytes_read += p - in->pos;
 			in->pos = p;
 		}
-#line 203 "src/memcached-grammar.rl"
+#line 206 "src/memcached-grammar.rl"
 	{
 			struct fiber *f = fiber_new("flush_all",
 						    memcached_flush_all);
@@ -996,17 +1005,17 @@ case 12:
 		}
 	goto st197;
 tr174:
-#line 245 "src/memcached-grammar.rl"
+#line 248 "src/memcached-grammar.rl"
 	{flush_delay = memcached_natoq(fstart, p);}
-#line 276 "src/memcached-grammar.rl"
+#line 279 "src/memcached-grammar.rl"
 	{ p++; }
-#line 270 "src/memcached-grammar.rl"
+#line 273 "src/memcached-grammar.rl"
 	{
 			done = true;
 			stats.bytes_read += p - in->pos;
 			in->pos = p;
 		}
-#line 203 "src/memcached-grammar.rl"
+#line 206 "src/memcached-grammar.rl"
 	{
 			struct fiber *f = fiber_new("flush_all",
 						    memcached_flush_all);
@@ -1015,17 +1024,17 @@ case 12:
 		}
 	goto st197;
 tr185:
-#line 278 "src/memcached-grammar.rl"
+#line 281 "src/memcached-grammar.rl"
 	{ noreply = true; }
-#line 276 "src/memcached-grammar.rl"
+#line 279 "src/memcached-grammar.rl"
 	{ p++; }
-#line 270 "src/memcached-grammar.rl"
+#line 273 "src/memcached-grammar.rl"
 	{
 			done = true;
 			stats.bytes_read += p - in->pos;
 			in->pos = p;
 		}
-#line 203 "src/memcached-grammar.rl"
+#line 206 "src/memcached-grammar.rl"
 	{
 			struct fiber *f = fiber_new("flush_all",
 						    memcached_flush_all);
@@ -1034,15 +1043,15 @@ case 12:
 		}
 	goto st197;
 tr195:
-#line 276 "src/memcached-grammar.rl"
+#line 279 "src/memcached-grammar.rl"
 	{ p++; }
-#line 270 "src/memcached-grammar.rl"
+#line 273 "src/memcached-grammar.rl"
 	{
 			done = true;
 			stats.bytes_read += p - in->pos;
 			in->pos = p;
 		}
-#line 192 "src/memcached-grammar.rl"
+#line 195 "src/memcached-grammar.rl"
 	{
 			try {
 				memcached_get(out, keys_count, keys, show_cas);
@@ -1055,25 +1064,25 @@ case 12:
 		}
 	goto st197;
 tr213:
-#line 276 "src/memcached-grammar.rl"
+#line 279 "src/memcached-grammar.rl"
 	{ p++; }
-#line 270 "src/memcached-grammar.rl"
+#line 273 "src/memcached-grammar.rl"
 	{
 			done = true;
 			stats.bytes_read += p - in->pos;
 			in->pos = p;
 		}
-#line 214 "src/memcached-grammar.rl"
+#line 217 "src/memcached-grammar.rl"
 	{
 			return -1;
 		}
 	goto st197;
 tr233:
-#line 242 "src/memcached-grammar.rl"
+#line 245 "src/memcached-grammar.rl"
 	{bytes = memcached_natoq(fstart, p);}
-#line 276 "src/memcached-grammar.rl"
+#line 279 "src/memcached-grammar.rl"
 	{ p++; }
-#line 247 "src/memcached-grammar.rl"
+#line 250 "src/memcached-grammar.rl"
 	{
 			size_t parsed = p - in->pos;
 			while (ibuf_size(in) - parsed < bytes + 2) {
@@ -1096,7 +1105,7 @@ case 12:
 				goto exit;
 			}
 		}
-#line 270 "src/memcached-grammar.rl"
+#line 273 "src/memcached-grammar.rl"
 	{
 			done = true;
 			stats.bytes_read += p - in->pos;
@@ -1113,9 +1122,9 @@ case 12:
 		}
 	goto st197;
 tr237:
-#line 276 "src/memcached-grammar.rl"
+#line 279 "src/memcached-grammar.rl"
 	{ p++; }
-#line 247 "src/memcached-grammar.rl"
+#line 250 "src/memcached-grammar.rl"
 	{
 			size_t parsed = p - in->pos;
 			while (ibuf_size(in) - parsed < bytes + 2) {
@@ -1138,7 +1147,7 @@ case 12:
 				goto exit;
 			}
 		}
-#line 270 "src/memcached-grammar.rl"
+#line 273 "src/memcached-grammar.rl"
 	{
 			done = true;
 			stats.bytes_read += p - in->pos;
@@ -1155,11 +1164,11 @@ case 12:
 		}
 	goto st197;
 tr246:
-#line 278 "src/memcached-grammar.rl"
+#line 281 "src/memcached-grammar.rl"
 	{ noreply = true; }
-#line 276 "src/memcached-grammar.rl"
+#line 279 "src/memcached-grammar.rl"
 	{ p++; }
-#line 247 "src/memcached-grammar.rl"
+#line 250 "src/memcached-grammar.rl"
 	{
 			size_t parsed = p - in->pos;
 			while (ibuf_size(in) - parsed < bytes + 2) {
@@ -1182,7 +1191,7 @@ case 12:
 				goto exit;
 			}
 		}
-#line 270 "src/memcached-grammar.rl"
+#line 273 "src/memcached-grammar.rl"
 	{
 			done = true;
 			stats.bytes_read += p - in->pos;
@@ -1199,11 +1208,11 @@ case 12:
 		}
 	goto st197;
 tr263:
-#line 242 "src/memcached-grammar.rl"
+#line 245 "src/memcached-grammar.rl"
 	{bytes = memcached_natoq(fstart, p);}
-#line 276 "src/memcached-grammar.rl"
+#line 279 "src/memcached-grammar.rl"
 	{ p++; }
-#line 247 "src/memcached-grammar.rl"
+#line 250 "src/memcached-grammar.rl"
 	{
 			size_t parsed = p - in->pos;
 			while (ibuf_size(in) - parsed < bytes + 2) {
@@ -1226,7 +1235,7 @@ case 12:
 				goto exit;
 			}
 		}
-#line 270 "src/memcached-grammar.rl"
+#line 273 "src/memcached-grammar.rl"
 	{
 			done = true;
 			stats.bytes_read += p - in->pos;
@@ -1239,9 +1248,9 @@ case 12:
 		}
 	goto st197;
 tr267:
-#line 276 "src/memcached-grammar.rl"
+#line 279 "src/memcached-grammar.rl"
 	{ p++; }
-#line 247 "src/memcached-grammar.rl"
+#line 250 "src/memcached-grammar.rl"
 	{
 			size_t parsed = p - in->pos;
 			while (ibuf_size(in) - parsed < bytes + 2) {
@@ -1264,7 +1273,7 @@ case 12:
 				goto exit;
 			}
 		}
-#line 270 "src/memcached-grammar.rl"
+#line 273 "src/memcached-grammar.rl"
 	{
 			done = true;
 			stats.bytes_read += p - in->pos;
@@ -1277,11 +1286,11 @@ case 12:
 		}
 	goto st197;
 tr276:
-#line 278 "src/memcached-grammar.rl"
+#line 281 "src/memcached-grammar.rl"
 	{ noreply = true; }
-#line 276 "src/memcached-grammar.rl"
+#line 279 "src/memcached-grammar.rl"
 	{ p++; }
-#line 247 "src/memcached-grammar.rl"
+#line 250 "src/memcached-grammar.rl"
 	{
 			size_t parsed = p - in->pos;
 			while (ibuf_size(in) - parsed < bytes + 2) {
@@ -1304,7 +1313,7 @@ case 12:
 				goto exit;
 			}
 		}
-#line 270 "src/memcached-grammar.rl"
+#line 273 "src/memcached-grammar.rl"
 	{
 			done = true;
 			stats.bytes_read += p - in->pos;
@@ -1317,15 +1326,15 @@ case 12:
 		}
 	goto st197;
 tr281:
-#line 276 "src/memcached-grammar.rl"
+#line 279 "src/memcached-grammar.rl"
 	{ p++; }
-#line 270 "src/memcached-grammar.rl"
+#line 273 "src/memcached-grammar.rl"
 	{
 			done = true;
 			stats.bytes_read += p - in->pos;
 			in->pos = p;
 		}
-#line 210 "src/memcached-grammar.rl"
+#line 213 "src/memcached-grammar.rl"
 	{
 			memcached_print_stats(out);
 		}
@@ -1334,33 +1343,33 @@ case 12:
 	if ( ++p == pe )
 		goto _test_eof197;
 case 197:
-#line 1338 "src/memcached-grammar.cc"
+#line 1347 "src/memcached-grammar.cc"
 	goto st0;
 tr27:
-#line 242 "src/memcached-grammar.rl"
+#line 245 "src/memcached-grammar.rl"
 	{bytes = memcached_natoq(fstart, p);}
 	goto st13;
 tr40:
-#line 278 "src/memcached-grammar.rl"
+#line 281 "src/memcached-grammar.rl"
 	{ noreply = true; }
 	goto st13;
 st13:
 	if ( ++p == pe )
 		goto _test_eof13;
 case 13:
-#line 1352 "src/memcached-grammar.cc"
+#line 1361 "src/memcached-grammar.cc"
 	if ( (*p) == 10 )
 		goto tr30;
 	goto st0;
 tr28:
-#line 242 "src/memcached-grammar.rl"
+#line 245 "src/memcached-grammar.rl"
 	{bytes = memcached_natoq(fstart, p);}
 	goto st14;
 st14:
 	if ( ++p == pe )
 		goto _test_eof14;
 case 14:
-#line 1364 "src/memcached-grammar.cc"
+#line 1373 "src/memcached-grammar.cc"
 	switch( (*p) ) {
 		case 32: goto st14;
 		case 78: goto st15;
@@ -1474,18 +1483,18 @@ case 26:
 		goto tr45;
 	goto st0;
 tr45:
-#line 284 "src/memcached-grammar.rl"
+#line 287 "src/memcached-grammar.rl"
 	{append = true; }
 	goto st27;
 tr209:
-#line 285 "src/memcached-grammar.rl"
+#line 288 "src/memcached-grammar.rl"
 	{append = false;}
 	goto st27;
 st27:
 	if ( ++p == pe )
 		goto _test_eof27;
 case 27:
-#line 1489 "src/memcached-grammar.cc"
+#line 1498 "src/memcached-grammar.cc"
 	switch( (*p) ) {
 		case 13: goto st0;
 		case 32: goto st27;
@@ -1494,7 +1503,7 @@ case 27:
 		goto st0;
 	goto tr46;
 tr46:
-#line 219 "src/memcached-grammar.rl"
+#line 222 "src/memcached-grammar.rl"
 	{
 			fstart = p;
 			for (; p < pe && *p != ' ' && *p != '\r' && *p != '\n'; p++);
@@ -1510,7 +1519,7 @@ case 27:
 	if ( ++p == pe )
 		goto _test_eof28;
 case 28:
-#line 1514 "src/memcached-grammar.cc"
+#line 1523 "src/memcached-grammar.cc"
 	if ( (*p) == 32 )
 		goto st29;
 	goto st0;
@@ -1524,49 +1533,49 @@ case 29:
 		goto tr49;
 	goto st0;
 tr49:
-#line 218 "src/memcached-grammar.rl"
+#line 221 "src/memcached-grammar.rl"
 	{ fstart = p; }
 	goto st30;
 st30:
 	if ( ++p == pe )
 		goto _test_eof30;
 case 30:
-#line 1535 "src/memcached-grammar.cc"
+#line 1544 "src/memcached-grammar.cc"
 	if ( (*p) == 32 )
 		goto tr50;
 	if ( 48 <= (*p) && (*p) <= 57 )
 		goto st30;
 	goto st0;
 tr50:
-#line 241 "src/memcached-grammar.rl"
+#line 244 "src/memcached-grammar.rl"
 	{flags = memcached_natoq(fstart, p);}
 	goto st31;
 st31:
 	if ( ++p == pe )
 		goto _test_eof31;
 case 31:
-#line 1549 "src/memcached-grammar.cc"
+#line 1558 "src/memcached-grammar.cc"
 	if ( (*p) == 32 )
 		goto st31;
 	if ( 48 <= (*p) && (*p) <= 57 )
 		goto tr53;
 	goto st0;
 tr53:
-#line 218 "src/memcached-grammar.rl"
+#line 221 "src/memcached-grammar.rl"
 	{ fstart = p; }
 	goto st32;
 st32:
 	if ( ++p == pe )
 		goto _test_eof32;
 case 32:
-#line 1563 "src/memcached-grammar.cc"
+#line 1572 "src/memcached-grammar.cc"
 	if ( (*p) == 32 )
 		goto tr54;
 	if ( 48 <= (*p) && (*p) <= 57 )
 		goto st32;
 	goto st0;
 tr54:
-#line 234 "src/memcached-grammar.rl"
+#line 237 "src/memcached-grammar.rl"
 	{
 			exptime = memcached_natoq(fstart, p);
 			if (exptime > 0 && exptime <= 60*60*24*30)
@@ -1577,21 +1586,21 @@ case 32:
 	if ( ++p == pe )
 		goto _test_eof33;
 case 33:
-#line 1581 "src/memcached-grammar.cc"
+#line 1590 "src/memcached-grammar.cc"
 	if ( (*p) == 32 )
 		goto st33;
 	if ( 48 <= (*p) && (*p) <= 57 )
 		goto tr57;
 	goto st0;
 tr57:
-#line 218 "src/memcached-grammar.rl"
+#line 221 "src/memcached-grammar.rl"
 	{ fstart = p; }
 	goto st34;
 st34:
 	if ( ++p == pe )
 		goto _test_eof34;
 case 34:
-#line 1595 "src/memcached-grammar.cc"
+#line 1604 "src/memcached-grammar.cc"
 	switch( (*p) ) {
 		case 10: goto tr58;
 		case 13: goto tr59;
@@ -1601,30 +1610,30 @@ case 34:
 		goto st34;
 	goto st0;
 tr59:
-#line 242 "src/memcached-grammar.rl"
+#line 245 "src/memcached-grammar.rl"
 	{bytes = memcached_natoq(fstart, p);}
 	goto st35;
 tr72:
-#line 278 "src/memcached-grammar.rl"
+#line 281 "src/memcached-grammar.rl"
 	{ noreply = true; }
 	goto st35;
 st35:
 	if ( ++p == pe )
 		goto _test_eof35;
 case 35:
-#line 1616 "src/memcached-grammar.cc"
+#line 1625 "src/memcached-grammar.cc"
 	if ( (*p) == 10 )
 		goto tr62;
 	goto st0;
 tr60:
-#line 242 "src/memcached-grammar.rl"
+#line 245 "src/memcached-grammar.rl"
 	{bytes = memcached_natoq(fstart, p);}
 	goto st36;
 st36:
 	if ( ++p == pe )
 		goto _test_eof36;
 case 36:
-#line 1628 "src/memcached-grammar.cc"
+#line 1637 "src/memcached-grammar.cc"
 	switch( (*p) ) {
 		case 32: goto st36;
 		case 78: goto st37;
@@ -1731,7 +1740,7 @@ case 47:
 		goto st0;
 	goto tr76;
 tr76:
-#line 219 "src/memcached-grammar.rl"
+#line 222 "src/memcached-grammar.rl"
 	{
 			fstart = p;
 			for (; p < pe && *p != ' ' && *p != '\r' && *p != '\n'; p++);
@@ -1747,7 +1756,7 @@ case 47:
 	if ( ++p == pe )
 		goto _test_eof48;
 case 48:
-#line 1751 "src/memcached-grammar.cc"
+#line 1760 "src/memcached-grammar.cc"
 	if ( (*p) == 32 )
 		goto st49;
 	goto st0;
@@ -1761,49 +1770,49 @@ case 49:
 		goto tr78;
 	goto st0;
 tr78:
-#line 218 "src/memcached-grammar.rl"
+#line 221 "src/memcached-grammar.rl"
 	{ fstart = p; }
 	goto st50;
 st50:
 	if ( ++p == pe )
 		goto _test_eof50;
 case 50:
-#line 1772 "src/memcached-grammar.cc"
+#line 1781 "src/memcached-grammar.cc"
 	if ( (*p) == 32 )
 		goto tr79;
 	if ( 48 <= (*p) && (*p) <= 57 )
 		goto st50;
 	goto st0;
 tr79:
-#line 241 "src/memcached-grammar.rl"
+#line 244 "src/memcached-grammar.rl"
 	{flags = memcached_natoq(fstart, p);}
 	goto st51;
 st51:
 	if ( ++p == pe )
 		goto _test_eof51;
 case 51:
-#line 1786 "src/memcached-grammar.cc"
+#line 1795 "src/memcached-grammar.cc"
 	if ( (*p) == 32 )
 		goto st51;
 	if ( 48 <= (*p) && (*p) <= 57 )
 		goto tr82;
 	goto st0;
 tr82:
-#line 218 "src/memcached-grammar.rl"
+#line 221 "src/memcached-grammar.rl"
 	{ fstart = p; }
 	goto st52;
 st52:
 	if ( ++p == pe )
 		goto _test_eof52;
 case 52:
-#line 1800 "src/memcached-grammar.cc"
+#line 1809 "src/memcached-grammar.cc"
 	if ( (*p) == 32 )
 		goto tr83;
 	if ( 48 <= (*p) && (*p) <= 57 )
 		goto st52;
 	goto st0;
 tr83:
-#line 234 "src/memcached-grammar.rl"
+#line 237 "src/memcached-grammar.rl"
 	{
 			exptime = memcached_natoq(fstart, p);
 			if (exptime > 0 && exptime <= 60*60*24*30)
@@ -1814,49 +1823,49 @@ case 52:
 	if ( ++p == pe )
 		goto _test_eof53;
 case 53:
-#line 1818 "src/memcached-grammar.cc"
+#line 1827 "src/memcached-grammar.cc"
 	if ( (*p) == 32 )
 		goto st53;
 	if ( 48 <= (*p) && (*p) <= 57 )
 		goto tr86;
 	goto st0;
 tr86:
-#line 218 "src/memcached-grammar.rl"
+#line 221 "src/memcached-grammar.rl"
 	{ fstart = p; }
 	goto st54;
 st54:
 	if ( ++p == pe )
 		goto _test_eof54;
 case 54:
-#line 1832 "src/memcached-grammar.cc"
+#line 1841 "src/memcached-grammar.cc"
 	if ( (*p) == 32 )
 		goto tr87;
 	if ( 48 <= (*p) && (*p) <= 57 )
 		goto st54;
 	goto st0;
 tr87:
-#line 242 "src/memcached-grammar.rl"
+#line 245 "src/memcached-grammar.rl"
 	{bytes = memcached_natoq(fstart, p);}
 	goto st55;
 st55:
 	if ( ++p == pe )
 		goto _test_eof55;
 case 55:
-#line 1846 "src/memcached-grammar.cc"
+#line 1855 "src/memcached-grammar.cc"
 	if ( (*p) == 32 )
 		goto st55;
 	if ( 48 <= (*p) && (*p) <= 57 )
 		goto tr90;
 	goto st0;
 tr90:
-#line 218 "src/memcached-grammar.rl"
+#line 221 "src/memcached-grammar.rl"
 	{ fstart = p; }
 	goto st56;
 st56:
 	if ( ++p == pe )
 		goto _test_eof56;
 case 56:
-#line 1860 "src/memcached-grammar.cc"
+#line 1869 "src/memcached-grammar.cc"
 	switch( (*p) ) {
 		case 10: goto tr91;
 		case 13: goto tr92;
@@ -1866,30 +1875,30 @@ case 56:
 		goto st56;
 	goto st0;
 tr106:
-#line 278 "src/memcached-grammar.rl"
+#line 281 "src/memcached-grammar.rl"
 	{ noreply = true; }
 	goto st57;
 tr92:
-#line 243 "src/memcached-grammar.rl"
+#line 246 "src/memcached-grammar.rl"
 	{cas = memcached_natoq(fstart, p);}
 	goto st57;
 st57:
 	if ( ++p == pe )
 		goto _test_eof57;
 case 57:
-#line 1881 "src/memcached-grammar.cc"
+#line 1890 "src/memcached-grammar.cc"
 	if ( (*p) == 10 )
 		goto tr95;
 	goto st0;
 tr93:
-#line 243 "src/memcached-grammar.rl"
+#line 246 "src/memcached-grammar.rl"
 	{cas = memcached_natoq(fstart, p);}
 	goto st58;
 st58:
 	if ( ++p == pe )
 		goto _test_eof58;
 case 58:
-#line 1893 "src/memcached-grammar.cc"
+#line 1902 "src/memcached-grammar.cc"
 	switch( (*p) ) {
 		case 10: goto tr95;
 		case 13: goto st57;
@@ -1963,14 +1972,14 @@ case 65:
 	}
 	goto st0;
 tr107:
-#line 278 "src/memcached-grammar.rl"
+#line 281 "src/memcached-grammar.rl"
 	{ noreply = true; }
 	goto st66;
 st66:
 	if ( ++p == pe )
 		goto _test_eof66;
 case 66:
-#line 1974 "src/memcached-grammar.cc"
+#line 1983 "src/memcached-grammar.cc"
 	switch( (*p) ) {
 		case 10: goto tr95;
 		case 13: goto st57;
@@ -2014,18 +2023,18 @@ case 70:
 		goto tr113;
 	goto st0;
 tr113:
-#line 293 "src/memcached-grammar.rl"
+#line 296 "src/memcached-grammar.rl"
 	{incr_sign = -1;}
 	goto st71;
 tr202:
-#line 292 "src/memcached-grammar.rl"
+#line 295 "src/memcached-grammar.rl"
 	{incr_sign = 1; }
 	goto st71;
 st71:
 	if ( ++p == pe )
 		goto _test_eof71;
 case 71:
-#line 2029 "src/memcached-grammar.cc"
+#line 2038 "src/memcached-grammar.cc"
 	switch( (*p) ) {
 		case 13: goto st0;
 		case 32: goto st71;
@@ -2034,7 +2043,7 @@ case 71:
 		goto st0;
 	goto tr114;
 tr114:
-#line 219 "src/memcached-grammar.rl"
+#line 222 "src/memcached-grammar.rl"
 	{
 			fstart = p;
 			for (; p < pe && *p != ' ' && *p != '\r' && *p != '\n'; p++);
@@ -2050,7 +2059,7 @@ case 71:
 	if ( ++p == pe )
 		goto _test_eof72;
 case 72:
-#line 2054 "src/memcached-grammar.cc"
+#line 2063 "src/memcached-grammar.cc"
 	if ( (*p) == 32 )
 		goto st73;
 	goto st0;
@@ -2064,14 +2073,14 @@ case 73:
 		goto tr117;
 	goto st0;
 tr117:
-#line 218 "src/memcached-grammar.rl"
+#line 221 "src/memcached-grammar.rl"
 	{ fstart = p; }
 	goto st74;
 st74:
 	if ( ++p == pe )
 		goto _test_eof74;
 case 74:
-#line 2075 "src/memcached-grammar.cc"
+#line 2084 "src/memcached-grammar.cc"
 	switch( (*p) ) {
 		case 10: goto tr118;
 		case 13: goto tr119;
@@ -2081,30 +2090,30 @@ case 74:
 		goto st74;
 	goto st0;
 tr133:
-#line 278 "src/memcached-grammar.rl"
+#line 281 "src/memcached-grammar.rl"
 	{ noreply = true; }
 	goto st75;
 tr119:
-#line 244 "src/memcached-grammar.rl"
+#line 247 "src/memcached-grammar.rl"
 	{incr = memcached_natoq(fstart, p);}
 	goto st75;
 st75:
 	if ( ++p == pe )
 		goto _test_eof75;
 case 75:
-#line 2096 "src/memcached-grammar.cc"
+#line 2105 "src/memcached-grammar.cc"
 	if ( (*p) == 10 )
 		goto tr122;
 	goto st0;
 tr120:
-#line 244 "src/memcached-grammar.rl"
+#line 247 "src/memcached-grammar.rl"
 	{incr = memcached_natoq(fstart, p);}
 	goto st76;
 st76:
 	if ( ++p == pe )
 		goto _test_eof76;
 case 76:
-#line 2108 "src/memcached-grammar.cc"
+#line 2117 "src/memcached-grammar.cc"
 	switch( (*p) ) {
 		case 10: goto tr122;
 		case 13: goto st75;
@@ -2178,14 +2187,14 @@ case 83:
 	}
 	goto st0;
 tr134:
-#line 278 "src/memcached-grammar.rl"
+#line 281 "src/memcached-grammar.rl"
 	{ noreply = true; }
 	goto st84;
 st84:
 	if ( ++p == pe )
 		goto _test_eof84;
 case 84:
-#line 2189 "src/memcached-grammar.cc"
+#line 2198 "src/memcached-grammar.cc"
 	switch( (*p) ) {
 		case 10: goto tr122;
 		case 13: goto st75;
@@ -2238,7 +2247,7 @@ case 89:
 		goto st0;
 	goto tr140;
 tr140:
-#line 219 "src/memcached-grammar.rl"
+#line 222 "src/memcached-grammar.rl"
 	{
 			fstart = p;
 			for (; p < pe && *p != ' ' && *p != '\r' && *p != '\n'; p++);
@@ -2254,7 +2263,7 @@ case 89:
 	if ( ++p == pe )
 		goto _test_eof90;
 case 90:
-#line 2258 "src/memcached-grammar.cc"
+#line 2267 "src/memcached-grammar.cc"
 	switch( (*p) ) {
 		case 10: goto tr141;
 		case 13: goto st91;
@@ -2262,7 +2271,7 @@ case 90:
 	}
 	goto st0;
 tr147:
-#line 234 "src/memcached-grammar.rl"
+#line 237 "src/memcached-grammar.rl"
 	{
 			exptime = memcached_natoq(fstart, p);
 			if (exptime > 0 && exptime <= 60*60*24*30)
@@ -2270,14 +2279,14 @@ case 90:
 		}
 	goto st91;
 tr158:
-#line 278 "src/memcached-grammar.rl"
+#line 281 "src/memcached-grammar.rl"
 	{ noreply = true; }
 	goto st91;
 st91:
 	if ( ++p == pe )
 		goto _test_eof91;
 case 91:
-#line 2281 "src/memcached-grammar.cc"
+#line 2290 "src/memcached-grammar.cc"
 	if ( (*p) == 10 )
 		goto tr141;
 	goto st0;
@@ -2296,14 +2305,14 @@ case 92:
 		goto tr144;
 	goto st0;
 tr144:
-#line 218 "src/memcached-grammar.rl"
+#line 221 "src/memcached-grammar.rl"
 	{ fstart = p; }
 	goto st93;
 st93:
 	if ( ++p == pe )
 		goto _test_eof93;
 case 93:
-#line 2307 "src/memcached-grammar.cc"
+#line 2316 "src/memcached-grammar.cc"
 	switch( (*p) ) {
 		case 10: goto tr146;
 		case 13: goto tr147;
@@ -2313,7 +2322,7 @@ case 93:
 		goto st93;
 	goto st0;
 tr148:
-#line 234 "src/memcached-grammar.rl"
+#line 237 "src/memcached-grammar.rl"
 	{
 			exptime = memcached_natoq(fstart, p);
 			if (exptime > 0 && exptime <= 60*60*24*30)
@@ -2324,7 +2333,7 @@ case 93:
 	if ( ++p == pe )
 		goto _test_eof94;
 case 94:
-#line 2328 "src/memcached-grammar.cc"
+#line 2337 "src/memcached-grammar.cc"
 	switch( (*p) ) {
 		case 10: goto tr141;
 		case 13: goto st91;
@@ -2398,14 +2407,14 @@ case 101:
 	}
 	goto st0;
 tr159:
-#line 278 "src/memcached-grammar.rl"
+#line 281 "src/memcached-grammar.rl"
 	{ noreply = true; }
 	goto st102;
 st102:
 	if ( ++p == pe )
 		goto _test_eof102;
 case 102:
-#line 2409 "src/memcached-grammar.cc"
+#line 2418 "src/memcached-grammar.cc"
 	switch( (*p) ) {
 		case 10: goto tr141;
 		case 13: goto st91;
@@ -2493,18 +2502,18 @@ case 111:
 	}
 	goto st0;
 tr186:
-#line 278 "src/memcached-grammar.rl"
+#line 281 "src/memcached-grammar.rl"
 	{ noreply = true; }
 	goto st112;
 tr175:
-#line 245 "src/memcached-grammar.rl"
+#line 248 "src/memcached-grammar.rl"
 	{flush_delay = memcached_natoq(fstart, p);}
 	goto st112;
 st112:
 	if ( ++p == pe )
 		goto _test_eof112;
 case 112:
-#line 2508 "src/memcached-grammar.cc"
+#line 2517 "src/memcached-grammar.cc"
 	if ( (*p) == 10 )
 		goto tr169;
 	goto st0;
@@ -2523,14 +2532,14 @@ case 113:
 		goto tr172;
 	goto st0;
 tr172:
-#line 218 "src/memcached-grammar.rl"
+#line 221 "src/memcached-grammar.rl"
 	{ fstart = p; }
 	goto st114;
 st114:
 	if ( ++p == pe )
 		goto _test_eof114;
 case 114:
-#line 2534 "src/memcached-grammar.cc"
+#line 2543 "src/memcached-grammar.cc"
 	switch( (*p) ) {
 		case 10: goto tr174;
 		case 13: goto tr175;
@@ -2540,14 +2549,14 @@ case 114:
 		goto st114;
 	goto st0;
 tr176:
-#line 245 "src/memcached-grammar.rl"
+#line 248 "src/memcached-grammar.rl"
 	{flush_delay = memcached_natoq(fstart, p);}
 	goto st115;
 st115:
 	if ( ++p == pe )
 		goto _test_eof115;
 case 115:
-#line 2551 "src/memcached-grammar.cc"
+#line 2560 "src/memcached-grammar.cc"
 	switch( (*p) ) {
 		case 10: goto tr169;
 		case 13: goto st112;
@@ -2621,14 +2630,14 @@ case 122:
 	}
 	goto st0;
 tr187:
-#line 278 "src/memcached-grammar.rl"
+#line 281 "src/memcached-grammar.rl"
 	{ noreply = true; }
 	goto st123;
 st123:
 	if ( ++p == pe )
 		goto _test_eof123;
 case 123:
-#line 2632 "src/memcached-grammar.cc"
+#line 2641 "src/memcached-grammar.cc"
 	switch( (*p) ) {
 		case 10: goto tr169;
 		case 13: goto st112;
@@ -2664,18 +2673,18 @@ case 126:
 	}
 	goto st0;
 tr191:
-#line 289 "src/memcached-grammar.rl"
+#line 292 "src/memcached-grammar.rl"
 	{show_cas = false;}
 	goto st127;
 tr198:
-#line 290 "src/memcached-grammar.rl"
+#line 293 "src/memcached-grammar.rl"
 	{show_cas = true;}
 	goto st127;
 st127:
 	if ( ++p == pe )
 		goto _test_eof127;
 case 127:
-#line 2679 "src/memcached-grammar.cc"
+#line 2688 "src/memcached-grammar.cc"
 	switch( (*p) ) {
 		case 13: goto st0;
 		case 32: goto st127;
@@ -2684,7 +2693,7 @@ case 127:
 		goto st0;
 	goto tr193;
 tr193:
-#line 219 "src/memcached-grammar.rl"
+#line 222 "src/memcached-grammar.rl"
 	{
 			fstart = p;
 			for (; p < pe && *p != ' ' && *p != '\r' && *p != '\n'; p++);
@@ -2700,7 +2709,7 @@ case 127:
 	if ( ++p == pe )
 		goto _test_eof128;
 case 128:
-#line 2704 "src/memcached-grammar.cc"
+#line 2713 "src/memcached-grammar.cc"
 	switch( (*p) ) {
 		case 10: goto tr195;
 		case 13: goto st129;
@@ -2943,7 +2952,7 @@ case 155:
 		goto st0;
 	goto tr222;
 tr222:
-#line 219 "src/memcached-grammar.rl"
+#line 222 "src/memcached-grammar.rl"
 	{
 			fstart = p;
 			for (; p < pe && *p != ' ' && *p != '\r' && *p != '\n'; p++);
@@ -2959,7 +2968,7 @@ case 155:
 	if ( ++p == pe )
 		goto _test_eof156;
 case 156:
-#line 2963 "src/memcached-grammar.cc"
+#line 2972 "src/memcached-grammar.cc"
 	if ( (*p) == 32 )
 		goto st157;
 	goto st0;
@@ -2973,49 +2982,49 @@ case 157:
 		goto tr224;
 	goto st0;
 tr224:
-#line 218 "src/memcached-grammar.rl"
+#line 221 "src/memcached-grammar.rl"
 	{ fstart = p; }
 	goto st158;
 st158:
 	if ( ++p == pe )
 		goto _test_eof158;
 case 158:
-#line 2984 "src/memcached-grammar.cc"
+#line 2993 "src/memcached-grammar.cc"
 	if ( (*p) == 32 )
 		goto tr225;
 	if ( 48 <= (*p) && (*p) <= 57 )
 		goto st158;
 	goto st0;
 tr225:
-#line 241 "src/memcached-grammar.rl"
+#line 244 "src/memcached-grammar.rl"
 	{flags = memcached_natoq(fstart, p);}
 	goto st159;
 st159:
 	if ( ++p == pe )
 		goto _test_eof159;
 case 159:
-#line 2998 "src/memcached-grammar.cc"
+#line 3007 "src/memcached-grammar.cc"
 	if ( (*p) == 32 )
 		goto st159;
 	if ( 48 <= (*p) && (*p) <= 57 )
 		goto tr228;
 	goto st0;
 tr228:
-#line 218 "src/memcached-grammar.rl"
+#line 221 "src/memcached-grammar.rl"
 	{ fstart = p; }
 	goto st160;
 st160:
 	if ( ++p == pe )
 		goto _test_eof160;
 case 160:
-#line 3012 "src/memcached-grammar.cc"
+#line 3021 "src/memcached-grammar.cc"
 	if ( (*p) == 32 )
 		goto tr229;
 	if ( 48 <= (*p) && (*p) <= 57 )
 		goto st160;
 	goto st0;
 tr229:
-#line 234 "src/memcached-grammar.rl"
+#line 237 "src/memcached-grammar.rl"
 	{
 			exptime = memcached_natoq(fstart, p);
 			if (exptime > 0 && exptime <= 60*60*24*30)
@@ -3026,21 +3035,21 @@ case 160:
 	if ( ++p == pe )
 		goto _test_eof161;
 case 161:
-#line 3030 "src/memcached-grammar.cc"
+#line 3039 "src/memcached-grammar.cc"
 	if ( (*p) == 32 )
 		goto st161;
 	if ( 48 <= (*p) && (*p) <= 57 )
 		goto tr232;
 	goto st0;
 tr232:
-#line 218 "src/memcached-grammar.rl"
+#line 221 "src/memcached-grammar.rl"
 	{ fstart = p; }
 	goto st162;
 st162:
 	if ( ++p == pe )
 		goto _test_eof162;
 case 162:
-#line 3044 "src/memcached-grammar.cc"
+#line 3053 "src/memcached-grammar.cc"
 	switch( (*p) ) {
 		case 10: goto tr233;
 		case 13: goto tr234;
@@ -3050,30 +3059,30 @@ case 162:
 		goto st162;
 	goto st0;
 tr234:
-#line 242 "src/memcached-grammar.rl"
+#line 245 "src/memcached-grammar.rl"
 	{bytes = memcached_natoq(fstart, p);}
 	goto st163;
 tr247:
-#line 278 "src/memcached-grammar.rl"
+#line 281 "src/memcached-grammar.rl"
 	{ noreply = true; }
 	goto st163;
 st163:
 	if ( ++p == pe )
 		goto _test_eof163;
 case 163:
-#line 3065 "src/memcached-grammar.cc"
+#line 3074 "src/memcached-grammar.cc"
 	if ( (*p) == 10 )
 		goto tr237;
 	goto st0;
 tr235:
-#line 242 "src/memcached-grammar.rl"
+#line 245 "src/memcached-grammar.rl"
 	{bytes = memcached_natoq(fstart, p);}
 	goto st164;
 st164:
 	if ( ++p == pe )
 		goto _test_eof164;
 case 164:
-#line 3077 "src/memcached-grammar.cc"
+#line 3086 "src/memcached-grammar.cc"
 	switch( (*p) ) {
 		case 32: goto st164;
 		case 78: goto st165;
@@ -3182,7 +3191,7 @@ case 175:
 		goto st0;
 	goto tr252;
 tr252:
-#line 219 "src/memcached-grammar.rl"
+#line 222 "src/memcached-grammar.rl"
 	{
 			fstart = p;
 			for (; p < pe && *p != ' ' && *p != '\r' && *p != '\n'; p++);
@@ -3198,7 +3207,7 @@ case 175:
 	if ( ++p == pe )
 		goto _test_eof176;
 case 176:
-#line 3202 "src/memcached-grammar.cc"
+#line 3211 "src/memcached-grammar.cc"
 	if ( (*p) == 32 )
 		goto st177;
 	goto st0;
@@ -3212,49 +3221,49 @@ case 177:
 		goto tr254;
 	goto st0;
 tr254:
-#line 218 "src/memcached-grammar.rl"
+#line 221 "src/memcached-grammar.rl"
 	{ fstart = p; }
 	goto st178;
 st178:
 	if ( ++p == pe )
 		goto _test_eof178;
 case 178:
-#line 3223 "src/memcached-grammar.cc"
+#line 3232 "src/memcached-grammar.cc"
 	if ( (*p) == 32 )
 		goto tr255;
 	if ( 48 <= (*p) && (*p) <= 57 )
 		goto st178;
 	goto st0;
 tr255:
-#line 241 "src/memcached-grammar.rl"
+#line 244 "src/memcached-grammar.rl"
 	{flags = memcached_natoq(fstart, p);}
 	goto st179;
 st179:
 	if ( ++p == pe )
 		goto _test_eof179;
 case 179:
-#line 3237 "src/memcached-grammar.cc"
+#line 3246 "src/memcached-grammar.cc"
 	if ( (*p) == 32 )
 		goto st179;
 	if ( 48 <= (*p) && (*p) <= 57 )
 		goto tr258;
 	goto st0;
 tr258:
-#line 218 "src/memcached-grammar.rl"
+#line 221 "src/memcached-grammar.rl"
 	{ fstart = p; }
 	goto st180;
 st180:
 	if ( ++p == pe )
 		goto _test_eof180;
 case 180:
-#line 3251 "src/memcached-grammar.cc"
+#line 3260 "src/memcached-grammar.cc"
 	if ( (*p) == 32 )
 		goto tr259;
 	if ( 48 <= (*p) && (*p) <= 57 )
 		goto st180;
 	goto st0;
 tr259:
-#line 234 "src/memcached-grammar.rl"
+#line 237 "src/memcached-grammar.rl"
 	{
 			exptime = memcached_natoq(fstart, p);
 			if (exptime > 0 && exptime <= 60*60*24*30)
@@ -3265,21 +3274,21 @@ case 180:
 	if ( ++p == pe )
 		goto _test_eof181;
 case 181:
-#line 3269 "src/memcached-grammar.cc"
+#line 3278 "src/memcached-grammar.cc"
 	if ( (*p) == 32 )
 		goto st181;
 	if ( 48 <= (*p) && (*p) <= 57 )
 		goto tr262;
 	goto st0;
 tr262:
-#line 218 "src/memcached-grammar.rl"
+#line 221 "src/memcached-grammar.rl"
 	{ fstart = p; }
 	goto st182;
 st182:
 	if ( ++p == pe )
 		goto _test_eof182;
 case 182:
-#line 3283 "src/memcached-grammar.cc"
+#line 3292 "src/memcached-grammar.cc"
 	switch( (*p) ) {
 		case 10: goto tr263;
 		case 13: goto tr264;
@@ -3289,30 +3298,30 @@ case 182:
 		goto st182;
 	goto st0;
 tr264:
-#line 242 "src/memcached-grammar.rl"
+#line 245 "src/memcached-grammar.rl"
 	{bytes = memcached_natoq(fstart, p);}
 	goto st183;
 tr277:
-#line 278 "src/memcached-grammar.rl"
+#line 281 "src/memcached-grammar.rl"
 	{ noreply = true; }
 	goto st183;
 st183:
 	if ( ++p == pe )
 		goto _test_eof183;
 case 183:
-#line 3304 "src/memcached-grammar.cc"
+#line 3313 "src/memcached-grammar.cc"
 	if ( (*p) == 10 )
 		goto tr267;
 	goto st0;
 tr265:
-#line 242 "src/memcached-grammar.rl"
+#line 245 "src/memcached-grammar.rl"
 	{bytes = memcached_natoq(fstart, p);}
 	goto st184;
 st184:
 	if ( ++p == pe )
 		goto _test_eof184;
 case 184:
-#line 3316 "src/memcached-grammar.cc"
+#line 3325 "src/memcached-grammar.cc"
 	switch( (*p) ) {
 		case 32: goto st184;
 		case 78: goto st185;
@@ -3627,7 +3636,7 @@ case 196:
 	_out: {}
 	}
 
-#line 303 "src/memcached-grammar.rl"
+#line 306 "src/memcached-grammar.rl"
 
 
 	if (!done) {
diff --git a/src/memcached-grammar.rl b/src/memcached-grammar.rl
index f772b5f0b49f7e25bc56a62570d34ee26018fdeb..25da667cdc5910ff24559b75c0c05052555f2188 100644
--- a/src/memcached-grammar.rl
+++ b/src/memcached-grammar.rl
@@ -96,24 +96,25 @@ memcached_dispatch(struct ev_io *coio, struct iobuf *iobuf)
 
 		action append_prepend {
 			struct tbuf *b;
-			const char *fb, *fe;
+			const char *field;
+			uint32_t field_len;
 
 			key = tbuf_read_field(keys);
 			struct tuple *tuple = memcached_find(key);
 			if (tuple == NULL) {
 				obuf_dup(out, "NOT_STORED\r\n", 12);
 			} else {
-				tuple_field(tuple, 3, &fb, &fe);
+				field = tuple_field(tuple, 3, &field_len);
 				b = tbuf_new(fiber->gc_pool);
 				if (append) {
-					tbuf_append(b, fb, fe - fb);
+					tbuf_append(b, field, field_len);
 					tbuf_append(b, data, bytes);
 				} else {
 					tbuf_append(b, data, bytes);
-					tbuf_append(b, fb, fe - fb);
+					tbuf_append(b, field, field_len);
 				}
 
-				bytes += (fe - fb);
+				bytes += field_len;
 				data = b->data;
 				STORE;
 			}
@@ -122,7 +123,8 @@ memcached_dispatch(struct ev_io *coio, struct iobuf *iobuf)
 		action incr_decr {
 			struct meta *m;
 			struct tbuf *b;
-			const char *fb, *fe;
+			const char *field;
+			uint32_t field_len;
 			u64 value;
 
 			key = tbuf_read_field(keys);
@@ -131,10 +133,11 @@ memcached_dispatch(struct ev_io *coio, struct iobuf *iobuf)
 				obuf_dup(out, "NOT_FOUND\r\n", 11);
 			} else {
 				m = memcached_meta(tuple);
-				tuple_field(tuple, 3, &fb, &fe);
+				field = tuple_field(tuple, 3, &field_len);
 
-				if (memcached_is_numeric(fb, fe - fb)) {
-					value = memcached_natoq(fb, fe);
+				if (memcached_is_numeric(field, field_len)) {
+					value = memcached_natoq(field,
+								field + field_len);
 
 					if (incr_sign > 0) {
 						value += incr;
diff --git a/src/memcached.cc b/src/memcached.cc
index a8fec800700813ca0b199f3dd2a6eb15bb86a990..a4b0567db196764ad5c7d9479efaeb0966478d14 100644
--- a/src/memcached.cc
+++ b/src/memcached.cc
@@ -180,10 +180,10 @@ memcached_find(const char *key)
 static struct meta *
 memcached_meta(struct tuple *tuple)
 {
-	const char *fb, *fe;
-	tuple_field(tuple, 1, &fb, &fe);
-	assert (fb + sizeof(struct meta) <= fe);
-	return (struct meta *) fb;
+	uint32_t len;
+	const char *field = tuple_field(tuple, 1, &len);
+	assert (sizeof(struct meta) <= len);
+	return (struct meta *) field;
 }
 
 static bool
@@ -288,27 +288,23 @@ void memcached_get(struct obuf *out, size_t keys_count, struct tbuf *keys,
 			continue;
 		}
 
-		const char *fb, *fe;
+		uint32_t len;
 		struct tuple_iterator it;
+		tuple_rewind(&it, tuple);
 		/* skip key */
-		tuple_seek(&it, tuple, 1, &fb, &fe);
+		(void) tuple_next(&it, &len);
 
 		/* metainfo */
-		tuple_next(&it);
-		m = (const struct meta *) fb;
-		assert (fb + sizeof(struct meta *) < fe);
+		m = (const struct meta *) tuple_next(&it, &len);
+		assert(sizeof(struct meta) <= len);
 
 		/* suffix */
-		tuple_next(&it);
-		suffix_len = fe - fb;
-		suffix = fb;
+		suffix = tuple_next(&it, &suffix_len);
 
 		/* value */
-		tuple_next(&it);
-		value_len = fe - fb;
-		value = fb;
+		value = tuple_next(&it, &value_len);
 
-		assert (!tuple_next(&it));
+		assert(tuple_next(&it, &len) == NULL);
 
 		if (m->exptime > 0 && m->exptime < ev_now()) {
 			stats.get_misses++;