Index: mythmediamonitor.h
===================================================================
--- mythmediamonitor.h	(revision 9788)
+++ mythmediamonitor.h	(working copy)
@@ -80,7 +80,7 @@
     bool CheckMountable(void);
     bool FindPartitions(const QString &dev, bool checkPartitions);
 
-    void AddDevice(MythMediaDevice* pDevice);
+    bool AddDevice(MythMediaDevice* pDevice);
     bool AddDevice(const char* dev);
     bool AddDevice(struct fstab* mep);
     bool RemoveDevice(const QString &dev);
Index: mythmediamonitor.cpp
===================================================================
--- mythmediamonitor.cpp	(revision 9788)
+++ mythmediamonitor.cpp	(working copy)
@@ -347,15 +347,50 @@
     return l;
 }
 
-// Given a media deivce add it to our collection.
-void MediaMonitor::AddDevice(MythMediaDevice* pDevice)
+// Given a media device add it to our collection.
+bool MediaMonitor::AddDevice(MythMediaDevice* pDevice)
 {
+    dev_t new_rdev;
+    struct stat sb;
+
+    if (stat(pDevice->getDevicePath(), &sb) < 0) {
+        perror("stat: ");
+        cerr << "MediaMonitor::AddDevice - Failed to stat " <<
+                pDevice->getDevicePath() << endl;
+        return false;
+    }
+    new_rdev = sb.st_rdev;
+
+
+    //
+    // Check if this is a duplicate of a device we have already added
+    //
+    QValueList<MythMediaDevice*>::iterator itr = m_Devices.begin();
+    MythMediaDevice* pDev;
+    while (itr != m_Devices.end()) 
+    {
+        pDev = *itr;
+        if (stat(pDev->getDevicePath(), &sb) < 0) {
+            perror("stat: ");
+            cerr << "MediaMonitor::AddDevice - Failed to stat " <<
+                pDevice->getDevicePath() << endl;
+            return false;
+        }
+
+        if (sb.st_rdev == new_rdev) {
+            VERBOSE(VB_IMPORTANT, QString("Mediamonitor: Not adding %1, it's a duplicate")
+                         .arg(pDevice->getDevicePath()));
+            return false;
+        }
+    }
+
     QMutexLocker locker(&m_DevicesLock);
 
     connect(pDevice, SIGNAL(statusChanged(MediaStatus, MythMediaDevice*)), 
             this, SLOT(mediaStatusChanged(MediaStatus, MythMediaDevice*)));
     m_Devices.push_back( pDevice );
     m_UseCount[pDevice] = 0;
+    return true;
 }
 
 // Given a fstab entry to a media device determine what type of device it is 
@@ -424,7 +459,7 @@
              strncpy(devstr, dev, len);
              devstr[len] = 0;
              if (is_cdrom)
-                 MythCDROM::get(this, QString(devstr),
+                 pDevice = MythCDROM::get(this, QString(devstr),
                                 is_supermount, m_AllowEject);
          }
          else
@@ -438,11 +473,10 @@
                          .arg(pDevice->getDevicePath()));
          if (pDevice->testMedia() == MEDIAERR_OK) 
          {
-             AddDevice(pDevice);
-             return true;
+             if (AddDevice(pDevice))
+                return true;
          }
-            else
-                delete pDevice;
+         delete pDevice;
       }
 
      return false;
@@ -520,6 +554,8 @@
  */
 bool MediaMonitor::FindPartitions(const QString &dev, bool checkPartitions)
 {
+    MythMediaDevice* pDevice = NULL;
+
     if (checkPartitions)
     {
         // check for partitions
@@ -552,8 +588,10 @@
         QString device_file = GetDeviceFile(dev);
         if (!device_file.isNull())
         {
-            AddDevice(MythCDROM::get(this, device_file, false, m_AllowEject));
-            return true;
+            pDevice = MythCDROM::get(this, device_file, false, m_AllowEject);
+
+            if (AddDevice(pDevice))
+                return true;
         }
     }
     else
@@ -562,10 +600,13 @@
         QString device_file = GetDeviceFile(dev);
         if (!device_file.isNull())
         {
-            AddDevice(MythHDD::Get(this, device_file, false, false));
-            return true;
+            pDevice = MythHDD::Get(this, device_file, false, false);
+            if (AddDevice(pDevice))
+                return true;
         }
     }
+    if (pDevice != NULL)
+        delete pDevice;
 
     return false;
 }
