diff --git a/rocolib/api/ports/DecorationPort.py b/rocolib/api/ports/DecorationPort.py
new file mode 100644
index 0000000000000000000000000000000000000000..aa3f2b236e3f3404f0fcffd2b35f79ea0ace21d2
--- /dev/null
+++ b/rocolib/api/ports/DecorationPort.py
@@ -0,0 +1,44 @@
+from rocolib.api.ports import Port, FacePort
+from rocolib.utils.utils import decorateGraph
+import numpy as np
+
+
+class DecorationPort(Port):
+  def __init__(self, parent, decoration):
+    Port.__init__(self, parent, {})
+    self.decoration = decoration
+
+  def getDecoration(self):
+    return self.decoration
+
+  def toString(self):
+    return str(self.decoration)
+
+  def canMate(self, otherPort):
+    return (otherPort.getFaceName() is not None)
+
+  def attachFrom(self, fromPort, graph, **kwargs):
+    # If from face to decoration, we can decorate the face
+    if isinstance(fromPort, FacePort):
+      face = graph.getFace(fromPort.getFaceName())
+      deco = self.getDecoration()
+      if face is not None:
+        decorateGraph(face, decoration=deco, **kwargs)
+
+
+class AnchorPort(FacePort):
+  def __init__(self, parent, graph, face, transform):
+    FacePort.__init__(self, parent, graph, face)
+    self.transform = transform
+
+  def getTransform(self):
+    return self.transform
+
+  def canMate(self, otherPort):
+    return False
+
+  def attachFrom(self, fromPort, graph, **kwargs):
+    if isinstance(fromPort, DecorationPort):
+      deco = fromPort.getDecoration().faces[0]
+      face = self.getFaceName()
+      graph.mergeFace(deco.joinedFaces[0][0].name, face, np.dot(self.getTransform(), deco.transform2D))