diff --git a/sefht.geany b/sefht.geany
index 4efdebe7a98b6c1872fa7c2cbe59b43039728b79..f0c5e4df8050cbdd5ddaa9684f8ea0dca0a9aafc 100644
--- a/sefht.geany
+++ b/sefht.geany
@@ -28,7 +28,7 @@ long_line_behaviour=1
 long_line_column=72
 
 [files]
-current_page=54
+current_page=33
 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
@@ -61,8 +61,8 @@ FILE_NAME_28=1867;C;0;EUTF-8;1;1;0;%2Fhome%2Fjonathan%2FDokumente%2Fprojekte%2Fp
 FILE_NAME_29=3036;C;0;EUTF-8;1;1;0;%2Fhome%2Fjonathan%2FDokumente%2Fprojekte%2Fprgm%2Finternet%2Fweb%2FSeFHT%2Fsrc%2Flib%2Fsefht%2Fvalidator.c;0;8
 FILE_NAME_30=1159;C;0;EUTF-8;1;1;0;%2Fhome%2Fjonathan%2FDokumente%2Fprojekte%2Fprgm%2Finternet%2Fweb%2FSeFHT%2Fsrc%2Flib%2Fsefht%2Fvalidator.h;0;8
 FILE_NAME_31=1111;C;0;EUTF-8;1;1;0;%2Fhome%2Fjonathan%2FDokumente%2Fprojekte%2Fprgm%2Finternet%2Fweb%2FSeFHT%2Fsrc%2Flib%2Fsefht%2Fvalidator_html.h;0;8
-FILE_NAME_32=14059;C;0;EUTF-8;1;1;0;%2Fhome%2Fjonathan%2FDokumente%2Fprojekte%2Fprgm%2Finternet%2Fweb%2FSeFHT%2Fsrc%2Flib%2Fsefht%2Fvalidator_tag.c;0;8
-FILE_NAME_33=1148;C;0;EUTF-8;1;1;0;%2Fhome%2Fjonathan%2FDokumente%2Fprojekte%2Fprgm%2Finternet%2Fweb%2FSeFHT%2Fsrc%2Flib%2Fsefht%2Fvalidator_tag.h;0;8
+FILE_NAME_32=15982;C;0;EUTF-8;1;1;0;%2Fhome%2Fjonathan%2FDokumente%2Fprojekte%2Fprgm%2Finternet%2Fweb%2FSeFHT%2Fsrc%2Flib%2Fsefht%2Fvalidator_tag.c;0;8
+FILE_NAME_33=1600;C;0;EUTF-8;1;1;0;%2Fhome%2Fjonathan%2FDokumente%2Fprojekte%2Fprgm%2Finternet%2Fweb%2FSeFHT%2Fsrc%2Flib%2Fsefht%2Fvalidator_tag.h;0;8
 FILE_NAME_34=1124;C;0;EUTF-8;1;1;0;%2Fhome%2Fjonathan%2FDokumente%2Fprojekte%2Fprgm%2Finternet%2Fweb%2FSeFHT%2Fsrc%2Flib%2Fsefht%2Fvalidator_tag_data.h;0;8
 FILE_NAME_35=16395;C;0;EUTF-8;1;1;0;%2Fhome%2Fjonathan%2FDokumente%2Fprojekte%2Fprgm%2Finternet%2Fweb%2FSeFHT%2Fsrc%2Flib%2Fsefht%2Fvalidator_attr.c;0;8
 FILE_NAME_36=1051;C;0;EUTF-8;1;1;0;%2Fhome%2Fjonathan%2FDokumente%2Fprojekte%2Fprgm%2Finternet%2Fweb%2FSeFHT%2Fsrc%2Flib%2Fsefht%2Fvalidator_attr.h;0;8
