diff --git a/Makefile b/Makefile
index 4f6e4c54227735dbcb409aeccc84154c8ceb9346..da923b5bcfeb0e94bc1c81f58413bf73e4ccc64d 100644
--- a/Makefile
+++ b/Makefile
@@ -25,6 +25,7 @@ push: ## push the latest and git tag image
 clean: ## remove the image with git tag and the test database
 	-docker rmi $(OWNER)/$(IMAGE):$(GIT_TAG)
 	-docker rm -f csentry_postgres
+	-docker rm -f csentry_redis
 
 refresh: ## pull the latest image from Docker Hub
 # skip if error: image might not be on dockerhub yet
@@ -36,8 +37,8 @@ release: refresh \
 	push
 release: ## build, tag, and push all stacks
 
-db: ## start postgres for development
-	docker-compose up -d postgres
+db: ## start postgres and redis for development
+	docker-compose up -d postgres redis
 
 initdb: ## initialize the dev database
 	docker-compose run --rm web flask initdb
@@ -45,9 +46,9 @@ initdb: ## initialize the dev database
 test:  ## run the tests (on current directory)
 	docker-compose run --rm web pytest --cov=app -v
 
-db_image: ## start postgres to test the latest image
+db_image: ## start postgres and redis to test the latest image
 # Pass docker-compose.yml to skip docker-compose.override.yml
-	docker-compose -f docker-compose.yml up -d postgres
+	docker-compose -f docker-compose.yml up -d postgres redis
 
 test_image:  ## run the tests (on the latest image)
 # Pass docker-compose.yml to skip docker-compose.override.yml
diff --git a/app/extensions.py b/app/extensions.py
index f6cbf40c6df75966ae7b65be83bf1f8d7323fde2..275ab261fd371cba4c084a475922a88d413ddddc 100644
--- a/app/extensions.py
+++ b/app/extensions.py
@@ -19,6 +19,8 @@ from flask_admin import Admin
 from flask_mail import Mail
 from flask_jwt_extended import JWTManager
 from flask_debugtoolbar import DebugToolbarExtension
+from flask_redis import FlaskRedis
+from flask_session import Session
 
 
 convention = {
@@ -39,3 +41,5 @@ admin = Admin(template_mode='bootstrap3')
 mail = Mail()
 jwt = JWTManager()
 toolbar = DebugToolbarExtension()
+redis_store = FlaskRedis()
+fsession = Session()
diff --git a/app/factory.py b/app/factory.py
index e33729490fa653369bc1d24c26e0322ffec3c179..a3e2da70a261e6d1927ac5b8ac92be58fccd0666 100644
--- a/app/factory.py
+++ b/app/factory.py
@@ -13,7 +13,8 @@ import sqlalchemy as sa
 from flask import Flask
 from whitenoise import WhiteNoise
 from . import settings, models
-from .extensions import db, migrate, login_manager, ldap_manager, bootstrap, admin, mail, jwt, toolbar
+from .extensions import (db, migrate, login_manager, ldap_manager, bootstrap,
+                         admin, mail, jwt, toolbar, redis_store, fsession)
 from .admin.views import (AdminModelView, ItemAdmin, UserAdmin, GroupAdmin, TokenAdmin,
                           NetworkAdmin)
 from .inventory.views import bp as inventory
@@ -92,6 +93,9 @@ def create_app(config=None):
     mail.init_app(app)
     jwt.init_app(app)
     toolbar.init_app(app)
+    redis_store.init_app(app)
+    app.config['SESSION_REDIS'] = redis_store
+    fsession.init_app(app)
 
     admin.init_app(app)
     admin.add_view(GroupAdmin(models.Group, db.session))
diff --git a/app/settings.py b/app/settings.py
index bf18063618efef37eb1bd58762afb9b1ae00f588..e3a6caaafc3197df6687626f0f7c5b7456f61cd1 100644
--- a/app/settings.py
+++ b/app/settings.py
@@ -26,6 +26,9 @@ JWT_BLACKLIST_ENABLED = True
 JWT_BLACKLIST_TOKEN_CHECKS = ['access', 'refresh']
 JWT_ACCESS_TOKEN_EXPIRES = timedelta(hours=12)
 
+SESSION_TYPE = 'redis'
+REDIS_URL = 'redis://redis:6379/0'
+
 LDAP_HOST = 'esss.lu.se'
 LDAP_BASE_DN = 'DC=esss,DC=lu,DC=se'
 LDAP_USER_DN = 'OU=ESS Users'
diff --git a/docker-compose.yml b/docker-compose.yml
index dc458e6e13d991847ebd27dc544af8d5954af4df..9d9e587900a47cbea6985fb5ae6f9af43f279bbe 100644
--- a/docker-compose.yml
+++ b/docker-compose.yml
@@ -6,6 +6,7 @@ services:
     command: pytest --cov=app -v
     depends_on:
       - postgres
+      - redis
   postgres:
     image: postgres:10
     container_name: csentry_postgres
@@ -18,3 +19,6 @@ services:
       POSTGRES_PASSWORD: ${POSTGRES_PASSWORD}
       POSTGRES_DB: ${POSTGRES_DB}
       PGDATA: /var/lib/postgresql/data/pgdata
+  redis:
+    image: redis:4.0
+    container_name: csentry_redis
diff --git a/environment.yml b/environment.yml
index 43f3f3acedc5708d96816fc8a267209fb54e5bf6..0cb0c831b9b599fe22ffff4fdbedc476ae2abb97 100644
--- a/environment.yml
+++ b/environment.yml
@@ -57,6 +57,7 @@ dependencies:
 - python-editor=1.0.3=py36_0
 - qrcode=5.3=py36_0
 - readline=6.2=0
+- redis-py=2.10.6=py_0
 - setuptools=36.7.2=py36_0
 - six=1.11.0=py36_1
 - sqlalchemy=1.1.13=py36_0
@@ -74,6 +75,8 @@ dependencies:
   - email-validator==1.0.2
   - git+https://github.com/beenje/flask-bootstrap@4.0.0-beta.1.dev1
   - flask-ldap3-login==0.9.13
+  - flask-redis==0.3.0
+  - flask-session==0.3.1
   - inflection==0.3.1
   - pytest-factoryboy==1.3.1
   - sqlalchemy-citext==1.3.post0