diff --git a/build.sh b/build.sh
index 8fbb42eb0a580b0bbe412d9b391fed074e8c6edf..6a7362e264eda0ab9f70cf694d9018bf47ef9fd1 100755
--- a/build.sh
+++ b/build.sh
@@ -3,6 +3,9 @@
 #######################################################################################
 # CONFIGURATION
 
+# enable/disable (1/0) to clean before building
+CLEAN=0
+
 # enable/disable (1/0) project building
 BUILD_DTM=1
 BUILD_VIPRA_UTIL=1
diff --git a/vipra-cmd/src/main/java/de/vipra/cmd/file/FilebaseWindowIndex.java b/vipra-cmd/src/main/java/de/vipra/cmd/file/FilebaseWindowIndex.java
index 17b79a9b16f7535625f132a34f5f4322be8a33f3..375842facc27c2d2f9c2e628032228fd29b8b363 100644
--- a/vipra-cmd/src/main/java/de/vipra/cmd/file/FilebaseWindowIndex.java
+++ b/vipra-cmd/src/main/java/de/vipra/cmd/file/FilebaseWindowIndex.java
@@ -133,7 +133,7 @@ public class FilebaseWindowIndex {
 	}
 
 	public Window getWindow(final int index) {
-		Window window = new Window();
+		final Window window = new Window();
 		window.setStartDate(startDate(index));
 		window.setEndDate(endDate(index));
 		window.setWindowResolution(windowResolution);
diff --git a/vipra-cmd/src/main/java/de/vipra/cmd/option/ImportCommand.java b/vipra-cmd/src/main/java/de/vipra/cmd/option/ImportCommand.java
index 4e7b38f5d1cafd02659395dc7d646e91fc3371b3..e3f83fa4d0d680413cecf759fe566ce58cdc6f55 100644
--- a/vipra-cmd/src/main/java/de/vipra/cmd/option/ImportCommand.java
+++ b/vipra-cmd/src/main/java/de/vipra/cmd/option/ImportCommand.java
@@ -288,6 +288,8 @@ public class ImportCommand implements Command {
 		 * update topic model
 		 */
 		topicModel.setWindows(filebase.getWindowIndex().getWindows());
+		topicModel.setArticleCount(filebase.getIdDateIndex().size());
+		topicModel.setWordCount(filebase.getWordIndex().size());
 		dbTopicModels.replaceSingle(topicModel);
 
 		/*
diff --git a/vipra-ui/.jsbeautifyrc b/vipra-ui/.jsbeautifyrc
new file mode 100644
index 0000000000000000000000000000000000000000..c8df315cd047c5463be75304fe634eb152ea9ac4
--- /dev/null
+++ b/vipra-ui/.jsbeautifyrc
@@ -0,0 +1,22 @@
+{
+	"indent_size": 2,
+	"indent_char": " ",
+	"eol": "\n",
+	"indent_level": 0,
+	"indent_with_tabs": false,
+	"preserve_newlines": true,
+	"max_preserve_newlines": 10,
+	"jslint_happy": false,
+	"space_after_anon_function": false,
+	"brace_style": "collapse",
+	"keep_array_indentation": false,
+	"keep_function_indentation": false,
+	"space_before_conditional": true,
+	"break_chained_methods": false,
+	"eval_code": false,
+	"unescape_strings": false,
+	"wrap_line_length": 0,
+	"wrap_attributes": "auto",
+	"wrap_attributes_indent_size": 4,
+	"end_with_newline": false
+}
\ No newline at end of file
diff --git a/vipra-ui/app/html/articles/index.html b/vipra-ui/app/html/articles/index.html
index 413ca3c411fd95fc0c2050492c63768fde44853c..53f8ff372fefc95e3b39cf4219d89191582f0424 100644
--- a/vipra-ui/app/html/articles/index.html
+++ b/vipra-ui/app/html/articles/index.html
@@ -10,7 +10,7 @@
         <div class="panel-heading">
           Found
           <ng-pluralize count="articlesTotal||0" when="{0:'no articles',1:'1 article',other:'{} articles'}"></ng-pluralize> in the database.
-          <span ng-show="articlesTotal">
+          <span ng-show="articlesTotal" ng-cloak>
             Sort by
             <ol class="nya-bs-select nya-bs-condensed" ng-model="articlesIndexModels.sortkey">
               <li value="title" class="nya-bs-option"><a>Title</a></li>
diff --git a/vipra-ui/app/html/articles/show.html b/vipra-ui/app/html/articles/show.html
index 470ba5bb6fcd3d118d17827cafa644ae2abdd436..0da35a1dcb3dc5cf166778e9221907fb48d97041 100644
--- a/vipra-ui/app/html/articles/show.html
+++ b/vipra-ui/app/html/articles/show.html
@@ -5,7 +5,7 @@
   <div>
     <ul class="nav nav-tabs" role="tablist">
       <li class="active">
-        <a data-target=".tab-info" data-toggle="tab"><i class="fa fa-file-text-o"></i></a>
+        <a data-target=".tab-info" data-toggle="tab" bs-tab><i class="fa fa-file-text-o"></i></a>
       </li>
       <li>
         <a data-target=".tab-entities" data-toggle="tab" bs-tab shown="openTabEntities()">Entities</a>
@@ -50,7 +50,7 @@
               </tbody>
             </table>
             <h3>Topics</h3>
-            <table class="table table-bordered table-condensed table-fixed" ng-show="article.topics.length">
+            <table class="table table-bordered table-condensed table-fixed" ng-show="article.topics.length" ng-cloak>
               <thead>
                 <tr>
                   <th class="infocol" ng-model="articlesShowModels.topicsSort" sort-by="share">Share</th>
@@ -78,7 +78,7 @@
           </div>
         </div>
         <h3>Similar articles</h3>
-        <table class="table table-bordered table-condensed" ng-show="article.similarArticles.length">
+        <table class="table table-bordered table-condensed" ng-show="article.similarArticles.length" ng-cloak>
           <thead>
             <tr>
               <th class="infocol" ng-model="articlesShowModels.similarSort" sort-by="share">Share</th>
@@ -124,8 +124,8 @@
               </table>
               <div class="panel-footer">
                 <ng-pluralize count="entities.length" when="{0:'No entities',1:'First entity',other:'First {} entities'}"></ng-pluralize>.
-                <button class="btn btn-default btn-sm" ng-click="showMoreEntities()" ng-show="entities.length<allEntities.length">Show more</button>
-                <button class="btn btn-default btn-sm" ng-click="showAllEntities()" ng-show="entities.length<allEntities.length">Show all</button>
+                <button class="btn btn-default btn-sm" ng-click="showMoreEntities()" ng-show="entities.length<allEntities.length" ng-cloak>Show more</button>
+                <button class="btn btn-default btn-sm" ng-click="showAllEntities()" ng-show="entities.length<allEntities.length" ng-cloak>Show all</button>
               </div>
             </div>
           </div>
@@ -138,7 +138,7 @@
             <div class="panel panel-default">
               <div class="panel-heading">
                 Found <ng-pluralize count="allWords.length||0" when="{0:'no words',1:'1 word',other:'{} unique words'}"></ng-pluralize> for this article.<br>
-                Article has <ng-pluralize count="article.stats.wordCount||0" when="{0:'no words',1:'1 word',other:'{} words'}"></ng-pluralize>, <span ng-bind-template="{{::article.stats.processedWordCount}} after cleaning ({{::Vipra.toPercent(article.stats.reductionRatio)}}% reduction)" ng-show="article.stats.wordCount>0"></span>.
+                Article has <ng-pluralize count="article.stats.wordCount||0" when="{0:'no words',1:'1 word',other:'{} words'}"></ng-pluralize>, <span ng-bind-template="{{::article.stats.processedWordCount}} after cleaning ({{::Vipra.toPercent(article.stats.reductionRatio)}}% reduction)" ng-show="article.stats.wordCount>0" ng-cloak></span>.
               </div>
               <table class="table table-bordered table-condensed table-fixed">
                 <thead>
@@ -162,8 +162,8 @@
               </table>
               <div class="panel-footer">
                 <ng-pluralize count="words.length" when="{0:'No words',1:'First word',other:'First {} words'}"></ng-pluralize>.
-                <button class="btn btn-default btn-sm" ng-click="showMoreWords()" ng-show="words.length<allWords.length">Show more</button>
-                <button class="btn btn-default btn-sm" ng-click="showAllWords()" ng-show="words.length<allWords.length">Show all</button>
+                <button class="btn btn-default btn-sm" ng-click="showMoreWords()" ng-show="words.length<allWords.length" ng-cloak>Show more</button>
+                <button class="btn btn-default btn-sm" ng-click="showAllWords()" ng-show="words.length<allWords.length" ng-cloak>Show all</button>
               </div>
             </div>
           </div>
diff --git a/vipra-ui/app/html/directives/pagination.html b/vipra-ui/app/html/directives/pagination.html
index adc925d454da75bb8ebd099c2ae5574d7dc92435..009aae5f421c893104759b293666d864b8dff578 100644
--- a/vipra-ui/app/html/directives/pagination.html
+++ b/vipra-ui/app/html/directives/pagination.html
@@ -1,26 +1,26 @@
 <nav>
   <ul class="pagination">
     <li title="First" ng-class="{disabled:page==1}">
-      <a ui-sref="{page:page==2?null:page-1}" ng-show="page>1" ng-click="changePage(1)">&laquo;</a>
+      <a ui-sref="{page:page==2?null:page-1}" ng-show="page>1" ng-click="changePage(1)" ng-cloak>&laquo;</a>
       <span ng-hide="page>1">&laquo;</span>
     </li>
     <li title="Previous" ng-class="{disabled:page==1}">
-      <a ui-sref="{page:page==2?null:page-1}" ng-show="page>1" ng-click="changePage(page-1)">&lsaquo;</a>
+      <a ui-sref="{page:page==2?null:page-1}" ng-show="page>1" ng-click="changePage(page-1)" ng-cloak>&lsaquo;</a>
       <span ng-hide="page>1">&lsaquo;</span>
     </li>
     <li ng-class="{active:p==page}" ng-repeat="p in pages">
       <a ui-sref="{page:p===1?null:p}" ng-bind="p" ng-click="changePage(p)"></a>
     </li>
     <li title="Next" ng-class="{disabled:page>=maxPage}">
-      <a ui-sref="{page:page+1}" ng-show="page<maxPage" ng-click="changePage(page+1)">&rsaquo;</a>
+      <a ui-sref="{page:page+1}" ng-show="page<maxPage" ng-click="changePage(page+1)" ng-cloak>&rsaquo;</a>
       <span ng-hide="page<maxPage">&rsaquo;</span>
     </li>
     <li title="Last" ng-class="{disabled:page>=maxPage}">
-      <a ui-sref="{page:page+1}" ng-show="page<maxPage" ng-click="changePage(maxPage)">&raquo;</a>
+      <a ui-sref="{page:page+1}" ng-show="page<maxPage" ng-click="changePage(maxPage)" ng-cloak>&raquo;</a>
       <span ng-hide="page<maxPage">&raquo;</span>
     </li>
   </ul>
-  <ul class="pagination" ng-show="total > limit">
+  <ul class="pagination" ng-show="total > limit" ng-cloak>
     <li>
       <a ng-click="toPage()">Page...</a>
     </li>
diff --git a/vipra-ui/app/html/entities/articles.html b/vipra-ui/app/html/entities/articles.html
index ba2d7bc1f086e61a7637954809ae615936fa65e3..0c7d5c20a2dfa8a9d8c91c509540b28ca8b6dbd4 100644
--- a/vipra-ui/app/html/entities/articles.html
+++ b/vipra-ui/app/html/entities/articles.html
@@ -6,7 +6,7 @@
         <table class="item-actions">
           <tr>
             <td>
-              <a class="btn btn-default" ng-click="goBack()" ng-show="oldState.name && oldState.name !== state.name">Back</a>
+              <a class="btn btn-default" ng-click="goBack()" ng-show="oldState.name && oldState.name !== state.name" ng-cloak>Back</a>
             </td>
           </tr>
         </table>
@@ -24,7 +24,7 @@
         <div class="panel-heading">
           Found
           <ng-pluralize count="articlesTotal||0" when="{0:'no articles',1:'1 article',other:'{} articles'}"></ng-pluralize> in the database.
-          <span ng-show="articlesTotal">
+          <span ng-show="articlesTotal" ng-cloak>
           Sort by
           <ol class="nya-bs-select nya-bs-condensed" ng-model="entitiesArticlesModels.sortkey">
             <li value="title" class="nya-bs-option"><a>Title</a></li>
diff --git a/vipra-ui/app/html/entities/index.html b/vipra-ui/app/html/entities/index.html
index 63d53c5921f2297b543164f1e82f77159bb45c7b..464c3510d431a27b1e723a818ecfc4f5e31450cf 100644
--- a/vipra-ui/app/html/entities/index.html
+++ b/vipra-ui/app/html/entities/index.html
@@ -10,7 +10,7 @@
         <div class="panel-heading">
           Found
           <ng-pluralize count="entitiesTotal||0" when="{0:'no entities',1:'1 entity',other:'{} entities'}"></ng-pluralize> in the database.
-          <span ng-show="entitiesTotal">
+          <span ng-show="entitiesTotal" ng-cloak>
             Sort by
             <ol class="nya-bs-select nya-bs-condensed" ng-model="entitiesIndexModels.sortkey">
               <li value="id" class="nya-bs-option"><a>Entity</a></li>
diff --git a/vipra-ui/app/html/explorer.html b/vipra-ui/app/html/explorer.html
index 727a593a0ab0c5a737cb63ef19a9d24a67ff4145..1ad453674f55461bd5d008959a71cc523af3ce53 100644
--- a/vipra-ui/app/html/explorer.html
+++ b/vipra-ui/app/html/explorer.html
@@ -61,7 +61,7 @@
           <a tabindex="0" class="btn btn-sm btn-default" ng-model="explorerModels.chartstack" bs-radio="'percent'">Percent</a>
         </div>
         <div class="pull-right">
-          <a tabindex="0" class="btn btn-sm btn-default" ng-click="resetZoom()" ng-show="topicsSelected">Reset zoom</a>
+          <a tabindex="0" class="btn btn-sm btn-default" ng-click="resetZoom()" ng-show="topicsSelected" ng-cloak>Reset zoom</a>
         </div>
       </div>
       <div id="topicRelChart" class="chart" highcharts="topicSeq" style="height:500px"></div>
diff --git a/vipra-ui/app/html/index.html b/vipra-ui/app/html/index.html
index 0d67d1f36a662feca47fe2d9a69be9e937cbfb37..e34199bdb12e86dbf5571853489ca0a38719067e 100644
--- a/vipra-ui/app/html/index.html
+++ b/vipra-ui/app/html/index.html
@@ -17,6 +17,7 @@
           <article-link article="::article" badge="false" menu="false" excerpt="false"/>
         </li>
       </ul>
+      <p class="text-muted text-center" ng-if="!latestArticles.length">No articles</p>
     </div>
     <div class="col-md-4 text-center">
       <h4>Latest topics</h4>
@@ -25,6 +26,7 @@
           <topic-link topic="::topic" badge="false" menu="false"/>
         </li>
       </ul>
+      <p class="text-muted text-center" ng-if="!latestTopics.length">No topics</p>
     </div>
   </div>
   <div class="row row-spaced search-row">
@@ -40,7 +42,7 @@
       </div>
     </div>
   </div>
-  <div class="row row-spaced" ng-show="advancedSearch">
+  <div class="row row-spaced" ng-show="advancedSearch" ng-cloak>
     <div class="col-md-6 form-horizontal">
       <label for="advFromDate" class="col-sm-2 control-label">From</label>
       <div class="input-group date col-sm-10" id="advFromDate" bs-datetimepicker ng-model="rootModels.advFromDate">
@@ -61,13 +63,13 @@
     </div>
   </div>
   <div class="row row-spaced">
-    <div class="col-md-12 text-center" ng-show="searching">
+    <div class="col-md-12 text-center" ng-show="searching" ng-cloak>
       Searching...
     </div>
-    <div class="col-md-12" ng-show="!searching && search && (!searchResults || searchResults.length == 0)">
+    <div class="col-md-12" ng-show="!searching && search && (!searchResults || searchResults.length == 0)" ng-cloak>
       <h4>No Results</h4>
     </div>
-    <div class="col-md-12" ng-show="searchResults.length > 0">
+    <div class="col-md-12" ng-show="searchResults.length > 0" ng-cloak>
       <h4>Results</h4>
       <ul class="list-unstyled search-results">
         <li class="search-result" ng-repeat="article in searchResults">
diff --git a/vipra-ui/app/html/topics/articles.html b/vipra-ui/app/html/topics/articles.html
index edbbd76fe8ec67c0bc01fd8f5a09771ba0ab2f86..0a0b1cc7c6141f72662e063b8f125f224f5a4752 100644
--- a/vipra-ui/app/html/topics/articles.html
+++ b/vipra-ui/app/html/topics/articles.html
@@ -24,7 +24,7 @@
         <div class="panel-heading">
           Found
           <ng-pluralize count="articlesTotal||0" when="{0:'no articles',1:'1 article',other:'{} articles'}"></ng-pluralize> in the database.
-          <span ng-show="articlesTotal">
+          <span ng-show="articlesTotal" ng-cloak>
           Sort by
           <ol class="nya-bs-select nya-bs-condensed" ng-model="topicsArticlesModels.sortkey">
             <li value="title" class="nya-bs-option"><a>Title</a></li>
diff --git a/vipra-ui/app/html/topics/index.html b/vipra-ui/app/html/topics/index.html
index 3754a27dd82cf969f9d2d86fc1c13e669a2de6f4..ee2f178ce88de82bdf076957dbae1fa9c4aef6a8 100644
--- a/vipra-ui/app/html/topics/index.html
+++ b/vipra-ui/app/html/topics/index.html
@@ -10,7 +10,7 @@
         <div class="panel-heading">
           Found
           <ng-pluralize count="topicsTotal||0" when="{0:'no topics',1:'1 topic',other:'{} topics'}"></ng-pluralize> in the database.
-          <span ng-show="topicsTotal > 0">
+          <span ng-show="topicsTotal > 0" ng-cloak>
             Sort by
             <ol class="nya-bs-select nya-bs-condensed" ng-model="topicsIndexModels.sortkey">
               <li value="name" class="nya-bs-option"><a>Name</a></li>
diff --git a/vipra-ui/app/html/topics/show.html b/vipra-ui/app/html/topics/show.html
index 6edea1352d623f22c50d6e98e5425839462a9d0c..629804ab82f72ac102140ade3f3a20370e48f34c 100644
--- a/vipra-ui/app/html/topics/show.html
+++ b/vipra-ui/app/html/topics/show.html
@@ -2,7 +2,7 @@
   <div class="page-header no-border">
     <h1>
       <div ng-bind="topic.name" ng-hide="isRename"></div>
-      <div class="input-group input-group-lg" ng-show="isRename">
+      <div class="input-group input-group-lg" ng-show="isRename" ng-cloak>
         <input type="text" class="form-control" ng-model="topic.name" id="topicName" ng-keyup="keyup($event)">
         <div class="input-group-btn">
           <button class="btn btn-success" ng-click="endRename(true)">
@@ -26,10 +26,10 @@
         </ul>
       </li>
       <li class="active">
-        <a data-target=".tab-info" data-toggle="tab"><i class="fa fa-file-text-o"></i></a>
+        <a data-target=".tab-info" data-toggle="tab" bs-tab><i class="fa fa-file-text-o"></i></a>
       </li>
       <li>
-        <a data-target=".tab-sequences" data-toggle="tab">Sequences</a>
+        <a data-target=".tab-sequences" data-toggle="tab" bs-tab>Sequences</a>
       </li>
       <li>
         <a ui-sref="topics.show.articles({id:topic.id})">
@@ -81,7 +81,7 @@
               <a class="btn btn-sm btn-default" ng-model="topicsShowModels.wordChartstyle" bs-radio="'spline'">Line</a>
             </div>
             <div class="pull-right">
-              <a tabindex="0" class="btn btn-sm btn-default" ng-click="resetWordZoom()" ng-show="wordsSelected">Reset zoom</a>
+              <a tabindex="0" class="btn btn-sm btn-default" ng-click="resetWordZoom()" ng-show="wordsSelected" ng-cloak>Reset zoom</a>
             </div>
           </div>
           <div class="panel-body">
@@ -118,7 +118,7 @@
                   <sequence-dropdown ng-model="topicsShowModels.sequenceIdCompare" sequences="topic.sequences"></sequence-dropdown>
                 </div>
               </div>
-              <table class="table table-condensed table-bordered table-hover table-fixed table-compare" ng-show="sequence">
+              <table class="table table-condensed table-bordered table-hover table-fixed table-compare" ng-show="sequence" ng-cloak>
                 <thead>
                   <tr>
                     <th ng-model="topicsShowModels.seqSortWords" sort-by="word">Word</th>
@@ -134,7 +134,7 @@
                   </tr>
                 </tbody>
               </table>
-              <div class="panel-footer seq-head-foot" ng-show="sequence">
+              <div class="panel-footer seq-head-foot" ng-show="sequence" ng-cloak>
                 <ng-pluralize count="sequence.words.length||0" when="{0:'No words',1:'Top word',other:'Top {} words'}"></ng-pluralize>
               </div>
             </div>
@@ -142,7 +142,7 @@
           <div class="col-md-2" ng-if="sequenceCompare">
             <div class="panel panel-default">
               <div class="panel-heading seq-head-foot"></div>
-              <table class="table table-condensed table-bordered table-hover table-fixed table-compare" ng-show="sequence">
+              <table class="table table-condensed table-bordered table-hover table-fixed table-compare" ng-show="sequence" ng-cloak>
                 <thead>
                   <tr>
                     <th class="text-center" ng-model="topicsShowModels.seqSortWords" sort-by="change">Change</th>
@@ -156,7 +156,7 @@
                   </tr>
                 </tbody>
               </table>
-              <div class="panel-footer seq-head-foot" ng-show="sequence"></div>
+              <div class="panel-footer seq-head-foot" ng-show="sequence" ng-cloak></div>
             </div>
           </div>
           <div class="col-md-5" ng-if="sequenceCompare">
diff --git a/vipra-ui/app/html/words/articles.html b/vipra-ui/app/html/words/articles.html
index 3674b93e2fb6e7888564e4ca49c9988f4feed8b0..0e82311ee216253555eab1f1aa748e03ef258d3a 100644
--- a/vipra-ui/app/html/words/articles.html
+++ b/vipra-ui/app/html/words/articles.html
@@ -6,7 +6,7 @@
         <table class="item-actions">
           <tr>
             <td>
-              <a class="btn btn-default" ng-click="goBack()" ng-show="oldState.name && oldState.name !== state.name">Back</a>
+              <a class="btn btn-default" ng-click="goBack()" ng-show="oldState.name && oldState.name !== state.name" ng-cloak>Back</a>
             </td>
           </tr>
         </table>
@@ -24,7 +24,7 @@
         <div class="panel-heading">
           Found
           <ng-pluralize count="articlesTotal||0" when="{0:'no articles',1:'1 article',other:'{} articles'}"></ng-pluralize> in the database.
-          <span ng-show="articlesTotal">
+          <span ng-show="articlesTotal" ng-cloak>
           Sort by
           <ol class="nya-bs-select nya-bs-condensed" ng-model="wordsArticlesModels.sortkey">
             <li value="title" class="nya-bs-option"><a>Title</a></li>
diff --git a/vipra-ui/app/html/words/index.html b/vipra-ui/app/html/words/index.html
index eb1c10cd3ef865bc2fba8d564f0ee57ec3963181..6aa755fd97570a4df305552214f290dd04ff5733 100644
--- a/vipra-ui/app/html/words/index.html
+++ b/vipra-ui/app/html/words/index.html
@@ -10,7 +10,7 @@
         <div class="panel-heading">
           Found
           <ng-pluralize count="wordsTotal||0" when="{0:'no words',1:'1 word',other:'{} words'}"></ng-pluralize> in the database.
-          <span ng-show="wordsTotal">
+          <span ng-show="wordsTotal" ng-cloak>
             Sort by
             <ol class="nya-bs-select nya-bs-condensed" ng-model="wordsIndexModels.sortkey">
               <li value="id" class="nya-bs-option"><a>Word</a></li>
diff --git a/vipra-ui/app/html/words/topics.html b/vipra-ui/app/html/words/topics.html
index 162d93f3deefb1baa74017330d4bb9f8e82bced8..4e8e14cdb86f53f5a5824964d4ba012083d09b79 100644
--- a/vipra-ui/app/html/words/topics.html
+++ b/vipra-ui/app/html/words/topics.html
@@ -6,7 +6,7 @@
         <table class="item-actions">
           <tr>
             <td>
-              <a class="btn btn-default" ng-click="goBack()" ng-show="oldState.name && oldState.name !== state.name">Back</a>
+              <a class="btn btn-default" ng-click="goBack()" ng-show="oldState.name && oldState.name !== state.name" ng-cloak>Back</a>
             </td>
           </tr>
         </table>
@@ -24,7 +24,7 @@
         <div class="panel-heading">
           Found
           <ng-pluralize count="topicsTotal||0" when="{0:'no topics',1:'1 topic',other:'{} topics'}"></ng-pluralize> in the database.
-          <span ng-show="topicsTotal">
+          <span ng-show="topicsTotal" ng-cloak>
           Sort by
           <ol class="nya-bs-select nya-bs-condensed" ng-model="wordsTopicsModels.sortkey">
             <li value="name" class="nya-bs-option"><a>Name</a></li>
diff --git a/vipra-ui/app/index.html b/vipra-ui/app/index.html
index caafc504d81922d028baab9c9f70763d6d0e6cf9..570f8442f6ae4cc93a104ad7c128e5bc54a03535 100644
--- a/vipra-ui/app/index.html
+++ b/vipra-ui/app/index.html
@@ -6,24 +6,6 @@
   <meta name="viewport" content="width=device-width, initial-scale=1">
   <base href="/">
   <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">
@@ -72,7 +54,7 @@
             <a tabindex="0" ui-sref="words"><span class="mnemonic">W</span>ords</a>
           </li>
         </ul>
-        <form class="navbar-form navbar-left" role="search" ng-hide="state.name === 'index'">
+        <form class="navbar-form navbar-left" role="search" ng-hide="state.name === 'index'" ng-cloak>
           <div class="form-group has-feedback">
             <input tabindex="0" type="text" class="form-control" placeholder="Search..." ng-model="rootModels.search" ng-enter="menubarSearch(rootModels.search)" id="menuSearchBox">
             <i class="form-control-feedback glyphicon glyphicon-search text-muted"></i>
@@ -106,21 +88,21 @@
     <div class="modal-dialog modal-lg">
       <div class="modal-content">
         <div class="modal-header">
-          <button type="button" class="close" data-dismiss="modal" aria-label="Close" ng-show="rootModels.topicModel"><span aria-hidden="true">&times;</span></button>
+          <button type="button" class="close" data-dismiss="modal" aria-label="Close" ng-show="rootModels.topicModel" ng-cloak><span aria-hidden="true">&times;</span></button>
           <h4 class="modal-title">Topic Models</h4>
         </div>
         <div class="modal-body">
-          <ul class="list-group nomargin" ng-show="topicModels.length">
+          <ul class="list-group nomargin" ng-show="topicModels.length" ng-cloak>
             <button type="button" class="list-group-item topic-model" ng-repeat="topicModel in topicModels" ng-click="changeTopicModel(topicModel)" ng-class="{'active selected-model':rootModels.topicModel.id===topicModel.id}">
-              <span class="badge" ng-bind="topicModel.articleCount" ng-show="topicModel.articleCount" ng-attr-title="{{topicModel.articleCount + ' article(s)'}}"></span>
-              <span class="badge" ng-bind="topicModel.topicCount" ng-show="topicModel.topicCount" ng-attr-title="{{topicModel.topicCount + ' topic(s)'}}"></span>
+              <span class="badge" ng-bind="topicModel.articleCount" ng-show="topicModel.articleCount" ng-attr-title="{{topicModel.articleCount + ' article(s)'}}" ng-cloak></span>
+              <span class="badge" ng-bind="topicModel.topicCount" ng-show="topicModel.topicCount" ng-attr-title="{{topicModel.topicCount + ' topic(s)'}}" ng-cloak></span>
               <span class="badge" ng-if="!topicModel.lastGenerated" title="Model was never generated">Non-generated</span>
               <span ng-bind="topicModel.id"></span>
-              <br ng-show="topicModel.modelConfig.description">
+              <br ng-show="topicModel.modelConfig.description" ng-cloak>
               <small ng-bind="topicModel.modelConfig.description"></small>
             </button>
           </ul>
-          <p class="text-center" ng-show="loading.any">
+          <p class="text-center" ng-show="loading.any" ng-cloak>
             Loading...
           </p>
           <p ng-hide="topicModels.length || loading.any">
diff --git a/vipra-ui/app/js/app.js b/vipra-ui/app/js/app.js
index 36f433a40c5b9b516a6b71a220c55a519b18bff0..d8346f8e4873ededfdbda55db90e28d1f0e19748 100644
--- a/vipra-ui/app/js/app.js
+++ b/vipra-ui/app/js/app.js
@@ -2,7 +2,7 @@
  * Vipra Application
  * Main application file
  ******************************************************************************/
-/* globals angular */
+/* globals angular, $ */
 (function() {
 
   "use strict";
@@ -132,7 +132,7 @@
         url: '/articles',
         templateUrl: 'html/entities/articles.html',
         controller: 'EntitiesArticlesController'
-      })
+      });
 
       // states: errors
 
