diff --git a/openzwavemqtt/base.py b/openzwavemqtt/base.py
index bc529ea..a524c2b 100644
--- a/openzwavemqtt/base.py
+++ b/openzwavemqtt/base.py
@@ -1,5 +1,5 @@
 from abc import ABC
-from typing import Callable, Deque
+from typing import Callable, Deque, Optional
 
 from .const import EVENT_PLACEHOLDER, EMPTY, LOGGER
 from .options import OZWOptions
@@ -7,9 +7,13 @@ from .options import OZWOptions
 
 class ItemCollection:
     def __init__(
-        self, options: OZWOptions, item_class: Callable[[OZWOptions, str], "ZwaveBase"]
+        self,
+        options: OZWOptions,
+        parent: "ZWaveBase",
+        item_class: Callable[[OZWOptions, str], "ZwaveBase"],
     ):
         self.options = options
+        self.parent = parent
         self.item_class = item_class
         self.collection = {}
 
@@ -30,7 +34,9 @@ class ItemCollection:
             return
 
         elif item is None:
-            item = self.collection[item_id] = self.item_class(self.options, item_id)
+            item = self.collection[item_id] = self.item_class(
+                self.options, self.parent, item_id
+            )
             added = True
 
         if len(topic) == 0 and message is EMPTY:
@@ -67,8 +73,11 @@ class ZWaveBase(ABC):
     EVENT_CHANGED = EVENT_PLACEHOLDER
     EVENT_REMOVED = EVENT_PLACEHOLDER
 
-    def __init__(self, options: OZWOptions, item_id: str):
+    def __init__(
+        self, options: OZWOptions, parent: Optional["ZWaveBase"], item_id: str
+    ):
         self.options = options
+        self.parent = parent
         self.id = item_id
         self.collections = self.create_collections()
         self.data = EMPTY
diff --git a/openzwavemqtt/manager.py b/openzwavemqtt/manager.py
index d3bfe23..f94f3ed 100644
--- a/openzwavemqtt/manager.py
+++ b/openzwavemqtt/manager.py
@@ -12,11 +12,11 @@ class OZWManager(ZWaveBase):
     EVENT_CHANGED = None
 
     def __init__(self, options: OZWOptions):
-        super().__init__(options, None)
+        super().__init__(options, None, None)
 
     def create_collections(self):
         """Create collections that the manager supports."""
-        return {"instance": ItemCollection(self.options, OZWInstance)}
+        return {"instance": ItemCollection(self.options, self, OZWInstance)}
 
     def receive_message(self, topic: str, message: dict):
         """Receive an MQTT message."""
diff --git a/openzwavemqtt/models/instance.py b/openzwavemqtt/models/instance.py
index e05045c..1ba983f 100644
--- a/openzwavemqtt/models/instance.py
+++ b/openzwavemqtt/models/instance.py
@@ -45,7 +45,7 @@ class OZWInstance(ZWaveBase):
     def create_collections(self):
         """Create collections that Node supports."""
         return {
-            "node": ItemCollection(self.options, OZWNode),
-            "statistics": OZWInstanceStatistics(self.options, None),
-            "status": OZWInstanceStatus(self.options, None),
+            "node": ItemCollection(self.options, self, OZWNode),
+            "statistics": OZWInstanceStatistics(self.options, self, None),
+            "status": OZWInstanceStatus(self.options, self, None),
         }
diff --git a/openzwavemqtt/models/node.py b/openzwavemqtt/models/node.py
index 2d32d89..7270b47 100644
--- a/openzwavemqtt/models/node.py
+++ b/openzwavemqtt/models/node.py
@@ -14,6 +14,6 @@ class OZWNode(ZWaveBase):
     def create_collections(self):
         """Create collections that Node supports."""
         return {
-            "value": ItemCollection(self.options, OZWValue),
-            "statistics": OZWNodeStatistics(self.options, OZWNodeStatistics),
+            "value": ItemCollection(self.options, self, OZWValue),
+            "statistics": OZWNodeStatistics(self.options, self, OZWNodeStatistics),
         }

Pass "parent" objects to children
Making issues for some items on the todo list in case anyone else wants to jump in with some code.
---

If we have an OZWValue object, we need an easy way to get to the OZWNode and OZWInstance objects that the value belongs to. Right now its easy to go from Instance > Node > Value, but not the other way around.
diff --git a/test/models/test_node.py b/test/models/test_node_statistics.py
similarity index 97%
rename from test/models/test_node.py
rename to test/models/test_node_statistics.py
index 4dbdd2c..ac6a27c 100644
--- a/test/models/test_node.py
+++ b/test/models/test_node_statistics.py
@@ -41,3 +41,4 @@ def test_statistics(mgr):
     assert statistics.average_response_rtt == 47
     assert statistics.average_request_rtt == 31
     assert statistics.send_count == 10
