diff --git a/vipra-ui/app/html/articles/index.html b/vipra-ui/app/html/articles/index.html
index 6479cf27dd8575314c1e14c93a66a095e84aa670..2037f1dfd28452ecff1125f5f20dd54a8a79bef1 100644
--- a/vipra-ui/app/html/articles/index.html
+++ b/vipra-ui/app/html/articles/index.html
@@ -1,37 +1,21 @@
 <div ng-cloak ng-hide="!rootModels.topicModel || state.name !== 'articles'">
-  <menu-affix>
-    <div class="text-center">
-      <pagination total="articlesTotal" page="articlesIndexModels.page" limit="articlesIndexModels.limit" />
-    </div>
-  </menu-affix>
   <div class="container">
-    <div class="row row-spaced">
-      <div class="col-md-8 text-center">
-        <char-selector ng-model="articlesIndexModels.startChar"/>
-      </div>
-      <div class="col-md-4">
-        <div class="btn-group btn-group-justified">
-          <input type="text" class="form-control" ng-model="articlesIndexModels.contains" placeholder="Filter..." ng-model-options="{debounce:300}">
-          <span class="glyphicon glyphicon-remove-circle searchclear" ng-click="articlesIndexModels.contains=''" analytics-on analytics-event="Articles Filter (clear)" analytics-category="Filter actions"></span>
+    <div class="row">
+      <div class="col-sm-12 hidden-md hidden-lg">
+        <div class="text-center">
+          <pagination total="articlesTotal" page="articlesIndexModels.page" limit="articlesIndexModels.limit" />
         </div>
       </div>
     </div>
     <div class="row">
-      <div class="col-md-12">
+      <div class="col-md-9 col-sm-12">
         <div class="panel panel-default">
-          <div class="panel-heading">
+          <div class="panel-heading clearfix">
             Found
             <ng-pluralize count="articlesTotal||0" when="{0:'no articles',1:'1 article',other:'{} articles'}"></ng-pluralize> in the database.
-            <span ng-show="articlesTotal > 0" 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>
-                <li value="date" class="nya-bs-option"><a>Date</a></li>
-                <li value="created" class="nya-bs-option"><a>Added</a></li>
-                <li value="topicsCount" class="nya-bs-option"><a># of topics</a></li>
-              </ol>
-              <sort-dir ng-model="articlesIndexModels.sortdir" />
-            </span>
+            <div class="pull-right">
+              Page <span ng-bind="wordsIndexModels.page||1"></span> of <span ng-bind="maxPage||1"></span>
+            </div>
           </div>
           <table class="table table-hover table-condensed table-fixed">
             <tbody>
@@ -48,8 +32,44 @@
               </tr>
             </tbody>
           </table>
-          <div class="panel-footer">
-            Page <span ng-bind="articlesIndexModels.page||1"></span> of <span ng-bind="maxPage||1"></span>
+          <div class="panel-footer clearfix">
+            <div class="pull-right">
+              Page <span ng-bind="wordsIndexModels.page||1"></span> of <span ng-bind="maxPage||1"></span>
+            </div>
+          </div>
+        </div>
+      </div>
+      <div class="col-md-3 hidden-sm">
+        <div class="sidebar-affix">
+          <div>
+            <div class="form-group">
+              <pagination-full total="articlesTotal" page="articlesIndexModels.page" limit="articlesIndexModels.limit" />
+            </div>
+            <hr>
+            <div class="form-group">
+              <div class="btn-group btn-group-justified">
+                <input type="text" class="form-control" ng-model="articlesIndexModels.contains" placeholder="Filter..." ng-model-options="{debounce:300}">
+                <span class="glyphicon glyphicon-remove-circle searchclear" ng-click="articlesIndexModels.contains=''" analytics-on analytics-event="Entities Filter (clear)" analytics-category="Filter actions"></span>
+              </div>
+            </div>
+            <div class="form-group">
+              <label for="initial">Initial letter</label>
+              <char-selector id="initial" ng-model="articlesIndexModels.startChar"/>
+            </div>
+            <div class="form-group">
+              <label>Sort by</label>
+              <div class="input-group">
+                <select class="form-control" ng-model="articlesIndexModels.sortkey">
+                  <option value="title">Title</option>
+                  <option value="date">Date</option>
+                  <option value="created">Added</option>
+                  <option value="topicsCount"># of topics</option>
+                </select>
+                <span class="input-group-btn">
+                  <sort-dir ng-model="articlesIndexModels.sortdir" />
+                </span>
+              </div>
+            </div>
           </div>
         </div>
       </div>
