diff --git a/vipra-ui/app/html/about.html b/vipra-ui/app/html/about.html
index d84cf03509d831517129befc3076fbca0c7f7df7..906d38376f29b546ff384c41cb3f926011aa8254 100644
--- a/vipra-ui/app/html/about.html
+++ b/vipra-ui/app/html/about.html
@@ -2,33 +2,19 @@
   <div class="page-header">
     <h1>About</h1>
   </div>
-
   <p><strong>Vipra</strong></p>
-
   <p>Created by Eike Cochu</p>
-  
   <h3>Description</h3>
-
   <p>The Vipra application is a topic modeling based search system with a frontend web application, a backend REST service and a maintenance tool for data import and modeling. It attempts to leverage automatically discovered topic informations in document collections to ease collection browsing and organization. The search system relies on ElasticSearch and Apache Lucene.</p>
-
   <p>This application was created by Eike Cochu for his master's degree thesis in computer science, 2015-2016 at the Freie Universit&auml;t in Berlin, Germany.</p>
-  
   <h3>License</h3>
-
   <p>The MIT License (MIT)</p>
-
   <p>Copyright 2016 Eike Cochu</p>
-
   <p>Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:</p>
-
   <p>The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.</p>
-
   <p>THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.</p>
-
   <hr>
-
   <h3>Version</h3>
-
   <table class="table table-bordered table-fixed">
     <tbody>
       <tr>
@@ -45,9 +31,7 @@
       </tr>
     </tbody>
   </table>
-  
   <h3>Host</h3>
-
   <table class="table table-bordered table-fixed">
     <tbody>
       <tr>
@@ -64,9 +48,7 @@
       </tr>
     </tbody>
   </table>
-  
   <h3>VM</h3>
-
   <table class="table table-bordered table-fixed">
     <tbody>
       <tr>
@@ -79,9 +61,7 @@
       </tr>
     </tbody>
   </table>
-
   <h3>Database</h3>
-
   <table class="table table-bordered table-fixed">
     <tbody>
       <tr>
@@ -98,9 +78,7 @@
       </tr>
     </tbody>
   </table>
-
   <h3>Configuration</h3>
-
   <table class="table table-bordered table-fixed">
     <tbody>
       <tr>
@@ -117,9 +95,7 @@
       </tr>
     </tbody>
   </table>
-
   <h3>Constants</h3>
-
   <table class="table table-bordered table-fixed">
     <tbody>
       <tr>
@@ -177,7 +153,7 @@
       </tr>
       <tr class="well">
         <td colspan="2">
-          The resulting likeliness precision of topic words. 
+          The resulting likeliness precision of topic words.
         </td>
       </tr>
       <tr>
@@ -262,5 +238,4 @@
     </tbody>
   </table>
 </div>
-
-<div ng-cloak ui-view></div>
\ No newline at end of file
+<div ng-cloak ui-view></div>
diff --git a/vipra-ui/app/html/articles/index.html b/vipra-ui/app/html/articles/index.html
index f30bfbbc44e085411a99750e1e910c0abd1d3a3f..85f4e3b1447fe2dc409edd3dda43a48e2029fb3d 100644
--- a/vipra-ui/app/html/articles/index.html
+++ b/vipra-ui/app/html/articles/index.html
@@ -1,6 +1,7 @@
 <div ng-cloak ng-hide="$state.current.name !== 'articles'">
   <div class="text-muted">
-    Found <ng-pluralize count="articlesTotal||0" when="{0:'no articles',1:'1 article',other:'{} articles'}"></ng-pluralize> in the database.
+    Found
+    <ng-pluralize count="articlesTotal||0" when="{0:'no articles',1:'1 article',other:'{} articles'}"></ng-pluralize> in the database.
     <span ng-show="articlesTotal">
       Sort by
       <ol class="nya-bs-select nya-bs-condensed" ng-model="sort" ng-model-store="sort" ng-model-default="'date'">
@@ -14,19 +15,14 @@
         <li value="-" class="nya-bs-option"><a>Descending</a></li>
       </ol>
     </span>
-    <br>
-    Page <span ng-bind="page||1"></span> of <span ng-bind="maxPage||1"></span>.
+    <br> Page <span ng-bind="page||1"></span> of <span ng-bind="maxPage||1"></span>.
   </div>
