diff --git a/.forgejo/workflows/build.yaml b/.forgejo/workflows/build.yaml
index 9a70b4a..db7e32c 100644
--- a/.forgejo/workflows/build.yaml
+++ b/.forgejo/workflows/build.yaml
@@ -16,9 +16,17 @@ jobs:
           source "$HOME/.cargo/env"
           cargo build --release
         shell: bash
+      - uses: https://code.forgejo.org/actions/upload-artifact@v3
+        with:
+          name: teamspeak-query-lib
+          path: ${{ github.workspace }}/target/release/teamspeak-query-lib
+      - uses: https://code.forgejo.org/actions/download-artifact@v3
+        with:
+          name: teamspeak-query-lib
+          path: /tmp/artifacts
+        shell: bash
       - id: copy-ts-control-artificat
         run: |
-          cp ${{ github.workspace }}/target/release/teamspeak-query-lib /tmp/artifacts
           cp ${{ github.workspace }}/ts-control /tmp/artifacts
         shell: bash
       - uses: https://code.forgejo.org/actions/forgejo-release@v1
diff --git a/Cargo.lock b/Cargo.lock
index 0d9a85b..c541dfd 100644
--- a/Cargo.lock
+++ b/Cargo.lock
@@ -182,7 +182,7 @@ dependencies = [
 
 [[package]]
 name = "teamspeak-query-lib"
-version = "0.1.6"
+version = "0.1.5"
 dependencies = [
  "clap",
  "serde",
diff --git a/Cargo.toml b/Cargo.toml
index dfad335..78a7388 100644
--- a/Cargo.toml
+++ b/Cargo.toml
@@ -1,6 +1,6 @@
 [package]
 name = "teamspeak-query-lib"
-version = "0.1.6"
+version = "0.1.5"
 edition = "2021"
 
 [dependencies]
diff --git a/Makefile b/Makefile
index 6383dc1..a45ec9f 100644
--- a/Makefile
+++ b/Makefile
@@ -2,13 +2,11 @@
 
 INSTALL_DIR = $(HOME)/.local/bin
 
-export PATH := target/debug:$(PATH)
-
 build:
 	@cargo build
 
 run: build
-	./ts-control
+	@PATH=$(PWD)/target/debug:$(PATH) ./ts-control
 
 install:
 	mkdir -p "$(INSTALL_DIR)"
diff --git a/src/cli.rs b/src/cli.rs
index 4c72d25..9cfdb0d 100644
--- a/src/cli.rs
+++ b/src/cli.rs
@@ -1,4 +1,4 @@
-use clap::{Args, Parser, Subcommand, ValueEnum};
+use clap::{Args, Parser, Subcommand};
 use telnet::Telnet;
 
 use crate::parameter::ParameterList;
@@ -17,7 +17,6 @@ struct Cli {
 
 #[derive(Subcommand)]
 pub enum Commands {
-    Info,
     Channels(ChannelsArgs),
     Clients,
     Fetch(FetchArgs),
@@ -80,18 +79,9 @@ pub struct UpdateArgs {
     speakers: Option<bool>,
 }
 
-#[derive(Clone, ValueEnum)]
-pub enum EventArgsFilter {
-    All,
-    Mine,
-    Others,
-}
-
 #[derive(Args)]
 pub struct EventArgs {
     pub event: Vec<EventType>,
-    #[arg(long, short)]
-    pub filter: Option<EventArgsFilter>,
 }
 
 impl FetchArgs {
diff --git a/src/command_utils/events.rs b/src/command_utils/events.rs
index 34881fd..6689a3f 100644
--- a/src/command_utils/events.rs
+++ b/src/command_utils/events.rs
@@ -1,7 +1,6 @@
 use telnet::Telnet;
 
 use crate::{commands, wrappers};
-use crate::cli::EventArgsFilter;
 use crate::models::{Client, Event, EventType};
 use crate::response::Response;
 
@@ -28,30 +27,19 @@ pub fn handle_event_response(connection: &mut Telnet, event: Event, known_client
     }
 }
 
-fn try_get_self_clid(connection: &mut Telnet) -> Option<i32> {
-    wrappers::get_self_clid(connection)
-        .unwrap_or_default()
-        .parse()
-        .map(Some)
-        .unwrap_or(None)
-}
-
-pub fn loop_response_reader(connection: &mut Telnet, filter: &EventArgsFilter) {
+pub fn loop_response_reader(connection: &mut Telnet, self_clid: i32) {
     let mut known_clients = wrappers::get_clients(connection).unwrap_or_else(|_| Vec::new());
-
-    let mut self_clid: Option<i32> = try_get_self_clid(connection);
-
+    
     loop {
         match commands::read_response(connection, true, String::new()) {
             Ok(response) => {
                 if let Response::Event(event_type, params) = response {
                     let event = Event::new(connection, event_type, params, &known_clients);
 
-                    if self_clid.is_none() {
-                        self_clid = try_get_self_clid(connection);
-                    }
-                    if !event.should_handle(filter, self_clid) {
-                        continue;
+                    if let Some(client) = &event.client {
+                        if client.clid == self_clid {
+                            continue;
+                        }
                     }
 
                     handle_event_response(connection, event, &mut known_clients);
diff --git a/src/main.rs b/src/main.rs
index 1451eb4..5ada48b 100644
--- a/src/main.rs
+++ b/src/main.rs
@@ -1,8 +1,11 @@
 use std::io::{Error, ErrorKind};
+use std::num::ParseIntError;
 
 use telnet::Telnet;
 
-use crate::cli::{Commands, EventArgsFilter};
+use crate::cli::Commands;
+use crate::models::Channel;
+use crate::models::Client;
 
 mod wrappers;
 mod commands;
@@ -13,10 +16,14 @@ mod models;
 mod response;
 mod command_utils;
 
-fn result_or_error<T>(res: Result<Option<T>, String>, result_type: &str) -> Result<T, Error> {
-    let error_action = format!("find {}", result_type);
-    res.map_err(|err| make_action_error(&error_action, err))?
-        .ok_or_else(|| make_action_error(&error_action, String::from("Not Found.")))
+fn channel_or_error(channel_res: Result<Option<Channel>, String>) -> Result<Channel, Error> {
+    channel_res.map_err(|err| make_action_error("find channel", err))?
+        .ok_or_else(|| make_action_error("find channel", String::from("Not Found.")))
+}
+
+fn client_or_error(client_res: Result<Option<Client>, String>) -> Result<Client, Error> {
+    client_res.map_err(|err| make_action_error("find client", err))?
+        .ok_or_else(|| make_action_error("find client", String::from("Not Found.")))
 }
 
 fn connect() -> Result<Telnet, Error> {
@@ -47,26 +54,6 @@ fn main() -> Result<(), Error> {
     // You can check for the existence of subcommands, and if found use their
     // matches just as you would the top level cmd
     match cli {
-        Commands::Info => {
-            let client = match wrappers::find_self(&mut connection) {
-                Ok(client) => client,
-                Err(msg) => return Err(make_action_error("find self", msg))
-            };
-            
-            let channel_name: String = match wrappers::find_channel(&mut connection, "cid", &client.cid.to_string(), true) {
-                Ok(channel) => match channel {
-                    Some(channel) => channel.channel_name,
-                    None => return Err(to_other_error("Channel not found.".to_string()))
-                },
-                Err(msg) => return Err(make_action_error("find self", msg))
-            };
-            
-            println!("Client: {}", client.client_nickname);
-            println!("Channel: {}", channel_name);
-            println!("Channel ID: {}", client.cid);
-            println!("Client ID: {}", client.clid);
-        }
-        
         Commands::Channels(args) => {
             match wrappers::get_channels(&mut connection, args.spacers) {
                 Ok(channels) => {
@@ -102,7 +89,7 @@ fn main() -> Result<(), Error> {
             }
 
             if args.want_client() {
-                let client = result_or_error(args.client(&mut connection), "client")?;
+                let client = client_or_error(args.client(&mut connection))?;
 
                 match wrappers::fetch_client(&mut connection, &[client]) {
                     Ok(_) => println!("Successfully fetched client."),
@@ -113,7 +100,7 @@ fn main() -> Result<(), Error> {
             }
 
             if args.want_channel() {
-                let channel = result_or_error(args.channel(&mut connection), "channel")?;
+                let channel = channel_or_error(args.channel(&mut connection))?;
 
                 match wrappers::fetch_channel(&mut connection, channel) {
                     Ok(_) => println!("Successfully fetched channel."),
@@ -137,8 +124,8 @@ fn main() -> Result<(), Error> {
         }
 
         Commands::Move(args) => {
-            let channel = result_or_error(args.channel(&mut connection), "channel")?;
-            let client = result_or_error(args.client(&mut connection), "client")?;
+            let channel = channel_or_error(args.channel(&mut connection))?;
+            let client = client_or_error(args.client(&mut connection))?;
 
             match wrappers::move_client(&mut connection, &channel, &[client]) {
                 Ok(resp) => println!("Successfully moved client: {}", resp),
@@ -158,12 +145,16 @@ fn main() -> Result<(), Error> {
         }
 
         Commands::Events(args) => {
-            let filter = args.filter.unwrap_or(EventArgsFilter::All);
             loop {
                 command_utils::events::register_events(&mut connection, args.event.clone())
                     .map_err(to_other_error)?;
 
-                command_utils::events::loop_response_reader(&mut connection, &filter);
+                let self_clid: i32 = wrappers::get_self_clid(&mut connection)
+                    .map_err(|msg| make_action_error("get self clid", msg))?
+                    .parse()
+                    .map_err(|err: ParseIntError| make_action_error("parse clid", err.to_string()))?;
+
+                command_utils::events::loop_response_reader(&mut connection, self_clid);
 
                 // loop_response_reader failed. Let's try to reconnect after 1 second.
                 std::thread::sleep(std::time::Duration::from_secs(1));
diff --git a/src/models/event.rs b/src/models/event.rs
index 281ada7..50360bd 100644
--- a/src/models/event.rs
+++ b/src/models/event.rs
@@ -4,7 +4,6 @@ use std::str::FromStr;
 use serde::{Deserialize, Serialize, Serializer};
 use serde::ser::SerializeStruct;
 use telnet::Telnet;
-use crate::cli::EventArgsFilter;
 
 use crate::models::{Channel, Client};
 use crate::parameter::{parameter_find, ParameterList};
@@ -266,23 +265,6 @@ impl Event {
             _ => String::from(""),
         }
     }
-    
-    pub fn is_mine(&self, self_clid: Option<i32>) -> bool {
-        if let Some(self_clid) = self_clid {
-            if let Some(client) = &self.client {
-                return client.clid == self_clid;
-            }
-        }
-        false
-    }
-    
-    pub fn should_handle(&self, filter: &EventArgsFilter, self_clid: Option<i32>) -> bool {
-        match filter {
-            EventArgsFilter::All => true,
-            EventArgsFilter::Mine => self.is_mine(self_clid),
-            EventArgsFilter::Others => !self.is_mine(self_clid),
-        }
-    }
 }
 
 impl Serialize for Event {
@@ -294,7 +276,6 @@ impl Serialize for Event {
         x.serialize_field("type", &self.event_type)?;
         x.serialize_field("channel", &self.channel)?;
         x.serialize_field("client", &self.client)?;
-        x.serialize_field("params", &self.params)?;
         x.serialize_field("message", &self.get_message())?;
         x.end()
     }
diff --git a/ts-control b/ts-control
index f791e83..31adc4e 100755
--- a/ts-control
+++ b/ts-control
@@ -4,14 +4,12 @@ actions="quick
 move
 fetch-client
 fetch-channel
-migrate
 away
 not away
 back
 message
 message-user
-events
-ntfy-events"
+events"
 
 _ts_control_get_entity() {
 	entity=$(_ts_control_single_or_dmenu "$(teamspeak-query-lib "$1s")" "$2")
@@ -46,78 +44,18 @@ _ts_control_fetch() {
 	teamspeak-query-lib fetch "--strict-$1" "--$1" "$target"
 }
 
-_ts_control_migrate() {
-	target=$(_ts_control_get_entity "channel" "$2")
-  current_channel=$(teamspeak-query-lib info | grep "Channel: " | sed 's/Channel: //')
-  _ts_control_move_self "$target"
-	teamspeak-query-lib fetch "--strict-channel" "--channel" "$current_channel"
-}
-
 _ts_control_single_or_dmenu() {
-	filter="$2"
-	if [ "$filter" == "^$" ]; then
-		filter=""
-	fi
-	options=$(echo "$1" | grep "$filter")
+	options=$(echo "$1" | grep "$2")
 	count=$(echo "$options" | wc -l)
 	if [ "$count" -eq 1 ]; then
 		echo "$options"
 	else
-		echo "$1" | $DMENU
+		echo "$options" | $DMENU
 	fi
 }
 
-handle_ntfy_events() {
-  while read -r data; do
-    msg=$(echo "$data" | jq -r --unbuffered '.message')
-    type=$(echo "$data" | jq -r --unbuffered '.type')
-    mode=$(echo "$data" | jq -r --unbuffered '.params.targetmode')
-    client_nickname=$(echo "$data" | jq -r --unbuffered '.client.client_nickname')
-    
-    echo "$data"
-
-    if [ "$type" = "NotifyTextMessage" ] && [ "$mode" != "1" ]; then
-      continue # Skip all messages that are not direct messages
-    fi
-    
-    title="TS3 Event"
-    case $type in
-      "NotifyClientPoke")
-        title="TS3 Poke"
-        ;;
-      "NotifyTextMessage")
-        title="TS3 Message"
-        ;;
-    esac
-    
-    echo "($title) $target: $msg"
-
-    payload=$(jq -n \
-  		--arg topic "$TS3_NTFY_TOPIC" \
-  		--arg webhook "$TS3_NTFY_WEBHOOK&client=$client_nickname" \
-  		--arg msg "$msg" \
-  		--arg type "$title" \
-  		'{
-    		topic: $topic,
-    		message: $msg,
-    		title: $type,
-    		actions: [{
-        	action: "http",
-        	label: "TS response",
-        	method: "POST",
-        	url: $webhook,
-        	clear: true
-      	}]
-  		}')
-    
-    curl -sSL \
-  		-H "Authorization: Bearer $TS3_NTFY_TOKEN" \
-  		-d "$payload" \
-  		"$TS3_NTFY_HOST"
-  done
-}
-
-action=$(_ts_control_single_or_dmenu "$actions" "^$1$")
+# Add '$' to $1 to add 'End of line' to the regex for grep
+action=$(_ts_control_single_or_dmenu "$actions" "$1$")
 
 case $action in
 	"quick")
@@ -136,9 +74,6 @@ case $action in
 	"fetch-channel")
 		_ts_control_fetch channel "$2"
 		;;
-  "migrate")
-    _ts_control_migrate "$2"
-    ;;
 	"not away")
 		teamspeak-query-lib move "Not Away From Keyboard"
 		teamspeak-query-lib update --microphone=false --speakers=false
@@ -164,12 +99,7 @@ case $action in
 		teamspeak-query-lib message --strict-client --client "$user" "$message"
 		;;
 	"events")
-		teamspeak-query-lib events --filter=others NotifyClientMoved NotifyClientEnterView NotifyClientLeftView NotifyTextMessage NotifyClientPoke \
+		teamspeak-query-lib events NotifyClientMoved NotifyClientEnterView NotifyClientLeftView NotifyTextMessage NotifyClientPoke \
 			| jq -r --unbuffered '.message' \
 			| tee >(xargs -I{} notify-send "TS3 Event" "{}")
-		;;
-	"ntfy-events")
-		teamspeak-query-lib events --filter=others NotifyClientPoke NotifyTextMessage \
-      | handle_ntfy_events
-  	;;
 esac