diff --git a/alib2measure/src/measurements/CounterDataFrame.cpp b/alib2measure/src/measurements/CounterDataFrame.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..4a07c9f85ac5309190ffb9de63831731cd9bb47e
--- /dev/null
+++ b/alib2measure/src/measurements/CounterDataFrame.cpp
@@ -0,0 +1,112 @@
+/*
+ * Author: Radovan Cerveny
+ */
+
+#include "MeasurementFrames.hpp"
+
+namespace measurements {
+
+void CounterDataFrame::init ( unsigned frame_idx, measurements::stealth_vector < MeasurementFrame > & frames ) {
+	MeasurementFrame & current_frame = frames[frame_idx];
+	MeasurementFrame & parent_frame	 = frames[current_frame.parent_idx];
+
+	if ( parent_frame.type != measurements::Type::ROOT )
+		current_frame.counter.counters = parent_frame.counter.counters;
+}
+
+void CounterDataFrame::update ( unsigned frame_idx, measurements::stealth_vector < MeasurementFrame > & frames ) {
+	MeasurementFrame & current_frame = frames[frame_idx];
+	MeasurementFrame & parent_frame	 = frames[current_frame.parent_idx];
+}
+
+void CounterDataFrame::hint ( unsigned frame_idx, measurements::stealth_vector < MeasurementFrame > & frames, CounterHint hint ) {
+
+	CounterHint::value_type delta;
+
+	switch ( hint.type ) {
+	case CounterHint::Type::ADD:
+		delta = hint.value;
+		break;
+
+	case CounterHint::Type::INC:
+		delta = 1;
+		break;
+
+	case CounterHint::Type::SUB:
+		delta = -hint.value;
+		break;
+
+	case CounterHint::Type::DEC:
+		delta = -1;
+		break;
+	}
+
+	frames[frame_idx].counter.real_counters[hint.name] += delta;
+
+	unsigned cur_idx = frame_idx;
+
+	for ( ; ; ) {
+		MeasurementFrame & current_frame = frames[cur_idx];
+
+		if ( current_frame.type == measurements::Type::ROOT ) break;
+
+		current_frame.counter.counters[hint.name] += delta;
+
+		cur_idx = current_frame.parent_idx;
+	}
+}
+
+void CounterDataFrame::xml_tokens ( std::deque < sax::Token > & tokens, unsigned idx, const measurements::stealth_vector < MeasurementFrame > & frames ) {
+	const CounterDataFrame & cdf = frames[idx].counter;
+
+	tokens.emplace_back ( "CounterData", sax::Token::TokenType::START_ELEMENT );
+
+	tokens.emplace_back ( "Counters", sax::Token::TokenType::START_ELEMENT );
+	for ( const auto & elem : cdf.counters) {
+		tokens.emplace_back ( "Counter", sax::Token::TokenType::START_ELEMENT );
+		tokens.emplace_back ( "Name", sax::Token::TokenType::START_ELEMENT );
+		tokens.emplace_back ( measurements::to_string ( elem.first ), sax::Token::TokenType::CHARACTER );
+		tokens.emplace_back ( "Name", sax::Token::TokenType::END_ELEMENT );
+		tokens.emplace_back ( "Value", sax::Token::TokenType::START_ELEMENT );
+		tokens.emplace_back ( std::to_string ( elem.second ), sax::Token::TokenType::CHARACTER );
+		tokens.emplace_back ( "Value", sax::Token::TokenType::END_ELEMENT );
+		tokens.emplace_back ( "Counter", sax::Token::TokenType::END_ELEMENT );
+	}
+	tokens.emplace_back ( "Counters", sax::Token::TokenType::END_ELEMENT );
+
+	tokens.emplace_back ( "RealCounters", sax::Token::TokenType::START_ELEMENT );
+	for ( const auto & elem : cdf.real_counters) {
+		tokens.emplace_back ( "Counter", sax::Token::TokenType::START_ELEMENT );
+		tokens.emplace_back ( "Name", sax::Token::TokenType::START_ELEMENT );
+		tokens.emplace_back ( measurements::to_string ( elem.first ), sax::Token::TokenType::CHARACTER );
+		tokens.emplace_back ( "Name", sax::Token::TokenType::END_ELEMENT );
+		tokens.emplace_back ( "Value", sax::Token::TokenType::START_ELEMENT );
+		tokens.emplace_back ( std::to_string ( elem.second ), sax::Token::TokenType::CHARACTER );
+		tokens.emplace_back ( "Value", sax::Token::TokenType::END_ELEMENT );
+		tokens.emplace_back ( "Counter", sax::Token::TokenType::END_ELEMENT );
+	}
+	tokens.emplace_back ( "RealCounters", sax::Token::TokenType::END_ELEMENT );
+
+	tokens.emplace_back ( "CounterData", sax::Token::TokenType::END_ELEMENT );
+}
+
+std::ostream & operator <<( std::ostream & os, const CounterDataFrame & cdf ) {
+
+	os << "(";
+	for ( auto it = cdf.counters.begin ( ); it != cdf.counters.end ( ); ++it ) {
+		os << it->first << " : " << it->second;
+
+		if ( it != cdf.counters.end ( ) ) os << ", ";
+	}
+	os << "), (";
+	for ( auto it = cdf.real_counters.begin ( ); it != cdf.real_counters.end ( ); ++it ) {
+		os << it->first << " : " << it->second;
+
+		if ( it != cdf.real_counters.end ( ) ) os << ", ";
+	}
+	os << ")";
+
+	return os;
+}
+
+}
diff --git a/alib2measure/src/measurements/MeasurementEngine.cpp b/alib2measure/src/measurements/MeasurementEngine.cpp
index 91ad5d18fbc0f8a5d224c772051a653f98f8d960..c340917d551bd64e6a193a6f07aa47e2119d9373 100644
--- a/alib2measure/src/measurements/MeasurementEngine.cpp
+++ b/alib2measure/src/measurements/MeasurementEngine.cpp
@@ -25,6 +25,7 @@ void MeasurementEngine::push_measurement_frame ( measurements::stealth_string fr
 
 	TimeDataFrame::init ( current_idx, frames );
 	MemoryDataFrame::init ( current_idx, frames );
+	CounterDataFrame::init ( current_idx, frames );
 }
 
 void MeasurementEngine::pop_measurement_frame ( ) {
@@ -34,6 +35,7 @@ void MeasurementEngine::pop_measurement_frame ( ) {
 
 	TimeDataFrame::update ( current_idx, frames );
 	MemoryDataFrame::update ( current_idx, frames );
+	CounterDataFrame::update ( current_idx, frames );
 }
 
 void MeasurementEngine::reset_measurements ( ) {
@@ -55,4 +57,11 @@ void MeasurementEngine::hint ( MemoryHint mh ) {
 	MemoryDataFrame::hint ( frame_idx_stack.back ( ), frames, std::move ( mh ) );
 }
 
+template < >
+void MeasurementEngine::hint ( CounterHint ch ) {
+	if ( ( frame_idx_stack.size ( ) == 0 ) || ( frames[frame_idx_stack.back ( )].type == measurements::Type::ROOT ) ) return;
+
+	CounterDataFrame::hint ( frame_idx_stack.back ( ), frames, std::move ( ch ) );
+}
+
 }
diff --git a/alib2measure/src/measurements/MeasurementFrame.cpp b/alib2measure/src/measurements/MeasurementFrame.cpp
index 042ed6b06ee58a7a3aea3010165ed20d143f5535..31198ad79b76c16bd25546c602337fc007cf7ead 100644
--- a/alib2measure/src/measurements/MeasurementFrame.cpp
+++ b/alib2measure/src/measurements/MeasurementFrame.cpp
@@ -24,6 +24,7 @@ void MeasurementFrame::xml_tokens ( std::deque < sax::Token > & tokens, unsigned
 	if ( frame.type != measurements::Type::ROOT ) {
 		TimeDataFrame::xml_tokens ( tokens, idx, frames );
 		MemoryDataFrame::xml_tokens ( tokens, idx, frames );
+		CounterDataFrame::xml_tokens ( tokens, idx, frames );
 	}
 
 	tokens.emplace_back ( "SubFrames", sax::Token::TokenType::START_ELEMENT );
@@ -40,7 +41,7 @@ std::ostream & operator <<( std::ostream & os, const MeasurementFrame & frame )
 
 	std::stringstream ss;
 
-	ss << "(TIME: " << frame.time << "), (MEM: " << frame.memory << ")";
+	ss << "(TIME: " << frame.time << "), (MEM: " << frame.memory << "), (COUNTER: " << frame.counter << ")";
 
 	os << std::make_tuple ( frame.name, frame.type, frame.parent_idx, frame.sub_idxs, ss.str ( ) );
 	return os;
diff --git a/alib2measure/src/measurements/MeasurementFrames.hpp b/alib2measure/src/measurements/MeasurementFrames.hpp
index 025121becf3eaa31a36eaabcc3f754e019cd4514..ac1d1a7bec17d7ca5b3238d9b0084dc830938506 100644
--- a/alib2measure/src/measurements/MeasurementFrames.hpp
+++ b/alib2measure/src/measurements/MeasurementFrames.hpp
@@ -15,6 +15,29 @@ namespace measurements {
 
 struct MeasurementFrame;
 
+struct CounterHint {
+	using value_type = long long int;
+	enum class Type {
+		ADD, SUB, INC, DEC
+	};
+
+	measurements::stealth_string name;
+	Type						 type;
+	value_type					 value;
+};
+
+struct CounterDataFrame {
+	measurements::stealth_map < measurements::stealth_string, CounterHint::value_type > counters;
+	measurements::stealth_map < measurements::stealth_string, CounterHint::value_type > real_counters;
+
+	static void init ( unsigned, measurements::stealth_vector < MeasurementFrame > & );
+	static void update ( unsigned, measurements::stealth_vector < MeasurementFrame > & );
+	static void hint ( unsigned, measurements::stealth_vector < MeasurementFrame > &, CounterHint );
+	static void xml_tokens ( std::deque < sax::Token > &, unsigned, const measurements::stealth_vector < MeasurementFrame > & );
+};
+
+std::ostream & operator <<( std::ostream &, const CounterDataFrame & );
+
 struct MemoryHint {
 	enum class Type {
 		NEW, DELETE
@@ -60,8 +83,9 @@ struct MeasurementFrame {
 
 	measurements::stealth_vector < unsigned > sub_idxs;
 
-	TimeDataFrame	time;
-	MemoryDataFrame memory;
+	TimeDataFrame	 time;
+	MemoryDataFrame	 memory;
+	CounterDataFrame counter;
 
 	MeasurementFrame ( measurements::stealth_string, measurements::Type, unsigned );
 	static void xml_tokens ( std::deque < sax::Token > &, unsigned, const measurements::stealth_vector < MeasurementFrame > & );
diff --git a/alib2measure/src/measurements/MeasurementTypes.hpp b/alib2measure/src/measurements/MeasurementTypes.hpp
index 86e8b00ce3607b630957df68df10ed88f36384e0..c68ef51c7e2f0e845f9015b412b8856a6f62b8f1 100644
--- a/alib2measure/src/measurements/MeasurementTypes.hpp
+++ b/alib2measure/src/measurements/MeasurementTypes.hpp
@@ -7,6 +7,7 @@
 
 #include <memory>
 #include <vector>
+#include <map>
 #include "MeasurementNew.hpp"
 
 namespace measurements {
@@ -66,6 +67,8 @@ std::ostream & operator <<( std::ostream & os, const stealth_vector < T > & vec
 	return os << "]";
 }
 
+template < class Key, class T, class Compare = std::less < Key > >
+using stealth_map = std::map < Key, T, Compare, stealth_allocator < std::pair < const Key, T > > >;
 }
 
 #endif /* MEASUREMENT_TYPES_HPP_ */
diff --git a/alib2measure/src/measurements/MemoryDataFrame.cpp b/alib2measure/src/measurements/MemoryDataFrame.cpp
index b15685a496995421dc8b198710a1b74542529d00..a30185a0e468b1d973326536c2ef23d98a5b7572 100644
--- a/alib2measure/src/measurements/MemoryDataFrame.cpp
+++ b/alib2measure/src/measurements/MemoryDataFrame.cpp
@@ -4,8 +4,6 @@
 
 #include "MeasurementFrames.hpp"
 
-using namespace std::chrono;
-
 namespace measurements {
 
 void MemoryDataFrame::init ( unsigned frame_idx, measurements::stealth_vector < MeasurementFrame > & frames ) {
diff --git a/alib2measure/src/measurements/measurements.cpp b/alib2measure/src/measurements/measurements.cpp
index 1f41abdfe7dad43fd2f6b7141e5b5c109554eeb6..51f72f96d370db8e98715c935d23678ce8be6fde 100644
--- a/alib2measure/src/measurements/measurements.cpp
+++ b/alib2measure/src/measurements/measurements.cpp
@@ -32,4 +32,9 @@ void hint ( MemoryHint hint ) {
 	MeasurementEngine::INSTANCE.hint ( std::move ( hint ) );
 }
 
+template < >
+void hint ( CounterHint hint ) {
+	MeasurementEngine::INSTANCE.hint ( std::move ( hint ) );
+}
+
 }
diff --git a/alib2measure/test-src/measurements/MeasurementsTest.cpp b/alib2measure/test-src/measurements/MeasurementsTest.cpp
index e34b30961bfea2c36df7c018cf3ee36acfabc403..56d4a5a5a2479b7df003b13f34640aca51a7d46b 100644
--- a/alib2measure/test-src/measurements/MeasurementsTest.cpp
+++ b/alib2measure/test-src/measurements/MeasurementsTest.cpp
@@ -84,3 +84,30 @@ void MeasurementsTest::testMemoryMeasurements ( ) {
 	std::cout << measurements::MeasurementFormat::TREE << measurements::results ( ) << std::endl;
 	std::cout << measurements::MeasurementFormat::XML << measurements::results ( ) << std::endl;
 }
+
+void MeasurementsTest::testCounterMeasurements ( ) {
+
+	measurements::start ( "chunk1", measurements::Type::MAIN );
+	measurements::hint( measurements::CounterHint { "test1", measurements::CounterHint::Type::ADD, 5 } );
+	measurements::hint( measurements::CounterHint { "test2", measurements::CounterHint::Type::INC, 0 } );
+	measurements::start ( "chunk11", measurements::Type::MAIN );
+	measurements::hint( measurements::CounterHint { "test3", measurements::CounterHint::Type::DEC, 0} );
+	measurements::start ( "chunk111", measurements::Type::MAIN );
+	measurements::hint( measurements::CounterHint { "test1", measurements::CounterHint::Type::DEC, 0 } );
+	measurements::hint( measurements::CounterHint { "test2", measurements::CounterHint::Type::SUB, 10 } );
+	measurements::hint( measurements::CounterHint { "test3", measurements::CounterHint::Type::DEC, 0} );
+	measurements::hint( measurements::CounterHint { "test4", measurements::CounterHint::Type::DEC, 0} );
+	measurements::end ( );
+	measurements::start ( "chunk112", measurements::Type::MAIN );
+	measurements::hint( measurements::CounterHint { "test1", measurements::CounterHint::Type::DEC, 0 } );
+	measurements::hint( measurements::CounterHint { "test2", measurements::CounterHint::Type::SUB, 10 } );
+	measurements::hint( measurements::CounterHint { "test3", measurements::CounterHint::Type::DEC, 0} );
+	measurements::hint( measurements::CounterHint { "test4", measurements::CounterHint::Type::DEC, 0} );
+	measurements::end ( );
+	measurements::end ( );
+	measurements::end ( );
+
+	std::cout << measurements::MeasurementFormat::LIST << measurements::results ( ) << std::endl;
+	std::cout << measurements::MeasurementFormat::TREE << measurements::results ( ) << std::endl;
+	std::cout << measurements::MeasurementFormat::XML << measurements::results ( ) << std::endl;
+}
\ No newline at end of file
diff --git a/alib2measure/test-src/measurements/MeasurementsTest.h b/alib2measure/test-src/measurements/MeasurementsTest.h
index a5782b151834c659baea255f5bfe2b0e43d38e04..1e53cd854e6f8509cfcd48bca709c39fa29d7896 100644
--- a/alib2measure/test-src/measurements/MeasurementsTest.h
+++ b/alib2measure/test-src/measurements/MeasurementsTest.h
@@ -7,6 +7,7 @@ class MeasurementsTest : public CppUnit::TestFixture {
   CPPUNIT_TEST_SUITE ( MeasurementsTest );
   CPPUNIT_TEST ( testTimeMeasurements );
   CPPUNIT_TEST ( testMemoryMeasurements );
+  CPPUNIT_TEST ( testCounterMeasurements );
   CPPUNIT_TEST_SUITE_END ( );
 
 public:
@@ -15,6 +16,7 @@ public:
 
   void testTimeMeasurements ( );
   void testMemoryMeasurements ( );
+  void testCounterMeasurements ( );
 };
 
 #endif // MEASUREMENTS_TEST_H_