diff --git a/Source/OpenTK/Math/Vector2.cs b/Source/OpenTK/Math/Vector2.cs
new file mode 100644
index 00000000..8cdf6c64
--- /dev/null
+++ b/Source/OpenTK/Math/Vector2.cs
@@ -0,0 +1,161 @@
+#region --- License ---
+/* Copyright (c) 2006, 2007 Stefanos Apostolopoulos
+ * See license.txt for license info
+ */
+#endregion
+
+using System;
+using System.Collections.Generic;
+using System.Text;
+using System.Runtime.InteropServices;
+
+namespace OpenTK.Math
+{
+ ///
+ /// Represents a 2D vector.
+ ///
+ [StructLayout(LayoutKind.Sequential)]
+ public struct Vector2
+ {
+ ///
+ /// The X coordinate of the Vector2.
+ ///
+ public float X;
+
+ ///
+ /// The Y coordinate of the Vector2.
+ ///
+ public float Y;
+
+ ///
+ /// Constructs a new Vector2.
+ ///
+ /// The x coordinate of the net Vector2.
+ /// The y coordinate of the net Vector2.
+ public Vector2(float x, float y)
+ {
+ X = x;
+ Y = y;
+ }
+
+ ///
+ /// Adds the given Vector2 to the current Vector2.
+ ///
+ /// The right operand of the addition.
+ /// A new Vector2 containing the result of the addition.
+ public Vector2 Add(Vector2 right)
+ {
+ return new Vector2(X + right.X, Y + right.Y);
+ }
+
+ ///
+ /// Adds the given Vector3 to the current Vector2.
+ ///
+ /// The right operand of the addition.
+ /// A new Vector3 containing the result of the addition.
+ public Vector3 Add(Vector3 right)
+ {
+ return new Vector3(X + right.X, Y + right.Y, right.Z);
+ }
+
+ ///
+ /// Adds the given Vector4 to the current Vector2.
+ ///
+ /// The right operand of the addition.
+ /// A new Vector4 containing the result of the addition.
+ public Vector4 Add(Vector4 right)
+ {
+ return new Vector4(X + right.X, Y + right.Y, right.Z, right.W);
+ }
+
+ ///
+ /// Subtracts the given Vector2 from the current Vector2.
+ ///
+ /// The right operand of the subtraction.
+ /// A new Vector2 containing the result of the subtraction.
+ public Vector2 Sub(Vector2 right)
+ {
+ return new Vector2(X - right.X, Y - right.Y);
+ }
+
+ ///
+ /// Subtracts the given Vector3 from the current Vector2.
+ ///
+ /// The right operand of the subtraction.
+ /// A new Vector3 containing the result of the subtraction.
+ public Vector3 Sub(Vector3 right)
+ {
+ return new Vector3(X - right.X, Y - right.Y, -right.Z);
+ }
+
+ ///
+ /// Subtracts the given Vector4 from the current Vector2.
+ ///
+ /// The right operand of the subtraction.
+ /// A new Vector4 containing the result of the subtraction.
+ public Vector4 Sub(Vector4 right)
+ {
+ return new Vector4(X - right.X, Y - right.Y, -right.Z, -right.W);
+ }
+
+ ///
+ /// Computes the dot product between the curren Vector2 and the given Vector2.
+ ///
+ /// The right operand of the dot product.
+ /// A float containing the result of the dot product.
+ public float Dot(Vector2 right)
+ {
+ return X * right.X + Y * right.Y;
+ }
+
+ ///
+ /// Computes the dot product between the curren Vector2 and the given Vector3.
+ ///
+ /// The right operand of the dot product.
+ /// A float containing the result of the dot product.
+ public float Dot(Vector3 right)
+ {
+ return X * right.X + Y * right.Y;
+ }
+
+ ///
+ /// Computes the dot product between the curren Vector2 and the given Vector4.
+ ///
+ /// The right operand of the dot product.
+ /// A float containing the result of the dot product.
+ public float Dot(Vector4 right)
+ {
+ return X * right.X + Y * right.Y;
+ }
+
+ public static Vector2 operator +(Vector2 left, Vector2 right)
+ {
+ return left.Add(right);
+ }
+
+ public static Vector3 operator +(Vector2 left, Vector3 right)
+ {
+ return left.Add(right);
+ }
+
+ public static Vector4 operator +(Vector2 left, Vector4 right)
+ {
+ return left.Add(right);
+ }
+
+ public static Vector2 operator -(Vector2 left, Vector2 right)
+ {
+ return left.Sub(right);
+ }
+
+ public static Vector3 operator -(Vector2 left, Vector3 right)
+ {
+ return left.Sub(right);
+ }
+
+ public static Vector4 operator -(Vector2 left, Vector4 right)
+ {
+ return left.Sub(right);
+ }
+ }
+}
diff --git a/Source/OpenTK/Math/Vector3.cs b/Source/OpenTK/Math/Vector3.cs
new file mode 100644
index 00000000..8483993f
--- /dev/null
+++ b/Source/OpenTK/Math/Vector3.cs
@@ -0,0 +1,26 @@
+#region --- License ---
+/* Copyright (c) 2006, 2007 Stefanos Apostolopoulos
+ * See license.txt for license info
+ */
+#endregion
+
+using System;
+using System.Collections.Generic;
+using System.Text;
+using System.Runtime.InteropServices;
+
+namespace OpenTK.Math
+{
+ [StructLayout(LayoutKind.Sequential)]
+ public struct Vector3
+ {
+ public float X, Y, Z;
+
+ public Vector3(float x, float y, float z)
+ {
+ X = x;
+ Y = y;
+ Z = z;
+ }
+ }
+}
diff --git a/Source/OpenTK/Math/Vector4.cs b/Source/OpenTK/Math/Vector4.cs
new file mode 100644
index 00000000..1ceb7b72
--- /dev/null
+++ b/Source/OpenTK/Math/Vector4.cs
@@ -0,0 +1,27 @@
+#region --- License ---
+/* Copyright (c) 2006, 2007 Stefanos Apostolopoulos
+ * See license.txt for license info
+ */
+#endregion
+
+using System;
+using System.Collections.Generic;
+using System.Text;
+using System.Runtime.InteropServices;
+
+namespace OpenTK.Math
+{
+ [StructLayout(LayoutKind.Sequential)]
+ public struct Vector4
+ {
+ public float X, Y, Z, W;
+
+ public Vector4(float x, float y, float z, float w)
+ {
+ X = x;
+ Y = y;
+ Z = z;
+ W = w;
+ }
+ }
+}