diff --git a/alib2algo/src/measurements/MeasurementFrame.cpp b/alib2algo/src/measurements/MeasurementFrame.cpp
index 974156ecd6939720694200a2c82543085865e459..248034122f81850f19d1e19f3df196768f1a8d12 100644
--- a/alib2algo/src/measurements/MeasurementFrame.cpp
+++ b/alib2algo/src/measurements/MeasurementFrame.cpp
@@ -10,6 +10,28 @@ namespace measurements {
 MeasurementFrame::MeasurementFrame ( measurements::stealth_string name, measurements::Type type, unsigned parent_idx ) : name ( std::move ( name ) ), type ( type ), parent_idx ( parent_idx ), time ( ), memory ( ) {
 }
 
+void MeasurementFrame::to_xml_tokens ( std::deque < sax::Token > & tokens, const measurements::stealth_vector < MeasurementFrame > & frames ) const {
+	tokens.emplace_back ( "MeasurementFrame", sax::Token::TokenType::START_ELEMENT );
+	tokens.emplace_back ( "Name", sax::Token::TokenType::START_ELEMENT );
+	tokens.emplace_back ( measurements::to_string ( name ), sax::Token::TokenType::CHARACTER );
+	tokens.emplace_back ( "Name", sax::Token::TokenType::END_ELEMENT );
+	tokens.emplace_back ( "Type", sax::Token::TokenType::START_ELEMENT );
+	tokens.emplace_back ( measurements::to_string ( type ), sax::Token::TokenType::CHARACTER );
+	tokens.emplace_back ( "Type", sax::Token::TokenType::END_ELEMENT );
+
+	time.to_xml_tokens ( tokens );
+	memory.to_xml_tokens ( tokens );
+
+	tokens.emplace_back ( "SubFrames", sax::Token::TokenType::START_ELEMENT );
+
+	for ( unsigned sub_idx : sub_idxs )
+		frames[sub_idx].to_xml_tokens ( tokens, frames );
+
+	tokens.emplace_back ( "SubFrames", sax::Token::TokenType::END_ELEMENT );
+
+	tokens.emplace_back ( "MeasurementFrame", sax::Token::TokenType::END_ELEMENT );
+}
+
 std::ostream & operator <<( std::ostream & os, const MeasurementFrame & frame ) {
 
 	std::stringstream ss;
diff --git a/alib2algo/src/measurements/MeasurementFrames.hpp b/alib2algo/src/measurements/MeasurementFrames.hpp
index 67fda47f24f653ae1522d7b68f59350e74c718e2..9112432a894f9aff3ec999b0a4bcfde81f2cc108 100644
--- a/alib2algo/src/measurements/MeasurementFrames.hpp
+++ b/alib2algo/src/measurements/MeasurementFrames.hpp
@@ -7,6 +7,8 @@
 
 #include <chrono>
 #include <sstream>
+#include <deque>
+#include "sax/Token.h"
 #include "MeasurementTypes.hpp"
 
 namespace measurements {
@@ -29,6 +31,8 @@ struct MemoryDataFrame {
 
 	size_t current_heap_usage;
 
+	void to_xml_tokens ( std::deque < sax::Token > & ) const;
+
 	static void init ( unsigned, measurements::stealth_vector < MeasurementFrame > & );
 	static void update ( unsigned, measurements::stealth_vector < MeasurementFrame > & );
 	static void hint ( unsigned, measurements::stealth_vector < MeasurementFrame > &, MemoryHint );
@@ -42,6 +46,8 @@ struct TimeDataFrame {
 	std::chrono::microseconds duration;
 	std::chrono::microseconds real_duration;
 
+	void to_xml_tokens ( std::deque < sax::Token > & ) const;
+
 	static void init ( unsigned, measurements::stealth_vector < MeasurementFrame > & );
 	static void update ( unsigned, measurements::stealth_vector < MeasurementFrame > & );
 };
@@ -58,6 +64,8 @@ struct MeasurementFrame {
 	TimeDataFrame	time;
 	MemoryDataFrame memory;
 
+	void to_xml_tokens ( std::deque < sax::Token > &, const measurements::stealth_vector < MeasurementFrame > & ) const;
+
 	MeasurementFrame ( measurements::stealth_string, measurements::Type, unsigned );
 };
 
diff --git a/alib2algo/src/measurements/MeasurementResults.cpp b/alib2algo/src/measurements/MeasurementResults.cpp
index 622c1991bb62ba9db434871f56fc42962d259894..347538dea7158485212978f94cdf6cc8e405d563 100644
--- a/alib2algo/src/measurements/MeasurementResults.cpp
+++ b/alib2algo/src/measurements/MeasurementResults.cpp
@@ -8,6 +8,18 @@ namespace measurements {
 MeasurementResults::MeasurementResults ( const measurements::stealth_vector < MeasurementFrame > & frames ) : frames ( frames ) {
 }
 
+std::deque < sax::Token > MeasurementResults::to_xml_tokens ( ) const {
+	std::deque < sax::Token > tokens;
+
+	tokens.emplace_back ( "MeasurementResults", sax::Token::TokenType::START_ELEMENT );
+
+	for(unsigned sub_idx : frames[0].sub_idxs) {
+		frames[sub_idx].to_xml_tokens ( tokens, frames );
+	}
+	tokens.emplace_back ( "MeasurementResults", sax::Token::TokenType::END_ELEMENT );
+	return tokens;
+}
+
 void MeasurementResults::print_as_list ( std::ostream & os ) const {
 	print_as_list ( os, 0 );
 }
diff --git a/alib2algo/src/measurements/MeasurementResults.hpp b/alib2algo/src/measurements/MeasurementResults.hpp
index b8ee8e4fa3d2c2c554555b399e36e63a4d2e6c14..ef38fcc1936d195149d612aa1bf328cc07fb3911 100644
--- a/alib2algo/src/measurements/MeasurementResults.hpp
+++ b/alib2algo/src/measurements/MeasurementResults.hpp
@@ -6,6 +6,7 @@
 #define MEASUREMENT_RESULTS_HPP_
 
 #include <ostream>
+#include "sax/SaxComposeInterface.h"
 #include "MeasurementTypes.hpp"
 #include "MeasurementFrames.hpp"
 
@@ -19,6 +20,8 @@ struct MeasurementResults {
 	void print_as_list ( std::ostream & ) const;
 	void print_as_tree ( std::ostream & ) const;
 
+	std::deque < sax::Token > to_xml_tokens ( ) const;
+
 private:
 	void print_as_list ( std::ostream &, unsigned ) const;
 	void print_as_tree ( std::ostream &, unsigned, std::string &, bool ) const;
diff --git a/alib2algo/src/measurements/MeasurementTypes.cpp b/alib2algo/src/measurements/MeasurementTypes.cpp
index 152f5909316520d429b57455213951d80fdeaa3f..ed97f8ae78d6876137047e2cf7de892220c53d61 100644
--- a/alib2algo/src/measurements/MeasurementTypes.cpp
+++ b/alib2algo/src/measurements/MeasurementTypes.cpp
@@ -5,34 +5,41 @@
 
 namespace measurements {
 
-std::ostream & operator <<( std::ostream & os, Type t ) {
+std::string to_string ( Type t ) {
 	switch ( t ) {
 	case Type::ROOT:
-		os << "ROOT";
-		break;
+		return "ROOT";
 
 	case Type::OVERALL:
-		os << "OVERALL";
-		break;
+		return "OVERALL";
 
 	case Type::INIT:
-		os << "INIT";
-		break;
+		return "INIT";
 
 	case Type::FINALIZE:
-		os << "FINALIZE";
-		break;
+		return "FINALIZE";
 
 	case Type::MAIN:
-		os << "MAIN";
-		break;
+		return "MAIN";
 
 	case Type::AUXILIARY:
-		os << "AUXILIARY";
-		break;
+		return "AUXILIARY";
 	}
 
+	return "ERR";
+}
+
+std::ostream & operator <<( std::ostream & os, Type t ) {
+	os << to_string ( t );
 	return os;
 }
 
+std::string to_string ( const stealth_string & ss ) {
+	return ss.c_str ( );
+}
+
+std::string to_string ( stealth_string & ss ) {
+	return ss.c_str ( );
+}
+
 }
diff --git a/alib2algo/src/measurements/MeasurementTypes.hpp b/alib2algo/src/measurements/MeasurementTypes.hpp
index 62d1982c6db7fe7917073889d89fc9e2efc11377..6e504d0b05d30a202634206883433600dfbc4a4c 100644
--- a/alib2algo/src/measurements/MeasurementTypes.hpp
+++ b/alib2algo/src/measurements/MeasurementTypes.hpp
@@ -15,7 +15,8 @@ enum class Type : unsigned {
 	ROOT = 1, OVERALL = 2, INIT = 4, FINALIZE = 8, MAIN = 16, AUXILIARY = 32
 };
 
-std::ostream & operator <<( std::ostream & os, Type t );
+std::string to_string ( Type );
+std::ostream & operator <<( std::ostream &, Type );
 
 template < typename T, typename ... Args >
 std::unique_ptr < T > make_unique ( Args && ... args ) {
@@ -43,6 +44,9 @@ public:
 
 using stealth_string = std::basic_string < char, std::char_traits < char >, stealth_allocator < char > >;
 
+std::string to_string ( const stealth_string & );
+std::string to_string ( stealth_string &);
+
 template < typename T >
 using stealth_vector = std::vector < T, stealth_allocator < T > >;
 
diff --git a/alib2algo/src/measurements/MemoryDataFrame.cpp b/alib2algo/src/measurements/MemoryDataFrame.cpp
index 61a0d9e6ad837d939216c1004b35ad43004815cb..5a0659dce2e9b865ccd3cdedac845bcba481f921 100644
--- a/alib2algo/src/measurements/MemoryDataFrame.cpp
+++ b/alib2algo/src/measurements/MemoryDataFrame.cpp
@@ -52,6 +52,20 @@ void MemoryDataFrame::hint ( unsigned frame_idx, measurements::stealth_vector <
 	}
 }
 
+void MemoryDataFrame::to_xml_tokens ( std::deque < sax::Token > & tokens ) const {
+	tokens.emplace_back ( "MemoryData", sax::Token::TokenType::START_ELEMENT );
+	tokens.emplace_back ( "StartHeapUsage", sax::Token::TokenType::START_ELEMENT );
+	tokens.emplace_back ( std::to_string ( start_heap_usage ), sax::Token::TokenType::CHARACTER );
+	tokens.emplace_back ( "StartHeapUsage", sax::Token::TokenType::END_ELEMENT );
+	tokens.emplace_back ( "EndHeapUsage", sax::Token::TokenType::START_ELEMENT );
+	tokens.emplace_back ( std::to_string ( end_heap_usage ), sax::Token::TokenType::CHARACTER );
+	tokens.emplace_back ( "EndHeapUsage", sax::Token::TokenType::END_ELEMENT );
+	tokens.emplace_back ( "HighWatermark", sax::Token::TokenType::START_ELEMENT );
+	tokens.emplace_back ( std::to_string ( high_watermark ), sax::Token::TokenType::CHARACTER );
+	tokens.emplace_back ( "HighWatermark", sax::Token::TokenType::END_ELEMENT );
+	tokens.emplace_back ( "MemoryData", sax::Token::TokenType::END_ELEMENT );
+}
+
 std::ostream & operator <<( std::ostream & os, const MemoryDataFrame & mdf ) {
 	os << mdf.start_heap_usage << "shu, " << mdf.end_heap_usage << "ehu, " << mdf.high_watermark << "hw";
 	return os;
diff --git a/alib2algo/src/measurements/TimeDataFrame.cpp b/alib2algo/src/measurements/TimeDataFrame.cpp
index 47a0ee3f996a4cc4fbc8370c1e1555b857fab026..cc448d34ef335c1ef5d9d9c1585d8e26a14aaa52 100644
--- a/alib2algo/src/measurements/TimeDataFrame.cpp
+++ b/alib2algo/src/measurements/TimeDataFrame.cpp
@@ -26,6 +26,17 @@ void TimeDataFrame::update ( unsigned frame_idx, measurements::stealth_vector <
 	parent_frame.time.real_duration -= current_frame.time.duration;
 }
 
+void TimeDataFrame::to_xml_tokens ( std::deque < sax::Token > & tokens ) const {
+	tokens.emplace_back ( "TimeData", sax::Token::TokenType::START_ELEMENT );
+	tokens.emplace_back ( "Duration", sax::Token::TokenType::START_ELEMENT );
+	tokens.emplace_back ( std::to_string ( duration.count ( ) ), sax::Token::TokenType::CHARACTER );
+	tokens.emplace_back ( "Duration", sax::Token::TokenType::END_ELEMENT );
+	tokens.emplace_back ( "RealDuration", sax::Token::TokenType::START_ELEMENT );
+	tokens.emplace_back ( std::to_string ( real_duration.count ( ) ), sax::Token::TokenType::CHARACTER );
+	tokens.emplace_back ( "RealDuration", sax::Token::TokenType::END_ELEMENT );
+	tokens.emplace_back ( "TimeData", sax::Token::TokenType::END_ELEMENT );
+}
+
 std::ostream & operator <<( std::ostream & os, const TimeDataFrame & tdf ) {
 	os << tdf.duration << ", " << tdf.real_duration;
 	return os;
diff --git a/alib2algo/test-src/measurements/MeasurementsTest.cpp b/alib2algo/test-src/measurements/MeasurementsTest.cpp
index ee76275e98969362183c1f079756bdcdd989fbd6..b9e805c9a061607d80e0c135b84da1709f929575 100644
--- a/alib2algo/test-src/measurements/MeasurementsTest.cpp
+++ b/alib2algo/test-src/measurements/MeasurementsTest.cpp
@@ -1,5 +1,6 @@
 #include "MeasurementsTest.h"
 #include "measurements/measurements.hpp"
+#include "sax/SaxComposeInterface.h"
 #include <thread>
 #include <cmath>
 
@@ -15,67 +16,71 @@ void MeasurementsTest::tearDown ( ) {
 
 void MeasurementsTest::testTimeMeasurements ( ) {
 	measurements::start ( "global", measurements::Type::OVERALL );
-		measurements::start ( "init", measurements::Type::INIT );
-		std::this_thread::sleep_for ( std::chrono::milliseconds ( 100 ) );
-		measurements::end ( );
-		measurements::start ( "main", measurements::Type::MAIN );
-			std::this_thread::sleep_for ( std::chrono::milliseconds ( 20 ) );
-			measurements::start ( "aux", measurements::Type::AUXILIARY );
-				std::this_thread::sleep_for ( std::chrono::milliseconds ( 40 ) );
-			measurements::end ( );
-			std::this_thread::sleep_for ( std::chrono::milliseconds ( 80 ) );
-			measurements::start ( "aux", measurements::Type::AUXILIARY );
-				std::this_thread::sleep_for ( std::chrono::milliseconds ( 40 ) );
-			measurements::end ( );
-			std::this_thread::sleep_for ( std::chrono::milliseconds ( 80 ) );
-		measurements::end ( );
-		measurements::start ( "fin", measurements::Type::FINALIZE );
-			std::this_thread::sleep_for ( std::chrono::milliseconds ( 30 ) );
-			measurements::start ( "aux", measurements::Type::AUXILIARY );
-				std::this_thread::sleep_for ( std::chrono::milliseconds ( 40 ) );
-			measurements::end ( );
-			std::this_thread::sleep_for ( std::chrono::milliseconds ( 80 ) );
-		measurements::end ( );
+	measurements::start ( "init", measurements::Type::INIT );
+	std::this_thread::sleep_for ( std::chrono::milliseconds ( 100 ) );
+	measurements::end ( );
+	measurements::start ( "main", measurements::Type::MAIN );
+	std::this_thread::sleep_for ( std::chrono::milliseconds ( 20 ) );
+	measurements::start ( "aux", measurements::Type::AUXILIARY );
+	std::this_thread::sleep_for ( std::chrono::milliseconds ( 40 ) );
+	measurements::end ( );
+	std::this_thread::sleep_for ( std::chrono::milliseconds ( 80 ) );
+	measurements::start ( "aux", measurements::Type::AUXILIARY );
+	std::this_thread::sleep_for ( std::chrono::milliseconds ( 40 ) );
+	measurements::end ( );
+	std::this_thread::sleep_for ( std::chrono::milliseconds ( 80 ) );
+	measurements::end ( );
+	measurements::start ( "fin", measurements::Type::FINALIZE );
+	std::this_thread::sleep_for ( std::chrono::milliseconds ( 30 ) );
+	measurements::start ( "aux", measurements::Type::AUXILIARY );
+	std::this_thread::sleep_for ( std::chrono::milliseconds ( 40 ) );
+	measurements::end ( );
+	std::this_thread::sleep_for ( std::chrono::milliseconds ( 80 ) );
+	measurements::end ( );
 	measurements::end ( );
 	measurements::start ( "global2", measurements::Type::OVERALL );
 	std::this_thread::sleep_for ( std::chrono::milliseconds ( 100 ) );
 	measurements::end ( );
 	measurements::start ( "global3", measurements::Type::OVERALL );
-		measurements::start ( "init", measurements::Type::INIT );
-			std::this_thread::sleep_for ( std::chrono::milliseconds ( 100 ) );
-		measurements::end ( );
-		measurements::start ( "main", measurements::Type::MAIN );
-			std::this_thread::sleep_for ( std::chrono::milliseconds ( 20 ) );
-			measurements::start ( "aux", measurements::Type::AUXILIARY );
-				std::this_thread::sleep_for ( std::chrono::milliseconds ( 40 ) );
-			measurements::end ( );
-			std::this_thread::sleep_for ( std::chrono::milliseconds ( 80 ) );
-			measurements::start ( "aux", measurements::Type::AUXILIARY );
-				std::this_thread::sleep_for ( std::chrono::milliseconds ( 40 ) );
-			measurements::end ( );
-			std::this_thread::sleep_for ( std::chrono::milliseconds ( 80 ) );
-		measurements::end ( );
+	measurements::start ( "init", measurements::Type::INIT );
+	std::this_thread::sleep_for ( std::chrono::milliseconds ( 100 ) );
+	measurements::end ( );
+	measurements::start ( "main", measurements::Type::MAIN );
+	std::this_thread::sleep_for ( std::chrono::milliseconds ( 20 ) );
+	measurements::start ( "aux", measurements::Type::AUXILIARY );
+	std::this_thread::sleep_for ( std::chrono::milliseconds ( 40 ) );
 	measurements::end ( );
+	std::this_thread::sleep_for ( std::chrono::milliseconds ( 80 ) );
+	measurements::start ( "aux", measurements::Type::AUXILIARY );
+	std::this_thread::sleep_for ( std::chrono::milliseconds ( 40 ) );
+	measurements::end ( );
+	std::this_thread::sleep_for ( std::chrono::milliseconds ( 80 ) );
+	measurements::end ( );
+	measurements::end ( );
+
+	std::cout << measurements::results ( ) << std::endl;
 
-	std::cout << measurements::results() << std::endl;
+	sax::SaxComposeInterface::printStdout ( measurements::results ( ).to_xml_tokens ( ) );
 }
 
 void MeasurementsTest::testMemoryMeasurements ( ) {
 
 	measurements::start ( "chunk1", measurements::Type::MAIN );
 	int * baz = new int[500];
+
 	delete[] baz;
 	measurements::end ( );
 
 	measurements::start ( "chunk2", measurements::Type::MAIN );
-		int * foo = new int[1000];
-		measurements::start ( "chunk21", measurements::Type::MAIN );
-			int * bar = new int[2000];
-		measurements::end ( );
-		delete[] foo;
-		delete[] bar;
+	int * foo = new int[1000];
+	measurements::start ( "chunk21", measurements::Type::MAIN );
+	int * bar = new int[2000];
+	measurements::end ( );
+	delete[] foo;
+	delete[] bar;
 	measurements::end ( );
 
-	std::cout << measurements::results() << std::endl;
-}
+	std::cout << measurements::results ( ) << std::endl;
 
+	sax::SaxComposeInterface::printStdout ( measurements::results ( ).to_xml_tokens ( ) );
+}