diff --git a/ma-impl.sublime-workspace b/ma-impl.sublime-workspace
index b05d059fba40f443eb1f50c917c7045b8f3ca918..dda352d0d4d451aae5bc7f2a703caa8b78eae3e5 100644
--- a/ma-impl.sublime-workspace
+++ b/ma-impl.sublime-workspace
@@ -279,31 +279,6 @@
 	},
 	"buffers":
 	[
-		{
-			"file": "vipra-ui/app/routes/index.js",
-			"settings":
-			{
-				"buffer_size": 666,
-				"line_ending": "Unix"
-			}
-		},
-		{
-			"file": "vipra-ui/app/templates/index.hbs",
-			"settings":
-			{
-				"buffer_size": 1247,
-				"line_ending": "Unix"
-			}
-		},
-		{
-			"contents": "pagination\nindexing + search\ntopic network visualization\n\ndynamic nmf python\n\nuser:\naccenture",
-			"settings":
-			{
-				"buffer_size": 93,
-				"line_ending": "Unix",
-				"name": "pagination"
-			}
-		}
 	],
 	"build_system": "",
 	"build_system_choices":
@@ -485,22 +460,39 @@
 		"/home/eike/repos/master/ma-impl",
 		"/home/eike/repos/master/ma-impl/vipra-ui",
 		"/home/eike/repos/master/ma-impl/vipra-ui/app",
-		"/home/eike/repos/master/ma-impl/vipra-ui/app/helpers",
+		"/home/eike/repos/master/ma-impl/vipra-ui/app/components",
 		"/home/eike/repos/master/ma-impl/vipra-ui/app/routes",