diff --git a/vipra-ui/app/html/directives/char-selector.html b/vipra-ui/app/html/directives/char-selector.html
index e557178b19dcf7994f0c5508e0792628b7a30823..7747f99edcecdf38489776e512b28db21bf7663b 100644
--- a/vipra-ui/app/html/directives/char-selector.html
+++ b/vipra-ui/app/html/directives/char-selector.html
@@ -1,29 +1,29 @@
-<div class="char-selector">
-  <a ng-class="{selected:!ngModel}"      data-char=""  analytics-on analytics-event="Char selector ()"  analytics-category="Filter actions">All</a>
-  <a ng-class="{selected:ngModel==='A'}" data-char="A" analytics-on analytics-event="Char selector (A)" analytics-category="Filter actions">A</a>
-  <a ng-class="{selected:ngModel==='B'}" data-char="B" analytics-on analytics-event="Char selector (B)" analytics-category="Filter actions">B</a>
-  <a ng-class="{selected:ngModel==='C'}" data-char="C" analytics-on analytics-event="Char selector (C)" analytics-category="Filter actions">C</a>
-  <a ng-class="{selected:ngModel==='D'}" data-char="D" analytics-on analytics-event="Char selector (D)" analytics-category="Filter actions">D</a>
-  <a ng-class="{selected:ngModel==='E'}" data-char="E" analytics-on analytics-event="Char selector (E)" analytics-category="Filter actions">E</a>
-  <a ng-class="{selected:ngModel==='F'}" data-char="F" analytics-on analytics-event="Char selector (F)" analytics-category="Filter actions">F</a>
-  <a ng-class="{selected:ngModel==='G'}" data-char="G" analytics-on analytics-event="Char selector (G)" analytics-category="Filter actions">G</a>
-  <a ng-class="{selected:ngModel==='H'}" data-char="H" analytics-on analytics-event="Char selector (H)" analytics-category="Filter actions">H</a>
-  <a ng-class="{selected:ngModel==='I'}" data-char="I" analytics-on analytics-event="Char selector (I)" analytics-category="Filter actions">I</a>
-  <a ng-class="{selected:ngModel==='J'}" data-char="J" analytics-on analytics-event="Char selector (J)" analytics-category="Filter actions">J</a>
-  <a ng-class="{selected:ngModel==='K'}" data-char="K" analytics-on analytics-event="Char selector (K)" analytics-category="Filter actions">K</a>
-  <a ng-class="{selected:ngModel==='L'}" data-char="L" analytics-on analytics-event="Char selector (L)" analytics-category="Filter actions">L</a>
-  <a ng-class="{selected:ngModel==='M'}" data-char="M" analytics-on analytics-event="Char selector (M)" analytics-category="Filter actions">M</a>
-  <a ng-class="{selected:ngModel==='N'}" data-char="N" analytics-on analytics-event="Char selector (N)" analytics-category="Filter actions">N</a>
-  <a ng-class="{selected:ngModel==='O'}" data-char="O" analytics-on analytics-event="Char selector (O)" analytics-category="Filter actions">O</a>
-  <a ng-class="{selected:ngModel==='P'}" data-char="P" analytics-on analytics-event="Char selector (P)" analytics-category="Filter actions">P</a>
-  <a ng-class="{selected:ngModel==='Q'}" data-char="Q" analytics-on analytics-event="Char selector (Q)" analytics-category="Filter actions">Q</a>
-  <a ng-class="{selected:ngModel==='R'}" data-char="R" analytics-on analytics-event="Char selector (R)" analytics-category="Filter actions">R</a>
-  <a ng-class="{selected:ngModel==='S'}" data-char="S" analytics-on analytics-event="Char selector (S)" analytics-category="Filter actions">S</a>
-  <a ng-class="{selected:ngModel==='T'}" data-char="T" analytics-on analytics-event="Char selector (T)" analytics-category="Filter actions">T</a>
-  <a ng-class="{selected:ngModel==='U'}" data-char="U" analytics-on analytics-event="Char selector (U)" analytics-category="Filter actions">U</a>
-  <a ng-class="{selected:ngModel==='V'}" data-char="V" analytics-on analytics-event="Char selector (V)" analytics-category="Filter actions">V</a>
-  <a ng-class="{selected:ngModel==='W'}" data-char="W" analytics-on analytics-event="Char selector (W)" analytics-category="Filter actions">W</a>
-  <a ng-class="{selected:ngModel==='X'}" data-char="X" analytics-on analytics-event="Char selector (X)" analytics-category="Filter actions">X</a>
-  <a ng-class="{selected:ngModel==='Y'}" data-char="Y" analytics-on analytics-event="Char selector (Y)" analytics-category="Filter actions">Y</a>
-  <a ng-class="{selected:ngModel==='Z'}" data-char="Z" analytics-on analytics-event="Char selector (Z)" analytics-category="Filter actions">Z</a>
-</div>
\ No newline at end of file
+<select class="form-control">
+  <option value=""  analytics-on analytics-event="Char selector ()"  analytics-category="Filter actions">All</option>
+  <option value="A" analytics-on analytics-event="Char selector (A)" analytics-category="Filter actions">A</option>
+  <option value="B" analytics-on analytics-event="Char selector (B)" analytics-category="Filter actions">B</option>
+  <option value="C" analytics-on analytics-event="Char selector (C)" analytics-category="Filter actions">C</option>
+  <option value="D" analytics-on analytics-event="Char selector (D)" analytics-category="Filter actions">D</option>
+  <option value="E" analytics-on analytics-event="Char selector (E)" analytics-category="Filter actions">E</option>
+  <option value="F" analytics-on analytics-event="Char selector (F)" analytics-category="Filter actions">F</option>
+  <option value="G" analytics-on analytics-event="Char selector (G)" analytics-category="Filter actions">G</option>
+  <option value="H" analytics-on analytics-event="Char selector (H)" analytics-category="Filter actions">H</option>
+  <option value="I" analytics-on analytics-event="Char selector (I)" analytics-category="Filter actions">I</option>
+  <option value="J" analytics-on analytics-event="Char selector (J)" analytics-category="Filter actions">J</option>
+  <option value="K" analytics-on analytics-event="Char selector (K)" analytics-category="Filter actions">K</option>
+  <option value="L" analytics-on analytics-event="Char selector (L)" analytics-category="Filter actions">L</option>
+  <option value="M" analytics-on analytics-event="Char selector (M)" analytics-category="Filter actions">M</option>
+  <option value="N" analytics-on analytics-event="Char selector (N)" analytics-category="Filter actions">N</option>
+  <option value="O" analytics-on analytics-event="Char selector (O)" analytics-category="Filter actions">O</option>
+  <option value="P" analytics-on analytics-event="Char selector (P)" analytics-category="Filter actions">P</option>
+  <option value="Q" analytics-on analytics-event="Char selector (Q)" analytics-category="Filter actions">Q</option>
+  <option value="R" analytics-on analytics-event="Char selector (R)" analytics-category="Filter actions">R</option>
+  <option value="S" analytics-on analytics-event="Char selector (S)" analytics-category="Filter actions">S</option>
+  <option value="T" analytics-on analytics-event="Char selector (T)" analytics-category="Filter actions">T</option>
+  <option value="U" analytics-on analytics-event="Char selector (U)" analytics-category="Filter actions">U</option>
+  <option value="V" analytics-on analytics-event="Char selector (V)" analytics-category="Filter actions">V</option>
+  <option value="W" analytics-on analytics-event="Char selector (W)" analytics-category="Filter actions">W</option>
+  <option value="X" analytics-on analytics-event="Char selector (X)" analytics-category="Filter actions">X</option>
+  <option value="Y" analytics-on analytics-event="Char selector (Y)" analytics-category="Filter actions">Y</option>
+  <option value="Z" analytics-on analytics-event="Char selector (Z)" analytics-category="Filter actions">Z</option>
+</select>
\ No newline at end of file
diff --git a/vipra-ui/app/html/directives/pagination-full.html b/vipra-ui/app/html/directives/pagination-full.html
new file mode 100644
index 0000000000000000000000000000000000000000..c206067bc1b9845808ffa04d42266adccc64547b
--- /dev/null
+++ b/vipra-ui/app/html/directives/pagination-full.html
@@ -0,0 +1,35 @@
+<div>
+  <div class="btn-group btn-group-justified">
+    <div class="btn-group">
+      <button class="btn btn-default" title="First" ng-click="changePage(1)" ng-disabled="page==1" analytics-on analytics-event="Paginator (first)" analytics-category="Filter actions">
+        <i class="fa fa-angle-double-left"></i>
+      </button>
+    </div>
+    <div class="btn-group">
+      <button class="btn btn-default" title="Previous" ng-click="changePage(page-1)" ng-disabled="page==1" analytics-on analytics-event="Paginator (prev)" analytics-category="Filter actions">
+        <i class="fa fa-angle-left"></i>
+      </button>
+    </div>
+    <div class="btn-group">
+      <button class="btn btn-default" title="Go to page" ng-click="toPage()" analytics-on analytics-event="Paginator (n)" analytics-category="Filter actions">
+        &hellip;
+      </button>
+    </div>
+    <div class="btn-group">
+      <button class="btn btn-default" title="Next" ng-click="changePage(page+1)" ng-disabled="page>=maxPage" analytics-on analytics-event="Paginator (next)" analytics-category="Filter actions">
+        <i class="fa fa-angle-right"></i>
+      </button>
+    </div>
+    <div class="btn-group">
+      <button class="btn btn-default" title="Last" ng-click="changePage(maxPage)" ng-disabled="page>=maxPage" analytics-on analytics-event="Paginator (last)" analytics-category="Filter actions">
+        <i class="fa fa-angle-double-right"></i>
+      </button>
+    </div>
+  </div>
+
+  <div class="btn-group btn-group-justified">
+    <div class="btn-group" ng-repeat="p in pages">
+      <button class="btn btn-default" ng-class="{active:page==p}" ng-attr-title="{{'Page ' + p}}" ng-click="changePage(p)" ng-disabled="page==p" analytics-on analytics-event="Paginator (i)" analytics-category="Filter actions" ng-bind="p"></button>
+    </div>
+  </div>
+</div>
\ No newline at end of file
diff --git a/vipra-ui/app/html/directives/sort-dir.html b/vipra-ui/app/html/directives/sort-dir.html
index f8dc9ab7f40e2530ed2818bcf10d5c82c7a91c3c..8ef9475570ad86f0896e9667e309b128bcff5f22 100644
--- a/vipra-ui/app/html/directives/sort-dir.html
+++ b/vipra-ui/app/html/directives/sort-dir.html
@@ -1,3 +1,3 @@
-<a tabindex="0">
-	<i class="pointer fa" ng-class="{'fa-sort-amount-desc':ngModel,'fa-sort-amount-asc':!ngModel}" ng-click="ngModel=!ngModel; $event.stopPropagation()" analytics-on analytics-event="Sort direction" analytics-category="Filter actions"></i>
-</a>
\ No newline at end of file
+<button class="btn btn-default" type="button" tabindex="0" ng-click="ngModel=!ngModel; $event.stopPropagation()" analytics-on analytics-event="Sort direction" analytics-category="Filter actions">
+	<i class="fa" ng-class="{'fa-sort-amount-desc':ngModel,'fa-sort-amount-asc':!ngModel}"></i>
+</button>
\ No newline at end of file
diff --git a/vipra-ui/app/html/directives/topic-link.html b/vipra-ui/app/html/directives/topic-link.html
index 5782551b36acc19385329085760830211bc6fd7c..f0653ba543bd26a181edff09f6a666ffd5072ed8 100644
--- a/vipra-ui/app/html/directives/topic-link.html
+++ b/vipra-ui/app/html/directives/topic-link.html
@@ -1,6 +1,6 @@
 <div class="link-wrapper">
   <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 ui-sref="topics.show.articles({id:topic.id})" class="badge pull-right" ng-bind="::topic.articlesCount" ng-attr-title="{{::topic.articlesCount}} article(s)" ng-if="::showBadge"></a>
 	  <a class="topic-link" ui-sref="topics.show({id:topic.id})" ng-attr-title="{{::topic.name}}">
 	    <span ng-bind="topic.name"></span>
 	    <ng-transclude/>
