diff --git a/src/Committees/base.py b/src/Committees/base.py
new file mode 100644
index 0000000000000000000000000000000000000000..75f8110d951d830c78754e5002482009e37521f9
--- /dev/null
+++ b/src/Committees/base.py
@@ -0,0 +1,114 @@
+from telegram import ReplyKeyboardMarkup, Update
+from telegram.ext import (
+    CommandHandler,
+    ContextTypes,
+    ConversationHandler,
+    MessageHandler,
+    filters,
+)
+import re
+import utils
+import time
+
+
+class Committee:
+    def __init__(self, name, home_handlers: list | None = None, extra_states: dict | None = None):
+        self.name = name
+        self.info = utils.config.committees_info[self.name]
+        self.board_members = "\n".join([key for key in self.info["board"]])
+        
+        self.reply_keyboard = [
+            ["Yay", "Nay"],
+        ]
+        self.MARKUP = ReplyKeyboardMarkup(self.reply_keyboard, one_time_keyboard=True)
+        self.EXIT, self.HOME, self.SUB, self.UNSUB = range(4)
+        self.states = {**{
+                self.HOME: [
+                    MessageHandler(
+                        filters.Regex(re.compile(r'board', re.IGNORECASE)), self.board
+                    ),
+                    CommandHandler("sub", self.manage_sub),
+                    CommandHandler("exit", exit)
+                ] + home_handlers if home_handlers else [],
+                self.SUB: [
+                    MessageHandler(
+                        filters.Regex(re.compile(r'yay', re.IGNORECASE)), self.sub
+                    )
+                ],
+                self.UNSUB: [
+                    MessageHandler(
+                        filters.Regex(re.compile(r'yay', re.IGNORECASE)), self.unsub
+                    )
+                ]
+            }, **(extra_states if extra_states else {})}
+        self.handler = ConversationHandler(
+            entry_points=[CommandHandler("bar", self.intro)],
+            states=self.states,
+            fallbacks=[MessageHandler(filters.TEXT, self.intro)],
+            map_to_parent={
+                # Connection to the parent handler, note that its written EXIT: EXIT where both of these are equal to 0, that's why it leads to INITIAL which is also equal to 0
+                self.EXIT: self.EXIT
+            }
+        )
+    
+    async def intro(self, update: Update, context: ContextTypes.DEFAULT_TYPE) -> int:
+        """Intro for the bar"""
+        await self.send_message(update, context, text=f"Welcome to the {self.name} section of the Telegram Bot")
+        await self.send_message(update, context, text="In here you can learn about our board, get the link to join our groupchat, find out about our next events and even subscribe to our notifications from this bot")
+        await self.send_message(update, context, text="To exit this section of the bot just use the command /exit")
+        return self.HOME
+    
+    async def board(self, update: Update, context: ContextTypes.DEFAULT_TYPE) -> int:
+        """Introduces the board"""
+        await self.send_message(update, context, text=f"Voici the members of the {self.name} board:\n" + self.board_members)
+        return self.HOME
+
+    async def exit(self, update: Update, context: ContextTypes.DEFAULT_TYPE) -> int:
+        """Exit of the committee section"""
+        await self.send_message(update, context, text="See you again whenever you want to explore this great committee")
+        await self.send_message(update, context, text="After that, what do you want to talk about, we can talk about those shiny gems, the mighty Sail'ore or the different committees a pirate can join")
+        return self.EXIT
+
+    async def sub(self, update: Update, context: ContextTypes.DEFAULT_TYPE) -> int:
+        user_info = utils.config.r.hgetall(utils.db.user_to_key(update.effective_user))
+        sub_list = utils.db.db_to_list(user_info['subs'])
+        sub_list.append(self.name)
+        subs = utils.db.list_to_db(sub_list)
+        user_info['subs'] = subs
+        utils.config.r.hset(utils.db.user_to_key(update.effective_user), mapping=user_info)
+        await self.send_message(update, context,
+                                       text=f'You have been subscribed to {self.name}')
+        await self.send_message(update, context,
+                                       text='In order to receive communications interact at least once with t.me/SailoreParrotBot')
+        return self.HOME
+
+    async def unsub(self, update: Update, context: ContextTypes.DEFAULT_TYPE) -> int:
+        user_info = utils.config.r.hgetall(utils.db.user_to_key(update.effective_user))
+        sub_list = utils.db.db_to_list(user_info['subs'])
+        sub_list.remove(self.name)
+        subs = utils.db.list_to_db(sub_list)
+        user_info['subs'] = subs
+        utils.config.r.hset(utils.db.user_to_key(update.effective_user), mapping=user_info)
+        await self.send_message(update, context, text=f'You have been unsubscribed to {self.name}')
+        return self.HOME
+    
+    async def manage_sub(self, update: Update, context: ContextTypes.DEFAULT_TYPE) -> int:
+        """Checks if the user is subscribed and allows it to toogle it"""
+        user_info = utils.db.r.hgetall(utils.db.user_to_key(update.effective_user))
+        sub_list = utils.db.db_to_list(user_info["subs"])
+        if self.name in sub_list:
+            await self.send_message(update, context, text='It seems like you are already subscribed to this committee')
+            await self.send_message(update, context, text='This means that you will receive their communications through our associated bot @SailoreParrotBot')
+            await self.send_message(update, context, text='Do you wish to unsubscribe?', reply_markup=self.MARKUP)
+            return self.UNSUB
+        else:
+            await self.send_message(update, context, text='It seems like you are not subscribed to this committee')
+            await self.send_message(update, context, text='Doing so will mean that you will receive their communications through our associated bot @SailoreParrotBot')
+            await self.send_message(update, context, text='Do you wish to subscribe?', reply_markup=self.MARKUP)
+            return self.SUB
+    
+    @staticmethod
+    async def send_message(update: Update, context: ContextTypes.DEFAULT_TYPE, text, reply_markup=None):
+        await context.bot.send_chat_action(chat_id=update.effective_chat.id, action='typing')
+        time.sleep(len(text)/140)
+        await context.bot.send_message(chat_id=update.effective_chat.id, text=text, reply_markup=reply_markup)