diff --git a/vipra b/vipra
index bd0b989ad934d701d91d9fb573f042535c13aac0..eb76199dd4bdbd26fb745d844eb3c1a1524e1613 100755
--- a/vipra
+++ b/vipra
@@ -10,9 +10,11 @@ if [ $? -ne 0 ]; then
 fi
 
 JARS="$VIPRA_JAR
-/opt/vipra/vipra-cmd/target/vipra-cmd*.jar
-vipra-cmd*.jar
-$DIR/vipra-cmd/target/vipra-cmd*.jar"
+/opt/vipra/vipra-cmd/target/vipra*.jar
+vipra*.jar
+$DIR/vipra-cmd/target/vipra*.jar
+$DIR/target/vipra*.jar
+$DIR/vipra*.jar"
 for f in $JARS
 do
   if [ -f $f ]; then
diff --git a/vipra-cmd/src/main/java/de/vipra/cmd/lda/Analyzer.java b/vipra-cmd/src/main/java/de/vipra/cmd/lda/Analyzer.java
index 0c416a9a9a067acd32305093093e01825ac99a26..8bbdec95453a37b7fbbbadd4c1cce7bd8a9f4761 100644
--- a/vipra-cmd/src/main/java/de/vipra/cmd/lda/Analyzer.java
+++ b/vipra-cmd/src/main/java/de/vipra/cmd/lda/Analyzer.java
@@ -140,7 +140,9 @@ public class Analyzer {
 					avgDuration = smoothingFactor * lastDuration + (1 - smoothingFactor) * avgDuration;
 					final long remainingDuration = (long) avgDuration * (modelConfig.getDynamicMaxIterations() - iteration);
 
-					lastLength = printProgress(tenthPercent, progress, iteration, maxIterationsLength, remainingDuration, modelConfig, lastLength);
+					if (progress <= 100)
+						lastLength = printProgress(tenthPercent, progress, iteration, maxIterationsLength, remainingDuration, modelConfig,
+								lastLength);
 				}
 			}
 
