diff --git a/src/cell.hpp b/src/cell.hpp
index 11f938f52f3e4e69a35f9a3eb951ca2fce95cbd6..0eb7c8133fb7908f4b725fce6ecb48bbfa82aa92 100644
--- a/src/cell.hpp
+++ b/src/cell.hpp
@@ -90,8 +90,11 @@ public:
         spike_detectors_(other.spike_detectors_),
         probes_(other.probes_)
      {
-        util::assign_by(segments_, other.segments_,
-            [](const segment_ptr& p) { return p->clone(); });
+         // unique_ptr's cannot be copy constructed, do a manual assignment
+         auto siter = segments_.begin();
+         for (const auto& s : other.segments_) {
+             *siter = std::move(s->clone());
+         }
      }
 
     /// add a soma to the cell
@@ -242,4 +245,3 @@ cable_segment* cell::add_cable(cell::index_type parent, Args ...args)
 
 } // namespace mc
 } // namespace nest
-
diff --git a/src/util/rangeutil.hpp b/src/util/rangeutil.hpp
index 95b9faaca67efe165a8389fd2d2963ad80117b3d..839fb4527be34cf04777c65d7e934712aa7c57e3 100644
--- a/src/util/rangeutil.hpp
+++ b/src/util/rangeutil.hpp
@@ -12,6 +12,7 @@
 #include <util/meta.hpp>
 #include <util/range.hpp>
 #include <util/transform.hpp>
+#include <util/meta.hpp>
 
 namespace nest {
 namespace mc {
@@ -67,12 +68,12 @@ AssignableContainer& assign(AssignableContainer& c, const Seq& seq) {
     return c;
 }
 
+
 // Assign sequence to a container with transform `proj`
 
 template <typename AssignableContainer, typename Seq, typename Proj>
 AssignableContainer& assign_by(AssignableContainer& c, const Seq& seq, const Proj& proj) {
-    auto canon = canonical_view(transform_view(seq, proj));
-    c.assign(std::begin(canon), std::end(canon));
+    assign(c, transform_view(seq, proj));
     return c;
 }