diff --git a/src/cmdu_validate.c b/src/cmdu_validate.c
index 13ba37367fe6e3fb814109f028f15f2d19dde9ae..c44418f310dbf62108b0b91e3c92ed5f59a3b461 100644
--- a/src/cmdu_validate.c
+++ b/src/cmdu_validate.c
@@ -267,8 +267,7 @@ static int check_wsc_tlv(struct tlv *t)
 	return validate_wsc_m2(tv_data, tlv_len);
 }
 
-/* Check 1905.1 AL MAC address type TLV */
-static int check_al_mac_addr_type_tlv(struct tlv *t)
+static int check_serialized_tlv(struct tlv *t, uint16_t len)
 {
 	uint8_t *tv_data;
 	uint16_t tlv_len;
@@ -278,8 +277,7 @@ static int check_al_mac_addr_type_tlv(struct tlv *t)
 
 	tlv_len = tlv_length(t);
 
-	/* macaddr (6 bytes) */
-	if (tlv_len != 6)
+	if (tlv_len != len)
 		return -1;
 
 	tv_data = (uint8_t *)t->data;
@@ -289,158 +287,66 @@ static int check_al_mac_addr_type_tlv(struct tlv *t)
 	return 0;
 }
 
+/* Check 1905.1 AL MAC address type TLV */
+static int check_al_mac_addr_type_tlv(struct tlv *t)
+{
+	/* macaddr (6 bytes) */
+	return check_serialized_tlv(t, 6);
+}
+
 /* Check AP Radio Indentifier TLV */
 static int check_ap_radio_dentifier_tlv(struct tlv *t)
 {
-	uint8_t *tv_data;
-	uint16_t tlv_len;
-
-	if (!t)
-		return -1;
-
-	tlv_len = tlv_length(t);
-
 	/* bssid (6 bytes) */
-	if (tlv_len != 6)
-		return -1;
-
-	tv_data = (uint8_t *)t->data;
-	if (!tv_data)
-		return -1;
-
-	return 0;
+	return check_serialized_tlv(t, 6);
 }
 
 /* Check Default 802.1Q Settings TLV */
 static int check_default_11q_settings_tlv(struct tlv *t)
 {
-	struct tlv_default_8021q_settings *tlv;
-	uint16_t tlv_len;
-
-	if (!t)
-		return -1;
-
-	tlv_len = tlv_length(t);
-
 	/* pvid + pcp (3 bytes) */
-	if (tlv_len != sizeof(struct tlv_default_8021q_settings))
-		return -1;
-
-	tlv = (struct tlv_default_8021q_settings *)t->data;
-	if (!tlv)
-		return -1;
-
-	return 0;
+	return check_serialized_tlv(t,
+				sizeof(struct tlv_default_8021q_settings));
 }
 
 /* Check SupportedFreqBand TLV */
 static int check_supported_band_tlv(struct tlv *t)
 {
-	struct tlv_supported_band *tlv;
-	uint16_t tlv_len;
-
-	if (!t)
-		return -1;
-
-	tlv_len = tlv_length(t);
-
 	/* band (1 byte) */
-	if (tlv_len != sizeof(struct tlv_supported_band))
-		return -1;
-
-	tlv = (struct tlv_supported_band *)t->data;
-	if (!tlv)
-		return -1;
-
-	return 0;
+	return check_serialized_tlv(t,
+				sizeof(struct tlv_supported_band));
 }
 
 /* Check SupportedRole TLV */
 static int check_supported_role_tlv(struct tlv *t)
 {
-	struct tlv_supported_role *tlv;
-	uint16_t tlv_len;
-
-	if (!t)
-		return -1;
-
-	tlv_len = tlv_length(t);
-
 	/* role (1 byte) */
-	if (tlv_len != sizeof(struct tlv_supported_role))
-		return -1;
-
-	tlv = (struct tlv_supported_role *)t->data;
-	if (!tlv)
-		return -1;
-
-	return 0;
+	return check_serialized_tlv(t,
+				sizeof(struct tlv_supported_role));
 }
 
 /* Check MultiAP Profile TLV */
 static int check_map_profile_tlv(struct tlv *t)
 {
-	struct tlv_map_profile *tlv;
-	uint16_t tlv_len;
-
-	if (!t)
-		return -1;
-
-	tlv_len = tlv_length(t);
-
 	/* profile (1 byte) */
-	if (tlv_len != sizeof(struct tlv_map_profile))
-		return -1;
-
-	tlv = (struct tlv_map_profile *)t->data;
-	if (!tlv)
-		return -1;
-
-	return 0;
+	return check_serialized_tlv(t,
+				sizeof(struct tlv_map_profile));
 }
 
 /* Check SearchedRole TLV */
 static int check_searched_role_tlv(struct tlv *t)
 {
-	struct tlv_searched_role *tlv;
-	uint16_t tlv_len;
-
-	if (!t)
-		return -1;
-
-	tlv_len = tlv_length(t);
-
 	/* role (1 byte) */
-	if (tlv_len != sizeof(struct tlv_searched_role))
-		return -1;
-
-	tlv = (struct tlv_searched_role *)t->data;
-	if (!tlv)
-		return -1;
-
-	return 0;
+	return check_serialized_tlv(t,
+				sizeof(struct tlv_searched_role));
 }
 
 /* Check AutoconfigFreqBand TLV */
 static int check_autoconfig_freq_band_tlv(struct tlv *t)
 {
-	struct tlv_autoconfig_band *tlv;
-	uint16_t tlv_len;
-
-	if (!t)
-		return -1;
-
-	tlv_len = tlv_length(t);
-
 	/* band (1 byte) */
-	if (tlv_len != sizeof(struct tlv_autoconfig_band))
-		return -1;
-
-	tlv = (struct tlv_autoconfig_band *)t->data;
-	if (!tlv)
-		return -1;
-
-	return 0;
+	return check_serialized_tlv(t,
+				sizeof(struct tlv_autoconfig_band));
 }
 
 /* Check Traffic Separation Policy TLV */
@@ -487,8 +393,8 @@ static int check_traffic_separation_policy_tlv(struct tlv *t)
 	return 0;
 }
 
-/* Check SupportedService TLV */
-static int check_supported_service_tlv(struct tlv *t)
+/* Check service TLV */
+static int check_service_tlv(struct tlv *t)
 {
 	int offset = 0;
 	uint8_t num_services;
@@ -516,33 +422,16 @@ static int check_supported_service_tlv(struct tlv *t)
 	return 0;
 }
 
+/* Check SupportedService TLV */
+static int check_supported_service_tlv(struct tlv *t)
+{
+	return check_service_tlv(t);
+}
+
 /* Check SearchedService TLV */
 static int check_searched_service_tlv(struct tlv *t)
 {
-	int offset = 0;
-	uint8_t num_services;
-	uint8_t *tv_data;
-	uint16_t tlv_len;
-
-	if (!t)
-		return -1;
-
-	tlv_len = tlv_length(t);
-	/* at least 1 byte: num_services */
-	if (tlv_len < 1)
-		return -1;
-
-	tv_data = (uint8_t *)t->data;
-	if (!tv_data)
-		return -1;
-
-	num_services = tv_data[offset++];
-
-	/* services (num_services bytes) */
-	if (offset + num_services > tlv_len)
-		return -1;
-
-	return 0;
+	return check_service_tlv(t);
 }
 
 bool validate_ap_autoconfig_wsc(struct cmdu_buff *cmdu, struct tlv *tv[][16])