diff --git a/test/test-automation/plain_logger.c b/test/test-automation/plain_logger.c
index 1da76e2daf3ef8e29cd6305686fb69e3715eefad..853b389191d971a54a9a09fd17eb1c503651069b 100644
--- a/test/test-automation/plain_logger.c
+++ b/test/test-automation/plain_logger.c
@@ -53,7 +53,7 @@ PlainAssert(const char *assertName, int assertResult, const char *assertMessage,
        time_t eventTime)
 {
 	const char *result = (assertResult) ? "passed" : "failed";
-	printf("%s %s: %s\n", assertName, assertResult, assertMessage);
+	printf("%s %d: %s\n", assertName, assertResult, assertMessage);
 }
 
 void
diff --git a/test/test-automation/xml.c b/test/test-automation/xml.c
index 9c646a3cd819327f3c74123995110eb861a1d3ef..410e25c466bb4d16752b44b493a6bda0a15ffdd9 100644
--- a/test/test-automation/xml.c
+++ b/test/test-automation/xml.c
@@ -118,7 +118,7 @@ const char *EscapeString(const char *string) {
 	memset(buffer, 0, bufferSize);
 
 	// prevents the code doing a 'bus error'
-	char stringBuffer[bufferSize];
+	char *stringBuffer = SDL_malloc(bufferSize);
 	strncpy(stringBuffer, string, bufferSize);
 
 	// Ampersand (&) must be first, otherwise it'll mess up the other entities
@@ -170,40 +170,55 @@ static const char *root;
 /*! Buffer for storing the xml element under construction */
 static char buffer[bufferSize];
 
-void
-XMLOpenDocument(const char *rootTag, LogOutputFp log)
+char *
+XMLOpenDocument(const char *rootTag)
 {
-	assert(log != NULL);
-	logger = log;
-
-	logger("<?xml version=\"1.0\" encoding=\"utf-8\" ?>");
+	const char *doctype = "<?xml version=\"1.0\" encoding=\"utf-8\" ?>\n";
 
 	memset(buffer, 0, bufferSize);
 	snprintf(buffer, bufferSize, "<%s>", rootTag);
-	logger(buffer);
+	//logger(buffer);
 
 	AddOpenTag(rootTag);
 
 	root = rootTag; // it's fine, as long as rootTag points to static memory?
+
+	const int doctypeSize = SDL_strlen(doctype);
+	const int tagSize = SDL_strlen(buffer);
+
+	const int size = doctypeSize + tagSize + 1; // extra byte for '\0'
+	char *ret = SDL_malloc(size);
+	// copy doctype
+	strncpy(ret, doctype, doctypeSize);
+	// copy tag
+	strncpy(ret + doctypeSize, buffer, tagSize);
+	ret[size] = '\0';
+	return ret;
 }
 
-void
+char *
 XMLCloseDocument() {
-	XMLCloseElement(root);
+	return XMLCloseElement(root);
 }
 
-void
+char *
 XMLOpenElement(const char *tag)
 {
 	memset(buffer, 0, bufferSize);
 	snprintf(buffer, bufferSize, "<%s>", tag);
-	logger(buffer);
 
 	AddOpenTag(tag);
+
+	const int size = SDL_strlen(buffer);
+	char *ret = SDL_malloc(size + 1);
+	strncpy(ret, buffer, size);
+	ret[size] = '\0';
+
+	return ret;
 }
 
 
-void
+char *
 XMLOpenElementWithAttribute(const char *tag, Attribute *attribute)
 {
 	memset(buffer, 0, bufferSize);
@@ -212,21 +227,38 @@ XMLOpenElementWithAttribute(const char *tag, Attribute *attribute)
 	logger(buffer);
 
 	AddOpenTag(tag);
+
+	const int size = SDL_strlen(buffer);
+	char *ret = SDL_malloc(size + 1);
+	strncpy(ret, buffer, size);
+	ret[size] = '\0';
+
+	return ret;
 }
 
-void
+char *
 XMLAddContent(const char *content)
 {
 	const char *escapedContent = EscapeString(content);
 
 	memset(buffer, 0, bufferSize);
 	snprintf(buffer, bufferSize, "%s", escapedContent);
-	logger(buffer);
+	SDL_free((char *)escapedContent);
+
+	const int size = SDL_strlen(buffer);
+	char *ret = SDL_malloc(size + 1);
+	strncpy(ret, buffer, size);
+	ret[size] = '\0';
+
+	return ret;
 }
 
-void
+char *
 XMLCloseElement(const char *tag)
 {
+	char *ret = SDL_malloc(bufferSize);
+	memset(ret, 0, bufferSize);
+
 	// Close the open tags with proper nesting. Closes tags until it finds
 	// the given tag which is the last tag that will be closed
 	TagList *openTag = openTags;
@@ -235,7 +267,10 @@ XMLCloseElement(const char *tag)
 
 		memset(buffer, 0, bufferSize);
 		snprintf(buffer, bufferSize, "</%s>", openTag->tag);
-		logger(buffer);
+
+		// \todo use strNcat
+		strcat(ret, buffer);
+		//logger(buffer);
 
 		const int openTagSize = SDL_strlen(openTag->tag);
 		const int tagSize = SDL_strlen(tag);
@@ -254,5 +289,7 @@ XMLCloseElement(const char *tag)
 			break;
 		}
 	}
