diff --git a/src/contrib/wire_ctx.h b/src/contrib/wire_ctx.h
index a416400bc2b317c13163689594da926e7cf765dc..d8df799ef724d9e32e4e948d406411ad0cbc0dd3 100644
--- a/src/contrib/wire_ctx.h
+++ b/src/contrib/wire_ctx.h
@@ -187,222 +187,131 @@ static inline int wire_ctx_can_write(wire_ctx_t *ctx, size_t size)
 	return KNOT_EOK;
 }
 
-static inline uint8_t wire_ctx_read_u8(wire_ctx_t *ctx)
+
+static inline void wire_ctx_read(wire_ctx_t *ctx, void *data, size_t size)
 {
 	assert(ctx);
+	assert(data);
 
 	if (ctx->error != KNOT_EOK) {
-		return 0;
+		/* Avoid leaving data uninitialized. */
+		memset(data, 0, size);
+		return;
 	}
 
-	int ret = wire_ctx_can_read(ctx, sizeof(uint8_t));
+	int ret = wire_ctx_can_read(ctx, size);
 	if (ret != KNOT_EOK) {
 		ctx->error = ret;
-		return 0;
+		memset(data, 0, size);
+		return;
 	}
 
-	uint8_t result = *ctx->position;
-	ctx->position += sizeof(uint8_t);
+	memcpy(data, ctx->position, size);
+	ctx->position += size;
+}
+
+static inline uint8_t wire_ctx_read_u8(wire_ctx_t *ctx)
+{
+	uint8_t result;
+	wire_ctx_read(ctx, &result, sizeof(result));
 
 	return result;
 }
 
 static inline uint16_t wire_ctx_read_u16(wire_ctx_t *ctx)
 {
-	assert(ctx);
-
-	if (ctx->error != KNOT_EOK) {
-		return 0;
-	}
-
-	int ret = wire_ctx_can_read(ctx, sizeof(uint16_t));
-	if (ret != KNOT_EOK) {
-		ctx->error = ret;
-		return 0;
-	}
-
-	uint16_t result = *((uint16_t *)ctx->position);
-	ctx->position += sizeof(uint16_t);
+	uint16_t result;
+	wire_ctx_read(ctx, &result, sizeof(result));
 
 	return be16toh(result);
 }
 
 static inline uint32_t wire_ctx_read_u32(wire_ctx_t *ctx)
 {
-	assert(ctx);
-
-	if (ctx->error != KNOT_EOK) {
-		return 0;
-	}
-
-	int ret = wire_ctx_can_read(ctx, sizeof(uint32_t));
-	if (ret != KNOT_EOK) {
-		ctx->error = ret;
-		return 0;
-	}
-
-	uint32_t result = *((uint32_t *)ctx->position);
-	ctx->position += sizeof(uint32_t);
+	uint32_t result;
+	wire_ctx_read(ctx, &result, sizeof(result));
 
 	return be32toh(result);
 }
 
 static inline uint64_t wire_ctx_read_u48(wire_ctx_t *ctx)
 {
-	assert(ctx);
-
-	if (ctx->error != KNOT_EOK) {
-		return 0;
-	}
-
-	int ret = wire_ctx_can_read(ctx, 6);
-	if (ret != KNOT_EOK) {
-		ctx->error = ret;
-		return 0;
-	}
-
+	/* This case is slightly tricky. */
 	uint64_t result = 0;
-	memcpy((uint8_t *)&result + 1, ctx->position, 6);
-	ctx->position += 6;
+	wire_ctx_read(ctx, (uint8_t *)&result + 1, 6);
 
 	return be64toh(result) >> 8;
 }
 
 static inline uint64_t wire_ctx_read_u64(wire_ctx_t *ctx)
 {
-	assert(ctx);
-
-	if (ctx->error != KNOT_EOK) {
-		return 0;
-	}
-
-	int ret = wire_ctx_can_read(ctx, sizeof(uint64_t));
-	if (ret != KNOT_EOK) {
-		ctx->error = ret;
-		return 0;
-	}
-
-	uint64_t result = *((uint64_t *)ctx->position);
-	ctx->position += sizeof(uint64_t);
+	uint64_t result;
+	wire_ctx_read(ctx, &result, sizeof(result));
 
 	return be64toh(result);
 }
 