+    assert statistics.parent.id == "2"
diff --git a/test/models/test_value.py b/test/models/test_value.py
index 92fc5c4..2d06403 100644
--- a/test/models/test_value.py
+++ b/test/models/test_value.py
@@ -14,6 +14,7 @@ def test_value_events(mgr):
     assert len(events) == 1
     assert events[0].id == "3"
     assert events[0].value == "yo"
+    assert events[0].parent.id == "2"
 
     # Listen for value changed
     mgr.options.listen(EVENT_VALUE_CHANGED, events.append)

pip install -e .[test]
parse_log_pytest
pytest
pytest
3.7
pytest --no-header -rA --tb=line --color=no -p no:cacheprovider -W ignore::DeprecationWarning
attrs @ file:///croot/attrs_1668696182826/work
certifi @ file:///croot/certifi_1671487769961/work/certifi
flit_core @ file:///opt/conda/conda-bld/flit-core_1644941570762/work/source/flit_core
importlib-metadata @ file:///tmp/build/80754af9/importlib-metadata_1648562407465/work
iniconfig @ file:///home/linux1/recipes/ci/iniconfig_1610983019677/work
packaging @ file:///croot/packaging_1671697413597/work
pluggy @ file:///tmp/build/80754af9/pluggy_1648042572264/work
py @ file:///opt/conda/conda-bld/py_1644396412707/work
pytest==7.1.2
-e git+https://github.com/cgarwood/python-openzwave-mqtt.git@248ce41a6cf3d536a44282376ed88e2e6dd9e995#egg=python_openzwave_mqtt
tomli @ file:///opt/conda/conda-bld/tomli_1657175507142/work
typing_extensions @ file:///croot/typing_extensions_1669924550328/work
zipp @ file:///croot/zipp_1672387121353/work

name: python-openzwave-mqtt
channels:
  - defaults
  - https://repo.anaconda.com/pkgs/main
  - https://repo.anaconda.com/pkgs/r
  - conda-forge
dependencies:
  - _libgcc_mutex=0.1=main
  - _openmp_mutex=5.1=1_gnu
  - attrs=22.1.0=py37h06a4308_0
  - ca-certificates=2025.2.25=h06a4308_0
  - certifi=2022.12.7=py37h06a4308_0
  - flit-core=3.6.0=pyhd3eb1b0_0
  - importlib-metadata=4.11.3=py37h06a4308_0
  - importlib_metadata=4.11.3=hd3eb1b0_0
  - iniconfig=1.1.1=pyhd3eb1b0_0
  - ld_impl_linux-64=2.40=h12ee557_0
  - libffi=3.4.4=h6a678d5_1
  - libgcc-ng=11.2.0=h1234567_1
  - libgomp=11.2.0=h1234567_1
  - libstdcxx-ng=11.2.0=h1234567_1
  - ncurses=6.4=h6a678d5_0
  - openssl=1.1.1w=h7f8727e_0
  - packaging=22.0=py37h06a4308_0
  - pip=22.3.1=py37h06a4308_0
  - pluggy=1.0.0=py37h06a4308_1
  - py=1.11.0=pyhd3eb1b0_0
  - pytest=7.1.2=py37h06a4308_0
  - python=3.7.16=h7a1cb2a_0
  - readline=8.2=h5eee18b_0
  - setuptools=65.6.3=py37h06a4308_0
  - sqlite=3.45.3=h5eee18b_0
  - tk=8.6.14=h39e8969_0
  - tomli=2.0.1=py37h06a4308_0
  - typing_extensions=4.4.0=py37h06a4308_0
  - wheel=0.38.4=py37h06a4308_0
  - xz=5.6.4=h5eee18b_1
  - zipp=3.11.0=py37h06a4308_0
  - zlib=1.2.13=h5eee18b_1
prefix: /opt/conda/envs/python-openzwave-mqtt

test/models/test_node_statistics.py::test_statistics test/models/test_value.py::test_value_events
openzwavemqtt/models/instance.py openzwavemqtt/manager.py openzwavemqtt/base.py openzwavemqtt/models/node.py
openzwavemqtt/models/instance.py openzwavemqtt/manager.py openzwavemqtt/base.py openzwavemqtt/models/node.py