diff --git a/src/libtomahawk/sip/SipHandler.cpp b/src/libtomahawk/sip/SipHandler.cpp
index d57e0644b..210e17805 100644
--- a/src/libtomahawk/sip/SipHandler.cpp
+++ b/src/libtomahawk/sip/SipHandler.cpp
@@ -145,11 +145,11 @@ SipHandler::loadPluginFactories( const QStringList& paths )
 }
 
 SipPlugin*
-SipHandler::createPlugin( const QString& factoryName )
+SipHandler::createPlugin( const QString& factoryId )
 {
-    Q_ASSERT( m_pluginFactories.contains( factoryName ) );
+    Q_ASSERT( m_pluginFactories.contains( factoryId ) );
 
-    SipPlugin* sip = m_pluginFactories[ factoryName ]->createPlugin();
+    SipPlugin* sip = m_pluginFactories[ factoryId ]->createPlugin();
     hookUpPlugin( sip );
 
     return sip;
@@ -269,6 +269,16 @@ SipHandler::removeSipPlugin( SipPlugin* p )
     m_enabledPlugins.removeAll( p );
 }
 
+bool
+SipHandler::hasPluginType( const QString& factoryId ) const
+{
+    foreach( SipPlugin* p, m_allPlugins ) {
+        if( factoryFromId( p->pluginId() ) == factoryId )
+            return true;
+    }
+    return false;
+}
+
 
 void
 SipHandler::loadFromConfig( bool startup )
@@ -583,7 +593,14 @@ SipHandler::onAvatarReceived( const QPixmap& avatar )
 
 
 QString
-SipHandler::factoryFromId( const QString& pluginId )
+SipHandler::factoryFromId( const QString& pluginId ) const
 {
     return pluginId.split( "_" ).first();
 }
+
+SipPluginFactory*
+SipHandler::factoryFromPlugin( SipPlugin* p ) const
+{
+    QString factoryId = factoryFromId( p->pluginId() );
+    return m_pluginFactories.value( factoryId, 0 );
+}
diff --git a/src/libtomahawk/sip/SipHandler.h b/src/libtomahawk/sip/SipHandler.h
index f7be86bcf..e108c1d28 100644
--- a/src/libtomahawk/sip/SipHandler.h
+++ b/src/libtomahawk/sip/SipHandler.h
@@ -47,6 +47,9 @@ public:
     void addSipPlugin( SipPlugin* p, bool enable = true, bool connectImmediately = true );
     void removeSipPlugin( SipPlugin* p );
 
+    bool hasPluginType( const QString& factoryId ) const;
+    SipPluginFactory* factoryFromPlugin( SipPlugin* p ) const;
+
     const QPixmap avatar( const QString& name ) const;
 
 public slots:
@@ -104,7 +107,7 @@ private:
 
     void loadPluginFactories( const QStringList& paths );
     void loadPluginFactory( const QString& path );
-    QString factoryFromId( const QString& pluginId );
+    QString factoryFromId( const QString& pluginId ) const;
 
     QHash< QString, SipPluginFactory* > m_pluginFactories;
     QList< SipPlugin* > m_allPlugins;
diff --git a/src/libtomahawk/sip/SipPlugin.h b/src/libtomahawk/sip/SipPlugin.h
index 92be5b217..d50647412 100644
--- a/src/libtomahawk/sip/SipPlugin.h
+++ b/src/libtomahawk/sip/SipPlugin.h
@@ -43,7 +43,8 @@ public:
     virtual QString factoryId() const = 0;
     // if the user can create multiple
     virtual QIcon icon() const { return QIcon(); }
-    virtual bool isCreatable() const { return true; }
+    virtual bool isUnique() const { return false; }
+
     virtual SipPlugin* createPlugin( const QString& pluginId = QString() ) = 0;
 
 protected:
diff --git a/src/settingsdialog.cpp b/src/settingsdialog.cpp
index dc5d9a538..7762a5c00 100644
--- a/src/settingsdialog.cpp
+++ b/src/settingsdialog.cpp
@@ -227,8 +227,9 @@ void
 SettingsDialog::setupSipButtons()
 {
     foreach( SipPluginFactory* f, SipHandler::instance()->pluginFactories() ) {
-        if( !f->isCreatable() )
+        if( f->isUnique() && SipHandler::instance()->hasPluginType( f->factoryId() ) ) {
             continue;
+        }
 
         QAction* action = new QAction( f->icon(), f->prettyName(), ui->addSipButton );
         action->setProperty( "factory", QVariant::fromValue< QObject* >( f ) );
@@ -518,9 +519,9 @@ SettingsDialog::factoryActionTriggered( bool )
 void
 SettingsDialog::sipFactoryClicked( SipPluginFactory* factory )
 {
-    Q_ASSERT( factory->isCreatable() );
     //if exited with OK, create it, if not, delete it immediately!
     SipPlugin* p = factory->createPlugin();
+    bool added = false;
     if( p->configWidget() ) {
         DelegateConfigWrapper dialog( p->configWidget(), QString("%1 Config" ).arg( p->friendlyName() ), this );
         QWeakPointer< DelegateConfigWrapper > watcher( &dialog );
@@ -532,14 +533,33 @@ SettingsDialog::sipFactoryClicked( SipPluginFactory* factory )
             // accepted, so add it to tomahawk
             TomahawkSettings::instance()->addSipPlugin( p->pluginId() );
             SipHandler::instance()->addSipPlugin( p );
+
+            added = true;
         } else {
             // canceled, delete it
             delete p;
         }
     } else {
         // no config, so just add it
+        added = true;
         SipHandler::instance()->addSipPlugin( p );
     }
+
+    SipPluginFactory* f = SipHandler::instance()->factoryFromPlugin( p );
+    if( added && f && f->isUnique() ) {
+        // remove from actions list
+        QAction* toremove = 0;
+        foreach( QAction* a, ui->addSipButton->actions() )
+        {
+            if( f == qobject_cast< SipPluginFactory* >( a->property( "factory" ).value< QObject* >() ) )
+            {
+                toremove = a;
+                break;
+            }
+        }
+        if( toremove )
+            ui->addSipButton->removeAction( toremove );
+    }
 }
 
 void
@@ -574,6 +594,18 @@ SettingsDialog::sipPluginDeleted( bool )
         if( idx.isValid() && !idx.data( SipModel::FactoryRole ).toBool() && !idx.data( SipModel::FactoryItemRole ).toBool() )
         {
             SipPlugin* p = qobject_cast< SipPlugin* >( idx.data( SipModel::SipPluginData ).value< QObject* >() );
+
+            if( SipPluginFactory* f = SipHandler::instance()->factoryFromPlugin( p ) )
+            {
+                if( f->isUnique() ) // just deleted a unique plugin->re-add to add menu
+                {
+                    QAction* action = new QAction( f->icon(), f->prettyName(), ui->addSipButton );
+                    action->setProperty( "factory", QVariant::fromValue< QObject* >( f ) );
+                    ui->addSipButton->addAction( action );
+
+                    connect( action, SIGNAL( triggered(bool) ), this, SLOT( factoryActionTriggered( bool ) ) );
+                }
+            }
             SipHandler::instance()->removeSipPlugin( p );
         }
     }
diff --git a/src/sip/zeroconf/zeroconf-icon.png b/src/sip/zeroconf/zeroconf-icon.png
index edce7f4e7..7371f8eae 100644
Binary files a/src/sip/zeroconf/zeroconf-icon.png and b/src/sip/zeroconf/zeroconf-icon.png differ
diff --git a/src/sip/zeroconf/zeroconf.h b/src/sip/zeroconf/zeroconf.h
index 12cc4b2c8..6457e319e 100644
--- a/src/sip/zeroconf/zeroconf.h
+++ b/src/sip/zeroconf/zeroconf.h
@@ -36,9 +36,10 @@ public:
 
     virtual QString factoryId() const { return "sipzeroconf"; }
     virtual QString prettyName() const { return "Local Network"; }
-    virtual bool isCreatable() const { return false; };
-    virtual SipPlugin* createPlugin ( const QString& pluginId = QString() );
+    virtual bool isUnique() const { return true; }
     virtual QIcon icon() const;
+
+    virtual SipPlugin* createPlugin ( const QString& pluginId = QString() );
 };
 
 class SIPDLLEXPORT ZeroconfPlugin : public SipPlugin