-
-  <pagination total="articlesTotal" page="page" limit="limit" change="changePage"/>
-
+  <pagination total="articlesTotal" page="page" limit="limit" change="changePage" />
   <ol ng-attr-start="{{(page-1)*limit+1}}">
     <li ng-repeat="article in articles">
       <a ui-sref="articles.show({id: article.id})" ng-bind="::article.title"></a>
     </li>
   </ol>
-
-  <pagination total="articlesTotal" page="page" limit="limit"/>
+  <pagination total="articlesTotal" page="page" limit="limit" />
 </div>
-
-<div ng-cloak ui-view></div>
\ No newline at end of file
+<div ng-cloak ui-view></div>
diff --git a/vipra-ui/app/html/articles/show.html b/vipra-ui/app/html/articles/show.html
index 06d1e784d9b2b44aa0451432ac1c948c82c2a55a..3d0c7e94a199ecbe1bcd32f685c97990b7599e41 100644
--- a/vipra-ui/app/html/articles/show.html
+++ b/vipra-ui/app/html/articles/show.html
@@ -1,7 +1,6 @@
 <div ng-cloak ng-hide="$state.current.name !== 'articles.show'">
   <div class="page-header">
     <h1 ng-bind="::article.title"></h1>
-
     <table class="item-actions">
       <tr>
         <td>
@@ -12,9 +11,7 @@
       </tr>
     </table>
   </div>
-
   <h3>Info <hide-link target="#info"/></h3>
-
   <div class="row" id="info">
     <div class="col-md-12">
       <table class="table table-bordered table-condensed table-fixed table-infos">
@@ -52,9 +49,7 @@
       </table>
     </div>
   </div>
-
   <h3>Topics <hide-link target="#topics"/></h3>
-
   <div class="row" id="topics">
     <div class="col-md-5">
       <table class="table table-morecondensed" ng-show="article.topics.length > 0">
@@ -68,7 +63,7 @@
         </tr>
         <tr ng-repeat="topic in article.topics | orderBy:topicSort:topicSortRev">
           <td>
-            <topic-link topic="topic.topic"/>
+            <topic-link topic="topic.topic" />
           </td>
           <td class="text-right" ng-bind-template="{{(topic.share*100).toFixed(1)}}%"></td>
         </tr>
@@ -79,9 +74,7 @@
       <div class="pie-chart" id="topic-share" highcharts="topicShare"></div>
     </div>
   </div>
-
   <hr>
   <p ng-bind-html="::article.text" class="text-justify"></p>
 </div>
-
-<div ng-cloak ui-view></div>
\ No newline at end of file
+<div ng-cloak ui-view></div>
diff --git a/vipra-ui/app/html/directives/alert.html b/vipra-ui/app/html/directives/alert.html
index 441726d4f24504505d8be94a5b8b05f3a65808e4..97d850995dbbfd2b1c6e65dd2eb0da4c49a62cb0 100644
--- a/vipra-ui/app/html/directives/alert.html
+++ b/vipra-ui/app/html/directives/alert.html
@@ -3,4 +3,4 @@
     <span aria-hidden="true">&times;</span>
   </button>
   <ng-transclude/>
-</div>
\ No newline at end of file
+</div>
diff --git a/vipra-ui/app/html/directives/checkbox.html b/vipra-ui/app/html/directives/checkbox.html
index 86e0cf2d8141e40eb9e480eec15b933e4df57daf..b951ed8d7d15c6926e025ea7ed839e7b5213f2f1 100644
--- a/vipra-ui/app/html/directives/checkbox.html
+++ b/vipra-ui/app/html/directives/checkbox.html
@@ -1,3 +1,2 @@
 <input type="checkbox" ng-model="ngModel" style="display:none">
-
-<span class="glyphicon" ng-class="{'glyphicon-unchecked':!ngModel,'glyphicon-check':ngModel}" ng-click="ngModel=!ngModel"></span>
\ No newline at end of file
+<span class="glyphicon" ng-class="{'glyphicon-unchecked':!ngModel,'glyphicon-check':ngModel}" ng-click="ngModel=!ngModel"></span>
diff --git a/vipra-ui/app/html/directives/dropdown.html b/vipra-ui/app/html/directives/dropdown.html
index 1da0a98057040bb994b498560bc7b3b177e9f2e2..70c61a654a796ba0d342a3c2e70ca164a472525b 100644
--- a/vipra-ui/app/html/directives/dropdown.html
+++ b/vipra-ui/app/html/directives/dropdown.html
@@ -4,4 +4,4 @@
     <span class="caret"></span>
   </button>
   <ul ng-attr-class="{{'dropdown-menu ' + align}}" ng-attr-aria-labelledby="{{dropdownId}}" ng-transclude></ul>
