diff --git a/sefht.geany b/sefht.geany
index 39bd9158495e11cfb98f05ad454f391effabb24d..f5df0230f46418b43bbb7b664df37c95d743ea94 100644
--- a/sefht.geany
+++ b/sefht.geany
@@ -28,15 +28,15 @@ long_line_behaviour=1
 long_line_column=72
 
 [files]
-current_page=4
+current_page=6
 FILE_NAME_0=923;Sh;0;EUTF-8;1;1;0;%2Fhome%2Fjonathan%2FDokumente%2Fprojekte%2Fprgm%2Finternet%2Fweb%2FSeFHT%2Fconfigure.ac;0;8
 FILE_NAME_1=73;Make;0;EUTF-8;1;1;0;%2Fhome%2Fjonathan%2FDokumente%2Fprojekte%2Fprgm%2Finternet%2Fweb%2FSeFHT%2Fsrc%2FMakefile.am;0;8
 FILE_NAME_2=1143;C;0;EUTF-8;1;1;0;%2Fhome%2Fjonathan%2FDokumente%2Fprojekte%2Fprgm%2Finternet%2Fweb%2FSeFHT%2Fsrc%2Fmain.c;0;8
 FILE_NAME_3=640;Make;0;EUTF-8;1;1;0;%2Fhome%2Fjonathan%2FDokumente%2Fprojekte%2Fprgm%2Finternet%2Fweb%2FSeFHT%2Fsrc%2Flib%2FMakefile.am;0;8
 FILE_NAME_4=1593;C;0;EUTF-8;1;1;0;%2Fhome%2Fjonathan%2FDokumente%2Fprojekte%2Fprgm%2Finternet%2Fweb%2FSeFHT%2Fsrc%2Flib%2Fsefht%2Fcms.c;0;8
 FILE_NAME_5=1395;C;0;EUTF-8;1;1;0;%2Fhome%2Fjonathan%2FDokumente%2Fprojekte%2Fprgm%2Finternet%2Fweb%2FSeFHT%2Fsrc%2Flib%2Fsefht%2Fcms.h;0;8
-FILE_NAME_6=4511;C;0;EUTF-8;1;1;0;%2Fhome%2Fjonathan%2FDokumente%2Fprojekte%2Fprgm%2Finternet%2Fweb%2FSeFHT%2Fsrc%2Flib%2Fsefht%2Fdata.c;0;8
-FILE_NAME_7=1145;C;0;EUTF-8;1;1;0;%2Fhome%2Fjonathan%2FDokumente%2Fprojekte%2Fprgm%2Finternet%2Fweb%2FSeFHT%2Fsrc%2Flib%2Fsefht%2Fdata.h;0;8
+FILE_NAME_6=2921;C;0;EUTF-8;1;1;0;%2Fhome%2Fjonathan%2FDokumente%2Fprojekte%2Fprgm%2Finternet%2Fweb%2FSeFHT%2Fsrc%2Flib%2Fsefht%2Fdata.c;0;8
+FILE_NAME_7=1583;C;0;EUTF-8;1;1;0;%2Fhome%2Fjonathan%2FDokumente%2Fprojekte%2Fprgm%2Finternet%2Fweb%2FSeFHT%2Fsrc%2Flib%2Fsefht%2Fdata.h;0;8
 FILE_NAME_8=1733;C;0;EUTF-8;1;1;0;%2Fhome%2Fjonathan%2FDokumente%2Fprojekte%2Fprgm%2Finternet%2Fweb%2FSeFHT%2Fsrc%2Flib%2Fsefht%2Ffragment.c;0;8
 FILE_NAME_9=2164;C;0;EUTF-8;1;1;0;%2Fhome%2Fjonathan%2FDokumente%2Fprojekte%2Fprgm%2Finternet%2Fweb%2FSeFHT%2Fsrc%2Flib%2Fsefht%2Ffragment.h;0;8
 FILE_NAME_10=1296;C;0;EUTF-8;1;1;0;%2Fhome%2Fjonathan%2FDokumente%2Fprojekte%2Fprgm%2Finternet%2Fweb%2FSeFHT%2Fsrc%2Flib%2Fsefht%2Fnode_fragment.c;0;8
@@ -47,7 +47,7 @@ FILE_NAME_14=1212;C;0;EUTF-8;1;1;0;%2Fhome%2Fjonathan%2FDokumente%2Fprojekte%2Fp
 FILE_NAME_15=1260;C;0;EUTF-8;1;1;0;%2Fhome%2Fjonathan%2FDokumente%2Fprojekte%2Fprgm%2Finternet%2Fweb%2FSeFHT%2Fsrc%2Flib%2Fsefht%2Fvalidator.h;0;8
 FILE_NAME_16=1466;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_17=1135;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_18=1361;C;0;EUTF-8;1;1;0;%2Fhome%2Fjonathan%2FDokumente%2Fprojekte%2Fprgm%2Finternet%2Fweb%2FSeFHT%2Fsrc%2Flib%2Fsefht%2Fstatus.h;0;8
