diff --git a/notebooks/experimental/graphcat-etree.ipynb b/notebooks/experimental/graphcat-etree.ipynb
new file mode 100644
index 00000000..452b65fa
--- /dev/null
+++ b/notebooks/experimental/graphcat-etree.ipynb
@@ -0,0 +1,348 @@
+{
+ "cells": [
+ {
+ "cell_type": "code",
+ "execution_count": 1,
+ "id": "cc4e651b",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "import copy\n",
+ "import xml.etree.ElementTree as xml\n",
+ "\n",
+ "import graphcat.notebook"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 2,
+ "id": "f0261a32",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "def append_element(graph, name, inputs):\n",
+ " parent = copy.copy(inputs.getone(\"parent\"))\n",
+ " child = inputs.getone(\"child\")\n",
+ " parent.append(child)\n",
+ " return parent\n",
+ "\n",
+ "\n",
+ "def create_element(tag, attrib={}, **extra):\n",
+ " def implementation(graph, name, inputs):\n",
+ " return xml.Element(tag, attrib=attrib, **extra)\n",
+ " return implementation"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 3,
+ "id": "aec611fb",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "graph = graphcat.StaticGraph()\n",
+ "graph.add_task(\"canvas\", create_element(\"canvas\"))\n",
+ "graph.add_task(\"axes1\", create_element(\"cartesian\"))\n",
+ "graph.add_task(\"append1\", append_element)\n",
+ "graph.add_links(\"canvas\", (\"append1\", \"parent\"))\n",
+ "graph.add_links(\"axes1\", (\"append1\", \"child\"))\n",
+ "graph.add_task(\"axes2\", create_element(\"radial\"))\n",
+ "graph.add_task(\"append2\", append_element)\n",
+ "graph.add_links(\"append1\", (\"append2\", \"parent\"))\n",
+ "graph.add_links(\"axes2\", (\"append2\", \"child\"))"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 4,
+ "id": "829dff2f",
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "image/svg+xml": [
+ ""
+ ],
+ "text/plain": [
+ ""
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ }
+ ],
+ "source": [
+ "graphcat.notebook.display(graph)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 5,
+ "id": "85047669",
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "\n"
+ ]
+ }
+ ],
+ "source": [
+ "xml.dump(graph.output(\"append2\"))"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 6,
+ "id": "1c168856",
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ ""
+ ]
+ },
+ "execution_count": 6,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "graph.output(\"canvas\")"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 7,
+ "id": "43b70ff2",
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ ""
+ ]
+ },
+ "execution_count": 7,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "graph.output(\"append1\")"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 8,
+ "id": "ac3fb8fc",
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ ""
+ ]
+ },
+ "execution_count": 8,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "graph.output(\"append2\")"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 9,
+ "id": "19bfccf5",
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ ""
+ ]
+ },
+ "execution_count": 9,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "graph.output(\"axes1\")"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 10,
+ "id": "53b6eaad",
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ ""
+ ]
+ },
+ "execution_count": 10,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "graph.output(\"append1\")[0]"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 11,
+ "id": "de4c208e",
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ ""
+ ]
+ },
+ "execution_count": 11,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "graph.output(\"append2\")[0]"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 12,
+ "id": "58b101aa",
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ ""
+ ]
+ },
+ "execution_count": 12,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "graph.output(\"axes2\")"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 13,
+ "id": "84afef9d",
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ ""
+ ]
+ },
+ "execution_count": 13,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "graph.output(\"append2\")[1]"
+ ]
+ }
+ ],
+ "metadata": {
+ "kernelspec": {
+ "display_name": "Python 3 (ipykernel)",
+ "language": "python",
+ "name": "python3"
+ },
+ "language_info": {
+ "codemirror_mode": {
+ "name": "ipython",
+ "version": 3
+ },
+ "file_extension": ".py",
+ "mimetype": "text/x-python",
+ "name": "python",
+ "nbconvert_exporter": "python",
+ "pygments_lexer": "ipython3",
+ "version": "3.8.10"
+ }
+ },
+ "nbformat": 4,
+ "nbformat_minor": 5
+}