diff --git a/vipra-ui/app/html/entities/index.html b/vipra-ui/app/html/entities/index.html
index 5bc4a38b80475c233ee4ab7794139c877993c6fe..d15346a1489ab25187f96290069b6ecca352be55 100644
--- a/vipra-ui/app/html/entities/index.html
+++ b/vipra-ui/app/html/entities/index.html
@@ -1,34 +1,21 @@
 <div ng-cloak ng-hide="!rootModels.topicModel || state.name !== 'entities'">
-  <menu-affix>
-    <div class="text-center">
-      <pagination total="entitiesTotal" page="entitiesIndexModels.page" limit="entitiesIndexModels.limit" />
-    </div>
-  </menu-affix>
   <div class="container">
-    <div class="row row-spaced">
-      <div class="col-md-8 text-center">
-        <char-selector ng-model="entitiesIndexModels.startChar"/>
-      </div>
-      <div class="col-md-4">
-        <div class="btn-group btn-group-justified">
-          <input type="text" class="form-control" ng-model="entitiesIndexModels.contains" placeholder="Filter..." ng-model-options="{debounce:300}">
-          <span class="glyphicon glyphicon-remove-circle searchclear" ng-click="entitiesIndexModels.contains=''" analytics-on analytics-event="Entities Filter (clear)" analytics-category="Filter actions"></span>
+    <div class="row">
+      <div class="col-sm-12 hidden-md hidden-lg">
+        <div class="text-center">
+          <pagination total="entitiesTotal" page="entitiesIndexModels.page" limit="entitiesIndexModels.limit" />
         </div>
       </div>
     </div>
     <div class="row">
