diff --git a/libs/middlewares/dimensions.js b/libs/middlewares/dimensions.js
new file mode 100644
index 0000000000000000000000000000000000000000..c17e4a6d2e00c1e5dc47455f4959cf9f33a0ad09
--- /dev/null
+++ b/libs/middlewares/dimensions.js
@@ -0,0 +1,48 @@
+/**
+* Dimensions middleware
+*
+* EXAMPLE:
+* Use it with no parameters to get all the dimensions specified
+* app.get('/', dimensions(), function(req, res, next){})
+*
+* Use it with an array of accepted values
+* app.get('/', dimensions(['year', 'location']), function(req, res, next){})
+*
+* Use it globally
+* app.use(dimensions())
+*/
+
+function intersect(a, b) {
+    var t
+    if (b.length > a.length) t = b, b = a, a = t
+    return a.filter(function (e) {
+        if (b.indexOf(e) !== -1) return true
+    })
+}
+
+function dimensions(dims) {
+    return function(req, res, next) {
+        req.dims = {}
+        if(req.query.dims) {
+            var params = req.query.dims.split(",")
+            var dimObj = {}
+            for(var i=0; i<params.length; ++i) {
+                var kv = params[i].split(":")
+                dimObj[kv[0]] = (typeof kv[1] === 'undefined') ? null : kv[1]
+            }
+            // If the dims array exists and is not empty
+            if(typeof dims !== 'undefined' && dims.length > 0) {
+                var intersection = intersect(dims, Object.keys(dimObj))
+                for(var i=0; i<intersection.length; ++i) {
+                    req.dims[intersection[i]] = dimObj[intersection[i]]
+                }
+            } else {
+                req.dims = dimObj
+            }
+        }
+        console.log(req.dims)
+        next()
+    }
+}
+
+module.exports = dimensions