+
+	return ret;
 }
 
diff --git a/test/test-automation/xml.h b/test/test-automation/xml.h
index a848f5bce1dd09a71dd232194d567ad4d307744e..c14aea0662baf2c6637707ca5e1dd3bb13f56f9a 100644
--- a/test/test-automation/xml.h
+++ b/test/test-automation/xml.h
@@ -35,34 +35,35 @@ typedef struct Attribute {
  * Creates header and start tag for root element.
  *
  * \param rootTag Root tag for the XML document
+ * \return The generated XML output
  */
-void XMLOpenDocument(const char *rootTag, LogOutputFp log);
+char *XMLOpenDocument(const char *rootTag);
 
 /*!
  * Closes the XML-document.
  * Creates end tag for root element and closes other open elements
  * with correct nesting.
  */
-void XMLCloseDocument();
+char *XMLCloseDocument();
 
 /*!
  *  Opens XML-element.
  *
  *  \param tag Element to be opened
  */
-void XMLOpenElement(const char *tag);
+char *XMLOpenElement(const char *tag);
 
 /*!
  * Opens XML-element with given attributes
  */
-void XMLOpenElementWithAttribute(const char *tag, Attribute *attribute);
+char *XMLOpenElementWithAttribute(const char *tag, Attribute *attribute);
 
 /*!
  * Add content to currently open element.
  *
  * \param content Content for the currently open element
  */
-void XMLAddContent(const char *content);
+char *XMLAddContent(const char *content);
 
 /*!
  * Closes previously opened element until tag given as parameter is met.
@@ -73,7 +74,7 @@ void XMLAddContent(const char *content);
  *
  * \param tag Element to close
  */
-void XMLCloseElement(const char *tag);
+char *XMLCloseElement(const char *tag);
 
 #endif
 
diff --git a/test/test-automation/xml_logger.c b/test/test-automation/xml_logger.c
index 1522f2a6566d89ad5fb9675315625e40975c1a52..608d151e08dc3e7349972c5a551ffc0b19b3bc52 100644
--- a/test/test-automation/xml_logger.c
+++ b/test/test-automation/xml_logger.c
@@ -18,95 +18,165 @@
   3. This notice may not be removed or altered from any source distribution.
 */
 
+#include <SDL/SDL.h>
+
 #include "xml.h"
 #include "logger.h"
 
 #include "xml_logger.h"
 
+LogOutputFp logger;
+
 void
 XMLRunStarted(LogOutputFp outputFn, const char *runnerParameters, time_t eventTime)
 {
-	//! \todo Giving outputFn to the function is awful, fix it
-	//! Make the outputting differently
-	XMLOpenDocument("testlog", outputFn);
+	logger = outputFn;
+
+	char *output = XMLOpenDocument("testlog");
+	logger(output);
+	SDL_free(output);
+
+	output = XMLOpenElement("parameters");
+	logger(output);
+	SDL_free(output);
 
-	XMLOpenElement("parameters");
-	XMLAddContent(runnerParameters);
-	XMLCloseElement("parameters");
+	output = XMLAddContent(runnerParameters);
+	logger(output);
+	SDL_free(output);
+
+	output = XMLCloseElement("parameters");
+	logger(output);
+	SDL_free(output);
 }
 
 void
 XMLRunEnded(int testCount, int suiteCount, int testPassCount, int testFailCount,
             time_t endTime, time_t totalRuntime)
 {
-	XMLCloseDocument("testlog");
+	char *output = XMLCloseDocument("testlog");
+	logger(output);
+	SDL_free(output);
 }
 
 void
 XMLSuiteStarted(const char *suiteName, time_t eventTime)
 {
-	XMLOpenElement("suite");
+	char *output = XMLOpenElement("suite");
+	logger(output);
+	SDL_free(output);
+
+	output = XMLOpenElement("eventTime");
+	logger(output);
+	SDL_free(output);
 
-	XMLOpenElement("eventTime");
 	//XMLAddContent(evenTime);
-	XMLCloseElement("eventTime");
+	output = XMLCloseElement("eventTime");
+	logger(output);
+	SDL_free(output);
 }
 
 void
 XMLSuiteEnded(int testsPassed, int testsFailed, int testsSkipped,
            double endTime, time_t totalRuntime)
 {
-	XMLCloseElement("suite");
+	char *output = XMLCloseElement("suite");
+	logger(output);
+	SDL_free(output);
 }
 
 void
 XMLTestStarted(const char *testName, const char *suiteName, const char *testDescription, time_t startTime)
 {
-	XMLOpenElement("test");
+	char * output = XMLOpenElement("test");
+	logger(output);
+	SDL_free(output);
+
 
-	Attribute attribute = {"test", "value"};
+	//Attribute attribute = {"test", "value"};
+	//XMLOpenElementWithAttribute("name", &attribute);
+	output = XMLOpenElement("name");
+	logger(output);
+	SDL_free(output);
 
-	XMLOpenElementWithAttribute("name", &attribute);
-	XMLAddContent(testName);
-	XMLCloseElement("name");
+	output = XMLAddContent(testName);
+	logger(output);
+	SDL_free(output);
 
-	XMLOpenElement("description");
-	XMLAddContent(testDescription);
-	XMLCloseElement("description");
+	output = XMLCloseElement("name");
+	logger(output);
+	SDL_free(output);
+
+
+	output = XMLOpenElement("description");
+	logger(output);
+	SDL_free(output);
+
+
+	output = XMLAddContent(testDescription);
+	logger(output);
+	SDL_free(output);
+
+	output = XMLCloseElement("description");
+	logger(output);
+	SDL_free(output);
+
+	output = XMLOpenElement("starttime");
+	logger(output);
+	SDL_free(output);
 
-	XMLOpenElement("starttime");
 	//XMLAddContent(startTime);
-	XMLCloseElement("starttime");
+	output = XMLCloseElement("starttime");
+	logger(output);
+	SDL_free(output);
 }
 
 void
 XMLTestEnded(const char *testName, const char *suiteName,
           int testResult, int numAsserts, time_t endTime, time_t totalRuntime)
 {
-	XMLCloseElement("test");
+	char *output = XMLCloseElement("test");
+	logger(output);
+	SDL_free(output);
 }
 
 void
 XMLAssert(const char *assertName, int assertResult, const char *assertMessage,
        time_t eventTime)
 {
-	XMLOpenElement("assert");
+	char *output = XMLOpenElement("assert");
+	logger(output);
+	SDL_free(output);
+
+	output = XMLOpenElement("result");
+	logger(output);
+	SDL_free(output);
 
-	XMLOpenElement("result");
-	XMLAddContent((assertResult) ? "pass" : "failure");
-	XMLOpenElement("result");
+	output = XMLAddContent((assertResult) ? "pass" : "failure");
+	logger(output);
+	SDL_free(output);
 
+	output = XMLOpenElement("result");
+	logger(output);
+	SDL_free(output);
 
-	XMLCloseElement("assert");
+	output = XMLCloseElement("assert");
+	logger(output);
+	SDL_free(output);
 }
 
 void
 XMLLog(const char *logMessage, time_t eventTime)
 {
-	XMLOpenElement("log");
+	char *output = XMLOpenElement("log");
+	logger(output);
+	SDL_free(output);
 
-	XMLAddContent(logMessage);
+	output = XMLAddContent(logMessage);
+	logger(output);
+	SDL_free(output);
 
-	XMLCloseElement("log");
+	output = XMLCloseElement("log");
+	logger(output);
+	SDL_free(output);
 }