commit 35fead0d0b3b2ce4772ce703807419001edda200
Author: davedatum <ask@davedatum.com>
Date:   Mon Oct 28 13:48:02 2019 +0000

    Initial commit

diff --git a/branding/tromjaro/branding.desc b/branding/tromjaro/branding.desc
new file mode 100644
index 0000000..60ab9f1
--- /dev/null
+++ b/branding/tromjaro/branding.desc
@@ -0,0 +1,87 @@
+---
+componentName:  tromjaro
+
+# This selects between different welcome texts. When false, uses
+# the traditional "Welcome to the %1 installer.", and when true,
+# uses "Welcome to the Calamares installer for %1." This allows
+# to distinguish this installer from other installers for the
+# same distribution.
+welcomeStyleCalamares:   false
+
+# Should the welcome image (productWelcome, below) be scaled
+# up beyond its natural size? If false, the image does not grow
+# with the window but remains the same size throughout (this
+# may have surprising effects on HiDPI monitors).
+welcomeExpandingLogo:   true
+
+# Size and expansion policy for Calamares.
+#  - "normal" or unset, expand as needed, use *windowSize*
+#  - "fullscreen", start as large as possible, ignore *windowSize*
+#  - "noexpand", never expand, use *windowSize*
+windowExpanding:    noexpand
+
+# Size of Calamares window, expressed as w,h. Both w and h
+# may be either pixels (suffix px) or font-units (suffix em).
+#   e.g.    "800px,600px"
+#           "60em,480px"
+# This setting is ignored if "fullscreen" is selected for
+# *windowExpanding*, above. If not set, use constants defined
+# in CalamaresUtilsGui, 800x520.
+windowSize: 800px,520px
+
+# These are strings shown to the user in the user interface.
+# There is no provision for translating them -- since they
+# are names, the string is included as-is.
+#
+# The four Url strings are the Urls used by the buttons in
+# the welcome screen, and are not shown to the user. Clicking
+# on the "Support" button, for instance, opens the link supportUrl.
+# If a Url is empty, the corresponding button is not shown.
+#
+# bootloaderEntryName is how this installation / distro is named
+# in the boot loader (e.g. in the GRUB menu).
+strings:
+    productName:         TROMjaro Linux
+    shortProductName:    TROMjaro
+    version:             18.0
+    shortVersion:        18.0
+    versionedName:       TROMjaro Linux 18.0 "Illyria"
+    shortVersionedName:  TROMjaro 18.0
+    bootloaderEntryName: TROMjaro
+
+# These images are loaded from the branding module directory.
+#
+# productIcon is used as the window icon, and will (usually) be used
+#       by the window manager to represent the application. This image
+#       should be square, and may be displayed by the window manager
+#       as small as 16x16 (but possibly larger).
+# productLogo is used as the logo at the top of the left-hand column
+#       which shows the steps to be taken. The image should be square,
+#       and is displayed at 80x80 pixels (also on HiDPI).
+# productWelcome is shown on the welcome page of the application in
+#       the middle of the window, below the welcome text. It can be
+#       any size and proportion, and will be scaled to fit inside
+#       the window. Use `welcomeExpandingLogo` to make it non-scaled.
+#       Recommended size is 320x150.
+images:
+    productLogo:         "logo.png"
+    productIcon:         "logo.png"
+    productWelcome:      "languages.png"
+
+# The slideshow is displayed during execution steps (e.g. when the
+# installer is actually writing to disk and doing other slow things).
+slideshow:               "show.qml"
+
+# Colors for text and background components.
+#
+#  - sidebarBackground is the background of the sidebar
+#  - sidebarText is the (foreground) text color
+#  - sidebarTextHighlight sets the background of the selected (current) step.
+#    Optional, and defaults to the application palette.
+#  - sidebarSelect is the text color of the selected step.
+#
+style:
+   sidebarBackground:    "#454948"
+   sidebarText:          "#efefef"
+   sidebarTextSelect:    "#4d915e"
+   sidebarTextHighlight: "#1a1c1b"
diff --git a/branding/tromjaro/languages.png b/branding/tromjaro/languages.png
new file mode 100644
index 0000000..6ad1f50
Binary files /dev/null and b/branding/tromjaro/languages.png differ
diff --git a/branding/tromjaro/logo.png b/branding/tromjaro/logo.png
new file mode 100644
index 0000000..60be8a3
Binary files /dev/null and b/branding/tromjaro/logo.png differ
diff --git a/branding/tromjaro/show.qml b/branding/tromjaro/show.qml
new file mode 100644
index 0000000..634424c
--- /dev/null
+++ b/branding/tromjaro/show.qml
@@ -0,0 +1,131 @@
+/* === This file is part of Calamares - <http://github.com/calamares> ===
+ *
+ *   Copyright 2015, Teo Mrnjavac <teo@kde.org>
+ *
+ *   Calamares is free software: you can redistribute it and/or modify
+ *   it under the terms of the GNU General Public License as published by
+ *   the Free Software Foundation, either version 3 of the License, or
+ *   (at your option) any later version.
+ *
+ *   Calamares is distributed in the hope that it will be useful,
+ *   but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ *   GNU General Public License for more details.
+ *
+ *   You should have received a copy of the GNU General Public License
+ *   along with Calamares. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+/*
+ * Slides images dimensions are 800x440px.
+ */
+
+import QtQuick 2.0;
+import calamares.slideshow 1.0;
+
+Presentation
+{
+    id: presentation
+
+    Timer {
+        interval: 20000
+        running: true
+        repeat: true
+        onTriggered: presentation.goToNextSlide()
+    }
+    
+    Slide {
+
+        Image {
+            id: background1
+            source: "slide1.png"
+            width: 800; height: 440
+            fillMode: Image.PreserveAspectFit
+            anchors.centerIn: parent
+        }
+        Text {
+            anchors.horizontalCenter: background1.horizontalCenter
+            anchors.top: background1.bottom
+            text: ""
+            wrapMode: Text.WordWrap
+            width: 800
+            horizontalAlignment: Text.Center
+        }
+    }
+
+    Slide {
+
+        Image {
+            id: background2
+            source: "slide2.png"
+            width: 800; height: 440
+            fillMode: Image.PreserveAspectFit
+            anchors.centerIn: parent
+        }
+        Text {
+            anchors.horizontalCenter: background2.horizontalCenter
+            anchors.top: background2.bottom
+            text: ""
+            wrapMode: Text.WordWrap
+            width: 800
+            horizontalAlignment: Text.Center
+        }
+    }
+
+    Slide {
+
+        Image {
+            id: background3
+            source: "slide3.png"
+            width: 800; height: 440
+            fillMode: Image.PreserveAspectFit
+            anchors.centerIn: parent
+        }
+        Text {
+            anchors.horizontalCenter: background3.horizontalCenter
+            anchors.top: background3.bottom
+            text: ""
+            wrapMode: Text.WordWrap
+            width: 800
+            horizontalAlignment: Text.Center
+        }
+    }
+
+    Slide {
+
+        Image {
+            id: background4
+            source: "slide4.png"
+            width: 800; height: 440
+            fillMode: Image.PreserveAspectFit
+            anchors.centerIn: parent
+        }
+        Text {
+            anchors.horizontalCenter: background4.horizontalCenter
+            anchors.top: background4.bottom
+            text: ""
+            wrapMode: Text.WordWrap
+            width: 800
+            horizontalAlignment: Text.Center
+        }
+    }
+
+    Slide {
+
+        Image {
+            id: background5
+            source: "slide5.png"
+            width: 800; height: 440
+            fillMode: Image.PreserveAspectFit
+            anchors.centerIn: parent
+        }
+        Text {
+            anchors.horizontalCenter: background5.horizontalCenter
+            anchors.top: background5.bottom
+            text: ""
+            wrapMode: Text.WordWrap
+            width: 800
+            horizontalAlignment: Text.Center
+        }
+    }
+}
diff --git a/branding/tromjaro/slide1.png b/branding/tromjaro/slide1.png
new file mode 100644
index 0000000..94f13a0
Binary files /dev/null and b/branding/tromjaro/slide1.png differ
diff --git a/branding/tromjaro/slide2.png b/branding/tromjaro/slide2.png
new file mode 100644
index 0000000..54a64b3
Binary files /dev/null and b/branding/tromjaro/slide2.png differ
diff --git a/branding/tromjaro/slide3.png b/branding/tromjaro/slide3.png
new file mode 100644
index 0000000..a320451
Binary files /dev/null and b/branding/tromjaro/slide3.png differ
diff --git a/branding/tromjaro/slide4.png b/branding/tromjaro/slide4.png
new file mode 100644
index 0000000..89ab708
Binary files /dev/null and b/branding/tromjaro/slide4.png differ
diff --git a/branding/tromjaro/slide5.png b/branding/tromjaro/slide5.png
new file mode 100644
index 0000000..004f234
Binary files /dev/null and b/branding/tromjaro/slide5.png differ
diff --git a/branding/tromjaro/squid.png b/branding/tromjaro/squid.png
new file mode 100644
index 0000000..452e445
Binary files /dev/null and b/branding/tromjaro/squid.png differ
diff --git a/modules/bootloader.conf b/modules/bootloader.conf
new file mode 100644
index 0000000..51337de
--- /dev/null
+++ b/modules/bootloader.conf
@@ -0,0 +1,54 @@
+# Bootloader configuration. The bootloader is installed to allow
+# the system to start (and pick one of the installed operating
+# systems to run).
+---
+# Define which bootloader you want to use for EFI installations
+# Possible options are 'grub', 'sb-shim' and 'systemd-boot'.
+efiBootLoader: "grub"
+
+# systemd-boot configuration files settings, set kernel and initramfs file names
+# and amount of time before default selection boots
+kernel: "_ALL_kver_"
+img: "_default_image_"
+fallback: "_fallback_image_"
+timeout: "10"
+
+# Optionally set the menu entry name and kernel name to use in systemd-boot.
+# If not specified here, these settings will be taken from branding.desc.
+#
+# bootloaderEntryName: "Manjaro"
+kernelLine: ", with _manjaro_kernel_"
+fallbackKernelLine: ", with _manjaro_kernel_ (fallback initramfs)"
+
+# GRUB 2 binary names and boot directory
+# Some distributions (e.g. Fedora) use grub2-* (resp. /boot/grub2/) names.
+# These names are also used when using sb-shim, since that needs some
+# GRUB functionality (notably grub-probe) to work. As needed, you may use
+# complete paths like `/usr/bin/efibootmgr` for the executables.
+#
+grubInstall: "grub-install"
+grubMkconfig: "grub-mkconfig"
+grubCfg: "/boot/grub/grub.cfg"
+grubProbe: "grub-probe"
+efiBootMgr: "efibootmgr"
+
+# Optionally set the bootloader ID to use for EFI. This is passed to
+# grub-install --bootloader-id.
+#
+# If not set here, the value from bootloaderEntryName from branding.desc
+# is used, with problematic characters (space and slash) replaced.
+#
+# The ID is also used as a directory name within the EFI environment,
+# and the bootloader is copied from /boot/efi/EFI/<dirname>/ . When
+# setting the option here, keep in mind that the name is sanitized
+# (problematic characters, see above, are replaced).
+#
+# efiBootloaderId: "dirname"
+
+# Optionally install a copy of the GRUB EFI bootloader as the EFI
+# fallback loader (either bootia32.efi or bootx64.efi depending on
+# the system). This may be needed on certain systems (Intel DH87MC
+# seems to be the only one). If you set this to false, take care
+# to add another module to optionally install the fallback on those
+# boards that need it.
+installEFIFallback: true
diff --git a/modules/chrootcfg.conf b/modules/chrootcfg.conf
new file mode 100644
index 0000000..1f900c2
--- /dev/null
+++ b/modules/chrootcfg.conf
@@ -0,0 +1,14 @@
+---
+requirements:
+    - name: /etc
+      mode: "0o755"
+    - name: /var/cache/pacman/pkg
+      mode: "0o755"
+    - name: /var/lib/pacman
+      mode: "0o755"
+
+isRank: true
+
+keyrings:
+    - archlinux
+    - manjaro
diff --git a/modules/contextualprocess.conf b/modules/contextualprocess.conf
new file mode 100644
index 0000000..74bd230
--- /dev/null
+++ b/modules/contextualprocess.conf
@@ -0,0 +1,46 @@
+# Configuration for the contextual process job.
+#
+# Contextual processes are based on **global** configuration values.
+# When a given global value (string) equals a given value, then
+# the associated command is executed.
+#
+# The special top-level keys *dontChroot* and *timeout* have
+# meaning just like in shellprocess.conf. They are excluded from
+# the comparison with global variables.
+#
+# Configuration consists of keys for global variable names (except
+# *dontChroot* and *timeout*), and the sub-keys are strings to compare
+# to the variable's value. If the variable has that particular value, the
+# corresponding value (script) is executed.
+#
+# You can check for an empty value with "".
+#
+# As a special case, the value-check "*" matches any value, but **only**
+# if no other value-check matches. Use it as an *else* form for value-
+# checks. Take care to put the asterisk in quotes. The value-check "*"
+# **also** matches a literal asterisk as value; a confusing corner case
+# is checking for an asterisk **and** having a wildcard match with
+# different commands. This is currently not possible.
+#
+# Global configuration variables are not checked in a deterministic
+# order, so do not rely on commands from one variable-check to
+# always happen before (or after) checks on another
+# variable. Similarly, the value-equality checks are not
+# done in a deterministic order, but all of the value-checks
+# for a given variable happen together. As a special case, the
+# value-check for "*" (the *else* case) happens after all of the
+# other value-checks, and only matches if none of the others do.
+#
+# The values after a value sub-keys are the same kinds of values
+# as can be given to the *script* key in the shellprocess module.
+# See shellprocess.conf for documentation on valid values.
+---
+dontChroot: false
+firmwareType:
+    efi:
+        -   "-pkg remove efi-firmware"
+        -   command: "-mkinitramfsrd -abgn"
+            timeout: 120  # This is slow
+    bios:   "-pkg remove bios-firmware"
+    "":     "/bin/false no-firmware-type-set"
+    "*":    "/bin/false some-other-firmware-value"
diff --git a/modules/displaymanager.conf b/modules/displaymanager.conf
new file mode 100644
index 0000000..f6b5a39
--- /dev/null
+++ b/modules/displaymanager.conf
@@ -0,0 +1,58 @@
+# Configure one or more display managers (e.g. SDDM)
+# with a "best effort" approach.
+#
+# This module also sets up autologin, if the feature is enabled in
+# globalstorage (where it would come from the users page).
+---
+# The DM module attempts to set up all the DMs found in this list, in the
+# precise order listed. The displaymanagers list can also be set in
+# globalstorage, and in that case it overrides the setting here.
+#
+# If *sysconfigSetup* is set to *true* (see below, only relevant for
+# openSUSE derivatives) then this list is ignored and only sysconfig
+# is attempted. You can also list "sysconfig" in this list instead.
+#
+displaymanagers:
+  - slim
+  - sddm
+  - lightdm
+  - gdm
+  - mdm
+  - lxdm
+  - kdm
+
+# Enable the following settings to force a desktop environment
+# in your displaymanager configuration file. This will attempt
+# to configure the given DE (without checking if it is installed).
+# The DM configuration for each potential DM may **or may not**
+# support configuring a default DE, so the keys are mandatory
+# but their interpretation is up to the DM configuration.
+#
+# Subkeys of *defaultDesktopEnvironment* are (all mandatory):
+#  - *executable* a full path to an executable
+#  - *desktopFile* a .desktop filename
+#
+# If this is **not** set, then Calamares will look for installed
+# DE's and pick the first one it finds that is actually installed.
+#
+# If this **is** set, and the *executable* key doesn't point to
+# an installed file, then the .desktop file's TryExec key is
+# used instead.
+#
+
+#defaultDesktopEnvironment:
+#    executable: "startkde"
+#    desktopFile: "plasma"
+
+#If true, try to ensure that the user, group, /var directory etc. for the
+#display manager are set up correctly. This is normally done by the distribution
+#packages, and best left to them. Therefore, it is disabled by default.
+basicSetup: false
+
+# If true, setup autologin for openSUSE. This only makes sense on openSUSE
+# derivatives or other systems where /etc/sysconfig/displaymanager exists.
+#
+# The preferred way to pick sysconfig is to just list it in the
+# *displaymanagers* list (as the only one).
+#
+sysconfigSetup: false
diff --git a/modules/finished.conf b/modules/finished.conf
new file mode 100644
index 0000000..3b6dd9d
--- /dev/null
+++ b/modules/finished.conf
@@ -0,0 +1,44 @@
+# Configuration for the "finished" page, which is usually shown only at
+# the end of the installation (successful or not).
+---
+# DEPRECATED
+#
+# The finished page can hold a "restart system now" checkbox.
+# If this is false, no checkbox is shown and the system is not restarted
+# when Calamares exits.
+# restartNowEnabled: true
+
+# DEPRECATED
+#
+# Initial state of the checkbox "restart now". Only relevant when the
+# checkbox is shown by restartNowEnabled.
+# restartNowChecked: false
+
+# Behavior of the "restart system now" button.
+#
+# There are four usable values:
+#   - never
+#       Does not show the button and does not restart.
+#       This matches the old behavior with restartNowEnabled=false.
+#   - user-unchecked
+#       Shows the button, defaults to unchecked, restarts if it is checked.
+#       This matches the old behavior with restartNowEnabled=true and restartNowChecked=false.
+#   - user-checked
+#       Shows the button, defaults to checked, restarts if it is checked.
+#       This matches the old behavior with restartNowEnabled=true and restartNowChecked=true.
+#   - always
+#       Shows the button, checked, but the user cannot change it.
+#       This is new behavior.
+#
+# The three combinations of legacy values are still supported.
+restartNowMode: user-unchecked
+
+# If the checkbox is shown, and the checkbox is checked, then when
+# Calamares exits from the finished-page it will run this command.
+# If not set, falls back to "shutdown -r now".
+restartNowCommand: "systemctl -i reboot"
+
+# When the last page is (successfully) reached, send a DBus notification
+# to the desktop that the installation is done. This works only if the
+# user as whom Calamares is run, can reach the regular desktop session bus.
+notifyOnFinished: false
diff --git a/modules/fsresizer.conf b/modules/fsresizer.conf
new file mode 100644
index 0000000..3332924
--- /dev/null
+++ b/modules/fsresizer.conf
@@ -0,0 +1,49 @@
+# Module that resizes a single FS to fill the entire (rest) of
+# a device. This is used in OEM situations where an image is
+# flashed onto an SD card (or similar) and used to boot a device,
+# after which the FS should expand to fill the SD card.
+#
+# Example: a distro produces a 6GiB large image that is
+# written to an 8GiB SD card; the FS should expand to take
+# advantage of the unused 2GiB. The FS should expand much
+# more if the same image is written to a 16GiB card.
+---
+
+# Which FS needs to be grown? Choose one way to identify it:
+#  - *fs* names a mount point which should already be mounted
+#    in the system.
+#  - *dev* names a device
+fs: /
+# dev: /dev/mmcblk0p1
+
+# How much of the total remaining space should the FS use?
+# The only sensible amount is "all of it". The value is
+# in percent, so set it to 100. Perhaps a fixed size is
+# needed (that would be weird though, since you don't know
+# how big the card is), use MiB as suffix in that case.
+# If missing, then it's assumed to be 0, and no resizing
+# will happen.
+#
+# Percentages apply to **available space**.
+size: 100%
+
+# Resizing might not be worth it, though. Set the minimum
+# that it must grow; if it cannot grow that much, the
+# resizing is skipped. Can be in percentage or absolute
+# size, as above. If missing, then it's assumed to be 0,
+# which means resizing is always worthwhile.
+#
+# If *atleast* is not zero, then the setting *required*,
+# below, becomes relevant.
+#
+# Percentages apply to **total device size**.
+#atleast: 1000MiB
+
+# When *atleast* is not zero, then the resize may be
+# recommended (the default) or **required**. If the
+# resize is required and cannot be carried out (because
+# there's not enough space), then that is a fatal
+# error for the installer. By default, resize is only
+# recommended and it is not an error for no resize to be
+# carried out.
+required: false
diff --git a/modules/fstab.conf b/modules/fstab.conf
new file mode 100644
index 0000000..b2f3de3
--- /dev/null
+++ b/modules/fstab.conf
@@ -0,0 +1,33 @@
+# Creates /etc/fstab and /etc/crypttab in the target system.
+# Also creates mount points for all the filesystems.
+#
+# When creating fstab entries for a filesystem, this module
+# uses the options for the filesystem type to write to the
+# options field of the file.
+---
+# Mount options to use for all filesystems. If a specific filesystem
+# is listed here, use those options, otherwise use the *default*
+# options from this mapping.
+mountOptions:
+    default: defaults,noatime
+    btrfs: defaults,noatime,space_cache,autodefrag
+
+# Mount options to use for the EFI System Partition. If not defined, the
+# *mountOptions* for *vfat* are used, or if that is not set either,
+# *default* from *mountOptions*.
+efiMountOptions: umask=0077
+
+# If a filesystem is on an SSD, add the following options. If a specific
+# filesystem is listed here, use those options, otherwise no additional
+# options are set (i.e. there is no *default* like in *mountOptions*).
+ssdExtraMountOptions:
+    ext4: discard
+    jfs: discard
+    xfs: discard
+    swap: discard
+    btrfs: discard,compress=lzo
+
+# Additional options added to each line in /etc/crypttab
+crypttabOptions: luks
+# For Debian and Debian-based distributions, change the above line to:
+# crypttabOptions: luks,keyscript=/bin/cat
diff --git a/modules/grubcfg.conf b/modules/grubcfg.conf
new file mode 100644
index 0000000..b354ec3
--- /dev/null
+++ b/modules/grubcfg.conf
@@ -0,0 +1,25 @@
+# Write lines to /etc/default/grub (in the target system) based
+# on calculated values and the values set in the *defaults* key
+# in this configuration file.
+#
+# Calculated values are:
+#   - GRUB_DISTRIBUTOR,   branding module, *bootloaderEntryName*
+#   - GRUB_ENABLE_CRYPTODISK, based on the presence of filesystems
+#     that use LUKS
+#   - GRUB_CMDLINE_LINUX_DEFAULT, adding LUKS setup and plymouth
+#     support to the kernel.
+
+---
+# If set to true, always creates /etc/default/grub from scratch even if the file
+# already existed. If set to false, edits the existing file instead.
+overwrite: false
+
+# Default entries to write to /etc/default/grub if it does not exist yet or if
+# we are overwriting it.
+#
+defaults:
+    GRUB_TIMEOUT: 5
+    GRUB_DEFAULT: "saved"
+    GRUB_DISABLE_SUBMENU: true
+    GRUB_TERMINAL_OUTPUT: "console"
+    GRUB_DISABLE_RECOVERY: true
diff --git a/modules/initcpio.conf b/modules/initcpio.conf
new file mode 100644
index 0000000..517e483
--- /dev/null
+++ b/modules/initcpio.conf
@@ -0,0 +1,22 @@
+# Run mkinitcpio(8) with the given preset value
+---
+# This key defines the kernel to be loaded.
+# It can have the following values:
+#  - empty or unset, interpreted as "all"
+#  - the literal string "$uname" (without quotes, with dollar),
+#    which will use the output of `uname -r` to determine the
+#    running kernel, and use that.
+#  - any other string.
+#
+# Whatever is set, that string is passed as *preset* argument to the
+# `-p` option of *mkinitcpio*. Take care that both "$uname" operates
+# in the host system, and might not be correct if the target system is
+# updated (to a newer kernel) as part of the installation.
+#
+# Note that "all" is probably not a good preset to use either.
+kernel: linux312
+
+# Set this to true to turn off mitigations for lax file
+# permissions on initramfs (which, in turn, can compromise
+# your LUKS encryption keys, CVS-2019-13179).
+be_unsafe: false
diff --git a/modules/keyboard.conf b/modules/keyboard.conf
new file mode 100644
index 0000000..ee97c39
--- /dev/null
+++ b/modules/keyboard.conf
@@ -0,0 +1,16 @@
+# NOTE: you must have ckbcomp installed and runnable
+#       on the live system, for keyboard layout previews.
+---
+# The name of the file to write X11 keyboard settings to
+# The default value is the name used by upstream systemd-localed.
+# Relative paths are assumed to be relative to /etc/X11/xorg.conf.d
+xOrgConfFileName: "/etc/X11/xorg.conf.d/00-keyboard.conf"
+
+# The path to search for keymaps converted from X11 to kbd format
+# Leave this empty if the setting does not make sense on your distribution.
+convertedKeymapPath: "/lib/kbd/keymaps/xkb"
+
+# Write keymap configuration to /etc/default/keyboard, usually
+# found on Debian-related systems.
+# Defaults to true if nothing is set.
+#writeEtcDefaultKeyboard:   true
diff --git a/modules/license.conf b/modules/license.conf
new file mode 100644
index 0000000..9057f8a
--- /dev/null
+++ b/modules/license.conf
@@ -0,0 +1,45 @@
+# Configuration file for License viewmodule, Calamares
+# Syntax is YAML 1.2
+---
+# Define a list of licenses which may / must be accepted before continuing.
+#
+# Each entry in this list has the following keys:
+#   - id        Entry identifier, must be unique. Not user visible. YAML: string.
+#   - name      Pretty name for the software product, user visible and untranslatable. YAML: string.
+#   - vendor    Pretty name for the software vendor, user visible and untranslatable. YAML: string, optional, default is empty.
+#   - type      Package type identifier for presentation, not user visible but affects user visible strings. YAML: string.
+#               values: driver, gpudriver, browserplugin, codec, package, software; optional, default is software.
+#   - required  If set to true, the user cannot proceed without accepting this license. YAML: boolean, optional, default is false.
+#   - url       A URL for the license; a remote URL is not shown in Calamares, but a link
+#               to the URL is provided, which opens in the default web browser. A local
+#               URL (i.e. file:///) assumes that the contents are HTML or plain text, and
+#               displays the license in-line. YAML: string, mandatory.
+entries:
+- id:       nvidia
+  name:     Nvidia
+  vendor:   Nvidia Corporation
+  type:     driver
+  url:      http://developer.download.nvidia.com/cg/Cg_3.0/license.pdf
+  required: false
+- id:       amd
+  name:     Catalyst
+  vendor:   "Advanced Micro Devices, Inc."
+  type:     gpudriver
+  url:      http://support.amd.com/en-us/download/eula
+  required: false
+- id:       flashplugin
+  name:     Adobe Flash
+  vendor:   Adobe Systems Incorporated
+  type:     browserplugin
+  url:      http://www.adobe.com/products/eulas/pdfs/PlatformClients_PC_WWEULA_Combined_20100108_1657.pdf
+  required: true
+# This example uses a file: link. This example uses a relative link, which
+# is relative to where you run Calamares. Assuming you run it from build/
+# as part of your testing, you'll get the LICENSE text for Calamares
+# (which is the text of the GPLv3, not proprietary at all).
+- id:   mine_mine
+  name: Calamares Proprietary License
+  vendor: Calamares, Inc.
+  type: software
+  required: true
+  url: file:../LICENSE
diff --git a/modules/locale.conf b/modules/locale.conf
new file mode 100644
index 0000000..4beb4fe
--- /dev/null
+++ b/modules/locale.conf
@@ -0,0 +1,97 @@
+---
+# This settings are used to set your default system time zone.
+# Time zones are usually located under /usr/share/zoneinfo and
+# provided by the 'tzdata' package of your Distribution.
+#
+# Distributions using systemd can list available
+# time zones by using the timedatectl command.
+#    timedatectl list-timezones
+#
+# The starting timezone (e.g. the pin-on-the-map) when entering
+# the locale page can be set through keys *region* and *zone*.
+# If either is not set, defaults to America/New_York.
+#
+region:                     "America"
+zone:                       "New_York"
+
+
+# System locales are detected in the following order:
+#
+#  - /usr/share/i18n/SUPPORTED
+#  - localeGenPath (defaults to /etc/locale.gen if not set)
+#  - 'locale -a' output
+#
+# Enable only when your Distribution is using an
+# custom path for locale.gen
+#
+#localeGenPath:             "PATH_TO/locale.gen"
+
+# GeoIP based Language settings: Leave commented out to disable GeoIP.
+#
+# GeoIP needs a working Internet connection.
+# This can be managed from `welcome.conf` by adding
+# internet to the list of required conditions.
+#
+# The configuration
+# is in three parts: a *style*, which can be "json" or "xml"
+# depending on the kind of data returned by the service, and
+# a *url* where the data is retrieved, and an optional *selector*
+# to pick the right field out of the returned data (e.g. field
+# name in JSON or element name in XML).
+#
+# The default selector (when the setting is blank) is picked to
+# work with existing JSON providers (which use "time_zone") and
+# Ubiquity's XML providers (which use "TimeZone").
+#
+# If the service configured via *url* uses
+# a different attribute name (e.g. "timezone") in JSON or a
+# different element tag (e.g. "<Time_Zone>") in XML, set this
+# string to the name or tag to be used.
+#
+# In JSON:
+#  - if the string contains "." characters, this is used as a
+#    multi-level selector, e.g. "a.b" will select the timezone
+#    from data "{a: {b: "Europe/Amsterdam" } }".
+#  - each part of the string split by "." characters is used as
+#    a key into the JSON data.
+# In XML:
+#  - all elements with the named tag (e.g. all TimeZone) elements
+#    from the document are checked; the first one with non-empty
+#    text value is used.
+#
+#
+# An HTTP(S) request is made to *url*. The request should return
+# valid data in a suitable format, depending on *style*;
+# generally this includes a string value with the timezone
+# in <region>/<zone> format. For services that return data which
+# does not follow the conventions of "suitable data" described
+# below, *selector* may be used to pick different data.
+#
+# Note that this example URL works, but the service is shutting
+# down in June 2018.
+#
+# Suitable JSON data looks like
+# ```
+#    {"time_zone":"America/New_York"}
+# ```
+# Suitable XML data looks like
+# ```
+#    <Response><TimeZone>Europe/Brussels</TimeZone></Response>
+# ```
+#
+# To accommodate providers of GeoIP timezone data with peculiar timezone
+# naming conventions, the following cleanups are performed automatically:
+#  - backslashes are removed
+#  - spaces are replaced with _
+#
+# Legacy settings "geoipStyle", "geoipUrl" and "geoipSelector"
+# in the top-level are still supported, but I'd advise against.
+#
+# To disable GeoIP checking, either comment-out the entire geoip section,
+# or set the *style* key to an unsupported format (e.g. `none`).
+# Also, note the analogous feature in src/modules/welcome/welcome.conf.
+#
+geoip:
+    style:    "json"
+    url:      "https://geoip.kde.org/v1/calamares"
+    selector: ""  # leave blank for the default
diff --git a/modules/luksopenswaphookcfg.conf b/modules/luksopenswaphookcfg.conf
new file mode 100644
index 0000000..f5610cd
--- /dev/null
+++ b/modules/luksopenswaphookcfg.conf
@@ -0,0 +1,4 @@
+# Writes an openswap configuration with LUKS settings to the given path
+---
+# Path of the configuration file to write (in the target system)
+configFilePath: /etc/openswap.conf
diff --git a/modules/machineid.conf b/modules/machineid.conf
new file mode 100644
index 0000000..97bd10a
--- /dev/null
+++ b/modules/machineid.conf
@@ -0,0 +1,24 @@
+# Machine-ID and other random data on the target system.
+#
+# This module can create a number of "random" things on the target:
+#  - a systemd machine-id file (hence the name of the Calamares module)
+#    with a random UUID.
+#  - a dbus machine-id file (or, optionally, link to the one from systemd)
+#  - an entropy file
+#
+---
+# Whether to create /etc/machine-id for systemd.
+systemd: true
+
+# Whether to create /var/lib/dbus/machine-id for D-Bus.
+dbus: true
+# Whether /var/lib/dbus/machine-id should be a symlink to /etc/machine-id
+# (ignored if dbus is false, or if there is no /etc/machine-id to point to).
+dbus-symlink: true
+# this is a deprecated form of *dbus-symlink*
+symlink: true
+
+# Whether to create an entropy file
+entropy: false
+# Whether to copy entropy from the host
+entropy-copy: false
diff --git a/modules/mhwdcfg.conf b/modules/mhwdcfg.conf
new file mode 100644
index 0000000..1233ab9
--- /dev/null
+++ b/modules/mhwdcfg.conf
@@ -0,0 +1,19 @@
+---
+bus:
+    - pci
+#    - usb
+
+identifier:
+    net:
+      - 200
+      - 280
+    video:
+      - 300
+      - 302
+      - 380
+
+driver: free
+
+local: true
+
+repo: /opt/mhwd/pacman-mhwd.conf
diff --git a/modules/mount.conf b/modules/mount.conf
new file mode 100644
index 0000000..bb28eed
--- /dev/null
+++ b/modules/mount.conf
@@ -0,0 +1,36 @@
+# Mount filesystems in the target (generally, before treating the
+# target as a usable chroot / "live" system). Filesystems are
+# automatically mounted from the partitioning module. Filesystems
+# listed here are **extra**. The filesystems listed in *extraMounts*
+# are mounted in all target systems. The filesystems listed in
+# *extraMountsEfi* are mounted in the target system **only** if
+# the host machine uses UEFI.
+---
+# Extra filesystems to mount. The key's value is a list of entries; each
+# entry has four keys:
+#   - device    The device node to mount
+#   - fs        The filesystem type to use
+#   - mountPoint Where to mount the filesystem
+#   - options (optional) Extra options to pass to mount(8)
+#
+extraMounts:
+    - device: proc
+      fs: proc
+      mountPoint: /proc
+    - device: sys
+      fs: sysfs
+      mountPoint: /sys
+    - device: /dev
+      mountPoint: /dev
+      options: bind
+    - device: tmpfs
+      fs: tmpfs
+      mountPoint: /run
+    - device: /run/udev
+      mountPoint: /run/udev
+      options: bind
+
+extraMountsEfi:
+    - device: efivarfs
+      fs: efivarfs
+      mountPoint: /sys/firmware/efi/efivars
diff --git a/modules/netinstall.conf b/modules/netinstall.conf
new file mode 100644
index 0000000..fd59c24
--- /dev/null
+++ b/modules/netinstall.conf
@@ -0,0 +1,23 @@
+---
+# This is the URL that is retrieved to get the netinstall groups-and-packages
+# data (which should be in the format described in netinstall.yaml), e.g.:
+#   groupsUrl: http://example.org/netinstall.php
+# or it can be a locally installed file:
+#   groupsUrl: file:///usr/share/calamares/netinstall.yaml
+#
+# Note that the contents of the groups file is the **important**
+# part of the configuration of this module. It specifies what
+# the user may select and what commands are to be run.
+#
+# The format of the groups file is documented in `README.md`.
+#
+# groupsUrl: file:///usr/share/calamares/netinstall.yaml
+
+# If the installation can proceed without netinstall (e.g. the Live CD
+# can create a working installed system, but netinstall is preferred
+# to bring it up-to-date or extend functionality) leave this set to
+# false (the default). If set to true, the netinstall data is required.
+#
+# This only has an effect if the netinstall data cannot be retrieved,
+# or is corrupt: having "required" set, means the install cannot proceed.
+required: false
diff --git a/modules/oemid.conf b/modules/oemid.conf
new file mode 100644
index 0000000..8f9bc3d
--- /dev/null
+++ b/modules/oemid.conf
@@ -0,0 +1,13 @@
+# This is an OEM setup (phase-0) configuration file.
+---
+# The batch-identifier is written to /var/log/installer/oem-id.
+# This value is put into the text box as the **suggested**
+# OEM ID. If @@DATE@@ is included in the identifier, then
+# that is replaced by the current date in yyyy-MM-dd (ISO) format.
+#
+# it is ok for the identifier to be empty.
+#
+# The identifier is written to the file as UTF-8 (this will be no
+# different from ASCII, for most inputs) and followed by a newline.
+# If the identifier is empty, only a newline is written.
+batch-identifier: neon-@@DATE@@
diff --git a/modules/openrcdmcryptcfg.conf b/modules/openrcdmcryptcfg.conf
new file mode 100644
index 0000000..57ee2dc
--- /dev/null
+++ b/modules/openrcdmcryptcfg.conf
@@ -0,0 +1,2 @@
+---
+configFilePath: /etc/conf.d/dmcrypt
diff --git a/modules/packagechooser.conf b/modules/packagechooser.conf
new file mode 100644
index 0000000..28f06f3
--- /dev/null
+++ b/modules/packagechooser.conf
@@ -0,0 +1,106 @@
+# Configuration for the low-density software chooser
+---
+# The packagechooser writes a GlobalStorage value for the choice that
+# has been made. The key is *packagechooser_<id>*. If *id* is set here,
+# it is substituted into the key name. If it is not set, the module's
+# instance name is used; see the *instances* section of `settings.conf`.
+# If there is just one packagechooser module, and no *id* is set,
+# resulting GS key is probably *packagechooser_packagechooser*.
+#
+# The GS value is a comma-separated list of the IDs of the selected
+# packages, or an empty string if none is selected.
+#
+# id: ""
+
+# Software selection mode, to set whether the software packages
+# can be chosen singly, or multiply.
+#
+# Possible modes are "optional", "required" (for zero or one)
+# or "optionalmultiple", "requiredmultiple" (for zero-or-more
+# or one-or-more).
+mode: required
+
+# Human-visible strings in this module. These are all optional.
+# The following translated keys are used:
+#  - *step*, used in the overall progress view (left-hand pane)
+#
+# Each key kan have a [locale] added to it, which is used as
+# the translated string for that locale. For the strings
+# associated with the "no-selection" item, see *items*, below
+# with the explicit id "".
+#
+labels:
+    step: "Office Suite"
+    step[de]: "Office-Paket"
+
+# Items to display in the chooser. In general, this should be a
+# pretty short list to avoid overwhelming the UI. This is a list
+# of objects, and the items are displayed in list order.
+#
+# Either provide the data for an item in the list (using the keys
+# below), or use existing AppData XML files, or use AppStream cache
+# as a source for the data.
+#
+# For data provided by the list: the item has an id, which is used in
+# setting the value of *packagechooser_<module-id>*). The following fields
+# are mandatory:
+#
+#  - *id* ID for the product. The ID "" is special, and is used for
+#    "no package selected". Only include this if the mode allows
+#    selecting none.
+#  - *package* Package name for the product. While mandatory, this is
+#       not actually used anywhere.
+#  - *name* Human-readable name of the product. To provide translations,
+#       add a *[lang]* decoration as part of the key name, e.g. `name[nl]`
+#       for Dutch. The list of usable languages can be found in
+#       `CMakeLists.txt` or as part of the debug output of Calamares.
+#  - *description* Human-readable description. These can be translated
+#       as well.
+#  - *screenshot* Path to a single screenshot of the product. May be
+#       a filesystem path or a QRC path (e.g. ":/images/no-selection.png").
+#
+# Use the empty string "" as ID / key for the "no selection" item if
+# you want to customize the display of that item as well.
+#
+# For data provided by AppData XML: the item has an *appdata*
+# key which points to an AppData XML file in the local filesystem.
+# This file is parsed to provide the id (from AppData id), name
+# (from AppData name), description (from AppData description paragraphs
+# or the summary entries), and a screenshot (the defautl screenshot
+# from AppData). No package is set (but that is unused anyway).
+#
+# AppData may contain IDs that are not useful inside Calamares,
+# and the screenshot URL may be remote -- a remote URL will not
+# be loaded and the screenshot will be missing. An item with *appdata*
+# **may** specify an ID or screenshot path, as above. This will override
+# the settings from AppData.
+#
+# For data provided by AppStream cache: the item has an *appstream*
+# key which matches the AppStream identifier in the cache (e.g.
+# *org.kde.kwrite.desktop*). Data is retrieved from the AppStream
+# cache for that ID. The package name is set from the AppStream data.
+#
+# An item for AppStream may also contain an *id* and a *screenshot*
+# key which will override the data from AppStream.
+items:
+    - id: ""
+      package: ""
+      name: "No Office Suite"
+      name[de]: "Kein Office Paket"
+      description: "Please pick an office suite from the list. If you don't want to install an office suite, that's fine, you can install one later as needed."
+      description[de]: "Bitte wählen Sie ein Office-Paket von der Liste. Wenn Sie kein Office installieren wollen, kann dies auch zu einer späteren Zeitpunkt erfolgen."
+      screenshot: ":/images/choose-office.jpg"
+    - id: "libreoffice-still"
+      package: "libreoffice-still"
+      name: "LibreOffice"
+      name[de]: "LibreOffice"
+      description: "LibreOffice is a powerful and free office suite, used by millions of people around the world. Its clean interface and feature-rich tools help you unleash your creativity and enhance your productivity."
+      description[de]: "LibreOffice ist ein leistungsstarkes Office-Paket. Die klare Oberfläche und mächtigen Werkzeuge lassen Sie Ihre Kreativität entfalten und Ihre Produktivität steigern."
+      screenshot: ":/images/LibreOffice.jpg"
+    - id: "freeoffice"
+      package: "freeoffice"
+      name: "FreeOffice"
+      name[de]: "FreeOffice"
+      description: "FreeOffice is a powerful Office suite with word processing, spreadsheet and presentation software. It is seamlessly compatible with Microsoft Office and can be used free of charge. For long-term use, request a free product key directly in the application."
+      description[de]: "FreeOffice ist ein leistungsstarkes Office-Paket mit Textverarbeitung, Tabellenkalkulation und Präsentationssoftware. Es ist nahtlos kompatible zu Microsoft Office und kann frei genutzt werden. Für eine Langzeitnutzung kann ein Produktkey im Programm angefordert werden."
+      screenshot: ":/images/FreeOffice.jpg"
diff --git a/modules/packages.conf b/modules/packages.conf
new file mode 100644
index 0000000..e42e8e9
--- /dev/null
+++ b/modules/packages.conf
@@ -0,0 +1,170 @@
+---
+#
+# Which package manager to use, options are:
+#  - packagekit  - PackageKit CLI tool
+#  - zypp        - Zypp RPM frontend
+#  - yum         - Yum RPM frontend
+#  - dnf         - DNF, the new RPM frontend
+#  - urpmi       - Mandriva package manager
+#  - apt         - APT frontend for DEB and RPM
+#  - pacman      - Pacman
+#  - portage     - Gentoo package manager
+#  - entropy     - Sabayon package manager
+#  - dummy       - Dummy manager, only logs
+#
+backend: dummy
+
+#
+# Often package installation needs an internet connection.
+# Since you may allow system installation without a connection
+# and want to offer OPTIONAL package installation, it's
+# possible to have no internet, yet have this packages module
+# enabled in settings.
+#
+# You can skip the whole module when there is no internet
+# by setting "skip_if_no_internet" to true.
+#
+# You can run a package-manager specific update procedure
+# before installing packages (for instance, to update the
+# list of packages and dependencies); this is done only if there
+# is an internet connection.
+#
+# Set "update_db" to 'true' for refreshing the database on the
+# target system. On target installations, which got installed by
+# unsquashing, a full system update may be needed. Otherwise
+# post-installing additional packages may result in conflicts.
+# Therefore set also "update_system" to 'true'.
+#
+skip_if_no_internet: false
+update_db: true
+update_system: false
+
+#
+# List of maps with package operations such as install or remove.
+# Distro developers can provide a list of packages to remove
+# from the installed system (for instance packages meant only
+# for the live system).
+#
+# A job implementing a distro specific logic to determine other
+# packages that need to be installed or removed can run before
+# this one. Distro developers may want to install locale packages
+# or remove drivers not needed on the installed system.
+# Such a job would populate a list of dictionaries in the global
+# storage called "packageOperations" and that list is processed
+# after the static list in the job configuration (i.e. the list
+# that is in this configuration file).
+#
+# Allowed package operations are:
+#  - install, try_install: will call the package manager to
+#       install one or more packages. The install target will
+#       abort the whole installation if package-installation
+#       fails, while try_install carries on. Packages may be
+#       listed as (localized) names, or as (localized) package-data.
+#       See below for the description of the format.
+# - localInstall: this is used to call the package manager
+#       to install a package from a path-to-a-package. This is
+#       useful if you have a static package archive on the install media.
+#       The *pacman* package manager is the only one to specially support
+#       this operation (all others treat this the same as *install*).
+# - remove, try_remove: will call the package manager to
+#       remove one or more packages. The remove target will
+#       abort the whole installation if package-removal fails,
+#       while try_remove carries on. Packages may be listed as
+#       (localized) names.
+#
+# There are two formats for naming packages: as a name or as package-data,
+# which is an object notation providing package-name, as well as pre- and
+# post-install scripts.
+#
+# Here are both formats, for installing vi. The first one just names the
+# package for vi (using the naming of the installed package manager), while
+# the second contains three data-items; the pre-script is run before invoking
+# the package manager, and the post-script runs once it is done.
+#
+# - install
+#   - vi
+#   - package: vi
+#     pre-script: touch /tmp/installing-vi
+#     post-script: rm -f /tmp/installing-vi
+#
+# The pre- and post-scripts are optional, but you cannot leave both out
+# if you do use the *package* key: using "package: vi" with neither script
+# option will trick Calamares into trying to install a package named
+# "package: vi", which is unlikely to work.
+#
+# The pre- and post-scripts are **not** executed by a shell unless you
+# explicitly invoke `/bin/sh` in them. The command-lines are passed
+# to exec(), which does not understand shell syntax. In other words:
+#
+#     pre-script: ls | wc -l
+#
+# Will fail, because `|` is passed as a command-line argument to ls,
+# as are `wc`, and `-l`. No shell pipeline is set up, and ls is likely
+# to complain. Invoke the shell explicitly:
+#
+#     pre-script: /bin/sh -c \"ls | wc -l\"
+#
+# The above note on shell-expansion applies to versions up-to-and-including
+# Calamares 3.2.12, but will change in future.
+#
+# Any package name may be localized; this is used to install localization
+# packages for software based on the selected system locale. By including
+# the string `LOCALE` in the package name, the following happens:
+#
+# - if the system locale is English (any variety), then the package is not
+#   installed at all,
+# - otherwise `$LOCALE` or `${LOCALE}` is replaced by the 'lower-cased' BCP47
+#   name of the 'language' part of the selected system locale (not the
+#   country/region/dialect part), e.g. selecting "nl_BE" will use "nl"
+#   here.
+#
+# Take care that just plain `LOCALE` will not be replaced, so `foo-LOCALE` will
+# be left unchanged, while `foo-$LOCALE` will be changed. However, `foo-LOCALE`
+# **will** be removed from the list of packages (i.e. not installed), if
+# English is selected. If a non-English locale is selected, then `foo-LOCALE`
+# will be installed, unchanged (no language-name-substitution occurs).
+#
+# The following installs localizations for vi, if they are relevant; if
+# there is no localization, installation continues normally.
+#
+# - install
+#   - vi-$LOCALE
+#   - package: vi-${LOCALE}
+#     pre-script: touch /tmp/installing-vi
+#     post-script: rm -f /tmp/installing-vi
+#
+# When installing packages, Calamares will invoke the package manager
+# with a list of package names if it can; package-data prevents this because
+# of the scripts that need to run. In other words, this:
+#
+# - install:
+#   - vi
+#   - binutils
+#   - package: wget
+#     pre-script: touch /tmp/installing-wget
+#
+# This will invoke the package manager three times, once for each package,
+# because not all of them are simple package names. You can speed up the
+# process if you have only a few pre-scripts, by using multiple install targets:
+#
+# - install:
+#   - vi
+#   - binutils
+# - install:
+#   - package: wget
+#     pre-script: touch /tmp/installing-wget
+#
+# This will call the package manager once with the package-names "vi" and
+# "binutils", and then a second time for "wget". When installing large numbers
+# of packages, this can lead to a considerable time savings.
+#
+operations:
+  - install:
+    - vi
+    - vi-${LOCALE}
+    - wget
+    - binutils
+  - remove:
+    - vi
+    - wget
+    - binutils
diff --git a/modules/partition.conf b/modules/partition.conf
new file mode 100644
index 0000000..6fbb44c
--- /dev/null
+++ b/modules/partition.conf
@@ -0,0 +1,137 @@
+# This setting specifies the mount point of the EFI system partition. Some
+# distributions (Fedora, Debian, Manjaro, etc.) use /boot/efi, others (KaOS,
+# etc.) use just /boot.
+efiSystemPartition:     "/boot/efi"
+
+# This optional setting specifies the size of the EFI system partition.
+# If nothing is specified, the default size of 300MiB will be used.
+# efiSystemPartitionSize:     300M
+
+# In autogenerated partitioning, allow the user to select a swap size?
+# If there is exactly one choice, no UI is presented, and the user
+# cannot make a choice -- this setting is used. If there is more than
+# one choice, a UI is presented.
+#
+# Legacy settings *neverCreateSwap* and *ensureSuspendToDisk* correspond
+# to values of *userSwapChoices* as follows:
+#    - *neverCreateSwap* is true, means [none]
+#    - *neverCreateSwap* is false, *ensureSuspendToDisk* is false, [small]
+#    - *neverCreateSwap* is false, *ensureSuspendToDisk* is true, [suspend]
+#
+# Autogenerated swap sizes are as follows:
+#    - *suspend*: Swap is always at least total memory size,
+#      and up to 4GiB RAM follows the rule-of-thumb 2 * memory;
+#      from 4GiB to 8 GiB it stays steady at 8GiB, and over 8 GiB memory
+#      swap is the size of main memory.
+#    - *small*: Follows the rules above, but Swap is at
+#      most 8GiB, and no more than 10% of available disk.
+# In both cases, a fudge factor (usually 10% extra) is applied so that there
+# is some space for administrative overhead (e.g. 8 GiB swap will allocate
+# 8.8GiB on disk in the end).
+userSwapChoices:
+    - none      # Create no swap, use no swap
+    - reuse     # Re-use existing swap, but don't create any (unsupported right now)
+    - small     # Up to 4GB
+    - suspend   # At least main memory size
+    - file      # To swap file instead of partition (unsupported right now)
+
+# LEGACY SETTINGS (these will generate a warning)
+# ensureSuspendToDisk:    true
+# neverCreateSwap:        false
+
+# Correctly draw nested (e.g. logical) partitions as such.
+drawNestedPartitions:   false
+
+# Show/hide partition labels on manual partitioning page.
+alwaysShowPartitionLabels: true
+
+# Default filesystem type, used when a "new" partition is made.
+#
+# When replacing a partition, the existing filesystem inside the
+# partition is retained. In other cases, e.g. Erase and Alongside,
+# as well as when using manual partitioning and creating a new
+# partition, this filesystem type is pre-selected. Note that
+# editing a partition in manual-creation mode will not automatically
+# change the filesystem type to this default value -- it is not
+# creating a new partition.
+#
+# Suggested values: ext2, ext3, ext4, reiser, xfs, jfs, btrfs
+# If nothing is specified, Calamares defaults to "ext4".
+#
+# Names are case-sensitive and defined by KPMCore.
+defaultFileSystemType:  "ext4"
+
+# Show/hide LUKS related functionality in automated partitioning modes.
+# Disable this if you choose not to deploy early unlocking support in GRUB2
+# and/or your distribution's initramfs solution.
+#
+# BIG FAT WARNING:
+#
+# This option is unsupported, as it cuts out a crucial security feature.
+# Disabling LUKS and shipping Calamares without a correctly configured GRUB2
+# and initramfs is considered suboptimal use of the Calamares software. The
+# Calamares team will not provide user support for any potential issue that
+# may arise as a consequence of setting this option to false.
+# It is strongly recommended that system integrators put in the work to support
+# LUKS unlocking support in GRUB2 and initramfs/dracut/mkinitcpio/etc.
+# Support is offered to system integrators that wish to do so, through the
+# Calamares bug tracker, as well as in #calamares on Freenode.
+# For more information on setting up GRUB2 for Calamares with LUKS, see
+# https://github.com/calamares/calamares/wiki/Deploy-LUKS
+#
+# If nothing is specified, LUKS is enabled in automated modes.
+#enableLuksAutomatedPartitioning:    true
+
+# Allow manual partitioning.
+#
+# When set to false, this option hides the "Manual partitioning" button,
+# limiting the user's choice to "Erase", "Replace" or "Alongside".
+# This can be useful when using a custom partition layout we don't want
+# the user to modify.
+#
+# If nothing is specified, manual partitioning is enabled.
+#allowManualPartitioning:   true
+
+# To apply a custom partition layout, it has to be defined this way :
+#
+# partitionLayout:
+#     - name: "rootfs"
+#       filesystem: "ext4"
+#       mountPoint: "/"
+#       size: 20%
+#       minSize: 500M
+#       maxSize: 10G
+#     - name: "home"
+#       filesystem: "ext4"
+#       mountPoint: "/home"
+#       size: 3G
+#       minSize: 1.5G
+#     - name: "data"
+#       filesystem: "fat32"
+#       mountPoint: "/data"
+#       size: 100%
+#
+# There can be any number of partitions, each entry having the following attributes:
+#   - name: partition label
+#   - filesystem: filesystem type
+#   - mountPoint: partition mount point
+#   - size: partition size in bytes (append 'K', 'M' or 'G' for KiB, MiB or GiB)
+#           or
+#           % of the available drive space if a '%' is appended to the value
+#   - minSize: minimum partition size (optional parameter)
+#   - maxSize: maximum partition size (optional parameter)
+
+# Checking for available storage
+#
+# This overlaps with the setting of the same name in the welcome module's
+# requirements section. If nothing is set by the welcome module, this
+# value is used instead. It is still a problem if there is no required
+# size set at all, and the replace and resize options will not be offered
+# if no required size is set.
+#
+# The value is in Gibibytes (GiB).
+#
+# BIG FAT WARNING: except for OEM-phase-0 use, you should be using
+#                  the welcome module, **and** configure this value in
+#                  `welcome.conf`, not here.
+# requiredStorage: 3.5
diff --git a/modules/plasmalnf.conf b/modules/plasmalnf.conf
new file mode 100644
index 0000000..a954c68
--- /dev/null
+++ b/modules/plasmalnf.conf
@@ -0,0 +1,79 @@
+# The Plasma Look-and-Feel module allows selecting a Plasma
+# Look-and-Feel in the live- or host-system and switches the
+# host Plasma session immediately to the chosen LnF; it
+# can also write a LnF configuration to the target user / on
+# the target system.
+#
+# This module should be used once in a view section (to get
+# the UI) and once in the exec section (to apply the selection
+# to the target user). It should come **after** the user module
+# in exec, so that the target user has been created alrady.
+---
+# Full path to the Plasma look-and-feel tool (CLI program
+# for querying and applying Plasma themes). If this is not
+# set, no LNF setting will happen.
+lnftool:	"/usr/bin/lookandfeeltool"
+
+# For systems where the user Calamares runs as (usually root,
+# via either sudo or pkexec) has a clean environment, set this
+# to the originating username; the lnftool will be run through
+# "sudo -H -u <liveuser>" instead of directly.
+#
+# liveuser:	"live"
+
+# You can limit the list of Plasma look-and-feel themes by listing ids
+# here. If this key is not present, all of the installed themes are listed.
+# If the key is present, only installed themes that are **also** included
+# in the list are shown (could be none!). See the *showAll* key, below,
+# to change that.
+#
+# Themes may be listed by id, (e.g. fluffy-bunny, below) or as a theme
+# and an image (e.g. breeze) which will be used to show a screenshot.
+# Themes with no image set at all get a "missing screenshot" image; if the
+# image file is not found, they get a color swatch based on the image name.
+#
+# The image may be an absolute path. If it is a relative path, though,
+# it is searched in the current directory and in the branding directory
+# (i.e. relative to the directory where your branding.desc lives).
+#
+# Valid forms of entries in the *themes* key:
+#  - A single string (unquoted), which is the theme id
+#  - A pair of *theme* and *image* keys, e.g.
+#    ```
+#    - theme: fluffy-bunny.desktop
+#      image: "fluffy-screenshot.png"
+#    ```
+#
+# The image screenshot is resized to 12x8 the current font size, with
+# a minimum of 120x80 pixels. This allows the screenshot to scale up
+# on HiDPI displays where the fonts are larger (in pixels).
+themes:
+    - org.kde.fuzzy-pig.desktop
+    - theme: org.kde.breeze.desktop
+      image: "breeze.png"
+    - theme: org.kde.breezedark.desktop
+      image: "breeze-dark.png"
+    - org.kde.fluffy-bunny.desktop
+
+# If *showAll* is true, then all installed themes are shown in the
+# UI for selection, even if they are not listed in *themes*. This
+# allows selection of all themes even while not all of them are
+# listed in *themes* -- which is useful to show screenshots for those
+# you do have a screenshot for.
+showAll: false
+
+# You can pre-select one of the themes; it is not applied
+# immediately, but its radio-button is switched on to indicate
+# that that is the theme (that is most likely) currently in use.
+# Do this only on Live images where you are reasonably sure
+# that the user is not going to change the theme out from under
+# themselves before running the installer.
+#
+# If this key is present, its value should be the id of the theme
+# which should be pre-selected. If absent, empty, or the pre-selected
+# theme is not found on the live system, no theme will be pre-selected.
+#
+# As a special setting, use "*", to try to find the currently-
+# selected theme by reading the Plasma configuration. This requires
+# KF5::Config at build- and run-time.
+preselect: "*"
diff --git a/modules/plymouthcfg.conf b/modules/plymouthcfg.conf
new file mode 100644
index 0000000..47c54f5
--- /dev/null
+++ b/modules/plymouthcfg.conf
@@ -0,0 +1,28 @@
+# Plymouth Configuration Module
+#
+# This module can be used to setup the default plymouth theme to 
+# be used with your distribution
+#
+# You should only use this module if the plymouth package is installed 
+# on the build configurations of your distribution & the plymouth 
+# theme you want to configure is installed as well. If the unpacked
+# filesystem configures a plymouth theme already, there is no need
+# to change it here.
+---
+
+
+# Leave this commented if you want to use the default theme 
+# shipped with your distribution configurations. Make sure that 
+# the theme exists in the themes directory of plymouth path. 
+# Debian / Ubuntu comes with themes "joy", "script", "softwaves",
+# possibly others. Look in /usr/share/plymouth/themes for more.
+#
+# Specifying a non-existent theme will leave the plymouth
+# configuration set to that theme. It is up to plymouth to
+# deal with that.
+
+plymouth_theme: spinfinity
+
+
+
+
diff --git a/modules/postcfg.conf b/modules/postcfg.conf
new file mode 100644
index 0000000..1c8651d
--- /dev/null
+++ b/modules/postcfg.conf
@@ -0,0 +1,4 @@
+---
+keyrings:
+    - archlinux
+    - manjaro
diff --git a/modules/preservefiles.conf b/modules/preservefiles.conf
new file mode 100644
index 0000000..671a308
--- /dev/null
+++ b/modules/preservefiles.conf
@@ -0,0 +1,49 @@
+# Configuration for the preserve-files job
+#
+# The *files* key contains a list of files to preserve. Each element of
+# the list should have one of these forms:
+#
+# - an absolute path (probably within the host system). This will be preserved
+#   as the same path within the target system (chroot). If, globally, dontChroot
+#   is true, then these items are ignored (since the destination is the same
+#   as the source).
+# - a map with a *dest* key. The *dest* value is a path interpreted in the
+#   target system (if dontChroot is true, in the host system). Relative paths
+#   are not recommended. There are three possible other keys in the map:
+#   - *from*, which must have one of the values, below; it is used to
+#     preserve files whose pathname is known to Calamares internally.
+#   - *src*, to refer to a path interpreted in the host system. Relative
+#     paths are not recommended, and are interpreted relative to where
+#     Calamares is being run.
+#   - *perm*, is a colon-separated tuple of <user>:<group>:<mode>
+#     where <mode> is in octal (e.g. 4777 for wide-open, 0400 for read-only
+#     by owner). If set, the file's ownership and permissions are set to
+#     those values within the target system; if not set, no permissions
+#     are changed.
+#   Only one of the two source keys (either *from* or *src*) may be set.
+#
+# The target filename is modified as follows:
+#   - `@@ROOT@@` is replaced by the path to the target root (may be /)
+#   - `@@USER@@` is replaced by the username entered by on the user
+#       page (may be empty, for instance if no user page is enabled)
+#
+# Special values for the key *from* are:
+# - *log*, for the complete log file (up to the moment the preservefiles
+#   module is run),
+# - *config*, for the Calamares configuration file
+# - *globals*, for a JSON dump of the contents of global storage
+---
+files:
+  - /etc/oem-information
+  - from: log
+    dest: /root/install.log
+    perm: root:wheel:644
+  - from: config
+    dest: /root/install.cfg
+    perm: root:wheel:400
+
+# The *perm* key contains a default value to apply to all files listed
+# above that do not have a *perm* key of their own. If not set,
+# root:root:0400 (highly restrictive) is used.
+#
+# perm: "root:root:0400"
diff --git a/modules/rawfs.conf b/modules/rawfs.conf
new file mode 100644
index 0000000..10e654a
--- /dev/null
+++ b/modules/rawfs.conf
@@ -0,0 +1,24 @@
+# Configuration for the rawfs module: raw filesystem copy to a block device
+
+---
+
+# To apply a custom partition layout, it has to be defined as a list of targets.
+#
+# For each target, the following attributes must be defined:
+#       * mountPoint: The mount point of the destination device on the installed system
+#         The corresponding block device will automatically be identified and used as the
+#         destination for the operation
+#       * source: The source filesystem; it can be the mount point of a locally (on the
+#         live system) mounted filesystem, a path to a disk image, or a block device
+#       * resize (optional): Expand the destination filesystem to fill the whole
+#         partition at the end of the operation; this works only with ext filesystems
+#         for now
+
+targets:
+    - mountPoint: /
+      source: /
+    - mountPoint: /home
+      source: /images/home.img
+      resize: true
+    - mountPoint: /data
+      source: /dev/mmcblk0p3
diff --git a/modules/removeuser.conf b/modules/removeuser.conf
new file mode 100644
index 0000000..dab4b25
--- /dev/null
+++ b/modules/removeuser.conf
@@ -0,0 +1,6 @@
+# Removes a single user (with userdel) from the system.
+# This is typically used in OEM setups or if the live user
+# spills into the target system.
+---
+# Username in the target system to be removed.
+username: live
diff --git a/modules/services.conf b/modules/services.conf
new file mode 100644
index 0000000..4d34df7
--- /dev/null
+++ b/modules/services.conf
@@ -0,0 +1,87 @@
+# Systemd services manipulation.
+#
+# This module can enable services and targets for systemd
+# (if packaging doesn't already do that). It can calso
+# disable services (but not targets).
+#
+# First, services are enabled; then targets; then services
+# are disabled -- this order of operations is fixed.
+---
+
+# There are three configuration keys for this module:
+# *services*, *targets* and *disable*. The value of each
+# key is a list of entries. Each entry has two keys:
+#   - *name* is the (string) name of the service or target that is being
+#     changed. Use quotes. Don't include ".target" or ".service"
+#     in the name.
+#   - *mandatory* is a boolean option, which states whether the change
+#     must be done successfully. If systemd reports an error while changing
+#     a mandatory entry, the installation will fail. When mandatory is false,
+#     errors for that entry (service or target) are ignored. If mandatory
+#     is not specified, the default is false.
+#
+# An entry may also be given as a single string, which is then
+# interpreted as the name of the service. In this case, mandatory
+# is also set to the default of false.
+#
+# Use [] to express an empty list.
+
+# # This example enables NetworkManager (and fails if it can't),
+# # disables cups (and ignores failure). Then it enables the
+# # graphical target (e.g. so that SDDM runs for login), and
+# # finally disables pacman-init (an ArchLinux-only service).
+# #
+# # Enables <name>.service
+# services:
+#   - name: "NetworkManager"
+#     mandatory: true
+#   - name: "cups"
+#     mandatory: false
+#
+# # Enables <name>.target
+# targets:
+#   - name: "graphical"
+#     mandatory: true
+#
+# # Disables <name>.service
+# disable:
+#   - name: "pacman-init"
+#     mandatory: false
+#
+# # Disables <name>.target
+# #     .. this shows how to use just the name
+# disable-targets:
+#   - graphical
+#
+# # Masks (stronger version of disable). This section
+# # is unusual because you **must** include the suffix
+# # (e.g. ".service") as part of the name, so, e.g. to mask
+# # NetworkManager (rather than just disable it) you must
+# # specify "NetworkManager.service" as name.
+# mask:
+#  - name: "NetworkManager.service"
+#  - mandatory: true
+
+# By default, no changes are made.
+#services: []
+#targets: []
+#disable: []
+disable-targets: []
+mask: []
+
+# Manjaro settings
+
+services:
+  - name: "NetworkManager"
+    mandatory: false
+
+  - name: "org.cups.cupsd"
+    mandatory: false
+
+targets:
+  - name: "graphical"
+    mandatory: true
+
+disable:
+  - name: "pacman-init"
+    mandatory: false
diff --git a/modules/servicescfg.conf b/modules/servicescfg.conf
new file mode 100644
index 0000000..d0995f4
--- /dev/null
+++ b/modules/servicescfg.conf
@@ -0,0 +1,10 @@
+---
+services:
+    enabled:
+        - name: "NetworkManager"
+          runlevel: "default"
+        - name: "cups"
+          runlevel: "default"
+#    disabled:
+#        - name: "hwclock"
+#          runlevel: "boot"
diff --git a/modules/shellprocess.conf b/modules/shellprocess.conf
new file mode 100644
index 0000000..4734aaa
--- /dev/null
+++ b/modules/shellprocess.conf
@@ -0,0 +1,36 @@
+# Configuration for the shell process job.
+#
+# Executes a list of commands found under the key *script*.
+# If the top-level key *dontChroot* is true, then the commands
+# are executed in the context of the live system, otherwise
+# in the context of the target system. In all of the commands,
+# the following substitutions will take place:
+#  - `@@ROOT@@` is replaced by the root mount point of the **target**
+#    system from the point of view of the command (for chrooted
+#    commands, that will be */*).
+#  - `@@USER@@` is replaced by the username, set on the user page.
+#
+# The (global) timeout for the command list can be set with
+# the *timeout* key. The value is a time in seconds, default
+# is 10 seconds if not set.
+#
+# If a command starts with "-" (a single minus sign), then the
+# return value of the command following the - is ignored; otherwise,
+# a failing command will abort the installation. This is much like
+# make's use of - in a command.
+#
+# The value of *script* may be:
+#   - a single string; this is one command that is executed.
+#   - a list of strings; these are executed one at a time, by
+#     separate shells (/bin/sh -c is invoked for each command).
+#   - an object, specifying a key *command* and (optionally)
+#     a key *timeout* to set the timeout for this specific
+#     command differently from the global setting.
+---
+dontChroot: false
+timeout: 10
+script:
+    - "-touch @@ROOT@@/tmp/thingy"
+    - "/usr/bin/false"
+    - command: "/usr/local/bin/slowloris"
+      timeout: 3600
diff --git a/modules/tracking.conf b/modules/tracking.conf
new file mode 100644
index 0000000..84c3f55
--- /dev/null
+++ b/modules/tracking.conf
@@ -0,0 +1,88 @@
+# Settings for various kinds of tracking that Distributions can
+# enable. Distributions looking at tracking should be aware of
+# the privacy (and hence communications) impact of that tracking,
+# and are advised to consult the Mozilla and KDE policies on
+# privacy and user tracking.
+#
+# There are three areas of tracking (-configuration) supported
+# by Calamares It is up to individual Distributions to create
+# suitable backends / configuration scripts for each. The
+# different areas are:
+#
+# install:  This is "phone home" functionality at the end of the
+#           install process. When enabled, it contacts the given
+#           URL. The URL can contain the special token $MACHINE,
+#           which is replaced by the machine-id of the installed
+#           system (if available, blank otherwise).
+#
+# machine:  This enables machine-level tracking on a (semi-)
+#           continuous basis. It is meant to keep track of installed
+#           systems and their continued use / updating.
+#
+# user:     This area enables user-level tracking, along the lines
+#           of the KDE User Telemetry Policy. It enables specific
+#           collection of data at a user- and application-level,
+#           possibly including actions done in an application.
+#           For the KDE environment, this enables user tracking
+#           with the appropriate framework, and the KDE User Telemetry
+#           policy applies.
+#
+# Each area has a key *enabled*. If the area is enabled, it is shown to
+# the user. This defaults to off, which means no tracking would be
+# configured or enabled by Calamares.
+#
+# Each area has a key *policy*, which is a Url to be opened when
+# the user clicks on the corresponding Help button for an explanation
+# of the details of that particular kind of tracking. If no policy
+# is set, the help button is hidden. The example policy links
+# go to Calamares' generic user manual.
+#
+# Each area may have other configuration keys, depending on the
+# area and how it needs to be configured.
+#
+# Globally, there are two other keys:
+#
+# policy:   (optional) url about tracking settings for this distro.
+# default:  (optional) level to enable by default
+#
+---
+# This is the global policy; it is displayed as a link on the page.
+# If blank or commented out, no link is displayed on the tracking
+# page. It is recommended to either provide policy URLs for each
+# area, *or* one general link, and not to mix them.
+policy:  "https://github.com/calamares/calamares/wiki/Users-Guide#installation-tracking"
+
+# This is the default level to enable for tracking. If commented out,
+# empty, or otherwise invalid, "none" is used, so no tracking by default.
+default:    user
+
+# The install area has one specific configuration key:
+#   url:    this URL (remember to include the protocol, and prefer https)
+#           is fetched (with a GET request, and the data discarded) at
+#           the end of the installation process. The following tokens
+#           are replaced in the url (possibly by blank strings, or by 0).
+#               - $CPU (cpu make and model)
+#               - $MEMORY (amount of main memory available)
+#               - $DISK (total amount of disk attached)
+#           Typically these are used as GET parameters, as in the example.
+#
+# Note that phone-home only works if the system has an internet
+# connection; it is a good idea to require internet in the welcome
+# module then.
+install:
+    enabled: false
+    policy:  "https://github.com/calamares/calamares/wiki/Users-Guide#installation-tracking"
+    # url:     "https://example.com/install.php?c=$CPU&m=$MEMORY"
+
+# The machine area has one specific configuration key:
+#   style:  This string specifies what kind of tracking configuration
+#           needs to be done. There is currently only one valid
+#           style, "neon", which edits two files in the installed
+#           system to enable system-tracking.
+machine:
+    enabled: false
+    style: neon
+
+# The user area is not yet implemented, and has no specific configuration.
+user:
+    enabled: false
diff --git a/modules/umount.conf b/modules/umount.conf
new file mode 100644
index 0000000..22a2e74
--- /dev/null
+++ b/modules/umount.conf
@@ -0,0 +1,42 @@
+### Umount Module
+#
+# This module represents the last part of the installation, the unmounting
+# of partitions used for the install.  It is also the last place where it
+# is possible to copy files to the target system, thus the best place to
+# copy an installation log.
+#
+# This module has two configuration keys:
+#   srcLog  location in the live system where the log is
+#   destLog location in the target system to copy the log
+#
+# You can either use the default source path (which is
+# `/root/.cache/calamares/session.log` ) to copy the regular log,
+# or if you want to use the full output of `sudo calamares -d` you will need
+# to redirect standard output, for instance in a launcher script or
+# in the desktop file.
+#
+# Example launcher script:
+#
+# ```
+# #!/bin/sh
+# sudo /usr/bin/calamares -d > installation.log
+# ```
+#
+# Example desktop line:
+#
+# ```
+# Exec=sudo /usr/bin/calamares -d > installation.log
+# ```
+#
+# If no source and destination are set, no copy is attempted. If the
+# copy fails for some reason, a warning is printed but the installation
+# does not fail.
+
+---
+# example when using the normal Calamares log:
+srcLog:      "/root/.cache/calamares/session.log"
+destLog:     "/var/log/Calamares.log"
+
+# example when using a log created by `sudo calamares -d`:
+#srcLog:      "/home/live/installation.log"
+#destLog:     "/var/log/installation.log"
diff --git a/modules/unpackfs.conf b/modules/unpackfs.conf
new file mode 100644
index 0000000..454e82e
--- /dev/null
+++ b/modules/unpackfs.conf
@@ -0,0 +1,89 @@
+# Unsquash / unpack a filesystem. Multiple sources are supported, and
+# they may be squashed or plain filesystems.
+#
+# Configuration:
+#
+#   from globalstorage: rootMountPoint
+#   from job.configuration: the path to where to mount the source image(s)
+#       for copying an ordered list of unpack mappings for image file <->
+#       target dir relative to rootMountPoint.
+
+---
+# Each list item is unpacked, in order, to the target system.
+#
+# Each list item has the following **mandatory** attributes:
+#   - *source* path relative to the live / intstalling system to the image
+#   - *sourcefs* the type of the source files; valid entries are
+#       - `ext4` (copies the filesystem contents)
+#       - `squashfs` (unsquashes)
+#       - `file` (copies a file or directory)
+#       - (may be others if mount supports it)
+#   - *destination* path relative to rootMountPoint (so in the target
+#       system) where this filesystem is unpacked. It may be an
+#       empty string, which effectively is / (the root) of the target
+#       system.
+#
+# Each list item **optionally** can include the following attributes:
+#   - *exclude* is a list of values that is expanded into --exclude
+#       arguments for rsync (each entry in exclude gets its own --exclude).
+#   - *excludeFile* is a single file that is passed to rsync as an
+#       --exclude-file argument. This should be a full pathname
+#       inside the **host** filesystem.
+#
+# EXAMPLES
+#
+# Usually you list a filesystem image to unpack; you can use
+# squashfs or an ext4 image. An empty destination is equivalent to "/",
+# the root of the target system. The destination directory must exist
+# in the target system.
+#
+#   -   source: "/path/to/filesystem.sqfs"
+#       sourcefs: "squashfs"
+#       destination: ""
+#
+# Multiple entries are unpacked in-order; if there is more than one
+# item then only the first must exist beforehand -- it's ok to
+# create directories with one unsquash and then to use those
+# directories as a target from a second unsquash.
+#
+#   -   source: "/path/to/another/filesystem.img"
+#       sourcefs: "ext4"
+#       destination: ""
+#   -   source: "/path/to/another/filesystem2.img"
+#       sourcefs: "ext4"
+#       destination: "/usr/lib/extra"
+#
+# You can list filesystem source paths relative to the Calamares run
+# directory, if you use -d (this is only useful for testing, though).
+#
+#    -   source: ./example.sqfs
+#        sourcefs: squashfs
+#        destination: ""
+#
+# You can list individual files (copied one-by-one), or directories
+# (the files inside this directory are copied directly to the destination,
+# so no "dummycpp/" subdirectory is created in this example).
+# Do note that the target directory must exist already (e.g. from
+# extracting some other filesystem).
+#
+#    -   source: ../CHANGES
+#        sourcefs: file
+#        destination: "/tmp/derp"
+#    -   source: ../src/modules/dummycpp
+#        sourcefs: file
+#        destination: "/tmp/derp"
+#
+# The *destination* and *source* are handed off to rsync, so the semantics
+# of trailing slashes apply. In order to *rename* a file as it is
+# copied, specify one single file (e.g. CHANGES) and a full pathname
+# for its destination name, as in the example below.
+
+unpack:
+    -   source: ../CHANGES
+        sourcefs: file
+        destination: "/tmp/changes.txt"
+    -   source: src/qml/calamares/slideshow
+        sourcefs: file
+        destination: "/tmp/slideshow/"
+        exclude: [ "*.qmlc", "qmldir" ]
+        # excludeFile: /etc/calamares/modules/unpackfs/exclude-list.txt
diff --git a/modules/users.conf b/modules/users.conf
new file mode 100644
index 0000000..0c40fae
--- /dev/null
+++ b/modules/users.conf
@@ -0,0 +1,85 @@
+# Configuration for the one-user-system user module.
+#
+# Besides these settings, the user module also places the following
+# keys into the globalconfig area, based on user input in the view step.
+#
+# - hostname
+# - username
+# - password (obscured)
+# - autologinUser (if enabled, set to username)
+#
+# These globalconfig keys are set when the jobs for this module
+# are created.
+---
+# Used as default groups for the created user.
+# Adjust to your Distribution defaults.
+defaultGroups:
+    - users
+    - lp
+    - video
+    - network
+    - storage
+    - wheel
+    - audio
+
+# Some Distributions require a 'autologin' group for the user.
+# Autologin causes a user to become automatically logged in to
+# the desktop environment on boot.
+# Disable when your Distribution does not require such a group.
+autologinGroup:  autologin
+# You can control the initial state for the 'autologin checkbox' in UsersViewStep here.
+# Possible values are: true to enable or false to disable the checkbox by default
+doAutologin:     true
+
+# When set to a non-empty string, Calamares creates a sudoers file for the user.
+#  /etc/sudoers.d/10-installer
+# Remember to add sudoersGroup to defaultGroups.
+#
+# If your Distribution already sets up a group of sudoers in its packaging,
+# remove this setting (delete or comment out the line below). Otherwise,
+# the setting will be duplicated in the /etc/sudoers.d/10-installer file,
+# potentially confusing users.
+sudoersGroup:    wheel
+
+# Setting this to false , causes the root account to be disabled.
+setRootPassword: true
+# You can control the initial state for the 'root password checkbox' in UsersViewStep here.
+# Possible values are: true to enable or false to disable the checkbox by default.
+# When enabled the user password is used for the root account too.
+# NOTE: doReusePassword requires setRootPassword to be enabled.
+doReusePassword: true
+
+# These are optional password-requirements that a distro can enforce
+# on the user. The values given in this sample file disable each check,
+# as if the check was not listed at all.
+#
+# Checks may be listed multiple times; each is checked separately,
+# and no effort is done to ensure that the checks are consistent
+# (e.g. specifying a maximum length less than the minimum length
+# will annoy users).
+#
+# The libpwquality check relies on the (optional) libpwquality library.
+# Its value is a list of configuration statements that could also
+# be found in pwquality.conf, and these are handed off to the
+# libpwquality parser for evaluation. The check is ignored if
+# libpwquality is not available at build time (generates a warning in
+# the log). The Calamares password check rejects passwords with a
+# score of < 40 with the given libpwquality settings.
+#
+# (additional checks may be implemented in CheckPWQuality.cpp and
+# wired into UsersPage.cpp)
+passwordRequirements:
+    minLength: -1  # Password at least this many characters
+    maxLength: -1  # Password at most this many characters
+    libpwquality:
+        - minlen=0
+        - minclass=0
+
+# Shell to be used for the regular user of the target system.
+# There are three possible kinds of settings:
+#  - unset (i.e. commented out, the default), act as if set to /bin/bash
+#  - empty (explicit), don't pass shell information to useradd at all
+#    and rely on a correct configuration file in /etc/default/useradd
+#  - set, non-empty, use that path as shell. No validation is done
+#    that the shell actually exists or is executable.
+# userShell: /bin/bash
diff --git a/modules/welcome.conf b/modules/welcome.conf
new file mode 100644
index 0000000..0361830
--- /dev/null
+++ b/modules/welcome.conf
@@ -0,0 +1,92 @@
+# Configuration for the welcome module. The welcome page
+# displays some information from the branding file.
+# Which parts it displays can be configured through
+# the show* variables.
+#
+# In addition to displaying the welcome page, this module
+# can check requirements for installation.
+---
+# Display settings for various buttons on the welcome page.
+# The URLs themselves come from branding.desc is the setting
+# here is "true". If the setting is false, the button is hidden.
+# The setting can also be a full URL which will then be used
+# instead of the one from the branding file, or empty or not-set
+# which will hide the button.
+showSupportUrl:         true
+showKnownIssuesUrl:     true
+showReleaseNotesUrl:    true
+
+# If this Url is set to something non-empty, a "donate"
+# button is added to the welcome page alongside the
+# others (see settings, above). Clicking the button opens
+# the corresponding link. (This button has no corresponding
+# branding.desc string)
+#
+# showDonateUrl:  https://kde.org/community/donations/
+
+# Requirements checking. These are general, generic, things
+# that are checked. They may not match with the actual requirements
+# imposed by other modules in the system.
+requirements:
+    # Amount of available disk, in GiB. Floating-point is allowed here.
+    # Note that this does not account for *usable* disk, so it is possible
+    # to pass this requirement, yet have no space to install to.
+    requiredStorage:    5.5
+
+    # Amount of available RAM, in GiB. Floating-point is allowed here.
+    requiredRam:        1.0
+
+    # To check for internet connectivity, Calamares does a HTTP GET
+    # on this URL; on success (e.g. HTTP code 200) internet is OK.
+    internetCheckUrl:   http://google.com
+
+    # List conditions to check. Each listed condition will be
+    # probed in some way, and yields true or false according to
+    # the host system satisfying the condition.
+    #
+    # This sample file lists all the conditions that are known.
+    check:
+        - storage
+        - ram
+        - power
+        - internet
+        - root
+        - screen
+    # List conditions that **must** be satisfied (from the list
+    # of conditions, above) for installation to proceed.
+    # If any of these conditions are not met, the user cannot
+    # continue past the welcome page.
+    required:
+        # - storage
+        - ram
+        # - root
+
+# GeoIP checking
+#
+# This can be used to pre-select a language based on the country
+# the user is currently in. It *assumes* that there's internet
+# connectivity, though. Configuration is like in the locale module,
+# but remember to use a URL that returns full data **and** to
+# use a selector that will pick the country, not the timezone.
+#
+# To disable GeoIP checking, either comment-out the entire geoip section,
+# or set the *style* key to an unsupported format (e.g. `none`).
+# Also, note the analogous feature in src/modules/locale/locale.conf.
+#
+geoip:
+    style:    "none"
+    url:      "https://geoip.kde.org/v1/ubiquity"  # extended XML format
+    selector: "CountryCode"  # blank uses default, which is wrong
+
+# User interface
+#
+# The "select language" icon is an international standard, but it
+# might not theme very well with your desktop environment.
+# Fill in an icon name (following FreeDesktop standards) to
+# use that named icon instead of the usual one.
+#
+# Leave blank or unset to use the international standard.
+#
+# Known icons in this space are "set-language" and "config-language".
+#
+# languageIcon: set-language
diff --git a/qml/calamares/slideshow/BackButton.qml b/qml/calamares/slideshow/BackButton.qml
new file mode 100644
index 0000000..2d5f4dd
--- /dev/null
+++ b/qml/calamares/slideshow/BackButton.qml
@@ -0,0 +1,24 @@
+/* === This file is part of Calamares - <https://github.com/calamares> ===
+ *
+ *   Copyright 2018, Adriaan de Groot <groot@kde.org>
+ *
+ *   Calamares is free software: you can redistribute it and/or modify
+ *   it under the terms of the GNU General Public License as published by
+ *   the Free Software Foundation, either version 3 of the License, or
+ *   (at your option) any later version.
+ *
+ *   Calamares is distributed in the hope that it will be useful,
+ *   but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ *   GNU General Public License for more details.
+ *
+ *   You should have received a copy of the GNU General Public License
+ *   along with Calamares. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+NavButton {
+    id: backButton
+    anchors.left: parent.left
+    visible: parent.currentSlide > 0
+    isForward: false
+}
diff --git a/qml/calamares/slideshow/ForwardButton.qml b/qml/calamares/slideshow/ForwardButton.qml
new file mode 100644
index 0000000..9f6fecf
--- /dev/null
+++ b/qml/calamares/slideshow/ForwardButton.qml
@@ -0,0 +1,23 @@
+/* === This file is part of Calamares - <https://github.com/calamares> ===
+ *
+ *   Copyright 2018, Adriaan de Groot <groot@kde.org>
+ *
+ *   Calamares is free software: you can redistribute it and/or modify
+ *   it under the terms of the GNU General Public License as published by
+ *   the Free Software Foundation, either version 3 of the License, or
+ *   (at your option) any later version.
+ *
+ *   Calamares is distributed in the hope that it will be useful,
+ *   but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ *   GNU General Public License for more details.
+ *
+ *   You should have received a copy of the GNU General Public License
+ *   along with Calamares. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+NavButton {
+    id: forwardButton
+    anchors.right: parent.right
+    visible: parent.currentSlide + 1 < parent.slides.length;
+}
diff --git a/qml/calamares/slideshow/NavButton.qml b/qml/calamares/slideshow/NavButton.qml
new file mode 100644
index 0000000..33d8cad
--- /dev/null
+++ b/qml/calamares/slideshow/NavButton.qml
@@ -0,0 +1,68 @@
+/* === This file is part of Calamares - <https://github.com/calamares> ===
+ *
+ *   Copyright 2018, Adriaan de Groot <groot@kde.org>
+ *
+ *   Calamares is free software: you can redistribute it and/or modify
+ *   it under the terms of the GNU General Public License as published by
+ *   the Free Software Foundation, either version 3 of the License, or
+ *   (at your option) any later version.
+ *
+ *   Calamares is distributed in the hope that it will be useful,
+ *   but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ *   GNU General Public License for more details.
+ *
+ *   You should have received a copy of the GNU General Public License
+ *   along with Calamares. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+/* This is a navigation (arrow) button that fades in on hover, and
+ * which calls forward / backward navigation on the presentation it
+ * is in. It should be a child item of the presentation (not of a
+ * single slide). Use the ForwardButton or BackButton for a pre-
+ * configured instance that interacts with the presentation.
+ */
+
+import QtQuick 2.5;
+
+Image {
+    id: fade
+    
+    property bool isForward : true
+    
+    width: 100
+    height: 100
+    anchors.verticalCenter: parent.verticalCenter
+    opacity: 0.3
+    
+    OpacityAnimator {
+        id: fadeIn
+        target: fade
+        from: fade.opacity
+        to: 1.0
+        duration: 500
+        running: false
+    }
+    
+    OpacityAnimator {
+        id: fadeOut
+        target: fade
+        from: fade.opacity
+        to: 0.3
+        duration: 250
+        running: false
+    }
+    
+    MouseArea {
+        anchors.fill: parent
+        hoverEnabled: true
+        onEntered: { fadeOut.running = false; fadeIn.running = true }
+        onExited: { fadeIn.running = false ; fadeOut.running = true }
+        onClicked: {
+            if (isForward)
+                fade.parent.goToNextSlide()
+            else
+                fade.parent.goToPreviousSlide()
+        }
+    }
+}
diff --git a/qml/calamares/slideshow/Presentation.qml b/qml/calamares/slideshow/Presentation.qml
new file mode 100644
index 0000000..1d2fd9c
--- /dev/null
+++ b/qml/calamares/slideshow/Presentation.qml
@@ -0,0 +1,240 @@
+/* === This file is part of Calamares - <https://github.com/calamares> ===
+ *
+ *   Copyright 2017, Adriaan de Groot <groot@kde.org>
+ *     - added looping, keys-instead-of-shortcut
+ *   Copyright 2018, Adriaan de Groot <groot@kde.org>
+ *     - make looping a property, drop the 'c' fade-key
+ *     - drop navigation through entering a slide number
+ *       (this and the 'c' key make sense in a *presentation*
+ *       slideshow, not in a passive slideshow like Calamares)
+ *     - remove quit key
+ *   Copyright 2019, Adriaan de Groot <groot@kde.org>
+ *     - Support "V2" loading
+ *     - Disable shortcuts until the content is visible in Calamares
+ *
+ *   SPDX-License-Identifier: LGPL-2.1
+ *   License-Filename: LICENSES/LGPLv2.1-Presentation
+ */
+
+/****************************************************************************
+**
+** Copyright (C) 2016 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of the QML Presentation System.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and Digia.  For licensing terms and
+** conditions see http://qt.digia.com/licensing.  For further information
+** use the contact form at http://qt.digia.com/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Digia gives you certain additional
+** rights.  These rights are described in the Digia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3.0 as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU General Public License version 3.0 requirements will be
+** met: http://www.gnu.org/copyleft/gpl.html.
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+
+import QtQuick 2.5
+import QtQuick.Window 2.0
+
+Item {
+    id: root
+
+    property variant slides: []
+    property int currentSlide: 0
+
+    property bool loopSlides: true
+
+    property bool showNotes: false;
+    property bool allowDelay: true;
+    property alias mouseNavigation: mouseArea.enabled
+    property bool arrowNavigation: true
+    property bool keyShortcutsEnabled: true
+
+    property color titleColor: textColor;
+    property color textColor: "black"
+    property string fontFamily: "Helvetica"
+    property string codeFontFamily: "Courier New"
+
+    // This is set by the C++ part of Calamares when the slideshow
+    // becomes visible. You can connect it to a timer, or whatever
+    // else needs to start only when the slideshow becomes visible.
+    //
+    // It is used in this example also to keep the keyboard shortcuts
+    // enabled only while the slideshow is active.
+    property bool activatedInCalamares: false
+    
+    // Private API
+    property int _lastShownSlide: 0
+
+    Component.onCompleted: {
+        var slideCount = 0;
+        var slides = [];
+        for (var i=0; i<root.children.length; ++i) {
+            var r = root.children[i];
+            if (r.isSlide) {
+                slides.push(r);
+            }
+        }
+
+        root.slides = slides;
+
+        // Make first slide visible...
+        if (root.slides.length > 0)
+            root.slides[root.currentSlide].visible = true;
+    }
+
+    function switchSlides(from, to, forward) {
+        from.visible = false
+        to.visible = true
+        return true
+    }
+
+    onCurrentSlideChanged: {
+        switchSlides(root.slides[_lastShownSlide], root.slides[currentSlide], currentSlide > _lastShownSlide)
+        _lastShownSlide = currentSlide
+        // Always keep focus on the slideshow
+        root.focus = true
+    }
+
+    function goToNextSlide() {
+        if (root.slides[currentSlide].delayPoints) {
+            if (root.slides[currentSlide]._advance())
+                return;
+        }
+        if (currentSlide + 1 < root.slides.length)
+            ++currentSlide;
+        else if (loopSlides)
+            currentSlide = 0;  // Loop at the end
+    }
+
+    function goToPreviousSlide() {
+        if (currentSlide - 1 >= 0)
+            --currentSlide;
+        else if (loopSlides)
+            currentSlide = root.slides.length - 1
+    }
+
+    focus: true  // Keep focus
+
+    // Navigation through key events, too
+    Keys.onSpacePressed: goToNextSlide()
+    Keys.onRightPressed: goToNextSlide()
+    Keys.onLeftPressed: goToPreviousSlide()
+
+    // navigate with arrow keys
+    Shortcut { sequence: StandardKey.MoveToNextLine; enabled: root.activatedInCalamares && root .arrowNavigation; onActivated: goToNextSlide() }
+    Shortcut { sequence: StandardKey.MoveToPreviousLine; enabled: root.activatedInCalamares && root.arrowNavigation; onActivated: goToPreviousSlide() }
+    Shortcut { sequence: StandardKey.MoveToNextChar; enabled: root.activatedInCalamares && root.arrowNavigation; onActivated: goToNextSlide() }
+    Shortcut { sequence: StandardKey.MoveToPreviousChar; enabled: root.activatedInCalamares && root.arrowNavigation; onActivated: goToPreviousSlide() }
+
+    // presentation-specific single-key shortcuts (which interfere with normal typing)
+    Shortcut { sequence: " "; enabled: root.activatedInCalamares && root.keyShortcutsEnabled; onActivated: goToNextSlide() }
+
+    // standard shortcuts
+    Shortcut { sequence: StandardKey.MoveToNextPage; enabled: root.activatedInCalamares; onActivated: goToNextSlide() }
+    Shortcut { sequence: StandardKey.MoveToPreviousPage; enabled: root.activatedInCalamares; onActivated: goToPreviousSlide() }
+
+    MouseArea {
+        id: mouseArea
+        anchors.fill: parent
+        acceptedButtons: Qt.LeftButton | Qt.RightButton
+        onClicked: {
+            if (mouse.button == Qt.RightButton)
+                goToPreviousSlide()
+            else
+                goToNextSlide()
+        }
+        onPressAndHold: goToPreviousSlide(); //A back mechanism for touch only devices
+    }
+
+    Window {
+        id: notesWindow;
+        width: 400
+        height: 300
+
+        title: "QML Presentation: Notes"
+        visible: root.showNotes
+
+        Flickable {
+            anchors.fill: parent
+            contentWidth: parent.width
+            contentHeight: textContainer.height
+
+            Item {
+                id: textContainer
+                width: parent.width
+                height: notesText.height + 2 * notesText.padding
+
+                Text {
+                    id: notesText
+
+                    property real padding: 16;
+
+                    x: padding
+                    y: padding
+                    width: parent.width - 2 * padding
+
+
+                    font.pixelSize: 16
+                    wrapMode: Text.WordWrap
+
+                    property string notes: root.slides[root.currentSlide].notes;
+
+                    onNotesChanged: {
+                        var result = "";
+
+                        var lines = notes.split("\n");
+                        var beginNewLine = false
+                        for (var i=0; i<lines.length; ++i) {
+                            var line = lines[i].trim();
+                            if (line.length == 0) {
+                                beginNewLine = true;
+                            } else {
+                                if (beginNewLine && result.length) {
+                                    result += "\n\n"
+                                    beginNewLine = false
+                                }
+                                if (result.length > 0)
+                                    result += " ";
+                                result += line;
+                            }
+                        }
+
+                        if (result.length == 0) {
+                            font.italic = true;
+                            text = "no notes.."
+                        } else {
+                            font.italic = false;
+                            text = result;
+                        }
+                    }
+                }
+            }
+        }
+    }
+}
diff --git a/qml/calamares/slideshow/Slide.qml b/qml/calamares/slideshow/Slide.qml
new file mode 100644
index 0000000..6b32ddf
--- /dev/null
+++ b/qml/calamares/slideshow/Slide.qml
@@ -0,0 +1,206 @@
+/* === This file is part of Calamares - <https://github.com/calamares> ===
+ *
+ *   SPDX-License-Identifier: LGPL-2.1
+ *   License-Filename: LICENSES/LGPLv2.1-Presentation
+ */
+
+/****************************************************************************
+**
+** Copyright (C) 2012 Digia Plc and/or its subsidiary(-ies).
+** Contact: http://www.qt-project.org/legal
+**
+** This file is part of the QML Presentation System.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and Digia.  For licensing terms and
+** conditions see http://qt.digia.com/licensing.  For further information
+** use the contact form at http://qt.digia.com/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Digia gives you certain additional
+** rights.  These rights are described in the Digia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3.0 as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU General Public License version 3.0 requirements will be
+** met: http://www.gnu.org/copyleft/gpl.html.
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+
+import QtQuick 2.5
+
+Item {
+    /*
+      Slides can only be instantiated as a direct child of a Presentation {} as they rely on
+      several properties there.
+     */
+
+    id: slide
+
+    property bool isSlide: true;
+
+    property bool delayPoints: false;
+    property int _pointCounter: 0;
+    function _advance() {
+        if (!parent.allowDelay)
+            return false;
+
+        _pointCounter = _pointCounter + 1;
+        if (_pointCounter < content.length)
+            return true;
+        _pointCounter = 0;
+        return false;
+    }
+
+    property string title;
+    property variant content: []
+    property string centeredText
+    property string writeInText;
+    property string notes;
+
+    property real fontSize: parent.height * 0.05
+    property real fontScale: 1
+
+    property real baseFontSize: fontSize * fontScale
+    property real titleFontSize: fontSize * 1.2 * fontScale
+    property real bulletSpacing: 1
+
+    property real contentWidth: width
+
+    // Define the slide to be the "content area"
+    x: parent.width * 0.05
+    y: parent.height * 0.2
+    width: parent.width * 0.9
+    height: parent.height * 0.7
+
+    property real masterWidth: parent.width
+    property real masterHeight: parent.height
+
+    property color titleColor: parent.titleColor;
+    property color textColor: parent.textColor;
+    property string fontFamily: parent.fontFamily;
+    property int textFormat: Text.PlainText
+
+    visible: false
+
+    Text {
+        id: titleText
+        font.pixelSize: titleFontSize
+        text: title;
+        anchors.horizontalCenter: parent.horizontalCenter
+        anchors.bottom: parent.top
+        anchors.bottomMargin: parent.fontSize * 1.5
+        font.bold: true;
+        font.family: slide.fontFamily
+        color: slide.titleColor
+        horizontalAlignment: Text.Center
+        z: 1
+    }
+
+    Text {
+        id: centeredId
+        width: parent.width
+        anchors.centerIn: parent
+        anchors.verticalCenterOffset: - parent.y / 3
+        text: centeredText
+        horizontalAlignment: Text.Center
+        font.pixelSize: baseFontSize
+        font.family: slide.fontFamily
+        color: slide.textColor
+        wrapMode: Text.Wrap
+    }
+
+    Text {
+        id: writeInTextId
+        property int length;
+        font.family: slide.fontFamily
+        font.pixelSize: baseFontSize
+        color: slide.textColor
+
+        anchors.fill: parent;
+        wrapMode: Text.Wrap
+
+        text: slide.writeInText.substring(0, length);
+
+        NumberAnimation on length {
+            from: 0;
+            to: slide.writeInText.length;
+            duration: slide.writeInText.length * 30;
+            running: slide.visible && parent.visible && slide.writeInText.length > 0
+        }
+
+        visible: slide.writeInText != undefined;
+    }
+
+
+    Column {
+        id: contentId
+        anchors.fill: parent
+
+        Repeater {
+            model: content.length
+
+            Row {
+                id: row
+
+                function decideIndentLevel(s) { return s.charAt(0) == " " ? 1 + decideIndentLevel(s.substring(1)) : 0 }
+                property int indentLevel: decideIndentLevel(content[index])
+                property int nextIndentLevel: index < content.length - 1 ? decideIndentLevel(content[index+1]) : 0
+                property real indentFactor: (10 - row.indentLevel * 2) / 10;
+
+                height: text.height + (nextIndentLevel == 0 ? 1 : 0.3) * slide.baseFontSize * slide.bulletSpacing
+                x: slide.baseFontSize * indentLevel
+                visible: (!slide.parent.allowDelay || !delayPoints) || index <= _pointCounter
+
+                Rectangle {
+                    id: dot
+                    anchors.baseline: text.baseline
+                    anchors.baselineOffset: -text.font.pixelSize / 2
+                    width: text.font.pixelSize / 3
+                    height: text.font.pixelSize / 3
+                    color: slide.textColor
+                    radius: width / 2
+                    opacity: text.text.length == 0 ? 0 : 1
+                }
+
+                Item {
+                    id: space
+                    width: dot.width * 1.5
+                    height: 1
+                }
+
+                Text {
+                    id: text
+                    width: slide.contentWidth - parent.x - dot.width - space.width
+                    font.pixelSize: baseFontSize * row.indentFactor
+                    text: content[index]
+                    textFormat: slide.textFormat
+                    wrapMode: Text.WordWrap
+                    color: slide.textColor
+                    horizontalAlignment: Text.AlignLeft
+                    font.family: slide.fontFamily
+                }
+            }
+        }
+    }
+
+}
diff --git a/qml/calamares/slideshow/SlideCounter.qml b/qml/calamares/slideshow/SlideCounter.qml
new file mode 100644
index 0000000..e59476f
--- /dev/null
+++ b/qml/calamares/slideshow/SlideCounter.qml
@@ -0,0 +1,38 @@
+/* === This file is part of Calamares - <https://github.com/calamares> ===
+ *
+ *   Copyright 2018, Adriaan de Groot <groot@kde.org>
+ *
+ *   Calamares is free software: you can redistribute it and/or modify
+ *   it under the terms of the GNU General Public License as published by
+ *   the Free Software Foundation, either version 3 of the License, or
+ *   (at your option) any later version.
+ *
+ *   Calamares is distributed in the hope that it will be useful,
+ *   but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ *   GNU General Public License for more details.
+ *
+ *   You should have received a copy of the GNU General Public License
+ *   along with Calamares. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+/* This control just shows a (non-translated) count of the slides
+ * in the slideshow in the format "n / total".
+ */
+
+import QtQuick 2.5;
+
+Rectangle {
+    id: slideCounter
+    anchors.right: parent.right
+    anchors.bottom: parent.bottom
+    width: 100
+    height: 50
+
+    Text {
+        id: slideCounterText
+        anchors.centerIn: parent
+        //: slide counter, %1 of %2 (numeric)
+        text: qsTr("%L1 / %L2").arg(parent.parent.currentSlide + 1).arg(parent.parent.slides.length)
+    }
+}
diff --git a/qml/calamares/slideshow/qmldir b/qml/calamares/slideshow/qmldir
new file mode 100644
index 0000000..7b964b8
--- /dev/null
+++ b/qml/calamares/slideshow/qmldir
@@ -0,0 +1,10 @@
+module calamares.slideshow
+
+Presentation 1.0 Presentation.qml
+Slide 1.0 Slide.qml
+
+NavButton 1.0 NavButton.qml
+ForwardButton 1.0 ForwardButton.qml
+BackButton 1.0 BackButton.qml
+
+SlideCounter 1.0 SlideCounter.qml
diff --git a/settings.conf b/settings.conf
new file mode 100644
index 0000000..4fe02c7
--- /dev/null
+++ b/settings.conf
@@ -0,0 +1,183 @@
+# Configuration file for Calamares
+# Syntax is YAML 1.2
+---
+# Modules can be job modules (with different interfaces) and QtWidgets view
+# modules. They could all be placed in a number of different paths.
+# "modules-search" is a list of strings, each of these can either be a full
+# path to a directory or the keyword "local".
+#
+# "local" means:
+#   - modules in $LIBDIR/calamares/modules, with
+#   - settings in SHARE/calamares/modules or /etc/calamares/modules.
+# In debug-mode (e.g. calamares -d) "local" also adds some paths
+# that make sense from inside the build-directory, so that you
+# can build-and-run with the latest modules immediately.
+#
+# Strings other than "local" are taken as paths and interpreted
+# relative to wherever Calamares is started. It is therefore **strongly**
+# recommended to use only absolute paths here. This is mostly useful
+# if your distro has forks of standard Calamares modules, but also
+# uses some form of upstream packaging which might overwrite those
+# forked modules -- then you can keep modules somewhere outside of
+# the "regular" module tree.
+#
+#
+# YAML: list of strings.
+modules-search: [ local ]
+
+# Instances section. This section is optional, and it defines custom instances
+# for modules of any kind. An instance entry has an module name, an instance
+# name, and a configuration file name. The primary goal of this mechanism is
+# to allow loading multiple instances of the same module, with different
+# configuration. If you don't need this, the instances section can safely be
+# left empty.
+#
+# Module name plus instance name makes an instance key, e.g.
+# "webview@owncloud", where "webview" is the module name (for the webview
+# viewmodule) and "owncloud" is the instance name. In the *sequence*
+# section below, use instance-keys to name instances (instead of just
+# a module name, for modules which have only a single instance).
+#
+# Every module implicitly has an instance with the instance name equal
+# to its module name, e.g. "welcome@welcome". In the *sequence* section,
+# mentioning a module without a full instance key (e.g. "welcome")
+# means that implicit module.
+#
+# An instance must specify its configuration file (e.g. `webview-home.conf`).
+# The implicit instances all have configuration files named `<module>.conf`.
+# This (implict) way matches the source examples, where the welcome
+# module contains an example `welcome.conf`.
+#
+# For more information on running module instances, run Calamares in debug
+# mode and check the Modules page in the Debug information interface.
+#
+# A module that is often used with instances is shellprocess, which will
+# run shell commands specified in the configuration file. By configuring
+# more than one instance of the module, multiple shell sessions can be run
+# during install.
+#
+# YAML: list of maps of string:string key-value pairs.
+#instances:
+#- id:       owncloud
+#  module:   webview
+#  config:   owncloud.conf
+
+# Sequence section. This section describes the sequence of modules, both
+# viewmodules and jobmodules, as they should appear and/or run.
+#
+# A jobmodule instance key (or name) can only appear in an exec phase, whereas
+# a viewmodule instance key (or name) can appear in both exec and show phases.
+# There is no limit to the number of show or exec phases. However, the same
+# module instance key should not appear more than once per phase, and
+# deployers should take notice that the global storage structure is persistent
+# throughout the application lifetime, possibly influencing behavior across
+# phases. A show phase defines a sequence of viewmodules (and therefore
+# pages). These viewmodules can offer up jobs for the execution queue.
+#
+# An exec phase displays a progress page (with brandable slideshow). This
+# progress page iterates over the modules listed in the *immediately
+# preceding* show phase, and enqueues their jobs, as well as any other jobs
+# from jobmodules, in the order defined in the current exec phase.
+#
+# It then executes the job queue and clears it. If a viewmodule offers up a
+# job for execution, but the module name (or instance key) isn't listed in the
+# immediately following exec phase, this job will not be executed.
+#
+# YAML: list of lists of strings.
+sequence:
+- show:
+  - welcome
+  - locale
+  - keyboard
+  - partition
+  - users
+  - summary
+- exec:
+  - partition
+  - mount
+  - unpackfs
+  - machineid
+  - fstab
+  - locale
+  - keyboard
+  - localecfg
+  - luksopenswaphookcfg
+  - luksbootkeyfile
+  - plymouthcfg
+  - initcpiocfg
+  - initcpio
+  - users
+  - displaymanager
+  - mhwdcfg
+  - networkcfg
+  - hwclock
+  - services
+  - grubcfg
+  - bootloader
+  - postcfg
+  - umount
+- show:
+  - finished
+
+# A branding component is a directory, either in SHARE/calamares/branding or
+# in /etc/calamares/branding (the latter takes precedence). The directory must
+# contain a YAML file branding.desc which may reference additional resources
+# (such as images) as paths relative to the current directory.
+#
+# A branding component can also ship a QML slideshow for execution pages,
+# along with translation files.
+#
+# Only the name of the branding component (directory) should be specified
+# here, Calamares then takes care of finding it and loading the contents.
+#
+# YAML: string.
+branding: tromjaro
+
+# If this is set to true, Calamares will show an "Are you sure?" prompt right
+# before each execution phase, i.e. at points of no return. If this is set to
+# false, no prompt is shown. Default is false, but Calamares will complain if
+# this is not explicitly set.
+#
+# YAML: boolean.
+prompt-install: false
+
+# If this is set to true, Calamares will execute all target environment
+# commands in the current environment, without chroot. This setting should
+# only be used when setting up Calamares as a post-install configuration tool,
+# as opposed to a full operating system installer.
+#
+# Some official Calamares modules are not expected to function with this
+# setting. (e.g. partitioning seems like a bad idea, since that is expected to
+# have been done already)
+#
+# Default is false (for a normal installer), but Calamares will complain if
+# this is not explicitly set.
+#
+# YAML: boolean.
+dont-chroot: false
+
+# If this is set to true, Calamares refers to itself as a "setup program"
+# rather than an "installer". Defaults to the value of dont-chroot, but
+# Calamares will complain if this is not explicitly set.
+# oem-setup: true
+
+# If this is set to true, the "Cancel" button will be disabled entirely.
+# The button is also hidden from view.
+#
+# This can be useful if when e.g. Calamares is used as a post-install
+# configuration tool and you require the user to go through all the
+# configuration steps.
+#
+# Default is false, but Calamares will complain if this is not explicitly set.
+#
+# YAML: boolean.
+disable-cancel: false
+
+# If this is set to true, the "Cancel" button will be disabled once
+# you start the 'Installation', meaning there won't be a way to cancel
+# the Installation until it has finished or installation has failed.
+#
+# Default is false, but Calamares will complain if this is not explicitly set.
+#
+# YAML: boolean.
+disable-cancel-during-exec: false