diff --git a/set_version.sh b/set_version.sh
index 7f52c3e0457cca319a9285e21b5323a5c9a71ec8..570c0159e74cce496ec42637d93f07ce96e880e6 100755
--- a/set_version.sh
+++ b/set_version.sh
@@ -1,3 +1,3 @@
 #!/bin/bash
-export version=0.5.1-alpha.8-patch.0
+export version=0.5.1-alpha.9
 echo "pub const VERSION: &str = \"${version}\";" > src/version.rs
diff --git a/src/database/entities/user.rs b/src/database/entities/user.rs
index 714c17ecb85ab13c78bfb4ea93325b0876936bd2..50521624072f9ee8834b25a5430cca0ea7d885c8 100644
--- a/src/database/entities/user.rs
+++ b/src/database/entities/user.rs
@@ -159,7 +159,7 @@ impl User {
 
     /// Utility function for checking claimed usernames.
     pub async fn is_username_taken(username: &str) -> Result<bool> {
-        if username.to_lowercase() == "revolt" || username.to_lowercase() == "admin" {
+        if username.to_lowercase() == "revolt" || username.to_lowercase() == "admin" || username.to_lowercase() == "system" {
             return Ok(true);
         }
 
diff --git a/src/routes/channels/message_search.rs b/src/routes/channels/message_search.rs
index 214d937bd31baed60b130481a376aa168ed2d1cf..352093ed97ac125ff636160d34bc5b178803e224 100644
--- a/src/routes/channels/message_search.rs
+++ b/src/routes/channels/message_search.rs
@@ -19,6 +19,12 @@ pub enum Sort {
     Oldest,
 }
 
+impl Default for Sort {
+    fn default() -> Sort {
+        Sort::Relevance
+    }
+}
+
 #[derive(Validate, Serialize, Deserialize, FromForm)]
 pub struct Options {
     #[validate(length(min = 1, max = 64))]
@@ -30,7 +36,8 @@ pub struct Options {
     before: Option<String>,
     #[validate(length(min = 26, max = 26))]
     after: Option<String>,
-    sort: Option<Sort>,
+    #[serde(default = "Sort::default")]
+    sort: Sort,
     include_users: Option<bool>,
 }
 
@@ -54,26 +61,60 @@ pub async fn req(user: User, target: Ref, options: Json<Options>) -> Result<Json
     let mut messages = vec![];
     let limit = options.limit.unwrap_or(50);
 
+    let mut filter = doc! {
+        "channel": target.id(),
+        "$text": {
+            "$search": &options.query
+        }
+    };
+
+    if let Some(doc) = match (&options.before, &options.after) {
+        (Some(before), Some(after)) => Some(doc! {
+            "lt": before,
+            "gt": after
+        }),
+        (Some(before), _) => Some(doc! {
+            "lt": before
+        }),
+        (_, Some(after)) => Some(doc! {
+            "gt": after
+        }),
+        _ => None
+    } {
+        filter.insert("_id", doc);
+    }
+
     let mut cursor = get_collection("messages")
         .find(
-            doc! {
-                "channel": target.id(),
-                "$text": {
-                    "$search": &options.query
-                }
-            },
+            filter,
             FindOptions::builder()
-                .projection(doc! {
-                    "score": {
-                        "$meta": "textScore"
+                .projection(
+                    if let Sort::Relevance = &options.sort {
+                        doc! {
+                            "score": {
+                                "$meta": "textScore"
+                            }
+                        }
+                    } else {
+                        doc! {}
                     }
-                })
+                )
                 .limit(limit)
-                .sort(doc! {
-                    "score": {
-                        "$meta": "textScore"
+                .sort(
+                    match &options.sort {
+                        Sort::Relevance => doc! {
+                            "score": {
+                                "$meta": "textScore"
+                            }
+                        },
+                        Sort::Latest => doc! {
+                            "_id": -1
+                        },
+                        Sort::Oldest => doc! {
+                            "_id": 1
+                        }
                     }
-                })
+                )
                 .build(),
         )
         .await
diff --git a/src/version.rs b/src/version.rs
index d73aeccd3e08d26bbda2a7988058e174399c128b..1066b72df53899205b43d8dce29631668dde2a9e 100644
--- a/src/version.rs
+++ b/src/version.rs
@@ -1 +1 @@
-pub const VERSION: &str = "0.5.1-alpha.8-patch.0";
+pub const VERSION: &str = "0.5.1-alpha.9";