diff --git a/tinyxml2.cpp b/tinyxml2.cpp
index f45ae74..2241fd2 100644
--- a/tinyxml2.cpp
+++ b/tinyxml2.cpp
@@ -344,6 +344,51 @@
 }
 
 
+XMLNode* XMLNode::InsertFirstChild( XMLNode* addThis )
+{
+	if ( firstChild ) {
+		TIXMLASSERT( lastChild );
+		TIXMLASSERT( firstChild->prev == 0 );
+
+		firstChild->prev = addThis;
+		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;
+	}
+	return addThis;
+}
+
+
+XMLNode* XMLNode::InsertAfterChild( XMLNode* afterThis, XMLNode* addThis )
+{
+	TIXMLASSERT( afterThis->parent == this );
+	if ( afterThis->parent != this )
+		return 0;
+
+	if ( afterThis->next == 0 ) {
+		// The last node or the only node.
+		return InsertEndChild( addThis );
+	}
+	addThis->prev = afterThis;
+	addThis->next = afterThis->next;
+	afterThis->next->prev = addThis;
+	afterThis->next = addThis;
+	return addThis;
+}
+
+
+
+
 const XMLElement* XMLNode::FirstChildElement( const char* value ) const
 {
 	for( XMLNode* node=firstChild; node; node=node->next ) {
@@ -510,6 +555,70 @@
 }
 
 
+int XMLAttribute::QueryIntAttribute( int* value ) const
+{
+	if ( TIXML_SSCANF( Value(), "%d", value ) == 1 )
+		return ATTRIBUTE_SUCCESS;
+	return WRONG_ATTRIBUTE_TYPE;
+}
+
+
+int XMLAttribute::QueryUnsignedAttribute( unsigned int* value ) const
+{
+	if ( TIXML_SSCANF( Value(), "%u", value ) == 1 )
+		return ATTRIBUTE_SUCCESS;
+	return WRONG_ATTRIBUTE_TYPE;
+}
+
+
+int XMLAttribute::QueryBoolAttribute( bool* value ) const
+{
+	int ival = -1;
+	QueryIntAttribute( &ival );
+
+	if ( ival > 0 || XMLUtil::StringEqual( Value(), "true" ) ) {
+		*value = true;
+		return ATTRIBUTE_SUCCESS;
+	}
+	else if ( ival == 0 || XMLUtil::StringEqual( Value(), "false" ) ) {
+		*value = false;
+		return ATTRIBUTE_SUCCESS;
+	}
+	return WRONG_ATTRIBUTE_TYPE;
+}
+
+
+int XMLAttribute::QueryDoubleAttribute( double* value ) const
+{
+	if ( TIXML_SSCANF( Value(), "%lf", value ) == 1 )
+		return ATTRIBUTE_SUCCESS;
+	return WRONG_ATTRIBUTE_TYPE;
+}
+
+
+int XMLAttribute::QueryFloatAttribute( float* value ) const
+{
+	if ( TIXML_SSCANF( Value(), "%f", value ) == 1 )
+		return ATTRIBUTE_SUCCESS;
+	return WRONG_ATTRIBUTE_TYPE;
+}
+
+
+void XMLAttribute::SetAttribute( const char* v )
+{
+	value.SetInternedStr( v );
+}
+
+
+/*
+void XMLAttribute::SetAttribute( int v )
+{
+	char buf[BUF_SIZE];
+	TIXML_SNPRINTF( buf, BUF_SIZE-1, "%d" );
+
+	value.SetInternedStr( v );
+}
+*/
 
 // --------- XMLElement ---------- //
 XMLElement::XMLElement( XMLDocument* doc ) : XMLNode( doc ),
@@ -683,6 +792,25 @@
 }
 
 
+XMLComment* XMLDocument::NewComment( const char* str )
+{
+	XMLComment* comment = new (commentPool.Alloc()) XMLComment( this );
+	comment->memPool = &commentPool;
+	comment->SetValue( str );
+	return comment;
+}
+
+
+XMLText* XMLDocument::NewText( const char* str )
+{
+	XMLText* Text = new (textPool.Alloc()) XMLText( this );
+	Text->memPool = &textPool;
+	Text->SetValue( str );
+	return Text;
+}
+
+
+
 int XMLDocument::Parse( const char* p )
 {
 	ClearChildren();
