diff --git a/.env b/.env
index e028ff2c7c7b709ba904887c02151414753c63ba..29cca1b86adf589fa833f55db16dab4bae252694 100644
--- a/.env
+++ b/.env
@@ -1,4 +1,5 @@
 POSTGRES_USER=ics
 POSTGRES_PASSWORD=icspwd
 POSTGRES_DB=csentry_db
-PGDATA_VOLUME=./data
+PGDATA_VOLUME=./data/postgres
+ELASTIC_DATA_VOLUME=./data/elastic
diff --git a/Makefile b/Makefile
index 78966b991f8f1f99b5c6a71c2a8e01a6858cc1a5..d7220b3dab036458de5053d779c2dccdf37ea51c 100644
--- a/Makefile
+++ b/Makefile
@@ -38,7 +38,7 @@ release: refresh \
 release: ## build, tag, and push all stacks
 
 db: ## start postgres and redis for development
-	docker-compose up -d postgres redis worker
+	docker-compose up -d postgres redis elasticsearch worker
 
 init_db: ## initialize the dev database
 	docker-compose run --rm web flask db upgrade head
diff --git a/app/factory.py b/app/factory.py
index 8d11576e682df5ce6d9d7620f36e49a0de4522f6..060d6922ef3bcd3417eb22435b6657fba2d5cbf1 100644
--- a/app/factory.py
+++ b/app/factory.py
@@ -14,6 +14,7 @@ import sqlalchemy as sa
 import rq_dashboard
 from flask import Flask
 from whitenoise import WhiteNoise
+from elasticsearch import Elasticsearch
 from . import settings, models
 from .extensions import (
     db,
@@ -113,6 +114,11 @@ def create_app(config=None):
     app.config["SESSION_REDIS"] = session_redis_store
     fsession.init_app(app)
     cache.init_app(app)
+    app.elasticsearch = (
+        Elasticsearch([app.config["ELASTICSEARCH_URL"]])
+        if app.config["ELASTICSEARCH_URL"]
+        else None
+    )
 
     admin.init_app(app)
     admin.add_view(UserAdmin(models.User, db.session, endpoint="users"))
diff --git a/app/settings.py b/app/settings.py
index 14784a87c4cb46edf2e9a6fd0e73dd7ad3340216..254a6e7a2b725daa725836bc757c9d8d9b18d357 100644
--- a/app/settings.py
+++ b/app/settings.py
@@ -36,6 +36,8 @@ CACHE_REDIS_URL = "redis://redis:6379/1"
 REDIS_URL = "redis://redis:6379/2"
 QUEUES = ["default"]
 
+ELASTICSEARCH_URL = "http://elasticsearch:9200"
+
 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.override.yml b/docker-compose.override.yml
index 239d28fb7d78aefd486a3cab25dae32ee64dad65..a36399ad0700533b0c53a8b5f72e4129eee3f576 100644
--- a/docker-compose.override.yml
+++ b/docker-compose.override.yml
@@ -26,3 +26,8 @@ services:
     volumes:
       - ./postgres/create-test-db.sh:/docker-entrypoint-initdb.d/create-test-db.sh
       - ${PGDATA_VOLUME}:/var/lib/postgresql/data/pgdata
+  elasticsearch:
+    volumes:
+      - ${ELASTIC_DATA_VOLUME}:/usr/share/elasticsearch/data
+    ports:
+      - "9200:9200"
diff --git a/docker-compose.yml b/docker-compose.yml
index 7700c3226b894d294daa2f9752ea8f06acbb92d9..ac0a31960f1a1a1a99bb9bd969e972d176248a85 100644
--- a/docker-compose.yml
+++ b/docker-compose.yml
@@ -7,6 +7,7 @@ services:
     depends_on:
       - postgres
       - redis
+      - elasticsearch
   worker:
     image: registry.esss.lu.se/ics-infrastructure/csentry:master
     container_name: csentry_worker
@@ -28,3 +29,15 @@ services:
   redis:
     image: redis:4.0
     container_name: csentry_redis
+  elasticsearch:
+    image: docker.elastic.co/elasticsearch/elasticsearch:6.4.2
+    container_name: csentry_elasticsearch
+    environment:
+      - cluster.name=csentry-cluster
+      - bootstrap.memory_lock=true
+      - discovery.type=single-node
+      - "ES_JAVA_OPTS=-Xms512m -Xmx512m"
+    ulimits:
+      memlock:
+        soft: -1
+        hard: -1
diff --git a/requirements-to-freeze.txt b/requirements-to-freeze.txt
index 7d087bb041c85a3eaaa52019a57e8b4c96750253..336128f5b605057fb25f8060277e2c5d457d64ca 100644
--- a/requirements-to-freeze.txt
+++ b/requirements-to-freeze.txt
@@ -1,3 +1,4 @@
+elasticsearch
 flask>=1.0.0
 flask-admin
 flask-caching
diff --git a/requirements.txt b/requirements.txt
index 21a2a7bf853d4036b38f77d32f4bd0d14fa55e4c..c3ff3a87c1f2e5b6079a7cdb74f3e3ec821f36a1 100644
--- a/requirements.txt
+++ b/requirements.txt
@@ -6,6 +6,7 @@ certifi==2018.4.16
 chardet==3.0.4
 click==6.7
 colorama==0.3.9
+elasticsearch==6.3.1
 et-xmlfile==1.0.1
 Flask==1.0.2
 Flask-Admin==1.5.1