Index: libcfa/src/vec/vec4.hfa
===================================================================
--- libcfa/src/vec/vec4.hfa	(revision 0b3cdad3da374b57a643b2ca50a43471415968ce)
+++ libcfa/src/vec/vec4.hfa	(revision 94df8deefcefe5bac7ef400a07492b532b8c8ade)
@@ -42,6 +42,5 @@
     // Primitive mathematical operations
 
-    // Subtraction
-
+    // -
     forall(| subtract(T)) {
     vec4(T) ?-?(vec4(T) u, vec4(T) v) { // TODO( can't make this const ref )
@@ -60,7 +59,22 @@
     }
 
-    // Addition
+    forall(| { T --?(T&); }) {
+    vec4(T)& --?(vec4(T)& v) {
+        --v.x;
+        --v.y;
+        --v.z;
+        --v.w;
+        return v;
+    }
+    vec4(T) ?--(vec4(T)& v) {
+        vec4(T) copy = v;
+        --v;
+        return copy;
+    }
+    }
+
+    // +
     forall(| add(T)) {
-    vec4(T) ?+?(vec4(T) u, vec4(T) v) { // TODO( can't make this const ref )
+    vec4(T) ?+?(vec4(T) u, vec4(T) v) {
         return [u.x + v.x, u.y + v.y, u.z + v.z, u.w + v.w];
     }
@@ -71,5 +85,20 @@
     }
 
-    // Scalar Multiplication
+    forall(| { T ++?(T&); }) {
+    vec4(T)& ++?(vec4(T)& v) {
+        ++v.x;
+        ++v.y;
+        ++v.z;
+        ++v.w;
+        return v;
+    }
+    vec4(T) ?++(vec4(T)& v) {
+        vec4(T) copy = v;
+        ++v;
+        return copy;
+    }
+    }
+
+    // *
     forall(| multiply(T)) {
     vec4(T) ?*?(vec4(T) v, T scalar) with (v) { // TODO (can't make this const ref)
@@ -79,7 +108,14 @@
         return v * scalar;
     }
+    vec4(T) ?*?(vec4(T) u, vec4(T) v) {
+        return [u.x * v.x, u.y * v.y, u.z * v.z, u.w * v.w];
+    }
     vec4(T)& ?*=?(vec4(T)& v, T scalar) {
         v = v * scalar;
         return v;
+    }
+    vec4(T)& ?*=?(vec4(T)& u, vec4(T) v) {
+        u = u * v;
+        return u;
     }
     }
@@ -90,8 +126,129 @@
         return [x / scalar, y / scalar, z / scalar, w / scalar];
     }
+    vec4(T) ?/?(vec4(T) u, vec4(T) v) {
+        return [u.x / v.x, u.y / v.y, u.z / v.z, u.w / v.w];
+    }
     vec4(T)& ?/=?(vec4(T)& v, T scalar) with (v) {
         v = v / scalar;
         return v;
     }
+    vec4(T)& ?/=?(vec4(T)& u, vec4(T) v) {
+        u = u / v;
+        return u;
+    }
+    }
+
+    // %
+    forall(| { T ?%?(T,T); }) {
+    vec4(T) ?%?(vec4(T) v, T scalar) with (v) {
+        return [x % scalar, y % scalar, z % scalar, w % scalar];
+    }
+    vec4(T)& ?%=?(vec4(T)& u, T scalar) {
+        u = u % scalar;
+        return u;
+    }
+    vec4(T) ?%?(vec4(T) u, vec4(T) v) {
+        return [u.x % v.x, u.y % v.y, u.z % v.z, u.w % v.w];
+    }
+    vec4(T)& ?%=?(vec4(T)& u, vec4(T) v) {
+        u = u % v;
+        return u;
+    }
+    }
+
+    // &
+    forall(| { T ?&?(T,T); }) {
+    vec4(T) ?&?(vec4(T) v, T scalar) with (v) {
+        return [x & scalar, y & scalar, z & scalar, w & scalar];
+    }
+    vec4(T)& ?&=?(vec4(T)& u, T scalar) {
+        u = u & scalar;
+        return u;
+    }
+    vec4(T) ?&?(vec4(T) u, vec4(T) v) {
+        return [u.x & v.x, u.y & v.y, u.z & v.z, u.w & v.w];
+    }
+    vec4(T)& ?&=?(vec4(T)& u, vec4(T) v) {
+        u = u & v;
+        return u;
+    }
+    }
+
+    // |
+    forall(| { T ?|?(T,T); }) {
+    vec4(T) ?|?(vec4(T) v, T scalar) with (v) {
+        return [x | scalar, y | scalar, z | scalar, w | scalar];
+    }
+    vec4(T)& ?|=?(vec4(T)& u, T scalar) {
+        u = u | scalar;
+        return u;
+    }
+    vec4(T) ?|?(vec4(T) u, vec4(T) v) {
+        return [u.x | v.x, u.y | v.y, u.z | v.z, u.w | v.w];
+    }
+    vec4(T)& ?|=?(vec4(T)& u, vec4(T) v) {
+        u = u | v;
+        return u;
+    }
+    }
+
+    // ^
+    forall(| { T ?^?(T,T); }) {
+    vec4(T) ?^?(vec4(T) v, T scalar) with (v) {
+        return [x ^ scalar, y ^ scalar, z ^ scalar, w ^ scalar];
+    }
+    vec4(T)& ?^=?(vec4(T)& u, T scalar) {
+        u = u ^ scalar;
+        return u;
+    }
+    vec4(T) ?^?(vec4(T) u, vec4(T) v) {
+        return [u.x ^ v.x, u.y ^ v.y, u.z ^ v.z, u.w ^ v.w];
+    }
+    vec4(T)& ?^=?(vec4(T)& u, vec4(T) v) {
+        u = u ^ v;
+        return u;
+    }
+    }
+
+    // <<
+    forall(| { T ?<<?(T,T); }) {
+    vec4(T) ?<<?(vec4(T) v, T scalar) with (v) {
+        return [x << scalar, y << scalar, z << scalar, w << scalar];
+    }
+    vec4(T)& ?<<=?(vec4(T)& u, T scalar) {
+        u = u << scalar;
+        return u;
+    }
+    vec4(T) ?<<?(vec4(T) u, vec4(T) v) {
+        return [u.x << v.x, u.y << v.y, u.z << v.z, u.w << v.w];
+    }
+    vec4(T)& ?<<=?(vec4(T)& u, vec4(T) v) {
+        u = u << v;
+        return u;
+    }
+    }
+
+    // >>
+    forall(| { T ?>>?(T,T); }) {
+    vec4(T) ?>>?(vec4(T) v, T scalar) with (v) {
+        return [x >> scalar, y >> scalar, z >> scalar, w >> scalar];
+    }
+    vec4(T)& ?>>=?(vec4(T)& u, T scalar) {
+        u = u >> scalar;
+        return u;
+    }
+    vec4(T) ?>>?(vec4(T) u, vec4(T) v) {
+        return [u.x >> v.x, u.y >> v.y, u.z >> v.z, u.w >> v.w];
+    }
+    vec4(T)& ?>>=?(vec4(T)& u, vec4(T) v) {
+        u = u >> v;
+        return u;
+    }
+    }
+
+    // ~
+    forall(| { T ~?(T); })
+    vec4(T) ~?(vec4(T) v) with (v) {
+        return [~x, ~y, ~z, ~w];
     }
 