-</div>
\ No newline at end of file
+</div>
diff --git a/vipra-ui/app/html/directives/pagination.html b/vipra-ui/app/html/directives/pagination.html
index 2f38a4f4d0a71f0f767863b13a47328dcdbcb6b6..adc925d454da75bb8ebd099c2ae5574d7dc92435 100644
--- a/vipra-ui/app/html/directives/pagination.html
+++ b/vipra-ui/app/html/directives/pagination.html
@@ -25,4 +25,4 @@
       <a ng-click="toPage()">Page...</a>
     </li>
   </ul>
-</nav>
\ No newline at end of file
+</nav>
diff --git a/vipra-ui/app/html/index.html b/vipra-ui/app/html/index.html
index 833c9fccfcd6fe90b73a8fc4ac6da439044cf08f..7124f615c719368c20de272ca3638d043e9e436b 100644
--- a/vipra-ui/app/html/index.html
+++ b/vipra-ui/app/html/index.html
@@ -4,7 +4,6 @@
       <div class="heading"></div>
     </div>
   </div>
-
   <div class="row" ng-hide="search">
     <div class="col-md-6 text-center">
       <h4>Latest articles</h4>
@@ -31,13 +30,11 @@
       </ul>
     </div>
   </div>
-
   <div class="row row-spaced">
     <div class="col-md-12">
       <input type="text" class="form-control input-lg" placeholder="Search..." ng-model="search" ng-model-options="{debounce:500}">
     </div>
   </div>
-
   <div class="row row-spaced">
     <div class="text-center" ng-show="searching">
       Searching...
@@ -60,5 +57,4 @@
     </div>
   </div>
 </div>
-
-<div ng-cloak ui-view></div>
\ No newline at end of file
+<div ng-cloak ui-view></div>
diff --git a/vipra-ui/app/html/network.html b/vipra-ui/app/html/network.html
index 431188c673e36bff7cbeac9a8f128fe7e4cafeac..6d933364f6742036cddb10b081943f04c15dd159 100644
--- a/vipra-ui/app/html/network.html
+++ b/vipra-ui/app/html/network.html
@@ -14,5 +14,4 @@
     <div class="fullsize navpadding" id="visgraph"></div>
   </div>
 </div>
-
-<div ng-cloak ui-view></div>
\ No newline at end of file
+<div ng-cloak ui-view></div>
diff --git a/vipra-ui/app/html/topics/articles.html b/vipra-ui/app/html/topics/articles.html
index 2818921cda1a2cf80db1614a12885872bcc802a5..a165d374ade675cc7087b9b91d80be9f6c20507c 100644
--- a/vipra-ui/app/html/topics/articles.html
+++ b/vipra-ui/app/html/topics/articles.html
@@ -1,7 +1,6 @@
 <div ng-cloak ng-hide="$state.current.name !== 'topics.show.articles'">
   <div class="page-header">
     <h1 ng-bind-template="Articles for topic '{{::topic.name}}'"></h1>
-
     <table class="item-actions">
       <tr>
         <td>
@@ -10,9 +9,9 @@
       </tr>
     </table>
   </div>
-  
   <div class="text-muted">
-    Found <ng-pluralize count="articlesTotal||0" when="{0:'no articles',1:'1 article',other:'{} articles'}"></ng-pluralize> in the database.
+    Found
+    <ng-pluralize count="articlesTotal||0" when="{0:'no articles',1:'1 article',other:'{} articles'}"></ng-pluralize> in the database.
     <span ng-show="articlesTotal">
       Sort by
       <ol class="nya-bs-select nya-bs-condensed" ng-model="sort" ng-model-store="sort" ng-model-default="'date'">
@@ -26,19 +25,14 @@
         <li value="-" class="nya-bs-option"><a>Descending</a></li>
       </ol>
     </span>
-    <br>
-    Page <span ng-bind="page||1"></span> of <span ng-bind="maxPage||1"></span>.
+    <br> Page <span ng-bind="page||1"></span> of <span ng-bind="maxPage||1"></span>.
   </div>
-
-  <pagination total="articlesTotal" page="page" limit="limit" change="changePage"/>
-
+  <pagination total="articlesTotal" page="page" limit="limit" change="changePage" />
   <ol ng-attr-start="{{(page-1)*limit+1}}">
     <li ng-repeat="article in articles">
       <a ui-sref="articles.show({id: article.id})" ng-bind="::article.title"></a>
     </li>
   </ol>
