diff --git a/src/xrt/drivers/hdk/hdk_device.cpp b/src/xrt/drivers/hdk/hdk_device.cpp
index 10cf9b270796756be5cf72eca00e61fbd5d15f95..22a5549fc6768ffff22264be028d58ba09c1d58d 100644
--- a/src/xrt/drivers/hdk/hdk_device.cpp
+++ b/src/xrt/drivers/hdk/hdk_device.cpp
@@ -272,10 +272,13 @@ hdk_device_create(struct os_hid_device *dev,
 	hd->base.get_view_pose = hdk_device_get_view_pose;
 	hd->base.destroy = hdk_device_destroy;
 	hd->base.inputs[0].name = XRT_INPUT_GENERIC_HEAD_RELATION;
+	hd->base.name = XRT_DEVICE_GENERIC_HMD;
 	hd->dev = dev;
 	hd->print_spew = print_spew;
 	hd->print_debug = print_debug;
 
+	snprintf(hd->base.str, XRT_DEVICE_NAME_LEN, "OSVR HDK-family Device");
+
 	if (variant == HDK_UNKNOWN) {
 		HDK_ERROR(hd, "Don't know which HDK variant this is.");
 		hdk_device_destroy(&hd->base);
@@ -442,8 +445,7 @@ hdk_device_create(struct os_hid_device *dev,
 
 
 	if (hd->print_debug) {
-		u_device_dump_config(&hd->base, __func__,
-		                     "OSVR HDK-family Device");
+		u_device_dump_config(&hd->base, __func__, hd->base.str);
 	}
 
 	return hd;
diff --git a/src/xrt/drivers/hydra/hydra_driver.c b/src/xrt/drivers/hydra/hydra_driver.c
index 83879efde8f663a59b758e74a88db2c9af883213..799791b77d6b4636c64bca78b90fb27884ca3b4d 100644
--- a/src/xrt/drivers/hydra/hydra_driver.c
+++ b/src/xrt/drivers/hydra/hydra_driver.c
@@ -685,7 +685,8 @@ hydra_found(struct xrt_prober *xp,
 		hd->base.update_inputs = hydra_device_update_inputs;
 		hd->base.get_tracked_pose = hydra_device_get_tracked_pose;
 		// hs->base.set_output = hydra_device_set_output;
-		snprintf(hd->base.name, XRT_DEVICE_NAME_LEN, "%s %i",
+		hd->base.name = XRT_DEVICE_HYDRA;
+		snprintf(hd->base.str, XRT_DEVICE_NAME_LEN, "%s %i",
 		         "Razer Hydra Controller", (int)(i + 1));
 		SET_INPUT(1_CLICK);
 		SET_INPUT(2_CLICK);
diff --git a/src/xrt/drivers/ohmd/oh_device.c b/src/xrt/drivers/ohmd/oh_device.c
index 7fdef5b2bcb65aaf938b1270bd3575742468336b..6b34318c37d4a19e02c1497a19d34019d9434be3 100644
--- a/src/xrt/drivers/ohmd/oh_device.c
+++ b/src/xrt/drivers/ohmd/oh_device.c
@@ -353,13 +353,14 @@ oh_device_create(ohmd_context *ctx,
 	ohd->base.get_view_pose = oh_device_get_view_pose;
 	ohd->base.destroy = oh_device_destroy;
 	ohd->base.inputs[0].name = XRT_INPUT_GENERIC_HEAD_RELATION;
+	ohd->base.name = XRT_DEVICE_GENERIC_HMD;
 	ohd->ctx = ctx;
 	ohd->dev = dev;
 	ohd->print_spew = print_spew;
 	ohd->print_debug = print_debug;
 	ohd->enable_finite_difference = debug_get_bool_option_oh_finite_diff();
 
-	snprintf(ohd->base.name, XRT_DEVICE_NAME_LEN, "%s", prod);
+	snprintf(ohd->base.str, XRT_DEVICE_NAME_LEN, "%s", prod);
 
 	const struct device_info info = get_info(ohd, prod);
 
diff --git a/src/xrt/drivers/psmv/psmv_driver.c b/src/xrt/drivers/psmv/psmv_driver.c
index 8f8960d75f43f207c74a85aad7387adf62f416cf..4f251b04b869c0d7723e7956adf4bd931e031a78 100644
--- a/src/xrt/drivers/psmv/psmv_driver.c
+++ b/src/xrt/drivers/psmv/psmv_driver.c
@@ -477,7 +477,8 @@ psmv_found(struct xrt_prober *xp,
 	psmv->base.update_inputs = psmv_device_update_inputs;
 	psmv->base.get_tracked_pose = psmv_device_get_tracked_pose;
 	psmv->base.set_output = psmv_device_set_output;
-	snprintf(psmv->base.name, XRT_DEVICE_NAME_LEN, "%s",
+	psmv->base.name = XRT_DEVICE_PSMV;
+	snprintf(psmv->base.str, XRT_DEVICE_NAME_LEN, "%s",
 	         "PS Move Controller");
 	psmv->hid = hid;
 	SET_INPUT(PS_CLICK);
diff --git a/src/xrt/drivers/psvr/psvr_device.c b/src/xrt/drivers/psvr/psvr_device.c
index 30c59951262c72302d53be03414f1049d6ccb486..e8cc4bf7ad38ad8fa20bb8d308d2c4a12d238937 100644
--- a/src/xrt/drivers/psvr/psvr_device.c
+++ b/src/xrt/drivers/psvr/psvr_device.c
@@ -686,8 +686,9 @@ psvr_device_create(struct hid_device_info *hmd_handle_info,
 	psvr->base.get_view_pose = psvr_device_get_view_pose;
 	psvr->base.destroy = psvr_device_destroy;
 	psvr->base.inputs[0].name = XRT_INPUT_GENERIC_HEAD_RELATION;
+	psvr->base.name = XRT_DEVICE_GENERIC_HMD;
 
-	snprintf(psvr->base.name, XRT_DEVICE_NAME_LEN, "PS VR Headset");
+	snprintf(psvr->base.str, XRT_DEVICE_NAME_LEN, "PS VR Headset");
 
 	ret = open_hid(psvr, hmd_handle_info, &psvr->hmd_handle);
 	if (ret != 0) {
diff --git a/src/xrt/include/xrt/xrt_defines.h b/src/xrt/include/xrt/xrt_defines.h
index f4859377d9427011f204166b4b9bdef5cb088299..1637778db9d3a3e00d899704952a2b902d010cdc 100644
--- a/src/xrt/include/xrt/xrt_defines.h
+++ b/src/xrt/include/xrt/xrt_defines.h
@@ -302,6 +302,18 @@ struct xrt_space_relation
  *
  */
 
+/*!
+ * A enum that is used to name devices so that the
+ * state trackers can reason about the devices easier.
+ */
+enum xrt_device_name
+{
+	XRT_DEVICE_GENERIC_HMD = 1,
+
+	XRT_DEVICE_PSMV = 2,
+	XRT_DEVICE_HYDRA = 3,
+};
+
 /*!
  * Base type of this inputs.
  *
diff --git a/src/xrt/include/xrt/xrt_device.h b/src/xrt/include/xrt/xrt_device.h
index 31c72485ddce3202504f29140572a840d692c8e2..e6453c54fdeccb265a8a612a6c78071b615a6029 100644
--- a/src/xrt/include/xrt/xrt_device.h
+++ b/src/xrt/include/xrt/xrt_device.h
@@ -179,10 +179,11 @@ struct xrt_output
  */
 struct xrt_device
 {
-	/*!
-	 * A string describing the device.
-	 */
-	char name[XRT_DEVICE_NAME_LEN];
+	//! Enum identifier of the device.
+	enum xrt_device_name name;
+
+	//! A string describing the device.
+	char str[XRT_DEVICE_NAME_LEN];
 
 	//! Null if this device does not interface with the users head.
 	struct xrt_hmd_parts *hmd;
diff --git a/src/xrt/state_trackers/oxr/oxr_system.c b/src/xrt/state_trackers/oxr/oxr_system.c
index adc2a50ede1ffab15068a4813afaa524ca255211..2c83011ea63c680b3de2e8f2e675b7d43475b7ec 100644
--- a/src/xrt/state_trackers/oxr/oxr_system.c
+++ b/src/xrt/state_trackers/oxr/oxr_system.c
@@ -180,7 +180,7 @@ oxr_system_get_properties(struct oxr_logger *log,
 	properties->systemId = sys->systemId;
 
 	// Needed to silence the warnings.
-	const char *name = sys->head->name;
+	const char *name = sys->head->str;
 
 	snprintf(properties->systemName, XR_MAX_SYSTEM_NAME_SIZE, "Monado: %s",
 	         name);
diff --git a/src/xrt/state_trackers/prober/p_prober.c b/src/xrt/state_trackers/prober/p_prober.c
index 007398ee9da59596bb0471fb44ab96ac25b6cb4c..547a0eadad5b460ea8851240681de019bcddb71e 100644
--- a/src/xrt/state_trackers/prober/p_prober.c
+++ b/src/xrt/state_trackers/prober/p_prober.c
@@ -414,7 +414,7 @@ handle_found_device(struct prober* p,
                     size_t num_xdevs,
                     struct xrt_device* xdev)
 {
-	P_DEBUG(p, "Found '%s' %p", xdev->name, (void*)xdev);
+	P_DEBUG(p, "Found '%s' %p", xdev->str, (void*)xdev);
 
 	// For controllers we put them after the first found HMD.
 	if (xdev->hmd == NULL) {
@@ -426,7 +426,7 @@ handle_found_device(struct prober* p,
 		}
 
 		P_ERROR(p, "Too many controller devices closing '%s'",
-		        xdev->name);
+		        xdev->str);
 		xdev->destroy(xdev);
 		return;
 	}
@@ -437,7 +437,7 @@ handle_found_device(struct prober* p,
 		return;
 	}
 
-	P_ERROR(p, "Found more then one, HMD closing '%s'", xdev->name);
+	P_ERROR(p, "Found more then one, HMD closing '%s'", xdev->str);
 	xdev->destroy(xdev);
 }
 
@@ -507,7 +507,7 @@ select_device(struct xrt_prober* xp,
 
 
 	if (xdevs[0] != NULL) {
-		P_DEBUG(p, "Found HMD! '%s'", xdevs[0]->name);
+		P_DEBUG(p, "Found HMD! '%s'", xdevs[0]->str);
 		return 0;
 	}
 
@@ -519,7 +519,7 @@ select_device(struct xrt_prober* xp,
 			continue;
 		}
 
-		P_DEBUG(p, "Destroying '%s'", xdevs[i]->name);
+		P_DEBUG(p, "Destroying '%s'", xdevs[i]->str);
 		xdevs[i]->destroy(xdevs[i]);
 		xdevs[i] = NULL;
 	}
diff --git a/src/xrt/targets/cli/cli_cmd_test.c b/src/xrt/targets/cli/cli_cmd_test.c
index 6269647f8e15db941b34b7fff430458760b0c9fa..b8de8bf8fd590049802a179cb347287bc7262e3a 100644
--- a/src/xrt/targets/cli/cli_cmd_test.c
+++ b/src/xrt/targets/cli/cli_cmd_test.c
@@ -73,7 +73,7 @@ cli_cmd_test(int argc, const char **argv)
 			continue;
 		}
 
-		printf("\tFound '%s'\n", xdevs[i]->name);
+		printf("\tFound '%s'\n", xdevs[i]->str);
 	}
 
 	// End of program
@@ -84,7 +84,7 @@ cli_cmd_test(int argc, const char **argv)
 			continue;
 		}
 
-		printf("\tDestroying '%s'\n", xdevs[i]->name);
+		printf("\tDestroying '%s'\n", xdevs[i]->str);
 
 		xdevs[i]->destroy(xdevs[i]);
 		xdevs[i] = NULL;