diff --git a/sefht.geany b/sefht.geany
index 522e02befd137f3d3cafc9517271772adb87a00c..6490eb613de2620da9684d422f26bda7719c2b4d 100644
--- a/sefht.geany
+++ b/sefht.geany
@@ -28,7 +28,7 @@ long_line_behaviour=1
 long_line_column=72
 
 [files]
-current_page=35
+current_page=42
 FILE_NAME_0=139;None;0;EUTF-8;1;1;0;%2Fhome%2Fjonathan%2FDokumente%2Fprojekte%2Fprgm%2Finternet%2Fweb%2FSeFHT%2FREADME;0;8
 FILE_NAME_1=134;None;0;EUTF-8;1;1;0;%2Fhome%2Fjonathan%2FDokumente%2Fprojekte%2Fprgm%2Finternet%2Fweb%2FSeFHT%2F.gitignore;0;8
 FILE_NAME_2=1737;Sh;0;EUTF-8;1;1;0;%2Fhome%2Fjonathan%2FDokumente%2Fprojekte%2Fprgm%2Finternet%2Fweb%2FSeFHT%2Fconfigure.ac;0;8
@@ -71,7 +71,7 @@ FILE_NAME_38=924;C;0;EUTF-8;1;1;0;%2Fhome%2Fjonathan%2FDokumente%2Fprojekte%2Fpr
 FILE_NAME_39=18;C;0;EUTF-8;1;1;0;%2Fhome%2Fjonathan%2FDokumente%2Fprojekte%2Fprgm%2Finternet%2Fweb%2FSeFHT%2Fsrc%2Flib%2Fsefht%2Flog.h;0;4
 FILE_NAME_40=20;C;0;EUTF-8;1;1;0;%2Fhome%2Fjonathan%2FDokumente%2Fprojekte%2Fprgm%2Finternet%2Fweb%2FSeFHT%2Fsrc%2Flib%2Fsefht%2Fmacro.h;0;8
 FILE_NAME_41=20;C;0;EUTF-8;1;1;0;%2Fhome%2Fjonathan%2FDokumente%2Fprojekte%2Fprgm%2Finternet%2Fweb%2FSeFHT%2Fsrc%2Flib%2Fsefht%2Fsefht.h;0;8
-FILE_NAME_42=2902;Make;0;EUTF-8;1;1;0;%2Fhome%2Fjonathan%2FDokumente%2Fprojekte%2Fprgm%2Finternet%2Fweb%2FSeFHT%2Ftests%2FMakefile.am;0;8
+FILE_NAME_42=702;Make;0;EUTF-8;1;1;0;%2Fhome%2Fjonathan%2FDokumente%2Fprojekte%2Fprgm%2Finternet%2Fweb%2FSeFHT%2Ftests%2FMakefile.am;0;8
 FILE_NAME_43=218;Sh;0;EUTF-8;1;1;0;%2Fhome%2Fjonathan%2FDokumente%2Fprojekte%2Fprgm%2Finternet%2Fweb%2FSeFHT%2Ftests%2Fno_test.sh.in;0;8
 FILE_NAME_44=23;C;0;EUTF-8;1;1;0;%2Fhome%2Fjonathan%2FDokumente%2Fprojekte%2Fprgm%2Finternet%2Fweb%2FSeFHT%2Ftests%2Ftest_cms.c;0;8
 FILE_NAME_45=24;C;0;EUTF-8;1;1;0;%2Fhome%2Fjonathan%2FDokumente%2Fprojekte%2Fprgm%2Finternet%2Fweb%2FSeFHT%2Ftests%2Ftest_data.c;0;8
@@ -81,11 +81,12 @@ FILE_NAME_48=5714;C;0;EUTF-8;1;1;0;%2Fhome%2Fjonathan%2FDokumente%2Fprojekte%2Fp
 FILE_NAME_49=24;C;0;EUTF-8;1;1;0;%2Fhome%2Fjonathan%2FDokumente%2Fprojekte%2Fprgm%2Finternet%2Fweb%2FSeFHT%2Ftests%2Ftest_attr.c;0;8
 FILE_NAME_50=4221;C;0;EUTF-8;1;1;0;%2Fhome%2Fjonathan%2FDokumente%2Fprojekte%2Fprgm%2Finternet%2Fweb%2FSeFHT%2Ftests%2Ftest_text.c;0;8
 FILE_NAME_51=994;C;0;EUTF-8;1;1;0;%2Fhome%2Fjonathan%2FDokumente%2Fprojekte%2Fprgm%2Finternet%2Fweb%2FSeFHT%2Ftests%2Ftest_text_mark.c;0;8
