diff --git a/src/rust/liblektor-rs/lektor_db/migrations/2022-09-30-204512_initial/up.sql b/src/rust/liblektor-rs/lektor_db/migrations/2022-09-30-204512_initial/up.sql
index 0817dea38bfc2081981b1baf810e882038cb092d..1e8c4967eb1e3ec240b598ececf11cfcd8f349d3 100644
--- a/src/rust/liblektor-rs/lektor_db/migrations/2022-09-30-204512_initial/up.sql
+++ b/src/rust/liblektor-rs/lektor_db/migrations/2022-09-30-204512_initial/up.sql
@@ -19,6 +19,7 @@ CREATE TABLE repo_kara
 CREATE TABLE kara
   ( id          BIGINT  NOT NULL PRIMARY KEY REFERENCES repo(local_kara_id) ON DELETE CASCADE
   , is_dl       BOOLEAN NOT NULL DEFAULT false
+  , is_virtual  BOOLEAN NOT NULL DEFAULT false
   , song_title  TEXT    NOT NULL
   , song_type   TEXT    NOT NULL
   , song_origin TEXT    NOT NULL
diff --git a/src/rust/liblektor-rs/lektor_db/src/connexion.rs b/src/rust/liblektor-rs/lektor_db/src/connexion.rs
index 8829bb5bc884aa919dfaf9a153d64a6c1523c214..bebc028637232c9533077105d65a6adecc2128da 100644
--- a/src/rust/liblektor-rs/lektor_db/src/connexion.rs
+++ b/src/rust/liblektor-rs/lektor_db/src/connexion.rs
@@ -281,6 +281,7 @@ impl LktDatabaseConnection {
         match uri_type {
             LktUriField::Id => Ok(vec![with_dsl!(kara => kara
                 .filter(id.is(uri_as_int!("id" :/ uri)))
+                .filter(is_virtual.is(false))
                 .select(id)
                 .first::<i64>(&mut self.sqlite)
                 .map_err(|err| format!("{err}"))?
@@ -289,6 +290,7 @@ impl LktDatabaseConnection {
             LktUriField::KaraMaker => Ok(with_dsl!(kara_maker => kara_maker
                 .filter(name.like(uri_str!("author" :/ uri)))
                 .inner_join(schema::kara::table)
+                .filter(schema::kara::is_virtual.is(false))
                 .select(id)
                 .load::<i64>(&mut self.sqlite)
                 .map_err(|err| format!("{err}"))?
@@ -296,12 +298,14 @@ impl LktDatabaseConnection {
 
             LktUriField::Origin => Ok(with_dsl!(kara => kara
                 .filter(song_origin.like(uri_str!("origin" :/ uri)))
+                .filter(is_virtual.is(false))
                 .select(id).load::<i64>(&mut self.sqlite)
                 .map_err(|err| format!("{err}"))?
             )),
 
             LktUriField::Type => Ok(with_dsl!(kara => kara
                 .filter(song_type.is(uri_str!("type" :/ uri)))
+                .filter(is_virtual.is(false))
                 .select(id).load::<i64>(&mut self.sqlite)
                 .map_err(|err| format!("{err}"))?
             )),
@@ -309,6 +313,7 @@ impl LktDatabaseConnection {
             LktUriField::Language => Ok(with_dsl!(kara_lang => kara_lang
                 .filter(code.like(uri_str!("language" :/ uri)))
                 .inner_join(schema::kara::table)
+                .filter(schema::kara::is_virtual.is(false))
                 .select(id)
                 .load::<i64>(&mut self.sqlite)
                 .map_err(|err| format!("{err}"))?
diff --git a/src/rust/liblektor-rs/lektor_db/src/schema.rs b/src/rust/liblektor-rs/lektor_db/src/schema.rs
index 82791c5193e601ff5365a7128aa94566ccd17d6a..09d100a684cc2c7adce3da69571b7a351c4e4ceb 100644
--- a/src/rust/liblektor-rs/lektor_db/src/schema.rs
+++ b/src/rust/liblektor-rs/lektor_db/src/schema.rs
@@ -20,6 +20,7 @@ diesel::table! {
     kara (id) {
         id -> BigInt,
         is_dl -> Bool,
+        is_virtual -> Bool,
         song_title -> Text,
         song_type -> Text,
         song_origin -> Text,