diff --git a/alib2algo/src/graph/traverse/Bfs.cpp b/alib2algo/src/graph/traverse/Bfs.cpp
index 5fdba120792983e895e9902ce99bfb83877d4232..e951bd4d76474b575a845e1a7b5de646735125ff 100644
--- a/alib2algo/src/graph/traverse/Bfs.cpp
+++ b/alib2algo/src/graph/traverse/Bfs.cpp
@@ -12,12 +12,12 @@ namespace traverse
 struct Data
 {
 	Node start;
-	std::function<bool(const Node&)> func;
-	std::function<bool(const Node&, const Node&, int)> func2;
+	Bfs::Function func;
+	Bfs::FunctionExt func2;
 };
 
 template <typename T>
-static void bfs_impl(const T &graph, const Node &start, std::function<bool(const Node&)> func)
+static void bfs_impl(const T &graph, const Node &start, Bfs::Function func)
 {
 	std::unordered_map<Node, bool> visited;
 	std::queue<Node> q;
@@ -42,7 +42,7 @@ static void bfs_impl(const T &graph, const Node &start, std::function<bool(const
 }
 
 template <typename T>
-static void bfs2_impl(const T &graph, const Node &start, std::function<bool(const Node&, const Node&, int)> func)
+static void bfs2_impl(const T &graph, const Node &start, Bfs::FunctionExt func)
 {
 	std::unordered_map<Node, int> distances;
 	std::unordered_map<Node, Node> predecessors;
@@ -68,34 +68,34 @@ static void bfs2_impl(const T &graph, const Node &start, std::function<bool(cons
 	}
 }
 
-void Bfs::bfs(const Graph &graph, const Node &start, std::function<bool(const Node&)> func)
+void Bfs::bfs(const Graph &graph, const Node &start, Bfs::Function func)
 {
 	Data data = { start, func, nullptr };
 	graph.getData().Accept(static_cast<void*>(&data), BFS);
 }
 
-void Bfs::bfs(const Graph &graph, const Node &start, std::function<bool(const Node&, const Node&, int)> func)
+void Bfs::bfs(const Graph &graph, const Node &start, Bfs::FunctionExt func)
 {
 	Data data = { start, nullptr, func };
 	graph.getData().Accept(static_cast<void*>(&data), BFS);
 }
 
-void Bfs::bfs(const DirectedGraph &graph, const Node &start, std::function<bool(const Node&)> func)
+void Bfs::bfs(const DirectedGraph &graph, const Node &start, Bfs::Function func)
 {
 	bfs_impl(graph, start, func);
 }
 
-void Bfs::bfs(const DirectedGraph &graph, const Node &start, std::function<bool(const Node&, const Node&, int)> func)
+void Bfs::bfs(const DirectedGraph &graph, const Node &start, Bfs::FunctionExt func)
 {
 	bfs2_impl(graph, start, func);
 }
 
-void Bfs::bfs(const UndirectedGraph &graph, const Node &start, std::function<bool(const Node&)> func)
+void Bfs::bfs(const UndirectedGraph &graph, const Node &start, Bfs::Function func)
 {
 	bfs_impl(graph, start, func);
 }
 
-void Bfs::bfs(const UndirectedGraph &graph, const Node &start, std::function<bool(const Node&, const Node&, int)> func)
+void Bfs::bfs(const UndirectedGraph &graph, const Node &start, Bfs::FunctionExt func)
 {
 	bfs2_impl(graph, start, func);
 }
diff --git a/alib2algo/src/graph/traverse/Bfs.h b/alib2algo/src/graph/traverse/Bfs.h
index c7c4b40b0bcbd22256894e812a2695ec68e578b1..f4a468bfe911e33812902e0b34096c27155c798a 100644
--- a/alib2algo/src/graph/traverse/Bfs.h
+++ b/alib2algo/src/graph/traverse/Bfs.h
@@ -13,19 +13,22 @@ namespace traverse
 
 // func is called for each visited node, traversal stops when returning false
 //
-// bool func(const Node &visitedNode);
-// bool func(const Node &visitedNode, const Node &predecessor, int distanceFromStart);
+// bool Function(const Node &visitedNode);
+// bool FunctionExt(const Node &visitedNode, const Node &predecessor, int distanceFromStart);
 
 class Bfs : public graph::VisitableGraphBase::const_visitor_type
 {
 public:
-	static void bfs(const Graph &graph, const Node &start, std::function<bool(const Node&)> func);
-	static void bfs(const Graph &graph, const Node &start, std::function<bool(const Node&, const Node&, int)> func);
+	typedef std::function<bool(const Node&)> Function;
+	typedef std::function<bool(const Node&, const Node&, int)> FunctionExt;
 
-	static void bfs(const DirectedGraph &graph, const Node &start, std::function<bool(const Node&)> func);
-	static void bfs(const DirectedGraph &graph, const Node &start, std::function<bool(const Node&, const Node&, int)> func);
-	static void bfs(const UndirectedGraph &graph, const Node &start, std::function<bool(const Node&)> func);
-	static void bfs(const UndirectedGraph &graph, const Node &start, std::function<bool(const Node&, const Node&, int)> func);
+	static void bfs(const Graph &graph, const Node &start, Function func);
+	static void bfs(const Graph &graph, const Node &start, FunctionExt func);
+
+	static void bfs(const DirectedGraph &graph, const Node &start, Function func);
+	static void bfs(const DirectedGraph &graph, const Node &start, FunctionExt func);
+	static void bfs(const UndirectedGraph &graph, const Node &start, Function func);
+	static void bfs(const UndirectedGraph &graph, const Node &start, FunctionExt func);
 
 private:
 	void Visit(void *data, const DirectedGraph &graph) const;
diff --git a/alib2algo/src/graph/traverse/Dfs.cpp b/alib2algo/src/graph/traverse/Dfs.cpp
index dda9f51b1f18110a6162bb9ac3bab85e8b87794b..10094da1557242c126e9a2af5e1d05c341715efa 100644
--- a/alib2algo/src/graph/traverse/Dfs.cpp
+++ b/alib2algo/src/graph/traverse/Dfs.cpp
@@ -12,12 +12,12 @@ namespace traverse
 struct Data
 {
 	Node start;
-	std::function<bool(const Node&)> func;
-	std::function<void(const Node&, const Node&, int, int)> func2;
+	Dfs::Function func;
+	Dfs::FunctionExt func2;
 };
 
 template <typename T>
-static void dfs_impl(const T &graph, const Node &start, std::function<bool(const Node&)> func)
+static void dfs_impl(const T &graph, const Node &start, Dfs::Function func)
 {
 	std::unordered_map<Node, bool> visited;
 	std::stack<Node> s;
@@ -42,7 +42,7 @@ static void dfs_impl(const T &graph, const Node &start, std::function<bool(const
 }
 
 template <typename T>
-static void dfs2_impl(const T &graph, const Node &n, const Node &p, std::unordered_map<Node, bool> &visited, int &time, std::function<void(const Node&, const Node&, int, int)> func)
+static void dfs2_impl(const T &graph, const Node &n, const Node &p, std::unordered_map<Node, bool> &visited, int &time, Dfs::FunctionExt func)
 {
 	int opened = ++time;
 	visited[n] = true;
@@ -56,36 +56,36 @@ static void dfs2_impl(const T &graph, const Node &n, const Node &p, std::unorder
 	func(n, p, opened, ++time);
 }
 
-void Dfs::dfs(const Graph &graph, const Node &start, std::function<bool(const Node&)> func)
+void Dfs::dfs(const Graph &graph, const Node &start, Dfs::Function func)
 {
 	Data data = { start, func, nullptr };
 	graph.getData().Accept(static_cast<void*>(&data), DFS);
 }
 
-void Dfs::dfs(const Graph &graph, const Node &start, std::function<void(const Node&, const Node&, int, int)> func)
+void Dfs::dfs(const Graph &graph, const Node &start, Dfs::FunctionExt func)
 {
 	Data data = { start, nullptr, func };
 	graph.getData().Accept(static_cast<void*>(&data), DFS);
 }
 
-void Dfs::dfs(const DirectedGraph &graph, const Node &start, std::function<bool(const Node&)> func)
+void Dfs::dfs(const DirectedGraph &graph, const Node &start, Dfs::Function func)
 {
 	dfs_impl(graph, start, func);
 }
 
-void Dfs::dfs(const DirectedGraph &graph, const Node &start, std::function<void(const Node&, const Node&, int, int)> func)
+void Dfs::dfs(const DirectedGraph &graph, const Node &start, Dfs::FunctionExt func)
 {
 	int time = 0;
 	std::unordered_map<Node, bool> visited;
 	dfs2_impl(graph, start, Node(), visited, time, func);
 }
 
-void Dfs::dfs(const UndirectedGraph &graph, const Node &start, std::function<bool(const Node&)> func)
+void Dfs::dfs(const UndirectedGraph &graph, const Node &start, Dfs::Function func)
 {
 	dfs_impl(graph, start, func);
 }
 
-void Dfs::dfs(const UndirectedGraph &graph, const Node &start, std::function<void(const Node&, const Node&, int, int)> func)
+void Dfs::dfs(const UndirectedGraph &graph, const Node &start, Dfs::FunctionExt func)
 {
 	int time = 0;
 	std::unordered_map<Node, bool> visited;
diff --git a/alib2algo/src/graph/traverse/Dfs.h b/alib2algo/src/graph/traverse/Dfs.h
index bc45c5de49db59168532fdccc756abe10ea4e84a..f77ac7ac7313e343af1dc99d3ac4cfdb2ff6c0cd 100644
--- a/alib2algo/src/graph/traverse/Dfs.h
+++ b/alib2algo/src/graph/traverse/Dfs.h
@@ -12,16 +12,23 @@ namespace traverse
 {
 
 // func is called for each visited node, traversal stops when returning false
+//
+// bool Function(const Node &node);
+// void FunctionExt(const Node &node, const Node &predecessor, int openTime, int closeTime);
+
 class Dfs : public graph::VisitableGraphBase::const_visitor_type
 {
 public:
-	static void dfs(const Graph &graph, const Node &start, std::function<bool(const Node&)> func);
-	static void dfs(const Graph &graph, const Node &start, std::function<void(const Node&, const Node&, int, int)> func);
+	typedef std::function<bool(const Node&)> Function;
+	typedef std::function<void(const Node&, const Node&, int, int)> FunctionExt;
+
+	static void dfs(const Graph &graph, const Node &start, Function func);
+	static void dfs(const Graph &graph, const Node &start, FunctionExt func);
 
-	static void dfs(const DirectedGraph &graph, const Node &start, std::function<bool(const Node&)> func);
-	static void dfs(const DirectedGraph &graph, const Node &start, std::function<void(const Node&, const Node&, int, int)> func);
-	static void dfs(const UndirectedGraph &graph, const Node &start, std::function<bool(const Node&)> func);
-	static void dfs(const UndirectedGraph &graph, const Node &start, std::function<void(const Node&, const Node&, int, int)> func);
+	static void dfs(const DirectedGraph &graph, const Node &start, Function func);
+	static void dfs(const DirectedGraph &graph, const Node &start, FunctionExt func);
+	static void dfs(const UndirectedGraph &graph, const Node &start, Function func);
+	static void dfs(const UndirectedGraph &graph, const Node &start, FunctionExt func);
 
 private:
 	void Visit(void *data, const DirectedGraph &graph) const;