diff --git a/content/_index.md b/content/_index.md
index 9f08cc7a60977fd89c07f6d4b29b77f127d4fd6b..c83f5fcb5d10c327a7d2b2880467844026007d63 100644
--- a/content/_index.md
+++ b/content/_index.md
@@ -85,5 +85,4 @@ platform.
 * [Source code](https://gitlab.apertis.org)
 * [Architectural documentation]( {{< ref "architecture" >}}) 
 * [Development guides]( {{< ref "guides" >}} )
-* [Design documents]( {{< ref "designs" >}} )
 * [Concept designs]( {{< ref "concepts" >}} )
diff --git a/content/concepts/egress_filtering.md b/content/concepts/egress_filtering.md
index 71855ff15a48e981b398ec052ffd02840268794a..e0ec7c0f995065e6e9a11af3adcd222d5f1c1eae 100644
--- a/content/concepts/egress_filtering.md
+++ b/content/concepts/egress_filtering.md
@@ -594,8 +594,8 @@ performed.
 
 ### Attack detection
 
-The platform should have [a heuristic for detecting whether an app has
-been compromised or is malicious]( {{< ref "/attack_detection.md" >}} ).
+The platform should have a heuristic for detecting whether an app has
+been compromised or is malicious.
 
   - The points described as a "probable attack" and "potential attack"
     above may be used as input into this heuristic.
@@ -612,8 +612,7 @@ been compromised or is malicious]( {{< ref "/attack_detection.md" >}} ).
   - If this heuristic considers the app to be unlikely to be
     compromised, the platform should allow it to run unhindered.
   - *Non-requirement:* The exact design of this heuristic is outside the
-    scope of this document, and will be covered by a separate [Attack
-    detection]( {{< ref "/attack_detection.md" >}} ) design.
+    scope of this document, and will be covered by a separate design.
 
 ## Recommendations
 
