diff --git a/README.md b/README.md
index e69de29..abc2827 100644
--- a/README.md
+++ b/README.md
@@ -0,0 +1,487 @@
+
+* [X39.Solutions.PdfTemplate](#x39solutionspdftemplate)
+ * [Semantic Versioning](#semantic-versioning)
+ * [Getting Started](#getting-started)
+ * [Integration](#integration)
+ * [Functions](#functions)
+ * [Variables](#variables)
+ * [Controls](#controls)
+ * [Creating your own control](#creating-your-own-control)
+ * [`text`](#text)
+ * [`border`](#border)
+ * [`image`](#image)
+ * [`line`](#line)
+ * [`pageNumber`](#pagenumber)
+ * [`table`](#table)
+ * [`th`](#th)
+ * [`tr`](#tr)
+ * [`td`](#td)
+ * [Transformers](#transformers)
+ * [Creating your own transformer](#creating-your-own-transformer)
+ * [`alternate`](#alternate)
+ * [`if`](#if)
+ * [`for`](#for)
+ * [`foreach`](#foreach)
+ * [Building and Testing](#building-and-testing)
+ * [Proper documentation for End-Users](#proper-documentation-for-end-users)
+ * [Contributing](#contributing)
+ * [Additional controls](#additional-controls)
+ * [License](#license)
+
+
+# X39.Solutions.PdfTemplate
+
+This library provides a way to generate PDF documents (and images) from XML templates.
+It uses SkiaSharp for rendering and supports a variety of controls for creating complex layouts.
+You can easily integrate .NET objects into your templates by using so-called "variables" (`@myVariable`)
+or pull data from a database as needed, by providing a custom function (`@myFunction()`).
+You may even create your own controls by deriving from the `Control` base class!
+
+## Semantic Versioning
+
+This library follows the principles of [Semantic Versioning](https://semver.org/). This means that version numbers and
+the way they change convey meaning about the underlying changes in the library. For example, if a minor version number
+changes (e.g., 1.1 to 1.2), this indicates that new features have been added in a backwards-compatible manner.
+
+## Getting Started
+
+To get started, install the [NuGet package](https://www.nuget.org/packages/X39.Solutions.PdfTemplate/) into your
+project:
+
+```shell
+dotnet add package X39.Solutions.PdfTemplate
+```
+
+Next, create an XML template. Here is a simple example:
+
+```xml
+
+
+
+ Hello, world!
+
+
+```
+
+Now, you can use the `Generator` class to generate a PDF document from the template:
+
+```csharp
+// IServiceProvider serviceProvider
+// Stream xmlTemplateStream
+var paintCache = serviceProvider.GetRequiredService();
+var controlExpressionCache = serviceProvider.GetRequiredService();
+await using var generator = new Generator(
+ paintCache,
+ controlExpressionCache,
+ Enumerable.Empty()
+);
+generator.AddDefaults();
+using var textReader = new StringReader(xmlTemplateStream);
+using var reader = XmlReader.Create(textReader);
+using var pdfStream = new MemoryStream();
+await generator.GeneratePdfAsync(pdfStream, reader, CultureInfo.CurrentUICulture);
+// pdfStream now contains the PDF
+```
+
+This will generate a PDF document with the text "Hello, world!".
+
+## Integration
+
+### Functions
+
+The library supports custom functions for use in templates and comes with two built-in functions: `allFunctions()`
+and `allVariables()`.
+These functions are used to list all available functions and variables, respectively.
+
+To create your own function, derive a class from the `IFunction` interface and implement the `Invoke` method. Here is an
+example:
+
+```csharp
+public class MyFunction : IFunction
+{
+ public MyFunction(ISomeDependency someDependency) // You can inject dependencies via the constructor.
+ {
+ // ...
+ }
+
+ public string Name => "my"; // The name of your function.
+ public int Arguments => 0; // The number of arguments your function takes.
+ public bool IsVariadic => false; // Whether your function takes a variable number of arguments. If true, `Arguments` is the minimum number of arguments.
+
+ public ValueTask