-
-  <pagination total="articlesTotal" page="page" limit="limit"/>
+  <pagination total="articlesTotal" page="page" limit="limit" />
 </div>
-
-<div ng-cloak ui-view></div>
\ No newline at end of file
+<div ng-cloak ui-view></div>
diff --git a/vipra-ui/app/html/topics/index.html b/vipra-ui/app/html/topics/index.html
index b4273145dfc78a05af30d7a6e22f19a8c7627f48..c181b8328d97b3c75929bf631a4f8e113204070a 100644
--- a/vipra-ui/app/html/topics/index.html
+++ b/vipra-ui/app/html/topics/index.html
@@ -1,6 +1,7 @@
 <div ng-cloak ng-hide="$state.current.name !== 'topics'">
   <div class="text-muted">
-    Found <ng-pluralize count="topicsTotal||0" when="{0:'no topics',1:'1 topic',other:'{} topics'}"></ng-pluralize> in the database.
+    Found
+    <ng-pluralize count="topicsTotal||0" when="{0:'no topics',1:'1 topic',other:'{} topics'}"></ng-pluralize> in the database.
     <span ng-show="topicsTotal">
       Sort by
       <ol class="nya-bs-select nya-bs-condensed" ng-model="sort">
@@ -13,19 +14,14 @@
         <li value="-" class="nya-bs-option"><a>Descending</a></li>
       </ol>
     </span>
-    <br>
-    Page <span ng-bind="page||1"></span> of <span ng-bind="maxPage||1"></span>.
+    <br> Page <span ng-bind="page||1"></span> of <span ng-bind="maxPage||1"></span>.
   </div>
-
-  <pagination total="topicsTotal" page="page" limit="limit" change="changePage"/>
-
+  <pagination total="topicsTotal" page="page" limit="limit" change="changePage" />
   <ol ng-attr-start="{{(page-1)*limit+1}}">
     <li ng-repeat="topic in topics">
       <a ui-sref="topics.show({id: topic.id})">{{topic.name}}</a>
     </li>
   </ol>
-
-  <pagination total="topicsTotal" page="page" limit="limit"/>
+  <pagination total="topicsTotal" page="page" limit="limit" />
 </div>
-
-<div ng-cloak ui-view></div>
\ No newline at end of file
+<div ng-cloak ui-view></div>
diff --git a/vipra-ui/app/html/topics/show.html b/vipra-ui/app/html/topics/show.html
index 0d31e783341113bb7949f82417f347cf6c23ac78..d0cdb176810f510bc0d25269cf41a624d70afe0f 100644
--- a/vipra-ui/app/html/topics/show.html
+++ b/vipra-ui/app/html/topics/show.html
@@ -14,11 +14,9 @@
         </div>
       </div>
     </h1>
-
     <bs-alert type="danger" ng-if="renameErrors">
       <span ng-bind-html="renameErrors"></span>
     </bs-alert>
-    
     <table class="item-actions">
       <tr>
         <td>
@@ -35,9 +33,7 @@
       </tr>
     </table>
   </div>
-
   <h3>Info <hide-link target="#info"/></h3>
-
   <div class="row" id="info">
     <div class="col-md-12">
       <table class="table table-bordered table-condensed table-fixed table-infos">
@@ -58,9 +54,7 @@
       </table>
     </div>
   </div>
-
   <h3>Words <hide-link target="#words"/></h3>
-
   <div class="row" id="words">
     <div class="col-md-12">
       <table class="table table-bordered table-condensed table-fixed">
@@ -76,7 +70,9 @@
         </thead>
         <tbody>
           <tr ng-repeat="word in topic.words | orderBy:wordSort:wordSortRev">
-            <td><a ui-sref="words.show({id:word.id})" ng-bind="word.id"></a></td>
+            <td>
+              <a ui-sref="words.show({id:word.id})" ng-bind="word.id"></a>
+            </td>
             <td ng-bind-template="{{word.likeliness.toFixed(6)}}"></td>
           </tr>
         </tbody>
@@ -84,5 +80,4 @@
     </div>
   </div>
 </div>
-
-<div ng-cloak ui-view></div>
\ No newline at end of file
+<div ng-cloak ui-view></div>
diff --git a/vipra-ui/app/html/words/index.html b/vipra-ui/app/html/words/index.html
index d89dba089efdb583f7b3145e8762c685205510a7..2875ec90232c6d7d26d213d44b899f18afac2ae4 100644
--- a/vipra-ui/app/html/words/index.html
+++ b/vipra-ui/app/html/words/index.html
@@ -1,6 +1,7 @@
 <div ng-cloak ng-hide="$state.current.name !== 'words'">
   <div class="text-muted">