-static inline void wire_ctx_read(wire_ctx_t *ctx, uint8_t *data, size_t size)
+
+static inline void wire_ctx_write(wire_ctx_t *ctx, const void *data, size_t size)
 {
 	assert(ctx);
-	assert(data);
 
 	if (ctx->error != KNOT_EOK) {
 		return;
 	}
 
-	int ret = wire_ctx_can_read(ctx, size);
+	if (size == 0) {
+		return;
+	}
+
+	assert(data);
+
+	int ret = wire_ctx_can_write(ctx, size);
 	if (ret != KNOT_EOK) {
 		ctx->error = ret;
 		return;
 	}
 
-	memcpy(data, ctx->position, size);
+	memcpy(ctx->position, data, size);
 	ctx->position += size;
 }
 
 static inline void wire_ctx_write_u8(wire_ctx_t *ctx, uint8_t value)
 {
-	assert(ctx);
-
-	if (ctx->error != KNOT_EOK) {
-		return;
-	}
-
-	int ret = wire_ctx_can_write(ctx, sizeof(uint8_t));
-	if (ret != KNOT_EOK) {
-		ctx->error = ret;
-		return;
-	}
-
-	*ctx->position = value;
-	ctx->position += sizeof(uint8_t);
+	wire_ctx_write(ctx, &value, sizeof(value));
 }
 
 static inline void wire_ctx_write_u16(wire_ctx_t *ctx, uint16_t value)
 {
-	assert(ctx);
-
-	if (ctx->error != KNOT_EOK) {
-		return;
-	}
-
-	int ret = wire_ctx_can_write(ctx, sizeof(uint16_t));
-	if (ret != KNOT_EOK) {
-		ctx->error = ret;
-		return;
-	}
-
-	*((uint16_t *)ctx->position) = htobe16(value);
-	ctx->position += sizeof(uint16_t);
+	uint16_t beval = htobe16(value);
+	wire_ctx_write(ctx, &beval, sizeof(beval));
 }
 
 static inline void wire_ctx_write_u32(wire_ctx_t *ctx, uint32_t value)
 {
-	assert(ctx);
-
-	if (ctx->error != KNOT_EOK) {
-		return;
-	}
-
-	int ret = wire_ctx_can_write(ctx, sizeof(uint32_t));
-	if (ret != KNOT_EOK) {
-		ctx->error = ret;
-		return;
-	}
-
-	*((uint32_t *)ctx->position) = htobe32(value);
-	ctx->position += sizeof(uint32_t);
+	uint32_t beval = htobe32(value);
+	wire_ctx_write(ctx, &beval, sizeof(beval));
 }
 
 static inline void wire_ctx_write_u48(wire_ctx_t *ctx, uint64_t value)
 {
-	assert(ctx);
-
-	if (ctx->error != KNOT_EOK) {
-		return;
-	}
-
-	int ret = wire_ctx_can_write(ctx, 6);
-	if (ret != KNOT_EOK) {
-		ctx->error = ret;
-		return;
-	}
-
+	/* This case is slightly tricky. */
 	uint64_t swapped = htobe64(value << 8);
-	memcpy(ctx->position, (uint8_t *)&swapped + 1, 6);
-	ctx->position += 6;
+	wire_ctx_write(ctx, (uint8_t *)&swapped + 1, 6);
 }
 
 static inline void wire_ctx_write_u64(wire_ctx_t *ctx, uint64_t value)
 {
-	assert(ctx);
-
-	if (ctx->error != KNOT_EOK) {
-		return;
-	}
-
-	int ret = wire_ctx_can_write(ctx, sizeof(uint64_t));
-	if (ret != KNOT_EOK) {
-		ctx->error = ret;
-		return;
-	}
-
-	*((uint64_t *)ctx->position) = htobe64(value);
-	ctx->position += sizeof(uint64_t);
+	uint64_t beval = htobe64(value);
+	wire_ctx_write(ctx, &beval, sizeof(beval));
 }
 
