diff --git a/pynesci/src/consumer/CMakeLists.txt b/pynesci/src/consumer/CMakeLists.txt
index 895260d4359579411b11bb9f8674b63838d8de89..de0783f26e71a2d21a2373505b3b6922c8788cb6 100644
--- a/pynesci/src/consumer/CMakeLists.txt
+++ b/pynesci/src/consumer/CMakeLists.txt
@@ -34,6 +34,6 @@ add_python_module(
   HEADERS ${HEADERS}
   PYTHON_SOURCES ${PYTHON_SOURCES}
   INCLUDE_DIRECTORIES ${CMAKE_CURRENT_SOURCE_DIR}
-  LINK_LIBRARIES nesci::consumer Boost::python${PYTHON_VERSION_MAJOR}${PYTHON_VERSION_MINOR} Boost::disable_autolinking
+  LINK_LIBRARIES Boost::python${PYTHON_VERSION_MAJOR}${PYTHON_VERSION_MINOR} Boost::disable_autolinking conduit nesci::nesci nesci::consumer
   OUTPUT_DIRECTORY ${PYCONSUMER_OUTPUT_DIR}
   )
diff --git a/pynesci/src/consumer/device_data_view.hpp b/pynesci/src/consumer/device_data_view.hpp
index 979bec0f43c4dcc49d1dc9bcef60d3e940aa5fe0..95872b1be8822199d79c2e3e70318bbe0f62bd3b 100644
--- a/pynesci/src/consumer/device_data_view.hpp
+++ b/pynesci/src/consumer/device_data_view.hpp
@@ -21,6 +21,7 @@
 
 #include <string>
 
+#include "boost/python.hpp"
 #include "nesci/consumer/device_data_view.hpp"
 #include "pyconsumer.hpp"
 #include "pynesci/suppress_warnings.hpp"
@@ -32,7 +33,7 @@ SUPPRESS_WARNINGS_BEGIN
 
 void ExposeDeviceDataView() {
   class_<nesci::consumer::DeviceDataView>("DeviceDataView",
-                                          init<const conduit::Node&>())
+                                          init<const conduit::Node*>())
       .def("HasName", &nesci::consumer::DeviceDataView::HasName)
       .def("GetDeviceName", &nesci::consumer::DeviceDataView::GetName)
       .def("GetDeviceType", &nesci::consumer::DeviceDataView::GetType);
diff --git a/pynesci/src/consumer/nest_multimeter_data_view.hpp b/pynesci/src/consumer/nest_multimeter_data_view.hpp
index 886c830d60922515fd0e0a354c5c8fe3cf1faa66..cfd3b7bff022f3bce7d8ace05f0f350036da3267 100644
--- a/pynesci/src/consumer/nest_multimeter_data_view.hpp
+++ b/pynesci/src/consumer/nest_multimeter_data_view.hpp
@@ -87,7 +87,7 @@ boost::python::list GetNestMultimeterFloatingPointAttributeValues(
 void ExposeNestMultimeterDataView() {
   class_<nesci::consumer::NestMultimeterDataView,
          bases<nesci::consumer::DeviceDataView>>("NestMultimeterDataView",
-                                                 init<const conduit::Node&>())
+                                                 init<const conduit::Node*>())
       .def("IsValid", &nesci::consumer::NestMultimeterDataView::IsValid)
       .def("GetTimestep", &nesci::consumer::NestMultimeterDataView::GetTimestep)
       .def("GetNeuronIds",
diff --git a/pynesci/src/consumer/spike_detector_data_view.hpp b/pynesci/src/consumer/spike_detector_data_view.hpp
index e192e3e5c88f44285e82181b378a80819381cfba..f44c863f6946f9fa7c0dfe6db81ac14a07b2f1cb 100644
--- a/pynesci/src/consumer/spike_detector_data_view.hpp
+++ b/pynesci/src/consumer/spike_detector_data_view.hpp
@@ -30,35 +30,35 @@ namespace consumer {
 
 SUPPRESS_WARNINGS_BEGIN
 
-boost::python::object IsSpikeDetectorValid(
-    nesci::consumer::DeviceDataView* spike_detector) {
-  return static_cast<boost::python::object>(spike_detector->IsValid());
-}
-
 boost::python::list GetSpikeDetectorTimesteps(
-    nesci::consumer::DeviceDataView* spike_detector) {
+    nesci::consumer::SpikeDetectorDataView* spike_detector) {
   boost::python::list ret_val;
-  for (const auto& data : spike_detector->GetTimesteps()) {
-    ret_val.append(data);
+  const auto timesteps = spike_detector->GetTimesteps();
+  for (conduit::index_t i = 0, count = timesteps.number_of_elements();
+       i < count; ++i) {
+    ret_val.append(timesteps[i]);
   }
   return ret_val;
 }
 
 boost::python::list GetSpikeDetectorNeuronIds(
-    nesci::consumer::DeviceDataView* spike_detector) {
+    nesci::consumer::SpikeDetectorDataView* spike_detector) {
   boost::python::list ret_val;
-  for (const auto& data : spike_detector->GetNeuronIds()) {
-    ret_val.append(data);
+  const auto neuron_ids = spike_detector->GetNeuronIds();
+  for (conduit::index_t i = 0, count = neuron_ids.number_of_elements();
+       i < count; ++i) {
+    ret_val.append(neuron_ids[i]);
   }
   return ret_val;
 }
 
 void ExposeSpikeDetectorDataView() {
-  class_<nesci::consumer::SpikeDetectorDataView>(
-      "SpikeDetectorDataView", init<const conduit::Node & node>())
-      .def("IsSpikeDetectorValid", &IsValid)
-      .def("GetSpikeDetectorTimesteps", &GetTimesteps)
-      .def("GetSpikeDetectorNeuronIds", &GetNeuronIds);
+  class_<nesci::consumer::SpikeDetectorDataView,
+         bases<nesci::consumer::DeviceDataView>>("SpikeDetectorDataView",
+                                                 init<const conduit::Node*>())
+      .def("IsValid", &nesci::consumer::SpikeDetectorDataView::IsValid)
+      .def("GetTimesteps", &GetSpikeDetectorTimesteps)
+      .def("GetNeuronIds", &GetSpikeDetectorNeuronIds);
 }
 
 SUPPRESS_WARNINGS_END