-    Found <ng-pluralize count="wordsTotal||0" when="{0:'no words',1:'1 word',other:'{} words'}"></ng-pluralize> in the database.
+    Found
+    <ng-pluralize count="wordsTotal||0" when="{0:'no words',1:'1 word',other:'{} words'}"></ng-pluralize> in the database.
     <span ng-show="wordsTotal">
       Sort by
       <ol class="nya-bs-select nya-bs-condensed" ng-model="sort">
@@ -13,12 +14,9 @@
         <li value="-" class="nya-bs-option"><a>Descending</a></li>
       </ol>
     </span>
-    <br>
-    Page <span ng-bind="page||1"></span> of <span ng-bind="maxPage||1"></span>.
+    <br> Page <span ng-bind="page||1"></span> of <span ng-bind="maxPage||1"></span>.
   </div>
-
-  <pagination total="wordsTotal" page="page" limit="limit" change="changePage"/>
-
+  <pagination total="wordsTotal" page="page" limit="limit" change="changePage" />
   <div class="row">
     <div class="col-md-4">
       <ul class="list-unstyled">
@@ -42,8 +40,6 @@
       </ul>
     </div>
   </div>
-
-  <pagination total="wordsTotal" page="page" limit="limit"/>
+  <pagination total="wordsTotal" page="page" limit="limit" />
 </div>
-
-<div ng-cloak ui-view></div>
\ No newline at end of file
+<div ng-cloak ui-view></div>
diff --git a/vipra-ui/app/html/words/show.html b/vipra-ui/app/html/words/show.html
index d1ca723b17d991032cbd7df8eb0819cc4689f21c..11857549ded6b2930dcec8cd45104ec3a1da907d 100644
--- a/vipra-ui/app/html/words/show.html
+++ b/vipra-ui/app/html/words/show.html
@@ -2,9 +2,7 @@
   <div class="page-header">
     <h1 ng-bind="::word.id"></h1>
   </div>
-
   <h3>Info <hide-link target="#info"/></h3>
-
   <div class="row" id="info">
     <div class="col-md-12">
       <table class="table table-bordered table-condensed table-fixed table-infos">
@@ -17,18 +15,15 @@
       </table>
     </div>
   </div>
-
   <h3>Topics <hide-link target="#topics"/></h3>
-
   <div class="row" id="topics">
     <div class="col-md-12">
       <ol>
         <li ng-repeat="topic in ::topics">
-          <topic-link topic="topic"/>
+          <topic-link topic="topic" />
         </li>
       </ol>
     </div>
   </div>
 </div>
-
-<div ng-cloak ui-view></div>
\ No newline at end of file
+<div ng-cloak ui-view></div>
diff --git a/vipra-ui/app/index.html b/vipra-ui/app/index.html
index dbb7057b110438f78add64361f9c41fbd51d8ad7..a76fe610a854e1884d7564b990d6631fa703f7ed 100644
--- a/vipra-ui/app/index.html
+++ b/vipra-ui/app/index.html
@@ -1,80 +1,78 @@
 <!DOCTYPE html>
 <html lang="en" ng-app="vipra.app" ng-controller="RootController">
-  <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">
-    <meta name="msapplication-TileColor" content="#da532c">
-    <meta name="msapplication-TileImage" content="/mstile-144x144.png">
-    <meta name="theme-color" content="#ffffff">
+<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">
+  <meta name="msapplication-TileColor" content="#da532c">
+  <meta name="msapplication-TileImage" content="/mstile-144x144.png">
+  <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>
+  <script src="js/templates.js"></script>
+</head>
 
-    <!-- stylesheets -->
-    <link href="css/vendor.css" rel="stylesheet">
-    <link href="css/app.css" rel="stylesheet">
+<body>
+  <nav class="navbar navbar-default navbar-static-top navbar-breadcrumbs">
+    <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 ng-class="{active:$state.includes('articles')}">
+            <a ui-sref="articles">Articles</a>
+          </li>
+          <li ng-class="{active:$state.includes('topics')}">
+            <a ui-sref="topics">Topics</a>
+          </li>
+          <li ng-class="{active:$state.includes('words')}">
+            <a ui-sref="words">Words</a>
+          </li>
+        </ul>
+        <ul class="nav navbar-nav navbar-right">
+          <li ng-class="{active:$state.includes('about')}">
+            <a ui-sref="about">
+              <span class="glyphicon glyphicon-question-sign"></span>
+            </a>
+          </li>
+        </ul>
+      </div>
+      <!-- /.navbar-collapse -->
+    </div>
+    <!-- /.container-fluid -->
+  </nav>
+  <div ncy-breadcrumb ng-hide="$state.current.name === 'index'"></div>
+  <div class="container" ui-view ng-cloak></div>
+</body>
 
