diff --git a/Makefile.am b/Makefile.am
index e5dcf262..a430e5e4 100644
--- a/Makefile.am
+++ b/Makefile.am
@@ -9,6 +9,8 @@ AM_CXXFLAGS = $(BOOST_CPPFLAGS) $(ZLIB_CFLAGS)
## Source definitions
UTIL_FILES = \
+ aabb.cpp \
+ aabb.hpp \
backtrace.hpp \
bezier.cpp \
bezier.hpp \
diff --git a/aabb.cpp b/aabb.cpp
new file mode 100644
index 00000000..b54a496b
--- /dev/null
+++ b/aabb.cpp
@@ -0,0 +1,105 @@
+/*
+ * This file is part of libgim.
+ *
+ * libgim is free software: you can redistribute it and/or modify it under the
+ * terms of the GNU General Public License as published by the Free Software
+ * Foundation, either version 3 of the License, or (at your option) any later
+ * version.
+ *
+ * libgim is distributed in the hope that it will be useful, but WITHOUT ANY
+ * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
+ * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more
+ * details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with libgim. If not, see .
+ *
+ * Copyright 2015 Danny Robson
+ */
+
+
+#include "aabb.hpp"
+#include "debug.hpp"
+
+using util::AABB;
+
+//-----------------------------------------------------------------------------
+template
+AABB::AABB (point _p0, point _p1):
+ p0 (_p0),
+ p1 (_p1)
+{
+ debug::sanity (*this);
+}
+
+
+//-----------------------------------------------------------------------------
+template
+util::extent
+AABB::magnitude (void) const
+{
+ extent out;
+ for (size_t i = 0; i < S; ++i)
+ out[i] = p1[i] - p0[i];
+ return out;
+}
+
+
+//-----------------------------------------------------------------------------
+template
+AABB
+AABB::operator+ (vector v) const
+{
+ return { p0 + v, p1 + v };
+}
+
+
+//-----------------------------------------------------------------------------
+template
+AABB
+AABB::operator- (vector v) const
+{
+ return { p0 - v, p1 - v };
+}
+
+
+//-----------------------------------------------------------------------------
+namespace debug {
+ template
+ struct validator {
+ static bool is_valid (const AABB &b)
+ {
+ for (size_t i = 0; i < S; ++i)
+ if (b.p1[i] < b.p0[i])
+ return false;
+
+ return true;
+ }
+ };
+}
+
+
+//-----------------------------------------------------------------------------
+template
+std::ostream&
+util::operator<< (std::ostream &os, AABB b)
+{
+ os << "AABB(" << b.p0 << ", " << b.p1 << ")";
+ return os;
+}
+
+
+//-----------------------------------------------------------------------------
+#define INSTANTIATE_S_T(S,T) \
+template struct AABB; \
+template bool debug::valid (const AABB&); \
+template std::ostream& util::operator<< (std::ostream&, AABB);
+
+#define INSTANTIATE(T) \
+INSTANTIATE_S_T(2,T) \
+INSTANTIATE_S_T(3,T)
+
+INSTANTIATE(uint32_t)
+INSTANTIATE(uint64_t)
+INSTANTIATE(float)
+INSTANTIATE(double)
diff --git a/aabb.hpp b/aabb.hpp
new file mode 100644
index 00000000..e952242e
--- /dev/null
+++ b/aabb.hpp
@@ -0,0 +1,51 @@
+/*
+ * This file is part of libgim.
+ *
+ * libgim is free software: you can redistribute it and/or modify it under the
+ * terms of the GNU General Public License as published by the Free Software
+ * Foundation, either version 3 of the License, or (at your option) any later
+ * version.
+ *
+ * libgim is distributed in the hope that it will be useful, but WITHOUT ANY
+ * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
+ * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more
+ * details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with libgim. If not, see .
+ *
+ * Copyright 2015 Danny Robson
+ */
+
+
+#ifndef __UTIL_AABB_HPP
+#define __UTIL_AABB_HPP
+
+#include "point.hpp"
+#include "extent.hpp"
+
+#include
+
+namespace util {
+ template
+ struct AABB {
+ AABB () = default;
+ AABB (point, point);
+
+ extent magnitude (void) const;
+
+ AABB operator+ (vector) const;
+ AABB operator- (vector) const;
+
+ point p0;
+ point p1;
+ };
+
+ typedef AABB<2,float> AABB2f;
+ typedef AABB<3,float> AABB3f;
+
+ template
+ std::ostream& operator<< (std::ostream&, AABB);
+}
+
+#endif