diff --git a/.jscompiler.json b/.jscompiler.json
new file mode 100644
index 0000000000000000000000000000000000000000..033db8684c8cc7be37fb1d64dd85a042ba436d22
--- /dev/null
+++ b/.jscompiler.json
@@ -0,0 +1,11 @@
+{
+	"outputs": [
+		{
+			"inputs": ["src/sideburns.cut.js", "src/tinyDOM-Sideburns.js"],
+			"output": "tinyDOM-Sideburns.min.js",
+			"generateMap": true,
+			"mangle": true,
+			"isolate": true
+		}
+	]
+}
diff --git a/src/sideburns.cut.js b/src/sideburns.cut.js
new file mode 100644
index 0000000000000000000000000000000000000000..02678604c8c645126287abf067eeddd365112cc6
--- /dev/null
+++ b/src/sideburns.cut.js
@@ -0,0 +1,316 @@
+
+var globalOptions = {
+        ignoreUndefined: false,
+        escape: "general",
+        escapeSets: {
+            xml: {
+                "<": "&lt;",
+                ">": "&gt;",
+                "&": "&amp;",
+                "\"": "&quot;"
+            },
+            general: {
+                "\"": "\\\"",
+                "\'": "\\\'"
+            }
+        }
+    },
+    deepMergeJson = function (obja, objb) {
+        var prop;
+        for (prop in objb) {
+            if (objb.hasOwnProperty(prop)) {
+                if (typeof (obja[prop]) === 'object' && typeof (objb[prop]) === 'object') {
+                    obja[prop] = deepMergeJson(obja[prop], objb[prop]);
+                } else {
+                    obja[prop] = objb[prop];
+                }
+            }
+        }
+        return obja;
+    },
+    setDeepProperty = function (ident, value, obj) {
+        var list,
+            recurse = function (propList, value, obj) {
+                if (propList.length > 1) {
+                    recurse(propList, value, obj[list.shift()]);
+                } else {
+                    obj[propList[0]] = value;
+                }
+            };
+
+        if (!ident.push && !ident.map) {
+            list = ident.split(".").map(function (e) {return e.trim(); });
+        } else {
+            list = ident;
+        }
+
+        recurse(list, value, obj);
+        return obj;
+    },
+    getDeepProperty = function (ident, obj) {
+        var ret = null,
+            list,
+            recurse = function (propList, obj) {
+                var curident;
+                if (propList.length > 1) {
+                    if (obj.hasOwnProperty(propList[0])) {
+                        recurse(propList, obj[list.shift()]);
+                    } else {
+                        curident = propList.reduce(function (a, b, i) {
+                            return a + (i > 0 ? "." : "") + b;
+                        });
+                        throw new Error("Invalid proprty, missing expected data \"" + curident + "\" (IDENT: " + ident + ") from data " + JSON.stringify(obj));
+                    }
+                } else {
+                    if (obj.hasOwnProperty(propList[0])) {
+                        ret = obj[propList[0]];
+                    } else {
+                        throw new Error("Invalid proprty, missing expected data \"" + propList[0] + "\" (IDENT: " + ident + ") from data " + JSON.stringify(obj));
+                    }
+                }
+            };
+
+        if (!ident.push && !ident.map) {
+            list = ident.split(".").map(function (e) {return e.trim(); });
+        } else {
+            list = ident;
+        }
+
+        recurse(list, obj);
+        return ret;
+    },
+    resolveNamespace = function (ident, blockStack) {
+        var l = blockStack.length, i, ret = "";
+        for (i = 0; i < l; i += 1) {
+            ret += blockStack[i] + ".";
+        }
+        return ret + ident;
+    },
+    safeDeepMergeJson = function (obja, objb) {
+        if (typeof (obja) !== 'object') {
+            throw new TypeError("Cannot deep merge with an " + typeof (obja) + ": [Param 1]");
+        }
+        if (typeof (objb) !== 'object') {
+            throw new TypeError("Cannot deep merge with an " + typeof (objb) + ": [Param 2]");
+        }
+
+        return deepMergeJson(deepMergeJson({}, obja), objb);
+    },
+    /**
+     * Using this Regex
+     * This regular expression will match and split all valid tags for Sideburns, and provides
+     * all data needed to appropriately lex each tag
+     *
+     * Result indexes (from re.exec()):
+     * [0] The whole tag that has been matched
+     * [1, 9] These are the opening and closing double square brackets, respectively. Always present
+     * [2] The Tag modifier. This will either be '/' for a closing tag, '#' for a pre-process directive
+     *     or undefined for all other tags. Processing should branch here depending on whether or not this
+     *     token is a hash ('#'). Indexes for one branch will be undefined in case of the other branch.
+     *
+     * == In case of Directive ==
+     * [3] The identifier of the directive to set. Always present
+     * [4] The value to set the directive. Always present
+     *
+     * == In case of other tag ==
+     * [5] The Block modifier. Will be '*' for arrays, '&' for context and undefined for simple tags
+     * [6] The Data modifier. Will be '!' for an escape with the global set, '!([7])' for an escape with a
+     *     specified set or undefined for unescaped data
+     * [7] If a set has been specified, this will be the name of the set on its own, seperate from the data
+     *     modifier. It will otherwise be undefined
+     * [8] The identifier for the data or block that the tag represents. Always present
+     **/
+    captureTags = /(\[\[)(\#|\/)?\s*(?:([a-zA-Z]+[a-zA-Z0-9]*)\s*\:\s*([a-zA-Z]+[a-zA-Z0-9]*)|([\*\&]?)\s*((?:\!(?:\(([a-zA-Z]+[a-zA-Z0-9]*)\))?)?)\s*([a-zA-Z](?:[a-zA-Z0-9]*(?:\.(?=[a-zA-Z]))?)+))\s*(\]\])/,
+    Stack = function () {
+        var self = this;
+        this.length = 0;
+        this.push = function (val) {
+            self[self.length] = val;
+            self.length += 1;
+        };
+        this.pop = function (val) {
+            var ret = null;
+            if (self.length > 0) {
+                ret = self[self.length - 1];
+                self[self.length - 1] = null;
+                self.length -= 1;
+            }
+            return ret;
+        };
+
+        this.peek = function () {
+            return this.length > 0 ? self[self.length - 1] : null;
+        };
+        this.contains = function (value, compare) {
+            compare = compare || function (a, b) {
+                return a === b;
+            };
+            var i = this.length;
+            while (i--) {
+                if (compare(this[i], value)) {
+                    return true;
+                }
+            }
+            return false;
+        };
+        return this;
+    },
+    Node = function (type, val, modifiers) {
+        this.ident = type || "N_NULL";
+        this.val = val || null;
+        this.content = modifiers || {};
+        return this;
+    },
+    Token = function (ident, val, info) {
+        this.ident = ident || "T_NULL";
+        this.val = val || null;
+        this.info = info || {};
+        return this;
+    },
+    tokenise = function (src) {
+        var tokens = [],
+            last = 0,
+            i = 0,
+            match = null,
+            matcher,
+            chunk,
+            tok;
+
+        matcher = function () {
+            return ((match = captureTags.exec(chunk)) !== null);
+        };
+        while (i < src.length) {
+            chunk = src.substr(i);
+            if (matcher()) {
+                if (match.index > 0) {
+                    tokens.push(new Token("STRING", match.input.substr(0, match.index)));
+                }
+                tok = new Token("T_NULL", null, {close: false, escape: false, escapeType: null});
+                if (match[2] === '#') {
+                    tok.ident = "T_DIRECTIVE";
+                    tok.val = {};
+                    tok.val[match[3]] = match[4];
+                } else {
+                    if (match[2] === '/') {
+                        tok.info.close = true;
+                    }
+
+                    if (match[5] === "*") {
+                        tok.ident = "T_LOOP";
+                    } else if (match[5] === "&") {
+                        tok.ident = "T_BLOCK";
+                    } else {
+                        tok.ident = "T_DATA";
+                    }
+
+                    if (typeof (match[6]) !== 'undefined' && match[6].charAt(0) === "!") {
+                        tok.info.escape = true;
+                        if (typeof (match[7]) !== 'undefined') {
+                            tok.info.escapeType = match[7];
+                        }
+                    }
+                    tok.val = match[8];
+                }
+                tokens.push(tok);
+                i += match.index + match[0].length;
+            } else {
+                tokens.push(new Token("STRING", chunk));
+                i += chunk.length;
+            }
+        }
+        tokens.push(new Token("EOD"));
+        return tokens;
+    },
+    collapseParse = function (tokens) {
+        var tokenList,
+            i = 0,
+            j,
+            targetToken,
+            targetNode;
+
+        while (i < tokens.length) {
+            if (tokens[i].info && tokens[i].info.close) {
+                tokenList = [];
+                targetToken = tokens[i];
+                j = i - 1;
+
+                while (!(tokens[j].ident === targetToken.ident && tokens[j].val === targetToken.val)) {
+                    tokenList.push(tokens[j]);
+                    j -= 1;
+                    if (j < 0) {
+                        throw new Error("Unmatched Closing Tag " + targetNode + " at index " + i);
+                    }
+                }
+
+                if (targetToken.ident === "T_LOOP") {
+                    targetNode = new Node("N_LOOP", targetToken.val, tokenList.slice().reverse());
+                } else {
+                    targetNode = new Node("N_BLOCK", targetToken.val, tokenList.slice().reverse());
+                }
+
+                tokens.splice(j, (i - j) + 1, targetNode);
+                i = 0;
+            } else {
+                i += 1;
+            }
+        }
+        return tokens;
+
+    },
+    unwindNode = function (output, node, index, arr) {
+        var innerArr, dataArr, content, i, dataVal;
+        switch (node.ident) {
+        case "STRING":
+            return output + node.val;
+
+        case "T_DATA":
+            dataVal = node.val;
+            if (arr.loopTag) {
+                if (node.val === arr.loopTag.slice(0, -1)) {
+                    dataVal = arr.loopTag + "." + (arr.i).toString();
+                }
+            }
+            return output + getDeepProperty(dataVal, arr.data);
+
+        case "N_LOOP":
+            content = "";
+
+            innerArr = node.content;
+            innerArr.data = arr.data;
+            innerArr.loopTag = node.val;
+
+            dataArr = getDeepProperty(node.val, arr.data);
+
+            for (i = 0; i < dataArr.length; i += 1) {
+                innerArr.i = i;
+                content += innerArr.reduce(unwindNode, "");
+            }
+
+            return output + content;
+
+        case "N_BLOCK":
+            innerArr = node.content;
+            innerArr.data = getDeepProperty(node.val, arr.data);
+            innerArr.loopTag = null;
+            return output + innerArr.reduce(unwindNode, "");
+
+        default:
+            return output;
+        }
+    },
+    render = function (src, data, options) {
+        var nodes = collapseParse(tokenise(src));
+        nodes.data = data;
+        nodes.loopTag = null;
+        nodes.i = null;
+        return nodes.reduce(unwindNode, "");
+    };
+
+render.partial = function (src) {
+    return function (tokens, data, options) {
+        tokens.data = data;
+        tokens.loopTag = null;
+        tokens.i = null;
+        return tokens.reduce(unwindNode, "");
+    }.bind(null, collapseParse(tokenise(src)));
+};
diff --git a/src/tinyDOM-Sideburns.js b/src/tinyDOM-Sideburns.js
new file mode 100644
index 0000000000000000000000000000000000000000..8c0c55d9e2248af3fd8e79db678ca47c7b16def5
--- /dev/null
+++ b/src/tinyDOM-Sideburns.js
@@ -0,0 +1,37 @@
+if (!window.mu) {
+    throw new Error("tinyDOM-Sideburns requires tinyDOM to be in use on the page");
+}
+
+mu.templates = {};
+
+mu.render = function (path, data, options) {
+    if (mu.templates.hasOwnProperty(path)) {
+        return mu.templates[path](data, options);
+    } else {
+        return render(path, data, options);
+    }
+};
+
+
+mu.fn.render = function (path, data, options) {
+    var rendered = mu.render(path, data, options),
+        opts = options || {useHtml: true};
+    if (typeof opts.useHtml === "undefined") {
+        opts.useHtml = true;
+    }
+
+    this.each(function (i, e) {
+        if (opts.useHtml) {
+            e.innerHTML = rendered;
+        } else {
+            e.textContent = rendered;
+        }
+    });
+};
+
+mu.ready(function () {
+    mu("[type='x-template/sideburns']").each(function (i, e) {
+        var name = e.getAttribute("data-name");
+        mu.templates[name] = render.partial(e.textContent);
+    });
+});
diff --git a/test/sb.js b/test/sb.js
deleted file mode 100644
index 7d9406c89bd70e0fb49e2e573e5cfe889fc2f068..0000000000000000000000000000000000000000
--- a/test/sb.js
+++ /dev/null
@@ -1,325 +0,0 @@
-/*jslint node: true */
-(function () {
-    'use strict';
-    var globalOptions = {
-            ignoreUndefined: false,
-            escape: "general",
-            escapeSets: {
-                xml: {
-                    "<": "&lt;",
-                    ">": "&gt;",
-                    "&": "&amp;",
-                    "\"": "&quot;"
-                },
-                general: {
-                    "\"": "\\\"",
-                    "\'": "\\\'"
-                }
-            }
-        },
-        deepMergeJson = function (obja, objb) {
-            var prop;
-            for (prop in objb) {
-                if (objb.hasOwnProperty(prop)) {
-                    if (typeof (obja[prop]) === 'object' && typeof (objb[prop]) === 'object') {
-                        obja[prop] = deepMergeJson(obja[prop], objb[prop]);
-                    } else {
-                        obja[prop] = objb[prop];
-                    }
-                }
-            }
-            return obja;
-        },
-        setDeepProperty = function (ident, value, obj) {
-            var list,
-                recurse = function (propList, value, obj) {
-                    if (propList.length > 1) {
-                        recurse(propList, value, obj[list.shift()]);
-                    } else {
-                        obj[propList[0]] = value;
-                    }
-                };
-
-            if (!ident.push && !ident.map) {
-                list = ident.split(".").map(function (e) {return e.trim(); });
-            } else {
-                list = ident;
-            }
-
-            recurse(list, value, obj);
-            return obj;
-        },
-        getDeepProperty = function (ident, obj) {
-            var ret = null,
-                list,
-                recurse = function (propList, obj) {
-                    var curident;
-                    if (propList.length > 1) {
-                        if (obj.hasOwnProperty(propList[0])) {
-                            recurse(propList, obj[list.shift()]);
-                        } else {
-                            curident = propList.reduce(function (a, b, i) {
-                                return a + (i > 0 ? "." : "") + b;
-                            });
-                            throw new Error("Invalid proprty, missing expected data \"" + curident + "\" (IDENT: " + ident + ") from data " + JSON.stringify(obj));
-                        }
-                    } else {
-                        if (obj.hasOwnProperty(propList[0])) {
-                            ret = obj[propList[0]];
-                        } else {
-                            throw new Error("Invalid proprty, missing expected data \"" + propList[0] + "\" (IDENT: " + ident + ") from data " + JSON.stringify(obj));
-                        }
-                    }
-                };
-
-            if (!ident.push && !ident.map) {
-                list = ident.split(".").map(function (e) {return e.trim(); });
-            } else {
-                list = ident;
-            }
-
-            recurse(list, obj);
-            return ret;
-        },
-        resolveNamespace = function (ident, blockStack) {
-            var l = blockStack.length, i, ret = "";
-            for (i = 0; i < l; i += 1) {
-                ret += blockStack[i] + ".";
-            }
-            return ret + ident;
-        },
-        safeDeepMergeJson = function (obja, objb) {
-            if (typeof (obja) !== 'object') {
-                throw new TypeError("Cannot deep merge with an " + typeof (obja) + ": [Param 1]");
-            }
-            if (typeof (objb) !== 'object') {
-                throw new TypeError("Cannot deep merge with an " + typeof (objb) + ": [Param 2]");
-            }
-
-            return deepMergeJson(deepMergeJson({}, obja), objb);
-        },
-        /**
-         * Using this Regex
-         * This regular expression will match and split all valid tags for Sideburns, and provides
-         * all data needed to appropriately lex each tag
-         *
-         * Result indexes (from re.exec()):
-         * [0] The whole tag that has been matched
-         * [1, 9] These are the opening and closing double square brackets, respectively. Always present
-         * [2] The Tag modifier. This will either be '/' for a closing tag, '#' for a pre-process directive
-         *     or undefined for all other tags. Processing should branch here depending on whether or not this
-         *     token is a hash ('#'). Indexes for one branch will be undefined in case of the other branch.
-         *
-         * == In case of Directive ==
-         * [3] The identifier of the directive to set. Always present
-         * [4] The value to set the directive. Always present
-         *
-         * == In case of other tag ==
-         * [5] The Block modifier. Will be '*' for arrays, '&' for context and undefined for simple tags
-         * [6] The Data modifier. Will be '!' for an escape with the global set, '!([7])' for an escape with a
-         *     specified set or undefined for unescaped data
-         * [7] If a set has been specified, this will be the name of the set on its own, seperate from the data
-         *     modifier. It will otherwise be undefined
-         * [8] The identifier for the data or block that the tag represents. Always present
-         **/
-        captureTags = /(\[\[)(\#|\/)?\s*(?:([a-zA-Z]+[a-zA-Z0-9]*)\s*\:\s*([a-zA-Z]+[a-zA-Z0-9]*)|([\*\&]?)\s*((?:\!(?:\(([a-zA-Z]+[a-zA-Z0-9]*)\))?)?)\s*([a-zA-Z](?:[a-zA-Z0-9]*(?:\.(?=[a-zA-Z]))?)+))\s*(\]\])/,
-        Stack = function () {
-            var self = this;
-            this.length = 0;
-            this.push = function (val) {
-                self[self.length] = val;
-                self.length += 1;
-            };
-            this.pop = function (val) {
-                var ret = null;
-                if (self.length > 0) {
-                    ret = self[self.length - 1];
-                    self[self.length - 1] = null;
-                    self.length -= 1;
-                }
-                return ret;
-            };
-
-            this.peek = function () {
-                return this.length > 0 ? self[self.length - 1] : null;
-            };
-            this.contains = function (value, compare) {
-                compare = compare || function (a, b) {
-                    return a === b;
-                };
-                var i = this.length;
-                while (i--) {
-                    if (compare(this[i], value)) {
-                        return true;
-                    }
-                }
-                return false;
-            };
-            return this;
-        },
-        Node = function (type, val, modifiers) {
-            this.ident = type || "N_NULL";
-            this.val = val || null;
-            this.content = modifiers || {};
-            return this;
-        },
-        Token = function (ident, val, info) {
-            this.ident = ident || "T_NULL";
-            this.val = val || null;
-            this.info = info || {};
-            return this;
-        },
-        tokenise = function (src) {
-            var tokens = [],
-                last = 0,
-                i = 0,
-                match = null,
-                matcher,
-                chunk,
-                tok;
-
-            matcher = function () {
-                return ((match = captureTags.exec(chunk)) !== null);
-            };
-            while (i < src.length) {
-                chunk = src.substr(i);
-                if (matcher()) {
-                    if (match.index > 0) {
-                        tokens.push(new Token("STRING", match.input.substr(0, match.index)));
-                    }
-                    tok = new Token("T_NULL", null, {close: false, escape: false, escapeType: null});
-                    if (match[2] === '#') {
-                        tok.ident = "T_DIRECTIVE";
-                        tok.val = {};
-                        tok.val[match[3]] = match[4];
-                    } else {
-                        if (match[2] === '/') {
-                            tok.info.close = true;
-                        }
-
-                        if (match[5] === "*") {
-                            tok.ident = "T_LOOP";
-                        } else if (match[5] === "&") {
-                            tok.ident = "T_BLOCK";
-                        } else {
-                            tok.ident = "T_DATA";
-                        }
-
-                        if (typeof (match[6]) !== 'undefined' && match[6].charAt(0) === "!") {
-                            tok.info.escape = true;
-                            if (typeof (match[7]) !== 'undefined') {
-                                tok.info.escapeType = match[7];
-                            }
-                        }
-                        tok.val = match[8];
-                    }
-                    tokens.push(tok);
-                    i += match.index + match[0].length;
-                } else {
-                    tokens.push(new Token("STRING", chunk));
-                    i += chunk.length;
-                }
-            }
-            tokens.push(new Token("EOD"));
-            return tokens;
-        },
-        collapseParse = function (tokens) {
-            var tokenList,
-                i = 0,
-                j,
-                targetToken,
-                targetNode;
-
-            while (i < tokens.length) {
-                if (tokens[i].info && tokens[i].info.close) {
-                    tokenList = [];
-                    targetToken = tokens[i];
-                    j = i - 1;
-
-                    while (!(tokens[j].ident === targetToken.ident && tokens[j].val === targetToken.val)) {
-                        tokenList.push(tokens[j]);
-                        j -= 1;
-                        if (j < 0) {
-                            throw new Error("Unmatched Closing Tag " + targetNode + " at index " + i);
-                        }
-                    }
-
-                    if (targetToken.ident === "T_LOOP") {
-                        targetNode = new Node("N_LOOP", targetToken.val, tokenList.slice().reverse());
-                    } else {
-                        targetNode = new Node("N_BLOCK", targetToken.val, tokenList.slice().reverse());
-                    }
-
-                    tokens.splice(j, (i - j) + 1, targetNode);
-                    i = 0;
-                } else {
-                    i += 1;
-                }
-            }
-            return tokens;
-
-        },
-        unwindNode = function (output, node, index, arr) {
-            var innerArr, dataArr, content, i, dataVal;
-            switch (node.ident) {
-            case "STRING":
-                return output + node.val;
-
-            case "T_DATA":
-                dataVal = node.val;
-                if (arr.loopTag) {
-                    if (node.val === arr.loopTag.slice(0, -1)) {
-                        dataVal = arr.loopTag + "." + (arr.i).toString();
-                    }
-                }
-                return output + getDeepProperty(dataVal, arr.data);
-
-            case "N_LOOP":
-                content = "";
-
-                innerArr = node.content;
-                innerArr.data = arr.data;
-                innerArr.loopTag = node.val;
-
-                dataArr = getDeepProperty(node.val, arr.data);
-
-                for (i = 0; i < dataArr.length; i += 1) {
-                    innerArr.i = i;
-                    content += innerArr.reduce(unwindNode, "");
-                }
-
-                return output + content;
-
-            case "N_BLOCK":
-                innerArr = node.content;
-                innerArr.data = getDeepProperty(node.val, arr.data);
-                innerArr.loopTag = null;
-                return output + innerArr.reduce(unwindNode, "");
-
-            default:
-                return output;
-            }
-        },
-        render = function (src, data, options) {
-            var nodes = collapseParse(tokenise(src));
-            nodes.data = data;
-            nodes.loopTag = null;
-            nodes.i = null;
-            return nodes.reduce(unwindNode, "");
-        };
-
-    render.partial = function (src) {
-        return function (tokens, data, options) {
-            tokens.data = data;
-            tokens.loopTag = null;
-            tokens.i = null;
-            return tokens.reduce(unwindNode, "");
-        }.bind(null, collapseParse(tokenise(src)));
-    };
-
-    if (typeof module !== "undefined" && module.exports) {
-        module.exports = render;
-    } else {
-        window.sideburns = render;
-    }
-}());
diff --git a/test/test.html b/test/test.html
index 85df0e97a0b2d534ef11145b711b3345c9a3c091..f119ba69830a6a87b5c2016e389eb0a1e6c721b4 100644
--- a/test/test.html
+++ b/test/test.html
@@ -6,8 +6,8 @@
         <meta charset="utf-8">
         <title>SB test</title>
         <script src="td.js"></script>
-        <script src="sb.js"></script>
-        <script src="../tinyDOM-Sideburns.js"></script>
+<!--        <script src="sb.js"></script>-->
+        <script src="../tinyDOM-Sideburns.min.js"></script>
     </head>
 
     <body>
diff --git a/tinyDOM-Sideburns.js b/tinyDOM-Sideburns.js
deleted file mode 100644
index dd9190a02f544816c8fbd0a2873be8298adb9787..0000000000000000000000000000000000000000
--- a/tinyDOM-Sideburns.js
+++ /dev/null
@@ -1,43 +0,0 @@
-/*globals console, mu */
-(function () {
-    "use strict";
-
-    if (!window.mu) {
-        throw new Error("tinyDOM-Sideburns requires tinyDOM to be in use on the page");
-    }
-
-    mu.templates = {};
-
-    mu.render = function (path, data, options) {
-        if (mu.templates.hasOwnProperty(path)) {
-            return mu.templates[path](data, options);
-        } else {
-            return window.sideburns(path, data, options);
-        }
-    };
-
-
-    mu.fn.render = function (path, data, options) {
-        var rendered = mu.render(path, data, options),
-            opts = options || {useHtml: true};
-        if (typeof opts.useHtml === "undefined") {
-            opts.useHtml = true;
-        }
-
-        this.each(function (i, e) {
-            if (opts.useHtml) {
-                e.innerHTML = rendered;
-            } else {
-                e.textContent = rendered;
-            }
-        });
-    };
-
-    mu.ready(function () {
-        mu("[type='x-template/sideburns']").each(function (i, e) {
-            var name = e.getAttribute("data-name");
-            mu.templates[name] = window.sideburns.partial(e.textContent);
-        });
-    });
-
-}());
diff --git a/tinyDOM-Sideburns.min.js b/tinyDOM-Sideburns.min.js
index 4f76e6722d149fe9b9f4424c0e18eded27487e4b..09c7286ddb24aa32b8782d991f1e22c753f4d8f4 100644
--- a/tinyDOM-Sideburns.min.js
+++ b/tinyDOM-Sideburns.min.js
@@ -1,2 +1,2 @@
-!function(){"use strict";if(!window.mu)throw new Error("tinyDOM-Sideburns requires tinyDOM to be in use on the page");mu.templates={},mu.render=function(e,t,n){return mu.templates.hasOwnProperty(e)?mu.templates[e](t,n):window.sideburns(e,t,n)},mu.fn.render=function(e,t,n){var r=mu.render(e,t,n),u=n||{useHtml:!0};"undefined"==typeof u.useHtml&&(u.useHtml=!0),this.each(function(e,t){u.useHtml?t.innerHTML=r:t.textContent=r})},mu.ready(function(){mu("[type='x-template/sideburns']").each(function(e,t){var n=t.getAttribute("data-name");mu.templates[n]=window.sideburns.partial(t.textContent)})})}();
+(function(window,undefined){var globalOptions={ignoreUndefined:!1,escape:"general",escapeSets:{xml:{"<":"&lt;",">":"&gt;","&":"&amp;",'"':"&quot;"},general:{'"':'\\"',"'":"\\'"}}},deepMergeJson=function(e,n){var t;for(t in n)n.hasOwnProperty(t)&&(e[t]="object"==typeof e[t]&&"object"==typeof n[t]?deepMergeJson(e[t],n[t]):n[t]);return e},setDeepProperty=function(e,n,t){var r,o=function(e,n,t){e.length>1?o(e,n,t[r.shift()]):t[e[0]]=n};return r=e.push||e.map?e:e.split(".").map(function(e){return e.trim()}),o(r,n,t),t},getDeepProperty=function(e,n){var t,r=null,o=function(n,i){var a;if(n.length>1){if(!i.hasOwnProperty(n[0]))throw a=n.reduce(function(e,n,t){return e+(t>0?".":"")+n}),new Error('Invalid proprty, missing expected data "'+a+'" (IDENT: '+e+") from data "+JSON.stringify(i));o(n,i[t.shift()])}else{if(!i.hasOwnProperty(n[0]))throw new Error('Invalid proprty, missing expected data "'+n[0]+'" (IDENT: '+e+") from data "+JSON.stringify(i));r=i[n[0]]}};return t=e.push||e.map?e:e.split(".").map(function(e){return e.trim()}),o(t,n),r},resolveNamespace=function(e,n){var t,r=n.length,o="";for(t=0;r>t;t+=1)o+=n[t]+".";return o+e},safeDeepMergeJson=function(e,n){if("object"!=typeof e)throw new TypeError("Cannot deep merge with an "+typeof e+": [Param 1]");if("object"!=typeof n)throw new TypeError("Cannot deep merge with an "+typeof n+": [Param 2]");return deepMergeJson(deepMergeJson({},e),n)},captureTags=/(\[\[)(\#|\/)?\s*(?:([a-zA-Z]+[a-zA-Z0-9]*)\s*\:\s*([a-zA-Z]+[a-zA-Z0-9]*)|([\*\&]?)\s*((?:\!(?:\(([a-zA-Z]+[a-zA-Z0-9]*)\))?)?)\s*([a-zA-Z](?:[a-zA-Z0-9]*(?:\.(?=[a-zA-Z]))?)+))\s*(\]\])/,Stack=function(){var e=this;return this.length=0,this.push=function(n){e[e.length]=n,e.length+=1},this.pop=function(){var n=null;return e.length>0&&(n=e[e.length-1],e[e.length-1]=null,e.length-=1),n},this.peek=function(){return this.length>0?e[e.length-1]:null},this.contains=function(e,n){n=n||function(e,n){return e===n};for(var t=this.length;t--;)if(n(this[t],e))return!0;return!1},this},Node=function(e,n,t){return this.ident=e||"N_NULL",this.val=n||null,this.content=t||{},this},Token=function(e,n,t){return this.ident=e||"T_NULL",this.val=n||null,this.info=t||{},this},tokenise=function(e){var n,t,r,o=[],i=0,a=null;for(n=function(){return null!==(a=captureTags.exec(t))};i<e.length;)t=e.substr(i),n()?(a.index>0&&o.push(new Token("STRING",a.input.substr(0,a.index))),r=new Token("T_NULL",null,{close:!1,escape:!1,escapeType:null}),"#"===a[2]?(r.ident="T_DIRECTIVE",r.val={},r.val[a[3]]=a[4]):("/"===a[2]&&(r.info.close=!0),r.ident="*"===a[5]?"T_LOOP":"&"===a[5]?"T_BLOCK":"T_DATA","undefined"!=typeof a[6]&&"!"===a[6].charAt(0)&&(r.info.escape=!0,"undefined"!=typeof a[7]&&(r.info.escapeType=a[7])),r.val=a[8]),o.push(r),i+=a.index+a[0].length):(o.push(new Token("STRING",t)),i+=t.length);return o.push(new Token("EOD")),o},collapseParse=function(e){for(var n,t,r,o,i=0;i<e.length;)if(e[i].info&&e[i].info.close){for(n=[],r=e[i],t=i-1;e[t].ident!==r.ident||e[t].val!==r.val;)if(n.push(e[t]),t-=1,0>t)throw new Error("Unmatched Closing Tag "+o+" at index "+i);o="T_LOOP"===r.ident?new Node("N_LOOP",r.val,n.slice().reverse()):new Node("N_BLOCK",r.val,n.slice().reverse()),e.splice(t,i-t+1,o),i=0}else i+=1;return e},unwindNode=function(e,n,t,r){var o,i,a,u,s;switch(n.ident){case"STRING":return e+n.val;case"T_DATA":return s=n.val,r.loopTag&&n.val===r.loopTag.slice(0,-1)&&(s=r.loopTag+"."+r.i.toString()),e+getDeepProperty(s,r.data);case"N_LOOP":for(a="",o=n.content,o.data=r.data,o.loopTag=n.val,i=getDeepProperty(n.val,r.data),u=0;u<i.length;u+=1)o.i=u,a+=o.reduce(unwindNode,"");return e+a;case"N_BLOCK":return o=n.content,o.data=getDeepProperty(n.val,r.data),o.loopTag=null,e+o.reduce(unwindNode,"");default:return e}},render=function(e,n){var t=collapseParse(tokenise(e));return t.data=n,t.loopTag=null,t.i=null,t.reduce(unwindNode,"")};if(render.partial=function(e){return function(e,n){return e.data=n,e.loopTag=null,e.i=null,e.reduce(unwindNode,"")}.bind(null,collapseParse(tokenise(e)))},!window.mu)throw new Error("tinyDOM-Sideburns requires tinyDOM to be in use on the page");mu.templates={},mu.render=function(e,n,t){return mu.templates.hasOwnProperty(e)?mu.templates[e](n,t):render(e,n,t)},mu.fn.render=function(e,n,t){var r=mu.render(e,n,t),o=t||{useHtml:!0};"undefined"==typeof o.useHtml&&(o.useHtml=!0),this.each(function(e,n){o.useHtml?n.innerHTML=r:n.textContent=r})},mu.ready(function(){mu("[type='x-template/sideburns']").each(function(e,n){var t=n.getAttribute("data-name");mu.templates[t]=render.partial(n.textContent)})});})(window);
 //# sourceMappingURL=tinyDOM-Sideburns.min.js.map
diff --git a/tinyDOM-Sideburns.min.js.map b/tinyDOM-Sideburns.min.js.map
index 3282fcb72bc20c8a97490c146cce352be381671b..b880d640898d64d6cd3433ae706656a1577dfe98 100644
--- a/tinyDOM-Sideburns.min.js.map
+++ b/tinyDOM-Sideburns.min.js.map
@@ -1 +1 @@
-{"version":3,"sources":["tinyDOM-Sideburns.js"],"names":["window","mu","Error","templates","render","path","data","options","hasOwnProperty","sideburns","fn","rendered","opts","useHtml","this","each","i","e","innerHTML","textContent","ready","name","getAttribute","partial"],"mappings":"CACC,WACG,YAEA,KAAKA,OAAOC,GACR,KAAM,IAAIC,OAAM,8DAGpBD,IAAGE,aAEHF,GAAGG,OAAS,SAAUC,EAAMC,EAAMC,GAC9B,MAAIN,IAAGE,UAAUK,eAAeH,GACrBJ,GAAGE,UAAUE,GAAMC,EAAMC,GAEzBP,OAAOS,UAAUJ,EAAMC,EAAMC,IAK5CN,GAAGS,GAAGN,OAAS,SAAUC,EAAMC,EAAMC,GACjC,GAAII,GAAWV,GAAGG,OAAOC,EAAMC,EAAMC,GACjCK,EAAOL,IAAYM,SAAS,EACJ,oBAAjBD,GAAKC,UACZD,EAAKC,SAAU,GAGnBC,KAAKC,KAAK,SAAUC,EAAGC,GACfL,EAAKC,QACLI,EAAEC,UAAYP,EAEdM,EAAEE,YAAcR,KAK5BV,GAAGmB,MAAM,WACLnB,GAAG,iCAAiCc,KAAK,SAAUC,EAAGC,GAClD,GAAII,GAAOJ,EAAEK,aAAa,YAC1BrB,IAAGE,UAAUkB,GAAQrB,OAAOS,UAAUc,QAAQN,EAAEE"}
\ No newline at end of file
+{"version":3,"sources":["src/sideburns.cut.js","src/tinyDOM-Sideburns.js"],"names":["globalOptions","ignoreUndefined","escape","escapeSets","xml","<",">","&","\"","general","'","deepMergeJson","obja","objb","prop","hasOwnProperty","setDeepProperty","ident","value","obj","list","recurse","propList","length","shift","push","map","split","e","trim","getDeepProperty","ret","curident","reduce","a","b","i","Error","JSON","stringify","resolveNamespace","blockStack","l","safeDeepMergeJson","TypeError","captureTags","Stack","self","this","val","pop","peek","contains","compare","Node","type","modifiers","content","Token","info","tokenise","src","matcher","chunk","tok","tokens","match","exec","substr","index","input","close","escapeType","charAt","collapseParse","tokenList","j","targetToken","targetNode","slice","reverse","splice","unwindNode","output","node","arr","innerArr","dataArr","dataVal","loopTag","toString","data","render","nodes","partial","bind","window","mu","templates","path","options","fn","rendered","opts","useHtml","each","innerHTML","textContent","ready","name","getAttribute"],"mappings":"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"}
\ No newline at end of file