diff --git a/debian/changelog b/debian/changelog
index fc18af4136e9c3832fe2187661db0af12bdc1548..2d3a7c8b8ca0aba3f118d4b483ff452d1f46c74f 100644
--- a/debian/changelog
+++ b/debian/changelog
@@ -1,3 +1,9 @@
+tempermonitor (2.0.4) buster; urgency=medium
+
+  * improve plugin handling
+
+ -- Michael Loipführer <ml@stusta.de>  Thu, 23 Apr 2020 23:30:18 +0200
+
 tempermonitor (2.0.3) buster; urgency=medium
 
   * rename config file
diff --git a/setup.py b/setup.py
index 04c8983496d7545efba9823fb6a2565a54386138..54ee0b1e4ff244705fb08255365bcbbc0d689371 100644
--- a/setup.py
+++ b/setup.py
@@ -1,6 +1,6 @@
 from setuptools import setup
 
-VERSION = '2.0.3'
+VERSION = '2.0.4'
 
 
 def readme():
diff --git a/tempermonitor/plugins/__init__.py b/tempermonitor/plugins/__init__.py
index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..33f92ab1c5131d275e6308dbca35d2d6c644c049 100644
--- a/tempermonitor/plugins/__init__.py
+++ b/tempermonitor/plugins/__init__.py
@@ -0,0 +1,27 @@
+from abc import ABCMeta
+
+PLUGINS = dict()
+
+
+class PluginMeta(ABCMeta):
+    """
+    Metaclass for available container backends.
+    """
+    def __init__(cls, name, bases, classdict):
+        super().__init__(name, bases, classdict)
+        PLUGINS[cls.plugin_name()] = cls
+
+
+class Plugin(metaclass=PluginMeta):
+
+    @classmethod
+    def plugin_name(cls):
+        return cls.__name__.lower()
+
+    @property
+    def name(self):
+        return self.__class__.__name__.lower()
+
+
+# import all plugins so metaclass can populare PLUGINS dict
+from . import collectd, mail, prometheus, warnings
diff --git a/tempermonitor/plugins/collectd.py b/tempermonitor/plugins/collectd.py
index 349ab00573ff44ac7769e1d4988fb5db5e8ed942..d050634108329438ec6014bdad859bcbc9dc8df3 100644
--- a/tempermonitor/plugins/collectd.py
+++ b/tempermonitor/plugins/collectd.py
@@ -1,12 +1,10 @@
 import asyncio
 import time
 
+from . import Plugin
 
-def init(monitor):
-    return PluginCollectd(monitor)
 
-
-class PluginCollectd:
+class Collectd(Plugin):
     """
     Implements a super simple collectd interface for only sending temperature data
     """
diff --git a/tempermonitor/plugins/mail.py b/tempermonitor/plugins/mail.py
index f856488bd3233dd0197e83fda670056ed5c5adbd..d10205ca52f9cdf30410e9d1cdb4a404b2769a64 100644
--- a/tempermonitor/plugins/mail.py
+++ b/tempermonitor/plugins/mail.py
@@ -3,6 +3,8 @@ from email.mime.text import MIMEText
 from email.utils import formatdate
 import smtplib
 
+from . import Plugin
+
 UNKNOWN_SENSOR_SUBJECT = "WARNING: Unconfigured Sensor ID: {owid}"
 UNKNOWN_SENSOR_BODY = """Hello Guys,
 
@@ -89,14 +91,7 @@ with love,
 Temperator"""
 
 
-def init(monitor):
-    """
-    Plugin initialization method to be called from the outside
-    """
-    return PluginMail(monitor)
-
-
-class PluginMail:
+class Mail(Plugin):
     """
     Handle all the mail sending stuff
     """
diff --git a/tempermonitor/plugins/prometheus.py b/tempermonitor/plugins/prometheus.py
index 2edd460fe25d9c4aefffa584cf24d93b514a3b1b..a06c043d7abac27c502de4120200ad573284fb8f 100644
--- a/tempermonitor/plugins/prometheus.py
+++ b/tempermonitor/plugins/prometheus.py
@@ -1,13 +1,10 @@
 import asyncio
-
 from prometheus_client import start_http_server, Gauge
 
-
-def init(monitor):
-    return PluginPrometheus(monitor)
+from . import Plugin
 
 
-class PluginPrometheus:
+class Prometheus(Plugin):
     def __init__(self, monitor):
         self.loop = asyncio.get_event_loop()
         self.config = monitor.config
diff --git a/tempermonitor/plugins/warnings.py b/tempermonitor/plugins/warnings.py
index 591912bfaf96b70e9e5e34f6fdc7cbeb8dfc9be6..6818afb6b7e181dd6b1af2361eda48daa5d45396 100644
--- a/tempermonitor/plugins/warnings.py
+++ b/tempermonitor/plugins/warnings.py
@@ -1,12 +1,9 @@
 import time
 
+from . import Plugin
 
-def init(monitor):
-    """ Plugin interface method """
-    return PluginWarning(monitor)
 
-
-class PluginWarning:
+class Warnings(Plugin):
     """
     Generate all kind of warnings whenever needed and observe the sensor
     if they see a problematic situation in the container
diff --git a/tempermonitor/tempermonitor.py b/tempermonitor/tempermonitor.py
index e6dac07347b1f4b863216a6706694a2754935a64..882859a28fca67797eee9cd2b35e97dc6ab9a5f9 100755
--- a/tempermonitor/tempermonitor.py
+++ b/tempermonitor/tempermonitor.py
@@ -27,6 +27,8 @@ from pathlib import Path
 import serial_asyncio
 import serial
 
+from tempermonitor.plugins import PLUGINS
+
 
 class Sensor:
     """
@@ -254,14 +256,6 @@ class TempMonitor:
         self._last_store = time.time()
 
 
-def setup_plugin(filename, plugin):
-    """
-    Setup and fix plugins
-    """
-    if not getattr(plugin, "name", None):
-        plugin.name = filename
-
-
 def main():
     """
     Start the tempmonitor
@@ -272,23 +266,17 @@ def main():
     if len(sys.argv) == 2:
         configfile = sys.argv[1]
 
-    print("Configuring temperature monitoring system from {}.".format(configfile))
+    print(f"Configuring temperature monitoring system from {configfile}.")
     monitor = TempMonitor(loop, configfile)
 
-    plugin_path = Path(__file__).resolve().parent / "plugins"
-    print("Loading plugins from {}".format(plugin_path))
     active_plugins = monitor.config["general"]["plugins"].split(",")
     print(f"Active plugins: {active_plugins}")
 
-    for filename in plugin_path.glob("*.py"):
-        if (plugin_path / filename).exists() and filename.stem in active_plugins:
-            print("loading {}".format(filename.name))
-            modname = "plugins." + filename.name.split('.')[0]
-            module = importlib.import_module(modname)
-            plugin = module.init(monitor)
-            setup_plugin(filename, plugin)
-            monitor.plugins.append(plugin)
-            print("Loaded: {}".format(plugin.name))
+    for plugin in active_plugins:
+        if plugin in PLUGINS:
+            p = PLUGINS[plugin](monitor)
+            monitor.plugins.append(p)
+            print(f"Loaded plugin: {plugin}")
 
     try:
         loop.run_forever()