diff --git a/src/matrix/2x2matrix.c b/src/matrix/2x2matrix.c
new file mode 100644
index 0000000000000000000000000000000000000000..084b80288cd7836a0b09d89f4b016a1840eee71a
--- /dev/null
+++ b/src/matrix/2x2matrix.c
@@ -0,0 +1,70 @@
+#include "2x2matrix.h"
+
+_2x2Matrix add_2x2(_2x2Matrix m1, _2x2Matrix m2){
+    _2x2Matrix ma = {
+        m1.a11 + m2.a11,m1.a12 + m2.a12,
+        m1.a21 + m2.a21,m1.a22 + m2.a22
+    };
+
+    return ma;
+}
+
+_2x2Matrix minus_2x2(_2x2Matrix m1, _2x2Matrix m2){
+    _2x2Matrix ma = {
+        m1.a11 - m2.a11,m1.a12 - m2.a12,
+        m1.a21 - m2.a21,m1.a22 - m2.a22
+    };
+
+    return ma;
+}
+
+_2x2Matrix multiply_2x2(_2x2Matrix m1, _2x2Matrix m2){
+    _2x2Matrix ma = {
+        (m1.a12 * m2.a21) + (m1.a11 * m2.a11),(m1.a11 * m2.a12) + (m1.a12 * m2.a22),
+        (m1.a22 * m2.a21) + (m1.a21 * m2.a11),(m1.a21 * m2.a12) + (m1.a22 * m2.a22)
+    };
+
+    return ma;
+}
+
+_2x2Matrix scale_2x2(_2x2Matrix m1, float scale) {
+    _2x2Matrix ma = {
+        m1.a11 * scale,m1.a12 * scale,
+        m1.a21 * scale,m1.a22 * scale
+    };
+
+    return ma;
+}
+
+float det_2x2(_2x2Matrix m){
+    return (m.a11 * m.a22) - (m.a12 * m.a21);
+}
+
+_2x2Matrix inverse_2x2(_2x2Matrix m){
+    float detM = det_2x2(m);
+    if(detM != 0){
+        _2x2Matrix specMat = {m.a22, -m.a12,
+                              -m.a21, m.a11};
+        return scale_2x2(specMat, 1.0/detM);
+    }
+    _2x2Matrix badM = {1.0f,1.0f,1.0f,1.0f};
+    return badM;
+}
+
+_2x1Matrix transpose_2x2(_2x2Matrix m1, _2x1Matrix m2){
+    _2x1Matrix ma = {
+        (m1.a12*m2.a21) + (m1.a11*m2.a11),
+        (m1.a22*m2.a21) + (m1.a21*m2.a11)
+    };
+
+    return ma;
+}
+
+unsigned char equals_2x2(_2x2Matrix m1, _2x2Matrix m2) {
+    if(m1.a11 == m2.a11
+        && m1.a12 == m2.a12
+        && m1.a21 == m2.a21
+        && m1.a22 == m2.a22)
+        return 42;
+    return 0;
+}