diff --git a/src/lib/sefht/validator_tag.c b/src/lib/sefht/validator_tag.c
index e52ca80278b22747d2db5be7278c596b6fe71319..7303fe524f1d93c1da96a8517e947f389fdea45b 100644
--- a/src/lib/sefht/validator_tag.c
+++ b/src/lib/sefht/validator_tag.c
@@ -91,6 +91,12 @@ copy_tags (/*@special@*/ struct SH_Validator * copy,
 	/*@modifies fileSystem@*/
 	/*@modifies status@*/;
 
+static inline
+void
+free_tag (struct tag_info tag)
+	/*@modifies tag.name@*/
+	/*@releases tag.name@*/;
+
 static inline
 void
 free_tags (/*@special@*/ struct SH_Validator * validator)
@@ -148,7 +154,8 @@ get_tag_id_by_name (const struct SH_Validator * validator,
 
 static inline
 bool
-remove_tag (struct SH_Validator * validator, Tag id,
+remove_tag (struct SH_Validator * validator,
+            const size_t index,
             /*@null@*/ /*@out@*/ struct SH_Status * status)
 	/*@modifies validator->tag_n@*/
 	/*@modifies validator->tags@*/
@@ -353,6 +360,16 @@ copy_tags (/*@special@*/ struct SH_Validator * copy,
 	return TRUE;
 }
 
+static inline
+void
+free_tag (struct tag_info tag)
+	/*@modifies tag.name@*/
+	/*@releases tag.name@*/
+{
+	free (tag.name);
+	return;
+}
+
 static inline
 void
 free_tags (/*@special@*/ struct SH_Validator * validator)
@@ -363,7 +380,7 @@ free_tags (/*@special@*/ struct SH_Validator * validator)
 
 	for (index = 0; index < validator->tag_n; index++)
 	{
-		free (validator->tags[index].name);
+		free_tag (validator->tags[index]);
 	}
 
 	free (validator->tags);
@@ -577,7 +594,8 @@ remove_tag_for_all_attrs (struct SH_Validator * validator,
 
 static inline
 bool
-remove_tag (struct SH_Validator * validator, Tag id,
+remove_tag (struct SH_Validator * validator,
+            const size_t index,
             /*@null@*/ /*@out@*/ struct SH_Status * status)
 	/*@modifies validator->tag_n@*/
 	/*@modifies validator->tags@*/
@@ -586,62 +604,49 @@ remove_tag (struct SH_Validator * validator, Tag id,
 	/*@modifies fileSystem@*/
 	/*@modifies status@*/
 {
-	size_t index;
+	struct tag_info tag;
+	struct tag_info * new_tags;
 
-	#define tags validator->tags
-	#define tag_n validator->tag_n
-	for (index = 0; index < tag_n; index++)
-	if (id == tags[index].id)
+	/* preserve data, as realloc may fail */
+	tag = validator->tags[index];
+
+	/* clear all references of this tag */
+	if (!remove_tag_for_all_attrs (validator, tag.name, status))
 	{
-		struct tag_info * new_tags;
-		char * name;
+		return FALSE;
+	}
 
-		/* don't free name yet, as realloc may fail */
-		name = tags[index].name;
+	for (size_t i = index; i < validator->tag_n-1; i++)
+	{
+		validator->tags[i] = validator->tags[i+1];
+	}
 
-		/* clear all references of this tag */
-		if (!remove_tag_for_all_attrs (validator, name, status))
-		{
-			return FALSE;
-		}
+	new_tags = realloc (validator->tags, sizeof (struct tag_info)
+	                                     * (validator->tag_n - 1));
+	if (NULL == new_tags)
+	{
+		set_status (status, E_ALLOC, 3, "realloc failed");
 
-		for (size_t i = index; i < tag_n-1; i++)
+		for (size_t i = validator->tag_n-1; i > index; i++)
 		{
-			tags[i] = tags[i+1];
+			validator->tags[i] = validator->tags[i-1];
 		}
-
-		new_tags = realloc (tags, sizeof (struct tag_info)
-		                          * (tag_n - 1));
-		if (NULL == new_tags)
-		{
-			set_status (status, E_ALLOC, 3, "realloc failed");
-
-			for (size_t i = tag_n-1; i > index; i++)
-			{
-				tags[i] = tags[i-1];
-			}
-
+		validator->tags[index] = tag;
 /* bad code to silence splint, should never be executed. */
 #ifdef S_SPLINT_S
-			new_tags = (void *) 0x12345;
+		new_tags = (void *) 0x12345;
 #endif
 
-			return FALSE;
-		}
-
-		free (name);
+		return FALSE;
+	}
 
-		tags = new_tags;
-		tag_n--;
+	free_tag (tag);
 
-		set_success (status);
-		return TRUE;
-	}
-	#undef tags
-	#undef tag_n
+	validator->tags = new_tags;
+	validator->tag_n--;
 
-	set_status (status, E_VALUE, 44, "unknown Tag id");
-	return FALSE;
+	set_success (status);
+	return TRUE;
 }
 
 
@@ -682,7 +687,7 @@ SH_Validator_register_tag (struct SH_Validator * validator,
 
 bool
 SH_Validator_deregister_tag (struct SH_Validator * validator,
-                             Tag id,
+                             const char * tag,
                              /*@null@*/ /*@out@*/
                              struct SH_Status * status)
 	/*@modifies validator->tag_n@*/
@@ -692,5 +697,14 @@ SH_Validator_deregister_tag (struct SH_Validator * validator,
 	/*@modifies fileSystem@*/
 	/*@modifies status@*/
 {
-	return remove_tag (validator, id, status);
+	size_t index;
+
+	if (!find_tag (validator, tag, &index))
+	{
+		/* TODO: define whether this is an error */
+		set_status (status, E_VALUE, 3, "no such tag");
+		return FALSE;
+	}
+
+	return remove_tag (validator, index, status);
 }
diff --git a/src/lib/sefht/validator_tag.h b/src/lib/sefht/validator_tag.h
index 4ae4572feed4a84bf0bab7fe3c56bdd006f73b2f..be79311c660a016835d1fb6db98811fcdb33cf2c 100644
--- a/src/lib/sefht/validator_tag.h
+++ b/src/lib/sefht/validator_tag.h
@@ -55,7 +55,7 @@ SH_Validator_register_tag (SH_Validator * validator,
 
 bool
 SH_Validator_deregister_tag (SH_Validator * validator,
-                             Tag id,
+                             const char * tag,
                              /*@null@*/ /*@out@*/
                              struct SH_Status * status)
 	/*@modifies validator@*/