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 84abb8d57afb903decd3bd6a6079de2e7f3c58ea..4a602a76fd98aa58a63a9977b387a942d1117a3a 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
@@ -156,7 +156,13 @@ public class FilebaseWindowIndex {
 		return window;
 	}
 
-	private void resizeWindows() {
+	public void clear() {
+		windowSizes.clear();
+		windowDates.clear();
+		windowMap.clear();
+	}
+
+	public void resizeWindows() {
 		final List<Date> dates = new ArrayList<>(windowMap.keySet());
 		Collections.sort(dates);
 		windowSizes = new ArrayList<>(windowMap.size());
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 1b0d9b9f64bd9ef55ff71064ea6f3ed401f45e1c..6bad2608731d2011c684a1cfd71366d563e737b9 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
@@ -106,7 +106,13 @@ public class Analyzer {
 
 		BufferedReader in;
 
+		final FilebaseWordIndex wordIndex = new FilebaseWordIndex(modelDir);
+		final FilebaseIDDateIndex idDateIndex = new FilebaseIDDateIndex(modelDir);
+		final FilebaseWindowIndex windowIndex = new FilebaseWindowIndex(modelDir, modelConfig.getWindowResolution());
+
 		if (!reread) {
+			recalcWindows(idDateIndex, windowIndex);
+
 			final Process p = Runtime.getRuntime().exec(command, null);
 			if (!p.isAlive())
 				throw new AnalyzerException("dtm process is dead");
@@ -160,10 +166,6 @@ public class Analyzer {
 			p.waitFor();
 		}
 
-		final FilebaseWordIndex wordIndex = new FilebaseWordIndex(modelDir);
-		final FilebaseIDDateIndex idDateIndex = new FilebaseIDDateIndex(modelDir);
-		final FilebaseWindowIndex windowIndex = new FilebaseWindowIndex(modelDir, modelConfig.getWindowResolution());
-
 		final int topicCount = modelConfig.getkTopics();
 		assert topicCount > 0;
 
@@ -512,4 +514,11 @@ public class Analyzer {
 		return msg.length() - 1;
 	}
 
+	private void recalcWindows(final FilebaseIDDateIndex idDateIndex, final FilebaseWindowIndex windowIndex) throws IOException {
+		windowIndex.clear();
+		for (final FilebaseIDDateIndexEntry date : idDateIndex)
+			windowIndex.add(date.getDate());
+		windowIndex.sync();
+	}
+
 }
diff --git a/vipra-ui/app/html/directives/article-link.html b/vipra-ui/app/html/directives/article-link.html
index 7dcc4456c05ff10b50e5cc4adcc4d47b28fdabbe..ddd58cc3834bed20bad53ebb9fbc1957356988a1 100644
--- a/vipra-ui/app/html/directives/article-link.html
+++ b/vipra-ui/app/html/directives/article-link.html
@@ -1,13 +1,13 @@
 <div class="link-wrapper">
-  <span class="menu-padding">
-    <a class="article-link" ui-sref="articles.show({id:article.id})" ng-attr-title="{{::article.title}}">
-      <span ng-bind="article.title"></span>
-      <ng-transclude/>
-    </a>
+  <span class="menu-padding ellipsis">
     <div class="pull-right article-dropdown">
       <i class="fa text-muted pointer" ng-class="{'fa-chevron-down':!excerptShown,'fa-chevron-up':excerptShown}" ng-click="toggleExcerpt()" ng-if="::showExcerpt" analytics-on analytics-event="Article excerpt" analytics-category="Article actions"></i>
       <span class="badge" ng-bind="::article.topicsCount" ng-attr-title="{{::article.topicsCount}} topic(s)" ng-if="::showBadge"></span>
     </div>
+    <a class="article-link" ui-sref="articles.show({id:article.id})" ng-attr-title="{{::article.title}}">
+      <span ng-bind="article.title"></span>
+      <ng-transclude/>
+    </a>
   </span>
   <article-menu class="menu-button" article="article" ng-if="::showMenu" />
   <div ng-bind="excerpt" ng-if="excerptShown" class="excerpt"></div>
diff --git a/vipra-ui/app/html/directives/topic-link.html b/vipra-ui/app/html/directives/topic-link.html
index 8b34ee860d5bb6121aa8aadf29ed54b7a8beac3b..5782551b36acc19385329085760830211bc6fd7c 100644
--- a/vipra-ui/app/html/directives/topic-link.html
+++ b/vipra-ui/app/html/directives/topic-link.html
@@ -1,10 +1,10 @@
 <div class="link-wrapper">
-  <span class="menu-padding">
+  <span class="menu-padding ellipsis">
+    <span class="badge pull-right" ng-bind="::topic.articlesCount" ng-attr-title="{{::topic.articlesCount}} article(s)" ng-if="::showBadge"></span>
 	  <a class="topic-link" ui-sref="topics.show({id:topic.id})" ng-attr-title="{{::topic.name}}">
 	    <span ng-bind="topic.name"></span>
 	    <ng-transclude/>
 	  </a>
-	  <span class="badge pull-right" ng-bind="::topic.articlesCount" ng-attr-title="{{::topic.articlesCount}} article(s)" ng-if="::showBadge"></span>
 	</span>
   <topic-menu topic="topic" class="menu-button" ng-if="::showMenu" />
 </div>
diff --git a/vipra-ui/app/js/helpers.js b/vipra-ui/app/js/helpers.js
index c8eba43588d65ba0f5b47d82997893220372e945..63dfc88a141f0b67cf7eeed848c6412197d5f150 100644
--- a/vipra-ui/app/js/helpers.js
+++ b/vipra-ui/app/js/helpers.js
@@ -41,35 +41,50 @@
   Vipra.windowLabel = function(date, res) {
     date = moment(date);
     var parts = [];
-    if (res === 'QUARTER') {
-      parts.push('Q' + date.quarter());
-      parts.push(' ');
-      parts.push(date.year());
-    } else {
-      switch (res) {
-        case 'SECOND':
-          parts.push(Vipra.zeroPad(date.second()));
-          /* falls through */
-        case 'MINUTE':
-          parts.push(':');
-          parts.push(Vipra.zeroPad(date.minute()));
-          /* falls through */
-        case 'HOUR':
-          parts.push(':');
-          parts.push(Vipra.zeroPad(date.hour()));
-          /* falls through */
-        case 'DAY':
-          parts.push(' ');
-          parts.push(Vipra.zeroPad(date.day() + 1));
-          /* falls through */
-        case 'MONTH':
-          parts.push('-');
-          parts.push(Vipra.zeroPad(date.month() + 1));
-          /* falls through */
-        case 'YEAR':
-          parts.push('-');
-          parts.push(date.year());
-      }
+    switch (res) {
+      case 'SECOND':
+        parts.push(Vipra.zeroPad(date.second()));
+        /* falls through */
+      case 'MINUTE':
+        parts.push(':');
+        parts.push(Vipra.zeroPad(date.minute()));
+        /* falls through */
+      case 'HOUR':
+        parts.push(':');
+        parts.push(Vipra.zeroPad(date.hour()));
+        /* falls through */
+      case 'DAY':
+        parts.push(' ');
+        parts.push(Vipra.zeroPad(date.day() + 1));
+        /* falls through */
+      case 'MONTH':
+        parts.push('-');
+        parts.push(Vipra.zeroPad(date.month() + 1));
+        /* falls through */
+      case 'YEAR':
+        parts.push('-');
+        parts.push(date.year());
+        break;
+      case 'WEEK':
+        parts.push('W' + date.week());
+        parts.push(' ');
+        parts.push(date.year());
+        break;
+      case 'SEMESTER':
+        parts.push('S' + date.month() < 6 ? 1 : 2);
+        parts.push(' ');
+        parts.push(date.year());
+        break;
+      case 'TRIMESTER':
+        var month = date.month();
+        parts.push('T' + month < 4 ? 1 : month < 8 ? 2 : 3);
+        parts.push(' ');
+        parts.push(date.year());
+        break;
+      case 'QUARTER':
+        parts.push('Q' + date.quarter());
+        parts.push(' ');
+        parts.push(date.year());
     }
     var rtrim = /^[\s\uFEFF\xA0:-]+|[\s\uFEFF\xA0:-]+$/g;
     return parts.reverse().join('').replace(rtrim, '');
diff --git a/vipra-util/src/main/java/de/vipra/util/CountMap.java b/vipra-util/src/main/java/de/vipra/util/CountMap.java
index 8bca6b168f763e07c9e3b7642a6f82e573a6e1d7..6a7953df892699512ec8df59eeaf34e1e79404fd 100644
--- a/vipra-util/src/main/java/de/vipra/util/CountMap.java
+++ b/vipra-util/src/main/java/de/vipra/util/CountMap.java
@@ -53,4 +53,8 @@ public class CountMap<T> {
 		return map.containsKey(key);
 	}
 
+	public void clear() {
+		map.clear();
+	}
+
 }
diff --git a/vipra-util/src/main/java/de/vipra/util/service/MongoService.java b/vipra-util/src/main/java/de/vipra/util/service/MongoService.java
index 67f11bda558ecd8b06ef8cac3eaaaae81b47f21f..90ea54693c35ca8f07122f6ffae926946ab12b45 100644
--- a/vipra-util/src/main/java/de/vipra/util/service/MongoService.java
+++ b/vipra-util/src/main/java/de/vipra/util/service/MongoService.java
@@ -3,6 +3,7 @@ package de.vipra.util.service;
 import java.lang.reflect.Field;
 import java.util.ArrayList;
 import java.util.HashMap;
+import java.util.Iterator;
 import java.util.List;
 import java.util.Map;
 
@@ -110,6 +111,20 @@ public class MongoService<Type extends Model<IdType>, IdType> {
 		return getMultiple(QueryBuilder.builder().fields(true, fields));
 	}
 
+	public Iterator<Type> getAllIterator(final QueryBuilder builder) {
+		final Query<Type> query = datastore.createQuery(clazz);
+
+		if (builder != null) {
+			builder.build(query);
+			if (builder.getFields() == null && !builder.isAllFields() && ignoredFieldsMultiQuery.length > 0) {
+				query.retrievedFields(false, ignoredFieldsMultiQuery);
+			}
+		} else if (ignoredFieldsMultiQuery.length > 0) {
+			query.retrievedFields(false, ignoredFieldsMultiQuery);
+		}
+		return query.iterator();
+	}
+
 	public Type createSingle(final Type t) throws DatabaseException {
 		if (t == null)
 			throw new DatabaseException(new NullPointerException("entity is null"));