+FILE_NAME_18=4304;C;0;EUTF-8;1;1;0;%2Fhome%2Fjonathan%2FDokumente%2Fprojekte%2Fprgm%2Finternet%2Fweb%2FSeFHT%2Fsrc%2Flib%2Fsefht%2Fstatus.h;0;8
 FILE_NAME_19=1017;C;0;EUTF-8;1;1;0;%2Fhome%2Fjonathan%2FDokumente%2Fprojekte%2Fprgm%2Finternet%2Fweb%2FSeFHT%2Fsrc%2Flib%2Fsefht%2Flog.h;0;4
 FILE_NAME_20=1077;C;0;EUTF-8;1;1;0;%2Fhome%2Fjonathan%2FDokumente%2Fprojekte%2Fprgm%2Finternet%2Fweb%2FSeFHT%2Fsrc%2Flib%2Fsefht%2Fmacro.h;0;8
 FILE_NAME_21=937;C;0;EUTF-8;1;1;0;%2Fhome%2Fjonathan%2FDokumente%2Fprojekte%2Fprgm%2Finternet%2Fweb%2FSeFHT%2Fsrc%2Flib%2Fsefht%2Fsefht.h;0;8
diff --git a/src/lib/sefht/data.c b/src/lib/sefht/data.c
index df206e0878b6148542351d975fc6a251b4779aba..4c3da9327d3c997bdd1f3944ec137c339728c605 100644
--- a/src/lib/sefht/data.c
+++ b/src/lib/sefht/data.c
@@ -37,8 +37,6 @@
 #include "data.h"
 
 
