diff --git a/alib2std/src/extensions/tuple.hpp b/alib2std/src/extensions/tuple.hpp
index 754ce7e4cad467e2270ae5727da8857a3a43b78b..bc15b03260a33725e9b07b930c969da05d5d1eb5 100644
--- a/alib2std/src/extensions/tuple.hpp
+++ b/alib2std/src/extensions/tuple.hpp
@@ -17,6 +17,71 @@
 
 namespace std {
 
+template < class Result, unsigned I, class Tuple, class Callable >
+struct call_on_nth_helper;
+
+template < class Result, unsigned I, class Tuple, class Callable >
+struct call_on_nth_helper {
+	static Result call_on_nth_fn ( Tuple & t, unsigned index, Callable callback ) {
+		if ( index == 0 )
+			return callback ( std::get < tuple_size < Tuple >::value - I > ( t ) );
+		else
+			return call_on_nth_helper < Result, I - 1, Tuple, Callable >::call_on_nth_fn ( t, index - 1, callback );
+	}
+};
+
+template < class Result, class Tuple, class Callable >
+struct call_on_nth_helper < Result, 0, Tuple, Callable > {
+	static Result call_on_nth_fn ( Tuple &, unsigned, Callable ) {
+		throw std::out_of_range ( "Not enough elements in tuple." );
+	}
+};
+
+template < class Result, class Tuple, class Callable >
+Result call_on_nth ( Tuple & t, unsigned index, Callable callback ) {
+	return call_on_nth_helper < Result, tuple_size < Tuple >::value, Tuple, Callable >::call_on_nth_fn ( t, index, callback );
+}
+
+
+
+template < unsigned I, class Tuple, class Callable >
+struct foreach_helper;
+
+template < unsigned I, class Tuple, class Callable >
+struct foreach_helper {
+	static void foreach_fn ( Tuple & t, Callable callback ) {
+		callback ( std::get < I - 1 > ( t ) );
+		foreach_helper < I - 1, Tuple, Callable >::foreach_fn ( t, callback );
+	}
+};
+
+template < class Tuple, class Callable >
+struct foreach_helper < 0, Tuple, Callable > {
+	static void foreach_fn ( Tuple &, Callable ) {
+	}
+};
+
+template < class Tuple, class Callable >
+void foreach ( Tuple & t, Callable callback ) {
+	return foreach_helper < tuple_size < Tuple >::value, Tuple, Callable >::foreach_fn ( t, callback );
+}
+
+
+
+template < class Tuple, class Callable >
+bool all_of ( const Tuple & t, Callable callback ) {
+	bool res = true;
+
+	auto aggregateCallback = [ & ] ( auto & arg0 ) {
+		res &= callback ( arg0 );
+	};
+
+	std::foreach ( t, aggregateCallback  );
+	return res;
+}
+
+
+
 template<int I, class Tuple>
 struct operator_shift_left_impl;
 
@@ -43,6 +108,8 @@ std::ostream& operator<<(std::ostream& out, const std::tuple<Ts...>& tuple) {
 	return out;
 }
 
+
+
 template < int I, typename Tuple >
 struct compareTupleHelper;
 
@@ -76,6 +143,8 @@ struct compare < tuple < Ts ... > > {
 
 };
 
+
+
 template < class ... Ts >
 string to_string ( const std::tuple < Ts ... > & value ) {
 	std::stringstream ss;
@@ -83,6 +152,8 @@ string to_string ( const std::tuple < Ts ... > & value ) {
 	return ss.str();
 }
 
+
+
 template < class Type, int size, class ... Types >
 struct TupleBuilder;
 
diff --git a/alib2std/test-src/extensions/TupleTest.cpp b/alib2std/test-src/extensions/TupleTest.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..bef132abedaa778e2af3082fd11282e7a520a11f
--- /dev/null
+++ b/alib2std/test-src/extensions/TupleTest.cpp
@@ -0,0 +1,18 @@
+#include "TupleTest.h"
+#include <random>
+
+CPPUNIT_TEST_SUITE_NAMED_REGISTRATION( TupleTest, "bits" );
+CPPUNIT_TEST_SUITE_REGISTRATION( TupleTest );
+
+void TupleTest::setUp() {
+}
+
+void TupleTest::tearDown() {
+}
+
+void TupleTest::testCallOnNth() {
+	std::tuple < int, int, int, int, int > t = std::make_tuple ( 1, 2, 3, 4, 5 );
+
+	CPPUNIT_ASSERT ( std::call_on_nth < int > ( t, 1, [] ( int i ) { return i; } ) == 2 );
+}
+
diff --git a/alib2std/test-src/extensions/TupleTest.h b/alib2std/test-src/extensions/TupleTest.h
new file mode 100644
index 0000000000000000000000000000000000000000..feaa2b86d0275be300cb2cb29d526dcad59929c2
--- /dev/null
+++ b/alib2std/test-src/extensions/TupleTest.h
@@ -0,0 +1,19 @@
+#ifndef TUPLE_TEST_H_
+#define TUPLE_TEST_H_
+
+#include <cppunit/extensions/HelperMacros.h>
+
+class TupleTest : public CppUnit::TestFixture
+{
+  CPPUNIT_TEST_SUITE( TupleTest );
+  CPPUNIT_TEST( testCallOnNth );
+  CPPUNIT_TEST_SUITE_END();
+
+public:
+  void setUp();
+  void tearDown();
+
+  void testCallOnNth();
+};
+
+#endif  // TUPLE_TEST_H_