diff --git a/src/database/message.rs b/src/database/message.rs
index 96d671bfe649045d2d3cd8fe59fb19c0cce84373..cdf679cbf6d5518a183bfccfd4e26f7b2b422009 100644
--- a/src/database/message.rs
+++ b/src/database/message.rs
@@ -1,8 +1,8 @@
 use super::get_collection;
-use crate::guards::channel::ChannelRef;
 use crate::notifications;
 use crate::notifications::events::message::Create;
 use crate::notifications::events::Notification;
+use crate::database::channel::Channel;
 use crate::routes::channel::ChannelType;
 
 use bson::{doc, to_bson, UtcDateTime};
@@ -32,7 +32,7 @@ pub struct Message {
 // ? pub fn send_message();
 // ? handle websockets?
 impl Message {
-    pub fn send(&self, target: &ChannelRef) -> bool {
+    pub fn send(&self, target: &Channel) -> bool {
         if get_collection("messages")
             .insert_one(to_bson(&self).unwrap().as_document().unwrap().clone(), None)
             .is_ok()
diff --git a/src/database/permissions.rs b/src/database/permissions.rs
index e72236b3b00f355e6daa7c5018c4d58d6676ff0b..0064a7de23105e5c7f1851387e8f73bdfce0ffaf 100644
--- a/src/database/permissions.rs
+++ b/src/database/permissions.rs
@@ -1,8 +1,8 @@
 use super::mutual::has_mutual_connection;
+use crate::database::channel::Channel;
 use crate::database::guild::Member;
 use crate::database::user::UserRelationship;
 use crate::guards::auth::UserRef;
-use crate::guards::channel::ChannelRef;
 use crate::guards::guild::{get_member, GuildRef};
 
 use num_enum::TryFromPrimitive;
@@ -88,7 +88,7 @@ pub fn get_relationship(a: &UserRef, b: &UserRef) -> Relationship {
 
 pub struct PermissionCalculator {
     pub user: UserRef,
-    pub channel: Option<ChannelRef>,
+    pub channel: Option<Channel>,
     pub guild: Option<GuildRef>,
     pub member: Option<Member>,
 }
@@ -103,7 +103,7 @@ impl PermissionCalculator {
         }
     }
 
-    pub fn channel(self, channel: ChannelRef) -> PermissionCalculator {
+    pub fn channel(self, channel: Channel) -> PermissionCalculator {
         PermissionCalculator {
             channel: Some(channel),
             ..self
diff --git a/src/guards/channel.rs b/src/guards/channel.rs
index 171136e7f3063475d831602e57117b4f6db38773..37982f2083416fa1ae36193876f5f3dc1e887e0a 100644
--- a/src/guards/channel.rs
+++ b/src/guards/channel.rs
@@ -6,9 +6,23 @@ use serde::{Deserialize, Serialize};
 
 use crate::database;
 
-use database::channel::LastMessage;
+use database::channel::{ Channel, fetch_channel };
 use database::message::Message;
 
+impl<'r> FromParam<'r> for Channel {
+    type Error = &'r RawStr;
+
+    fn from_param(param: &'r RawStr) -> Result<Self, Self::Error> {
+        Ok(fetch_channel(param))
+        /*if let Some(channel) = fetch_channel(param) {
+            Ok(channel)
+        } else {
+            Err(param)
+        }*/
+    }
+}
+
+/*
 #[derive(Serialize, Deserialize, Debug, Clone)]
 pub struct ChannelRef {
     #[serde(rename = "_id")]
@@ -84,7 +98,7 @@ impl<'r> FromParam<'r> for ChannelRef {
             Err(param)
         }
     }
-}
+}*/
 
 impl<'r> FromParam<'r> for Message {
     type Error = &'r RawStr;
diff --git a/src/notifications/mod.rs b/src/notifications/mod.rs
index ae911814b26ec0111a95444b0fd5ad84ed7e7dd4..1e3baadcc9d607e43c45f7130b2e50e90c7fbe16 100644
--- a/src/notifications/mod.rs
+++ b/src/notifications/mod.rs
@@ -1,4 +1,4 @@
-use crate::guards::channel::ChannelRef;
+use crate::database::channel::Channel;
 
 use once_cell::sync::OnceCell;
 use std::sync::mpsc::{channel, Sender};
@@ -65,7 +65,7 @@ pub fn send_message_threaded<U: Into<Option<Vec<String>>>, G: Into<Option<String
     }
 }
 
-pub fn send_message_given_channel(data: events::Notification, channel: &ChannelRef) {
+pub fn send_message_given_channel(data: events::Notification, channel: &Channel) {
     match channel.channel_type {
         0..=1 => send_message_threaded(channel.recipients.clone(), None, data),
         2 => send_message_threaded(None, channel.guild.clone(), data),
diff --git a/src/routes/channel.rs b/src/routes/channel.rs
index 36b576b0db27c0d144a85f685c66daaf07309b6c..adebb6e17d0434a7c05198829cf1b30eb47fbe64 100644
--- a/src/routes/channel.rs
+++ b/src/routes/channel.rs
@@ -1,10 +1,9 @@
 use super::Response;
 use crate::database::{
     self, get_relationship, get_relationship_internal, message::Message, Permission,
-    PermissionCalculator, Relationship,
+    PermissionCalculator, Relationship, channel::Channel
 };
 use crate::guards::auth::UserRef;
-use crate::guards::channel::ChannelRef;
 use crate::notifications::{
     self,
     events::{groups::*, guilds::ChannelDelete, message::*, Notification},
@@ -130,7 +129,7 @@ pub fn create_group(user: UserRef, info: Json<CreateGroup>) -> Response {
 
 /// fetch channel information
 #[get("/<target>")]
-pub fn channel(user: UserRef, target: ChannelRef) -> Option<Response> {
+pub fn channel(user: UserRef, target: Channel) -> Option<Response> {
     with_permissions!(user, target);
 
     match target.channel_type {
@@ -141,39 +140,39 @@ pub fn channel(user: UserRef, target: ChannelRef) -> Option<Response> {
             "recipients": target.recipients,
         }))),
         1 => {
-            if let Some(info) = target.fetch_data(doc! {
+            /*if let Some(info) = target.fetch_data(doc! {
                 "name": 1,
                 "description": 1,
                 "owner": 1,
-            }) {
+            }) {*/
                 Some(Response::Success(json!({
                     "id": target.id,
                     "type": target.channel_type,
                     "last_message": target.last_message,
                     "recipients": target.recipients,
-                    "name": info.get_str("name").unwrap(),
-                    "owner": info.get_str("owner").unwrap(),
-                    "description": info.get_str("description").unwrap_or(""),
+                    "name": target.name,
+                    "owner": target.owner,
+                    "description": target.description,
                 })))
-            } else {
+            /*} else {
                 None
-            }
+            }*/
         }
         2 => {
-            if let Some(info) = target.fetch_data(doc! {
+            /*if let Some(info) = target.fetch_data(doc! {
                 "name": 1,
                 "description": 1,
-            }) {
+            }) {*/
                 Some(Response::Success(json!({
                     "id": target.id,
                     "type": target.channel_type,
                     "guild": target.guild,
-                    "name": info.get_str("name").unwrap(),
-                    "description": info.get_str("description").unwrap_or(""),
+                    "name": target.name,
+                    "description": target.description,
                 })))
-            } else {
+            /*} else {
                 None
-            }
+            }*/
         }
         _ => unreachable!(),
     }
@@ -181,7 +180,7 @@ pub fn channel(user: UserRef, target: ChannelRef) -> Option<Response> {
 
 /// [groups] add user to channel
 #[put("/<target>/recipients/<member>")]
-pub fn add_member(user: UserRef, target: ChannelRef, member: UserRef) -> Option<Response> {
+pub fn add_member(user: UserRef, target: Channel, member: UserRef) -> Option<Response> {
     if target.channel_type != 1 {
         return Some(Response::BadRequest(json!({ "error": "Not a group DM." })));
     }
@@ -255,7 +254,7 @@ pub fn add_member(user: UserRef, target: ChannelRef, member: UserRef) -> Option<
 
 /// [groups] remove user from channel
 #[delete("/<target>/recipients/<member>")]
-pub fn remove_member(user: UserRef, target: ChannelRef, member: UserRef) -> Option<Response> {
+pub fn remove_member(user: UserRef, target: Channel, member: UserRef) -> Option<Response> {
     if target.channel_type != 1 {
         return Some(Response::BadRequest(json!({ "error": "Not a group DM." })));
     }
@@ -327,7 +326,7 @@ pub fn remove_member(user: UserRef, target: ChannelRef, member: UserRef) -> Opti
 /// or leave group DM
 /// or close DM conversation
 #[delete("/<target>")]
-pub fn delete(user: UserRef, target: ChannelRef) -> Option<Response> {
+pub fn delete(user: UserRef, target: Channel) -> Option<Response> {
     let permissions = with_permissions!(user, target);
 
     if !permissions.get_manage_channels() {
@@ -490,7 +489,7 @@ pub struct MessageFetchOptions {
 #[get("/<target>/messages?<options..>")]
 pub fn messages(
     user: UserRef,
-    target: ChannelRef,
+    target: Channel,
     options: Form<MessageFetchOptions>,
 ) -> Option<Response> {
     let permissions = with_permissions!(user, target);
@@ -554,7 +553,7 @@ pub struct SendMessage {
 #[post("/<target>/messages", data = "<message>")]
 pub fn send_message(
     user: UserRef,
-    target: ChannelRef,
+    target: Channel,
     message: Json<SendMessage>,
 ) -> Option<Response> {
     let permissions = with_permissions!(user, target);
@@ -609,7 +608,7 @@ pub fn send_message(
 
 /// get a message
 #[get("/<target>/messages/<message>")]
-pub fn get_message(user: UserRef, target: ChannelRef, message: Message) -> Option<Response> {
+pub fn get_message(user: UserRef, target: Channel, message: Message) -> Option<Response> {
     let permissions = with_permissions!(user, target);
 
     if !permissions.get_read_messages() {
@@ -643,7 +642,7 @@ pub struct EditMessage {
 #[patch("/<target>/messages/<message>", data = "<edit>")]
 pub fn edit_message(
     user: UserRef,
-    target: ChannelRef,
+    target: Channel,
     message: Message,
     edit: Json<EditMessage>,
 ) -> Option<Response> {
@@ -700,7 +699,7 @@ pub fn edit_message(
 
 /// delete a message
 #[delete("/<target>/messages/<message>")]
-pub fn delete_message(user: UserRef, target: ChannelRef, message: Message) -> Option<Response> {
+pub fn delete_message(user: UserRef, target: Channel, message: Message) -> Option<Response> {
     let permissions = with_permissions!(user, target);
 
     if !permissions.get_manage_messages() {
diff --git a/src/routes/guild.rs b/src/routes/guild.rs
index 9c272087cd70c086609388900910b9b592a243a0..405a3d46a27825f0a6011c9d946c71500c8bca03 100644
--- a/src/routes/guild.rs
+++ b/src/routes/guild.rs
@@ -1,8 +1,7 @@
 use super::channel::ChannelType;
 use super::Response;
-use crate::database::{self, channel::Channel, Permission, PermissionCalculator};
+use crate::database::{self, channel::Channel, channel::fetch_channel, Permission, PermissionCalculator};
 use crate::guards::auth::UserRef;
-use crate::guards::channel::ChannelRef;
 use crate::guards::guild::{get_invite, get_member, GuildRef};
 use crate::notifications::{
     self,
@@ -331,7 +330,7 @@ pub struct InviteOptions {
 pub fn create_invite(
     user: UserRef,
     target: GuildRef,
-    channel: ChannelRef,
+    channel: Channel,
     _options: Json<InviteOptions>,
 ) -> Option<Response> {
     let (permissions, _) = with_permissions!(user, target);
@@ -430,7 +429,8 @@ pub fn fetch_invites(user: UserRef, target: GuildRef) -> Option<Response> {
 #[get("/join/<code>", rank = 1)]
 pub fn fetch_invite(user: UserRef, code: String) -> Response {
     if let Some((guild_id, name, invite)) = get_invite(&code, user.id) {
-        if let Some(channel) = ChannelRef::from(invite.channel) {
+        //if let Some(channel) = ChannelRef::from(invite.channel) {
+            let channel = fetch_channel(&invite.channel);
             Response::Success(json!({
                 "guild": {
                     "id": guild_id,
@@ -441,9 +441,9 @@ pub fn fetch_invite(user: UserRef, code: String) -> Response {
                     "name": channel.name,
                 }
             }))
-        } else {
+        /*} else {
             Response::BadRequest(json!({ "error": "Failed to fetch channel." }))
-        }
+        }*/
     } else {
         Response::NotFound(json!({ "error": "Failed to fetch invite or code is invalid." }))
     }