-		"/home/eike/repos/master/ma-impl/vipra-ui/app/templates"
+		"/home/eike/repos/master/ma-impl/vipra-ui/app/routes/articles",
+		"/home/eike/repos/master/ma-impl/vipra-ui/app/routes/topics",
+		"/home/eike/repos/master/ma-impl/vipra-ui/app/routes/words",
+		"/home/eike/repos/master/ma-impl/vipra-ui/app/templates",
+		"/home/eike/repos/master/ma-impl/vipra-ui/app/templates/articles",
+		"/home/eike/repos/master/ma-impl/vipra-ui/app/templates/components",
+		"/home/eike/repos/master/ma-impl/vipra-ui/app/templates/topics",
+		"/home/eike/repos/master/ma-impl/vipra-ui/app/templates/words"
 	],
 	"file_history":
 	[
-		"/home/eike/repos/master/ma-impl/vipra-ui/app/styles/app.scss",
+		"/home/eike/repos/master/ma-impl/vipra-ui/app/routes/topics/index.js",
+		"/home/eike/repos/master/ma-impl/vipra-ui/app/routes/words/index.js",
+		"/home/eike/repos/master/ma-impl/vipra-ui/app/routes/articles/index.js",
+		"/home/eike/repos/master/ma-impl/vipra-ui/app/templates/articles/index.hbs",
+		"/home/eike/repos/master/ma-impl/vipra-ui/app/templates/topics/index.hbs",
+		"/home/eike/repos/master/ma-impl/vipra-ui/app/components/items-list.js",
+		"/home/eike/repos/master/ma-impl/vipra-ui/app/templates/components/items-list.hbs",
+		"/home/eike/repos/master/ma-impl/vipra-ui/app/templates/words/index.hbs",
+		"/home/eike/repos/master/ma-impl/vipra-ui/app/templates/application.hbs",
+		"/home/eike/repos/master/ma-impl/vipra-ui/app/templates/components/pagination-bar.hbs",
+		"/home/eike/repos/master/ma-impl/vipra-ui/app/components/pagination-bar.js",
+		"/home/eike/repos/master/ma-impl/vipra-ui/app/controllers/words/index.js",
+		"/home/eike/repos/master/ma-impl/vipra-ui/app/controllers/words.js",
+		"/home/eike/repos/master/ma-impl/vipra-ui/app/adapters/application.js",
 		"/home/eike/repos/master/ma-impl/vipra-ui/app/templates/index.hbs",
+		"/home/eike/repos/master/ma-impl/vipra-ui/app/styles/app.scss",
+		"/home/eike/repos/master/ma-impl/vipra-ui/app/helpers/is-empty.js",
 		"/home/eike/repos/master/ma-impl/vipra-ui/app/routes/index.js",
 		"/home/eike/repos/master/ma-impl/vipra-ui/app/models/import.js",
-		"/home/eike/repos/master/ma-impl/vipra-ui/app/templates/application.hbs",
-		"/home/eike/repos/master/ma-impl/vipra-ui/app/helpers/is-empty.js",
 		"/home/eike/repos/master/ma-impl/vipra-ui/app/router.js",
-		"/home/eike/repos/master/ma-impl/vipra-ui/app/templates/articles/index.hbs",
-		"/home/eike/repos/master/ma-impl/vipra-ui/app/routes/articles/index.js",
-		"/home/eike/repos/master/ma-impl/vipra-ui/app/adapters/application.js",
 		"/home/eike/repos/master/ma-impl/vipra-ui/app/styles/sticky-footer.scss",
 		"/home/eike/repos/master/ma-impl/vipra-ui/app/controllers/application.js",
 		"/home/eike/repos/master/ma-impl/vipra-ui/app/components/scroll-top.js",
@@ -510,13 +502,10 @@
 		"/home/eike/repos/master/ma-impl/vipra-ui/app/routes/articles/show.js",
 		"/home/eike/repos/master/ma-impl/vipra-ui/app/templates/articles/menu.hbs",
 		"/home/eike/repos/master/ma-impl/vipra-ui/app/routes/articles/menu.hbs",
-		"/home/eike/repos/master/ma-impl/vipra-ui/app/templates/words/index.hbs",
-		"/home/eike/repos/master/ma-impl/vipra-ui/app/templates/components/items-list.hbs",
 		"/home/eike/repos/master/ma-impl/vipra-ui/app/helpers/pluralize.js",
 		"/home/eike/repos/master/ma-impl/vipra-ui/app/helpers/uppercase.js",
 		"/home/eike/repos/master/ma-impl/vipra-ui/app/templates/words_loading.hbs",
 		"/home/eike/repos/master/ma-impl/vipra-ui/bower.json",
-		"/home/eike/repos/master/ma-impl/vipra-ui/app/templates/topics/index.hbs",
 		"/home/eike/.config/sublime-text-3/Packages/User/Preferences.sublime-settings",
 		"/home/eike/repos/master/ma-impl/vipra-ui/app/templates/topics.hbs",
 		"/home/eike/repos/master/ma-impl/vipra-ui/app/templates/words.hbs",
@@ -529,8 +518,6 @@
 		"/home/eike/repos/master/ma-impl/vipra-ui/app/routes/words/show.js",
 		"/home/eike/repos/master/ma-impl/vipra-ui/app/templates/words/show.hbs",
 		"/home/eike/repos/master/ma-impl/vipra-ui/app/models/word.js",
-		"/home/eike/repos/master/ma-impl/vipra-ui/app/routes/words/index.js",
-		"/home/eike/repos/master/ma-impl/vipra-ui/app/components/items-list.js",
 		"/home/eike/repos/master/ma-impl/vipra-ui/app/routes/words",
 		"/home/eike/repos/master/ma-impl/vipra-ui/app/models/topic.js",
 		"/home/eike/repos/master/ma-impl/vipra-ui/app/models/article.js",
@@ -541,7 +528,6 @@
 		"/home/eike/Downloads/FRITZ.Box 7490 113.06.30_17.01.16_2147.export",
 		"/home/eike/repos/master/ma-impl/vm/data/test-1.json",
 		"/home/eike/repos/master/ma-impl/vm/data/test-2.json",
-		"/home/eike/repos/master/ma-impl/vipra-ui/app/routes/topics/index.js",
 		"/home/eike/.local/share/vipra/jgibb/jgibb",
 		"/home/eike/repos/master/ma-doc/thesis/thesis.tex",
 		"/home/eike/repos/master/ma-impl/Vagrantfile",
@@ -614,11 +600,7 @@
 		"/home/eike/Repositories/fu/ss15/ma/impl/vm/webapps/test/index.html",
 		"/home/eike/Repositories/fu/ss15/ma/impl/vipra-ui/app/controllers/articles/list.js",
 		"/home/eike/Repositories/fu/ss15/ma/impl/vipra-ui/app/router.js",
-		"/home/eike/Repositories/fu/ss15/ma/impl/vipra-ui/app/index.html",
-		"/home/eike/Repositories/fu/ss15/ma/impl/vipra-ui/app/components/search-box.js",
-		"/home/eike/Repositories/fu/ss15/ma/impl/vipra-ui/app/templates/loading.hbs",
-		"/home/eike/Repositories/fu/ss15/ma/impl/vipra-ui/app/templates/not-found.hbs",
-		"/home/eike/Repositories/fu/ss15/ma/impl/vipra-ui/app/templates/articles.hbs"
+		"/home/eike/Repositories/fu/ss15/ma/impl/vipra-ui/app/index.html"
 	],
 	"find":
 	{
@@ -942,98 +924,8 @@
 	"groups":
 	[
 		{
-			"selected": 2,
 			"sheets":
 			[
-				{
-					"buffer": 0,
-					"file": "vipra-ui/app/routes/index.js",
-					"semi_transient": false,
-					"settings":
-					{
-						"buffer_size": 666,
-						"regions":
-						{
-						},
-						"selection":
-						[
-							[
-								333,
-								333
-							]
-						],
-						"settings":
-						{
-							"syntax": "Packages/JavaScriptNext - ES6 Syntax/JavaScriptNext.tmLanguage",
-							"tab_size": 2,
-							"translate_tabs_to_spaces": true
-						},
-						"translation.x": 0.0,
-						"translation.y": 0.0,
-						"zoom_level": 1.0
-					},
-					"stack_index": 1,
-					"type": "text"
-				},
-				{
-					"buffer": 1,
-					"file": "vipra-ui/app/templates/index.hbs",
-					"semi_transient": true,
-					"settings":
-					{
-						"buffer_size": 1247,
-						"regions":
-						{
-						},
-						"selection":
-						[
-							[
-								478,
-								478
-							]
-						],
-						"settings":
-						{
-							"syntax": "Packages/Handlebars/grammars/Handlebars.tmLanguage",
-							"tab_size": 2,
-							"translate_tabs_to_spaces": true
-						},
-						"translation.x": 0.0,
-						"translation.y": 0.0,
-						"zoom_level": 1.0
-					},
-					"stack_index": 2,
-					"type": "text"
-				},
-				{
-					"buffer": 2,
-					"semi_transient": false,
-					"settings":
-					{
-						"buffer_size": 93,
-						"regions":
-						{
-						},
-						"selection":
-						[
-							[
-								83,
-								83
-							]
-						],
-						"settings":
-						{
-							"auto_name": "pagination",
-							"default_dir": "/home/eike/repos/master/ma-impl",
-							"syntax": "Packages/Text/Plain text.tmLanguage"
-						},
-						"translation.x": 0.0,
-						"translation.y": 0.0,
-						"zoom_level": 1.0
-					},
-					"stack_index": 0,
-					"type": "text"
-				}
 			]
 		}
 	],
diff --git a/vipra-ui/app/adapters/application.js b/vipra-ui/app/adapters/application.js
index 0d442b61c170d4fa40db3aae849cc2e0cc783dc3..c14dc91b50c796761e9b28c764ce301880937f35 100644
--- a/vipra-ui/app/adapters/application.js
+++ b/vipra-ui/app/adapters/application.js
@@ -1,7 +1,7 @@
 import DS from 'ember-data';
 
 export default DS.JSONAPIAdapter.extend({
-  host: `http://${window.location.hostname}:8080`,
+  host: `http://${window.location.hostname}:8000`,
   namespace: 'vipra-rest',
   updateRecord(store, type, snapshot) {
     var data = {};
diff --git a/vipra-ui/app/components/items-list.js b/vipra-ui/app/components/items-list.js
index 859d9ed8dcc79978b27e95a8b7eb52ac6c95fef3..48125bb8fd29bfc046ecca7f91301dc21061f8f5 100644
--- a/vipra-ui/app/components/items-list.js
+++ b/vipra-ui/app/components/items-list.js
@@ -2,7 +2,7 @@ import Ember from 'ember';
 
 export default Ember.Component.extend({
 
-  route: "",
+  route: '',
 
   filteredItems: Ember.computed('items', 'filter', function() {
     var keyword = this.get('filter');
diff --git a/vipra-ui/app/components/pagination-bar.js b/vipra-ui/app/components/pagination-bar.js
new file mode 100644
index 0000000000000000000000000000000000000000..d6654db94cfaf900ae1d0ccf51cf37b95321ee96
--- /dev/null
+++ b/vipra-ui/app/components/pagination-bar.js
@@ -0,0 +1,61 @@
+import Ember from 'ember';
+
+export default Ember.Component.extend({
+
+  elements: 2,
+
+  prev: Ember.computed('page', function() {
+    return this.page > 1;
+  }),
+
+  prevPrev: Ember.computed('page', function() {
+    return this.page > this.elements + 1;
+  }),
+
+  prevPage: Ember.computed('page', function() {
+    return this.page - 1;
+  }),
+
+  next: Ember.computed('page', function() {
+    return this.page < Math.ceil(this.total/this.limit*1.0);
+  }),
+
+  nextNext: Ember.computed('page', function() {
+    return this.page < Math.ceil(this.total/this.limit*1.0) - this.elements;
+  }),
+
+  nextPage: Ember.computed('page', function() {
+    return this.page + 1;
+  }),
+
+  lastPage: Ember.computed('page', function() {
+    return Math.ceil(this.total/this.limit*1.0);
+  }),
+
+  pages: Ember.computed('total', 'page', 'limit', 'elements', function() {
+    let pages = [],
+        page  = parseInt(this.page || 1),
+        max   = Math.ceil(this.total/this.limit*1.0),
+        start = Math.max(page - this.elements, 1),
+        end   = Math.min(Math.max(page + this.elements, start + this.elements * 2), max);
+    for(let i = start; i <= end; i++) {
+      pages.push({page:i, active:i===page});
+    }
+    return pages;
+  }),
+
+  enabled: Ember.computed('total', 'limit', function() {
+    return this.total > this.limit;
+  }),
+
+  actions: {
+    prompt() {
+      let lastPage = this.get('lastPage'),
+          page = parseInt(window.prompt(`Enter a page number (between 1 and ${lastPage})`) || 0);
+      if(!isNaN(page) && page > 0 && page < lastPage) {
+        this.set('page', page);
+      }
+    }
+  }
+
+});
diff --git a/vipra-ui/app/helpers/is-empty.js b/vipra-ui/app/helpers/is-empty.js
index 624b9ccb578cfa42b4513f27ac6e96a6bdfdd9ba..19ca8d4420d0b7f9c39ff145866f2b4f18222dda 100644
--- a/vipra-ui/app/helpers/is-empty.js
+++ b/vipra-ui/app/helpers/is-empty.js
@@ -3,8 +3,9 @@ import Ember from 'ember';
 export function isEmpty(params/*, hash*/) {
   let ary = params[0],
       text = params[1];
-  if(!ary || typeof ary.length === "undefined" || !ary.length)
+  if(!ary || typeof ary.length === "undefined" || !ary.length) {
     return text;
+  }
   return null;
 }
 
diff --git a/vipra-ui/app/routes/articles/index.js b/vipra-ui/app/routes/articles/index.js
index e8b133dd62a27dd21f6f3f565eb832e78356032b..7fcaffd1badd98bfcdc6e8cc685533b92ca3b374 100644
--- a/vipra-ui/app/routes/articles/index.js
+++ b/vipra-ui/app/routes/articles/index.js
@@ -1,41 +1,56 @@
 import Ember from 'ember';
 
-var pagelimit = 100;
-var chartData = [];
-var chartOptions = {
-  chart: {
-    zoomType: 'x'
-  },
-  title: {
-    text: 'Articles per month'
-  },
-  legend: {
-    enabled: false
-  },
-  xAxis: {
-    type: 'datetime',
-    title: {
-      text: 'Dates'
+let limit = 100,
+    chartData = [],
+    chartOptions = {
+      chart: {
+        zoomType: 'x'
+      },
+      title: {
+        text: 'Articles per month'
+      },
+      legend: {
+        enabled: false
+      },
+      xAxis: {
+        type: 'datetime',
+        title: {
+          text: 'Dates'
+        }
+      },
+      yAxis: {
+        title: {
+          text: 'Articles'
+        }
+      },
+      tooltip: {
+        headerFormat: '',
+        pointFormat: '{point.x:%b %Y}: {point.y} article(s)'
+      }
+    };
+
+export default Ember.Route.extend({
+  queryParams: {
+    page: {
+      refreshModel: true
     }
   },
-  yAxis: {
-    title: {
-      text: 'Articles'
+
+  model(params) {
+    window.scrollTo(0, 0);
+    
+    let query = {
+      skip: 0,
+      limit: limit
+    };
+
+    if(Ember.isPresent(params.page)) {
+      query.skip = (params.page - 1) * query.limit;
     }
-  },
-  tooltip: {
-    headerFormat: '',
-    pointFormat: '{point.x:%b %Y}: {point.y} article(s)'
-  }
-};
 
-export default Ember.Route.extend({
-  model() {
     return Ember.RSVP.hash({
-      articles: this.store.query('article', {
-        skip: 0,
-        limit: pagelimit
-      }),
+      limit: limit,
+      articles: this.store.query('article', query),
       chartOptions: chartOptions,
       chartData: chartData
     });
diff --git a/vipra-ui/app/routes/topics/index.js b/vipra-ui/app/routes/topics/index.js
index ef14ad4bccdd995300f8c0ec7ec1f248a840a00c..ce1a47c4c8f5f13488d0cd5d1bf966c4217c1454 100644
--- a/vipra-ui/app/routes/topics/index.js
+++ b/vipra-ui/app/routes/topics/index.js
@@ -1,9 +1,31 @@
 import Ember from 'ember';
 
+let limit = 100;
+
 export default Ember.Route.extend({
-  model() {
+
+  queryParams: {
+    page: {
+      refreshModel: true
+    }
+  },
+
+  model(params) {
+    window.scrollTo(0, 0);
+    
+    let query = {
+      skip: 0,
+      limit: limit
+    };
+
+    if(Ember.isPresent(params.page)) {
+      query.skip = (params.page - 1) * query.limit;
+    }
+
     return Ember.RSVP.hash({
-      topics: this.store.findAll('topic')
+      limit: limit,
+      topics: this.store.query('topic', query)
     });
   }
+
 });
\ No newline at end of file
diff --git a/vipra-ui/app/routes/words/index.js b/vipra-ui/app/routes/words/index.js
index 58b02ec39f61170df7ea056f15dee6c5b2d0118a..52c996460a468ae3f4620628e765130d91a1ddc4 100644
--- a/vipra-ui/app/routes/words/index.js
+++ b/vipra-ui/app/routes/words/index.js
@@ -1,9 +1,32 @@
 import Ember from 'ember';
 
+let limit = 200;
+
 export default Ember.Route.extend({
-  model() {
+
+  queryParams: {
+    page: {
+      refreshModel: true
+    }
+  },
+
+  model(params) {
+    window.scrollTo(0, 0);
+    
+    let query = {
+      sort: 'word',
+      skip: 0,
+      limit: limit
+    };
+
+    if(Ember.isPresent(params.page)) {
+      query.skip = (params.page - 1) * query.limit;
+    }
+
     return Ember.RSVP.hash({
-      words: this.store.query('word', {sort:'word'})
+      limit: limit,
+      words: this.store.query('word', query)
     });
   }
+
 });
\ No newline at end of file
diff --git a/vipra-ui/app/styles/app.scss b/vipra-ui/app/styles/app.scss
index f3263a02b9dea1dbd7be8f7a2275fd4164ca7088..34d181cb99b44a717de2fb0d2f0e84007f8eacb0 100644
--- a/vipra-ui/app/styles/app.scss
+++ b/vipra-ui/app/styles/app.scss
@@ -8,8 +8,6 @@
 }
 
 body {
-  // for navbar
-  padding-top: 60px;
   padding-bottom: 20px;
 }
 
@@ -43,13 +41,9 @@ body {
   text-overflow: ellipsis;
 }
 
-.wordfilters a {
-  padding-right: 8px;
-}
-
 .navbar-default {
-  .navbar-nav {
-    &> .active {
+  .collapse:not(.in) {
+    .navbar-nav > .active {
       &> a,
       &> a:hover,
       &> a:focus {
diff --git a/vipra-ui/app/templates/application.hbs b/vipra-ui/app/templates/application.hbs
index 17ab63e86a5f42127b9a189508cefdab927d3741..e7aa4f457199f2be941f802142730f4b802f475a 100644
--- a/vipra-ui/app/templates/application.hbs
+++ b/vipra-ui/app/templates/application.hbs
@@ -1,4 +1,4 @@
-<nav class="navbar navbar-default navbar-fixed-top">
+<nav class="navbar navbar-default navbar-static-top">
   <div class="container-fluid">
     <!-- Brand and toggle get grouped for better mobile display -->
     <div class="navbar-header">
diff --git a/vipra-ui/app/templates/articles/index.hbs b/vipra-ui/app/templates/articles/index.hbs
index de55f79dc3f647407af28147825a8b1137908a4c..8009aa8f82a3c29fe7b516e0665a3a39a6ad7929 100644
--- a/vipra-ui/app/templates/articles/index.hbs
+++ b/vipra-ui/app/templates/articles/index.hbs
@@ -2,12 +2,9 @@
 
 {{dynamic-high-charts content=model.chartData chartOptions=model.chartOptions}}
 
-{{model.articles.meta.total}} {{pluralize model.articles.meta.total 'article'}} in total.
+{{model.articles.meta.total}} {{pluralize model.articles.meta.total 'article'}} in total, {{model.articles.length}} shown.
 
-<br>
-{{debounced-input class='form-control' placeholder='Filter' size='50' value=filter debounce='150'}}
-
-<br>
+<br><br>
 {{items-list items=model.articles filter=filter route='articles.show'}}
 
-{{outlet}}
\ No newline at end of file
+{{pagination-bar total=model.articles.meta.total page=page limit=model.limit}}
\ No newline at end of file
diff --git a/vipra-ui/app/templates/components/items-list.hbs b/vipra-ui/app/templates/components/items-list.hbs
index 8402078b74f1895d8be0c7224c516ade137cf0d5..259c5fd719842aac37065b8785713ae70ac56fd8 100644
--- a/vipra-ui/app/templates/components/items-list.hbs
+++ b/vipra-ui/app/templates/components/items-list.hbs
@@ -1,5 +1,5 @@
-<ol>
+<ul class="list-unstyled">
   {{#each filteredItems as |item|}}
     <li>{{#link-to route item.id}}{{text-marker text=item._name mark=filter}}{{/link-to}}</li>
   {{/each}}
-</ol>
\ No newline at end of file
+</ul>
\ No newline at end of file
diff --git a/vipra-ui/app/templates/components/pagination-bar.hbs b/vipra-ui/app/templates/components/pagination-bar.hbs
new file mode 100644
index 0000000000000000000000000000000000000000..cf9bcc82eaaba746cb1eddf8ab4a36e255240e38
--- /dev/null
+++ b/vipra-ui/app/templates/components/pagination-bar.hbs
@@ -0,0 +1,45 @@
+{{#if enabled}}
+  <nav>
+    <ul class="pagination">
+      <li class="{{unless prev "disabled"}}">
+        {{#if prev}}
+          {{#link-to (query-params page=prevPage)}}&laquo;{{/link-to}}
+        {{else}}
+          <span>&laquo;</span>
+        {{/if}}
+      </li>
+
+      {{#if prevPrev}}
+        <li>
+          {{link-to 1 (query-params page=1)}}
+        </li>
+        <li {{action 'prompt'}}>
+          <span>..</span>
+        </li>
+      {{/if}}
+
+      {{#each pages as |p|}}
+        <li class="{{if p.active "active"}}">
+          {{link-to p.page (query-params page=p.page)}}
+        </li>
+      {{/each}}
+
+      {{#if nextNext}}
+        <li {{action 'prompt'}}>
+          <span>..</span>
+        </li>
+        <li>
+          {{link-to lastPage (query-params page=lastPage)}}
+        </li>
+      {{/if}}
+
+      <li class="{{unless next "disabled"}}">
+        {{#if next}}
+          {{#link-to (query-params page=nextPage)}}&raquo;{{/link-to}}
+        {{else}}
+          <span>&raquo;</span>
+        {{/if}}
+      </li>
+    </ul>
+  </nav>
+{{/if}}
\ No newline at end of file
diff --git a/vipra-ui/app/templates/index.hbs b/vipra-ui/app/templates/index.hbs
index 40099f483c24b310187c2cf82343a49c003cfc2a..9f163524129f08f62dbb09230e7ad4da8375673c 100644
--- a/vipra-ui/app/templates/index.hbs
+++ b/vipra-ui/app/templates/index.hbs
@@ -12,7 +12,7 @@
 
   <br><br>
   <div class="row">
-    <div class="col-md-4 text-center">
+    <div class="col-md-6 text-center">
       <h4>Latest articles</h4>
       <ul class="list-unstyled">
         {{#each model.latestarticles as |article|}}
@@ -20,7 +20,7 @@
         {{/each}}
       </ul>
     </div>
-    <div class="col-md-4 text-center">
+    <div class="col-md-3 text-center">
       <h4>Latest topics</h4>
       <ul class="list-unstyled">
         {{#each model.latesttopics as |topic|}}
@@ -28,7 +28,7 @@
         {{/each}}
       </ul>
     </div>
-    <div class="col-md-4 text-center">
+    <div class="col-md-3 text-center">
       <h4>Latest words</h4>
       <ul class="list-unstyled">
         {{#each model.latestwords as |word|}}
diff --git a/vipra-ui/app/templates/topics/index.hbs b/vipra-ui/app/templates/topics/index.hbs
index 9e5af69add58901f8f9eeb7e458deab6d2c9ddfd..67ca6107d74432768dad94270d47adbe529590a4 100644
--- a/vipra-ui/app/templates/topics/index.hbs
+++ b/vipra-ui/app/templates/topics/index.hbs
@@ -3,4 +3,6 @@
 {{debounced-input class='form-control' placeholder='Filter' size='50' value=filter debounce='150'}}
 
 <br>
-{{items-list items=model.topics filter=filter route='topics.show'}}
\ No newline at end of file
+{{items-list items=model.topics filter=filter route='topics.show'}}
+
+{{pagination-bar total=model.topics.meta.total page=page limit=model.limit}}
\ No newline at end of file
diff --git a/vipra-ui/app/templates/words/index.hbs b/vipra-ui/app/templates/words/index.hbs
index 548c404fb29d00640e8230d57ddffbbecb20d8be..75321f4027c69f10c35e09ff2e168af7ec8fb975 100644
--- a/vipra-ui/app/templates/words/index.hbs
+++ b/vipra-ui/app/templates/words/index.hbs
@@ -2,14 +2,11 @@
 
 <br>
 <p>
-  {{model.words.length}} {{pluralize model.words.length 'Word'}} in the database
-</p>
-
-<br>
-<p class="wordfilters">
-<a href="#" {{action "wordfilter" "A"}}>A</a> <a href="#" {{action "wordfilter" "B"}}>B</a> <a href="#" {{action "wordfilter" "C"}}>C</a> <a href="#" {{action "wordfilter" "D"}}>D</a> <a href="#" {{action "wordfilter" "E"}}>E</a> <a href="#" {{action "wordfilter" "F"}}>F</a> <a href="#" {{action "wordfilter" "G"}}>G</a> <a href="#" {{action "wordfilter" "H"}}>H</a> <a href="#" {{action "wordfilter" "I"}}>I</a> <a href="#" {{action "wordfilter" "J"}}>J</a> <a href="#" {{action "wordfilter" "K"}}>K</a> <a href="#" {{action "wordfilter" "L"}}>L</a> <a href="#" {{action "wordfilter" "M"}}>M</a> <a href="#" {{action "wordfilter" "N"}}>N</a> <a href="#" {{action "wordfilter" "O"}}>O</a> <a href="#" {{action "wordfilter" "P"}}>P</a> <a href="#" {{action "wordfilter" "Q"}}>Q</a> <a href="#" {{action "wordfilter" "R"}}>R</a> <a href="#" {{action "wordfilter" "S"}}>S</a> <a href="#" {{action "wordfilter" "T"}}>T</a> <a href="#" {{action "wordfilter" "U"}}>U</a> <a href="#" {{action "wordfilter" "V"}}>V</a> <a href="#" {{action "wordfilter" "W"}}>W</a> <a href="#" {{action "wordfilter" "X"}}>X</a> <a href="#" {{action "wordfilter" "Y"}}>Y</a> <a href="#" {{action "wordfilter" "Z"}}>Z</a>
+  {{model.words.meta.total}} {{pluralize model.words.meta.total 'Word'}} in the database
 </p>
 
 {{#each model.words as |word|}}
   {{#link-to 'words.show' word.id}}{{word.id}}{{/link-to}}
-{{/each}}
\ No newline at end of file
+{{/each}}
+
+{{pagination-bar total=model.words.meta.total page=page limit=model.limit}}
\ No newline at end of file
diff --git a/vipra-ui/tests/integration/components/pagination-bar-test.js b/vipra-ui/tests/integration/components/pagination-bar-test.js
new file mode 100644
index 0000000000000000000000000000000000000000..d61ba100b35dd7a929eb01f1500c5b6a78c54487
--- /dev/null
+++ b/vipra-ui/tests/integration/components/pagination-bar-test.js
@@ -0,0 +1,25 @@
+import { moduleForComponent, test } from 'ember-qunit';
+import hbs from 'htmlbars-inline-precompile';
+
+moduleForComponent('pagination-bar', 'Integration | Component | pagination bar', {
+  integration: true
+});
+
+test('it renders', function(assert) {
+  
+  // Set any properties with this.set('myProperty', 'value');
+  // Handle any actions with this.on('myAction', function(val) { ... });" + EOL + EOL +
+
+  this.render(hbs`{{pagination-bar}}`);
+
+  assert.equal(this.$().text().trim(), '');
+
+  // Template block usage:" + EOL +
+  this.render(hbs`
+    {{#pagination-bar}}
+      template block text
+    {{/pagination-bar}}
+  `);
+
+  assert.equal(this.$().text().trim(), 'template block text');
+});
diff --git a/vipra-ui/tests/unit/controllers/words-test.js b/vipra-ui/tests/unit/controllers/words-test.js
new file mode 100644
index 0000000000000000000000000000000000000000..f4014164cf8485680e1b6fe2f5d118e816867fa7
--- /dev/null
+++ b/vipra-ui/tests/unit/controllers/words-test.js
@@ -0,0 +1,12 @@
+import { moduleFor, test } from 'ember-qunit';
+
+moduleFor('controller:words', 'Unit | Controller | words', {
+  // Specify the other units that are required for this test.
+  // needs: ['controller:foo']
+});
+
+// Replace this with your real tests.
+test('it exists', function(assert) {
+  let controller = this.subject();
+  assert.ok(controller);
+});