diff --git a/pynesci/src/consumer/arbor_multimeter.cpp b/pynesci/src/consumer/arbor_multimeter.cpp
deleted file mode 100644
index d0dbd931a197548aad83261dc8a32ceaa4a24fef..0000000000000000000000000000000000000000
--- a/pynesci/src/consumer/arbor_multimeter.cpp
+++ /dev/null
@@ -1,66 +0,0 @@
-//------------------------------------------------------------------------------
-// nesci -- neuronal simulator conan interface
-//
-// Copyright (c) 2017-2018 RWTH Aachen University, Germany,
-// Virtual Reality & Immersive Visualisation Group.
-//------------------------------------------------------------------------------
-//                                 License
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-//------------------------------------------------------------------------------
-
-#include <string>
-
-#include "nesci/consumer/arbor_multimeter.hpp"
-#include "pyconsumer.hpp"
-#include "pynesci/suppress_warnings.hpp"
-
-namespace pynesci {
-namespace consumer {
-
-SUPPRESS_WARNINGS_BEGIN
-
-boost::python::list GetArborMultimeterTimestepData(
-    nesci::consumer::ArborMultimeter* arbor_multimeter, const std::string& time,
-    const std::string& attribute) {
-  boost::python::list ret_val;
-  for (const auto& data : arbor_multimeter->GetTimestepData(time, attribute)) {
-    ret_val.append(data);
-  }
-  return ret_val;
-}
-
-boost::python::list GetArborTimeSeriesData(
-    nesci::consumer::ArborMultimeter* arbor_multimeter,
-    const std::string& attribute, const std::string& neuron_id) {
-  boost::python::list ret_val;
-  for (const auto& data :
-       arbor_multimeter->GetTimeSeriesData(attribute, neuron_id)) {
-    ret_val.append(data);
-  }
-  return ret_val;
-}
-
-template <>
-void expose<nesci::consumer::ArborMultimeter>() {
-  class_<nesci::consumer::ArborMultimeter, bases<nesci::consumer::Multimeter>>(
-      "ArborMultimeter", init<const std::string&>())
-      .def("GetTimestepData", &GetArborMultimeterTimestepData)
-      .def("GetTimeSeriesData", &GetArborTimeSeriesData)
-      .def("GetDatum", &nesci::consumer::ArborMultimeter::GetDatum);
-}
-
-SUPPRESS_WARNINGS_END
-
-}  // namespace consumer
-}  // namespace pynesci
diff --git a/pynesci/src/consumer/device.cpp b/pynesci/src/consumer/device_data_view.hpp
similarity index 64%
rename from pynesci/src/consumer/device.cpp
rename to pynesci/src/consumer/device_data_view.hpp
index e12021eef878daec1147988c637ad328910a3b88..e0b48382b40041e393c8a83988a0241c3eb9cfa6 100644
--- a/pynesci/src/consumer/device.cpp
+++ b/pynesci/src/consumer/device_data_view.hpp
@@ -21,7 +21,7 @@
 
 #include <string>
 
-#include "nesci/consumer/device.hpp"
+#include "nesci/consumer/device_data_view.hpp"
 #include "pyconsumer.hpp"
 #include "pynesci/suppress_warnings.hpp"
 