Index: tests/vector/.expect/vec4_int.txt
===================================================================
--- tests/vector/.expect/vec4_int.txt	(revision 94df8deefcefe5bac7ef400a07492b532b8c8ade)
+++ tests/vector/.expect/vec4_int.txt	(revision 94df8deefcefe5bac7ef400a07492b532b8c8ade)
@@ -0,0 +1,37 @@
+ctor(x,y):<1,2,3,4>
+copy ctor:<1,2,3,4>
+?/?(vec)<5,-1,1,5>
+?/=?(vec)<5,-1,1,5>
+++?<2,-2,101,2>
+--?<0,-4,99,2>
+?++(part 1)<1,-3,100,1>
+?++(part 2)<2,-2,101,2>
+?--(part 1)<1,-3,100,3>
+?--(part 2)<0,-4,99,2>
+?%?(int)<0,1,0,1>
+?%=?(int)<0,1,0,1>
+?%?(vec)<-2,3,9,4>
+?%=?(vec)<-2,3,9,4>
+?&?(int)<0,0,8,8>
+?&=?(int)<0,0,8,8>
+?&?(vec)<1,6,1,5>
+?&=?(vec)<1,6,1,5>
+?|?(int)<7,3,7,10>
+?|=?(int)<7,3,7,10>
+?|?(vec)<7,1,7,10>
+?|=?(vec)<7,1,7,10>
+?^?(int)<12,0,13,8>
+?^=?(int)<12,0,13,8>
+?^?(vec)<12,5,9,10>
+?^=?(vec)<12,5,9,10>
+?<<?(int)<4,2,8,12>
+?<<=?(int)<4,2,8,12>
+?<<?(vec)<32,4,2,8>
+?<<=?(vec)<32,4,2,8>
+?>>?(int)<1,0,2,3>
+?>>=?(int)<1,0,2,3>
+?>>?(vec)<2,1,2,4>
+?>>=?(vec)<2,1,2,4>
+~?<-6,-3,-2,0>
+dot:-11
+length_squared:54
Index: tests/vector/vec4_int.cfa
===================================================================
--- tests/vector/vec4_int.cfa	(revision 94df8deefcefe5bac7ef400a07492b532b8c8ade)
+++ tests/vector/vec4_int.cfa	(revision 94df8deefcefe5bac7ef400a07492b532b8c8ade)
@@ -0,0 +1,130 @@
+#include "../../libcfa/src/vec/vec4.hfa"
+#include <fstream.hfa>
+#include <limits.hfa>
+
+int main(void) {
+    vec4(int) v1 = {1,2,3,4};
+    sout | "ctor(x,y):" | v1;
+
+    vec4(int) v2 = v1;
+    sout | "copy ctor:" | v2;
+
+    {
+        vec4(int) u = {11, -5, 7, 11};
+        vec4(int) v = {2, 3, 7, 2};
+        sout | "?/?(vec)" | (u / v);
+        sout | "?/=?(vec)" | (u /= v);
+    }
+
+    {
+        vec4(int) u = {1, -3, 100, 1};
+        sout | "++?" | ++u;
+    }
+
+    {
+        vec4(int) u = {1, -3, 100, 3};
+        sout | "--?" | --u;
+    }
+    {
+        vec4(int) u = {1, -3, 100, 1};
+        sout | "?++(part 1)" | u++;
+        sout | "?++(part 2)" | u;
+    }
+    {
+        vec4(int) u = {1, -3, 100, 3};
+        sout | "?--(part 1)" | u--;
+        sout | "?--(part 2)" | u;
+    }
+
+    // %
+    {
+        vec4(int) u = {-12, 123, 100, 5};
+        sout | "?%?(int)" | (u % 2);
+        sout | "?%=?(int)" | (u %= 2);
+    }
+    {
+        vec4(int) u = {-12, 27, 100, 14};
+        vec4(int) v = {5, 4, 13, 5};
+        sout | "?%?(vec)" | (u % v);
+        sout | "?%=?(vec)" | (u %= v);
+    }
+
+
+    // &
+    {
+        vec4(int) u = {5, 1, 8, 15};
+        sout | "?&?(int)" | (u & (1 << 3));
+        sout | "?&=?(int)" | (u &= (1 << 3));
+    }
+    {
+        vec4(int) u = {5, 6, 5, 13};
+        vec4(int) v = {3, 7, 3, 7};
+        sout | "?&?(vec)" | (u & v);
+        sout | "?&=?(vec)" | (u &= v);
+    }
+
+    // |
+    {
+        vec4(int) u = {5, 1, 5, 8};
+        sout | "?|?(int)" | (u | 2);
+        sout | "?|=?(int)" | (u |= 2);
+    }
+    {
+        vec4(int) u = {5, 1, 5, 2};
+        vec4(int) v = {2, 1, 2, 8};
+        sout | "?|?(vec)" | (u | v);
+        sout | "?|=?(vec)" | (u |= v);
+    }
+
+    // ^
+    {
+        vec4(int) u = {9, 5, 8, 13};
+        sout | "?^?(int)" | (u ^ 5);
+        sout | "?^=?(int)" | (u ^= 5);
+    }
+    {
+        vec4(int) u = {9, 5, 8, 13};
+        vec4(int) v = {5, 0, 1, 7};
+        sout | "?^?(vec)" | (u ^ v);
+        sout | "?^=?(vec)" | (u ^= v);
+    }
+
+    // <<
+    {
+        vec4(int) u = {2, 1, 4, 6};
+        sout | "?<<?(int)" | (u << 1);
+        sout | "?<<=?(int)" | (u <<= 1);
+    }
+    {
+        vec4(int) u = {1, 1, 1, 4};
+        vec4(int) v = {5, 2, 1, 1};
+        sout | "?<<?(vec)" | (u << v);
+        sout | "?<<=?(vec)" | (u <<= v);
+    }
+
+    // >>
+    {
+        vec4(int) u = {2, 1, 4, 6};
+        sout | "?>>?(int)" | (u >> 1);
+        sout | "?>>=?(int)" | (u >>= 1);
+    }
+    {
+        vec4(int) u = {5, 7, 8, 32};
+        vec4(int) v = {1, 2, 2, 3};
+        sout | "?>>?(vec)" | (u >> v);
+        sout | "?>>=?(vec)" | (u >>= v);
+    }
+
+    // ~
+    {
+        vec4(int) u = {5, 2, 1, -1};
+        sout | "~?" | (~u);
+    }
+
+    v1 = (vec4(int)){2, 3, 4, 5};
+    v2 = (vec4(int)){13, 2, -7, -3};
+    sout | "dot:" | dot(v1, v2);
+
+    v1 = (vec4(int)){2,3,4,5};
+    sout | "length_squared:" | length_squared(v1);
+}
