diff --git a/superx/WEB-INF/conf/edustore/db/install/conf/kern.xml b/superx/WEB-INF/conf/edustore/db/install/conf/kern.xml
index 60ee920c..602b39c5 100644
--- a/superx/WEB-INF/conf/edustore/db/install/conf/kern.xml
+++ b/superx/WEB-INF/conf/edustore/db/install/conf/kern.xml
@@ -10081,6 +10081,14 @@ where dimension_bp_id=(select D.tid from dimension_bp D where D.apnr='bluep_absc
INFORMIX
+
+
+ $SUPERX_DIR/db/install/masken
+ A. Knieschewski
+ 21.09.2026
+ POSTGRES
+
+
diff --git a/superx/WEB-INF/conf/edustore/db/install/masken/71900_felderinfo.unl b/superx/WEB-INF/conf/edustore/db/install/masken/71900_felderinfo.unl
new file mode 100644
index 00000000..217fa59a
--- /dev/null
+++ b/superx/WEB-INF/conf/edustore/db/install/masken/71900_felderinfo.unl
@@ -0,0 +1,82 @@
+71900^Tabelle^1^0^0^120^400^1^integer^30^1^1^<>\
+select c.oid::integer,\
+ n.nspname || '.' || c.relname\
+from pg_catalog.pg_class c\
+join pg_catalog.pg_namespace n on n.oid=c.relnamespace\
+where c.relkind in ('r','p','v','m','f')\
+ and n.nspname not in ('pg_catalog','information_schema')\
+ and n.nspname not like 'pg_toast%'\
+ and n.nspname not like 'pg_temp_%'\
+ and has_table_privilege(c.oid,'SELECT')\
+ and 1=(select administration from userinfo where tid=<>)\
+order by n.nspname,c.relname;^ ^ ^
+71901^Felder^2^0^0^120^250^10^char^255^0^1^<>\
+select a.attname::varchar(255) as apnr,\
+ a.attname::varchar(255) as name\
+from pg_catalog.pg_attribute a\
+where a.attrelid=nullif('<>','')::oid\
+ and a.attnum > 0\
+ and not a.attisdropped\
+order by a.attnum;^ ^ ^
+71902^Filterfeld^3^0^0^120^200^1^sql^255^0^1^<>\
+select a.attname,a.attname\
+from pg_catalog.pg_attribute a\
+where a.attrelid=nullif('<>','')::oid\
+ and a.attnum > 0\
+ and not a.attisdropped\
+order by a.attnum;^ ^ ^
+71903^Operator^4^0^0^120^120^1^sql^30^0^1^<>\
+select '=' as apnr,'=' as name from xdummy\
+union all select '<>','<>' from xdummy\
+union all select '>','>' from xdummy\
+union all select '>=','>=' from xdummy\
+union all select '<','<' from xdummy\
+union all select '<=','<=' from xdummy\
+union all select 'like','LIKE' from xdummy\
+union all select 'ilike','ILIKE' from xdummy\
+union all select 'is null','ist leer' from xdummy\
+union all select 'is not null','ist nicht leer' from xdummy;^ ^ ^
+71904^Wert^5^0^0^120^250^1^char^255^0^0^ ^ ^ ^
+71905^Sortierfeld^6^0^0^120^200^1^sql^255^0^1^<>\
+--Freemarker Template\
+<#if "<>"!="">\
+select apnr,name\
+from\
+(\
+ select '__COUNT__'::varchar(255) as apnr,\
+ 'Anzahl'::varchar(255) as name,\
+ 0::integer as sortnr\
+ from xdummy\
+\
+ union all\
+\
+ select a.attname::varchar(255) as apnr,\
+ a.attname::varchar(255) as name,\
+ a.attnum::integer as sortnr\
+ from pg_catalog.pg_attribute a\
+ where a.attrelid=nullif('<>','')::oid\
+ and a.attnum > 0\
+ and not a.attisdropped\
+ and a.attname in (<>)\
+) X\
+order by sortnr;\
+<#else>\
+select a.attname,a.attname\
+from pg_catalog.pg_attribute a\
+where a.attrelid=nullif('<>','')::oid\
+ and a.attnum > 0\
+ and not a.attisdropped\
+order by a.attnum;\
+#if>^ ^ ^
+71906^Sortierung^7^0^0^120^120^1^sql^10^0^1^<>\
+select 'asc','aufsteigend' from xdummy\
+union all\
+select 'desc','absteigend' from xdummy;^ ^ ^
+71907^Limit^8^0^0^120^100^1^integer^10^1^1^<>\
+select 10,'10' from xdummy\
+union all select 50,'50' from xdummy\
+union all select 100,'100' from xdummy\
+union all select 500,'500' from xdummy\
+union all select 1000,'1.000' from xdummy\
+union all select 5000,'5.000' from xdummy\
+order by 1;^ ^100^
diff --git a/superx/WEB-INF/conf/edustore/db/install/masken/71900_maske_system_bez.unl b/superx/WEB-INF/conf/edustore/db/install/masken/71900_maske_system_bez.unl
new file mode 100644
index 00000000..c313eaad
--- /dev/null
+++ b/superx/WEB-INF/conf/edustore/db/install/masken/71900_maske_system_bez.unl
@@ -0,0 +1 @@
+71900^9^
diff --git a/superx/WEB-INF/conf/edustore/db/install/masken/71900_masken_felder_bez.unl b/superx/WEB-INF/conf/edustore/db/install/masken/71900_masken_felder_bez.unl
new file mode 100644
index 00000000..b1acb200
--- /dev/null
+++ b/superx/WEB-INF/conf/edustore/db/install/masken/71900_masken_felder_bez.unl
@@ -0,0 +1,8 @@
+71900^71900^
+71900^71901^
+71900^71902^
+71900^71903^
+71900^71904^
+71900^71905^
+71900^71906^
+71900^71907^
diff --git a/superx/WEB-INF/conf/edustore/db/install/masken/71900_maskeninfo.unl b/superx/WEB-INF/conf/edustore/db/install/masken/71900_maskeninfo.unl
new file mode 100644
index 00000000..bb2072b8
--- /dev/null
+++ b/superx/WEB-INF/conf/edustore/db/install/masken/71900_maskeninfo.unl
@@ -0,0 +1,182 @@
+71900^Tabelleninhalt anzeigen^--Freemarker Template\
+<#include "SQL_lingua_franca"/>\
+<#include "SuperX_general"/>\
+\
+-- Entwicklermaske: Tabelleninhalt direkt aus PostgreSQL-Metadaten ausgeben.\
+-- Tabellennamen und Spaltennamen werden nicht frei eingegeben, sondern\
+-- ueber PostgreSQL-Systemkataloge aufgeloest und mit quote_ident() gequotet.\
+\
+\
+\
+\
+select quote_ident(n.nspname) || '.' || quote_ident(c.relname)\
+from pg_catalog.pg_class c\
+join pg_catalog.pg_namespace n on n.oid=c.relnamespace\
+where c.oid=<>\
+ and c.relkind in ('r','p','v','m','f')\
+ and n.nspname not in ('pg_catalog','information_schema')\
+ and n.nspname not like 'pg_toast%'\
+ and n.nspname not like 'pg_temp_%'\
+ and has_table_privilege(c.oid,'SELECT')\
+ and 1=(select administration from userinfo where tid=<>)\
+\
+\
+\
+select a.attname as feldname,\
+ pg_catalog.format_type(a.atttypid,a.atttypmod) as datentyp,\
+ quote_ident(a.attname) as qname\
+from pg_catalog.pg_attribute a\
+where a.attrelid=<>\
+ and a.attnum > 0\
+ and not a.attisdropped\
+order by a.attnum\
+\
+\
+\
+select max(quote_ident(a.attname))\
+from pg_catalog.pg_attribute a\
+where a.attrelid=<>\
+ and a.attnum > 0\
+ and not a.attisdropped\
+ and a.attname='<>'\
+\
+\
+\
+select max(quote_ident(a.attname))\
+from pg_catalog.pg_attribute a\
+where a.attrelid=<>\
+ and a.attnum > 0\
+ and not a.attisdropped\
+ and a.attname='<>'\
+\
+\
+\
+\
+<#assign selected_fields="<>" />\
+<#assign aggregate=false />\
+<#if selected_fields!="">\
+ <#assign aggregate=true />\
+#if>\
+\
+<#assign field_list="" />\
+<#foreach feld in get_felder>\
+ <#if !aggregate || selected_fields?index_of("'"+feld.feldname+"'")!=-1>\
+ <#if field_list!="">\
+ <#assign field_list=field_list+", " />\
+ #if>\
+ <#assign field_list=field_list+feld.qname />\
+ #if>\
+#foreach>\
+\
+/* Operator serverseitig auf erlaubte Werte begrenzen */\
+<#assign operator_sql="" />\
+<#if "<>"="=">\
+ <#assign operator_sql="=" />\
+<#elseif "<>"="<>">\
+ <#assign operator_sql="<>" />\
+<#elseif "<>"=">">\
+ <#assign operator_sql=">" />\
+<#elseif "<>"=">=">\
+ <#assign operator_sql=">=" />\
+<#elseif "<>"="<">\
+ <#assign operator_sql="<" />\
+<#elseif "<>"="<=">\
+ <#assign operator_sql="<=" />\
+<#elseif "<>"="like">\
+ <#assign operator_sql="like" />\
+<#elseif "<>"="ilike">\
+ <#assign operator_sql="ilike" />\
+<#elseif "<>"="is null">\
+ <#assign operator_sql="is null" />\
+<#elseif "<>"="is not null">\
+ <#assign operator_sql="is not null" />\
+#if>\
+\
+<#assign apply_filter=false />\
+<#if "<>"!="" && operator_sql!="" && filter_field_sql?has_content>\
+ <#if operator_sql="is null" || operator_sql="is not null">\
+ <#assign apply_filter=true />\
+ <#elseif "<>"!="">\
+ <#assign apply_filter=true />\
+ #if>\
+#if>\
+\
+/* Sortierrichtung nicht ungeprueft aus der Eingabe uebernehmen */\
+<#assign sort_direction="asc" />\
+<#if "<>"="desc">\
+ <#assign sort_direction="desc" />\
+#if>\
+\
+/* LIMIT ebenfalls auf die in der Maske angebotenen Werte begrenzen */\
+<#assign row_limit=100 />\
+<#if "<>"="10">\
+ <#assign row_limit=10 />\
+<#elseif "<>"="50">\
+ <#assign row_limit=50 />\
+<#elseif "<>"="100">\
+ <#assign row_limit=100 />\
+<#elseif "<>"="500">\
+ <#assign row_limit=500 />\
+<#elseif "<>"="1000">\
+ <#assign row_limit=1000 />\
+<#elseif "<>"="5000">\
+ <#assign row_limit=5000 />\
+#if>\
+\
+select\
+${field_list}<#if aggregate>,\
+count(*) as anzahl#if>\
+from ${table_sql}\
+where 1=1\
+<#if apply_filter>\
+ and ${filter_field_sql} ${operator_sql}<#if operator_sql!="is null" && operator_sql!="is not null"> <>#if>\
+#if>\
+<#if aggregate>\
+group by ${field_list}\
+#if>\
+<#if "<>"="__COUNT__" && aggregate>\
+order by anzahl ${sort_direction}\
+<#elseif "<>"!="" && sort_field_sql?has_content>\
+order by ${sort_field_sql} ${sort_direction}\
+<#elseif aggregate>\
+order by ${field_list}\
+#if>\
+limit ${row_limit};^--Freemarker Template\
+\
+\
+select a.attname as feldname,\
+ pg_catalog.format_type(a.atttypid,a.atttypmod) as datentyp,\
+ quote_ident(a.attname) as qname\
+from pg_catalog.pg_attribute a\
+where a.attrelid=<>\
+ and a.attnum > 0\
+ and not a.attisdropped\
+order by a.attnum\
+\
+\
+\
+<#assign selected_fields="<>" />\
+<#assign aggregate=false />\
+<#if selected_fields!="">\
+ <#assign aggregate=true />\
+#if>\
+\
+XIL List\
+ sizable_columns horizontal_scrolling\
+ white_space_color=COLOR_WHITE fixed_columns=1\
+ min_heading_height=35\
+<#assign i=0 />\
+<#foreach feld in get_felder>\
+<#if !aggregate || selected_fields?index_of("'"+feld.feldname+"'")!=-1>\
+Column CID=${i} heading_text="${feld.feldname}" explanation="PostgreSQL-Datentyp: ${feld.datentyp}" center_heading\
+ row_selectable col_selectable heading_platform readonly\
+ width=20\
+<#assign i=i+1 />\
+#if>\
+#foreach>\
+<#if aggregate>\
+Column CID=${i} heading_text="Anzahl" explanation="Anzahl der Datensaetze mit dieser Feldkombination" center_heading\
+ row_selectable col_selectable rightJust heading_platform readonly\
+ width=10\
+#if>\
+@@@^ ^ ^Entwicklerwerkzeug zum Anzeigen von PostgreSQL-Tabellen und Views. Bei Auswahl einzelner Felder werden gleiche Kombinationen gruppiert und mit Anzahl ausgegeben. Tabellen- und Spaltenmetadaten kommen direkt aus pg_catalog.^ ^^1^650^500^^0^Keine Feldauswahl zeigt alle Spalten und Datensaetze im Detail. Werden einzelne Felder ausgewaehlt, erfolgt automatisch eine Gruppierung nach diesen Feldern und eine Ausgabe der Spalte "Anzahl".^
diff --git a/superx/WEB-INF/conf/edustore/db/install/masken/71900_sachgeb_maske_bez.unl b/superx/WEB-INF/conf/edustore/db/install/masken/71900_sachgeb_maske_bez.unl
new file mode 100644
index 00000000..26f28d94
--- /dev/null
+++ b/superx/WEB-INF/conf/edustore/db/install/masken/71900_sachgeb_maske_bez.unl
@@ -0,0 +1 @@
+0^71900^