diff --git a/src/com/massivecraft/mcore/Triple.java b/src/com/massivecraft/mcore/Triple.java
new file mode 100644
index 00000000..8d8d38ef
--- /dev/null
+++ b/src/com/massivecraft/mcore/Triple.java
@@ -0,0 +1,85 @@
+package com.massivecraft.mcore;
+
+import java.io.Serializable;
+
+import com.massivecraft.mcore.util.MUtil;
+
+public class Triple implements Cloneable, Serializable
+{
+ // -------------------------------------------- //
+ // CONSTANTS
+ // -------------------------------------------- //
+
+ private static final transient long serialVersionUID = 1L;
+
+ // -------------------------------------------- //
+ // FIELDS: RAW
+ // -------------------------------------------- //
+
+ private final A first;
+ public A getFirst() { return this.first; };
+
+ private final B second;
+ public B getSecond() { return this.second; };
+
+ private final C third;
+ public C getThird() { return this.third; };
+
+ // -------------------------------------------- //
+ // FIELDS: WITH
+ // -------------------------------------------- //
+
+ public Triple withFirst(A first) { return valueOf(first, second, third); }
+
+ public Triple withSecond(B second) { return valueOf(first, second, third); }
+
+ // -------------------------------------------- //
+ // CONSTRUCT
+ // -------------------------------------------- //
+
+ public Triple()
+ {
+ this(null, null, null);
+ }
+
+ public Triple(A first, B second, C third)
+ {
+ this.first = first;
+ this.second = second;
+ this.third = third;
+ }
+
+ // -------------------------------------------- //
+ // FACTORY: VALUE OF
+ // -------------------------------------------- //
+
+ public static Triple valueOf(A first, B second, C third)
+ {
+ return new Triple(first, second, third);
+ }
+
+ // -------------------------------------------- //
+ // EQUALS
+ // -------------------------------------------- //
+
+ @Override
+ public boolean equals(Object derpObject)
+ {
+ if (derpObject == null) return false;
+ if (!(derpObject instanceof Triple, ?, ?>)) return false;
+ Triple, ?, ?> derp = (Triple, ?, ?>)derpObject;
+ return MUtil.equals(this.getFirst(), derp.getFirst()) && MUtil.equals(this.getSecond(), derp.getSecond()) && MUtil.equals(this.getThird(), derp.getThird());
+ }
+
+ // -------------------------------------------- //
+ // CLONE
+ // -------------------------------------------- //
+
+ @Override
+ public Triple clone()
+ {
+ return this;
+ }
+
+
+}