diff --git a/emojis/AK.jpeg b/emojis/AK.jpeg
new file mode 100644
index 0000000000000000000000000000000000000000..35fd627f4b513edd25458bfbc9e6f03f8e2fe7f6
Binary files /dev/null and b/emojis/AK.jpeg differ
diff --git a/emojis/BI3.png b/emojis/BI3.png
new file mode 100644
index 0000000000000000000000000000000000000000..41fa2f529dabaf19b85c924fa683d639896ba53a
Binary files /dev/null and b/emojis/BI3.png differ
diff --git a/emojis/BM.jpeg b/emojis/BM.jpeg
new file mode 100644
index 0000000000000000000000000000000000000000..b853ac3d1ead43aeec63b57cb509714e782f964a
Binary files /dev/null and b/emojis/BM.jpeg differ
diff --git a/emojis/BMTS.png b/emojis/BMTS.png
new file mode 100644
index 0000000000000000000000000000000000000000..124c51699bd5e03f27fd3ea200ebc3e6103e0ca9
Binary files /dev/null and b/emojis/BMTS.png differ
diff --git a/emojis/BWI2.jpeg b/emojis/BWI2.jpeg
new file mode 100644
index 0000000000000000000000000000000000000000..415702131158280704d5f4af614fe49cd45fc2f2
Binary files /dev/null and b/emojis/BWI2.jpeg differ
diff --git a/emojis/Color-Blau.png b/emojis/Color-Blau.png
new file mode 100644
index 0000000000000000000000000000000000000000..9b6041518c56039f16547ecf22df5a610832f45b
Binary files /dev/null and b/emojis/Color-Blau.png differ
diff --git "a/emojis/Color-Gr\303\274n.png" "b/emojis/Color-Gr\303\274n.png"
new file mode 100644
index 0000000000000000000000000000000000000000..bcb4b7c968d57a6a90895d67c85fbed0815a0d41
Binary files /dev/null and "b/emojis/Color-Gr\303\274n.png" differ
diff --git a/emojis/Color-Lila.png b/emojis/Color-Lila.png
new file mode 100644
index 0000000000000000000000000000000000000000..a9a073a68cf577a90082ef828532864c760f7409
Binary files /dev/null and b/emojis/Color-Lila.png differ
diff --git a/emojis/Color-Orange.png b/emojis/Color-Orange.png
new file mode 100644
index 0000000000000000000000000000000000000000..094987bc5897be6a24526d0ad9cbf0dc0cafe7ef
Binary files /dev/null and b/emojis/Color-Orange.png differ
diff --git a/emojis/Color-Pink.png b/emojis/Color-Pink.png
new file mode 100644
index 0000000000000000000000000000000000000000..05c5176612b94f4c7b35b7b4b99c7cc9b9c1774b
Binary files /dev/null and b/emojis/Color-Pink.png differ
diff --git a/emojis/Color-Sonnengelb.png b/emojis/Color-Sonnengelb.png
new file mode 100644
index 0000000000000000000000000000000000000000..85bc964aa19eaaa19b3183cbbd48c51e14a30bed
Binary files /dev/null and b/emojis/Color-Sonnengelb.png differ
diff --git "a/emojis/Color-T\303\274rkis.png" "b/emojis/Color-T\303\274rkis.png"
new file mode 100644
index 0000000000000000000000000000000000000000..fda51d2a309da1b11b055400142b1222a4fd3b9d
Binary files /dev/null and "b/emojis/Color-T\303\274rkis.png" differ
diff --git a/emojis/MI2.png b/emojis/MI2.png
new file mode 100644
index 0000000000000000000000000000000000000000..64cf55e735a92cee8af8627df7f6d4fa8dbda381
Binary files /dev/null and b/emojis/MI2.png differ
diff --git a/emojis/MM.jpeg b/emojis/MM.jpeg
new file mode 100644
index 0000000000000000000000000000000000000000..c7567b14738d431320e470828b72790e1e46506d
Binary files /dev/null and b/emojis/MM.jpeg differ
diff --git a/emojis/MPI.jpeg b/emojis/MPI.jpeg
new file mode 100644
index 0000000000000000000000000000000000000000..670c2faa7f2b5e8dc12715c75936309a94aa70e5
Binary files /dev/null and b/emojis/MPI.jpeg differ
diff --git a/emojis/MPI2.jpeg b/emojis/MPI2.jpeg
new file mode 100644
index 0000000000000000000000000000000000000000..1ea43299a4df38df22c1a91e0e599718162d695f
Binary files /dev/null and b/emojis/MPI2.jpeg differ
diff --git a/emojis/MWI.jpeg b/emojis/MWI.jpeg
new file mode 100644
index 0000000000000000000000000000000000000000..6228bc438d66cd2b05fda032f0adae50235160fc
Binary files /dev/null and b/emojis/MWI.jpeg differ
diff --git a/emojis/S.jpeg b/emojis/S.jpeg
new file mode 100644
index 0000000000000000000000000000000000000000..268e107e6d09a4a5f7df0de562a252a918b0e7e1
Binary files /dev/null and b/emojis/S.jpeg differ
diff --git a/fernuni_bot.py b/fernuni_bot.py
index 4d62a8b8e509c32b5d6f93c4220ef6d0d066e02f..1a7c93b909e2ca69c84bae60e8a5a7ba494267ba 100644
--- a/fernuni_bot.py
+++ b/fernuni_bot.py
@@ -12,6 +12,7 @@ from poll_cog import PollCog
 from roles_cog import RolesCog
 from text_commands_cog import TextCommandsCog
 from tops_cog import TopsCog