@@ -436,7 +438,8 @@ public class Analyzer {
 
 		for (ListIterator<TopicFull> iter = newTopics.listIterator(); iter.hasNext();) {
 			TopicFull topic = iter.next();
-			if (topic.getArticlesCount() == 0)
+			Integer articlesCount = topic.getArticlesCount();
+			if (articlesCount == null || articlesCount == 0)
 				iter.remove();
 		}
 
diff --git a/vipra-ui/app/html/index.html b/vipra-ui/app/html/index.html
index c849420058cc60a9bfc3cd022c5658380b1a3137..44abb260695dd1e89b51a223d35ace50359fd1ee 100644
--- a/vipra-ui/app/html/index.html
+++ b/vipra-ui/app/html/index.html
@@ -47,7 +47,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>
+          <p class="text-center" ng-if="!latestArticles.length">No articles</p>
         </div>
         <div class="col-md-4 text-center">
           <h4>Latest topics</h4>
@@ -56,7 +56,7 @@
               <topic-link topic="::topic" badge="false" menu="false"/>
             </li>
           </ul>
-          <p class="text-muted text-center" ng-if="!latestTopics.length">No topics</p>
+          <p class="text-center" ng-if="!latestTopics.length">No topics</p>
         </div>
       </div>
     </div>
diff --git a/vipra-ui/app/index.html b/vipra-ui/app/index.html
index ba25f1f959c1ac32e20fe664f5c180a7b3005f5d..18917c14d81bd60da20b9c08e6e8c83ffb4da535 100644
--- a/vipra-ui/app/index.html
+++ b/vipra-ui/app/index.html
@@ -126,8 +126,16 @@
   <div class="alerts">
     <bs-alert ng-model="alert" type="alert.type" ng-repeat="alert in alerts"/>
   </div>
-  <div class="fatal message-container" ng-show="fatal">
+  <div class="overlay-message" ng-show="fatal">
     <div class="message" ng-bind="fatal"></div>
   </div>
+  <div class="overlay-message fadein fadeout" ng-show="loadingScreen">
+    <svg class="logo animate centered" viewBox="0 0 200 120" style="width:200px">
+      <polyline style="animation-delay:0s" class="logo-shape" points="0,0 100,45 100,75 0,0" fill="#006591" />
+      <polyline style="animation-delay:.5s" class="logo-shape" points="100,45 200,0 100,75 100,45" fill="#0079a2" />
+      <polyline style="animation-delay:1s" class="logo-shape" points="100,75 200,0 100,120 100,75" fill="#006591" />
+      <polyline style="animation-delay:1.5s" class="logo-shape" points="0,0 100,75 100,120 0,0" fill="#0079a2" />
+    </svg>
+  </div>
 </body>
 </html>
\ No newline at end of file
diff --git a/vipra-ui/app/js/app.js b/vipra-ui/app/js/app.js
index b4a58accc963979d03aede852ec4e2cc85464497..a5374727954992cdf9090a1efd66fcda9b35917a 100644
--- a/vipra-ui/app/js/app.js
+++ b/vipra-ui/app/js/app.js
@@ -10,6 +10,7 @@
   var app = angular.module('vipra.app', [
     'ngResource',
     'ngSanitize',
+    'ngAnimate',
     'ui.router',
     'cfp.hotkeys',
     'nya.bootstrap.select',
diff --git a/vipra-ui/app/js/controllers.js b/vipra-ui/app/js/controllers.js
index 0303126f12d89eb96861f27871bdbf5cdc8c587a..9f9e5d25eaeff139ba2c62b09e53969cd2a2b5b0 100644
--- a/vipra-ui/app/js/controllers.js
+++ b/vipra-ui/app/js/controllers.js
@@ -9,8 +9,8 @@
 
   var app = angular.module('vipra.controllers', []);
 
-  app.controller('RootController', ['$scope', '$state', '$window', 'hotkeys', 'TopicModelFactory',
-    function($scope, $state, $window, hotkeys, TopicModelFactory) {
+  app.controller('RootController', ['$scope', '$rootScope', '$state', '$window', 'hotkeys', 'TopicModelFactory',
+    function($scope, $rootScope, $state, $window, hotkeys, TopicModelFactory) {
 
       $scope.rootModels = {
         topicModel: null,
@@ -20,13 +20,19 @@
       var prevTopicModelLoading = false;
       if (localStorage.tm) {
         prevTopicModelLoading = true;
+        $rootScope.loadingScreen = true;
+
         TopicModelFactory.get({
           id: localStorage.tm
         }, function(data) {
           $scope.rootModels.topicModel = data;
           prevTopicModelLoading = false;
+          $scope.loadingScreen = false;
         }, function() {
+          delete localStorage.tm;
           prevTopicModelLoading = false;
+          $scope.loadingScreen = false;
+          $scope.chooseTopicModel();
         });
       }
 
diff --git a/vipra-ui/app/less/app.less b/vipra-ui/app/less/app.less
index 075a6a7190cb42f0a818b7c6c864f56808212da8..c846d7cb5197b870ea0dd9a54202f0b4c103f25c 100644
--- a/vipra-ui/app/less/app.less
+++ b/vipra-ui/app/less/app.less
@@ -676,7 +676,7 @@ entity-menu {
   overflow: auto;
 }
 
-.fatal {
+.overlay-message {
   .noselect;
   position: fixed;
   top: 0;
@@ -684,7 +684,7 @@ entity-menu {
   right: 0;
   bottom: 0;
   z-index: 9999;
-  background: rgba(0,0,0,0.1);
+  background: rgba(0,0,0,0.25);
   .message {
     color: #fff;
     font-size: 35px;
@@ -711,13 +711,33 @@ entity-menu {
   }
 }
 
-.index{
+.index {
   .navbar-default {
     border-color: transparent;
     background: rgba(255,255,255,0.6);
   }
 }
 
+.fadein,
+.fadeout {
+  -webkit-transition: all linear .3s;
+  -moz-transition: all linear .3s;
+  -o-transition: all linear .3s;
+  transition: all linear .3s;
+}
+
+.fadein.ng-hide-remove,
+.fadeout.ng-hide-add.ng-hide-add-active {
+  opacity: 0;
+  display: block !important;
+}
+
+.fadeout.ng-hide-add,
+.fadein.ng-hide-remove.ng-hide-remove-active {
+  opacity: 1;
+  display: block !important;
+}
+
 @-moz-keyframes spin {
   100% {
     -moz-transform: rotateY(360deg);
diff --git a/vipra-ui/bower.json b/vipra-ui/bower.json
index 1f12c078c9f2b4dd1951888e967c28d1f96f7c11..160ceb62dc785c0b0244357cfcb83f66e1e9c294 100644
--- a/vipra-ui/bower.json
+++ b/vipra-ui/bower.json
@@ -21,8 +21,8 @@
     "jquery": "^2.x",
     "angular": "^1.x",
     "angular-resource": "^1.x",
-    "angular-ui-router": "^0.x",
     "angular-sanitize": "^1.x",
+    "angular-ui-router": "^0.x",
     "highcharts": "^4.x",
     "vis": "^4.x",
     "moment": "^2.x",
@@ -32,6 +32,7 @@
     "randomcolor": "randomColor#^0.x",
     "bootbox.js": "bootbox#^4.x",
     "angular-hotkeys": "chieffancypants/angular-hotkeys#^1.x",
-    "eonasdan-bootstrap-datetimepicker": "^4.17.37"
+    "eonasdan-bootstrap-datetimepicker": "^4.17.37",
+    "angular-animate": "^1.5.5"
   }
 }
diff --git a/vipra-ui/gulpfile.js b/vipra-ui/gulpfile.js
index 168bf714915f8f9867b5e3f07c67d2b3b889fac0..fb129804a544517dfc9e7eca0156ac7e21e9761b 100644
--- a/vipra-ui/gulpfile.js
+++ b/vipra-ui/gulpfile.js
@@ -15,6 +15,7 @@ var assets = {
     'bower_components/angular/angular.min.js',
     'bower_components/angular-resource/angular-resource.min.js',
     'bower_components/angular-sanitize/angular-sanitize.min.js',
+    'bower_components/angular-animate/angular-animate.min.js',
     'bower_components/angular-hotkeys/build/hotkeys.min.js',
     'bower_components/angular-ui-router/release/angular-ui-router.min.js',
     'bower_components/bootstrap/dist/js/bootstrap.min.js',
diff --git a/vipra-util/src/main/java/de/vipra/util/model/ArticleFull.java b/vipra-util/src/main/java/de/vipra/util/model/ArticleFull.java
index d99298684ae79e37beedd38019831f9b32c5ea6f..1f905fc7d0429b817403f8887d511d9825102653 100644
--- a/vipra-util/src/main/java/de/vipra/util/model/ArticleFull.java
+++ b/vipra-util/src/main/java/de/vipra/util/model/ArticleFull.java
@@ -209,7 +209,9 @@ public class ArticleFull implements Model<ObjectId>, Serializable {
 			return new String[0];
 		final List<String> topics = new ArrayList<>(refs.size());
 		for (final TopicShare ref : refs) {
-			topics.add(ref.getTopic().getName());
+			final Topic topic = ref.getTopic();
+			if(topic != null)
+				topics.add(topic.getName());
 		}
 		return topics.toArray(new String[topics.size()]);
 	}
diff --git a/vipra-util/src/main/java/de/vipra/util/model/ArticleStats.java b/vipra-util/src/main/java/de/vipra/util/model/ArticleStats.java
index 4c012be26281bc08894641f5e001488dac278c8f..c8d25ee66bf0a85c78941779917aee8068219501 100644
--- a/vipra-util/src/main/java/de/vipra/util/model/ArticleStats.java
+++ b/vipra-util/src/main/java/de/vipra/util/model/ArticleStats.java
@@ -13,8 +13,11 @@ public class ArticleStats implements Serializable {
 	private static final long serialVersionUID = -4712841724990200627L;
 
 	private Long wordCount;
+	
 	private Long uniqueWordCount;
+	
 	private Long processedWordCount;
+	
 	private Double reductionRatio;
 
 	public Long getWordCount() {