diff --git a/sefht.geany b/sefht.geany
index 9a1bbac47e91f4e8d970c9be6ca4d5b5bc13e9e3..c48d879dcdfb9d40f0f9413f5238dc0e305093fa 100644
--- a/sefht.geany
+++ b/sefht.geany
@@ -43,8 +43,8 @@ FILE_NAME_10=1550;C;0;EUTF-8;1;1;0;%2Fhome%2Fjonathan%2FDokumente%2Fprojekte%2Fp
 FILE_NAME_11=1562;C;0;EUTF-8;1;1;0;%2Fhome%2Fjonathan%2FDokumente%2Fprojekte%2Fprgm%2Finternet%2Fweb%2FSeFHT%2Fsrc%2Flib%2Fsefht%2Ffragment.h;0;8
 FILE_NAME_12=2022;C;0;EUTF-8;1;1;0;%2Fhome%2Fjonathan%2FDokumente%2Fprojekte%2Fprgm%2Finternet%2Fweb%2FSeFHT%2Fsrc%2Flib%2Fsefht%2Ffragment_data.c;0;8
 FILE_NAME_13=2558;C;0;EUTF-8;1;1;0;%2Fhome%2Fjonathan%2FDokumente%2Fprojekte%2Fprgm%2Finternet%2Fweb%2FSeFHT%2Fsrc%2Flib%2Fsefht%2Ffragment_class.c;0;8
-FILE_NAME_14=9423;C;0;EUTF-8;1;1;0;%2Fhome%2Fjonathan%2FDokumente%2Fprojekte%2Fprgm%2Finternet%2Fweb%2FSeFHT%2Fsrc%2Flib%2Fsefht%2Fnode_fragment.c;0;8
-FILE_NAME_15=6811;C;0;EUTF-8;1;1;0;%2Fhome%2Fjonathan%2FDokumente%2Fprojekte%2Fprgm%2Finternet%2Fweb%2FSeFHT%2Fsrc%2Flib%2Fsefht%2Fnode_fragment.h;0;8
+FILE_NAME_14=12922;C;0;EUTF-8;1;1;0;%2Fhome%2Fjonathan%2FDokumente%2Fprojekte%2Fprgm%2Finternet%2Fweb%2FSeFHT%2Fsrc%2Flib%2Fsefht%2Fnode_fragment.c;0;8
+FILE_NAME_15=6478;C;0;EUTF-8;1;1;0;%2Fhome%2Fjonathan%2FDokumente%2Fprojekte%2Fprgm%2Finternet%2Fweb%2FSeFHT%2Fsrc%2Flib%2Fsefht%2Fnode_fragment.h;0;8
 FILE_NAME_16=4590;C;0;EUTF-8;1;1;0;%2Fhome%2Fjonathan%2FDokumente%2Fprojekte%2Fprgm%2Finternet%2Fweb%2FSeFHT%2Fsrc%2Flib%2Fsefht%2Fattr.c;0;8
 FILE_NAME_17=2828;C;0;EUTF-8;1;1;0;%2Fhome%2Fjonathan%2FDokumente%2Fprojekte%2Fprgm%2Finternet%2Fweb%2FSeFHT%2Fsrc%2Flib%2Fsefht%2Fattr.h;0;8
 FILE_NAME_18=3893;C;0;EUTF-8;1;1;0;%2Fhome%2Fjonathan%2FDokumente%2Fprojekte%2Fprgm%2Finternet%2Fweb%2FSeFHT%2Fsrc%2Flib%2Fsefht%2Fattr_static.c;0;8
@@ -63,7 +63,7 @@ FILE_NAME_30=555;Make;0;EUTF-8;1;1;0;%2Fhome%2Fjonathan%2FDokumente%2Fprojekte%2
 FILE_NAME_31=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_32=1085;C;0;EUTF-8;1;1;0;%2Fhome%2Fjonathan%2FDokumente%2Fprojekte%2Fprgm%2Finternet%2Fweb%2FSeFHT%2Ftests%2Ftest_cms.c;0;8
 FILE_NAME_33=3283;C;0;EUTF-8;1;1;0;%2Fhome%2Fjonathan%2FDokumente%2Fprojekte%2Fprgm%2Finternet%2Fweb%2FSeFHT%2Ftests%2Ftest_data.c;0;8
-FILE_NAME_34=28347;C;0;EUTF-8;1;1;0;%2Fhome%2Fjonathan%2FDokumente%2Fprojekte%2Fprgm%2Finternet%2Fweb%2FSeFHT%2Ftests%2Ftest_node_fragment.c;0;8
+FILE_NAME_34=126847;C;0;EUTF-8;1;1;0;%2Fhome%2Fjonathan%2FDokumente%2Fprojekte%2Fprgm%2Finternet%2Fweb%2FSeFHT%2Ftests%2Ftest_node_fragment.c;0;8
 FILE_NAME_35=11319;C;0;EUTF-8;1;1;0;%2Fhome%2Fjonathan%2FDokumente%2Fprojekte%2Fprgm%2Finternet%2Fweb%2FSeFHT%2Ftests%2Ftest_attr.c;0;8
 FILE_NAME_36=11068;C;0;EUTF-8;1;1;0;%2Fhome%2Fjonathan%2FDokumente%2Fprojekte%2Fprgm%2Finternet%2Fweb%2FSeFHT%2Ftests%2Ftest_text.c;0;8
 FILE_NAME_37=5744;C;0;EUTF-8;1;1;0;%2Fhome%2Fjonathan%2FDokumente%2Fprojekte%2Fprgm%2Finternet%2Fweb%2FSeFHT%2Ftests%2Ftest_validator.c;0;8
