diff --git a/packages/auth/.eslintignore b/packages/auth/.eslintignore
new file mode 100644
index 0000000000000000000000000000000000000000..7b596da7b5a30a2b742e9bc9bc8002606940e18a
--- /dev/null
+++ b/packages/auth/.eslintignore
@@ -0,0 +1,3 @@
+/vendor/**
+/dist/**
+/*.js
\ No newline at end of file
diff --git a/packages/auth/.eslintrc.json b/packages/auth/.eslintrc.json
new file mode 100644
index 0000000000000000000000000000000000000000..1ccd30a3fee0b4867a0172e746714eb0083fb07d
--- /dev/null
+++ b/packages/auth/.eslintrc.json
@@ -0,0 +1,25 @@
+{
+    "env": {
+        "browser": true,
+        "es6": true,
+        "mocha": true
+    },
+    "extends": ["eslint:recommended", "plugin:jsdoc/recommended"],
+    "globals": {
+        "Atomics": "readonly",
+        "SharedArrayBuffer": "readonly"
+    },
+    "parser": "babel-eslint",
+    "parserOptions": {
+        "ecmaVersion": 2018,
+        "sourceType": "module"
+    },
+    "rules": {
+        "no-unused-vars": ["error", { "args": "none" }],
+        "semi": [2, "always"],
+        "jsdoc/require-jsdoc": 0,
+        "jsdoc/require-param-description": 0,
+        "jsdoc/require-returns": 0,
+        "jsdoc/require-param-type": 0
+    }
+}
\ No newline at end of file
diff --git a/packages/auth/karma.conf.js b/packages/auth/karma.conf.js
index 6a646f5ec9ea5a6c50dd25dc6038dd94fff1bc43..b6731e5705b9b7419fa3831747c0a3feb0bfd074 100644
--- a/packages/auth/karma.conf.js
+++ b/packages/auth/karma.conf.js
@@ -4,7 +4,12 @@ process.env.CHROME_BIN = require('puppeteer').executablePath();
 module.exports = function(config) {
   config.set({
     basePath: 'dist',
-    frameworks: ['mocha', 'chai'],
+    frameworks: ['mocha'],
+    client: {
+      mocha: {
+        ui: 'tdd',
+      },
+    },
     files: [
       {pattern: './*.js', included: true, watched: true, served: true, type: 'module'},
       {pattern: './**/*', included: false, watched: true, served: true},
diff --git a/packages/auth/package.json b/packages/auth/package.json
index e624b7d687892909b9739dd98a7ffd1d88e2fa32..75f27bcf120fd5be3ec8ebf56ae05adab7e39220 100644
--- a/packages/auth/package.json
+++ b/packages/auth/package.json
@@ -10,6 +10,9 @@
     "karma-chai": "^0.1.0",
     "karma-chrome-launcher": "^3.0.0",
     "karma-mocha": "^1.3.0",
+    "babel-eslint": "^10.0.3",
+    "eslint": "^6.8.0",
+    "eslint-plugin-jsdoc": "^21.0.0",
     "mocha": "^6.2.0",
     "node-sass": "^4.12.0",
     "puppeteer": "^1.15.0",
@@ -44,6 +47,7 @@
     "watch": "npm run watch-local",
     "watch-local": "rollup -c --watch",
     "watch-dev": "rollup -c --watch --environment BUILD:development",
-    "test": "npm run build-test && karma start --singleRun"
+    "test": "npm run build-test && karma start --singleRun",
+    "lint": "eslint ."
   }
 }
diff --git a/packages/auth/rollup.config.js b/packages/auth/rollup.config.js
index 549369f1059c07c88259ff3ac437e006d8724ed3..5dec8e77254572ccee17b264c9c894f2bd8f520e 100644
--- a/packages/auth/rollup.config.js
+++ b/packages/auth/rollup.config.js
@@ -8,6 +8,7 @@ import json from 'rollup-plugin-json';
 import serve from 'rollup-plugin-serve';
 import consts from 'rollup-plugin-consts';
 import del from 'rollup-plugin-delete';
+import chai from 'chai';
 
 const build = (typeof process.env.BUILD !== 'undefined') ? process.env.BUILD : 'local';
 console.log("build: " + build);
@@ -27,6 +28,10 @@ export default {
         if (warning.code === 'EVAL') {
             return;
         }
+        // ignore chai warnings
+        if (warning.code === 'CIRCULAR_DEPENDENCY') {
+            return;
+        }
         warn(warning);
     },
     plugins: [
@@ -43,7 +48,10 @@ export default {
           }
         }),
         commonjs({
-            include: 'node_modules/**'
+            include: 'node_modules/**',
+            namedExports: {
+                'chai': Object.keys(chai),
+            }
         }),
         json(),
         (build !== 'local' && build !== 'test') ? terser() : false,
diff --git a/packages/auth/src/vpu-auth.js b/packages/auth/src/vpu-auth.js
index 8199007d6d2c2ad7ad5e4a5e47d193388955014c..1bfeace9abe7db95a1c1ff4fed53e697c1cc99ea 100644
--- a/packages/auth/src/vpu-auth.js
+++ b/packages/auth/src/vpu-auth.js
@@ -65,7 +65,7 @@ class VPUAuth extends VPULitElement {
         this.keycloakDataUpdateEvent = new CustomEvent("vpu-auth-keycloak-data-update", { "detail": "KeyCloak data was updated", bubbles: true, composed: true });
 
         this.closeDropdown = this.closeDropdown.bind(this);
-        this._onKCChanged = this._onKCChanged.bind(this)
+        this._onKCChanged = this._onKCChanged.bind(this);
    }
 
     _onKCChanged(event) {
diff --git a/packages/auth/test/unit.js b/packages/auth/test/unit.js
index b73dd0ee0f682875e7d05a06438fe1ebc2f76426..a2640cca2312cabb29cdcaa23e865b47d0614cb9 100644
--- a/packages/auth/test/unit.js
+++ b/packages/auth/test/unit.js
@@ -1,38 +1,40 @@
+import {expect} from 'chai';
+
 import '../src/vpu-auth';
 import '../src/vpu-auth-demo';
 
-describe('vpu-auth basics', () => {
+suite('vpu-auth basics', () => {
   let node;
 
-  beforeEach(async () => {
+  suiteSetup(async () => {
     node = document.createElement('vpu-auth');
     document.body.appendChild(node);
     await node.updateComplete;
   });
 
-  afterEach(() => {
+  suiteTeardown(() => {
     node.remove();
   });
 
-  it('should render', () => {
+  test('should render', () => {
       expect(node).to.have.property('shadowRoot');
   });
 });
 
-describe('vpu-auth-demo basics', () => {
+suite('vpu-auth-demo basics', () => {
   let node;
 
-  beforeEach(async () => {
+  suiteSetup(async () => {
     node = document.createElement('vpu-auth-demo');
     document.body.appendChild(node);
     await node.updateComplete;
   });
 
-  afterEach(() => {
+  suiteTeardown(() => {
     node.remove();
   });
 
-  it('should render', () => {
+  test('should render', () => {
       expect(node).to.have.property('shadowRoot');
   });
 });