diff --git a/arkindex/sql_validation/corpus_rights_filter.sql b/arkindex/sql_validation/corpus_rights_filter.sql
index 5f58b9c464271829af4cd05093c59bd4f65c3839..b0b5f6ed6a6b143144388c027dce6ab7281d18ff 100644
--- a/arkindex/sql_validation/corpus_rights_filter.sql
+++ b/arkindex/sql_validation/corpus_rights_filter.sql
@@ -15,4 +15,5 @@ LEFT OUTER JOIN "users_right" T5 ON ("users_group"."id" = T5."content_id"
 WHERE (("users_right"."user_id" = {user_id}
         OR T5."user_id" = {user_id})
        AND LEAST("users_right"."level", T5."level") >= {level})
-ORDER BY "documents_corpus"."id" ASC
+ORDER BY "documents_corpus"."id" ASC,
+         "max_level" DESC
diff --git a/arkindex/sql_validation/corpus_rights_filter_public.sql b/arkindex/sql_validation/corpus_rights_filter_public.sql
index 844eb63468435ee9cc691b4f8b5d0167c37795e8..090c1a9f798f3b9d494cbc4ae7674ec38f09738e 100644
--- a/arkindex/sql_validation/corpus_rights_filter_public.sql
+++ b/arkindex/sql_validation/corpus_rights_filter_public.sql
@@ -1,30 +1,49 @@
-(SELECT DISTINCT ON ("documents_corpus"."id") "documents_corpus"."created",
-                        "documents_corpus"."updated",
-                        "documents_corpus"."id",
-                        "documents_corpus"."name",
-                        "documents_corpus"."description",
-                        "documents_corpus"."repository_id",
-                        "documents_corpus"."public",
-                        LEAST("users_right"."level", T5."level") AS "max_level"
-     FROM "documents_corpus"
-     INNER JOIN "users_right" ON ("documents_corpus"."id" = "users_right"."content_id"
+SELECT DISTINCT ON ("documents_corpus"."id") "documents_corpus"."created",
+                   "documents_corpus"."updated",
+                   "documents_corpus"."id",
+                   "documents_corpus"."name",
+                   "documents_corpus"."description",
+                   "documents_corpus"."repository_id",
+                   "documents_corpus"."public",
+                   CASE
+                       WHEN ("documents_corpus"."public"
+                             AND NOT ("users_right"."user_id" = {user_id}
+                                      AND "users_right"."user_id" IS NOT NULL)
+                             AND NOT (T5."user_id" = {user_id}
+                                      AND T5."user_id" IS NOT NULL)) THEN 10
+                       ELSE LEAST("users_right"."level", T5."level")
+                   END AS "max_level"
+FROM "documents_corpus"
+LEFT OUTER JOIN "users_right" ON ("documents_corpus"."id" = "users_right"."content_id"
                                   AND ("users_right"."content_type_id" = {corpus_type_id}))
-     LEFT OUTER JOIN "users_group" ON ("users_right"."group_id" = "users_group"."id")
-     LEFT OUTER JOIN "users_right" T5 ON ("users_group"."id" = T5."content_id"
-                                          AND (T5."content_type_id" = {group_type_id}))
-     WHERE (("users_right"."user_id" = {user_id}
-             OR T5."user_id" = {user_id})
-            AND LEAST("users_right"."level", T5."level") >= {level})
-     ORDER BY "documents_corpus"."id" ASC, "max_level" DESC)
-UNION
-    (SELECT "documents_corpus"."created",
-            "documents_corpus"."updated",
-            "documents_corpus"."id",
-            "documents_corpus"."name",
-            "documents_corpus"."description",
-            "documents_corpus"."repository_id",
-            "documents_corpus"."public",
-            10 AS "max_level"
-     FROM "documents_corpus"
-     WHERE "documents_corpus"."public")
-ORDER BY (3) ASC
+LEFT OUTER JOIN "users_group" ON ("users_right"."group_id" = "users_group"."id")
+LEFT OUTER JOIN "users_right" T5 ON ("users_group"."id" = T5."content_id"
+                                     AND (T5."content_type_id" = {group_type_id}))
+WHERE (("users_right"."user_id" = {user_id}
+        OR T5."user_id" = {user_id}
+        OR ("documents_corpus"."public"
+            AND NOT ("documents_corpus"."id" IN
+                         (SELECT U1."content_id"
+                          FROM "users_right" U1
+                          WHERE (U1."user_id" = {user_id}
+                                 AND U1."content_type_id" = {corpus_type_id}
+                                 AND U1."id" = "users_right"."id")))
+            AND NOT ("documents_corpus"."id" IN
+                         (SELECT U1."content_id"
+                          FROM "users_right" U1
+                          INNER JOIN "users_group" U2 ON (U1."group_id" = U2."id")
+                          INNER JOIN "users_right" U3 ON (U2."id" = U3."content_id"
+                                                          AND (U3."content_type_id" = {group_type_id}))
+                          WHERE (U3."user_id" = {user_id}
+                                 AND U1."content_type_id" = {corpus_type_id}
+                                 AND U1."id" = "users_right"."id")))))
+       AND CASE
+               WHEN ("documents_corpus"."public"
+                     AND NOT ("users_right"."user_id" = {user_id}
+                              AND "users_right"."user_id" IS NOT NULL)
+                     AND NOT (T5."user_id" = {user_id}
+                              AND T5."user_id" IS NOT NULL)) THEN 10
+               ELSE LEAST("users_right"."level", T5."level")
+           END >= 10)
+ORDER BY "documents_corpus"."id" ASC,
+         "max_level" DESC