diff --git a/alib2algo/src/measurements/MeasurementEngine.cpp b/alib2algo/src/measurements/MeasurementEngine.cpp
index c805f779834a2c550d35354961644ad11913463e..c33e023013ef03ddc5216c03934289e15e2e640a 100644
--- a/alib2algo/src/measurements/MeasurementEngine.cpp
+++ b/alib2algo/src/measurements/MeasurementEngine.cpp
@@ -9,8 +9,7 @@ namespace measurements {
 MeasurementEngine MeasurementEngine::INSTANCE;
 
 MeasurementEngine::MeasurementEngine ( ) {
-	frames.emplace_back ( std::move ( "Root" ), measurements::Type::ROOT, 0 );
-	frame_idx_stack.push_back ( 0 );
+	reset_measurements ( );
 }
 
 void MeasurementEngine::push_measurement_frame ( std::string frame_name, measurements::Type frame_type ) {
@@ -36,6 +35,14 @@ void MeasurementEngine::pop_measurement_frame ( ) {
 	MemoryDataFrame::update ( current_idx, frames );
 }
 
+void MeasurementEngine::reset_measurements ( ) {
+	frames.clear ( );
+	frame_idx_stack.clear ( );
+
+	frames.emplace_back ( std::move ( "Root" ), measurements::Type::ROOT, 0 );
+	frame_idx_stack.push_back ( 0 );
+}
+
 void MeasurementEngine::memory_hint ( MemoryHint mh ) {
 	if ( ( frame_idx_stack.size ( ) == 0 ) || ( frames[frame_idx_stack.back ( )].type == measurements::Type::ROOT ) ) return;
 
diff --git a/alib2algo/src/measurements/MeasurementEngine.hpp b/alib2algo/src/measurements/MeasurementEngine.hpp
index 69590f048fc8ee25bc2c9cbee339672e809cba59..f45419bda9242c7cd78b531e92279206b4ef3786 100644
--- a/alib2algo/src/measurements/MeasurementEngine.hpp
+++ b/alib2algo/src/measurements/MeasurementEngine.hpp
@@ -22,6 +22,7 @@ class MeasurementEngine {
 public:
 	void push_measurement_frame ( std::string, measurements::Type );
 	void pop_measurement_frame ( );
+	void reset_measurements ( );
 
 	void memory_hint ( MemoryHint );
 
diff --git a/alib2algo/src/measurements/MeasurementFrames.hpp b/alib2algo/src/measurements/MeasurementFrames.hpp
index 016aaf24cca451ddc37e0da718c5ffd00b5401f3..65c91d98c33fd5693a5b260393e12f7b89431b84 100644
--- a/alib2algo/src/measurements/MeasurementFrames.hpp
+++ b/alib2algo/src/measurements/MeasurementFrames.hpp
@@ -23,11 +23,11 @@ struct MemoryHint {
 };
 
 struct MemoryDataFrame {
-	unsigned start_heap_usage;
-	unsigned end_heap_usage;
-	unsigned high_watermark;
+	size_t start_heap_usage;
+	size_t end_heap_usage;
+	size_t high_watermark;
 
-	unsigned current_heap_usage;
+	size_t current_heap_usage;
 
 	std::string to_string ( );
 	// void		to_xml ( );
diff --git a/alib2algo/src/measurements/MemoryDataFrame.cpp b/alib2algo/src/measurements/MemoryDataFrame.cpp
index d45f20f861db57b6aa7ae327271c56e3252a264b..73563315805a06643e570de8028df68f796633c1 100644
--- a/alib2algo/src/measurements/MemoryDataFrame.cpp
+++ b/alib2algo/src/measurements/MemoryDataFrame.cpp
@@ -4,6 +4,8 @@
 
 #include "MeasurementFrames.hpp"
 
+#include <iostream>
+
 using namespace std::chrono;
 
 namespace measurements {
@@ -12,17 +14,25 @@ void MemoryDataFrame::init ( unsigned frame_idx, std::vector < MeasurementFrame
 	MeasurementFrame & current_frame = frames[frame_idx];
 	MeasurementFrame & parent_frame	 = frames[current_frame.parent_idx];
 
-	current_frame.memory.start_heap_usage = parent_frame.memory.current_heap_usage;
-	current_frame.memory.current_heap_usage = parent_frame.memory.current_heap_usage;
-	current_frame.memory.high_watermark = parent_frame.memory.current_heap_usage;
+	if ( parent_frame.type != measurements::Type::ROOT ) {
+		current_frame.memory.start_heap_usage = parent_frame.memory.current_heap_usage;
+		current_frame.memory.current_heap_usage = parent_frame.memory.current_heap_usage;
+		current_frame.memory.high_watermark = parent_frame.memory.current_heap_usage;
+	}
 }
 
 void MemoryDataFrame::update ( unsigned frame_idx, std::vector < MeasurementFrame > & frames ) {
 	MeasurementFrame & current_frame = frames[frame_idx];
 	MeasurementFrame & parent_frame	 = frames[current_frame.parent_idx];
 
-	parent_frame.memory.current_heap_usage = current_frame.memory.current_heap_usage;
 	current_frame.memory.end_heap_usage = current_frame.memory.current_heap_usage;
+
+	 // if we end up with more memory from children, adjust watermark
+	if ( current_frame.memory.current_heap_usage > current_frame.memory.high_watermark )
+		current_frame.memory.high_watermark = current_frame.memory.current_heap_usage;
+
+	if ( parent_frame.type != measurements::Type::ROOT )
+		parent_frame.memory.current_heap_usage = current_frame.memory.current_heap_usage;
 }
 
 void MemoryDataFrame::hint ( unsigned frame_idx, std::vector < MeasurementFrame > & frames, MemoryHint hint ) {
@@ -32,7 +42,10 @@ void MemoryDataFrame::hint ( unsigned frame_idx, std::vector < MeasurementFrame
 	switch ( hint.type ) {
 	case MemoryHint::Type::NEW:
 		current_frame.memory.current_heap_usage += hint.size;
-		current_frame.memory.high_watermark = std::max ( current_frame.memory.high_watermark, current_frame.memory.current_heap_usage );
+
+		if ( current_frame.memory.current_heap_usage > current_frame.memory.high_watermark )
+			current_frame.memory.high_watermark = current_frame.memory.current_heap_usage;
+
 		break;
 
 	case MemoryHint::Type::DELETE:
diff --git a/alib2algo/src/measurements/measurements.hpp b/alib2algo/src/measurements/measurements.hpp
index ccd80db859c55b31a237ae421e1931748625bca3..47c7cba0e1ba75e053be164b1108c24bc83f9fa2 100644
--- a/alib2algo/src/measurements/measurements.hpp
+++ b/alib2algo/src/measurements/measurements.hpp
@@ -17,6 +17,10 @@ void end ( ) {
 	MeasurementEngine::INSTANCE.pop_measurement_frame ( );
 }
 
+void reset ( ) {
+	MeasurementEngine::INSTANCE.reset_measurements ( );
+}
+
 void memory_hint ( MemoryHint mh ) {
 	MeasurementEngine::INSTANCE.memory_hint ( std::move ( mh ) );
 }
diff --git a/alib2algo/test-src/measurements/MeasurementsTest.cpp b/alib2algo/test-src/measurements/MeasurementsTest.cpp
index 253c94cfb5e495d0d98237a7941c2549fa715ac9..5a93d292f96c825d25b5472a82ade99ff95e4ddb 100644
--- a/alib2algo/test-src/measurements/MeasurementsTest.cpp
+++ b/alib2algo/test-src/measurements/MeasurementsTest.cpp
@@ -7,12 +7,13 @@ CPPUNIT_TEST_SUITE_NAMED_REGISTRATION ( MeasurementsTest, "measurements" );
 CPPUNIT_TEST_SUITE_REGISTRATION ( MeasurementsTest );
 
 void MeasurementsTest::setUp ( ) {
+	measurements::reset ( );
 }
 
 void MeasurementsTest::tearDown ( ) {
 }
 
-void MeasurementsTest::testMeasurements ( ) {
+void MeasurementsTest::testTimeMeasurements ( ) {
 	measurements::start ( "global", measurements::Type::OVERALL );
 		measurements::start ( "init", measurements::Type::INIT );
 		std::this_thread::sleep_for ( std::chrono::milliseconds ( 100 ) );
@@ -40,3 +41,22 @@ void MeasurementsTest::testMeasurements ( ) {
 	measurements::print_as_list ( std::cout );
 	std::cout << std::endl;
 }
+
+void MeasurementsTest::testMemoryMeasurements ( ) {
+
+	measurements::start ( "chunk1", measurements::Type::MAIN );
+	measurements::end ( );
+
+	measurements::start ( "chunk2", measurements::Type::MAIN );
+		int * foo = new int[500];
+		measurements::start ( "chunk21", measurements::Type::MAIN );
+			int * bar = new int[500];
+		measurements::end ( );
+		delete foo;
+		delete bar;
+	measurements::end ( );
+
+	measurements::print_as_list ( std::cout );
+	std::cout << std::endl;
+}
+
diff --git a/alib2algo/test-src/measurements/MeasurementsTest.h b/alib2algo/test-src/measurements/MeasurementsTest.h
index 067898bf102435b539603ac9a7bdc75e5342ad48..a5782b151834c659baea255f5bfe2b0e43d38e04 100644
--- a/alib2algo/test-src/measurements/MeasurementsTest.h
+++ b/alib2algo/test-src/measurements/MeasurementsTest.h
@@ -5,14 +5,16 @@
 
 class MeasurementsTest : public CppUnit::TestFixture {
   CPPUNIT_TEST_SUITE ( MeasurementsTest );
-  CPPUNIT_TEST ( testMeasurements );
+  CPPUNIT_TEST ( testTimeMeasurements );
+  CPPUNIT_TEST ( testMemoryMeasurements );
   CPPUNIT_TEST_SUITE_END ( );
 
 public:
   void setUp ( );
   void tearDown ( );
 
-  void testMeasurements ( );
+  void testTimeMeasurements ( );
+  void testMemoryMeasurements ( );
 };
 
 #endif // MEASUREMENTS_TEST_H_