virtual const PluginInfo *lookup_plugin_info (const Handle PluginHandle) {

      PluginInfo *result (0);

      PluginStruct *ps (pluginTable.lookup (PluginHandle));

      if (ps) { result = ps->info; }

      return result;
   }
   PluginStruct *release_plugin (Handle PluginHandle) {

      PluginStruct *ps (pluginTable.lookup (PluginHandle));

      if (ps) { update_obs (PluginDiscoverRemove, PluginHandle); }

      ps = (pluginTable.remove (PluginHandle));

      if (ps && ps->info && ps->plugin) {

         if (started) {

            LevelStruct *ls (levelsHead);

            while (ls) {

               if (ps->info->uses_level (ls->Level)) {

                  ps->plugin->update_plugin_state (PluginStateStop, ls->Level);
               }

               ls = ls->next;
            }

            ls = levelsHead;

            while (ls) {

               if (ps->info->uses_level (ls->Level)) {

                  ps->plugin->update_plugin_state (PluginStateShutdown, ls->Level);
               }

               ls = ls->next;
            }
         }

         if (discovered) {

            remove_all_plugins (ps->plugin);

            if (ps->HasInterface) {

               remove_plugin (ps->plugin);
               interfaceTable.remove (PluginHandle);
            }
         }
      }

      LevelStruct *ls = levelsHead;

      while (ls) { ls->table.remove (PluginHandle); ls = ls->next; }

      return ps;
   }