+from welcome_cog import WelcomeCog
 
 # .env file is necessary in the same directory, that contains several strings.
 load_dotenv()
@@ -32,12 +33,13 @@ appointments_cog = AppointmentsCog(bot)
 text_commands_cog = TextCommandsCog(bot)
 tops_cog = TopsCog(bot)
 roles_cog = RolesCog(bot)
-# welcome_cog = WelcomeCog(bot)
+welcome_cog = WelcomeCog(bot)
 bot.add_cog(appointments_cog)
 bot.add_cog(text_commands_cog)
 bot.add_cog(poll_cog)
 bot.add_cog(tops_cog)
 bot.add_cog(roles_cog)
+bot.add_cog(welcome_cog)
 
 
 # bot.add_cog(welcome_cog)
diff --git a/roles_cog.py b/roles_cog.py
index 387f0a4c62a7f63e0ef52c946e7b1f73a9535e65..3283a61b55d9dd27d54d77eb8e2a50093b9672f9 100644
--- a/roles_cog.py
+++ b/roles_cog.py
@@ -11,6 +11,9 @@ class RolesCog(commands.Cog):
     def __init__(self, bot):
         self.bot = bot
         self.roles_file = os.getenv("DISCORD_ROLES_FILE")
+        self.channel_id = int(os.getenv("DISCORD_ROLLEN_CHANNEL"))
+        self.degree_program_message_id = int(os.getenv("DISCORD_DEGREE_PROGRAM_MSG"))
+        self.color_message_id = int(os.getenv("DISCORD_COLOR_MSG"))
         self.assignable_roles = {}
         self.load_roles()
 
@@ -20,99 +23,43 @@ class RolesCog(commands.Cog):
         roles_file = open(self.roles_file, mode='r')
         self.assignable_roles = json.load(roles_file)
 
-    def get_guild(self):
-        """ Returns an guild object, that matches the id specified in GUILD.
-        This guild is the FU Hagen Informatik/Mathematik guild."""
+    def get_degree_program_emojis(self):
+        """ Creates a dict for degree program emojis """
 
-        for guild in self.bot.guilds:
-            if guild.id == int(os.getenv('DISCORD_GUILD')):
-                return guild
+        tmp_emojis = {}
+        emojis = {}
+        degree_program_assignable = self.assignable_roles[0]
 
-        return None
+        # start with getting all emojis that are used in those roles as a dict
+        for emoji in self.bot.emojis:
+            if emoji.name in degree_program_assignable:
+                tmp_emojis[emoji.name] = emoji
 
-    def get_key(self, role):
-        """ Get the key for a given role. This role is used for adding or removing a role from a user. """
-
-        for key, role_name in self.assignable_roles.items():
-            if role_name == role.name:
-                return key
-
-    def get_member(self, user):
-        """ Get Member from passed user """
-
-        if type(user) is discord.Member:
-            return user
-        elif type(user) is discord.User:
-            guild = self.get_guild()
-            if guild is not None:
-                return guild.get_member(user.id)
-        return None
-
-    def get_roles(self, user=None):
-        """ Get all roles assigned to a member, or all roles available on the discord server
-        (in both cases only roles are returned, that are defined in roles.json). """
-        roles_list = []
-        roles_dict = {}
-
-        if user is not None:
-            member = self.get_member(user)
-            if member is not None:
-                roles_list = member.roles
-        else:
-            guild = self.get_guild()
-            if guild is not None:
-                roles_list = guild.roles
-
-        for role in roles_list:
-            role_key = self.get_key(role)
-            if role_key is not None:
-                roles_dict[role_key] = role
-        return roles_dict
-
-    @staticmethod
-    def get_role_embed(title, roles):
-        """ Returns an embed that represents all the roles that are passed to this function """
-
-        embed = discord.Embed(title=title,
-                              description="Bei jeder Rolle siehst du oben in Fett den Key der Rolle und "
-                                          "darunter den Namen der Rolle",
-                              color=19607)
-        embed.add_field(name="\u200B", value="\u200B", inline=False)
+        # bring them in desired order
+        for key in degree_program_assignable.keys():
+            emojis[key] = tmp_emojis.get(key)
 