-static inline void wire_ctx_write(wire_ctx_t *ctx, const uint8_t *data, size_t size)
+
+static inline void wire_ctx_memset(wire_ctx_t *dst, int value, size_t size)
 {
-	assert(ctx);
+	assert(dst);
 
-	if (ctx->error != KNOT_EOK) {
+	if (dst->error != KNOT_EOK) {
 		return;
 	}
 
@@ -410,34 +319,19 @@ static inline void wire_ctx_write(wire_ctx_t *ctx, const uint8_t *data, size_t s
 		return;
 	}
 
-	assert(data);
-
-	int ret = wire_ctx_can_write(ctx, size);
+	int ret = wire_ctx_can_write(dst, size);
 	if (ret != KNOT_EOK) {
-		ctx->error = ret;
+		dst->error = ret;
 		return;
 	}
 
-	memcpy(ctx->position, data, size);
-	ctx->position += size;
+	memset(dst->position, value, size);
+	dst->position += size;
 }
 
 static inline void wire_ctx_clear(wire_ctx_t *ctx, size_t size)
 {
-	assert(ctx);
-
-	if (ctx->error != KNOT_EOK) {
-		return;
-	}
-
-	int ret = wire_ctx_can_write(ctx, size);
-	if (ret != KNOT_EOK) {
-		ctx->error = ret;
-		return;
-	}
-
-	memset(ctx->position, 0, size);
-	ctx->position += size;
+	wire_ctx_memset(ctx, 0, size);
 }
 
 static inline void wire_ctx_copy(wire_ctx_t *dst, wire_ctx_t *src, size_t size)
@@ -465,24 +359,3 @@ static inline void wire_ctx_copy(wire_ctx_t *dst, wire_ctx_t *src, size_t size)
 	src->position += size;
 }
 
-static inline void wire_ctx_memset(wire_ctx_t *dst, int value, size_t size)
-{
-	assert(dst);
-
-	if (dst->error != KNOT_EOK) {
-		return;
-	}
-
-	if (size == 0) {
-		return;
-	}
-
-	int ret = wire_ctx_can_write(dst, size);
-	if (ret != KNOT_EOK) {
-		dst->error = ret;
-		return;
-	}
-
-	memset(dst->position, value, size);
-	dst->position += size;
-}
diff --git a/src/libknot/control/control.c b/src/libknot/control/control.c
index 0b578b8486348bed4121e9718983ae70a595e97e..8591519f50a8040e6805f8103f6c3fff20c3407c 100644
--- a/src/libknot/control/control.c
+++ b/src/libknot/control/control.c
@@ -491,7 +491,7 @@ static int receive_item_value(knot_ctl_t *ctx, char **value)
 	if (*value == NULL) {
 		return KNOT_ENOMEM;
 	}
-	wire_ctx_read(w, (uint8_t *)*value, data_len);
+	wire_ctx_read(w, *value, data_len);
 	if (w->error != KNOT_EOK) {
 		return w->error;
 	}
diff --git a/src/libknot/yparser/yptrafo.c b/src/libknot/yparser/yptrafo.c
index 5c1b9aa4acc721d438f92f999c40cb6c033e4a9b..d87f34714e25c4be5f57cf13e7a6fd7862fa48f9 100644
--- a/src/libknot/yparser/yptrafo.c
+++ b/src/libknot/yparser/yptrafo.c
@@ -409,7 +409,7 @@ int yp_addr_noport_to_txt(
 		}
 		break;
 	case 4:
-		wire_ctx_read(in, (uint8_t *)&(addr4.s_addr), sizeof(addr4.s_addr));
+		wire_ctx_read(in, &(addr4.s_addr), sizeof(addr4.s_addr));
 		if (inet_ntop(AF_INET, &addr4, (char *)out->position,
 		    wire_ctx_available(out)) == NULL) {
 			return KNOT_EINVAL;
@@ -417,7 +417,7 @@ int yp_addr_noport_to_txt(
 		wire_ctx_skip(out, strlen((char *)out->position));
 		break;
 	case 6:
-		wire_ctx_read(in, (uint8_t *)&(addr6.s6_addr), sizeof(addr6.s6_addr));
+		wire_ctx_read(in, &(addr6.s6_addr), sizeof(addr6.s6_addr));
 		if (inet_ntop(AF_INET6, &addr6, (char *)out->position,
 		    wire_ctx_available(out)) == NULL) {
 			return KNOT_EINVAL;