@@ -175,13 +175,17 @@
 
           responseError: function(rejection) {
             requestDecrement(rejection.config);
-            if(rejection.data) {
-              if(angular.isArray(rejection.data)) {
-                for(var i = 0; i < rejection.data.length; i++) {
-                  $rootScope.alerts.push(angular.extend({type:'danger'}, rejection.data[i]));
+            if (rejection.data) {
+              if (angular.isArray(rejection.data)) {
+                for (var i = 0; i < rejection.data.length; i++) {
+                  $rootScope.alerts.push(angular.extend({
+                    type: 'danger'
+                  }, rejection.data[i]));
                 }
               } else {
-                $rootScope.alerts.push(angular.extend({type:'danger'}, rejection.data));
+                $rootScope.alerts.push(angular.extend({
+                  type: 'danger'
+                }, rejection.data));
               }
             }
             return $q.reject(rejection);
@@ -206,7 +210,7 @@
       });
     });
 
-    $rootScope.$on('$stateChangeSuccess', function(event, toState, toParams, fromState, fromParams) {
+    $rootScope.$on('$stateChangeSuccess', function(event, toState, toParams, fromState) {
       $rootScope.oldState = fromState;
       $rootScope.state = toState;
     });
@@ -224,12 +228,12 @@
     input.trigger('fileselect', [numFiles, label]);
   });
 