-        for key, role in roles.items():
-            embed.add_field(name=key, value=role.name, inline=False)
+        return emojis
 
-        return embed
+    def get_color_emojis(self):
+        """ Creates a dict for degree program emojis """
 
-    @commands.command(name="all-roles")
-    async def cmd_all_roles(self, message):
-        """ Send all available roles that can be assigned to a member by this bot as DM """
+        emojis = {}
+        color_assignable = self.assignable_roles[1]
 
-        roles = self.get_roles()
-        embed = self.get_role_embed("Alle verfügbaren Rollen", roles)
-        await utils.send_dm(message.author, "", embed=embed)
+        # start with getting all emojis that are used in those roles as a dict
+        for emoji in self.bot.emojis:
+            if emoji.name in color_assignable:
+                emojis[emoji.name] = emoji
 
-    @commands.command(name="my-roles")
-    async def cmd_my_roles(self, message):
-        """ Send the roles assigned to a member as DM. """
+        return emojis
 
-        roles = self.get_roles(message.author)
-        embed = self.get_role_embed("Dir zugewiesene Rollen", roles)
-        await utils.send_dm(message.author, "", embed=embed)
-
-    @commands.command(name="add-roles")
-    async def cmd_add_roles(self, ctx, *args):
-        """ Add yourself one or more roles """
-
-        for arg in args:
-            await self.modify_roles(ctx.author, True, arg)
-
-    @commands.command(name="remove-roles")
-    async def cmd_remove_roles(self, ctx, *args):
-        """ Remove roles assigned to you """
+    def get_key(self, role):
+        """ Get the key for a given role. This role is used for adding or removing a role from a user. """
 
-        for arg in args:
-            await self.modify_roles(ctx.author, False, arg)
+        for key, role_name in self.assignable_roles.items():
+            if role_name == role.name:
+                return key
 
     @commands.command(name="add-role")
     @commands.is_owner()
@@ -128,41 +75,19 @@ class RolesCog(commands.Cog):
         else:
             await utils.send_dm(ctx.author, f"Fehler beim Hinzufügen der Rolle {role}")
 
-    async def modify_roles(self, author, add, key):
-        """ Add or remove roles assigned to a member. Multiple roles can be added with one command, or removed. """
-
-        guild = self.get_guild()
-
-        if guild is not None:
-            member = self.get_member(author)
-
-            roles = self.get_roles()
-            if key in roles:
-                role = roles[key]
-                if add:
-                    try:
-                        await member.add_roles(role)
-                        await utils.send_dm(author, f'Dir wurde die Rolle {role.name} hinzugefügt')
-                    except Exception:
-                        await utils.send_dm(author, f'Fehler bei der Zuweisung der Rolle {role.name}')
-                else:
-                    try:
-                        await member.remove_roles(role)
-                        await utils.send_dm(author, f'Dir wurde die Rolle {role.name} entfernt')
-                    except Exception:
-                        await utils.send_dm(author, f'Fehler bei der Entfernung der Rolle {role.name}')
-
     @commands.command(name="stats")
     async def cmd_stats(self, ctx):
         """ Sends stats in Chat. """
 
-        guild = self.get_guild()
+        guild = ctx.guild
         members = await guild.fetch_members().flatten()
-        roles = self.get_roles()
         answer = f''
         embed = discord.Embed(title="Statistiken",
                               description=f'Wir haben aktuell {len(members)} Mitglieder auf diesem Server, verteilt auf folgende Rollen:')
-        for key, role in roles.items():
+
+        for role in guild.roles:
+            if not self.get_key(role):
+                continue
             role_members = role.members
             if len(role_members) > 0 and not role.name.startswith("Farbe"):
                 embed.add_field(name=role.name, value=f'{len(role_members)} Mitglieder', inline=False)
@@ -177,3 +102,83 @@ class RolesCog(commands.Cog):
         embed.add_field(name="Mitglieder ohne Rolle", value=str(no_role), inline=False)
 
         await ctx.channel.send(answer, embed=embed)
