diff --git a/inc/lektor/uri.h b/inc/lektor/uri.h
index 7a48fe7df505d467e5244dcf8254a317ddacac60..e231bbaf5f761e47cea700d86c5b5c16e266cba8 100644
--- a/inc/lektor/uri.h
+++ b/inc/lektor/uri.h
@@ -9,19 +9,20 @@ extern "C" {
 #include <stddef.h>
 
 typedef enum {
-    URI_NULL     = 0,
-    URI_ID       = 1,
-    URI_PLAYLIST = 2,
-    URI_TYPE     = 3,
-    URI_AUTHOR   = 4,
-    URI_CATEGORY = 5,
-    URI_LANGUAGE = 6,
-    URI_QUERY    = 7,
+    URI_NULL            = 0,
+    URI_ID              = 1,
+    URI_PLAYLIST        = 2,
+    URI_TYPE            = 3,
+    URI_AUTHOR          = 4,
+    URI_CATEGORY        = 5,
+    URI_LANGUAGE        = 6,
+    URI_QUERY           = 7,
+    URI_QUERY_PLUS_LINK = 8,
 } LKT_URI_TYPE;
 
 typedef enum {
-    URI_VALUE_TYPE_NULL = 0,
-    URI_VALUE_TYPE_STRING = 1,
+    URI_VALUE_TYPE_NULL    = 0,
+    URI_VALUE_TYPE_STRING  = 1,
     URI_VALUE_TYPE_INTEGER = 2,
 } LKT_URI_VALUE_TYPE;
 
diff --git a/src/base/uri.c b/src/base/uri.c
index fbe544a6132530dff31a709218353b6c1eb43149..cc2239cf26921e004175c71eafd8e5582d4a1089 100644
--- a/src/base/uri.c
+++ b/src/base/uri.c
@@ -134,6 +134,10 @@ __prefix(char *str, struct lkt_uri *ret)
         ret->column_name = LKT_DB_LANG;
         ret->type        = URI_LANGUAGE;
         val              = str + 4;
+    } else if (STR_NMATCH(str, "query+link", 11)) {
+        ret->column_name = LKT_DB_ALL;
+        ret->type        = URI_QUERY_PLUS_LINK;
+        val              = str + 11;
     } else if (STR_NMATCH(str, "query", 5)) {
         ret->column_name = LKT_DB_ALL;
         ret->type        = URI_QUERY;
@@ -296,6 +300,8 @@ __lkt_to_str(const struct lkt_uri *uri, char *ret, size_t len)
     case URI_TYPE: safe_snprintf(ret, len, "type=%s", (char *)uri->value); break;
     case URI_AUTHOR: safe_snprintf(ret, len, "author=%s", (char *)uri->value); break;
     case URI_CATEGORY: safe_snprintf(ret, len, "cat=%s", (char *)uri->value); break;
+
+    case URI_QUERY_PLUS_LINK:
     case URI_QUERY: safe_snprintf(ret, len, "search=%s", (char *)uri->value); break;
 
     case URI_PLAYLIST: ___plt_uri_to_str(uri, ret, len); return false;
@@ -356,11 +362,13 @@ lkt_uri_match_kara_metadata(const struct lkt_uri *uri, const struct kara_metadat
     }
 
     case URI_TYPE: return STR_MATCH((const char *)uri->value, kara_mdt->song_type);
-    case URI_QUERY: return database_is_kara_like(db, kara_id, uri->value);
     case URI_AUTHOR: return STR_MATCH((const char *)uri->value, kara_mdt->author_name);
     case URI_CATEGORY: return STR_MATCH((const char *)uri->value, kara_mdt->category);
     case URI_PLAYLIST: return database_plt_contais_kara(db, uri->value, kara_id);
     case URI_LANGUAGE: return STR_MATCH((const char *)uri->value, kara_mdt->language);
+
+    case URI_QUERY_PLUS_LINK:
+    case URI_QUERY: return database_is_kara_like(db, kara_id, uri->value);
     }
     LOG_ERROR("URI", "Found an unusual uri type: %d", uri->type);
     LOG_UNREACHABLE;
