diff --git a/daemon/openrazer_daemon/daemon.py b/daemon/openrazer_daemon/daemon.py
index e67974fa67880505f7896bbe5b711b296db0e65c..a0bbbac7d5e37aebab72b9932e1cea78a543b419 100644
--- a/daemon/openrazer_daemon/daemon.py
+++ b/daemon/openrazer_daemon/daemon.py
@@ -318,7 +318,7 @@ class RazerDaemon(DBusService):
 
         for device in self._razer_devices:
             self._persistence[device.dbus.storage_name] = {}
-            if 'set_dpi_xy' in device.dbus.METHODS:
+            if 'set_dpi_xy' in device.dbus.METHODS or 'set_dpi_xy_byte' in device.dbus.METHODS:
                 self._persistence[device.dbus.storage_name]['dpi_x'] = str(device.dbus.dpi[0])
                 self._persistence[device.dbus.storage_name]['dpi_y'] = str(device.dbus.dpi[1])
 
diff --git a/daemon/openrazer_daemon/dbus_services/dbus_methods/nagahex.py b/daemon/openrazer_daemon/dbus_services/dbus_methods/nagahex.py
index 456a061415ab9ede080210f393808b27455ec64e..6a9221d193c44a69d7bef7d80ef8c33decb672ba 100644
--- a/daemon/openrazer_daemon/dbus_services/dbus_methods/nagahex.py
+++ b/daemon/openrazer_daemon/dbus_services/dbus_methods/nagahex.py
@@ -15,7 +15,7 @@ def set_dpi_xy_byte(self, dpi_x, dpi_y):
     :param dpi_y: Y DPI
     :type dpi_x: int
     """
-    self.logger.debug("DBus call set_dpi_both")
+    self.logger.debug("DBus call set_dpi_xy_byte")
 
     driver_path = self.get_driver_path('dpi')
 
@@ -31,6 +31,12 @@ def set_dpi_xy_byte(self, dpi_x, dpi_y):
     dpi_x_scaled = int(round(dpi_x / 6750 * 255, 2))
     dpi_y_scaled = int(round(dpi_y / 6750 * 255, 2))
 
+    self.dpi[0] = dpi_x
+    self.dpi[1] = dpi_y
+
+    self.set_persistence(None, "dpi_x", dpi_x_scaled)
+    self.set_persistence(None, "dpi_y", dpi_y_scaled)
+
     if self._testing:
         with open(driver_path, 'w') as driver_file:
             driver_file.write("{}:{}".format(dpi_x_scaled, dpi_y_scaled))
@@ -50,15 +56,20 @@ def get_dpi_xy_byte(self):
     :return: List of X, Y DPI
     :rtype: list of int
     """
-    self.logger.debug("DBus call get_dpi_both")
+    self.logger.debug("DBus call get_dpi_xy_byte")
 
     driver_path = self.get_driver_path('dpi')
 
-    with open(driver_path, 'r') as driver_file:
-        result = driver_file.read()
-        dpi_x, dpi_y = [int(dpi) for dpi in result.strip().split(':')]
-
-    dpi_x = int(round(dpi_x / 255 * 6750, 2))
-    dpi_y = int(round(dpi_y / 255 * 6750, 2))
+    # try retrieving DPI from the hardware.
+    # if we can't (e.g. because the mouse has been disconnected)
+    # return the value in local storage.
+    try:
+        with open(driver_path, 'r') as driver_file:
+            result = driver_file.read()
+            dpi_x, dpi_y = [int(dpi) for dpi in result.strip().split(':')]
+        dpi_x = int(round(dpi_x / 255 * 6750, 2))
+        dpi_y = int(round(dpi_y / 255 * 6750, 2))
+    except FileNotFoundError:
+        dpi_x, dpi_y = self.dpi
 
     return [dpi_x, dpi_y]
diff --git a/daemon/openrazer_daemon/hardware/device_base.py b/daemon/openrazer_daemon/hardware/device_base.py
index 988e41f1949ad1bcd35455e6d89adee0c12fd042..3c37154f479571d5fbc0ccd934ed01e2f8301f05 100644
--- a/daemon/openrazer_daemon/hardware/device_base.py
+++ b/daemon/openrazer_daemon/hardware/device_base.py
@@ -200,7 +200,7 @@ class RazerDevice(DBusService):
 
         # load last DPI/poll rate state
         if self.persistence.has_section(self.storage_name):
-            if 'set_dpi_xy' in self.METHODS:
+            if 'set_dpi_xy' in self.METHODS or 'set_dpi_xy_byte' in self.METHODS:
                 try:
                     self.dpi[0] = int(self.persistence[self.storage_name]['dpi_x'])
                     self.dpi[1] = int(self.persistence[self.storage_name]['dpi_y'])