-FILE_NAME_52=10556;C;0;EUTF-8;1;1;0;%2Fhome%2Fjonathan%2FDokumente%2Fprojekte%2Fprgm%2Finternet%2Fweb%2FSeFHT%2Ftests%2Ftest_validator.c;0;8
-FILE_NAME_53=536;None;0;EUTF-8;1;1;0;%2Fhome%2Fjonathan%2FDokumente%2Fprojekte%2Fprgm%2Finternet%2Fweb%2FSeFHT%2Ftodo.txt;0;8
-FILE_NAME_54=201;YAML;0;EUTF-8;0;1;0;%2Fhome%2Fjonathan%2FDokumente%2Fprojekte%2Fprgm%2Finternet%2Fweb%2FSeFHT%2F.gitlab-ci.yml;0;4
-FILE_NAME_55=71;Sh;0;EUTF-8;1;1;0;%2Fhome%2Fjonathan%2FDokumente%2Fprojekte%2Fprgm%2Finternet%2Fweb%2FSeFHT%2Fgitlab-ci%2Fupload.sh.in;0;8
-FILE_NAME_56=806;Sh;0;EUTF-8;0;1;0;%2Fhome%2Fjonathan%2FDokumente%2Fprojekte%2Fprgm%2Finternet%2Fweb%2FSeFHT%2Fgitlab-ci%2Frelease.sh.in;0;4
+FILE_NAME_52=2177;C;0;EUTF-8;1;1;0;%2Fhome%2Fjonathan%2FDokumente%2Fprojekte%2Fprgm%2Finternet%2Fweb%2FSeFHT%2Ftests%2Ftest_validator.c;0;8
+FILE_NAME_53=10866;C;0;EUTF-8;1;1;0;%2Fhome%2Fjonathan%2FDokumente%2Fprojekte%2Fprgm%2Finternet%2Fweb%2FSeFHT%2Ftests%2Ftest_validator_tag.c;0;8
+FILE_NAME_54=536;None;0;EUTF-8;1;1;0;%2Fhome%2Fjonathan%2FDokumente%2Fprojekte%2Fprgm%2Finternet%2Fweb%2FSeFHT%2Ftodo.txt;0;8
+FILE_NAME_55=201;YAML;0;EUTF-8;0;1;0;%2Fhome%2Fjonathan%2FDokumente%2Fprojekte%2Fprgm%2Finternet%2Fweb%2FSeFHT%2F.gitlab-ci.yml;0;4
+FILE_NAME_56=71;Sh;0;EUTF-8;1;1;0;%2Fhome%2Fjonathan%2FDokumente%2Fprojekte%2Fprgm%2Finternet%2Fweb%2FSeFHT%2Fgitlab-ci%2Fupload.sh.in;0;8
+FILE_NAME_57=806;Sh;0;EUTF-8;0;1;0;%2Fhome%2Fjonathan%2FDokumente%2Fprojekte%2Fprgm%2Finternet%2Fweb%2FSeFHT%2Fgitlab-ci%2Frelease.sh.in;0;4
 
 [VTE]
 last_dir=/home/jonathan/Documents/projects/prgm/internet/web/SeFHT/tests
diff --git a/tests/Makefile.am b/tests/Makefile.am
index 77fffb1f02345f77604016c71132b865fbf37592..0429773fcc4fb4851d1e96b9d4709702c0b8849b 100644
--- a/tests/Makefile.am
+++ b/tests/Makefile.am
@@ -20,6 +20,7 @@ check_PROGRAMS += sefht_text_fragment_test
 check_PROGRAMS += sefht_text_test
 check_PROGRAMS += sefht_text_mark_test
 check_PROGRAMS += sefht_validator_test
+check_PROGRAMS += sefht_validator_tag_test
 
 XFAIL_TESTS =
 XFAIL_TESTS += sefht_fragment_test
@@ -89,3 +90,7 @@ sefht_text_mark_test_LDADD += $(LDADD)
 sefht_validator_test_SOURCES = test_validator.c
 sefht_validator_test_LDADD =
 sefht_validator_test_LDADD += $(LDADD)
+
+sefht_validator_tag_test_SOURCES = test_validator_tag.c
+sefht_validator_tag_test_LDADD =
+sefht_validator_tag_test_LDADD += $(LDADD)
diff --git a/tests/test_validator.c b/tests/test_validator.c
index 3a04cedd4004a5dbd34b4c44cbd2204fa5dcf007..2f1c2f745f5f8b3b15123c2ff7e1ba49e665089a 100644
--- a/tests/test_validator.c
+++ b/tests/test_validator.c
@@ -37,16 +37,6 @@
 #include "macro.h"
 #include "status.h"
 
