diff --git a/plugins/network/api/routes.py b/plugins/network/api/routes.py
index 3dfdc87..a011fa8 100644
--- a/plugins/network/api/routes.py
+++ b/plugins/network/api/routes.py
@@ -24,9 +24,13 @@ def _upsert_primary_ip(asset, ip):
"""Create/update/clear the asset's primary IP Communication from an
ipaddress string. No-op if the IP CommunicationType is not seeded."""
ip = (ip or '').strip()
- if not ip:
- return
comm = Communication.query.filter_by(assetid=asset.assetid, isprimary=True).first()
+ if not ip:
+ # Clearing the field clears the row's IP - it used to return early, so
+ # an address could be typed but never taken back out.
+ if comm:
+ comm.ipaddress = None
+ return
if comm:
comm.ipaddress = ip
return
diff --git a/plugins/network/frontend/views/NetworkDeviceForm.vue b/plugins/network/frontend/views/NetworkDeviceForm.vue
index a10fe55..dbaa4b3 100644
--- a/plugins/network/frontend/views/NetworkDeviceForm.vue
+++ b/plugins/network/frontend/views/NetworkDeviceForm.vue
@@ -112,6 +112,16 @@
placeholder="e.g., sw-bldg1-floor2"
/>
+