-#define NEXT_PAGE(page) page++
-
 struct SH_Page
 {
 	page_t id;
@@ -47,19 +45,53 @@ struct SH_Page
 
 struct SH_Data
 {
-	struct SH_Validator * validator;
+	SH_Validator * validator;
 	size_t page_n;
 	struct SH_Page * pages;
 	page_t last_page;
 };
 
 
-static inline bool init_validator (struct SH_Data * data,
-                                   struct SH_Status * status);
-static inline void init_pages (struct SH_Data * data);
+static inline
+page_t
+next_page (struct SH_Data * data)
+	/*@*/
+{
+	if (data->last_page == PAGE_MAX)
+	{
+		return PAGE_ERR;
+	}
+	return data->last_page + 1;
+}
 
+static inline
+bool
+init_validator (/*@special@*/ struct SH_Data * data,
+                /*@null@*/ /*@out@*/ struct SH_Status * status)
+	/*@allocates data->validator@*/
+	/*@defines *(data->validator)@*/
+	/*@globals fileSystem@*/
+	/*@modifies fileSystem@*/
+	/*@modifies status@*/;
+
+static inline
+void
+init_pages (/*@special@*/ struct SH_Data * data)
+	/*@allocates data->pages@*/
+	/*@defines data->page_n,
+	 *         data->last_page@*/
+	/*@modifies data->page_n@*/
+	/*@modifies data->pages@*/
+	/*@modifies data->last_page@*/;
+
+/*@null@*/
+/*@only@*/
 struct SH_Data *
-SH_Data_new (struct SH_Status * status)
+SH_Data_new (/*@out@*/ /*@null@*/ struct SH_Status * status)
+	/*@globals fileSystem@*/
+	/*@modifies fileSystem@*/
+	/*@modifies status@*/
+
 {
 	struct SH_Data * data;
 	data = malloc (sizeof (struct SH_Data));
@@ -74,6 +106,12 @@ SH_Data_new (struct SH_Status * status)
 
 	if (!init_validator (data, status))
 	{
+
+/* dangerous call to silence splint, should never be executed. */
+#ifdef S_SPLINT_S
+		free (data->validator);
+#endif
+
 		free (data);
 
 		return NULL;
@@ -82,15 +120,28 @@ SH_Data_new (struct SH_Status * status)
 	init_pages (data);
 
 	set_success (status);
-
 	return data;
 }
 
-static inline void free_validator (struct SH_Data * data);
-static inline void free_pages (struct SH_Data * data);
+static inline
+void
+free_validator (/*@special@*/ struct SH_Data * data)
+	/*@modifies data->validator@*/
+	/*@releases data->validator@*/;
 
+static inline
 void
-SH_Data_free (struct SH_Data * data)
+free_pages (/*@special@*/ struct SH_Data * data)
+	/*@modifies data->pages@*/
+	/*@releases data->pages@*/
+	/*@requires maxRead(data->pages) == (data->page_n - 1)@*/;
+
+void
+SH_Data_free (/*@only@*/ struct SH_Data * data)
+	/*@modifies data->validator@*/
+	/*@modifies data->pages@*/
+	/*@modifies data@*/
+	/*@releases data@*/
 {
 	free_validator (data);
 	free_pages (data);
@@ -100,8 +151,15 @@ SH_Data_free (struct SH_Data * data)
 	return;
 }
 
-static inline bool
-init_validator (struct SH_Data * data, struct SH_Status * status)
+static inline
+bool
+init_validator (struct SH_Data * data,
+                /*@out@*/ /*@null@*/ struct SH_Status * status)
+	/*@allocates data->validator@*/
+	/*@defines *(data->validator)@*/
+	/*@globals fileSystem@*/
+	/*@modifies fileSystem@*/
+	/*@modifies status@*/
 {
 	data->validator = SH_Validator_new (status);
 
@@ -138,15 +196,25 @@ init_validator (struct SH_Data * data, struct SH_Status * status)
 	return TRUE;
 }
 
-static inline void
-free_validator (struct SH_Data * data)
+static inline
+void
+free_validator (/*@special@*/ struct SH_Data * data)
+	/*@modifies data->validator@*/
+	/*@releases data->validator@*/
 {
 	SH_Validator_free (data->validator);
 	return;
 }
 
-static inline void
-init_pages (struct SH_Data * data)
+static inline
+void
+init_pages (/*@special@*/ struct SH_Data * data)
+	/*@allocates data->pages@*/
+	/*@defines data->page_n,
+	 *         data->last_page@*/
+	/*@modifies data->page_n@*/
+	/*@modifies data->pages@*/
+	/*@modifies data->last_page@*/
 {
 	data->page_n = 0;
 	data->pages = malloc (0);
@@ -155,8 +223,12 @@ init_pages (struct SH_Data * data)
 	return;
 }
 
-static inline void
-free_pages (struct SH_Data * data)
+static inline
+void
+free_pages (/*@special@*/ struct SH_Data * data)
+	/*@modifies data->pages@*/
+	/*@releases data->pages@*/
+	/*@requires maxRead(data->pages) == (data->page_n - 1)@*/
 {
 	size_t index;
 
@@ -172,9 +244,21 @@ free_pages (struct SH_Data * data)
 page_t
 SH_Data_register_page (struct SH_Data * data, const char * name,
                        struct SH_Status * status)
+	/*@modifies data->page_n@*/
+	/*@modifies data->pages@*/
+	/*@modifies data->last_page@*/
+	/*@requires maxRead(data->pages) == (data->page_n - 1)@*/
+	/*@ensures maxRead(data->pages) == (data->page_n - 1)@*/
+	/*@globals fileSystem@*/
+	/*@modifies fileSystem@*/
+	/*@modifies status@*/
 {
+	struct SH_Page * new_pages;
+	page_t page_id;
+
+	page_id = next_page (data);
 	/* abort on overflow */
-	if ((data->last_page == PAGE_MAX) || (data->page_n == SIZE_MAX))
+	if ((page_id == PAGE_ERR) || (data->page_n == SIZE_MAX))
 	{
 		set_status (status, E_DOMAIN, 0,
 		            "Maximum number of pages reached.\n");
@@ -182,31 +266,38 @@ SH_Data_register_page (struct SH_Data * data, const char * name,
 		return PAGE_ERR;
 	}
 
-	data->pages = realloc (data->pages,
-	                       sizeof (struct SH_Page)
-	                       * (data->page_n + 1));
+	new_pages = realloc (data->pages,
+	                     sizeof (struct SH_Page)
+	                     * (data->page_n + 1));
 
-	if (data->pages == NULL)
+	if (new_pages == NULL)
 	{
 		set_status (status, E_ALLOC, 5,
 		           "Memory allocation for page data failed.\n");
 
+/* bad code to silence splint, should never be executed. */
+#ifdef S_SPLINT_S
+		data->pages = (void *) 0x12345;
+#endif
+
 		return PAGE_ERR;
 	}
 
-	NEXT_PAGE(data->last_page);
-
-	data->pages[data->page_n].id = data->last_page;
-	data->pages[data->page_n].name = strdup (name);
+	new_pages[data->page_n].id = page_id;
+	new_pages[data->page_n].name = strdup (name);
 
-	if (data->pages[data->page_n].name == NULL)
+	if (new_pages[data->page_n].name == NULL)
 	{
 		set_status (status, E_ALLOC, 4,
 		           "Memory allocation for page data failed.\n");
 
+		data->pages = new_pages;
 		return PAGE_ERR;
 	}
 
+	/* commit changes */
+	data->pages = new_pages;
+	data->last_page = page_id;
 	data->page_n++;
 
 	set_success (status);
diff --git a/src/lib/sefht/data.h b/src/lib/sefht/data.h
index fd5d702d2b8b92b6da450f8acf9899680e139c0f..8cda0c5f2b1f97ac8e8ace78bc7d21e65b2dd838 100644
--- a/src/lib/sefht/data.h
+++ b/src/lib/sefht/data.h
@@ -36,22 +36,33 @@
 #include "validator.h"
 
 
-typedef unsigned int page_t;
+typedef /*@abstract@*/ unsigned int page_t;
 #define PAGE_ERR 0
 #define PAGE_MIN 1
 #define PAGE_MAX UINT_MAX
 
-typedef struct SH_Data SH_Data;
+typedef /*@abstract@*/ struct SH_Data SH_Data;
 
 
+/*@null@*/
+/*@only@*/
 SH_Data *
-SH_Data_new (struct SH_Status * status);
+SH_Data_new (/*@out@*/ /*@null@*/ struct SH_Status * status)
+	/*@globals fileSystem@*/
+	/*@modifies fileSystem@*/
+	/*@modifies status@*/;
 
 void
-SH_Data_free (SH_Data * data);
+SH_Data_free (/*@only@*/ struct SH_Data * data)
+	/*@modifies data@*/
+	/*@releases data@*/;
 
 page_t
 SH_Data_register_page (SH_Data * data, const char * name,
-                       struct SH_Status * status);
+                       struct SH_Status * status)
+	/*@modifies data@*/
+	/*@globals fileSystem@*/
+	/*@modifies fileSystem@*/
+	/*@modifies status@*/;
 
 #endif /* __DATA_H__ */
diff --git a/src/lib/sefht/status.h b/src/lib/sefht/status.h
index 3d7266dc59871bc8ca89a9bfd78c8fbfe0a643d2..0cc1dcb0575bfe8c1b59baeed5b75d193f43e602 100644
--- a/src/lib/sefht/status.h
+++ b/src/lib/sefht/status.h
@@ -28,6 +28,7 @@
 #include <errno.h>
 #include <string.h>
 
+#include "macro.h"
 
 #if !defined (__SEFHT_H_INSIDE__) && !defined (LIB_SEFHT_COMPILATION)
 #error "Only <sefht/sefht.h> can be included directly."
@@ -53,7 +54,7 @@ do                                                                     \
 		STATUS->errno_ = (ERROR == SUCCESS) ? 0: errno;        \
 		STATUS->file = __FILE__;                               \
 		STATUS->function = __FUNCTION__;                       \
-		STATUS->line = __LINE__ - OFFSET;                      \
+		STATUS->line = (unsigned long) (__LINE__ - OFFSET);    \
 		STATUS->message = MESSAGE;                             \
 	};                                                             \
                                                                        \
@@ -62,7 +63,7 @@ do                                                                     \
 		ERROR1 (MESSAGE);                                      \
 	}                                                              \
 }                                                                      \
-while (0)
+while (FALSE)
 
 #define set_status_(STATUS, ERROR, OFFSET, LENGTH, MESSAGE, ...)       \
 do                                                                     \
@@ -73,7 +74,7 @@ do                                                                     \
 		STATUS->errno_ = (ERROR == SUCCESS) ? 0: errno;        \
 		STATUS->file = __FILE__;                               \
 		STATUS->function = __FUNCTION__;                       \
-		STATUS->line = __LINE__ - OFFSET;                      \
+		STATUS->line = (unsigned long) (__LINE__ - OFFSET);      \
 		STATUS->message = malloc (strlen(MESSAGE)+1 + LENGTH); \
 		if (STATUS->message == NULL)                           \
 		{                                                      \
@@ -86,7 +87,7 @@ do                                                                     \
                                                                        \
 	ERROR_ (MESSAGE, __VA_ARGS__);                                 \
 }                                                                      \
-while (0)
+while (FALSE)
 
 #define set_success(STATUS) set_status(STATUS, SUCCESS, 0, NULL)
 
@@ -107,13 +108,11 @@ struct SH_Status
 
 	int errno_;
 
-	const char * file;
-	const char * function;
+	/*@observer@*/ const char * file;
+	/*@observer@*/ const char * function;
 	unsigned long int line;
 
-	char * message;
+	/*@observer@*/ /*@null@*/ char * message;
 };
 
-typedef struct SH_Status SH_Status;
-
 #endif /* __STATUS_H__ */