diff --git a/ma-impl.sublime-workspace b/ma-impl.sublime-workspace
index 776533a41752c0b806d9d859a69c0ae06499a1b7..fe838457b69356780105e4bd5c79e01ab52075e8 100644
--- a/ma-impl.sublime-workspace
+++ b/ma-impl.sublime-workspace
@@ -287,6 +287,14 @@
 	},
 	"buffers":
 	[
+		{
+			"file": "vipra-ui/gulpfile.js",
+			"settings":
+			{
+				"buffer_size": 2211,
+				"line_ending": "Unix"
+			}
+		}
 	],
 	"build_system": "",
 	"build_system_choices":
@@ -467,17 +475,13 @@
 	[
 		"/home/eike/repos/master/ma-impl",
 		"/home/eike/repos/master/ma-impl/vipra-ui",
-		"/home/eike/repos/master/ma-impl/vipra-ui/css",
-		"/home/eike/repos/master/ma-impl/vipra-ui/html",
-		"/home/eike/repos/master/ma-impl/vipra-ui/html/articles",
-		"/home/eike/repos/master/ma-impl/vipra-ui/html/directives",
-		"/home/eike/repos/master/ma-impl/vipra-ui/html/topics",
-		"/home/eike/repos/master/ma-impl/vipra-ui/html/words",
-		"/home/eike/repos/master/ma-impl/vipra-ui/js",
-		"/home/eike/repos/master/ma-impl/vm/data"
+		"/home/eike/repos/master/ma-impl/vipra-ui/app"
 	],
 	"file_history":
 	[
+		"/home/eike/repos/master/ma-impl/vipra-ui/public/html/index.html",
+		"/home/eike/repos/master/ma-impl/vipra-ui/gulpfile.js",
+		"/home/eike/repos/master/ma-impl/vipra-ui/public/index.html",
 		"/home/eike/repos/master/ma-impl/vipra-ui/js/controllers.js",
 		"/home/eike/repos/master/ma-impl/vipra-ui/html/words/show.html",
 		"/home/eike/repos/master/ma-impl/vipra-ui/html/topics/show.html",
@@ -506,12 +510,10 @@
 		"/home/eike/repos/master/ma-impl/vm/data/test-2.json",
 		"/home/eike/repos/master/ma-impl/vipra-ui/js/factories.js",
 		"/run/user/1000/gvfs/smb-share:server=eike-ain,share=share/interceptors.js",
-		"/home/eike/repos/master/ma-impl/vipra-ui/gulpfile.js",
 		"/home/eike/repos/master/ma-impl/vipra-ui/css/footer.less",
 		"/home/eike/repos/master/ma-impl/vipra-ui/less/vendor.less",
 		"/home/eike/repos/master/ma-impl/vipra-ui/less/vendor.less.css",
 		"/home/eike/repos/master/ma-impl/vipra-ui/less/app.less",
-		"/home/eike/repos/master/ma-impl/vipra-ui/public/index.html",
 		"/home/eike/repos/master/ma-impl/vipra-ui/js/vendor.js",
 		"/home/eike/repos/master/ma-impl/vipra-ui/less/main.less",
 		"/home/eike/repos/master/ma-impl/vipra-ui/css/main.less",
@@ -604,8 +606,7 @@
 		"/home/eike/repos/master/ma-impl/vipra-cmd.sh",
 		"/home/eike/repos/master/ma-impl/vipra-cmd/build2.xml",
 		"/home/eike/repos/master/ma-impl/vipra-ui/README.md",
-		"/home/eike/repos/testasd/bower.json",
-		"/home/eike/repos/master/ma-impl/vipra-ui2/package.json"
+		"/home/eike/repos/testasd/bower.json"
 	],
 	"find":
 	{
@@ -929,8 +930,39 @@
 	"groups":
 	[
 		{
+			"selected": 0,
 			"sheets":
 			[
+				{
+					"buffer": 0,
+					"file": "vipra-ui/gulpfile.js",
+					"semi_transient": false,
+					"settings":
+					{
+						"buffer_size": 2211,
+						"regions":
+						{
+						},
+						"selection":
+						[
+							[
+								830,
+								830
+							]
+						],
+						"settings":
+						{
+							"syntax": "Packages/JavaScriptNext - ES6 Syntax/JavaScriptNext.tmLanguage",
+							"tab_size": 2,
+							"translate_tabs_to_spaces": true
+						},
+						"translation.x": -0.0,
+						"translation.y": 51.0,
+						"zoom_level": 1.0
+					},
+					"stack_index": 0,
+					"type": "text"
+				}
 			]
 		}
 	],
@@ -1097,7 +1129,7 @@
 	"show_open_files": true,
 	"show_tabs": true,
 	"side_bar_visible": true,
-	"side_bar_width": 274.0,
+	"side_bar_width": 353.0,
 	"status_bar_visible": true,
 	"template_settings":
 	{
diff --git a/vipra-ui/.gitignore b/vipra-ui/.gitignore
index 68b9e27759d7ca5877d5a46b29f674ec48e3c62c..d7dfae0cdc09270d342c3aabbb6f1bd8b6c2050c 100644
--- a/vipra-ui/.gitignore
+++ b/vipra-ui/.gitignore
@@ -1,2 +1,3 @@
 node_modules/
 bower_components/
+public/
\ No newline at end of file
diff --git a/vipra-ui/html/articles/index.html b/vipra-ui/app/html/articles/index.html
similarity index 100%
rename from vipra-ui/html/articles/index.html
rename to vipra-ui/app/html/articles/index.html
diff --git a/vipra-ui/html/articles/show.html b/vipra-ui/app/html/articles/show.html
similarity index 100%
rename from vipra-ui/html/articles/show.html
rename to vipra-ui/app/html/articles/show.html
diff --git a/vipra-ui/html/directives/pagination.html b/vipra-ui/app/html/directives/pagination.html
similarity index 100%
rename from vipra-ui/html/directives/pagination.html
rename to vipra-ui/app/html/directives/pagination.html
diff --git a/vipra-ui/html/index.html b/vipra-ui/app/html/index.html
similarity index 100%
rename from vipra-ui/html/index.html
rename to vipra-ui/app/html/index.html
diff --git a/vipra-ui/html/topics/index.html b/vipra-ui/app/html/topics/index.html
similarity index 100%
rename from vipra-ui/html/topics/index.html
rename to vipra-ui/app/html/topics/index.html
diff --git a/vipra-ui/html/topics/show.html b/vipra-ui/app/html/topics/show.html
similarity index 100%
rename from vipra-ui/html/topics/show.html
rename to vipra-ui/app/html/topics/show.html
diff --git a/vipra-ui/html/words/index.html b/vipra-ui/app/html/words/index.html
similarity index 100%
rename from vipra-ui/html/words/index.html
rename to vipra-ui/app/html/words/index.html
diff --git a/vipra-ui/html/words/show.html b/vipra-ui/app/html/words/show.html
similarity index 100%
rename from vipra-ui/html/words/show.html
rename to vipra-ui/app/html/words/show.html
diff --git a/vipra-ui/img/logo-inkscape.svg b/vipra-ui/app/img/logo-inkscape.svg
similarity index 100%
rename from vipra-ui/img/logo-inkscape.svg
rename to vipra-ui/app/img/logo-inkscape.svg
diff --git a/vipra-ui/img/logo.png b/vipra-ui/app/img/logo.png
similarity index 100%
rename from vipra-ui/img/logo.png
rename to vipra-ui/app/img/logo.png
diff --git a/vipra-ui/img/logo.svg b/vipra-ui/app/img/logo.svg
similarity index 100%
rename from vipra-ui/img/logo.svg
rename to vipra-ui/app/img/logo.svg
diff --git a/vipra-ui/app/index.html b/vipra-ui/app/index.html
new file mode 100644
index 0000000000000000000000000000000000000000..c551576ce17bebf2d375db07aa984d52914273df
--- /dev/null
+++ b/vipra-ui/app/index.html
@@ -0,0 +1,70 @@
+<!DOCTYPE html>
+<html lang="en" ng-app="vipra.app">
+  <head>
+    <meta charset="utf-8">
+    <meta http-equiv="X-UA-Compatible" content="IE=edge">
+    <meta name="viewport" content="width=device-width, initial-scale=1">
+    <title>Vipra</title>
+
+    <link rel="apple-touch-icon" sizes="57x57" href="/apple-touch-icon-57x57.png">
+    <link rel="apple-touch-icon" sizes="60x60" href="/apple-touch-icon-60x60.png">
+    <link rel="apple-touch-icon" sizes="72x72" href="/apple-touch-icon-72x72.png">
+    <link rel="apple-touch-icon" sizes="76x76" href="/apple-touch-icon-76x76.png">
+    <link rel="apple-touch-icon" sizes="114x114" href="/apple-touch-icon-114x114.png">
+    <link rel="apple-touch-icon" sizes="120x120" href="/apple-touch-icon-120x120.png">
+    <link rel="apple-touch-icon" sizes="144x144" href="/apple-touch-icon-144x144.png">
+    <link rel="apple-touch-icon" sizes="152x152" href="/apple-touch-icon-152x152.png">
+    <link rel="apple-touch-icon" sizes="180x180" href="/apple-touch-icon-180x180.png">
+    <link rel="icon" type="image/png" href="/favicon-32x32.png" sizes="32x32">
+    <link rel="icon" type="image/png" href="/android-chrome-192x192.png" sizes="192x192">
+    <link rel="icon" type="image/png" href="/favicon-96x96.png" sizes="96x96">
+    <link rel="icon" type="image/png" href="/favicon-16x16.png" sizes="16x16">
+    <link rel="manifest" href="/manifest.json">
+    <link rel="mask-icon" href="/safari-pinned-tab.svg" color="#5bbad5">
+    <link rel="shortcut icon" href="/favicon.ico">
+    <meta name="msapplication-TileColor" content="#da532c">
+    <meta name="msapplication-TileImage" content="/mstile-144x144.png">
+    <meta name="msapplication-config" content="/browserconfig.xml">
+    <meta name="theme-color" content="#ffffff">
+
+    <!-- stylesheets -->
+    <link href="css/vendor.css" rel="stylesheet">
+    <link href="css/app.css" rel="stylesheet">
+
+    <!-- javascript -->
+    <script src="js/vendor.js"></script>
+    <script src="js/app.js"></script>
+  </head>
+  <body>
+    <nav class="navbar navbar-default navbar-static-top">
+      <div class="container-fluid">
+        <!-- Brand and toggle get grouped for better mobile display -->
+        <div class="navbar-header">
+          <button type="button" class="navbar-toggle collapsed" data-toggle="collapse" data-target="#vipra-navbar-collapse-1" aria-expanded="false">
+            <span class="sr-only">Toggle navigation</span>
+            <span class="icon-bar"></span>
+            <span class="icon-bar"></span>
+            <span class="icon-bar"></span>
+          </button>
+          <a ui-sref="index" class="navbar-brand" ng-class="{spin:loading.any}"></a>
+        </div>
+
+        <!-- Collect the nav links, forms, and other content for toggling -->
+        <div class="collapse navbar-collapse" id="vipra-navbar-collapse-1">
+          <ul class="nav navbar-nav">
+            <li ui-sref-active="active"><a ui-sref="articles.index">Articles</a></li>
+            <li ui-sref-active="active"><a ui-sref="topics.index">Topics</a></li>
+            <li ui-sref-active="active"><a ui-sref="words.index">Words</a></li>
+          </ul>
+        </div><!-- /.navbar-collapse -->
+      </div><!-- /.container-fluid -->
+    </nav>
+
+    <div class="container" ui-view></div>
+
+    <footer class="footer navbar-default">
+      <div class="container-fluid">
+      </div>
+    </footer>
+  </body>
+</html>
\ No newline at end of file
diff --git a/vipra-ui/js/app.js b/vipra-ui/app/js/app.js
similarity index 98%
rename from vipra-ui/js/app.js
rename to vipra-ui/app/js/app.js
index 3215a9d97d3cb8a5c0851e4785e5a1a269f9d572..7b23dad661694e9b82da097c324e87b7244b3f73 100644
--- a/vipra-ui/js/app.js
+++ b/vipra-ui/app/js/app.js
@@ -1,3 +1,7 @@
+/*
+ * Vipra Application
+ * Main application file
+ */
 (function() {
 
   var app = angular.module('vipra.app', [
diff --git a/vipra-ui/js/controllers.js b/vipra-ui/app/js/controllers.js
similarity index 99%
rename from vipra-ui/js/controllers.js
rename to vipra-ui/app/js/controllers.js
index 0eabe9f4852207196d67f05fdef03aa232bcf04f..e92e1afe610cf70eeb8e4945dcf77bd5a8b115bb 100644
--- a/vipra-ui/js/controllers.js
+++ b/vipra-ui/app/js/controllers.js
@@ -1,3 +1,7 @@
+/*
+ * Vipra Application
+ * Controllers
+ */
 (function() {
 
   var app = angular.module('vipra.controllers', [
diff --git a/vipra-ui/js/directives.js b/vipra-ui/app/js/directives.js
similarity index 96%
rename from vipra-ui/js/directives.js
rename to vipra-ui/app/js/directives.js
index 46bff5302cc34918a871bd9d4d50eeb470944c62..f37e49881e07ca87873cdada2a9004faa51ff42e 100644
--- a/vipra-ui/js/directives.js
+++ b/vipra-ui/app/js/directives.js
@@ -1,3 +1,7 @@
+/*
+ * Vipra Application
+ * Directives
+ */
 (function() {
 
   var app = angular.module('vipra.directives', [
diff --git a/vipra-ui/js/factories.js b/vipra-ui/app/js/factories.js
similarity index 95%
rename from vipra-ui/js/factories.js
rename to vipra-ui/app/js/factories.js
index 6eb0807ae2e7f3d86566f82bf88d3427d21270d8..b056ecc2c96b13e8c0ba3e3e5730b18cec350085 100644
--- a/vipra-ui/js/factories.js
+++ b/vipra-ui/app/js/factories.js
@@ -1,3 +1,7 @@
+/*
+ * Vipra Application
+ * Factories
+ */
 (function() {
 
   var app = angular.module('vipra.factories', []);
diff --git a/vipra-ui/js/filters.js b/vipra-ui/app/js/filters.js
similarity index 88%
rename from vipra-ui/js/filters.js
rename to vipra-ui/app/js/filters.js
index 192f846992f3eb6ee8d32326a2ed87f8d698265f..2be8bfc07f40c33666e2d8d6ad3bd69bd3b02759 100644
--- a/vipra-ui/js/filters.js
+++ b/vipra-ui/app/js/filters.js
@@ -1,3 +1,7 @@
+/*
+ * Vipra Application
+ * Filters
+ */
 (function() {
 
   var app = angular.module('vipra.filters', []);
diff --git a/vipra-ui/js/helpers.js b/vipra-ui/app/js/helpers.js
similarity index 91%
rename from vipra-ui/js/helpers.js
rename to vipra-ui/app/js/helpers.js
index 14980a3641014cddae33cb15c451db261023ba1a..48126a269a9dbd79815d8f523ac660d6f5e40f44 100644
--- a/vipra-ui/js/helpers.js
+++ b/vipra-ui/app/js/helpers.js
@@ -1,3 +1,7 @@
+/*
+ * Vipra Application
+ * Helpers
+ */
 (function() {
 
   window.formatDate = function(date) {
diff --git a/vipra-ui/js/services.js b/vipra-ui/app/js/services.js
similarity index 63%
rename from vipra-ui/js/services.js
rename to vipra-ui/app/js/services.js
index cc05f9e1c0d8c72892ecbc564480f283451a7a58..1fba5a4cc0a7ee15de94b109aac433a14f5e8fb3 100644
--- a/vipra-ui/js/services.js
+++ b/vipra-ui/app/js/services.js
@@ -1,3 +1,7 @@
+/*
+ * Vipra Application
+ * Services
+ */
 (function() {
 
   var app = angular.module('vipra.services', []);
diff --git a/vipra-ui/css/app.less b/vipra-ui/app/less/app.less
similarity index 100%
rename from vipra-ui/css/app.less
rename to vipra-ui/app/less/app.less
diff --git a/vipra-ui/css/app.css b/vipra-ui/css/app.css
deleted file mode 100644
index 02ae7baff2ce3d300f2abc19665ab11bccdc583e..0000000000000000000000000000000000000000
--- a/vipra-ui/css/app.css
+++ /dev/null
@@ -1,2 +0,0 @@
-html{position:relative;min-height:100%}body{padding-bottom:20px;margin-bottom:60px}.heading{-webkit-touch-callout:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;cursor:default;background:transparent url(/img/logo.svg) no-repeat 50% 50%;background-size:contain;height:125px;margin:25px 0}.search-results{padding:15px}.search-results .search-result{margin-bottom:20px}.search-results .search-result a{font-size:1.5rem}.ellipsize{white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.navbar-default .collapse:not(.in) .navbar-nav>.active>a,.navbar-default .collapse:not(.in) .navbar-nav>.active>a:focus,.navbar-default .collapse:not(.in) .navbar-nav>.active>a:hover{border-bottom:3px solid;padding-bottom:12px}.navbar-default .navbar-header{padding:0 10px}.navbar-default .navbar-brand,.navbar-default .navbar-brand.spin,.navbar-default .navbar-brand:hover:not(.spin){background:transparent url(/img/logo.svg) no-repeat 50% 50%;background-size:contain}.navbar-default .navbar-brand.spin,.navbar-default .navbar-brand:hover:not(.spin){-webkit-animation:a 4s linear infinite;animation:a 4s linear infinite}.navbar-default .navbar-brand.spin.spinner-small,.navbar-default .navbar-brand:hover:not(.spin).spinner-small{padding:20px}.row-spaced{margin-top:15px;margin-bottom:15px}.footer{width:100%;height:50px;border-top-width:1px;border-top-style:solid}.footer,.loading:before{position:absolute;bottom:0}.loading:before{top:0;left:0;right:0;background:rgba(0,0,0,.2);content:" ";z-index:1}.spinner{background:transparent url(/img/logo.svg) no-repeat 50% 50%;background-size:contain;-webkit-animation:a 4s linear infinite;animation:a 4s linear infinite}.spinner.spinner-small{padding:20px}.noselect{-webkit-touch-callout:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;cursor:default}@-webkit-keyframes a{to{-webkit-transform:rotateY(1turn)}}@keyframes a{to{-webkit-transform:rotateY(1turn);transform:rotateY(1turn)}}
-/*# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImFwcC5sZXNzIiwiYXBwLmNzcyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxLQUNFLGtCQUFBLEFBQ0EsZUFBQSxDQ0NELEFERUQsS0FDRSxvQkFBQSxBQUVBLGtCQUFBLENDQUQsQURHRCxTQTJGRSwyQkFBQSxBQUNBLHlCQUFBLEFBQ0Esc0JBQUEsQUFDQSxxQkFBQSxBQUNBLGlCQUFBLEFBQ0EsZUFBQSxBQTlGQSw0REFBQSxBQUNBLHdCQUFBLEFBQ0EsYUFBQSxBQUNBLGFBQUEsQ0NJRCxBRERELGdCQUNFLFlBQUEsQ0NHRCxBREpELCtCQUlJLGtCQUFBLENDR0gsQURQRCxpQ0FPTSxnQkFBQSxDQ0dMLEFERUQsV0FDRSxtQkFBQSxBQUNBLGdCQUFBLEFBQ0Esc0JBQUEsQ0NBRCxBRE1LLHVMQUdFLHdCQUFBLEFBQ0EsbUJBQUEsQ0NKUCxBREhELCtCQWFJLGNBQUEsQ0NQSCxBRGFHLGdIQUZBLDREQUFBLEFBQ0EsdUJBQUEsQ0FDQSxBQ0RILGtGRHFDQyx1Q0FBQSxBQUVBLDhCQUFBLENDdkNELEFEeUNDLDhHQUNFLFlBQUEsQ0N0Q0gsQURJRCxZQUNFLGdCQUFBLEFBQ0Esa0JBQUEsQ0NGRCxBREtELFFBR0UsV0FBQSxBQUVBLFlBQUEsQUFDQSxxQkFBQSxBQUNBLHNCQUFBLENDSEQsQURNRCx3QkFURSxrQkFBQSxBQUNBLFFBQUEsQ0FRRixBQ0lDLGdCREZDLE1BQUEsQUFDQSxPQUFBLEFBQ0EsUUFBQSxBQUVBLDBCQUFBLEFBQ0EsWUFBQSxBQUNBLFNBQUEsQ0NKRCxBRE9ELFNBQ0UsNERBQUEsQUFDQSx3QkFBQSxBQUNBLHVDQUFBLEFBRUEsOEJBQUEsQ0NMRCxBRE9DLHVCQUNFLFlBQUEsQ0NMSCxBRFNELFVBQ0UsMkJBQUEsQUFDQSx5QkFBQSxBQUNBLHNCQUFBLEFBQ0EscUJBQUEsQUFDQSxpQkFBQSxBQUNBLGNBQUEsQ0NQRCxBRFdELHFCQUEwQixHQUFPLGdDQUFBLENDRjlCLENBQ0YsQURFRCxhQUFrQixHQUFPLGlDQUFBLEFBQW9DLHdCQUFBLENDRzFELENBQ0YiLCJmaWxlIjoiYXBwLmNzcyIsInNvdXJjZXNDb250ZW50IjpbImh0bWwge1xuICBwb3NpdGlvbjogcmVsYXRpdmU7XG4gIG1pbi1oZWlnaHQ6IDEwMCU7XG59XG5cbmJvZHkge1xuICBwYWRkaW5nLWJvdHRvbTogMjBweDtcbiAgLyogTWFyZ2luIGJvdHRvbSBieSBmb290ZXIgaGVpZ2h0ICovXG4gIG1hcmdpbi1ib3R0b206IDYwcHg7XG59XG5cbi5oZWFkaW5nIHtcbiAgLm5vc2VsZWN0O1xuICBiYWNrZ3JvdW5kOiB0cmFuc3BhcmVudCB1cmwoL2ltZy9sb2dvLnN2Zykgbm8tcmVwZWF0IDUwJSA1MCU7XG4gIGJhY2tncm91bmQtc2l6ZTogY29udGFpbjtcbiAgaGVpZ2h0OiAxMjVweDtcbiAgbWFyZ2luOiAyNXB4IDA7XG59XG5cbi5zZWFyY2gtcmVzdWx0cyB7XG4gIHBhZGRpbmc6IDE1cHg7XG5cbiAgLnNlYXJjaC1yZXN1bHQge1xuICAgIG1hcmdpbi1ib3R0b206IDIwcHg7XG5cbiAgICBhIHtcbiAgICAgIGZvbnQtc2l6ZTogMS41cmVtO1xuICAgIH1cbiAgfVxufVxuXG4uZWxsaXBzaXplIHtcbiAgd2hpdGUtc3BhY2U6IG5vd3JhcDtcbiAgb3ZlcmZsb3c6IGhpZGRlbjtcbiAgdGV4dC1vdmVyZmxvdzogZWxsaXBzaXM7XG59XG5cbi5uYXZiYXItZGVmYXVsdCB7XG4gIC5jb2xsYXBzZTpub3QoLmluKSB7XG4gICAgLm5hdmJhci1uYXYgPiAuYWN0aXZlIHtcbiAgICAgICY+IGEsXG4gICAgICAmPiBhOmhvdmVyLFxuICAgICAgJj4gYTpmb2N1cyB7XG4gICAgICAgIGJvcmRlci1ib3R0b206IDNweCBzb2xpZDtcbiAgICAgICAgcGFkZGluZy1ib3R0b206IDEycHg7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLm5hdmJhci1oZWFkZXIge1xuICAgIHBhZGRpbmc6IDAgMTBweDtcbiAgfVxuXG4gIC5uYXZiYXItYnJhbmQge1xuICAgIGJhY2tncm91bmQ6IHRyYW5zcGFyZW50IHVybCgvaW1nL2xvZ28uc3ZnKSBuby1yZXBlYXQgNTAlIDUwJTtcbiAgICBiYWNrZ3JvdW5kLXNpemU6IGNvbnRhaW47XG4gICAgJi5zcGluLFxuICAgICY6aG92ZXI6bm90KC5zcGluKSB7XG4gICAgICAuc3Bpbm5lcjtcbiAgICB9XG4gIH1cbn1cblxuLnJvdy1zcGFjZWQge1xuICBtYXJnaW4tdG9wOiAxNXB4O1xuICBtYXJnaW4tYm90dG9tOiAxNXB4O1xufVxuXG4uZm9vdGVyIHtcbiAgcG9zaXRpb246IGFic29sdXRlO1xuICBib3R0b206IDA7XG4gIHdpZHRoOiAxMDAlO1xuICAvKiBTZXQgdGhlIGZpeGVkIGhlaWdodCBvZiB0aGUgZm9vdGVyIGhlcmUgKi9cbiAgaGVpZ2h0OiA1MHB4O1xuICBib3JkZXItdG9wLXdpZHRoOiAxcHg7XG4gIGJvcmRlci10b3Atc3R5bGU6IHNvbGlkO1xufVxuXG4ubG9hZGluZzpiZWZvcmUge1xuICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gIHRvcDogMDtcbiAgbGVmdDogMDtcbiAgcmlnaHQ6IDA7XG4gIGJvdHRvbTogMDtcbiAgYmFja2dyb3VuZDogcmdiYSgwLDAsMCwwLjIpO1xuICBjb250ZW50OiBcIiBcIjtcbiAgei1pbmRleDogOTk5OTtcbn1cblxuLnNwaW5uZXIge1xuICBiYWNrZ3JvdW5kOiB0cmFuc3BhcmVudCB1cmwoL2ltZy9sb2dvLnN2Zykgbm8tcmVwZWF0IDUwJSA1MCU7XG4gIGJhY2tncm91bmQtc2l6ZTogY29udGFpbjtcbiAgLXdlYmtpdC1hbmltYXRpb246c3BpbiA0cyBsaW5lYXIgaW5maW5pdGU7XG4gIC1tb3otYW5pbWF0aW9uOnNwaW4gNHMgbGluZWFyIGluZmluaXRlO1xuICBhbmltYXRpb246c3BpbiA0cyBsaW5lYXIgaW5maW5pdGU7XG5cbiAgJi5zcGlubmVyLXNtYWxsIHtcbiAgICBwYWRkaW5nOiAyMHB4O1xuICB9XG59XG5cbi5ub3NlbGVjdCB7XG4gIC13ZWJraXQtdG91Y2gtY2FsbG91dDogbm9uZTtcbiAgLXdlYmtpdC11c2VyLXNlbGVjdDogbm9uZTtcbiAgLW1vei11c2VyLXNlbGVjdDogbm9uZTtcbiAgLW1zLXVzZXItc2VsZWN0OiBub25lO1xuICB1c2VyLXNlbGVjdDogbm9uZTtcbiAgY3Vyc29yOiBkZWZhdWx0O1xufVxuXG5ALW1vei1rZXlmcmFtZXMgc3BpbiB7IDEwMCUgeyAtbW96LXRyYW5zZm9ybTogcm90YXRlWSgzNjBkZWcpOyB9IH1cbkAtd2Via2l0LWtleWZyYW1lcyBzcGluIHsgMTAwJSB7IC13ZWJraXQtdHJhbnNmb3JtOiByb3RhdGVZKDM2MGRlZyk7IH0gfVxuQGtleWZyYW1lcyBzcGluIHsgMTAwJSB7IC13ZWJraXQtdHJhbnNmb3JtOiByb3RhdGVZKDM2MGRlZyk7IHRyYW5zZm9ybTpyb3RhdGVZKDM2MGRlZyk7IH0gfSIsImh0bWwge1xuICBwb3NpdGlvbjogcmVsYXRpdmU7XG4gIG1pbi1oZWlnaHQ6IDEwMCU7XG59XG5ib2R5IHtcbiAgcGFkZGluZy1ib3R0b206IDIwcHg7XG4gIC8qIE1hcmdpbiBib3R0b20gYnkgZm9vdGVyIGhlaWdodCAqL1xuICBtYXJnaW4tYm90dG9tOiA2MHB4O1xufVxuLmhlYWRpbmcge1xuICAtd2Via2l0LXRvdWNoLWNhbGxvdXQ6IG5vbmU7XG4gIC13ZWJraXQtdXNlci1zZWxlY3Q6IG5vbmU7XG4gIC1tb3otdXNlci1zZWxlY3Q6IG5vbmU7XG4gIC1tcy11c2VyLXNlbGVjdDogbm9uZTtcbiAgdXNlci1zZWxlY3Q6IG5vbmU7XG4gIGN1cnNvcjogZGVmYXVsdDtcbiAgYmFja2dyb3VuZDogdHJhbnNwYXJlbnQgdXJsKC9pbWcvbG9nby5zdmcpIG5vLXJlcGVhdCA1MCUgNTAlO1xuICBiYWNrZ3JvdW5kLXNpemU6IGNvbnRhaW47XG4gIGhlaWdodDogMTI1cHg7XG4gIG1hcmdpbjogMjVweCAwO1xufVxuLnNlYXJjaC1yZXN1bHRzIHtcbiAgcGFkZGluZzogMTVweDtcbn1cbi5zZWFyY2gtcmVzdWx0cyAuc2VhcmNoLXJlc3VsdCB7XG4gIG1hcmdpbi1ib3R0b206IDIwcHg7XG59XG4uc2VhcmNoLXJlc3VsdHMgLnNlYXJjaC1yZXN1bHQgYSB7XG4gIGZvbnQtc2l6ZTogMS41cmVtO1xufVxuLmVsbGlwc2l6ZSB7XG4gIHdoaXRlLXNwYWNlOiBub3dyYXA7XG4gIG92ZXJmbG93OiBoaWRkZW47XG4gIHRleHQtb3ZlcmZsb3c6IGVsbGlwc2lzO1xufVxuLm5hdmJhci1kZWZhdWx0IC5jb2xsYXBzZTpub3QoLmluKSAubmF2YmFyLW5hdiA+IC5hY3RpdmUgPiBhLFxuLm5hdmJhci1kZWZhdWx0IC5jb2xsYXBzZTpub3QoLmluKSAubmF2YmFyLW5hdiA+IC5hY3RpdmUgPiBhOmhvdmVyLFxuLm5hdmJhci1kZWZhdWx0IC5jb2xsYXBzZTpub3QoLmluKSAubmF2YmFyLW5hdiA+IC5hY3RpdmUgPiBhOmZvY3VzIHtcbiAgYm9yZGVyLWJvdHRvbTogM3B4IHNvbGlkO1xuICBwYWRkaW5nLWJvdHRvbTogMTJweDtcbn1cbi5uYXZiYXItZGVmYXVsdCAubmF2YmFyLWhlYWRlciB7XG4gIHBhZGRpbmc6IDAgMTBweDtcbn1cbi5uYXZiYXItZGVmYXVsdCAubmF2YmFyLWJyYW5kIHtcbiAgYmFja2dyb3VuZDogdHJhbnNwYXJlbnQgdXJsKC9pbWcvbG9nby5zdmcpIG5vLXJlcGVhdCA1MCUgNTAlO1xuICBiYWNrZ3JvdW5kLXNpemU6IGNvbnRhaW47XG59XG4ubmF2YmFyLWRlZmF1bHQgLm5hdmJhci1icmFuZC5zcGluLFxuLm5hdmJhci1kZWZhdWx0IC5uYXZiYXItYnJhbmQ6aG92ZXI6bm90KC5zcGluKSB7XG4gIGJhY2tncm91bmQ6IHRyYW5zcGFyZW50IHVybCgvaW1nL2xvZ28uc3ZnKSBuby1yZXBlYXQgNTAlIDUwJTtcbiAgYmFja2dyb3VuZC1zaXplOiBjb250YWluO1xuICAtd2Via2l0LWFuaW1hdGlvbjogc3BpbiA0cyBsaW5lYXIgaW5maW5pdGU7XG4gIC1tb3otYW5pbWF0aW9uOiBzcGluIDRzIGxpbmVhciBpbmZpbml0ZTtcbiAgYW5pbWF0aW9uOiBzcGluIDRzIGxpbmVhciBpbmZpbml0ZTtcbn1cbi5uYXZiYXItZGVmYXVsdCAubmF2YmFyLWJyYW5kLnNwaW4uc3Bpbm5lci1zbWFsbCxcbi5uYXZiYXItZGVmYXVsdCAubmF2YmFyLWJyYW5kOmhvdmVyOm5vdCguc3Bpbikuc3Bpbm5lci1zbWFsbCB7XG4gIHBhZGRpbmc6IDIwcHg7XG59XG4ucm93LXNwYWNlZCB7XG4gIG1hcmdpbi10b3A6IDE1cHg7XG4gIG1hcmdpbi1ib3R0b206IDE1cHg7XG59XG4uZm9vdGVyIHtcbiAgcG9zaXRpb246IGFic29sdXRlO1xuICBib3R0b206IDA7XG4gIHdpZHRoOiAxMDAlO1xuICAvKiBTZXQgdGhlIGZpeGVkIGhlaWdodCBvZiB0aGUgZm9vdGVyIGhlcmUgKi9cbiAgaGVpZ2h0OiA1MHB4O1xuICBib3JkZXItdG9wLXdpZHRoOiAxcHg7XG4gIGJvcmRlci10b3Atc3R5bGU6IHNvbGlkO1xufVxuLmxvYWRpbmc6YmVmb3JlIHtcbiAgcG9zaXRpb246IGFic29sdXRlO1xuICB0b3A6IDA7XG4gIGxlZnQ6IDA7XG4gIHJpZ2h0OiAwO1xuICBib3R0b206IDA7XG4gIGJhY2tncm91bmQ6IHJnYmEoMCwgMCwgMCwgMC4yKTtcbiAgY29udGVudDogXCIgXCI7XG4gIHotaW5kZXg6IDk5OTk7XG59XG4uc3Bpbm5lciB7XG4gIGJhY2tncm91bmQ6IHRyYW5zcGFyZW50IHVybCgvaW1nL2xvZ28uc3ZnKSBuby1yZXBlYXQgNTAlIDUwJTtcbiAgYmFja2dyb3VuZC1zaXplOiBjb250YWluO1xuICAtd2Via2l0LWFuaW1hdGlvbjogc3BpbiA0cyBsaW5lYXIgaW5maW5pdGU7XG4gIC1tb3otYW5pbWF0aW9uOiBzcGluIDRzIGxpbmVhciBpbmZpbml0ZTtcbiAgYW5pbWF0aW9uOiBzcGluIDRzIGxpbmVhciBpbmZpbml0ZTtcbn1cbi5zcGlubmVyLnNwaW5uZXItc21hbGwge1xuICBwYWRkaW5nOiAyMHB4O1xufVxuLm5vc2VsZWN0IHtcbiAgLXdlYmtpdC10b3VjaC1jYWxsb3V0OiBub25lO1xuICAtd2Via2l0LXVzZXItc2VsZWN0OiBub25lO1xuICAtbW96LXVzZXItc2VsZWN0OiBub25lO1xuICAtbXMtdXNlci1zZWxlY3Q6IG5vbmU7XG4gIHVzZXItc2VsZWN0OiBub25lO1xuICBjdXJzb3I6IGRlZmF1bHQ7XG59XG5ALW1vei1rZXlmcmFtZXMgc3BpbiB7XG4gIDEwMCUge1xuICAgIC1tb3otdHJhbnNmb3JtOiByb3RhdGVZKDM2MGRlZyk7XG4gIH1cbn1cbkAtd2Via2l0LWtleWZyYW1lcyBzcGluIHtcbiAgMTAwJSB7XG4gICAgLXdlYmtpdC10cmFuc2Zvcm06IHJvdGF0ZVkoMzYwZGVnKTtcbiAgfVxufVxuQGtleWZyYW1lcyBzcGluIHtcbiAgMTAwJSB7XG4gICAgLXdlYmtpdC10cmFuc2Zvcm06IHJvdGF0ZVkoMzYwZGVnKTtcbiAgICB0cmFuc2Zvcm06IHJvdGF0ZVkoMzYwZGVnKTtcbiAgfVxufVxuIl0sInNvdXJjZVJvb3QiOiIvc291cmNlLyJ9 */
diff --git a/vipra-ui/favicon/android-chrome-144x144.png b/vipra-ui/favicon/android-chrome-144x144.png
deleted file mode 100644
index 35fc4d1fbbe7cd92f8f5c8d106efc4b09968a5f0..0000000000000000000000000000000000000000
Binary files a/vipra-ui/favicon/android-chrome-144x144.png and /dev/null differ
diff --git a/vipra-ui/favicon/android-chrome-192x192.png b/vipra-ui/favicon/android-chrome-192x192.png
deleted file mode 100644
index edf00c720525dff80172704bf41ddeec61f151b8..0000000000000000000000000000000000000000
Binary files a/vipra-ui/favicon/android-chrome-192x192.png and /dev/null differ
diff --git a/vipra-ui/favicon/android-chrome-36x36.png b/vipra-ui/favicon/android-chrome-36x36.png
deleted file mode 100644
index b2dcce75b1aa62a00be07b99d3d00bbc43c86e18..0000000000000000000000000000000000000000
Binary files a/vipra-ui/favicon/android-chrome-36x36.png and /dev/null differ
diff --git a/vipra-ui/favicon/android-chrome-48x48.png b/vipra-ui/favicon/android-chrome-48x48.png
deleted file mode 100644
index a2f307cb300e37cfbdf6fe4e2a5e96c5ec090047..0000000000000000000000000000000000000000
Binary files a/vipra-ui/favicon/android-chrome-48x48.png and /dev/null differ
diff --git a/vipra-ui/favicon/android-chrome-72x72.png b/vipra-ui/favicon/android-chrome-72x72.png
deleted file mode 100644
index 4532e378a1bc95c519fb3c1b277895654e816060..0000000000000000000000000000000000000000
Binary files a/vipra-ui/favicon/android-chrome-72x72.png and /dev/null differ
diff --git a/vipra-ui/favicon/android-chrome-96x96.png b/vipra-ui/favicon/android-chrome-96x96.png
deleted file mode 100644
index b80b7a1ea0c51657850f6a921bd7d6f86c32bd77..0000000000000000000000000000000000000000
Binary files a/vipra-ui/favicon/android-chrome-96x96.png and /dev/null differ
diff --git a/vipra-ui/favicon/apple-touch-icon-114x114.png b/vipra-ui/favicon/apple-touch-icon-114x114.png
deleted file mode 100644
index de086270b88f2472f5df996e5dec702409e84f37..0000000000000000000000000000000000000000
Binary files a/vipra-ui/favicon/apple-touch-icon-114x114.png and /dev/null differ
diff --git a/vipra-ui/favicon/apple-touch-icon-120x120.png b/vipra-ui/favicon/apple-touch-icon-120x120.png
deleted file mode 100644
index 4e5b2035822991992c2d22db2a7a09b6e3150134..0000000000000000000000000000000000000000
Binary files a/vipra-ui/favicon/apple-touch-icon-120x120.png and /dev/null differ
diff --git a/vipra-ui/favicon/apple-touch-icon-144x144.png b/vipra-ui/favicon/apple-touch-icon-144x144.png
deleted file mode 100644
index e46a3605acd1729eafa48332e21e38b645286073..0000000000000000000000000000000000000000
Binary files a/vipra-ui/favicon/apple-touch-icon-144x144.png and /dev/null differ
diff --git a/vipra-ui/favicon/apple-touch-icon-152x152.png b/vipra-ui/favicon/apple-touch-icon-152x152.png
deleted file mode 100644
index b5cf5b09157af3268cccc109a36398e33ca71580..0000000000000000000000000000000000000000
Binary files a/vipra-ui/favicon/apple-touch-icon-152x152.png and /dev/null differ
diff --git a/vipra-ui/favicon/apple-touch-icon-180x180.png b/vipra-ui/favicon/apple-touch-icon-180x180.png
deleted file mode 100644
index bc2b1c0e1905c6ee157b55d52641bce1ccf77090..0000000000000000000000000000000000000000
Binary files a/vipra-ui/favicon/apple-touch-icon-180x180.png and /dev/null differ
diff --git a/vipra-ui/favicon/apple-touch-icon-57x57.png b/vipra-ui/favicon/apple-touch-icon-57x57.png
deleted file mode 100644
index 06f1cff1143a12e78c6b462b01f81942bfc3b3e3..0000000000000000000000000000000000000000
Binary files a/vipra-ui/favicon/apple-touch-icon-57x57.png and /dev/null differ
diff --git a/vipra-ui/favicon/apple-touch-icon-60x60.png b/vipra-ui/favicon/apple-touch-icon-60x60.png
deleted file mode 100644
index d6d718bb57b578523b1eb2736e023708c3829aae..0000000000000000000000000000000000000000
Binary files a/vipra-ui/favicon/apple-touch-icon-60x60.png and /dev/null differ
diff --git a/vipra-ui/favicon/apple-touch-icon-72x72.png b/vipra-ui/favicon/apple-touch-icon-72x72.png
deleted file mode 100644
index 39078d9b4a0252002432dc9234a8bc6d62a55e1f..0000000000000000000000000000000000000000
Binary files a/vipra-ui/favicon/apple-touch-icon-72x72.png and /dev/null differ
diff --git a/vipra-ui/favicon/apple-touch-icon-76x76.png b/vipra-ui/favicon/apple-touch-icon-76x76.png
deleted file mode 100644
index 6b2e781056e2e135341c00f512bb81cf08026712..0000000000000000000000000000000000000000
Binary files a/vipra-ui/favicon/apple-touch-icon-76x76.png and /dev/null differ
diff --git a/vipra-ui/favicon/apple-touch-icon-precomposed.png b/vipra-ui/favicon/apple-touch-icon-precomposed.png
deleted file mode 100644
index 75b1b793c1e298934b0b241dab4fe0248699103c..0000000000000000000000000000000000000000
Binary files a/vipra-ui/favicon/apple-touch-icon-precomposed.png and /dev/null differ
diff --git a/vipra-ui/favicon/apple-touch-icon.png b/vipra-ui/favicon/apple-touch-icon.png
deleted file mode 100644
index bc2b1c0e1905c6ee157b55d52641bce1ccf77090..0000000000000000000000000000000000000000
Binary files a/vipra-ui/favicon/apple-touch-icon.png and /dev/null differ
diff --git a/vipra-ui/favicon/browserconfig.xml b/vipra-ui/favicon/browserconfig.xml
deleted file mode 100644
index 9ecd35003349383dc5417fe45d5b97a8842f3541..0000000000000000000000000000000000000000
--- a/vipra-ui/favicon/browserconfig.xml
+++ /dev/null
@@ -1,12 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<browserconfig>
-  <msapplication>
-    <tile>
-      <square70x70logo src="/favicon/mstile-70x70.png"/>
-      <square150x150logo src="/favicon/mstile-150x150.png"/>
-      <square310x310logo src="/favicon/mstile-310x310.png"/>
-      <wide310x150logo src="/favicon/mstile-310x150.png"/>
-      <TileColor>#da532c</TileColor>
-    </tile>
-  </msapplication>
-</browserconfig>
diff --git a/vipra-ui/favicon/favicon-16x16.png b/vipra-ui/favicon/favicon-16x16.png
deleted file mode 100644
index cd9277e981ffaca17b3010e74baeb0861fd0bb2f..0000000000000000000000000000000000000000
Binary files a/vipra-ui/favicon/favicon-16x16.png and /dev/null differ
diff --git a/vipra-ui/favicon/favicon-32x32.png b/vipra-ui/favicon/favicon-32x32.png
deleted file mode 100644
index ac93ee5254e126147384f6a6f30578ee2a9f42a3..0000000000000000000000000000000000000000
Binary files a/vipra-ui/favicon/favicon-32x32.png and /dev/null differ
diff --git a/vipra-ui/favicon/favicon-96x96.png b/vipra-ui/favicon/favicon-96x96.png
deleted file mode 100644
index 66e04f1997bd50b225757701610f394cb26e5e0e..0000000000000000000000000000000000000000
Binary files a/vipra-ui/favicon/favicon-96x96.png and /dev/null differ
diff --git a/vipra-ui/favicon/favicon.ico b/vipra-ui/favicon/favicon.ico
deleted file mode 100644
index 6444887cb42005b7163bb67e6ad9750e6a2bd8bf..0000000000000000000000000000000000000000
Binary files a/vipra-ui/favicon/favicon.ico and /dev/null differ
diff --git a/vipra-ui/favicon/manifest.json b/vipra-ui/favicon/manifest.json
deleted file mode 100644
index cab1e0a2b8a78dee0d05770b9cbb6a3eec6830a9..0000000000000000000000000000000000000000
--- a/vipra-ui/favicon/manifest.json
+++ /dev/null
@@ -1,41 +0,0 @@
-{
-	"name": "Vipra",
-	"icons": [
-		{
-			"src": "\/favicon\/android-chrome-36x36.png",
-			"sizes": "36x36",
-			"type": "image\/png",
-			"density": 0.75
-		},
-		{
-			"src": "\/favicon\/android-chrome-48x48.png",
-			"sizes": "48x48",
-			"type": "image\/png",
-			"density": 1
-		},
-		{
-			"src": "\/favicon\/android-chrome-72x72.png",
-			"sizes": "72x72",
-			"type": "image\/png",
-			"density": 1.5
-		},
-		{
-			"src": "\/favicon\/android-chrome-96x96.png",
-			"sizes": "96x96",
-			"type": "image\/png",
-			"density": 2
-		},
-		{
-			"src": "\/favicon\/android-chrome-144x144.png",
-			"sizes": "144x144",
-			"type": "image\/png",
-			"density": 3
-		},
-		{
-			"src": "\/favicon\/android-chrome-192x192.png",
-			"sizes": "192x192",
-			"type": "image\/png",
-			"density": 4
-		}
-	]
-}
diff --git a/vipra-ui/favicon/mstile-144x144.png b/vipra-ui/favicon/mstile-144x144.png
deleted file mode 100644
index f10800b99bcd049b06d3832091a7ce793220c682..0000000000000000000000000000000000000000
Binary files a/vipra-ui/favicon/mstile-144x144.png and /dev/null differ
diff --git a/vipra-ui/favicon/mstile-150x150.png b/vipra-ui/favicon/mstile-150x150.png
deleted file mode 100644
index 7acea22fab7e04fd351fb2ab3698de0f355b8d0a..0000000000000000000000000000000000000000
Binary files a/vipra-ui/favicon/mstile-150x150.png and /dev/null differ
diff --git a/vipra-ui/favicon/mstile-310x150.png b/vipra-ui/favicon/mstile-310x150.png
deleted file mode 100644
index 65a1916cd2595592b5fa740ae407309755c6fc69..0000000000000000000000000000000000000000
Binary files a/vipra-ui/favicon/mstile-310x150.png and /dev/null differ
diff --git a/vipra-ui/favicon/mstile-310x310.png b/vipra-ui/favicon/mstile-310x310.png
deleted file mode 100644
index 11738d66dceb8156eefd73c72595f0673c2ce6c0..0000000000000000000000000000000000000000
Binary files a/vipra-ui/favicon/mstile-310x310.png and /dev/null differ
diff --git a/vipra-ui/favicon/mstile-70x70.png b/vipra-ui/favicon/mstile-70x70.png
deleted file mode 100644
index 71b9f8901a61b41bafc6ad8d90633591b8200a92..0000000000000000000000000000000000000000
Binary files a/vipra-ui/favicon/mstile-70x70.png and /dev/null differ
diff --git a/vipra-ui/favicon/safari-pinned-tab.svg b/vipra-ui/favicon/safari-pinned-tab.svg
deleted file mode 100644
index e8228a317e06bbb96fe61b8f8273f7bd20214b22..0000000000000000000000000000000000000000
--- a/vipra-ui/favicon/safari-pinned-tab.svg
+++ /dev/null
@@ -1,37 +0,0 @@
-<?xml version="1.0" standalone="no"?>
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 20010904//EN"
- "http://www.w3.org/TR/2001/REC-SVG-20010904/DTD/svg10.dtd">
-<svg version="1.0" xmlns="http://www.w3.org/2000/svg"
- width="1000.000000pt" height="1000.000000pt" viewBox="0 0 1000.000000 1000.000000"
- preserveAspectRatio="xMidYMid meet">
-<metadata>
-Created by potrace 1.11, written by Peter Selinger 2001-2013
-</metadata>
-<g transform="translate(0.000000,1000.000000) scale(0.100000,-0.100000)"
-fill="#000000" stroke="none">
-<path d="M9935 8020 c-33 -15 -217 -101 -410 -190 -192 -89 -392 -182 -444
--206 -51 -24 -95 -44 -96 -44 -2 0 -60 -27 -130 -60 -70 -33 -128 -60 -130
--60 -2 0 -46 -20 -97 -44 -51 -24 -118 -55 -148 -69 -67 -31 -578 -267 -675
--312 -38 -18 -272 -126 -520 -240 -548 -253 -534 -246 -674 -312 -62 -29 -115
--53 -117 -53 -2 0 -60 -27 -130 -60 -69 -33 -128 -60 -130 -60 -2 0 -60 -27
--130 -60 -69 -33 -128 -60 -129 -60 -2 0 -39 -16 -82 -36 -143 -67 -217 -101
--298 -139 -44 -20 -163 -75 -265 -122 -102 -47 -217 -100 -257 -119 l-72 -33
--813 375 c-919 425 -847 391 -1113 514 -110 50 -242 112 -294 136 -51 24 -95
-44 -97 44 -2 0 -45 20 -96 44 -51 24 -120 56 -153 71 -96 44 -175 80 -245 113
--78 36 -442 204 -520 240 -30 13 -118 54 -195 89 -77 36 -187 87 -245 113 -58
-26 -143 66 -190 88 -47 22 -139 64 -205 95 -66 30 -149 68 -185 85 -306 142
--634 291 -636 289 -2 -2 87 -113 197 -247 448 -547 1051 -1282 1154 -1410 61
--74 120 -146 132 -160 80 -96 137 -165 188 -230 33 -41 62 -77 65 -80 3 -3 77
--93 165 -200 88 -107 162 -197 165 -200 3 -3 43 -52 90 -110 47 -58 92 -114
-102 -125 15 -18 238 -290 516 -630 63 -77 130 -158 148 -180 18 -22 121 -148
-229 -280 108 -132 219 -267 247 -300 27 -33 55 -67 61 -75 39 -48 252 -309
-270 -330 12 -14 40 -47 61 -75 22 -27 48 -58 57 -70 19 -22 131 -158 488 -594
-128 -157 247 -302 263 -321 16 -19 109 -133 206 -252 l177 -217 21 22 c12 12
-188 225 390 472 432 527 822 1003 869 1060 18 22 234 285 479 585 246 300 462
-563 480 585 19 22 210 256 426 520 216 264 414 505 439 535 26 30 73 89 106
-130 33 41 63 77 66 80 4 3 32 37 63 75 70 87 43 53 290 355 115 140 225 275
-246 300 21 25 104 126 185 225 81 99 162 198 181 220 18 22 90 110 159 195 70
-85 134 164 143 175 10 11 89 108 176 215 139 169 217 265 274 333 18 21 20 21
--53 -13z"/>
-</g>
-</svg>
diff --git a/vipra-ui/gulpfile.js b/vipra-ui/gulpfile.js
index 84c266cf4eedf06a70c04decd3931e34d613701f..20da5abcda1dd2966ca625304963f444ad1ecd22 100644
--- a/vipra-ui/gulpfile.js
+++ b/vipra-ui/gulpfile.js
@@ -1,24 +1,82 @@
 var gulp = require('gulp'),
     less = require('gulp-less'),
+    concat = require('gulp-concat'),
+    uglify = require('gulp-uglify'),
     cssnano = require('gulp-cssnano'),
-    webserver = require('gulp-webserver'),
-    sourcemaps = require('gulp-sourcemaps');
+    webserver = require('gulp-webserver');
+
+var assets = {
+  js: [
+    'bower_components/jquery/dist/jquery.min.js',
+    'bower_components/angular/angular.min.js',
+    'bower_components/angular-resource/angular-resource.min.js',
+    'bower_components/angular-ui-router/release/angular-ui-router.min.js',
+    'bower_components/bootstrap/dist/js/bootstrap.min.js'
+  ],
+  css: [
+    'bower_components/bootstrap/dist/css/bootstrap.min.css'
+  ],
+  fonts: [
+    'bower_components/bootstrap/dist/fonts/*'
+  ],
+  img: []
+};
 
 gulp.task('less', function() {
-  gulp.src('css/**/*.less')
-      .pipe(sourcemaps.init())
+  gulp.src('app/less/**/*.less')
       .pipe(less())
+      .pipe(gulp.dest('public/css'));
+});
+
+gulp.task('js', function() {
+  gulp.src('app/js/**/*.js')
+      .pipe(concat('app.js'))
+      .pipe(gulp.dest('public/js'));
+});
+
+gulp.task('html', function() {
+  gulp.src('app/index.html')
+      .pipe(gulp.dest('public'));
+  gulp.src(['app/html/**/*.html'])
+      .pipe(gulp.dest('public/html'));
+});
+
+gulp.task('img', function() {
+  gulp.src('app/img/**/*.*')
+      .pipe(gulp.dest('public/img'));
+});
+
+gulp.task('public', function() {
+  gulp.src('app/public/**/*')
+      .pipe(gulp.dest('public'));
+});
+
+gulp.task('assets', function() {
+  gulp.src(assets.js)
+      .pipe(concat('vendor.js'))
+      .pipe(uglify())
+      .pipe(gulp.dest('public/js'));
+  gulp.src(assets.css)
+      .pipe(concat('vendor.css'))
       .pipe(cssnano())
-      .pipe(sourcemaps.write())
-      .pipe(gulp.dest('css'));
+      .pipe(gulp.dest('public/css'));
+  gulp.src(assets.fonts)
+      .pipe(gulp.dest('public/fonts'));
+  gulp.src(assets.img)
+      .pipe(gulp.dest('public/img'));
 });
 
+gulp.task('build', ['less', 'js', 'html', 'img', 'public', 'assets']);
+
 gulp.task('watch', function() {
-  gulp.watch('css/app.less', ['less']);
+  gulp.watch('app/less/**/*.less', ['less']);
+  gulp.watch('app/js/**/*.js', ['js']);
+  gulp.watch(['app/index.html', 'app/html/**/*.html'], ['html']);
+  gulp.watch('app/public/**/*', ['public']);
 });
 
 gulp.task('server', function() {
-  gulp.src('.')
+  gulp.src('public')
       .pipe(webserver({
         open: true,
         port: 4200,
diff --git a/vipra-ui/index.html b/vipra-ui/index.html
deleted file mode 100644
index b6c4dc9a970d37a971ee8700bd30ddbd0e817878..0000000000000000000000000000000000000000
--- a/vipra-ui/index.html
+++ /dev/null
@@ -1,81 +0,0 @@
-<!DOCTYPE html>
-<html lang="en" ng-app="vipra.app">
-  <head>
-    <meta charset="utf-8">
-    <meta http-equiv="X-UA-Compatible" content="IE=edge">
-    <meta name="viewport" content="width=device-width, initial-scale=1">
-    <title>Vipra</title>
-
-    <link rel="apple-touch-icon" sizes="57x57" href="/favicon/apple-touch-icon-57x57.png">
-    <link rel="apple-touch-icon" sizes="60x60" href="/favicon/apple-touch-icon-60x60.png">
-    <link rel="apple-touch-icon" sizes="72x72" href="/favicon/apple-touch-icon-72x72.png">
-    <link rel="apple-touch-icon" sizes="76x76" href="/favicon/apple-touch-icon-76x76.png">
-    <link rel="apple-touch-icon" sizes="114x114" href="/favicon/apple-touch-icon-114x114.png">
-    <link rel="apple-touch-icon" sizes="120x120" href="/favicon/apple-touch-icon-120x120.png">
-    <link rel="apple-touch-icon" sizes="144x144" href="/favicon/apple-touch-icon-144x144.png">
-    <link rel="apple-touch-icon" sizes="152x152" href="/favicon/apple-touch-icon-152x152.png">
-    <link rel="apple-touch-icon" sizes="180x180" href="/favicon/apple-touch-icon-180x180.png">
-    <link rel="icon" type="image/png" href="/favicon/favicon-32x32.png" sizes="32x32">
-    <link rel="icon" type="image/png" href="/favicon/android-chrome-192x192.png" sizes="192x192">
-    <link rel="icon" type="image/png" href="/favicon/favicon-96x96.png" sizes="96x96">
-    <link rel="icon" type="image/png" href="/favicon/favicon-16x16.png" sizes="16x16">
-    <link rel="manifest" href="/favicon/manifest.json">
-    <link rel="mask-icon" href="/favicon/safari-pinned-tab.svg" color="#5bbad5">
-    <link rel="shortcut icon" href="/favicon/favicon.ico">
-    <meta name="msapplication-TileColor" content="#da532c">
-    <meta name="msapplication-TileImage" content="/favicon/mstile-144x144.png">
-    <meta name="msapplication-config" content="/favicon/browserconfig.xml">
-    <meta name="theme-color" content="#ffffff">
-
-    <!-- stylesheets -->
-    <link href="bower_components/bootstrap/dist/css/bootstrap.min.css" rel="stylesheet">
-    <link href="css/app.css" rel="stylesheet">
-
-    <!-- javascript -->
-    <script src="bower_components/jquery/dist/jquery.min.js"></script>
-    <script src="bower_components/angular/angular.min.js"></script>
-    <script src="bower_components/angular-resource/angular-resource.min.js"></script>
-    <script src="bower_components/angular-ui-router/release/angular-ui-router.min.js"></script>
-    <script src="bower_components/bootstrap/dist/js/bootstrap.min.js"></script>
-    <script src="js/app.js"></script>
-    <script src="js/controllers.js"></script>
-    <script src="js/directives.js"></script>
-    <script src="js/factories.js"></script>
-    <script src="js/filters.js"></script>
-    <script src="js/helpers.js"></script>
-    <script src="js/services.js"></script>
-  </head>
-  <body>
-    <nav class="navbar navbar-default navbar-static-top">
-      <div class="container-fluid">
-        <!-- Brand and toggle get grouped for better mobile display -->
-        <div class="navbar-header">
-          <button type="button" class="navbar-toggle collapsed" data-toggle="collapse" data-target="#vipra-navbar-collapse-1" aria-expanded="false">
-            <span class="sr-only">Toggle navigation</span>
-            <span class="icon-bar"></span>
-            <span class="icon-bar"></span>
-            <span class="icon-bar"></span>
-          </button>
-          <a ui-sref="index" class="navbar-brand" ng-class="{spin:loading.any}"></a>
-        </div>
-
-        <!-- Collect the nav links, forms, and other content for toggling -->
-        <div class="collapse navbar-collapse" id="vipra-navbar-collapse-1">
-          <ul class="nav navbar-nav">
-            <li ui-sref-active="active"><a ui-sref="articles.index">Articles</a></li>
-            <li ui-sref-active="active"><a ui-sref="topics.index">Topics</a></li>
-            <li ui-sref-active="active"><a ui-sref="words.index">Words</a></li>
-            <div id="testi"></div>
-          </ul>
-        </div><!-- /.navbar-collapse -->
-      </div><!-- /.container-fluid -->
-    </nav>
-
-    <div class="container" ui-view></div>
-
-    <footer class="footer navbar-default">
-      <div class="container-fluid">
-      </div>
-    </footer>
-  </body>
-</html>
\ No newline at end of file
diff --git a/vipra-ui/package.json b/vipra-ui/package.json
index 330c6ea849b29a919ba5e850c676cf886092d808..bc23c8b4d62be957580b6e7a5dfaf1625b1739ff 100644
--- a/vipra-ui/package.json
+++ b/vipra-ui/package.json
@@ -6,10 +6,12 @@
   "private": true,
   "devDependencies": {
     "gulp": "^3.9.0",
+    "gulp-concat": "^2.6.0",
     "gulp-cssnano": "^2.1.0",
     "gulp-include": "^2.1.0",
     "gulp-less": "^3.0.5",
     "gulp-sourcemaps": "^1.6.0",
+    "gulp-uglify": "^1.5.1",
     "gulp-webserver": "^0.9.1"
   }
 }