-  $(document).ready( function() {
+  $(document).ready(function() {
     $('.btn-file :file').on('fileselect', function(event, numFiles, label) {
       var input = $(this).parents('.input-group').find(':text'),
         log = numFiles > 1 ? numFiles + ' files selected' : label;
-      
-      if(input.length) {
+
+      if (input.length) {
         input.val(log);
       }
     });
diff --git a/vipra-ui/app/js/config.js b/vipra-ui/app/js/config.js
index 48b98bbf5cb5c8cf46f4097b2e55f3ed9490926a..397d96104139282185428e5b6d7e7bbb26025955 100644
--- a/vipra-ui/app/js/config.js
+++ b/vipra-ui/app/js/config.js
@@ -10,15 +10,15 @@
   window.Vipra = window.Vipra || {};
 
   Vipra.config = {
-	  /*
-	   * Point this URL to the backend REST servlet. The default is /rest, which expects the servlet
-	   * to be deployed in the root context. If the servlet is deployed under another context, prepend
-	   * it to this URL. Test the URL by entering this into a browser:
-	   *
-	   *    http://yourserver[/rest]/application.wadl
-	   *                      ^^^^^ 
-	   *                      this is the restUrl
-	   */
+    /*
+     * Point this URL to the backend REST servlet. The default is /rest, which expects the servlet
+     * to be deployed in the root context. If the servlet is deployed under another context, prepend
+     * it to this URL. Test the URL by entering this into a browser:
+     *
+     *    http://yourserver[/rest]/application.wadl
+     *                      ^^^^^ 
+     *                      this is the restUrl
+     */
     restUrl: '/rest'
   };
 
diff --git a/vipra-ui/app/js/controllers.js b/vipra-ui/app/js/controllers.js
index 597b1490efafd88fa69ab82c4a2b8125e387b320..0b589b064ca8af23715c4e27d03cb691193b7e08 100644
--- a/vipra-ui/app/js/controllers.js
+++ b/vipra-ui/app/js/controllers.js
@@ -18,8 +18,8 @@
       };
 
       var prevTopicModelLoading = false;
-      if(localStorage.tm) {
-        prevTopicModelLoading = true
+      if (localStorage.tm) {
+        prevTopicModelLoading = true;
         TopicModelFactory.get({
           id: localStorage.tm
         }, function(data) {
@@ -27,7 +27,7 @@
           prevTopicModelLoading = false;
         }, function() {
           prevTopicModelLoading = false;
-        })
+        });
       }
 
       $scope.queryTopicModels = function() {
@@ -39,7 +39,7 @@
       };
 
       $scope.chooseTopicModel = function() {
-        if(prevTopicModelLoading)
+        if (prevTopicModelLoading)
           return;
         $scope.queryTopicModels();
         $scope.rootModels.topicModelModalOpen = true;
@@ -431,14 +431,15 @@
           id: node.dbid,
           fields: '_all'
         }, function(data) {
+          var i;
           if (data.topics) {
-            for (var i = 0; i < data.topics.length; i++)
+            for (i = 0; i < data.topics.length; i++)
               data.topics[i] = data.topics[i].topic;
             constructor(data.topics, node, topicNode);
           }
-          if(data.similarArticles && $scope.shown.similararticles) {
+          if (data.similarArticles && $scope.shown.similararticles) {
             var articles = [];
-            for(var i = 0; i < data.similarArticles.length; i++)
+            for (i = 0; i < data.similarArticles.length; i++)
               articles.push(data.similarArticles[i].article);
             constructor(articles, node, articleNode);
           }
@@ -463,7 +464,7 @@
       };
 
       $scope.loadWord = function(node) {
-        if($scope.shown.articles) {
+        if ($scope.shown.articles) {
           ArticleFactory.query({
             word: node.dbid,
             topicModel: $scope.rootModels.topicModel.id
@@ -471,7 +472,7 @@
             constructor(data, node, articleNode);
           });
         }
-        if($scope.shown.topics) {
+        if ($scope.shown.topics) {
           TopicFactory.query({
             word: node.dbid,
             topicModel: $scope.rootModels.topicModel.id
@@ -496,7 +497,9 @@
       });
 
       $scope.reset = function() {
-        $state.go($state.current, {}, {reload: true});
+        $state.go($state.current, {}, {
+          reload: true
+        });
       };
     }
   ]);
@@ -654,7 +657,7 @@
       $scope.$watch('explorerModels.sorttopics', function() {
         if (!$scope.topics) return;
 
-        if($scope.explorerModels.sorttopics === 'name') {
+        if ($scope.explorerModels.sorttopics === 'name') {
           $scope.explorerModels.sortdir = false;
         } else {
           $scope.explorerModels.sortdir = true;
@@ -730,9 +733,9 @@
         $scope.articleModified = Vipra.formatDateTime($scope.article.modified);
 
         // calculate share from divergence
-        if($scope.article.similarArticles) {
-          for(var i = 0; i < $scope.article.similarArticles.length; i++)
-            $scope.article.similarArticles[i].share = Math.round(((1 - $scope.article.similarArticles[i].divergence) * 100));
+        if ($scope.article.similarArticles) {
+          for (var articleIndex = 0; articleIndex < $scope.article.similarArticles.length; articleIndex++)
+            $scope.article.similarArticles[articleIndex].share = Math.round(((1 - $scope.article.similarArticles[articleIndex].divergence) * 100));
         }
 
         // take topic model from article
@@ -748,16 +751,16 @@
               count: $scope.article.topics.length
             });
 
-          for (var i = 0, d; i < topics.length; i++) {
+          for (var topicIndex = 0, d; topicIndex < topics.length; topicIndex++) {
             d = {
-              name: topics[i].topic.name,
-              y: topics[i].share,
-              color: colors[i],
-              id: topics[i].topic.id
+              name: topics[topicIndex].topic.name,
+              y: topics[topicIndex].share,
+              color: colors[topicIndex],
+              id: topics[topicIndex].topic.id
             };
 
             topicShareSeries.push(d);
-            $scope.article.topics[i].color = colors[i];
+            $scope.article.topics[topicIndex].color = colors[topicIndex];
           }
         }
 
@@ -777,7 +780,7 @@
       });
 
       $scope.openTabWords = function() {
-        if($scope.words) return;
+        if ($scope.words) return;
 
         ArticleFactory.get({
           id: $stateParams.id,
@@ -800,7 +803,7 @@
       };
 
       $scope.openTabEntities = function() {
-        if($scope.entities) return;
+        if ($scope.entities) return;
 
         ArticleFactory.get({
           id: $stateParams.id,
@@ -904,13 +907,13 @@
           $scope.rootModels.topicModel = data.topicModel;
 
         // preselect some words
-        if($scope.topic.words) {
-          for(var i = 0; i < Math.min(3, $scope.topic.words.length); i++)
+        if ($scope.topic.words) {
+          for (var i = 0; i < Math.min(3, $scope.topic.words.length); i++)
             $scope.topic.words[i].selected = true;
         }
 
         // preselect first sequence
-        if($scope.topic.sequences && $scope.topic.sequences.length)
+        if ($scope.topic.sequences && $scope.topic.sequences.length)
           $scope.topicsShowModels.sequenceId = $scope.topic.sequences[0].id;
 
         $timeout(function() {
@@ -938,15 +941,15 @@
       };
 
       $scope.redrawWordEvolutionChart = function() {
-        if(!$scope.topic || !$scope.topic.words || !$scope.topic.sequences) return;
+        if (!$scope.topic || !$scope.topic.words || !$scope.topic.sequences) return;
         var evolutions = [];
 
         // create series
-        for(var i = 0, word, probs; i < $scope.topic.words.length; i++) {
+        for (var i = 0, word, probs; i < $scope.topic.words.length; i++) {
           word = $scope.topic.words[i];
-          if(!word.selected) continue;
+          if (!word.selected) continue;
           probs = [];
-          for(var j = 0, prob; j < word.sequenceProbabilities.length; j++) {
+          for (var j = 0, prob; j < word.sequenceProbabilities.length; j++) {
             prob = $scope.topicsShowModels.wordSeqstyle === 'relative' ? word.sequenceProbabilitiesChange[j] : word.sequenceProbabilities[j];
             probs.push([new Date($scope.topic.sequences[j].window.startDate).getTime(), prob]);
           }
@@ -1019,19 +1022,19 @@
       };
 
       $scope.recalcSeqChange = function() {
-        if(!$scope.sequence || !$scope.sequenceCompare) return;
+        if (!$scope.sequence || !$scope.sequenceCompare) return;
         wordLoop:
-        for(var i = 0, word; i < $scope.sequence.words.length; i++) {
-          word = $scope.sequence.words[i];
-          for(var j = 0, word2; j < $scope.sequenceCompare.words.length; j++) {
-            word2 = $scope.sequenceCompare.words[j];
-            if(word.id === word2.id) {
-              word.change = word2.change = j - i;
-              continue wordLoop;
+          for (var i = 0, word; i < $scope.sequence.words.length; i++) {
+            word = $scope.sequence.words[i];
+            for (var j = 0, word2; j < $scope.sequenceCompare.words.length; j++) {
+              word2 = $scope.sequenceCompare.words[j];
+              if (word.id === word2.id) {
+                word.change = word2.change = j - i;
+                continue wordLoop;
+              }
             }
+            word.change = '-';
           }
-          word.change = '-';
-        }
       };
 
       $scope.closeCompare = function() {
@@ -1056,7 +1059,7 @@
         });
       });
 
-      $scope.$watch('topicsShowModels.sequenceIdCompare', function(newVal) {
+      $scope.$watch('topicsShowModels.sequenceIdCompare', function() {
         if (!$scope.topicsShowModels.sequenceIdCompare) return;
 
         SequenceFactory.get({
@@ -1147,9 +1150,9 @@
     }
   ]);
 
-  app.controller('EntitiesShowController', ['$scope',
-    function($scope) {
-
+  app.controller('EntitiesShowController', [
+    function() {
+      // TODO implement
     }
   ]);
 
@@ -1224,9 +1227,9 @@
     }
   ]);
 
-  app.controller('WordsShowController', ['$scope',
-    function($scope) {
-
+  app.controller('WordsShowController', [
+    function() {
+      // TODO implement
     }
   ]);
 
@@ -1310,14 +1313,14 @@
       $scope.sendBugReport = function() {
         var defer = $q.defer(),
           file = document.getElementById('bugScreenshot').files[0];
-        if(file) {
+        if (file) {
           var reader = new FileReader();
           reader.onload = function() {
             defer.resolve(reader.result);
           };
           reader.onabort = function() {
             defer.resolve();
-          }
+          };
           reader.readAsDataURL(file);
         } else {
           defer.resolve();
diff --git a/vipra-ui/app/js/directives.js b/vipra-ui/app/js/directives.js
index 3d668ffb45c9fa9e0af210faf00a9794a166c14a..ce763602453c5b77a3664dcd0a758083249272a1 100644
--- a/vipra-ui/app/js/directives.js
+++ b/vipra-ui/app/js/directives.js
@@ -61,8 +61,8 @@
         $scope.showExcerpt = $scope.excerpt !== 'false';
         $scope.showBadge = $scope.badge !== 'false';
         $scope.toggleExcerpt = function() {
-          if(!$scope.excerptShown) {
-            if($scope.excerpt) {
+          if (!$scope.excerptShown) {
+            if ($scope.excerpt) {
               $scope.excerptShown = true;
             } else {
               ArticleFactory.get({
@@ -76,7 +76,7 @@
           } else {
             $scope.excerptShown = false;
           }
-        }
+        };
       }
     };
   }]);
@@ -179,13 +179,21 @@
     }
   ]);
 
-  app.directive('bsTab', [function() {
+  app.directive('bsTab', ['$timeout', function($timeout) {
     return {
-      link: function($scope, $elem, $attrs)  {
+      link: function($scope, $elem, $attrs) {
+        var hash = $elem.data('target').substring(1);
+        if(location.hash === '#' + hash) {
+          $timeout(function() {
+            $elem.tab('show');
+          }, 0);
+        }
+
         $elem.on('shown.bs.tab', function() {
-          if($attrs.shown) {
+          if ($attrs.shown) {
             $scope.$eval($attrs.shown);
           }
+          location.hash = hash;
         });
       }
     };
@@ -203,23 +211,24 @@
       link: function($scope) {
         var classes = ['alert'];
         $scope.dismissible = $scope.dismissible !== 'false';
-        if($scope.dismissible) {
+        if ($scope.dismissible) {
           classes.push('alert-dismissible');
         }
-        switch($scope.type) {
+        switch ($scope.type) {
           case 'success':
           case 'info':
           case 'warning':
             classes.push('alert-' + $scope.type);
             break;
           case 'danger':
+            /* falls through */
           default:
             classes.push('alert-danger');
         }
         $scope.classes = classes.join(' ');
       },
       templateUrl: 'html/directives/alert.html'
-    }
+    };
   }]);
 
   app.directive('bsDatetimepicker', [function() {
@@ -242,7 +251,7 @@
           });
         });
       }
-    }
+    };
   }]);
 
   app.directive('sequenceDropdown', [function() {
@@ -293,14 +302,14 @@
         };
 
         $scope.$watch('ngModel', function() {
-          if($scope.ngModel === $scope.sortBy)
+          if ($scope.ngModel === $scope.sortBy)
             $scope.reverse = false;
-          else if($scope.ngModel === '-' + $scope.sortBy)
+          else if ($scope.ngModel === '-' + $scope.sortBy)
             $scope.reverse = true;
         });
       },
       transclude: true,
-      template: '<span ng-transclude></span> <i class="fa" ng-class="{\'fa-caret-down\':!reverse, \'fa-caret-up\':reverse}" ng-show="showCaret()"></i>'
+      template: '<span ng-transclude></span> <i class="fa" ng-class="{\'fa-caret-down\':!reverse, \'fa-caret-up\':reverse}" ng-show="showCaret()" ng-cloak></i>'
     };
   }]);
 
@@ -402,9 +411,9 @@
       link: function($scope) {
         $scope.changed = function() {
           var change = parseInt($scope.change);
-          if(!isNaN(change)) {
+          if (!isNaN(change)) {
             $scope.changeVal = change;
-            if(change > 0)
+            if (change > 0)
               $scope.change = '+' + change;
           } else {
             $scope.changeVal = 0;
@@ -414,7 +423,7 @@
         $scope.$watch('change', $scope.changed);
       },
       templateUrl: 'html/directives/change-pos.html'
-    }
+    };
   }]);
 
 })();
\ No newline at end of file
diff --git a/vipra-ui/app/less/app.less b/vipra-ui/app/less/app.less
index 54b73042d6f20d560f0476d7ddc11d4249fe0b01..83d3a28de35fe97ede348a79a378ed0d6b5bae13 100644
--- a/vipra-ui/app/less/app.less
+++ b/vipra-ui/app/less/app.less
@@ -563,4 +563,8 @@ entity-menu {
 
 [ng\:cloak], [ng-cloak], .ng-cloak {
   display: none !important;
+}
+
+[ng\:cloak], [ng-cloak], [data-ng-cloak], [x-ng-cloak], .ng-cloak, .x-ng-cloak, .ng-hide {
+    display: none !important;
 }
\ No newline at end of file
diff --git a/vipra-ui/app/public/android-chrome-144x144.png b/vipra-ui/app/public/android-chrome-144x144.png
deleted file mode 100644
index 65381273deb698c342f41b64eb893d20213ef277..0000000000000000000000000000000000000000
Binary files a/vipra-ui/app/public/android-chrome-144x144.png and /dev/null differ
diff --git a/vipra-ui/app/public/android-chrome-192x192.png b/vipra-ui/app/public/android-chrome-192x192.png
deleted file mode 100644
index aafb35c9c7aa01012b001a1f7836853438499468..0000000000000000000000000000000000000000
Binary files a/vipra-ui/app/public/android-chrome-192x192.png and /dev/null differ
diff --git a/vipra-ui/app/public/android-chrome-36x36.png b/vipra-ui/app/public/android-chrome-36x36.png
deleted file mode 100644
index 6bce0e7b3b45c597b9f204dd858bbf5c712d4d1e..0000000000000000000000000000000000000000
Binary files a/vipra-ui/app/public/android-chrome-36x36.png and /dev/null differ
diff --git a/vipra-ui/app/public/android-chrome-48x48.png b/vipra-ui/app/public/android-chrome-48x48.png
deleted file mode 100644
index 2a39ff69671c5ba5fb84f59dae8349798b6aad17..0000000000000000000000000000000000000000
Binary files a/vipra-ui/app/public/android-chrome-48x48.png and /dev/null differ
diff --git a/vipra-ui/app/public/android-chrome-72x72.png b/vipra-ui/app/public/android-chrome-72x72.png
deleted file mode 100644
index a7ade354c62c1dd8a022c4e0134f809cd9515ed9..0000000000000000000000000000000000000000
Binary files a/vipra-ui/app/public/android-chrome-72x72.png and /dev/null differ
diff --git a/vipra-ui/app/public/android-chrome-96x96.png b/vipra-ui/app/public/android-chrome-96x96.png
deleted file mode 100644
index cc8c4f026464b8f964d934e6a075fe4335c529ef..0000000000000000000000000000000000000000
Binary files a/vipra-ui/app/public/android-chrome-96x96.png and /dev/null differ
diff --git a/vipra-ui/app/public/apple-touch-icon-114x114.png b/vipra-ui/app/public/apple-touch-icon-114x114.png
deleted file mode 100644
index 26b8a7d69827310482e81808a72d3efbba60b56e..0000000000000000000000000000000000000000
Binary files a/vipra-ui/app/public/apple-touch-icon-114x114.png and /dev/null differ
diff --git a/vipra-ui/app/public/apple-touch-icon-120x120.png b/vipra-ui/app/public/apple-touch-icon-120x120.png
deleted file mode 100644
index c18a4b0c4165d83437effce47e4f9ad792ef7b2c..0000000000000000000000000000000000000000
Binary files a/vipra-ui/app/public/apple-touch-icon-120x120.png and /dev/null differ
diff --git a/vipra-ui/app/public/apple-touch-icon-144x144.png b/vipra-ui/app/public/apple-touch-icon-144x144.png
deleted file mode 100644
index ef1fa16a3a67355ba5a7276968b0a30c9e20cb83..0000000000000000000000000000000000000000
Binary files a/vipra-ui/app/public/apple-touch-icon-144x144.png and /dev/null differ
diff --git a/vipra-ui/app/public/apple-touch-icon-152x152.png b/vipra-ui/app/public/apple-touch-icon-152x152.png
deleted file mode 100644
index 9fba2775b8a68a5c1ecbca39b1b6fdf14a2154f9..0000000000000000000000000000000000000000
Binary files a/vipra-ui/app/public/apple-touch-icon-152x152.png and /dev/null differ
diff --git a/vipra-ui/app/public/apple-touch-icon-180x180.png b/vipra-ui/app/public/apple-touch-icon-180x180.png
deleted file mode 100644
index 0180434fdf49860cba267885d4dcea5e30cf6efe..0000000000000000000000000000000000000000
Binary files a/vipra-ui/app/public/apple-touch-icon-180x180.png and /dev/null differ
diff --git a/vipra-ui/app/public/apple-touch-icon-57x57.png b/vipra-ui/app/public/apple-touch-icon-57x57.png
deleted file mode 100644
index 10a252a1ea5bd34a1abed6da4ca0984651683cd8..0000000000000000000000000000000000000000
Binary files a/vipra-ui/app/public/apple-touch-icon-57x57.png and /dev/null differ
diff --git a/vipra-ui/app/public/apple-touch-icon-60x60.png b/vipra-ui/app/public/apple-touch-icon-60x60.png
deleted file mode 100644
index 6768760fbb6a0d7c028044d7e122706d3e5593ee..0000000000000000000000000000000000000000
Binary files a/vipra-ui/app/public/apple-touch-icon-60x60.png and /dev/null differ
diff --git a/vipra-ui/app/public/apple-touch-icon-72x72.png b/vipra-ui/app/public/apple-touch-icon-72x72.png
deleted file mode 100644
index 76be1bfbff4558a65521ce41425adc24c34cd480..0000000000000000000000000000000000000000
Binary files a/vipra-ui/app/public/apple-touch-icon-72x72.png and /dev/null differ
diff --git a/vipra-ui/app/public/apple-touch-icon-76x76.png b/vipra-ui/app/public/apple-touch-icon-76x76.png
deleted file mode 100644
index a8f6f0838af09eeb236b7214af203d0345f72262..0000000000000000000000000000000000000000
Binary files a/vipra-ui/app/public/apple-touch-icon-76x76.png and /dev/null differ
diff --git a/vipra-ui/app/public/apple-touch-icon-precomposed.png b/vipra-ui/app/public/apple-touch-icon-precomposed.png
deleted file mode 100644
index 53e37b390437c21e75ac1b3139c159e9b8eaf7d7..0000000000000000000000000000000000000000
Binary files a/vipra-ui/app/public/apple-touch-icon-precomposed.png and /dev/null differ
diff --git a/vipra-ui/app/public/apple-touch-icon.png b/vipra-ui/app/public/apple-touch-icon.png
deleted file mode 100644
index 0180434fdf49860cba267885d4dcea5e30cf6efe..0000000000000000000000000000000000000000
Binary files a/vipra-ui/app/public/apple-touch-icon.png and /dev/null differ
diff --git a/vipra-ui/app/public/browserconfig.xml b/vipra-ui/app/public/browserconfig.xml
deleted file mode 100644
index 65380f3873df0b1efc837c390c3a91bd2c2c6a14..0000000000000000000000000000000000000000
--- a/vipra-ui/app/public/browserconfig.xml
+++ /dev/null
@@ -1,12 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<browserconfig>
-  <msapplication>
-    <tile>
-      <square70x70logo src="/mstile-70x70.png"/>
-      <square150x150logo src="/mstile-150x150.png"/>
-      <square310x310logo src="/mstile-310x310.png"/>
-      <wide310x150logo src="/mstile-310x150.png"/>
-      <TileColor>#da532c</TileColor>
-    </tile>
-  </msapplication>
-</browserconfig>
diff --git a/vipra-ui/app/public/favicon-16x16.png b/vipra-ui/app/public/favicon-16x16.png
deleted file mode 100644
index cf3c09a89bc2eb35efc55ab635a533c04e598d72..0000000000000000000000000000000000000000
Binary files a/vipra-ui/app/public/favicon-16x16.png and /dev/null differ
diff --git a/vipra-ui/app/public/favicon-32x32.png b/vipra-ui/app/public/favicon-32x32.png
deleted file mode 100644
index dadf3b2e6f39e46f25180ebf233dac0e595a5794..0000000000000000000000000000000000000000
Binary files a/vipra-ui/app/public/favicon-32x32.png and /dev/null differ
diff --git a/vipra-ui/app/public/favicon-96x96.png b/vipra-ui/app/public/favicon-96x96.png
deleted file mode 100644
index 817d8a24219728859aa5cc5e634c092270e18b4b..0000000000000000000000000000000000000000
Binary files a/vipra-ui/app/public/favicon-96x96.png and /dev/null differ
diff --git a/vipra-ui/app/public/manifest.json b/vipra-ui/app/public/manifest.json
deleted file mode 100644
index fd248ba860774e85815f340dca3d7a91b00fc794..0000000000000000000000000000000000000000
--- a/vipra-ui/app/public/manifest.json
+++ /dev/null
@@ -1,41 +0,0 @@
-{
-	"name": "Vipra",
-	"icons": [
-		{
-			"src": "\/android-chrome-36x36.png",
-			"sizes": "36x36",
-			"type": "image\/png",
-			"density": 0.75
-		},
-		{
-			"src": "\/android-chrome-48x48.png",
-			"sizes": "48x48",
-			"type": "image\/png",
-			"density": 1
-		},
-		{
-			"src": "\/android-chrome-72x72.png",
-			"sizes": "72x72",
-			"type": "image\/png",
-			"density": 1.5
-		},
-		{
-			"src": "\/android-chrome-96x96.png",
-			"sizes": "96x96",
-			"type": "image\/png",
-			"density": 2
-		},
-		{
-			"src": "\/android-chrome-144x144.png",
-			"sizes": "144x144",
-			"type": "image\/png",
-			"density": 3
-		},
-		{
-			"src": "\/android-chrome-192x192.png",
-			"sizes": "192x192",
-			"type": "image\/png",
-			"density": 4
-		}
-	]
-}
diff --git a/vipra-ui/app/public/mstile-144x144.png b/vipra-ui/app/public/mstile-144x144.png
deleted file mode 100644
index 89b398770272b9c12ac16f5c810e542f10497e76..0000000000000000000000000000000000000000
Binary files a/vipra-ui/app/public/mstile-144x144.png and /dev/null differ
diff --git a/vipra-ui/app/public/mstile-150x150.png b/vipra-ui/app/public/mstile-150x150.png
deleted file mode 100644
index dc068265457b54bdb8ac5f010aa2eb96ef6a1618..0000000000000000000000000000000000000000
Binary files a/vipra-ui/app/public/mstile-150x150.png and /dev/null differ
diff --git a/vipra-ui/app/public/mstile-310x150.png b/vipra-ui/app/public/mstile-310x150.png
deleted file mode 100644
index b08a4626d1b93684f5bda1877a6e8ef6cdbfbf58..0000000000000000000000000000000000000000
Binary files a/vipra-ui/app/public/mstile-310x150.png and /dev/null differ
diff --git a/vipra-ui/app/public/mstile-310x310.png b/vipra-ui/app/public/mstile-310x310.png
deleted file mode 100644
index e8b6d0106eaa4419b218d40941384d89df500ed6..0000000000000000000000000000000000000000
Binary files a/vipra-ui/app/public/mstile-310x310.png and /dev/null differ
diff --git a/vipra-ui/app/public/mstile-70x70.png b/vipra-ui/app/public/mstile-70x70.png
deleted file mode 100644
index 35d39ae9f74b519b9385484ce26fa9e6fe46d291..0000000000000000000000000000000000000000
Binary files a/vipra-ui/app/public/mstile-70x70.png and /dev/null differ
diff --git a/vipra-ui/app/public/safari-pinned-tab.svg b/vipra-ui/app/public/safari-pinned-tab.svg
deleted file mode 100644
index e8228a317e06bbb96fe61b8f8273f7bd20214b22..0000000000000000000000000000000000000000
--- a/vipra-ui/app/public/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-util/src/main/java/de/vipra/util/Config.java b/vipra-util/src/main/java/de/vipra/util/Config.java
index 5235e4ef59976ddc2ec366a90d3cfd364e89e086..391410401838bbb89e7eb949d3e576edd91e1da5 100644
--- a/vipra-util/src/main/java/de/vipra/util/Config.java
+++ b/vipra-util/src/main/java/de/vipra/util/Config.java
@@ -131,7 +131,7 @@ public class Config {
 	}
 
 	public void clearTopicModelConfigs() {
-		this.topicModelConfigs.clear();
+		topicModelConfigs.clear();
 	}
 
 	public void setDataDirectory(final String dataDirectory) {
diff --git a/vipra-util/src/main/java/de/vipra/util/model/TopicModelFull.java b/vipra-util/src/main/java/de/vipra/util/model/TopicModelFull.java
index 7e3d56b2c992fc0ae4392b29d7b77ac5d8ef0a41..f527d0acb8ea9310d4efc4792235fe42d5dd969a 100644
--- a/vipra-util/src/main/java/de/vipra/util/model/TopicModelFull.java
+++ b/vipra-util/src/main/java/de/vipra/util/model/TopicModelFull.java
@@ -112,7 +112,7 @@ public class TopicModelFull implements Model<String>, Comparable<TopicModelFull>
 		return lastIndexed;
 	}
 
-	public void setLastIndexed(Date lastIndexed) {
+	public void setLastIndexed(final Date lastIndexed) {
 		this.lastIndexed = lastIndexed;
 	}
 
@@ -120,8 +120,9 @@ public class TopicModelFull implements Model<String>, Comparable<TopicModelFull>
 		return windows;
 	}
 
-	public void setWindows(List<Window> windows) {
+	public void setWindows(final List<Window> windows) {
 		this.windows = windows;
+		windowCount = windows != null ? windows.size() : 0;
 	}
 
 	@Override
diff --git a/vipra-util/src/main/java/de/vipra/util/model/Window.java b/vipra-util/src/main/java/de/vipra/util/model/Window.java
index 47191efb6be3d8d6c206779a509a47f27c022986..ca84cc4cbbf0326acce46915651c0ad9ed37ac89 100644
--- a/vipra-util/src/main/java/de/vipra/util/model/Window.java
+++ b/vipra-util/src/main/java/de/vipra/util/model/Window.java
@@ -40,7 +40,7 @@ public class Window implements Serializable, Comparable<Window> {
 		return windowResolution;
 	}
 
-	public void setWindowResolution(WindowResolution windowResolution) {
+	public void setWindowResolution(final WindowResolution windowResolution) {
 		this.windowResolution = windowResolution;
 	}
 
diff --git a/vipra-util/src/main/java/de/vipra/util/service/QueryBuilder.java b/vipra-util/src/main/java/de/vipra/util/service/QueryBuilder.java
index 5d27768a87286e45fd1d6c0cd0158d63a139530d..75875fd06c907c51b5119af5afeb4f5f324fe06f 100644
--- a/vipra-util/src/main/java/de/vipra/util/service/QueryBuilder.java
+++ b/vipra-util/src/main/java/de/vipra/util/service/QueryBuilder.java
@@ -115,9 +115,9 @@ public class QueryBuilder {
 	public QueryBuilder fields(final boolean include, final String... fields) {
 		if (fields != null && fields.length > 0) {
 			if (this.fields != null && this.fields.length > 0 && include != this.include) {
-				Set<String> a = new HashSet<>(Arrays.asList(this.fields));
+				final Set<String> a = new HashSet<>(Arrays.asList(this.fields));
 				a.removeAll(new HashSet<>(Arrays.asList(fields)));
-				if(a.isEmpty()) {
+				if (a.isEmpty()) {
 					this.fields = null;
 				} else {
 					this.fields = a.toArray(new String[a.size()]);