diff --git a/make-release.sh b/make-release.sh
index 8d4459fc9f159622d276c1978b0866eb3ac6a92e..2d85f1f62fd75a31c8bcd8ffac6857d4b6fc9ea6 100755
--- a/make-release.sh
+++ b/make-release.sh
@@ -25,6 +25,7 @@ cp -r $DIR/vipra-cmd/target/lib $REL/vipra-cmd/lib
 cp -r $DIR/vipra-ui/public $REL/vipra-ui
 cp $DIR/vipra $REL/vipra-cmd/vipra
 cp $DIR/LICENSE $DIR/README.md $REL
+cp $DIR/scripts/* $REL
 
 tar zcf $REL_NAME.tar.gz $REL_NAME
 rm -rf $REL
diff --git a/scripts/install.sh b/scripts/install.sh
new file mode 100644
index 0000000000000000000000000000000000000000..cc1f786e84631faabc68d86a3aefffbd1ae03a06
--- /dev/null
+++ b/scripts/install.sh
@@ -0,0 +1 @@
+#!/bin/bash
\ No newline at end of file
diff --git a/scripts/uninstall.sh b/scripts/uninstall.sh
new file mode 100644
index 0000000000000000000000000000000000000000..cc1f786e84631faabc68d86a3aefffbd1ae03a06
--- /dev/null
+++ b/scripts/uninstall.sh
@@ -0,0 +1 @@
+#!/bin/bash
\ No newline at end of file
diff --git a/vipra-ui/app/html/articles/index.html b/vipra-ui/app/html/articles/index.html
index 53f8ff372fefc95e3b39cf4219d89191582f0424..88ca1fd8df6ef85e5528a00d36a40fa8b2dea596 100644
--- a/vipra-ui/app/html/articles/index.html
+++ b/vipra-ui/app/html/articles/index.html
@@ -1,44 +1,46 @@
-<div class="container" ng-cloak ng-hide="!rootModels.topicModel || state.name !== 'articles'">
-  <div class="row">
-    <div class="col-md-12 text-center">
+<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>
-  </div>
-  <div class="row">
-    <div class="col-md-12">
-      <div class="panel panel-default">
-        <div class="panel-heading">
-          Found
-          <ng-pluralize count="articlesTotal||0" when="{0:'no articles',1:'1 article',other:'{} articles'}"></ng-pluralize> in the database.
-          <span ng-show="articlesTotal" 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>
-        <table class="table table-hover table-condensed">
-          <tbody>
-            <tr ng-repeat="article in articles">
-              <td>
-                <article-link article="::article"/>
-              </td>
-            </tr>
-          </tbody>
-        </table>
-        <div class="panel-footer">
-          Page <span ng-bind="articlesIndexModels.page||1"></span> of <span ng-bind="maxPage||1"></span>
+  </menu-affix>
+  <div class="container">
+    <div class="row">
+      <div class="col-md-12">
+        <div class="panel panel-default">
+          <div class="panel-heading">
+            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>
+          <table class="table table-hover table-condensed">
+            <tbody>
+              <tr ng-repeat="article in articles">
+                <td>
+                  <article-link article="::article"/>
+                </td>
+              </tr>
+            </tbody>
+          </table>
+          <div class="panel-footer">
+            Page <span ng-bind="articlesIndexModels.page||1"></span> of <span ng-bind="maxPage||1"></span>
+          </div>
         </div>
       </div>
     </div>
-  </div>
-  <div class="row">
-    <div class="col-md-12 text-center">
-      <pagination total="articlesTotal" page="articlesIndexModels.page" limit="articlesIndexModels.limit" />
+    <div class="row">
+      <div class="col-md-12 text-center">
+        <pagination total="articlesTotal" page="articlesIndexModels.page" limit="articlesIndexModels.limit" />
+      </div>
     </div>
   </div>
 </div>
diff --git a/vipra-ui/app/html/entities/index.html b/vipra-ui/app/html/entities/index.html
index 464c3510d431a27b1e723a818ecfc4f5e31450cf..2554c3f2d484dc5c29d5653365a8821fef76e22c 100644
--- a/vipra-ui/app/html/entities/index.html
+++ b/vipra-ui/app/html/entities/index.html
@@ -1,41 +1,43 @@
-<div class="container" ng-cloak ng-hide="!rootModels.topicModel || state.name !== 'entities'">
-  <div class="row">
-    <div class="col-md-12 text-center">
+<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>
-  </div>
-  <div class="row">
-    <div class="col-md-12">
-      <div class="panel panel-default">
-        <div class="panel-heading">
-          Found
-          <ng-pluralize count="entitiesTotal||0" when="{0:'no entities',1:'1 entity',other:'{} entities'}"></ng-pluralize> in the database.
-          <span ng-show="entitiesTotal" 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>
-        <table class="table table-hover table-condensed">
-          <tbody>
-            <tr ng-repeat="entity in entities">
-              <td>
-              	<entity-link entity="::entity" />
-              </td>
-            </tr>
-          </tbody>
-        </table>
-        <div class="panel-footer">
-          Page <span ng-bind="entitiesIndexModels.page||1"></span> of <span ng-bind="maxPage||1"></span>
+  </menu-affix>
+  <div class="container">
+    <div class="row">
+      <div class="col-md-12">
+        <div class="panel panel-default">
+          <div class="panel-heading">
+            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>
+          <table class="table table-hover table-condensed">
+            <tbody>
+              <tr ng-repeat="entity in entities">
+                <td>
+                	<entity-link entity="::entity" />
+                </td>
+              </tr>
+            </tbody>
+          </table>
+          <div class="panel-footer">
+            Page <span ng-bind="entitiesIndexModels.page||1"></span> of <span ng-bind="maxPage||1"></span>
+          </div>
         </div>
       </div>
     </div>
-  </div>
-  <div class="row">
-    <div class="col-md-12 text-center">
-      <pagination total="entitiesTotal" page="entitiesIndexModels.page" limit="entitiesIndexModels.limit" />
+    <div class="row">
+      <div class="col-md-12 text-center">
+        <pagination total="entitiesTotal" page="entitiesIndexModels.page" limit="entitiesIndexModels.limit" />
+      </div>
     </div>
   </div>
 </div>
diff --git a/vipra-ui/app/html/entities/show.html b/vipra-ui/app/html/entities/show.html
index 0b019785b96a496cf641cd08a7f73efd6867ac2c..d3f32700398e4d290104d4e55d9ed369d0b3d48c 100644
--- a/vipra-ui/app/html/entities/show.html
+++ b/vipra-ui/app/html/entities/show.html
@@ -1 +1,6 @@
+<div class="container" ng-cloak ng-hide="!rootModels.topicModel || state.name !== 'entities.show'">
+  <div class="page-header no-border">
+    <h1 ng-bind="::entity.id"></h1>
+  </div>
+</div>
 <div ng-cloak ui-view></div>
\ No newline at end of file
diff --git a/vipra-ui/app/html/topics/index.html b/vipra-ui/app/html/topics/index.html
index ee2f178ce88de82bdf076957dbae1fa9c4aef6a8..8d7c207d90629580346c406529651d40c539ffe1 100644
--- a/vipra-ui/app/html/topics/index.html
+++ b/vipra-ui/app/html/topics/index.html
@@ -1,43 +1,45 @@
-<div class="container" ng-cloak ng-hide="!rootModels.topicModel || state.name !== 'topics'">
-  <div class="row">
-    <div class="col-md-12 text-center">
+<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>
-  </div>
-  <div class="row">
-    <div class="col-md-12">
-      <div class="panel panel-default">
-        <div class="panel-heading">
-          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>
-        <table class="table table-hover table-condensed">
-          <tbody>
-            <tr ng-repeat="topic in topics">
-              <td>
-                <topic-link topic="::topic" />
-              </td>
-            </tr>
-          </tbody>
-        </table>
-        <div class="panel-footer">
-          Page <span ng-bind="topicsIndexModels.page||1"></span> of <span ng-bind="maxPage||1"></span>
+  </menu-affix>
+  <div class="container">
+    <div class="row">
+      <div class="col-md-12">
+        <div class="panel panel-default">
+          <div class="panel-heading">
+            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>
+          <table class="table table-hover table-condensed">
+            <tbody>
+              <tr ng-repeat="topic in topics">
+                <td>
+                  <topic-link topic="::topic" />
+                </td>
+              </tr>
+            </tbody>
+          </table>
+          <div class="panel-footer">
+            Page <span ng-bind="topicsIndexModels.page||1"></span> of <span ng-bind="maxPage||1"></span>
+          </div>
         </div>
       </div>
     </div>
-  </div>
-  <div class="row">
-    <div class="col-md-12 text-center">
-      <pagination total="topicsTotal" page="topicsIndexModels.page" limit="topicsIndexModels.limit" />
+    <div class="row">
+      <div class="col-md-12 text-center">
+        <pagination total="topicsTotal" page="topicsIndexModels.page" limit="topicsIndexModels.limit" />
+      </div>
     </div>
   </div>
 </div>
diff --git a/vipra-ui/app/html/words/index.html b/vipra-ui/app/html/words/index.html
index 6aa755fd97570a4df305552214f290dd04ff5733..60ca039549f28621b042debb5dfca62bf2afcc3c 100644
--- a/vipra-ui/app/html/words/index.html
+++ b/vipra-ui/app/html/words/index.html
@@ -1,41 +1,43 @@
-<div class="container" ng-cloak ng-hide="!rootModels.topicModel || state.name !== 'words'">
-  <div class="row">
-    <div class="col-md-12 text-center">
+<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>
-  </div>
-  <div class="row">
-    <div class="col-md-12">
-      <div class="panel panel-default">
-        <div class="panel-heading">
-          Found
-          <ng-pluralize count="wordsTotal||0" when="{0:'no words',1:'1 word',other:'{} words'}"></ng-pluralize> in the database.
-          <span ng-show="wordsTotal" 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>
-        <table class="table table-hover table-condensed">
-          <tbody>
-            <tr ng-repeat="word in words">
-              <td>
-              	<word-link word="::word" />
-              </td>
-            </tr>
-          </tbody>
-        </table>
-        <div class="panel-footer">
-          Page <span ng-bind="wordsIndexModels.page||1"></span> of <span ng-bind="maxPage||1"></span>
+  </menu-affix>
+  <div class="container">
+    <div class="row">
+      <div class="col-md-12">
+        <div class="panel panel-default">
+          <div class="panel-heading">
+            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>
+          <table class="table table-hover table-condensed">
+            <tbody>
+              <tr ng-repeat="word in words">
+                <td>
+                	<word-link word="::word" />
+                </td>
+              </tr>
+            </tbody>
+          </table>
+          <div class="panel-footer">
+            Page <span ng-bind="wordsIndexModels.page||1"></span> of <span ng-bind="maxPage||1"></span>
+          </div>
         </div>
       </div>
     </div>
-  </div>
-  <div class="row">
-    <div class="col-md-12 text-center">
-      <pagination total="wordsTotal" page="wordsIndexModels.page" limit="wordsIndexModels.limit" />
+    <div class="row">
+      <div class="col-md-12 text-center">
+        <pagination total="wordsTotal" page="wordsIndexModels.page" limit="wordsIndexModels.limit" />
+      </div>
     </div>
   </div>
 </div>
diff --git a/vipra-ui/app/html/words/show.html b/vipra-ui/app/html/words/show.html
index 0b019785b96a496cf641cd08a7f73efd6867ac2c..b9dcd52cb647569fb4273f68279fd4e9199e55b3 100644
--- a/vipra-ui/app/html/words/show.html
+++ b/vipra-ui/app/html/words/show.html
@@ -1 +1,6 @@
+<div class="container" ng-cloak ng-hide="!rootModels.topicModel || state.name !== 'words.show'">
+  <div class="page-header no-border">
+    <h1 ng-bind="::word.id"></h1>
+  </div>
+</div>
 <div ng-cloak ui-view></div>
\ No newline at end of file
diff --git a/vipra-ui/app/js/controllers.js b/vipra-ui/app/js/controllers.js
index 0b589b064ca8af23715c4e27d03cb691193b7e08..f9e77c957d414bf133148452973a606dcbb68625 100644
--- a/vipra-ui/app/js/controllers.js
+++ b/vipra-ui/app/js/controllers.js
@@ -884,8 +884,8 @@
   /**
    * Topic Show route
    */