-      <div class="col-md-12">
+      <div class="col-md-9 col-sm-12">
         <div class="panel panel-default">
-          <div class="panel-heading">
+          <div class="panel-heading clearfix">
             Found
             <ng-pluralize count="entitiesTotal||0" when="{0:'no entities',1:'1 entity',other:'{} entities'}"></ng-pluralize> in the database.
-            <span ng-show="entitiesTotal > 0" 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>
-              </ol>
-              <sort-dir ng-model="entitiesIndexModels.sortdir" />
-            </span>
+            <div class="pull-right">
+              Page <span ng-bind="wordsIndexModels.page||1"></span> of <span ng-bind="maxPage||1"></span>
+            </div>
           </div>
           <table class="table table-hover table-condensed table-fixed">
             <tbody>
@@ -45,8 +32,41 @@
               </tr>
             </tbody>
           </table>
-          <div class="panel-footer">
-            Page <span ng-bind="entitiesIndexModels.page||1"></span> of <span ng-bind="maxPage||1"></span>
+          <div class="panel-footer clearfix">
+            <div class="pull-right">
+              Page <span ng-bind="wordsIndexModels.page||1"></span> of <span ng-bind="maxPage||1"></span>
+            </div>
+          </div>
+        </div>
+      </div>
+      <div class="col-md-3 hidden-sm">
+        <div class="sidebar-affix">
+          <div>
+            <div class="form-group">
+              <pagination-full total="entitiesTotal" page="entitiesIndexModels.page" limit="entitiesIndexModels.limit" />
+            </div>
+            <hr>
+            <div class="form-group">
+              <div class="btn-group btn-group-justified">
+                <input type="text" class="form-control" ng-model="entitiesIndexModels.contains" placeholder="Filter..." ng-model-options="{debounce:300}">
+                <span class="glyphicon glyphicon-remove-circle searchclear" ng-click="entitiesIndexModels.contains=''" analytics-on analytics-event="Entities Filter (clear)" analytics-category="Filter actions"></span>
+              </div>
+            </div>
+            <div class="form-group">
+              <label for="initial">Initial letter</label>
+              <char-selector id="initial" ng-model="entitiesIndexModels.startChar"/>
+            </div>
+            <div class="form-group">
+              <label>Sort by</label>
+              <div class="input-group">
+                <select class="form-control" ng-model="entitiesIndexModels.sortkey">
+                  <option value="id">Entity</option>
+                </select>
+                <span class="input-group-btn">
+                  <sort-dir ng-model="entitiesIndexModels.sortdir" />
+                </span>
+              </div>
+            </div>
           </div>
         </div>
       </div>
