diff --git a/mutalyzer/announce.py b/mutalyzer/announce.py
new file mode 100644
index 0000000000000000000000000000000000000000..5fb484dca78a67e3320ec41be637fbc104279163
--- /dev/null
+++ b/mutalyzer/announce.py
@@ -0,0 +1,40 @@
+"""
+Simplistic interface to setting a user announcement.
+
+We store up to one announcement at a time, containing a text body and an
+optional 'read more' URL. Since getting the announcement should be really
+fast, it can be done on every website pageview without problems.
+"""
+
+
+from mutalyzer.redisclient import client
+
+
+def set_announcement(body, url=None):
+    """
+    Set announcement.
+    """
+    announcement = {'body': body}
+    if url:
+        announcement['url'] = url
+
+    client.hmset('announcement', announcement)
+
+
+def unset_announcement():
+    """
+    Unset announcement.
+    """
+    client.delete('announcement')
+
+
+def get_announcement():
+    """
+    Get announcement.
+    """
+    announcement = client.hgetall('announcement')
+    if not announcement:
+        return
+
+    return {'body': announcement['body'],
+            'url': announcement.get('url')}
diff --git a/mutalyzer/entrypoints/admin.py b/mutalyzer/entrypoints/admin.py
index 0a1a5043860f063a97b438290b716cb731994156..a8217bef82d9e229437969853ca660d806a47ebc 100644
--- a/mutalyzer/entrypoints/admin.py
+++ b/mutalyzer/entrypoints/admin.py
@@ -9,6 +9,7 @@ import json
 from sqlalchemy.exc import IntegrityError
 from sqlalchemy.orm.exc import NoResultFound
 
+from .. import announce
 from ..db import session
 from ..db.models import Assembly, Chromosome
 from .. import mapping
@@ -113,6 +114,20 @@ def sync_cache(wsdl_url, url_template, history=7):
     cache_sync.sync_with_remote(wsdl_url, url_template, history)
 
 
+def set_announcement(body, url=None):
+    """
+    Set announcement to show to the user.
+    """
+    announce.set_announcement(body, url=url)
+
+
+def unset_announcement():
+    """
+    Unset announcement to show to the user.
+    """
+    announce.unset_announcement()
+
+
 def main():
     """
     Command-line interface to Mutalyzer administrative tools.
@@ -194,6 +209,23 @@ def main():
         default=7, help='number of days to go back in the remote cache '
         '(default: 7)')
 
+    p = subparsers.add_parser(
+        'set-announcement', help='set user announcement',
+        description=set_announcement.__doc__.split('\n\n')[0],
+        epilog='The announcement is shown on every page of the website.')
+    p.set_defaults(func=set_announcement)
+    p.add_argument(
+        'body', metavar='ANNOUNCEMENT',
+        help='announcement text to show to the user')
+    p.add_argument(
+        '--url', metavar='URL', dest='url',
+        help='URL to more information on the announcement')
+
+    p = subparsers.add_parser(
+        'unset-announcement', help='unset user announcement',
+        description=unset_announcement.__doc__.split('\n\n')[0])
+    p.set_defaults(func=unset_announcement)
+
     args = parser.parse_args()
 
     try:
diff --git a/mutalyzer/website/templates/base.html b/mutalyzer/website/templates/base.html
index 826b26041e520593654407d6cbc6003cb2b5020b..07bc54200917a16b98a458c6a8d7fdb086317f18 100644
--- a/mutalyzer/website/templates/base.html
+++ b/mutalyzer/website/templates/base.html
@@ -277,6 +277,9 @@
     <td width="0"></td>
     <td width="0">
 
+    {% if announcement %}
+      <p><b>Announcement:</b> {{ announcement.body }}{% if announcement.url %} <a href="{{ announcement.url }}">read more</a>{% endif %}</p>
+    {% endif %}
 
     <center>
       <h2>Mutalyzer {{ mutalyzer_version }}<br>
diff --git a/mutalyzer/website/views.py b/mutalyzer/website/views.py
index 0574995d92052ed95cd1fc280e1c36be82878384..98f79ed986b6308f57b3813f0d2783a224bdb6d9 100644
--- a/mutalyzer/website/views.py
+++ b/mutalyzer/website/views.py
@@ -19,8 +19,8 @@ from spyne.server.http import HttpBase
 from sqlalchemy.orm.exc import NoResultFound
 
 import mutalyzer
-from mutalyzer import (describe, File, Retriever, Scheduler, stats, util,
-                       variantchecker)
+from mutalyzer import (announce, describe, File, Retriever, Scheduler, stats,
+                       util, variantchecker)
 from mutalyzer.config import settings
 from mutalyzer.db import session
 from mutalyzer.db.models import BATCH_JOB_TYPES
@@ -46,7 +46,8 @@ def add_globals():
             'json_root_url'       : settings.JSON_ROOT_URL,
             'piwik'               : settings.PIWIK,
             'piwik_base_url'      : settings.PIWIK_BASE_URL,
-            'piwik_site_id'       : settings.PIWIK_SITE_ID}
+            'piwik_site_id'       : settings.PIWIK_SITE_ID,
+            'announcement'        : announce.get_announcement()}
 
 
 @website.route('/')