diff --git a/cogs/appointments.py b/cogs/appointments.py
index d1384374f76d8c15e7541e6c78cd2a181b20bd59..8b1030eae61675ef6cceced987f1a74a401a2c66 100644
--- a/cogs/appointments.py
+++ b/cogs/appointments.py
@@ -5,8 +5,8 @@ import json
 import os
 import uuid
 
-import discord
-from discord.ext import tasks, commands
+import disnake
+from disnake.ext import tasks, commands
 
 import utils
 from cogs.help import help, handle_error, help_category
@@ -109,7 +109,7 @@ class Appointments(commands.Cog):
 
                         if str(message.id) in delete:
                             await message.delete()
-                    except discord.errors.NotFound:
+                    except disnake.errors.NotFound:
                         delete.append(message_id)
 
             if len(delete) > 0:
@@ -169,7 +169,7 @@ class Appointments(commands.Cog):
         else:
             reminder = utils.to_minutes(reminder)
 
-        embed = discord.Embed(title="Neuer Termin hinzugefügt!",
+        embed = disnake.Embed(title="Neuer Termin hinzugefügt!",
                               description=f"Wenn du eine Benachrichtigung zum Beginn des Termins"
                                           f"{f', sowie {reminder} Minuten vorher, ' if reminder > 0 else f''} "
                                           f"erhalten möchtest, reagiere mit :thumbsup: auf diese Nachricht.",
@@ -182,7 +182,7 @@ class Appointments(commands.Cog):
         if recurring:
             embed.add_field(name="Wiederholung", value=f"Alle {recurring} Tage", inline=False)
 
-        message = await channel.send(embed=embed, file=discord.File(get_ics_file(title, date_time, reminder, recurring),
+        message = await channel.send(embed=embed, file=disnake.File(get_ics_file(title, date_time, reminder, recurring),
                                                                     filename=f"{title}.ics"))
         await message.add_reaction("👍")
         await message.add_reaction("🗑️")
@@ -214,7 +214,7 @@ class Appointments(commands.Cog):
                     message = await ctx.channel.fetch_message(int(message_id))
                     answer += f'{appointment["date_time"]}: {appointment["title"]} => ' \
                               f'{message.jump_url}\n'
-                except discord.errors.NotFound:
+                except disnake.errors.NotFound:
                     delete.append(message_id)
 
             if len(delete) > 0:
diff --git a/cogs/calmdown.py b/cogs/calmdown.py
index fe29183cac68afa35df880354bb7f07d66305c06..b01b738cb2b9d9bc715595bd0a64ba83aa0e1320 100644
--- a/cogs/calmdown.py
+++ b/cogs/calmdown.py
@@ -3,8 +3,8 @@ import json
 import os
 import re
 
-import discord
-from discord.ext import commands, tasks
+import disnake
+from disnake.ext import commands, tasks
 
 import utils
 from cogs.help import help
@@ -46,7 +46,7 @@ class Calmdown(commands.Cog):
             if inform_user:
                 await utils.send_dm(user, f"Die Mute-Rolle wurde nun wieder entfernt.")
             await user.remove_roles(role)
-        except discord.errors.NotFound:
+        except disnake.errors.NotFound:
             pass
 
         if self.silenced_users.get(str(user_id)):
@@ -77,7 +77,7 @@ class Calmdown(commands.Cog):
     )
     @commands.command(name="calmdown", aliases=["auszeit", "mute"])
     @commands.check(utils.is_mod)
-    async def cmd_calmdown(self, ctx, user: discord.Member, duration):
+    async def cmd_calmdown(self, ctx, user: disnake.Member, duration):
         if re.match(r"^[0-9]+$", duration):
             duration = f"{duration}m"
         if not utils.is_valid_time(duration):
diff --git a/cogs/components/poll/poll.py b/cogs/components/poll/poll.py
index 3c95a62f56d8ab0945d26c8f3a559577ace2d1e1..22cd555028395f0f216651254e5eb133a23da0c4 100644
--- a/cogs/components/poll/poll.py
+++ b/cogs/components/poll/poll.py
@@ -1,4 +1,4 @@
-import discord
+import disnake
 import emoji
 
 DEFAULT_OPTIONS = ["🇦", "🇧", "🇨", "🇩", "🇪", "🇫", "🇬", "🇭", "🇮", "🇯", "🇰", "🇱", "🇲", "🇳", "🇴", "🇵", "🇶",
@@ -83,7 +83,7 @@ class Poll:
                 f"Fehler beim Erstellen der Umfrage! Es werden nicht mehr als {len(DEFAULT_OPTIONS)} Optionen unterstützt!")
             return
 
-        embed = discord.Embed(title=title, description=self.question)
+        embed = disnake.Embed(title=title, description=self.question)
         embed.add_field(name="Erstellt von", value=f'<@!{self.author}>', inline=False)
         embed.add_field(name="\u200b", value="\u200b", inline=False)
 
diff --git a/cogs/help.py b/cogs/help.py
index 27856063d8e16e9ea131733886f9a0456373ef55..73b09df529b4a2d678239ac2b7287eeb86fcf8f5 100644
--- a/cogs/help.py
+++ b/cogs/help.py
@@ -1,8 +1,8 @@
 import inspect
 import re
 
-import discord
-from discord.ext import commands
+import disnake
+from disnake.ext import commands
 
 import utils
 
@@ -166,7 +166,7 @@ class Help(commands.Cog):
                 text += f"**{command['syntax']}**\n"
                 text += f"{command['brief']}\n\n" if command['brief'] else "\n"
                 if (len(helptext) + len(text) > 2048):
-                    embed = discord.Embed(title=title,
+                    embed = disnake.Embed(title=title,
                                           description=helptext,
                                           color=19607)
                     await utils.send_dm(ctx.author, "", embed=embed)
@@ -176,7 +176,7 @@ class Help(commands.Cog):
                 helptext += text
                 text = ""
 
-        embed = discord.Embed(title=title,
+        embed = disnake.Embed(title=title,
                               description=helptext,
                               color=19607)
         await utils.send_dm(ctx.author, "", embed=embed)
@@ -199,7 +199,7 @@ class Help(commands.Cog):
             text += f"`{param}` - {desc}\n"
         text += f"**Beispiel:**\n `{command['example']}`\n" if command['example'] else ""
         text += f"\n{command['description']}\n" if command['description'] else ""
-        embed = discord.Embed(title=title,
+        embed = disnake.Embed(title=title,
                               description=text,
                               color=19607)
         await utils.send_dm(ctx.author, text)  # , embed=embed)
@@ -231,7 +231,7 @@ class Help(commands.Cog):
                 text += f"\n{command['description']}\n" if command['description'] else ""
                 text += "=====================================================\n"
                 if (len(helptext) + len(text) > 2048):
-                    embed = discord.Embed(title=title,
+                    embed = disnake.Embed(title=title,
                                           description=helptext,
                                           color=19607)
                     await utils.send_dm(ctx.author, "", embed=embed)
@@ -241,7 +241,7 @@ class Help(commands.Cog):
                 helptext += text
                 text = ""
 
-        embed = discord.Embed(title=title,
+        embed = disnake.Embed(title=title,
                               description=helptext,
                               color=19607)
         await utils.send_dm(ctx.author, "", embed=embed)
diff --git a/cogs/links.py b/cogs/links.py
index 7f11fcb99a0bcb067e58e571f6d2cd22393915a3..ebba6bc33beeca1a000979f350b56aa3e64c9762 100644
--- a/cogs/links.py
+++ b/cogs/links.py
@@ -1,8 +1,8 @@
 import json
 import os
 
-import discord
-from discord.ext import commands
+import disnake
+from disnake.ext import commands
 
 from cogs.help import help, handle_error, help_category
 
@@ -33,7 +33,7 @@ class Links(commands.Cog):
     @commands.command(name="links")
     async def cmd_links(self, ctx, group=None):
         if channel_links := self.links.get(str(ctx.channel.id)):
-            embed = discord.Embed(title=f"Folgende Links sind in diesem Channel hinterlegt:\n")
+            embed = disnake.Embed(title=f"Folgende Links sind in diesem Channel hinterlegt:\n")
             if group:
                 group = group.lower()
                 if group_links := channel_links.get(group):
diff --git a/cogs/polls.py b/cogs/polls.py
index 5f2ab706982aa34522dc334d0369fb0ba299597e..09b9f84a5adf8a514203b7bf88a69f375b787911 100644
--- a/cogs/polls.py
+++ b/cogs/polls.py
@@ -1,6 +1,6 @@
 import os
 
-from discord.ext import commands
+from disnake.ext import commands
 
 import utils
 from cogs.components.poll.poll import Poll
diff --git a/cogs/roles.py b/cogs/roles.py
index a9d85992ac061a876be0f79450a607e0d6dc77aa..34e1191a9e473bf002a3e6028e684b3525ef1d87 100644
--- a/cogs/roles.py
+++ b/cogs/roles.py
@@ -1,9 +1,9 @@
 import json
 import os
 
-import discord
+import disnake
 import emoji
-from discord.ext import commands
+from disnake.ext import commands
 
 import utils
 from cogs.help import help, handle_error, help_category
@@ -45,7 +45,7 @@ class Roles(commands.Cog):
         guild = ctx.guild
         members = await guild.fetch_members().flatten()
         answer = f''
-        embed = discord.Embed(title="Statistiken",
+        embed = disnake.Embed(title="Statistiken",
                               description=f'Wir haben aktuell {len(members)} Mitglieder auf diesem Server, verteilt auf folgende Rollen:')
 
         for role in guild.roles:
@@ -77,7 +77,7 @@ class Roles(commands.Cog):
         channel = await self.bot.fetch_channel(self.channel_id)
         message = None if self.role_message_id == 0 else await channel.fetch_message(self.role_message_id)
 
-        embed = discord.Embed(title="Vergabe von Fakultäts-Rollen",
+        embed = disnake.Embed(title="Vergabe von Fakultäts-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 :scales: 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""
diff --git a/cogs/support.py b/cogs/support.py
index c6f4dfa702a02922cd27243b6f722ea91dbeeea9..4044fbd3a96c1e498f806c13e7112cda8cac7ef2 100644
--- a/cogs/support.py
+++ b/cogs/support.py
@@ -1,8 +1,8 @@
 import io
 import os
 
-import discord
-from discord.ext import commands
+import disnake
+from disnake.ext import commands
 
 
 class Support(commands.Cog):
@@ -15,14 +15,14 @@ class Support(commands.Cog):
         if message.author == self.bot.user:
             return
 
-        if type(message.channel) is discord.DMChannel:
+        if type(message.channel) is disnake.DMChannel:
             channel = await self.bot.fetch_channel(self.channel_id)
             files = []
 
             for attachment in message.attachments:
                 fp = io.BytesIO()
                 await attachment.save(fp)
-                files.append(discord.File(fp, filename=attachment.filename))
+                files.append(disnake.File(fp, filename=attachment.filename))
 
             await channel.send(f"Support Nachricht von <@!{message.author.id}>:")
-            await channel.send(message.content, files=files)
\ No newline at end of file
+            await channel.send(message.content, files=files)
diff --git a/cogs/text_commands.py b/cogs/text_commands.py
index fa454f17906675ab7dabce8b4fcd33f518c0228f..b1c94dd833a863560e446a6a2aa7aa9ac0cefd61 100644
--- a/cogs/text_commands.py
+++ b/cogs/text_commands.py
@@ -3,8 +3,8 @@ import os
 import random
 import re
 
-import discord
-from discord.ext import commands
+import disnake
+from disnake.ext import commands
 
 import utils
 from cogs.help import text_command_help, help, handle_error, remove_help_for, help_category
@@ -229,7 +229,7 @@ class TextCommands(commands.Cog):
         command = self.text_commands.get(cmd)
         title = "Vorschlag für neuen Command Text" if command else "Vorschlag für neues Command"
 
-        embed = discord.Embed(title=title,
+        embed = disnake.Embed(title=title,
                               description=f"<@!{ctx.author.id}> hat folgenden Vorschlag eingereicht.\n"
                                           f"👍 um den Vorschlag anzunehmen\n"
                                           f"👎 um den Vorschlag abzulehnen")
diff --git a/cogs/timer.py b/cogs/timer.py
index 6357ad40667b4ddfb11d2a430784ecaeb7d84b10..96620ac9d937223baffefe87ba5a0288be200e0b 100644
--- a/cogs/timer.py
+++ b/cogs/timer.py
@@ -5,11 +5,12 @@ from asyncio import sleep
 from copy import deepcopy
 from datetime import datetime, timedelta
 
-import discord
-from discord.ext import commands, tasks
-from dislash import *
+import disnake
+from disnake import MessageInteraction, ApplicationCommandInteraction
+from disnake.ext import commands, tasks
+from disnake.ui import Button
 
-from cogs.help import help
+from views import timer_view
 
 
 class Timer(commands.Cog):
@@ -17,212 +18,184 @@ class Timer(commands.Cog):
     def __init__(self, bot):
         self.bot = bot
         self.guild_id = int(os.getenv('DISCORD_GUILD'))
-        self.default_names = ["Noam Chomsky", "Leonardo da Vinci", "René Descartes", "Hypatia von Alexandria", 
-                              "Fritz Bauer", "Rosalind Franklin", "Marie-Anne Paulze Lavoisier", 
-                              "Marie Skłodowska Curie", "Umberto Eco", "Ada Lovelace", "Clinton Richard Dawkins", 
+        self.default_names = ["Noam Chomsky", "Leonardo da Vinci", "René Descartes", "Hypatia von Alexandria",
+                              "Fritz Bauer", "Rosalind Franklin", "Marie-Anne Paulze Lavoisier",
+                              "Marie Skłodowska Curie", "Umberto Eco", "Ada Lovelace", "Clinton Richard Dawkins",
                               "Daniel Kahneman", "Judith Rich Harris", "Laura Maria Caterina Bassi"]
-        self.running_timers = {}
         self.timer_file_path = os.getenv("DISCORD_TIMER_FILE")
-        self.load_timers()
+        self.running_timers = self.load()
+        self.load()
         self.run_timer.start()
 
-    def load_timers(self):
-        timer_file = open(self.timer_file_path, mode='r')
-        self.running_timers = json.load(timer_file)
-
-    def save_timers(self):
-        timer_file = open(self.timer_file_path, mode='w')
-        json.dump(self.running_timers, timer_file)
-
-    def get_button_row(self, enabled=True):
-        button_row = ActionRow(
-            Button(
-                style=ButtonStyle.grey,
-                emoji="👍",
-                custom_id="anmelden"
-            ),
-            Button(
-                style=ButtonStyle.grey,
-                emoji="👎",
-                custom_id="abmelden"
-            ),
-            Button(
-                style=ButtonStyle.grey,
-                emoji="⏩",
-                custom_id="skip"
-            ),
-            Button(
-                style=ButtonStyle.grey,
-                emoji="🔄",
-                custom_id="neustart"
-            ),
-            Button(
-                style=ButtonStyle.grey,
-                emoji="🛑",
-                custom_id="beenden"
-            )
-        )
-        if enabled:
-            return button_row
-        else:
-            button_row.disable_buttons()
-            return button_row
+    def load(self):
+        with open(self.timer_file_path, mode='r') as timer_file:
+            return json.load(timer_file)
 
-    def create_embed(self, name, status, working_time, break_time, remaining, registered):
-        color = discord.Colour.green() if status == "Arbeiten" else 0xFFC63A if status == "Pause" else discord.Colour.red()
-        descr = f"👍 beim Timer anmelden\n\n" \
-                f"👎 beim Timer abmelden\n\n" \
-                f"⏩ Phase überspringen\n\n" \
-                f"🔄 Timer neu starten\n\n" \
-                f"🛑 Timer beenden\n"
-        zeiten = f"{working_time} Minuten Arbeiten\n{break_time} Minuten Pause"
-        remaining_value = f"{remaining} Minuten"
-        endzeit = (datetime.now() + timedelta(minutes=remaining)).strftime("%H:%M")
-        end_value = f" [bis {endzeit} Uhr]" if status != "Beendet" else ""
-        user_list = [self.bot.get_user(int(user_id)) for user_id in registered]
-        angemeldet_value = ", ".join([user.mention for user in user_list])
+    def save(self):
+        with open(self.timer_file_path, mode='w') as timer_file:
+            json.dump(self.running_timers, timer_file)
 
-        embed = discord.Embed(title=name,
-                              description=f'Jetzt: {status}',
-                              color=color)
-        embed.add_field(name="Bedienung:", value=descr, inline=False)
-        embed.add_field(name="Zeiten:", value=zeiten, inline=False)
-        embed.add_field(name="verbleibende Zeit:", value=remaining_value + end_value, inline=False)
-        embed.add_field(name="angemeldete User:", value=angemeldet_value if registered else "-", inline=False)
+    def get_view(self, disabled=False):
+        view = timer_view.TimerView(callback=self.on_button_click)
 
-        return embed
+        if disabled:
+            view.disable()
 
-    @help(
-        syntax="!timer <working-time?> <break-time?> <name?>",
-        brief="Deine persönliche Eieruhr",
-        parameters={
-            "learning-time": "Länge der Arbeitsphase in Minuten. Default: 25",
-            "break-time": "Länge der Pausenphase in Minuten. Default: 5",
-            "name": "So soll der Timer heißen. Wird ihm kein Name gegeben, nimmt er sich selbst einen."
-        }
-    )
-    @commands.command(name="timer")
-    async def cmd_timer(self, ctx, working_time=25, break_time=5, name=None):
-        name = name if name else random.choice(self.default_names)
-        remaining = working_time
-        status = "Arbeiten"
-        registered = [str(ctx.author.id)]
+        return view
 
-        embed = self.create_embed(name, status, working_time, break_time, remaining, registered)
-        msg = await ctx.send(embed=embed, components=[self.get_button_row()])
-
-        self.running_timers[str(msg.id)] = {'name': name,
-                                            'status': status,
-                                            'working_time': working_time,
-                                            'break_time': break_time,
-                                            'remaining': remaining,
-                                            'registered': registered,
-                                            'channel': ctx.channel.id}
-        self.save_timers()
-        await self.make_sound(registered, 'roll_with_it-outro.mp3')
+    async def on_button_click(self, button: Button, interaction: MessageInteraction):
+        custom_id = button.custom_id
 
-    @commands.Cog.listener()
-    async def on_button_click(self, inter):
-        clicked_button = inter.clicked_button.custom_id
-
-        if clicked_button == "beenden":
-            await self.on_beenden_button(inter)
-        elif clicked_button == "neustart":
-            await self.on_neustart_button(inter)
-        elif clicked_button == "skip":
-            await self.on_skip_button(inter)
-        elif clicked_button == 'anmelden':
-            await self.on_anmelden_button(inter)
-        elif clicked_button == "abmelden":
-            await self.on_abmelden_button(inter)
-
-    async def on_beenden_button(self, inter):
-        msg_id = str(inter.message.id)
-        if timer := self.running_timers.get(msg_id):
-            registered = timer['registered']
-            if str(inter.author.id) in timer['registered']:
-                mentions = self.get_mentions(msg_id)
-                timer['status'] = "Beendet"
-                timer['remaining'] = 0
-                timer['registered'] = []
+        if custom_id == timer_view.SUBSCRIBE:
+            await self.on_subscribe(button, interaction)
+        elif custom_id == timer_view.UNSUBSCRIBE:
+            await self.on_unsubscribe(button, interaction)
+        elif custom_id == timer_view.SKIP:
+            await self.on_skip(button, interaction)
+        elif custom_id == timer_view.RESTART:
+            await self.on_restart(button, interaction)
+        elif custom_id == timer_view.STOP:
+            await self.on_stop(button, interaction)
 
-                await inter.reply(type=7)
-                if new_msg_id := await self.edit_message(msg_id, mentions=mentions):
-                    await self.make_sound(registered, 'applause.mp3')
-                    self.running_timers.pop(new_msg_id)
-                    self.save_timers()
+    async def on_subscribe(self, button: Button, interaction: MessageInteraction):
+        msg_id = str(interaction.message.id)
+        if timer := self.running_timers.get(msg_id):
+            if str(interaction.author.id) not in timer['registered']:
+                timer['registered'].append(str(interaction.author.id))
+                self.save()
+                name, status, wt, bt, remaining, registered, _ = self.get_details(msg_id)
+                embed = self.create_embed(name, status, wt, bt, remaining, registered)
+                await interaction.message.edit(embed=embed, view=self.get_view())
+                await interaction.response.send_message("Du hast dich erfolgreich angemeldet", ephemeral=True)
             else:
-                # Reply with a hidden message
-                await inter.reply("Nur angemeldete Personen können den Timer beenden.", ephemeral=True)
+                await interaction.response.send_message("Du bist bereits angemeldet.", ephemeral=True)
         else:
-            await inter.reply("Etwas ist schiefgelaufen...", ephemeral=True)
+            await interaction.response.send_message("Etwas ist schiefgelaufen...", ephemeral=True)
 
-    async def on_neustart_button(self, inter):
-        msg_id = str(inter.message.id)
+    async def on_unsubscribe(self, button: Button, interaction: MessageInteraction):
+        msg_id = str(interaction.message.id)
         if timer := self.running_timers.get(msg_id):
             registered = timer['registered']
-            if str(inter.author.id) in timer['registered']:
-                timer['status'] = 'Arbeiten'
-                timer['remaining'] = timer['working_time']
-                self.save_timers()
-
-                await inter.reply(type=7)
-                await self.edit_message(msg_id)
-                await self.make_sound(registered, 'roll_with_it-outro.mp3')
+            if str(interaction.author.id) in registered:
+                if len(registered) == 1:
+                    await self.on_stop(button, interaction)
+                    return
+                else:
+                    timer['registered'].remove(str(interaction.author.id))
+                    self.save()
+                    name, status, wt, bt, remaining, registered, _ = self.get_details(msg_id)
+                    embed = self.create_embed(name, status, wt, bt, remaining, registered)
+                    await interaction.message.edit(embed=embed, view=self.get_view())
+                    await interaction.response.send_message("Du hast dich erfolgreich abgemeldet", ephemeral=True)
             else:
-                # Reply with a hidden message
-                await inter.reply("Nur angemeldete Personen können den Timer neu starten.", ephemeral=True)
+                await interaction.response.send_message("Du warst gar nicht angemeldet.", ephemeral=True)
         else:
-            await inter.reply("Etwas ist schiefgelaufen...", ephemeral=True)
+            await interaction.response.send_message("Etwas ist schiefgelaufen...", ephemeral=True)
 
-    async def on_skip_button(self, inter):
-        msg_id = str(inter.message.id)
+    async def on_skip(self, button: Button, interaction: MessageInteraction):
+        msg_id = str(interaction.message.id)
         if timer := self.running_timers.get(msg_id):
             registered = timer['registered']
-            if str(inter.author.id) in timer['registered']:
+            if str(interaction.author.id) in timer['registered']:
                 new_phase = await self.switch_phase(msg_id)
                 if new_phase == "Pause":
                     await self.make_sound(registered, 'groove-intro.mp3')
                 else:
                     await self.make_sound(registered, 'roll_with_it-outro.mp3')
+                await interaction.response.send_message("Erfolgreich übersprungen", ephemeral=True)
             else:
-                # Reply with a hidden message
-                await inter.reply("Nur angemeldete Personen können den Timer bedienen.", ephemeral=True)
+                await interaction.response.send_message("Nur angemeldete Personen können den Timer bedienen.",
+                                                        ephemeral=True)
         else:
-            await inter.reply("Etwas ist schiefgelaufen...", ephemeral=True)
+            await interaction.response.send_message("Etwas ist schiefgelaufen...", ephemeral=True)
 
-    async def on_anmelden_button(self, inter):
-        msg_id = str(inter.message.id)
+    async def on_restart(self, button: Button, interaction: MessageInteraction):
+        msg_id = str(interaction.message.id)
         if timer := self.running_timers.get(msg_id):
-            if str(inter.author.id) not in timer['registered']:
-                timer['registered'].append(str(inter.author.id))
-                self.save_timers()
-                name, status, wt, bt, remaining, registered, _ = self.get_details(msg_id)
-                embed = self.create_embed(name, status, wt, bt, remaining, registered)
-                await inter.reply(embed=embed, components=[self.get_button_row()], type=7)
+            registered = timer['registered']
+            if str(interaction.author.id) in timer['registered']:
+                timer['status'] = 'Arbeiten'
+                timer['remaining'] = timer['working_time']
+                self.save()
+
+                await self.edit_message(msg_id)
+                await self.make_sound(registered, 'roll_with_it-outro.mp3')
+                await interaction.response.send_message("Erfolgreich neugestartet", ephemeral=True)
             else:
-                await inter.reply(type=7)
+                await interaction.response.send_message("Nur angemeldete Personen können den Timer neu starten.",
+                                                        ephemeral=True)
         else:
-            await inter.reply("Etwas ist schiefgelaufen...", ephemeral=True)
+            await interaction.response.send_message("Etwas ist schiefgelaufen...", ephemeral=True)
 
-    async def on_abmelden_button(self, inter):
-        msg_id = str(inter.message.id)
+    async def on_stop(self, button: Button, interaction: MessageInteraction):
+        msg_id = str(interaction.message.id)
         if timer := self.running_timers.get(msg_id):
             registered = timer['registered']
-            if str(inter.author.id) in registered:
-                if len(registered) == 1:
-                    await self.on_beenden_button(inter)
-                    return
-                else:
-                    timer['registered'].remove(str(inter.author.id))
-                    self.save_timers()
-                    name, status, wt, bt, remaining, registered, _ = self.get_details(msg_id)
-                    embed = self.create_embed(name, status, wt, bt, remaining, registered)
-                    await inter.reply(embed=embed, components=[self.get_button_row()], type=7)
+            if str(interaction.author.id) in timer['registered']:
+                mentions = self.get_mentions(msg_id)
+                timer['status'] = "Beendet"
+                timer['remaining'] = 0
+                timer['registered'] = []
+
+                await interaction.response.send_message("Erfolgreich beendet", ephemeral=True)
+                if new_msg_id := await self.edit_message(msg_id, mentions=mentions):
+                    await self.make_sound(registered, 'applause.mp3')
+                    self.running_timers.pop(new_msg_id)
+                    self.save()
             else:
-                await inter.reply(type=7)
+                # Reply with a hidden message
+                await interaction.response.send_message("Nur angemeldete Personen können den Timer beenden.",
+                                                        ephemeral=True)
         else:
-            await inter.reply("Etwas ist schiefgelaufen...", ephemeral=True)
+            await interaction.response.send_message("Etwas ist schiefgelaufen...", ephemeral=True)
+
+    def create_embed(self, name, status, working_time, break_time, remaining, registered):
+        color = disnake.Colour.green() if status == "Arbeiten" else 0xFFC63A if status == "Pause" else disnake.Colour.red()
+        descr = f"👍 beim Timer anmelden\n\n" \
+                f"👎 beim Timer abmelden\n\n" \
+                f"⏩ Phase überspringen\n\n" \
+                f"🔄 Timer neu starten\n\n" \
+                f"🛑 Timer beenden\n"
+        zeiten = f"{working_time} Minuten Arbeiten\n{break_time} Minuten Pause"
+        remaining_value = f"{remaining} Minuten"
+        endzeit = (datetime.now() + timedelta(minutes=remaining)).strftime("%H:%M")
+        end_value = f" [bis {endzeit} Uhr]" if status != "Beendet" else ""
+        user_list = [self.bot.get_user(int(user_id)) for user_id in registered]
+        angemeldet_value = ", ".join([user.mention for user in user_list])
+
+        embed = disnake.Embed(title=name,
+                              description=f'Jetzt: {status}',
+                              color=color)
+        embed.add_field(name="Bedienung:", value=descr, inline=False)
+        embed.add_field(name="Zeiten:", value=zeiten, inline=False)
+        embed.add_field(name="verbleibende Zeit:", value=remaining_value + end_value, inline=False)
+        embed.add_field(name="angemeldete User:", value=angemeldet_value if registered else "-", inline=False)
+
+        return embed
+
+    @commands.slash_command(name="timer", description="Erstelle deine persönliche  Eieruhr")
+    async def cmd_timer(self, interaction: ApplicationCommandInteraction, working_time: int = 25,
+                        break_time: int = 5,
+                        name: str = None):
+        name = name if name else random.choice(self.default_names)
+        remaining = working_time
+        status = "Arbeiten"
+        registered = [str(interaction.author.id)]
+
+        embed = self.create_embed(name, status, working_time, break_time, remaining, registered)
+        await interaction.response.send_message(embed=embed, view=self.get_view())
+        message = await interaction.original_message()
+
+        self.running_timers[str(message.id)] = {'name': name,
+                                                'status': status,
+                                                'working_time': working_time,
+                                                'break_time': break_time,
+                                                'remaining': remaining,
+                                                'registered': registered,
+                                                'channel': interaction.channel_id}
+        self.save()
+        await self.make_sound(registered, 'roll_with_it-outro.mp3')
+
 
     async def switch_phase(self, msg_id):
         if timer := self.running_timers.get(msg_id):
@@ -235,7 +208,7 @@ class Timer(commands.Cog):
             else:
                 self.running_timers.pop(msg_id)
                 return "Beendet"
-            self.save_timers()
+            self.save()
 
             if new_msg_id := await self.edit_message(msg_id):
                 return self.running_timers[new_msg_id]['status']
@@ -268,19 +241,19 @@ class Timer(commands.Cog):
                         mentions = self.get_mentions(msg_id)
                     if status == "Beendet":
                         new_msg = await channel.send(mentions, embed=embed,
-                                                     components=[self.get_button_row(enabled=False)])
+                                                     view=self.get_view(disabled=True))
                     else:
-                        new_msg = await channel.send(mentions, embed=embed, components=[self.get_button_row()])
+                        new_msg = await channel.send(mentions, embed=embed, view=self.get_view())
                     self.running_timers[str(new_msg.id)] = self.running_timers[msg_id]
                     self.running_timers.pop(msg_id)
-                    self.save_timers()
+                    self.save()
                     msg = new_msg
                 else:
-                    await msg.edit(embed=embed, components=[self.get_button_row()])
+                    await msg.edit(embed=embed, view=self.get_view())
                 return str(msg.id)
-            except discord.errors.NotFound:
+            except disnake.errors.NotFound:
                 self.running_timers.pop(msg_id)
-                self.save_timers()
+                self.save()
                 return None
 
     def get_mentions(self, msg_id):
@@ -299,9 +272,9 @@ class Timer(commands.Cog):
                 if channel:  # If user is in a channel
                     try:
                         voice_client = await channel.connect()
-                        voice_client.play(discord.FFmpegPCMAudio(f'cogs/sounds/{filename}'))
+                        voice_client.play(disnake.FFmpegPCMAudio(f'cogs/sounds/{filename}'))
                         await sleep(3)
-                    except discord.errors.ClientException as e:
+                    except disnake.errors.ClientException as e:
                         print(e)
                     for vc in self.bot.voice_clients:
                         await vc.disconnect()
@@ -329,4 +302,4 @@ class Timer(commands.Cog):
     @cmd_timer.error
     async def timer_error(self, ctx, error):
         await ctx.send("Das habe ich nicht verstanden. Die Timer-Syntax ist:\n"
-                       "`!timer <learning-time?> <break-time?> <name?>`\n")
\ No newline at end of file
+                       "`!timer <learning-time?> <break-time?> <name?>`\n")
diff --git a/cogs/welcome.py b/cogs/welcome.py
index 9c7e2ec3a9bfa9a65404d5044c4cef9642a4fd5c..573cc770c5ae90d765ec3bd8916b459ac14c0422 100644
--- a/cogs/welcome.py
+++ b/cogs/welcome.py
@@ -1,7 +1,7 @@
 import os
 
-import discord
-from discord.ext import commands
+import disnake
+from disnake.ext import commands
 
 import utils
 from cogs.help import help, handle_error
@@ -24,7 +24,7 @@ class Welcome(commands.Cog):
         channel = await self.bot.fetch_channel(self.channel_id)
         message = None if self.message_id == 0 else await channel.fetch_message(self.message_id)
 
-        embed = discord.Embed(title=":rocket: __FernUni Föderation__ :rocket:",
+        embed = disnake.Embed(title=":rocket: __FernUni Föderation__ :rocket:",
                               description="Willkommen auf dem interdisziplinären Server von und für FernUni-Studierende! Hier können FernUni-Studierende aus allen Fachrichtungen in Austausch treten, Ideen austauschen und gemeinsam an Projekten arbeiten: viel Potenzial für gegenseitige Bereicherung!")
 
         embed.add_field(name=":sparkles: Entstehung",
diff --git a/requirements.txt b/requirements.txt
index 3bd19cb09daa62f5fc809a5a2e38b1a38abca0da..bd37fed31aca7c32526c4743b02e052bf17e87cf 100644
--- a/requirements.txt
+++ b/requirements.txt
@@ -3,17 +3,19 @@ async-timeout==3.0.1
 attrs==20.3.0
 beautifulsoup4==4.9.3
 certifi==2020.12.5
+cffi==1.14.5
 chardet==3.0.4
-discord.py==1.7.3
+disnake==2.2.2
 emoji==1.2.0
 idna==2.10
 multidict==5.1.0
+pycparser==2.20
+PyNaCl==1.4.0
 python-dotenv==0.17.0
 requests==2.25.1
+six==1.16.0
 soupsieve==2.2.1
+tinydb==4.4.0
 typing-extensions==3.7.4.3
 urllib3==1.26.5
 yarl==1.6.3
-dislash.py==1.0.17
-discord.py[voice]==1.7.3
-pynacl==1.4.0
diff --git a/root.py b/root.py
index d9c5cc1ab19a97485bcd6a0410b4e16ff82eb946..76127b1b95704f6f3fcbb9d14b7b9b0f13297ebb 100644
--- a/root.py
+++ b/root.py
@@ -1,8 +1,7 @@
 import os
 
-import discord
-from discord.ext import commands
-from dislash import *
+import disnake
+from disnake.ext import commands
 from dotenv import load_dotenv
 
 from cogs import appointments, calmdown, help, links, polls, roles, support, text_commands, timer, welcome
@@ -14,21 +13,34 @@ GUILD = int(os.getenv('DISCORD_GUILD'))
 ACTIVITY = os.getenv('DISCORD_ACTIVITY')
 PIN_EMOJI = "📌"
 
-intents = discord.Intents.default()
-intents.members = True
-bot = commands.Bot(command_prefix='!', help_command=None, activity=discord.Game(ACTIVITY), intents=intents)
-bot.add_cog(appointments.Appointments(bot))
-bot.add_cog(calmdown.Calmdown(bot))
-bot.add_cog(help.Help(bot))
-bot.add_cog(links.Links(bot))
-bot.add_cog(polls.Polls(bot))
-bot.add_cog(roles.Roles(bot))
-bot.add_cog(support.Support(bot))
-bot.add_cog(text_commands.TextCommands(bot))
-bot.add_cog(timer.Timer(bot))
-bot.add_cog(welcome.Welcome(bot))
 
-SlashClient(bot, show_warnings=True)  # Stellt den Zugriff auf die Buttons bereit
+class Root(commands.Bot):
+    def __init__(self):
+        super().__init__(command_prefix='!', help_command=None, activity=disnake.Game(ACTIVITY),
+                         intents=disnake.Intents.all())
+        self.add_cogs()
+        self.persistent_views_added = False
+
+    async def on_ready(self):
+        if not self.persistent_views_added:
+            if timer_cog := self.get_cog("Timer"):
+                self.add_view(timer_cog.get_view())
+        print("Client started!")
+
+    def add_cogs(self):
+        self.add_cog(appointments.Appointments(self))
+        self.add_cog(calmdown.Calmdown(self))
+        self.add_cog(help.Help(self))
+        self.add_cog(links.Links(self))
+        self.add_cog(polls.Polls(self))
+        self.add_cog(roles.Roles(self))
+        self.add_cog(support.Support(self))
+        self.add_cog(text_commands.TextCommands(self))
+        self.add_cog(timer.Timer(self))
+        self.add_cog(welcome.Welcome(self))
+
+
+bot = Root()
 
 
 def get_reaction(reactions):
@@ -57,11 +69,6 @@ async def unpin_message(message):
             await message.unpin()
 
 
-@bot.event
-async def on_ready():
-    print("Client started!")
-
-
 @bot.event
 async def on_raw_reaction_add(payload):
     if payload.user_id == bot.user.id:
diff --git a/utils.py b/utils.py
index 0380fc59293da2e3a173c4b324971b16d115d1ec..28283e453d7bc62a42dab4fe6dfc400fde295a1b 100644
--- a/utils.py
+++ b/utils.py
@@ -1,13 +1,13 @@
 import os
 import re
 
-import discord
+import disnake
 
 
 async def send_dm(user, message, embed=None):
     """ Send DM to a user/member """
 
-    if type(user) is discord.User or type(user) is discord.Member:
+    if type(user) is disnake.User or type(user) is disnake.Member:
         if user.dm_channel is None:
             await user.create_dm()
 
diff --git a/views/timer_view.py b/views/timer_view.py
new file mode 100644
index 0000000000000000000000000000000000000000..5c892b13353bbeb517c7ced1699beb18165607cd
--- /dev/null
+++ b/views/timer_view.py
@@ -0,0 +1,39 @@
+import disnake
+from disnake import MessageInteraction, ButtonStyle
+from disnake.ui import Button, View
+
+SUBSCRIBE = "timerview:subscribe"
+UNSUBSCRIBE = "timerview:unsubscribe"
+SKIP = "timverview:skip"
+RESTART = "timverview:restart"
+STOP = "timverview:stop"
+
+
+class TimerView(View):
+    def __init__(self, callback):
+        super().__init__(timeout=None)
+        self.callback = callback
+
+    @disnake.ui.button(emoji="👍", style=ButtonStyle.grey, custom_id=SUBSCRIBE)
+    async def btn_subscribe(self, button: Button, interaction: MessageInteraction):
+        await self.callback(button, interaction)
+
+    @disnake.ui.button(emoji="👎", style=ButtonStyle.grey, custom_id=UNSUBSCRIBE)
+    async def btn_unsubscribe(self, button: Button, interaction: MessageInteraction):
+        await self.callback(button, interaction)
+
+    @disnake.ui.button(emoji="⏩", style=ButtonStyle.grey, custom_id=SKIP)
+    async def btn_skip(self, button: Button, interaction: MessageInteraction):
+        await self.callback(button, interaction)
+
+    @disnake.ui.button(emoji="🔄", style=ButtonStyle.grey, custom_id=RESTART)
+    async def btn_restart(self, button: Button, interaction: MessageInteraction):
+        await self.callback(button, interaction)
+
+    @disnake.ui.button(emoji="🛑", style=ButtonStyle.grey, custom_id=STOP)
+    async def btn_stop(self, button: Button, interaction: MessageInteraction):
+        await self.callback(button, interaction)
+
+    def disable(self):
+        for button in self.children:
+            button.disabled = True