diff --git a/static/js/angular-ui-router-uib-modal.js b/static/js/angular-ui-router-uib-modal.js
new file mode 100644
index 0000000..912dd31
--- /dev/null
+++ b/static/js/angular-ui-router-uib-modal.js
@@ -0,0 +1,75 @@
+/**
+ * AngularJS module that adds support for ui-bootstrap modal states when using ui-router.
+ *
+ * @link https://github.com/nonplus/angular-ui-router-uib-modal
+ *
+ * @license angular-ui-router-uib-modal v0.0.11
+ * (c) Copyright Stepan Riha <github@nonplus.net>
+ * License MIT
+ */
+
+(function(angular) {
+
+"use strict";
+angular.module("ui.router.modal", ["ui.router"])
+    .config(["$stateProvider", function ($stateProvider) {
+        var stateProviderState = $stateProvider.state;
+        $stateProvider["state"] = state;
+        function state(name, config) {
+            var stateName;
+            var options;
+            // check for $stateProvider.state({name: "state", ...}) usage
+            if (angular.isObject(name)) {
+                options = name;
+                stateName = options.name;
+            }
+            else {
+                options = config;
+                stateName = name;
+            }
+            if (options.modal) {
+                if (options.onEnter) {
+                    throw new Error("Invalid modal state definition: The onEnter setting may not be specified.");
+                }
+                if (options.onExit) {
+                    throw new Error("Invalid modal state definition: The onExit setting may not be specified.");
+                }
+                var openModal_1;
+                // Get modal.resolve keys from state.modal or state.resolve
+                var resolve_1 = (Array.isArray(options.modal) ? options.modal : []).concat(Object.keys(options.resolve || {}));
+                var inject_1 = ["$uibModal", "$state"];
+                options.onEnter = function ($uibModal, $state) {
+                    // Add resolved values to modal options
+                    if (resolve_1.length) {
+                        options.resolve = {};
+                        for (var i = 0; i < resolve_1.length; i++) {
+                            options.resolve[resolve_1[i]] = injectedConstant(arguments[inject_1.length + i]);
+                        }
+                    }
+                    var thisModal = openModal_1 = $uibModal.open(options);
+                    openModal_1.result['finally'](function () {
+                        if (thisModal === openModal_1) {
+                            // Dialog was closed via $uibModalInstance.close/dismiss, go to our parent state
+                            $state.go($state.get("^", stateName).name);
+                        }
+                    });
+                };
+                // Make sure that onEnter receives state.resolve configuration
+                options.onEnter["$inject"] = inject_1.concat(resolve_1);
+                options.onExit = function () {
+                    if (openModal_1) {
+                        // State has changed while dialog was open
+                        openModal_1.close();
+                        openModal_1 = null;
+                    }
+                };
+            }
+            return stateProviderState.call($stateProvider, stateName, options);
+        }
+    }]);
+function injectedConstant(val) {
+    return [function () { return val; }];
+}
+
+
+})(window.angular);
\ No newline at end of file