diff --git a/vipra-ui/app/html/index.html b/vipra-ui/app/html/index.html
index 4d959af5956b19dc2d9988f434645beea39f382d..08e17e3b6a66ef785d4c5193f5a87ccb274982a7 100644
--- a/vipra-ui/app/html/index.html
+++ b/vipra-ui/app/html/index.html
@@ -42,21 +42,11 @@
       </div>
       <div class="row latest-items" ng-hide="search">
         <br>
-        <div class="col-md-8 text-center">
-          <h4>Latest articles</h4>
-          <ul class="list-unstyled">
-            <article-link article="::article" badge="false" menu="false" details="false" ng-repeat="article in latestArticles"/>
-          </ul>
-          <p class="text-center" ng-if="!latestArticles">Loading...</p>
-          <p class="text-center" ng-if="latestArticles&&!latestArticles.length">No Articles</p>
-        </div>
-        <div class="col-md-4 text-center">
-          <h4>Latest topics</h4>
-          <ul class="list-unstyled">
-            <topic-link topic="::topic" badge="false" menu="false" ng-repeat="topic in latestTopics"/>
-          </ul>
-          <p class="text-center" ng-if="!latestTopics">Loading...</p>
-          <p class="text-center" ng-if="latestTopics&&!latestTopics.length">No Topics</p>
+        <div class="text-center stats-badges">
+          <a ui-sref="articles" class="badge" ng-bind="rootModels.topicModel.articleCount || 0"></a> <ng-pluralize count="rootModels.topicModel.articleCount || 0" when="{'1':'article','other':'articles'}"></ng-pluralize>&nbsp;&nbsp;
+          <a ui-sref="topics" class="badge" ng-bind="rootModels.topicModel.topicCount || 0"></a> <ng-pluralize count="rootModels.topicModel.topicCount || 0" when="{'1':'topic','other':'topics'}"></ng-pluralize>&nbsp;&nbsp;
+          <a ui-sref="entities" class="badge" ng-bind="rootModels.topicModel.entityCount || 0"></a> <ng-pluralize count="rootModels.topicModel.entityCount || 0" when="{'1':'entity','other':'entities'}"></ng-pluralize>&nbsp;&nbsp;
+          <a ui-sref="words" class="badge" ng-bind="rootModels.topicModel.wordCount || 0"></a> <ng-pluralize count="rootModels.topicModel.wordCount || 0" when="{'1':'word','other':'words'}"></ng-pluralize>
         </div>
       </div>
     </div>
diff --git a/vipra-ui/app/html/topics/index.html b/vipra-ui/app/html/topics/index.html
index aeefbc3a78234797e3bc53e488992b00dce556e8..4653d18eef437674b6a6229ce70f6583c262bb14 100644
--- a/vipra-ui/app/html/topics/index.html
+++ b/vipra-ui/app/html/topics/index.html
@@ -1,36 +1,21 @@
 <div ng-cloak ng-hide="!rootModels.topicModel || state.name !== 'topics'">
-  <menu-affix>
-    <div class="text-center">
-      <pagination total="topicsTotal" page="topicsIndexModels.page" limit="topicsIndexModels.limit" />
-    </div>
-  </menu-affix>
   <div class="container">