-  app.controller('TopicsShowController', ['$scope', '$state', '$stateParams', '$timeout', 'hotkeys', 'TopicFactory', 'SequenceFactory',
-    function($scope, $state, $stateParams, $timeout, hotkeys, TopicFactory, SequenceFactory) {
+  app.controller('TopicsShowController', ['$scope', '$state', '$stateParams', '$timeout', 'TopicFactory', 'SequenceFactory',
+    function($scope, $state, $stateParams, $timeout, TopicFactory, SequenceFactory) {
 
       $scope.topicsShowModels = {
         relSeqstyle: 'absolute',
@@ -1150,9 +1150,20 @@
     }
   ]);
 
-  app.controller('EntitiesShowController', [
-    function() {
-      // TODO implement
+  app.controller('EntitiesShowController', ['$scope', '$stateParams', 'EntityFactory',
+    function($scope, $stateParams, EntityFactory) {
+
+      EntityFactory.get({
+        id: $stateParams.id
+      }, function(data) {
+        $scope.entity = data;
+        $scope.entityCreated = Vipra.formatDateTime($scope.entity.created);
+        $scope.entityModified = Vipra.formatDateTime($scope.entity.modified);
+
+        // take entity model from entity
+        if (!angular.isObject($scope.rootModels.topicModel))
+          $scope.rootModels.topicModel = data.topicModel;
+      });
     }
   ]);
 
@@ -1227,9 +1238,18 @@
     }
   ]);
 
-  app.controller('WordsShowController', [
-    function() {
-      // TODO implement
+  app.controller('WordsShowController', ['$scope', '$stateParams', 'WordFactory',
+    function($scope, $stateParams, WordFactory) {
+
+      WordFactory.get({
+        id: $stateParams.id
+      }, function(data) {
+        $scope.word = data;
+
+        // take word model from word
+        if (!angular.isObject($scope.rootModels.topicModel))
+          $scope.rootModels.topicModel = data.topicModel;
+      });
     }
   ]);
 
@@ -1392,7 +1412,6 @@
 
       $scope.changePage = function(page) {
         $scope.page = page;
-        window.scrollTo(0, 0);
       };
 
       $scope.toPage = function() {
diff --git a/vipra-ui/app/js/directives.js b/vipra-ui/app/js/directives.js
index ce763602453c5b77a3664dcd0a758083249272a1..b2e77c97973da39873e9cad5e34b8bf1d7cea57a 100644
--- a/vipra-ui/app/js/directives.js
+++ b/vipra-ui/app/js/directives.js
@@ -426,4 +426,29 @@
     };
   }]);
 
+  app.directive('menuAffix', [function() {
+    return {
+      transclude: true,
+      template: '<div class="menu-affix" ng-transclude></div><div class="affix-after"></div>',
+      link: function($scope, $elem) {
+        var elem = $elem.find('.menu-affix'),
+          after = $elem.find('.affix-after');
+
+        elem.affix({
+          offset: {
+            top: elem.offset().top - 50
+          }
+        });
+
+        elem.on('affix.bs.affix', function() {
+          after.css('height', elem.height());
+        });
+
+        elem.on('affix-top.bs.affix', function() {
+          after.css('height', 0);
+        });
+      }
+    };
+  }]);
+
 })();
\ No newline at end of file
diff --git a/vipra-ui/app/js/factories.js b/vipra-ui/app/js/factories.js
index b9195e4e164d984a216ce33093a628bff0a36881..7cb747e7f32322a41c4b79ad658d589c391df14c 100644
--- a/vipra-ui/app/js/factories.js
+++ b/vipra-ui/app/js/factories.js
@@ -69,7 +69,11 @@
   }]);
 
   app.factory('TopicModelFactory', ['$myResource', function($myResource) {
-    return $myResource(Vipra.config.restUrl + '/topicmodels/:id');
+    return $myResource(Vipra.config.restUrl + '/topicmodels/:id', {}, {
+      query: {
+        cache: false
+      }
+    });
   }]);
 
   app.factory('WordFactory', ['$myResource', function($myResource) {
diff --git a/vipra-ui/app/less/app.less b/vipra-ui/app/less/app.less
index 83d3a28de35fe97ede348a79a378ed0d6b5bae13..48c80f79ef3a3a1f406cd1660101ff5bca991073 100644
--- a/vipra-ui/app/less/app.less
+++ b/vipra-ui/app/less/app.less
@@ -506,6 +506,24 @@ entity-menu {
   }
 }
 
+.menu-affix {
+  width: 100%;
+  top: 50px;
+  left: 0;
+  right: 0;
+  background: #fff;
+  z-index: 1030;
+  line-height: 0;
+
+  &.affix {
+    border-bottom: 1px solid #ddd;
+  }
+
+  .pagination {
+    margin: 10px 0;
+  }
+}
+
 @-moz-keyframes spin {
   100% {
     -moz-transform: rotateY(360deg);