+
+    @commands.command("update-degree-program")
+    @commands.check(utils.is_mod)
+    async def cmd_update_degree_program(self, ctx):
+        channel = await self.bot.fetch_channel(self.channel_id)
+        message = await channel.fetch_message(self.degree_program_message_id)
+        degree_program_emojis = self.get_degree_program_emojis()
+
+        embed = discord.Embed(title="Vergabe von Studiengangs-Rollen",
+                              description="Durch klicken auf die entsprechende Reaktion kannst du dir die damit assoziierte Rolle zuweisen, oder entfernen. Dies funktioniert so, dass ein Klick auf die Reaktion die aktuelle Zuordnung dieser Rolle ändert. Das bedeutet, wenn du die Rolle, die mit :St: assoziiert ist, schon hast, aber die Reaktion noch nicht ausgewählt hast, dann wird dir bei einem Klick auf die Reaktion diese Rolle wieder weggenommen. ")
+
+        value = f""
+        for key, emoji in degree_program_emojis.items():
+            if emoji:
+                value += f"<:{key}:{emoji.id}> : {self.assignable_roles[0].get(key)}\n"
+
+        embed.add_field(name="Rollen",
+                        value=value,
+                        inline=False)
+
+        await message.edit(content="", embed=embed)
+        await message.clear_reactions()
+
+        for emoji in degree_program_emojis.values():
+            if emoji:
+                await message.add_reaction(emoji)
+
+    @commands.command("update-color")
+    @commands.check(utils.is_mod)
+    async def cmd_update_color(self, ctx):
+        channel = await self.bot.fetch_channel(self.channel_id)
+        message = await channel.fetch_message(self.color_message_id)
+        color_emojis = self.get_color_emojis()
+
+        embed = discord.Embed(title="Vergabe von Farb-Rollen",
+                              description="Durch klicken auf die entsprechende Reaktion kannst du dir die damit assoziierte Rolle zuweisen, oder entfernen. Dies funktioniert so, dass ein Klick auf die Reaktion die aktuelle Zuordnung dieser Rolle ändert. Das bedeutet, wenn du die Rolle, die mit :St: assoziiert ist, schon hast, aber die Reaktion noch nicht ausgewählt hast, dann wird dir bei einem Klick auf die Reaktion diese Rolle wieder weggenommen. ")
+
+        await message.edit(content="", embed=embed)
+        await message.clear_reactions()
+
+        for emoji in color_emojis.values():
+            if emoji:
+                await message.add_reaction(emoji)
+
+    @commands.Cog.listener()
+    async def on_raw_reaction_add(self, payload):
+        await self.toggle_role_assignment(payload)
+
+    @commands.Cog.listener()
+    async def on_raw_reaction_remove(self, payload):
+        await self.toggle_role_assignment(payload)
+
+    async def toggle_role_assignment(self, payload):
+        if payload.user_id == self.bot.user.id or payload.message_id not in [self.degree_program_message_id,
+                                                                             self.color_message_id]:
+            return
+
+        if payload.emoji.name not in self.assignable_roles[0] and payload.emoji.name not in self.assignable_roles[1]:
+            return
+
+        role_name = ""
+        guild = await self.bot.fetch_guild(payload.guild_id)
+        member = await guild.fetch_member(payload.user_id)
+        roles = member.roles
+
+        if payload.emoji.name in self.assignable_roles[0]:
+            role_name = self.assignable_roles[0].get(payload.emoji.name)
+        else:
+            role_name = self.assignable_roles[1].get(payload.emoji.name)
+
+        for role in roles:
+            if role.name == role_name:
+                await member.remove_roles(role)
+                break
+        else:
+            guild_roles = guild.roles
+
+            for role in guild_roles:
+                if role.name == role_name:
+                    await member.add_roles(role)
diff --git a/welcome_cog.py b/welcome_cog.py
index 5ffc3ab8adb02cde8d03fc4093afd0f4ae1f887e..207bb45f42b9ed12f52a5fe5c01b3c3bc11eb1cd 100644
--- a/welcome_cog.py
+++ b/welcome_cog.py
@@ -9,8 +9,8 @@ import utils
 class WelcomeCog(commands.Cog):
     def __init__(self, bot):
         self.bot = bot
-        self.channel_id = 731078162334875689
-        self.message_id = 761317936262414378
+        self.channel_id = int(os.getenv("DISCORD_WELCOME_CHANNEL"))
+        self.message_id = int(os.getenv("DISCORD_WELCOME_MSG"))
 
     @commands.command("update-welcome")
     @commands.check(utils.is_mod)
