diff --git a/tinyxml2.cpp b/tinyxml2.cpp
index 22cf5cb..2287341 100644
--- a/tinyxml2.cpp
+++ b/tinyxml2.cpp
@@ -59,7 +59,7 @@
 	Reset();
 	size_t len = strlen( str );
 	start = new char[ len+1 ];
-	strncpy( start, str, len );
+	memcpy( start, str, len+1 );
 	end = start + len;
 	this->flags = flags | NEEDS_DELETE;
 }
@@ -341,17 +341,16 @@
 		addThis->prev = lastChild;
 		lastChild = addThis;
 
-		addThis->parent = this;
 		addThis->next = 0;
 	}
 	else {
 		TIXMLASSERT( firstChild == 0 );
 		firstChild = lastChild = addThis;
 
-		addThis->parent = this;
 		addThis->prev = 0;
 		addThis->next = 0;
 	}
+	addThis->parent = this;
 	return addThis;
 }
 
@@ -366,17 +365,16 @@
 		addThis->next = firstChild;
 		firstChild = addThis;
 
-		addThis->parent = this;
 		addThis->prev = 0;
 	}
 	else {
 		TIXMLASSERT( lastChild == 0 );
 		firstChild = lastChild = addThis;
 
-		addThis->parent = this;
 		addThis->prev = 0;
 		addThis->next = 0;
 	}
+	addThis->parent = this;
 	return addThis;
 }
 
@@ -395,6 +393,7 @@
 	addThis->next = afterThis->next;
 	afterThis->next->prev = addThis;
 	afterThis->next = addThis;
+	addThis->parent = this;
 	return addThis;
 }
 
@@ -567,6 +566,12 @@
 }
 
 
+void XMLAttribute::SetName( const char* n )
+{
+	name.SetStr( n );
+}
+
+
 int XMLAttribute::QueryIntAttribute( int* value ) const
 {
 	if ( TIXML_SSCANF( Value(), "%d", value ) == 1 )
@@ -663,19 +668,18 @@
 // --------- XMLElement ---------- //
 XMLElement::XMLElement( XMLDocument* doc ) : XMLNode( doc ),
 	closing( false ),
-	rootAttribute( 0 ),
-	lastAttribute( 0 )
+	rootAttribute( 0 )
+	//lastAttribute( 0 )
 {
 }
 
 
 XMLElement::~XMLElement()
 {
-	XMLAttribute* attribute = rootAttribute;
-	while( attribute ) {
-		XMLAttribute* next = attribute->next;
-		DELETE_ATTRIBUTE( attribute );
-		attribute = next;
+	while( rootAttribute ) {
+		XMLAttribute* next = rootAttribute->next;
+		DELETE_ATTRIBUTE( rootAttribute );
+		rootAttribute = next;
 	}
 }
 
@@ -706,13 +710,29 @@
 {
 	XMLAttribute* attrib = FindAttribute( name );
 	if ( !attrib ) {
-		 attrib = new (document->attributePool.Alloc() ) XMLAttribute( this );
+		attrib = new (document->attributePool.Alloc() ) XMLAttribute( this );
 		attrib->memPool = &document->attributePool;
+		LinkAttribute( attrib );
+		attrib->SetName( name );
 	}
 	return attrib;
 }
 
 
+void XMLElement::LinkAttribute( XMLAttribute* attrib )
+{
+	if ( rootAttribute ) {
+		XMLAttribute* end = rootAttribute;
+		while ( end->next )
+			end = end->next;
+		end->next = attrib;
+	}
+	else {
+		rootAttribute = attrib;
+	}
+}
+
+
 char* XMLElement::ParseAttributes( char* p, bool* closedElement )
 {
 	const char* start = p;
@@ -737,14 +757,7 @@
 				document->SetError( XMLDocument::ERROR_PARSING_ATTRIBUTE, start, p );
 				return 0;
 			}
-			if ( rootAttribute ) {
-				TIXMLASSERT( lastAttribute );
-				lastAttribute->next = attrib;
-				lastAttribute = attrib;
-			}
-			else {
-				rootAttribute = lastAttribute = attrib;
-			}
+			LinkAttribute( attrib );
 		}
 		// end of the tag
 		else if ( *p == '/' && *(p+1) == '>' ) {
@@ -876,10 +889,10 @@
 
 XMLText* XMLDocument::NewText( const char* str )
 {
-	XMLText* Text = new (textPool.Alloc()) XMLText( this );
-	Text->memPool = &textPool;
-	Text->SetValue( str );
-	return Text;
+	XMLText* text = new (textPool.Alloc()) XMLText( this );
+	text->memPool = &textPool;
+	text->SetValue( str );
+	return text;
 }
 
 
@@ -923,44 +936,6 @@
 }
 
 
-/*
-StringStack::StringStack()
-{
-	nPositive = 0;
-	mem.Push( 0 );	// start with null. makes later code simpler.
-}
-
-
-StringStack::~StringStack()
-{
-}
-
-
-void StringStack::Push( const char* str ) {
-	int needed = strlen( str ) + 1;
-	char* p = mem.PushArr( needed );
-	strcpy( p, str );
-	if ( needed > 1 ) 
-		nPositive++;
-}
-
-
-const char* StringStack::Pop() {
-	TIXMLASSERT( mem.Size() > 1 );
-	const char* p = mem.Mem() + mem.Size() - 2;	// end of final string.
-	if ( *p ) {
-		nPositive--;
-	}
-	while( *p ) {					// stack starts with a null, don't need to check for 'mem'
-		TIXMLASSERT( p > mem.Mem() );
-		--p;
-	}
-	mem.PopArr( strlen(p)+1 );
-	return p+1;
-}
-*/
-
-
 XMLStreamer::XMLStreamer( FILE* file ) : fp( file ), depth( 0 ), elementJustOpened( false ), textDepth( -1 )
 {
 	for( int i=0; i<ENTITY_RANGE; ++i ) {
@@ -1094,8 +1069,11 @@
 	if ( elementJustOpened ) {
 		SealElement();
 	}
-	PrintSpace( depth );
-	fprintf( fp, "<!--%s-->\n", comment );
+	if ( textDepth < 0 && depth > 0) {
+		fprintf( fp, "\n" );
+		PrintSpace( depth );
+	}
+	fprintf( fp, "<!--%s-->", comment );
 }
 
 