@@ -29,23 +29,26 @@ namespace pynesci {
 namespace consumer {
 
 SUPPRESS_WARNINGS_BEGIN
-boost::python::list GetDeviceTimesteps(nesci::consumer::Device* device) {
-  boost::python::list ret_val;
-  for (const auto& timestep : device->GetTimesteps()) {
-    ret_val.append(timestep);
-  }
-  return ret_val;
+
+boost::python::object HasDeviceName(nesci::consumer::DeviceDataView* device) {
+  return static_cast<boost::python::object>(device->HasName());
+}
+
+boost::python::str GetDeviceName(nesci::consumer::DeviceDataView* device) {
+  return static_cast<boost::python::str>(device->GetName()):
 }
 
-void SetDeviceNode(nesci::consumer::Device* device, const conduit::Node& node) {
-  device->SetNode(&const_cast<conduit::Node&>(node));
+DataType GetDeviceType(nesci::consumer::DeviceDataView* device) {
+  return device->GetType();
 }
 
 template <>
-void expose<nesci::consumer::Device>() {
-  class_<nesci::consumer::Device>("Device", init<const std::string&>())
-      .def("GetTimesteps", &GetDeviceTimesteps)
-      .def("SetNode", &SetDeviceNode);
+void expose<nesci::consumer::DeviceDataView>() {
+  class_<nesci::consumer::DeviceDataView>("DeviceDataView",
+    init<const conduit::Node& node>())
+      .def("HasDeviceName", &HasName)
+      .def("GetDeviceName", &GetName)
+      .def("GetDeviceType", &GetType);
 }
 
 SUPPRESS_WARNINGS_END
diff --git a/pynesci/src/consumer/multimeter.cpp b/pynesci/src/consumer/multimeter.cpp
deleted file mode 100644
index 8fc89bdcf4c471e21e5552619b2a4c4fb3eff3ad..0000000000000000000000000000000000000000
--- a/pynesci/src/consumer/multimeter.cpp
+++ /dev/null
@@ -1,63 +0,0 @@
-//------------------------------------------------------------------------------
-// nesci -- neuronal simulator conan interface
-//
-// Copyright (c) 2017-2018 RWTH Aachen University, Germany,
-// Virtual Reality & Immersive Visualisation Group.
-//------------------------------------------------------------------------------
-//                                 License
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-//------------------------------------------------------------------------------
-
-#include <string>
-
-#include "nesci/consumer/multimeter.hpp"
-#include "pyconsumer.hpp"
-#include "pynesci/suppress_warnings.hpp"
-
-namespace pynesci {
-namespace consumer {
-
-SUPPRESS_WARNINGS_BEGIN
-
-boost::python::list GetMultimeterAttributes(
-    nesci::consumer::Multimeter* multimeter, const std::string& time) {
-  boost::python::list ret_val;
-  for (const auto& attribute : multimeter->GetAttributes(time)) {
-    ret_val.append(attribute);
-  }
-  return ret_val;
-}
-
-boost::python::list GetMultimeterNeuronIds(
-    nesci::consumer::Multimeter* multimeter, const std::string& time,
-    const std::string& attribute) {
-  boost::python::list ret_val;
-  for (const auto& neuron_id : multimeter->GetNeuronIds(time, attribute)) {
-    ret_val.append(neuron_id);
-  }
-  return ret_val;
-}
-
-template <>
-void expose<nesci::consumer::Multimeter>() {
-  class_<nesci::consumer::Multimeter, bases<nesci::consumer::Device>>(
-      "Multimeter", init<const std::string&>())
-      .def("GetAttributes", &GetMultimeterAttributes)
-      .def("GetNeuronIds", &GetMultimeterNeuronIds);
-}
-
-SUPPRESS_WARNINGS_END
-
-}  // namespace consumer
-}  // namespace pynesci
diff --git a/pynesci/src/consumer/nest_multimeter_data_view.hpp b/pynesci/src/consumer/nest_multimeter_data_view.hpp
new file mode 100644
index 0000000000000000000000000000000000000000..0a39dccad03f38787a5d4ce86af346d8dd2e12c6
--- /dev/null
+++ b/pynesci/src/consumer/nest_multimeter_data_view.hpp
@@ -0,0 +1,109 @@
+//------------------------------------------------------------------------------
+// nesci -- neuronal simulator conan interface
+//
+// Copyright (c) 2017-2018 RWTH Aachen University, Germany,
+// Virtual Reality & Immersive Visualisation Group.
+//------------------------------------------------------------------------------
+//                                 License
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//------------------------------------------------------------------------------
+
+#include <string>
+
+#include "nesci/consumer/nest_multimeter_data_view.hpp"
+#include "pyconsumer.hpp"
+#include "pynesci/suppress_warnings.hpp"
+
+namespace pynesci {
+namespace consumer {
+
+SUPPRESS_WARNINGS_BEGIN
+
+boost::python::object IsNestMultimeterValid(
+    nesci::consumer::NestMultimeterDataView* multimeter) {
+  return static_cast<boost::python::object>(multimeter->IsValid());
+}
+
+boost::python::object GetNestMultimeterTimestep(
+    nesci::consumer::NestMultimeterDataView* multimeter) {
+  return static_cast<boost::python::object>(multimeter->GetTimestep());
+}
+
+boost::python::object GetNestMultimeterNeuronIds(
+    nesci::consumer::NestMultimeterDataView* multimeter) {
+  boost::python::list ret_val;
+  for (const auto& data : nest_multimeter->GetNeuronIds()) {
+    ret_val.append(data);
+  }
+  return ret_val;
+}
+
+boost::python::list GetNestMultimeterIntegerAttributeNames(
+    nesci::consumer::NestMultimeterDataView* multimeter) {
+  boost::python::list ret_val;
+  for (const auto& data : nest_multimeter->GetIntegerAttributeNames()) {
+    ret_val.append(data);
+  }
+  return ret_val;
+}
+
+boost::python::list GetNestMultimeterFloatingPointAttributeNames(
+    nesci::consumer::NestMultimeterDataView* multimeter) {
+  boost::python::list ret_val;
+  for (const auto& data : nest_multimeter->GetFloatingPointAttributeNames()) {
+    ret_val.append(data);
+  }
+  return ret_val;
+}
+
+boost::python::list GetNestMultimeterIntegerAttributeValues(
+    nesci::consumer::NestMultimeterDataView* multimeter, 
+    nesci::consumer::NestMultimeterDataView* multimeter, 
+    const std::string& attribute) {
+  boost::python::list ret_val;
+  for (const auto& data : nest_multimeter->GetIntegerAttributeValues(attribute)) {
+    ret_val.append(data);
+  }
+  return ret_val;
+}
+
+boost::python::list GetNestMultimeterFloatingPointAttributeValues(
+    nesci::consumer::NestMultimeterDataView* multimeter, 
+    const std::string& attribute) {
+  boost::python::list ret_val;
+  for (const auto& data : nest_multimeter->GetFloatingPointAttributeValues(attribute)) {
+    ret_val.append(data);
+  }
+  return ret_val;
+}
+
+template <>
+void expose<nesci::consumer::NestMultimeterDataView>() {
+  class_<nesci::consumer::NestMultimeterDataView>("NestMultimeterDataView",
+    init<const conduit::Node& node>())
+      .def("IsNestMultimeterValid", &IsValid)
+      .def("GetNestMultimeterTimestep", &GetTimestep)
+      .def("GetNestMultimeterNeuronIds", &GetNeuronIds)
+      .def("GetNestMultimeterIntegerAttributeNames", &GetIntegerAttributeNames)
+      .def("GetNestMultimeterFloatingPointAttributeNames",
+            &GetFloatingPointAttributeNames)
+      .def("GetNestMultimeterIntegerAttributeValues", &GetIntegerAttributeValues)
+      .def("GetNestMultimeterFloatingPointAttributeValues",
+            &GetFloatingPointAttributeValues);
+}
+
+SUPPRESS_WARNINGS_END
+
+}  // namespace consumer
+}  // namespace pynesci
diff --git a/pynesci/src/consumer/pyconsumer.cpp b/pynesci/src/consumer/pyconsumer.cpp
index 4c7c35eed884a402b795c7de31a393fe3cd88a85..1bf4c1dc24e37390774733d58a499544e3768ee3 100644
--- a/pynesci/src/consumer/pyconsumer.cpp
+++ b/pynesci/src/consumer/pyconsumer.cpp
@@ -21,11 +21,9 @@
 
 #include "pyconsumer.hpp"
 #include <string>
-#include "nesci/consumer/arbor_multimeter.hpp"
-#include "nesci/consumer/device.hpp"
-#include "nesci/consumer/multimeter.hpp"
-#include "nesci/consumer/nest_multimeter.hpp"
-#include "nesci/consumer/spike_detector.hpp"
+#include "nesci/consumer/device_data_view.hpp"
+#include "nesci/consumer/nest_multimeter_data_view.hpp"
+#include "nesci/consumer/spike_detector_data_view.hpp"
 
 namespace pynesci {
 namespace consumer {
@@ -40,11 +38,9 @@ SUPPRESS_WARNINGS_BEGIN
 BOOST_PYTHON_MODULE(_pyconsumer) {
   def("Greet", &Greet);
   class_<conduit::Node>("Node");
-  expose<nesci::consumer::Device>();
-  expose<nesci::consumer::Multimeter>();
-  expose<nesci::consumer::NestMultimeter>();
-  expose<nesci::consumer::SpikeDetector>();
-  expose<nesci::consumer::ArborMultimeter>();
+  expose<nesci::consumer::DeviceDataView>();
+  expose<nesci::consumer::NestMultimeterDataView>();
+  expose<nesci::consumer::SpikeDetectorDataView>();
 }
 SUPPRESS_WARNINGS_END
 
diff --git a/pynesci/src/consumer/spike_detector.cpp b/pynesci/src/consumer/spike_detector.cpp
deleted file mode 100644
index 85e2fb33a35f53e3ac0bd50fe52d78a5e50b9cfb..0000000000000000000000000000000000000000
--- a/pynesci/src/consumer/spike_detector.cpp
+++ /dev/null
@@ -1,52 +0,0 @@
-//------------------------------------------------------------------------------
-// nesci -- neuronal simulator conan interface
-//
-// Copyright (c) 2017-2018 RWTH Aachen University, Germany,
-// Virtual Reality & Immersive Visualisation Group.
-//------------------------------------------------------------------------------
-//                                 License
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-//------------------------------------------------------------------------------
-
-#include <string>
-
-#include "nesci/consumer/spike_detector.hpp"
-#include "pyconsumer.hpp"
-#include "pynesci/suppress_warnings.hpp"
-
-namespace pynesci {
-namespace consumer {
-
-SUPPRESS_WARNINGS_BEGIN
-
-boost::python::list GetSpikeDetectorNeuronIds(
-    nesci::consumer::SpikeDetector* nest_multimeter, const std::string& time) {
-  boost::python::list ret_val;
-  for (const auto& data : nest_multimeter->GetNeuronIds(time)) {
-    ret_val.append(data);
-  }
-  return ret_val;
-}
-
-template <>
-void expose<nesci::consumer::SpikeDetector>() {
-  class_<nesci::consumer::SpikeDetector, bases<nesci::consumer::Device>>(
-      "SpikeDetector", init<const std::string&>())
-      .def("GetNeuronIds", &GetSpikeDetectorNeuronIds);
-}
-
-SUPPRESS_WARNINGS_END
-
-}  // namespace consumer
-}  // namespace pynesci
diff --git a/pynesci/src/consumer/nest_multimeter.cpp b/pynesci/src/consumer/spike_detector_data_view.hpp
similarity index 60%
rename from pynesci/src/consumer/nest_multimeter.cpp
rename to pynesci/src/consumer/spike_detector_data_view.hpp
index 170ce4d68d693d23b97400fa742847c2c9687a08..3d74fac796ea55ba351f26f47555efbab046ddba 100644
--- a/pynesci/src/consumer/nest_multimeter.cpp
+++ b/pynesci/src/consumer/spike_detector_data_view.hpp
@@ -21,7 +21,7 @@
 
 #include <string>
 
-#include "nesci/consumer/nest_multimeter.hpp"
+#include "nesci/consumer/spike_detector_data_view.hpp"
 #include "pyconsumer.hpp"
 #include "pynesci/suppress_warnings.hpp"
 
@@ -30,34 +30,36 @@ namespace consumer {
 
 SUPPRESS_WARNINGS_BEGIN
 
-boost::python::list GetNestMultimeterTimestepData(
-    nesci::consumer::NestMultimeter* nest_multimeter, const std::string& time,
-    const std::string& attribute) {
+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) {
   boost::python::list ret_val;
-  for (const auto& data : nest_multimeter->GetTimestepData(time, attribute)) {
+  for (const auto& data : spike_detector->GetTimesteps()) {
     ret_val.append(data);
   }
   return ret_val;
 }
 
-boost::python::list GetNestTimeSeriesData(
-    nesci::consumer::NestMultimeter* nest_multimeter,
-    const std::string& attribute, const std::string& neuron_id) {
+boost::python::list GetSpikeDetectorNeuronIds(
+nesci::consumer::DeviceDataView* spike_detector) {
   boost::python::list ret_val;
-  for (const auto& data :
-       nest_multimeter->GetTimeSeriesData(attribute, neuron_id)) {
+  for (const auto& data : spike_detector->GetNeuronIds()) {
     ret_val.append(data);
   }
   return ret_val;
 }
 
 template <>
-void expose<nesci::consumer::NestMultimeter>() {
-  class_<nesci::consumer::NestMultimeter, bases<nesci::consumer::Multimeter>>(
-      "NestMultimeter", init<const std::string&>())
-      .def("GetTimestepData", &GetNestMultimeterTimestepData)
-      .def("GetTimeSeriesData", &GetNestTimeSeriesData)
-      .def("GetDatum", &nesci::consumer::NestMultimeter::GetDatum);
+void expose<nesci::consumer::SpikeDetectorDataView>() {
+  class_<nesci::consumer::SpikeDetectorDataView>("SpikeDetectorDataView",
+    init<const conduit::Node& node>())
+      .def("IsSpikeDetectorValid", &IsValid)
+      .def("GetSpikeDetectorTimesteps", &GetTimesteps)
+      .def("GetSpikeDetectorNeuronIds", &GetNeuronIds);
 }
 
 SUPPRESS_WARNINGS_END
diff --git a/pynesci/tests/test_pynesci_consumer_arbor_multimeter.py b/pynesci/tests/test_pynesci_consumer_arbor_multimeter.py
deleted file mode 100644
index 984fdf751cb747a0735a53a390ad94dd972a293b..0000000000000000000000000000000000000000
--- a/pynesci/tests/test_pynesci_consumer_arbor_multimeter.py
+++ /dev/null
@@ -1,52 +0,0 @@
-# -------------------------------------------------------------------------------
-# nesci -- neuronal simulator conan interface
-#
-# Copyright (c) 2018 RWTH Aachen University, Germany,
-# Virtual Reality & Immersive Visualization Group.
-# -------------------------------------------------------------------------------
-#                                  License
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#     http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-# -------------------------------------------------------------------------------
-
-import pynesci
-
-
-def test_pynesci_consumer_arbor_multimeter():
-    arbor_multimeter = pynesci.consumer.ArborMultimeter(
-        "SomeArborMultimeterName")
-
-
-def test_pynesci_consumer_arbor_multimeter_get_timestep_data():
-    arbor_multimeter = pynesci.consumer.ArborMultimeter(
-        "SomeArborMultimeterName")
-    some_node = pynesci.Node()
-    arbor_multimeter.SetNode(some_node)
-    assert len(arbor_multimeter.GetTimestepData("0.0", "Attribute1")) == 0
-
-
-def test_pynesci_consumer_arbor_multimeter_get_time_series_data():
-    arbor_multimeter = pynesci.consumer.ArborMultimeter(
-        "SomeArborMultimeterName")
-    some_node = pynesci.Node()
-    arbor_multimeter.SetNode(some_node)
-    assert len(arbor_multimeter.GetTimeSeriesData(
-        "0.0", "Attribute1")) == 0
-
-
-def test_pynesci_consumer_arbor_multimeter_get_neuron_ids():
-    arbor_multimeter = pynesci.consumer.ArborMultimeter(
-        "SomeArborMultimeterName")
-    some_node = pynesci.Node()
-    arbor_multimeter.SetNode(some_node)
-    arbor_multimeter.GetDatum("0.0", "Attribute1", "aasdad")
diff --git a/pynesci/tests/test_pynesci_consumer_device.py b/pynesci/tests/test_pynesci_consumer_device_data_view.py
similarity index 77%
rename from pynesci/tests/test_pynesci_consumer_device.py
rename to pynesci/tests/test_pynesci_consumer_device_data_view.py
index b9c73255278f0c8449960ea4be79159e52003d40..d0a65674ca87777809b9a533dd35eb8fec84df2e 100644
--- a/pynesci/tests/test_pynesci_consumer_device.py
+++ b/pynesci/tests/test_pynesci_consumer_device_data_view.py
@@ -22,11 +22,10 @@
 import pynesci
 
 
-def test_pynesci_consumer_device():
-    device = pynesci.consumer.Device("SomeDeviceName")
+def test_pynesci_consumer_device_data_view():
+    device = pynesci.consumer.DeviceDataView("SomeDeviceName")
 
 
-def test_pynesci_consumer_device_set_node():
-    device = pynesci.consumer.Device("SomeDeviceName")
-    some_node = pynesci.Node()
-    device.SetNode(some_node)
+def test_pynesci_consumer_device_data_view_get_device_name():
+    device = pynesci.consumer.DeviceDataView("SomeDeviceName")
+    assert device.GetDeviceName() == "SomeDeviceName"
diff --git a/pynesci/tests/test_pynesci_consumer_multimeter.py b/pynesci/tests/test_pynesci_consumer_multimeter.py
deleted file mode 100644
index 7ed9ce209e8c494c1e7df0715fd47fe3589d4198..0000000000000000000000000000000000000000
--- a/pynesci/tests/test_pynesci_consumer_multimeter.py
+++ /dev/null
@@ -1,40 +0,0 @@
-# -------------------------------------------------------------------------------
-# nesci -- neuronal simulator conan interface
-#
-# Copyright (c) 2018 RWTH Aachen University, Germany,
-# Virtual Reality & Immersive Visualization Group.
-# -------------------------------------------------------------------------------
-#                                  License
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#     http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-# -------------------------------------------------------------------------------
-
-import pynesci
-
-
-def test_pynesci_consumer_multimeter():
-    multimeter = pynesci.consumer.Multimeter("SomeMultimeterName")
-
-
-def test_pynesci_consumer_multimeter_get_attributes():
-    multimeter = pynesci.consumer.Multimeter("SomeMultimeterName")
-    some_node = pynesci.Node()
-    multimeter.SetNode(some_node)
-    assert len(multimeter.GetAttributes("0.0")) == 0
-
-
-def test_pynesci_consumer_multimeter_get_neuron_ids():
-    multimeter = pynesci.consumer.Multimeter("SomeMultimeterName")
-    some_node = pynesci.Node()
-    multimeter.SetNode(some_node)
-    assert len(multimeter.GetNeuronIds("0.0", "Attribute1")) == 0
diff --git a/pynesci/tests/test_pynesci_consumer_nest_multimeter.py b/pynesci/tests/test_pynesci_consumer_nest_multimeter.py
deleted file mode 100644
index 0e4fc3be13ca7f200c458198ebde1e3d4a83c48f..0000000000000000000000000000000000000000
--- a/pynesci/tests/test_pynesci_consumer_nest_multimeter.py
+++ /dev/null
@@ -1,48 +0,0 @@
-# -------------------------------------------------------------------------------
-# nesci -- neuronal simulator conan interface
-#
-# Copyright (c) 2018 RWTH Aachen University, Germany,
-# Virtual Reality & Immersive Visualization Group.
-# -------------------------------------------------------------------------------
-#                                  License
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#     http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-# -------------------------------------------------------------------------------
-
-import pynesci
-
-
-def test_pynesci_consumer_nest_multimeter():
-    nest_multimeter = pynesci.consumer.NestMultimeter("SomeNestMultimeterName")
-
-
-def test_pynesci_consumer_nest_multimeter_get_timestep_data():
-    nest_multimeter = pynesci.consumer.NestMultimeter("SomeNestMultimeterName")
-    some_node = pynesci.Node()
-    nest_multimeter.SetNode(some_node)
-    assert len(nest_multimeter.GetTimestepData("0.0", "Attribute1")) == 0
-
-
-def test_pynesci_consumer_nest_multimeter_get_time_series_data():
-    nest_multimeter = pynesci.consumer.NestMultimeter("SomeNestMultimeterName")
-    some_node = pynesci.Node()
-    nest_multimeter.SetNode(some_node)
-    assert len(nest_multimeter.GetTimeSeriesData(
-        "0.0", "Attribute1")) == 0
-
-
-def test_pynesci_consumer_nest_multimeter_get_neuron_ids():
-    nest_multimeter = pynesci.consumer.NestMultimeter("SomeNestMultimeterName")
-    some_node = pynesci.Node()
-    nest_multimeter.SetNode(some_node)
-    nest_multimeter.GetDatum("0.0", "Attribute1", "aasdad")
diff --git a/pynesci/tests/test_pynesci_consumer_nest_multimeter_data_view.py b/pynesci/tests/test_pynesci_consumer_nest_multimeter_data_view.py
new file mode 100644
index 0000000000000000000000000000000000000000..ce8244ce943e208703a1599a3bbbed6111fdbb77
--- /dev/null
+++ b/pynesci/tests/test_pynesci_consumer_nest_multimeter_data_view.py
@@ -0,0 +1,59 @@
+# -------------------------------------------------------------------------------
+# nesci -- neuronal simulator conan interface
+#
+# Copyright (c) 2018 RWTH Aachen University, Germany,
+# Virtual Reality & Immersive Visualization Group.
+# -------------------------------------------------------------------------------
+#                                  License
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+# -------------------------------------------------------------------------------
+
+import pynesci
+
+
+def test_pynesci_consumer_nest_multimeter_data_view():
+    multimeter = pynesci.consumer.NestMultimeterDataView("SomeNestMultimeterName")
+
+
+def test_pynesci_consumer_nest_multimeter_data_view_is_valid():
+    multimeter = pynesci.consumer.NestMultimeterDataView("SomeNestMultimeterName")
+    assert multimeter.IsNestMultimeterValid()
+
+
+def test_pynesci_consumer_nest_multimeter_data_view_get_timestep_data():
+    multimeter = pynesci.consumer.NestMultimeterDataView("SomeNestMultimeterName")
+    some_node = pynesci.Node()
+    multimeter.SetNode(some_node)
+    assert len(multimeter.GetTimestepData("0.0", "Attribute1")) == 0
+
+
+def test_pynesci_consumer_nest_multimeter_data_view_get_neuron_ids():
+    multimeter = pynesci.consumer.NestMultimeterDataView("SomeNestMultimeterName")
+    some_node = pynesci.Node()
+    multimeter.SetNode(some_node)
+    multimeter.GetNestMultimeterNeuronIds()
+
+
+def test_pynesci_consumer_nest_multimeter_data_view_get_attributes():
+    multimeter = pynesci.consumer.NestMultimeterDataView("SomeNestMultimeterName")
+    some_node = pynesci.Node()
+    multimeter.SetNode(some_node)
+    assert len(multimeter.GetAttributes("0.0")) == 0
+    
+
+def test_pynesci_consumer_nest_multimeter_data_view_get_neuron_ids():
+    multimeter = pynesci.consumer.NestMultimeterDataView("SomeNestMultimeterName")
+    some_node = pynesci.Node()
+    multimeter.SetNode(some_node)
+    assert len(multimeter.GetNestMultimeterNeuronIds("0.0", "Attribute1")) == 0
diff --git a/pynesci/tests/test_pynesci_consumer_spike_detector.py b/pynesci/tests/test_pynesci_consumer_spike_detector_data_view.py
similarity index 79%
rename from pynesci/tests/test_pynesci_consumer_spike_detector.py
rename to pynesci/tests/test_pynesci_consumer_spike_detector_data_view.py
index 312a11156054a00379d065ae151afad85b7b50b0..fa36a5fc0514b05ea6cef546a5d641337857e48a 100644
--- a/pynesci/tests/test_pynesci_consumer_spike_detector.py
+++ b/pynesci/tests/test_pynesci_consumer_spike_detector_data_view.py
@@ -22,12 +22,12 @@
 import pynesci
 
 
-def test_pynesci_consumer_spike_detector():
-    spike_detector = pynesci.consumer.SpikeDetector("SomeSpikeDetectorName")
+def test_pynesci_consumer_spike_detector_data_view():
+    spike_detector = pynesci.consumer.SpikeDetectorDataView("SomeSpikeDetectorName")
 
 
-def test_pynesci_consumer_spike_detector_get_neuron_ids():
-    spike_detector = pynesci.consumer.SpikeDetector("SomeSpikeDetectorName")
+def test_pynesci_consumer_spike_detector_data_view_get_neuron_ids():
+    spike_detector = pynesci.consumer.SpikeDetectorDataView("SomeSpikeDetectorName")
     some_node = pynesci.Node()
     spike_detector.SetNode(some_node)
     assert len(spike_detector.GetNeuronIds("0.0")) == 0