@@ -21,13 +21,13 @@ class WelcomeCog(commands.Cog):
         embed = discord.Embed(title="Herzlich Willkommen auf dem Discord von Studierenden für Studierende.",
                               description="Disclaimer: Das hier ist kein offizieller Kanal der Fernuni. Hier findet auch keine offizielle Betreuung durch die Fernuni statt. Dieser Discord dient zum Austausch unter Studierenden über einzelne Kurse, um sich gegenseitig helfen zu können, aber auch um über andere Themen in einen Austausch zu treten. Es soll KEIN Ersatz für die Kanäle der Lehrgebiete sein, wie die Newsgroups, Moodle-Foren und was es noch so gibt. Der Discord soll die Möglichkeit bieten, feste Lerngruppen zu finden und sich in diesen gegenseitig zu helfen und zu treffen. Zudem soll er durch den Austausch in den Kanälen auch eine Art flexible Lerngruppe zu einzelnen Kursen ermöglichen. Daher ist unser Apell an euch: Nutzt bitte auch die Betreuungsangebote der entsprechenden Kurse, in die ihr eingeschrieben seid. ")
         embed.set_thumbnail(
-            url="https://cdn.discordapp.com/avatars/697842294279241749/c7d3063f39d33862e9b950f72ab71165.webp?size=1024")
+            url="https://cdn.discordapp.com/avatars/697842294279241749/c7d3063f39d33862e9b950f72ab71165.webp")
         embed.add_field(name="Lerngruppen",
                         value="Wenn ihr eine feste Lerngruppe gründen möchtet, dann könnt ihr dafür gerne einen eigenen Textchannel bekommen. Sagt einfach bescheid, dann kann dieser erstellt werden. Ihr könnt dann auch entscheiden, ob nur ihr Zugang zu diesem Channel haben möchtet, oder ob dieser für alle zugänglich sein soll.",
                         inline=False)
 
         embed.add_field(name="Vorstellung",
-                        value="Es gibt einen <#731078162334875693>. Wir würden uns freuen, wenn ihr euch kurz vorstellen würdet. So ist es möglich, Gemeinsamkeiten zu entdecken und man weiß ungefähr, mit wem man es zu tun hat. Hier soll auch gar nicht der komplette Lebenslauf stehen, schreibt einfach das, was ihr so über euch mitteilen möchtet.",
+                        value=f"Es gibt einen <#{os.getenv('DISCORD_VORSTELLUNGSCHANNEL')}>. Wir würden uns freuen, wenn ihr euch kurz vorstellen würdet. So ist es möglich, Gemeinsamkeiten zu entdecken und man weiß ungefähr, mit wem man es zu tun hat. Hier soll auch gar nicht der komplette Lebenslauf stehen, schreibt einfach das, was ihr so über euch mitteilen möchtet.",
                         inline=False)
 
         embed.add_field(name="Regeln",
@@ -39,18 +39,7 @@ class WelcomeCog(commands.Cog):
                         inline=False)
 
         embed.add_field(name="Rollen",
-                        value="Außerdem haben wir Rollen für die einzelnen Studiengänge. Das soll es in bestimmten Situationen vereinfachen, zu identifizieren, in welchem Studiengang man eingeschrieben ist. Dadurch lassen sich bestimmte Nachrichten und Fragen besser im Kontext zuordnen und die Fragen können passend zum Studiengang präziser beantwortet werden. Die Rollen, die hierfür derzeit zur Verfügung stehen sind:\nB.Sc. Informatik, B.Sc. Mathematik, B.Sc. Wirtschaftsinformatik, B.Sc. Mathematisch-Technische Softwareentwicklung,\nM.Sc. Informatik, M.Sc. Praktische Informatik, M.Sc. Mathematik, M.Sc. Wirtschaftsinformatik. ",
+                        value=f"Es gibt verschiedene Rollen hier. Derzeit sind das zum einen Rollen zu den verschiedenen Studiengängen unserer Fakultät (sowie allgemeinere Rollen), oder Farbrollen. Wirf doch mal einen Blick in <#{os.getenv('DISCORD_ROLLEN_CHANNEL')}>",
                         inline=False)
 
         await message.edit(content="", embed=embed)
-
-        guild = await self.bot.fetch_guild(int(os.getenv('DISCORD_GUILD')))
-        roles_cog = self.bot.get_cog("RolesCog")
-
-        print(roles_cog.assignable_roles)
-
-        for emoji in guild.emojis:
-            if emoji.name in roles_cog.assignable_roles.keys():
-                await message.add_reaction(emoji)
-
-            print(emoji)