diff --git a/src/lol/math/arraynd.h b/src/lol/math/arraynd.h
new file mode 100644
index 00000000..eb153fce
--- /dev/null
+++ b/src/lol/math/arraynd.h
@@ -0,0 +1,93 @@
+//
+// Lol Engine
+//
+// Copyright: (c) 2010-2014 Sam Hocevar <sam@hocevar.net>
+//            (c) 2013-2014 Benjamin "Touky" Huet <huet.benjamin@gmail.com>
+//   This program is free software; you can redistribute it and/or
+//   modify it under the terms of the Do What The Fuck You Want To
+//   Public License, Version 2, as published by Sam Hocevar. See
+//   http://www.wtfpl.net/ for more details.
+//
+
+//
+// The arrayNd class
+// -----------------
+// A N-Dimensional array class allowing var[i][j][k]... indexing,
+//
+
+//
+// FIXME: This file is in lol/math/ instead of lol/base/ because it
+// uses ivec3.
+//
+
+#if !defined __LOL_MATH_ARRAYND_H__
+#define __LOL_MATH_ARRAYND_H__
+
+#include <lol/base/array.h>
+#include <lol/base/assert.h>
+
+namespace lol
+{
+
+template<size_t N, typename T1, typename T2 = void, typename T3 = void,
+         typename T4 = void, typename T5 = void, typename T6 = void,
+         typename T7 = void, typename T8 = void>
+class arraynd : protected array<T1, T2, T3, T4, T5, T6, T7, T8>
+{
+public:
+    typedef array<T1, T2, T3, T4, T5, T6, T7, T8> super;
+    typedef typename super::element_t element_t;
+
+    inline arraynd() :
+        m_sizes()
+    {
+    }
+
+    inline arraynd(vec_t<size_t, N> sizes, element_t e = element_t()) :
+        m_sizes(sizes)
+    {
+        SetSize(m_sizes, e);
+    }
+
+    /* Access elements directly using an ivec3 index */
+    inline element_t const &operator [](ivec3 pos) const
+    {
+        return element_t(); // TODO
+    }
+
+    inline size_t ComputeTotalSize(vec_t<size_t, N> sizes)
+    {
+        size_t total_size = 1;
+
+        for (auto size : sizes)
+            total_size *= size;
+
+        return total_size;
+    }
+
+    /* Resize the array.
+     * FIXME: data gets scrambled; should we care? */
+    inline void SetSize(vec_t<size_t, N> sizes, element_t e = element_t())
+    {
+        this->Resize(ComputeTotalSize(sizes), e);
+    }
+
+    inline vec_t<size_t, N> GetSize() const
+    {
+        return ComputeTotalSize(this->m_sizes);
+    }
+
+public:
+    inline element_t *Data() { return super::Data(); }
+    inline element_t const *Data() const { return super::Data(); }
+    inline int Count() const { return super::Count(); }
+    inline int Bytes() const { return super::Bytes(); }
+
+private:
+    vec_t<size_t, N> m_sizes;
+};
+
+} /* namespace lol */
+
+#endif // __LOL_MATH_ARRAYND_H__
+