From cfadbc9c5c3de6c4bdcdc963d39d6cf656931d4b Mon Sep 17 00:00:00 2001
From: Jeffrey Phillips Freeman <jeffrey.freeman@syncleus.com>
Date: Mon, 7 Nov 2016 21:55:03 -0500
Subject: [PATCH] Adding mkdocs documenation.

---
 .../docs/comparing_the_alternatives.md        | 157 ++++++++
 documentation/docs/core_annotations.md        | 364 ++++++++++++++++++
 documentation/docs/getting_started.md         | 189 +++++++++
 documentation/docs/glossary.md                |  13 +
 .../docs/images/ferma-logo-plain.svg          | 107 +++++
 .../docs/images/ferma-logo-text-plain.svg     | 120 ++++++
 .../docs/images/ferma-logo-text-small.png     | Bin 0 -> 5541 bytes
 documentation/docs/images/ferma-logo-text.pdf | Bin 0 -> 5510 bytes
 documentation/docs/images/ferma-logo-text.png | Bin 0 -> 12502 bytes
 documentation/docs/images/ferma-logo-text.ps  | 327 ++++++++++++++++
 documentation/docs/images/ferma-logo-text.svg | 177 +++++++++
 documentation/docs/images/ferma-logo.pdf      | Bin 0 -> 1515 bytes
 documentation/docs/images/ferma-logo.png      | Bin 0 -> 7225 bytes
 documentation/docs/images/ferma-logo.ps       | 207 ++++++++++
 documentation/docs/images/ferma-logo.svg      | 162 ++++++++
 documentation/docs/index.md                   | 103 +++++
 documentation/mkdocs.yml                      |  25 ++
 17 files changed, 1951 insertions(+)
 create mode 100644 documentation/docs/comparing_the_alternatives.md
 create mode 100644 documentation/docs/core_annotations.md
 create mode 100644 documentation/docs/getting_started.md
 create mode 100644 documentation/docs/glossary.md
 create mode 100644 documentation/docs/images/ferma-logo-plain.svg
 create mode 100644 documentation/docs/images/ferma-logo-text-plain.svg
 create mode 100644 documentation/docs/images/ferma-logo-text-small.png
 create mode 100644 documentation/docs/images/ferma-logo-text.pdf
 create mode 100644 documentation/docs/images/ferma-logo-text.png
 create mode 100644 documentation/docs/images/ferma-logo-text.ps
 create mode 100644 documentation/docs/images/ferma-logo-text.svg
 create mode 100644 documentation/docs/images/ferma-logo.pdf
 create mode 100644 documentation/docs/images/ferma-logo.png
 create mode 100644 documentation/docs/images/ferma-logo.ps
 create mode 100644 documentation/docs/images/ferma-logo.svg
 create mode 100644 documentation/docs/index.md
 create mode 100644 documentation/mkdocs.yml

