diff --git a/tinyxml2.h b/tinyxml2.h
index cfe297f..d02e5cd 100644
--- a/tinyxml2.h
+++ b/tinyxml2.h
@@ -231,56 +231,6 @@
 };
 
 
-/*
-class StringStack
-{
-public:
-	StringStack();
-	virtual ~StringStack();
-
-	void Push( const char* str );
-	const char* Pop();
-
-	int NumPositive() const { return nPositive; }
-
-private:
-	DynArray< char, 50 > mem;
-	int nPositive;		// number of strings with len > 0
-};
-*/
-
-/*
-class StringPool
-{
-public:
-	enum { INIT_SIZE=20 };
-
-	StringPool() : size( 0 ) { 
-		const char** mem = pool.PushArr( INIT_SIZE );
-		memset( (void*)mem, 0, sizeof(char)*INIT_SIZE );
-	}
-	~StringPool() {}
-
-	const char* Intern( const char* str );
-
-private:
-	// FNV hash
-	int Hash( const char* s ) {
-		#define FNV_32_PRIME ((int)0x01000193)
-		int hval = 0;
-	    while (*s) {
-			hval *= FNV_32_PRIME;
-			hval ^= (int)*s++;
-		}
-		return hval;
-	}
-
-	int size;
-	DynArray< const char*, INIT_SIZE > pool;		// the hash table
-	StringStack store;								// memory for the interned strings
-};
-*/
-
 
 /**
 	Implements the interface to the "Visitor pattern" (see the Accept() method.)
@@ -359,6 +309,7 @@
 	friend class XMLDocument;
 	friend class XMLElement;
 public:
+	const XMLDocument* GetDocument() const	{ return document; }
 	XMLDocument* GetDocument()				{ return document; }
 
 	virtual XMLElement*		ToElement()		{ return 0; }
@@ -366,9 +317,20 @@
 	virtual XMLComment*		ToComment()		{ return 0; }
 	virtual XMLDocument*	ToDocument()	{ return 0; }
 
+	virtual const XMLElement*	ToElement() const	{ return 0; }
+	virtual const XMLText*		ToText() const		{ return 0; }
+	virtual const XMLComment*	ToComment() const	{ return 0; }
+	virtual const XMLDocument*	ToDocument() const	{ return 0; }
+
 	const char* Value() const			{ return value.GetStr(); }
 	void SetValue( const char* val )	{ value.SetInternedStr( val ); }
 
+	const XMLNode*	Parent() const			{ return parent; }
+	XMLNode* Parent()						{ return parent; }
+
+	/// Returns true if this node has no children.
+	bool NoChildren() const					{ return !firstChild; }
+
 	const XMLNode*  FirstChild() const		{ return firstChild; }
 	XMLNode*		FirstChild()			{ return firstChild; }
 	const XMLElement* FirstChildElement( const char* value=0 ) const;
@@ -400,7 +362,7 @@
 	void DeleteChild( XMLNode* node );
 
 	virtual bool Accept( XMLVisitor* visitor ) const = 0;
-	virtual void Print( XMLStreamer* streamer );
+	//virtual void Print( XMLStreamer* streamer );
 
 	virtual char* ParseDeep( char* );
 	void SetTextParent()		{ isTextParent = true; } 
@@ -433,12 +395,11 @@
 	friend class XMLBase;
 	friend class XMLDocument;
 public:
-	virtual void Print( XMLStreamer* streamer );
-	const char* Value() { return value.GetStr(); }
-	void SetValue( const char* );
+	//virtual void Print( XMLStreamer* streamer );
 
 	virtual bool Accept( XMLVisitor* visitor ) const;
-	virtual XMLText*	ToText()		{ return this; }
+	virtual XMLText*	ToText()			{ return this; }
+	virtual const XMLText*	ToText() const	{ return this; }
 
 	char* ParseDeep( char* );
 
@@ -455,10 +416,9 @@
 	friend class XMLBase;
 	friend class XMLDocument;
 public:
-	virtual void Print( XMLStreamer* );
-	virtual XMLComment*	ToComment()		{ return this; }
+	virtual XMLComment*	ToComment()					{ return this; }
+	virtual const XMLComment* ToComment() const		{ return this; }
 
-	const char* Value() { return value.GetStr(); }
 	virtual bool Accept( XMLVisitor* visitor ) const;
 
 	char* ParseDeep( char* );
@@ -475,15 +435,19 @@
 {
 	friend class XMLElement;
 public:
-	virtual void Print( XMLStreamer* streamer );
+	//virtual void Print( XMLStreamer* streamer );
+
+	const char* Name() const { return name.GetStr(); }
+	const char* Value() const { return value.GetStr(); }
+	const XMLAttribute* Next() const { return next; }
 
 private:
 	XMLAttribute( XMLElement* element ) : next( 0 ) {}
 	virtual ~XMLAttribute()	{}
 	char* ParseDeep( char* p );
 
-	StrPair name;
-	StrPair value;
+	mutable StrPair name;
+	mutable StrPair value;
 	XMLAttribute* next;
 	MemPool* memPool;
 };
@@ -497,11 +461,30 @@
 	const char* Name() const		{ return Value(); }
 	void SetName( const char* str )	{ SetValue( str ); }
 
-	virtual void Print( XMLStreamer* );
-
-	virtual XMLElement* ToElement() { return this; }
+	virtual XMLElement* ToElement()				{ return this; }
+	virtual const XMLElement* ToElement() const { return this; }
 	virtual bool Accept( XMLVisitor* visitor ) const;
 
+	const char* Attribute( const char* name ) const;
+
+	int QueryIntAttribute( const char* name, int* value ) const;
+	int QueryUnsignedAttribute( const char* name, unsigned int* value ) const;
+	int QueryBoolAttribute( const char* name, bool* value ) const;
+	int QueryDoubleAttribute( const char* name, double* _value ) const;
+	int QueryFloatAttribute( const char* name, float* _value ) const;
+
+	void SetAttribute( const char* name, const char* value );
+	void SetAttribute( const char* name, int value );
+	void SetAttribute( const char* name, unsigned value );
+	void SetAttribute( const char* name, bool value );
+	void SetAttribute( const char* name, double value );
+
+	void RemoveAttribute( const char* name );
+
+	const XMLAttribute* FirstAttribute() const { return rootAttribute; }
+
+	const char* GetText() const;
+
 	// internal:
 	virtual bool IsClosingElement() const { return closing; }
 	char* ParseDeep( char* p );
@@ -515,7 +498,7 @@
 
 	bool closing;
 	XMLAttribute* rootAttribute;
-	XMLAttribute* lastAttribute;
+	XMLAttribute* lastAttribute;	// fixme: remove
 };
 
 
@@ -526,7 +509,8 @@
 	XMLDocument(); 
 	~XMLDocument();
 
-	virtual XMLDocument*	ToDocument()	{ return this; }
+	virtual XMLDocument* ToDocument()				{ return this; }
+	virtual const XMLDocument* ToDocument() const	{ return this; }
 
 	int Parse( const char* );
 	int Load( const char* );
@@ -561,7 +545,6 @@
 	const char* errorStr1;
 	const char* errorStr2;
 	char* charBuffer;
-	//StringStack stringPool;
 
 	MemPoolT< sizeof(XMLElement) >	elementPool;
 	MemPoolT< sizeof(XMLAttribute) > attributePool;
@@ -570,7 +553,7 @@
 };
 
 
-class XMLStreamer 
+class XMLStreamer : public XMLVisitor
 {
 public:
 	XMLStreamer( FILE* file );
@@ -583,17 +566,20 @@
 	void PushText( const char* text );
 	void PushComment( const char* comment );
 
+	virtual bool VisitEnter( const XMLDocument& /*doc*/ )			{ return true; }
+	virtual bool VisitExit( const XMLDocument& /*doc*/ )			{ return true; }
+
+	virtual bool VisitEnter( const XMLElement& element, const XMLAttribute* attribute );
+	virtual bool VisitExit( const XMLElement& element );
+
+	virtual bool Visit( const XMLText& text );
+	virtual bool Visit( const XMLComment& comment );
+
+
 private:
 	void SealElement();
 	void PrintSpace( int depth );
 	void PrintString( const char* );	// prints out, after detecting entities.
-/*	bool TextOnStack() const { 
-		for( int i=0; i<text.Size(); ++i ) { 
-			if ( text[i] == 'T' ) 
-				return true; 
-		} 
-		return false; 
-	}*/
 
 	FILE* fp;
 	int depth;
@@ -606,7 +592,6 @@
 	bool entityFlag[ENTITY_RANGE];
 
 	DynArray< const char*, 10 > stack;
-	//DynArray< char, 10 > text;
 };
 
 
