diff --git a/src/gate.rs b/src/gate.rs
index b6e8b6d281b58a32d21e9f4b6096a8474719d941..7c000728c6690ff0fc3b94463e0e6aeeb4502592 100644
--- a/src/gate.rs
+++ b/src/gate.rs
@@ -273,13 +273,13 @@ pub async fn felinet_send_forever(
 pub async fn felinet_receive_forever(
     mut client: HandlerClient<Channel>,
     mut modem_send: mpsc::Sender<Vec<u8>>,
-    callsign: &str,
+    callsign: String,
     ssid: u8,
     uuid: Uuid,
 ) {
     loop {
         if let Err(e) =
-            felinet_receive_once(&mut client, &mut modem_send, callsign, ssid, uuid).await
+            felinet_receive_once(&mut client, &mut modem_send, &callsign, ssid, uuid).await
         {
             eprintln!("FELINET RX error: {e}. Reconnecting...");
         };
diff --git a/src/main.rs b/src/main.rs
index 3a67e9aa01b19ad1b29a9c9c40f3571902e47ff8..5e0173e8c7985a3e171378afd0ad41fae8a4252c 100644
--- a/src/main.rs
+++ b/src/main.rs
@@ -111,14 +111,6 @@ async fn gate_forever(
 
     let temperature_mutex = radio.temperature_mutex();
 
-    tokio::task::spawn(async move {
-        loop {
-            if let Err(e) = radio.process_forever().await {
-                eprintln!("Radio error: {e}")
-            }
-        }
-    });
-
     let tx = broadcast::Sender::new(16);
 
     beacon_forever(
@@ -190,8 +182,15 @@ async fn gate_forever(
             });
         }
 
-        felinet_receive_forever(client, packet_send, &callsign, config.ssid, uuid).await;
+        let ssid = config.ssid;
+        tokio::task::spawn(async move {
+            felinet_receive_forever(client, packet_send, callsign, ssid, uuid).await;
+        });
     }
 
-    Ok(())
+    loop {
+        if let Err(e) = radio.process_forever().await {
+            eprintln!("Radio error: {e}")
+        }
+    }
 }