-    <div class="row row-spaced">
-      <div class="col-md-8 text-center">
-        <char-selector ng-model="topicsIndexModels.startChar"/>
-      </div>
-      <div class="col-md-4">
-        <div class="btn-group btn-group-justified">
-          <input type="text" class="form-control" ng-model="topicsIndexModels.contains" placeholder="Filter..." ng-model-options="{debounce:300}">
-          <span class="glyphicon glyphicon-remove-circle searchclear" ng-click="topicsIndexModels.contains=''" analytics-on analytics-event="Topics Filter (clear)" analytics-category="Filter actions"></span>
+    <div class="row">
+      <div class="col-sm-12 hidden-md hidden-lg">
+        <div class="text-center">
+          <pagination total="topicsTotal" page="topicsIndexModels.page" limit="topicsIndexModels.limit" />
         </div>
       </div>
     </div>
     <div class="row">
-      <div class="col-md-12">
+      <div class="col-md-9 col-sm-12">
         <div class="panel panel-default">
-          <div class="panel-heading">
+          <div class="panel-heading clearfix">
             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" 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>
-                <li value="created" class="nya-bs-option"><a>Added</a></li>
-                <li value="articlesCount" class="nya-bs-option"><a># of articles</a></li>
-              </ol>
-              <sort-dir ng-model="topicsIndexModels.sortdir" />
-            </span>
+            <div class="pull-right">
+              Page <span ng-bind="wordsIndexModels.page||1"></span> of <span ng-bind="maxPage||1"></span>
+            </div>
           </div>
           <table class="table table-hover table-condensed table-fixed">
             <tbody>
@@ -47,8 +32,43 @@
               </tr>
             </tbody>
           </table>
-          <div class="panel-footer">
-            Page <span ng-bind="topicsIndexModels.page||1"></span> of <span ng-bind="maxPage||1"></span>
+          <div class="panel-footer clearfix">
+            <div class="pull-right">
+              Page <span ng-bind="wordsIndexModels.page||1"></span> of <span ng-bind="maxPage||1"></span>
+            </div>
+          </div>
+        </div>
+      </div>
+      <div class="col-md-3 hidden-sm">
+        <div class="sidebar-affix">
+          <div>
+            <div class="form-group">
+              <pagination-full total="topicsTotal" page="topicsIndexModels.page" limit="topicsIndexModels.limit" />
+            </div>
+            <hr>
+            <div class="form-group">
+              <div class="btn-group btn-group-justified">
+                <input type="text" class="form-control" ng-model="topicsIndexModels.contains" placeholder="Filter..." ng-model-options="{debounce:300}">
+                <span class="glyphicon glyphicon-remove-circle searchclear" ng-click="topicsIndexModels.contains=''" analytics-on analytics-event="Entities Filter (clear)" analytics-category="Filter actions"></span>
+              </div>
+            </div>
+            <div class="form-group">
+              <label for="initial">Initial letter</label>
+              <char-selector id="initial" ng-model="topicsIndexModels.startChar"/>
+            </div>
+            <div class="form-group">
+              <label>Sort by</label>
+              <div class="input-group">
+                <select class="form-control" ng-model="topicsIndexModels.sortkey">
+                  <option value="name">Name</option>
+                  <option value="created">Added</option>
+                  <option value="articlesCount"># of articles</option>
+                </select>
+                <span class="input-group-btn">
+                  <sort-dir ng-model="topicsIndexModels.sortdir" />
+                </span>
+              </div>
+            </div>
           </div>
         </div>
       </div>
diff --git a/vipra-ui/app/html/words/index.html b/vipra-ui/app/html/words/index.html
index 33be9812ed3ef443bcfb1c24155b68681a587d44..0fbe33ede0746081dcbda4e5975ff217c4cfeb80 100644
--- a/vipra-ui/app/html/words/index.html
+++ b/vipra-ui/app/html/words/index.html
@@ -1,34 +1,21 @@
 <div ng-cloak ng-hide="!rootModels.topicModel || state.name !== 'words'">
-  <menu-affix>
-    <div class="text-center">
-      <pagination total="wordsTotal" page="wordsIndexModels.page" limit="wordsIndexModels.limit" />
-    </div>
-  </menu-affix>
   <div class="container">
-    <div class="row row-spaced">
-      <div class="col-md-8 text-center">
-        <char-selector ng-model="wordsIndexModels.startChar"/>
-      </div>
-      <div class="col-md-4">
-        <div class="btn-group btn-group-justified">
-          <input type="text" class="form-control" ng-model="wordsIndexModels.contains" placeholder="Filter..." ng-model-options="{debounce:300}">
-          <span class="glyphicon glyphicon-remove-circle searchclear" ng-click="wordsIndexModels.contains=''" analytics-on analytics-event="Words Filter (clear)" analytics-category="Filter actions"></span>
+    <div class="row">
+      <div class="col-sm-12 hidden-md hidden-lg">
+        <div class="text-center">
+          <pagination total="wordsTotal" page="wordsIndexModels.page" limit="wordsIndexModels.limit" />
         </div>
       </div>
     </div>
     <div class="row">
-      <div class="col-md-12">
+      <div class="col-md-9 col-sm-12">
         <div class="panel panel-default">
