diff --git a/rocolib/builders/PivotBuilder.py b/rocolib/builders/PivotBuilder.py
new file mode 100644
index 0000000000000000000000000000000000000000..e34238aad750c3fa176749c091d06499a0ccc4ad
--- /dev/null
+++ b/rocolib/builders/PivotBuilder.py
@@ -0,0 +1,49 @@
+from rocolib.api.components.Component import Component
+
+c = Component()
+
+c.addParameter("length", 76, paramType="length", minValue=65) #tested minValue
+c.addParameter("width", 60, paramType="length", minValue=60) #tested minValue
+
+c.addSubcomponent("servo", "MountedServo", inherit="angle")
+c.addParameter("driveservo", "pivotservo", paramType="dimension")
+c.addConstraint(("servo", "servo"), "driveservo")
+c.addConstraint(("servo", "length"), "driveservo", 'getDim(x, "motorlength") + 2 * getDim(x, "shoulderlength")')
+c.addConstConstraint(("servo", "center"), False)
+
+for i in range(7):
+    c.addSubcomponent("belt%d" %i, "Rectangle")
+    c.addConstraint(("belt%d"%i, "w"), "driveservo", 'getDim(x, "motorheight")')
+
+for i in range(3):
+    c.addConstraint(("belt%d"%i, "l"), ("width", "driveservo"), "(x[0]-getDim(x[1], 'motorwidth'))/2")
+
+for i in range(3, 5):
+    c.addConstraint(("belt%d" % i, "l"), "driveservo", 'getDim(x, "motorlength") + 2 * getDim(x, "shoulderlength")')
+
+for i in range(5, 7):
+    c.addConstraint(("belt%d"%i, "l"), "length")
+
+c.addConnection(("servo", "botedge3"), ("belt0", "l"), angle=-90)
+c.addConnection(("servo", "botedge1"), ("belt1", "l"), angle=-90)
+c.addConnection(("servo", "topedge1"), ("belt3", "l"), angle=-180)
+c.addConnection(("servo", "topedge3"), ("belt4", "l"), angle=-180)
+c.addConnection(("belt2", "l"), ("belt4", "r"), angle=90)
+
+c.addConnection(("belt0", "r"), ("belt5", "l"), angle=90)
+c.addConnection(("belt1", "r"), ("belt6", "l"), angle=90)
+
+c.addSubcomponent("pivotface", "Trapezoid")
+c.addConstraint(("pivotface", "width"), "width", "x-(2*x*.15)")
+c.addConstraint(("pivotface", "depth"), "driveservo", "getDim(x, 'motorlength')")
+c.addConstraint(("pivotface", "bangle"), ("width", "driveservo"),
+                    "float(np.atan(getDim(x[1], 'motorlength')/(x[0]*.15))* 180 * 0.318309)")
+
+c.addConnection(("servo", "mount"), ("pivotface", "face0"))
+
+c.inheritAllInterfaces("servo")
+c.inheritAllInterfaces("pivotface")
+for i in range(3):
+    c.inheritAllInterfaces("belt%d" %i)
+
+c.toLibrary("Pivot")
\ No newline at end of file
diff --git a/rocolib/library/Pivot.yaml b/rocolib/library/Pivot.yaml
new file mode 100644
index 0000000000000000000000000000000000000000..1c98f9abaf6994ba9128a0fc228adcb33e2f3080
--- /dev/null
+++ b/rocolib/library/Pivot.yaml
@@ -0,0 +1,282 @@
+connections:
+  connection0:
+  - - servo
+    - botedge3
+  - - belt0
+    - l
+  - angle: -90
+  connection1:
+  - - servo
+    - botedge1
+  - - belt1
+    - l
+  - angle: -90
+  connection2:
+  - - servo
+    - topedge1
+  - - belt3
+    - l
+  - angle: -180
+  connection3:
+  - - servo
+    - topedge3
+  - - belt4
+    - l
+  - angle: -180
+  connection4:
+  - - belt2
+    - l
+  - - belt4
+    - r
+  - angle: 90
+  connection5:
+  - - belt0
+    - r
+  - - belt5
+    - l
+  - angle: 90
+  connection6:
+  - - belt1
+    - r
+  - - belt6
+    - l
+  - angle: 90
+  connection7:
+  - - servo
+    - mount
+  - - pivotface
+    - face0
+  - {}
+interfaces:
+  belt0.b:
+    interface: b
+    subcomponent: belt0
+  belt0.face:
+    interface: face
+    subcomponent: belt0
+  belt0.l:
+    interface: l
+    subcomponent: belt0
+  belt0.r:
+    interface: r
+    subcomponent: belt0
+  belt0.t:
+    interface: t
+    subcomponent: belt0
+  belt1.b:
+    interface: b
+    subcomponent: belt1
+  belt1.face:
+    interface: face
+    subcomponent: belt1
+  belt1.l:
+    interface: l
+    subcomponent: belt1
+  belt1.r:
+    interface: r
+    subcomponent: belt1
+  belt1.t:
+    interface: t
+    subcomponent: belt1
+  belt2.b:
+    interface: b
+    subcomponent: belt2
+  belt2.face:
+    interface: face
+    subcomponent: belt2
+  belt2.l:
+    interface: l
+    subcomponent: belt2
+  belt2.r:
+    interface: r
+    subcomponent: belt2
+  belt2.t:
+    interface: t
+    subcomponent: belt2
+  pivotface.botedge:
+    interface: botedge
+    subcomponent: pivotface
+  pivotface.face0:
+    interface: face0
+    subcomponent: pivotface
+  pivotface.ledge:
+    interface: ledge
+    subcomponent: pivotface
+  pivotface.redge:
+    interface: redge
+    subcomponent: pivotface
+  pivotface.topedge:
+    interface: topedge
+    subcomponent: pivotface
+  servo.botedge0:
+    interface: botedge0
+    subcomponent: servo
+  servo.botedge1:
+    interface: botedge1
+    subcomponent: servo
+  servo.botedge2:
+    interface: botedge2
+    subcomponent: servo
+  servo.botedge3:
+    interface: botedge3
+    subcomponent: servo
+  servo.face0:
+    interface: face0
+    subcomponent: servo
+  servo.face1:
+    interface: face1
+    subcomponent: servo
+  servo.face2:
+    interface: face2
+    subcomponent: servo
+  servo.face3:
+    interface: face3
+    subcomponent: servo
+  servo.horn:
+    interface: horn
+    subcomponent: servo
+  servo.mount:
+    interface: mount
+    subcomponent: servo
+  servo.mount.decoration:
+    interface: mount.decoration
+    subcomponent: servo
+  servo.slotedge:
+    interface: slotedge
+    subcomponent: servo
+  servo.tabedge:
+    interface: tabedge
+    subcomponent: servo
+  servo.topedge0:
+    interface: topedge0
+    subcomponent: servo
+  servo.topedge1:
+    interface: topedge1
+    subcomponent: servo
+  servo.topedge2:
+    interface: topedge2
+    subcomponent: servo
+  servo.topedge3:
+    interface: topedge3
+    subcomponent: servo
+parameters:
+  driveservo:
+    defaultValue: pivotservo
+    spec:
+      valueType: str
+  length:
+    defaultValue: 76
+    spec:
+      minValue: 65
+      units: mm
+      valueType: (float, int)
+  servo.angle:
+    defaultValue: 0
+    spec:
+      maxValue: null
+      minValue: null
+      units: degrees
+      valueType: (float, int)
+  width:
+    defaultValue: 60
+    spec:
+      minValue: 60
+      units: mm
+      valueType: (float, int)
+source: ../builders/PivotBuilder.py
+subcomponents:
+  belt0:
+    classname: Rectangle
+    kwargs: {}
+    parameters:
+      l:
+        function: (x[0]-getDim(x[1], 'motorwidth'))/2
+        parameter: &id001
+        - width
+        - driveservo
+      w:
+        function: getDim(x, "motorheight")
+        parameter: driveservo
+  belt1:
+    classname: Rectangle
+    kwargs: {}
+    parameters:
+      l:
+        function: (x[0]-getDim(x[1], 'motorwidth'))/2
+        parameter: *id001
+      w:
+        function: getDim(x, "motorheight")
+        parameter: driveservo
+  belt2:
+    classname: Rectangle
+    kwargs: {}
+    parameters:
+      l:
+        function: (x[0]-getDim(x[1], 'motorwidth'))/2
+        parameter: *id001
+      w:
+        function: getDim(x, "motorheight")
+        parameter: driveservo
+  belt3:
+    classname: Rectangle
+    kwargs: {}
+    parameters:
+      l:
+        function: getDim(x, "motorlength") + 2 * getDim(x, "shoulderlength")
+        parameter: driveservo
+      w:
+        function: getDim(x, "motorheight")
+        parameter: driveservo
+  belt4:
+    classname: Rectangle
+    kwargs: {}
+    parameters:
+      l:
+        function: getDim(x, "motorlength") + 2 * getDim(x, "shoulderlength")
+        parameter: driveservo
+      w:
+        function: getDim(x, "motorheight")
+        parameter: driveservo
+  belt5:
+    classname: Rectangle
+    kwargs: {}
+    parameters:
+      l:
+        parameter: length
+      w:
+        function: getDim(x, "motorheight")
+        parameter: driveservo
+  belt6:
+    classname: Rectangle
+    kwargs: {}
+    parameters:
+      l:
+        parameter: length
+      w:
+        function: getDim(x, "motorheight")
+        parameter: driveservo
+  pivotface:
+    classname: Trapezoid
+    kwargs: {}
+    parameters:
+      bangle:
+        function: float(np.atan(getDim(x[1], 'motorlength')/(x[0]*.15))* 180 * 0.318309)
+        parameter: *id001
+      depth:
+        function: getDim(x, 'motorlength')
+        parameter: driveservo
+      width:
+        function: x-(2*x*.15)
+        parameter: width
+  servo:
+    classname: MountedServo
+    kwargs: {}
+    parameters:
+      angle:
+        parameter: servo.angle
+      center: false
+      length:
+        function: getDim(x, "motorlength") + 2 * getDim(x, "shoulderlength")
+        parameter: driveservo
+      servo:
+        parameter: driveservo
diff --git a/rocolib/library/Right45Triangle.py b/rocolib/library/Right45Triangle.py
new file mode 100644
index 0000000000000000000000000000000000000000..845cc0194463506c450d7a55453ef3584d0b8b79
--- /dev/null
+++ b/rocolib/library/Right45Triangle.py
@@ -0,0 +1,28 @@
+from rocolib.api.components import FoldedComponent
+from rocolib.api.composables.graph.Face import Face
+
+class Right45Triangle(FoldedComponent):
+
+    def define(self):
+        self.addParameter("height", 3, paramType="length")
+        self.addParameter("base", 4, paramType="length")
+        self.addParameter("hypotenuse", 5, paramType="length")
+        self.addParameter("angle", 45, paramType="angle", minValue=45, maxValue=45)
+
+        self.addEdgeInterface("hedge", "r0.e0", "height")
+        self.addEdgeInterface("bedge", "r0.e1", "base")
+        self.addEdgeInterface("hypoedge", "r0.e2", "hypotenuse")
+
+    def assemble(self):
+        h = self.getParameter("height")
+        b = self.getParameter("base")
+        x = h**2 + b**2
+
+        rs = []
+        rs.append(Face("", ((b, 0), (0,0), (0, -h))))
+        self.attachEdge(None, rs[0], "e0", prefix="r0", angle=90)
+
+
+if __name__ == "__main__":
+    Right45Triangle.test()
+