diff --git a/content/designs/attack_detection.md b/content/designs/attack_detection.md
deleted file mode 100644
index 8ad26cf803a25f5c549ad7d0c4a3a889cccf9bf0..0000000000000000000000000000000000000000
--- a/content/designs/attack_detection.md
+++ /dev/null
@@ -1,28 +0,0 @@
-+++
-date = "2015-12-18"
-weight = 100
-
-title = "Attack detection"
-
-aliases = [
-    "/old-wiki/Attack_detection"
-]
-+++
-
-{{% notice warning %}}
-This concept is an old work in progress.
-{{% /notice %}}
-
-The platform should have a heuristic for detecting whether an app-bundle
-has been compromised or is malicious. This design document, which has
-not yet been written, will collect the various possible inputs to this
-heuristic, and the various actions that might be taken as a result of
-the heuristic deciding that an app-bundle's behaviour is potentially or
-probably malicious.
-
-  - [Egress filtering]( {{< ref "/egress_filtering.md" >}} ) is a potential
-    input: if an application attempts to carry out Internet connections
-    that are not allowed, this is suspicious behaviour.
-  - [Egress filtering]( {{< ref "/egress_filtering.md" >}} ) is a potential
-    action: if an application is detected to be malicious, its Internet
-    connectivity could be limited or cut off.
diff --git a/content/designs/clutter.md b/content/designs/clutter.md
deleted file mode 100644
index 615bd02b7f8880f7560ff38eb75ab64dc03cf58f..0000000000000000000000000000000000000000
--- a/content/designs/clutter.md
+++ /dev/null
@@ -1,462 +0,0 @@
-+++
-title = "Clutter and Multitouch"
-short-description = "Issues with Clutter (obsolete)"
-weight = 100
-toc = true
-aliases = [
-	"/old-designs/latest/clutter.html",
-	"/old-designs/v2019/clutter.html",
-	"/old-designs/v2020/clutter.html",
-	"/old-designs/v2021dev3/clutter.html",
-]
-outputs = [ "html", "pdf-in",]
-date = "2016-05-28"
-+++
-
-# Clutter and Multitouch
-
-## Introduction
-
-This document explains Collabora's design about several issues related
-to the main UI toolkit used in Apertis: Clutter.
-
-## Multi-touch
-
-This section describes the support for multi-touch (MT) events and
-gestures in the Apertis middle-ware. It will be explained which
-requirements Collabora will support and the general architecture of MT
-on Linux and X.Org.
-
-When we mention MT in this document, we refer to the ability of
-applications to react to multiple touch event streams at the same time.
-By gestures, we refer to the higher-level abstraction that groups
-individual touch events in a single meaningful event.
-
-At this point of time (Q1 2012), MT and gesture functionality is
-implemented in several consumer products but is only starting to be
-available in frameworks of general availability such as X.Org and HTML.
-As will be explained later, this is reflected in X.Org just being
-released with [MT functionality],
-Clutter not having MT support in a release yet, and the lack of high level gesture support in X.Org-based
-toolkits. In the same vein, MT is not yet standardized in the web. This
-design will discuss the challenges posed by these facts and ways of
-overcoming them.
-
-###  The multi-touch stack
-
-For the purposes of this document, the MT stack on X.Org is layered as
-follows:
-
-![](/images/multitouch_stack_in_xorg.png)
-
-#### Compositor
-
-The compositor has to be able to react to gestures that may happen
-anywhere in the display. The X server usually delivers events to the
-window where they happen, so the compositor overrides this behavior by
-telling the X server that it has interest in all events regardless of
-where they happen (specifically, it does so by registering a passive
-grab on the root window).
-
-The compositor will receive all events and decide for each whether it
-should be handled at this level, or let it pass through to the
-application to which the underlying window belongs.
-
-For touch events, this isn't done for individual events but rather for
-touch sequences. A touch sequence is the series of touch events that
-starts when a finger is placed on the screen, and finished when it is
-lifted. Thus, a touch sequence belongs to a single finger, and a gesture
-can be composed by as many touch sequences as fingers are involved.
-
-There is a period of time during which the compositor inspects the touch
-events as they come and decides whether it should handle this particular
-gesture, or if it should be ignored and passed to the application. If
-the compositor decides the later, the events that had been already
-delivered to the compositor will be replayed to the application.
-
-The period of time that the compositor needs to decide whether a gesture
-should be handled by applications should be as small as possible, in
-order to not disrupt the user experience.
-
-An application can tell the X server that it doesn't want to have to
-wait until the compositor has let the touch sequence pass. In that case,
-either the gesture shouldn't cause any visible effects in the UI, or
-should be reverted in case the compositor ends up deciding to handle the
-touch sequence by itself.
-
-#### Applications
-
-Widgets inside applications can react to MT events in a way similar to
-how they react to single-touch events. Additionally, some toolkits
-provide additional functionality that make it easier to react to
-gestures. Widgets can either react to a few predefined gestures (tap,
-panning, pinch, etc.), or they can implement their own gesture
-recognizers by means of the lower level MT events.
-
-#### UI toolkits
-
-As mentioned before, UI toolkits provide API for reacting to MT events
-and usually also functionality related to gestures. Because MT is so new
-to X.Org, UI toolkits based on X.Org don't implement yet everything that
-applications would need regarding MT and gestures, so for now additional
-work needs to happen at the application level.
-
-#### libXi
-
-This library allow toolkits to communicate with the XInput extension in
-the X.Org server. Communication with the X.Org server is asynchronous
-and complex, so having a higher level library simplifies this
-interaction.
-
-#### X.Org server
-
-The X.Org server delivers input events to each application based on the
-coordinates of the event and the placement of the application windows.
-
-#### evdev X.Org input driver
-
-This input driver for X.Org uses udev to discover devices and evdev to
-get input events from the kernel and posts them to the X.Org server.
-
-If it is needed to apply a jitter-reduction filter and it's impossible
-to do so in the kernel device driver, then we recommend to patch the
-evdev X.Org input driver.
-
-#### MTDev
-
-For device drivers that use the legacy MT protocol as opposed to the new
-slots protocol, the X.Org input driver will use libmtdev to translate
-events from the old protocol (type A) to the new one (type B).
-
-> See <http://www.kernel.org/doc/Documentation/input/multi-touch-protocol.txt>
-
-#### Kernel event driver (evdev)
-
-This kernel module will emit input events in a protocol that the evdev
-X.Org input driver can understand.
-
-#### Kernel device driver
-
-This kernel module is hardware-dependent and will interface with the
-hardware and pass input events to the evdev event driver.
-
-###  Requirements
-
-####  Multitouch event handing in Clutter applications
-
-Clutter will have APIs for reacting to multi-touch input events and for
-recognizing gestures.
-
-The Apertis middleware will have the support that Clutter requires to
-provide MT and gestures functionality, as described later in this
-document.
-
-Though it is expected that Clutter will eventually provide support for
-recognizing a few basic gestures such as taps and panning, more advanced
-gestures will have to be implemented outside Clutter. In the Apertis
-case, recognizing additional gestures will have to be done by the
-applications themselves or by the SDK API.
-
-New gestures will be developed using the gesture framework in Clutter,
-regardless of whether the gesture recognition is implemented in the SDK,
-compositor or applications. In other words, new gestures can be
-developed making use of the Clutter API, but the code that implements
-them can belong to applications, compositors or libraries. No
-modifications to Clutter are required to implement new gestures.
-
-####  Full-screen event handing in applications
-
-Applications should be able to handle events anywhere in the screen even
-if their windows don't cover the whole of it. For example, there may be
-windows belonging to the system such as a launcher panel or a status bar
-in the screen, but a gesture that starts in one of the auxiliary windows
-should be handled by the focused application.
-
-####  Multi-touch event handling in Mutter
-
-The compositor based on Mutter will be able to react to multi-touch
-input events and recognize gestures using the same Clutter API as
-applications.
-
-The compositor will be able to register for MT sequences before
-applications get them, so it can claim ownership over them in case a
-system-wide gesture is detected. Even then, applications will be able to
-get all events that happen in their windows though care needs to be
-taken in case the compositor ends up claiming ownership.
-
-####  Multitouch event handing in web applications
-
-Although there are no approved specifications yet on how browsers should
-expose MT events to web content, some browsers have started already to
-provide experimental APIs and some websites are using them. Most notable
-are the Safari browser on iOS and websites that target specifically
-iPhone and iPad devices, though nowadays other WebKit-based browsers
-implement MT events and more websites are starting to use them.
-
-A [spec][w3-touch-spec] is being drafted by the W3C on base on the WebKit
-implementation, but attention must be paid to the fact that because it's
-still a draft, it may change in ways that are incompatible with WebKit's
-implementation and the later may not always be in sync with the spec.
-
-####  Support two separate touchscreens
-
-The Apertis middleware will be able to drive two screens, each with
-multi-touch support.
-
-####  Support out-of-screen touch events
-
-The reactive area of the touchscreen may extend past the display and the
-user will be able to interact with out-of-screen UI elements.
-
-####  Actors with bigger reactive area
-
-So the UI is more tolerant to erratic touch events (caused for example
-by a bumpy road), some actors will be reactive past the boundaries of
-their representation in the screen.
-
-###  Approach
-    
-####  Multitouch event handing in Clutter applications
-
-MT support in X.Org is very recent, so Collabora will have to update
-several components (mainly belonging to X) in the stack because Precise
-is not going to ship with the versions that are needed.
-
-Clutter 1.8 had support for single-touch gestures. In 1.10, support for
-multi-touch event handling landed, and it is expected that for 1.12
-(August 2012), support for multi-touch gestures will be added. It's also
-planned to have support for rotation and pinch gestures in
-[Clutter 1.12].
-
-####  Full-screen event handing in applications
-
-In order for applications to be able to handle events anywhere in the
-screen even if their windows do not cover the whole of it, applications
-will have to set grabs on the other visible windows, even if they don't
-belong to the application process.
-
-So in the case that the currently-focused application is displayed along
-with a launcher panel and a status bar, the application process should
-set a grab on those windows for the events that it is interested in.
-When another application becomes focused, the first one releases the
-grab and the second takes it.
-
-In order to make sure that the second application takes the grab as soon
-as possible, it should try calling XIGrabTouchBegin repeatedly until it
-stops failing with BadAccess (this will happen once the previously
-focused application has removed its grab).
-
-So the compositor can still handle system-level gestures as explained in
-2.3.3, it will have to set a grab on an invisible window that is the
-parent of each additional window.
-
-This is so complex because this scenario is a bit removed from the
-design of event delivery in X. In Wayland, as the compositor is also the
-display server and has total control over event delivery, it could
-redirect events to application windows instead of to the panels.
-
-####  Multi-touch event handling in Mutter
-
-Current releases of Mutter use XLib for event management, which doesn't
-support multi-touch. To Collabora's knowledge, there aren't as of yet
-any Mutter-based products that make use of system-wide multi-touch
-gestures.
-
-> See <https://wiki.gnome.org/GnomeOS/Design/Whiteboards/Touchscreen#Mutter_problems>
-
-Collabora has [modified][tomeu-multitouch]
-Mutter to allow plugins to register for touch events and to pass them to Clutter so subclasses of
-ClutterGestureAction can be used.
-
-Though applications are able to start receiving MT events even before
-the compositor rejects ownership, Collabora recommends that applications
-don't do that and instead that all efforts are directed towards having
-the compositor recognize gestures as fast as possible.
-
-Otherwise, it will be very hard to avoid glitches in the user experience
-when the compositor decides to handle a gesture and the application
-already started to react to it.
-
-By limiting system-wide gestures to those with 4 or 5 fingers as iOS 5
-does (what Apple calls *multitasking gestures*), the compositor should
-be able to decide whether to take ownership of a MT sequence with a
-minimal delay and without applications having to do anything on their
-side. Gestures with less than 4 fingers will be considered as intended
-for applications and the compositor will decline ownership immediately.
-
-This diagram illustrates how the different components interact when
-handling touch events:
-
-![](/images/event_delivery.png)
-
-If there is a window that gets placed on top of the others
-(specifically, the “busy” indicator animation) and it shouldn't get any
-events, it can be marked as such with the XShapeCombineRegion call,
-passing an empty region and the ShapeInput destKind.
-
-> See <http://article.gmane.org/gmane.comp.kde.devel.kwin/19992>
-
-This way, any events that the compositor doesn't intercept will be delivered to the
-currently-focused application.
-
-####  Multi-touch event handing in web applications
-
-Collabora will implement the port specific bits of MT in WebKit-Clutter
-to ensure that it has state-of-the-art WebKit MT support, but won't be
-changing the behavior of the generic WebKit implementation nor working
-on the specification level.
-
-Collabora won't be implementing any high-level gesture support because
-they are far from being specified and its support in browsers is very
-experimental.
-
-####  Support two separate touchscreens
-
-There is support in X.Org for arbitrarily matching input devices to
-screens, though the configuration [isn't straightforward][xorg-transfo-matrix].
-Collabora will test the simultaneous support of 2 touch-screens and produce
-documentation about how to configure X.Org in this regard during the
-development phase of the project.
-
-####  Support out-of-screen touch events
-
-Regarding out-of-screen events support, we propose writing a daemon that
-listens for events from the touchscreen kernel driver and that, based on
-its configuration, translates those to key presses for special key codes
-that correspond to each button.
-
-As the X evdev driver will also get those events, it has to be
-configured to ignore touch events outside the screen area.
-
-In the SDK, a wrapper around Xephyr will be provided that synthesizes
-key events when buttons around the Xephyr screen are pressed, simulating
-the ones in the real hardware.
-
-####  Actors with bigger reactive area
-
-Clutter actors tell the Clutter framework in which area of the screen
-they are sensitive to pointer events. This area usually matches the area
-that the actor uses to display itself, but the actor could choose to
-mark a bigger area as its reactive area.
-
-Though the Clutter maintainer has recommended this approach, he warns
-that the optimization that culls actors based on their paint volumes
-might get in the way in this case.
-
-Collabora will verify that this works and communicate with the upstream
-community in case any problem is discovered.
-
-###  Risks
-
-The [DDX] driver provided by the hardware vendor should support
-having a frame-buffer that is bigger than the actual display resolution,
-for the out-of-screen touch events.
-
-## Smooth panning
-
-This section proposes an improvement to the kinetic scrolling
-functionality in Mx so that panning is smooth even when the input
-device's resolution is very low. This is going to affect only to Clutter
-applications that use MxKineticScrollView as the container of scrollable
-areas.
-
-The problem with input devices with low resolution is that as the finger
-moves during panning, the motion events received by the application are
-similarly low-resolution (i.e., occurring infrequently). Given that Mx
-currently updates the position in the scrolled view to match the
-position of the finger, the panning movement appears "jumpy".
-
-###  Requirements
-
-When panning, the position in the scrolled view will smoothly
-interpolate to the last finger position, instead of jumping there
-straight away. The visual effect would be that of the scroll position
-lagging slightly behind the finger. The lower the resolution of the
-touch screen, the bigger the lag.
-
-###  Approach
-
-Collabora will rewrite the part of the [MxKineticScrollView]
-widget that tracks the finger position when panning, ideally using the function
-[mx_adjustment_interpolate] to animate the movement along the path between
-the current position and the finger position. The time function ([ClutterAlpha])
-used in the interpolation animation will be configurable, as well as the speed at which the scrolling position will
-follow the finger.
-
-###  Risks
-
-Upstream could decide to reject this feature when it is proposed for
-inclusion because of the substantial added complexity to a widget
-(MxKineticScrollView) that is already pretty complex. However,
-preliminary discussions with the Mx maintainers show that they are
-interested in gaining this functionality.
-
-Another risk is Intel not funding all the work in Clutter that it has
-committed to. In that case, Collabora may need to do the work.
-
-## Documentation
-
-The following items have been identified for future documentation work
-later in the project:
-
-  - Add a section to the Clutter Cookbook about implementing a
-    ClutterGestureAction subclass.
-
-  - Best practices about MT gestures in user experience, both
-    system-wide and application gestures. Compare these guidelines with
-    the equivalent ones in iOS and Android.
-
-  - Best practices about performance with Clutter and Mx (including how
-    to write containers which are responsive independently of the number
-    of children and how to drag actors across the screen).
-
-  - Best practices about using and writing reusable UI components
-    (including Mx widgets), and explicitly these subjects (to be
-    specified further at a later stage):
-
-      - Panning actors
-
-      - Finger moves outside the “active area” of an actor (e.g., moving button of timeline in video very fast)
-
-      - Snap forward/backward to final position
-
-      - Expand/shrink of groups (sliding)
-
-  - Best practices about writing applications in which functionality and
-    UI are separate, so derivatives can be written by replacing the UI
-    and without having to modify the rest of the application.
-
-### Design notes
-
-The following items have been identified for future investigation and
-design work later in the project and are thus not addressed in this
-design:
-
-  - Support two separate touchscreens
-
-  - Support out-of-screen touch events
-
-  - Implement jitter reduction (there already has an algorithm), taking
-    into account that the input driver may be a binary blob
-
-  - Implement zoom via pitch gestures in Google Earth without having
-    access to its source
-    code
-
-[MT functionality]: http://lists.x.org/archives/xorg-announce/2012-March/001846.html
-
-[w3-touch-spec]: http://dvcs.w3.org/hg/webevents/raw-file/tip/touchevents.html
-
-[Clutter 1.12]: http://wiki.clutter-project.org/wiki/ClutterRoadMap#1.12
-
-[tomeu-multitouch]: http://blog.tomeuvizoso.net/2012/09/multi-touch-gestures-in-gnome-shell.html
-
-[xorg-transfo-matrix]: http://www.x.org/wiki/XInputCoordinateTransformationMatrixUsage
-
-[DDX]: http://dri.freedesktop.org/wiki/DDX
-
-[MxKineticScrollView]: http://docs.clutter-project.org/docs/mx/stable/MxKineticScrollView.html
-
-[mx_adjustment_interpolate]: http://docs.clutter-project.org/docs/mx/stable/MxAdjustment.html#mx-adjustment-interpolate
-
-[ClutterAlpha]: http://developer.gnome.org/clutter/stable/ClutterAlpha.html
diff --git a/content/designs/list.md b/content/designs/list.md
deleted file mode 100644
index 0a9c2ffa97e32fd2618da775e283b35d4dbcde52..0000000000000000000000000000000000000000
--- a/content/designs/list.md
+++ /dev/null
@@ -1,1210 +0,0 @@
-+++
-title = "List design"
-short-description = "Architecture and API design for the list widgets in Apertis (unimplemented)"
-weight = 100
-toc = true
-aliases = [
-	"/old-designs/latest/list.html",
-	"/old-designs/v2019/list.html",
-	"/old-designs/v2020/list.html",
-	"/old-designs/v2021dev3/list.html",
-]
-outputs = [ "html", "pdf-in",]
-date = "2016-11-24"
-+++
-
-# List design
-
-The goal of this list design document is to establish an appropriate
-architecture and API design for the list widgets in the Apertis
-platform.
-
-Historically, the roller widget has provided a list widget on a cylinder
-with no conceptual beginning or end and is manipulated naturally by the
-user. For non-cylindrical lists there was a separate widget with a
-different API and different usage. The goal is to consolidate list
-operations into a base class and be able to use the same simple API to
-use both cylindrical lists and non-cylindrical lists.
-
-![](/images/roller_screenshot.png)
-
-The above shows an example of the roller widget in use inside the music
-application. There are multiple roller widgets for showing album,
-artist, and song. Although they are manipulated independently, their
-contents are linked.
-
-## Terminology and concepts
-    
-### Vehicle
-
-For the purposes of this document, a *vehicle* may be a car, car
-trailer, motorbike, bus, truck tractor, truck trailer, agricultural
-tractor, or agricultural trailer, amongst other things.
-
-### System
-
-The *system* is the infotainment computer in its entirety in place
-inside the vehicle.
-
-### User
-
-The *user* is the person using the system, be it the driver of the
-vehicle or a passenger in the vehicle.
-
-### Widget
-
-A *widget* is a reusable part of the user interface which can be changed
-depending on location and function.
-
-### User interface
-
-The *user interface* is the group of all widgets in place in a certain
-layout to represent a specific use-case.
-
-### Roller
-
-The *roller* is a list widget named after a cylinder which revolves
-around its central horizontal axis. As a result of being a cylinder it
-has no specific start and finish and appears endless.
-
-### Application author
-
-The *application author* is the developer tasked with writing an
-application using the widgets described in this document. They cannot
-modify the variant or the user interface library.
-
-### Variant
-
-A *variant* is a customised version of the system by a particular system
-integrator. Usually variants are personalised with particular colour
-schemes and logos and potentially different widget behaviour.
-
-## Use cases
-
-A variety of use cases for list design are given below.
-
-### Common API
-
-An application author wants to add a list widget to their application.
-At that moment it is not known whether a simple list widget or a roller
-widget will suit the application better. Said application author doesn't
-want to have a high overhead in migrating code from one widget to
-another.
-
-### MVC separation
-
-A group of application authors wants to be able to split the work
-involved in developing their application into teams such that, adhering
-to the interfaces provided, they can develop the different parts of the
-application and easily put them together at the end.
-
-### Data backend agnosticity
-
-An application author wishes to display data stored in a database, and
-does not want to duplicate this data in an intermediary data structure
-in order to do so.
-
-### Kinetic scrolling
-
-The user wants to be able to scroll lists using their finger in such a
-way that the visual response of the list is as expected. Additionally,
-the system integrator wants the user to have visual feedback when the
-start or end of a list is reached by the list bouncing up and back down
-(the *elastic effect*). However, another system integrator wants to
-disable this effect.
-
-The user expectations include the following:
-
-  - The user expects the scroll to only occur after a natural threshold
-    of movement (as opposed to a tap), for the list to continue
-    scrolling after having removed their finger, and for the rate of
-    scroll to decrease with time.
-
-  - The user expects to be able to stop a scroll by tapping and holding
-    the scrolling area.
-
-  - The user expects a flick gesture to re-accelerate a scroll without
-    any visible stops in the animation.
-
-  - The user expects video elements to continue playing during a scroll.
-
-  - When there are not enough items to fill the entire height of the
-    list area the user expects a scroll to occur but using the elastic
-    effect fall back to the centre.
-
-  - The user expects a horizontal scroll gesture to not also scroll in
-    the vertical direction.
-    
-### Roller focus handling
-
-In the roller widget, the user wants the concept of focus to be
-highlighted by the list scrolling such that the focused row is in the
-vertical centre.
-
-Additionally, the user wants to be able to easily focus another
-unfocused visible item in the list simply by pressing it.
-
-### Animations
-
-The user wants to have a smooth and natural experience in using either
-list widget. If the scrolling stops half-way into an item and it is
-required that one item is focused (see[roller focus handling]( {{< ref "#roller-focus-handling" >}} )), they want
-the list to bounce a small scroll to focus said item.
-
-### Item launching
-
-An application author wants to be able to perform some
-application-specific behaviour in response to the selecting of an item
-in the list. However, they want to provide some confirmation before
-launching an item in a list. They want the two step process to be:
-
-1.  The desired item is focused by scrolling to it or tapping on it.
-
-2.  The focused item is tapped again which confirms the intention to
-    launch it.
-    
-### Header and footer
-
-The application author wants to add a header to the column to make it
-clear exactly what is in said column. (An example can be seen in
- [List design]( {{< ref "#list-design" >}} ) in the music application.)
-
-Another system integrator wants the column names to be shown above the
-widget in a footer instead of a header.
-
-### Roller rollover
-
-In the roller widget, by definition, the user wants to scroll from the
-last item in the list back to the first without having to go all the way
-back up.
-
-Additionally, the user wants the wrap around to be made more visually
-obvious with increased resistance when scrolling past the fold between
-end and start again.
-
-### Widget size
-
-The application author wants any list widget to expand into space
-allocated to it by its layout manager. If there are not enough items in
-the list to fill all available space said application author wants the
-remaining space to be blank, but still used by the list widget.
-
-### Click activation
-
-A system integrator wants to choose between single click and double
-click activation (see[item launching]( {{< ref "#item-launching" >}} )) for use in the list widgets. This
-is only expected once the item has already been focused (see also[roller focus handling]( {{< ref "#roller-focus-handling" >}} )).
-
-The decision of single or double click is given to the system integrator
-instead of the application author in order to retain a consistent user
-experience.
-
-### Consistent focus
-
-The user focuses an item in the list and a new item is added. The user
-expects the new item not to change the scroll position of the list and
-more importantly not to change the currently focused row.
-
-### Focus animation
-
-An application author wants an item in the list to be able to perform an
-animation after being focused.
-
-### Mutable list
-
-An application author wants to be able to change the contents of a list
-shown in the user interface after having created the widget and shown it
-in the user interface.
-
-### UI customisation
-
-A system integrator wants to change the look and feel of a list widget
-without having to change any of the application code.
-
-### Blur effect
-
-A system integrator wants items in the list to be slightly blurred when
-scrolling fast to exaggerate the scrolling effect. Another system
-integrator wants to disable this blur.
-
-### Scrollbar
-
-A system integrator wants a scrollbar to be visible for controlling the
-scrolling of the list. Another system integrator doesn't want the
-scrollbar visible.
-
-### Hardware scroll
-
-A system integrator wants to use hardware buttons to facilitate moving
-the focus up and down the list. The system integrator wants the list to
-scroll in pages and for the focus to remain in order. For example, a
-list contains items A, B, C, and D. When the *down* hardware button down
-is pressed, the page moves down to show items E, F, G, and H, and the
-focus moves to item E as it is the first on the page.
-
-### On-demand item resource loading
-
-The music application lists hundreds of albums but the application
-author doesn't want the album art thumbnail to be loaded for every item
-immediately as it would take too long and slow the system down. Instead,
-said application author wants album art thumbnail to load only once
-visible and have a placeholder picture in place until then.
-
-### Scroll bubbles
-
-A system integrator wants [bubbles] to appear when scrolling and
-disappear when scrolling has stopped.
-
-### Item headers
-
-An application author wants to display items in a list but have a
-logical separation into sections. For example, in a music application,
-listing all tracks of an artist and separating by album.
-
-Another application author wants said headers to stick to the top of the
-widget so they are always visible, even if the first item has been
-scrolled past and is no longer visible.
-
-### List with tens of thousands of items
-
-An application author wants to display a list containing thousands
-of items, but does not want to incur the initial cost of instantiating
-all the items when creating the list.
-
-
-### Flow layout
-
-An application author wants the list widget to render as a grid with
-multiple items on the same line. The following video shows such a grid layout.
-
-<video width="640" height="480" controls>
-  <source src="/images/album_cover_roller.mp4" type="video/mp4">
-  <source src="/images/album_cover_roller.ogv" type="video/ogg">
-</video>
-
-### Concurrent presentation of the same model in different list widgets
-
-An application author wants to present the same model in two side-by-side
-list widgets, possibly with different filtering or sorting.
-
-## Non-use cases
-
-A variety of non-use cases for the list design are given below.
-
-### Tree views
-
-An application author wants to show the filesystem hierarchy in their
-application. They understand that multi-dimension models (or trees)
-where items can be children of other items are not supported by the
-Apertis list widgets (hence the name list).
-
-### List widget without a backing model
-
-An application wants to display a list of items in the list widget,
-but does not wish to create a model and pass it to the list widget,
-and would rather use helper functions in the list widget, such as
-`list_add_item(List *list, ListItem *item)`.
-
-Such an interface is not considered necessary, at least for this
-version of the design document, because we want to encourage use of models
-so that the UI views themselves can be rearranged more easily.
-
-If, in the future, such an interface was considered desirable, its
-API should be similar to the [`GtkListBox`] API, such as
-`gtk_list_box_row_changed()`.
-
-### Sticky header and footer
-
-An application developer wants an actor to stick to the top or
-the bottom of the list widget, and always be visible regardless
-of scrolling.
-
-This is best handled as a separate actor, sharing a common parent
-with the list widget.
-
-## Requirements
-    
-### Common API
-
-There should be a common API between both list widgets (see[common api]( {{< ref "#common-api" >}} )).
-Changing from a list widget to a roller widget or the other way around
-should involve only trivial changes to the code leading to a change in
-behaviour.
-
-### MVC separation
-
-The separation between components that use the list widgets should be
-functional and enable application authors and system integrators to swap
-out parts of applications easily and quickly (see[mvc separation]( {{< ref "#mvc-separation" >}} )).
-
-The implementation of the model should be of no impact to the
-functionality of the widget. As a result the widget should only refer to
-the model using an interface which all models can implement.
-
-### Data backend agnosticity
-
-The widget should not require application authors to store their backing
-model in any particular way.
-
-### Kinetic scrolling
-
-Both list widgets should support kinetic scrolling from user inputs (see[kinetic scrolling]( {{< ref "#kinetic-scrolling" >}} )). That is, when the user scrolls using their finger,
-he or she can *flick* the list up or down and the scroll will continue
-after the finger is released and gradually slow down. This animation
-should feel natural to the user as if he or she is moving a wheel up or
-down, with minimal friction. The animation should also be easily stopped
-by tapping once.
-
-#### Elastic effect
-
-In the list widget with a defined start and finish, on trying to scroll
-there should be visual feedback that the start or finish of the list has
-been reached. This visual feedback should be accomplished using the
-*elastic effect*. That is, when the bottom is reached and further
-downward scrolling is attempted, an empty space slowly appears with
-resistance, and pops back when the user releases their finger.
-
-This is not necessary on the roller widget because the list loops and
-there is no defined start and finish to the list.
-
-It should be easy to turn this feature off as it may be undesired by the
-system integrator (see[kinetic scrolling]( {{< ref "#kinetic-scrolling" >}} )).
-
-### Item focus
-
-In both list and roller widgets there should be a concept of focus which
-only one item has at any one point. How to display which item has focus
-depends on the widget.
-
-### Roller focus handling
-
-In the roller widget the focused item should always be in the vertical
-centre of the widget (see[roller focus handling]( {{< ref "#roller-focus-handling" >}} )). The focused item
-should visually change and even expand if necessary to demonstrate its
-focused state (see also[focus animation]( {{< ref "#focus-animation" >}} )).
-
-Changing which item is focused should be possible by clicking on another
-item in the list.
-
-### Animations
-
-It should be possible to add animations to widgets to allow for moving
-the current scroll location of the list up or down (see[animations]( {{< ref "#animations" >}} )).
-This should be customisable by the system integrator and application
-author depending on the application in question but should retain the
-general look and feel across the entire system.
-
-### Item launching
-
-Focused items (see  [Item focus]( {{< ref "#item-focus" >}} )) should be able to be launched using
-widget-specific bindings (clicks or touches) (see  [Click activation]( {{< ref "#click-activation" >}} )).
-
-### Header and footer
-
-It should be possible to add a header to a list to provide more context
-as to what the information is showing (see[header and footer]( {{< ref "#header-and-footer" >}} ) and the
-screenshot in  [List design]( {{< ref "#list-design" >}} )). This should be customisable by the
-application author and should be consistent across the entire system.
-
-### Roller rollover
-
-The rollover of the two list widgets should be different and
-customisable by the system integrator (see[roller rollover]( {{< ref "#roller-rollover" >}} ) and[ui customisation]( {{< ref "#ui-customisation" >}} )).
-
-The roller widget should roll over from the end of the list back to the
-beginning again, like a cylinder would (see  [List design]( {{< ref "#list-design" >}} ) and  [Roller]( {{< ref "#roller" >}} )).
-Additionally the system integrator should be able to customise whether
-they want extra resistance in going back to the beginning. This is
-visual feedback to ensure the user knows they are returning to the
-beginning of the list.
-
-The non-roller list widget should not have a rollover and should have a
-well-defined start and finish, with visual effects as appropriate (see
- [Elastic effect]( {{< ref "#elastic-effect" >}} )).
-
-### Widget size
-
-The list widgets should expand to fill out all space that has been
-provided to them (see[widget size]( {{< ref "#widget-size" >}} )). They should fill any space not
-required with a blank colour, specified by the variant UI customisation
-(see[ui customisation]( {{< ref "#ui-customisation" >}} )).
-
-### Consistent focus
-
-The focus of items in a list should remain consistent despite
-modification of the list contents (see[consistent focus]( {{< ref "#consistent-focus" >}} )). Adding items
-before or after the currently focused item shouldn't change its focused
-state.
-
-### Focus animation
-
-The application author and system integrator should be able to specify
-whether there is an animation in selecting an item in a list (see[focus animation]( {{< ref "#focus-animation" >}} ) and[ui customisation]( {{< ref "#ui-customisation" >}} )). This could mean expanding an item to
-make the item focused larger vertically and even display extra controls
-which were previously hidden under the fold.
-
-During this animation, input should not be possible.
-
-### Mutable list
-
-The items shown in the list widgets and their content should update
-dynamically when the model backing the widget is updated (see[mutable list]( {{< ref "#mutable-list" >}} )). This should require no extra effort on the part of the
-application author.
-
-### UI customisation
-
-Both list widgets should be visibly customisable in the same way the
-rest of the system is and should honour UI customisations made by the
-system integrator (see[ui customisation]( {{< ref "#ui-customisation" >}} )). In this way, the list widgets
-should use CSS (see the UI Customisation Design document) for styling.
-
-### Blur effect
-
-The list widget should support slightly blurring list items only when
-scrolling (see[blur effect]( {{< ref "#blur-effect" >}} )). It should be easily to disable this feature
-by another system integrator who doesn't want the blur.
-
-### Scrollbar
-
-The list widget should support showing and hiding a scrollbar as
-necessary (see[scrollbar]( {{< ref "#scrollbar" >}} )). It should be easy to disable this feature by
-another system integrator who doesn't want to display a scrollbar.
-
-### Hardware scroll
-
-The list widget should support scrolling using hardware buttons and
-therefore always have one item focused [hardware scroll]( {{< ref "#hardware-scroll" >}} )). Hardware
-button callbacks should use the [adjustments][mx-scrollable] on the list widget to
-change the subset of visible items and the appropriate list widget
-function for moving the focus to the next item. Hardware button signals
-are generated as described in the Hardkeys Design.
-
-### On-demand item resource loading
-
-Items in the list need to know when they are visible (and not past the
-current scroll area) so they know when to load expensive resources, such
-as thumbnails from disk (see  [On-demand item resource loading]( {{< ref "#on-demand-item-resource-loading" >}} )).
-
-### Scroll bubbles
-
-The scrollbar (see also[scrollbar]( {{< ref "#scrollbar" >}} )) should support showing bubbles to
-show the scroll position (see[scroll bubbles]( {{< ref "#scroll-bubbles" >}} )). It should be possible to
-disable the bubble and change its appearance when necessary.
-
-### Item headers
-
-It should be possible to add separating headers to sets of items in the
-list widgets (see[item headers]( {{< ref "#item-headers" >}} )). Said headers should also be sticky if
-specified.
-
-### Lazy list model
-
-It should be possible to provide a ‘lazy list store’ to the widget,
-in which items would be created on demand, when they need to be
-displayed to the user.
-
-This model could make memory usage and instantiation performance independent
-of the number of items in the model.
-
-See  [List with tens of thousands of items]( {{< ref "#list-with-tens-of-thousands-of-items" >}} )
-
-### Flow layout
-
-It should be possible for *n* items, each of the same width and height, to be
-packed in the same row of the list, where *n* is calculated as the floor of
-the list width divided by the item width. There is no need for the programmer
-to set *n* manually.
-
-### Reusable model
-
-The underlying model should not have to be duplicated in order to present it
-in multiple list widgets at the same time.
-
-See  [Concurrent presentation of the same model in different list widgets]( {{< ref "#concurrent-presentation-of-the-same-model-in-different-list-widgets" >}} )
-
-## Approach
-
-### Adapter interface
-
-As required by[data backend agnosticity1]( {{< ref "#data-backend-agnosticity1" >}} ), the backing data model format
-should not be imposed by the list widget upon the application developer.
-
-As such, an ‘adapter’ is required, similar to Android's [`ListAdapter`], this
-adapter will make the bridge between the list widget and the data that backs
-the list, by formatting data from the underlying model as list item widgets
-for rendering.
-
-The following diagram illustrates how this adapter helps decoupling the list
-widget from the underlying model.
-
-![list adapter flowchart](/images/list_adapter_flowchart.png)
-
-> In the above example, we assume a program that simply displays a list widget
-> exposing items stored in a database, and an adapter that stores strong
-> references to the created list items, and will eventually cache them all
-> if the list widget is fully scrolled down by the user. This is as opposed to
-> the approach presented in  [Lazy list model]( {{< ref "#lazy-list-model" >}} ) where memory usage is also
-> taken into account.
->
-> The ‘cursor’ is a representation of whatever database access API is in use,
-> as most databases use cursor-based APIs for reading.
-
-An interface for this adapter (the contents of the list widgets) is
-required such that it can be swapped out easily where necessary
-(see[mvc separation]( {{< ref "#mvc-separation" >}} ),  [Lazy list model]( {{< ref "#lazy-list-model" >}} )).
-
-GLib recently (since version 2.44) added an interface for this very
-task. [`GListModel`] is an implementation-agnostic interface for
-representing lists in a single dimension. It does not support tree
-models (see  [Tree views]( {{< ref "#tree-views" >}} )) and contains everything required for the
-requirements specified in this document.
-
-It should be noted that `GListModel`, which is for arbitrary containers, is
-entirely unrelated to the `GList` data structure, which is for doubly linked
-lists.
-
-In addition to functions for accessing the contents of the adapter, there is
-also an `items-changed` signal for notifying the view (the list widget and list
-item widgets it contains; see[mvc separation]( {{< ref "#mvc-separation" >}} ))
-that it should re-render as a result of something changing in the adapter.
-
-### GtkListBox
-
-[`GtkListBox`] is a GTK+ widget added in 3.10 as a replacement for the
-very complicated [`GtkTreeView`] widget. `GtkTreeView` is used for
-displaying complex trees with customisable cell renderers, but more
-often lists are used instead of trees.
-
-`GtkListBox` doesn't have a separate model backing it (but one can be
-used), and each item is a `GtkListBoxRow` (which is in turn a `GtkWidget`).
-This makes using the widget and modifying its contents especially easy
-using the [`GtkContainer`] functions. Items can be activated (see[item launching]( {{< ref "#item-launching" >}} ) or selected (see  [Item focus]( {{< ref "#item-focus" >}} )).
-
-`GtkListBox` has been used in many GNOME applications since its addition
-and has shown that its API is sufficient for most simple use cases, with
-a limited number of items.
-
-However `GtkListBox` is not scalable, as its interface requires that all its
-rows be instantiated at initialisation, in order for example to add headers
-to sections, and still be able to scroll accurately to any random position
-in the list (random access).
-
-As such, its API is only of a limited interest to us, particularly when it
-comes to[item headers]( {{< ref "#item-headers" >}} ) or[filtering]( {{< ref "#filtering" >}} ).
-
-### GtkFlowBox
-
-[GtkFlowBox] is a GTK+ widget added in 3.12 as a complement to `GtkListBox`.
-Its API takes a similar approach to that of `GtkListBox`: it doesn't have a
-separate model backing it – but one can be used – and each item is a
-`GtkFlowBoxChild` which contains the content for that item.
-
-As with `GtkListBox`, its API is interesting to us for its approach to
-reflowing children; see  [Column layout]( {{< ref "#column-layout" >}} ).
-
-### Widget size
-
-The list widgets should expand to fill space assigned to them (see[widget size]( {{< ref "#widget-size" >}} )). This means that when there are too few items to fill space
-the remaining space should be filled appropriately, but when there are
-more items than can be shown at one time the list should be put into a
-scrolling container.
-
-In Clutter, actors are made to expand to fill the space they have been
-assigned by setting the `x-expand` and `y-expand` properties on
-`ClutterActor`. For example:
-
-``` c
-/* this actor will expand into horizontal space, but not into vertical
- * space, allocated to it. */
-clutter_actor_set_x_expand (first_actor, TRUE);
-clutter_actor_set_y_expand (first_actor, FALSE);
-
-/* this actor will expand into vertical space, but not into horizontal
- * space, allocated to it. */
-clutter_actor_set_x_expand (second_actor, FALSE);
-clutter_actor_set_y_expand (second_actor, TRUE);
-
-/* this actor will stretch to fill all allocated space, the
- * default behaviour. */
-clutter_actor_set_x_align (third_actor, CLUTTER_ACTOR_ALIGN_FILL);
-
-/* this actor will be centered inside the allocation. */
-clutter_actor_set_x_align (fourth_actor, CLUTTER_ACTOR_ALIGN_CENTER);
-```
-
-More details can be found in the [`ClutterActor`] documentation.
-
-The list item widgets (as described in[adaptermodel implementation]( {{< ref "#adaptermodel-implementation" >}} )) are packed
-by the list widget and so application authors have no control over their
-expanding or alignment.
-
-A suitable scrolling container to put a list widget into is the
-[`MxKineticScrollView`] as it provides kinetic scrolling (see[kinetic scrolling]( {{< ref "#kinetic-scrolling" >}} )
-and  [Elastic effect]( {{< ref "#elastic-effect" >}} )) using touch events. Additionally, the
-`MxKineticScrollView` should be put into an `MxScrollView` to get a
-scrollbar where appropriate (see[scrollbar]( {{< ref "#scrollbar" >}} )).
-
-For support of `MxKineticScrollView` the list widgets should implement the
-`MxScrollable` interface, which allows getting and setting the
-adjustments, and is necessary in showing a viewport into the interface
-
-The exact dimensions in pixels for the widget shouldn't be specified by
-the application author as it means changes to the appearance desired by
-a system integrator are much more difficult to achieve.
-
-### Adapter/Model implementation
-
-As highlighted before (in  [Adapter interface]( {{< ref "#adapter-interface" >}} )), the list widget should
-make no assumption about how the backing data is stored. An adapter data
-structure should be provided, making the bridge between the backing data
-and the list widget, by returning list item actors for any given position.
-
-The `GListModel` interface requires all its contained items to be
-[`GObject`s with the same `GType`][GListModel-desc].
-
-It is suggested that the items themselves are all instances of a new
-`ListItem` class, which will inherit from `ClutterActor`, and implement
-selection and activation logic.
-
-[`GListStore`] is an object in GLib which implements `GListModel`. It
-provides functions for inserting and appending items to the model but no
-more. For small lists, it is suggested to either use `GListStore` directly or
-implement a thin subclass to give more type safety and better-adapted function
-signatures.
-
-In these simple cases, `GListStore` will act as both the adapter *and* the
-backing model, as it is storing `ListItem` widgets. For more complicated use
-cases (where the same data source is being used by multiple list widgets), the
-adapter and backing model must be separated, and hence `GListStore` is not
-appropriate as the adapter in those cases. See  [Decoupled model]( {{< ref "#decoupled-model" >}} ).
-
-### Decoupled model
-
-As shown in  [Adapter interface]( {{< ref "#adapter-interface" >}} ), the list widget will not directly
-interact with the underlying data model, but through an ‘adapter’.
-
-The following diagram shows how the same underlying model may be queried
-by two different list widgets, and their corresponding adapters.
-
-![](/images/list_adapter_shared_model_diagram.png)
-
-> List widgets are the outermost boxes in the diagram; the adapters are the
-> next boxes inwards; and the middle box is the shared data model (a database).
->
-> The ‘cursors’ in the above diagram are a representation of whatever database
-> access API is in use, as most databases use cursor-based APIs for reading.
-
-### Lazy object creation
-
-`GListModel` allows an implementation to create items lazily (only create
-or update items on screen and next to be displayed when a scroll is
-initiated) for performance reasons. This is recommended for applications
-with a very large number of items, so a new ListItem isn't required for
-every single item in the list at initialisation.
-
-`GListStore` does not support lazy object creation so an alternative model
-will need to be implemented by applications which need to deal with
-huge models.
-
-An example for this is provided in  [Alternative list adapter]( {{< ref "#alternative-list-adapter" >}} ).
-
-### High-level helpers
-
-Higher-level API should be provided in order to facilitate common usage
-scenarios, in the form of an adapter implementation.
-
-This adapter should be instantiatable from various common data models, through
-constructors such as: `list_adapter_new_from_g_list_model` or
-`list_adapter_new_from_g_list`.
-
-This default adapter should automatically generate an appropriate UI for
-the individual objects contained in the data model, with the only requirement
-that they all be instances of the same GObject subclass. This requirement
-should be clearly documented, as it won't be possible to enforce it at
-instantiation time for certain data models, such as `GList`, without iterating
-on all its nodes, thus forbidding the generic adapter from adopting a lazy
-loading strategy.
-
-The default behaviour of the adapter should be to provide a UI for all the
-properties exposed by the objects (provided it knows how to handle them),
-but much like the [Django admin site][django-admin-fields], it should be easy
-for the user to modify which of these properties are displayed, and the
-order in which they should be displayed, using a `set_fields()` method. The
-suggested `set_fields()` API would take a non-empty ordered list of property
-names for the properties of the objects in the model which the adapter should
-display. For example, if the model contains objects which represent music
-artists, and each of those objects has `name`, `genre` and `photo` properties,
-the adapter would try to create row widgets which display all three
-properties. If `set_fields (['name', 'genre'])` were called on the adapter, it
-would instead try to only display the name and genre for the artist (name first,
-genre second), and not their photo. The layout algorithm used for presenting
-these properties generically in the UI is not prescribed here.
-
-This generic adapter should expose virtual methods to allow potential
-subclasses to provide their own list item widgets for properties that may or
-may not be handled by the default implementation, and to provide their own list
-item widgets for each of the GObjects in the model. These are represented by
-`create_view_for_property()` and `create_view_for_object()` on the
- [API diagram]( {{< ref "#api-diagram" >}} ).
-
-The adapter should use weak references on the created list items, as
-examplified in  [Alternative list adapter]( {{< ref "#alternative-list-adapter" >}} ).
-
-Filtering and sorting should be implemented by this adapter, with the option
-for the user to provide implementations of the sorting and filtering methods,
-and to trigger the sorting and filtering of the adapter. It should be clearly
-documented that these operations may be expensive, as the adapter will have
-no other option than iterating over the whole model.
-
-If developers want to use the list widget with an underlying model that
-allows more efficient sorting and filtering (for example a database), they
-should implement their own adapter.
-
-Refer to the  [API diagram]( {{< ref "#api-diagram" >}} ) for a more formal view of the proposed API,
-and to the  [Generic adapter]( {{< ref "#generic-adapter" >}} ) section for a practical usage example.
-
-### UI customisation
-
-The list and list item widgets should be `ApertisWidget` subclasses (which
-are in turn `ClutterActor`s) to take advantage of the `GtkApertisStylable`
-mixin that `ApertisWidget` uses. This adds support for styling the widget
-using CSS and [other style providers][GtkStyleProvider] which can be customised by
-system integrators.
-
-As the list item widgets are customisable widgets, they can appear any
-way the application author wants. This means that it is up to the
-application author to decide on theming decisions. Apertis-provided list
-item widgets will clearly document the CSS classes that affect their
-appearance.
-
-### Sorting
-
-Sorting the model is built into the `GListStore`. When adding a new item
-to the adapter `g_list_store_insert_sorted` is used with the third
-argument pointing to a function to help sort the model. All items can be
-sorted at once using the `g_list_store_sort` function, passing in the
-same or different sorting function.
-
-When using an  [Alternative list adapter]( {{< ref "#alternative-list-adapter" >}} ), sorting will need to be
-implemented on a case-by-case basis.
-
-### Filtering
-
-As with `GtkListBox` when bound to a model, filtering should be implemented
-by updating the contents of the adapter.
-
-The list widget will be connected to the adapter, and will update itself
-appropriately when notified of changes.
-
-An example of this is shown in [the next section]( {{< ref "#filtering1" >}} ), the following
-diagram illustrates the filtering process.
-
-![Adapter filtering](/images/list_adapter_filtering.png)
-
-> The ‘cursors’ in the above diagram are a representation of whatever database
-> access API is in use, as most databases use cursor-based APIs for reading.
-
-### Header and footer
-
-The header should be a regular `ApertisWidget`, passed to the list widget as a
-`header` property. It will be rendered above the body of the list widget.
-Similarly, an `ApertisWidget` passed to a `footer` property will be rendered
-below the body of the list widget. Using arbitrary widgets means the header’s
-appearance is easily customisable. Passing them to the list widget means that
-the list widget can set the widgets’ width to match that of the list.
-
-Applications can set either, both, or neither, of the `header` and `footer`
-properties. If both are set, both a header and a footer are rendered, and the
-application may use different widgets in each.
-
-### Selections
-
-As with `GtkListBox`, it should be possible to select either one or many
-items in the list (see  [Item focus]( {{< ref "#item-focus" >}} )). The application author can decide
-what is the behaviour of the list in question using the “selection
-mode”. The values for the selection mode are none (no items can be
-selected), single (at most one item can be selected), and multiple (any
-number of items can be selected). A multiple selection example can be found
-in the  [Multiple selection]( {{< ref "#multiple-selection" >}} ) section.
-
-The `ListItem` object has a read-write property for determining it can be
-selected or not. An example that sets this property can be found
-in the  [Non-selectable items]( {{< ref "#non-selectable-items" >}} ) section.
-
-The selection signals exposed by the list widget will be identical to those
-exposed by `GtkListBox`, namely `item-selected` when an item is focused,
-`item-activated` when the item is subsequently activated, and in the case
-of multiple selection, the `selected-items-changed` signal will give the user
-the full picture of the current items selected by the user, by being emitted
-every time the current selection changes, and passing an updated list of
-selected list items to potential callback functions.
-
-### Item headers
-
-Item headers are widgets used to separate items into logical groups (for
-example, when showing tracks of an artist, they could be grouped in
-albums with the album name as the item header).
-
-Due to the requirement for lazy initialisation, the solution proposed
-by `GtkListBox` cannot be adopted here, as it implies that all the list
-items need to be instantiated ahead of time.
-
-Our approach here is similar to [the solution][ListAdapter-separators] used
-with Android's `ListAdapter`: as the adapter is decoupled from the data model,
-and returns the actors that should be placed at a given position in the list,
-it may also account for such headers, which should be returned as unselectable
-`ListItem`s at specific positions in the adapter.
-
-We make no assumptions as to how implementations may choose to associate
-a selected list item with the data model: in the simple case, the index
-of a list item may be directly usable to access the backing object it
-represents, if the backing data is stored in an array, and no item header
-is inserted in the adapter.
-
-In other cases, where for example the backing data is stored in a database,
-or item headers are inserted and offset the indices of the following items,
-implementations may choose to store a reference to the backing object using
-`g_object_set_qdata` or an external mechanism such as a `GHashTable`.
-
-An example of item headers is shown in [the following section][Header items].
-
-### Sticky item headers
-
-As required for  [Lazy list model]( {{< ref "#lazy-list-model" >}} ), when the list widget is scrolled to
-a random point, items surrounding the viewport may not be created yet.
-
-It is proposed that a simple API be exposed to let application developers
-specify the sticky item at any point in the scrolling process, named
-`list_set_sticky_func`.
-
-The implementation will, upon scrolling the list widget, pass this function
-the index of the top-most visible item, and expect it to return the `ListItem`
-that should be stickied (or `NULL`).
-
-### Blur effect
-
-Given the `MxKineticScrollView` container does the actual scrolling, it is
-the best place to implement the desired blur effect (see[blur effect]( {{< ref "#blur-effect" >}} )).
-Additionally, implementing it in the container means it can be
-implemented once instead of in every widget that needs to have a blur
-effect.
-
-### On-demand item resource loading
-
-By default, list items should assume they are not in view and should not
-perform expensive operations until they have been signalled by the list
-widget that they are in view (see  [On-demand item resource loading]( {{< ref "#on-demand-item-resource-loading" >}} )). For
-example, a music application might have a long list of albums and each
-item has the album cover showing. Instead of loading every single album
-cover when creating the list, each list item should use a default dummy
-picture in its place. When the user scrolls the list, revealing
-previously hidden items, the album cover should be loaded and the
-default dummy picture replaced with the newly loaded picture.
-
-The list widget should have a way of determining the item from given
-co-ordinates so that it can signal to said item when it comes into view
-after a scroll event. The list item object should only perform expensive
-operations when it has come into view, by reading and monitoring a
-property on itself. Once visible an item will not return to the not
-visible state.
-
-### Scroll bubbles
-
-The bubble displayed when scrolling to indicate in which category the
-scroll is showing (see[scroll bubbles]( {{< ref "#scroll-bubbles" >}} )) should be added to `MxScrollBar` as
-that is the widget that controls changing the scroll position.
-
-### Roller subclass
-
-The roller widget should be implemented as a subclass of the list widget.
-
-The roller widget will implement the `MxScrollable` interface, setting
-appropriate increment values on its adjustments, in order to ensure the
-currently-focused row will always be aligned with the middle after scrolling.
-
-As the roller subclass will implement [rollover]( {{< ref "#roller-rollover" >}} ), the
-elastic effect when reaching the bottom of the list will not be used.
-
-In addition, it will also, in its `init` method, use a `ClutterEffect` in
-order to render itself as a cylinder (or ideally, as a [hexagonal prism]).
-
-### Column layout
-
-By default, the list widget will display as many items as fit per row, given
-the list’s width and the configured item width. Properties will be provided for:
- * A `row-spacing` property, setting the blank space between adjacent rows.
- * A `column-spacing` property, setting the blank space between adjacent
-   columns.
- * An `item-width` property, setting the width of all columns.
- * An `item-height` property, setting the height of all rows.
-
-Note that `GtkFlowBox` supports reflowing children of different sizes; in this
-design, we only consider children of equal sizes, which simplifies the API. It
-is equivalent to considering a `GtkFlowBox` with its `homogeneous` property set
-to true.
-
-So, for example, to display items in a single column (one item per row), set the
-`item-width` to equal the list’s width. To implement a grid layout where some
-items may be missing and gaps should be left for them, implement a custom row
-widget which displays its own children in a grid; and display one such row
-widget per row of the list.
-
-We suggest the default value for `item-width` is to track the list’s width, so
-that the list uses a single column unless otherwise specified.
-
-### Focus animation
-
-A `use-animations` property will be exposed on the list items. Upon activation,
-an item with this property set to `True` will be animated to cover the whole
-width and height allocated to the list widget.
-
-Application developers may connect to the `item-activated` signal in order to
-update the contents of the item, as shown in  [Item activation]( {{< ref "#item-activation" >}} ).
-
-Once the set of possible and valuable animations has become clearer, API
-may be exposed to give more control to system integrators and application
-developers.
-
-### Item launching
-
-In the roller subclass, the `item-activated` signal should only be emitted
-for actors in the currently focused row. This will ensure that only items
-that were scrolled to can be activated.
-
-### API diagram
-
-![](/images/list_api.png)
-
-Signals are shown with a hash beforehand (for example, `#item-activated`),
-with arguments listed afterwards. Properties are shown with a plus sign
-beforehand and without getters or setters (`get_model()`, `set_model()`)
-for brevity.
-
-## Example API usage
-
-### Basic usage
-
-The following example creates a model, creates item actors for each
-artist available on the system, and adds them to the model. The exact
-API is purely an example but the approach to the API is to note.
-
-As a simple example, this avoids creating a separate adapter and model, and
-instead creates a model which contains the list row widgets. In more complex
-examples, where data from the model is being used by multiple list widgets,
-the model and adapter are separate, and the entries in the model are not
-necessarily widget objects. See [Generic adapter] for such an example.
-
-{{ ../examples/sample-list-api-usage-basic.c }}
-
-The object created by `create_sample_artist_item` is an instance of
-`ClutterActor` (or an instance of a subclass) which defines how the item
-will display in the list. In that case, it is as simple as packing in a
-`ClutterText` to display the name of the artist as a string.
-More likely it would use a `ClutterBoxLayout` layout manager to pack
-different `ClutterActor`s into a horizontal line showing properties of the
-artist.
-
-### Item activation
-
-The following example creates a list widget using the function defined
-in the previous section and connects to the `item-activated` signal to
-change the list item actor.
-
-{{ ../examples/sample-list-api-usage-item-activated.c }}
-
-### Filtering
-
-The following example shows how to filter the list store bound to the list
-widget created using the function implemented in  [Basic usage]( {{< ref "#basic-usage" >}} )
-to only display items with a specific property.
-
-{{ ../examples/sample-list-api-usage-filtering.c }}
-
-### Multiple selection
-
-The following example sets the selection mode to allow multiple items to
-be simultaneously selected.
-
-{{ ../examples/sample-list-api-usage-selection.c }}
-
-### Non-selectable items
-
-The following example makes half the items in a list impossible to select.
-
-{{ ../examples/sample-list-api-usage-non-selectable-items.c }}
-
-### Header items
-
-The following example adds alphabetical header items to the list.
-
-{{ ../examples/sample-list-api-usage-header-items.c }}
-
-### On-demand item resource loading
-
-The following example shows how on-demand item resource loading could be
-implemented, using the model created in the first listing:
-
-{{ ../examples/sample-list-api-usage-resource-loading.c }}
-
-### Generic adapter
-
-The following example shows how developers may take advantage of the proposed
-generic adapter.
-
-{{ ../examples/sample-list-adapter-api-usage.c }}
-
-### Alternative list adapter
-
-Authors of applications do not necessarily need to use a `GListStore` as their
-adapter class. Instead they can implement the `GListModel` interface, and
-pass it as the adapter for the list widget.
-
-In the following example, we define and implement an adapter to optimise
-both initialisation performance by creating `MyArtistItem`s only when required,
-and memory usage by letting the `List` widget assume ownership of the created
-items.
-
-{{ ../examples/alternative_list_model.c }}
-
-## Requirements
-
-This design fulfils the following requirements:
-
-  -[common api1]( {{< ref "#common-api1" >}} ) — the list widget and roller widget have the same
-    API and any roller-specific roller API is in its own class.
-
-  -[mvc separation1]( {{< ref "#mvc-separation1" >}} ) — `GListModel` is used as an adapter to the backing
-    data, which storage format is not imposed to the user. The list widget
-    and item widgets are separate objects.
-
-  -[data backend agnosticity1]( {{< ref "#data-backend-agnosticity1" >}} ) — Applications provide list items through
-    an adapter, no requirement is made as to the storage format.
-
-  -[kinetic scrolling1]( {{< ref "#kinetic-scrolling1" >}} ) — use `MxKineticScrollView`.
-
-  -  [Elastic effect]( {{< ref "#elastic-effect" >}} ) — use `MxKineticScrollView`.
-
-  -  [Item focus]( {{< ref "#item-focus" >}} ) — list items can be selected ( [Selections]( {{< ref "#selections" >}} )).
-
-  -[roller focus handling1]( {{< ref "#roller-focus-handling1" >}} ) — this roller-specific selecting
-    behaviour can be added to the roller's class.
-
-  -[animations1]( {{< ref "#animations1" >}} ) — use `MxKineticScrollView`.
-
-  -[item launching1]( {{< ref "#item-launching1" >}} ) — the item-activated signal on the list widget
-    will signal when an item is activated.
-
-  -[header and footer1]( {{< ref "#header-and-footer1" >}} ) — `ApertisWidget`s can be set as header or footer
-    [header and footer2]( {{< ref "#header-and-footer2" >}} )).
-
-  -[roller rollover1]( {{< ref "#roller-rollover1" >}} ) — this roller-specific rollover behaviour can
-    be added to the roller's class.
-
-  -[widget size1]( {{< ref "#widget-size1" >}} ) — use `ClutterLayoutManager` and the `ClutterActor`
-    properties [widget size2]( {{< ref "#widget-size2" >}} )).
-
-  -[consistent focus1]( {{< ref "#consistent-focus1" >}} ) — the API asserts a consistent focus and
-    ensures the implementation behaves when the model changes.
-
-  -[focus animation1]( {{< ref "#focus-animation1" >}} ) — items are `ClutterActor`s which can animate
-    using regular Clutter API.
-
-  -[mutable list1]( {{< ref "#mutable-list1" >}} ) — use `GListStore`.
-
-  -[ui customisation1]( {{< ref "#ui-customisation1" >}} ) — subclass `ApertisWidget` and use the
-    `GtkStyleProvider`s.
-
-  -[blur effect1]( {{< ref "#blur-effect1" >}} ) — add a `motion-blur` property to
-    `MxKineticScrollView` and use that [blur effect2]( {{< ref "#blur-effect2" >}} )).
-
-  -[scrollbar1]( {{< ref "#scrollbar1" >}} ) — use the `scroll-visibility` property on the
-    `MxScrollView` container.
-
-  -[hardware scroll1]( {{< ref "#hardware-scroll1" >}} ) — use the adjustment on the list widget to
-    scroll down a page, and use the appropriate function to move the
-    selection on.
-
-  -  [On-demand item resource loading1]( {{< ref "#on-demand-item-resource-loading1" >}} ) — ensure list widget can look
-    up the item based on co-ordinates, and add a property to the list
-    item object to denote whether it’s in view, which the list widget
-    updates.
-
-  -[scroll bubbles1]( {{< ref "#scroll-bubbles1" >}} ) — add support for overlay actors to
-    `MxScrollBar`.
-
-  -[item headers1]( {{< ref "#item-headers1" >}} ) — Added as regular `ListItem`s in the adapter, a
-    `list_set_sticky_func` API is exposed.
-
-  -  [Lazy list model]( {{< ref "#lazy-list-model" >}} ) — see  [Alternative list adapter]( {{< ref "#alternative-list-adapter" >}} ), for an example
-    of how application developers may implement their own model.
-
-  -  [Flow layout]( {{< ref "#flow-layout" >}} ) — The number of columns is calculated by dividing the
-    list width by the specified item width. Padding between the resulting
-    columns and rows may be specified using `row-spacing` and `column-spacing`
-    properties.
-
-## Summary of recommendations
-
-As discussed in the above sections, we recommend:
-
-  - Write a list widget partially based on `GtkListBox`, which subclasses
-    `ApertisWidget`.
-
-  - Write a list item widget partially based on `GtkListBoxRow` which also
-    subclasses ApertisWidget.
-
-  - Add a `motion-blur` property to `MxKineticScrollView`.
-
-  - Expose a sticky item callback registration method.
-
-  - Add support for overlay actors to `MxScrollBar`.
-
-  - Write a Roller widget as a list widget subclass.
-
-  - Ensure new widgets are easily customisable using CSS.
-
-  - Add demo programs for the new widgets.
-
-  - Define unit tests to run manually using the example programs to
-    check the widgets work
-    correctly.
-
-## Appendix
-    
-### Existing roller design
-
-![](/images/roller_api_diagram1.png)
-
-![](/images/roller_api_diagram2.png)
-
-[bubbles]: http://i.stack.imgur.com/YyRtC.png
-
-[mx-scrollable]: https://github.com/clutter-project/mx/blob/master/mx/mx-scrollable.h
-
-[`GListModel`]: https://developer.gnome.org/gio/stable/GListModel.html
-
-[`GtkListBox`]: https://developer.gnome.org/gtk3/stable/GtkListBox.html
-
-[`GtkFlowBox`]: https://developer.gnome.org/gtk3/stable/GtkFlowBox.html
-
-[`GtkTreeView`]: https://developer.gnome.org/gtk3/stable/GtkTreeView.html
-
-[`GtkContainer`]: https://developer.gnome.org/gtk3/stable/GtkContainer.html
-
-[`ClutterActor`]: https://developer.gnome.org/clutter/stable/ClutterActor.html
-
-[`MxKineticScrollView`]: https://github.com/clutter-project/mx/blob/master/mx/mx-kinetic-scroll-view.h
-
-[GListModel-desc]: https://developer.gnome.org/gio/stable/GListModel.html#GListModel.description
-
-[`GListStore`]: https://developer.gnome.org/gio/stable/GListStore.html
-
-[GtkStyleProvider]: https://developer.gnome.org/gtk3/stable/GtkStyleProvider.html
-
-[`ListAdapter`]: https://developer.android.com/reference/android/widget/ListAdapter.html
-
-[ListAdapter-separators]: http://stackoverflow.com/questions/18302494/how-to-add-section-separators-dividers-to-a-listview
-
-[hexagonal prism]: http://static.kidspot.com.au/cm_assets/32906/hexagonal-prism_346x210-jpg-20151022203100.jpg~q75,dx330y198u1r1gg,c--.jpg
-
-[django-admin-fields]: https://docs.djangoproject.com/en/1.10/ref/contrib/admin/#django.contrib.admin.ModelAdmin.fields
diff --git a/content/designs/software-development-kit.md b/content/designs/software-development-kit.md
deleted file mode 100644
index 1b4e9b3ad23e6564bb037148128a6184ed023d09..0000000000000000000000000000000000000000
--- a/content/designs/software-development-kit.md
+++ /dev/null
@@ -1,469 +0,0 @@
-+++
-title = "SDK"
-short-description = "Software Development Kit purpose and design (partially-implemented, no available app validation tool, usability can be improved)"
-weight = 100
-toc = true
-aliases = [
-	"/old-designs/latest/software-development-kit.html",
-	"/old-designs/v2019/software-development-kit.html",
-	"/old-designs/v2020/software-development-kit.html",
-	"/old-designs/v2021dev3/software-development-kit.html",
-]
-outputs = [ "html", "pdf-in",]
-date = "2016-05-28"
-+++
-
-# Software Development Kit
-
-## Definitions
-
-- **Application Binary Interface (ABI) Stability**: the library
-  guarantees API stability and further guarantees dependent
-  applications and libraries will not require any changes to
-  successfully link against any future release. The library may
-  add new public symbols freely.
-
-- **Application Programming Interface (API) Stability**: the
-  library guarantees to not remove or change any public symbols in
-  a way that would require dependent applications or libraries to
-  change their source code to successfully compile and link
-  against later releases of the library. The library may add new
-  public symbols freely. Later releases of the API-stable library
-  may include ABI breaks which require dependent applications or
-  libraries to be recompiled to successfully link against the
-  library. Compare to **ABI Stability**.
-
-- **Backwards compatibility**: the guarantee that a library will
-  not change in a way that will require existing dependent
-  applications or libraries to change their source code to run
-  against future releases of the library. This is a more general
-  term than ABI or API stability, so it does not necessarily imply
-  ABI stability.
-
-- **Disruptive release**: a release in which backwards
-  compatibility is broken. Note that this term is unique to this
-  project. In some development contexts, the term “major release”
-  is used instead. However, that term is ambiguous in general.
-
-##  Software Development Kit (SDK) Purpose
-
-The primary purpose of the special SDK system image will be to enable
-Apertis application and third-party library development. It will include
-development tools and documentation to make this process as simple as
-possible for developers. And a significant part of this will be the
-ability to run the SDK within the VirtualBox PC emulator. VirtualBox
-runs on ordinary x86 hardware which tends to make development much
-simpler than a process which requires building and running
-in-development software directly on the target hardware which will be of
-significantly lower performance relative to developer computers.
-
-##  API/ABI Stability Guarantees
-
-Collabora will carry along open source software components' API and ABI
-stability guarantees into the Apertis Reference SDK API. In most cases,
-this will be a guarantee of complete API and ABI stability for all
-future releases with the same major version. Because these portions of
-Apertis will not be upgraded to later disruptive releases, these
-portions will maintain API and ABI stability at least for each major
-release of Apertis.
-
-The platform software included in the Reference system images will be in
-the form of regular Debian packages and never in the form of
-application-level packages, which are described in the “Apertis
-Supported API” document. Collabora will manage API/ABI stability of the
-platform libraries and prevent conflicts between libraries at this
-level.
-
-See the “Apertis Supported API” document for more details of specific
-components' stability guarantees and the software management of
-platform, core application, and third-party application software.
-
-##  Reference System Image Composition
-
-See the document “Apertis Build and Integration”, section “Reference
-System Image Composition”.
-
-##  System Image Software Licenses
-
-See the document “Apertis Build and Integration” for details on license
-checking and compliance of software contained in the system images.
-
-##  Development Workflow
-    
-###  Typical Workflow
-
-Most developers working on specific libraries or applications will not
-be strictly dependent upon the exact performance characteristics of the
-device hardware. And even those who are performance-dependent may wish
-to work within the SDK when they aren't strictly tuning performance, as
-it will yield a much shorter development cycle.
-
-For these most-common use cases, a typical workflow will look like:
-
-1.  modify source code in Eclipse
-
-2.  build (for x86)
-
-3.  smoke-test within the Target Simulator
-
-4.  return to step 1. if necessary
-
-In order to test this code on the actual device, the code will need to
-be cross-compiled (see the document “Apertis Build and Integration
-Design”, section “App cross-compilation”). To do so, the developer would
-follow the steps above with:
-
-1.  run  [Install to target]( {{< ref "#install-to-target" >}} ) Eclipse plugin
-
-2.  test package contents on device
-
-3.  return to step 1. if necessary
-
-The development workflow for the Reference and derived images themselves
-will be much more low-level and are outside the scope of this document.
-
-###  On-device Workflow
-
-Some work, particularly performance tuning and graphics-intense
-application development, will require testing on a target device. The
-workflow [above][Typical workflow] handles this use case, but developing on a target device
-can save the time of copying files from a development machine to the
-device.
-
-This workflow will instead look like:
-
-1.  modify source code as needed
-
-2.  run  [Install to target]( {{< ref "#install-to-target" >}} ) Eclipse plugin
-
-3.  test package contents on device
-
-4.  if debugging is necessary, either
-    
-    1.  run  [Remote app debugging]( {{< ref "#remote-app-debugging" >}} ) Eclipse plugin; or
-    
-    2.  open secure shell (ssh) connection to target device for
-        multi-process or otherwise-complex debugging scenarios
-
-5.  return to step 2. if necessary
-    
-###  Workflow-simplifying Plugins
-
-Some of the workflow steps [above][Typical worflow] will be simplified by streamlining
-repetitive tasks and automating as much as possible.
-
-####  Install to Target
-
-This Eclipse plugin will automatically:
-
-1.  build the cross-architecture Apertis app bundle
-
-2.  copy generated ARM package to target
-
-3.  Install package
-
-It will use a sysroot staging directory (as described in the document
-“Apertis Build and Integration Design”, section “App
-cross-compilation”) to build the app bundle and SSH to copy and
-remotely and install it on the target.
-
-App bundle signature validation will be disabled in the Debugging and
-SDK images, so the security system will not interfere with executing
-in-development apps.
-
-####  Remote App Debugging
-
-This Eclipse plugin will connect to a target device over SSH and, using
-information from the project manifest file, execute the application
-within GDB. The user will be able to run GDB commands as with local
-programs and will be able to interact with the application on the device
-hardware itself.
-
-This plugin will be specifically created for single application
-debugging. Developers of multi-process services will need to connect to
-the device manually to configure GDB and other tools appropriately, as
-it would be infeasible to support a wide variety of complex setups in a
-single plugin.
-
-####  Sysroot Updater
-
-This Eclipse plugin will check for a newer sysroot archive. If found,
-the newer archive will be downloaded and installed such that it can be
-used by the  [Install to target]( {{< ref "#install-to-target" >}} ) plugin.
-
-##  3D acceleration within VirtualBox
-
-Apertis will depend heavily on the Clutter library for animations in its
-toolkit and for custom animations within applications themselves.
-Clutter requires a working 3D graphics stack in order to function.
-Without direct hardware support, this requires a software OpenGL driver,
-which is historically very slow. Our proposed SDK runtime environment,
-VirtualBox, offers experimental 3D hardware “pass-through” to achieve
-adequate performance. However, at the time of this writing, this support
-is unreliable and works only on very limited host hardware/software
-combinations.
-
-We propose resolving this issue with the new “llvmpipe” software OpenGL
-driver for the Mesa OpenGL implementation. This is the
-community-supported solution to replace the current,
-significantly-slower, “swrast” software driver. Both the upcoming
-versions of Fedora and Ubuntu Linux distributions will rely upon the
-“llvmpipe” driver as a fallback in the case of missing hardware
-support. The latest development version of Ubuntu 12.04, which Collabora
-is developing our Reference system images against, already defaults to
-“llvmpipe”. Additionally, the “llvmpipe” driver implements more
-portions of the OpenGL standard (which Clutter relies upon) than the
-“swrast” driver.
-
-In initial testing with an animated Clutter/Clutter-GTK application,
-llvmpipe performance was more than adequate for development purposes. In
-a VirtualBox guest with 2 CPU cores and 3 GiB of RAM, demo applications
-using the Roller widget displayed approximately 20-30 frames per second
-and had very good interactivity with the llvmpipe driver. In comparison,
-the same program running with the swrast driver averaged 4 frames per
-second and had very poor interactivity.
-
-While this approach will not perform as well as a hardware-supported
-implementation, and will vary depending on host machine specifications,
-it will be the most reliable option for a wide variety of VirtualBox
-host operating system, configuration, and hardware combinations.
-
-##  Simulating Multi-touch in VirtualBox
-
-Because Apertis will support multi-touch events and most VirtualBox
-hosts will only have single pointing devices, the system will need a way
-to simulate multi-touch events in software. Even with adequate hardware
-on the host system, VirtualBox does not support multiple cursors, so the
-simulating software must be fully-contained within the system images
-themselves.
-
-###  Software-based solution
-
-We propose a software-based solution for generating multi-touch events
-within the SDK. This will require a few new, small components, outlined
-below.
-
-In the intended usage, the user would use the  [Multi-touch gesture generator]( {{< ref "#multi-touch-gesture-generator" >}} )
-to perform a gesture over an application running in the Target
-Simulator as if interacting with the hardware display(s) in an Apertis
-system. The Gesture Generator will then issue commands through its
-uinput device and the  [Uinput Gesture Device Xorg Driver]( {{< ref "#uinput-gesture-device-xorg-driver" >}} ) will use those
-commands to generate native X11 multi-touch events. Applications running
-within the Target Simulator will then interpret those multi-touch events
-as necessary (likely through special events in the Apertis application
-toolkit).
-
-####  Multi-touch Gesture Generator
-
-This will be a very simple user interface with a few widgets for each
-type of gesture to generate. The developer will click on a button in the
-generator to start a gesture, then perform a click-drag anywhere within
-VirtualBox to trigger a set of multi-touch events. The generator will
-draw simple graphics on the screen to indicate the type and magnitude of
-the gesture as the developer drags the mouse cursor.
-
-![](/images/example_gesture_generator_window.png)
-
-We anticipate the need for two gestures commonly used in popular
-multi-touch user interfaces:
-
-  - **Pinch/zoom**: the movement of a thumb and forefinger toward
-    (zoom-out) or away (zoom-in) from each other. This gesture has a
-    magnitude and position. The position allows, e.g., a map application
-    to zoom in on the position being pinched rather than requiring a
-    separate zoom into the center of the viewable area, then a drag of
-    the map.
-    
-      - Zoom-in: simulated by initiating the pinch/zoom gesture from the
-        Gesture Generator, then click-dragging up-right. The distance
-        dragged will determine the magnitude of the zoom.
-    
-      - Zoom-out: the same process as for zoom-in, but in the opposite
-        direction
-
-  - **Rotate**: the movement of two points around an imaginary center
-    point. Can be performed either in a clockwise or counter-clockwise
-    direction. This gesture has a magnitude and position. The position
-    allows, e.g., a photo in a gallery app to be rotated independent of
-    the other photos.
-    
-      - Clockwise: simulated by initiating the rotate gesture, then
-        click-dragging to the right. This can be imagined as drag
-        affecting the top of a wheel.
-    
-      - Counter-clockwise: the same process as for clockwise, but in the
-        opposite direction.
-
-Additional gestures could be added during the specification process, if
-necessary.
-
-![](/images/onscreen_graphics_when_generating_gestures.png)
-
-Upon the user completing the simulated gesture, the Gesture Generator
-would issue a small number of key or movement events through a special
-uinput device (which we will refer to as the Uinput Gesture Device).
-Uinput is a kernel feature which allows “userland” software (any
-software which runs directly or indirectly on top of the kernel) to
-issue character device actions, such as key presses, releases,
-two-dimensional movement events, and so on. This uinput device will be
-interpreted by the  [Uinput Gesture Device Xorg Driver]( {{< ref "#uinput-gesture-device-xorg-driver" >}} ).
-
-####  Uinput Gesture Device Xorg Driver
-
-This component will interpret the input stream from our Uinput Gesture
-Device and generate X11 multi-touch events. These events would, in turn,
-be handled by the windows lying under the events.
-
-####  X11 Multi-touch Event Handling
-
-Windows belonging to applications running within the Target Simulator
-will need to handle multi-touch events as they would single-touch
-events, key presses, and so on. This would require to add support for
-multi-touch events in the Apertis application toolkit for applications
-to simply handle multi-touch events the same as single-touch events.
-
-###  Hardware-based solution
-
-An alternative to the software-based solution [above][Software-based solution] would be to use a
-hardware multi-touch pad on the host machine. This is a simpler solution
-requiring less original development though it brings a risk of Windows
-driver issues which would be outside of our control. Because of this, we
-recommend Collabora perform further research before finalizing upon this
-solution if this is preferred over the  [Software-based solution]( {{< ref "#software-based-solution" >}} ).
-
-The touch pad hardware would need to be well-supported in Linux but not
-necessarily the host operating system (including Windows) because
-VirtualBox supports USB pass-through. This means that output from the
-touch pad would simply be copied from the host operating system into
-VirtualBox, where Xorg would generate multi-touch events for us.
-
-The best-supported multi-touch device for Linux is Apple's Magic
-Trackpad. This device uses a Bluetooth connection. Many Bluetooth
-receivers act as USB devices, allowing pass-through to VirtualBox. In
-case a host machine does not have a built-in Bluetooth receiver or has a
-Bluetooth receiver but does not route Bluetooth data through USB, an
-inexpensive Bluetooth-to-USB adapter could be used.
-
-Collabora has verified that multi-touch gestures on an Apple Magic
-Trackpad plugged into a Linux host can be properly interpreted within
-Debian running within VirtualBox. This suggests that a hardware-based
-solution is entirely feasible.
-
-####  Hardware Sourcing Risks
-
-Collabora investigated risks associated with selecting a single hardware
-provider for this multi-touch solution. The known risks at this point
-include:
-
-1.  Apple has a history of discontinuing product lines with little
-    warning
-
-2.  As of this writing, there appear to be few alternative multi-touch
-    pointing devices which are relatively inexpensive and support
-    arbitrary multi-touch movements
-
-In the worst case scenario, Apple could discontinue the Magic Trackpad
-or introduce a new version which does not (immediately) work as expected
-within Linux. With no immediate drop-in replacement for the Magic
-Trackpad, there would not be a replacement to recommend internally and
-to third-party developers using the Apertis SDK.
-
-However, there are several mitigating factors that should make these
-minor risks:
-
-1.  Inventory for existing Magic Trackpads would not disappear
-    immediately upon discontinuation of the product
-
-2.  Discontinuation of a stand-alone multi-touch trackpad entirely is
-    very unlikely due to Apple's increasingly-strong integration of
-    multi-touch gestures within iOS and Mac OS itself.
-
-3.  In case Apple replaces the Magic Trackpad with a Linux-incompatible
-    version, there is significant interest within the Linux community to
-    fix existing drivers to support the new version in a timely manner.
-    For instance, Canonical multi-touch developers use the Magic
-    Trackpad for their development and will share Apertis's sourcing
-    concerns as well.
-
-4.  As an ultimate fallback,  [Multi-touch gesture generator]( {{< ref "#multi-touch-gesture-generator" >}} ) can be
-    recommended as an alternative source of multi-touch input.
-
-##  Third-party Application Validation Tools
-    
-###  Two-step Application Validation Process
-
-The third-party application process will contain two main validation
-steps which mirror the application submission processes for Android and
-iOS apps. The first, SDK-side validation checks will be performed by a
-tool described below. Developers may perform SDK-side validation as
-often as they like before submitting their application for approval.
-This is meant to automatically catch as many errors in an application as
-soon as possible to meet quality requirements for application review.
-
-The second step of the application validation process is to validate
-that an application meets the app store quality requirements. It is
-recommended to set up a process where new applications automatically get
-run through this same Eclipse plugin as an initial step in review. This
-will guarantee applications meet the latest automated validation checks
-(which may not have been met within the developer's SDK if their Eclipse
-plugin were old). Developers will be able to easily stay up-to-date with
-the validation tool by applying system package updates within the SDK,
-so this difference can be minimized by a small amount of effort on the
-developer's part. Applications which pass this initial check will then
-continue to a manual evaluation process.
-
-###  App Validation Tool
-
-To streamline the third-party application submission process (which will
-be detailed in another document), Collabora will provide an Eclipse
-plugin to perform a number of
-
-SDK-side validation checks up on the application in development.
-Collabora proposed checks are:
-
-  - **Application contains valid developer signing key** – developers
-    must create a certificate to sign their application releases so
-    verifying the source of application updates can be guaranteed. This
-    check will ensure that the certificate configured for the
-    application meets basic requirements on expiration date and other
-    criteria.
-
-  - **Manifest file is valid** – the application manifest file, which
-    will be used in the software management of third-party applications
-    on the platform, must meet a number of basic requirements including
-    a developer name, application categories, permissions, minimum SDK
-    API, and more.
-
-  - **Application builds from cleaned source tree** – this step will
-    delete files in the source tree which are neither included in the
-    project nor belong to the version control system and perform a full
-    release build for the ARMHF architecture. Build warnings will be
-    permitted but build errors will fail this check.
-
-  - **AppArmor profile is valid** – the application's AppArmor profile
-    definition must not contain invalid syntax or conflict with the
-    Apertis global AppArmor configuration
-
-Third-party application validation will be specified in depth in another
-document.
-
-##  General approach to third-party applications
-
-In most cases, third-party applications should not need to explicitly
-validate their access to specific system resources, delegating as much
-as possible to the SDK API or to other parts of the system. Preferably,
-these applications will specify system resource requirements in their
-manifest, such as permissions the application needs to function, network
-requirements, and so on. The main advantages of having these in the
-manifest file are using shared code to perform some of the actual
-run-time resource requests.
-
-Note that this strategy implies a trade-off between how simple it is to
-write an application and how complex the supporting SDK and system
-components need to be to provide that simplicity. That is to say, it
-often makes sense to impose complexity onto applications, in particular
-when it's expected that only a few will have a given requirement or use
-case. This general approach should be kept in mind while designing the
-SDK and any other interfaces the system has with third-party
-applications and their manifests.
-
diff --git a/content/guides/gitlab-based_packaging_workflow.md b/content/guides/gitlab-based_packaging_workflow.md
index c9ea722263c568fb2176c50375aee35a26e33a7f..be3026a895df12cfd945bebba17fc0c68215d589 100644
--- a/content/guides/gitlab-based_packaging_workflow.md
+++ b/content/guides/gitlab-based_packaging_workflow.md
@@ -39,7 +39,7 @@ following conventions:
 
 All the instructions below assume an Apertis development enviroment: either
 boot the
-[Apertis SDK]( {{< ref "software-development-kit.md" >}} )
+[Apertis SDK]( {{< ref "virtualbox.md" >}} )
 or enter the `apertis-*-package-source-builder` Docker container:
 
     APERTIS_RELEASE=v2019pre
diff --git a/content/guides/howtodevelopondevices.md b/content/guides/howtodevelopondevices.md
index be039359a068e456fc84778b844220206140ca36..3200679afe17e9509aaed574ab134dd81cee8ad9 100644
--- a/content/guides/howtodevelopondevices.md
+++ b/content/guides/howtodevelopondevices.md
@@ -99,7 +99,7 @@ You should then be able to SSH in using:
 
 The recommended environment to build platform packages and application bundles
 is the
-[Apertis SDK]( {{< ref "software-development-kit.md" >}} ).
+[Apertis SDK]( {{< ref "virtualbox.md" >}} ).
 
 However, it is also possible to build software on the devices directly with the
 preparation steps below: