diff --git a/merge/x11-misc/.calculate_directory b/merge/x11-misc/.calculate_directory
new file mode 100644
index 0000000..fe9987a
--- /dev/null
+++ b/merge/x11-misc/.calculate_directory
@@ -0,0 +1 @@
+{% calculate append='skip' %}
diff --git a/merge/x11-misc/compton/.calculate_directory b/merge/x11-misc/compton/.calculate_directory
new file mode 100644
index 0000000..4445068
--- /dev/null
+++ b/merge/x11-misc/compton/.calculate_directory
@@ -0,0 +1 @@
+{% calculate append='skip', package='x11-misc/compton' %}
diff --git a/merge/x11-misc/compton/compton.autostart.desktop b/merge/x11-misc/compton/compton.autostart.desktop
new file mode 100644
index 0000000..8874315
--- /dev/null
+++ b/merge/x11-misc/compton/compton.autostart.desktop
@@ -0,0 +1 @@
+{% calculate path='/etc/xdg/autostart', name='compton.desktop', source='/usr/share/applications/compton.desktop', mirror %}
diff --git a/merge/x11-misc/compton/compton.conf b/merge/x11-misc/compton/compton.conf
new file mode 100644
index 0000000..5001c35
--- /dev/null
+++ b/merge/x11-misc/compton/compton.conf
@@ -0,0 +1,18 @@
+{% calculate comment='#', path='/etc/xdg' %}
+
+shadow = true;
+shadow-radius = 9;
+shadow-offset-x = -7;
+shadow-offset-y = -7;
+shadow-opacity = 0.4;
+shadow-ignore-shaped = true;
+
+backend = "glx";
+mark-wmwin-focused = true;
+mark-ovredir-focused = true;
+detect-rounded-corners = true;
+detect-client-opacity = true;
+refresh-rate = 0;
+vsync = "none";
+dbe = false;
+paint-on-overlay = true;
diff --git a/merge/x11-misc/compton/compton.desktop b/merge/x11-misc/compton/compton.desktop
new file mode 100644
index 0000000..5fa746a
--- /dev/null
+++ b/merge/x11-misc/compton/compton.desktop
@@ -0,0 +1,4 @@
+{% calculate format='kde', path='/usr/share/applications' %}
+
+[Desktop Entry]
+NoDisplay=true
diff --git a/merge/x11-misc/lightdm/.calculate_directory b/merge/x11-misc/lightdm/.calculate_directory
new file mode 100644
index 0000000..87b6218
--- /dev/null
+++ b/merge/x11-misc/lightdm/.calculate_directory
@@ -0,0 +1 @@
+{% calculate path='/etc', name='pam.d', package='x11-misc/lightdm' %}
diff --git a/merge/x11-misc/lightdm/99lightdm b/merge/x11-misc/lightdm/99lightdm
new file mode 100644
index 0000000..ba6faf7
--- /dev/null
+++ b/merge/x11-misc/lightdm/99lightdm
@@ -0,0 +1,5 @@
+{% calculate path='/usr/share/calculate/xdm/logout.d', pkg('sys-apps/calculate-utils[desktop]') %}
+#!/bin/bash
+
+chvt $(ps ax | grep -v root/$DISPLAY | sed -rn 's/^.*lightdm\/root.*vt([0-9]+).*$/\1/p' | awk '{print $1}')
+exit 0
diff --git a/merge/x11-misc/lightdm/99lightdm.remove b/merge/x11-misc/lightdm/99lightdm.remove
new file mode 100644
index 0000000..214de5d
--- /dev/null
+++ b/merge/x11-misc/lightdm/99lightdm.remove
@@ -0,0 +1 @@
+{% calculate append='remove', path='/usr/share/calculate/xdm/logout.d', name='99lightdm', not pkg('sys-apps/calculate-utils[desktop]') %}
diff --git a/merge/x11-misc/lightdm/lightdm b/merge/x11-misc/lightdm/lightdm
new file mode 100644
index 0000000..d0424bf
--- /dev/null
+++ b/merge/x11-misc/lightdm/lightdm
@@ -0,0 +1,14 @@
+{% calculate path='/etc/pam.d', name='lightdm' %}
+#%PAM-1.0
+auth optional pam_env.so
+auth include system-login
+auth required pam_nologin.so
+
+account include system-login
+
+password include system-login
+
+session include system-auth
+{% if pkg('gnome-base/gnome-keyring') and not pkg('mate-base/mate-session-manager') %}
+session optional pam_gnome_keyring.so auto_start
+{% endif %}
diff --git a/merge/x11-misc/lightdm/lightdm-greeter b/merge/x11-misc/lightdm/lightdm-greeter
new file mode 100644
index 0000000..43d184d
--- /dev/null
+++ b/merge/x11-misc/lightdm/lightdm-greeter
@@ -0,0 +1,19 @@
+#%PAM-1.0
+
+# Load environment from /etc/environment and ~/.pam_environment
+auth required pam_env.so
+
+# Always let the greeter start without authentication
+auth required pam_permit.so
+
+# No action required for account management
+account required pam_permit.so
+
+# Can't change password
+password required pam_deny.so
+
+# Setup session
+session required pam_unix.so
+{% if pkg('sys-apps/systemd') %}
+session optional pam_systemd.so
+{% endif %}
diff --git a/merge/x11-misc/lightdm/lightdm.conf b/merge/x11-misc/lightdm/lightdm.conf
new file mode 100644
index 0000000..6d3c2ca
--- /dev/null
+++ b/merge/x11-misc/lightdm/lightdm.conf
@@ -0,0 +1,10 @@
+{% calculate format='kde', path='/etc/lightdm' %}
+
+[SeatDefaults]
+{% if pkg('sys-apps/calculate-utils[desktop]') %}
+session-setup-script=/usr/share/calculate/xdm/xdm --login
+session-cleanup-script=/usr/share/calculate/xdm/xdm --logout
+{% else %}
+!session-setup-script=
+!session-cleanup-script=
+{% endif %}
diff --git a/merge/x11-misc/pcmanfm-qt/.calculate_directory b/merge/x11-misc/pcmanfm-qt/.calculate_directory
new file mode 100644
index 0000000..ad349ab
--- /dev/null
+++ b/merge/x11-misc/pcmanfm-qt/.calculate_directory
@@ -0,0 +1 @@
+{% calculate append='skip', package='x11-misc/pcmanfm-qt' %}
diff --git a/merge/x11-misc/pcmanfm-qt/lxqt-desktop.desktop b/merge/x11-misc/pcmanfm-qt/lxqt-desktop.desktop
new file mode 100644
index 0000000..e9b8287
--- /dev/null
+++ b/merge/x11-misc/pcmanfm-qt/lxqt-desktop.desktop
@@ -0,0 +1,3 @@
+{% calculate format='kde', path='/etc/xdg/autostart' %}
+[Desktop Entry]
+Exec=pcmanfm-qt --desktop
diff --git a/merge/x11-misc/qlipper/.calculate_directory b/merge/x11-misc/qlipper/.calculate_directory
new file mode 100644
index 0000000..bba251c
--- /dev/null
+++ b/merge/x11-misc/qlipper/.calculate_directory
@@ -0,0 +1 @@
+{% calculate append='skip', package='x11-misc/qlipper' %}
diff --git a/merge/x11-misc/qlipper/qlipper.desktop b/merge/x11-misc/qlipper/qlipper.desktop
new file mode 100644
index 0000000..047dc4c
--- /dev/null
+++ b/merge/x11-misc/qlipper/qlipper.desktop
@@ -0,0 +1,3 @@
+{% calculate format='kde', path='/etc/xdg/autostart', name='qlipper.desktop', source='/usr/share/applications/qlipper.desktop', mirror %}
+[Desktop Entry]
+X-LXQt-Need-Tray=true
diff --git a/merge/x11-misc/qt5ct/.calculate_directory b/merge/x11-misc/qt5ct/.calculate_directory
new file mode 100644
index 0000000..d6a1eb1
--- /dev/null
+++ b/merge/x11-misc/qt5ct/.calculate_directory
@@ -0,0 +1 @@
+{% calculate path='/usr/share', name='applications', package='x11-misc/qt5ct' %}
diff --git a/merge/x11-misc/qt5ct/qt5ct.desktop b/merge/x11-misc/qt5ct/qt5ct.desktop
new file mode 100644
index 0000000..42cef99
--- /dev/null
+++ b/merge/x11-misc/qt5ct/qt5ct.desktop
@@ -0,0 +1,9 @@
+{% calculate format='kde' %}
+[Desktop Entry]
+Name=Qt5 Settings
+Exec=qt5ct
+{% if pkg('x11-themes/calculate-icon-theme') >= '15-r8' %}
+Icon=qt5logo
+Categories=Settings;Qt;
+OnlyShowIn=XFCE;MATE;LXQt;
+{% endif %}
diff --git a/merge/x11-misc/sddm/.calculate_directory b/merge/x11-misc/sddm/.calculate_directory
new file mode 100644
index 0000000..3f1b299
--- /dev/null
+++ b/merge/x11-misc/sddm/.calculate_directory
@@ -0,0 +1 @@
+{% calculate path='/etc', name='pam.d', package='x11-misc/sddm' %}
diff --git a/merge/x11-misc/sddm/group b/merge/x11-misc/sddm/group
new file mode 100644
index 0000000..4bc4f7f
--- /dev/null
+++ b/merge/x11-misc/sddm/group
@@ -0,0 +1,11 @@
+{% calculate format='regex', multiline, path='/etc', unbound %}
+^(video:x?:[^:]+:)(.*),sddm(.*)$
+\1\2\3
+^(video:x?:[^:]+:)sddm,(.*)$
+\1\2
+^(video:x?:[^:]+:)sddm$
+\1
+^(video:x?:[^:]+:)(.+)
+\1\2,sddm
+^(video:x?:[^:]+:)$
+\1sddm
diff --git a/merge/x11-misc/sddm/scripts/.calculate_directory b/merge/x11-misc/sddm/scripts/.calculate_directory
new file mode 100644
index 0000000..666e72e
--- /dev/null
+++ b/merge/x11-misc/sddm/scripts/.calculate_directory
@@ -0,0 +1 @@
+{% calculate path='/usr/share/sddm' %}
diff --git a/merge/x11-misc/sddm/scripts/Xlogin b/merge/x11-misc/sddm/scripts/Xlogin
new file mode 100755
index 0000000..33166bd
--- /dev/null
+++ b/merge/x11-misc/sddm/scripts/Xlogin
@@ -0,0 +1,10 @@
+{% calculate chmod='755' %}
+#!/bin/sh
+# Xlogin - run as root before user login
+
+{% if pkg('sys-apps/calculate-utils[desktop]') %}
+VT="vt$(( ${DISPLAY#:} + 7 ))"
+XAUTHORITY=$(ps ax | sed -nr "s/.*usr\/bin\/X.*-auth (\S+).*$VT.*/\1/p")
+export XAUTHORITY
+/usr/share/calculate/xdm/xdm --login
+{% endif %}
diff --git a/merge/x11-misc/sddm/scripts/Xlogout b/merge/x11-misc/sddm/scripts/Xlogout
new file mode 100755
index 0000000..d69c08a
--- /dev/null
+++ b/merge/x11-misc/sddm/scripts/Xlogout
@@ -0,0 +1,10 @@
+{% calculate chmod='755' %}
+#!/bin/sh
+# Xlogout - run as root after user logout
+
+{% if pkg('sys-apps/calculate-utils[desktop]') %}
+VT="vt$(( ${DISPLAY#:} + 7 ))"
+XAUTHORITY=$(ps ax | sed -nr "s/.*usr\/bin\/X.*-auth (\S+).*$VT.*/\1/p")
+export XAUTHORITY
+/usr/share/calculate/xdm/xdm --logout
+{% endif %}
diff --git a/merge/x11-misc/sddm/scripts/Xstop b/merge/x11-misc/sddm/scripts/Xstop
new file mode 100755
index 0000000..c3fb214
--- /dev/null
+++ b/merge/x11-misc/sddm/scripts/Xstop
@@ -0,0 +1,8 @@
+{% calculate chmod='755' %}
+#!/bin/sh
+# Xstop - run as root after stopping X
+
+if ! pgrep -f /usr/bin/X
+then
+ [[ -x /usr/sbin/logout ]] && /usr/sbin/logout
+fi
diff --git a/merge/x11-misc/sddm/sddm b/merge/x11-misc/sddm/sddm
new file mode 100644
index 0000000..5f166e6
--- /dev/null
+++ b/merge/x11-misc/sddm/sddm
@@ -0,0 +1,4 @@
+{% calculate format='regex' %}
+session\s+optional\s+pam_keyinit.so\s+force\s+revoke\s*
+
+
diff --git a/merge/x11-misc/sddm/sddm-greeter b/merge/x11-misc/sddm/sddm-greeter
new file mode 100644
index 0000000..63410ce
--- /dev/null
+++ b/merge/x11-misc/sddm/sddm-greeter
@@ -0,0 +1,22 @@
+#%PAM-1.0
+
+# Load environment from /etc/environment and ~/.pam_environment
+auth required pam_env.so
+
+# Always let the greeter start without authentication
+auth required pam_permit.so
+
+# No action required for account management
+account required pam_permit.so
+
+# Can't change password
+password required pam_deny.so
+
+# Setup session
+session required pam_unix.so
+{% if pkg('sys-apps/systemd') %}
+session optional pam_systemd.so
+{% endif %}
+{% if pkg('sys-auth/elogind') %}
+session optional pam_elogind.so
+{% endif %}
diff --git a/merge/x11-misc/snixembed/.calculate_directory b/merge/x11-misc/snixembed/.calculate_directory
new file mode 100644
index 0000000..6f1ebe0
--- /dev/null
+++ b/merge/x11-misc/snixembed/.calculate_directory
@@ -0,0 +1 @@
+{% calculate path='/etc/xdg', name='autostart', package='x11-misc/snixembed' %}
diff --git a/merge/x11-misc/snixembed/snixembed.desktop b/merge/x11-misc/snixembed/snixembed.desktop
new file mode 100644
index 0000000..13bfcdf
--- /dev/null
+++ b/merge/x11-misc/snixembed/snixembed.desktop
@@ -0,0 +1,5 @@
+[Desktop Entry]
+Type=Application
+Name=StatusNotifierItems as XEmbedded
+Exec=snixembed
+NoDisplay=true
diff --git a/merge/x11-misc/xkeyboard-config/.calculate_directory b/merge/x11-misc/xkeyboard-config/.calculate_directory
new file mode 100644
index 0000000..ce6b931
--- /dev/null
+++ b/merge/x11-misc/xkeyboard-config/.calculate_directory
@@ -0,0 +1 @@
+{% calculate append='skip', package='x11-misc/xkeyboard-config' %}
diff --git a/merge/x11-misc/xkeyboard-config/xfree86 b/merge/x11-misc/xkeyboard-config/xfree86
new file mode 100644
index 0000000..cc6e74a
--- /dev/null
+++ b/merge/x11-misc/xkeyboard-config/xfree86
@@ -0,0 +1,9 @@
+{% calculate format='regex', path='/usr/share/X11/xkb/compat' %}
+\s*interpret\s+XF86_Ungrab\s+{
+\s*action = Private\([^)]+\);
+\s*};
+
+interpret\s+XF86_ClearGrab\s+{
+\s*action = Private\([^)]+\);
+\s*};
+