diff --git a/ccnode/node.py b/ccnode/node.py
index 2299333a4f716e9eb1c235ffc33bbdd40ba5cf8a..a60c78879ec2ead96928041e78737c8f2c64b3c4 100644
--- a/ccnode/node.py
+++ b/ccnode/node.py
@@ -100,13 +100,14 @@ class AuthHandler(object):
         if response == u'host':
             logger.debug('Role host affected')
             from ccnode.host import Handler as HostHandler
-            self.loop.role = HostHandler()
+            self.loop.role = HostHandler(loop=self.loop.loop)
         elif response == u'hv':
             logger.debug('Role hypervisor affected')
             from ccnode.hypervisor import Handler as HypervisorHandler
             self.loop.role = HypervisorHandler(
                 proxy=self.loop.proxy,
                 hypervisor_name=self.loop.config.server_user,
+                loop=self.loop.loop,
             )
         else:
             logger.error('Failed authentication, role returned: %s', response)
@@ -222,7 +223,7 @@ class MainLoop(object):
         # register handler
         self.rpc_handler.update(plugin.rpc_handler)
 
-        plugin.start(self.loop)
+        plugin.start()
 
     def unregister_plugin(self, plugin):
         try:
diff --git a/ccnode/plugins.py b/ccnode/plugins.py
new file mode 100644
index 0000000000000000000000000000000000000000..acbe0387ebf569d8d0f423d32c817692ab172da9
--- /dev/null
+++ b/ccnode/plugins.py
@@ -0,0 +1,53 @@
+"""Plugins helpers for Cloud Control node."""
+
+from itertools import chain, imap
+
+
+class Base(object):
+    """Example skeleton plugin for cc-node.
+
+    If you want to create your own plugin for the `cc-node` you may create an
+    object that would quack just like this one or just inherit from this class.
+
+    """
+    def __init__(self, *args, **kwargs):
+        """
+        :param loop: pyev loop instance
+        """
+        self.loop = kwargs.pop('loop')
+
+        # plugins may define tags (see :mod:`ccnode.tags`)
+        self.tag_db = dict(
+            __main__=dict(),
+            # subobjects tags go here
+        )
+
+        # plugins may define handler functions that would be called by the
+        # server
+        self.rpc_handler = dict()
+
+        # tag_db and rpc_handler can be implemented as properties if more logic
+        # is needed
+
+    def __hash__(self):
+        """This method is used when registering a plugin in the main loop.
+
+        By default, only one instance is allowed. Subclasses can overide this
+        method to change this behaviour.
+
+        """
+        return hash(self.__class__.__name__)
+
+    def start(self):
+        """Used to start pyev watchers."""
+        # start tags
+        for tag in chain.from_iterable(
+            imap(lambda d: d.itervalues(), self.tag_db.itervalues()),
+        ):
+            tag.start(self.loop)
+
+    def stop(self):
+        """Cleanup for plugins, can be used to clean pyev watchers."""
+
+        self.loop = None
+        # TODO dependencies