-    <!-- javascript -->
-    <script src="js/vendor.js"></script>
-    <script src="js/app.js"></script>
-    <script src="js/templates.js"></script>
-  </head>
-  <body>
-    <nav class="navbar navbar-default navbar-static-top navbar-breadcrumbs">
-      <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 ng-class="{active:$state.includes('articles')}">
-              <a ui-sref="articles">Articles</a>
-            </li>
-            <li ng-class="{active:$state.includes('topics')}">
-              <a ui-sref="topics">Topics</a>
-            </li>
-            <li ng-class="{active:$state.includes('words')}">
-              <a ui-sref="words">Words</a>
-            </li>
-          </ul>
-
-          <ul class="nav navbar-nav navbar-right">
-            <li ng-class="{active:$state.includes('about')}">
-              <a ui-sref="about">
-                <span class="glyphicon glyphicon-question-sign"></span>
-              </a>
-            </li>
-          </ul>
-        </div><!-- /.navbar-collapse -->
-      </div><!-- /.container-fluid -->
-    </nav>
-
-    <div ncy-breadcrumb ng-hide="$state.current.name === 'index'"></div>
-
-    <div class="container" ui-view ng-cloak></div>
-  </body>
-</html>
\ No newline at end of file
+</html>
diff --git a/vipra-ui/gulpfile.js b/vipra-ui/gulpfile.js
index 3a7fd6005849079257082c03082524e389ae61bf..56965ffd942a7b332f016a201512e6c25a05c3fd 100644
--- a/vipra-ui/gulpfile.js
+++ b/vipra-ui/gulpfile.js
@@ -1,10 +1,13 @@
+/* jshint ignore: start */
+
 var gulp = require('gulp'),
     less = require('gulp-less'),
     concat = require('gulp-concat'),
     uglify = require('gulp-uglify'),
-    plumber = require('gulp-plumber'),
     cssnano = require('gulp-cssnano'),
     webserver = require('gulp-webserver'),
+    sourcemaps = require('gulp-sourcemaps'),
+    ngannotate = require('gulp-ng-annotate'),
     templatecache = require('gulp-angular-templatecache');
 
 var assets = {
@@ -37,15 +40,21 @@ var assets = {
 
 gulp.task('less', function() {
   gulp.src('app/less/**/*.less')
-      .pipe(plumber())
+      .pipe(sourcemaps.init())
+      .pipe(concat('app.css'))
       .pipe(less())
+      .pipe(cssnano())
+      .pipe(sourcemaps.write('.'))
       .pipe(gulp.dest('public/css'));
 });
 
 gulp.task('js', function() {
   gulp.src('app/js/**/*.js')
-      .pipe(plumber())
+      .pipe(sourcemaps.init())
       .pipe(concat('app.js'))
+      .pipe(ngannotate())
+      .pipe(uglify())
+      .pipe(sourcemaps.write('.'))
       .pipe(gulp.dest('public/js'));
 });
 
@@ -59,6 +68,8 @@ gulp.task('html', function() {
         module: 'vipra.templates',
         standalone: true
       }))
+      .pipe(ngannotate())
+      .pipe(uglify())
       .pipe(gulp.dest('public/js'));
 });
 
diff --git a/vipra-ui/package.json b/vipra-ui/package.json
index 83d14ec7469960bd0bd8025638c23662432dad1e..dd09ca97c891388885061a2939128b7b6cb5d972 100644
--- a/vipra-ui/package.json
+++ b/vipra-ui/package.json
@@ -12,7 +12,7 @@
     "gulp-cssnano": "^2.1.0",
     "gulp-include": "^2.1.0",
     "gulp-less": "^3.0.5",
-    "gulp-plumber": "^1.0.1",
+    "gulp-ng-annotate": "^2.0.0",
     "gulp-sourcemaps": "^1.6.0",
     "gulp-uglify": "^1.5.1",
     "gulp-webserver": "^0.9.1"