-/* override HTML spec */
-#include "validator_html.h"
-const struct HTML_TAG_DEFINITION HTML_[] = {
-	{"html"},
-	{"aside"},
-	{"html"},
-	{"body"}
-};
-#define HTML5 HTML_
-
 /* C file is needed, because we want to override SIZE_MAX */
 #include "validator.c"
 
@@ -58,9 +48,6 @@ START_TEST(test_validator_no_status)
 	validator = SH_Validator_new (NULL);
 	ck_assert_ptr_ne (NULL, validator);
 
-	ck_assert_int_eq (0, validator->tag_n);
-	ck_assert_int_eq (TAG_ERR, validator->last_tag);
-
 	SH_Validator_free (validator);
 }
 END_TEST
@@ -75,9 +62,6 @@ START_TEST(test_validator_with_status)
 	ck_assert_ptr_ne (NULL, validator);
 	ck_assert_int_eq (status.status, SUCCESS);
 
-	ck_assert_int_eq (0, validator->tag_n);
-	ck_assert_int_eq (TAG_ERR, validator->last_tag);
-
 	SH_Validator_free (validator);
 }
 END_TEST
@@ -90,22 +74,6 @@ START_TEST(test_validator_spec_no_status)
 	validator = SH_Validator_new_html5 (NULL);
 	ck_assert_ptr_ne (NULL, validator);
 
-	ck_assert_ptr_ne (NULL, validator->tags);
-	ck_assert_int_eq (3, validator->tag_n);
-	ck_assert_int_eq (3, validator->last_tag);
-
-	ck_assert_int_eq (1, validator->tags[0].id);
-	ck_assert_ptr_ne (HTML_[1].tag, validator->tags[0].name);
-	ck_assert_str_eq (HTML_[1].tag, validator->tags[0].name);
-
-	ck_assert_int_eq (2, validator->tags[1].id);
-	ck_assert_ptr_ne (HTML_[3].tag, validator->tags[1].name);
-	ck_assert_str_eq (HTML_[3].tag, validator->tags[1].name);
-
-	ck_assert_int_eq (3, validator->tags[2].id);
-	ck_assert_ptr_ne (HTML_[0].tag, validator->tags[2].name);
-	ck_assert_str_eq (HTML_[0].tag, validator->tags[2].name);
-
 	/* cleanup */
 	SH_Validator_free (validator);
 }
@@ -122,260 +90,6 @@ START_TEST(test_validator_spec_with_status)
 	ck_assert_ptr_ne (NULL, validator);
 	ck_assert_int_eq (SUCCESS, status.status);
 
