diff --git a/vipra-cmd/src/main/java/de/vipra/cmd/lda/JGibbAnalyzer.java b/vipra-cmd/src/main/java/de/vipra/cmd/lda/JGibbAnalyzer.java
index 65d021a34b255bda3f08155be05838fb7bae48e0..1845ac5a34c9f1bfac64f409963db55ada428968 100644
--- a/vipra-cmd/src/main/java/de/vipra/cmd/lda/JGibbAnalyzer.java
+++ b/vipra-cmd/src/main/java/de/vipra/cmd/lda/JGibbAnalyzer.java
@@ -101,11 +101,8 @@ public class JGibbAnalyzer extends Analyzer {
 					// discovered (line does not start with a tab). Cut off
 					// after k words are gathered.
 					String nextLine;
-					int words = 0;
 					while ((nextLine = nextLine()) != null) {
 						if (nextLine.startsWith("\t")) {
-							if (words > Constants.K_TOPIC_WORDS)
-								continue;
 							String[] parts = nextLine.trim().split("\\s+");
 							try {
 								Word word = wordMap.get(parts[0]);
@@ -113,7 +110,6 @@ public class JGibbAnalyzer extends Analyzer {
 										Constants.LIKELINESS_PRECISION);
 								TopicWord topicWord = new TopicWord(word, likeliness);
 								topicWords.add(topicWord);
-								words++;
 							} catch (NumberFormatException e) {
 								log.error("could not parse number in line: " + nextLine);
 							} catch (ArrayIndexOutOfBoundsException e) {
diff --git a/vipra-cmd/src/main/java/de/vipra/cmd/option/ModelingCommand.java b/vipra-cmd/src/main/java/de/vipra/cmd/option/ModelingCommand.java
index 8f0b79fa54d5e2135c7f0e9600e40865e3831496..25d948904b78de46aff916dcc581f4485a6b4e43 100644
--- a/vipra-cmd/src/main/java/de/vipra/cmd/option/ModelingCommand.java
+++ b/vipra-cmd/src/main/java/de/vipra/cmd/option/ModelingCommand.java
@@ -107,7 +107,7 @@ public class ModelingCommand implements Command {
 		while (indexIter.hasNext() && topicRefsListIter.hasNext()) {
 			// get article from database
 			String id = indexIter.next();
-			ArticleFull article = dbArticles.getSingle(MongoUtils.objectId(id));
+			ArticleFull article = dbArticles.getSingle(MongoUtils.objectId(id), "processedText");
 			if (article == null) {
 				log.error("no article found in db for id " + id);
 				continue;
diff --git a/vipra-ui/app/html/index-menu.html b/vipra-ui/app/html/index-menu.html
deleted file mode 100644
index aa1e3f4110b2f193a1dc3ee4ac68ad159ce9e254..0000000000000000000000000000000000000000
--- a/vipra-ui/app/html/index-menu.html
+++ /dev/null
@@ -1 +0,0 @@
-<li><a>Advanced</a></li>
\ No newline at end of file
diff --git a/vipra-ui/app/html/topics/show.html b/vipra-ui/app/html/topics/show.html
index 9ca80d168a892da0382fc54057687b90acad97bb..3f11638f931fdedfb5caa7f57bd70abf7297504c 100644
--- a/vipra-ui/app/html/topics/show.html
+++ b/vipra-ui/app/html/topics/show.html
@@ -38,7 +38,7 @@
   </thead>
   <tbody>
     <tr ng-repeat="word in ::topic.words">
-      <td><a ui-sref="words.show({id:word.word})" ng-bind="word.word"></a></td>
+      <td><a ui-sref="words.show({id:word.id})" ng-bind="word.id"></a></td>
       <td ng-bind="word.likeliness"></td>
     </tr>
   </tbody>
diff --git a/vipra-ui/app/index.html b/vipra-ui/app/index.html
index e1232a7dc4598262e9687defb374b03946a94a17..215b50a1fc6e371451469ea385141febcce31fcb 100644
--- a/vipra-ui/app/index.html
+++ b/vipra-ui/app/index.html
@@ -55,7 +55,6 @@
             <li ui-sref-active="active"><a ui-sref="topics.index">Topics</a></li>
             <li ui-sref-active="active"><a ui-sref="words.index">Words</a></li>
           </ul>
-          <ul class="nav navbar-nav navbar-right" ui-view="menu"></ul>
         </div><!-- /.navbar-collapse -->
       </div><!-- /.container-fluid -->
     </nav>
diff --git a/vipra-ui/app/js/directives.js b/vipra-ui/app/js/directives.js
index 4db6af286da54dc9f4b2f7966d18e2fa75380a4b..9ed3dd5a01c234025f4dc9f7b0c82e329c69b05a 100644
--- a/vipra-ui/app/js/directives.js
+++ b/vipra-ui/app/js/directives.js
@@ -76,6 +76,7 @@
             edges = [],
             articleColor = '#BBC9D2',
             topicColor = '#DBB234',
+            wordColor = '#B6C7BD',
             container = $element.find("#visgraph")[0];
 
         $scope.articleColor = articleColor;
@@ -134,6 +135,41 @@
             }
           };
         };
+
+        var wordNode = function(word) {
+          return {
+            id: ++id,
+            title: word.word,
+            label: word.word,
+            type: 'word',
+            word: word.word,
+            color: {
+              background: wordColor,
+              highlight: { background: wordColor }
+            }
+          };
+        };
+
+        var constructor = function(result, key, nodeFunction) {
+          if(result.data && result.data[key]) {
+            var data = result.data[key],
+                newNodes = [],
+                newEdges = [];
+            for(var i = 0; i < data.length; i++) {
+              var current = data[i];
+              if(ids.hasOwnProperty(current.id)) {
+                if(!$scope.nodes.get(ids[current.id]).loaded)
+                  newEdges.push({from:ids[current.id], to:node.id});
+              } else {
+                newNodes.push(nodeFunction(current));
+                newEdges.push({from:id, to:node.id});
+                ids[current.id] = id;
+              }
+            }
+            if(newNodes.length) $scope.nodes.add(newNodes);
+            if(newEdges.length) $scope.edges.add(newEdges);
+          }
+        };
         
         // on node select
         var selectTimeout;
@@ -145,46 +181,17 @@
               if(node.type === 'article') {
                 // node is article, load article to get topics
                 ArticleFactory.get({id:node.article}, function(res) {
-                  if(res.data && res.data.topics) {
-                    var topics = res.data.topics,
-                        newNodes = [],
-                        newEdges = [];
-                    for(var i = 0; i < topics.length; i++) {
-                      var topic =  topics[i].topic;
-                      if(ids.hasOwnProperty(topic.id)) {
-                        if(!$scope.nodes.get(ids[topic.id]).loaded)
-                          newEdges.push({from:node.id, to:ids[topic.id]});
-                      } else {
-                        newNodes.push(topicNode(topic));
-                        newEdges.push({from:node.id, to:id});
-                        ids[topic.id] = id;
-                      }
-                    }
-                    if(newNodes.length) $scope.nodes.add(newNodes);
-                    if(newEdges.length) $scope.edges.add(newEdges);
-                  }
+                  constructor(res, 'topics', topicNode);
                 });
-              } else {
-                // node is topic, load topic to get articles
+              } else if(node.type === 'topic') {
+                // node is topic, load topic to get words
                 TopicFactory.get({id:node.topic}, function(res) {
-                  if(res.data && res.data.articles) {
-                    var articles = res.data.articles,
-                        newNodes = [],
-                        newEdges = [];
-                    for(var i = 0; i < articles.length; i++) {
-                      var article = articles[i];
-                      if(ids.hasOwnProperty(article.id)) {
-                        if(!$scope.nodes.get(ids[article.id]).loaded)
-                          newEdges.push({from:ids[article.id], to:node.id});
-                      } else {
-                        newNodes.push(articleNode(article));
-                        newEdges.push({from:id, to:node.id});
-                        ids[article.id] = id;
-                      }
-                    }
-                    if(newNodes.length) $scope.nodes.add(newNodes);
-                    if(newEdges.length) $scope.edges.add(newEdges);
-                  }
+                  constructor(res, 'words', wordNode);
+                });
+              } else if(node.type === 'word') {
+                // node is word, load word to get topics
+                WordFactory.get({id:node.word}, function(res) {
+                  constructor(res, 'topics', topicNode);
                 });
               }
               node.loaded = true;
@@ -199,8 +206,10 @@
           var node = $scope.nodes.get(props.nodes[0]);
           if(node.type === 'article')
             $state.transitionTo('articles.show', {id:node.article});
-          else
+          else if(node.type === 'topic')
             $state.transitionTo('topics.show', {id:node.topic});
+          else if(node.type === 'word')
+            $state.transitionTo('words.show', {id:node.word});
         };
 
         // watch for changes to model
@@ -210,8 +219,10 @@
           // root node
           if($scope.visType === 'articles')
             nodes.push(articleNode($scope.ngModel));
-          else
+          else if($scope.visType === 'topics')
             nodes.push(topicNode($scope.ngModel));
+          else if($scope.visType === 'words')
+            nodes.push(wordNode($scope.ngModel));
           ids[$scope.ngModel.id] = id;
 
           // add nodes and edges
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 4380c73381077fca6bee3b2e643552bc71ff2d8b..8a17356a72544aaf547474f3b41250fe0d104b70 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
@@ -47,7 +47,7 @@ public class ArticleFull extends FileModel<ObjectId> implements Serializable {
 	private String text;
 
 	@ElasticIndex("text")
-	@QueryIgnore(multi = true)
+	@QueryIgnore(all = true)
 	private String processedText;
 
 	private String url;
diff --git a/vipra-util/src/main/java/de/vipra/util/model/TopicWord.java b/vipra-util/src/main/java/de/vipra/util/model/TopicWord.java
index bd79ed2b418461b4f33432d7537c765e479e80a1..ad75e6f5b947e577a7d68281babf051af087f92e 100644
--- a/vipra-util/src/main/java/de/vipra/util/model/TopicWord.java
+++ b/vipra-util/src/main/java/de/vipra/util/model/TopicWord.java
@@ -17,7 +17,7 @@ public class TopicWord implements Comparable<TopicWord>, Serializable {
 	@JsonIgnore
 	private Word word;
 
-	@JsonProperty("word")
+	@JsonProperty("id")
 	private String wordString;
 
 	private Double likeliness;
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 519d30efc8bd47809b2ca490437b7558b2ea5208..912be211f6e54187e9459023cb106fcd87b535b8 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
@@ -2,10 +2,7 @@ package de.vipra.util.service;
 
 import java.lang.reflect.Field;
 import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.HashSet;
 import java.util.List;
-import java.util.Set;
 
 import org.mongodb.morphia.Datastore;
 import org.mongodb.morphia.query.Query;
@@ -54,7 +51,7 @@ public class MongoService<Type extends Model<IdType>, IdType> implements Service
 		if (cache == null || (fields != null && fields.length > 0) || !cache.contains(id)) {
 			Query<Type> q = datastore.createQuery(clazz).field("_id").equal(id);
 			if (fields != null && fields.length > 0)
-				q.retrievedFields(true, setMinus(fields, ignoredFieldsSingle));
+				q.retrievedFields(true, fields);
 			else if (ignoredFieldsSingle.length > 0)
 				q.retrievedFields(false, ignoredFieldsSingle);
 			t = q.get();
@@ -75,14 +72,7 @@ public class MongoService<Type extends Model<IdType>, IdType> implements Service
 	public List<Type> getMultiple(Integer skip, Integer limit, String sortBy, Pair<String, Object> criteria,
 			String... fields) {
 		return getMultiple(
-				QueryBuilder.builder().skip(skip).limit(limit).sortBy(sortBy).criteria(criteria).fields(true, fields));
-	}
-
-	@Override
-	public List<Type> getMultiple(Integer skip, Integer limit, String sortBy, Pair<String, Object> criteria,
-			boolean defaultIgnore, String... fields) {
-		return getMultiple(QueryBuilder.builder().skip(skip).limit(limit).sortBy(sortBy).fields(true, fields)
-				.criteria(criteria).defaultIgnore(defaultIgnore));
+				QueryBuilder.builder().skip(skip).limit(limit).sortBy(sortBy).fields(true, fields).criteria(criteria));
 	}
 
 	@Override
@@ -100,12 +90,8 @@ public class MongoService<Type extends Model<IdType>, IdType> implements Service
 		if (builder.getFields() != null) {
 			String[] fields = builder.getFields();
 			if (builder.isInclude()) {
-				if (builder.isDefaultIgnore() && ignoredFieldsMulti.length > 0)
-					fields = setMinus(fields, ignoredFieldsMulti);
 				q.retrievedFields(true, fields);
 			} else {
-				if (builder.isDefaultIgnore() && ignoredFieldsMulti.length > 0)
-					fields = setPlus(fields, ignoredFieldsMulti);
 				q.retrievedFields(false, fields);
 			}
 		} else if (ignoredFieldsMulti.length > 0) {
@@ -173,24 +159,4 @@ public class MongoService<Type extends Model<IdType>, IdType> implements Service
 		return new MongoService<Type, IdType>(mongo, clazz);
 	}
 
-	private String[] setMinus(String[] a, String[] b) {
-		if (a != null && b != null) {
-			Set<String> sa = new HashSet<>(Arrays.asList(a));
-			Set<String> sb = new HashSet<>(Arrays.asList(b));
-			sa.removeAll(sb);
-			return sa.toArray(new String[sa.size()]);
-		}
-		return a;
-	}
-
-	private String[] setPlus(String[] a, String[] b) {
-		if (a != null && b != null) {
-			Set<String> sa = new HashSet<>(Arrays.asList(a));
-			Set<String> sb = new HashSet<>(Arrays.asList(b));
-			sa.addAll(sb);
-			return sa.toArray(new String[sa.size()]);
-		}
-		return a;
-	}
-
 }
diff --git a/vipra-util/src/main/java/de/vipra/util/service/Service.java b/vipra-util/src/main/java/de/vipra/util/service/Service.java
index d83fe03e223c1384538df773b06b4106f58f6afb..a02b434337c2c016be9ebce5e2254f8e4097888c 100644
--- a/vipra-util/src/main/java/de/vipra/util/service/Service.java
+++ b/vipra-util/src/main/java/de/vipra/util/service/Service.java
@@ -43,12 +43,6 @@ public interface Service<Type extends Model<IdType>, IdType, E extends Exception
 	List<Type> getMultiple(Integer skip, Integer limit, String sortBy, Pair<String, Object> criteria, String... fields)
 			throws E;
 
-	/**
-	 * @see {@link Service#getMultiple(QueryBuilder)}
-	 */
-	List<Type> getMultiple(Integer skip, Integer limit, String sortBy, Pair<String, Object> criteria,
-			boolean noDefaultIgnore, String... fields) throws E;
-
 	/**
 	 * Returns multiple entities from the database.
 	 * 
@@ -147,7 +141,6 @@ public interface Service<Type extends Model<IdType>, IdType, E extends Exception
 		private List<Pair<String, Object>> criteria;
 		private String[] fields;
 		private boolean include;
-		private boolean defaultIgnore = true;
 
 		private QueryBuilder() {}
 
@@ -242,19 +235,6 @@ public interface Service<Type extends Model<IdType>, IdType, E extends Exception
 			return this;
 		}
 
-		/**
-		 * Whether to use default ignoring fields or not. Some fields are
-		 * ignored by default, as per defined in the models.
-		 * 
-		 * @param defaultIgnore
-		 *            true to use default ignoring
-		 * @return QueryBuilder instance
-		 */
-		public QueryBuilder defaultIgnore(boolean defaultIgnore) {
-			this.defaultIgnore = defaultIgnore;
-			return this;
-		}
-
 		public Integer getSkip() {
 			return skip;
 		}
@@ -279,10 +259,6 @@ public interface Service<Type extends Model<IdType>, IdType, E extends Exception
 			return fields;
 		}
 
-		public boolean isDefaultIgnore() {
-			return defaultIgnore;
-		}
-
 	}
 
 }