diff --git a/documentation/docs/comparing_the_alternatives.md b/documentation/docs/comparing_the_alternatives.md
new file mode 100644
index 00000000..958c3da0
--- /dev/null
+++ b/documentation/docs/comparing_the_alternatives.md
@@ -0,0 +1,157 @@
+---
+title: Comparing the Alternatives
+permalink: comparing_the_alternatives.html
+sidebar: main_sidebar
+tags: [getting_started]
+keywords: getting started
+last_updated: October 30, 2016
+toc: true
+folder: documentation
+---
+
+There are several OGM/ORM options out there. For the purposes of this document we will focus only on those that have a stable release, or are close to a stable release. At the time of this writing those are: Tinkerpop Framed and Totorom.
+
+Benchmarks
+==========
+
+We maintain an informal project for benchmarking Ferma against other OGM available, you can find the [source here](https://github.com/Syncleus/Ferma-benchmark). However below is a matrix breakdown of the results. Instead of showing raw execution time we show the ratio of each OGM compared to Ferma. Therefore if the table lists 1x then it means the framework has the same execution time as Ferma, if it lists 2x then it took twice as long to execute, and if it indicates 0.5x then it took half the time to execute. Obviously any value less than 1x indicates the OGM out performed Ferma and any value greater than 1x indicates Ferma had the superior performance tiimes.
+
+|                                           | **Blueprints** | **Gremlin Pipeline** | **Tinkerpop3** | **Frames**  | **Totorom** | **Peapod**  |
+|-------------------------------------------|----------------|----------------------|----------------|-------------|-------------|-------------|
+| **Get adjacencies via annotation**        | Not capable    | Not capable          | Not capable    | x2.09       | Not capable | x2.65       |
+| **Get verticies (untyped)**               | x0.89          | x3.94                | x16.98         | Not capable | x4.24       | Not capable |
+| **Get verticies (typed)**                 | x0.92          | x3.94                | Not capable    | x0.96       | x4.20       | x20.74      |
+| **Get verticies and call next (untyped)** | x0.79          | x3.87                | x11.74         | Not capable | x4.81       | Not capable |
+| **Get verticies and call next (typed)**   | x0.72          | x2.91                | Not capable    | x1.94       | x3.31       | x16.70      |
+
+As can be seen Ferma out performs all the alternative solutions considerably by several orders of magnitude. While results do vary slightly from system to system these results are pretty close to typical. Go ahead, check out the benchmark program and run it for yourself!
+
+Feature Breakdown
+=================
+
+Despite the superior performance of Ferma it also supports all the features provided by the alternatives out there, not to mention several novel features. The following gives a quick breakdown of the features of the various frameworks. We also include a bit later in the document some Ferma examples showing the various features in action. All of the examples below use the domain model [found here](Ferma:Domain_Example).
+
+|                                                                                                                  | **Ferma**     | **Frames**    | **Totorom**   | **Peapod**    |
+|------------------------------------------------------------------------------------------------------------------|---------------|---------------|---------------|---------------|
+| **[JPA-like Annotations](creating_annotated_domain_models)**                                                     | Supported     | Supported     | Not Supported | Supported     |
+| **[Type information encoded into graph](#type-information-encoded-into-graph)**                                  | Supported     | Supported     | Supported     | Supported     |
+| **[Framing of elements instantiated according to type hierarchy](#framing-instantiated-by-type-hierarchy)**      | Supported     | Supported     | Supported     | Supported     |
+| **[Element queried by type hierarchy](#element-queried-by-type-hierarchy)**                                      | Supported     | Not Supported | Not Supported | Partial \*    |
+| **[Turning off type resolution on a per call basis](#turning-off-type-resolution-per-call)**                     | Supported     | Not Supported | Not Supported | Not Supported |
+| **[Changing the encoded graph type already stored in the database](#changing-type-encoded-in-the-graph)**        | Supported     | Not Supported | Not Supported | Not Supported |
+| **[Customizing the way type information is stored in the graph](#customizing-how-types-are-encoded)**            | Supported     | Not Supported | Not Supported | Not Supported |
+| **Tinkerpop 2 support**                                                                                          | Supported     | Supported     | Supported     | Not Supported |
+| **Tinkerpop 3 support**                                                                                          | Not Supported | Not Supported | Not Supported | Supported     |
+
+\* While Peapod does support querying for all instances of a type, and its subtypes, it does not support a mechanism to query for a specific type while excluding subtypes.
+
+Type information encoded into graph
+-----------------------------------
+
+```java
+Set<Class<?>> types = new HashSet<Class<?>>(Arrays.asList(new Class<?>[]{Person.class}));
+Graph g = new TinkerGraph();
+FramedGraph fg = new DelegatingFramedGraph(g, types);
+
+fg.addFramedVertex(Person.class);
+Person person = fg.v().next(Program.class);
+
+String personClassName = Person.class.getName();
+String encodedClassName = person.getProperty(PolymorphicTypeResolver.TYPE_RESOLUTION_KEY)
+assert(personClassName.equals(encodedClassName));
+```
+
+Framing instantiated by type hierarchy
+--------------------------------------
+
+```java
+Set<Class<?>> types = new HashSet<Class<?>>(Arrays.asList(new Class<?>[]{Person.class,
+                                                                         Programmer.class}));
+TinkerGraph g = new TinkerGraph();
+FramedGraph fg = new DelegatingFramedGraph(g, types);
+
+fg.addFramedVertex(Programmer.class);
+
+//make sure the newly added node is actually a programmer
+Person programmer = fg.v().next(Person.class);
+assert(programmer instanceof Programmer);
+```
+
+Element queried by type hierarchy
+---------------------------------
+
+```java
+Set<Class<?>> types = new HashSet<Class<?>>(Arrays.asList(new Class<?>[]{Person.class,
+                                                                         Programmer.class}));
+TinkerGraph g = new TinkerGraph();
+FramedGraph fg = new DelegatingFramedGraph(g, types);
+
+fg.addFramedVertex(Programmer.class);
+fg.addFramedVertex(Person.class);
+
+//counts how many people (or subclasses thereof) in the graph.
+assert(fg.v().has(Person.class).count() == 2);
+//counts how many programmers are in the graph
+assert(fg.v().has(Programmer.class).count() == 1);
+```
+
+Turning off type resolution per call
+------------------------------------
+
+```java
+Set<Class<?>> types = new HashSet<Class<?>>(Arrays.asList(new Class<?>[]{Person.class,
+                                                                         Programmer.class}));
+TinkerGraph g = new TinkerGraph();
+FramedGraph fg = new DelegatingFramedGraph(g, types);
+
+fg.addFramedVertex(Programmer.class);
+
+//With type resolution is active it should be a programmer
+assert(fg.v().next(Person.class) instanceof Programmer);
+//With type resolution bypassed it is no longer a programmer
+assert(!(fg.v().nextExplicit(Person.class) instanceof Programmer));
+```
+
+Changing type encoded in the graph
+----------------------------------
+
+```java
+Set<Class<?>> types = new HashSet<Class<?>>(Arrays.asList(new Class<?>[]{Person.class,
+                                                                         Programmer.class}));
+TinkerGraph g = new TinkerGraph();
+FramedGraph fg = new DelegatingFramedGraph(g, types);
+
+fg.addFramedVertex(Programmer.class);
+
+//make sure the newly added node is actually a programmer
+Person programmer = fg.v().next(Person.class);
+assert(programmer instanceof Programmer);
+
+//change the type resolution to person
+programmer.setTypeResolution(Person.class);
+
+//make sure the newly added node is actually a programmer
+Person person = fg.v().next(Person.class);
+assert(person instanceof Person);
+assert(!(person instanceof Programmer));
+```
+
+Customizing how types are encoded
+---------------------------------
+
+```java
+Set<Class<?>> types = new HashSet<Class<?>>(Arrays.asList(new Class<?>[]{Person.class}));
+final ReflectionCache cache = new ReflectionCache(types);
+FrameFactory factory = new AnnotationFrameFactory(cache);
+TypeResolver resolver = new PolymorphicTypeResolver(cache, "customTypeKey");
+Graph g = new TinkerGraph();
+FramedGraph fg = new DelegatingFramedGraph(g, factory, resolver);
+
+fg.addFramedVertex(Person.class);
+Person person = fg.v().next(Program.class);
+
+String personClassName = Person.class.getName();
+String encodedClassName = person.getProperty("customTypeKey")
+assert(personClassName.equals(encodedClassName));
+```
+
diff --git a/documentation/docs/core_annotations.md b/documentation/docs/core_annotations.md
new file mode 100644
index 00000000..08eca9af
--- /dev/null
+++ b/documentation/docs/core_annotations.md
@@ -0,0 +1,364 @@
+[TOC]
+
+The Ferma schema is defined by a collection of interfaces and classes written by the user. Each method will interact with the underlying graph to either modify the graph in some way, or to retrieve an element or property from the graph. There are two techniques for defining how these methods behave. Either you can explicitly implement the method, or you can leave the method as abstract and annotate the method in order to allow Ferma to implement the method for you. Here we will define the annotations available to you and how they work, along with a few examples.
+
+The behavior of an annotated method is dictated not only by the annotation applied to it but also the method's signature. Therefore an annotated method will behave differently if it's return type, arguments, or even if the method name were to change. It is important to note that when a method is explicitly defined (doesnt use an annotation) then the method signature can be anything.
+
+Method names that are annotated must have one of the following prefixes: add, get, remove, set, is, can.
+
+Below specifies that annotations that can be used when defining a Frame's interface. By specifying the method argument and return types, the underlying graph is constrained to the interface specification.
+
+## Property annotation
+
+Valid on frames: Edge and Vertex
+
+Allowed prefixes: `get`, `is`, `can`, `set`, `remove`
+
+Annotation arguments:
+
+`value` - The name of the property
+
+The following would bind the method it is used on to the property named `foo`:
+
+```java
+@Property("foo")
+//Method declared here
+```
+
+### get prefix
+
+Valid method signatures: `()`
+
+#### ()
+
+Valid return types: *Any Object*
+
+Get the property value of an element. Used when property is not a boolean value.
+
+example:
+
+```java
+@Property("Foo")
+Bar getFoobar()
+```
+
+```java
+@Property("Foo")
+<E extends Bar> E getFoobar()
+```
+
+```java
+@Property("Foo")
+<E> E getFoobar()
+```
+
+### is prefix
+
+Valid method signatures: `()`
+
+#### ()
+
+Valid return types: `boolean`
+
+Get the property value of an element. Used when property is a boolean value.
+
+example:
+
+```java
+@Property("Foobared")
+boolean isFoobared()
+```
+
+### set prefix
+
+Valid method signatures: `(Object)`
+
+#### (Object)
+
+Valid return types: `void`
+
+Set the property value of an element. The argument can be any class accepted by the underlying graph.
+
+example:
+
+```java
+@Property("Foo")
+void setFoobar(Bar foobar)
+```
+
+```java
+@Property("Foo")
+<E extends Bar> void setFoobar(E foobar)
+```
+
+```java
+@Property("Foo")
+<E extends VectorFrame> void setFoobar(E foobar)
+```
+
+### remove prefix
+
+Valid method signatures: `()`
+
+#### ()
+
+Valid return types: `void`
+
+Remove the property of an element.
+
+example:
+
+```java
+@Property("Foo")
+void removeFoobar()
+```
+
+## Adjacency annotation
+
+Valid on frames: Vertex
+
+Allowed prefixes: `add`, `get`, `remove`, `set`
+
+Annotation arguments:
+
+`label` - The label assigned to the edge which connects the adjacent nodes.
+
+`direction` - The direction for the edge which creates the adjacency. It can be assigned any of the values from @org.apache.tinkerpop.gremlin.structure.Direction@.
+
+### add prefix
+
+Valid method signatures: `()`, `(<Any Vertex Frame>)`, `(ClassInitializer)`, `(ClassInitializer, ClassInitializer)`
+
+Adds a node as an adjacency to the current node, and the returns the newly connected node.
+
+#### ()
+
+Valid return types: `Object` or `VertexFrame`
+
+Creates a new vertex without any type information as well as an untyped edge to connect to it. The newly created VertexFrame is returned. Since it is untyped the return type of the signature can either be `Object` or `VertexFrame`.
+
+example:
+
+```java
+@Adjacency("Foo")
+VertexFrame addFoobar()
+```
+
+#### (&lt;Any Vertex Frame&gt;)
+
+Valid return types: *Any Vertex Frame*
+
+Creates a new edge without any type information and connects it between this vertex the vertex specified as an argument to the method. The frame returned is the same as the frame given in the argument, it is only there for compatability with other add methods. This method can also have a `void` return type.
+
+examples:
+
+```java
+@Adjacency("Foo")
+Bar addFoobar(Bar existingVertex)
+```
+
+```java
+@Adjacency("Foo")
+<E extends Bar> E addFoobar(E existingVertex)
+```
+
+```java
+@Adjacency("Foo")
+<E extends VertexFrame> E addFoobar(E existingVertex)
+```
+
+#### (ClassInitializer)
+
+Valid return types: *Any Vertex Frame*
+
+Creates a new edge without any type information and connects it between this vertex and a newly created vertex. The newly created vertex will have a type, as well as be initiated, according to the details specified in the ClassInitializer argument. Java generics can, and should, be used to narrow the return type.
+
+example:
+
+```java
+@Adjacency("Foo")
+Bar addFoobar(ClassInitializer<? extends Bar> vertexInitializer)
+```
+
+```java
+@Adjacency("Foo")
+<E extends Bar> E addFoobar(ClassInitializer<? extends E> vertexInitializer)
+```
+
+```java
+@Adjacency("Foo")
+<E extends VertexFrame> E addFoobar(ClassInitializer<? extends E> vertexInitializer)
+```
+
+#### (ClassInitializer, ClassInitializer)
+
+Valid return types: *Any Vertex Frame*
+
+Creates a new edge and connects this to a new vertex. The newly created vertex will have a type, as well as be initiated, according to the details specified in the first ClassInitializer argument. Similarly the newly created edge will hava type, and be initiated using, the second ClassInitializer argument. Java generics can, and should, be used to narrow the return type.
+
+example:
+
+```java
+@Adjacency("Foo")
+Bar addFoobar(ClassInitializer<? extends Bar> vertexInitializer,
+              ClassInitializer<?> edgeInitializer)
+```
+
+```java
+@Adjacency("Foo")
+<E extends Bar> E addFoobar(ClassInitializer<? extends E> vertexInitializer,
+                            ClassInitializer<?> edgeInitializer)
+```
+
+```java
+@Adjacency("Foo")
+<E extends VertexFrame> E addFoobar(ClassInitializer<? extends E> vertexInitializer,
+                                    ClassInitializer<?> edgeInitializer)
+```
+
+### get prefix
+
+Valid method signatures: `()`, `(Class)`
+
+Get's one or more adjacent vertex from the graph.
+
+#### ()
+
+Valid return types: *Any Vertex Frame* or `Object` or `VertexFrame` or `Iterator`
+
+Retrieves one or more of the adjacent vertex. If the return type is a specific Frame, an `Object`, or a `VertexFrame` then only the first instance is returned. If the return type is an iterator then it will iterate over all matching vertex. When using an Iterator it is encouraged to use generics. The returned frames will always be instantiated as the type encoded in the graph if there is one.
+
+**Note:** If a type is specified that is more specific than the type of the returned element then an exception will be thrown. Therefore the return type specifed should always by the same type, or a super-type, of the expected return type. VertexFrame is always a safe return type for this method.
+
+example:
+
+```java
+@Adjacency("Foo")
+Bar getFoobar()
+```
+
+```java
+@Adjacency("Foo")
+<E extends Bar> E getFoobar()
+```
+
+```java
+@Adjacency("Foo")
+<E extends VertexFrame> E getFoobar()
+```
+
+```java
+@Adjacency("Foo")
+Iterator<Bar> getFoobar()
+```
+
+```java
+@Adjacency("Foo")
+<E extends Bar> Iterator<E> getFoobar()
+```
+
+```java
+@Adjacency("Foo")
+<E extends VertexFrame> Iterator<E> getFoobar()
+```
+
+#### (Class)
+
+Valid return types: *Any Vertex Frame* or `Object` or `VertexFrame` or `Iterator`
+
+Retrieves one or more of the adjacent vertex. If the return type is a specific Frame, an `Object`, or a `VertexFrame` then only the first instance is returned. If the return type is an iterator then it will iterate over all matches vertex. When using an Iterator it is encouraged to use generics.
+
+The Class argument of the method specifes a filter such that only vertex which are of a matching type, or a subtype, to that of the argument will be returned.
+
+example:
+
+```java
+@Adjacency("Foo")
+Bar getFoobar(Class<? extends Bar> filter)
+```
+
+```java
+@Adjacency("Foo")
+<E extends Bar> E getFoobar(Class<? extends E> filter)
+```
+
+```java
+@Adjacency("Foo")
+<E extends VertexFrame> E getFoobar(Class<? extends E> filter)
+```
+
+```java
+@Adjacency("Foo")
+Iterator<Bar> getFoobar(Class<? extends Bar> filter)
+```
+
+```java
+@Adjacency("Foo")
+<E extends Bar> Iterator<E> getFoobar(Class<? extends E> filter)
+```
+
+```java
+@Adjacency("Foo")
+<E extends VertexFrame> Iterator<E> getFoobar(Class<? extends E> filter)
+```
+
+### remove prefix
+
+Valid method signatures: `(<Any Vertex Frame>)`
+
+Removes any edges which cause an adjacency.
+
+#### (&lt;Any Vertex Frame&gt;)
+
+Valid return types: `void`
+
+Removes any edges which create an adjacency between the vurrent vertex and the vertex specified in the methods argument.
+
+example:
+
+```java
+@Adjacency("Foo")
+void removeFoobar(Bar vertex)
+```
+
+```java
+@Adjacency("Foo")
+<E extends Bar> void removeFoobar(E vertex)
+```
+
+```java
+@Adjacency("Foo")
+<E extends VertexFrame> void removeFoobar(E vertex)
+```
+
+### set prefix
+
+Valid method signatures: `(Iterator)`
+
+Creates new edges connected to several vertex.
+
+#### (Iterator)
+
+Valid return types: `void`
+
+The argument for this method must be an Iterator which iterates over any vertex Frames. It is suggested you specify a Generic Type for the Iterator for usability.
+
+This method will iterate over all the vertex specified in the Iterator argument and create new edges to connect to it. The edges in the graph will not encode a type.
+
+example:
+
+```java
+@Adjacency("Foo")
+void setFoobar(Iterator<Bar> vertex)
+```
+
+```java
+@Adjacency("Foo")
+<E extends Bar> void setFoobar(Iterator<? extends E> vertex)
+```
+
+```java
+@Adjacency("Foo")
+<E extends VertexFrame> void setFoobar(Iterator<? extends E> vertex)
+```
+
diff --git a/documentation/docs/getting_started.md b/documentation/docs/getting_started.md
new file mode 100644
index 00000000..9bd3a8e9
--- /dev/null
+++ b/documentation/docs/getting_started.md
@@ -0,0 +1,189 @@
+---
+title: Getting Started
+permalink: getting_started.html
+sidebar: main_sidebar
+tags: [getting_started]
+keywords: quick start, getting started
+last_updated: October 30, 2016
+toc: true
+folder: documentation
+---
+
+Ferma provides three levels of type resolution: untyped, simple, and annotated. In untyped mode Ferma doesn't handle typing at all, instead the type must be explicitly indicated whenever querying. In simple mode Ferma provides type context encoded as graph element properties which ensures the same type comes out that goes in to a graph. In annotated mode all the features of simple mode are provided as well as enabling the use of annotations on abstract methods to instruct Ferma to dynamically construct byte code to implement the abstract methods at start up.
+
+## Dependency
+
+To include Ferma in your project of choice include the following Maven dependency into your build.
+
+```xml
+<dependency>
+    <groupId>com.syncleus.ferma</groupId>
+    <artifactId>ferma</artifactId>
+    <version>3.0.0</version>
+</dependency>
+```
+
+## Untyped Mode Example
+
+In untyped mode there is no automatic typing. Whatever class is explicitly indicated is the type that will be instantiated when performing queries. Lets start with a simple example domain.
+
+```java
+public class Person extends VertexFrame {
+  public String getName() {
+    return getProperty("name");
+  }
+
+  public void setName(String name) {
+    setProperty("name", name);
+  }
+
+  public List<? extends Knows> getKnowsList() {
+    return traverse((v) -> v.outE("knows")).toList(Knows.class);
+  }
+
+  public Knows addKnows(Person friend) {
+    return addEdge("knows", friend, Knows.class);
+  }
+}
+
+public class Knows extends EdgeFrame {
+  public void setYears(int years) {
+    setProperty("years", years);
+  }
+
+  public int getYears() {
+    return getProperty("years");
+  }
+}
+```
+
+And here is how you interact with the framed elements:
+
+```java
+public void testUntyped() {
+  Graph g = new TinkerGraph();
+
+  // implies untyped mode
+  FramedGraph fg = new DelegatingFramedGraph(g);
+
+  Person p1 = fg.addFramedVertex(Person.class);
+  p1.setName("Jeff");
+
+  Person p2 = fg.addFramedVertex(Person.class);
+  p2.setName("Julia");
+  Knows knows = p1.addKnows(p2);
+  knows.setYears(15);
+
+  Person jeff = fg.traverse((g) -> g.v().has("name", "Jeff")).next(Person.class);
+
+
+  Assert.assertEquals("Jeff", jeff.getName());
+}
+```
+
+## Simple Mode Example
+
+In simple mode you must provide concrete classes, no abstract or interfaces allowed, and the class should always extend from a FramedVertex or FramedEdge. Simple mode doesn't provide any annotations either. The purpose of simple mode is to provide type resolution. Basically the type of object you use when adding to the graph is the same type you get out when reading from the graph.
+
+Say we extend the Person class with the Programmer class.
+
+```java
+public class Programmer extends Person {
+}
+```
+
+Using simple mode will save the type of Java class the element was created with for use later:
+
+```java
+public void testSimpleTyping() {
+  Graph g = new TinkerGraph();
+
+  // implies simple mode
+  FramedGraph fg = new DelegatingFramedGraph(g, true, false);
+  
+  Person p1 = fg.addFramedVertex(Programmer.class);
+  p1.setName("Jeff");
+  
+  Person p2 = fg.addFramedVertex(Person.class);
+  p2.setName("Julia");
+  
+  Person jeff = fg.traverse((g) -> g.v().has("name", "Jeff")).next(Person.class);
+  Person julia = fg.traverse((g) -> g.v().has("name", "Julia")).next(Person.class);
+  
+  Assert.assertEquals(Programmer.class, jeff.getClass());
+  Assert.assertEquals(Person.class, julia.getClass());
+}
+```
+
+## Annotated Mode Example
+
+In annotated mode you can either provide concrete classes, abstract classes, or even interfaces. Abstract classes and concrete classes must extend from FramedVertex or FramedEdge, however, interfaces do not have this restriction. Annotated mode also provides a set of annotations which must be used to define any abstract methods that are to be implemented by the engine. Annotated mode provides the same type resolution as provided by simple mode with a bit more power to determine parent-child relationships at run time.
+
+The same example as above done with annotations would look something like this.
+
+```java
+public abstract class Person extends VertexFrame {
+  @Property("name")
+  public abstract String getName();
+
+  @Property("name")
+  public abstract void setName(String name);
+
+  @Adjacency("knows")
+  public abstract Iterator<Person>; getKnowsPeople();
+
+  @Incidence("knows")
+  public abstract Iterator<Knows> getKnows();
+
+  @Incidence("knows")
+  public abstract Knows addKnows(Person friend);
+
+  public List<Person> getFriendsNamedBill() {
+    return traverse((v) -> v.out("knows").has("name", "bill").toList(Person.class);
+  }
+}
+
+public abstract class Knows extends EdgeFrame {
+  @Property("years")
+  public abstract void setYears(int years);
+
+  @Property("years")
+  public abstract int getYears();
+
+  @InVertex
+  public abstract Person getIn();
+
+  @OutVertex
+  public abstract Person getIn();
+}
+
+public abstract class Programmer extends Person {
+}
+```
+
+If we pass a collection of Class objects to the FramedGraph constructor then the annotated type resolver will be used. In this mode you want to tell the engine what classes you will be using so it can handle type resolution properly and construct the byte code for any abstract annotated methods.
+
+```java
+public void testAnnotatedTyping() {
+  Set<Class<?>> types = new HashSet<Class<?>>(Arrays.asList(new Class<?>[]{
+                                                                    Person.class,
+                                                                    Programmer.class,
+                                                                    Knows.class}));
+  Graph g = new TinkerGraph();
+
+  //implies annotated mode
+  FramedGraph fg = new DelegatingFramedGraph(g, true, types);
+
+  Person p1 = fg.addFramedVertex(Programmer.class);
+  p1.setName("Jeff");
+
+  Person p2 = fg.addFramedVertex(Person.class);
+  p2.setName("Julia");
+
+  Person jeff = fg.traverse((g) -> g.v().has("name", "Jeff")).next(Person.class);
+  Person julia = fg.traverse((g) -> g.v().has("name", "Julia")).next(Person.class);
+
+  Assert.assertEquals(Programmer.class, jeff.getClass());
+  Assert.assertEquals(Person.class, julia.getClass());
+}
+```
diff --git a/documentation/docs/glossary.md b/documentation/docs/glossary.md
new file mode 100644
index 00000000..f37c99e8
--- /dev/null
+++ b/documentation/docs/glossary.md
@@ -0,0 +1,13 @@
+---
+title: Glossary
+permalink: glossary.html
+sidebar: main_sidebar
+tags: [getting_started]
+keywords: getting started
+last_updated: October 30, 2016
+toc: true
+folder: documentation
+---
+**Frame** - A class from the schema that represents an element from the graph. A frame usually extends either a VertexFrame or an EdgeFrame, though they are not required to do so.
+
+**Element** - Either a vertex or an edge in a graph.
diff --git a/documentation/docs/images/ferma-logo-plain.svg b/documentation/docs/images/ferma-logo-plain.svg
new file mode 100644
index 00000000..1e74add9
--- /dev/null
+++ b/documentation/docs/images/ferma-logo-plain.svg
@@ -0,0 +1,107 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<svg
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://creativecommons.org/ns#"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   version="1.1"
+   id="svg2"
+   viewBox="0 0 173.61184 189.536"
+   height="53.491272mm"
+   width="48.99712mm">
+  <defs
+     id="defs4" />
+  <metadata
+     id="metadata7">
+    <rdf:RDF>
+      <cc:Work
+         rdf:about="">
+        <dc:format>image/svg+xml</dc:format>
+        <dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+        <dc:title></dc:title>
+      </cc:Work>
+    </rdf:RDF>
+  </metadata>
+  <g
+     transform="translate(-691.32239,-355.88601)"
+     id="layer1">
+    <g
+       transform="translate(-1.210083,4.7148743)"
+       id="g4580">
+      <path
+         style="fill:#00ddff;fill-opacity:1;stroke:#000000;stroke-width:5;stroke-linecap:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+         id="path4138-36-0"
+         d="m 840.14619,445.97665 -19.36051,33.53339 -38.72102,0 -19.36051,-33.53339 19.36051,-33.53338 38.72102,0 z" />
+      <path
+         style="fill:#000000;fill-opacity:1;stroke:#000000;stroke-width:5;stroke-linecap:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+         d="m 772.94019,428.27338 -4.86328,8.42383 66.73437,0 -4.86523,-8.42383 -57.00586,0 z"
+         id="path4138-36-6" />
+      <path
+         style="fill:#000000;fill-opacity:1;stroke:#000000;stroke-width:5;stroke-linecap:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+         d="m 768.08659,455.1148 4.86328,8.42578 57.00781,0 4.86328,-8.42578 -66.73437,0 z"
+         id="path4138-36-7" />
+    </g>
+    <g
+       transform="matrix(0.5,0,0,0.5,365.03996,222.31239)"
+       id="g4585">
+      <path
+         style="fill:#000000;fill-opacity:1;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+         d="m 710.87159,425.89354 -17.86133,30.9375 17.71875,30.68945 17.86328,-30.9375 -17.7207,-30.68945 z"
+         id="path4138-36-0-3-9" />
+      <path
+         style="fill:#ff9100;fill-opacity:1;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+         d="m 706.87266,423.36638 -35.72332,3.9e-4 -17.71847,30.68962 35.7243,10e-4 17.71749,-30.69132 z"
+         id="path4138-36-0-3-2-31" />
+      <path
+         style="fill:#ff9100;fill-opacity:1;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+         d="m 706.88042,489.72793 -35.72332,-3.9e-4 -17.71847,-30.68962 35.7243,-10e-4 17.71749,30.69131 z"
+         id="path4138-36-0-3-2-3-9" />
+    </g>
+    <g
+       transform="translate(-7.4527987,-2.0631925)"
+       id="g4637">
+      <path
+         style="fill:#000000;fill-opacity:1;stroke:#ffffff;stroke-width:0.5;stroke-linecap:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+         d="m 834.5288,529.40327 17.86167,-1.9e-4 8.85923,-15.34481 -17.86215,-6.5e-4 -8.85875,15.34565 z"
+         id="path4138-36-0-3-9-1" />
+      <path
+         style="fill:#008b33;fill-opacity:1;stroke:#ffffff;stroke-width:0.5;stroke-linecap:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+         d="m 834.43424,531.76665 8.931,15.46855 17.71862,-8e-5 -8.93065,-15.46933 -17.7191,9.3e-4 z"
+         id="path4138-36-0-3-2-31-0" />
+      <path
+         style="fill:#008b33;fill-opacity:1;stroke:#ffffff;stroke-width:0.5;stroke-linecap:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+         d="m 863.1677,515.1729 8.93066,15.46875 -8.85938,15.34472 -8.93151,-15.46882 8.86036,-15.34473 z"
+         id="path4138-36-0-3-2-3-9-6" />
+    </g>
+    <g
+       transform="translate(-13.591404,9.1799578)"
+       id="g4629">
+      <path
+         style="fill:#000000;fill-opacity:1;stroke:#ffffff;stroke-width:0.5;stroke-linecap:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+         d="m 866.80809,380.11143 -8.931,-15.46856 -17.71861,9e-5 8.93051,15.4694 17.7191,-9.3e-4 z"
+         id="path4138-36-0-3-9-2" />
+      <path
+         style="fill:#9400ff;fill-opacity:1;stroke:#ffffff;stroke-width:0.5;stroke-linecap:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+         d="m 868.90212,379.01163 8.93066,-15.46874 -8.85938,-15.34473 -8.93151,15.46882 8.86036,15.34473 z"
+         id="path4138-36-0-3-2-31-06" />
+      <path
+         style="fill:#9400ff;fill-opacity:1;stroke:#ffffff;stroke-width:0.5;stroke-linecap:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+         d="m 840.16478,362.42461 8.931,-15.46856 17.71861,9e-5 -8.93064,15.46932 -17.7191,-9.3e-4 z"
+         id="path4138-36-0-3-2-3-9-1" />
+    </g>
+    <path
+       id="path4648"
+       d="m 819.64711,416.61758 17.09484,-29.60911"
+       style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:5;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+    <path
+       id="path4650"
+       d="m 760.72413,450.61509 -35.479,0"
+       style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:5;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+    <path
+       id="path4652"
+       d="m 819.39538,483.37611 c 0,1.39787 17.9468,31.0848 17.9468,31.0848"
+       style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:5;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+  </g>
+</svg>
diff --git a/documentation/docs/images/ferma-logo-text-plain.svg b/documentation/docs/images/ferma-logo-text-plain.svg
new file mode 100644
index 00000000..890eafb8
--- /dev/null
+++ b/documentation/docs/images/ferma-logo-text-plain.svg
@@ -0,0 +1,120 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<svg
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://creativecommons.org/ns#"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   version="1.1"
+   id="svg2"
+   viewBox="0 0 477.61568 189.536"
+   height="53.491272mm"
+   width="134.79376mm">
+  <defs
+     id="defs4" />
+  <metadata
+     id="metadata7">
+    <rdf:RDF>
+      <cc:Work
+         rdf:about="">
+        <dc:format>image/svg+xml</dc:format>
+        <dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+        <dc:title></dc:title>
+      </cc:Work>
+    </rdf:RDF>
+  </metadata>
+  <g
+     transform="translate(-691.32239,-355.88601)"
+     id="layer1">
+    <g
+       id="g3442">
+      <g
+         id="g4580"
+         transform="translate(-1.210083,4.7148743)">
+        <path
+           d="m 840.14619,445.97665 -19.36051,33.53339 -38.72102,0 -19.36051,-33.53339 19.36051,-33.53338 38.72102,0 z"
+           id="path4138-36-0"
+           style="fill:#00ddff;fill-opacity:1;stroke:#000000;stroke-width:5;stroke-linecap:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+        <path
+           id="path4138-36-6"
+           d="m 772.94019,428.27338 -4.86328,8.42383 66.73437,0 -4.86523,-8.42383 -57.00586,0 z"
+           style="fill:#000000;fill-opacity:1;stroke:#000000;stroke-width:5;stroke-linecap:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+        <path
+           id="path4138-36-7"
+           d="m 768.08659,455.1148 4.86328,8.42578 57.00781,0 4.86328,-8.42578 -66.73437,0 z"
+           style="fill:#000000;fill-opacity:1;stroke:#000000;stroke-width:5;stroke-linecap:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+      </g>
+      <g
+         id="g4585"
+         transform="matrix(0.5,0,0,0.5,365.03996,222.31239)">
+        <path
+           id="path4138-36-0-3-9"
+           d="m 710.87159,425.89354 -17.86133,30.9375 17.71875,30.68945 17.86328,-30.9375 -17.7207,-30.68945 z"
+           style="fill:#000000;fill-opacity:1;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+        <path
+           id="path4138-36-0-3-2-31"
+           d="m 706.87266,423.36638 -35.72332,3.9e-4 -17.71847,30.68962 35.7243,10e-4 17.71749,-30.69132 z"
+           style="fill:#ff9100;fill-opacity:1;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+        <path
+           id="path4138-36-0-3-2-3-9"
+           d="m 706.88042,489.72793 -35.72332,-3.9e-4 -17.71847,-30.68962 35.7243,-10e-4 17.71749,30.69131 z"
+           style="fill:#ff9100;fill-opacity:1;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+      </g>
+      <g
+         id="g4637"
+         transform="translate(-7.4527987,-2.0631925)">
+        <path
+           id="path4138-36-0-3-9-1"
+           d="m 834.5288,529.40327 17.86167,-1.9e-4 8.85923,-15.34481 -17.86215,-6.5e-4 -8.85875,15.34565 z"
+           style="fill:#000000;fill-opacity:1;stroke:#ffffff;stroke-width:0.5;stroke-linecap:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+        <path
+           id="path4138-36-0-3-2-31-0"
+           d="m 834.43424,531.76665 8.931,15.46855 17.71862,-8e-5 -8.93065,-15.46933 -17.7191,9.3e-4 z"
+           style="fill:#008b33;fill-opacity:1;stroke:#ffffff;stroke-width:0.5;stroke-linecap:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+        <path
+           id="path4138-36-0-3-2-3-9-6"
+           d="m 863.1677,515.1729 8.93066,15.46875 -8.85938,15.34472 -8.93151,-15.46882 8.86036,-15.34473 z"
+           style="fill:#008b33;fill-opacity:1;stroke:#ffffff;stroke-width:0.5;stroke-linecap:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+      </g>
+      <g
+         id="g4629"
+         transform="translate(-13.591404,9.1799578)">
+        <path
+           id="path4138-36-0-3-9-2"
+           d="m 866.80809,380.11143 -8.931,-15.46856 -17.71861,9e-5 8.93051,15.4694 17.7191,-9.3e-4 z"
+           style="fill:#000000;fill-opacity:1;stroke:#ffffff;stroke-width:0.5;stroke-linecap:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+        <path
+           id="path4138-36-0-3-2-31-06"
+           d="m 868.90212,379.01163 8.93066,-15.46874 -8.85938,-15.34473 -8.93151,15.46882 8.86036,15.34473 z"
+           style="fill:#9400ff;fill-opacity:1;stroke:#ffffff;stroke-width:0.5;stroke-linecap:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+        <path
+           id="path4138-36-0-3-2-3-9-1"
+           d="m 840.16478,362.42461 8.931,-15.46856 17.71861,9e-5 -8.93064,15.46932 -17.7191,-9.3e-4 z"
+           style="fill:#9400ff;fill-opacity:1;stroke:#ffffff;stroke-width:0.5;stroke-linecap:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+      </g>
+      <path
+         style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:5;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+         d="m 819.64711,416.61758 17.09484,-29.60911"
+         id="path4648" />
+      <path
+         style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:5;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+         d="m 760.72413,450.61509 -35.479,0"
+         id="path4650" />
+      <path
+         style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:5;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+         d="m 819.39538,483.37611 c 0,1.39787 17.9468,31.0848 17.9468,31.0848"
+         id="path4652" />
+    </g>
+    <text
+       id="text3539"
+       y="482.82199"
+       x="896.43323"
+       style="font-style:normal;font-weight:normal;font-size:40px;line-height:125%;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+       xml:space="preserve"><tspan
+         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:90px;line-height:125%;font-family:Clean;-inkscape-font-specification:'Clean, Normal';text-align:start;writing-mode:lr-tb;text-anchor:start"
+         y="482.82199"
+         x="896.43323"
+         id="tspan3541">Ferma</tspan></text>
+  </g>
+</svg>
diff --git a/documentation/docs/images/ferma-logo-text-small.png b/documentation/docs/images/ferma-logo-text-small.png
new file mode 100644
index 0000000000000000000000000000000000000000..47a2028f4990931d2fe613d6bdfa712f289e83ac
GIT binary patch
literal 5541
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
J8bzCk{{xSd^0NQ{

literal 0
HcmV?d00001

diff --git a/documentation/docs/images/ferma-logo-text.pdf b/documentation/docs/images/ferma-logo-text.pdf
new file mode 100644
index 0000000000000000000000000000000000000000..fc15f7c09e9882b49faa5adeb32da7954baa03bd
GIT binary patch
literal 5510
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

literal 0
HcmV?d00001

diff --git a/documentation/docs/images/ferma-logo-text.png b/documentation/docs/images/ferma-logo-text.png
new file mode 100644
index 0000000000000000000000000000000000000000..16b82d6b76d36247b33bd7415cba6c063c3bd665
GIT binary patch
literal 12502
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
A3IG5A

literal 0
HcmV?d00001

diff --git a/documentation/docs/images/ferma-logo-text.ps b/documentation/docs/images/ferma-logo-text.ps
new file mode 100644
index 00000000..8166ba51
--- /dev/null
+++ b/documentation/docs/images/ferma-logo-text.ps
@@ -0,0 +1,327 @@
+%!PS-Adobe-3.0
+%%Creator: cairo 1.14.6 (http://cairographics.org)
+%%CreationDate: Sun Oct 30 16:24:48 2016
+%%Pages: 1
+%%DocumentData: Clean7Bit
+%%LanguageLevel: 2
+%%DocumentMedia: 135x53mm 382 152 0 () ()
+%%BoundingBox: 0 -1 383 152
+%%EndComments
+%%BeginProlog
+/languagelevel where
+{ pop languagelevel } { 1 } ifelse
+2 lt { /Helvetica findfont 12 scalefont setfont 50 500 moveto
+  (This print job requires a PostScript Language Level 2 printer.) show
+  showpage quit } if
+/q { gsave } bind def
+/Q { grestore } bind def
+/cm { 6 array astore concat } bind def
+/w { setlinewidth } bind def
+/J { setlinecap } bind def
+/j { setlinejoin } bind def
+/M { setmiterlimit } bind def
+/d { setdash } bind def
+/m { moveto } bind def
+/l { lineto } bind def
+/c { curveto } bind def
+/h { closepath } bind def
+/re { exch dup neg 3 1 roll 5 3 roll moveto 0 rlineto
+      0 exch rlineto 0 rlineto closepath } bind def
+/S { stroke } bind def
+/f { fill } bind def
+/f* { eofill } bind def
+/n { newpath } bind def
+/W { clip } bind def
+/W* { eoclip } bind def
+/BT { } bind def
+/ET { } bind def
+/pdfmark where { pop globaldict /?pdfmark /exec load put }
+    { globaldict begin /?pdfmark /pop load def /pdfmark
+    /cleartomark load def end } ifelse
+/BDC { mark 3 1 roll /BDC pdfmark } bind def
+/EMC { mark /EMC pdfmark } bind def
+/cairo_store_point { /cairo_point_y exch def /cairo_point_x exch def } def
+/Tj { show currentpoint cairo_store_point } bind def
+/TJ {
+  {
+    dup
+    type /stringtype eq
+    { show } { -0.001 mul 0 cairo_font_matrix dtransform rmoveto } ifelse
+  } forall
+  currentpoint cairo_store_point
+} bind def
+/cairo_selectfont { cairo_font_matrix aload pop pop pop 0 0 6 array astore
+    cairo_font exch selectfont cairo_point_x cairo_point_y moveto } bind def
+/Tf { pop /cairo_font exch def /cairo_font_matrix where
+      { pop cairo_selectfont } if } bind def
+/Td { matrix translate cairo_font_matrix matrix concatmatrix dup
+      /cairo_font_matrix exch def dup 4 get exch 5 get cairo_store_point
+      /cairo_font where { pop cairo_selectfont } if } bind def
+/Tm { 2 copy 8 2 roll 6 array astore /cairo_font_matrix exch def
+      cairo_store_point /cairo_font where { pop cairo_selectfont } if } bind def
+/g { setgray } bind def
+/rg { setrgbcolor } bind def
+/d1 { setcachedevice } bind def
+/cairo_set_page_size {
+  % Change paper size, but only if different from previous paper size otherwise
+  % duplex fails. PLRM specifies a tolerance of 5 pts when matching paper size
+  % so we use the same when checking if the size changes.
+  /setpagedevice where {
+    pop currentpagedevice
+    /PageSize known {
+      2 copy
+      currentpagedevice /PageSize get aload pop
+      exch 4 1 roll
+      sub abs 5 gt
+      3 1 roll
+      sub abs 5 gt
+      or
+    } {
+      true
+    } ifelse
+    {
+      2 array astore
+      2 dict begin
+        /PageSize exch def
+        /ImagingBBox null def
+      currentdict end
+      setpagedevice
+    } {
+      pop pop
+    } ifelse
+  } {
+    pop
+  } ifelse
+} def
+%%EndProlog
+%%BeginSetup
+%%BeginResource: font DejaVuSans
+11 dict begin
+/FontType 42 def
+/FontName /DejaVuSans def
+/PaintType 0 def
+/FontMatrix [ 1 0 0 1 0 0 ] def
+/FontBBox [ 0 0 0 0 ] def
+/Encoding 256 array def
+0 1 255 { Encoding exch /.notdef put } for
+Encoding 70 /F put
+Encoding 97 /a put
+Encoding 101 /e put
+Encoding 109 /m put
+Encoding 114 /r put
+/CharStrings 6 dict dup begin
+/.notdef 0 def
+/F 1 def
+/e 2 def
+/r 3 def
+/m 4 def
+/a 5 def
+end readonly def
+/sfnts [
+<0001000000090080000300106376742000691d3900000468000001fe6670676d7134766a0000
+0668000000ab676c79667dfd012b0000009c000003cc68656164085dc2870000071400000036
+686865610d9f07730000074c00000024686d74781e4f038f00000770000000186c6f63610000
+0a90000007880000001c6d61787004730671000007a400000020707265703b07f100000007c4
+0000056800020066fe96046605a400030007001a400c04fb0006fb0108057f0204002fc4d4ec
+310010d4ecd4ec301311211125211121660400fc73031bfce5fe96070ef8f2720629000100c9
+0000042305d50009002940120695040295008104ad08050107031c00040a10fcec32d4c43100
+2fecf4ec10ee30b20f0b01015d13211521112115211123c9035afd700250fdb0ca05d5aafe48
+aafd370000020071ffe3047f047b0014001b00704024001501098608880515a90105b90c01bb
+18b912b80c8c1c1b1502081508004b02120f451c10fcecf4ecc4111239310010e4f4ece410ee
+10ee10f4ee1112393040293f1d701da01dd01df01d053f003f013f023f153f1b052c072f082f
+092c0a6f006f016f026f156f1b095d71015d0115211e0133323637150e012320001110003332
+00072e0123220607047ffcb20ccdb76ac76263d06bfef4fec70129fce20107b802a5889ab90e
+025e5abec73434ae2a2c0138010a01130143feddc497b4ae9e00000100ba0000034a047b0011
+00304014060b0700110b03870eb809bc070a06080008461210fcc4ec3231002fe4f4ecc4d4cc
+11123930b450139f1302015d012e012322061511231133153e0133321617034a1f492c9ca7b9
+b93aba85132e1c03b41211cbbefdb20460ae666305050000000100ba0000071d047b0022005a
+4026061209180f00061d07150c871d2003b81bbc19100700110f0808065011080f501c18081a
+462310fcec32fcfcfcec11123931002f3c3ce4f43cc4ec321112173930401330245024702490
+24a024a024bf24df24ff2409015d013e01333216151123113426232206151123113426232206
+1511231133153e01333216042945c082afbeb972758fa6b972778da6b9b93fb0797aab03897c
+76f5e2fd5c029ea19cbea4fd87029ea29bbfa3fd870460ae67627c0000000002007bffe3042d
+047b000a002500bc4027191f0b17090e00a91706b90e1120861fba1cb923b8118c170c001703
+180d09080b1f030814452610fcecccd4ec323211393931002fc4e4f4fcf4ec10c6ee10ee1139
+1139123930406e301d301e301f3020302130223f27401d401e401f402040214022501d501e50
+1f50205021502250277027851d871e871f8720872185229027a027f0271e301e301f30203021
+401e401f40204021501e501f50205021601e601f60206021701e701f70207021801e801f8020
+8021185d015d0122061514163332363d01371123350e01232226353436332135342623220607
+353e0133321602bedfac816f99b9b8b83fbc88accbfdfb0102a79760b65465be5af3f0023366
+7b6273d9b4294cfd81aa6661c1a2bdc0127f8b2e2eaa2727fc00013500b800cb00cb00c100aa
+009c01a600b800660000007100cb00a002b20085007500b800c301cb0189022d00cb00a600f0
+00d300aa008700cb03aa0400014a003300cb000000d9050200f4015400b4009c013901140139
+07060400044e04b4045204b804e704cd0037047304cd04600473013303a2055605a605560539
+03c5021200c9001f00b801df007300ba03e9033303bc0444040e00df03cd03aa00e503aa0404
+000000cb008f00a4007b00b80014016f007f027b0252008f00c705cd009a009a006f00cb00cd
+019e01d300f000ba018300d5009803040248009e01d500c100cb00f600830354027f00000333
+026600d300c700a400cd008f009a0073040005d5010a00fe022b00a400b4009c00000062009c
+0000001d032d05d505d505d505f0007f007b005400a406b80614072301d300b800cb00a601c3
+01ec069300a000d3035c037103db0185042304a80448008f0139011401390360008f05d5019a
+0614072306660179046004600460047b009c00000277046001aa00e904600762007b00c5007f
+027b000000b4025205cd006600bc00660077061000cd013b01850389008f007b0000001d00cd
+074a042f009c009c0000077d006f0000006f0335006a006f007b00ae00b2002d0396008f027b
+00f600830354063705f6008f009c04e10266008f018d02f600cd03440029006604ee00730000
+140000960000b707060504030201002c2010b002254964b040515820c859212d2cb002254964
+b040515820c859212d2c20100720b00050b00d7920b8ffff5058041b0559b0051cb0032508b0
+042523e120b00050b00d7920b8ffff5058041b0559b0051cb0032508e12d2c4b505820b0fd45
+4459212d2cb002254560442d2c4b5358b00225b0022545445921212d2c45442d2cb00225b002
+2549b00525b005254960b0206368208a108a233a8a10653a2d000001000000025999360ed052
+5f0f3cf5001f080000000000d17e0ee400000000d17e0ee4f7d6fc4c0e5909dc000000080000
+00010000000000010000076dfe1d00000efef7d6fa510e590001000000000000000000000000
+0000000604cd0066049a00c904ec0071034a00ba07cb00ba04e7007b00000000000000440000
+00980000016c000001dc000002a0000003cc0001000000060354002b0068000c000200100099
+000800000415021600080004b8028040fffbfe03fa1403f92503f83203f79603f60e03f5fe03
+f4fe03f32503f20e03f19603f02503ef8a4105effe03ee9603ed9603ecfa03ebfa03eafe03e9
+3a03e84203e7fe03e63203e5e45305e59603e48a4105e45303e3e22f05e3fa03e22f03e1fe03
+e0fe03df3203de1403dd9603dcfe03db1203da7d03d9bb03d8fe03d68a4105d67d03d5d44705
+d57d03d44703d3d21b05d3fe03d21b03d1fe03d0fe03cffe03cefe03cd9603cccb1e05ccfe03
+cb1e03ca3203c9fe03c6851105c61c03c51603c4fe03c3fe03c2fe03c1fe03c0fe03bffe03be
+fe03bdfe03bcfe03bbfe03ba1103b9862505b9fe03b8b7bb05b8fe03b7b65d05b7bb03b78004
+b6b52505b65d40ff03b64004b52503b4fe03b39603b2fe03b1fe03b0fe03affe03ae6403ad0e
+03acab2505ac6403abaa1205ab2503aa1203a98a4105a9fa03a8fe03a7fe03a6fe03a51203a4
+fe03a3a20e05a33203a20e03a16403a08a4105a096039ffe039e9d0c059efe039d0c039c9b19
+059c64039b9a10059b19039a1003990a0398fe0397960d0597fe03960d03958a410595960394
+930e05942803930e0392fa039190bb0591fe03908f5d0590bb039080048f8e25058f5d038f40
+048e25038dfe038c8b2e058cfe038b2e038a8625058a410389880b05891403880b0387862505
+8764038685110586250385110384fe038382110583fe0382110381fe0380fe037ffe0340ff7e
+7d7d057efe037d7d037c64037b5415057b25037afe0379fe03780e03770c03760a0375fe0374
+fa0373fa0372fa0371fa0370fe036ffe036efe036c21036bfe036a1142056a530369fe03687d
+036711420566fe0365fe0364fe0363fe0362fe03613a0360fa035e0c035dfe035bfe035afe03
+59580a0559fa03580a035716190557320356fe03555415055542035415035301100553180352
+1403514a130551fe03500b034ffe034e4d10054efe034d10034cfe034b4a13054bfe034a4910
+054a1303491d0d05491003480d0347fe0346960345960344fe0343022d0543fa0342bb03414b
+0340fe033ffe033e3d12053e14033d3c0f053d12033c3b0d053c40ff0f033b0d033afe0339fe
+033837140538fa033736100537140336350b05361003350b03341e03330d0332310b0532fe03
+310b03302f0b05300d032f0b032e2d09052e10032d09032c32032b2a25052b64032a2912052a
+25032912032827250528410327250326250b05260f03250b0324fe0323fe03220f0321011005
+2112032064031ffa031e1d0d051e64031d0d031c1142051cfe031bfa031a42031911420519fe
+031864031716190517fe031601100516190315fe0314fe0313fe031211420512fe0311022d05
+114203107d030f64030efe030d0c16050dfe030c0110050c16030bfe030a100309fe0308022d
+0508fe030714030664030401100504fe03401503022d0503fe0302011005022d0301100300fe
+0301b80164858d012b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b
+2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b
+2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b
+2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b
+2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b002b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b
+2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b
+2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b
+2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b
+2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b1d00>
+] def
+/f-0-0 currentdict end definefont pop
+%%EndResource
+%%EndSetup
+%%Page: 1 1
+%%BeginPageSetup
+%%PageMedia: 135x53mm
+%%PageBoundingBox: 0 -1 383 152
+383 152 cairo_set_page_size
+%%EndPageSetup
+q 0 -1 383 153 rectclip q
+0 0.866667 1 rg
+118.09 75.785 m 102.602 48.957 l 71.625 48.957 l 56.137 75.785 l 71.625
+ 102.609 l 102.602 102.609 l h
+118.09 75.785 m f
+0 g
+4 w
+1 J
+0 j
+[] 0.0 d
+4 M q 1 0 0 -1 0 151.628799 cm
+118.09 75.844 m 102.602 102.672 l 71.625 102.672 l 56.137 75.844 l 71.625
+ 49.02 l 102.602 49.02 l h
+118.09 75.844 m S Q
+64.328 89.945 m 60.438 83.207 l 113.824 83.207 l 109.93 89.945 l h
+64.328 89.945 m f
+q 1 0 0 -1 0 151.628799 cm
+64.328 61.684 m 60.438 68.422 l 113.824 68.422 l 109.93 61.684 l h
+64.328 61.684 m S Q
+60.441 68.473 m 64.332 61.734 l 109.941 61.734 l 113.832 68.473 l h
+60.441 68.473 m f
+q 1 0 0 -1 0 151.628799 cm
+60.441 83.156 m 64.332 89.895 l 109.941 89.895 l 113.832 83.156 l h
+60.441 83.156 m S Q
+23.324 88.129 m 16.18 75.754 l 23.266 63.48 l 30.41 75.855 l h
+23.324 88.129 m f
+1 g
+0.4 w
+q 1 0 0 -1 0 151.628799 cm
+23.324 63.5 m 16.18 75.875 l 23.266 88.148 l 30.41 75.773 l h
+23.324 63.5 m S Q
+1 0.568627 0 rg
+21.723 89.141 m 7.434 89.141 l 0.348 76.867 l 14.637 76.863 l h
+21.723 89.141 m f
+1 g
+q 1 0 0 -1 0 151.628799 cm
+21.723 62.488 m 7.434 62.488 l 0.348 74.762 l 14.637 74.766 l h
+21.723 62.488 m S Q
+1 0.568627 0 rg
+21.727 62.598 m 7.438 62.598 l 0.348 74.871 l 14.641 74.871 l h
+21.727 62.598 m f
+1 g
+q 1 0 0 -1 0 151.628799 cm
+21.727 89.031 m 7.438 89.031 l 0.348 76.758 l 14.641 76.758 l h
+21.727 89.031 m S Q
+0 g
+108.602 14.465 m 122.891 14.465 l 129.98 26.742 l 115.691 26.742 l h
+108.602 14.465 m f
+1 g
+q 1 0 0 -1 0 151.628799 cm
+108.602 137.164 m 122.891 137.164 l 129.98 124.887 l 115.691 124.887 l 
+h
+108.602 137.164 m S Q
+0 0.545098 0.2 rg
+108.527 12.574 m 115.672 0.199 l 129.848 0.199 l 122.703 12.574 l h
+108.527 12.574 m f
+1 g
+q 1 0 0 -1 0 151.628799 cm
+108.527 139.055 m 115.672 151.43 l 129.848 151.43 l 122.703 139.055 l h
+108.527 139.055 m S Q
+0 0.545098 0.2 rg
+131.516 25.851 m 138.66 13.476 l 131.57 1.199 l 124.426 13.574 l h
+131.516 25.851 m f
+1 g
+q 1 0 0 -1 0 151.628799 cm
+131.516 125.777 m 138.66 138.152 l 131.57 150.43 l 124.426 138.055 l h
+131.516 125.777 m S Q
+0 g
+129.516 124.906 m 122.371 137.281 l 108.195 137.281 l 115.34 124.902 l 
+h
+129.516 124.906 m f
+1 g
+q 1 0 0 -1 0 151.628799 cm
+129.516 26.723 m 122.371 14.348 l 108.195 14.348 l 115.34 26.727 l h
+129.516 26.723 m S Q
+0.580392 0 1 rg
+131.191 125.785 m 138.336 138.16 l 131.246 150.433 l 124.102 138.058 l 
+h
+131.191 125.785 m f
+1 g
+q 1 0 0 -1 0 151.628799 cm
+131.191 25.844 m 138.336 13.469 l 131.246 1.195 l 124.102 13.57 l h
+131.191 25.844 m S Q
+0.580392 0 1 rg
+108.199 139.055 m 115.344 151.43 l 129.52 151.43 l 122.375 139.055 l h
+108.199 139.055 m f
+1 g
+q 1 0 0 -1 0 151.628799 cm
+108.199 12.574 m 115.344 0.199 l 129.52 0.199 l 122.375 12.574 l h
+108.199 12.574 m S Q
+0 g
+4 w
+0 J
+q 1 0 0 -1 0 151.628799 cm
+102.66 48.586 m 116.336 24.898 l S Q
+q 1 0 0 -1 0 151.628799 cm
+55.52 75.785 m 27.137 75.785 l S Q
+q 1 0 0 -1 0 151.628799 cm
+102.457 101.992 m 102.457 103.109 116.816 126.859 116.816 126.859 c S Q
+BT
+72 0 0 72 164.08867 50.080015 Tm
+/f-0-0 1 Tf
+[(F)54(er)16(ma)]TJ
+ET
+Q Q
+showpage
+%%Trailer
+%%EOF
diff --git a/documentation/docs/images/ferma-logo-text.svg b/documentation/docs/images/ferma-logo-text.svg
new file mode 100644
index 00000000..4a0721f5
--- /dev/null
+++ b/documentation/docs/images/ferma-logo-text.svg
@@ -0,0 +1,177 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://creativecommons.org/ns#"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   width="134.79376mm"
+   height="53.491272mm"
+   viewBox="0 0 477.61568 189.536"
+   id="svg2"
+   version="1.1"
+   inkscape:version="0.91 r13725"
+   sodipodi:docname="ferma-logo-text.svg">
+  <defs
+     id="defs4" />
+  <sodipodi:namedview
+     id="base"
+     pagecolor="#ffffff"
+     bordercolor="#666666"
+     borderopacity="1.0"
+     inkscape:pageopacity="0.0"
+     inkscape:pageshadow="2"
+     inkscape:zoom="4.3926529"
+     inkscape:cx="171.71097"
+     inkscape:cy="94.31269"
+     inkscape:document-units="px"
+     inkscape:current-layer="layer1"
+     showgrid="false"
+     inkscape:window-width="2560"
+     inkscape:window-height="1491"
+     inkscape:window-x="0"
+     inkscape:window-y="31"
+     inkscape:window-maximized="1"
+     fit-margin-top="0"
+     fit-margin-left="0"
+     fit-margin-right="0"
+     fit-margin-bottom="0" />
+  <metadata
+     id="metadata7">
+    <rdf:RDF>
+      <cc:Work
+         rdf:about="">
+        <dc:format>image/svg+xml</dc:format>
+        <dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+        <dc:title></dc:title>
+      </cc:Work>
+    </rdf:RDF>
+  </metadata>
+  <g
+     inkscape:label="Layer 1"
+     inkscape:groupmode="layer"
+     id="layer1"
+     transform="translate(-691.32239,-355.88601)">
+    <g
+       id="g3442">
+      <g
+         transform="translate(-1.210083,4.7148743)"
+         id="g4580">
+        <path
+           sodipodi:type="star"
+           style="fill:#00ddff;fill-opacity:1;stroke:#000000;stroke-width:5;stroke-linecap:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+           id="path4138-36-0"
+           sodipodi:sides="6"
+           sodipodi:cx="801.42517"
+           sodipodi:cy="445.97665"
+           sodipodi:r1="38.721016"
+           sodipodi:r2="33.533382"
+           sodipodi:arg1="0"
+           sodipodi:arg2="0.52359878"
+           inkscape:flatsided="true"
+           inkscape:rounded="0"
+           inkscape:randomized="0"
+           d="m 840.14619,445.97665 -19.36051,33.53339 -38.72102,0 -19.36051,-33.53339 19.36051,-33.53338 38.72102,0 z" />
+        <path
+           style="fill:#000000;fill-opacity:1;stroke:#000000;stroke-width:5;stroke-linecap:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+           d="m 772.94019,428.27338 -4.86328,8.42383 66.73437,0 -4.86523,-8.42383 -57.00586,0 z"
+           id="path4138-36-6"
+           inkscape:connector-curvature="0" />
+        <path
+           style="fill:#000000;fill-opacity:1;stroke:#000000;stroke-width:5;stroke-linecap:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+           d="m 768.08659,455.1148 4.86328,8.42578 57.00781,0 4.86328,-8.42578 -66.73437,0 z"
+           id="path4138-36-7"
+           inkscape:connector-curvature="0" />
+      </g>
+      <g
+         transform="matrix(0.5,0,0,0.5,365.03996,222.31239)"
+         id="g4585">
+        <path
+           style="fill:#000000;fill-opacity:1;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+           d="m 710.87159,425.89354 -17.86133,30.9375 17.71875,30.68945 17.86328,-30.9375 -17.7207,-30.68945 z"
+           id="path4138-36-0-3-9"
+           inkscape:connector-curvature="0" />
+        <path
+           style="fill:#ff9100;fill-opacity:1;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+           d="m 706.87266,423.36638 -35.72332,3.9e-4 -17.71847,30.68962 35.7243,10e-4 17.71749,-30.69132 z"
+           id="path4138-36-0-3-2-31"
+           inkscape:connector-curvature="0" />
+        <path
+           style="fill:#ff9100;fill-opacity:1;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+           d="m 706.88042,489.72793 -35.72332,-3.9e-4 -17.71847,-30.68962 35.7243,-10e-4 17.71749,30.69131 z"
+           id="path4138-36-0-3-2-3-9"
+           inkscape:connector-curvature="0" />
+      </g>
+      <g
+         transform="translate(-7.4527987,-2.0631925)"
+         id="g4637">
+        <path
+           style="fill:#000000;fill-opacity:1;stroke:#ffffff;stroke-width:0.5;stroke-linecap:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+           d="m 834.5288,529.40327 17.86167,-1.9e-4 8.85923,-15.34481 -17.86215,-6.5e-4 -8.85875,15.34565 z"
+           id="path4138-36-0-3-9-1"
+           inkscape:connector-curvature="0" />
+        <path
+           style="fill:#008b33;fill-opacity:1;stroke:#ffffff;stroke-width:0.5;stroke-linecap:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+           d="m 834.43424,531.76665 8.931,15.46855 17.71862,-8e-5 -8.93065,-15.46933 -17.7191,9.3e-4 z"
+           id="path4138-36-0-3-2-31-0"
+           inkscape:connector-curvature="0" />
+        <path
+           style="fill:#008b33;fill-opacity:1;stroke:#ffffff;stroke-width:0.5;stroke-linecap:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+           d="m 863.1677,515.1729 8.93066,15.46875 -8.85938,15.34472 -8.93151,-15.46882 8.86036,-15.34473 z"
+           id="path4138-36-0-3-2-3-9-6"
+           inkscape:connector-curvature="0" />
+      </g>
+      <g
+         transform="translate(-13.591404,9.1799578)"
+         id="g4629">
+        <path
+           style="fill:#000000;fill-opacity:1;stroke:#ffffff;stroke-width:0.5;stroke-linecap:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+           d="m 866.80809,380.11143 -8.931,-15.46856 -17.71861,9e-5 8.93051,15.4694 17.7191,-9.3e-4 z"
+           id="path4138-36-0-3-9-2"
+           inkscape:connector-curvature="0" />
+        <path
+           style="fill:#9400ff;fill-opacity:1;stroke:#ffffff;stroke-width:0.5;stroke-linecap:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+           d="m 868.90212,379.01163 8.93066,-15.46874 -8.85938,-15.34473 -8.93151,15.46882 8.86036,15.34473 z"
+           id="path4138-36-0-3-2-31-06"
+           inkscape:connector-curvature="0" />
+        <path
+           style="fill:#9400ff;fill-opacity:1;stroke:#ffffff;stroke-width:0.5;stroke-linecap:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+           d="m 840.16478,362.42461 8.931,-15.46856 17.71861,9e-5 -8.93064,15.46932 -17.7191,-9.3e-4 z"
+           id="path4138-36-0-3-2-3-9-1"
+           inkscape:connector-curvature="0" />
+      </g>
+      <path
+         inkscape:connector-curvature="0"
+         id="path4648"
+         d="m 819.64711,416.61758 17.09484,-29.60911"
+         style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:5;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path4650"
+         d="m 760.72413,450.61509 -35.479,0"
+         style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:5;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path4652"
+         d="m 819.39538,483.37611 c 0,1.39787 17.9468,31.0848 17.9468,31.0848"
+         style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:5;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+    </g>
+    <text
+       xml:space="preserve"
+       style="font-style:normal;font-weight:normal;font-size:40px;line-height:125%;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+       x="896.43323"
+       y="482.82199"
+       id="text3539"
+       sodipodi:linespacing="125%"><tspan
+         sodipodi:role="line"
+         id="tspan3541"
+         x="896.43323"
+         y="482.82199"
+         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:90px;line-height:125%;font-family:Clean;-inkscape-font-specification:'Clean, Normal';text-align:start;writing-mode:lr-tb;text-anchor:start">Ferma</tspan></text>
+  </g>
+</svg>
diff --git a/documentation/docs/images/ferma-logo.pdf b/documentation/docs/images/ferma-logo.pdf
new file mode 100644
index 0000000000000000000000000000000000000000..4e0a55ae7b6947644017bd756a999aab3981248a
GIT binary patch
literal 1515
zcmY!laB<T$)HCH$-THRjZ!Tj61BLvgEG`=x1%02?y!4U`1rwl95SN02g1%d3PDyGJ
zkj_agNp(q0&QD3@va{nVE-6Y)%;l<>vozE;U&N8;?f39A@&|g}{`{~dbHW4-Ce=j_
zj$SR3lmb3{ul)Az&C_>_oZa7bP2KzL^X9*4&nr)APB#5h_2|oMyS@MCUH+S2{`mh-
zXRVj#54}{Dv7f&FzQCNz{Y#hlzm)ta_xYTB%*<I4^2&E@b<em}E{Qwo<>}wKIpFjr
zyWLBUU$Nb@ui%Q?n%ZS&8dRq`-n{SMk!e3ibf@Qb>Fkn?m-ipoBpS5w$^&EejG0}B
z%(R45BTp{bQ}D#mIlZaaqIJhS<}5M4Wk<GJvNNnwkxp5BZj#&v>p4^0*GM`(VtL%b
za$H_Tpv5<Cfl^o8g|$InrzXma9ex`proVJ+idziNHm1J6rSGLw`ZmvH(hA7Ewq(A+
z&LfR0xz%(+&NN)!IML{=JA>A$?@oJ<+Hsj)@45Y2!|(I`Ba44u+5G9);bl8NXIxpG
zYf~e2xz6HreXZ(rzkqFDk7TIl6}Gu3Fy6D((7w?2F!02hb~7zg{+qU^4{Li!ORid)
z_9T5$c0}lxqg}_cP8{)m#84e`v3E+Mg}#iF?dy5M?%#Qy^Uj&FvdCFhJh|Mjt1sGS
zN1LAw%hjxTQ@H%TNNo(ZYTj9wo^e-kNh`<oshR25+mEgMxKHx<j|T^SD112aLc2eB
z!UD&uoA^FXx_+irk?p4ap%-CScQ3ni%uGzPfMt29j*QpG%(Dw+691Ub%&1wwvf%VG
zY1S0J?^@DtUM2i`@~UV4EXyW~H|e{V8s)9*mN}9ds9>AzxbUdWpA9_m$HW=pPOQHw
z`AhwL%*IR4Tc3Wj-@Lb~P%v#-<HNPnAH6!*E-gOu^Tq&$d0+4B>lWI6I$qMaLyIdl
zF9n+7fGkj21tm}r4NRhDhNd8S5YGsnlEG=$wW7p5xCEGP6>Mxk0zjajXaM9W=sP<q
z7%J!|Cjv=eY6eOGNg#rnV+uD%K|iFjAXPy>ATd1^Y-T`WQEFZZP#Y|R_@<_0COYL;
zC`1E=3=|BFE%YobEKMv76%0)c^~{Vc%q=YyV!?Wy^Yco8nu`@cIS!J&+>7!{3y_=#
zu?;K=b8#@x4MmB0#RVXnlPh7uo(d&JrC>LKyyXm3<&s*KnVcHr?gUZ-@s)m1YH@yP
zQF3ar0w`>Pko*Yp0W8-e{8$WjsCQ;cG0;DtU<iV{y%gkaBm>Nl3~&aP1||7L3L43Y
znML^uhI)o3dS(h586_nJR{FqT1`4JZB^G34CKv1F7o}@zf~^TC%1<dx29_?wYeU45
zIg<4d_d6$+B<AF&LyQK-S1~k}5PB+#Qq#B$6fC$5;6TC5)YRBiAx!})W@un!sQ{K$
z$b*R)m}3z$Fa!n<2q3F70J;iI%)$T|(x_sF2A06|iza4dgru&dC^0i9wFq1!2WM8L
v0-X$s<)Hlh5(SXQA&JK`FD+jI6b;~bEiOqcDgpb@(8%1FOI6j?-;E0ZdQl!v

literal 0
HcmV?d00001

diff --git a/documentation/docs/images/ferma-logo.png b/documentation/docs/images/ferma-logo.png
new file mode 100644
index 0000000000000000000000000000000000000000..1c11117c51c3a6a62cc0f962bd089150053dacfa
GIT binary patch
literal 7225
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
KC|N50Dd2wqjxGiO

literal 0
HcmV?d00001

diff --git a/documentation/docs/images/ferma-logo.ps b/documentation/docs/images/ferma-logo.ps
new file mode 100644
index 00000000..a4e7d5a4
--- /dev/null
+++ b/documentation/docs/images/ferma-logo.ps
@@ -0,0 +1,207 @@
+%!PS-Adobe-3.0
+%%Creator: cairo 1.14.6 (http://cairographics.org)
+%%CreationDate: Thu Oct 27 12:03:18 2016
+%%Pages: 1
+%%DocumentData: Clean7Bit
+%%LanguageLevel: 2
+%%DocumentMedia: 49x53mm 139 152 0 () ()
+%%BoundingBox: 0 -1 139 152
+%%EndComments
+%%BeginProlog
+/languagelevel where
+{ pop languagelevel } { 1 } ifelse
+2 lt { /Helvetica findfont 12 scalefont setfont 50 500 moveto
+  (This print job requires a PostScript Language Level 2 printer.) show
+  showpage quit } if
+/q { gsave } bind def
+/Q { grestore } bind def
+/cm { 6 array astore concat } bind def
+/w { setlinewidth } bind def
+/J { setlinecap } bind def
+/j { setlinejoin } bind def
+/M { setmiterlimit } bind def
+/d { setdash } bind def
+/m { moveto } bind def
+/l { lineto } bind def
+/c { curveto } bind def
+/h { closepath } bind def
+/re { exch dup neg 3 1 roll 5 3 roll moveto 0 rlineto
+      0 exch rlineto 0 rlineto closepath } bind def
+/S { stroke } bind def
+/f { fill } bind def
+/f* { eofill } bind def
+/n { newpath } bind def
+/W { clip } bind def
+/W* { eoclip } bind def
+/BT { } bind def
+/ET { } bind def
+/pdfmark where { pop globaldict /?pdfmark /exec load put }
+    { globaldict begin /?pdfmark /pop load def /pdfmark
+    /cleartomark load def end } ifelse
+/BDC { mark 3 1 roll /BDC pdfmark } bind def
+/EMC { mark /EMC pdfmark } bind def
+/cairo_store_point { /cairo_point_y exch def /cairo_point_x exch def } def
+/Tj { show currentpoint cairo_store_point } bind def
+/TJ {
+  {
+    dup
+    type /stringtype eq
+    { show } { -0.001 mul 0 cairo_font_matrix dtransform rmoveto } ifelse
+  } forall
+  currentpoint cairo_store_point
+} bind def
+/cairo_selectfont { cairo_font_matrix aload pop pop pop 0 0 6 array astore
+    cairo_font exch selectfont cairo_point_x cairo_point_y moveto } bind def
+/Tf { pop /cairo_font exch def /cairo_font_matrix where
+      { pop cairo_selectfont } if } bind def
+/Td { matrix translate cairo_font_matrix matrix concatmatrix dup
+      /cairo_font_matrix exch def dup 4 get exch 5 get cairo_store_point
+      /cairo_font where { pop cairo_selectfont } if } bind def
+/Tm { 2 copy 8 2 roll 6 array astore /cairo_font_matrix exch def
+      cairo_store_point /cairo_font where { pop cairo_selectfont } if } bind def
+/g { setgray } bind def
+/rg { setrgbcolor } bind def
+/d1 { setcachedevice } bind def
+/cairo_set_page_size {
+  % Change paper size, but only if different from previous paper size otherwise
+  % duplex fails. PLRM specifies a tolerance of 5 pts when matching paper size
+  % so we use the same when checking if the size changes.
+  /setpagedevice where {
+    pop currentpagedevice
+    /PageSize known {
+      2 copy
+      currentpagedevice /PageSize get aload pop
+      exch 4 1 roll
+      sub abs 5 gt
+      3 1 roll
+      sub abs 5 gt
+      or
+    } {
+      true
+    } ifelse
+    {
+      2 array astore
+      2 dict begin
+        /PageSize exch def
+        /ImagingBBox null def
+      currentdict end
+      setpagedevice
+    } {
+      pop pop
+    } ifelse
+  } {
+    pop
+  } ifelse
+} def
+%%EndProlog
+%%BeginSetup
+%%EndSetup
+%%Page: 1 1
+%%BeginPageSetup
+%%PageMedia: 49x53mm
+%%PageBoundingBox: 0 -1 139 152
+139 152 cairo_set_page_size
+%%EndPageSetup
+q 0 -1 139 153 rectclip q
+0 0.866667 1 rg
+118.09 75.785 m 102.602 48.957 l 71.625 48.957 l 56.137 75.785 l 71.625
+ 102.609 l 102.602 102.609 l h
+118.09 75.785 m f
+0 g
+4 w
+1 J
+0 j
+[] 0.0 d
+4 M q 1 0 0 -1 0 151.628799 cm
+118.09 75.844 m 102.602 102.672 l 71.625 102.672 l 56.137 75.844 l 71.625
+ 49.02 l 102.602 49.02 l h
+118.09 75.844 m S Q
+64.328 89.945 m 60.438 83.207 l 113.824 83.207 l 109.93 89.945 l h
+64.328 89.945 m f
+q 1 0 0 -1 0 151.628799 cm
+64.328 61.684 m 60.438 68.422 l 113.824 68.422 l 109.93 61.684 l h
+64.328 61.684 m S Q
+60.441 68.473 m 64.332 61.734 l 109.941 61.734 l 113.832 68.473 l h
+60.441 68.473 m f
+q 1 0 0 -1 0 151.628799 cm
+60.441 83.156 m 64.332 89.895 l 109.941 89.895 l 113.832 83.156 l h
+60.441 83.156 m S Q
+23.324 88.129 m 16.18 75.754 l 23.266 63.48 l 30.41 75.855 l h
+23.324 88.129 m f
+1 g
+0.4 w
+q 1 0 0 -1 0 151.628799 cm
+23.324 63.5 m 16.18 75.875 l 23.266 88.148 l 30.41 75.773 l h
+23.324 63.5 m S Q
+1 0.568627 0 rg
+21.723 89.141 m 7.434 89.141 l 0.348 76.867 l 14.637 76.863 l h
+21.723 89.141 m f
+1 g
+q 1 0 0 -1 0 151.628799 cm
+21.723 62.488 m 7.434 62.488 l 0.348 74.762 l 14.637 74.766 l h
+21.723 62.488 m S Q
+1 0.568627 0 rg
+21.727 62.598 m 7.438 62.598 l 0.348 74.871 l 14.641 74.871 l h
+21.727 62.598 m f
+1 g
+q 1 0 0 -1 0 151.628799 cm
+21.727 89.031 m 7.438 89.031 l 0.348 76.758 l 14.641 76.758 l h
+21.727 89.031 m S Q
+0 g
+108.602 14.465 m 122.891 14.465 l 129.98 26.742 l 115.691 26.742 l h
+108.602 14.465 m f
+1 g
+q 1 0 0 -1 0 151.628799 cm
+108.602 137.164 m 122.891 137.164 l 129.98 124.887 l 115.691 124.887 l 
+h
+108.602 137.164 m S Q
+0 0.545098 0.2 rg
+108.527 12.574 m 115.672 0.199 l 129.848 0.199 l 122.703 12.574 l h
+108.527 12.574 m f
+1 g
+q 1 0 0 -1 0 151.628799 cm
+108.527 139.055 m 115.672 151.43 l 129.848 151.43 l 122.703 139.055 l h
+108.527 139.055 m S Q
+0 0.545098 0.2 rg
+131.516 25.851 m 138.66 13.476 l 131.57 1.199 l 124.426 13.574 l h
+131.516 25.851 m f
+1 g
+q 1 0 0 -1 0 151.628799 cm
+131.516 125.777 m 138.66 138.152 l 131.57 150.43 l 124.426 138.055 l h
+131.516 125.777 m S Q
+0 g
+129.516 124.906 m 122.371 137.281 l 108.195 137.281 l 115.34 124.902 l 
+h
+129.516 124.906 m f
+1 g
+q 1 0 0 -1 0 151.628799 cm
+129.516 26.723 m 122.371 14.348 l 108.195 14.348 l 115.34 26.727 l h
+129.516 26.723 m S Q
+0.580392 0 1 rg
+131.191 125.785 m 138.336 138.16 l 131.246 150.433 l 124.102 138.058 l 
+h
+131.191 125.785 m f
+1 g
+q 1 0 0 -1 0 151.628799 cm
+131.191 25.844 m 138.336 13.469 l 131.246 1.195 l 124.102 13.57 l h
+131.191 25.844 m S Q
+0.580392 0 1 rg
+108.199 139.055 m 115.344 151.43 l 129.52 151.43 l 122.375 139.055 l h
+108.199 139.055 m f
+1 g
+q 1 0 0 -1 0 151.628799 cm
+108.199 12.574 m 115.344 0.199 l 129.52 0.199 l 122.375 12.574 l h
+108.199 12.574 m S Q
+0 g
+4 w
+0 J
+q 1 0 0 -1 0 151.628799 cm
+102.66 48.586 m 116.336 24.898 l S Q
+q 1 0 0 -1 0 151.628799 cm
+55.52 75.785 m 27.137 75.785 l S Q
+q 1 0 0 -1 0 151.628799 cm
+102.457 101.992 m 102.457 103.109 116.816 126.859 116.816 126.859 c S Q
+Q Q
+showpage
+%%Trailer
+%%EOF
diff --git a/documentation/docs/images/ferma-logo.svg b/documentation/docs/images/ferma-logo.svg
new file mode 100644
index 00000000..b4801118
--- /dev/null
+++ b/documentation/docs/images/ferma-logo.svg
@@ -0,0 +1,162 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://creativecommons.org/ns#"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   width="48.99712mm"
+   height="53.491272mm"
+   viewBox="0 0 173.61184 189.536"
+   id="svg2"
+   version="1.1"
+   inkscape:version="0.91 r13725"
+   sodipodi:docname="ferma-logo.svg">
+  <defs
+     id="defs4" />
+  <sodipodi:namedview
+     id="base"
+     pagecolor="#ffffff"
+     bordercolor="#666666"
+     borderopacity="1.0"
+     inkscape:pageopacity="0.0"
+     inkscape:pageshadow="2"
+     inkscape:zoom="7.6449856"
+     inkscape:cx="66.736981"
+     inkscape:cy="100.00018"
+     inkscape:document-units="px"
+     inkscape:current-layer="layer1"
+     showgrid="false"
+     inkscape:window-width="2560"
+     inkscape:window-height="1491"
+     inkscape:window-x="0"
+     inkscape:window-y="31"
+     inkscape:window-maximized="1"
+     fit-margin-top="0"
+     fit-margin-left="0"
+     fit-margin-right="0"
+     fit-margin-bottom="0" />
+  <metadata
+     id="metadata7">
+    <rdf:RDF>
+      <cc:Work
+         rdf:about="">
+        <dc:format>image/svg+xml</dc:format>
+        <dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+        <dc:title></dc:title>
+      </cc:Work>
+    </rdf:RDF>
+  </metadata>
+  <g
+     inkscape:label="Layer 1"
+     inkscape:groupmode="layer"
+     id="layer1"
+     transform="translate(-691.32239,-355.88601)">
+    <g
+       id="g4580"
+       transform="translate(-1.210083,4.7148743)">
+      <path
+         d="m 840.14619,445.97665 -19.36051,33.53339 -38.72102,0 -19.36051,-33.53339 19.36051,-33.53338 38.72102,0 z"
+         inkscape:randomized="0"
+         inkscape:rounded="0"
+         inkscape:flatsided="true"
+         sodipodi:arg2="0.52359878"
+         sodipodi:arg1="0"
+         sodipodi:r2="33.533382"
+         sodipodi:r1="38.721016"
+         sodipodi:cy="445.97665"
+         sodipodi:cx="801.42517"
+         sodipodi:sides="6"
+         id="path4138-36-0"
+         style="fill:#00ddff;fill-opacity:1;stroke:#000000;stroke-width:5;stroke-linecap:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+         sodipodi:type="star" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path4138-36-6"
+         d="m 772.94019,428.27338 -4.86328,8.42383 66.73437,0 -4.86523,-8.42383 -57.00586,0 z"
+         style="fill:#000000;fill-opacity:1;stroke:#000000;stroke-width:5;stroke-linecap:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path4138-36-7"
+         d="m 768.08659,455.1148 4.86328,8.42578 57.00781,0 4.86328,-8.42578 -66.73437,0 z"
+         style="fill:#000000;fill-opacity:1;stroke:#000000;stroke-width:5;stroke-linecap:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+    </g>
+    <g
+       id="g4585"
+       transform="matrix(0.5,0,0,0.5,365.03996,222.31239)">
+      <path
+         inkscape:connector-curvature="0"
+         id="path4138-36-0-3-9"
+         d="m 710.87159,425.89354 -17.86133,30.9375 17.71875,30.68945 17.86328,-30.9375 -17.7207,-30.68945 z"
+         style="fill:#000000;fill-opacity:1;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path4138-36-0-3-2-31"
+         d="m 706.87266,423.36638 -35.72332,3.9e-4 -17.71847,30.68962 35.7243,10e-4 17.71749,-30.69132 z"
+         style="fill:#ff9100;fill-opacity:1;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path4138-36-0-3-2-3-9"
+         d="m 706.88042,489.72793 -35.72332,-3.9e-4 -17.71847,-30.68962 35.7243,-10e-4 17.71749,30.69131 z"
+         style="fill:#ff9100;fill-opacity:1;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+    </g>
+    <g
+       id="g4637"
+       transform="translate(-7.4527987,-2.0631925)">
+      <path
+         inkscape:connector-curvature="0"
+         id="path4138-36-0-3-9-1"
+         d="m 834.5288,529.40327 17.86167,-1.9e-4 8.85923,-15.34481 -17.86215,-6.5e-4 -8.85875,15.34565 z"
+         style="fill:#000000;fill-opacity:1;stroke:#ffffff;stroke-width:0.5;stroke-linecap:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path4138-36-0-3-2-31-0"
+         d="m 834.43424,531.76665 8.931,15.46855 17.71862,-8e-5 -8.93065,-15.46933 -17.7191,9.3e-4 z"
+         style="fill:#008b33;fill-opacity:1;stroke:#ffffff;stroke-width:0.5;stroke-linecap:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path4138-36-0-3-2-3-9-6"
+         d="m 863.1677,515.1729 8.93066,15.46875 -8.85938,15.34472 -8.93151,-15.46882 8.86036,-15.34473 z"
+         style="fill:#008b33;fill-opacity:1;stroke:#ffffff;stroke-width:0.5;stroke-linecap:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+    </g>
+    <g
+       id="g4629"
+       transform="translate(-13.591404,9.1799578)">
+      <path
+         inkscape:connector-curvature="0"
+         id="path4138-36-0-3-9-2"
+         d="m 866.80809,380.11143 -8.931,-15.46856 -17.71861,9e-5 8.93051,15.4694 17.7191,-9.3e-4 z"
+         style="fill:#000000;fill-opacity:1;stroke:#ffffff;stroke-width:0.5;stroke-linecap:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path4138-36-0-3-2-31-06"
+         d="m 868.90212,379.01163 8.93066,-15.46874 -8.85938,-15.34473 -8.93151,15.46882 8.86036,15.34473 z"
+         style="fill:#9400ff;fill-opacity:1;stroke:#ffffff;stroke-width:0.5;stroke-linecap:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path4138-36-0-3-2-3-9-1"
+         d="m 840.16478,362.42461 8.931,-15.46856 17.71861,9e-5 -8.93064,15.46932 -17.7191,-9.3e-4 z"
+         style="fill:#9400ff;fill-opacity:1;stroke:#ffffff;stroke-width:0.5;stroke-linecap:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+    </g>
+    <path
+       style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:5;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+       d="m 819.64711,416.61758 17.09484,-29.60911"
+       id="path4648"
+       inkscape:connector-curvature="0" />
+    <path
+       style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:5;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+       d="m 760.72413,450.61509 -35.479,0"
+       id="path4650"
+       inkscape:connector-curvature="0" />
+    <path
+       style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:5;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+       d="m 819.39538,483.37611 c 0,1.39787 17.9468,31.0848 17.9468,31.0848"
+       id="path4652"
+       inkscape:connector-curvature="0" />
+  </g>
+</svg>
diff --git a/documentation/docs/index.md b/documentation/docs/index.md
new file mode 100644
index 00000000..8eca2e52
--- /dev/null
+++ b/documentation/docs/index.md
@@ -0,0 +1,103 @@
+---
+title: Introduction
+keywords: introduction
+tags: [getting_started]
+sidebar: main_sidebar
+permalink: index.html
+toc: false
+---
+
+![](images/ferma-logo-text.png)
+
+An ORM / OGM for the TinkerPop graph stack.
+
+**Licensed under the Apache Software License v2**
+
+The Ferma project was originally created as an alternative to the
+TinkerPop2 Frames project. Which at the time lacked features needed by
+the community, and its performance was cripplingly slow. Today Ferma is
+a robust framework that takes on a role similar to an Object-relational
+Model (ORM) library for traditional databases. Ferma is often referred
+to as a Object-graph Model (OGM) library, and maps Java objects to
+elements in a graph such as a Vertex or an Edges. In short it allows a
+schema to be defined using java interfaces and classes which provides a
+level of abstraction for interacting with the underlying graph.
+
+Ferma 3.x **Supports TinkerPop3**. For tinkerPop2 support use Ferma
+version 2.x.
+
+Annotated classes in Ferma have their abstract methods implemented using
+code generation during start-up with Byte Buddy, avoiding the need for
+proxy classes. This in turn significantly improves performance when
+compared with TinkerPop Frames and other frameworks. Ferma offers many
+features including several annotation types to reduce the need for
+boilerplate code as well as handling Java typing transparently. This
+ensures whatever the type of the object is when you persist it to the
+graph the same Java type will be used when instantiating a class off of
+the graph.
+
+Ferma is designed to easily replace TinkerPop Frames in existing code,
+as such, the annotations provided by Ferma are a super-set of those
+provided by TinkerPop Frames.
+
+Ferma is built directly on top of TinkerPop and allows access to all of
+the internals. This ensures all the TinkerPop features are available to
+the end-user. The TinkerPop stack provides several tools which can be
+used to work with the Ferma engine.
+
+-   **Gremlin**, a database agnostic query language for Graph Databases.
+-   **Gremlin Server**, a server that provides an interface for
+    executing Gremlin on remote machines.
+-   a data-flow framework for splitting, merging, filtering, and
+    transforming of data
+-   **Graph Computer**, a framework for running algorithms against a
+    Graph Database.
+-   Support for both **OLTP** and **OLAP** engines.
+-   **TinkerGraph** a Graph Database and the reference implementation
+    for TinkerPop.
+-   Native **Gephi** integration for visualizing graphs.
+-   Interfaces for most major Graph Compute Engines including **Hadoop
+    M/R**. **Spark**, and **Giraph**.
+
+Ferma also supports any of the many databases compatible with TinkerPop
+including the following.
+
+-   [Titan](http://thinkaurelius.github.io/titan/)
+-   [Neo4j](http://neo4j.com)
+-   [OrientDB](http://www.orientechnologies.com/orientdb/)
+-   [MongoDB](http://www.mongodb.org)
+-   [Oracle
+    NoSQL](http://www.oracle.com/us/products/database/nosql/overview/index.html)
+-   TinkerGraph
+
+Ferma Javadocs:
+[latest](http://www.javadoc.io/doc/com.syncleus.ferma/ferma) -
+[3.0.1](http://www.javadoc.io/doc/com.syncleus.ferma/ferma/3.0.1) -
+[3.0.0](http://www.javadoc.io/doc/com.syncleus.ferma/ferma/3.0.0) -
+[2.2.0](http://www.javadoc.io/doc/com.syncleus.ferma/ferma/2.2.0) -
+[2.1.0](http://www.javadoc.io/doc/com.syncleus.ferma/ferma/2.1.0) -
+[2.0.6](http://www.javadoc.io/doc/com.syncleus.ferma/ferma/2.0.6) -
+[2.0.5](http://www.javadoc.io/doc/com.syncleus.ferma/ferma/2.0.5) -
+[2.0.4](http://www.javadoc.io/doc/com.syncleus.ferma/ferma/2.0.4) -
+[2.0.3](http://www.javadoc.io/doc/com.syncleus.ferma/ferma/2.0.3) -
+[2.0.2](http://www.javadoc.io/doc/com.syncleus.ferma/ferma/2.0.2) -
+[2.0.1](http://www.javadoc.io/doc/com.syncleus.ferma/ferma/2.0.1) -
+[2.0.0](http://www.javadoc.io/doc/com.syncleus.ferma/ferma/2.0.0)
+
+For support please use
+[Gitter](https://gitter.im/Syncleus/Ferma?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge)
+or the [official Ferma mailing
+list](https://groups.google.com/a/syncleus.com/forum/#!forum/ferma-list).
+
+Please file bugs and feature requests on
+[Github](https://github.com/Syncleus/Ferma/issues).
+
+Obtaining the Source
+--------------------
+
+The official source repository for Ferma is located in the Syncleus
+Github repository and can be cloned using the following command.
+
+```
+git clone https://github.com/Syncleus/Ferma.git
+```
diff --git a/documentation/mkdocs.yml b/documentation/mkdocs.yml
new file mode 100644
index 00000000..b1b92889
--- /dev/null
+++ b/documentation/mkdocs.yml
@@ -0,0 +1,25 @@
+site_name: Ferma
+theme: material
+repo_name: 'GitHub'
+repo_url: 'https://github.com/Syncleus/Ferma'
+pages:
+    - Home: index.md
+    - Comparing the Alternatives: comparing_the_alternatives.md
+    - Core Annotations: core_annotations.md
+    - Getting Started: getting_started.md
+    - Glossary: glossary.md
+extra:
+  version: '3.0.1'
+  logo: 'images/ferma-logo.png'
+  palette:
+    primary: 'blue'
+    accent: 'deep orange'
+  author:
+    github: 'freemo'
+    twitter: 'DebeoMorium'
+
+markdown_extensions:
+  - codehilite(css_class=code)
+  - admonition
+  - toc:
+      permalink: True
-- 
GitLab