-	ck_assert_ptr_ne (NULL, validator->tags);
-	ck_assert_int_eq (3, validator->tag_n);
-	ck_assert_int_eq (3, validator->last_tag);
-
-	ck_assert_int_eq (1, validator->tags[0].id);
-	ck_assert_ptr_ne (HTML_[1].tag, validator->tags[0].name);
-	ck_assert_str_eq (HTML_[1].tag, validator->tags[0].name);
-
-	ck_assert_int_eq (2, validator->tags[1].id);
-	ck_assert_ptr_ne (HTML_[3].tag, validator->tags[1].name);
-	ck_assert_str_eq (HTML_[3].tag, validator->tags[1].name);
-
-	ck_assert_int_eq (3, validator->tags[2].id);
-	ck_assert_ptr_ne (HTML_[0].tag, validator->tags[2].name);
-	ck_assert_str_eq (HTML_[0].tag, validator->tags[2].name);
-
-	/* cleanup */
-	SH_Validator_free (validator);
-}
-END_TEST
-
-START_TEST(test_validator_tag_register_no_status)
-{
-	struct SH_Validator * validator;
-	const char * tag1 = "html";
-	const char * tag2 = "head";
-	const char * tag3 = "article";
-	const char * tag4 = "p";
-	const char * tag5 = "img";
-	char * tagN;
-	Tag tag;
-	Tag tag_;
-
-	/* setup */
-	validator = SH_Validator_new (NULL);
-	ck_assert_ptr_ne (NULL, validator);
-
-	/* test - register */
-	tag = SH_Validator_register_tag (validator, tag1, NULL);
-	ck_assert_int_eq (1, tag);
-
-	ck_assert_int_eq (validator->tag_n, 1);
-	ck_assert_int_eq (validator->last_tag, tag);
-
-	ck_assert_int_eq (validator->tags[0].id, tag);
-	ck_assert_str_eq (validator->tags[0].name, tag1);
-
-	/* test - duplicate registration */
-	tag_ = SH_Validator_register_tag (validator, tag1, NULL);
-	ck_assert_int_eq (tag_, tag);
-
-	ck_assert_int_eq (validator->tag_n, 1);
-	ck_assert_int_eq (validator->last_tag, tag);
-
-	ck_assert_int_eq (validator->tags[0].id, tag);
-	ck_assert_str_eq (validator->tags[0].name, tag1);
-
-	/* test - order */
-	tag = SH_Validator_register_tag (validator, tag3, NULL);
-	ck_assert_int_eq (tag, 2);
-
-	tag = SH_Validator_register_tag (validator, tag4, NULL);
-	ck_assert_int_eq (tag, 3);
-
-	tag = SH_Validator_register_tag (validator, tag5, NULL);
-	ck_assert_int_eq (tag, 4);
-
-	ck_assert_int_eq (validator->tag_n, 4);
-
-	ck_assert_str_eq (validator->tags[0].name, tag3);
-	ck_assert_str_eq (validator->tags[1].name, tag1);
-	ck_assert_str_eq (validator->tags[2].name, tag5);
-	ck_assert_str_eq (validator->tags[3].name, tag4);
-
-	/* test - overflow detection */
-	/* make method fail by filling with garbage until
-	 * upper boundary is reached */
-
-	/* ensure enough space  inside string*/
-	/* log10 +1 = number length */
-	/* +3 "tag" */
-	/* +1 '\0' */
-	/* = +5 */
-	tagN = calloc (((int) floor (log10 ((double) SIZE_MAX))) + 5,
-		       sizeof (char));
-
-	/* fill with garbage */
-	do
-	{
-		sprintf (tagN, "tag%zu", validator->tag_n);
-	}
-	while (TAG_ERR != SH_Validator_register_tag (validator, tagN, NULL));
-
-	free (tagN);
-
-	/* test overflow #1 */
-	tag = SH_Validator_register_tag (validator, tag2, NULL);
-	ck_assert_int_eq (TAG_ERR, tag);
-
-	ck_assert_int_eq (validator->tag_n, 10);
-
-	/* test overflow #2 */
-	validator->tag_n = 1;
-	validator->last_tag = TAG_MAX;
-
-	tag = SH_Validator_register_tag (validator, tag2, NULL);
-	ck_assert_int_eq (TAG_ERR, tag);
-
-	ck_assert_int_eq (validator->tag_n, 1);
-	ck_assert_int_eq (validator->last_tag, TAG_MAX);
-
-	/* cleanup */
-	/* also free garbage created for overflow test */
-	validator->tag_n = 10;
-	SH_Validator_free (validator);
-}
-
-START_TEST(test_validator_tag_register_with_status)
-{
-	struct SH_Status status;
-	struct SH_Validator * validator;
-	const char * tag1 = "html";
-	const char * tag2 = "head";
-	const char * tag3 = "article";
-	const char * tag4 = "p";
-	const char * tag5 = "img";
-	char * tagN;
-	Tag tag;
-	Tag tag_;
-
-	/* setup */
-	validator = SH_Validator_new (NULL);
-	ck_assert_ptr_ne (NULL, validator);
-
-	/* test - register */
-	_status_preinit (status);
-	tag = SH_Validator_register_tag (validator, tag1, &status);
-	ck_assert_int_eq (1, tag);
-	ck_assert_int_eq (SUCCESS, status.status);
-
-	ck_assert_int_eq (validator->tag_n, 1);
-	ck_assert_int_eq (validator->last_tag, tag);
-
-	ck_assert_int_eq (validator->tags[0].id, tag);
-	ck_assert_str_eq (validator->tags[0].name, tag1);
-
-	/* test - duplicate registration */
-	_status_preinit (status);
-	tag_ = SH_Validator_register_tag (validator, tag1, &status);
-	ck_assert_int_eq (tag_, tag);
-	ck_assert_int_eq (SUCCESS, status.status);
-
-	ck_assert_int_eq (validator->tag_n, 1);
-	ck_assert_int_eq (validator->last_tag, tag);
-
-	ck_assert_int_eq (validator->tags[0].id, tag);
-	ck_assert_str_eq (validator->tags[0].name, tag1);
-
-	/* test - order */
-	_status_preinit (status);
-	tag = SH_Validator_register_tag (validator, tag3, &status);
-	ck_assert_int_eq (tag, 2);
-	ck_assert_int_eq (status.status, SUCCESS);
-
-	_status_preinit (status);
-	tag = SH_Validator_register_tag (validator, tag4, &status);
-	ck_assert_int_eq (tag, 3);
-	ck_assert_int_eq (status.status, SUCCESS);
-
-	_status_preinit (status);
-	tag = SH_Validator_register_tag (validator, tag5, &status);
-	ck_assert_int_eq (tag, 4);
-	ck_assert_int_eq (status.status, SUCCESS);
-
-	ck_assert_int_eq (validator->tag_n, 4);
-
-	ck_assert_str_eq (validator->tags[0].name, tag3);
-	ck_assert_str_eq (validator->tags[1].name, tag1);
-	ck_assert_str_eq (validator->tags[2].name, tag5);
-	ck_assert_str_eq (validator->tags[3].name, tag4);
-
-	/* test - overflow detection */
-	/* make method fail by filling with garbage until
-	 * upper boundary is reached */
-
-	/* ensure enough space  inside string*/
-	/* log10 +1 = number length */
-	/* +3 "tag" */
-	/* +1 '\0' */
-	/* = +5 */
-	tagN = calloc (((int) floor (log10 ((double) SIZE_MAX))) + 5,
-		       sizeof (char));
-
-	/* fill with garbage */
-	do
-	{
-		sprintf (tagN, "tag%zu", validator->tag_n);
-	}
-	while (TAG_ERR != SH_Validator_register_tag (validator, tagN, NULL));
-
-	free (tagN);
-
-	/* test overflow #1 */
-	_status_preinit (status);
-	tag = SH_Validator_register_tag (validator, tag2, &status);
-	ck_assert_int_eq (TAG_ERR, tag);
-	ck_assert_int_eq (E_DOMAIN, status.status);
-
-	ck_assert_int_eq (validator->tag_n, 10);
-
-	/* test overflow #2 */
-	validator->tag_n = 1;
-	validator->last_tag = TAG_MAX;
-
-	_status_preinit (status);
-	tag = SH_Validator_register_tag (validator, tag2, &status);
-	ck_assert_int_eq (TAG_ERR, tag);
-	ck_assert_int_eq (E_DOMAIN, status.status);
-
-	ck_assert_int_eq (validator->tag_n, 1);
-	ck_assert_int_eq (validator->last_tag, TAG_MAX);
-
-	/* cleanup */
-	/* also free garbage created for overflow test */
-	validator->tag_n = 10;
-	SH_Validator_free (validator);
-}
-
-START_TEST(test_validator_tag_check)
-{
-	struct SH_Validator * validator;
-	const char * tag1  = "html";
-	const char * tag2  = "html";
-	const char * tag3  = "head";
-	Tag tag;
-	bool result;
-
-	/* setup */
-	validator = SH_Validator_new (NULL);
-	ck_assert_ptr_ne (NULL, validator);
-
-	tag = SH_Validator_register_tag (validator, tag1, NULL);
-	ck_assert_int_ne (TAG_ERR, tag);
-
-	/* test */
-	result = SH_Validator_check_tag (validator, tag1);
-	ck_assert_int_eq (TRUE, result);
-
-	result = SH_Validator_check_tag (validator, tag2);
-	ck_assert_int_eq (TRUE, result);
-
-	result = SH_Validator_check_tag (validator, tag3);
-	ck_assert_int_eq (FALSE, result);
-
 	/* cleanup */
 	SH_Validator_free (validator);
 }
