diff --git a/docs/NEWS b/docs/NEWS
index 9e200221..b8b4475c 100644
--- a/docs/NEWS
+++ b/docs/NEWS
@@ -4,6 +4,9 @@
Version 2.0-beta3 ()
------------------------------------------------------------------------
+ * Prevent "new" plugin api to install double instances of plugins
+ that are not stackable (issue #45)
+
* Back button in plugin-config
* Adapted serendipity_editor.js to provide more global (though
diff --git a/include/admin/plugins.inc.php b/include/admin/plugins.inc.php
index 75dccee2..ae9066ae 100644
--- a/include/admin/plugins.inc.php
+++ b/include/admin/plugins.inc.php
@@ -345,7 +345,19 @@ if (isset($_GET['serendipity']['plugin_to_conf'])) {
'install' => true);
serendipity_plugin_api::hook_event('backend_plugins_fetchplugin', $fetchplugin_data);
- if ($fetchplugin_data['install']) {
+ // we now have to check that the plugin is not already installed or stackable to prevent invalid double instances
+ $existingPlugin =& serendipity_plugin_api::load_plugin($serendipity['GET']['install_plugin']);
+ $new_plugin = true;
+ if (is_object($existingPlugin)) {
+ $bag = new serendipity_property_bag();
+ $existingPlugin->introspect($bag);
+ if ($bag->get('stackable') != true) {
+ $new_plugin = false;
+ }
+ }
+ $data['new_plugin_failed'] = ! $new_plugin;
+
+ if ($fetchplugin_data['install'] && $new_plugin) {
$serendipity['debug']['pluginload'] = array();
$inst = serendipity_plugin_api::create_plugin_instance($serendipity['GET']['install_plugin'], null, (serendipity_plugin_api::is_event_plugin($serendipity['GET']['install_plugin']) ? 'event': 'right'), $authorid, serendipity_db_escape_string($serendipity['GET']['pluginPath']));
diff --git a/templates/2k11/admin/plugins.inc.tpl b/templates/2k11/admin/plugins.inc.tpl
index 5f56554e..4649efa4 100644
--- a/templates/2k11/admin/plugins.inc.tpl
+++ b/templates/2k11/admin/plugins.inc.tpl
@@ -146,6 +146,9 @@
{if $save}
{$CONST.DONE}:{$CONST.SETTINGS_SAVED_AT|sprintf:"$timestamp"}
{/if}
+ {if $new_plugin_failed}
+ {$CONST.ERROR}: Plugin not stackable and already installed {* i18n *}
+ {/if}