-          <div class="panel-heading">
+          <div class="panel-heading clearfix">
             Found
             <ng-pluralize count="wordsTotal||0" when="{0:'no words',1:'1 word',other:'{} words'}"></ng-pluralize> in the database.
-            <span ng-show="wordsTotal > 0" 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>
-              </ol>
-              <sort-dir ng-model="wordsIndexModels.sortdir" />
-            </span>
+            <div class="pull-right">
+              Page <span ng-bind="wordsIndexModels.page||1"></span> of <span ng-bind="maxPage||1"></span>
+            </div>
           </div>
           <table class="table table-hover table-condensed table-fixed">
             <tbody>
@@ -45,8 +32,41 @@
               </tr>
             </tbody>
           </table>
-          <div class="panel-footer">
-            Page <span ng-bind="wordsIndexModels.page||1"></span> of <span ng-bind="maxPage||1"></span>
+          <div class="panel-footer clearfix">
+            <div class="pull-right">
+              Page <span ng-bind="wordsIndexModels.page||1"></span> of <span ng-bind="maxPage||1"></span>
+            </div>
+          </div>
+        </div>
+      </div>
+      <div class="col-md-3 hidden-sm">
+        <div class="sidebar-affix">
+          <div>
+            <div class="form-group">
+              <pagination-full total="wordsTotal" page="wordsIndexModels.page" limit="wordsIndexModels.limit" />
+            </div>
+            <hr>
+            <div class="form-group">
+              <div class="btn-group btn-group-justified">
+                <input type="text" class="form-control" ng-model="wordsIndexModels.contains" placeholder="Filter..." ng-model-options="{debounce:300}">
+                <span class="glyphicon glyphicon-remove-circle searchclear" ng-click="wordsIndexModels.contains=''" analytics-on analytics-event="Entities Filter (clear)" analytics-category="Filter actions"></span>
+              </div>
+            </div>
+            <div class="form-group">
+              <label for="initial">Initial letter</label>
+              <char-selector id="initial" ng-model="wordsIndexModels.startChar"/>
+            </div>
+            <div class="form-group">
+              <label>Sort by</label>
+              <div class="input-group">
+                <select class="form-control" ng-model="wordsIndexModels.sortkey">
+                  <option value="id">Word</option>
+                </select>
+                <span class="input-group-btn">
+                  <sort-dir ng-model="wordsIndexModels.sortdir" />
+                </span>
+              </div>
+            </div>
           </div>
         </div>
       </div>
diff --git a/vipra-ui/app/index.html b/vipra-ui/app/index.html
index cf072fde2ade401475f1f8eb470269d0f1b171e1..a3a8d83bcefe53ed027bd7c5598537d9a4df3ff2 100644
--- a/vipra-ui/app/index.html
+++ b/vipra-ui/app/index.html
@@ -54,7 +54,7 @@
         </form>
         <ul class="nav navbar-nav navbar-right">
           <li ng-class="{'text-italic active':rootModels.topicModel}">
-            <a tabindex="0" ng-click="chooseTopicModel()" ng-bind-template="{{rootModels.topicModel ? rootModels.topicModel.name : 'Models'}}" ng-attr-title="{{rootModels.topicModel.modelConfig.description}}" analytics-on analytics-event="Menu Item (Topic Models)" analytics-category="Menu actions"></a>
+            <a class="active-topicmodel" tabindex="0" ng-click="chooseTopicModel()" ng-bind-template="{{rootModels.topicModel ? rootModels.topicModel.name : 'Models'}}" ng-attr-title="{{rootModels.topicModel.name}}&nbsp;&#10;{{rootModels.topicModel.modelConfig.description}}" analytics-on analytics-event="Menu Item (Topic Models)" analytics-category="Menu actions"></a>
           </li>
           <li title="Keyboard cheatsheet">
             <a tabindex="0" ng-click="showCheatSheet()" analytics-on analytics-event="Menu Item (Cheatsheet)" analytics-category="Menu actions">
diff --git a/vipra-ui/app/js/app.js b/vipra-ui/app/js/app.js
index d0d60338f6a11fefbb3b1e9b8109df2ad2178acb..1fc95a68654349207aed4a66e162111aa1335331 100644
--- a/vipra-ui/app/js/app.js
+++ b/vipra-ui/app/js/app.js
@@ -208,7 +208,7 @@
         prepend: false,
         merge: true
       }, {
-        fadeAfter: 0
+        fadeAfter: 10000
       });
 
     }
@@ -237,14 +237,6 @@
     $rootScope.$on('$stateChangeStart', function() {
       $rootScope.alerts = [];
     });
