diff --git a/Mesh/search.hpp b/Mesh/search.hpp
index 275ad47148a4ff03cd1b742a3680af955e767fc3..4499692c8489197b6c2dea746398380fa7bf5917 100644
--- a/Mesh/search.hpp
+++ b/Mesh/search.hpp
@@ -36,17 +36,18 @@ struct search_traits {
 
 template<typename State,
          typename Visitor,
-         typename Successor,
-         typename Action = typename successor_traits<Successor>::action_type,
-         typename Delta = typename action_traits<Action>::delta_type>
+         typename Successor>
 void depth_first_search(State &init, Visitor &visit, Successor &fn) {
+  typedef typename successor_traits<Successor>::action_type action;
+  typedef typename action_traits<action>::delta_type delta;
+
   visit(init);
 
-  std::vector<Action> actions;
+  std::vector<action> actions;
   fn(init, std::back_inserter(actions));
 
-  for (const Action &action : actions) {
-    Delta change(action(init));
+  for (const action &action : actions) {
+    delta change(action(init));
 
     change.apply(init);
     depth_first_search(init, visit, fn);
@@ -56,19 +57,20 @@ void depth_first_search(State &init, Visitor &visit, Successor &fn) {
 
 template<typename State,
          typename Visitor,
-         typename Successor,
-         typename Action = typename successor_traits<Successor>::action_type,
-         typename Delta = typename action_traits<Action>::delta_type>
+         typename Successor>
 void depth_limited_search(State &init, Visitor &visit, Successor &fn,
                           size_t max_depth) {
+  typedef typename successor_traits<Successor>::action_type action;
+  typedef typename action_traits<action>::delta_type delta;
+
   visit(init);
   if (max_depth == 0) return;
 
-  std::vector<Action> actions;
+  std::vector<action> actions;
   fn(init, std::back_inserter(actions));
 
-  for (const Action &action : actions) {
-    Delta change(action(init));
+  for (const action &action : actions) {
+    delta change(action(init));
 
     change.apply(init);
     depth_limited_search(init, visit, fn, max_depth - 1);
@@ -79,10 +81,10 @@ void depth_limited_search(State &init, Visitor &visit, Successor &fn,
 template<typename State,
          typename Visitor,
          typename Successor,
-         typename Queue,
-         typename Action = typename successor_traits<Successor>::action_type,
-         typename Delta = typename action_traits<Action>::delta_type>
+         typename Queue>
 void tree_search(State &init, Visitor &visit, Successor &fn, Queue q) {
+  typedef typename successor_traits<Successor>::action_type action;
+
   q.push(init);
 
   while (!q.empty()) {
@@ -91,10 +93,10 @@ void tree_search(State &init, Visitor &visit, Successor &fn, Queue q) {
 
     visit(s);
 
-    std::vector<Action> actions;
+    std::vector<action> actions;
     fn(s, std::back_inserter(actions));
 
-    for (const Action &action : actions) {
+    for (const action &action : actions) {
       State to_add(s);
       action(s).apply(to_add);
 
@@ -105,9 +107,7 @@ void tree_search(State &init, Visitor &visit, Successor &fn, Queue q) {
 
 template<typename State,
          typename Visitor,
-         typename Successor,
-         typename Action = typename successor_traits<Successor>::action_type,
-         typename Delta = typename action_traits<Action>::delta_type>
+         typename Successor>
 void breadth_first_search(State &init, Visitor &visit, Successor &fn) {
   tree_search(init, visit, fn, std::queue<State>());
 }
@@ -115,9 +115,7 @@ void breadth_first_search(State &init, Visitor &visit, Successor &fn) {
 template<typename State,
          typename Visitor,
          typename Successor,
-         typename Compare = std::less<State>,
-         typename Action = typename successor_traits<Successor>::action_type,
-         typename Delta = typename action_traits<Action>::delta_type>
+         typename Compare = std::less<State>>
 void best_first_search(State &init, Visitor &visit, Successor &fn,
                        Compare c = Compare()) {
   tree_search(init, visit, fn, std::priority_queue<State, Compare>(c));
@@ -129,13 +127,14 @@ void best_first_search(State &init, Visitor &visit, Successor &fn,
  */
 template<typename State,
          typename Successor,
-         typename Evaluator,
-         typename Action = typename successor_traits<Successor>::action_type,
-         typename Delta  = typename action_traits<Action>::delta_type,
-         typename Score  = typename evaluator_traits<Evaluator>::score_type>
+         typename Evaluator>
 void greedy_search(State &state, Successor &fn, Evaluator &eval) {
+  typedef typename successor_traits<Successor>::action_type action;
+  typedef typename action_traits<action>::delta_type delta;
+  typedef typename evaluator_traits<Evaluator>::score_type score;
+
   while (true) {
-    std::vector<Action> actions;
+    std::vector<action> actions;
     fn(state, std::back_inserter(actions));
 
     if (actions.empty()) return;
@@ -145,15 +144,15 @@ void greedy_search(State &state, Successor &fn, Evaluator &eval) {
       continue;
     }
 
-    std::vector<Delta> changes(actions.size());
+    std::vector<delta> changes(actions.size());
     std::transform(actions.begin(), actions.end(),
-                   changes.begin(), [&](const Action &a) {
+                   changes.begin(), [&](const action &a) {
                      return a(state);
                    });
 
-    std::vector<Score> scores(actions.size());
+    std::vector<score> scores(actions.size());
     std::transform(changes.begin(), changes.end(),
-                   scores.begin(), [&](const Delta &delta) {
+                   scores.begin(), [&](const delta &delta) {
                      delta.apply(state);
                      auto result = eval(state);
                      delta.reverse(state);
@@ -170,17 +169,17 @@ void greedy_search(State &state, Successor &fn, Evaluator &eval) {
 
 template<typename State,
          typename Selector,
-         typename Search,
-         typename Fragment = typename selector_traits<Selector>::fragment_type,
-         typename Assigment = typename search_traits<Search>::assignment_type>
+         typename Search>
 void large_neighborhood_search(State &state, Selector &selector,
-                               Search &search,
-                               std::size_t time_limit = 100) {
+                               Search &search, std::size_t time_limit = 100) {
+  typedef typename selector_traits<Selector>::fragment_type fragment;
+  typedef typename search_traits<Search>::assignment_type assignment;
+
   using namespace std::chrono;
   auto start = steady_clock::now();
   while (steady_clock::now() - start < time_limit * 1s) {
-    Fragment fragment(selector(state));
-    Assigment assignment(search(state, fragment));
+    fragment fragment(selector(state));
+    assignment assignment(search(state, fragment));
     assignment(state, fragment);
   }
 }
@@ -241,18 +240,18 @@ struct mcts_node {
 template<typename State,
          typename Successor,
          typename Evaluator,
-         typename Iterator,
-
-         typename Action = typename successor_traits<Successor>::action_type,
-         typename Delta  = typename action_traits<Action>::delta_type,
-         typename Score  = typename evaluator_traits<Evaluator>::score_type>
-void mcts_simulation(mcts_node<Score> *node,
+         typename Iterator>
+void mcts_simulation(mcts_node<typename evaluator_traits<Evaluator>::score_type> *node,
                      State &state, Successor &fn, Evaluator &eval, size_t n,
                      Iterator action_begin, Iterator action_end) {
-  std::vector<Action> actions(action_begin, action_end);
+  typedef typename successor_traits<Successor>::action_type action;
+  typedef typename action_traits<action>::delta_type delta;
+  typedef typename evaluator_traits<Evaluator>::score_type score;
+
+  std::vector<action> actions(action_begin, action_end);
 
-  std::vector<mcts_node<Score>*> ancestors;
-  std::vector<Delta> changes;
+  std::vector<mcts_node<score>*> ancestors;
+  std::vector<delta> changes;
 
   ancestors.push_back(node);
 
@@ -280,7 +279,7 @@ void mcts_simulation(mcts_node<Score> *node,
       i = rand() % actions.size();
     }
 
-    Delta change = actions[i](state);
+    delta change = actions[i](state);
     changes.push_back(change);
 
     change.apply(state);
@@ -289,10 +288,10 @@ void mcts_simulation(mcts_node<Score> *node,
     fn(state, std::back_inserter(actions));
   }
 
-  Score score(eval(state));
+  score result(eval(state));
 
-  for (mcts_node<Score> *node : ancestors)
-    node->update(score);
+  for (mcts_node<score> *node : ancestors)
+    node->update(result);
 
   for (auto it = changes.rbegin(); it != changes.rend(); it++)
     (*it).reverse(state);
@@ -300,13 +299,12 @@ void mcts_simulation(mcts_node<Score> *node,
 
 template<typename State,
          typename Successor,
-         typename Evaluator,
-
-         typename Action = typename successor_traits<Successor>::action_type,
-         typename Delta  = typename action_traits<Action>::delta_type,
-         typename Score  = typename evaluator_traits<Evaluator>::score_type>
+         typename Evaluator>
 void monte_carlo_tree_search(State &state, Successor &fn, Evaluator &eval) {
-  std::vector<Action> actions;
+  typedef typename successor_traits<Successor>::action_type action;
+  typedef typename evaluator_traits<Evaluator>::score_type score;
+
+  std::vector<action> actions;
 
   while (true) {
     actions.clear();
@@ -323,7 +321,7 @@ void monte_carlo_tree_search(State &state, Successor &fn, Evaluator &eval) {
     else {
       using namespace std::chrono;
 
-      mcts_node<Score> node;
+      mcts_node<score> node;
 
       size_t i;