diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml
new file mode 100644
index 0000000..87d6693
--- /dev/null
+++ b/.github/workflows/main.yml
@@ -0,0 +1,25 @@
+name: CI
+
+on:
+ # Triggers the workflow on push or pull request events but only for the master branch
+ push:
+ branches: [ main ]
+ pull_request:
+ branches: [ main ]
+
+ # Allows to run this workflow manually from the Actions tab
+ workflow_dispatch:
+
+jobs:
+ xmllint:
+ runs-on: ubuntu-latest
+ steps:
+ - uses: actions/checkout@v4
+ - name: Enable annotations for XML validation errors and warnings
+ uses: korelstar/xmllint-problem-matcher@v1
+ - name: Validate example.bpmn using BPMN20.xsd
+ id: xmllint
+ uses: ChristophWurst/xmllint-action@v1
+ with:
+ xml-file: example.bpmn
+ xml-schema-file: BPMN/BPMN20.xsd
\ No newline at end of file
diff --git a/.vscode/settings.json b/.vscode/settings.json
new file mode 100644
index 0000000..c10c081
--- /dev/null
+++ b/.vscode/settings.json
@@ -0,0 +1,13 @@
+{
+ "xml.references": [
+ {
+ "pattern": "**/*.bpmn",
+ "expressions": [
+ {
+ "from": "BPMNShape/@iconRef",
+ "to": "iconDefinition/@id"
+ }
+ ]
+ }
+ ]
+}
\ No newline at end of file
diff --git a/BPMN/BPMN20.xsd b/BPMN/BPMN20.xsd
new file mode 100755
index 0000000..463ef6e
--- /dev/null
+++ b/BPMN/BPMN20.xsd
@@ -0,0 +1,37 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/BPMN/BPMNDI.xsd b/BPMN/BPMNDI.xsd
new file mode 100755
index 0000000..615740f
--- /dev/null
+++ b/BPMN/BPMNDI.xsd
@@ -0,0 +1,100 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/BPMN/DC.xsd b/BPMN/DC.xsd
new file mode 100755
index 0000000..80e9fa8
--- /dev/null
+++ b/BPMN/DC.xsd
@@ -0,0 +1,29 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/BPMN/DI.xsd b/BPMN/DI.xsd
new file mode 100755
index 0000000..4023d28
--- /dev/null
+++ b/BPMN/DI.xsd
@@ -0,0 +1,100 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/BPMN/Semantic.xsd b/BPMN/Semantic.xsd
new file mode 100755
index 0000000..1c611da
--- /dev/null
+++ b/BPMN/Semantic.xsd
@@ -0,0 +1,1562 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/BPMN20-with-Icon.xsd b/BPMN20-with-Icon.xsd
new file mode 100644
index 0000000..28d8b02
--- /dev/null
+++ b/BPMN20-with-Icon.xsd
@@ -0,0 +1,22 @@
+
+
+
+
+
+
+
+
+
+
+
diff --git a/BPMNDI-with-iconRef.xsd b/BPMNDI-with-iconRef.xsd
new file mode 100644
index 0000000..5c5c49d
--- /dev/null
+++ b/BPMNDI-with-iconRef.xsd
@@ -0,0 +1,22 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/README.md b/README.md
index 46cd361..06e89a9 100644
--- a/README.md
+++ b/README.md
@@ -1,2 +1,51 @@
-# bpmn-icon
-BPMN 2.0 Extension for interchanging Custom Icons
+# BPMN Icon Extension (bpmn-icon)
+
+This specification defines an extension of BPMN 2.0 for interchanging custom icons.
+It uses the [extension mechanism of BPMN](https://www.omg.org/spec/BPMN/2.0.2/PDF#page=72)
+to transport additional markers, which are explicitly permitted in
+[section 2.2.3 Visual Appearance](https://www.omg.org/spec/BPMN/2.0.2/PDF#page=38).
+
+## Design considerations
+
+The placement of the icons in the rendered diagram is not specified in this extension
+and is deliberately left for to tool vendors to decide.
+
+The icon is stored using the
+[Data URI Scheme (RFC2397)](https://en.wikipedia.org/wiki/Data_URI_scheme)
+because that is widely supported by many tools,
+e.g. by SVG which is used by many tools for rendering BPMN.
+
+SVG icons with no fill are prefered. For pixel graphics prefer transparent PNGs.
+
+Since icons are relatively large, especially when not using vector graphics,
+they should be reusable and placed in a central place in the XML serialization.
+
+The extension should allow attaching custom icons to any BPMN element,
+i.e. icons cannot be embedded in elements like `bpmn:Interface`
+because only some of the BPMN elements use that element.
+
+Unfortunately, neither the top-level `bpmn:definitions` not the `bpmndi:BPMNDiagram`
+containers permit `extensionElements`.
+Therefore, this extension uses a top-level `bpmn:relationship` as a container, e.g.
+
+```xml
+
+ ...
+
+
+
+
+ IconExample
+ IconExample
+
+
+```
+
+The relationship's `source` and `target` MUST point to the `id` of the `bpmn:definitions` root element.
+Note that the [relationship XML example in the BPMN specification text](https://www.omg.org/spec/BPMN/2.0/PDF#page=93) is not schema-valid.
+
+Icons are referenced from `BPMNDiagramElements` using `icon:iconRef`:
+
+```xml
+
+```
\ No newline at end of file
diff --git a/bpmn-icon.xsd b/bpmn-icon.xsd
new file mode 100644
index 0000000..2325698
--- /dev/null
+++ b/bpmn-icon.xsd
@@ -0,0 +1,42 @@
+
+
+
+
+ This XML schema defines and documents an extension of BPMN 2.0
+ for interchanging custom icons.
+
+
+
+
+
+
+ This element defines a custom icon
+ and is meant to be placed inside
+ the bpmn:extensionElements of a bpmn:relationship.
+
+
+
+
+
+
+
+
+
+
+
+
+ This attribute points to the id of the iconDefinition
+ and is meant to be placed inside the bpmndi:BPMNShape element.
+ It is of type xs:QName to allow for referencing iconDefinitions
+ that are imported from another BPMN file using bpmn:import.
+
+
+
+
+
diff --git a/example.bpmn b/example.bpmn
new file mode 100644
index 0000000..010dc14
--- /dev/null
+++ b/example.bpmn
@@ -0,0 +1,27 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ IconExample
+ IconExample
+
+