-
-    $rootScope.handleWSMessage = function(data) {
-      Alerter.showInfo(null, data.message, {fadeAfter: 7000});
-    };
-
-    $rootScope.showMessage = function(msg) {
-      Alerter.showInfo(null, msg, {fadeAfter: 7000});
-    };
   }]);
 
   $(document).on('change', '.btn-file :file', function() {
diff --git a/vipra-ui/app/js/controllers.js b/vipra-ui/app/js/controllers.js
index b66a6f1d301689b4ccbbae6b9acd09efe4c7df4a..c9000674e51d89042933b7d28e0ac93e1d14ecec 100644
--- a/vipra-ui/app/js/controllers.js
+++ b/vipra-ui/app/js/controllers.js
@@ -395,7 +395,7 @@
 
       var topicNode = function(topic, x, y) {
         topic = topic.topic || topic;
-        return newNode(topic.name, 'topic', 'topics.show', topic.id, $scope.colors.topics, 'triangle', $scope.loadTopic, x, y);
+        return newNode(topic.name, 'topic', 'topics.show', topic.id, topic.color, 'triangle', $scope.loadTopic, x, y);
       };
 
       var articleNode = function(article, x, y) {
diff --git a/vipra-ui/app/js/directives.js b/vipra-ui/app/js/directives.js
index b3b0665114f3f7695e8996ec55c4b1d0f6663a5f..1c1aec18a9b004241ff60123e1fe69ef20d62987 100644
--- a/vipra-ui/app/js/directives.js
+++ b/vipra-ui/app/js/directives.js
@@ -114,6 +114,21 @@
     };
   }]);
 
+  app.directive('paginationFull', [function() {
+    return {
+      restrict: 'E',
+      replace: true,
+      scope: {
+        total: '=',
+        page: '=',
+        limit: '=',
+        change: '&'
+      },
+      controller: 'PaginationController',
+      templateUrl: 'html/directives/pagination-full.html'
+    };
+  }]);
+
   app.directive('highcharts', [function() {
     return {
       scope: {
@@ -463,7 +478,7 @@
   app.directive('menuAffix', [function() {
     return {
       transclude: true,
-      template: '<div class="menu-affix" ng-transclude></div><div class="affix-after"></div>',
+      template: '<div class="menu-affix hidden-md" ng-transclude></div><div class="affix-after"></div>',
       link: function($scope, $elem) {
         var elem = $elem.find('.menu-affix'),
           after = $elem.find('.affix-after');
@@ -513,14 +528,6 @@
       scope: {
         ngModel: '='
       },
-      link: function($scope, $elem) {
-        $elem.on('click', 'a', function() {
-          var c = $(this).data('char');
-          $scope.$apply(function() {
-            $scope.ngModel = c;
-          });
-        });
-      },
       templateUrl: 'html/directives/char-selector.html'
     };
   }]);
diff --git a/vipra-ui/app/less/app.less b/vipra-ui/app/less/app.less
index f344e314bcf5f5d651bae313a2c20ed4d6a52b83..620308628311a387d215594bbeb4d87db63ccaa8 100644
--- a/vipra-ui/app/less/app.less
+++ b/vipra-ui/app/less/app.less
@@ -972,6 +972,29 @@ entity-menu {
   text-shadow: 1px 1px 1px #888, 1px -1px 1px #888, -1px 1px 1px #888, -1px -1px 1px #888;
 }
 
+.sidebar-affix {
+  position: fixed;
+}
+
+.active-topicmodel {
+  max-width: 120px;
+  overflow: hidden;
+  text-overflow: ellipsis;
+  white-space: nowrap;
+}
+
+.stats-badges {
+  font-size: 18px;
+}
+
+[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;
+}
+
 @keyframes spin {
   100% {
     -webkit-transform: rotateY(360deg);
@@ -1015,12 +1038,60 @@ entity-menu {
   }
 }
 
-[ng\:cloak], [ng-cloak], .ng-cloak {
-  display: none !important;
+@media (min-width: 1200px) {
+  .sidebar-affix {
+    width: 262.5px;
+  }
 }
 
-[ng\:cloak], [ng-cloak], [data-ng-cloak], [x-ng-cloak], .ng-cloak, .x-ng-cloak, .ng-hide {
-    display: none !important;
+@media (max-width: 1050px) {
+  .search-form {
+    display: none;
+  }
+}
+
+@media (min-width: 992px) {
+  .sidebar-affix {
+    width: 212.5px;
+  }
+}
+
+@media (max-width: 920px) {
+  .navbar-header {
+    float: none;
+  }
+  .navbar-toggle {
+    display: block;
+  }
+  .navbar-collapse {
+    border-top: 1px solid transparent;
+    box-shadow: inset 0 1px 0 rgba(255,255,255,0.1);
+  }
+  .navbar-collapse.collapse {
+    display: none!important;
+  }
+  .navbar-nav {
+    float: none!important;
+    margin: 7.5px -15px;
+  }
+  .navbar-nav>li {
+    float: none;
+  }
+  .navbar-nav>li>a {
+    padding-top: 10px;
+    padding-bottom: 10px;
+  }
+  .navbar-text {
+    float: none;
+    margin: 15px 0;
+  }
+  /* since 3.1.0 */
+  .navbar-collapse.collapse.in { 
+    display: block!important;
+  }
+  .collapsing {
+    overflow: hidden!important;
+  }
 }
 
 @media screen and (max-width: 900px) {