diff --git a/test/ubench/event_binning.cpp b/test/ubench/event_binning.cpp
index 85e78db5dddbab4d176e8bc87396c214c6b3c357..115328ca8b4f16257c5cc7c2ee47c88e90958bcc 100644
--- a/test/ubench/event_binning.cpp
+++ b/test/ubench/event_binning.cpp
@@ -45,9 +45,8 @@ std::vector<pse_vector> generate_inputs(const std::vector<cell_gid_type>& gids,
     for (std::size_t i=0; i<ncells*ev_per_cell; ++i) {
         spike_event ev;
         auto idx = gid_dist(gen);
-        auto gid = gids[idx];
         auto t = 1.;
-        ev.target = {cell_gid_type(gid), cell_lid_type(0)};
+        ev.target = cell_lid_type(0);
         ev.time = t;
         ev.weight = 0;
         input_events[idx].push_back(ev);
diff --git a/test/ubench/event_setup.cpp b/test/ubench/event_setup.cpp
index eb1ba88ddccc1ce48f1bd35e29a992f003b7f065..33f8a97d3e4143adc19fd3ab379cf7f604c996b7 100644
--- a/test/ubench/event_setup.cpp
+++ b/test/ubench/event_setup.cpp
@@ -22,8 +22,8 @@
 
 using namespace arb;
 
-std::vector<spike_event> generate_inputs(size_t ncells, size_t ev_per_cell) {
-    std::vector<spike_event> input_events;
+std::vector<std::pair<cell_gid_type, spike_event>> generate_inputs(size_t ncells, size_t ev_per_cell) {
+    std::vector<std::pair<cell_gid_type, spike_event>> input_events;
     std::default_random_engine engine;
     std::uniform_int_distribution<cell_gid_type>(0u, ncells);
 
@@ -38,53 +38,15 @@ std::vector<spike_event> generate_inputs(size_t ncells, size_t ev_per_cell) {
         spike_event ev;
         auto gid = gid_dist(gen);
         auto t = time_dist(gen);
-        ev.target = {cell_gid_type(gid), cell_lid_type(0)};
+        ev.target = cell_lid_type(0);
         ev.time = t;
         ev.weight = 0;
-        input_events.push_back(ev);
+        input_events.emplace_back(gid, ev);
     }
 
     return input_events;
 }
 
-void single_queue(benchmark::State& state) {
-    using pev = spike_event;
-
-    const std::size_t ncells = state.range(0);
-    const std::size_t ev_per_cell = state.range(1);
-
-    // state
-    std::vector<pev> input_events = generate_inputs(ncells, ev_per_cell);
-
-    event_queue<pev> events;
-    while (state.KeepRunning()) {
-        // push events into a single queue
-        for (const auto& e: input_events) {
-            events.push(e);
-        }
-
-        // pop from queue to form single sorted vector
-        std::vector<pev> staged_events;
-        staged_events.reserve(events.size());
-        while (auto e = events.pop_if_before(1.f)) {
-            staged_events.push_back(*e);
-        }
-        // sort the staged events in order of target id
-        std::stable_sort(
-            staged_events.begin(), staged_events.end(),
-            [](const pev& l, const pev& r) {return l.target.gid<r.target.gid;});
-
-        // TODO: calculate the partition ranges. This overhead is not included in
-        // this benchmark, however this method is that much slower already, that
-        // illustrating this wouldn't change the conclusions.
-
-        // clobber contents of queue for next round of benchmark
-        events.clear();
-
-        benchmark::ClobberMemory();
-    }
-}
-
 void n_queue(benchmark::State& state) {
     using pev = spike_event;
     const std::size_t ncells = state.range(0);
@@ -101,7 +63,7 @@ void n_queue(benchmark::State& state) {
 
         // push events into the queue corresponding to target cell
         for (const auto& e: input_events) {
-            event_lanes[e.target.gid].push(e);
+            event_lanes[e.first].push(e.second);
         }
 
         // pop from queue to form single sorted vector
@@ -149,7 +111,7 @@ void n_vector(benchmark::State& state) {
 
         // push events into a per-cell vectors (unsorted)
         for (const auto& e: input_events) {
-            event_lanes[e.target.gid].push_back(e);
+            event_lanes[e.first].push_back(e.second);
         }
         // sort each per-cell queue and keep track of the subset of sorted
         // events that are to be delivered in this interval.
@@ -198,8 +160,6 @@ void run_custom_arguments(benchmark::internal::Benchmark* b) {
     }
 }
 
-//BENCHMARK(run_original)->Apply(run_custom_arguments);
-BENCHMARK(single_queue)->Apply(run_custom_arguments);
 BENCHMARK(n_queue)->Apply(run_custom_arguments);
 BENCHMARK(n_vector)->Apply(run_custom_arguments);
 
diff --git a/test/ubench/fvm_discretize.cpp b/test/ubench/fvm_discretize.cpp
index a1ba32539ba244fd13a1bcfba53c47a94b4e3fa3..124e144ed98167f2b98712efd51cde02c04f1f69 100644
--- a/test/ubench/fvm_discretize.cpp
+++ b/test/ubench/fvm_discretize.cpp
@@ -37,7 +37,7 @@ void run_cv_geom(benchmark::State& state) {
     auto ends = cv_policy_fixed_per_branch(ncv_per_branch).cv_boundary_points(c);
 
     while (state.KeepRunning()) {
-        benchmark::DoNotOptimize(cv_geometry_from_ends(c, ends));
+        benchmark::DoNotOptimize(cv_geometry(c, ends));
     }
 }
 
@@ -48,7 +48,7 @@ void run_cv_geom_every_segment(benchmark::State& state) {
     auto ends = cv_policy_every_segment().cv_boundary_points(c);
 
     while (state.KeepRunning()) {
-        benchmark::DoNotOptimize(cv_geometry_from_ends(c, ends));
+        benchmark::DoNotOptimize(cv_geometry(c, ends));
     }
 }
 
@@ -61,7 +61,7 @@ void run_cv_geom_explicit(benchmark::State& state) {
         auto ends = cv_policy_every_segment().cv_boundary_points(c);
         auto ends2 = cv_policy_explicit(std::move(ends)).cv_boundary_points(c);
 
-        benchmark::DoNotOptimize(cv_geometry_from_ends(c, ends2));
+        benchmark::DoNotOptimize(cv_geometry(c, ends2));
     }
 }
 
diff --git a/test/ubench/mech_vec.cpp b/test/ubench/mech_vec.cpp
index 1fc8354735d30539bd948f825c60a761fc9168e2..5da4a6c021ae0af6a943482644b18b3923e4c9b3 100644
--- a/test/ubench/mech_vec.cpp
+++ b/test/ubench/mech_vec.cpp
@@ -62,13 +62,13 @@ public:
         tree.append(s1, {0,0,soma_radius+dend_length,dend_radius}, 3);
 
         arb::decor decor;
-        decor.paint(arb::reg::tagged(1), "pas");
+        decor.paint(arb::reg::tagged(1), arb::density("pas"));
         decor.set_default(arb::cv_policy_max_extent((dend_length+soma_radius*2)/num_comp_));
 
         auto distribution = std::uniform_real_distribution<float>(0.f, 1.0f);
         for(unsigned i = 0; i < num_synapse_; i++) {
             auto gen = std::mt19937(i);
-            decor.place(arb::mlocation{0, distribution(gen)}, "expsyn");
+            decor.place(arb::mlocation{0, distribution(gen)}, arb::synapse("expsyn"), "syn");
         }
 
         return arb::cable_cell{arb::morphology(tree), {}, decor};
@@ -109,7 +109,7 @@ public:
         tree.append(s1, {0,0,soma_radius+dend_length,dend_radius}, 3);
 
         arb::decor decor;
-        decor.paint(arb::reg::all(), "pas");
+        decor.paint(arb::reg::all(), arb::density("pas"));
         decor.set_default(arb::cv_policy_max_extent((dend_length+soma_radius*2)/num_comp_));
 
         return arb::cable_cell {arb::morphology(tree), {}, decor};
@@ -152,7 +152,7 @@ public:
         tree.append(s2,           {dend_length,0          ,soma_radius+dend_length, dend_radius}, 3);
 
         arb::decor decor;
-        decor.paint(arb::reg::all(), "pas");
+        decor.paint(arb::reg::all(), arb::density("pas"));
         decor.set_default(arb::cv_policy_max_extent((dend_length*3+soma_radius*2)/num_comp_));
 
         return arb::cable_cell{arb::morphology(tree), {}, decor};
@@ -193,7 +193,7 @@ public:
         tree.append(s1,           {0          ,0          ,soma_radius+dend_length, dend_radius}, 3);
 
         arb::decor decor;
-        decor.paint(arb::reg::all(), "hh");
+        decor.paint(arb::reg::all(), arb::density("hh"));
         decor.set_default(arb::cv_policy_max_extent((dend_length+soma_radius*2)/num_comp_));
 
         return arb::cable_cell{arb::morphology(tree), {}, decor};
@@ -236,7 +236,7 @@ public:
         tree.append(          s2, {dend_length,0          ,soma_radius+dend_length, dend_radius}, 3);
 
         arb::decor decor;
-        decor.paint(arb::reg::all(), "hh");
+        decor.paint(arb::reg::all(), arb::density("hh"));
         decor.set_default(arb::cv_policy_max_extent((dend_length*3+soma_radius*2)/num_comp_));
 
         return arb::cable_cell{arb::morphology(tree), {}, decor};
@@ -256,13 +256,8 @@ void expsyn_1_branch_current(benchmark::State& state) {
     const unsigned nsynapse = state.range(1);
     recipe_expsyn_1_branch rec_expsyn_1_branch(ncomp, nsynapse);
 
-    std::vector<cell_gid_type> gids = {0};
-    std::vector<target_handle> target_handles;
-    std::vector<fvm_index_type> cell_to_intdom;
-    probe_association_map probe_handles;
-
     fvm_cell cell((execution_context()));
-    cell.initialize(gids, rec_expsyn_1_branch, cell_to_intdom, target_handles, probe_handles);
+    cell.initialize({0}, rec_expsyn_1_branch);
 
     auto& m = find_mechanism("expsyn", cell);
 
@@ -276,13 +271,8 @@ void expsyn_1_branch_state(benchmark::State& state) {
     const unsigned nsynapse = state.range(1);
     recipe_expsyn_1_branch rec_expsyn_1_branch(ncomp, nsynapse);
 
-    std::vector<cell_gid_type> gids = {0};
-    std::vector<target_handle> target_handles;
-    std::vector<fvm_index_type> cell_to_intdom;
-    probe_association_map probe_handles;
-
     fvm_cell cell((execution_context()));
-    cell.initialize(gids, rec_expsyn_1_branch, cell_to_intdom, target_handles, probe_handles);
+    cell.initialize({0}, rec_expsyn_1_branch);
 
     auto& m = find_mechanism("expsyn", cell);
 
@@ -295,13 +285,8 @@ void pas_1_branch_current(benchmark::State& state) {
     const unsigned ncomp = state.range(0);
     recipe_pas_1_branch rec_pas_1_branch(ncomp);
 
-    std::vector<cell_gid_type> gids = {0};
-    std::vector<target_handle> target_handles;
-    std::vector<fvm_index_type> cell_to_intdom;
-    probe_association_map probe_handles;
-
     fvm_cell cell((execution_context()));
-    cell.initialize(gids, rec_pas_1_branch, cell_to_intdom, target_handles, probe_handles);
+    cell.initialize({0}, rec_pas_1_branch);
 
     auto& m = find_mechanism("pas", cell);
 
@@ -314,13 +299,8 @@ void pas_3_branches_current(benchmark::State& state) {
     const unsigned ncomp = state.range(0);
     recipe_pas_3_branches rec_pas_3_branches(ncomp);
 
-    std::vector<cell_gid_type> gids = {0};
-    std::vector<target_handle> target_handles;
-    std::vector<fvm_index_type> cell_to_intdom;
-    probe_association_map probe_handles;
-
     fvm_cell cell((execution_context()));
-    cell.initialize(gids, rec_pas_3_branches, cell_to_intdom, target_handles, probe_handles);
+    cell.initialize({0}, rec_pas_3_branches);
 
     auto& m = find_mechanism("pas", cell);
 
@@ -333,13 +313,8 @@ void hh_1_branch_state(benchmark::State& state) {
     const unsigned ncomp = state.range(0);
     recipe_hh_1_branch rec_hh_1_branch(ncomp);
 
-    std::vector<cell_gid_type> gids = {0};
-    std::vector<target_handle> target_handles;
-    std::vector<fvm_index_type> cell_to_intdom;
-    probe_association_map probe_handles;
-
     fvm_cell cell((execution_context()));
-    cell.initialize(gids, rec_hh_1_branch, cell_to_intdom, target_handles, probe_handles);
+    cell.initialize({0}, rec_hh_1_branch);
 
     auto& m = find_mechanism("hh", cell);
 
@@ -352,13 +327,8 @@ void hh_1_branch_current(benchmark::State& state) {
     const unsigned ncomp = state.range(0);
     recipe_hh_1_branch rec_hh_1_branch(ncomp);
 
-    std::vector<cell_gid_type> gids = {0};
-    std::vector<target_handle> target_handles;
-    std::vector<fvm_index_type> cell_to_intdom;
-    probe_association_map probe_handles;
-
     fvm_cell cell((execution_context()));
-    cell.initialize(gids, rec_hh_1_branch, cell_to_intdom, target_handles, probe_handles);
+    cell.initialize({0}, rec_hh_1_branch);
 
     auto& m = find_mechanism("hh", cell);
 
@@ -371,13 +341,8 @@ void hh_3_branches_state(benchmark::State& state) {
     const unsigned ncomp = state.range(0);
     recipe_hh_3_branches rec_hh_3_branches(ncomp);
 
-    std::vector<cell_gid_type> gids = {0};
-    std::vector<target_handle> target_handles;
-    std::vector<fvm_index_type> cell_to_intdom;
-    probe_association_map probe_handles;
-
     fvm_cell cell((execution_context()));
-    cell.initialize(gids, rec_hh_3_branches, cell_to_intdom, target_handles, probe_handles);
+    cell.initialize({0}, rec_hh_3_branches);
 
     auto& m = find_mechanism("hh", cell);
 
@@ -390,13 +355,8 @@ void hh_3_branches_current(benchmark::State& state) {
     const unsigned ncomp = state.range(0);
     recipe_hh_3_branches rec_hh_3_branches(ncomp);
 
-    std::vector<cell_gid_type> gids = {0};
-    std::vector<target_handle> target_handles;
-    std::vector<fvm_index_type> cell_to_intdom;
-    probe_association_map probe_handles;
-
     fvm_cell cell((execution_context()));
-    cell.initialize(gids, rec_hh_3_branches, cell_to_intdom, target_handles, probe_handles);
+    cell.initialize({0}, rec_hh_3_branches);
 
     auto& m = find_mechanism("hh", cell);