diff --git a/src/database/queue.c b/src/database/queue.c
index 9f3f56d1da87e6866f6b1a756ff80bf3adaf3c34..25202e8c7a67166e0d74385f62c3616c136feb9f 100644
--- a/src/database/queue.c
+++ b/src/database/queue.c
@@ -326,6 +326,7 @@ database_queue_add_uri(lkt_db *db, struct lkt_uri *uri, int prio)
     const LKT_URI_TYPE type = lkt_uri_get_type(uri);
 
     switch (type) {
+    case URI_QUERY_PLUS_LINK:
     case URI_QUERY:
         return queue_add_with_col_like_str(db, LKT_DB_ALL, lkt_uri_get_value_as_str(uri), prio);
 
diff --git a/src/rust/liblektor-rs/lektor_c_compat/src/c_types.rs b/src/rust/liblektor-rs/lektor_c_compat/src/c_types.rs
index 1aac3ddf18f4bc8f8aad07397ec2a09085ed2bd8..228b7f5b6d97f0e16bd8420a54b415f19f0d8414 100644
--- a/src/rust/liblektor-rs/lektor_c_compat/src/c_types.rs
+++ b/src/rust/liblektor-rs/lektor_c_compat/src/c_types.rs
@@ -23,6 +23,7 @@ pub enum LktUriType {
     Category = 5,
     Lanquage = 6,
     Query = 7,
+    QueryPlusLink = 8,
 }
 
 #[repr(C)]
diff --git a/src/rust/liblektor-rs/lektor_c_compat/src/rs_types/uri.rs b/src/rust/liblektor-rs/lektor_c_compat/src/rs_types/uri.rs
index 9c77af5f18a1f4dfdb3e4d882745f12db951cc0f..dbccc4826806036dd0e2f4ddedbcc0be86dc66fb 100644
--- a/src/rust/liblektor-rs/lektor_c_compat/src/rs_types/uri.rs
+++ b/src/rust/liblektor-rs/lektor_c_compat/src/rs_types/uri.rs
@@ -22,10 +22,13 @@ pub enum LktUriField {
     /// The language of the kara must match the value in the URI.
     Language,
 
-    /// Do a fuzzy search with the value if the URI. This is the default action
-    /// for an URI.
+    /// Do a fuzzy search with the value if the URI. We also look up the links
+    /// of the kara.
     FuzzySearch,
 
+    /// Do a search with the value if the URI. This is the default action for an URI.
+    Search,
+
     /// Do a search by the name of the playlist.
     Playlist,
 }
@@ -39,7 +42,7 @@ pub enum LktUriValue<'a> {
 
 impl Default for LktUriField {
     fn default() -> Self {
-        LktUriField::FuzzySearch
+        LktUriField::Search
     }
 }
 
@@ -60,7 +63,8 @@ impl LktCUri {
             LktUriType::Author => Some(KaraMaker),
             LktUriType::Category => Some(Origin),
             LktUriType::Lanquage => Some(Language),
-            LktUriType::Query => Some(FuzzySearch),
+            LktUriType::Query => Some(Search),
+            LktUriType::QueryPlusLink => Some(FuzzySearch),
         }
     }
 
diff --git a/src/rust/liblektor-rs/lektor_db/src/connexion.rs b/src/rust/liblektor-rs/lektor_db/src/connexion.rs
index bebc028637232c9533077105d65a6adecc2128da..eb4da47159ae07d881eab9c294118238b9165a94 100644
--- a/src/rust/liblektor-rs/lektor_db/src/connexion.rs
+++ b/src/rust/liblektor-rs/lektor_db/src/connexion.rs
@@ -319,7 +319,7 @@ impl LktDatabaseConnection {
                 .map_err(|err| format!("{err}"))?
             )),
 
-            LktUriField::FuzzySearch => {
+            LktUriField::Search | LktUriField::FuzzySearch => {
                 let _ = uri_str!("query" :/ uri);
                 todo!()
             }