diff --git a/src/lib/sefht/node_fragment.c b/src/lib/sefht/node_fragment.c
index b1ac83cf0e16c0ef20c38387f721304a20128b57..308536f80adf690a0c7d4deafb7da29372546649 100644
--- a/src/lib/sefht/node_fragment.c
+++ b/src/lib/sefht/node_fragment.c
@@ -617,13 +617,81 @@ insert_attr (struct SH_NodeFragment * fragment,
 static inline
 bool
 insert_attr_new (struct SH_NodeFragment * fragment,
-                 /*@only@*/ char * name,
-                 /*@null@*/ /*@only@*/ char * value,
+                 const char * name,
+                 /*@null@*/ const char * value,
                  size_t position,
                  /*@out@*/ /*@null@*/ struct SH_Status * status)
 	/*@modifies fragment->attrs@*/
 	/*@modifies fragment->attr_s@*/
 	/*@modifies fragment->attr_n@*/
+	/*@globals fileSystem@*/
+	/*@modifies fileSystem@*/
+	/*@modifies status@*/
+{
+	size_t new_size;
+	size_t index;
+	struct SH_Attr attr;
+	typeof (fragment->attrs) new_attrs;
+
+	if (!Attr_init (&attr, name, value, status))
+	{
+		return FALSE;
+	}
+
+	new_size = get_attr_alloc_size (fragment->attr_n + 1);
+	if (new_size > fragment->attr_s)
+	{
+		if ((SIZE_MAX / sizeof (*new_attrs)) < new_size)
+		{
+			set_status (status, E_DOMAIN, -6,
+			            "maximum number of "
+			            "attrs reached.\n");
+			Attr_free (&attr);
+			return FALSE;
+		}
+
+		new_attrs = realloc (fragment->attrs, new_size
+		                      * sizeof (*new_attrs));
+
+		if (new_attrs == NULL)
+		{
+			set_status (status, E_ALLOC, 5,
+			            "malloc failed\n");
+
+/* bad code to silence splint, should never be executed. */
+#ifdef S_SPLINT_S
+			fragment->attrs = (void *) 0x12345;
+#endif
+			Attr_free (&attr);
+			return FALSE;
+		}
+
+		fragment->attrs = new_attrs;
+		fragment->attr_s = new_size;
+	}
+
+	for (index = fragment->attr_n; index > position; index--)
+	{
+		fragment->attrs[index] = fragment->attrs[index-1];
+	}
+	Attr_move (&(fragment->attrs[position]), &attr);
+	fragment->attr_n++;
+
+	set_success (status);
+
+	return TRUE;
+}
+
+static inline
+bool
+insert_attr_raw_new (struct SH_NodeFragment * fragment,
+                     /*@only@*/ char * name,
+                     /*@null@*/ /*@only@*/ char * value,
+                     size_t position,
+                     /*@out@*/ /*@null@*/ struct SH_Status * status)
+	/*@modifies fragment->attrs@*/
+	/*@modifies fragment->attr_s@*/
+	/*@modifies fragment->attr_n@*/
 	/*@modifies name@*/
 	/*@modifies value@*/
 	/*@globals fileSystem@*/
@@ -769,8 +837,8 @@ SH_NodeFragment_insert_attr (struct SH_NodeFragment * fragment,
 
 bool
 SH_NodeFragment_insert_attr_new (struct SH_NodeFragment * fragment,
-                                 /*@only@*/ char * name,
-                                 /*@null@*/ /*@only@*/ char * value,
+                                 const char * name,
+                                 /*@null@*/ const char * value,
                                  size_t position,
                                  /*@out@*/ /*@null@*/
                                  struct SH_Status * status)
@@ -791,6 +859,31 @@ SH_NodeFragment_insert_attr_new (struct SH_NodeFragment * fragment,
 	return insert_attr_new (fragment, name, value, position, status);
 }
 
+bool
+SH_NodeFragment_insert_attr_raw_new (struct SH_NodeFragment * fragment,
+                                     /*@only@*/ char * name,
+                                     /*@null@*/ /*@only@*/ char * value,
+                                     size_t position,
+                                     /*@out@*/ /*@null@*/
+                                     struct SH_Status * status)
+	/*@modifies fragment->attrs@*/
+	/*@modifies fragment->attr_s@*/
+	/*@modifies fragment->attr_n@*/
+	/*@globals fileSystem@*/
+	/*@modifies fileSystem@*/
+	/*@modifies status@*/
+{
+	if (position > fragment->attr_n)
+	{
+		set_status (status, E_VALUE, 2,
+		            "index out of range.\n");
+		return FALSE;
+	}
+
+	return insert_attr_raw_new (fragment, name, value, position,
+	                            status);
+}
+
 bool
 SH_NodeFragment_insert_attr_copy (struct SH_NodeFragment * fragment,
                                   const SH_Attr * attr,
@@ -831,8 +924,8 @@ SH_NodeFragment_prepend_attr (struct SH_NodeFragment * fragment,
 
 bool
 SH_NodeFragment_prepend_attr_new (struct SH_NodeFragment * fragment,
-                                  /*@only@*/ char * name,
-                                  /*@null@*/ /*@only@*/ char * value,
+                                  const char * name,
+                                  /*@null@*/ const char * value,
                                   /*@out@*/ /*@null@*/
                                   struct SH_Status * status)
 	/*@modifies fragment->attrs@*/
@@ -845,6 +938,22 @@ SH_NodeFragment_prepend_attr_new (struct SH_NodeFragment * fragment,
 	return insert_attr_new (fragment, name, value, 0, status);
 }
 
+bool
+SH_NodeFragment_prepend_attr_raw_new (struct SH_NodeFragment * fragment,
+                                      /*@only@*/ char * name,
+                                      /*@null@*/ /*@only@*/ char * value,
+                                      /*@out@*/ /*@null@*/
+                                      struct SH_Status * status)
+	/*@modifies fragment->attrs@*/
+	/*@modifies fragment->attr_s@*/
+	/*@modifies fragment->attr_n@*/
+	/*@globals fileSystem@*/
+	/*@modifies fileSystem@*/
+	/*@modifies status@*/
+{
+	return insert_attr_raw_new (fragment, name, value, 0, status);
+}
+
 bool
 SH_NodeFragment_prepend_attr_copy (struct SH_NodeFragment * fragment,
                                    const SH_Attr * attr,
@@ -877,8 +986,8 @@ SH_NodeFragment_append_attr (struct SH_NodeFragment * fragment,
 
 bool
 SH_NodeFragment_append_attr_new (struct SH_NodeFragment * fragment,
-                                 /*@only@*/ char * name,
-                                 /*@null@*/ /*@only@*/ char * value,
+                                 const char * name,
+                                 /*@null@*/ const char * value,
                                  /*@out@*/ /*@null@*/
                                  struct SH_Status * status)
 	/*@modifies fragment->attrs@*/
@@ -892,6 +1001,23 @@ SH_NodeFragment_append_attr_new (struct SH_NodeFragment * fragment,
 	                        fragment->attr_n, status);
 }
 
+bool
+SH_NodeFragment_append_attr_raw_new (struct SH_NodeFragment * fragment,
+                                     /*@only@*/ char * name,
+                                     /*@null@*/ /*@only@*/ char * value,
+                                     /*@out@*/ /*@null@*/
+                                     struct SH_Status * status)
+	/*@modifies fragment->attrs@*/
+	/*@modifies fragment->attr_s@*/
+	/*@modifies fragment->attr_n@*/
+	/*@globals fileSystem@*/
+	/*@modifies fileSystem@*/
+	/*@modifies status@*/
+{
+	return insert_attr_raw_new (fragment, name, value,
+	                            fragment->attr_n, status);
+}
+
 bool
 SH_NodeFragment_append_attr_copy (struct SH_NodeFragment * fragment,
                                   const SH_Attr * attr,
diff --git a/src/lib/sefht/node_fragment.h b/src/lib/sefht/node_fragment.h
index a12cd21e2fcb3f7cf515267909b739a5160bf406..160e86c1dfbd1957ad33d28fcb4c3991f72118a8 100644
--- a/src/lib/sefht/node_fragment.h
+++ b/src/lib/sefht/node_fragment.h
@@ -115,8 +115,8 @@ SH_NodeFragment_insert_attr (SH_NodeFragment * fragment,
 
 bool
 SH_NodeFragment_insert_attr_new (SH_NodeFragment * fragment,
-                                 /*@only@*/ char * name,
-                                 /*@null@*/ /*@only@*/ char * value,
+                                 const char * name,
+                                 /*@null@*/ const char * value,
                                  size_t position,
                                  /*@out@*/ /*@null@*/
                                  struct SH_Status * status)
@@ -125,6 +125,18 @@ SH_NodeFragment_insert_attr_new (SH_NodeFragment * fragment,
 	/*@modifies fileSystem@*/
 	/*@modifies status@*/;
 
+bool
+SH_NodeFragment_insert_attr_raw_new (SH_NodeFragment * fragment,
+                                     /*@only@*/ char * name,
+                                     /*@null@*/ /*@only@*/ char * value,
+                                     size_t position,
+                                     /*@out@*/ /*@null@*/
+                                     struct SH_Status * status)
+	/*@modifies fragment@*/
+	/*@globals fileSystem@*/
+	/*@modifies fileSystem@*/
+	/*@modifies status@*/;
+
 bool
 SH_NodeFragment_insert_attr_copy (SH_NodeFragment * fragment,
                                   const SH_Attr * attr,
@@ -148,8 +160,8 @@ SH_NodeFragment_prepend_attr (SH_NodeFragment * fragment,
 
 bool
 SH_NodeFragment_prepend_attr_new (SH_NodeFragment * fragment,
-                                  /*@only@*/ char * name,
-                                  /*@null@*/ /*@only@*/ char * value,
+                                  const char * name,
+                                  /*@null@*/ const char * value,
                                   /*@out@*/ /*@null@*/
                                   struct SH_Status * status)
 	/*@modifies fragment@*/
@@ -157,6 +169,17 @@ SH_NodeFragment_prepend_attr_new (SH_NodeFragment * fragment,
 	/*@modifies fileSystem@*/
 	/*@modifies status@*/;
 
+bool
+SH_NodeFragment_prepend_attr_raw_new (SH_NodeFragment * fragment,
+                                      /*@only@*/ char * name,
+                                      /*@null@*/ /*@only@*/ char * value,
+                                      /*@out@*/ /*@null@*/
+                                      struct SH_Status * status)
+	/*@modifies fragment@*/
+	/*@globals fileSystem@*/
+	/*@modifies fileSystem@*/
+	/*@modifies status@*/;
+
 bool
 SH_NodeFragment_prepend_attr_copy (SH_NodeFragment * fragment,
                                    const SH_Attr * attr,
@@ -179,14 +202,25 @@ SH_NodeFragment_append_attr (SH_NodeFragment * fragment,
 
 bool
 SH_NodeFragment_append_attr_new (SH_NodeFragment * fragment,
-                                 /*@only@*/ char * name,
-                                 /*@null@*/ /*@only@*/ char * value,
+                                 const char * name,
+                                 /*@null@*/ const char * value,
                                  /*@out@*/ /*@null@*/
                                  struct SH_Status * status)
 	/*@modifies fragment@*/
 	/*@globals fileSystem@*/
 	/*@modifies fileSystem@*/
 	/*@modifies status@*/;
+
+bool
+SH_NodeFragment_append_attr_raw_new (SH_NodeFragment * fragment,
+                                     /*@only@*/ char * name,
+                                     /*@null@*/ /*@only@*/ char * value,
+                                     /*@out@*/ /*@null@*/
+                                     struct SH_Status * status)
+	/*@modifies fragment@*/
+	/*@globals fileSystem@*/
+	/*@modifies fileSystem@*/
+	/*@modifies status@*/;
 bool
 SH_NodeFragment_append_attr_copy (SH_NodeFragment * fragment,
                                   const SH_Attr * attr,
diff --git a/tests/test_node_fragment.c b/tests/test_node_fragment.c
index 8e563657874c30bc45f01f06c7409046ddd98e93..61e67968678adc2bcf646fb971d3ed0d1286506c 100644
--- a/tests/test_node_fragment.c
+++ b/tests/test_node_fragment.c
@@ -719,6 +719,207 @@ START_TEST(test_node_fragment_attr_insert_new_no_status)
 	ck_assert_int_le (1, fragment->attr_s);
 	ck_assert_int_eq (ATTR_CHUNK, fragment->attr_s);
 
+	ck_assert_ptr_ne (attr1->name, fragment->attrs[0].name);
+	ck_assert_ptr_ne (attr1->value, fragment->attrs[0].value);
+
+	ck_assert_str_eq (attr1->name, fragment->attrs[0].name);
+	ck_assert_str_eq (attr1->value, fragment->attrs[0].value);
+
+	/* test insert before - success */
+	name = Attr_get_name (attr2);
+	value = Attr_get_value (attr2);
+
+	result = insert_attr_new (fragment, name, value, 0, NULL);
+	ck_assert_int_eq (TRUE, result);
+
+	ck_assert_int_eq (2, fragment->attr_n);
+	ck_assert_int_le (2, fragment->attr_s);
+	ck_assert_int_eq (ATTR_CHUNK, fragment->attr_s);
+
+	ck_assert_ptr_ne (attr2->name, fragment->attrs[0].name);
+	ck_assert_ptr_ne (attr2->value, fragment->attrs[0].value);
+
+	ck_assert_str_eq (attr2->name, fragment->attrs[0].name);
+	ck_assert_str_eq (attr2->value, fragment->attrs[0].value);
+
+	ck_assert_str_eq (attr1->name, fragment->attrs[1].name);
+	ck_assert_str_eq (attr1->value, fragment->attrs[1].value);
+
+	/* test insert after - success */
+	name = Attr_get_name (attr3);
+	value = Attr_get_value (attr3);
+
+	result = insert_attr_new (fragment, name, value, 2, NULL);
+	ck_assert_int_eq (TRUE, result);
+
+	ck_assert_int_eq (3, fragment->attr_n);
+	ck_assert_int_le (3, fragment->attr_s);
+	ck_assert_int_eq (ATTR_CHUNK, fragment->attr_s);
+
+	ck_assert_ptr_ne (attr3->name, fragment->attrs[2].name);
+	ck_assert_ptr_ne (attr3->value, fragment->attrs[2].value);
+
+	ck_assert_str_eq (attr2->name, fragment->attrs[0].name);
+	ck_assert_str_eq (attr2->value, fragment->attrs[0].value);
+
+	ck_assert_str_eq (attr1->name, fragment->attrs[1].name);
+	ck_assert_str_eq (attr1->value, fragment->attrs[1].value);
+
+	ck_assert_str_eq (attr3->name, fragment->attrs[2].name);
+	ck_assert_str_eq (attr3->value, fragment->attrs[2].value);
+
+	/* cleanup */
+	SH_NodeFragment_free (fragment);
+	SH_Data_free (data);
+	SH_Attr_free (attr1);
+	SH_Attr_free (attr2);
+	SH_Attr_free (attr3);
+}
+END_TEST
+
+START_TEST(test_node_fragment_attr_insert_new_with_status)
+{
+	struct SH_Status status;
+	char * name;
+	char * value;
+	SH_Attr * attr1;
+	SH_Attr * attr2;
+	SH_Attr * attr3;
+	SH_Data * data;
+	struct SH_NodeFragment * fragment;
+	bool result;
+
+	/* setup */
+	attr1 = SH_Attr_new ("name1", "value1", NULL);
+	ck_assert_ptr_ne (NULL, attr1);
+
+	attr2 = SH_Attr_new ("name2", "value2", NULL);
+	ck_assert_ptr_ne (NULL, attr2);
+
+	attr3 = SH_Attr_new ("name3", "value3", NULL);
+	ck_assert_ptr_ne (NULL, attr3);
+
+	data = SH_Data_new (NULL);
+	ck_assert_ptr_ne (NULL, data);
+
+	fragment = (SH_NodeFragment *)SH_NodeFragment_new ("html", data,
+	                                                   NULL);
+	ck_assert_ptr_ne (NULL, fragment);
+
+	/* test insert - success */
+	name = Attr_get_name (attr1);
+	value = Attr_get_value (attr1);
+
+	_status_preinit (status);
+	result = insert_attr_new (fragment, name, value, 0, &status);
+	ck_assert_int_eq (TRUE, result);
+	ck_assert_int_eq (SUCCESS, status.status);
+
+	ck_assert_int_eq (1, fragment->attr_n);
+	ck_assert_int_le (1, fragment->attr_s);
+	ck_assert_int_eq (ATTR_CHUNK, fragment->attr_s);
+
+	ck_assert_ptr_ne (attr1->name, fragment->attrs[0].name);
+	ck_assert_ptr_ne (attr1->value, fragment->attrs[0].value);
+
+	ck_assert_str_eq (attr1->name, fragment->attrs[0].name);
+	ck_assert_str_eq (attr1->value, fragment->attrs[0].value);
+
+	/* test insert before - success */
+	name = Attr_get_name (attr2);
+	value = Attr_get_value (attr2);
+
+	_status_preinit (status);
+	result = insert_attr_new (fragment, name, value, 0, &status);
+	ck_assert_int_eq (TRUE, result);
+	ck_assert_int_eq (SUCCESS, status.status);
+
+	ck_assert_int_eq (2, fragment->attr_n);
+	ck_assert_int_le (2, fragment->attr_s);
+	ck_assert_int_eq (ATTR_CHUNK, fragment->attr_s);
+
+	ck_assert_ptr_ne (attr2->name, fragment->attrs[0].name);
+	ck_assert_ptr_ne (attr2->value, fragment->attrs[0].value);
+
+	ck_assert_str_eq (attr2->name, fragment->attrs[0].name);
+	ck_assert_str_eq (attr2->value, fragment->attrs[0].value);
+
+	ck_assert_str_eq (attr1->name, fragment->attrs[1].name);
+	ck_assert_str_eq (attr1->value, fragment->attrs[1].value);
+
+	/* test insert after - success */
+	name = Attr_get_name (attr3);
+	value = Attr_get_value (attr3);
+
+	_status_preinit (status);
+	result = insert_attr_new (fragment, name, value, 2, &status);
+	ck_assert_int_eq (TRUE, result);
+	ck_assert_int_eq (SUCCESS, status.status);
+
+	ck_assert_int_eq (3, fragment->attr_n);
+	ck_assert_int_le (3, fragment->attr_s);
+	ck_assert_int_eq (ATTR_CHUNK, fragment->attr_s);
+
+	ck_assert_ptr_ne (attr3->name, fragment->attrs[2].name);
+	ck_assert_ptr_ne (attr3->value, fragment->attrs[2].value);
+
+	ck_assert_str_eq (attr2->name, fragment->attrs[0].name);
+	ck_assert_str_eq (attr2->value, fragment->attrs[0].value);
+
+	ck_assert_str_eq (attr1->name, fragment->attrs[1].name);
+	ck_assert_str_eq (attr1->value, fragment->attrs[1].value);
+
+	ck_assert_str_eq (attr3->name, fragment->attrs[2].name);
+	ck_assert_str_eq (attr3->value, fragment->attrs[2].value);
+
+	/* cleanup */
+	SH_NodeFragment_free (fragment);
+	SH_Data_free (data);
+	SH_Attr_free (attr1);
+	SH_Attr_free (attr2);
+	SH_Attr_free (attr3);
+}
+END_TEST
+
+START_TEST(test_node_fragment_attr_insert_raw_new_no_status)
+{
+	char * name;
+	char * value;
+	SH_Attr * attr1;
+	SH_Attr * attr2;
+	SH_Attr * attr3;
+	SH_Data * data;
+	struct SH_NodeFragment * fragment;
+	bool result;
+
+	/* setup */
+	attr1 = SH_Attr_new ("name1", "value1", NULL);
+	ck_assert_ptr_ne (NULL, attr1);
+
+	attr2 = SH_Attr_new ("name2", "value2", NULL);
+	ck_assert_ptr_ne (NULL, attr2);
+
+	attr3 = SH_Attr_new ("name3", "value3", NULL);
+	ck_assert_ptr_ne (NULL, attr3);
+
+	data = SH_Data_new (NULL);
+	ck_assert_ptr_ne (NULL, data);
+
+	fragment = (SH_NodeFragment *)SH_NodeFragment_new ("html", data,
+	                                                   NULL);
+	ck_assert_ptr_ne (NULL, fragment);
+
+	/* test insert - success */
+	name = Attr_get_name (attr1);
+	value = Attr_get_value (attr1);
+
+	result = insert_attr_raw_new (fragment, name, value, 0, NULL);
+	ck_assert_int_eq (TRUE, result);
+
+	ck_assert_int_eq (1, fragment->attr_n);
+	ck_assert_int_le (1, fragment->attr_s);
+	ck_assert_int_eq (ATTR_CHUNK, fragment->attr_s);
+
 	ck_assert_ptr_eq (attr1->name, fragment->attrs[0].name);
 	ck_assert_ptr_eq (attr1->value, fragment->attrs[0].value);
 
@@ -726,7 +927,7 @@ START_TEST(test_node_fragment_attr_insert_new_no_status)
 	name = Attr_get_name (attr2);
 	value = Attr_get_value (attr2);
 
-	result = insert_attr_new (fragment, name, value, 0, NULL);
+	result = insert_attr_raw_new (fragment, name, value, 0, NULL);
 	ck_assert_int_eq (TRUE, result);
 
 	ck_assert_int_eq (2, fragment->attr_n);
@@ -743,7 +944,7 @@ START_TEST(test_node_fragment_attr_insert_new_no_status)
 	name = Attr_get_name (attr3);
 	value = Attr_get_value (attr3);
 
-	result = insert_attr_new (fragment, name, value, 2, NULL);
+	result = insert_attr_raw_new (fragment, name, value, 2, NULL);
 	ck_assert_int_eq (TRUE, result);
 
 	ck_assert_int_eq (3, fragment->attr_n);
@@ -768,7 +969,7 @@ START_TEST(test_node_fragment_attr_insert_new_no_status)
 }
 END_TEST
 
-START_TEST(test_node_fragment_attr_insert_new_with_status)
+START_TEST(test_node_fragment_attr_insert_raw_new_with_status)
 {
 	struct SH_Status status;
 	char * name;
@@ -802,7 +1003,7 @@ START_TEST(test_node_fragment_attr_insert_new_with_status)
 	value = Attr_get_value (attr1);
 
 	_status_preinit (status);
-	result = insert_attr_new (fragment, name, value, 0, &status);
+	result = insert_attr_raw_new (fragment, name, value, 0, &status);
 	ck_assert_int_eq (TRUE, result);
 	ck_assert_int_eq (SUCCESS, status.status);
 
@@ -818,7 +1019,7 @@ START_TEST(test_node_fragment_attr_insert_new_with_status)
 	value = Attr_get_value (attr2);
 
 	_status_preinit (status);
-	result = insert_attr_new (fragment, name, value, 0, &status);
+	result = insert_attr_raw_new (fragment, name, value, 0, &status);
 	ck_assert_int_eq (TRUE, result);
 	ck_assert_int_eq (SUCCESS, status.status);
 
@@ -837,7 +1038,7 @@ START_TEST(test_node_fragment_attr_insert_new_with_status)
 	value = Attr_get_value (attr3);
 
 	_status_preinit (status);
-	result = insert_attr_new (fragment, name, value, 2, &status);
+	result = insert_attr_raw_new (fragment, name, value, 2, &status);
 	ck_assert_int_eq (TRUE, result);
 	ck_assert_int_eq (SUCCESS, status.status);
 
@@ -1263,8 +1464,11 @@ START_TEST(test_node_fragment_attr_insert_insert_new_no_status)
 	                                          0, NULL);
 	ck_assert_int_eq (TRUE, result);
 
-	ck_assert_ptr_eq (name, fragment->attrs[0].name);
-	ck_assert_ptr_eq (value, fragment->attrs[0].value);
+	ck_assert_ptr_ne (name, fragment->attrs[0].name);
+	ck_assert_ptr_ne (value, fragment->attrs[0].value);
+
+	ck_assert_str_eq (name, fragment->attrs[0].name);
+	ck_assert_str_eq (value, fragment->attrs[0].value);
 
 	/* test - insert before */
 	name = Attr_get_name (attr1);
@@ -1274,8 +1478,11 @@ START_TEST(test_node_fragment_attr_insert_insert_new_no_status)
 	                                           NULL);
 	ck_assert_int_eq (TRUE, result);
 
-	ck_assert_ptr_eq (name, fragment->attrs[0].name);
-	ck_assert_ptr_eq (value, fragment->attrs[0].value);
+	ck_assert_ptr_ne (name, fragment->attrs[0].name);
+	ck_assert_ptr_ne (value, fragment->attrs[0].value);
+
+	ck_assert_str_eq (name, fragment->attrs[0].name);
+	ck_assert_str_eq (value, fragment->attrs[0].value);
 
 	/* test - insert after */
 	name = Attr_get_name (attr3);
@@ -1285,8 +1492,11 @@ START_TEST(test_node_fragment_attr_insert_insert_new_no_status)
 	                                          NULL);
 	ck_assert_int_eq (TRUE, result);
 
-	ck_assert_ptr_eq (name, fragment->attrs[2].name);
-	ck_assert_ptr_eq (value, fragment->attrs[2].value);
+	ck_assert_ptr_ne (name, fragment->attrs[2].name);
+	ck_assert_ptr_ne (value, fragment->attrs[2].value);
+
+	ck_assert_str_eq (name, fragment->attrs[2].name);
+	ck_assert_str_eq (value, fragment->attrs[2].value);
 
 	ck_assert_int_eq (3, fragment->attr_n);
 	ck_assert (Attr_is_equal (attr1, &fragment->attrs[0]));
@@ -1296,9 +1506,9 @@ START_TEST(test_node_fragment_attr_insert_insert_new_no_status)
 	/* cleanup */
 	SH_NodeFragment_free (fragment);
 	SH_Data_free (data);
-	free (attr1);
-	free (attr2);
-	free (attr3);
+	SH_Attr_free (attr1);
+	SH_Attr_free (attr2);
+	SH_Attr_free (attr3);
 }
 END_TEST
 
@@ -1351,8 +1561,11 @@ START_TEST(test_node_fragment_attr_insert_insert_new_with_status)
 	ck_assert_int_eq (TRUE, result);
 	ck_assert_int_eq (SUCCESS, status.status);
 
-	ck_assert_ptr_eq (name, fragment->attrs[0].name);
-	ck_assert_ptr_eq (value, fragment->attrs[0].value);
+	ck_assert_ptr_ne (name, fragment->attrs[0].name);
+	ck_assert_ptr_ne (value, fragment->attrs[0].value);
+
+	ck_assert_str_eq (name, fragment->attrs[0].name);
+	ck_assert_str_eq (value, fragment->attrs[0].value);
 
 	/* test - insert before */
 	name = Attr_get_name (attr1);
@@ -1364,8 +1577,11 @@ START_TEST(test_node_fragment_attr_insert_insert_new_with_status)
 	ck_assert_int_eq (TRUE, result);
 	ck_assert_int_eq (SUCCESS, status.status);
 
-	ck_assert_ptr_eq (name, fragment->attrs[0].name);
-	ck_assert_ptr_eq (value, fragment->attrs[0].value);
+	ck_assert_ptr_ne (name, fragment->attrs[0].name);
+	ck_assert_ptr_ne (value, fragment->attrs[0].value);
+
+	ck_assert_str_eq (name, fragment->attrs[0].name);
+	ck_assert_str_eq (value, fragment->attrs[0].value);
 
 	/* test - insert after */
 	name = Attr_get_name (attr3);
@@ -1377,6 +1593,192 @@ START_TEST(test_node_fragment_attr_insert_insert_new_with_status)
 	ck_assert_int_eq (TRUE, result);
 	ck_assert_int_eq (SUCCESS, status.status);
 
+	ck_assert_ptr_ne (name, fragment->attrs[2].name);
+	ck_assert_ptr_ne (value, fragment->attrs[2].value);
+
+	ck_assert_str_eq (name, fragment->attrs[2].name);
+	ck_assert_str_eq (value, fragment->attrs[2].value);
+
+	ck_assert_int_eq (3, fragment->attr_n);
+	ck_assert (Attr_is_equal (attr1, &fragment->attrs[0]));
+	ck_assert (Attr_is_equal (attr2, &fragment->attrs[1]));
+	ck_assert (Attr_is_equal (attr3, &fragment->attrs[2]));
+
+	/* cleanup */
+	SH_NodeFragment_free (fragment);
+	SH_Data_free (data);
+	SH_Attr_free (attr1);
+	SH_Attr_free (attr2);
+	SH_Attr_free (attr3);
+}
+END_TEST
+
+START_TEST(test_node_fragment_attr_insert_insert_raw_new_no_status)
+{
+	char * name;
+	char * value;
+	SH_Attr * attr1;
+	SH_Attr * attr2;
+	SH_Attr * attr3;
+	SH_Data * data;
+	SH_NodeFragment * fragment;
+	bool result;
+
+	/* setup */
+	attr1 = SH_Attr_new ("name1", "value1", NULL);
+	ck_assert_ptr_ne (NULL, attr1);
+
+	attr2 = SH_Attr_new ("name2", "value2", NULL);
+	ck_assert_ptr_ne (NULL, attr2);
+
+	attr3 = SH_Attr_new ("name3", "value3", NULL);
+	ck_assert_ptr_ne (NULL, attr3);
+
+	data = SH_Data_new (NULL);
+	ck_assert_ptr_ne (NULL, data);
+
+	fragment = (SH_NodeFragment *)SH_NodeFragment_new ("html", data,
+	                                                   NULL);
+	ck_assert_ptr_ne (NULL, fragment);
+
+	/* test - out of bounds */
+	name = Attr_get_name (attr1);
+	value = Attr_get_value (attr1);
+
+	result = SH_NodeFragment_insert_attr_raw_new (fragment,
+	                                              name, value, 1,
+	                                              NULL);
+	ck_assert_int_eq (FALSE, result);
+
+	/* test */
+	name = Attr_get_name (attr2);
+	value = Attr_get_value (attr2);
+
+	result = SH_NodeFragment_insert_attr_raw_new (fragment,
+	                                              name, value, 0,
+	                                              NULL);
+	ck_assert_int_eq (TRUE, result);
+
+	ck_assert_ptr_eq (name, fragment->attrs[0].name);
+	ck_assert_ptr_eq (value, fragment->attrs[0].value);
+
+	/* test - insert before */
+	name = Attr_get_name (attr1);
+	value = Attr_get_value (attr1);
+
+	result = SH_NodeFragment_prepend_attr_raw_new (fragment,
+	                                               name, value,
+	                                               NULL);
+	ck_assert_int_eq (TRUE, result);
+
+	ck_assert_ptr_eq (name, fragment->attrs[0].name);
+	ck_assert_ptr_eq (value, fragment->attrs[0].value);
+
+	/* test - insert after */
+	name = Attr_get_name (attr3);
+	value = Attr_get_value (attr3);
+
+	result = SH_NodeFragment_append_attr_raw_new (fragment,
+	                                              name, value,
+	                                              NULL);
+	ck_assert_int_eq (TRUE, result);
+
+	ck_assert_ptr_eq (name, fragment->attrs[2].name);
+	ck_assert_ptr_eq (value, fragment->attrs[2].value);
+
+	ck_assert_int_eq (3, fragment->attr_n);
+	ck_assert (Attr_is_equal (attr1, &fragment->attrs[0]));
+	ck_assert (Attr_is_equal (attr2, &fragment->attrs[1]));
+	ck_assert (Attr_is_equal (attr3, &fragment->attrs[2]));
+
+	/* cleanup */
+	SH_NodeFragment_free (fragment);
+	SH_Data_free (data);
+	free (attr1);
+	free (attr2);
+	free (attr3);
+}
+END_TEST
+
+START_TEST(test_node_fragment_attr_insert_insert_raw_new_with_status)
+{
+	struct SH_Status status;
+	char * name;
+	char * value;
+	SH_Attr * attr1;
+	SH_Attr * attr2;
+	SH_Attr * attr3;
+	SH_Data * data;
+	SH_NodeFragment * fragment;
+	bool result;
+
+	/* setup */
+	attr1 = SH_Attr_new ("name1", "value1", NULL);
+	ck_assert_ptr_ne (NULL, attr1);
+
+	attr2 = SH_Attr_new ("name2", "value2", NULL);
+	ck_assert_ptr_ne (NULL, attr2);
+
+	attr3 = SH_Attr_new ("name3", "value3", NULL);
+	ck_assert_ptr_ne (NULL, attr3);
+
+	data = SH_Data_new (NULL);
+	ck_assert_ptr_ne (NULL, data);
+
+	fragment = (SH_NodeFragment *)SH_NodeFragment_new ("html", data,
+	                                                   NULL);
+	ck_assert_ptr_ne (NULL, fragment);
+
+	/* test - out of bounds */
+	name = Attr_get_name (attr1);
+	value = Attr_get_value (attr1);
+
+	_status_preinit (status);
+	result = SH_NodeFragment_insert_attr_raw_new (fragment,
+	                                              name, value, 1,
+	                                              &status);
+	ck_assert_int_eq (FALSE, result);
+	ck_assert_int_eq (E_VALUE, status.status);
+
+	/* test */
+	name = Attr_get_name (attr2);
+	value = Attr_get_value (attr2);
+
+	_status_preinit (status);
+	result = SH_NodeFragment_insert_attr_raw_new (fragment,
+	                                              name, value, 0,
+	                                              &status);
+	ck_assert_int_eq (TRUE, result);
+	ck_assert_int_eq (SUCCESS, status.status);
+
+	ck_assert_ptr_eq (name, fragment->attrs[0].name);
+	ck_assert_ptr_eq (value, fragment->attrs[0].value);
+
+	/* test - insert before */
+	name = Attr_get_name (attr1);
+	value = Attr_get_value (attr1);
+
+	_status_preinit (status);
+	result = SH_NodeFragment_prepend_attr_raw_new (fragment,
+	                                               name, value,
+	                                               &status);
+	ck_assert_int_eq (TRUE, result);
+	ck_assert_int_eq (SUCCESS, status.status);
+
+	ck_assert_ptr_eq (name, fragment->attrs[0].name);
+	ck_assert_ptr_eq (value, fragment->attrs[0].value);
+
+	/* test - insert after */
+	name = Attr_get_name (attr3);
+	value = Attr_get_value (attr3);
+
+	_status_preinit (status);
+	result = SH_NodeFragment_append_attr_raw_new (fragment,
+	                                              name, value,
+	                                              &status);
+	ck_assert_int_eq (TRUE, result);
+	ck_assert_int_eq (SUCCESS, status.status);
+
 	ck_assert_ptr_eq (name, fragment->attrs[2].name);
 	ck_assert_ptr_eq (value, fragment->attrs[2].value);
 
@@ -3636,23 +4038,18 @@ START_TEST(test_node_fragment_html_inline_no_status)
 	ck_assert_ptr_ne (NULL, fragment);
 
 	result = SH_NodeFragment_append_attr_new (fragment,
-	                                          strdup ("lang"),
-	                                          strdup ("de"),
-	                                          NULL);
+	                                          "lang", "de", NULL);
 	ck_assert_int_eq (TRUE, result);
 
 	child = SH_NodeFragment_new ("body", data, NULL);
 	ck_assert_ptr_ne (NULL, child);
 
 	result = SH_NodeFragment_append_attr_new ((SH_NodeFragment *)child,
-	                                          strdup ("id"),
-	                                          strdup ("body"),
-	                                          NULL);
+	                                          "id", "body", NULL);
 	ck_assert_int_eq (TRUE, result);
 
 	result = SH_NodeFragment_append_attr_new ((SH_NodeFragment *)child,
-	                                          strdup ("attr"),
-	                                          NULL, NULL);
+	                                          "attr", NULL, NULL);
 	ck_assert_int_eq (TRUE, result);
 
 	result = SH_NodeFragment_append_child (fragment, child, NULL);
@@ -3698,8 +4095,7 @@ START_TEST(test_node_fragment_html_inline_with_status)
 	ck_assert_ptr_ne (NULL, fragment);
 
 	result = SH_NodeFragment_append_attr_new (fragment,
-	                                          strdup ("lang"),
-	                                          strdup ("de"),
+	                                          "lang", "de",
 	                                          NULL);
 	ck_assert_int_eq (TRUE, result);
 
@@ -3707,14 +4103,12 @@ START_TEST(test_node_fragment_html_inline_with_status)
 	ck_assert_ptr_ne (NULL, child);
 
 	result = SH_NodeFragment_append_attr_new ((SH_NodeFragment *)child,
-	                                          strdup ("id"),
-	                                          strdup ("body"),
+	                                          "id", "body",
 	                                          NULL);
 	ck_assert_int_eq (TRUE, result);
 
 	result = SH_NodeFragment_append_attr_new ((SH_NodeFragment *)child,
-	                                          strdup ("attr"),
-	                                          NULL, NULL);
+	                                          "attr", NULL, NULL);
 	ck_assert_int_eq (TRUE, result);
 
 	result = SH_NodeFragment_append_child (fragment, child, NULL);
@@ -3761,8 +4155,7 @@ START_TEST(test_node_fragment_html_wrap_no_status)
 	ck_assert_ptr_ne (NULL, fragment);
 
 	result = SH_NodeFragment_append_attr_new (fragment,
-	                                          strdup ("lang"),
-	                                          strdup ("de"),
+	                                          "lang", "de",
 	                                          NULL);
 	ck_assert_int_eq (TRUE, result);
 
@@ -3770,14 +4163,12 @@ START_TEST(test_node_fragment_html_wrap_no_status)
 	ck_assert_ptr_ne (NULL, child);
 
 	result = SH_NodeFragment_append_attr_new ((SH_NodeFragment *)child,
-	                                          strdup ("id"),
-	                                          strdup ("body"),
+	                                          "id", "body",
 	                                          NULL);
 	ck_assert_int_eq (TRUE, result);
 
 	result = SH_NodeFragment_append_attr_new ((SH_NodeFragment *)child,
-	                                          strdup ("attr"),
-	                                          NULL, NULL);
+	                                          "attr", NULL, NULL);
 	ck_assert_int_eq (TRUE, result);
 
 	result = SH_NodeFragment_append_child (fragment, child, NULL);
@@ -3823,8 +4214,7 @@ START_TEST(test_node_fragment_html_wrap_with_status)
 	ck_assert_ptr_ne (NULL, fragment);
 
 	result = SH_NodeFragment_append_attr_new (fragment,
-	                                          strdup ("lang"),
-	                                          strdup ("de"),
+	                                          "lang", "de",
 	                                          NULL);
 	ck_assert_int_eq (TRUE, result);
 
@@ -3832,14 +4222,12 @@ START_TEST(test_node_fragment_html_wrap_with_status)
 	ck_assert_ptr_ne (NULL, child);
 
 	result = SH_NodeFragment_append_attr_new ((SH_NodeFragment *)child,
-	                                          strdup ("id"),
-	                                          strdup ("body"),
+	                                          "id", "body",
 	                                          NULL);
 	ck_assert_int_eq (TRUE, result);
 
 	result = SH_NodeFragment_append_attr_new ((SH_NodeFragment *)child,
-	                                          strdup ("attr"),
-	                                          NULL, NULL);
+	                                          "attr", NULL, NULL);
 	ck_assert_int_eq (TRUE, result);
 
 	result = SH_NodeFragment_append_child (fragment, child, NULL);
@@ -3895,12 +4283,16 @@ Suite * fragment_suite (void)
 	tcase_add_test (tc_core, test_node_fragment_attr_insert_with_status);
 	tcase_add_test (tc_core, test_node_fragment_attr_insert_new_no_status);
 	tcase_add_test (tc_core, test_node_fragment_attr_insert_new_with_status);
+	tcase_add_test (tc_core, test_node_fragment_attr_insert_raw_new_no_status);
+	tcase_add_test (tc_core, test_node_fragment_attr_insert_raw_new_with_status);
 	tcase_add_test (tc_core, test_node_fragment_attr_insert_copy_no_status);
 	tcase_add_test (tc_core, test_node_fragment_attr_insert_copy_with_status);
 	tcase_add_test (tc_core, test_node_fragment_attr_insert_insert_no_status);
 	tcase_add_test (tc_core, test_node_fragment_attr_insert_insert_with_status);
 	tcase_add_test (tc_core, test_node_fragment_attr_insert_insert_new_no_status);
 	tcase_add_test (tc_core, test_node_fragment_attr_insert_insert_new_with_status);
+	tcase_add_test (tc_core, test_node_fragment_attr_insert_insert_raw_new_no_status);
+	tcase_add_test (tc_core, test_node_fragment_attr_insert_insert_raw_new_with_status);
 	tcase_add_test (tc_core, test_node_fragment_attr_insert_insert_copy_no_status);
 	tcase_add_test (tc_core, test_node_fragment_attr_insert_insert_copy_with_status);
 	tcase_add_test (tc_core, test_node_fragment_attr_remove1_no_status);