diff --git a/SkyMoteCommandResponseService.py b/SkyMoteCommandResponseService.py
index 63346d8..cdfc239 100644
--- a/SkyMoteCommandResponseService.py
+++ b/SkyMoteCommandResponseService.py
@@ -34,28 +34,34 @@ def dataReceived(self, data):
             d = defer.Deferred()
             d.addCallback(self.responseReceived)
             self.queuedJobs.append([data, d])
+        else:        
+            print "dataReceived: got data.  length: %d" % len(data)        
+            print "dataReceived: ",
+            print [ hex(ord(c)) for c in data ]
             
-            return True
-        
-        print "dataReceived: got data.  length: %d" % len(data)        
-        print "dataReceived: ",
-        print [ hex(ord(c)) for c in data ]
-        
-        if len(data.strip()) == 4:
-            data = data.strip()
-            print "Got special command:", data
-            if data.lower() == "lock":
-                # Prevent others from talking to this device
-                self.factory.lockout(self.connectionNumber)
-            elif data.lower() == "done":
-                # Allow others to talk to the device
-                self.factory.unlockEveryone()
-        else:
-            d = defer.Deferred()
-            d.addCallback(self.responseReceived)
-            
-            #self.factory.exchanger.newPacketEvent.set()
-            readBytes = self.factory.writeRead(data, d)
+            if len(data.strip()) == 4:
+                data = data.strip()
+                print "Got special command:", data
+                if data.lower() == "lock":
+                    # Prevent others from talking to this device
+                    self.factory.lockout(self.connectionNumber)
+                elif data.lower() == "done":
+                    # Allow others to talk to the device
+                    self.factory.unlockEveryone()
+                elif data.lower().startswith("crh"):
+                    # Close and re-open handleOnly
+                    sleepTime = int(data[3])
+                    self.factory.exchanger.closeAndReopenDevice(sleepTime, True)
+                elif data.lower().startswith("rst"):
+                    # Close and re-open normally
+                    sleepTime = int(data[3])
+                    self.factory.exchanger.closeAndReopenDevice(sleepTime)
+            else:
+                d = defer.Deferred()
+                d.addCallback(self.responseReceived)
+                
+                #self.factory.exchanger.newPacketEvent.set()
+                readBytes = self.factory.writeRead(data, d)
         
     def responseReceived(self, data):
         print "responseReceived: Got results:", data
diff --git a/SkyMoteExchanger.py b/SkyMoteExchanger.py
index 5de130f..5870536 100644
--- a/SkyMoteExchanger.py
+++ b/SkyMoteExchanger.py
@@ -14,6 +14,9 @@
 from SkyMoteSpontaneousDataService import SkyMoteSpontaneousFactory
 
 from time import sleep
+from threading import Event
+
+from LabJackPython import deviceCount
 
 class SkyMoteExchanger(object):
     def __init__(self, device, commandResponsePort, spontaneousPort, serviceCollection, deviceLostFnx ):
@@ -35,7 +38,9 @@ def __init__(self, device, commandResponsePort, spontaneousPort, serviceCollecti
         self.spontaneousService.setServiceParent(serviceCollection)
         
         self.deviceLost = deviceLostFnx
-
+        self.deviceClosedEvent = Event()
+        self.closingDevice = False
+        
         self.running = True
         self.lastCommandTime = datetime.now()
         
@@ -76,9 +81,31 @@ def shutdown(self, serviceCollection = None):
     def sendSpontaneousData(self, data):
         for connection in self.spontaneousService.args[1].connections.values():
             connection.sendData(data)
+    
+    def closeAndReopenDevice(self, sleepTime = 4, handleOnly = False):
+        print "closeAndReopenDevice called, sleepTime = %s, handleOnly = %s" % (sleepTime, handleOnly)
+        # Save the serial number of the device.
+        #devNumber = deviceCount(self.device.devType)
+        
+        self.closingDevice = True
+        self.running = False # Tell the looping read to stop
+        self.deviceClosedEvent.wait() # Wait for the looping read to stop
+        
+        # Now sleep for the desired number of seconds.
+        sleep(sleepTime)
+        
+        # Re-open device
+        self.device.open(handleOnly = handleOnly, LJSocket = None)
+        
+        # Restart looping reading
+        self.running = True
+        self.closingDevice = False
+        reactor.callInThread(self.loopingRead)
         
     
     def loopingRead(self):
+        self.deviceClosedEvent.clear() # The device isn't close, so set the flag to False.
+        
         while self.running:
 
             # Busy wait just for a bit because we recently received a 
@@ -116,10 +143,14 @@ def loopingRead(self):
                 if str(e).endswith('-7'):
                     #print "Read timed out."
                     pass
+                elif self.closingDevice:
+                    # We're closing the device anyway.
+                    pass
                 else:
                     print type(e), e
                     self.deviceLost()
         
         self.device.close()
         print "Shutting down read loop."
+        self.deviceClosedEvent.set() # Device is closed, so let people know.
             
\ No newline at end of file