diff --git a/ipassign/message.py b/ipassign/message.py
index 5198b2d..b4f4075 100644
--- a/ipassign/message.py
+++ b/ipassign/message.py
@@ -65,9 +65,13 @@ class Message:
 
         if not isinstance(command, commands):
             raise TypeError('expected a command enum')
+        if destination is None and command is not commands.REQUEST_CONFIG:
+            raise ValueError('Only commands.REQUEST_CONFIG can omit the '
+                             'destination. Other commands must include a '
+                             'destination mac address')
         self.command = command
-
         self.destination = destination
+
         self.payload = payload
 
     @property

Message.target_id will be set to one even if not Message.destination present
When de/serialising `Message`, check that `target_id` is correctly set if with regards to `destination`
diff --git a/tests/test_message.py b/tests/test_message.py
index b782106..3473359 100644
--- a/tests/test_message.py
+++ b/tests/test_message.py
@@ -8,33 +8,42 @@ from test_data import (
 def test_message_object_instantiation():
     mac = [0x00, 0x0B, 0xAD, 0xC0, 0xFF, 0xEE]
     Message.packno = 0
-    m = Message(source=mac, command=commands.RESET)
+    m = Message(source=mac, destination=mac, command=commands.RESET)
     assert isinstance(m, Message)
 
     assert m.source == '00:0b:ad:c0:ff:ee'
-    assert m.target_count == 0
+    assert m.target_count == 1
     assert m.packet_number == 1
     assert m.command == commands.RESET
-    assert m.destination is None
+    assert m.destination == '00:0b:ad:c0:ff:ee'
     assert m.payload == b''
 
-    m = Message(source=mac, command=commands.CHANGE_IP)
+    m = Message(source=mac, destination=mac, command=commands.CHANGE_IP)
     assert m.packet_number == 2
 
     expected = """[header]
     [source]       = 00:0b:ad:c0:ff:ee
-    [target count] = 0
+    [target count] = 1
     [packet no]    = 2
     [command]      = CHANGE_IP [0x6]
     [payload len]  = 0
-[destination] = BROADCAST
+[destination] = 00:0b:ad:c0:ff:ee
 [payload] = none
-[checksum] = 0xa922c58"""
+[checksum] = 0x5f17f037"""
     assert str(m) == expected
 
     m.source = "00:de:ad:be:ef:00"
 
 
+def test_destination_check():
+    with pytest.raises(ValueError):
+        Message(source='00:0B:AD:C0:FF:EE',
+                command=commands.RESET)
+
+    Message(source='00:0B:AD:C0:FF:EE',
+            command=commands.REQUEST_CONFIG)
+
+
 def test_deserialisation():
     m = Message.from_bytes(PACKET)
     assert isinstance(m, Message)

pip install -e .
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
-e git+https://github.com/cydanil/icepap-ipassign.git@1a459d932b8ba50789b22106e0f89c7443486bec#egg=icepap_ipassign
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
tomli @ file:///opt/conda/conda-bld/tomli_1657175507142/work
typing_extensions @ file:///croot/typing_extensions_1669924550328/work
zipp @ file:///croot/zipp_1672387121353/work

name: icepap-ipassign
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/icepap-ipassign

tests/test_message.py::test_destination_check
tests/test_message.py::test_message_object_instantiation tests/test_message.py::test_deserialisation tests/test_message.py::test_serialisation tests/test_message.py::test_parse_reply tests/test_message.py::test_message_config_payload tests/test_message.py::test_message_ack_payload tests/test_message.py::test_check_payload_length
ipassign/message.py
ipassign/message.py