[prev in list] [next in list] [prev in thread] [next in thread] 

List:       fwts-devel
Subject:    ACK: [PATCH 1/3] fwts: remove launchpad tagging from fwts
From:       Alex Hung <alex.hung () canonical ! com>
Date:       2013-12-23 12:03:25
Message-ID: 52B8268D.2050001 () canonical ! com
[Download RAW message or body]

On 12/17/2013 10:21 PM, Colin King wrote:
> From: Colin Ian King <colin.king@canonical.com>
> 
> fwts launchpad tags have never been used and are an overhead
> that is effectivelty redundant.  So, rather than keep on maintaining
> this, remove the tagging from the fwts lib and the fwts tests.
> 
> Signed-off-by: Colin Ian King <colin.king@canonical.com>
> ---
> src/acpi/apicinstance/apicinstance.c |   1 -
> src/acpi/checksum/checksum.c         |   2 -
> src/acpi/dmar/dmar.c                 |   1 -
> src/acpi/fadt/fadt.c                 |  13 +--
> src/acpi/lid/lid.c                   |  16 ++-
> src/acpi/mcfg/mcfg.c                 |   6 --
> src/acpi/method/method.c             |  90 ++--------------
> src/acpi/powerbutton/powerbutton.c   |   5 +-
> src/acpi/s3/s3.c                     |   4 -
> src/acpi/s3power/s3power.c           |   7 +-
> src/acpi/s4/s4.c                     |   8 --
> src/acpi/wakealarm/wakealarm.c       |   5 -
> src/apic/apicedge/apicedge.c         |  12 +--
> src/bios/bios32/bios32.c             |  24 ++---
> src/bios/ebda_region/ebda_region.c   |   4 +-
> src/bios/mtrr/mtrr.c                 |  12 +--
> src/bios/os2gap/os2gap.c             |   1 -
> src/bios/pciirq/pciirq.c             |   4 +-
> src/bios/pnp/pnp.c                   |   4 +-
> src/lib/include/fwts.h               |   1 -
> src/lib/include/fwts_framework.h     |   7 +-
> src/lib/include/fwts_klog.h          |   1 -
> src/lib/include/fwts_log.h           |   3 -
> src/lib/include/fwts_tag.h           |  83 --------------
> src/lib/src/Makefile.am              |   1 -
> src/lib/src/fwts_framework.c         |  57 +++-------
> src/lib/src/fwts_klog.c              |   5 -
> src/lib/src/fwts_log.c               |   5 -
> src/lib/src/fwts_tag.c               | 202 -----------------------------------
> src/pci/crs/crs.c                    |   7 --
> src/pci/maxreadreq/maxreadreq.c      |   1 -
> 31 files changed, 53 insertions(+), 539 deletions(-)
> delete mode 100644 src/lib/include/fwts_tag.h
> delete mode 100644 src/lib/src/fwts_tag.c
> 
> diff --git a/src/acpi/apicinstance/apicinstance.c \
> b/src/acpi/apicinstance/apicinstance.c index 1c262b4..5949879 100644
> --- a/src/acpi/apicinstance/apicinstance.c
> +++ b/src/acpi/apicinstance/apicinstance.c
> @@ -61,7 +61,6 @@ static int apicinstance_test1(fwts_framework *fw)
> 		fwts_failed(fw, LOG_LEVEL_HIGH, "MultipleAPICMADT",
> 			"Found %d APIC/MADT tables, the kernel expects just one.",
> 			count);
> -		fwts_tag_failed(fw, FWTS_TAG_ACPI_INVALID_TABLE);
> 		snprintf(buffer, sizeof(buffer), " (or up to %d)", count);
> 		fwts_log_advice(fw,
> 			"If you find any APIC issues, perhaps try using "
> diff --git a/src/acpi/checksum/checksum.c b/src/acpi/checksum/checksum.c
> index 3eb3f74..0138430 100644
> --- a/src/acpi/checksum/checksum.c
> +++ b/src/acpi/checksum/checksum.c
> @@ -133,8 +133,6 @@ static int checksum_scan_tables(fwts_framework *fw)
> 				"error and still load it. This is not a "
> 				"critical issue, but should be fixed if "
> 				"possible to avoid the warning messages.");
> -
> -			fwts_tag_failed(fw, FWTS_TAG_ACPI_TABLE_CHECKSUM);
> 		}
> 	}
> 	return FWTS_OK;
> diff --git a/src/acpi/dmar/dmar.c b/src/acpi/dmar/dmar.c
> index 880ba88..d6a6d28 100644
> --- a/src/acpi/dmar/dmar.c
> +++ b/src/acpi/dmar/dmar.c
> @@ -264,7 +264,6 @@ static int dmar_acpi_table_check(fwts_framework *fw)
> 	if (table->length <= DMAR_HEADER_SIZE) {
> 		fwts_failed(fw, LOG_LEVEL_MEDIUM, "InvalidDMAR",
> 			"Invalid DMAR ACPI table.");
> -		fwts_tag_failed(fw, FWTS_TAG_ACPI_INVALID_TABLE);
> 		return FWTS_ERROR;
> 	}
> 
> diff --git a/src/acpi/fadt/fadt.c b/src/acpi/fadt/fadt.c
> index 9807d56..70ec5e9 100644
> --- a/src/acpi/fadt/fadt.c
> +++ b/src/acpi/fadt/fadt.c
> @@ -75,20 +75,16 @@ static int fadt_test1(fwts_framework *fw)
> 	if ((fadt->header.revision > 1) || (fadt->header.length >= 244)) {
> 		/*  Sanity check sizes with extended address variants */
> 		fwts_log_info(fw, "FADT is greater than ACPI version 1.0");
> -		if ((uint64_t)port != fadt->x_pm1a_cnt_blk.address) {
> +		if ((uint64_t)port != fadt->x_pm1a_cnt_blk.address)
> 			fwts_failed(fw, LOG_LEVEL_MEDIUM,
> 				"FADTPM1CNTAddrMismatch",
> 				"32 and 64 bit versions of FADT pm1_cnt address do not match (0x%8.8x vs \
> 0x%16.16" PRIx64 ").",  port, fadt->x_pm1a_cnt_blk.address);
> -			fwts_tag_failed(fw, FWTS_TAG_ACPI_BAD_ADDRESS);
> -		}
> -		if (width != fadt->x_pm1a_cnt_blk.register_bit_width) {
> +		if (width != fadt->x_pm1a_cnt_blk.register_bit_width)
> 			fwts_failed(fw, LOG_LEVEL_MEDIUM,
> 				"FADTPM1CNTSizeMismatch",
> 				"32 and 64 bit versions of FADT pm1_cnt size do not match (0x%x vs 0x%x).",
> 				width, fadt->x_pm1a_cnt_blk.register_bit_width);
> -			fwts_tag_failed(fw, FWTS_TAG_ACPI_BAD_ADDRESS);
> -		}
> 
> 		port = fadt->x_pm1a_cnt_blk.address;
> 		width = fadt->x_pm1a_cnt_blk.register_bit_width;
> @@ -129,7 +125,6 @@ static int fadt_test1(fwts_framework *fw)
> 		fwts_failed(fw, LOG_LEVEL_HIGH, "FADTPM1AInvalidWidth",
> 			"FADT pm1a register has invalid bit width of %d.",
> 			width);
> -		fwts_tag_failed(fw, FWTS_TAG_ACPI_BAD_LENGTH);
> 		return FWTS_OK;
> 	}
> 
> @@ -140,11 +135,9 @@ static int fadt_test1(fwts_framework *fw)
> 
> 	if (val32 & 0x01)
> 		fwts_passed(fw, "SCI_EN bit in PM1a Control Register Block is enabled.");
> -	else {
> +	else
> 		fwts_failed(fw, LOG_LEVEL_HIGH, "SCI_ENNotEnabled",
> 			"SCI_EN bit in PM1a Control Register Block is not enabled.");
> -		fwts_tag_failed(fw, FWTS_TAG_POWER_MANAGEMENT);
> -	}
> 
> 	return FWTS_OK;
> }
> diff --git a/src/acpi/lid/lid.c b/src/acpi/lid/lid.c
> index 65fdc8a..6948f41 100644
> --- a/src/acpi/lid/lid.c
> +++ b/src/acpi/lid/lid.c
> @@ -70,11 +70,10 @@ static int lid_test1(fwts_framework *fw)
> 
> 	lid_check_field_poll(fw, FWTS_BUTTON_LID_OPENED, &matching, &not_matching);
> 
> -	if ((matching == 0) || (not_matching > 0)) {
> +	if ((matching == 0) || (not_matching > 0))
> 		fwts_failed(fw, LOG_LEVEL_HIGH, "LidNotOpen",
> 			"Detected a closed LID state.");
> -		fwts_tag_failed(fw, FWTS_TAG_ACPI_LID);
> -	} else
> +	else
> 		fwts_passed(fw, "Detected open LID state.");
> 
> 	return FWTS_OK;
> @@ -141,18 +140,15 @@ static int lid_test_state(fwts_framework *fw, int button)
> 	fwts_gpe_free(gpes_start, gpe_count);
> 	fwts_gpe_free(gpes_end, gpe_count);
> 
> -	if (events == 0) {
> +	if (events == 0)
> 		fwts_failed(fw, LOG_LEVEL_HIGH, "NoLidEvents",
> 			"Did not detect any ACPI LID events while waiting for to LID %s.", state);
> -		fwts_tag_failed(fw, FWTS_TAG_ACPI_LID);
> -		fwts_tag_failed(fw, FWTS_TAG_ACPI_EVENT);
> -	} else {
> +	else {
> 		fwts_passed(fw, "Detected ACPI LID events while waiting for LID to %s.", state);
> -		if ((matching == 0) || (not_matching > 0)) {
> +		if ((matching == 0) || (not_matching > 0))
> 			fwts_failed(fw, LOG_LEVEL_HIGH, "NoLidState",
> 				"Could not detect lid %s state.", state);
> -			fwts_tag_failed(fw, FWTS_TAG_ACPI_LID);
> -		} else
> +		else
> 			fwts_passed(fw, "Detected lid %s state.", state);
> 	}
> 
> diff --git a/src/acpi/mcfg/mcfg.c b/src/acpi/mcfg/mcfg.c
> index a4d22a6..85d0bb8 100644
> --- a/src/acpi/mcfg/mcfg.c
> +++ b/src/acpi/mcfg/mcfg.c
> @@ -151,7 +151,6 @@ static int mcfg_test1(fwts_framework *fw)
> 		fwts_failed(fw, LOG_LEVEL_HIGH, "MCFGInvalidSize",
> 			"Invalid MCFG ACPI table size: got %zd bytes expecting more",
> 			mcfg_size + sizeof(fwts_acpi_table_mcfg));
> -		fwts_tag_failed(fw, FWTS_TAG_ACPI_INVALID_TABLE);
> 		fwts_advice(fw,
> 			"MCFG table must be least %zd bytes (header size) with "
> 			"multiples of %zd bytes for each MCFG entry.",
> @@ -170,7 +169,6 @@ static int mcfg_test1(fwts_framework *fw)
> 	if (mcfg_size != (ssize_t)(nr * sizeof(fwts_acpi_mcfg_configuration))) {
> 		fwts_failed(fw, LOG_LEVEL_HIGH, "MCFGInvalidSize2",
> 			"MCFG table is not a multiple of record size");
> -		fwts_tag_failed(fw, FWTS_TAG_ACPI_INVALID_TABLE);
> 		return FWTS_ERROR;
> 	}
> 
> @@ -181,7 +179,6 @@ static int mcfg_test1(fwts_framework *fw)
> 	if (mcfg == NULL) {
> 		fwts_failed(fw, LOG_LEVEL_HIGH, "MCFGInvalidTable",
> 			"Invalid MCFG ACPI table");
> -		fwts_tag_failed(fw, FWTS_TAG_ACPI_INVALID_TABLE);
> 		return FWTS_ERROR;
> 	}
> 
> @@ -204,8 +201,6 @@ static int mcfg_test1(fwts_framework *fw)
> 				"MCFG MMIO config space at 0x%" PRIx64
> 				" is not reserved in the memory map table",
> 				config->base_address);
> -			fwts_tag_failed(fw, FWTS_TAG_BIOS);
> -
> 			fwts_advice(fw,
> 				"The PCI Express specification states that the "
> 				"PCI Express configuration space should "
> @@ -238,7 +233,6 @@ static int mcfg_test2(fwts_framework *fw)
> 	if (mcfg == NULL) {
> 		fwts_failed(fw, LOG_LEVEL_HIGH, "MCFGInvalidTable",
> 			"Invalid MCFG ACPI table");
> -		fwts_tag_failed(fw, FWTS_TAG_ACPI_INVALID_TABLE);
> 		return FWTS_ERROR;
> 	}
> 
> diff --git a/src/acpi/method/method.c b/src/acpi/method/method.c
> index e6d925d..a7e81ef 100644
> --- a/src/acpi/method/method.c
> +++ b/src/acpi/method/method.c
> @@ -333,7 +333,6 @@ static int method_package_count_min(
> 			" element%s, got %" PRIu32 " element%s instead.",
> 			name, min, min == 1 ? "" : "s",
> 			obj->Package.Count, obj->Package.Count == 1 ? "" : "s");
> -		fwts_tag_failed(fw, FWTS_TAG_ACPI_METHOD_RETURN);
> 		return FWTS_ERROR;
> 	}
> 	return FWTS_OK;
> @@ -359,7 +358,6 @@ static int method_package_count_equal(
> 			" element%s, got %" PRIu32 " element%s instead.",
> 			name, count, count == 1 ? "" : "s",
> 			obj->Package.Count, obj->Package.Count == 1 ? "" : "s");
> -		fwts_tag_failed(fw, FWTS_TAG_ACPI_METHOD_RETURN);
> 		return FWTS_ERROR;
> 	}
> 	return FWTS_OK;
> @@ -448,7 +446,6 @@ static void method_evaluate_found_method(
> 		fwts_failed(fw, LOG_LEVEL_MEDIUM, "AMLLocksAcquired",
> 			"%s left %d locks in an acquired state.",
> 			name, sem_acquired - sem_released);
> -		fwts_tag_failed(fw, FWTS_TAG_ACPI_MUTEX);
> 		fwts_advice(fw,
> 			"Locks left in an acquired state generally indicates "
> 			"that the AML code is not releasing a lock. This can "
> @@ -559,7 +556,6 @@ static int method_name_check(fwts_framework *fw)
> 						"be corrected.",
> 						fwts_list_data(char *, item),
> 						*ptr);
> -					fwts_tag_failed(fw, FWTS_TAG_ACPI_METHOD);
> 					failed = true;
> 					break;
> 				}
> @@ -685,7 +681,6 @@ static void method_test_NULL_return(
> 
> 	if (buf && buf->Length && buf->Pointer) {
> 		fwts_failed(fw, LOG_LEVEL_MEDIUM, "MethodShouldReturnNothing", "%s returned \
>                 values, but was expected to return nothing.", name);
> -		fwts_tag_failed(fw, FWTS_TAG_ACPI_METHOD_RETURN);
> 		fwts_log_info(fw, "Object returned:");
> 		fwts_acpi_object_dump(fw, obj);
> 		fwts_advice(fw,
> @@ -718,7 +713,6 @@ static void method_test_passed_failed_return(
> 				"MethodReturnZeroOrOne",
> 				"%s returned 0x%8.8" PRIx32 ", should return 1 "
> 				"(success) or 0 (failed).", method, val);
> -			fwts_tag_failed(fw, FWTS_TAG_ACPI_METHOD_RETURN);
> 			fwts_advice(fw,
> 				"Method %s should be returning the correct "
> 				"1/0 success/failed return values. "
> @@ -754,7 +748,6 @@ static void method_test_polling_return(
> 				"%s returned a value %f seconds > (1 hour) "
> 				"which is probably incorrect.",
> 				method, (float)obj->Integer.Value / 10.0);
> -			fwts_tag_failed(fw, FWTS_TAG_ACPI_METHOD_RETURN);
> 			fwts_advice(fw,
> 				"The method is returning a polling interval "
> 				"which is very long and hence most probably "
> @@ -817,7 +810,6 @@ static int method_package_elements_all_type(
> 				name, i,
> 				method_type_name(type),
> 				method_type_name(obj->Package.Elements[i].Type));
> -			fwts_tag_failed(fw, FWTS_TAG_ACPI_METHOD_RETURN);
> 			failed = true;
> 		}
> 	}
> @@ -859,7 +851,6 @@ static int method_package_elements_type(
> 				name, i, info[i].name,
> 				method_type_name(info[i].type),
> 				method_type_name(obj->Package.Elements[i].Type));
> -			fwts_tag_failed(fw, FWTS_TAG_ACPI_METHOD_RETURN);
> 			failed = true;
> 		}
> 	}
> @@ -991,7 +982,6 @@ static void method_test_HID_return(
> 			fwts_failed(fw, LOG_LEVEL_MEDIUM,
> 				"Method_HIDNullString",
> 				"%s returned a NULL string.", name);
> -			fwts_tag_failed(fw, FWTS_TAG_ACPI_METHOD_RETURN);
> 		}
> 		break;
> 	case ACPI_TYPE_INTEGER:
> @@ -1011,7 +1001,6 @@ static void method_test_HID_return(
> 	default:
> 		fwts_failed(fw, LOG_LEVEL_MEDIUM, "Method_HIDBadReturnType",
> 			"%s did not return a string or an integer.", name);
> -		fwts_tag_failed(fw, FWTS_TAG_ACPI_METHOD_RETURN);
> 		break;
> 	}
> }
> @@ -1098,12 +1087,10 @@ static void method_test_SUB_return(
> 			fwts_failed(fw, LOG_LEVEL_MEDIUM,
> 				"Method_SUBNullString",
> 				"%s returned a NULL string.", name);
> -			fwts_tag_failed(fw, FWTS_TAG_ACPI_METHOD_RETURN);
> 		}
> 	else {
> 		fwts_failed(fw, LOG_LEVEL_MEDIUM, "Method_UIDBadReturnType",
> 			"Method _SUB did not return a string or an integer.");
> -		fwts_tag_failed(fw, FWTS_TAG_ACPI_METHOD_RETURN);
> 	}
> }
> 
> @@ -1141,12 +1128,10 @@ static void method_test_UID_return(
> 			fwts_passed(fw,
> 				"%s returned a string '%s' as expected.",
> 				name, obj->String.Pointer);
> -		else {
> +		else
> 			fwts_failed(fw, LOG_LEVEL_MEDIUM,
> 				"Method_UIDNullString",
> 				"%s returned a NULL string.", name);
> -			fwts_tag_failed(fw, FWTS_TAG_ACPI_METHOD_RETURN);
> -		}
> 		break;
> 	case ACPI_TYPE_INTEGER:
> 		method_passed_sane_uint64(fw, name, obj->Integer.Value);
> @@ -1154,7 +1139,6 @@ static void method_test_UID_return(
> 	default:
> 		fwts_failed(fw, LOG_LEVEL_MEDIUM, "Method_UIDBadReturnType",
> 			"Method %s did not return a string or an integer.", name);
> -		fwts_tag_failed(fw, FWTS_TAG_ACPI_METHOD_RETURN);
> 		break;
> 	}
> }
> @@ -1841,8 +1825,6 @@ static void method_test_CRS_return(
> 
> 	if (passed)
> 		fwts_passed(fw, "%s (%s) looks sane.", name, tag);
> -	else
> -		fwts_tag_failed(fw, FWTS_TAG_ACPI_METHOD_RETURN);
> }
> 
> static int method_test_CRS(fwts_framework *fw)
> @@ -2122,7 +2104,6 @@ static void method_test_SEG_return(
> 			"upper 16 reserved bits are set when they "
> 			"should in fact be zero.",
> 			name, obj->Integer.Value);
> -		fwts_tag_failed(fw, FWTS_TAG_ACPI_METHOD_RETURN);
> 	} else
> 		method_passed_sane_uint64(fw, name, obj->Integer.Value);
> }
> @@ -2308,7 +2289,6 @@ static void method_test_Sx__return(
> 			"integers, and %s only returned %" PRIu32
> 			" elements in the package.",
> 			name, obj->Package.Count);
> -		fwts_tag_failed(fw, FWTS_TAG_ACPI_METHOD_RETURN);
> 		return;
> 	}
> 
> @@ -2328,7 +2308,6 @@ static void method_test_Sx__return(
> 			"expect. So, while this is conforming to the ACPI "
> 			"specification it will in fact not work in the "
> 			"Linux kernel.", name);
> -		fwts_tag_failed(fw, FWTS_TAG_ACPI_METHOD_RETURN);
> 		return;
> 	}
> 
> @@ -2339,7 +2318,6 @@ static void method_test_Sx__return(
> 			"Method_SxElementType",
> 			"%s returned a package that did not contain "
> 			"an integer.", name);
> -		fwts_tag_failed(fw, FWTS_TAG_ACPI_METHOD_RETURN);
> 		return;
> 	}
> 
> @@ -2348,7 +2326,6 @@ static void method_test_Sx__return(
> 			"Method_SxElementValue",
> 			"%s package element 0 had upper 24 bits "
> 			"of bits that were non-zero.", name);
> -		fwts_tag_failed(fw, FWTS_TAG_ACPI_METHOD_RETURN);
> 		failed = true;
> 	}
> 
> @@ -2357,7 +2334,6 @@ static void method_test_Sx__return(
> 			"Method_SxElementValue",
> 			"%s package element 1 had upper 24 bits "
> 			"of bits that were non-zero.", name);
> -		fwts_tag_failed(fw, FWTS_TAG_ACPI_METHOD_RETURN);
> 		failed = true;
> 	}
> 
> @@ -2483,7 +2459,6 @@ static void method_test_CSD_return(
> 				"%s sub-package %" PRIu32 " was expected to "
> 				"have 5 elements, got %" PRIu32 " elements instead.",
> 				name, i, pkg->Package.Count);
> -			fwts_tag_failed(fw, FWTS_TAG_ACPI_METHOD_RETURN);
> 			failed = true;
> 			continue;
> 		}
> @@ -2496,7 +2471,6 @@ static void method_test_CSD_return(
> 					" element %" PRIu32 " is not "
> 					"an integer.",
> 					name, i, j);
> -				fwts_tag_failed(fw, FWTS_TAG_ACPI_METHOD_RETURN);
> 				elements_ok = false;
> 			}
> 		}
> @@ -2514,7 +2488,6 @@ static void method_test_CSD_return(
> 				"was expected to have value 0x%" PRIx64 ".",
> 				name, i,
> 				pkg->Package.Elements[0].Integer.Value);
> -			fwts_tag_failed(fw, FWTS_TAG_ACPI_METHOD_RETURN);
> 			failed = true;
> 		}
> 		/* Element 1 should contain zero */
> @@ -2526,7 +2499,6 @@ static void method_test_CSD_return(
> 				"was 0x%" PRIx64 ".",
> 				name, i,
> 				pkg->Package.Elements[1].Integer.Value);
> -			fwts_tag_failed(fw, FWTS_TAG_ACPI_METHOD_RETURN);
> 			failed = true;
> 		}
> 		/* Element 3 should contain 0xfc..0xfe */
> @@ -2541,7 +2513,6 @@ static void method_test_CSD_return(
> 				"was 0x%" PRIx64 ".",
> 				name, i,
> 				pkg->Package.Elements[3].Integer.Value);
> -			fwts_tag_failed(fw, FWTS_TAG_ACPI_METHOD_RETURN);
> 			failed = true;
> 		}
> 		/* Element 4 number of processors, skip check */
> @@ -2599,7 +2570,6 @@ static void method_test_CST_return(
> 		fwts_failed(fw, LOG_LEVEL_MEDIUM, "Method_CSTElement0NotInteger",
> 			"%s should return package with element zero being an integer "
> 			"count of the number of C state sub-packages.", name);
> -		fwts_tag_failed(fw, FWTS_TAG_ACPI_METHOD_RETURN);
> 		return;
> 	}
> 
> @@ -2611,7 +2581,6 @@ static void method_test_CST_return(
> 			"reports it has %" PRIu64 " C states.",
> 			name, obj->Package.Count - 1,
> 			obj->Package.Elements[0].Integer.Value);
> -		fwts_tag_failed(fw, FWTS_TAG_ACPI_METHOD_RETURN);
> 		return;
> 	}
> 
> @@ -2631,7 +2600,6 @@ static void method_test_CST_return(
> 				"Method_CSTElementType",
> 				"%s package element %" PRIu32 " was not a package.",
> 				name, i);
> -			fwts_tag_failed(fw, FWTS_TAG_ACPI_METHOD_RETURN);
> 			cst_elements_ok[i] = false;
> 			failed = true;
> 			continue;	/* Skip processing sub-package */
> @@ -2795,7 +2763,6 @@ static void method_test_PSS_return(
> 				"Method_PSSElementType",
> 				"%s package element %" PRIu32
> 				" was not a package.", name, i);
> -			fwts_tag_failed(fw, FWTS_TAG_ACPI_METHOD_RETURN);
> 			failed = true;
> 			continue;	/* Skip processing sub-package */
> 		}
> @@ -2808,7 +2775,6 @@ static void method_test_PSS_return(
> 				" was expected to "
> 				"have 6 elements, got %" PRIu32 " elements instead.",
> 				name, i, obj->Package.Count);
> -			fwts_tag_failed(fw, FWTS_TAG_ACPI_METHOD_RETURN);
> 			failed = true;
> 			continue;	/* Skip processing sub-package */
> 		}
> @@ -2988,7 +2954,6 @@ static void method_test_TSD_return(
> 				"Method_TSDElementType",
> 				"%s package element %" PRIu32
> 				" was not a package.", name, i);
> -			fwts_tag_failed(fw, FWTS_TAG_ACPI_METHOD_RETURN);
> 			failed = true;
> 			continue;	/* Skip processing sub-package */
> 		}
> @@ -3003,7 +2968,6 @@ static void method_test_TSD_return(
> 				"%s sub-package %" PRIu32 " was expected to "
> 				"have 5 elements, got %" PRIu32 " elements instead.",
> 				name, i, pkg->Package.Count);
> -			fwts_tag_failed(fw, FWTS_TAG_ACPI_METHOD_RETURN);
> 			failed = true;
> 			continue;
> 		}
> @@ -3015,7 +2979,6 @@ static void method_test_TSD_return(
> 					"%s sub-package %" PRIu32
> 					" element %" PRIu32 " is not "
> 					"an integer.", name, i, j);
> -				fwts_tag_failed(fw, FWTS_TAG_ACPI_METHOD_RETURN);
> 				elements_ok = false;
> 			}
> 		}
> @@ -3034,7 +2997,6 @@ static void method_test_TSD_return(
> 				"was expected to have value 0x%" PRIx64 ".",
> 				name, i,
> 				pkg->Package.Elements[0].Integer.Value);
> -			fwts_tag_failed(fw, FWTS_TAG_ACPI_METHOD_RETURN);
> 			failed = true;
> 		}
> 		/* Element 1 should contain zero */
> @@ -3047,7 +3009,6 @@ static void method_test_TSD_return(
> 				"was 0x%" PRIx64 ".",
> 				name, i,
> 				pkg->Package.Elements[1].Integer.Value);
> -			fwts_tag_failed(fw, FWTS_TAG_ACPI_METHOD_RETURN);
> 			failed = true;
> 		}
> 		/* Element 3 should contain 0xfc..0xfe */
> @@ -3063,7 +3024,6 @@ static void method_test_TSD_return(
> 				"was 0x%" PRIx64 ".",
> 				name, i,
> 				pkg->Package.Elements[3].Integer.Value);
> -			fwts_tag_failed(fw, FWTS_TAG_ACPI_METHOD_RETURN);
> 			failed = true;
> 		}
> 		/* Element 4 number of processors, skip check */
> @@ -3118,7 +3078,6 @@ static void method_test_TSS_return(
> 				"Method_TSSElementType",
> 				"%s package element %" PRIu32
> 				" was not a package.", name, i);
> -			fwts_tag_failed(fw, FWTS_TAG_ACPI_METHOD_RETURN);
> 			tss_elements_ok[i] = false;
> 			failed = true;
> 			continue;	/* Skip processing sub-package */
> @@ -3135,7 +3094,6 @@ static void method_test_TSS_return(
> 				" was expected to have 5 elements, "
> 				"got %" PRIu32" elements instead.",
> 				name, i, pkg->Package.Count);
> -			fwts_tag_failed(fw, FWTS_TAG_ACPI_METHOD_RETURN);
> 			tss_elements_ok[i] = false;
> 			failed = true;
> 			continue;	/* Skip processing sub-package */
> @@ -3148,7 +3106,6 @@ static void method_test_TSS_return(
> 					"%s sub-package %" PRIu32
> 					" element %" PRIu32 " is not "
> 					"an integer.", name, i, j);
> -				fwts_tag_failed(fw, FWTS_TAG_ACPI_METHOD_RETURN);
> 				tss_elements_ok[i] = false;
> 			}
> 		}
> @@ -3170,7 +3127,6 @@ static void method_test_TSS_return(
> 				"was %" PRIu64 ".",
> 				name, i,
> 				pkg->Package.Elements[0].Integer.Value);
> -			fwts_tag_failed(fw, FWTS_TAG_ACPI_METHOD_RETURN);
> 			failed = true;
> 		}
> 		/* Skip checking elements 1..4 */
> @@ -3296,15 +3252,14 @@ static void method_test_GCP_return(
> 	if (method_check_type(fw, name, buf, ACPI_TYPE_INTEGER) != FWTS_OK)
> 		return;
> 
> -	if (obj->Integer.Value & ~0xf) {
> +	if (obj->Integer.Value & ~0xf)
> 		fwts_failed(fw, LOG_LEVEL_MEDIUM,
> 			"Method_GCPReturn",
> 			"%s returned %" PRId64 ", should be between 0 and 15, "
> 			"one or more of the reserved bits 4..31 seem "
> 			"to be set.",
> 			name, obj->Integer.Value);
> -		fwts_tag_failed(fw, FWTS_TAG_ACPI_METHOD_RETURN);
> -	} else
> +	else
> 		method_passed_sane_uint64(fw, name, obj->Integer.Value);
> }
> 
> @@ -3332,7 +3287,6 @@ static void method_test_GRT_return(
> 			"%s should return a buffer of 16 bytes, but "
> 			"instead just returned %" PRIu32,
> 			name, obj->Buffer.Length);
> -		fwts_tag_failed(fw, FWTS_TAG_ACPI_METHOD_RETURN);
> 		return;
> 	}
> 
> @@ -3361,15 +3315,14 @@ static void method_test_GWS_return(
> 	if (method_check_type(fw, name, buf, ACPI_TYPE_INTEGER) != FWTS_OK)
> 		return;
> 
> -	if (obj->Integer.Value & ~0x3) {
> +	if (obj->Integer.Value & ~0x3)
> 		fwts_failed(fw, LOG_LEVEL_MEDIUM,
> 			"Method_GWSReturn",
> 			"%s returned %" PRIu64 ", should be between 0 and 3, "
> 			"one or more of the reserved bits 2..31 seem "
> 			"to be set.",
> 			name, obj->Integer.Value);
> -		fwts_tag_failed(fw, FWTS_TAG_ACPI_METHOD_RETURN);
> -	} else
> +	else
> 		method_passed_sane_uint64(fw, name, obj->Integer.Value);
> }
> 
> @@ -3466,7 +3419,6 @@ static void method_test_SBS_return(
> 		fwts_failed(fw, LOG_LEVEL_MEDIUM, "Method_SBSReturn",
> 			"%s returned %" PRIu64 ", should be between 0 and 4.",
> 			name, obj->Integer.Value);
> -		fwts_tag_failed(fw, FWTS_TAG_ACPI_METHOD_RETURN);
> 		fwts_advice(fw,
> 			"Smart Battery %s is incorrectly informing "
> 			"the OS about the smart battery "
> @@ -3545,7 +3497,6 @@ static void method_test_BIF_return(
> 			"%s: Expected Power Unit (Element 0) to be "
> 			"0 (mWh) or 1 (mAh), got 0x%8.8" PRIx64 ".",
> 			name, obj->Package.Elements[0].Integer.Value);
> -		fwts_tag_failed(fw, FWTS_TAG_ACPI_METHOD_RETURN);
> 		failed = true;
> 	}
> #ifdef FWTS_METHOD_PEDANDTIC
> @@ -3560,7 +3511,6 @@ static void method_test_BIF_return(
> 			"%s: Design Capacity (Element 1) is "
> 			"unknown: 0x%8.8" PRIx64 ".",
> 			name, obj->Package.Elements[1].Integer.Value);
> -		fwts_tag_failed(fw, FWTS_TAG_ACPI_METHOD_RETURN);
> 		failed = true;
> 	}
> 	/* Last Full Charge Capacity */
> @@ -3570,7 +3520,6 @@ static void method_test_BIF_return(
> 			"%s: Last Full Charge Capacity (Element 2) "
> 			"is unknown: 0x%8.8" PRIx64 ".",
> 			name, obj->Package.Elements[2].Integer.Value);
> -		fwts_tag_failed(fw, FWTS_TAG_ACPI_METHOD_RETURN);
> 		failed = true;
> 	}
> #endif
> @@ -3582,7 +3531,6 @@ static void method_test_BIF_return(
> 			"(Element 3) to be 0 (Primary) or 1 "
> 			"(Secondary), got 0x%8.8" PRIx64 ".",
> 			name, obj->Package.Elements[3].Integer.Value);
> -		fwts_tag_failed(fw, FWTS_TAG_ACPI_METHOD_RETURN);
> 		failed = true;
> 	}
> #ifdef FWTS_METHOD_PEDANDTIC
> @@ -3597,7 +3545,6 @@ static void method_test_BIF_return(
> 			"%s: Design Voltage (Element 4) is "
> 			"unknown: 0x%8.8" PRIx64 ".",
> 			name, obj->Package.Elements[4].Integer.Value);
> -		fwts_tag_failed(fw, FWTS_TAG_ACPI_METHOD_RETURN);
> 		failed = true;
> 	}
> 	/* Design capacity warning */
> @@ -3607,7 +3554,6 @@ static void method_test_BIF_return(
> 			"%s: Design Capacity Warning (Element 5) "
> 			"is unknown: 0x%8.8" PRIx64 ".",
> 			name, obj->Package.Elements[5].Integer.Value);
> -		fwts_tag_failed(fw, FWTS_TAG_ACPI_METHOD_RETURN);
> 		failed = true;
> 	}
> 	/* Design capacity low */
> @@ -3617,7 +3563,6 @@ static void method_test_BIF_return(
> 			"%s: Design Capacity Warning (Element 6) "
> 			"is unknown: 0x%8.8" PRIx64 ".",
> 			name, obj->Package.Elements[6].Integer.Value);
> -		fwts_tag_failed(fw, FWTS_TAG_ACPI_METHOD_RETURN);
> 		failed = true;
> 	}
> #endif
> @@ -3690,7 +3635,6 @@ static void method_test_BIX_return(
> 			"0 (mWh) or 1 (mAh), got 0x%8.8" PRIx64 ".",
> 			name, elements[1].name,
> 			obj->Package.Elements[1].Integer.Value);
> -		fwts_tag_failed(fw, FWTS_TAG_ACPI_METHOD_RETURN);
> 		failed = true;
> 	}
> #ifdef FWTS_METHOD_PEDANDTIC
> @@ -3706,7 +3650,6 @@ static void method_test_BIX_return(
> 			"unknown: 0x%8.8" PRIx64 ".",
> 			name, elements[2].name,
> 			obj->Package.Elements[2].Integer.Value);
> -		fwts_tag_failed(fw, FWTS_TAG_ACPI_METHOD_RETURN);
> 		failed = true;
> 	}
> 	/* Last Full Charge Capacity */
> @@ -3717,7 +3660,6 @@ static void method_test_BIX_return(
> 			"is unknown: 0x%8.8" PRIx64 ".",
> 			name, elements[3].name,
> 			obj->Package.Elements[3].Integer.Value);
> -		fwts_tag_failed(fw, FWTS_TAG_ACPI_METHOD_RETURN);
> 		failed = true;
> 	}
> #endif
> @@ -3730,7 +3672,6 @@ static void method_test_BIX_return(
> 			"(Secondary), got 0x%8.8" PRIx64 ".",
> 			name, elements[4].name,
> 			obj->Package.Elements[4].Integer.Value);
> -		fwts_tag_failed(fw, FWTS_TAG_ACPI_METHOD_RETURN);
> 		failed = true;
> 	}
> #ifdef FWTS_METHOD_PEDANDTIC
> @@ -3746,7 +3687,6 @@ static void method_test_BIX_return(
> 			"0x%8.8" PRIx64 ".",
> 			name, elements[5].name,
> 			obj->Package.Elements[5].Integer.Value);
> -		fwts_tag_failed(fw, FWTS_TAG_ACPI_METHOD_RETURN);
> 		failed = true;
> 	}
> 	/* Design capacity warning */
> @@ -3757,7 +3697,6 @@ static void method_test_BIX_return(
> 			"is unknown: 0x%8.8" PRIx64 ".",
> 			name, elements[6].name,
> 			obj->Package.Elements[6].Integer.Value);
> -		fwts_tag_failed(fw, FWTS_TAG_ACPI_METHOD_RETURN);
> 		failed = true;
> 	}
> 	/* Design capacity low */
> @@ -3768,7 +3707,6 @@ static void method_test_BIX_return(
> 			"is unknown: 0x%8.8" PRIx64 ".",
> 			name, elements[7].name,
> 			obj->Package.Elements[7].Integer.Value);
> -		fwts_tag_failed(fw, FWTS_TAG_ACPI_METHOD_RETURN);
> 		failed = true;
> 	}
> 	/* Cycle Count */
> @@ -3777,7 +3715,6 @@ static void method_test_BIX_return(
> 			"%s: %s (Element 8) is unknown: "
> 			"0x%8.8" PRIx64 ".", Elements[8].name,
> 			name, obj->Package.Elements[8].Integer.Value);
> -		fwts_tag_failed(fw, FWTS_TAG_ACPI_METHOD_RETURN);
> 		failed = true;
> 	}
> #endif
> @@ -3846,7 +3783,6 @@ static void method_test_BST_return(
> 			"%s: Expected Battery State (Element 0) to "
> 			"be 0..7, got 0x%8.8" PRIx64 ".",
> 			name, obj->Package.Elements[0].Integer.Value);
> -		fwts_tag_failed(fw, FWTS_TAG_ACPI_METHOD_RETURN);
> 		failed = true;
> 	}
> 	/* Ensure bits 0 (discharging) and 1 (charging) are not both set, see 10.2.2.6 */
> @@ -3857,7 +3793,6 @@ static void method_test_BST_return(
> 			"indicating both charging and discharginng "
> 			"which is not allowed. Got value 0x%8.8" PRIx64 ".",
> 			name, obj->Package.Elements[0].Integer.Value);
> -		fwts_tag_failed(fw, FWTS_TAG_ACPI_METHOD_RETURN);
> 		failed = true;
> 	}
> 	/* Battery Present Rate - cannot check, pulled from EC */
> @@ -4003,7 +3938,6 @@ static void method_test_PSR_return(
> 			"%s returned 0x%8.8" PRIx64 ", expected 0 "
> 			"(offline) or 1 (online)",
> 			name, obj->Integer.Value);
> -		fwts_tag_failed(fw, FWTS_TAG_ACPI_METHOD_RETURN);
> 	} else
> 		method_passed_sane_uint64(fw, name, obj->Integer.Value);
> }
> @@ -4202,7 +4136,6 @@ static void method_test_THERM_return(
> 				method,
> 				obj->Integer.Value,
> 				(float)((uint64_t)obj->Integer.Value) / 10.0);
> -			fwts_tag_failed(fw, FWTS_TAG_ACPI_METHOD_RETURN);
> 			fwts_advice(fw,
> 				"The value returned was probably a "
> 				"hard-coded thermal value which is "
> @@ -4562,13 +4495,12 @@ static void method_test_DOD_return(
> 		}
> 	}
> 
> -	if (failed) {
> +	if (failed)
> 		fwts_failed(fw, LOG_LEVEL_MEDIUM,
> 			"Method_DODNoPackage",
> 			"Method _DOD did not return a package of "
> 			"%" PRIu32 " integers.", obj->Package.Count);
> -		fwts_tag_failed(fw, FWTS_TAG_ACPI_METHOD_RETURN);
> -	} else
> +	else
> 		method_passed_sane(fw, name, "package");
> }
> 
> @@ -4672,7 +4604,6 @@ static void method_test_BCL_return(
> 			"battery power (%" PRIu64 ").",
> 			obj->Package.Elements[0].Integer.Value,
> 			obj->Package.Elements[1].Integer.Value);
> -		fwts_tag_failed(fw, FWTS_TAG_ACPI_METHOD_RETURN);
> 		failed = true;
> 	}
> 
> @@ -4698,7 +4629,6 @@ static void method_test_BCL_return(
> 			"level are not in ascending "
> 			"order which should be fixed "
> 			"in the firmware.");
> -		fwts_tag_failed(fw, FWTS_TAG_ACPI_METHOD_RETURN);
> 		failed = true;
> 	}
> 
> @@ -4781,14 +4711,13 @@ static void method_test_DDC_return(
> 
> 	switch (obj->Type) {
> 	case ACPI_TYPE_BUFFER:
> -		if (requested != obj->Buffer.Length) {
> +		if (requested != obj->Buffer.Length)
> 			fwts_failed(fw, LOG_LEVEL_MEDIUM,
> 				"Method_DDCElementCount",
> 				"%s returned a buffer of %" PRIu32 " items, "
> 				"expected %" PRIu32 ".",
> 				name, obj->Buffer.Length, requested);
> -			fwts_tag_failed(fw, FWTS_TAG_ACPI_METHOD_RETURN);
> -		} else
> +		else
> 			fwts_passed(fw,
> 				"Method %s returned a buffer of %d items "
> 				"as expected.",
> @@ -4804,7 +4733,6 @@ static void method_test_DDC_return(
> 	default:
> 		fwts_failed(fw, LOG_LEVEL_MEDIUM, "Method_DDCBadReturnType",
> 			"%s did not return a buffer or an integer.", name);
> -		fwts_tag_failed(fw, FWTS_TAG_ACPI_METHOD_RETURN);
> 		break;
> 	}
> }
> diff --git a/src/acpi/powerbutton/powerbutton.c \
> b/src/acpi/powerbutton/powerbutton.c index 7820f65..5a12614 100644
> --- a/src/acpi/powerbutton/powerbutton.c
> +++ b/src/acpi/powerbutton/powerbutton.c
> @@ -56,11 +56,10 @@ static int power_button_test1(fwts_framework *fw)
> 		}
> 		fwts_printf(fw, "Waiting %2.2d/20\r", 20-i);
> 	}
> -	if (matching == 0) {
> +	if (matching == 0)
> 		fwts_failed(fw, LOG_LEVEL_HIGH, "NoPowerButtonEvents",
> 			"Did not detect any ACPI power buttons events while waiting for power button to \
>                 be pressed.");
> -		fwts_tag_failed(fw, FWTS_TAG_ACPI_EVENT);
> -	} else  {
> +	else  {
> 		char button[4096];
> 		memset(button, 0, sizeof(button));
> 		sscanf(buffer, "%*s %s", button);
> diff --git a/src/acpi/s3/s3.c b/src/acpi/s3/s3.c
> index 45f62f7..27a5af0 100644
> --- a/src/acpi/s3/s3.c
> +++ b/src/acpi/s3/s3.c
> @@ -147,7 +147,6 @@ static int s3_do_suspend_resume(fwts_framework *fw,
> 		(*pm_errors)++;
> 		fwts_failed(fw, LOG_LEVEL_MEDIUM, "ShortSuspend",
> 			"Unexpected: S3 slept for %d seconds, less than the expected %d seconds.", \
>                 duration, delay);
> -		fwts_tag_failed(fw, FWTS_TAG_POWER_MANAGEMENT);
> 	}
> 	fwts_progress_message(fw, percent, "(Checking for errors)");
> 	if (duration > (delay*2)) {
> @@ -174,19 +173,16 @@ static int s3_do_suspend_resume(fwts_framework *fw,
> 		fwts_failed(fw, LOG_LEVEL_HIGH, "PMActionFailedPreS3",
> 			"pm-action failed before trying to put the system "
> 			"in the requested power saving state.");
> -		fwts_tag_failed(fw, FWTS_TAG_POWER_MANAGEMENT);
> 	} else if (status == 128) {
> 		(*pm_errors)++;
> 		fwts_failed(fw, LOG_LEVEL_HIGH, "PMActionPowerStateS3",
> 			"pm-action tried to put the machine in the requested "
> 			"power state but failed.");
> -		fwts_tag_failed(fw, FWTS_TAG_POWER_MANAGEMENT);
> 	} else if (status > 128) {
> 		(*pm_errors)++;
> 		fwts_failed(fw, LOG_LEVEL_HIGH, "PMActionFailedS3",
> 			"pm-action encountered an error and also failed to "
> 			"enter the requested power saving state.");
> -		fwts_tag_failed(fw, FWTS_TAG_POWER_MANAGEMENT);
> 	}
> 
> 	return FWTS_OK;
> diff --git a/src/acpi/s3power/s3power.c b/src/acpi/s3power/s3power.c
> index 6c6213a..75d660d 100644
> --- a/src/acpi/s3power/s3power.c
> +++ b/src/acpi/s3power/s3power.c
> @@ -203,12 +203,10 @@ static int s3power_test(fwts_framework *fw)
> 	duration = (int)(t_end - t_start);
> 	fwts_log_info(fw, "pm-suspend returned %d after %d seconds.", status, duration);
> 
> -	if (duration < s3power_sleep_delay) {
> +	if (duration < s3power_sleep_delay)
> 		fwts_failed(fw, LOG_LEVEL_MEDIUM, "ShortSuspend",
> 			"Unexpected: S3 slept for %d seconds, less than the expected %d seconds.",
> 			duration, s3power_sleep_delay);
> -		fwts_tag_failed(fw, FWTS_TAG_POWER_MANAGEMENT);
> -	}
> 	if (duration > (s3power_sleep_delay*2))
> 		fwts_failed(fw, LOG_LEVEL_HIGH, "LongSuspend",
> 			"Unexpected: S3 much longer than expected (%d seconds).", duration);
> @@ -218,17 +216,14 @@ static int s3power_test(fwts_framework *fw)
> 		fwts_failed(fw, LOG_LEVEL_MEDIUM, "PMActionFailedPreS3",
> 			"pm-action failed before trying to put the system "
> 			"in the requested power saving state.");
> -		fwts_tag_failed(fw, FWTS_TAG_POWER_MANAGEMENT);
> 	} else if (status == 128) {
> 		fwts_failed(fw, LOG_LEVEL_MEDIUM, "PMActionPowerStateS3",
> 			"pm-action tried to put the machine in the requested "
> 			"power state but failed.");
> -		fwts_tag_failed(fw, FWTS_TAG_POWER_MANAGEMENT);
> 	} else if (status > 128) {
> 		fwts_failed(fw, LOG_LEVEL_MEDIUM, "PMActionFailedS3",
> 			"pm-action encountered an error and also failed to "
> 			"enter the requested power saving state.");
> -		fwts_tag_failed(fw, FWTS_TAG_POWER_MANAGEMENT);
> 	}
> 
> 	return FWTS_OK;
> diff --git a/src/acpi/s4/s4.c b/src/acpi/s4/s4.c
> index 9f07bcf..d9ddd6b 100644
> --- a/src/acpi/s4/s4.c
> +++ b/src/acpi/s4/s4.c
> @@ -180,33 +180,28 @@ static int s4_hibernate(fwts_framework *fw,
> 		fwts_failed(fw, LOG_LEVEL_HIGH, "PMActionFailedPreS4",
> 			"pm-action failed before trying to put the system "
> 			"in the requested power saving state.");
> -		fwts_tag_failed(fw, FWTS_TAG_POWER_MANAGEMENT);
> 		(*pm_errors)++;
> 	} else if (status == 128) {
> 		fwts_failed(fw, LOG_LEVEL_HIGH, "PMActionPowerStateS4",
> 			"pm-action tried to put the machine in the requested "
> 			"power state but failed.");
> -		fwts_tag_failed(fw, FWTS_TAG_POWER_MANAGEMENT);
> 		(*pm_errors)++;
> 	} else if (status > 128) {
> 		fwts_failed(fw, LOG_LEVEL_HIGH, "PMActionFailedS4",
> 			"pm-action encountered an error and also failed to "
> 			"enter the requested power saving state.");
> -		fwts_tag_failed(fw, FWTS_TAG_POWER_MANAGEMENT);
> 		(*pm_errors)++;
> 	}
> 
> 	if (fwts_klog_regex_find(fw, klog, "Freezing user space processes.*done") < 1) {
> 		fwts_failed(fw, LOG_LEVEL_HIGH, "UserSpaceTaskFreeze",
> 			"Failed to freeze user space processes.");
> -		fwts_tag_failed(fw, FWTS_TAG_POWER_MANAGEMENT);
> 		(*pm_errors)++;
> 	}
> 
> 	if (fwts_klog_regex_find(fw, klog, "Freezing remaining freezable tasks.*done") < \
> 1) {  fwts_failed(fw, LOG_LEVEL_HIGH, "KernelTaskFreeze",
> 			"Failed to freeze remaining non-user space processes.");
> -		fwts_tag_failed(fw, FWTS_TAG_POWER_MANAGEMENT);
> 		(*pm_errors)++;
> 	}
> 
> @@ -214,14 +209,12 @@ static int s4_hibernate(fwts_framework *fw,
> 	    (fwts_klog_regex_find(fw, klog, "PM: late freeze of devices complete") < 1)) {
> 		fwts_failed(fw, LOG_LEVEL_HIGH, "DeviceFreeze",
> 			"Failed to freeze devices.");
> -		fwts_tag_failed(fw, FWTS_TAG_POWER_MANAGEMENT);
> 		(*pm_errors)++;
> 	}
> 
> 	if (fwts_klog_regex_find(fw, klog, "PM: Allocated.*kbytes") < 1) {
> 		fwts_failed(fw, LOG_LEVEL_HIGH, "HibernateImageAlloc",
> 			"Failed to allocate memory for hibernate image.");
> -		fwts_tag_failed(fw, FWTS_TAG_POWER_MANAGEMENT);
> 		*failed_alloc_image = 1;
> 		(*pm_errors)++;
> 	}
> @@ -229,7 +222,6 @@ static int s4_hibernate(fwts_framework *fw,
> 	if (fwts_klog_regex_find(fw, klog, "PM: Image restored successfully") < 1) {
> 		fwts_failed(fw, LOG_LEVEL_HIGH, "HibernateImageRestore",
> 			"Failed to restore hibernate image.");
> -		fwts_tag_failed(fw, FWTS_TAG_POWER_MANAGEMENT);
> 		(*pm_errors)++;
> 	}
> 
> diff --git a/src/acpi/wakealarm/wakealarm.c b/src/acpi/wakealarm/wakealarm.c
> index dd92861..0243a5e 100644
> --- a/src/acpi/wakealarm/wakealarm.c
> +++ b/src/acpi/wakealarm/wakealarm.c
> @@ -56,7 +56,6 @@ static int wakealarm_test2(fwts_framework *fw)
> 	if (fwts_wakealarm_trigger(fw, 1)) {
> 		fwts_failed(fw, LOG_LEVEL_MEDIUM, "WakeAlarmNotTriggeredTest2",
> 			"RTC wakealarm did not trigger.");
> -		fwts_tag_failed(fw, FWTS_TAG_BIOS);
> 		return FWTS_OK;
> 	}
> 
> @@ -75,7 +74,6 @@ static int wakealarm_test3(fwts_framework *fw)
> 	if (ret < 0) {
> 		fwts_failed(fw, LOG_LEVEL_MEDIUM, "WakeAlarmNotTriggeredTest3",
> 			"Failed to trigger and fire wakealarm.");
> -		fwts_tag_failed(fw, FWTS_TAG_BIOS);
> 		return FWTS_ERROR;	/* Really went wrong */
> 	}
> 	if (ret == 0)
> @@ -83,7 +81,6 @@ static int wakealarm_test3(fwts_framework *fw)
> 	else {
> 		fwts_failed(fw, LOG_LEVEL_MEDIUM, "WakeAlarmNotFiredTest3",
> 			"RTC wakealarm was triggered but did not fire.");
> -		fwts_tag_failed(fw, FWTS_TAG_BIOS);
> 	}
> 
> 	return FWTS_OK;
> @@ -101,14 +98,12 @@ static int wakealarm_test4(fwts_framework *fw)
> 			fwts_failed(fw, LOG_LEVEL_MEDIUM,
> 				"WakeAlarmNotTriggeredTest4",
> 				"Failed to trigger and fire wakealarm.");
> -			fwts_tag_failed(fw, FWTS_TAG_BIOS);
> 			return FWTS_ERROR;	/* Really went wrong */
> 		}
> 		if (ret != 0) {
> 			fwts_failed(fw, LOG_LEVEL_MEDIUM,
> 				"WakeAlarmNotFiredTest4",
> 				"RTC wakealarm was triggered but did not fire.");
> -			fwts_tag_failed(fw, FWTS_TAG_BIOS);
> 			failed++;
> 		}
> 		fwts_progress(fw, 25 * i);
> diff --git a/src/apic/apicedge/apicedge.c b/src/apic/apicedge/apicedge.c
> index c679959..de2ca8b 100644
> --- a/src/apic/apicedge/apicedge.c
> +++ b/src/apic/apicedge/apicedge.c
> @@ -76,26 +76,20 @@ static int apicedge_test1(fwts_framework *fw)
> 			edge = 0;
> 
> 		if (strstr(line,"acpi")) {
> -			if (edge == 1) {
> +			if (edge == 1)
> 				fwts_failed(fw, LOG_LEVEL_MEDIUM,
> 					"ACPIIRQEdgeTrig",
> 					"ACPI Interrupt is incorrectly edge triggered.");
> -				fwts_tag_failed(fw, FWTS_TAG_BIOS_IRQ);
> -			}
> 			continue;
> 		}
> -		if ((irq < 15) && (edge == 0)) {
> +		if ((irq < 15) && (edge == 0))
> 			fwts_failed(fw, LOG_LEVEL_MEDIUM,
> 				"LegacyIRQLevelTrig",
> 				"Legacy interrupt %i is incorrectly level triggered.", irq);
> -			fwts_tag_failed(fw, FWTS_TAG_BIOS_IRQ);
> -		}
> -		if ((irq < 15) && (edge == -1)) {
> +		if ((irq < 15) && (edge == -1))
> 			fwts_failed(fw, LOG_LEVEL_MEDIUM,
> 				"NonLegacyIRQLevelTrig",
> 				"Non-Legacy interrupt %i is incorrectly level triggered.", irq);
> -			fwts_tag_failed(fw, FWTS_TAG_BIOS_IRQ);
> -		}
> 	}
> 	fclose(file);
> 
> diff --git a/src/bios/bios32/bios32.c b/src/bios/bios32/bios32.c
> index aedac87..57d219f 100644
> --- a/src/bios/bios32/bios32.c
> +++ b/src/bios/bios32/bios32.c
> @@ -87,51 +87,47 @@ static int bios32_test1(fwts_framework *fw)
> 				bios32->checksum);
> 			fwts_log_nl(fw);
> 
> -			if (bios32->entry_point >= 0x100000) {
> +			if (bios32->entry_point >= 0x100000)
> 				fwts_failed(fw, LOG_LEVEL_HIGH,
> 					"BIOS32SrvDirEntryPointHighMem",
> 					"Service Directory Entry Point 0x%8.8" PRIx32
> 					" is in high memory and cannot be used "
> 					"by the kernel.",
> 					bios32->entry_point);
> -				fwts_tag_failed(fw, FWTS_TAG_BIOS);
> -			} else
> +			else
> 				fwts_passed(fw, "Service Directory Entry Point "
> 					"0x%8.8x is not in high memory.",
> 					bios32->entry_point);
> 
> -			if (bios32->length != 1) {
> +			if (bios32->length != 1)
> 				fwts_failed(fw, LOG_LEVEL_HIGH,
> 					"BIOS32SrvDirEntryLength",
> 					"Service Directory Length is 0x%8.8" PRIx8
> 					", expected 1 (1 x 16 bytes).",
> 					bios32->length);
> -				fwts_tag_failed(fw, FWTS_TAG_BIOS);
> -			} else
> +			else
> 				fwts_passed(fw,
> 					"Service Directory Length is 1 "
> 					"(1 x 16 bytes) as expected.");
> 
> -			if (bios32->revision_level != 0) {
> +			if (bios32->revision_level != 0)
> 				fwts_failed(fw, LOG_LEVEL_HIGH,
> 					"BIOS32SrvDirRevision",
> 					"Service Directory Revision is 0x%2.2" PRIx8
> 					", only version 0 is supported by the "
> 					"kernel.",
> 					bios32->revision_level);
> -				fwts_tag_failed(fw, FWTS_TAG_BIOS);
> -			} else
> +			else
> 				fwts_passed(fw,
> 					"Service Directory Revision is 0x%2.2" PRIx8
> 					" and is supported by the kernel.",
> 					bios32->revision_level);
> 
> -			if (fwts_checksum(mem + i, 16) != 0) {
> +			if (fwts_checksum(mem + i, 16) != 0)
> 				fwts_failed(fw, LOG_LEVEL_HIGH,
> 					"BIOS32SrvDirCheckSum",
> 					"Service Directory checksum failed.");
> -				fwts_tag_failed(fw, FWTS_TAG_BIOS);
> -			} else
> +			else
> 				fwts_passed(fw,
> 					"Service Directory checksum passed.");
> 			found++;
> @@ -140,13 +136,11 @@ static int bios32_test1(fwts_framework *fw)
> 
> 	if (found == 0)
> 		fwts_log_info(fw, "Could not find BIOS32 Service Directory.");
> -	else if (found > 1) {
> +	else if (found > 1)
> 		fwts_failed(fw, LOG_LEVEL_HIGH,
> 			"BIOS32MultipleSrvDirInstances",
> 			"Found %d instances of BIOS32 Service Directory, "
> 			"there should only be 1.", found);
> -		fwts_tag_failed(fw, FWTS_TAG_BIOS);
> -	}
> 
> (void)fwts_munmap(mem, BIOS32_SD_REGION_SIZE);
> 
> diff --git a/src/bios/ebda_region/ebda_region.c \
> b/src/bios/ebda_region/ebda_region.c index af8a0e6..f82333e 100644
> --- a/src/bios/ebda_region/ebda_region.c
> +++ b/src/bios/ebda_region/ebda_region.c
> @@ -90,13 +90,11 @@ static int ebda_test1(fwts_framework *fw)
> 			memory_map_name,
> 			entry->start_address,
> 			entry->end_address);
> -	} else {
> +	} else
> 		fwts_failed(fw, LOG_LEVEL_MEDIUM,
> 			"EBDAMappedNotReserved",
> 			"EBDA region mapped at 0x%lx but not reserved in the %s table.",
> 			ebda_addr, memory_map_name);
> -		fwts_tag_failed(fw, FWTS_TAG_BIOS);
> -	}
> 		
> 	return FWTS_OK;
> }
> diff --git a/src/bios/mtrr/mtrr.c b/src/bios/mtrr/mtrr.c
> index 4bcdf3a..b604950 100644
> --- a/src/bios/mtrr/mtrr.c
> +++ b/src/bios/mtrr/mtrr.c
> @@ -384,7 +384,6 @@ static int validate_iomem(fwts_framework *fw)
> 				"has incorrect attribute%s.",
> 				start, end,
> 				c2, cache_to_string(type & type_mustnot));
> -			fwts_tag_failed(fw, FWTS_TAG_BIOS);
> 			if (type_must == UNCACHED)
> 				skiperror = true;
> 		}
> @@ -402,7 +401,6 @@ static int validate_iomem(fwts_framework *fw)
> 				start, end,
> 				c2,
> 				cache_to_string( (type & type_must) ^ type_must));
> -			fwts_tag_failed(fw, FWTS_TAG_BIOS);
> 		}
> 
> 	}
> @@ -487,17 +485,14 @@ static int mtrr_test2(fwts_framework *fw)
> 
> 		if (fwts_klog_regex_find(fw, klog, "mtrr: your CPUs had inconsistent fixed MTRR \
> settings") > 0) {  fwts_log_info(fw, "Detected CPUs with inconsistent fixed MTRR \
>                 settings which the kernel fixed.");
> -			fwts_tag_failed(fw, FWTS_TAG_BIOS);
> 			failed = true;
> 		}
> 		if (fwts_klog_regex_find(fw, klog, "mtrr: your CPUs had inconsistent variable \
> MTRR settings") > 0) {  fwts_log_info(fw, "Detected CPUs with inconsistent variable \
>                 MTRR settings which the kernel fixed.");
> -			fwts_tag_failed(fw, FWTS_TAG_BIOS);
> 			failed = true;
> 		}
> 		if (fwts_klog_regex_find(fw, klog, "mtrr: your CPUs had inconsistent \
> MTRRdefType") > 0) {  fwts_log_info(fw, "Detected CPUs with inconsistent variable \
>                 MTRR settings which the kernel fixed.");
> -			fwts_tag_failed(fw, FWTS_TAG_BIOS);
> 			failed = true;
> 		}
> 
> @@ -519,7 +514,7 @@ static int mtrr_test3(fwts_framework *fw)
> {
> 	if (strstr(fwts_cpuinfo->vendor_id, "AMD")) {
> 		if (klog != NULL) {
> -			if (fwts_klog_regex_find(fw, klog, "SYSCFG[MtrrFixDramModEn] not cleared by \
> BIOS, clearing this bit") > 0) { +			if (fwts_klog_regex_find(fw, klog, \
> "SYSCFG[MtrrFixDramModEn] not cleared by BIOS, clearing this bit") > 0)  \
> fwts_failed(fw, LOG_LEVEL_MEDIUM,  "MTRRFixDramModEnBit",
> 					"The BIOS is expected to clear MtrrFixDramModEn bit, see for example "
> @@ -528,11 +523,8 @@ static int mtrr_test3(fwts_framework *fw)
> 					"\"13.2.1.2 SYSCFG Register\": \"The MtrrFixDramModEn bit should be set "
> 					"to 1 during BIOS initialization of the fixed MTRRs, then cleared to "
> 					"0 for operation.\"");
> -				fwts_tag_failed(fw, FWTS_TAG_BIOS);
> -			}
> -			else {
> +			else
> 				fwts_passed(fw, "No MtrrFixDramModEn error detected.");
> -			}
> 		}
> 	} else
> 		fwts_skipped(fw, "CPU is not an AMD, cannot test.");
> diff --git a/src/bios/os2gap/os2gap.c b/src/bios/os2gap/os2gap.c
> index 40773f1..de16bf3 100644
> --- a/src/bios/os2gap/os2gap.c
> +++ b/src/bios/os2gap/os2gap.c
> @@ -57,7 +57,6 @@ static int os2gap_test1(fwts_framework *fw)
> 			OS2_GAP_SIZE / 1024,
> 			(void*)OS2_GAP_ADDRESS,
> 			(void*)(OS2_GAP_ADDRESS + OS2_GAP_SIZE));
> -		fwts_tag_failed(fw, FWTS_TAG_BIOS);
> 		fwts_log_nl(fw);
> 		fwts_memory_map_table_dump(fw, os2gap_memory_map_info);
> 	} else
> diff --git a/src/bios/pciirq/pciirq.c b/src/bios/pciirq/pciirq.c
> index 5df0e37..b00214f 100644
> --- a/src/bios/pciirq/pciirq.c
> +++ b/src/bios/pciirq/pciirq.c
> @@ -230,12 +230,10 @@ static int pciirq_test1(fwts_framework *fw)
> 			"Could not find PCI IRQ Routing Table. Since this table "
> 			"is for legacy BIOS systems which don't have ACPI support "
> 			"this is generally not a problem.");
> -	} else if (found > 1) {
> +	} else if (found > 1)
> 		fwts_failed(fw, LOG_LEVEL_HIGH,
> 			"PCIIRQMultipleTables",
> 			"Found %d instances of PCI Routing Tables, there should only be 1.", found);
> -		fwts_tag_failed(fw, FWTS_TAG_BIOS);
> -	}
> 
> (void)fwts_munmap(mem, PCIIRQ_REGION_SIZE);
> 
> diff --git a/src/bios/pnp/pnp.c b/src/bios/pnp/pnp.c
> index 65a16d1..34a0a34 100644
> --- a/src/bios/pnp/pnp.c
> +++ b/src/bios/pnp/pnp.c
> @@ -167,12 +167,10 @@ static int pnp_test1(fwts_framework *fw)
> 		fwts_log_info(fw,
> 			"Could not find PnP BIOS Support Installation Check structure. "
> 			"This is not necessarily a failure.");
> -	else if (found > 1) {
> +	else if (found > 1)
> 		fwts_failed(fw, LOG_LEVEL_HIGH,
> 			"PNPMultipleTables",
> 			"Found %d instances of PCI Routing Tables, there should only be 1.", found);
> -		fwts_tag_failed(fw, FWTS_TAG_BIOS);
> -	}
> 
> (void)fwts_munmap(mem, PNP_REGION_SIZE);
> 
> diff --git a/src/lib/include/fwts.h b/src/lib/include/fwts.h
> index c29e7f2..d27d2dc 100644
> --- a/src/lib/include/fwts.h
> +++ b/src/lib/include/fwts.h
> @@ -30,7 +30,6 @@
> 
> #include "fwts_version.h"
> #include "fwts_types.h"
> -#include "fwts_tag.h"
> #include "fwts_binpaths.h"
> #include "fwts_framework.h"
> #include "fwts_log.h"
> diff --git a/src/lib/include/fwts_framework.h b/src/lib/include/fwts_framework.h
> index 1e5171c..5278dfb 100644
> --- a/src/lib/include/fwts_framework.h
> +++ b/src/lib/include/fwts_framework.h
> @@ -50,9 +50,7 @@ typedef enum {
> 	FWTS_FLAG_TEST_ACPI			= 0x04000000,
> 	FWTS_FLAG_UTILS				= 0x08000000,
> 	FWTS_FLAG_QUIET				= 0x10000000,
> -	FWTS_FLAG_LP_TAGS			= 0x20000000,
> -	FWTS_FLAG_LP_TAGS_LOG			= 0x40000000,
> -	FWTS_FLAG_SHOW_TESTS_FULL		= 0x80000000,
> +	FWTS_FLAG_SHOW_TESTS_FULL		= 0x20000000,
> } fwts_framework_flags;
> 
> #define FWTS_FLAG_TEST_MASK		\
> @@ -132,9 +130,6 @@ typedef struct {
> 	bool print_summary;			/* Print summary of results at end of test runs */
> 	fwts_log_level failed_level;		/* Bit mask of failed levels in test run */
> 
> -	fwts_list test_taglist;			/* List of tags found when running all minor tests */
> -	fwts_list total_taglist;		/* List of tags found when running all tests */
> -
> 	int firmware_type;			/* Type of firmware */
> 	bool show_progress;			/* Show progress while running current test */
> 
> diff --git a/src/lib/include/fwts_klog.h b/src/lib/include/fwts_klog.h
> index ef23750..fe8f520 100644
> --- a/src/lib/include/fwts_klog.h
> +++ b/src/lib/include/fwts_klog.h
> @@ -40,7 +40,6 @@ typedef enum {
> typedef struct {
> 	fwts_compare_mode compare_mode;
> 	fwts_log_level level;
> -	fwts_tag tag;
> const char *pattern;
> 	const char *advice;
> 	char *label;
> diff --git a/src/lib/include/fwts_log.h b/src/lib/include/fwts_log.h
> index e760efa..b9f378a 100644
> --- a/src/lib/include/fwts_log.h
> +++ b/src/lib/include/fwts_log.h
> @@ -184,9 +184,6 @@ static inline int fwts_log_type_count(fwts_log_type type)
> #define fwts_log_heading(fw, fmt, args...)	\
> 	fwts_log_printf(fw->results, LOG_HEADING, LOG_LEVEL_NONE, "", "", "", fmt, ## \
> args) 
> -#define fwts_log_tag(fw, fmt, args...)	\
> -	fwts_log_printf(fw->results, LOG_TAG | LOG_VERBATUM, LOG_LEVEL_NONE, "", "", "", \
>                 fmt, ## args)
> -
> #define fwts_log_nl(fw) \
> 	fwts_log_printf(fw->results, LOG_NEWLINE, LOG_LEVEL_NONE, "", "", "", "%s", "")
> 
> diff --git a/src/lib/include/fwts_tag.h b/src/lib/include/fwts_tag.h
> deleted file mode 100644
> index b7d00a4..0000000
> --- a/src/lib/include/fwts_tag.h
> +++ /dev/null
> @@ -1,83 +0,0 @@
> -/*
> - * Copyright (C) 2010-2013 Canonical
> - *
> - * This program is free software; you can redistribute it and/or
> - * modify it under the terms of the GNU General Public License
> - * as published by the Free Software Foundation; either version 2
> - * of the License, or (at your option) any later version.
> - *
> - * This program is distributed in the hope that it will be useful,
> - * but WITHOUT ANY WARRANTY; without even the implied warranty of
> - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
> - * GNU General Public License for more details.
> - *
> - * You should have received a copy of the GNU General Public License
> - * along with this program; if not, write to the Free Software
> - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
> - *
> - */
> -
> -#ifndef __FWTS_TAG__
> -#define __FWTS_TAG__
> -
> -#include "fwts_list.h"
> -#include "fwts_framework.h"
> -
> -typedef enum {
> -	FWTS_TAG_NONE = 1,
> -	FWTS_TAG_ERROR_CRITICAL,
> -	FWTS_TAG_ERROR_HIGH,
> -	FWTS_TAG_ERROR_MEDIUM,
> -	FWTS_TAG_ERROR_LOW,
> -	FWTS_TAG_BIOS,
> -	FWTS_TAG_BIOS_THERMAL,
> -	FWTS_TAG_BIOS_IRQ,
> -	FWTS_TAG_BIOS_AMD_POWERNOW,
> -	FWTS_TAG_BIOS_MMCONFIG,
> -	FWTS_TAG_BIOS_DMI,
> -	FWTS_TAG_ACPI,
> -	FWTS_TAG_ACPI_IO_PORT,
> -	FWTS_TAG_ACPI_INVALID_TABLE,
> -	FWTS_TAG_ACPI_BUFFER_OVERFLOW,
> -	FWTS_TAG_ACPI_AML_OPCODE,
> -	FWTS_TAG_ACPI_NAMESPACE_LOOKUP,
> -	FWTS_TAG_ACPI_PCI_EXPRESS,
> -	FWTS_TAG_ACPI_BAD_RESULT,
> -	FWTS_TAG_ACPI_NO_HANDLER,
> -	FWTS_TAG_ACPI_PACKAGE_LIST,
> -	FWTS_TAG_ACPI_PARSE_EXEC_FAIL,
> -	FWTS_TAG_ACPI_EVAL,
> -	FWTS_TAG_ACPI_BAD_LENGTH,
> -	FWTS_TAG_ACPI_BAD_ADDRESS,
> -	FWTS_TAG_ACPI_METHOD_RETURN,
> -	FWTS_TAG_ACPI_BRIGHTNESS,
> -	FWTS_TAG_ACPI_BUTTON,
> -	FWTS_TAG_ACPI_EVENT,
> -	FWTS_TAG_ACPI_PARAMETER,
> -	FWTS_TAG_ACPI_THROTTLING,
> -	FWTS_TAG_ACPI_EXCEPTION,
> -	FWTS_TAG_ACPI_PACKAGE,
> -	FWTS_TAG_ACPI_APIC,
> -	FWTS_TAG_ACPI_DISPLAY,
> -	FWTS_TAG_ACPI_MULTIPLE_FACS,
> -	FWTS_TAG_ACPI_POINTER_MISMATCH,
> -	FWTS_TAG_ACPI_TABLE_CHECKSUM,
> -	FWTS_TAG_ACPI_HOTPLUG,
> -	FWTS_TAG_ACPI_RSDP,
> -	FWTS_TAG_ACPI_MUTEX,
> -	FWTS_TAG_ACPI_THERMAL,
> -	FWTS_TAG_ACPI_LID,
> -	FWTS_TAG_ACPI_METHOD,
> -	FWTS_TAG_EMBEDDED_CONTROLLER,
> -	FWTS_TAG_POWER_MANAGEMENT,
> -	FWTS_TAG_WMI,
> -} fwts_tag;
> -
> -fwts_tag fwts_tag_id_str_to_tag(const char *tag);
> -const char *fwts_tag_to_str(const fwts_tag tag);
> -void fwts_tag_add(fwts_list *taglist, const char *tag);
> -char *fwts_tag_list_to_str(fwts_list *taglist);
> -void fwts_tag_report(fwts_framework *fw, const fwts_log_field field, fwts_list \
>                 *taglist);
> -void fwts_tag_failed(fwts_framework *fw, const fwts_tag tag);
> -
> -#endif
> diff --git a/src/lib/src/Makefile.am b/src/lib/src/Makefile.am
> index 4760a6f..d708f34 100644
> --- a/src/lib/src/Makefile.am
> +++ b/src/lib/src/Makefile.am
> @@ -65,7 +65,6 @@ libfwts_la_SOURCES = 		\
> 	fwts_smbios.c 		\
> 	fwts_stringextras.c 	\
> 	fwts_summary.c 		\
> -	fwts_tag.c 		\
> 	fwts_text_list.c 	\
> 	fwts_tty.c 		\
> 	fwts_uefi.c 		\
> diff --git a/src/lib/src/fwts_framework.c b/src/lib/src/fwts_framework.c
> index 92aa74d..0cf0f2c 100644
> --- a/src/lib/src/fwts_framework.c
> +++ b/src/lib/src/fwts_framework.c
> @@ -70,11 +70,9 @@ static fwts_option fwts_framework_options[] = {
> 	{ "skip-test", 		"S:", 1, "Skip listed tests, e.g. --skip-test=s3,nx,method" },
> 	{ "quiet", 		"q",  0, "Run quietly." },
> 	{ "dumpfile", 		"",   1, "Load ACPI tables using file generated by acpidump, e.g. \
>                 --dumpfile=acpidump.dat" },
> -	{ "lp-tags", 		"",   0, "Output just LaunchPad bug tags." },
> 	{ "show-tests-full", 	"",   0, "Show available tests including all minor tests." \
> },  { "utils", 		"u",  0, "Run Utility 'tests'." },
> 	{ "json-data-path", 	"j:", 1, "Specify path to fwts json data files - default is \
>                 /usr/share/fwts." },
> -	{ "lp-tags-log", 	"",   0, "Output LaunchPad bug tags in results log." },
> 	{ "disassemble-aml", 	"",   0, "Disassemble AML from DSDT and SSDT tables." },
> 	{ "log-type",		"",   1, "Specify log type (plaintext, json, html or xml)." },
> 	{ "unsafe",		"U",  0, "Unsafe tests (tests that can potentially cause kernel \
> oopses)." }, @@ -452,8 +450,7 @@ static int \
> fwts_framework_test_summary(fwts_framework *fw)  printf("%s\n", \
> fwts_log_field_to_str_upper(LOG_PASSED));  }
> 
> -	if (!(fw->flags & FWTS_FLAG_LP_TAGS))
> -		fwts_log_newline(fw->results);
> +	fwts_log_newline(fw->results);
> 
> 	return FWTS_OK;
> }
> @@ -475,7 +472,6 @@ static int fwts_framework_run_test(fwts_framework *fw, \
> fwts_framework_test *test 
> 	fw->current_major_test = test;
> 	fw->current_minor_test_name = "";
> -	fwts_list_init(&fw->test_taglist);
> 
> 	test->was_run = true;
> 	fw->total_run++;
> @@ -597,15 +593,7 @@ static int fwts_framework_run_test(fwts_framework *fw, \
> fwts_framework_test *test  if (test->ops->deinit)
> 		test->ops->deinit(fw);
> 
> -	if (fw->flags & FWTS_FLAG_LP_TAGS_LOG) {
> -		fwts_log_section_begin(fw->results, "tags");
> -		fwts_tag_report(fw, LOG_TAG, &fw->test_taglist);
> -		fwts_log_section_end(fw->results);
> -	}
> -
> done:
> -	fwts_list_free_items(&fw->test_taglist, free);
> -
> 	if (!(test->flags & FWTS_FLAG_UTILS)) {
> 		fwts_log_section_begin(fw->results, "results");
> 		fwts_framework_test_summary(fw);
> @@ -872,8 +860,7 @@ static void fwts_framework_heading_info(
> 
> 		fwts_log_info(fw, "Running tests: %s.",
> 			fwts_list_len(tests_to_run) == 0 ? "None" : tests);
> -		if (!(fw->flags & FWTS_FLAG_LP_TAGS))
> -			fwts_log_newline(fw->results);
> +		fwts_log_newline(fw->results);
> 		free(tests);
> 	}
> }
> @@ -1094,52 +1081,44 @@ int fwts_framework_options_handler(fwts_framework *fw, int \
> argc, char * const ar  case 25: /* --dumpfile */
> 			fwts_framework_strdup(&fw->acpi_table_acpidump_file, optarg);
> 			break;
> -		case 26: /* --lp-tags */
> -			fw->flags |= FWTS_FLAG_LP_TAGS;
> -			fwts_log_filter_unset_field(~0);
> -			fwts_log_filter_set_field(LOG_TAG);
> -			break;
> -		case 27: /* --show-tests-full */
> +		case 26: /* --show-tests-full */
> 			fw->flags |= FWTS_FLAG_SHOW_TESTS_FULL;
> 			break;
> -		case 28: /* --utils */
> +		case 27: /* --utils */
> 			fw->flags |= FWTS_FLAG_UTILS;
> 			break;
> -		case 29: /* --json-data-path */
> +		case 28: /* --json-data-path */
> 			fwts_framework_strdup(&fw->json_data_path, optarg);
> 			break;
> -		case 30: /* --lp-tags-log */
> -			fw->flags |= FWTS_FLAG_LP_TAGS_LOG;
> -			break;
> -		case 31: /* --disassemble-aml */
> +		case 29: /* --disassemble-aml */
> 			fwts_iasl_disassemble_all_to_file(fw);
> 			return FWTS_COMPLETE;
> -		case 32: /* --log-type */
> +		case 30: /* --log-type */
> 			if (fwts_framework_log_type_parse(fw, optarg) != FWTS_OK)
> 				return FWTS_ERROR;
> 			break;
> -		case 33: /* --unsafe */
> +		case 31: /* --unsafe */
> 			fw->flags |= FWTS_FLAG_UNSAFE;
> 			break;
> -		case 34: /* --filter-error-discard */
> +		case 32: /* --filter-error-discard */
> 			if (fwts_framework_filter_error_parse(optarg, &fw->errors_filter_discard) != \
> FWTS_OK)  return FWTS_ERROR;
> 			break;
> -		case 35: /* --filter-error-keep */
> +		case 33: /* --filter-error-keep */
> 			if (fwts_framework_filter_error_parse(optarg, &fw->errors_filter_keep) != \
> FWTS_OK)  return FWTS_ERROR;
> 			break;
> -		case 36: /* --acpica-debug */
> +		case 34: /* --acpica-debug */
> 			fw->flags |= FWTS_FLAG_ACPICA_DEBUG;
> 			break;
> -		case 37: /* --acpica */
> +		case 35: /* --acpica */
> 			if (fwts_framework_acpica_parse(fw, optarg) != FWTS_OK)
> 				return FWTS_ERROR;
> 			break;
> -		case 38: /* --uefi */
> +		case 36: /* --uefi */
> 			fw->flags |= FWTS_FLAG_TEST_UEFI;
> 			break;
> -		case 39: /* --rsdp */
> +		case 37: /* --rsdp */
> 			fw->rsdp = (void *)strtoul(optarg, NULL, 0);
> 			break;
> 		}
> @@ -1176,7 +1155,6 @@ int fwts_framework_options_handler(fwts_framework *fw, int \
> argc, char * const ar  fwts_framework_strdup(&fw->klog, optarg);
> 		break;
> 	case 'l': /* --lp-flags */
> -		fw->flags |= FWTS_FLAG_LP_TAGS;
> 		break;
> 	case 'p': /* --show-progress */
> 		fw->flags = (fw->flags &
> @@ -1252,7 +1230,6 @@ int fwts_framework_args(const int argc, char **argv)
> 		    FWTS_FLAG_SHOW_PROGRESS;
> 	fw->log_type = LOG_TYPE_PLAINTEXT;
> 
> -	fwts_list_init(&fw->total_taglist);
> 	fwts_list_init(&fw->errors_filter_keep);
> 	fwts_list_init(&fw->errors_filter_discard);
> 
> @@ -1383,17 +1360,12 @@ int fwts_framework_args(const int argc, char **argv)
> 		fwts_log_section_begin(fw->results, "summary");
> 		fwts_log_set_owner(fw->results, "summary");
> 		fwts_log_nl(fw);
> -		if (fw->flags & FWTS_FLAG_LP_TAGS_LOG)
> -			fwts_tag_report(fw, LOG_SUMMARY, &fw->total_taglist);
> 		fwts_framework_total_summary(fw);
> 		fwts_log_nl(fw);
> 		fwts_summary_report(fw, &fwts_framework_test_list);
> 		fwts_log_section_end(fw->results);
> 	}
> 
> -	if (fw->flags & FWTS_FLAG_LP_TAGS)
> -		fwts_tag_report(fw, LOG_TAG | LOG_NO_FIELDS, &fw->total_taglist);
> -
> tidy:
> 	fwts_list_free_items(&tests_to_skip, NULL);
> 	fwts_list_free_items(&tests_to_run, NULL);
> @@ -1410,7 +1382,6 @@ tidy_close:
> 
> 	fwts_list_free_items(&fw->errors_filter_discard, NULL);
> 	fwts_list_free_items(&fw->errors_filter_keep, NULL);
> -	fwts_list_free_items(&fw->total_taglist, free);
> 	fwts_list_free_items(&fwts_framework_test_list, free);
> 
> 	/* Failed tests flagged an error */
> diff --git a/src/lib/src/fwts_klog.c b/src/lib/src/fwts_klog.c
> index 8d3d874..9ae93d6 100644
> --- a/src/lib/src/fwts_klog.c
> +++ b/src/lib/src/fwts_klog.c
> @@ -252,7 +252,6 @@ void fwts_klog_scan_patterns(fwts_framework *fw,
> 			if (pattern->level == LOG_LEVEL_INFO)
> 				fwts_log_info(fw, "Kernel message: %s", line);
> 			else {
> -				fwts_tag_failed(fw, pattern->tag);
> 				fwts_failed(fw, pattern->level, pattern->label,
> 					"%s Kernel message: %s", fwts_log_level_to_str(pattern->level), line);
> 				fwts_error_inc(fw, pattern->label, errors);
> @@ -376,10 +375,6 @@ static int fwts_klog_check(fwts_framework *fw,
> 			goto fail;
> 		patterns[i].level   = fwts_log_str_to_level(str);
> 
> -		if ((str = fwts_json_str(fw, table, i, obj, "tag", true)) == NULL)
> -			goto fail;
> -		patterns[i].tag     = fwts_tag_id_str_to_tag(str);
> -
> 		if ((patterns[i].pattern = fwts_json_str(fw, table, i, obj, "pattern", true)) == \
> NULL)  goto fail;
> 
> diff --git a/src/lib/src/fwts_log.c b/src/lib/src/fwts_log.c
> index 693b943..54e8215 100644
> --- a/src/lib/src/fwts_log.c
> +++ b/src/lib/src/fwts_log.c
> @@ -75,8 +75,6 @@ char *fwts_log_field_to_str(const fwts_log_field field)
> 		return "ADV";
> 	case LOG_HEADING:
> 		return "HED";
> -	case LOG_TAG:
> -		return "TAG";
> 	case LOG_PASSED:
> 		return "PAS";
> 	case LOG_FAILED:
> @@ -119,8 +117,6 @@ char *fwts_log_field_to_str_full(const fwts_log_field field)
> 		return "Advice";
> 	case LOG_HEADING:
> 		return "Heading";
> -	case LOG_TAG:
> -		return "Tag";
> 	case LOG_PASSED:
> 		return "Passed";
> 	case LOG_FAILED:
> @@ -239,7 +235,6 @@ fwts_log_field fwts_log_str_to_field(const char *text)
> 		{ "SEP", LOG_SEPARATOR },
> 		{ "ADV", LOG_ADVICE },
> 		{ "HED", LOG_HEADING },
> -		{ "TAG", LOG_TAG },
> 		{ "ALL", ~0 },
> 		{ NULL, 0 }
> 	};
> diff --git a/src/lib/src/fwts_tag.c b/src/lib/src/fwts_tag.c
> deleted file mode 100644
> index 958a3c2..0000000
> --- a/src/lib/src/fwts_tag.c
> +++ /dev/null
> @@ -1,202 +0,0 @@
> -/*
> - * Copyright (C) 2010-2013 Canonical
> - *
> - * This program is free software; you can redistribute it and/or
> - * modify it under the terms of the GNU General Public License
> - * as published by the Free Software Foundation; either version 2
> - * of the License, or (at your option) any later version.
> - *
> - * This program is distributed in the hope that it will be useful,
> - * but WITHOUT ANY WARRANTY; without even the implied warranty of
> - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
> - * GNU General Public License for more details.
> - *
> - * You should have received a copy of the GNU General Public License
> - * along with this program; if not, write to the Free Software
> - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
> - *
> - */
> -
> -#include <stdlib.h>
> -#include <string.h>
> -
> -#include "fwts.h"
> -
> -typedef struct {
> -	const fwts_tag	tag;
> -	const char	*tag_id;
> -	const char 	*tag_str;
> -} fwts_tag_info;
> -
> -#define FWTS_TAG(tag, str)	\
> -	{ tag, #tag, str }
> -
> -static fwts_tag_info fwts_tags[] = {
> -	FWTS_TAG(FWTS_TAG_NONE,	 		""),
> -	FWTS_TAG(FWTS_TAG_ERROR_CRITICAL,	"error-critical"),
> -	FWTS_TAG(FWTS_TAG_ERROR_HIGH,		"error-high"),
> -	FWTS_TAG(FWTS_TAG_ERROR_MEDIUM,		"error-medium"),
> -	FWTS_TAG(FWTS_TAG_ERROR_LOW,		"error-low"),
> -	FWTS_TAG(FWTS_TAG_BIOS,			"bios"),
> -	FWTS_TAG(FWTS_TAG_BIOS_THERMAL,		"bios-thermal"),
> -	FWTS_TAG(FWTS_TAG_BIOS_IRQ,		"bios-irq"),
> -	FWTS_TAG(FWTS_TAG_BIOS_AMD_POWERNOW,	"bios-amd-powernow"),
> -	FWTS_TAG(FWTS_TAG_BIOS_MMCONFIG,	"bios-mmconfig"),
> -	FWTS_TAG(FWTS_TAG_BIOS_DMI,		"bios-dmi"),
> -	FWTS_TAG(FWTS_TAG_ACPI,			"acpi"),
> -	FWTS_TAG(FWTS_TAG_ACPI_IO_PORT,		"acpi-io-port"),
> -	FWTS_TAG(FWTS_TAG_ACPI_INVALID_TABLE,	"acpi-invalid-table"),
> -	FWTS_TAG(FWTS_TAG_ACPI_BUFFER_OVERFLOW,	"acpi-buffer-overflow"),
> -	FWTS_TAG(FWTS_TAG_ACPI_AML_OPCODE,	"acpi-aml-opcode"),
> -	FWTS_TAG(FWTS_TAG_ACPI_NAMESPACE_LOOKUP,"acpi-namespace-lookup"),
> -	FWTS_TAG(FWTS_TAG_ACPI_PCI_EXPRESS,	"acpi-pci-express"),
> -	FWTS_TAG(FWTS_TAG_ACPI_BAD_RESULT,	"acpi-bad-result"),
> -	FWTS_TAG(FWTS_TAG_ACPI_NO_HANDLER,	"acpi-no-handler"),
> -	FWTS_TAG(FWTS_TAG_ACPI_PACKAGE_LIST,	"acpi-package-list"),
> -	FWTS_TAG(FWTS_TAG_ACPI_PARSE_EXEC_FAIL,	"acpi-parse-exec-fail"),
> -	FWTS_TAG(FWTS_TAG_ACPI_EVAL,		"acpi-eval"),
> -	FWTS_TAG(FWTS_TAG_ACPI_BAD_LENGTH,	"acpi-bad-length"),
> -	FWTS_TAG(FWTS_TAG_ACPI_BAD_ADDRESS,	"acpi-bad-address"),
> -	FWTS_TAG(FWTS_TAG_ACPI_METHOD_RETURN,	"acpi-method-return"),
> -	FWTS_TAG(FWTS_TAG_ACPI_BRIGHTNESS,	"acpi-brightness"),
> -	FWTS_TAG(FWTS_TAG_ACPI_BUTTON,		"acpi-button"),
> -	FWTS_TAG(FWTS_TAG_ACPI_EVENT,		"acpi-event"),
> -	FWTS_TAG(FWTS_TAG_ACPI_PARAMETER,	"acpi-parameter"),
> -	FWTS_TAG(FWTS_TAG_ACPI_THROTTLING,	"acpi-throttling"),
> -	FWTS_TAG(FWTS_TAG_ACPI_EXCEPTION,	"acpi-exception"),
> -	FWTS_TAG(FWTS_TAG_ACPI_PACKAGE,		"acpi-package"),
> -	FWTS_TAG(FWTS_TAG_ACPI_APIC,		"acpi-apic"),
> -	FWTS_TAG(FWTS_TAG_ACPI_DISPLAY,		"acpi-display"),
> -	FWTS_TAG(FWTS_TAG_ACPI_MULTIPLE_FACS,	"acpi-multiple-facs"),
> -	FWTS_TAG(FWTS_TAG_ACPI_POINTER_MISMATCH,"acpi-pointer-mismatch"),
> -	FWTS_TAG(FWTS_TAG_ACPI_TABLE_CHECKSUM,	"acpi-table-checksum"),
> -	FWTS_TAG(FWTS_TAG_ACPI_HOTPLUG,		"acpi-hotplug"),
> -	FWTS_TAG(FWTS_TAG_ACPI_RSDP,		"acpi-rsdp"),
> -	FWTS_TAG(FWTS_TAG_ACPI_MUTEX,		"acpi-mutex"),
> -	FWTS_TAG(FWTS_TAG_ACPI_THERMAL,		"acpi-thermal"),
> -	FWTS_TAG(FWTS_TAG_ACPI_LID,		"acpi-lid"),
> -	FWTS_TAG(FWTS_TAG_ACPI_METHOD,		"acpi-method"),
> -	FWTS_TAG(FWTS_TAG_EMBEDDED_CONTROLLER,	"embedded-controller"),
> -	FWTS_TAG(FWTS_TAG_POWER_MANAGEMENT,	"power-management"),
> -	FWTS_TAG(FWTS_TAG_WMI,			"wmi"),
> -	{ 0, NULL, NULL }
> -};
> -
> -/*
> - *  fwts_tag_id_str_to_tag()
> - *	given a tag string, return the tag
> - */
> -fwts_tag fwts_tag_id_str_to_tag(const char *tag)
> -{
> -	int i;
> -
> -	for (i=0; fwts_tags[i].tag_id != NULL; i++)
> -		if (strcmp(tag, fwts_tags[i].tag_id) == 0)
> -			return fwts_tags[i].tag;
> -	return FWTS_TAG_NONE;
> -}
> -
> -/*
> - *  fwts_tag_to_str()
> - *	given a tag, return the human readable tag name
> - */
> -const char *fwts_tag_to_str(const fwts_tag tag)
> -{
> -	int i;
> -	static const char *none = "";
> -
> -	for (i=0; fwts_tags[i].tag_id != NULL; i++)
> -		if (fwts_tags[i].tag == tag)
> -			return fwts_tags[i].tag_str;
> -	return none;
> -}
> -
> -/*
> - *  fwts_tag_compare()
> - *	callback to enable tag name sorting
> - */
> -static int fwts_tag_compare(void *data1, void *data2)
> -{
> -	return strcmp((char *)data1, (char*)data2);
> -}
> -
> -/*
> - *  fwts_tag_add()
> - *	add a tag name to a list of tag names, ordered alphabetically
> - * 	tag is added if it does already exist in the tag list
> - */
> -void fwts_tag_add(fwts_list *taglist, const char *tag)
> -{
> -	fwts_list_link	*item;
> -	char *str;
> -
> -	/* Exists already? then don't bother */
> -	fwts_list_foreach(item, taglist)
> -		if (strcmp(fwts_list_data(char *,item), tag) == 0)
> -			return;
> -
> -	str = strdup(tag);
> -	if (str)
> -		fwts_list_add_ordered(taglist, str, fwts_tag_compare);
> -}
> -
> -/*
> - *  fwts_tag_list_to_str()
> - *	given a list of tag names return a space delimited string
> - *	containing the the tag names
> - */
> -char *fwts_tag_list_to_str(fwts_list *taglist)
> -{
> -	fwts_list_link	*item;
> -	char *str = NULL;
> -	size_t len = 0;
> -
> -	fwts_list_foreach(item, taglist) {
> -		char *tag = fwts_list_data(char *, item);
> -		size_t taglen = strlen(tag);
> -		len += taglen + 1;
> -
> -		if (str) {
> -			if ((str = realloc(str, len)) == NULL)
> -				return NULL;
> -			strcat(str, " ");
> -			strcat(str, tag);
> -		} else {
> -			if ((str = malloc(len)) == NULL)
> -				return NULL;
> -			strcpy(str, tag);
> -		}
> -	}
> -	return str;
> -}
> -
> -/*
> - *  fwts_tag_report()
> - *	report to the log the tags found in the taglist
> - */
> -void fwts_tag_report(fwts_framework *fw, const fwts_log_field field, fwts_list \
>                 *taglist)
> -{
> -	if ((taglist != NULL) && (fwts_list_len(taglist) > 0)) {
> -		char *tags = fwts_tag_list_to_str(taglist);
> -		if (tags) {
> -			fwts_log_printf(fw->results, field | LOG_VERBATUM, LOG_LEVEL_NONE, "", "", "", \
>                 "Tags: %s", tags);
> -			free(tags);
> -		}
> -	}
> -}
> -
> -/*
> - *  fwts_tag_failed()
> - *	add to the tag lists the tag:
> - *	per test (this is emptied at end of each test)
> - * 	all tests (this is total for all tests run)
> - */
> -void fwts_tag_failed(fwts_framework *fw, const fwts_tag tag)
> -{
> -	const char *text = fwts_tag_to_str(tag);
> -
> -	if (*text) {
> -		fwts_tag_add(&fw->test_taglist, text);
> -		fwts_tag_add(&fw->total_taglist, text);
> -	}
> -}
> diff --git a/src/pci/crs/crs.c b/src/pci/crs/crs.c
> index 9b48ed4..b7f6165 100644
> --- a/src/pci/crs/crs.c
> +++ b/src/pci/crs/crs.c
> @@ -72,15 +72,12 @@ static int crs_test1(fwts_framework *fw)
> 					"The kernel could not determine the BIOS age "
> 					"and has assumed that your BIOS is too old to correctly "
> 					"specify the host bridge MMIO aperture using _CRS.");
> -				fwts_tag_failed(fw, FWTS_TAG_BIOS);
> 				fwts_log_advice(fw, "You can override this by booting with \"pci=use_crs\".");
> -
> 			} else if (year < 2008) {
> 				fwts_passed(fw,
> 					"The kernel has detected an old BIOS (%d/%d/%d) "
> 					"and has assumed that your BIOS is too old to correctly "
> 					"specify the host bridge MMIO aperture using _CRS.", mon, day, year);
> -				fwts_tag_failed(fw, FWTS_TAG_BIOS);
> 				fwts_log_advice(fw, "You can override this by booting with \"pci=use_crs\".");
> 			} else {
> 				fwts_failed(fw, LOG_LEVEL_MEDIUM,
> @@ -88,7 +85,6 @@ static int crs_test1(fwts_framework *fw)
> 					"The kernel is ignoring host bridge windows from ACPI for some unknown reason. \
>                 "
> 					"pci=nocrs has not been used as a boot parameter and the BIOS may be recent \
> enough "  "to support this (%d/%d/%d)", mon, day, year);
> -				fwts_tag_failed(fw, FWTS_TAG_BIOS);
> 			}
> 		}
> 	} else if (fwts_klog_regex_find(fw, klog, "PCI: Using host bridge windows from \
> ACPI;") > 0) { @@ -97,12 +93,10 @@ static int crs_test1(fwts_framework *fw)
> 				fwts_failed(fw, LOG_LEVEL_MEDIUM,
> 					"BIOSNoReleaseDate",
> 					"The BIOS does not seem to have release date, hence pci=use_crs was \
>                 required.");
> -				fwts_tag_failed(fw, FWTS_TAG_BIOS);
> 			} else if (year < 2008) {
> 				fwts_passed(fw,
> 					"The BIOS is relatively old (%d/%d/%d) and hence pci=use_crs was required to "
> 					"enable host bridge windows _CRS settings from ACPI.", mon, day, year);
> -				fwts_tag_failed(fw, FWTS_TAG_BIOS);
> 			} else {
> 				fwts_failed(fw, LOG_LEVEL_LOW,
> 					"BIOSSupportBridgeWindows",
> @@ -110,7 +104,6 @@ static int crs_test1(fwts_framework *fw)
> 					"the BIOS is new enough to support automatic bridge windows configuring using \
>                 _CRS from ACPI. "
> 					"However, the workaround may be necessary because _CRS is incorrect or not \
> implemented in the "  "DSDT.");
> -				fwts_tag_failed(fw, FWTS_TAG_BIOS);
> 			}
> 		}
> 		else {
> diff --git a/src/pci/maxreadreq/maxreadreq.c b/src/pci/maxreadreq/maxreadreq.c
> index 7a06cec..2713224 100644
> --- a/src/pci/maxreadreq/maxreadreq.c
> +++ b/src/pci/maxreadreq/maxreadreq.c
> @@ -129,7 +129,6 @@ static int maxreadreq_test1(fwts_framework *fw)
> 			"allow one to override the firmware settings. Where possible, this BIOS "
> 			"configuration setting is worth increasing it a little more for better "
> 			"performance at a small reduction of bus sharing.");
> -		fwts_tag_failed(fw, FWTS_TAG_BIOS);
> 	} else
> 		fwts_passed(fw, "All devices have MaxReadReq set > 128.");
> 
> 

Acked-by: Alex Hung <alex.hung@canonical.com>


[prev in list] [next in list] [prev in thread] [next in thread] 

Configure | About | News | Add a list | Sponsored by KoreLogic