--- a/altsteon-daemon/src/InsteonDevCat10.cpp
+++ b/altsteon-daemon/src/InsteonDevCat10.cpp
@@ -136,6 +136,74 @@
   return 0;
 }
 
+
+int InsteonDevCat10::processRawSdGroupBroadcast0A(unsigned char *data, unsigned int len)
+{
+  sdCmd *sdcmd = NULL;
+  sdcmd = (sdCmd *)data;
+
+  mLogger->info("Broadcast0A cmd1 = %02X  cmd2 = %02X\n", sdcmd->cmd1, sdcmd->cmd2);
+  if ( sdcmd->cmd1 == LIGHT_ON )
+    {
+      if (sdcmd->cmd2 == 0x01)
+        {
+          // Smoke detected
+          mState = 1;
+          mLogger->info("%s detected smoke.\n", mAlias);
+          mParent->sendResponse((char *)"%s:0049,%02X - %s Smoke detected.\n", mAlias, mLastHopCount, mAlias);
+          return 1;
+        }
+
+      if (sdcmd->cmd2 == 0x02)
+        {
+          // CO detected
+          mState = 1;
+          mLogger->info("%s detected CO.\n", mAlias);
+          mParent->sendResponse((char *)"%s:0049,%02X - %s CO detected.\n", mAlias, mLastHopCount, mAlias);
+          return 1;
+        }
+
+      if (sdcmd->cmd2 == 0x03)
+        {
+          // Test detected
+          mParent->sendResponse((char *)"%s:0049,%02X - %s Test detected.\n", mAlias, mLastHopCount, mAlias);
+          return 1;
+        }
+
+      if (sdcmd->cmd2 == 0x04)
+        {
+          // Unknown message detected
+          mParent->sendResponse((char *)"%s:0049,%02X - %s Unknown message detected.\n", mAlias, mLastHopCount, mAlias);
+          return 1;
+        }
+
+      if (sdcmd->cmd2 == 0x05)
+        {
+          // All alerts cleared
+          mState = 2;
+          mLogger->info("%s alarms cleared.\n", mAlias);
+          mParent->sendResponse((char *)"%s:004A,%02X - %s Alert cleared.\n", mAlias, mLastHopCount, mAlias);
+          return 1;
+        }
+
+      if (sdcmd->cmd2 == 0x06)
+        {
+          // Low battery condition.
+          mParent->sendResponse((char *)"%s:004B,%02X - %s has a low battery.\n", mAlias, mLastHopCount, mAlias);
+          return 1;
+        }
+
+      if (sdcmd->cmd2 == 0x07)
+        {
+          // Malfunction detected.
+          mParent->sendResponse((char *)"%s:0049,%02X - %s Detector malfunction.\n", mAlias, mLastHopCount, mAlias);
+          return 1;
+        }
+    }
+
+  return InsteonDeviceBase::processRawSdGroupBroadcast(data, len);
+}
+
 int InsteonDevCat10::processRawSdGroupBroadcast(unsigned char *data, unsigned int len)
 {
   sdCmd *sdcmd = NULL;
@@ -148,6 +216,13 @@
     }
 
   sdcmd = (sdCmd *)data;
+
+  // The smoke-detector (subcat 0x0A) uses very different commands inside this
+  // same device cat.
+  if ( mSubCat == 0x0A )
+    {
+      return processRawSdGroupBroadcast0A( data, len );
+    }
 
   mLogger->info("Broadcast cmd1 = %02X  cmd2 = %02X\n", sdcmd->cmd1, sdcmd->cmd2);
   switch (sdcmd->cmd1)
@@ -206,9 +281,79 @@
   return InsteonDeviceBase::processCookedSdAck(cmd1, cmd2);
 }
 
+int InsteonDevCat10::processRawSdGroupCleanupSubcat0A(unsigned char cmd1, unsigned char cmd2)
+{
+  if ( cmd1 == LIGHT_ON )
+    {
+      if (cmd2 == 0x01)
+        {
+          // Smoke detected
+          mState = 1;
+          mLogger->info("%s detected smoke.\n", mAlias);
+          mParent->sendResponse((char *)"%s:0049,%02X - %s Smoke detected.\n", mAlias, mLastHopCount, mAlias);
+          return 1;
+        }
+
+      if (cmd2 == 0x02)
+        {
+          // CO detected
+          mState = 1;
+          mLogger->info("%s detected CO.\n", mAlias);
+          mParent->sendResponse((char *)"%s:0049,%02X - %s CO detected.\n", mAlias, mLastHopCount, mAlias);
+          return 1;
+        }
+
+      if (cmd2 == 0x03)
+        {
+          // Test detected
+          mParent->sendResponse((char *)"%s:0049,%02X - %s Test detected.\n", mAlias, mLastHopCount, mAlias);
+          return 1;
+        }
+
+      if (cmd2 == 0x04)
+        {
+          // Unknown message detected
+          mParent->sendResponse((char *)"%s:0049,%02X - %s Unknown message detected.\n", mAlias, mLastHopCount, mAlias);
+          return 1;
+        }
+
+      if (cmd2 == 0x05)
+        {
+          // All alerts cleared
+          mState = 2;
+          mLogger->info("%s alarms cleared.\n", mAlias);
+          mParent->sendResponse((char *)"%s:004A,%02X - %s Alert cleared.\n", mAlias, mLastHopCount, mAlias);
+          return 1;
+        }
+
+      if (cmd2 == 0x06)
+        {
+          // Low battery condition.
+          mParent->sendResponse((char *)"%s:004B,%02X - %s has a low battery.\n", mAlias, mLastHopCount, mAlias);
+          return 1;
+        }
+
+      if (cmd2 == 0x07)
+        {
+          // Malfunction detected.
+          mParent->sendResponse((char *)"%s:0049,%02X - %s Detector malfunction.\n", mAlias, mLastHopCount, mAlias);
+          return 1;
+        }
+    }
+
+  return InsteonDeviceBase::processRawSdGroupCleanup(cmd1, cmd2);
+}
+
 int InsteonDevCat10::processRawSdGroupCleanup(unsigned char cmd1, unsigned char cmd2)
 {
   char buffer[512];
+
+  // The smoke-detector (subcat 0x0A) uses very different commands inside this
+  // same device cat.
+  if ( mSubCat == 0x0A )
+    {
+      return processRawSdGroupCleanupSubcat0A(  cmd1, cmd2 );
+    }
 
   switch (cmd1)
     {