@@ -395,9 +109,6 @@ Suite * validator_suite (void)
 	tcase_add_test (tc_core, test_validator_with_status);
 	tcase_add_test (tc_core, test_validator_spec_no_status);
 	tcase_add_test (tc_core, test_validator_spec_with_status);
-	tcase_add_test (tc_core, test_validator_tag_register_no_status);
-	tcase_add_test (tc_core, test_validator_tag_register_with_status);
-	tcase_add_test (tc_core, test_validator_tag_check);
 	suite_add_tcase (s, tc_core);
 
 	return s;
diff --git a/tests/test_validator_tag.c b/tests/test_validator_tag.c
new file mode 100644
index 0000000000000000000000000000000000000000..635c11902718f91210f541afd8a088731c1d9af1
--- /dev/null
+++ b/tests/test_validator_tag.c
@@ -0,0 +1,421 @@
+/*
+ * test_validator_tag.c
+ *
+ * Copyright 2023 Jonathan Schöbel <jonathan@xn--schbel-yxa.info>
+ *
+ * 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 <check.h>
+#include <math.h>
+#include <stdbool.h>
+#include <stdio.h>
+#include <stdlib.h>
+
+
+/* lower SIZE_MAX as we try to reach it */
+#include <limits.h>
+#undef SIZE_MAX
+#define SIZE_MAX 10 * sizeof (struct tag_info)
+
+#include "macro.h"
+#include "status.h"
+
+/* override HTML spec */
+#include "validator_html.h"
+const struct HTML_TAG_DEFINITION HTML_[] = {
+	{"html"},
+	{"aside"},
+	{"html"},
+	{"body"}
+};
+#define HTML5 HTML_
+
+/* C file is needed, because we want to override SIZE_MAX */
+#include "validator.c"
+
+
+START_TEST(test_validator_no_status)
+{
+	struct SH_Validator * validator;
+
+	validator = SH_Validator_new (NULL);
+	ck_assert_ptr_ne (NULL, validator);
+
+	ck_assert_int_eq (0, validator->tag_n);
+	ck_assert_int_eq (TAG_ERR, validator->last_tag);
+
+	SH_Validator_free (validator);
+}
+END_TEST
+
+START_TEST(test_validator_with_status)
+{
+	struct SH_Status status;
+	struct SH_Validator * validator;
+
+	_status_preinit (status);
+	validator = SH_Validator_new (&status);
+	ck_assert_ptr_ne (NULL, validator);
+	ck_assert_int_eq (status.status, SUCCESS);
+
+	ck_assert_int_eq (0, validator->tag_n);
+	ck_assert_int_eq (TAG_ERR, validator->last_tag);
+
+	SH_Validator_free (validator);
+}
+END_TEST
+
+START_TEST(test_validator_spec_no_status)
+{
+	struct SH_Validator * validator;
+
+	/* test */
+	validator = SH_Validator_new_html5 (NULL);
+	ck_assert_ptr_ne (NULL, validator);
+
+	ck_assert_ptr_ne (NULL, validator->tags);
+	ck_assert_int_eq (3, validator->tag_n);
+	ck_assert_int_eq (3, validator->last_tag);
+
+	ck_assert_int_eq (1, validator->tags[0].id);
+	ck_assert_ptr_ne (HTML_[1].tag, validator->tags[0].name);
+	ck_assert_str_eq (HTML_[1].tag, validator->tags[0].name);
+
+	ck_assert_int_eq (2, validator->tags[1].id);
+	ck_assert_ptr_ne (HTML_[3].tag, validator->tags[1].name);
+	ck_assert_str_eq (HTML_[3].tag, validator->tags[1].name);
+
+	ck_assert_int_eq (3, validator->tags[2].id);
+	ck_assert_ptr_ne (HTML_[0].tag, validator->tags[2].name);
+	ck_assert_str_eq (HTML_[0].tag, validator->tags[2].name);
+
+	/* cleanup */
+	SH_Validator_free (validator);
+}
+END_TEST
+
+START_TEST(test_validator_spec_with_status)
+{
+	struct SH_Status status;
+	struct SH_Validator * validator;
+
+	/* test */
+	_status_preinit (status);
+	validator = SH_Validator_new_html5 (&status);
+	ck_assert_ptr_ne (NULL, validator);
+	ck_assert_int_eq (SUCCESS, status.status);
+
+	ck_assert_ptr_ne (NULL, validator->tags);
+	ck_assert_int_eq (3, validator->tag_n);
+	ck_assert_int_eq (3, validator->last_tag);
+
+	ck_assert_int_eq (1, validator->tags[0].id);
+	ck_assert_ptr_ne (HTML_[1].tag, validator->tags[0].name);
+	ck_assert_str_eq (HTML_[1].tag, validator->tags[0].name);
+
+	ck_assert_int_eq (2, validator->tags[1].id);
+	ck_assert_ptr_ne (HTML_[3].tag, validator->tags[1].name);
+	ck_assert_str_eq (HTML_[3].tag, validator->tags[1].name);
+
+	ck_assert_int_eq (3, validator->tags[2].id);
+	ck_assert_ptr_ne (HTML_[0].tag, validator->tags[2].name);
+	ck_assert_str_eq (HTML_[0].tag, validator->tags[2].name);
+
+	/* cleanup */
+	SH_Validator_free (validator);
+}
+END_TEST
+
+START_TEST(test_validator_tag_register_no_status)
+{
+	struct SH_Validator * validator;
+	const char * tag1 = "html";
+	const char * tag2 = "head";
+	const char * tag3 = "article";
+	const char * tag4 = "p";
+	const char * tag5 = "img";
+	char * tagN;
+	Tag tag;
+	Tag tag_;
+
+	/* setup */
+	validator = SH_Validator_new (NULL);
+	ck_assert_ptr_ne (NULL, validator);
+
+	/* test - register */
+	tag = SH_Validator_register_tag (validator, tag1, NULL);
+	ck_assert_int_eq (1, tag);
+
+	ck_assert_int_eq (validator->tag_n, 1);
+	ck_assert_int_eq (validator->last_tag, tag);
+
+	ck_assert_int_eq (validator->tags[0].id, tag);
+	ck_assert_str_eq (validator->tags[0].name, tag1);
+
+	/* test - duplicate registration */
+	tag_ = SH_Validator_register_tag (validator, tag1, NULL);
+	ck_assert_int_eq (tag_, tag);
+
+	ck_assert_int_eq (validator->tag_n, 1);
+	ck_assert_int_eq (validator->last_tag, tag);
+
+	ck_assert_int_eq (validator->tags[0].id, tag);
+	ck_assert_str_eq (validator->tags[0].name, tag1);
+
+	/* test - order */
+	tag = SH_Validator_register_tag (validator, tag3, NULL);
+	ck_assert_int_eq (tag, 2);
+
+	tag = SH_Validator_register_tag (validator, tag4, NULL);
+	ck_assert_int_eq (tag, 3);
+
+	tag = SH_Validator_register_tag (validator, tag5, NULL);
+	ck_assert_int_eq (tag, 4);
+
+	ck_assert_int_eq (validator->tag_n, 4);
+
+	ck_assert_str_eq (validator->tags[0].name, tag3);
+	ck_assert_str_eq (validator->tags[1].name, tag1);
+	ck_assert_str_eq (validator->tags[2].name, tag5);
+	ck_assert_str_eq (validator->tags[3].name, tag4);
+
+	/* test - overflow detection */
+	/* make method fail by filling with garbage until
+	 * upper boundary is reached */
+
+	/* ensure enough space  inside string*/
+	/* log10 +1 = number length */
+	/* +3 "tag" */
+	/* +1 '\0' */
+	/* = +5 */
+	tagN = calloc (((int) floor (log10 ((double) SIZE_MAX))) + 5,
+		       sizeof (char));
+
+	/* fill with garbage */
+	do
+	{
+		sprintf (tagN, "tag%zu", validator->tag_n);
+	}
+	while (TAG_ERR != SH_Validator_register_tag (validator, tagN, NULL));
+
+	free (tagN);
+
+	/* test overflow #1 */
+	tag = SH_Validator_register_tag (validator, tag2, NULL);
+	ck_assert_int_eq (TAG_ERR, tag);
+
+	ck_assert_int_eq (validator->tag_n, 10);
+
+	/* test overflow #2 */
+	validator->tag_n = 1;
+	validator->last_tag = TAG_MAX;
+
+	tag = SH_Validator_register_tag (validator, tag2, NULL);
+	ck_assert_int_eq (TAG_ERR, tag);
+
+	ck_assert_int_eq (validator->tag_n, 1);
+	ck_assert_int_eq (validator->last_tag, TAG_MAX);
+
+	/* cleanup */
+	/* also free garbage created for overflow test */
+	validator->tag_n = 10;
+	SH_Validator_free (validator);
+}
+
+START_TEST(test_validator_tag_register_with_status)
+{
+	struct SH_Status status;
+	struct SH_Validator * validator;
+	const char * tag1 = "html";
+	const char * tag2 = "head";
+	const char * tag3 = "article";
+	const char * tag4 = "p";
+	const char * tag5 = "img";
+	char * tagN;
+	Tag tag;
+	Tag tag_;
+
+	/* setup */
+	validator = SH_Validator_new (NULL);
+	ck_assert_ptr_ne (NULL, validator);
+
+	/* test - register */
+	_status_preinit (status);
+	tag = SH_Validator_register_tag (validator, tag1, &status);
+	ck_assert_int_eq (1, tag);
+	ck_assert_int_eq (SUCCESS, status.status);
+
+	ck_assert_int_eq (validator->tag_n, 1);
+	ck_assert_int_eq (validator->last_tag, tag);
+
+	ck_assert_int_eq (validator->tags[0].id, tag);
+	ck_assert_str_eq (validator->tags[0].name, tag1);
+
+	/* test - duplicate registration */
+	_status_preinit (status);
+	tag_ = SH_Validator_register_tag (validator, tag1, &status);
+	ck_assert_int_eq (tag_, tag);
+	ck_assert_int_eq (SUCCESS, status.status);
+
+	ck_assert_int_eq (validator->tag_n, 1);
+	ck_assert_int_eq (validator->last_tag, tag);
+
+	ck_assert_int_eq (validator->tags[0].id, tag);
+	ck_assert_str_eq (validator->tags[0].name, tag1);
+
+	/* test - order */
+	_status_preinit (status);
+	tag = SH_Validator_register_tag (validator, tag3, &status);
+	ck_assert_int_eq (tag, 2);
+	ck_assert_int_eq (status.status, SUCCESS);
+
+	_status_preinit (status);
+	tag = SH_Validator_register_tag (validator, tag4, &status);
+	ck_assert_int_eq (tag, 3);
+	ck_assert_int_eq (status.status, SUCCESS);
+
+	_status_preinit (status);
+	tag = SH_Validator_register_tag (validator, tag5, &status);
+	ck_assert_int_eq (tag, 4);
+	ck_assert_int_eq (status.status, SUCCESS);
+
+	ck_assert_int_eq (validator->tag_n, 4);
+
+	ck_assert_str_eq (validator->tags[0].name, tag3);
+	ck_assert_str_eq (validator->tags[1].name, tag1);
+	ck_assert_str_eq (validator->tags[2].name, tag5);
+	ck_assert_str_eq (validator->tags[3].name, tag4);
+
+	/* test - overflow detection */
+	/* make method fail by filling with garbage until
+	 * upper boundary is reached */
+
+	/* ensure enough space  inside string*/
+	/* log10 +1 = number length */
+	/* +3 "tag" */
+	/* +1 '\0' */
+	/* = +5 */
+	tagN = calloc (((int) floor (log10 ((double) SIZE_MAX))) + 5,
+		       sizeof (char));
+
+	/* fill with garbage */
+	do
+	{
+		sprintf (tagN, "tag%zu", validator->tag_n);
+	}
+	while (TAG_ERR != SH_Validator_register_tag (validator, tagN, NULL));
+
+	free (tagN);
+
+	/* test overflow #1 */
+	_status_preinit (status);
+	tag = SH_Validator_register_tag (validator, tag2, &status);
+	ck_assert_int_eq (TAG_ERR, tag);
+	ck_assert_int_eq (E_DOMAIN, status.status);
+
+	ck_assert_int_eq (validator->tag_n, 10);
+
+	/* test overflow #2 */
+	validator->tag_n = 1;
+	validator->last_tag = TAG_MAX;
+
+	_status_preinit (status);
+	tag = SH_Validator_register_tag (validator, tag2, &status);
+	ck_assert_int_eq (TAG_ERR, tag);
+	ck_assert_int_eq (E_DOMAIN, status.status);
+
+	ck_assert_int_eq (validator->tag_n, 1);
+	ck_assert_int_eq (validator->last_tag, TAG_MAX);
+
+	/* cleanup */
+	/* also free garbage created for overflow test */
+	validator->tag_n = 10;
+	SH_Validator_free (validator);
+}
+
+START_TEST(test_validator_tag_check)
+{
+	struct SH_Validator * validator;
+	const char * tag1  = "html";
+	const char * tag2  = "html";
+	const char * tag3  = "head";
+	Tag tag;
+	bool result;
+
+	/* setup */
+	validator = SH_Validator_new (NULL);
+	ck_assert_ptr_ne (NULL, validator);
+
+	tag = SH_Validator_register_tag (validator, tag1, NULL);
+	ck_assert_int_ne (TAG_ERR, tag);
+
+	/* test */
+	result = SH_Validator_check_tag (validator, tag1);
+	ck_assert_int_eq (TRUE, result);
+
+	result = SH_Validator_check_tag (validator, tag2);
+	ck_assert_int_eq (TRUE, result);
+
+	result = SH_Validator_check_tag (validator, tag3);
+	ck_assert_int_eq (FALSE, result);
+
+	/* cleanup */
+	SH_Validator_free (validator);
+}
+END_TEST
+
+Suite * test_suite (void)
+{
+	Suite *s;
+	TCase *tc_core;
+
+	s = suite_create ("Testsuite SeFHT Validator Tag");
+
+	/* Core test case */
+	tc_core = tcase_create ("Core");
+
+	tcase_add_test (tc_core, test_validator_no_status);
+	tcase_add_test (tc_core, test_validator_with_status);
+	tcase_add_test (tc_core, test_validator_spec_no_status);
+	tcase_add_test (tc_core, test_validator_spec_with_status);
+	tcase_add_test (tc_core, test_validator_tag_register_no_status);
+	tcase_add_test (tc_core, test_validator_tag_register_with_status);
+	tcase_add_test (tc_core, test_validator_tag_check);
+	suite_add_tcase (s, tc_core);
+
+	return s;
+}
+
+int main (void)
+{
+	int number_failed;
+	Suite *s;
+	SRunner *sr;
+
+	s = test_suite ();
+	sr = srunner_create (s);
+
+	srunner_run_all (sr, CK_NORMAL);
+	number_failed = srunner_ntests_failed (sr);
+	srunner_free (sr);
+
+	return (number_failed == 0) ? EXIT_SUCCESS : EXIT_FAILURE;
+}
+