initial Commit
diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..01e2636
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1,14 @@
+.git
+.idea/**/*.xml
+.settings
+.classpath
+target
+/.idea/compiler.xml
+/.idea/*.xml
+/.idea/modules.xml
+/.idea/vcs.xml
+/bin/
+.iml
+.project
+.classpath
+/elogbook.iml
diff --git a/api/swagger/swagger.yaml b/api/swagger/swagger.yaml
new file mode 100644
index 0000000..c506da6
--- /dev/null
+++ b/api/swagger/swagger.yaml
@@ -0,0 +1,13 @@
+swagger: "2.0"
+info:
+	version: "1.0.0"
+	title: eLogbook API
+host: localhost:3000
+basePath: /
+schemes:
+	- http
+consumes:
+	- application/json
+produces:
+	- application/json
+paths:
\ No newline at end of file
diff --git a/db/db_dev_evolution/create_BTB_DB_0.1.1.sql b/db/db_dev_evolution/create_BTB_DB_0.1.1.sql
new file mode 100644
index 0000000..22eab2a
--- /dev/null
+++ b/db/db_dev_evolution/create_BTB_DB_0.1.1.sql
@@ -0,0 +1,331 @@
+-- Database: betriebstagebuch
+
+
+-- DROP DATABASE betriebstagebuch;
+
+-- REVIEW: Why is drop commented out? A clean install is strongly encouraged  
+
+/*
+CREATE DATABASE betriebstagebuch
+    WITH
+    OWNER = postgres
+    ENCODING = 'UTF8'
+    LC_COLLATE = 'German_Germany.1252'
+    LC_CTYPE = 'German_Germany.1252'
+    TABLESPACE = pg_default
+    CONNECTION LIMIT = -1;
+
+-- Role: btbservice
+
+-- DROP ROLE btbservice;
+CREATE ROLE btbservice LOGIN
+  ENCRYPTED PASSWORD 'md5014d35e4f8632560130b265acb21413f'
+  NOSUPERUSER INHERIT NOCREATEDB NOCREATEROLE NOREPLICATION;
+*/
+
+
+/*
+DROP SEQUENCE public.tbl_notification_incident_id_seq;
+
+DROP TABLE public.tbl_notification;
+DROP TABLE public."ref_version";
+DROP TABLE public.ref_branch;
+DROP TABLE public.ref_notification_status;
+DROP TABLE public.tbl_settings;
+
+DROP VIEW public.view_active_notification;
+*/
+
+-- Table: public."REF_VERSION" -------------------------------------------------
+CREATE TABLE public."ref_version"
+(
+    "id" integer NOT NULL,
+    "version" varchar(100) NOT NULL,
+    CONSTRAINT "ref_version_pkey" PRIMARY KEY ("id")
+)
+WITH (
+    OIDS = FALSE
+)
+TABLESPACE pg_default;
+
+ALTER TABLE public."ref_version"
+    OWNER to btbservice;
+
+
+
+-- Table: public."REF_BRANCH" (Sparte) -----------------------------------------
+
+CREATE TABLE public.ref_branch
+(
+    id SERIAL PRIMARY KEY,
+    name character varying(50) NOT NULL,
+    description character varying(255) NULL
+)
+WITH (
+    OIDS=FALSE
+);
+ALTER TABLE public.ref_branch
+    OWNER TO btbservice;
+
+-- Table: public."REF_NOTIFICATION_STATUS" -----------------------------------------
+
+CREATE TABLE public.ref_notification_status
+(
+    id SERIAL PRIMARY KEY,
+    name character varying(50) NOT NULL
+)
+WITH (
+    OIDS=FALSE
+);
+ALTER TABLE public.ref_notification_status
+    OWNER TO btbservice;
+
+-- Table: public.tbl_settings --------------------------------------------------------
+
+CREATE TABLE public.tbl_settings
+(
+    parameter_name character varying(100) COLLATE pg_catalog."default" NOT NULL,
+    parameter_value character varying(100) COLLATE pg_catalog."default" NOT NULL
+)
+WITH (
+    OIDS = FALSE
+)
+TABLESPACE pg_default;
+
+ALTER TABLE public.tbl_settings
+    OWNER to btbservice;
+
+-- Table: public."TBL_NOTIFICATION" ---------------------------------------------
+-- DROP SEQUENCE public.tbl_notification_incident_id_seq;
+CREATE SEQUENCE public.tbl_notification_incident_id_seq;
+
+CREATE TABLE public.tbl_notification
+(
+  id SERIAL PRIMARY KEY,
+  incident_id integer,
+  version integer NOT NULL DEFAULT 0,
+  fk_ref_branch integer NOT NULL,
+  notification_text character varying(200) NOT NULL,
+  free_text character varying(1000) NULL,
+  free_text_extended character varying(1000) NULL,
+  fk_ref_notification_status integer NOT NULL,
+  responsibility_forwarding character varying(100),
+  reminder_date timestamp without time zone NULL,
+  expected_finished_date timestamp without time zone NULL,
+  responsibility_control_point character varying(100),
+  begin_date timestamp without time zone NOT NULL,
+  finished_date timestamp without time zone NULL,
+  create_user character varying(100) NOT NULL,
+  create_date timestamp without time zone NOT NULL,
+  mod_user character varying(100),
+  mod_date timestamp without time zone
+)
+WITH (
+  OIDS=FALSE
+);
+ALTER TABLE public.tbl_notification
+  OWNER TO btbservice;
+
+CREATE UNIQUE INDEX tbl_notification_incident_version_unique
+   ON public.tbl_notification (incident_id ASC NULLS LAST, version ASC NULLS LAST);
+
+ALTER TABLE public.tbl_notification
+  ADD CONSTRAINT fk_notification_fk_status FOREIGN KEY (fk_ref_notification_status) REFERENCES public.ref_notification_status (id)
+   ON UPDATE NO ACTION ON DELETE NO ACTION;
+CREATE INDEX fki_notification_fk_status
+  ON public.tbl_notification(fk_ref_notification_status);
+
+ALTER TABLE public.tbl_notification
+  ADD CONSTRAINT fk_notification_fk_branch FOREIGN KEY (fk_ref_branch) REFERENCES public.ref_branch (id)
+   ON UPDATE NO ACTION ON DELETE NO ACTION;
+CREATE INDEX fki_notification_fk_branch
+  ON public.tbl_notification(fk_ref_branch);
+
+
+--------------------------------------------------------------------------------
+-- Triggers
+--------------------------------------------------------------------------------
+
+-- Trigger Function for setting the incident_id of a notification.
+-- This function is called on every insert on tbl_notification.
+-- Only for newly created notification we copy the id into the incident_id.
+
+-- drop trigger tbl_notification_incident_trg on tbl_notification_test
+CREATE or REPLACE FUNCTION tbl_notification_incident_trg() RETURNS trigger AS $tbl_notification_incident_trg$
+    BEGIN
+        IF NEW.incident_id IS NULL THEN
+            NEW.incident_id := NEW.id;
+        END IF;
+        RETURN NEW;
+    END;
+$tbl_notification_incident_trg$ LANGUAGE plpgsql;
+CREATE TRIGGER tbl_notification_incident_trg BEFORE INSERT ON tbl_notification
+    FOR EACH ROW EXECUTE PROCEDURE tbl_notification_incident_trg();
+
+--------------------------------------------------------------------------------
+-- Views
+--------------------------------------------------------------------------------
+
+-- View: public.view_active_notification
+-- DROP VIEW public.view_active_notification;
+
+-- Erstellt eine View, die die jeweils höchste Version einer Notification aus tbl_notification enthält.
+CREATE OR REPLACE VIEW public.view_active_notification AS
+ SELECT s.id,
+    s.incident_id,
+    s.version,
+    s.fk_ref_branch,
+    s.notification_text,
+    s.free_text,
+    s.free_text_extended,
+    s.fk_ref_notification_status,
+    s.responsibility_forwarding,
+    s.reminder_date,
+    s.expected_finished_date,
+    s.responsibility_control_point,
+    s.begin_date,
+    s.finished_date,
+    s.create_user,
+    s.create_date,
+    s.mod_user,
+    s.mod_date
+   FROM ( SELECT tbl_notification.id,
+            tbl_notification.incident_id,
+            tbl_notification.version,
+            tbl_notification.fk_ref_branch,
+            tbl_notification.notification_text,
+            tbl_notification.free_text,
+            tbl_notification.free_text_extended,
+            tbl_notification.fk_ref_notification_status,
+            tbl_notification.responsibility_forwarding,
+            tbl_notification.reminder_date,
+            tbl_notification.expected_finished_date,
+            tbl_notification.responsibility_control_point,
+            tbl_notification.begin_date,
+            tbl_notification.finished_date,
+            tbl_notification.create_user,
+            tbl_notification.create_date,
+            tbl_notification.mod_user,
+            tbl_notification.mod_date,
+            rank() OVER (PARTITION BY tbl_notification.incident_id ORDER BY tbl_notification.version DESC) AS rank
+           FROM tbl_notification) s
+  WHERE s.rank = 1;
+
+ALTER TABLE public.view_active_notification
+    OWNER TO btbservice;
+
+
+
+
+-- >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
+-- Fill DB Script
+INSERT INTO public."ref_version" ("id", "version") VALUES ( 1, '0.1.1_Snapshot');
+
+INSERT INTO public."ref_notification_status" ( id, name ) VALUES ( 1, 'offen' );
+INSERT INTO public."ref_notification_status" ( id, name ) VALUES ( 2, 'in Arbeit' );
+INSERT INTO public."ref_notification_status" ( id, name ) VALUES ( 3, 'erledigt' );
+INSERT INTO public."ref_notification_status" ( id, name ) VALUES ( 4, 'geschlossen' );
+SELECT setval('ref_notification_status_id_seq', 5, true);
+
+INSERT INTO public."ref_branch" (id, name, description ) VALUES ( 1, 'S', 'Strom' );
+INSERT INTO public."ref_branch" (id, name, description ) VALUES ( 2, 'G', 'Gas' );
+INSERT INTO public."ref_branch" (id, name, description ) VALUES ( 3, 'FW', 'Fernwärme' );
+INSERT INTO public."ref_branch" (id, name, description ) VALUES ( 4, 'W', 'Wasser' );
+SELECT setval('ref_branch_id_seq', 5, true);
+
+INSERT INTO public."tbl_settings" (parameter_name, parameter_value ) VALUES ( 'notification_list_closed_max_age', '6');
+
+-- REVIEW: Why are the Sprint comments necessary? 
+
+-->>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
+--++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
+-- ENDE Sprint 1
+--++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
+-->>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
+
+-->>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
+--++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
+-- Anfang Sprint 2 30.05.2017
+--++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
+-->>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
+UPDATE public."ref_branch" SET name='F' WHERE id=3;
+
+-->>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
+--++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
+-- Anfang Sprint 3 12.06.2017
+--++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
+-->>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
+
+-- >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
+-- Drop Tables
+DROP TABLE public.tbl_responsibility;
+DROP TABLE public.ref_grid_territory;
+
+-- Table: public."ref_grid_territory" (Netzgebiete) -------------------------------------------------
+CREATE TABLE public."ref_grid_territory"
+(
+    id SERIAL PRIMARY KEY,
+    name character varying(50) NOT NULL,
+    description character varying(255) NULL
+);
+
+CREATE UNIQUE INDEX ref_grid_territory_description_unique
+   ON public.ref_grid_territory (description ASC);
+
+ALTER TABLE public.ref_grid_territory
+   OWNER TO btbservice;
+
+-- Table: public."tbl_responsibility" (Verantwortlichkeiten) -------------------------------------------------
+CREATE TABLE public."tbl_responsibility"
+(
+    id SERIAL PRIMARY KEY,
+    fk_ref_grid_territory integer NOT NULL,
+    fk_ref_branch integer NOT NULL,
+    responsible_user character varying(100) NOT NULL,
+    new_responsible_user character varying(100),
+    create_user character varying(100) NOT NULL,
+    create_date timestamp without time zone NOT NULL,
+    mod_user character varying(100),
+    mod_date timestamp without time zone
+);
+
+CREATE UNIQUE INDEX tbl_responsibility_territory_branch_user_unique
+   ON public.tbl_responsibility (fk_ref_grid_territory ASC, fk_ref_branch ASC);
+
+ALTER TABLE public.tbl_responsibility
+  ADD CONSTRAINT fk_grid_territory FOREIGN KEY (fk_ref_grid_territory) REFERENCES public.ref_grid_territory (id)
+   ON UPDATE NO ACTION ON DELETE NO ACTION;
+
+ALTER TABLE public.tbl_responsibility
+  ADD CONSTRAINT fk_branch FOREIGN KEY (fk_ref_branch) REFERENCES public.ref_branch (id)
+   ON UPDATE NO ACTION ON DELETE NO ACTION;
+
+
+ALTER TABLE public.tbl_responsibility
+   OWNER TO btbservice;
+
+--REVIEW: Should be refactored to test data. We should have one script with DDL and multiple, content oriented DML scripts
+
+
+-- >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
+-- Fill DB Script
+
+-- Table: public."ref_grid_territory" (Netzgebiete)
+INSERT INTO public."ref_grid_territory" (id, name, description) VALUES ( 1, 'MA', 'Mannheim');
+INSERT INTO public."ref_grid_territory" (id, name, description) VALUES ( 2, 'OF', 'Offenbach');
+
+
+-- Table: public."tbl_responsibility" (Verantwortlichkeiten) -------------------------------------------------
+INSERT INTO public."tbl_responsibility" (id, fk_ref_grid_territory, fk_ref_branch, responsible_user, create_user, create_date) VALUES ( 1, 1, 1, 'admin','admin',now());
+INSERT INTO public."tbl_responsibility" (id, fk_ref_grid_territory, fk_ref_branch, responsible_user, create_user, create_date) VALUES ( 2, 1, 2, 'admin','admin',now());
+INSERT INTO public."tbl_responsibility" (id, fk_ref_grid_territory, fk_ref_branch, responsible_user, create_user, create_date) VALUES ( 3, 1, 3, 'admin','admin',now());
+INSERT INTO public."tbl_responsibility" (id, fk_ref_grid_territory, fk_ref_branch, responsible_user, create_user, create_date) VALUES ( 4, 2, 2, 'admin','admin',now());
+INSERT INTO public."tbl_responsibility" (id, fk_ref_grid_territory, fk_ref_branch, responsible_user, create_user, create_date) VALUES ( 5, 2, 3, 'otto','admin',now());
+INSERT INTO public."tbl_responsibility" (id, fk_ref_grid_territory, fk_ref_branch, responsible_user, create_user, create_date) VALUES ( 6, 1, 4, 'otto','admin',now());
+
+
+-->>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
+--++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
+-- Ende Sprint 3 21.06.2017
+--++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
+-->>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
diff --git a/db/db_dev_evolution/create_BTB_DB_0.1.2_Sprint4_OK145_ALTER_TABLE.sql b/db/db_dev_evolution/create_BTB_DB_0.1.2_Sprint4_OK145_ALTER_TABLE.sql
new file mode 100644
index 0000000..2141967
--- /dev/null
+++ b/db/db_dev_evolution/create_BTB_DB_0.1.2_Sprint4_OK145_ALTER_TABLE.sql
@@ -0,0 +1,104 @@
+/************************************************************************************
+ * Task: Add Foreign Key: tbl_notification references to ref_grid_territory,        *         
+ *       ref_grid_territory is self-referencing to  obtain tree structure           *
+ ************************************************************************************/
+
+
+/***** 1. Add Foreign key to tbl_notification, referencing ref_grid_territory *****/
+
+/* Add new column to tbl_notification */
+ALTER TABLE public.tbl_notification
+  ADD COLUMN fk_ref_grid_territory integer;       
+
+/* Add constraint */
+ALTER TABLE public.tbl_notification
+  ADD CONSTRAINT fk_notification_fk_grid_territory FOREIGN KEY (fk_ref_grid_territory) REFERENCES public.ref_grid_territory (id)
+  ON DELETE CASCADE;
+
+/* Create index */
+CREATE INDEX fki_notification_fk_grid_territory
+  ON public.tbl_notification(fk_ref_grid_territory);
+  
+/* Initialize column fk_ref_grid_territory with an already existing value, column will be set to NOT NULL in next step */
+UPDATE tbl_notification SET fk_ref_grid_territory = 1;
+
+/* Set column fk_ref_grid_territory NOT NULL */
+ALTER TABLE public.tbl_notification 
+  ALTER COLUMN fk_ref_grid_territory SET NOT NULL;
+ 
+ 
+/***** 2. Foreign key ref_master (self-referencing) *****/
+
+/* Add new column to ref_grid_territory */
+ALTER TABLE public.ref_grid_territory
+  ADD COLUMN fk_ref_master integer;       
+
+/* Add constraint */
+ALTER TABLE public.ref_grid_territory
+  ADD CONSTRAINT fk_ref_grid_territory_self FOREIGN KEY (fk_ref_master) REFERENCES public.ref_grid_territory (id)
+   ON DELETE CASCADE;
+
+/* Create index */
+CREATE INDEX fki_fk_grid_territory_self
+  ON public.ref_grid_territory(fk_ref_master);
+  
+/* Initialize column fk_ref_master with the value of column "id", fk_ref_master will be set to NOT NULL in next step */
+UPDATE public.ref_grid_territory SET fk_ref_master = id;
+
+/* Set column fk_ref_master NOT NULL */
+ALTER TABLE public.ref_grid_territory 
+  ALTER COLUMN fk_ref_master SET NOT NULL;
+
+
+/***** 3. Change the view according to the new foreign key *****/
+
+-- View: public.view_active_notification
+-- DROP VIEW public.view_active_notification;
+
+-- Erstellt eine View, die die jeweils höchste Version einer Notification aus tbl_notification enthält.
+CREATE OR REPLACE VIEW public.view_active_notification AS
+ SELECT s.id,
+    s.incident_id,
+    s.version,
+    s.fk_ref_branch,
+    s.notification_text,
+    s.free_text,
+    s.free_text_extended,
+    s.fk_ref_notification_status,
+    s.responsibility_forwarding,
+    s.reminder_date,
+    s.expected_finished_date,
+    s.responsibility_control_point,
+    s.begin_date,
+    s.finished_date,
+    s.create_user,
+    s.create_date,
+    s.mod_user,
+    s.mod_date,
+    s.fk_ref_grid_territory
+   FROM ( SELECT tbl_notification.id,
+            tbl_notification.incident_id,
+            tbl_notification.version,
+            tbl_notification.fk_ref_branch,
+            tbl_notification.notification_text,
+            tbl_notification.free_text,
+            tbl_notification.free_text_extended,
+            tbl_notification.fk_ref_notification_status,
+            tbl_notification.responsibility_forwarding,
+            tbl_notification.reminder_date,
+            tbl_notification.expected_finished_date,
+            tbl_notification.responsibility_control_point,
+            tbl_notification.begin_date,
+            tbl_notification.finished_date,
+            tbl_notification.create_user,
+            tbl_notification.create_date,
+            tbl_notification.mod_user,
+            tbl_notification.mod_date,
+            tbl_notification.fk_ref_grid_territory,
+            rank() OVER (PARTITION BY tbl_notification.incident_id ORDER BY tbl_notification.version DESC) AS rank
+           FROM tbl_notification) s
+  WHERE s.rank = 1;
+
+ALTER TABLE public.view_active_notification
+    OWNER TO btbservice;
+
diff --git a/db/db_dev_evolution/create_BTB_DB_0.1.3_Sprint6_OK210_notifications_fks_nullable.sql b/db/db_dev_evolution/create_BTB_DB_0.1.3_Sprint6_OK210_notifications_fks_nullable.sql
new file mode 100644
index 0000000..9c5c9ac
--- /dev/null
+++ b/db/db_dev_evolution/create_BTB_DB_0.1.3_Sprint6_OK210_notifications_fks_nullable.sql
@@ -0,0 +1,76 @@
+/* ********************************************************************************** */
+ -- Task: [OK-210] In table tbl_notification, make these foreign-keys nullable:      
+ -- * fk_ref_branch                                                                  
+ -- * fk_ref_grid_territory.                                                         
+ -- Add an admin flag to distinguish instructions from pure notifications            
+ -- Adapt view.                                                                      
+ /* ********************************************************************************** */
+
+
+/* *** 1. Make foreign keys nullable *** */
+
+ALTER TABLE public.tbl_notification 
+  ALTER COLUMN fk_ref_branch DROP NOT NULL;
+  
+ALTER TABLE public.tbl_notification 
+  ALTER COLUMN fk_ref_grid_territory DROP NOT NULL;
+ 
+/* *** 2. Add admin flag *** */
+
+ALTER TABLE public.tbl_notification
+  ADD COLUMN admin_flag BOOLEAN NOT NULL DEFAULT FALSE; 
+ 
+
+/* *** 3. Adapt view according to the new admin flag *** */
+
+-- View: public.view_active_notification
+-- DROP VIEW public.view_active_notification;
+
+-- Erstellt eine View, die die jeweils höchste Version einer Notification aus tbl_notification enthält.
+CREATE OR REPLACE VIEW public.view_active_notification AS
+ SELECT s.id,
+    s.incident_id,
+    s.version,
+    s.fk_ref_branch,
+    s.notification_text,
+    s.free_text,
+    s.free_text_extended,
+    s.fk_ref_notification_status,
+    s.responsibility_forwarding,
+    s.reminder_date,
+    s.expected_finished_date,
+    s.responsibility_control_point,
+    s.begin_date,
+    s.finished_date,
+    s.create_user,
+    s.create_date,
+    s.mod_user,
+    s.mod_date,
+    s.fk_ref_grid_territory,
+    s.admin_flag
+   FROM ( SELECT tbl_notification.id,
+            tbl_notification.incident_id,
+            tbl_notification.version,
+            tbl_notification.fk_ref_branch,
+            tbl_notification.notification_text,
+            tbl_notification.free_text,
+            tbl_notification.free_text_extended,
+            tbl_notification.fk_ref_notification_status,
+            tbl_notification.responsibility_forwarding,
+            tbl_notification.reminder_date,
+            tbl_notification.expected_finished_date,
+            tbl_notification.responsibility_control_point,
+            tbl_notification.begin_date,
+            tbl_notification.finished_date,
+            tbl_notification.create_user,
+            tbl_notification.create_date,
+            tbl_notification.mod_user,
+            tbl_notification.mod_date,
+            tbl_notification.fk_ref_grid_territory,
+            tbl_notification.admin_flag,
+            rank() OVER (PARTITION BY tbl_notification.incident_id ORDER BY tbl_notification.version DESC) AS rank
+           FROM tbl_notification) s
+  WHERE s.rank = 1;
+
+ALTER TABLE public.view_active_notification
+    OWNER TO btbservice;
diff --git a/db/db_dev_evolution/create_BTB_DB_0.1.3_Sprint6_OK225_create_htbl_responsibility.sql b/db/db_dev_evolution/create_BTB_DB_0.1.3_Sprint6_OK225_create_htbl_responsibility.sql
new file mode 100644
index 0000000..925d452
--- /dev/null
+++ b/db/db_dev_evolution/create_BTB_DB_0.1.3_Sprint6_OK225_create_htbl_responsibility.sql
@@ -0,0 +1,32 @@
+/* -- Table: public."htbl_responsibility"
+historisierung der Verantwortlichkeiten: neue Tabelle htbl_responsibility erstellen mit zusätzlichen Spalten: Timestamp, Transaktions-ID
+------------------------------------------------- */
+
+CREATE TABLE public."htbl_responsibility"
+(
+    id SERIAL PRIMARY KEY,
+    fk_ref_grid_territory integer NOT NULL,
+    fk_ref_branch integer NOT NULL,
+    transfer_date timestamp without time zone NOT NULL,
+    transaction_id integer NOT NULL,
+    responsible_user character varying(100) NOT NULL,
+    former_responsible_user character varying(100),
+    create_user character varying(100) NOT NULL,
+    create_date timestamp without time zone NOT NULL,
+    mod_user character varying(100),
+    mod_date timestamp without time zone
+);
+
+CREATE UNIQUE INDEX htbl_responsibility_territory_branch_user_transaction_id_unique
+   ON public.htbl_responsibility (fk_ref_grid_territory ASC, fk_ref_branch ASC, transaction_id ASC);
+
+ALTER TABLE public.htbl_responsibility
+  ADD CONSTRAINT fk_grid_territory FOREIGN KEY (fk_ref_grid_territory) REFERENCES public.ref_grid_territory (id)
+   ON UPDATE NO ACTION ON DELETE NO ACTION;
+
+ALTER TABLE public.htbl_responsibility
+  ADD CONSTRAINT fk_branch FOREIGN KEY (fk_ref_branch) REFERENCES public.ref_branch (id)
+   ON UPDATE NO ACTION ON DELETE NO ACTION;
+
+ALTER TABLE public.htbl_responsibility
+   OWNER TO btbservice;
\ No newline at end of file
diff --git a/db/db_dev_evolution/create_BTB_DB_0.1.4_Sprint7_OK298_insert_remaining_responsibilities.sql b/db/db_dev_evolution/create_BTB_DB_0.1.4_Sprint7_OK298_insert_remaining_responsibilities.sql
new file mode 100644
index 0000000..1b0c014
--- /dev/null
+++ b/db/db_dev_evolution/create_BTB_DB_0.1.4_Sprint7_OK298_insert_remaining_responsibilities.sql
@@ -0,0 +1,15 @@
+/* ********************************************************************************** */
+ -- Task: [OK-298] Insert additional responsibilities (already missing in matrix). 
+/* ********************************************************************************** */
+ 
+INSERT INTO public."tbl_responsibility" (fk_ref_grid_territory, fk_ref_branch, responsible_user, create_user, create_date) VALUES (3, 2, 'admin','admin',now());
+INSERT INTO public."tbl_responsibility" (fk_ref_grid_territory, fk_ref_branch, responsible_user, create_user, create_date) VALUES (3, 3, 'admin','admin',now());
+INSERT INTO public."tbl_responsibility" (fk_ref_grid_territory, fk_ref_branch, responsible_user, create_user, create_date) VALUES (3, 4, 'admin','admin',now());
+INSERT INTO public."tbl_responsibility" (fk_ref_grid_territory, fk_ref_branch, responsible_user, create_user, create_date) VALUES (4, 1, 'admin','admin',now());
+INSERT INTO public."tbl_responsibility" (fk_ref_grid_territory, fk_ref_branch, responsible_user, create_user, create_date) VALUES (4, 3, 'otto','admin',now());
+INSERT INTO public."tbl_responsibility" (fk_ref_grid_territory, fk_ref_branch, responsible_user, create_user, create_date) VALUES (4, 4, 'otto','admin',now());
+
+-- Add an index to the responsibility_forwarding column of the notification table
+-- The autocomplete function can be faster by searching the index instead of the String
+CREATE INDEX responsibility_forwarding_idx
+  ON public.tbl_notification(responsibility_forwarding);
diff --git a/db/db_dev_evolution/create_BTB_DB_0.1.4_Sprint7_OK351u353_create_index.sql b/db/db_dev_evolution/create_BTB_DB_0.1.4_Sprint7_OK351u353_create_index.sql
new file mode 100644
index 0000000..42288ce
--- /dev/null
+++ b/db/db_dev_evolution/create_BTB_DB_0.1.4_Sprint7_OK351u353_create_index.sql
@@ -0,0 +1,10 @@
+/* ********************************************************************************** */
+ -- Task: [OK-351/combined OK-353] create an index on columns create_date and mod_date
+ --       as these columns are relevant for fast search.
+/* ********************************************************************************** */
+
+CREATE INDEX create_date_idx
+  ON public.tbl_notification(create_date);
+  
+CREATE INDEX mod_date_idx
+  ON public.tbl_notification(mod_date);
diff --git a/db/db_dev_evolution/create_BTB_DB_1.0.0_Sprint9_SET_1.0.0.sql b/db/db_dev_evolution/create_BTB_DB_1.0.0_Sprint9_SET_1.0.0.sql
new file mode 100644
index 0000000..55e426c
--- /dev/null
+++ b/db/db_dev_evolution/create_BTB_DB_1.0.0_Sprint9_SET_1.0.0.sql
@@ -0,0 +1 @@
+UPDATE public.ref_version set version='1.0.0' WHERE id = 1;
diff --git a/db/db_dev_evolution/test_data.sql b/db/db_dev_evolution/test_data.sql
new file mode 100644
index 0000000..6882886
--- /dev/null
+++ b/db/db_dev_evolution/test_data.sql
@@ -0,0 +1,38 @@
+-- Hier können weitere/alle benötigte Testdaten eingefügt werden. 
+
+-- Testdata for tbl_notification
+
+Insert into TBL_NOTIFICATION ("id","incident_id","version","fk_ref_branch","notification_text","free_text","free_text_extended","fk_ref_notification_status","responsibility_forwarding","reminder_date","expected_finished_date","responsibility_control_point","finished_date","create_user","create_date","mod_user","mod_date","begin_date") values (14,5,2,1,'Meldung X:Y','','extended',2,'',null,null,'Abteilung 4',null,'MasterAndCreator',to_timestamp('2017-03-09 15:27:17.0','YYYY-MM-DD HH24:MI:SS.US'),'_fd',to_timestamp('2017-03-09 15:27:17.0','YYYY-MM-DD HH24:MI:SS.US'),to_timestamp('2017-03-09 15:27:17.0','YYYY-MM-DD HH24:MI:SS.US'));
+Insert into TBL_NOTIFICATION ("id","incident_id","version","fk_ref_branch","notification_text","free_text","free_text_extended","fk_ref_notification_status","responsibility_forwarding","reminder_date","expected_finished_date","responsibility_control_point","finished_date","create_user","create_date","mod_user","mod_date","begin_date") values (15,6,1,1,'Meldung X:Y','','extended',2,'',null,null,'Abteilung 4',null,'MasterAndCreator',to_timestamp('2017-03-09 15:27:17.0','YYYY-MM-DD HH24:MI:SS.US'),'_fd',to_timestamp('2017-03-09 15:27:17.0','YYYY-MM-DD HH24:MI:SS.US'),to_timestamp('2017-03-09 15:27:17.0','YYYY-MM-DD HH24:MI:SS.US'));
+Insert into TBL_NOTIFICATION ("id","incident_id","version","fk_ref_branch","notification_text","free_text","free_text_extended","fk_ref_notification_status","responsibility_forwarding","reminder_date","expected_finished_date","responsibility_control_point","finished_date","create_user","create_date","mod_user","mod_date","begin_date") values (16,7,1,1,'Meldung X:Y','','extended',2,'',null,null,'Abteilung 4',null,'MasterAndCreator',to_timestamp('2017-03-09 15:27:17.0','YYYY-MM-DD HH24:MI:SS.US'),'_fd',to_timestamp('2017-03-09 15:27:17.0','YYYY-MM-DD HH24:MI:SS.US'),to_timestamp('2017-03-09 15:27:17.0','YYYY-MM-DD HH24:MI:SS.US'));
+Insert into TBL_NOTIFICATION ("id","incident_id","version","fk_ref_branch","notification_text","free_text","free_text_extended","fk_ref_notification_status","responsibility_forwarding","reminder_date","expected_finished_date","responsibility_control_point","finished_date","create_user","create_date","mod_user","mod_date","begin_date") values (17,8,1,1,'Meldung X:Y','','extended',2,'',null,null,'Abteilung 4',null,'MasterAndCreator',to_timestamp('2017-03-09 15:27:17.0','YYYY-MM-DD HH24:MI:SS.US'),'_fd',to_timestamp('2017-03-09 15:27:17.0','YYYY-MM-DD HH24:MI:SS.US'),to_timestamp('2017-03-09 15:27:17.0','YYYY-MM-DD HH24:MI:SS.US'));
+Insert into TBL_NOTIFICATION ("id","incident_id","version","fk_ref_branch","notification_text","free_text","free_text_extended","fk_ref_notification_status","responsibility_forwarding","reminder_date","expected_finished_date","responsibility_control_point","finished_date","create_user","create_date","mod_user","mod_date","begin_date") values (21,12,1,3,'fasdf','sadfsdf','sdfsdf',4,'sdfds',to_timestamp('2017-05-23 22:00:00.0','YYYY-MM-DD HH24:MI:SS.US'),to_timestamp('2017-05-15 22:00:00.0','YYYY-MM-DD HH24:MI:SS.US'),'sdfds',to_timestamp('2017-05-22 22:00:00.0','YYYY-MM-DD HH24:MI:SS.US'),'Administrator',LOCALTIMESTAMP,null,null,LOCALTIMESTAMP );
+Insert into TBL_NOTIFICATION ("id","incident_id","version","fk_ref_branch","notification_text","free_text","free_text_extended","fk_ref_notification_status","responsibility_forwarding","reminder_date","expected_finished_date","responsibility_control_point","finished_date","create_user","create_date","mod_user","mod_date","begin_date") values (22,13,1,2,'sdfsadf','sdfsda','sdafsd',3,'sdfsd',null,null,'sdfsd',null,'Administrator',LOCALTIMESTAMP,null,null,LOCALTIMESTAMP );
+Insert into TBL_NOTIFICATION ("id","incident_id","version","fk_ref_branch","notification_text","free_text","free_text_extended","fk_ref_notification_status","responsibility_forwarding","reminder_date","expected_finished_date","responsibility_control_point","finished_date","create_user","create_date","mod_user","mod_date","begin_date") values (23,14,1,1,'dsfsdaf','sdafsdf','fdgsdfg',2,'sadfdsf',null,null,'sdfsdf',null,'Administrator',LOCALTIMESTAMP,null,null,LOCALTIMESTAMP );
+Insert into TBL_NOTIFICATION ("id","incident_id","version","fk_ref_branch","notification_text","free_text","free_text_extended","fk_ref_notification_status","responsibility_forwarding","reminder_date","expected_finished_date","responsibility_control_point","finished_date","create_user","create_date","mod_user","mod_date","begin_date") values (11,2,0,1,'sfg','freetext11','freetext_extended',1,null,null,null,null,null,'Creator',LOCALTIMESTAMP,null,null,LOCALTIMESTAMP );
+Insert into TBL_NOTIFICATION ("id","incident_id","version","fk_ref_branch","notification_text","free_text","free_text_extended","fk_ref_notification_status","responsibility_forwarding","reminder_date","expected_finished_date","responsibility_control_point","finished_date","create_user","create_date","mod_user","mod_date","begin_date") values (27,18,1,1,'Meldung X:Y','','extended',2,'',null,null,'Abteilung 4',null,'MasterAndCreator',to_timestamp('2017-03-09 15:27:17.0','YYYY-MM-DD HH24:MI:SS.US'),'_fd',to_timestamp('2017-03-09 15:27:17.0','YYYY-MM-DD HH24:MI:SS.US'),to_timestamp('2017-03-09 15:27:17.0','YYYY-MM-DD HH24:MI:SS.US'));
+Insert into TBL_NOTIFICATION ("id","incident_id","version","fk_ref_branch","notification_text","free_text","free_text_extended","fk_ref_notification_status","responsibility_forwarding","reminder_date","expected_finished_date","responsibility_control_point","finished_date","create_user","create_date","mod_user","mod_date","begin_date") values (33,100,3,1,'Text 100 3',null,null,1,null,null,null,null,null,'Administrator',to_timestamp('2017-05-11 15:54:12.467632','YYYY-MM-DD HH24:MI:SS.US'),null,null,to_timestamp('2017-05-11 15:54:12.467632','YYYY-MM-DD HH24:MI:SS.US'));
+Insert into TBL_NOTIFICATION ("id","incident_id","version","fk_ref_branch","notification_text","free_text","free_text_extended","fk_ref_notification_status","responsibility_forwarding","reminder_date","expected_finished_date","responsibility_control_point","finished_date","create_user","create_date","mod_user","mod_date","begin_date") values (36,101,3,1,'Text 101 3',null,null,1,null,null,null,null,null,'Administrator',to_timestamp('2017-05-11 15:54:47.84887','YYYY-MM-DD HH24:MI:SS.US'),null,null,to_timestamp('2017-05-11 15:54:47.84887','YYYY-MM-DD HH24:MI:SS.US'));
+Insert into TBL_NOTIFICATION ("id","incident_id","version","fk_ref_branch","notification_text","free_text","free_text_extended","fk_ref_notification_status","responsibility_forwarding","reminder_date","expected_finished_date","responsibility_control_point","finished_date","create_user","create_date","mod_user","mod_date","begin_date") values (30,100,1,1,'Text 100 1',null,null,1,null,null,null,null,null,'Administrator',to_timestamp('2017-05-11 15:53:29.925035','YYYY-MM-DD HH24:MI:SS.US'),null,null,to_timestamp('2017-05-11 15:53:29.925035','YYYY-MM-DD HH24:MI:SS.US'));
+Insert into TBL_NOTIFICATION ("id","incident_id","version","fk_ref_branch","notification_text","free_text","free_text_extended","fk_ref_notification_status","responsibility_forwarding","reminder_date","expected_finished_date","responsibility_control_point","finished_date","create_user","create_date","mod_user","mod_date","begin_date") values (32,100,2,1,'Text 100 2',null,null,1,null,null,null,null,null,'Administrator',to_timestamp('2017-05-11 15:54:04.506725','YYYY-MM-DD HH24:MI:SS.US'),null,null,to_timestamp('2017-05-11 15:54:04.506725','YYYY-MM-DD HH24:MI:SS.US'));
+Insert into TBL_NOTIFICATION ("id","incident_id","version","fk_ref_branch","notification_text","free_text","free_text_extended","fk_ref_notification_status","responsibility_forwarding","reminder_date","expected_finished_date","responsibility_control_point","finished_date","create_user","create_date","mod_user","mod_date","begin_date") values (35,101,2,1,'Text 101 2',null,null,1,null,null,null,null,null,'Administrator',to_timestamp('2017-05-11 15:54:47.84887','YYYY-MM-DD HH24:MI:SS.US'),null,null,to_timestamp('2017-05-11 15:54:47.84887','YYYY-MM-DD HH24:MI:SS.US'));
+Insert into TBL_NOTIFICATION ("id","incident_id","version","fk_ref_branch","notification_text","free_text","free_text_extended","fk_ref_notification_status","responsibility_forwarding","reminder_date","expected_finished_date","responsibility_control_point","finished_date","create_user","create_date","mod_user","mod_date","begin_date") values (34,101,1,1,'Text 101 1',null,null,1,null,null,null,null,null,'Administrator',to_timestamp('2017-05-11 15:54:47.84887','YYYY-MM-DD HH24:MI:SS.US'),null,null,to_timestamp('2017-05-11 15:54:47.84887','YYYY-MM-DD HH24:MI:SS.US'));
+Insert into TBL_NOTIFICATION ("id","incident_id","version","fk_ref_branch","notification_text","free_text","free_text_extended","fk_ref_notification_status","responsibility_forwarding","reminder_date","expected_finished_date","responsibility_control_point","finished_date","create_user","create_date","mod_user","mod_date","begin_date") values (37,19,1,1,'Meldung _fd 1, 2, 3','Freitext zur Meldung 1,23','',1,'Hermann Meister',to_timestamp('2017-05-10 22:00:00.0','YYYY-MM-DD HH24:MI:SS.US'),to_timestamp('2017-05-18 22:00:00.0','YYYY-MM-DD HH24:MI:SS.US'),'Frank D.',null,'Administrator',LOCALTIMESTAMP,null,null,LOCALTIMESTAMP );
+Insert into TBL_NOTIFICATION ("id","incident_id","version","fk_ref_branch","notification_text","free_text","free_text_extended","fk_ref_notification_status","responsibility_forwarding","reminder_date","expected_finished_date","responsibility_control_point","finished_date","create_user","create_date","mod_user","mod_date","begin_date") values (38,20,1,2,'test^1','test2','test3',2,'avb',to_timestamp('2017-05-23 22:00:00.0','YYYY-MM-DD HH24:MI:SS.US'),to_timestamp('2017-05-17 22:00:00.0','YYYY-MM-DD HH24:MI:SS.US'),'sdfd',to_timestamp('2017-05-15 22:00:00.0','YYYY-MM-DD HH24:MI:SS.US'),'Administrator',LOCALTIMESTAMP,null,null,LOCALTIMESTAMP );
+Insert into TBL_NOTIFICATION ("id","incident_id","version","fk_ref_branch","notification_text","free_text","free_text_extended","fk_ref_notification_status","responsibility_forwarding","reminder_date","expected_finished_date","responsibility_control_point","finished_date","create_user","create_date","mod_user","mod_date","begin_date") values (41,23,1,2,'test','tasdf','asdfsd',2,null,null,null,null,null,'Administrator',LOCALTIMESTAMP,null,null,LOCALTIMESTAMP );
+Insert into TBL_NOTIFICATION ("id","incident_id","version","fk_ref_branch","notification_text","free_text","free_text_extended","fk_ref_notification_status","responsibility_forwarding","reminder_date","expected_finished_date","responsibility_control_point","finished_date","create_user","create_date","mod_user","mod_date","begin_date") values (42,24,1,3,'teste','teste','teset',2,'asdf',to_timestamp('2017-05-24 22:00:00.0','YYYY-MM-DD HH24:MI:SS.US'),to_timestamp('2017-05-14 22:00:00.0','YYYY-MM-DD HH24:MI:SS.US'),'asdf',to_timestamp('2017-05-16 22:00:00.0','YYYY-MM-DD HH24:MI:SS.US'),'Administrator',LOCALTIMESTAMP,null,null,LOCALTIMESTAMP );
+Insert into TBL_NOTIFICATION ("id","incident_id","version","fk_ref_branch","notification_text","free_text","free_text_extended","fk_ref_notification_status","responsibility_forwarding","reminder_date","expected_finished_date","responsibility_control_point","finished_date","create_user","create_date","mod_user","mod_date","begin_date") values (43,25,1,1,'Text','FT','wFT',1,'Schulzendorff',null,null,null,null,'Otto Normalverbraucher',LOCALTIMESTAMP,null,null,LOCALTIMESTAMP );
+Insert into TBL_NOTIFICATION ("id","incident_id","version","fk_ref_branch","notification_text","free_text","free_text_extended","fk_ref_notification_status","responsibility_forwarding","reminder_date","expected_finished_date","responsibility_control_point","finished_date","create_user","create_date","mod_user","mod_date","begin_date") values (45,27,1,1,'nochne Meldung','t','ft',1,'Schulzendorff',null,null,null,null,'Otto Normalverbraucher',LOCALTIMESTAMP,null,null,LOCALTIMESTAMP );
+Insert into TBL_NOTIFICATION ("id","incident_id","version","fk_ref_branch","notification_text","free_text","free_text_extended","fk_ref_notification_status","responsibility_forwarding","reminder_date","expected_finished_date","responsibility_control_point","finished_date","create_user","create_date","mod_user","mod_date","begin_date") values (46,28,1,3,'asdfds','sdafsdf','sdafdsf',3,'sdf',to_timestamp('2017-05-22 22:00:00.0','YYYY-MM-DD HH24:MI:SS.US'),to_timestamp('2017-05-30 22:00:00.0','YYYY-MM-DD HH24:MI:SS.US'),'sdf',to_timestamp('2017-05-16 22:00:00.0','YYYY-MM-DD HH24:MI:SS.US'),'Administrator',LOCALTIMESTAMP,null,null,LOCALTIMESTAMP );
+Insert into TBL_NOTIFICATION ("id","incident_id","version","fk_ref_branch","notification_text","free_text","free_text_extended","fk_ref_notification_status","responsibility_forwarding","reminder_date","expected_finished_date","responsibility_control_point","finished_date","create_user","create_date","mod_user","mod_date","begin_date") values (47,29,1,3,'dsfdas','sdfdasf','asdfsdfas',2,'asdfas',to_timestamp('2017-05-22 22:00:00.0','YYYY-MM-DD HH24:MI:SS.US'),to_timestamp('2017-05-23 22:00:00.0','YYYY-MM-DD HH24:MI:SS.US'),'dsfds',to_timestamp('2017-05-23 22:00:00.0','YYYY-MM-DD HH24:MI:SS.US'),'Administrator',LOCALTIMESTAMP,null,null,LOCALTIMESTAMP );
+Insert into TBL_NOTIFICATION ("id","incident_id","version","fk_ref_branch","notification_text","free_text","free_text_extended","fk_ref_notification_status","responsibility_forwarding","reminder_date","expected_finished_date","responsibility_control_point","finished_date","create_user","create_date","mod_user","mod_date","begin_date") values (48,30,1,1,'neu',null,null,1,'GS',null,null,null,null,'Otto Normalverbraucher',LOCALTIMESTAMP,null,null,LOCALTIMESTAMP );
+Insert into TBL_NOTIFICATION ("id","incident_id","version","fk_ref_branch","notification_text","free_text","free_text_extended","fk_ref_notification_status","responsibility_forwarding","reminder_date","expected_finished_date","responsibility_control_point","finished_date","create_user","create_date","mod_user","mod_date","begin_date") values (49,31,2,1,'neu',null,null,1,'GS',null,null,null,null,'Otto Normalverbraucher',LOCALTIMESTAMP,null,null,LOCALTIMESTAMP );
+Insert into TBL_NOTIFICATION ("id","incident_id","version","fk_ref_branch","notification_text","free_text","free_text_extended","fk_ref_notification_status","responsibility_forwarding","reminder_date","expected_finished_date","responsibility_control_point","finished_date","create_user","create_date","mod_user","mod_date","begin_date") values (50,32,3,1,'neu und 2mal update',null,null,1,'GS',null,null,null,null,'Otto Normalverbraucher',LOCALTIMESTAMP,null,null,LOCALTIMESTAMP );
+Insert into TBL_NOTIFICATION ("id","incident_id","version","fk_ref_branch","notification_text","free_text","free_text_extended","fk_ref_notification_status","responsibility_forwarding","reminder_date","expected_finished_date","responsibility_control_point","finished_date","create_user","create_date","mod_user","mod_date","begin_date") values (51,33,1,1,'admin','admin','�lja�ldfkj',1,null,to_timestamp('2017-05-09 22:00:00.0','YYYY-MM-DD HH24:MI:SS.US'),null,null,to_timestamp('2017-05-09 22:00:00.0','YYYY-MM-DD HH24:MI:SS.US'),'Administrator',LOCALTIMESTAMP,null,null,LOCALTIMESTAMP );
+Insert into TBL_NOTIFICATION ("id","incident_id","version","fk_ref_branch","notification_text","free_text","free_text_extended","fk_ref_notification_status","responsibility_forwarding","reminder_date","expected_finished_date","responsibility_control_point","finished_date","create_user","create_date","mod_user","mod_date","begin_date") values (52,34,1,2,'adfaf','adfaf','adfaf',1,'adfaf',null,null,null,null,'Administrator',LOCALTIMESTAMP,null,null,LOCALTIMESTAMP );
+Insert into TBL_NOTIFICATION ("id","incident_id","version","fk_ref_branch","notification_text","free_text","free_text_extended","fk_ref_notification_status","responsibility_forwarding","reminder_date","expected_finished_date","responsibility_control_point","finished_date","create_user","create_date","mod_user","mod_date","begin_date") values (53,35,4,1,'neu und 3mal update',null,null,1,'GS',null,null,null,null,'Otto Normalverbraucher',LOCALTIMESTAMP,null,null,LOCALTIMESTAMP );
+Insert into TBL_NOTIFICATION ("id","incident_id","version","fk_ref_branch","notification_text","free_text","free_text_extended","fk_ref_notification_status","responsibility_forwarding","reminder_date","expected_finished_date","responsibility_control_point","finished_date","create_user","create_date","mod_user","mod_date","begin_date") values (55,35,5,1,'neu und 4mal update',null,null,1,'GS',null,null,null,null,'Otto Normalverbraucher',LOCALTIMESTAMP,null,null,LOCALTIMESTAMP );
+Insert into TBL_NOTIFICATION ("id","incident_id","version","fk_ref_branch","notification_text","free_text","free_text_extended","fk_ref_notification_status","responsibility_forwarding","reminder_date","expected_finished_date","responsibility_control_point","finished_date","create_user","create_date","mod_user","mod_date","begin_date") values (56,35,7,1,'pk_id 55 neue Version ',null,null,1,'GS',null,null,null,null,'Otto Normalverbraucher',LOCALTIMESTAMP,null,null,LOCALTIMESTAMP );
+Insert into TBL_NOTIFICATION ("id","incident_id","version","fk_ref_branch","notification_text","free_text","free_text_extended","fk_ref_notification_status","responsibility_forwarding","reminder_date","expected_finished_date","responsibility_control_point","finished_date","create_user","create_date","mod_user","mod_date","begin_date") values (57,20,2,2,'test^1 update versuch. Die Indident ID soll auf 20 bleiben. Die Version muss 2 sein.','test2','test3',2,'avb',to_timestamp('2017-05-23 22:00:00.0','YYYY-MM-DD HH24:MI:SS.US'),to_timestamp('2017-05-17 22:00:00.0','YYYY-MM-DD HH24:MI:SS.US'),'sdfd',to_timestamp('2017-05-15 22:00:00.0','YYYY-MM-DD HH24:MI:SS.US'),'Administrator',LOCALTIMESTAMP,null,null,LOCALTIMESTAMP );
+Insert into TBL_NOTIFICATION ("id","incident_id","version","fk_ref_branch","notification_text","free_text","free_text_extended","fk_ref_notification_status","responsibility_forwarding","reminder_date","expected_finished_date","responsibility_control_point","finished_date","create_user","create_date","mod_user","mod_date","begin_date") values (58,36,1,3,'fasdfasdf','asdfdasf','sadfdasf',3,'sdfdas',to_timestamp('2017-05-10 22:00:00.0','YYYY-MM-DD HH24:MI:SS.US'),to_timestamp('2017-05-16 22:00:00.0','YYYY-MM-DD HH24:MI:SS.US'),'dsfdas',to_timestamp('2017-05-08 22:00:00.0','YYYY-MM-DD HH24:MI:SS.US'),'Administrator',LOCALTIMESTAMP,null,null,LOCALTIMESTAMP );
+Insert into TBL_NOTIFICATION ("id","incident_id","version","fk_ref_branch","notification_text","free_text","free_text_extended","fk_ref_notification_status","responsibility_forwarding","reminder_date","expected_finished_date","responsibility_control_point","finished_date","create_user","create_date","mod_user","mod_date","begin_date") values (59,37,1,3,'sadfasdf','sdafasdf','asdfasdf',1,'asdfasdf',to_timestamp('2017-05-23 22:00:00.0','YYYY-MM-DD HH24:MI:SS.US'),to_timestamp('2017-05-23 22:00:00.0','YYYY-MM-DD HH24:MI:SS.US'),'asdfdasf',to_timestamp('2017-05-29 22:00:00.0','YYYY-MM-DD HH24:MI:SS.US'),'Administrator',LOCALTIMESTAMP,null,null,LOCALTIMESTAMP );
diff --git a/db/postgreSQL/01_add_DB.sql b/db/postgreSQL/01_add_DB.sql
new file mode 100644
index 0000000..641e684
--- /dev/null
+++ b/db/postgreSQL/01_add_DB.sql
@@ -0,0 +1,17 @@
+-- DROP DATABASE betriebstagebuch;
+
+CREATE DATABASE betriebstagebuch
+    WITH
+    OWNER = postgres
+    ENCODING = 'UTF8'
+    LC_COLLATE = 'German_Germany.1252'
+    LC_CTYPE = 'German_Germany.1252'
+    TABLESPACE = pg_default
+    CONNECTION LIMIT = -1;
+
+-- Role: btbservice
+
+-- DROP ROLE btbservice;
+CREATE ROLE btbservice LOGIN
+  ENCRYPTED PASSWORD 'md5014d35e4f8632560130b265acb21413f'
+  NOSUPERUSER INHERIT NOCREATEDB NOCREATEROLE NOREPLICATION;
diff --git a/db/postgreSQL/01a_drop_DB_1.0.0.sql b/db/postgreSQL/01a_drop_DB_1.0.0.sql
new file mode 100644
index 0000000..9ad583e
--- /dev/null
+++ b/db/postgreSQL/01a_drop_DB_1.0.0.sql
@@ -0,0 +1,19 @@
+drop table public.REF_BRANCH cascade;
+drop table public.REF_GRID_TERRITORY cascade;
+drop table public.REF_NOTIFICATION_STATUS cascade;
+drop table public.TBL_NOTIFICATION cascade;
+drop FUNCTION public.TBL_NOTIFICATION_INCIDENT_TRG();
+drop table public.TBL_RESPONSIBILITY cascade;
+drop table public.HTBL_RESPONSIBILITY cascade;
+drop view public.VIEW_ACTIVE_NOTIFICATION cascade;
+drop table public.REF_VERSION cascade;
+
+DROP SEQUENCE public.HTBL_RESPONSIBILITY_ID_SEQ;
+DROP SEQUENCE public.REF_BRANCH_ID_SEQ;
+DROP SEQUENCE public.REF_GRID_TERRITORY_ID_SEQ;
+DROP SEQUENCE public.REF_NOTIFICATION_STATUS_ID_SEQ;
+DROP SEQUENCE public.TBL_NOTIFICATION_ID_SEQ;
+DROP SEQUENCE public.TBL_NOTIFICATION_INCIDENT_ID_SEQ;
+DROP SEQUENCE public.TBL_RESPONSIBILITY_ID_SEQ;
+
+
diff --git a/db/postgreSQL/02_create_DB_1.0.0.sql b/db/postgreSQL/02_create_DB_1.0.0.sql
new file mode 100644
index 0000000..fa39c43
--- /dev/null
+++ b/db/postgreSQL/02_create_DB_1.0.0.sql
@@ -0,0 +1,413 @@
+
+
+
+
+
+CREATE SEQUENCE public.HTBL_RESPONSIBILITY_ID_SEQ
+  INCREMENT 1
+  MINVALUE 1
+  MAXVALUE 9223372036854775807
+  START 354
+  CACHE 1;
+ALTER TABLE public.HTBL_RESPONSIBILITY_ID_SEQ
+  OWNER TO btbservice;
+
+
+CREATE SEQUENCE public.REF_BRANCH_ID_SEQ
+  INCREMENT 1
+  MINVALUE 1
+  MAXVALUE 9223372036854775807
+  START 5
+  CACHE 1;
+ALTER TABLE public.REF_BRANCH_ID_SEQ
+  OWNER TO btbservice;
+
+CREATE SEQUENCE public.REF_GRID_TERRITORY_ID_SEQ
+  INCREMENT 1
+  MINVALUE 1
+  MAXVALUE 9223372036854775807
+  START 2
+  CACHE 1;
+ALTER TABLE public.REF_GRID_TERRITORY_ID_SEQ
+  OWNER TO btbservice;
+
+CREATE SEQUENCE public.REF_NOTIFICATION_STATUS_ID_SEQ
+  INCREMENT 1
+  MINVALUE 1
+  MAXVALUE 9223372036854775807
+  START 5
+  CACHE 1;
+ALTER TABLE public.REF_NOTIFICATION_STATUS_ID_SEQ
+  OWNER TO btbservice;
+
+CREATE SEQUENCE public.TBL_NOTIFICATION_ID_SEQ
+  INCREMENT 1
+  MINVALUE 1
+  MAXVALUE 9223372036854775807
+  START 1395
+  CACHE 1;
+ALTER TABLE public.TBL_NOTIFICATION_ID_SEQ
+  OWNER TO btbservice;
+
+CREATE SEQUENCE public.TBL_NOTIFICATION_INCIDENT_ID_SEQ
+  INCREMENT 1
+  MINVALUE 1
+  MAXVALUE 9223372036854775807
+  START 81
+  CACHE 1;
+ALTER TABLE public.TBL_NOTIFICATION_INCIDENT_ID_SEQ
+  OWNER TO btbservice;
+
+CREATE SEQUENCE public.TBL_RESPONSIBILITY_ID_SEQ
+  INCREMENT 1
+  MINVALUE 1
+  MAXVALUE 9223372036854775807
+  START 21
+  CACHE 1;
+ALTER TABLE public.TBL_RESPONSIBILITY_ID_SEQ
+  OWNER TO btbservice;
+
+
+CREATE TABLE public.REF_BRANCH
+(
+  id integer NOT NULL DEFAULT nextval('ref_branch_id_seq'::regclass),
+  name character varying(50) NOT NULL,
+  description character varying(255),
+  CONSTRAINT REF_BRANCH_PKEY PRIMARY KEY (id)
+)
+WITH (
+  OIDS=FALSE
+);
+ALTER TABLE public.REF_BRANCH
+  OWNER TO btbservice;
+GRANT ALL ON TABLE public.REF_BRANCH TO btbservice;
+
+
+CREATE TABLE public.REF_GRID_TERRITORY
+(
+  id integer NOT NULL DEFAULT nextval('ref_grid_territory_id_seq'::regclass),
+  name character varying(50) NOT NULL,
+  description character varying(255),
+  fk_ref_master integer NOT NULL,
+  CONSTRAINT REF_GRID_TERRITORY_PKEY PRIMARY KEY (id),
+  CONSTRAINT FK_REF_GRID_TERRITORY_SELF FOREIGN KEY (fk_ref_master)
+      REFERENCES public.REF_GRID_TERRITORY (id) MATCH SIMPLE
+      ON UPDATE NO ACTION ON DELETE CASCADE
+)
+WITH (
+  OIDS=FALSE
+);
+ALTER TABLE public.REF_GRID_TERRITORY
+  OWNER TO btbservice;
+GRANT ALL ON TABLE public.REF_GRID_TERRITORY TO btbservice;
+
+-- Index: public.fki_fk_grid_territory_self
+
+-- DROP INDEX public.fki_fk_grid_territory_self;
+
+CREATE INDEX FKI_FK_GRID_TERRITORY_SELF
+  ON public.REF_GRID_TERRITORY
+  USING btree
+  (fk_ref_master);
+
+-- Index: public.ref_grid_territory_description_unique
+
+-- DROP INDEX public.ref_grid_territory_description_unique;
+
+CREATE UNIQUE INDEX REF_GRID_TERRITORY_DESCRIPTION_UNIQUE
+  ON public.REF_GRID_TERRITORY
+  USING btree
+  (description COLLATE pg_catalog."default");
+
+
+CREATE TABLE public.REF_NOTIFICATION_STATUS
+(
+  id integer NOT NULL DEFAULT nextval('ref_notification_status_id_seq'::regclass),
+  name character varying(50) NOT NULL,
+  CONSTRAINT REF_NOTIFICATION_STATUS_PKEY PRIMARY KEY (id)
+)
+WITH (
+  OIDS=FALSE
+);
+ALTER TABLE public.REF_NOTIFICATION_STATUS
+  OWNER TO btbservice;
+GRANT ALL ON TABLE public.REF_NOTIFICATION_STATUS TO btbservice;
+
+
+CREATE TABLE public.REF_VERSION
+(
+  id integer NOT NULL,
+  version character varying(100) NOT NULL,
+  CONSTRAINT ref_version_pkey PRIMARY KEY (id)
+)
+WITH (
+  OIDS=FALSE
+);
+ALTER TABLE public.REF_VERSION
+  OWNER TO btbservice;
+GRANT ALL ON TABLE public.REF_VERSION TO btbservice;
+
+
+CREATE TABLE public.TBL_NOTIFICATION
+(
+  id integer NOT NULL DEFAULT nextval('tbl_notification_id_seq'::regclass),
+  incident_id integer DEFAULT nextval('tbl_notification_incident_id_seq'::regclass),
+  version integer NOT NULL DEFAULT 0,
+  fk_ref_branch integer,
+  notification_text character varying(200) NOT NULL,
+  free_text character varying(1000),
+  free_text_extended character varying(1000),
+  fk_ref_notification_status integer NOT NULL,
+  responsibility_forwarding character varying(100),
+  reminder_date timestamp without time zone,
+  expected_finished_date timestamp without time zone,
+  responsibility_control_point character varying(100),
+  begin_date timestamp without time zone NOT NULL,
+  finished_date timestamp without time zone,
+  create_user character varying(100) NOT NULL,
+  create_date timestamp without time zone NOT NULL,
+  mod_user character varying(100),
+  mod_date timestamp without time zone,
+  fk_ref_grid_territory integer,
+  admin_flag boolean NOT NULL DEFAULT false,
+  CONSTRAINT TBL_NOTIFICATION_PKEY PRIMARY KEY (id),
+  CONSTRAINT FK_NOTIFICATION_FK_BRANCH FOREIGN KEY (fk_ref_branch)
+      REFERENCES public.REF_BRANCH (id) MATCH SIMPLE
+      ON UPDATE NO ACTION ON DELETE NO ACTION,
+  CONSTRAINT FK_NOTIFICATION_FK_GRID_TERRITORY FOREIGN KEY (fk_ref_grid_territory)
+      REFERENCES public.REF_GRID_TERRITORY (id) MATCH SIMPLE
+      ON UPDATE NO ACTION ON DELETE CASCADE,
+  CONSTRAINT FK_NOTIFICATION_FK_STATUS FOREIGN KEY (fk_ref_notification_status)
+      REFERENCES public.REF_NOTIFICATION_STATUS (id) MATCH SIMPLE
+      ON UPDATE NO ACTION ON DELETE NO ACTION
+)
+WITH (
+  OIDS=FALSE
+);
+ALTER TABLE public.TBL_NOTIFICATION
+  OWNER TO btbservice;
+GRANT ALL ON TABLE public.TBL_NOTIFICATION TO btbservice;
+
+-- Index: public.create_date_idx
+
+-- DROP INDEX public.create_date_idx;
+
+CREATE INDEX CREATE_DATE_IDX
+  ON public.TBL_NOTIFICATION
+  USING btree
+  (create_date);
+
+-- Index: public.fki_notification_fk_branch
+
+-- DROP INDEX public.fki_notification_fk_branch;
+
+CREATE INDEX FKI_NOTIFICATION_FK_BRANCH
+  ON public.TBL_NOTIFICATION
+  USING btree
+  (fk_ref_branch);
+
+-- Index: public.fki_notification_fk_grid_territory
+
+-- DROP INDEX public.fki_notification_fk_grid_territory;
+
+CREATE INDEX FKI_NOTIFICATION_FK_GRID_TERRITORY
+  ON public.TBL_NOTIFICATION
+  USING btree
+  (fk_ref_grid_territory);
+
+-- Index: public.fki_notification_fk_status
+
+-- DROP INDEX public.fki_notification_fk_status;
+
+CREATE INDEX FKI_NOTIFICATION_FK_STATUS
+  ON public.TBL_NOTIFICATION
+  USING btree
+  (fk_ref_notification_status);
+
+-- Index: public.mod_date_idx
+
+-- DROP INDEX public.mod_date_idx;
+
+CREATE INDEX MOD_DATE_IDX
+  ON public.TBL_NOTIFICATION
+  USING btree
+  (mod_date);
+
+-- Index: public.responsibility_forwarding_idx
+
+-- DROP INDEX public.responsibility_forwarding_idx;
+
+CREATE INDEX RESPONSIBILITY_FORWARDING_IDX
+  ON public.TBL_NOTIFICATION
+  USING btree
+  (responsibility_forwarding COLLATE pg_catalog."default");
+
+-- Index: public.tbl_notification_incident_version_unique
+
+-- DROP INDEX public.tbl_notification_incident_version_unique;
+
+CREATE UNIQUE INDEX TBL_NOTIFICATION_INCIDENT_VERSION_UNIQUE
+  ON public.tbl_notification
+  USING btree
+  (incident_id, version);
+
+  
+CREATE OR REPLACE FUNCTION public.TBL_NOTIFICATION_INCIDENT_TRG()
+  RETURNS trigger AS
+$BODY$
+    BEGIN
+
+        IF NEW.incident_id IS NULL THEN
+            NEW.incident_id := NEW.id;
+        END IF;
+
+        RETURN NEW;
+    END;
+$BODY$
+  LANGUAGE plpgsql VOLATILE
+  COST 100;
+ALTER FUNCTION public.TBL_NOTIFICATION_INCIDENT_TRG()
+  OWNER TO btbservice;
+  
+
+-- Trigger: tbl_notification_incident_trg on public.tbl_notification
+
+-- DROP TRIGGER tbl_notification_incident_trg ON public.tbl_notification;
+
+CREATE TRIGGER TBL_NOTIFICATION_INCIDENT_TRG
+  BEFORE INSERT
+  ON public.tbl_notification
+  FOR EACH ROW
+  EXECUTE PROCEDURE public.TBL_NOTIFICATION_INCIDENT_TRG();
+
+
+CREATE TABLE public.TBL_RESPONSIBILITY
+(
+  id integer NOT NULL DEFAULT nextval('tbl_responsibility_id_seq'::regclass),
+  fk_ref_grid_territory integer NOT NULL,
+  fk_ref_branch integer NOT NULL,
+  responsible_user character varying(100) NOT NULL,
+  new_responsible_user character varying(100),
+  create_user character varying(100) NOT NULL,
+  create_date timestamp without time zone NOT NULL,
+  mod_user character varying(100),
+  mod_date timestamp without time zone,
+  CONSTRAINT TBL_RESPONSIBILITY_PKEY PRIMARY KEY (id),
+  CONSTRAINT FK_BRANCH FOREIGN KEY (fk_ref_branch)
+      REFERENCES public.REF_BRANCH (id) MATCH SIMPLE
+      ON UPDATE NO ACTION ON DELETE NO ACTION,
+  CONSTRAINT FK_GRID_TERRITORY FOREIGN KEY (fk_ref_grid_territory)
+      REFERENCES public.REF_GRID_TERRITORY (id) MATCH SIMPLE
+      ON UPDATE NO ACTION ON DELETE NO ACTION
+)
+WITH (
+  OIDS=FALSE
+);
+ALTER TABLE public.TBL_RESPONSIBILITY
+  OWNER TO btbservice;
+GRANT ALL ON TABLE public.TBL_RESPONSIBILITY TO btbservice;
+
+-- Index: public.tbl_responsibility_territory_branch_user_unique
+
+-- DROP INDEX public.tbl_responsibility_territory_branch_user_unique;
+
+CREATE UNIQUE INDEX TBL_RESPONSIBILITY_TERRITORY_BRANCH_USER_UNIQUE
+  ON public.TBL_RESPONSIBILITY
+  USING btree
+  (fk_ref_grid_territory, fk_ref_branch);
+
+
+CREATE TABLE public.HTBL_RESPONSIBILITY
+(
+  id integer NOT NULL DEFAULT nextval('htbl_responsibility_id_seq'::regclass),
+  fk_ref_grid_territory integer NOT NULL,
+  fk_ref_branch integer NOT NULL,
+  transfer_date timestamp without time zone NOT NULL,
+  transaction_id integer NOT NULL,
+  responsible_user character varying(100) NOT NULL,
+  former_responsible_user character varying(100),
+  create_user character varying(100) NOT NULL,
+  create_date timestamp without time zone NOT NULL,
+  mod_user character varying(100),
+  mod_date timestamp without time zone,
+  CONSTRAINT HTBL_RESPONSIBILITY_PKEY PRIMARY KEY (id),
+  CONSTRAINT fk_branch FOREIGN KEY (fk_ref_branch)
+      REFERENCES public.REF_BRANCH (id) MATCH SIMPLE
+      ON UPDATE NO ACTION ON DELETE NO ACTION,
+  CONSTRAINT FK_GRID_TERRITORY FOREIGN KEY (fk_ref_grid_territory)
+      REFERENCES public.REF_GRID_TERRITORY (id) MATCH SIMPLE
+      ON UPDATE NO ACTION ON DELETE NO ACTION
+)
+WITH (
+  OIDS=FALSE
+);
+ALTER TABLE public.HTBL_RESPONSIBILITY
+  OWNER TO btbservice;
+
+-- Index: public.htbl_responsibility_territory_branch_user_transaction_id_unique
+
+-- DROP INDEX public.htbl_responsibility_territory_branch_user_transaction_id_unique;
+
+CREATE UNIQUE INDEX HTBL_RESPONSIBILITY_TERRITORY_BRANCH_USER_TRANSACTION_ID_UNIQUE
+  ON public.HTBL_RESPONSIBILITY
+  USING btree
+  (fk_ref_grid_territory, fk_ref_branch, transaction_id);
+
+
+CREATE OR REPLACE VIEW public.VIEW_ACTIVE_NOTIFICATION AS
+ SELECT s.id,
+    s.incident_id,
+    s.version,
+    s.fk_ref_branch,
+    s.notification_text,
+    s.free_text,
+    s.free_text_extended,
+    s.fk_ref_notification_status,
+    s.responsibility_forwarding,
+    s.reminder_date,
+    s.expected_finished_date,
+    s.responsibility_control_point,
+    s.begin_date,
+    s.finished_date,
+    s.create_user,
+    s.create_date,
+    s.mod_user,
+    s.mod_date,
+    s.fk_ref_grid_territory,
+    s.admin_flag
+   FROM ( SELECT tbl_notification.id,
+            tbl_notification.incident_id,
+            tbl_notification.version,
+            tbl_notification.fk_ref_branch,
+            tbl_notification.notification_text,
+            tbl_notification.free_text,
+            tbl_notification.free_text_extended,
+            tbl_notification.fk_ref_notification_status,
+            tbl_notification.responsibility_forwarding,
+            tbl_notification.reminder_date,
+            tbl_notification.expected_finished_date,
+            tbl_notification.responsibility_control_point,
+            tbl_notification.begin_date,
+            tbl_notification.finished_date,
+            tbl_notification.create_user,
+            tbl_notification.create_date,
+            tbl_notification.mod_user,
+            tbl_notification.mod_date,
+            tbl_notification.fk_ref_grid_territory,
+            tbl_notification.admin_flag,
+            rank() OVER (PARTITION BY tbl_notification.incident_id ORDER BY tbl_notification.version DESC) AS rank
+           FROM TBL_NOTIFICATION) s
+  WHERE s.rank = 1;
+
+ALTER TABLE public.VIEW_ACTIVE_NOTIFICATION
+  OWNER TO btbservice;
+GRANT ALL ON TABLE public.VIEW_ACTIVE_NOTIFICATION TO btbservice;
+
+
+
+
+
+
+
+
+
diff --git a/db/postgreSQL/03_config_DB_1.0.0.sql b/db/postgreSQL/03_config_DB_1.0.0.sql
new file mode 100644
index 0000000..1c491d0
--- /dev/null
+++ b/db/postgreSQL/03_config_DB_1.0.0.sql
@@ -0,0 +1,24 @@
+
+INSERT INTO REF_NOTIFICATION_STATUS ( "id", "name" ) VALUES ( 1, 'offen' );
+INSERT INTO REF_NOTIFICATION_STATUS ( "id", "name" ) VALUES ( 2, 'in Arbeit' );
+INSERT INTO REF_NOTIFICATION_STATUS ( "id", "name" ) VALUES ( 3, 'erledigt' );
+INSERT INTO REF_NOTIFICATION_STATUS ( "id", "name" ) VALUES ( 4, 'geschlossen' );
+
+INSERT INTO REF_BRANCH ("id", "name", "description" ) VALUES ( 1, 'S', 'Strom' );
+INSERT INTO REF_BRANCH ("id", "name", "description" ) VALUES ( 2, 'G', 'Gas' );
+INSERT INTO REF_BRANCH ("id", "name", "description" ) VALUES ( 3, 'FW', 'Fernwärme' );
+INSERT INTO REF_BRANCH ("id", "name", "description" ) VALUES ( 4, 'W', 'Wasser' );
+
+INSERT INTO REF_GRID_TERRITORY ("id", "name", "description", "fk_ref_master") VALUES ( 1, 'MA', 'Mannheim', 1);
+INSERT INTO REF_GRID_TERRITORY ("id", "name", "description", "fk_ref_master") VALUES ( 2, 'OF', 'Offenbach', 2);
+
+INSERT INTO REF_VERSION VALUES (1, '1.0.0_PG');
+
+INSERT INTO TBL_RESPONSIBILITY ("fk_ref_grid_territory", "fk_ref_branch", "responsible_user", "create_user", "create_date") VALUES (1, 2, 'admin','admin', CURRENT_TIMESTAMP);
+INSERT INTO TBL_RESPONSIBILITY ("fk_ref_grid_territory", "fk_ref_branch", "responsible_user", "create_user", "create_date") VALUES (1, 3, 'admin','admin', CURRENT_TIMESTAMP);
+INSERT INTO TBL_RESPONSIBILITY ("fk_ref_grid_territory", "fk_ref_branch", "responsible_user", "create_user", "create_date") VALUES (1, 4, 'admin','admin', CURRENT_TIMESTAMP);
+INSERT INTO TBL_RESPONSIBILITY ("fk_ref_grid_territory", "fk_ref_branch", "responsible_user", "create_user", "create_date") VALUES (2, 1, 'admin','admin', CURRENT_TIMESTAMP);
+INSERT INTO TBL_RESPONSIBILITY ("fk_ref_grid_territory", "fk_ref_branch", "responsible_user", "create_user", "create_date") VALUES (2, 3, 'otto','admin', CURRENT_TIMESTAMP);
+INSERT INTO TBL_RESPONSIBILITY ("fk_ref_grid_territory", "fk_ref_branch", "responsible_user", "create_user", "create_date") VALUES (2, 4, 'otto','admin', CURRENT_TIMESTAMP);
+
+
diff --git a/deploy/HowToDeploy.txt b/deploy/HowToDeploy.txt
new file mode 100644
index 0000000..4e9ec6f
--- /dev/null
+++ b/deploy/HowToDeploy.txt
@@ -0,0 +1,31 @@
+Deployment der Anwendung oK Betriebstagebuch
+________________________________________________
+22.03.2017 _fd                     first Version
+________________________________________________
+
+
+Allgemein
+_________________________________________________
+
+Datenbank einrichten
+____________________
+
+....
+
+Datenquelle auf Apache Tomcat einrichten
+________________________________________
+Im "conf"-Unterverzeichnis des Tomcat (<TOMCAT>/conf) befindet sich die Datei context.xml.
+Diese muss um den Bereich "<Resource>..." aus der Datei (/deploy/context.xml) ergänzt werden.
+Der Datenbank-Treiber (deploy/lib/postgresql-xxx.jar) muss nach ""<TOMCAT>/lib" kopiert werden.
+
+
+Backend-Installieren
+____________________
+Die Datei "betriebstagebuch.war" muss in das Verzeichnis "<TOMCAT>/webapps" kopiert werden. Sollte
+dort bereits ein Verzeichnis "betriebstagebuch" vorhanden sein, so muss dieses zuvor gelöscht werden.
+
+
+
+Frontend-Installieren
+_____________________
+....
\ No newline at end of file
diff --git a/deploy/conf/context.xml b/deploy/conf/context.xml
new file mode 100644
index 0000000..237a658
--- /dev/null
+++ b/deploy/conf/context.xml
@@ -0,0 +1,49 @@
+<?xml version='1.0' encoding='utf-8'?>
+<!--
+  Licensed to the Apache Software Foundation (ASF) under one or more
+  contributor license agreements.  See the NOTICE file distributed with
+  this work for additional information regarding copyright ownership.
+  The ASF licenses this file to You under the Apache License, Version 2.0
+  (the "License"); you may not use this file except in compliance with
+  the License.  You may obtain a copy of the License at
+
+      http://www.apache.org/licenses/LICENSE-2.0
+
+  Unless required by applicable law or agreed to in writing, software
+  distributed under the License is distributed on an "AS IS" BASIS,
+  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  See the License for the specific language governing permissions and
+  limitations under the License.
+-->
+<!-- The contents of this file will be loaded for each web application -->
+
+
+<!-- jdbc:oracle:thin:@entbwora1:1521:dboetng4  -->
+<Context>
+
+    <!-- Default set of monitored resources -->
+    <WatchedResource>WEB-INF/web.xml</WatchedResource>
+
+    <!-- Uncomment this to disable session persistence across Tomcat restarts -->
+
+    <!--Manager pathname=""/>
+
+
+    <Parameter name="environment" override="false" value="Development"/-->
+
+    <Resource name="jdbc/okBetriebstagebuchDS"
+              auth="Container"
+              type="javax.sql.DataSource"
+              driverClassName="org.postgresql.Driver"
+              url="jdbc:postgresql://172.18.22.160:5432/betriebstagebuch"
+              username="btbservice"
+              password="btbservice"/>
+
+
+    <!-- Uncomment this to enable Comet connection tacking (provides events
+         on session expiration as well as webapp lifecycle) -->
+    <!--
+    <Valve className="org.apache.catalina.valves.CometConnectionManagerValve" />
+    -->
+
+</Context>
diff --git a/deploy/lib/postgresql-42.0.0.jar b/deploy/lib/postgresql-42.0.0.jar
new file mode 100644
index 0000000..b89509b
--- /dev/null
+++ b/deploy/lib/postgresql-42.0.0.jar
Binary files differ
diff --git a/doc/build.txt b/doc/build.txt
new file mode 100644
index 0000000..737e8a3
--- /dev/null
+++ b/doc/build.txt
@@ -0,0 +1,23 @@
+>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
+Backend:
+>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
+
+Voraussetzungen:
+----------------
+Java 1.8 JDK
+Maven
+
+Bauen:
+------
+Im Rootpath des Backend-Projektes:
+>mvn clean install
+
+(Erzeugt in Target das WAR, die surefire-reports und das jacoco.exec für die Codecoverage-Analyse)
+Im Sonarqube schließen wir folgende Files von der CodeCoverageAnalyse aus:
+
+
+**/de/pta/openkonsequenz/betriebstagebuch/common/Globals.java
+**/rest/*.java
+**/LoggerUtil.java
+**/dao/*.java
+**/dao/interfaces/*.java
diff --git a/doc/doc_eLogbook_Rest.docx b/doc/doc_eLogbook_Rest.docx
new file mode 100644
index 0000000..14201c8
--- /dev/null
+++ b/doc/doc_eLogbook_Rest.docx
Binary files differ
diff --git a/pom.xml b/pom.xml
new file mode 100644
index 0000000..1144d9f
--- /dev/null
+++ b/pom.xml
@@ -0,0 +1,301 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0"
+         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+    <modelVersion>4.0.0</modelVersion>
+
+    <groupId>openk.pta.de</groupId>
+    <artifactId>elogbook</artifactId>
+    <version>1.0.0</version>
+    <packaging>war</packaging>
+
+    <properties>
+        <skip.asciidoc>false</skip.asciidoc>
+        <httpclient.version>4.5.3</httpclient.version>
+        <jersey-bundle.version>1.19.3</jersey-bundle.version>
+        <org.json.version>20160810</org.json.version>
+        <jersey.server.version>1.19.3</jersey.server.version>
+        <gson.version>2.8.0</gson.version>
+        <log4j.version>1.2.17</log4j.version>
+        <commons-io.version>2.5</commons-io.version>
+        <junit.version>4.12</junit.version>
+        <easymock.version>3.4</easymock.version>
+        <powermock-api-easymock.version>1.6.6</powermock-api-easymock.version>
+        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
+        <servlet-api>2.5</servlet-api>
+        <maven.test.skip>false</maven.test.skip>
+        <jacoco-maven-plugin.version>0.7.9</jacoco-maven-plugin.version>
+        <sonar-maven-plugin.version>3.0.2</sonar-maven-plugin.version>
+    </properties>
+    <dependencies>
+        <dependency>
+            <groupId>org.apache.httpcomponents</groupId>
+            <artifactId>httpclient</artifactId>
+            <version>${httpclient.version}</version>
+        </dependency>
+        <dependency>
+            <groupId>org.json</groupId>
+            <artifactId>json</artifactId>
+            <version>${org.json.version}</version>
+        </dependency>
+        <dependency>
+            <groupId>org.jboss.resteasy</groupId>
+            <artifactId>resteasy-jaxrs</artifactId>
+            <version>3.0.21.Final</version>
+        </dependency>
+        <dependency>
+            <groupId>org.jboss.resteasy</groupId>
+            <artifactId>jaxrs-api</artifactId>
+            <version>3.0.12.Final</version>
+        </dependency>
+
+        <dependency>
+            <groupId>javax.servlet</groupId>
+            <artifactId>javax.servlet-api</artifactId>
+            <version>3.0.1</version>
+        </dependency>
+
+
+        <dependency>
+            <groupId>com.google.code.gson</groupId>
+            <artifactId>gson</artifactId>
+            <version>${gson.version}</version>
+        </dependency>
+        <dependency>
+            <groupId>log4j</groupId>
+            <artifactId>log4j</artifactId>
+            <version>${log4j.version}</version>
+            <exclusions>
+                <exclusion>
+                    <groupId>com.sun.jmx</groupId>
+                    <artifactId>jmxri</artifactId>
+                </exclusion>
+
+                <exclusion>
+                    <groupId>com.sun.jdmk</groupId>
+                    <artifactId>jmxtools</artifactId>
+                </exclusion>
+
+                <exclusion>
+                    <groupId>javax.jms</groupId>
+                    <artifactId>jms</artifactId>
+                </exclusion>
+            </exclusions>
+        </dependency>
+        <dependency>
+            <groupId>commons-io</groupId>
+            <artifactId>commons-io</artifactId>
+            <version>${commons-io.version}</version>
+        </dependency>
+        <dependency>
+            <groupId>org.eclipse.persistence</groupId>
+            <artifactId>eclipselink</artifactId>
+            <version>2.6.4</version>
+        </dependency>
+        <dependency>
+            <groupId>postgresql</groupId>
+            <artifactId>postgresql</artifactId>
+            <version>9.1-901-1.jdbc4</version>
+        </dependency>
+        <dependency>
+            <groupId>junit</groupId>
+            <artifactId>junit</artifactId>
+            <version>${junit.version}</version>
+            <scope>test</scope>
+        </dependency>
+        <dependency>
+            <groupId>org.easymock</groupId>
+            <artifactId>easymock</artifactId>
+            <version>${easymock.version}</version>
+        </dependency>
+        <dependency>
+            <groupId>org.powermock</groupId>
+            <artifactId>powermock-api-easymock</artifactId>
+            <version>${powermock-api-easymock.version}</version>
+            <scope>test</scope>
+        </dependency>
+        <dependency>
+            <groupId>org.jacoco</groupId>
+            <artifactId>jacoco-maven-plugin</artifactId>
+            <version>${jacoco-maven-plugin.version}</version>
+        </dependency>
+        <dependency>
+            <groupId>com.fasterxml.jackson.core</groupId>
+            <artifactId>jackson-annotations</artifactId>
+            <version>2.5.4</version>
+        </dependency>
+        <dependency>
+            <groupId>com.auth0</groupId>
+            <artifactId>java-jwt</artifactId>
+            <version>3.2.0</version>
+        </dependency>
+
+    </dependencies>
+
+
+    <build>
+        <finalName>${project.artifactId}</finalName>
+        <plugins>
+            <plugin>
+                <groupId>org.apache.maven.plugins</groupId>
+                <artifactId>maven-compiler-plugin</artifactId>
+                <version>3.1</version>
+                <configuration>
+                    <source>1.8</source>
+                    <target>1.8</target>
+                </configuration>
+            </plugin>
+            <plugin>
+                <groupId>org.apache.maven.plugins</groupId>
+                <artifactId>maven-jar-plugin</artifactId>
+                <version>3.0.2</version>
+                <configuration>
+                    <archive>
+                        <manifest>
+                            <addDefaultImplementationEntries>true</addDefaultImplementationEntries>
+                            <addDefaultSpecificationEntries>true</addDefaultSpecificationEntries>
+                        </manifest>
+                    </archive>
+                </configuration>
+            </plugin>
+            <plugin>
+                <artifactId>maven-war-plugin</artifactId>
+                <version>2.1</version>
+                <configuration>
+                    <archive>
+                        <manifest>
+                            <addDefaultImplementationEntries>true</addDefaultImplementationEntries>
+                            <addDefaultSpecificationEntries>true</addDefaultSpecificationEntries>
+                        </manifest>
+                    </archive>
+                </configuration>
+            </plugin>
+            <plugin>
+                <groupId>org.apache.maven.plugins</groupId>
+                <artifactId>maven-project-info-reports-plugin</artifactId>
+                <version>2.7</version>
+            </plugin>
+            <plugin>
+                <groupId>org.codehaus.mojo</groupId>
+                <artifactId>sonar-maven-plugin</artifactId>
+                <version>${sonar-maven-plugin.version}</version>
+            </plugin>
+            <plugin>
+                <groupId>org.jacoco</groupId>
+                <artifactId>jacoco-maven-plugin</artifactId>
+                <version>${jacoco-maven-plugin.version}</version>
+                <configuration>
+                    <skip>${maven.test.skip}</skip>
+                    <output>file</output>
+                    <append>true</append>
+                    <excludes>
+                        <exclude>**/Globals.*</exclude>
+                        <exclude>**/dao/**/*Dao*.java</exclude>
+                        <exclude>**/controller/BackendController.java</exclude>
+                    </excludes>
+                </configuration>
+                <executions>
+                    <execution>
+                        <id>jacoco-initialize</id>
+                        <goals>
+                            <goal>prepare-agent</goal>
+                        </goals>
+                    </execution>
+                    <execution>
+                        <id>jacoco-site</id>
+                        <phase>verify</phase>
+                        <goals>
+                            <goal>report</goal>
+                        </goals>
+                    </execution>
+                </executions>
+            </plugin>
+            <plugin>
+                <groupId>org.asciidoctor</groupId>
+                <artifactId>asciidoctor-maven-plugin</artifactId>
+                <version>1.5.3</version>
+                <dependencies>
+                    <dependency>
+                        <groupId>org.asciidoctor</groupId>
+                        <artifactId>asciidoctorj-pdf</artifactId>
+                        <version>1.5.0-alpha.11</version>
+                    </dependency>
+                    <dependency>
+                        <groupId>org.jruby</groupId>
+                        <artifactId>jruby-complete</artifactId>
+                        <version>1.7.21</version>
+                    </dependency>
+                    <dependency>
+                        <groupId>org.asciidoctor</groupId>
+                        <artifactId>asciidoctorj</artifactId>
+                        <version>1.5.4</version>
+                    </dependency>
+                    <dependency>
+                        <groupId>org.asciidoctor</groupId>
+                        <artifactId>asciidoctorj-diagram</artifactId>
+                        <version>1.5.4.1</version>
+                    </dependency>
+                </dependencies>
+                <configuration>
+                    <sourceDirectory>src/main/asciidoc</sourceDirectory>
+                    <requires>
+                        <require>asciidoctor-diagram</require>
+                    </requires>
+                    <attributes>
+                        <imagesoutdir>${project.build.directory}/generated-docs/images</imagesoutdir>
+                        <imagesDir>${project.build.directory}/generated-docs/images</imagesDir>
+                    </attributes>
+                </configuration>
+                <executions>
+
+                    <execution>
+                        <id>output-html</id>
+                        <phase>generate-resources</phase>
+                        <goals>
+                            <goal>process-asciidoc</goal>
+                        </goals>
+                        <configuration>
+                            <skip>${skip.asciidoc}</skip>
+                            <imagesDir>${project.build.directory}/generated-docs/images</imagesDir>
+                            <requires>
+                                <require>asciidoctor-diagram</require>
+                            </requires>
+                            <sourceHighlighter>coderay</sourceHighlighter>
+                            <backend>html</backend>
+                            <doctype>book</doctype>
+                            <imagesDir>./images</imagesDir>
+                        </configuration>
+                    </execution>
+                    <!--execution>
+                        <id>output-pdf</id>
+                        <phase>generate-resources</phase>
+                        <goals>
+                            <goal>process-asciidoc</goal>
+                        </goals>
+                        <configuration>
+                            <skip>${skip.asciidoc}</skip>
+                            <imagesDir>${project.build.directory}/generated-docs/images</imagesDir>
+                            <requires>
+                                <require>asciidoctor-diagram</require>
+                            </requires>
+                            <sourceHighlighter>coderay</sourceHighlighter>
+                            <backend>pdf</backend>
+                            <doctype>book</doctype>
+                            <imagesDir>./images</imagesDir>
+                            <attributes>
+                                <icons>font</icons>
+                                <pagenums />
+                                <toc />
+                                <idprefix />
+                                <idseparator>-</idseparator>
+                            </attributes>
+
+                        </configuration>
+                    </execution-->
+                </executions>
+            </plugin>
+        </plugins>
+    </build>
+
+
+</project>
diff --git a/src/main/asciidoc/architectureDocumentation/elogbook_architectureDocumentation.adoc b/src/main/asciidoc/architectureDocumentation/elogbook_architectureDocumentation.adoc
new file mode 100644
index 0000000..425fcd2
--- /dev/null
+++ b/src/main/asciidoc/architectureDocumentation/elogbook_architectureDocumentation.adoc
@@ -0,0 +1,874 @@
+openKonsequenz - Architecture of the module "eLogbook@openK"
+============================================================
+:Author: Frank Dietrich
+:Email: frank.dietrich@pta.de
+:Date: 2017-07-12
+:Revision: 1
+:icons:
+:source-highlighter: highlightjs
+:highlightjs-theme: solarized_dark
+
+This documentation bases on ARC42-Template (v7.0):
+
+*About arc42*
+
+arc42, the Template for documentation of software and system architecture.
+
+By Dr. Gernot Starke, Dr. Peter Hruschka and contributors.
+
+Template Revision: 7.0 EN (based on asciidoc), January 2017
+
+© We acknowledge that this document uses material from the arc 42 architecture template, http://www.arc42.de.
+Created by Dr. Peter Hruschka & Dr. Gernot Starke.
+
+<<<
+
+== Introduction and Goals
+
+=== Requirements Overview
+
+The digital logbook (eLogbook@openK) is the main source of information in the central network control unit (CNCU)
+for the manual logging of events and operations, which are not recorded automatically in the control system. In
+addition to the use for the structured transfer of information during the change of shifts, the company's digital
+logbook is to be used as an expanded resource for the work organization in the CNCU and as an information medium for
+the well-directed transfer of information from supervisors to employees.
+
+The full requirements of the module eLogbook@openK (in German: Modul Betriebstagebuch) is described in the document
+
+* "Anfragespezifikation Modul Betriebstagebuch" from 15-09-2016.
+
+=== Quality Goals
+
+The eLogbook represents a user module that bases on the architecture platform of openKONSEQUENZ. The main quality
+goals of the platform are:
+
+* *Flexibility* The reference platform shall grant that different systems and modules from different vendors/developers can interact and interoperate, and may be exchanged or recombined.
+* *Availability* All platform modules that are running on the platform can only be as available as the platform same for user modules that are based on platform modules.
+* *Maintainability* (and testability as part of maintainability)  The platform and its platform modules shall be used longer than 15 years.
+* *Integration performance* New implemented functionality of oK own modules and external modules shall be included fast / automatically.
+* *Security* The platform and its modules need to underly security-by-design
+
+The main quality goals of the user module eLogbook are:
+
+* *Functionality* The user module must fulfil the functional requirements mentioned in the section before
+* *Integration performance* The user module must be easy integratable in different production environments. * Modifiability (and testability as part of modifiability) Good documentation (i.e. code and architecture documentation) makes code changes easier and automatic tests facilitate rigorous verification. * Ergonomics The web interface must be realized according to oK-GUI-Styleguide.
+
+The following documents contain the quality goals in detail:
+
+* "Architecture Committee Handbook" v1.2 from 14-09-2016
+* "Quality Committee Handbook" v1.1 from 18-08-2016
+
+The project eLogbook@openK bases on the Eclipse Public Lisence 1.0.
+
+=== Stakeholders
+
+.Stakeholders
+[options="header,footer"]
+|=========================================================
+|Role/Name|Contact|Expectations
+|Product Owner (represents the Distribution System Operators)|Gordon Pickford, Oliver Tantu|The software must fulfil their functional and nonfunctional Requirements.
+|Module Developer|Michel Allessandrini, Jonas Tewolde, Frank Dietrich|All relevant business and technical information must be available for implementing the software.
+|External Reviewer (represents the AC/QC)|Martin Jung, Anja Berschneider|The software and the documentation is realized according the Quality and Architecture Handbook of openKONSEQUENZ.
+|System Integrator||A documentation for the integration of the module in the DSO specific environments must be available.
+|=========================================================
+
+== Architecture Constraints
+
+The main architecture constraints are:
+
+* *Public License* The module must be available under the “Eclipse Public License 1.0”.
+* *Availability* The source code of the module must be accessible to any interested person/company. Therefore the project is published at https://projects.eclipse.org/projects/technology.elogbook
+* *Standardization* The module must use standardized data structures (CIM) [if available] and the reference platform.
+
+=== Technical Constraints
+
+The following technical constraints are given:
+
+.Technical Contraints
+[options="header,footer"]
+|========================================================
+|Component|Constraints
+|Basis components of the reference platform|
+- Application Server Tomcat
+- JPA EclipseLink
+- Database PostgreSQL
+
+|Enterprise Service Bus|
+* ESB Talend
+* Communication via RESTful Webservices
+
+|Programming Language Frontend
+a|* Angular
+* Bootstrap
+* jQuery
+* REST/JSON Interfaces
+
+|GUI design
+a|* According to oK-GUI-Styleguide
+
+|Java QA environment|Sonarqube 5.6.6
+
+|Programming Language
+a|* Backend: Java 1.8
+* Frontend: Angular 4.0.0 (Javascript, Typescript, HTML5, CSS3)
+
+|IDE
+a|* Not restricted (Eclipse, IntelliJ, Microsoft Developer Studio, Microsoft Visual Code ...)
+
+|Build system
+a|* Backend: Maven
+* Frontend: NodeJS + Angular/cli
+
+|Libraries, Frameworks,Components
+a|* Used Libraries/Frameworks have to be compatible to the Eclipse Public License
+|Architecture Documentation|* According ARC42-Template
+|========================================================
+
+
+=== Technical Dependencies
+
+The following libraries are used:
+
+.Libraries
+[options="header,footer"]
+|=========================================================
+|Name of the library|Version|Artefact-id|Usage|License|Tier
+|Node.js|6.10.0 LTS||JavaScript Runtime (server side)|MIT License|Frontend
+|npm (in Node.js enthalten)|3.10.10||Node Package Manager (package manager for libraries)|Artistic License 2.0|Frontend
+|Angular|4.0.0||UI-Framework|MIT License|Frontend
+|Angular Material|2.0.0-beta.2||Angular Material Design Components|MIT License|Frontend
+|Bootstrap|3.3.7||CSS-Framework |MIT License|Frontend
+|jQuery|3.1.1||JavaScript Bibliothek|MIT License|Frontend
+|ng2-daterangepicker|1.0.4||Angular 2 Daterangepicker Component|MIT License|Frontend
+|Moment.js|2.16.0||JavaScript library for date and time processing|MIT License|Frontend
+|core-js|2.4.1||JavaScript Polyfill for angular support within older browsers|MIT License|Frontend
+|rxjs|5.0.1||JavaScript Polyfill for Observables|Apache License 2.0|Frontend
+|TS-helpers|1.1.1||Helper library for compiling typescript|MIT License|Frontend
+|zone.js|0.7.2||JavaScript Polyfill for asynchronous data binding|MIT License|Frontend
+|org.apache.httpcomponents.httpclient|4.5.3
+a|
+[source,xml]
+----
+<dependency>
+    <groupId>org.apache.httpcomponents</groupId>
+    <artifactId>httpclient</artifactId>
+    <version>4.5.3</version>
+</dependency>
+----
+|Backend, Http-Client|Apache 2.0|Backend
+
+|org.json.json|20160810
+
+a|
+[source,xml]
+----
+<dependency>
+    <groupId>org.json</groupId>
+    <artifactId>json</artifactId>
+    <version>20160810</version>
+</dependency>
+----
+|Backend - Json functionality|Json|Backend
+
+|org.jboss.resteasy.resteasy-jaxrs|3.0.21_Final
+a|
+[source,xml]
+----
+<dependency>
+    <groupId>org.jboss.resteasy</groupId>
+    <artifactId>resteasy-jaxrs</artifactId>
+    <version>3.0.21.Final</version>
+</dependency>
+----
+|Backend - RestServer|Apache 2.0 / CC0.1.0/ Public|Backend
+
+|org.jboss.resteasy.jaxrs-api|3.0.12.Final
+a|
+[source,xml]
+----
+<dependency>
+    <groupId>org.jboss.resteasy</groupId>
+    <artifactId>jaxrs-api</artifactId>
+    <version>3.0.12.Final</version>
+</dependency>
+----
+|Rest-Server|Apache 2.0|Backend
+
+|javax.servlet.servlet-api|3.0.1
+a|
+[source,xml]
+----
+<dependency>
+    <groupId>javax.servlet</groupId>
+    <artifactId>servlet-api</artifactId>
+    <version>3.0.1</version>
+</dependency>
+----
+|Backend - Logging Servlet |CDDL GLP 2.0|Backend
+
+|com.google.code.gson.gson|2.8.0
+a|
+[source,xml]
+----
+<dependency>
+    <groupId>com.google.code.gson</groupId>
+    <artifactId>gson</artifactId>
+    <version>2.8.0</version>
+</dependency>
+----
+|Backend Json de-serialization|Apache 2.0|Backend
+
+|log4j.log4j|1.2.17
+a|
+[source,xml]
+----
+<dependency>
+    <groupId>log4j</groupId>
+    <artifactId>log4j</artifactId>
+    <version>1.2.17</version>
+</dependency>
+----
+|Backend logging|Apache 2.0|Backend
+
+|commons-io|2.5
+a|
+[source,xml]
+----
+<dependency>
+    <groupId>commons-io</groupId>
+    <artifactId>commons-io</artifactId>
+    <version>2.5</version>
+</dependency>
+----
+|IO utils|Apache 2.0
+
+|org.eclipse.persistence.eclipselink|2.6.4|Backend
+a|
+[source,xml]
+----
+<dependency>
+    <groupId>org.eclipse.persistence</groupId>
+    <artifactId>eclipselink</artifactId>
+    <version>2.6.4</version>
+</dependency>
+----
+|JPA implementation|EDL 1.0 EPL 1.0|Backend
+
+|postgresql.postgresql|9.1-901-1.jdbc4
+a|
+[source,xml]
+----
+<dependency>
+    <groupId>postgresql</groupId>
+    <artifactId>postgresql</artifactId>
+    <version>9.1-901-1.jdbc4</version>
+</dependency>
+----
+|DB driver|BSD|Backend
+
+|junit.junit|4.12
+
+a|
+[source,xml]
+----
+<dependency>
+    <groupId>junit</groupId>
+    <artifactId>junit</artifactId>
+    <version>4.12</version>
+</dependency>
+----
+|Unit testing|EPL 1.0|Backend
+
+|org.easymock.easymock|3.4
+a|
+[source,xml]
+----
+<dependency>
+    <groupId>org.easymock</groupId>
+    <artifactId>easymock</artifactId>
+    <version>3.4</version>
+</dependency>
+----
+|Unit testing|Apache 2.0|Backend
+
+|org.powermock.powermock-api-easymock|1.6.6
+a|
+[source,xml]
+----
+<dependency>
+    <groupId>org.powermock</groupId>
+    <artifactId>powermock-api-easymock</artifactId>
+    <version>1.6.6</version>
+</dependency>
+----
+|Unit testing|Apache 2.0|Backend
+
+|org.jacoco.jacoco-maven-plugin|0.7.9
+a|
+[source,xml]
+----
+<dependency>
+    <groupId>org.jacoco</groupId>
+    <artifactId>jacoco-maven-plugin</artifactId>
+    <version>0.7.9</version>
+</dependency>
+----
+|Test coverage|EPL 1.0|Backend
+|=========================================================
+
+== System Scope and Context
+
+=== Business Context
+
+The user module eLogbook communicates via the ESB to other modules and systems (see figure 1):
+
+* *Core Module "Auth & Auth"* The eLogbook can only be used by authorized users. Therefore, it is essential to invoke the module “Auth & Auth” for authorization and authentication purposes.
+* *Source System "SCADA"* The eLogbook needs information from the system “SCADA”. Therefore, it must provide an interface for receiving the according data.
+
+.System-Context of eLogbook
+[options="header,footer"]
+image::SystemContext.png[System-Context of eLogbook]
+
+=== Technical Context
+
+The following aspects have to be taken into account for external communication of the module eLogbook:
+
+* As interface-technology RESTful web services are used.
+* Each external interface (interfaces between modules or external systems) has to be documented.
+* Dependencies of modules to services realized by other modules have to be specified and documented explicitly.
+* When CIM is not appropriate (like access management), other standards in their respective domain shall be taken into account first to avoid proprietary and inaccurate interfaces. The interface has also be documented in the overall openKONSEQUENZ interface profile and it should use REST & XML.
+
+The interfaces of the module eLogbook are described in the documentation *"elogbook_interfaceDocumentation"*.
+ 
+=== Solution Strategy
+
+The module eLogbook bases on a three-tier architecture:
+
+. *Frontend* - The GUI is implemented as a web-frontend with rich-client functionalities.
+. *Backend* - The business functionalities are implemented in the backend tier. It provides the business functions via RESTful Webservices.
+. *Database* - The database stores all module specific data.
+
+== Building Block View
+
+=== Whitebox Overall System
+
+The module eLogbook contains two components (see figure 2):
+
+. *UI* - Represents the graphical user interface and consumes the services from the Business logic component via RESTful webservices.
+. *Business Logic* - Realizes the business functionality and the data storage of the module.
+
+.Module components
+[options="header,footer"]
+[plantuml]
+----
+node Module {
+    rectangle UI
+    rectangle BusinessLogic
+
+    interface REST
+
+    UI -> REST
+    REST -- BusinessLogic
+}
+----
+
+
+Bases on the abstract concept mentioned above, the following figure shows the concrete realization of the main components.
+The mapping from the abstract to the concrete view is as follows:
+
+. UI
+ - elogbookFE-SPA
+. Business Logic
+ - elogbook.war (Rest-Service)
+ - elogbook-DB (in figure called: Betriebstagebuch Datenbank)
+
+.Distribution of components
+[options="header,footer"]
+[plantuml]
+----
+node ClientComputer {
+    node WebBrowser {
+        component elogbookFE_SPA
+    }
+}
+
+node openKonsequenz_LAN {
+    node ApacheTomcat {
+        component elogbook_war_RESTService
+    }
+    node PostgresDMBS {
+        component elogbook_Database
+    }
+}
+
+WebBrowser -(0- ApacheTomcat
+ApacheTomcat -(0- PostgresDMBS
+----
+
+The communication between WebBrowser and Apache Tomcat is established via HTTP/HTTPS.
+ApacheTomcat is connected to the data source (PostgresDBMS) via TCP/IP.
+
+
+==== elogbook.war (Backend tier)
+
+This component implements the business functionality of the digital logbook. And it provides services, that the
+elogbookFE – SPA can use the functions in the frontend.
+
+The elogbook.war runs on the Apache Tomcat in the DSO specific environments (in the figures shown as openKONSEQUENZ - LAN)
+ //REVIEW: Give rationale to the decision for Tomcat; also explain constraints/consequences of the decision (intent: Whenever openK chooses to switch to other application server implementations, they need to know)
+ // ? -> Demand of "Architecture committee"!
+
+
+==== elogbook-DB (Database tier)
+
+This component stores the data of the digital logbook. It provides an interface to the elogbook.war to create or
+change data in the database.
+
+The elogbook-DB runs on a Postgres DBMS.
+ //REVIEW: Give rationale to the decision for Postgres; also explain constraints/consequences of the decision (intent: Whenever openK chooses to switch to other database server implementations, they need to know)
+ // ? -> Demand of "Architecture committee"!
+
+
+==== eLogbook-API
+
+The eLogbook needs information from the system "SCADA". Therefore, it must provide an interface for receiving the according data, see figure 1.
+(see below "Import functionality")
+
+
+=== Level 2
+
+==== elogbookFE – SPA (Frontend tier)
+
+The frontend component implements the concept of a single-page application (SPA). The framework used is Angular2/4.
+(The decision was made on this framework because the "AngularJS" required in the  "Architecture Committee Handbook" was already out of date at the time the project started)
+Because the frontend is only connected to the backend via REST-services, changing to another technology is rather easy.
+
+
+It divides the elogbookFE into three layers:
+
+. *Components* - The components (Pages, Lists, Dialogs, Common Comp.) represent the presentation layer and the control layer. A component contains the control logic (.ts-file), an HTML-fragment as presentation description (.html-file) and a style definition (.css-file).
+. *Services* - The service component communicates with the interfaces of the backend via HTTP requests by using the model component.
+. *Model* - The model corresponds to the View-Model of the backend tier.
+
+.Frontend tier
+[options="header,footer"]
+image::FrontendTier.png[]
+
+==== elogbook.war (Backend tier)
+
+The backend tier contains five components which can be summarized in three layers:
+
+. *Presentation layer* - Represented by
+ .. REST-Srv
+ .. View Model
+. *Controller layer* - Represented by
+ ..	Controller
+.	*Model layer* - Represented by
+ ..	DAO
+ ..	Model
+
+//REVIEW: Give a description for the layers and components. The mere list of their names is not very helpful
+
+.Backend tier
+[options="header,footer"]
+image::BackendTier.png[]
+
+==== elogbook-DB (Database tier)
+
+The elogbook-DB is realized as a relational database system.
+
+.Database tier
+[options="header,footer"]
+image::DatabaseTier.png[]
+
+
+== Runtime View
+
+=== Login / Authentication
+
+There is no login page, since the openK-Portal-Application is responsible for Authentication and
+the whole SSO (single sign on) process.
+Therefore the elogbook application has to be started by providing a valid authentication token.
+This token is a JWT (JSON Web Token).
+
+.eLogbook application is called by the *portal* application. The User is already logged in
+[plantuml]
+....
+actor User
+participant PortalFrontend
+participant PortalBackend
+participant eLogbookFrontend
+entity eLogbookFEStorage
+participant eLogbookBackend
+
+
+User->PortalFrontend: Start eLogbook(JWT)
+PortalFrontend->eLogbookFrontend: nav. to frontend-URL with JWT
+eLogbookFrontend->eLogbookFEStorage: Extract JWT and store token in session
+... some delay ...
+eLogbookFrontend->eLogbookBackend: Call any secured service with JWT
+group Call secured service
+
+    eLogbookBackend->PortalBackend: "/checkAut(JWT)"
+    group Authorization succeeded
+        eLogbookBackend->eLogbookBackend: run service
+        eLogbookBackend->eLogbookFrontend: return service result
+    end
+    group Authorization failed
+        eLogbookBackend->eLogbookFrontend: return HTTP Code 401
+    end
+end
+....
+
+
+=== Shift Change
+
+The precondition for performing a shift change is, that one or more users already have
+the responsibility for a set of grid territory/branch combinations.
+
+In the following example the user 'Max' wants to quit his shift and therefore needs to
+transfer his responsibilities to other users (in our case to 'Pete' and 'Hugo').
+He presses the Button "Schicht übergeben" (-> Transfer Shift) on the main overview page.
+
+First the frontend reads all users from the backend. After that the backend reads all current
+responsibilities of Max (The backend determines "Max" from the given session info) and returns them.
+
+On the dialog "Schichtübergabe" (->Shift change) Max assigns all of his current responsibilities to
+'Hugo' and 'Pete'. Both users are now *planned* for responsibilities.
+
+
+.Max initiates a shift change
+[plantuml]
+....
+actor Max
+participant Frontend
+participant Backend
+entity Database
+
+Max->Frontend: press "Schicht übergeben"
+
+
+Frontend->Backend: Service "users"
+Backend-->Frontend: all users
+
+Frontend->Backend: Service "currentResponsibilities" [SessionInfo]
+Backend->Database: read current Resp. for [SessionInfo.Max]
+Database-->Backend
+Backend-->Frontend:
+
+Frontend-->Max: Show dialog "Schichtübergabe"
+
+Max->Frontend: Select users
+Frontend-->Max
+
+Max->Frontend: assign Pete and Hugo
+Frontend-->Max
+
+Max->Frontend: press "übergeben"
+Frontend->Backend: Service "planResponsibilities"
+Backend->Database: store 'Pete' and 'Hugo' as planned responsibilities
+Database-->Backend:
+Backend-->Frontend:
+Frontend-->Max:
+....
+
+After the dialog "Schichtübergabe" 'Pete' and 'Hugo' are stored as
+*planned responsibilies* for different combinations of grid territory/branch.
+
+
+.Pete logs in
+[plantuml]
+....
+actor Pete
+participant Frontend
+participant Backend
+entity Database
+
+Pete->Frontend: Login
+Frontend->Backend: plannedResponsibilities [SessionInfo]
+Backend->Database: read planned resps for [SessionInfo.Pete]
+
+Database-->Backend: result
+Backend-->Frontend: result
+Frontend->Frontend: check if result not empty
+Frontend-->Pete: (then) Show "Schichtübergabe Protokoll"
+
+Pete->Frontend: Select/Deselect responsibilities
+Frontend-->Pete:
+
+Pete->Frontend: press "Übernehmen"
+Frontend->Backend: Service "confirmResponsibilities"
+Backend->Database: Switch the selected resps. from "planned" to "current"
+Database-->Backend:
+Backend->Database: Store as historical responsibility
+Database-->Backend:
+Backend-->Frontend:
+Frontend-->Pete:
+....
+
+When 'Pete' presses "Übernehmen" (->"Take Responsibilities") all the selected
+responsibilities for 'Pete' (regarding grid territory and branch) are switched
+from 'planned' to 'current' in a single transaction. That means, that 'Pete'
+is no longer planned for a set of responsibilities. From now on he is responsible
+for them. In the same transaction the data of this process is stored as the historical data
+
+When 'Hugo' logs in, it is the same process as for 'Pete'.
+
+If 'Hugo' or 'Pete' decide to deselect a responsibility they are planned for,
+then that one will be kept with 'Max' as responsible person. 'Max' will then
+need to plan it for another person.
+
+=== Import functionality
+
+Informations can be imported into the elogbook system. Therefore an exchange file directory can be defined (see below "Configuration of the backend").
+If there exist files in that directory, then the "Import"-Button changes its colour from blue to orange. An import file has to
+have to following structure:
+[source, text]
+----
+1:                                                           PROTOKOLL_STROM
+2:                                             08.09.2017 10:10:51  -  08.09.2017 10:22:04
+3:
+4:Betriebsart: Prozessführung
+5:Modus      : Spalten-Filtern
+6:Verknüpfung: --------
+7:
+8:.............OW.........................................................................................................................
+9:16:12:51,425 OW Test text         Offenbach Wasser
+10:ENDE
+11:
+12:08.09.2017 10:23:34
+----
+
+Only Line 9 will be imported. This line number can be configured in the backend:
+
+* "OW" means "Offenbach/Water" ("O"=Offenbach, "M"=Mannheim; "E" in the file means "S" in the branches, "W", "FW", "G" are mapped directly to the branches).
+* The text right to "OW" is imported as the notification text.
+
+== Deployment View
+
+The elogbook application consists of 3 parts regarding the deployment.
+
+ //REVIEW: Add pom.xml and repository names
+
+. Frontend: "elogbookFE"-Directory
+. Backend: "elogbook.war"
+. Database: The scripts are found in the "db" folder within the backend sources.
+
+=== Deployment of the application components
+
+==== Deployment of the frontend
+
+The Frontend SPA is built as a folder, that contains all the required files for
+the application. When deploying the frontend application, the content of the "dist"-folder
+within the Frontend development-directory has to be copied into the
+target-directory of the apache-tomcat:
+
+ <Apache-Tomcat>/webapps/elogbookFE
+
+If the target folder does not exist, it has to be created manually.
+
+==== Deployment of the backend
+The backend REST-services are built in form of a "WAR"-file (to be found
+in the "target"-directory of the MAVEN-directory structure).
+For deployment, this file has to be copied to the directory
+
+ <Apache-Tomcat>/webapps
+
+==== Deployment of the database
+Currently there is no automatic mechanism for distributing structural
+or content related changes to the database.
+DB related changes are deployed using database scripts directly in suitable
+DB management applications like *pgAdminIII* or directly in the *postgres-console*.
+These script can be found in the backend project in the directory
+
+ <elogbook backend project directory>/db/postgreSQL
+
+
+. If needed, create the Database and the access role "btbservice" with *"01_add_DB.sql"*
+. The script *"01a_drop_DB_1.0.0.sql"* is only needed for dropping all objects in the db!
+. Use the script *"02_create_DB_1.0.0.sql"* to create all database objects
+. You will probably need to modify the last script *"03_config_DB_1.0.0.sql"* before you run it. Configurate
+your branches, grid territories and your responsibilities here!
+
+
+==== Configuration of the system
+
+===== DB based configuration
+
+. Grid territories - The grid-territories have to be configured in the DB-Table *ref_grid_territory*
+
+ //REVIEW: This should be handled using the SQL scripts.
+ //REVIEW: Information on database server configuration is required, e.g. /var/lib/postgresql/data/pg_hba.conf. This should be documented or the significant settings should be committed to git
+
+===== Configuration of the webserver
+
+There exists the file *context.xml* in the "conf" subdirectory (*<TOMCAT>/conf*) of the target apache tomcat installation.
+Add the following parameter and resource in order to access the correct backend configuration and to
+gain access to the database:
+
+.context.xml
+[source,xml]
+----
+[...]
+    <!-- Uncomment this to disable session persistence across Tomcat restarts -->
+
+    <!--Manager pathname=""/>
+
+
+    <Parameter name="environment" override="false" value="Development"/-->
+
+    <Parameter name="OK_ELOGBOOK_ENVIRONMENT" override="false" value="Production"/>
+
+    <Resource name="jdbc/okBetriebstagebuchDS"
+              auth="Container"
+              type="javax.sql.DataSource"
+              driverClassName="org.postgresql.Driver"
+              url="jdbc:postgresql://{dbserver}:5432/{dbname}"
+              username="{dbuser}"
+              password="{dbpassword}"/>
+
+
+    <!-- Uncomment this to enable Comet connection tacking (provides events
+         on session expiration as well as webapp lifecycle) -->
+[...]
+----
+
+*{dbserver}*, *{dbname}*, *{dbuser}* and *{dbpassword}* need to be replaced by the actual values.
+
+CAUTION: The postgres database driver (postgresql-42.0.0.jar) referenced in the *context.xml* needs to be copied from the lib folder within the
+backend source files to the *<TOMCAT>/lib* folder of the target tomcat installation.
+
+(The jar is located in *deploy/lib/*)
+
+===== Configuration of the backend
+
+After the backend war file has been deployed and unpacked inside of the *<TOMCAT>/webapps* folder there are different
+ backend config files to be found in the folder *<TOMCAT>/webapps/elogbook/WEB-INF/classes*
+
+* backendConfigCustom.json
+* backendConfigDevLocal.json
+* backendConfigDevServer.json
+* backendConfigProduction.json
+
+The active configuration is chosen by parameter *OK_ELOGBOOK_ENVIRONMENT* (see context.xml above).
+Possible values are:
+
+* *Custom* (for backendConfigCustom.json)
+* *DevLocal* (for backendConfigDevLocal.json)
+* *DevServer* (for backendConfigDevServer.json)
+* *Production* (for backendConfigProduction.json)
+
+After choosing an environment the corresponding json file has to be configured:
+
+.backendConfigXXX.json
+[source,json]
+----
+{
+  "portalBaseURL" : "http://{hostname}:{port}/portal/rest/beservice",
+  "fileRowToRead": "9",
+  "importFilesFolderPath": "/home/btbservice/importFiles"
+}
+----
+* *portalBaseURL* - The portal base url should point the the address where the portal backend (the *Auth&Auth*-Server)
+                    can be accessed. This is important for the authorization of the backend services.
+* *fileRowToRead* - Defines the line number inside the import-file of the relevant text line.
+* *importFilesFolderPath* - Defines the exchange directory for the import functionality
+
+
+
+=== CI- and CD-Components
+
+==== GIT-Repository
+
+Frontend Repository:
+http://git.eclipse.org/c/elogbook/elogbookFE.git/
+
+Backend Repository (containing this documentation and the db creation scripts)
+http://git.eclipse.org/c/elogbook/elogbook.git/
+
+
+==== Hudson
+
+<TODO>
+ //Review: Needs content
+
+==== Sonar
+
+<TODO>
+ //Review: Needs content
+
+==== Code-Coverage of the Frontend - Karma-Istanbul-Output
+
+<TODO>
+ //Review: Needs content
+
+=== Continuous Deployment
+
+The continuous deployment is realized on two platforms:
+
+ * the development platform (Dev-Environment)
+ * the quality platform (Q-Environment)
+
+The automatic deployment on both of the environments is
+directly linked to the branches on the GIT-repositories:
+
+. "SNAPSHOT" or "DEVELOP"
+. "MASTER" or "TRUNC"
+
+The running development is exclusively made on the Snapshot-Branch. Every time
+a developer checks in (pushes) code to the repository, an automatic build
+starts on the hudson ci-server. If the Snapshot-build is successful, then
+outcome of that build is directly deployed on the Dev-Environment.
+
+ //Review: This should be revised to reflect the eclipse environment. After all, the eclipse environment will be the long-term infrastructure
+
+At the end of a scrum sprint or when a big userstory is realized, all
+the code changes are merged from the *Snapshot*-Branch to the *Trunc*.
+This automatically triggers the build and the deployment on the
+Q-Environment.
+
+CAUTION: Changes on the database are not deployed automatically!
+
+== Design Decisions
+
+All architecture decisions based on the Architecture Committee Handbook. There are no deviations.
+
+== Quality Requirements
+
+TODO: Muss noch beschrieben werden
+ //Review: Yes!
+ //Review: If we have I18N requirements: please document and provide the parameter files. For the moment, externalized json files are fine.
+
+=== Quality Tree
+
+TODO: Muss noch beschrieben werden
+ //Review: Yes!
+
+=== Quality Scenarios
+
+TODO: Muss noch beschrieben werden
+ //Review: Yes!
+
+== Risks and Technical Debts
+
+(Currently there aren't any known issues)
+
+<<<
+
+== Glossary
+
+.Abbreviations and glossary terms
+[options="header,footer"]
+|========================================================
+|Short|Long|German|Description
+|AC|Architecture Committee|Architektur-Komittee|Gives Framework and Constraints according to architecture for oK projects.
+|CNCU|Central Network Control Unit||
+|DAO|Data Access Objects||
+|DSO|Distribution System Operator|Verteilnetz-betreiber (VNB)|Manages the distribution network for energy, gas or water.
+|EPL|Eclipse Public License||Underlying license model for Eclipse projects like elogbook@openK
+|ESB|Enterprise Service Bus||Central instance for exchange of data to overcome point-to-point connections.
+|oK|openKONSEQUENZ|openKONSEQUENZ|Name of the consortium of DSOs
+|QC|Quality Committee|Qualitätskomitee|Gives framework and constraints according to quality for oK projects.
+|SCADA|Supervisory Control and Data Acquisition|Netzleitsystem|System, that allows DSOs view/control actual parameters of their power grid.
+|========================================================
+
diff --git a/src/main/asciidoc/images/BackendTier.png b/src/main/asciidoc/images/BackendTier.png
new file mode 100644
index 0000000..3b626ec
--- /dev/null
+++ b/src/main/asciidoc/images/BackendTier.png
Binary files differ
diff --git a/src/main/asciidoc/images/DatabaseTier.png b/src/main/asciidoc/images/DatabaseTier.png
new file mode 100644
index 0000000..6225be2
--- /dev/null
+++ b/src/main/asciidoc/images/DatabaseTier.png
Binary files differ
diff --git a/src/main/asciidoc/images/DistributionOfComponents1.png b/src/main/asciidoc/images/DistributionOfComponents1.png
new file mode 100644
index 0000000..44bd6c8
--- /dev/null
+++ b/src/main/asciidoc/images/DistributionOfComponents1.png
Binary files differ
diff --git a/src/main/asciidoc/images/FrontendTier.png b/src/main/asciidoc/images/FrontendTier.png
new file mode 100644
index 0000000..d820cc5
--- /dev/null
+++ b/src/main/asciidoc/images/FrontendTier.png
Binary files differ
diff --git a/src/main/asciidoc/images/SolutionArchitecture.png b/src/main/asciidoc/images/SolutionArchitecture.png
new file mode 100644
index 0000000..bc731ac
--- /dev/null
+++ b/src/main/asciidoc/images/SolutionArchitecture.png
Binary files differ
diff --git a/src/main/asciidoc/images/SystemContext.png b/src/main/asciidoc/images/SystemContext.png
new file mode 100644
index 0000000..cd194ce
--- /dev/null
+++ b/src/main/asciidoc/images/SystemContext.png
Binary files differ
diff --git a/src/main/asciidoc/images/ba.png b/src/main/asciidoc/images/ba.png
new file mode 100644
index 0000000..fdf8327
--- /dev/null
+++ b/src/main/asciidoc/images/ba.png
Binary files differ
diff --git a/src/main/asciidoc/images/icons/caution.png b/src/main/asciidoc/images/icons/caution.png
new file mode 100644
index 0000000..9a8c515
--- /dev/null
+++ b/src/main/asciidoc/images/icons/caution.png
Binary files differ
diff --git a/src/main/asciidoc/images/icons/important.png b/src/main/asciidoc/images/icons/important.png
new file mode 100644
index 0000000..be685cc
--- /dev/null
+++ b/src/main/asciidoc/images/icons/important.png
Binary files differ
diff --git a/src/main/asciidoc/images/icons/note.png b/src/main/asciidoc/images/icons/note.png
new file mode 100644
index 0000000..7c1f3e2
--- /dev/null
+++ b/src/main/asciidoc/images/icons/note.png
Binary files differ
diff --git a/src/main/asciidoc/images/icons/tip.png b/src/main/asciidoc/images/icons/tip.png
new file mode 100644
index 0000000..f087c73
--- /dev/null
+++ b/src/main/asciidoc/images/icons/tip.png
Binary files differ
diff --git a/src/main/asciidoc/images/icons/warning.png b/src/main/asciidoc/images/icons/warning.png
new file mode 100644
index 0000000..d41edb9
--- /dev/null
+++ b/src/main/asciidoc/images/icons/warning.png
Binary files differ
diff --git a/src/main/asciidoc/interfaceDocumentation/elogbook_interfaceDocumentation.adoc b/src/main/asciidoc/interfaceDocumentation/elogbook_interfaceDocumentation.adoc
new file mode 100644
index 0000000..7d4252d
--- /dev/null
+++ b/src/main/asciidoc/interfaceDocumentation/elogbook_interfaceDocumentation.adoc
@@ -0,0 +1,2011 @@
+eLogbook@openK - Backend REST-Service documentation
+===================================================
+:Author: Frank Dietrich
+:Email: frank.dietrich@pta.de
+:Date: 2017-07-12
+:Revision: 1
+:icons:
+:source-highlighter: highlightjs
+:highlightjs-theme: solarized_dark
+
+
+== Base-URL
+[source,text]
+----
+http://<host>:<port>/<name-of-war>/rest/beservice
+----
+{blank}
+
+== Common Features
+All services may return the following http status codes:
+
+.Http-Status-Codes
+[options="header,footer"]
+|=========================================================
+|Code|Description|Usage within the application
+|200|OK|-
+|400|Bad Request|The structure of the request (for example a JSON within a post request) is not correct
+|401|Unauthorized|Login-credentials are wrong or there is an invalid session token
+|404|Not found|A resource cannot be found (for example trying to get an entity with an invalid id)
+|423|Locked|A resource is locked, because another user has blocked it
+|500|Internal Server Error|An unexpected error occurred
+|=========================================================
+
+If there is a special service behavior regarding the returned http status code, then it will be explained within the service description.
+
+== Protection
+There are two components that are involved, for the authentication of the services:
+
+ . HTTP-Header-Parameter: Authorization
+
+The “login”-services provides both tokens, when called with valid user-credentials. The client of the service has to pass over a valid Authorization, which belongs to Cookie. Other the protected services will come back with a 401-Unauthorized HTTP-Status code.
+
+The protection of a service can be
+
+* None  (The service is unprotected)
+* Normal (The service is available for all logged in users)
+* High (The service is only available for administrators)
+
+The backend server itself determines the secure level of the session. All services that have a
+protection which is not “None” need to provide “Authorization” and “COOKIESESSION-TOKEN”!
+
+== General Services
+=== Receive Version Information
+This service returns the current version of the backend implementation and the version of the database structure.
+
+*URL:* /versionInfo
+
+*Method:* GET
+
+*Request-Headers*:
+
+*Produces*: application/json
+
+*Response*:
+[source,json]
+----
+{
+    "dbVersion": "0.1.1_Snapshot",
+    "backendVersion": "0.1.1-Snapshot"
+}
+----
+{blank}
+
+*Protection*: none
+
+*Remarks*:
+
+=== Login
+This service receives login credentials in order to perform the authentication. If the login succeeds,
+it provides the session-token and a session cookie, used for accessing other services later on.
+
+*URL:* /login
+
+*Method:* POST
+
+*Request-Headers*:
+
+* Authorization (Optional) – Existing JWT token
+
+*Request-Body*:
+[source,json]
+----
+{
+  "userName": "Mustermann",
+  "password": "clearpassword"
+}
+----
+{blank}
+
+*Produces*: application/json
+
+*Response-Headers*:
+
+* Authorization - JWT token
+* COOKIESESSION-TOKEN - session cookie
+
+*Response*:
+[source,json]
+----
+{
+    "id": 1,
+    "selected": false,
+    "username": "Mustermann",
+    "name": "Max Mustermann",
+    "specialUser": false
+}
+----
+{blank}
+
+*Protection*: none
+
+*Remarks*: The response headers are only returned when the login was successful.
+
+
+=== Logout
+This services kills the server session belonging to the the given session token.
+
+*URL:* /logout
+
+*Method:* POST
+
+*Request-Headers*:
+
+* Authorization – Existing JWT token
+
+*Produces*: application/json
+
+*Response*:
+
+*Protection*: normal
+
+*Remarks*:
+
+=== Observer Control
+This service checks if the authenticated session user is an observer(he has no responsibilities).
+
+*URL:* /isObserver
+
+*Method:* GET
+
+*Request-Headers*:
+
+* Authorization – Existing JWT token
+
+*Produces*: application/json
+
+*Response*:
+[source,json]
+----
+{
+    true
+}
+----
+{blank}
+
+*Protection*: normal
+
+*Remarks*:
+
+== Master Data Services
+
+=== Receive Notification Statuses
+This service returns an array of available notification statuses.
+
+*URL:* /notificationStatuses
+
+*Method:* GET
+
+*Request-Headers*:
+
+*Produces*: application/json
+
+*Response*:
+[source,json]
+----
+[
+    {
+        "id": 1,
+        "name": "offen"
+    },
+    {
+        "id": 2,
+        "name": "in Arbeit"
+    },
+    {
+        "id": 3,
+        "name": "erledigt"
+    },
+    {
+        "id": 4,
+        "name": "geschlossen"
+    }
+]
+----
+{blank}
+
+*Protection*: none
+
+*Remarks*:
+
+=== Receive Branches
+This service returns an array of available notification statuses.
+
+*URL:* /branches
+
+*Method:* GET
+
+*Request-Headers*:
+
+*Produces*: application/json
+
+*Response*:
+[source,json]
+----
+[
+    {
+        "id": 1,
+        "name": "S",
+        "description": "Strom"
+
+    },
+    {
+        "id": 2,
+        "name": "G",
+        "description": "Gas"
+
+    },
+     ...
+]
+----
+{blank}
+
+*Protection*: none
+
+*Remarks*:
+
+=== Receive GridTerritories
+This service returns an array of available grid territories.
+
+*URL:* /gridTerritories
+
+*Method:* GET
+
+*Request-Headers*:
+
+*Produces*: application/json
+
+*Response*:
+[source,json]
+----
+[
+    {
+        "id": 1,
+        "name": "MA",
+        "description": "Mannheim",
+        "fk_ref_master": 1
+
+    },
+    {
+        "id": 2,
+        "name": "OF",
+        "description": "Offenbach",
+        "fk_ref_master": 1
+
+    },
+    ...
+]
+----
+{blank}
+
+*Protection*: none
+
+*Remarks*:
+
+== Application Services
+=== Receive Responsibilities
+This service returns the responsibilities for the authenticated session user.
+
+*URL:* /currentResponsibilities
+
+*Method:* GET
+
+*Request-Headers*:
+
+* Authorization – Existing JWT token
+
+*Produces*: application/json
+
+*Response*:
+[source,json]
+----
+[
+    {
+        "gridTerritoryDescription": "Mannheim",
+        "responsibilityList": [
+            {
+                "id": 1,
+                "responsibleUser": "admin",
+                "newResponsibleUser": "Otto",
+                "branchName": "S",
+                "isActive": true
+            },
+            {
+                "id": 2,
+                "responsibleUser": "admin",
+                "newResponsibleUser": "Otto",
+                "branchName": "G",
+                "isActive": true
+            }
+        ]
+    },
+    {
+        "gridTerritoryDescription": "Offenbach",
+        "responsibilityList": [
+            {
+                "id": 4,
+                "responsibleUser": "admin",
+                "newResponsibleUser": "Otto",
+                "branchName": "G",
+                "isActive": true
+            }
+        ]
+    }
+]
+----
+{blank}
+
+*Protection*: normal
+
+*Remarks*:
+
+=== Receive Planned Responsibilities
+This service returns the planned responsibilities for the authenticated session user.
+
+*URL:* /plannedResponsibilities
+
+*Method:* GET
+
+*Request-Headers*:
+
+* Authorization – Existing JWT token
+
+*Produces*: application/json
+
+*Response*:
+[source,json]
+----
+[
+    {
+        "gridTerritoryDescription": "Mannheim",
+        "responsibilityList": [
+            {
+                "id": 1,
+                "responsibleUser": "admin",
+                "newResponsibleUser": "Otto",
+                "branchName": "S",
+                "isActive": true
+            },
+            {
+                "id": 2,
+                "responsibleUser": "admin",
+                "newResponsibleUser": "Otto",
+                "branchName": "G",
+                "isActive": true
+            }
+        ]
+    },
+    {
+        "gridTerritoryDescription": "Offenbach",
+        "responsibilityList": [
+            {
+                "id": 4,
+                "responsibleUser": "admin",
+                "newResponsibleUser": "Otto",
+                "branchName": "G",
+                "isActive": true
+            }
+        ]
+    }
+]
+----
+{blank}
+
+*Protection*: normal
+
+*Remarks*:
+
+=== Receive All Responsibilities
+This service returns all the responsibilities.
+
+*URL:* /allResponsibilities
+
+*Method:* GET
+
+*Request-Headers*:
+
+* Authorization – Existing JWT token
+
+*Produces*: application/json
+
+*Response*:
+[source,json]
+----
+[
+    {
+        "gridTerritoryDescription": "Offenbach",
+        "responsibilityList": [
+            {
+                "id": 5,
+                "responsibleUser": "hugo",
+                "branchName": "F",
+                "isActive": true
+            },
+            {
+                "id": 4,
+                "responsibleUser": "admin",
+                "newResponsibleUser": "otto",
+                "branchName": "G",
+                "isActive": true
+            },
+            {
+                "id": 7,
+                "responsibleUser": "admin",
+                "newResponsibleUser": "otto",
+                "branchName": "S",
+                "isActive": true
+            },
+            {
+                "id": 8,
+                "responsibleUser": "hugo",
+                "branchName": "W",
+                "isActive": true
+            }
+        ]
+    },
+    {
+        "gridTerritoryDescription": "Mannheim",
+        "responsibilityList": [
+            {
+                "id": 1,
+                "responsibleUser": "admin",
+                "newResponsibleUser": "hugo",
+                "branchName": "S",
+                "isActive": true
+            },
+            {
+                "id": 3,
+                "responsibleUser": "admin",
+                "newResponsibleUser": "otto",
+                "branchName": "F",
+                "isActive": true
+            },
+            {
+                "id": 6,
+                "responsibleUser": "admin",
+                "newResponsibleUser": "hugo",
+                "branchName": "W",
+                "isActive": true
+            },
+            {
+                "id": 2,
+                "responsibleUser": "hugo",
+                "branchName": "G",
+                "isActive": true
+            }
+        ]
+    }
+]
+----
+{blank}
+
+*Protection*: normal
+
+*Remarks*:
+
+=== Receive Historical Responsibilities
+This service returns the responsibility history of a specific-given version.
+
+*URL:* /historicalResponsibilities/{transactionId}
+
+*Method:* GET
+
+*Request-Headers*:
+
+* Authorization – Existing JWT token
+
+*Produces*: application/json
+
+*Response*:
+[source,json]
+----
+[
+    {
+        "id": 2,
+        "responsibleUser": "hugo",
+        "formerResponsibleUser": "max",
+        "transferDate": "2017-08-04T08:53:27.502Z",
+        "transactionId": 1,
+        "createDate": "2017-06-19T12:34:35.881Z",
+        "createUser": "admin",
+        "modDate": "2017-08-04T08:53:27.502Z",
+        "modUser": "hugo",
+        "refGridTerritory": {
+            "id": 1,
+            "fkRefMaster": 1,
+            "description": "Mannheim",
+            "name": "MA"
+        },
+        "refBranch": {
+            "id": 3,
+            "name": "F",
+            "description": "Fernwärme"
+        }
+    },
+    {
+        "id": 3,
+        "responsibleUser": "hugo",
+        "formerResponsibleUser": "admin",
+        "transferDate": "2017-08-04T08:53:27.502Z",
+        "transactionId": 1,
+        "createDate": "2017-06-19T11:14:38.525Z",
+        "createUser": "Otto",
+        "modDate": "2017-08-04T08:53:27.502Z",
+        "modUser": "hugo",
+        "refGridTerritory": {
+            "id": 2,
+            "fkRefMaster": 2,
+            "description": "Offenbach",
+            "name": "OF"
+        },
+        "refBranch": {
+            "id": 3,
+            "name": "F",
+            "description": "Fernwärme"
+        }
+    },
+    {
+        "id": 4,
+        "responsibleUser": "hugo",
+        "formerResponsibleUser": "admin",
+        "transferDate": "2017-08-04T08:53:27.502Z",
+        "transactionId": 1,
+        "createDate": "2017-06-19T11:14:38.532Z",
+        "createUser": "Otto",
+        "modDate": "2017-08-04T08:53:27.502Z",
+        "modUser": "hugo",
+        "refGridTerritory": {
+            "id": 1,
+            "fkRefMaster": 1,
+            "description": "Mannheim",
+            "name": "MA"
+        },
+        "refBranch": {
+            "id": 4,
+            "name": "W",
+            "description": "Wasser"
+        }
+    },
+    {
+        "id": 5,
+        "responsibleUser": "hugo",
+        "formerResponsibleUser": "otto",
+        "transferDate": "2017-08-04T08:53:27.502Z",
+        "transactionId": 1,
+        "createDate": "2017-07-24T11:13:00.000Z",
+        "createUser": "admin",
+        "modDate": "2017-08-04T08:53:27.502Z",
+        "modUser": "hugo",
+        "refGridTerritory": {
+            "id": 2,
+            "fkRefMaster": 2,
+            "description": "Offenbach",
+            "name": "OF"
+        },
+        "refBranch": {
+            "id": 4,
+            "name": "W",
+            "description": "Wasser"
+        }
+    }
+]
+----
+{blank}
+
+*Protection*: normal
+
+*Remarks*:
+
+=== Create Notification
+This service creates a new notification in the database. It returns the same entity which the Ids and the version provided by the database.
+
+*URL:* /notifications/create
+
+*Method:* PUT
+
+*Request-Headers*:
+
+* Authorization – Existing JWT token
+
+*Consumes*: application/json
+
+*Request*:
+[source,json]
+----
+{
+  "status": "offen",
+  "notificationText": null,
+  "freeText": "",
+  "freeTextExtended": "extended",
+  "responsibilityForwarding": "",
+  "responsibilityControlPoint": "Abteilung 4",
+  "reminderDate": null,
+  "futureDate": null,
+  "createdDate": "2017-03-09T15:27:17",
+  "expectedFinishDate": null,
+  "finishedDate": null,
+  "creator": "MasterAndCreator",
+  "modDate": "2017-03-09T15:27:17",
+  "modUser": "_fd",
+  "fkRefBranch": 1,
+  "fkRefNotificationStatus": 2,
+  "fkRefGridTerritories": 2
+}
+----
+{blank}
+
+*Produces*: application/json
+
+*Response*:
+[source,json]
+----
+{
+    "id": 27,
+    "incidentId": 18,
+    "version": 1,
+    "selected": false,
+    "status": "in Arbeit",
+    "notificationText": "Meldung X:Y",
+    "freeText": "",
+    "freeTextExtended": "extended",
+    "responsibilityForwarding": "",
+    "responsibilityControlPoint": "Abteilung 4",
+    "createdDate": "2017-03-09T15:27:17",
+    "creator": "MasterAndCreator",
+    "modDate": "2017-03-09T15:27:17",
+    "modUser": "_fd",
+    "fkRefBranch": 1,
+    "fkRefNotificationStatus": 2,
+	"fkRefGridTerritories": 1
+}
+----
+{blank}
+
+*Protection*: normal
+
+*Remarks*:
+
+=== Update Notification
+This service stores a modified notification by inserting a new version of it into the database.  It returns the same
+entity with a new version number and the user modifications.
+
+*URL:* /notifications/update
+
+*Method:* POST
+
+*Request-Headers*:
+
+* Authorization – Existing JWT token
+
+*Consumes*: application/json
+
+*Request*:
+[source,json]
+----
+{
+    "id": 27,
+    "incidentId": 18,
+    "version": 1,
+    "selected": false,
+    "status": "in Arbeit",
+    "notificationText": "Meldung X:Y",
+    "freeText": " Meldung ergänzt um diesen Text ",
+    "freeTextExtended": "extended",
+    "responsibilityForwarding": "",
+    "responsibilityControlPoint": "Abteilung 4",
+    "createdDate": "2017-03-09T15:27:17",
+    "creator": "MasterAndCreator",
+    "modDate": "2017-03-09T15:27:17",
+    "modUser": "_fd",
+    "fkRefBranch": 1,
+    "fkRefNotificationStatus": 2
+}
+----
+{blank}
+
+*Produces*: application/json
+
+*Response*:
+[source,json]
+----
+{
+    "id": 31,
+    "incidentId": 18,
+    "version": 2,
+    "selected": false,
+    "status": "in Arbeit",
+    "notificationText": "Meldung X:Y",
+    "freeText": "Meldung ergänzt um diesen Text",
+    "freeTextExtended": "extended",
+    "responsibilityForwarding": "",
+    "responsibilityControlPoint": "Abteilung 4",
+    "createdDate": "2017-03-09T15:27:17",
+    "creator": "MasterAndCreator",
+    "modDate": "2017-03-09T15:27:17",
+    "modUser": "_fd",
+    "fkRefBranch": 1,
+    "fkRefNotificationStatus": 2
+}
+----
+{blank}
+
+*Throws*: BtbLocked (Http StatusCode: 423) : Is thrown if the notification status is locked and the service is called
+
+*Protection*: normal
+
+*Remarks*:
+
+=== Get Notification
+This retrieves a notification from the database.
+
+*URL:* /notification/{id}
+
+*Method:* GET
+
+*Path-Parameter*: id
+
+* The primary key of the notification
+
+*Request-Headers*:
+
+* Authorization – Existing JWT token
+
+*Produces*: application/json
+
+*Response*:
+[source,json]
+----
+{
+    "id": 27,
+    "incidentId": 18,
+    "version": 2,
+    "selected": false,
+    "status": "in Arbeit",
+    "notificationText": "Meldung X:Y",
+    "freeText": "Meldung ergänzt um diesen Text",
+    "freeTextExtended": "extended",
+    "responsibilityForwarding": "",
+    "responsibilityControlPoint": "Abteilung 4",
+    "createdDate": "2017-03-09T15:27:17",
+    "creator": "MasterAndCreator",
+    "modDate": "2017-03-09T15:27:17",
+    "modUser": "_fd",
+    "fkRefBranch": 1,
+    "fkRefNotificationStatus": 2
+}
+----
+{blank}
+
+*Protection*: normal
+
+*Remarks*:
+
+=== Get Notifications
+This service retrieves a list of notifications from the database. The selection is based on the given filter-object.
+With no filter value specified, the collection returned contains all active notifications. With filter value(s) set, only
+notifications matching the filter values are returned.
+
+The following list explains the available filter values:
+
+* The filter-values “dateFrom” and “dateTo” are compared against the “begin_date” of the notifications (closed interval).
+* The filter values in "responsibilityFilterList" are compared against the id of the notifications.
+* If the boolean filter value "historicalFlag" is "true" historical notifcations are returned.
+* If the boolean filter value is null or "false", active notifications are returned.
+* With historicalFlag set, the corresponding "shiftChangeTransactionId must also be set to obtain a valid result. In this
+case, other filter values do not make sense and are not evaluated.
+
+*URL:* /notifications/{listType}
+
+*Method:* POST
+
+*Path-Parameters*:
+
+* listType - The type of the list for which the data will be loaded: "PAST", "OPEN", "FUTURE"
+
+*Request-Headers*:
+
+* Authorization – Existing JWT token
+
+
+*Consumes*: application/json
+
+*Request*:
+[source,json]
+----
+{
+  "dateFrom": "2017-03-09T15:27:17.666Z",
+  "dateTo": "2017-04-09T15:27:17.666Z",
+    "responsibilityFilterList": [
+                                    1, 6
+                                ]
+}
+----
+{blank}
+
+*Produces*: application/json
+
+*Response*:
+[source,json]
+----
+[
+  {
+    "id": 1161,
+    "incidentId": 337,
+    "version": 10,
+    "selected": false,
+    "status": "in Arbeit",
+    "beginDate": "2017-05-24T07:11:00.000Z",
+    "notificationText": "UW4 Wartungsarbeiten LSA",
+    "freeText": "Hr. xxx vor Ort",
+    "freeTextExtended": "Hr.yyy ist auch vor Ort",
+    "responsibilityForwarding": "Müller",
+    "responsibilityControlPoint": "Administrator",
+    "expectedFinishDate": "2017-05-24T14:00:00.000Z",
+    "createUser": "admin",
+    "createDate": "2017-05-24T07:03:54.429Z",
+    "modDate": "2017-08-18T14:15:10.355Z",
+    "modUser": "admin",
+    "fkRefBranch": 1,
+    "fkRefNotificationStatus": 2,
+    "fkRefGridTerritory": 1,
+    "adminFlag": false
+  },
+  {
+    "id": 601,
+    "incidentId": 566,
+    "version": 8,
+    "selected": false,
+    "status": "erledigt",
+    "beginDate": "2017-06-17T11:37:00.000Z",
+    "notificationText": "FD #5",
+    "freeText": "fd",
+    "freeTextExtended": "",
+    "responsibilityControlPoint": "Administrator",
+    "expectedFinishDate": "2017-06-19T23:01:00.000Z",
+    "finishedDate": "2017-06-19T13:27:11.333Z",
+    "createUser": "admin",
+    "createDate": "2017-06-19T11:38:17.369Z",
+    "modDate": "2017-06-19T13:27:12.598Z",
+    "modUser": "admin",
+    "fkRefBranch": 1,
+    "fkRefNotificationStatus": 3,
+    "fkRefGridTerritory": 1,
+    "adminFlag": false
+  }
+]
+----
+{blank}
+
+*Request for historical notifications*:
+[source,json]
+----
+{
+ "historicalFlag": true,
+ "shiftChangeTransactionId": 33
+ }
+----
+{blank}
+
+*Produces*: application/json
+
+*Response*:
+[source,json]
+----
+[
+  {
+    "id": 1191,
+    "incidentId": 750,
+    "version": 11,
+    "selected": false,
+    "status": "erledigt",
+    "beginDate": "2017-07-25T22:00:00.000Z",
+    "notificationText": "c--d ddddddd",
+    "responsibilityControlPoint": "Max Mustermann",
+    "expectedFinishDate": "2017-07-27T22:00:00.000Z",
+    "finishedDate": "2017-07-31T07:24:43.959Z",
+    "createUser": "admin",
+    "createDate": "2017-07-24T12:20:13.232Z",
+    "modDate": "2017-08-21T11:24:32.855Z",
+    "modUser": "max",
+    "fkRefBranch": 1,
+    "fkRefNotificationStatus": 3,
+    "fkRefGridTerritory": 2,
+    "adminFlag": false
+  },
+  {
+    "id": 994,
+    "incidentId": 825,
+    "version": 6,
+    "selected": false,
+    "status": "erledigt",
+    "beginDate": "2017-08-07T09:41:12.082Z",
+    "notificationText": "dddd",
+    "freeText": "53w5",
+    "freeTextExtended": "terterwrew",
+    "responsibilityControlPoint": "Administrator",
+    "finishedDate": "2017-08-08T10:19:36.001Z",
+    "createUser": "admin",
+    "createDate": "2017-08-07T09:41:55.048Z",
+    "modDate": "2017-08-08T10:19:37.454Z",
+    "modUser": "admin",
+    "fkRefBranch": 1,
+    "fkRefNotificationStatus": 3,
+    "fkRefGridTerritory": 2,
+    "adminFlag": false
+  }
+]
+----
+{blank}
+
+*Protection*: normal
+
+*Remarks*:
+
+
+
+=== Get Notifications by Incident-ID
+This service retrieves a list of notifications from the database. All the returned
+notifications are all versions of the given incident-ID. The sort-order is version descending.
+
+
+*URL:* /notificationsByIncident/{incidentId}
+
+*Method:* GET
+
+*Path-Parameters*:
+
+* incidentId - The incident-ID of all the versions to be returned
+
+*Request-Headers*:
+
+* Authorization – Existing JWT token
+
+
+*Produces*: application/json
+
+*Response*:
+[source,json]
+----
+[
+  {
+    "id": 199,
+    "incidentId": 2,
+    "version": 3,
+    "selected": false,
+    "status": "offen",
+    "beginDate": "2017-05-14T12:30:00",
+    "notificationText": "sfg",
+    "freeText": "freetext11",
+    "freeTextExtended": "freetext_extended",
+    "reminderDate": "2017-05-19T18:05:00",
+    "createUser": "Creator",
+    "createDate": "2017-05-15T14:30:09",
+    "modDate": "2017-05-18T14:21:48",
+    "modUser": "admin",
+    "fkRefBranch": 1,
+    "fkRefNotificationStatus": 1
+  },
+  {
+    "id": 171,
+    "incidentId": 2,
+    "version": 2,
+    "selected": false,
+    "status": "offen",
+    "beginDate": "2017-05-14T12:30:00",
+    "notificationText": "sfg",
+    "freeText": "freetext11_old",
+    "freeTextExtended": "freetext_extended",
+    "reminderDate": "2017-05-19T18:05:00",
+    "createUser": "Creator",
+    "createDate": "2017-05-15T14:30:09",
+    "modDate": "2017-05-18T13:21:48",
+    "modUser": "admin",
+    "fkRefBranch": 1,
+    "fkRefNotificationStatus": 1
+  },
+  {
+    "id": 101,
+    "incidentId": 2,
+    "version": 1,
+    "selected": false,
+    "status": "offen",
+    "beginDate": "2017-05-14T12:30:00",
+    "notificationText": "sfg",
+    "freeText": "freetext11_old_older",
+    "freeTextExtended": "freetext_extended",
+    "reminderDate": "2017-05-19T18:05:00",
+    "createUser": "Creator",
+    "createDate": "2017-05-15T14:30:09",
+    "modDate": "2017-05-18T12:21:48",
+    "modUser": "admin",
+    "fkRefBranch": 1,
+    "fkRefNotificationStatus": 1
+  },
+]
+----
+{blank}
+
+*Protection*: normal
+
+*Remarks*:
+
+
+=== Get Notifications With Reminder
+This service retrieves a list of notifications from the database. The selection is based on the given filter-object.
+With no filter value specified, the collection returned contains all active open and in progress notifications. With filter value(s) set, only
+notifications matching the filter values are returned.
+
+The following list explains the available filter values:
+
+* The filter-value “reminderDate” is compared against the “reminder_date” of the notifications.
+* The filter values in "responsibilityFilterList" are compared against the id of the notifications.
+
+*URL:* /currentReminders
+
+*Method:* POST
+
+*Path-Parameter*: none
+
+*Request-Headers*:
+
+* Authorization – Existing JWT token
+
+*Consumes*: application/json
+
+*Request*:
+[source,json]
+----
+{
+    "reminderDate":"2017-08-30T09:00:23.538Z",
+    "responsibilityFilterList":
+                                [
+                                    1, 2, 3
+                                ]
+}
+----
+{blank}
+
+*Produces*: application/json
+
+*Response*:
+[source,json]
+----
+[
+     {
+          "id": 1218,
+          "incidentId": 572,
+          "version": 9,
+          "selected": false,
+          "status": "offen",
+          "beginDate": "2017-06-19T11:50:19.096Z",
+          "notificationText": "FD #9",
+          "freeText": "fd_",
+          "freeTextExtended": "",
+          "responsibilityControlPoint": "Administrator",
+          "reminderDate": "2017-08-22T22:00:00.000Z",
+          "createUser": "admin",
+          "createDate": "2017-06-19T11:50:37.391Z",
+          "modDate": "2017-08-25T08:57:51.890Z",
+          "modUser": "admin",
+          "fkRefBranch": 1,
+          "fkRefNotificationStatus": 1,
+          "fkRefGridTerritory": 1,
+          "adminFlag": false
+     },
+     {
+          "id": 1222,
+          "incidentId": 881,
+          "version": 3,
+          "selected": false,
+          "status": "offen",
+          "beginDate": "2017-08-07T14:48:46.873Z",
+          "notificationText": "ich bin eine anweisung mit dem admin flag",
+          "freeText": "sfas",
+          "freeTextExtended": "safas",
+          "responsibilityControlPoint": "Administrator",
+          "reminderDate": "2017-08-29T22:00:00.000Z",
+          "createUser": "admin",
+          "createDate": "2017-08-07T14:49:09.598Z",
+          "modDate": "2017-08-30T07:47:45.021Z",
+          "modUser": "admin",
+          "fkRefNotificationStatus": 1,
+          "adminFlag": true
+     }
+]
+----
+{blank}
+
+*Protection*: normal
+
+*Remarks*:
+
+
+=== Get Historical Shift-Change List
+This service retrieves a list of documented shift changes (who transferred/took the shift including the timestamp)
+where the list can be narrowed by start date and end date.
+
+
+*URL:* /shiftChangeList
+
+*Method:* POST
+
+*Path-Parameters*: none
+
+*Request-Headers*:
+
+* Authorization – Existing JWT token
+
+*Consumes*: application/json
+
+*Request*:
+[source,json]
+----
+{
+  "transferDateFrom": "2017-06-01T15:27:17.666Z",
+  "transferDateTo": "2017-08-09T15:27:17.666Z",
+}
+----
+{blank}
+
+*Produces*: application/json
+
+*Response*:
+[source,json]
+----
+[
+{
+  "startDate": "2017-06-01T15:27:17.666Z",
+  "endDate": "2017-08-09T15:27:17.666Z",
+  "historicalResponsibilities": [
+    {
+      "id": 2,
+      "responsibleUser": "hugo",
+      "formerResponsibleUser": "max",
+      "transferDate": "2017-08-04T08:53:27.502Z",
+      "transactionId": 1,
+      "createDate": "2017-06-19T12:34:35.881Z",
+      "createUser": "admin",
+      "modDate": "2017-08-04T08:53:27.502Z",
+      "modUser": "hugo",
+      "refGridTerritory": {
+        "id": 1,
+        "fkRefMaster": 1,
+        "description": "Mannheim",
+        "name": "MA"
+      },
+      "refBranch": {
+        "id": 3,
+        "name": "F",
+        "description": "Fernwärme"
+      }
+    },
+    {
+      "id": 10,
+      "responsibleUser": "max",
+      "formerResponsibleUser": "admin",
+      "transferDate": "2017-08-08T13:50:10.862Z",
+      "transactionId": 3,
+      "createDate": "2017-06-19T12:34:35.881Z",
+      "createUser": "admin",
+      "modDate": "2017-08-08T13:50:10.861Z",
+      "modUser": "max",
+      "refGridTerritory": {
+        "id": 1,
+        "fkRefMaster": 1,
+        "description": "Mannheim",
+        "name": "MA"
+      },
+      "refBranch": {
+        "id": 3,
+        "name": "F",
+        "description": "Fernwärme"
+      }
+    },
+    {
+      "id": 11,
+      "responsibleUser": "max",
+      "formerResponsibleUser": "admin",
+      "transferDate": "2017-08-08T13:50:10.862Z",
+      "transactionId": 3,
+      "createDate": "2017-07-23T22:00:00.000Z",
+      "createUser": "max",
+      "modDate": "2017-08-08T13:50:10.861Z",
+      "modUser": "max",
+      "refGridTerritory": {
+        "id": 3,
+        "fkRefMaster": 3,
+        "description": "Darmstadt",
+        "name": "DA"
+      },
+      "refBranch": {
+        "id": 1,
+        "name": "S",
+        "description": "Strom"
+      }
+    }
+]
+----
+{blank}
+
+*Protection*: normal
+
+*Remarks*:
+
+=== Receive Users
+This service returns an array of all users.
+
+*URL:* /users
+
+*Method:* GET
+
+*Request-Headers*:
+
+* Authorization – Existing JWT token
+
+*Produces*: application/json
+
+*Response*:
+[source,json]
+----
+[
+    {
+        "id": 1,
+        "selected": false,
+        "username": "Mustermann",
+        "password": "Mustermann",
+        "name": "Max Mustermann",
+        "specialUser": false
+    },
+    {
+        "id": 2,
+        "selected": false,
+        "username": "admin",
+        "password": "admin",
+        "name": "Administrator",
+        "specialUser": true
+    },
+    {
+        "id": 3,
+        "selected": false,
+        "username": "Otto",
+        "password": "Otto",
+        "name": "Otto Normalverbraucher",
+        "specialUser": false
+    }
+]
+----
+{blank}
+
+*Protection*: normal
+
+*Remarks*:
+
+=== Plan Responsibility-Transfer
+This service prepares the responsibilities-transfer to another user. It returns an OK status
+in case of success. If the responsibilities of the current user have changed in the meantime, the updated data is returned.
+
+*URL:* /planResponsibilities
+
+*Method:* POST
+
+*Request-Headers*:
+
+* Authorization – Existing JWT token
+
+*Consumes*: application/json
+
+*Request*:
+[source,json]
+----
+[
+    {
+        "gridTerritoryDescription": "Mannheim",
+        "responsibilityList": [
+            {
+                "id": 1,
+                "responsibleUser": "admin",
+                "newResponsibleUser": "Otto",
+                "branchName": "S",
+                "isActive": true
+            },
+            {
+                "id": 2,
+                "responsibleUser": "admin",
+                "newResponsibleUser": "Otto",
+                "branchName": "G",
+                "isActive": true
+            }
+        ]
+    },
+    {
+        "gridTerritoryDescription": "Offenbach",
+        "responsibilityList": [
+            {
+                "id": 4,
+                "responsibleUser": "admin",
+                "newResponsibleUser": "Otto",
+                "branchName": "G",
+                "isActive": true
+            }
+        ]
+    }
+]
+----
+{blank}
+
+*Produces*: application/json
+
+*Response*:
+[source,json]
+----
+{
+    "ret": "OK"
+}
+----
+{blank}
+
+*Protection*: normal
+
+*Remarks*:
+
+=== Confirm Responsibility-Transfer
+This service is used to confirm the planned responsibilities for the authenticated session user. It returns an OK status in case of success. If the
+responsibilities of the current user have changed in the meantime, the updated data is returned.
+
+*URL:* /confirmResponsibilities
+
+*Method:* POST
+
+*Request-Headers*:
+
+* Authorization – Existing JWT token
+
+*Consumes*: application/json
+
+*Request*:
+[source,json]
+----
+[
+    {
+        "gridTerritoryDescription": "Mannheim",
+        "responsibilityList": [
+            {
+                "id": 1,
+                "responsibleUser": "admin",
+                "newResponsibleUser": "Otto",
+                "branchName": "S",
+                "isActive": true
+            },
+            {
+                "id": 2,
+                "responsibleUser": "admin",
+                "newResponsibleUser": "Otto",
+                "branchName": "G",
+                "isActive": true
+            }
+        ]
+    },
+    {
+        "gridTerritoryDescription": "Offenbach",
+        "responsibilityList": [
+            {
+                "id": 4,
+                "responsibleUser": "admin",
+                "newResponsibleUser": "Otto",
+                "branchName": "G",
+                "isActive": true
+            }
+        ]
+    }
+]
+----
+{blank}
+
+*Produces*: application/json
+
+*Response*:
+[source,json]
+----
+{
+    "ret": "OK"
+}
+----
+{blank}
+
+*Protection*: normal
+
+*Remarks*:
+
+=== Receive Assigned User Suggestions
+This service returns user suggestions for the 'Responsibility Forwarding' input field.
+
+*URL:* /assignedUserSuggestions
+
+*Method:* GET
+
+*Request-Headers*:
+
+* Authorization – Existing JWT token
+
+*Produces*: application/json
+
+*Response*:
+[source,json]
+----
+[
+    "Hermann Meister",
+    "Hugo Normalverbraucher",
+    "Max Mustermann",
+    "Michael Müller"
+]
+----
+{blank}
+
+*Protection*: normal
+
+*Remarks*:
+
+=== Get SearchResults
+This service obtains a search filter with different search criteria. The service retrieves a list of those notifications from the database which match all search criteria. 
+
+The following search criteria are available to select/deselect:
+
+* Search string: Any string literal whose occurence will be searched in notification text, free text and extended free text column.
+  The input is case-insensitive.
+* Responsibility/forwarded to: Any string literal whose occurence will be searched in responsibility forwarding column.
+  The input is case-insensitive.
+* Branch: All branches or only one special branch can be included in search, default: ALL
+* Grid Territory: All grid territories or only one special grid territory can be included in search, default: ALL
+* Status: A checkbox for each status to be included into search, default: all checkboxes are selected
+* Fast search: If selected, only entries created or changed within the last two hundred days are included in search, default: selected
+
+*URL:* /getSearchResults
+
+*Method:* POST
+
+*Request-Headers*:
+
+* Authorization – Existing JWT token
+
+*Consumes*: application/json
+
+*Request*:
+[source,json]
+----
+{
+"searchString": "TAriflichen",
+"responsibilityForwarding": "",
+"statusOpenSelection": true,
+"statusInWorkSelection": true,
+"statusDoneSelection": true,
+"statusClosedSelection": false,
+"fkRefBranch": 1,
+ "fkRefGridTerritory": 2,
+  "fastSearchSelected": true
+}
+----
+{blank}
+
+*Produces*: application/json
+
+*Response*:
+[source,json]
+----
+[
+  {
+    "id": 1074,
+    "incidentId": 966,
+    "version": 28,
+    "selected": false,
+    "status": "erledigt",
+    "beginDate": "2017-08-08T08:25:26.920Z",
+    "notificationText": "Anweisung zur Einhaltung der Arbeitsschutzrichtlinien",
+    "freeText": "Änderung Bereich dazu!",
+    "freeTextExtended": "gilt nur für die tariflichen Mitarbeiter",
+    "responsibilityForwarding": "Hermann Meister",
+    "responsibilityControlPoint": "Administrator",
+    "createUser": "admin",
+    "createDate": "2017-08-08T08:26:03.140Z",
+    "modDate": "2017-08-09T17:02:08.049Z",
+    "modUser": "admin",
+    "fkRefBranch": 1,
+    "fkRefNotificationStatus": 3,
+    "fkRefGridTerritory": 2,
+    "adminFlag": false
+  },
+  {
+    "id": 1064,
+    "incidentId": 966,
+    "version": 19,
+    "selected": false,
+    "status": "erledigt",
+    "beginDate": "2017-08-08T08:25:26.920Z",
+    "notificationText": "Anweisung für alle tariflichen Mitarbeiter",
+    "freeText": "Änderung Bereich dazu!",
+    "freeTextExtended": "ddddddd",
+    "responsibilityForwarding": "Hermann Meister",
+    "responsibilityControlPoint": "Administrator",
+    "createUser": "admin",
+    "createDate": "2017-08-08T08:26:03.140Z",
+    "modDate": "2017-08-09T12:58:13.568Z",
+    "modUser": "admin",
+    "fkRefBranch": 1,
+    "fkRefNotificationStatus": 3,
+    "fkRefGridTerritory": 2,
+    "adminFlag": false
+  }
+]
+----
+{blank}
+
+*Request for historical notifications*:
+[source,json]
+----
+{
+ "historicalFlag": true,
+ "shiftChangeTransactionId": 33
+ }
+----
+{blank}
+
+*Produces*: application/json
+
+*Response*:
+[source,json]
+----
+[
+  {
+    "id": 1191,
+    "incidentId": 750,
+    "version": 11,
+    "selected": false,
+    "status": "erledigt",
+    "beginDate": "2017-07-25T22:00:00.000Z",
+    "notificationText": "c--d ddddddd",
+    "responsibilityControlPoint": "Max Mustermann",
+    "expectedFinishDate": "2017-07-27T22:00:00.000Z",
+    "finishedDate": "2017-07-31T07:24:43.959Z",
+    "createUser": "admin",
+    "createDate": "2017-07-24T12:20:13.232Z",
+    "modDate": "2017-08-21T11:24:32.855Z",
+    "modUser": "max",
+    "fkRefBranch": 1,
+    "fkRefNotificationStatus": 3,
+    "fkRefGridTerritory": 2,
+    "adminFlag": false
+  },
+  {
+    "id": 994,
+    "incidentId": 825,
+    "version": 6,
+    "selected": false,
+    "status": "erledigt",
+    "beginDate": "2017-08-07T09:41:12.082Z",
+    "notificationText": "dddd",
+    "freeText": "53w5",
+    "freeTextExtended": "terterwrew",
+    "responsibilityControlPoint": "Administrator",
+    "finishedDate": "2017-08-08T10:19:36.001Z",
+    "createUser": "admin",
+    "createDate": "2017-08-07T09:41:55.048Z",
+    "modDate": "2017-08-08T10:19:37.454Z",
+    "modUser": "admin",
+    "fkRefBranch": 1,
+    "fkRefNotificationStatus": 3,
+    "fkRefGridTerritory": 2,
+    "adminFlag": false
+  }
+]
+----
+{blank}
+
+*Protection*: normal
+
+*Remarks*:
+
+=== Get Notifications
+This service retrieves a list of notifications from the database. The selection is based on the given filter-object.
+With no filter value specified, the collection returned contains all active notifications. With filter value(s) set, only
+notifications matching the filter values are returned.
+
+The following list explains the available filter values:
+
+* The filter-values “dateFrom” and “dateTo” are compared against the “begin_date” of the notifications (closed interval).
+* The filter values in "responsibilityFilterList" are compared against the id of the notifications.
+* If the boolean filter value "historicalFlag" is "true" historical notifcations are returned.
+* If the boolean filter value is null or "false", active notifications are returned.
+* With historicalFlag set, the corresponding "shiftChangeTransactionId must also be set to obtain a valid result. In this
+case, other filter values do not make sense and are not evaluated.
+
+*URL:* /notifications/{listType}
+
+*Method:* POST
+
+*Path-Parameters*:
+
+* listType - The type of the list for which the data will be loaded: "PAST", "OPEN", "FUTURE"
+
+*Request-Headers*:
+
+* Authorization – Existing JWT token
+
+*Consumes*: application/json
+
+*Request*:
+[source,json]
+----
+{
+  "dateFrom": "2017-03-09T15:27:17.666Z",
+  "dateTo": "2017-04-09T15:27:17.666Z",
+    "responsibilityFilterList": [
+                                    1, 6
+                                ]
+}
+----
+{blank}
+
+*Produces*: application/json
+
+*Response*:
+[source,json]
+----
+[
+  {
+    "id": 1161,
+    "incidentId": 337,
+    "version": 10,
+    "selected": false,
+    "status": "in Arbeit",
+    "beginDate": "2017-05-24T07:11:00.000Z",
+    "notificationText": "UW4 Wartungsarbeiten LSA",
+    "freeText": "Hr. xxx vor Ort",
+    "freeTextExtended": "Hr.yyy ist auch vor Ort",
+    "responsibilityForwarding": "Müller",
+    "responsibilityControlPoint": "Administrator",
+    "expectedFinishDate": "2017-05-24T14:00:00.000Z",
+    "createUser": "admin",
+    "createDate": "2017-05-24T07:03:54.429Z",
+    "modDate": "2017-08-18T14:15:10.355Z",
+    "modUser": "admin",
+    "fkRefBranch": 1,
+    "fkRefNotificationStatus": 2,
+    "fkRefGridTerritory": 1,
+    "adminFlag": false
+  },
+  {
+    "id": 601,
+    "incidentId": 566,
+    "version": 8,
+    "selected": false,
+    "status": "erledigt",
+    "beginDate": "2017-06-17T11:37:00.000Z",
+    "notificationText": "FD #5",
+    "freeText": "fd",
+    "freeTextExtended": "",
+    "responsibilityControlPoint": "Administrator",
+    "expectedFinishDate": "2017-06-19T23:01:00.000Z",
+    "finishedDate": "2017-06-19T13:27:11.333Z",
+    "createUser": "admin",
+    "createDate": "2017-06-19T11:38:17.369Z",
+    "modDate": "2017-06-19T13:27:12.598Z",
+    "modUser": "admin",
+    "fkRefBranch": 1,
+    "fkRefNotificationStatus": 3,
+    "fkRefGridTerritory": 1,
+    "adminFlag": false
+  }
+]
+----
+{blank}
+
+*Request for historical notifications*:
+[source,json]
+----
+{
+ "historicalFlag": true,
+ "shiftChangeTransactionId": 33
+ }
+----
+{blank}
+
+*Produces*: application/json
+
+*Response*:
+[source,json]
+----
+[
+  {
+    "id": 1191,
+    "incidentId": 750,
+    "version": 11,
+    "selected": false,
+    "status": "erledigt",
+    "beginDate": "2017-07-25T22:00:00.000Z",
+    "notificationText": "c--d ddddddd",
+    "responsibilityControlPoint": "Max Mustermann",
+    "expectedFinishDate": "2017-07-27T22:00:00.000Z",
+    "finishedDate": "2017-07-31T07:24:43.959Z",
+    "createUser": "admin",
+    "createDate": "2017-07-24T12:20:13.232Z",
+    "modDate": "2017-08-21T11:24:32.855Z",
+    "modUser": "max",
+    "fkRefBranch": 1,
+    "fkRefNotificationStatus": 3,
+    "fkRefGridTerritory": 2,
+    "adminFlag": false
+  },
+  {
+    "id": 994,
+    "incidentId": 825,
+    "version": 6,
+    "selected": false,
+    "status": "erledigt",
+    "beginDate": "2017-08-07T09:41:12.082Z",
+    "notificationText": "dddd",
+    "freeText": "53w5",
+    "freeTextExtended": "terterwrew",
+    "responsibilityControlPoint": "Administrator",
+    "finishedDate": "2017-08-08T10:19:36.001Z",
+    "createUser": "admin",
+    "createDate": "2017-08-07T09:41:55.048Z",
+    "modDate": "2017-08-08T10:19:37.454Z",
+    "modUser": "admin",
+    "fkRefBranch": 1,
+    "fkRefNotificationStatus": 3,
+    "fkRefGridTerritory": 2,
+    "adminFlag": false
+  }
+]
+----
+{blank}
+
+*Protection*: normal
+
+*Remarks*:
+
+
+
+=== Get Search Results
+This service obtains a search string combined with a limited number of search options in a search filter. The service retrieves those notifications from the database
+which fulfill the given search criteria within the search filter. 
+Each search string typed in is case-insensitive. The sort order of the result tuples is as follows: branch, incident id (descending), version (descending), grid territory, begin date. 
+
+The search filter obtained by the web service consists of the subsequent criteria:
+
+* search string: The string whose occurence is searched in notification text, free text and extended free text, default: null
+* responsibility/forwarded to: an (additional) search string to be searched in the field responsibility/forwarded, default: null
+* branch: Search in all branches or specify one concrete branch, default: all
+* grid territory: Search in all grid territories or specify one concrete grid territory, default: all
+* status: each defined status (open, in work, finished, closed) can be (de)selected, default: all status selected
+* fast search: if selected, only entries created or modified during the last two hundred days are considered in the search, default: selected
+
+*URL:* /searchResults
+
+*Method:* POST
+
+*Path-Parameters*:
+
+-
+
+*Request-Headers*:
+
+* Authorization – Existing JWT token
+
+*Consumes*: application/json
+
+*Request*:
+[source,json]
+----
+{
+	"searchString": "TAriflichen",
+	"responsibilityForwarding": "",
+	"statusOpenSelection": true,
+	"statusInWorkSelection": true,
+	"statusDoneSelection": true,
+	"statusClosedSelection": false,
+	"fkRefBranch": 1,
+	"fkRefGridTerritory": 2,
+	"fastSearchSelected": true
+}
+----
+{blank}
+
+*Produces*: application/json
+
+*Response*:
+[source,json]
+----
+[
+  {
+    "id": 1074,
+    "incidentId": 966,
+    "version": 28,
+    "selected": false,
+    "status": "erledigt",
+    "beginDate": "2017-08-08T08:25:26.920Z",
+    "notificationText": "Anweisung zur Einhaltung der Arbeitsschutzrichtlinien",
+    "freeText": "Änderung Bereich dazu!",
+    "freeTextExtended": "gilt nur für die tariflichen Mitarbeiter",
+    "responsibilityForwarding": "Hermann Meister",
+    "responsibilityControlPoint": "Administrator",
+    "createUser": "admin",
+    "createDate": "2017-08-08T08:26:03.140Z",
+    "modDate": "2017-08-09T17:02:08.049Z",
+    "modUser": "admin",
+    "fkRefBranch": 1,
+    "fkRefNotificationStatus": 3,
+    "fkRefGridTerritory": 2,
+    "adminFlag": false
+  },
+  {
+    "id": 1064,
+    "incidentId": 966,
+    "version": 19,
+    "selected": false,
+    "status": "erledigt",
+    "beginDate": "2017-08-08T08:25:26.920Z",
+    "notificationText": "Anweisung für alle tariflichen Mitarbeiter",
+    "freeText": "Änderung Bereich dazu!",
+    "freeTextExtended": "ddddddd",
+    "responsibilityForwarding": "Hermann Meister",
+    "responsibilityControlPoint": "Administrator",
+    "createUser": "admin",
+    "createDate": "2017-08-08T08:26:03.140Z",
+    "modDate": "2017-08-09T12:58:13.568Z",
+    "modUser": "admin",
+    "fkRefBranch": 1,
+    "fkRefNotificationStatus": 3,
+    "fkRefGridTerritory": 2,
+    "adminFlag": false
+  }
+]
+----
+{blank}
+
+*Protection*: normal
+
+*Remarks*:
+
+=== Get Import Files
+This service retrieves a list of files which are available for import. These files should be placed in the following path:
+[source,text]
+----
+C:/FilesToImport
+----
+{blank}
+
+
+It returns the following informations about the file:
+
+* Name
+* Creation date
+* Creator name
+* Size
+* Type
+
+*URL:* /getImportFiles
+
+*Method:* GET
+
+*Path-Parameter*:
+
+*Request-Headers*:
+
+* Authorization – Existing JWT token
+
+*Produces*: application/json
+
+*Response*:
+[source,json]
+----
+[
+    {
+        "fileName": "test.csv",
+        "creationDate": "2017-09-25T12:00:01.635887Z",
+        "creator": "admin",
+        "type": "csv",
+        "size": 5600,
+    },
+    {
+        "fileName": "test_file.txt",
+        "creationDate": "2017-09-23T11:00:01.635887Z",
+        "creator": "max",
+        "type": "txt",
+        "size": 8000,
+    }
+]
+----
+{blank}
+
+*Protection*: normal
+
+*Remarks*:
+
+
+=== Get The Content of a File
+This service retrieves the content of a file. The file should be a text file (.txt, .csv etc)
+and the informations will be retrieved from the 9th row. The file is defined like this
+
+[source,text]
+----
+                                                            PROTOKOLL_STROM
+                                              08.09.2017 10:10:51  -  08.09.2017 10:22:04
+
+Betriebsart: Prozessführung
+Modus      : Spalten-Filtern
+Verknüpfung: --------
+
+.............MG.........................................................................................................................
+20:19:51,425 MG Test text          Mannheim Gas
+ENDE
+
+08.09.2017 10:23:34
+----
+{blank}
+
+This file has to be placed in a configured path accessible by the elogbook backend server.
+
+It returns the following information which extracted from the file:
+
+* Territory name
+* Branch name
+* Description text
+
+*URL:* /importFile
+
+*Method:* GET
+
+*Path-Parameter*:
+
+*Request-Headers*:
+
+* Authorization – Existing JWT token
+
+*Produces*: application/json
+
+*Response*:
+[source,json]
+----
+{
+    "branchName": "W",
+    "gridTerritoryName": "MA",
+    "notificationText": "This is a simple test text"
+}
+----
+{blank}
+
+*Protection*: normal
+
+*Remarks*:
+
+
+=== Delete Imported File
+This service deletes a file for a given file name. If there is a file with this name it returns true and deletes
+this file. Else it returns false.
+
+*URL:* /deleteImportedFiles/{fileName}
+
+*Method:* DELETE
+
+*Path-Parameter*: fileName - The name of the file that will be deleted
+
+*Request-Headers*:
+
+* Authorization – Existing JWT token
+
+*Produces*: application/json
+
+*Response*:
+[source,json]
+----
+{
+    true
+}
+----
+{blank}
+
+*Protection*: normal
+
+*Remarks*:
+
+
diff --git a/src/main/java/org/eclipse/openk/elogbook/auth2/model/JwtAccount.java b/src/main/java/org/eclipse/openk/elogbook/auth2/model/JwtAccount.java
new file mode 100644
index 0000000..c702abb
--- /dev/null
+++ b/src/main/java/org/eclipse/openk/elogbook/auth2/model/JwtAccount.java
@@ -0,0 +1,12 @@
+package org.eclipse.openk.elogbook.auth2.model;
+
+import java.util.List;
+
+public class JwtAccount {
+    private List<String> roles;
+
+    public List<String> getRoles() {
+        return roles;
+    }
+    public void setRoles(List<String> roles) { this.roles = roles; }
+}
diff --git a/src/main/java/org/eclipse/openk/elogbook/auth2/model/JwtHeader.java b/src/main/java/org/eclipse/openk/elogbook/auth2/model/JwtHeader.java
new file mode 100644
index 0000000..d97a712
--- /dev/null
+++ b/src/main/java/org/eclipse/openk/elogbook/auth2/model/JwtHeader.java
@@ -0,0 +1,14 @@
+package org.eclipse.openk.elogbook.auth2.model;
+
+public class JwtHeader {
+    private String alg;
+    private String typ;
+    private String kid;
+
+    public String getAlg() { return alg; }
+    public void setAlg(String alg) { this.alg = alg; }
+    public String getTyp() { return typ; }
+    public void setTyp(String typ) { this.typ = typ; }
+    public String getKid() { return kid; }
+    public void setKid(String kid) { this.kid = kid; }
+}
diff --git a/src/main/java/org/eclipse/openk/elogbook/auth2/model/JwtPayload.java b/src/main/java/org/eclipse/openk/elogbook/auth2/model/JwtPayload.java
new file mode 100644
index 0000000..7efff87
--- /dev/null
+++ b/src/main/java/org/eclipse/openk/elogbook/auth2/model/JwtPayload.java
@@ -0,0 +1,99 @@
+package org.eclipse.openk.elogbook.auth2.model;
+
+import com.fasterxml.jackson.annotation.JsonProperty;
+import java.util.List;
+
+public class JwtPayload {
+
+    //No Sonar because variables are wrong due to jwt definition
+
+    private String jti;
+    private long exp;
+    private long nbf;
+    private long iat;
+    private String iss;
+    private String aud;
+    private String sub;
+    private String typ;
+    private String azp;
+    private String nonce;
+    private Integer auth_time; //NOSONAR
+    private String session_state; //NOSONAR
+    private String acr;
+
+    @JsonProperty("allowed-origins")
+    private List<String> allowedOrigins;
+    private JwtRealmAccess realm_access; //NOSONAR
+    private JwtResourceAccess resource_access; //NOSONAR
+
+    private String name;
+    private String preferred_username; //NOSONAR
+    private String given_name; //NOSONAR
+    private String family_name; //NOSONAR
+
+    public String getJti() { return jti; }
+    public void setJti(String jti) { this.jti = jti; }
+
+    public long getExp() { return exp; }
+    public void setExp(long exp) { this.exp = exp; }
+
+    public long getNbf() { return nbf; }
+    public void setNbf(long nbf) { this.nbf = nbf; }
+
+    public long getIat() { return iat; }
+    public void setIat(long iat) { this.iat = iat; }
+
+    public String getiss() { return iss; }
+    public void setiss(String iss) { this.iss = iss; }
+
+    public String getaud() { return aud; }
+    public void setaud(String aud) { this.aud = aud; }
+
+    public String getsub() { return sub; }
+    public void setsub(String sub) { this.sub = sub; }
+
+    public String gettyp() { return typ; }
+    public void settyp(String typ) { this.typ = typ; }
+
+    public String getAzp() { return azp; }
+    public void setAzp(String azp) { this.azp = azp; }
+
+    public String getNonce() { return nonce; }
+    public void setNonce(String nonce) { this.nonce = nonce; }
+
+    public Integer getAuthTime() { return auth_time; }
+    public void setAuthTime(Integer auth_time) { this.auth_time = auth_time; } //NOSONAR
+
+    public String getSessionState() { return session_state; }
+    public void setSessionState(String session_state) { this.session_state = session_state; } //NOSONAR
+
+    public String getAcr() { return acr; }
+    public void setAcr(String acr) { this.acr = acr; }
+
+    public List<String> getAllowedOrigins() {
+        return allowedOrigins;
+    }
+    public void setAllowedOrigins(List<String> allowedOrigins) { this.allowedOrigins = allowedOrigins; }
+
+    public JwtRealmAccess getRealmAccess() { return realm_access; }
+    public void setRealmAccess(JwtRealmAccess realm_access) { this.realm_access = realm_access; } //NOSONAR
+
+    public JwtResourceAccess getResourceAccess() { return resource_access; }
+    public void setResourceAccess(JwtResourceAccess resource_access) { this.resource_access = resource_access; } //NOSONAR
+
+    public String getName() { return name; }
+    public void setName(String name) { this.name = name; }
+
+    public String getPreferredUsername() { return preferred_username; }
+    public void setPreferredUsername(String preferred_username) { this.preferred_username = preferred_username; } //NOSONAR
+
+    public String getGivenName() { return given_name; }
+    public void setGivenName(String given_name) { this.given_name = given_name; } //NOSONAR
+
+    public String getFamilyName() { return family_name; }
+    public void setFamilyName(String family_name) { this.family_name = family_name; } //NOSONAR
+
+    public boolean isInRole(String role) {
+        return this.realm_access != null && this.realm_access.isInRole(role);
+    }
+}
diff --git a/src/main/java/org/eclipse/openk/elogbook/auth2/model/JwtRealmAccess.java b/src/main/java/org/eclipse/openk/elogbook/auth2/model/JwtRealmAccess.java
new file mode 100644
index 0000000..ad2b879
--- /dev/null
+++ b/src/main/java/org/eclipse/openk/elogbook/auth2/model/JwtRealmAccess.java
@@ -0,0 +1,17 @@
+package org.eclipse.openk.elogbook.auth2.model;
+
+import java.util.List;
+
+public class JwtRealmAccess {
+    private List<String> roles;
+
+    public List<String> getRoles() {
+        return roles;
+    }
+    public void setRoles(List<String> roles) { this.roles = roles; }
+
+
+    public boolean isInRole(String role) {
+        return this.roles != null && this.roles.contains(role);
+    }
+}
diff --git a/src/main/java/org/eclipse/openk/elogbook/auth2/model/JwtResourceAccess.java b/src/main/java/org/eclipse/openk/elogbook/auth2/model/JwtResourceAccess.java
new file mode 100644
index 0000000..43a116a
--- /dev/null
+++ b/src/main/java/org/eclipse/openk/elogbook/auth2/model/JwtResourceAccess.java
@@ -0,0 +1,8 @@
+package org.eclipse.openk.elogbook.auth2.model;
+
+public class JwtResourceAccess {
+    private JwtAccount account;
+
+    public JwtAccount getAccount() { return account; }
+    public void setAccount(JwtAccount account) { this.account = account; }
+}
diff --git a/src/main/java/org/eclipse/openk/elogbook/auth2/model/JwtToken.java b/src/main/java/org/eclipse/openk/elogbook/auth2/model/JwtToken.java
new file mode 100644
index 0000000..1f3b029
--- /dev/null
+++ b/src/main/java/org/eclipse/openk/elogbook/auth2/model/JwtToken.java
@@ -0,0 +1,32 @@
+package org.eclipse.openk.elogbook.auth2.model;
+
+import com.fasterxml.jackson.annotation.JsonProperty;
+
+public class JwtToken {
+
+    //No Sonar because variables are wrong due to jwt definition
+
+    private String access_token; //NOSONAR
+    private String refresh_token; //NOSONAR
+    private String token_type; //NOSONAR
+    private String session_state; //NOSONAR
+    private Integer expires_in; //NOSONAR
+    private Integer refresh_expires_in; //NOSONAR
+    @JsonProperty("not-before-policy")
+    private Integer not_before_policy; //NOSONAR
+
+    public String getAccessToken() { return access_token; }
+    public void setAccessToken(String access_token) { this.access_token = access_token; } //NOSONAR
+    public String getRefreshToken() { return refresh_token; }
+    public void setRefreshToken(String refresh_token) { this.refresh_token = refresh_token; } //NOSONAR
+    public String getTokenType() { return token_type; }
+    public void setTokenType(String token_type) { this.token_type = token_type; } //NOSONAR
+    public String getSessionState() { return session_state; }
+    public void setSessionState(String session_state) { this.session_state = session_state; } //NOSONAR
+    public Integer getExpiresIn() { return expires_in; }
+    public void setExpiresIn(Integer expires_in) { this.expires_in = expires_in; } //NOSONAR
+    public Integer getRefreshExpiresIn() { return refresh_expires_in; }
+    public void setRefreshExpiresIn(Integer refresh_expires_in) { this.refresh_expires_in = refresh_expires_in; } //NOSONAR
+    public Integer getNotBeforePolicy() { return not_before_policy; }
+    public void setNotBeforePolicy(Integer not_before_policy) { this.not_before_policy = not_before_policy; } //NOSONAR
+}
\ No newline at end of file
diff --git a/src/main/java/org/eclipse/openk/elogbook/auth2/model/KeyCloakUser.java b/src/main/java/org/eclipse/openk/elogbook/auth2/model/KeyCloakUser.java
new file mode 100644
index 0000000..8ecfc3d
--- /dev/null
+++ b/src/main/java/org/eclipse/openk/elogbook/auth2/model/KeyCloakUser.java
@@ -0,0 +1,76 @@
+package org.eclipse.openk.elogbook.auth2.model;
+
+import java.util.List;
+
+public class KeyCloakUser {
+    private String id;
+    private long createdTimestamp;
+    private String username;
+    private boolean enabled;
+    private boolean totp;
+    private boolean emailVerified;
+    private String firstName;
+    private String lastName;
+    private List<String> realmRoles;
+
+    private List<String> disableableCredentialTypes;
+    private List<String> requiredActions;
+    private KeyCloakUserAccess access;
+
+    public String getId() { return id; }
+    public void setId(String id) { this.id = id; }
+
+    public long getCreatedTimestamp() { return createdTimestamp; }
+    public void setCreatedTimestamp(long createdTimestamp) { this.createdTimestamp = createdTimestamp; }
+
+    public String getUsername() { return username; }
+    public void setUsername(String username) { this.username = username; }
+
+    public boolean getEnabled() { return enabled; }
+    public void setEnabled(boolean enabled) { this.enabled = enabled; }
+
+    public boolean getTotp() { return totp; }
+    public void setTotp(boolean totp) { this.totp = totp; }
+
+    public boolean getEmailVerified() { return emailVerified; }
+    public void setEmailVerified(boolean emailVerified) { this.emailVerified = emailVerified; }
+
+    public String getFirstName() { return firstName; }
+    public void setFirstName(String firstName) { this.firstName = firstName; }
+
+    public String getLastName() { return lastName; }
+    public void setLastName(String lastName) { this.lastName = lastName; }
+
+    public List<String> getDisableableCredentialTypes() {
+        return disableableCredentialTypes;
+    }
+    public void setDisableableCredentialTypes(List<String> disableableCredentialTypes) { this.disableableCredentialTypes = disableableCredentialTypes; }
+
+    public List<String> getRequiredActions() {
+        return requiredActions;
+    }
+    public void setRequiredActions(List<String> requiredActions) { this.requiredActions = requiredActions; }
+
+    public KeyCloakUserAccess getAccess() { return access; }
+    public void setAccess(KeyCloakUserAccess access) { this.access = access; }
+
+    public boolean isEnabled() {
+        return enabled;
+    }
+
+    public boolean isTotp() {
+        return totp;
+    }
+
+    public boolean isEmailVerified() {
+        return emailVerified;
+    }
+
+    public List<String> getRealmRoles() {
+        return realmRoles;
+    }
+
+    public void setRealmRoles(List<String> realmRoles) {
+        this.realmRoles = realmRoles;
+    }
+}
diff --git a/src/main/java/org/eclipse/openk/elogbook/auth2/model/KeyCloakUserAccess.java b/src/main/java/org/eclipse/openk/elogbook/auth2/model/KeyCloakUserAccess.java
new file mode 100644
index 0000000..cbe162a
--- /dev/null
+++ b/src/main/java/org/eclipse/openk/elogbook/auth2/model/KeyCloakUserAccess.java
@@ -0,0 +1,20 @@
+package org.eclipse.openk.elogbook.auth2.model;
+
+public class KeyCloakUserAccess {
+    private boolean manageGroupMembership;
+    private boolean view;
+    private boolean mapRoles;
+    private boolean impersonate;
+    private boolean manage;
+
+    public boolean getManageGroupMembership() { return manageGroupMembership; }
+    public void setManageGroupMembership(boolean manageGroupMembership) { this.manageGroupMembership = manageGroupMembership; }
+    public boolean getView() { return view; }
+    public void setView(boolean view) { this.view = view; }
+    public boolean getMapRoles() { return mapRoles; }
+    public void setMapRoles(boolean mapRoles) { this.mapRoles = mapRoles; }
+    public boolean getImpersonate() { return impersonate; }
+    public void setImpersonate(boolean impersonate) { this.impersonate = impersonate; }
+    public boolean getManage() { return manage; }
+    public void setManage(boolean manage) { this.manage = manage; }
+}
diff --git a/src/main/java/org/eclipse/openk/elogbook/auth2/util/JwtHelper.java b/src/main/java/org/eclipse/openk/elogbook/auth2/util/JwtHelper.java
new file mode 100644
index 0000000..68902ea
--- /dev/null
+++ b/src/main/java/org/eclipse/openk/elogbook/auth2/util/JwtHelper.java
@@ -0,0 +1,51 @@
+package org.eclipse.openk.elogbook.auth2.util;
+
+import com.google.gson.JsonSyntaxException;
+import com.google.gson.reflect.TypeToken;
+import java.lang.reflect.Type;
+import java.nio.charset.StandardCharsets;
+import java.util.Base64;
+import java.util.List;
+import org.apache.log4j.Logger;
+import org.eclipse.openk.elogbook.auth2.model.JwtPayload;
+import org.eclipse.openk.elogbook.auth2.model.KeyCloakUser;
+import org.eclipse.openk.elogbook.common.JsonGeneratorBase;
+import org.eclipse.openk.elogbook.exceptions.BtbInternalServerError;
+
+public class JwtHelper {
+
+  private static final Logger LOGGER = Logger.getLogger(JwtHelper.class.getName());
+
+  private JwtHelper() {}
+
+  public static JwtPayload getJwtPayload(String token) {
+
+    String plainToken = JwtHelper.formatToken(token);
+    String[] parts = plainToken.split("[.]");
+
+    String jwtPayload = parts[1]; // we need only this here
+    byte[] decoded = Base64.getDecoder().decode(jwtPayload);
+    jwtPayload = new String(decoded, StandardCharsets.UTF_8);
+
+    return getJwtPayloadFromJson(jwtPayload);
+  }
+
+  public static JwtPayload getJwtPayloadFromJson(String json) {
+    return JsonGeneratorBase.getGson().fromJson(json, JwtPayload.class);
+  }
+
+  public static List<KeyCloakUser> getUserListFromJson(String json) throws BtbInternalServerError {
+    try {
+      Type listType = new TypeToken<List<KeyCloakUser>>(){}.getType();
+      return JsonGeneratorBase.getGson().fromJson(json, listType);
+    } catch (JsonSyntaxException ex) {
+      LOGGER.error("Error in getUserListFromJson", ex);
+      throw new BtbInternalServerError("JsonSyntaxException");
+    }
+  }
+
+  public static String formatToken(String accessToken) {
+    return accessToken != null ? accessToken.replace("Bearer", "").trim() : "";
+  }
+
+}
diff --git a/src/main/java/org/eclipse/openk/elogbook/common/BackendConfig.java b/src/main/java/org/eclipse/openk/elogbook/common/BackendConfig.java
new file mode 100644
index 0000000..ce78206
--- /dev/null
+++ b/src/main/java/org/eclipse/openk/elogbook/common/BackendConfig.java
@@ -0,0 +1,52 @@
+package org.eclipse.openk.elogbook.common;
+
+import org.eclipse.openk.elogbook.common.util.ResourceLoaderBase;
+
+public class BackendConfig {
+
+  private static String configFileName = "backendConfigDevLocal.json";
+  private String importFilesFolderPath;
+  private String portalBaseURL;
+  private int fileRowToRead;
+
+  private static BackendConfig instance;
+
+  private BackendConfig() {
+  }
+
+  public static synchronized BackendConfig getInstance() {
+    if (instance == null) {
+      String jsonConfig = loadJsonConfig();
+      instance = JsonGeneratorBase.getGson().fromJson(jsonConfig, BackendConfig.class);
+    }
+
+    return instance;
+  }
+
+  private static String loadJsonConfig() {
+    ResourceLoaderBase resourceLoaderBase = new ResourceLoaderBase();
+    return resourceLoaderBase.loadStringFromResource(configFileName);
+  }
+
+  public String getPortalBaseURL() {
+    return portalBaseURL;
+  }
+
+  public String getImportFilesFolderPath() {
+    return importFilesFolderPath;
+  }
+
+  public int getFileRowToRead() {
+    return fileRowToRead;
+  }
+
+  public static String getConfigFileName() {
+    return configFileName;
+  }
+
+  public static void setConfigFileName(String configFileName) {
+    BackendConfig.configFileName = configFileName;
+  }
+}
+
+
diff --git a/src/main/java/org/eclipse/openk/elogbook/common/Globals.java b/src/main/java/org/eclipse/openk/elogbook/common/Globals.java
new file mode 100644
index 0000000..409c3ec
--- /dev/null
+++ b/src/main/java/org/eclipse/openk/elogbook/common/Globals.java
@@ -0,0 +1,33 @@
+package org.eclipse.openk.elogbook.common;
+
+
+public final class Globals {
+    public static final String OK_STRING = "OK";
+    public static final String SESSION_TOKEN_TAG = "X-XSRF-TOKEN";
+    public static final String SESSION_COOKIE_TOKEN_TAG = "COOKIESESSION-TOKEN";
+    public static final int MAX_CREDENTIALS_LENGTH = 500;
+    public static final int MAX_NOTIFICATION_LENGTH = 16384;
+
+    //For Branches: for later use in a configurable json
+    public static final String ELECTRICITY_MARK = "S";
+    public static final String GAS_MARK = "G";
+    public static final String DISTRICT_HEAT_MARK = "F";
+    public static final String WATER_MARK = "W";
+
+    //Errormessage
+    public static final String DATA_OUTDATED = "Data is outdated!";
+
+    //Suggestion: An input field on search mask as better solution? Can only be adapted by code changes.
+    public static final int FAST_SEARCH_NUMBER_OF_DAYS_BACK = -200;
+
+    //KeyCloak configuration
+    public static final String KEYCLOAK_AUTH_TAG = "Authorization";
+    public static final String KEYCLOAK_ROLE_SUPERUSER = "elogbook-superuser";
+    public static final String KEYCLOAK_ROLE_NORMALUSER = "elogbook-normaluser";
+
+    public static final String HEADER_JSON_UTF8 = "application/json; charset=utf-8";
+
+
+    private Globals() {}
+
+}
diff --git a/src/main/java/org/eclipse/openk/elogbook/common/GsonUTCDateAdapter.java b/src/main/java/org/eclipse/openk/elogbook/common/GsonUTCDateAdapter.java
new file mode 100644
index 0000000..f606a3e
--- /dev/null
+++ b/src/main/java/org/eclipse/openk/elogbook/common/GsonUTCDateAdapter.java
@@ -0,0 +1,40 @@
+package org.eclipse.openk.elogbook.common;
+
+import com.google.gson.JsonDeserializationContext;
+import com.google.gson.JsonDeserializer;
+import com.google.gson.JsonElement;
+import com.google.gson.JsonParseException;
+import com.google.gson.JsonPrimitive;
+import com.google.gson.JsonSerializationContext;
+import com.google.gson.JsonSerializer;
+import java.lang.reflect.Type;
+import java.text.DateFormat;
+import java.text.ParseException;
+import java.text.SimpleDateFormat;
+import java.util.Date;
+import java.util.Locale;
+import java.util.TimeZone;
+
+public class GsonUTCDateAdapter implements JsonSerializer<Date>, JsonDeserializer<Date> {
+
+    private final DateFormat dateFormat;
+
+    public GsonUTCDateAdapter() {
+        dateFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS'Z'", Locale.US);      //This is the format I need
+        dateFormat.setTimeZone(TimeZone.getTimeZone("UTC"));                               //This is the key line which converts the date to UTC which cannot be accessed with the default serializer
+    }
+
+    @Override
+    public synchronized JsonElement serialize(Date date, Type type, JsonSerializationContext jsonSerializationContext) {
+        return new JsonPrimitive(dateFormat.format(date));
+    }
+
+    @Override
+    public synchronized Date deserialize(JsonElement jsonElement, Type type, JsonDeserializationContext jsonDeserializationContext) {
+        try {
+            return dateFormat.parse(jsonElement.getAsString());
+        } catch (ParseException e) {
+            throw new JsonParseException(e);
+        }
+    }
+}
\ No newline at end of file
diff --git a/src/main/java/org/eclipse/openk/elogbook/common/InitBackendConfig.java b/src/main/java/org/eclipse/openk/elogbook/common/InitBackendConfig.java
new file mode 100644
index 0000000..e8d2f6f
--- /dev/null
+++ b/src/main/java/org/eclipse/openk/elogbook/common/InitBackendConfig.java
@@ -0,0 +1,42 @@
+package org.eclipse.openk.elogbook.common;
+
+import org.apache.log4j.Logger;
+
+import javax.servlet.ServletException;
+import javax.servlet.http.HttpServlet;
+
+public class InitBackendConfig extends HttpServlet {
+
+    private static final long serialVersionUID = -7882117179312471533L;
+
+    private static final Logger LOGGER = Logger.getLogger(InitBackendConfig.class.getName());
+
+    @Override
+    public void init() throws ServletException {
+        String environment = getServletContext().getInitParameter("OK_ELOGBOOK_ENVIRONMENT");
+        setConfigFiles(environment);
+    }
+
+    private void setConfigFiles(String environment ) {
+        String env = (environment == null ? "Production": environment);
+
+        String backendConfigFile;
+
+        switch (env){
+            case "DevLocal":
+                backendConfigFile="backendConfigDevLocal.json";
+                break;
+            case "DevServer":
+                backendConfigFile="backendConfigDevServer.json";
+                break;
+            case "Custom":
+                backendConfigFile="backendConfigCustom.json";
+                break;
+            default:
+                backendConfigFile="backendConfigProduction.json";
+        }
+
+        BackendConfig.setConfigFileName(backendConfigFile);
+        LOGGER.info("Portal backendendenviroment is: " +environment+ ". Setting backendConfig accordingly to: "+ backendConfigFile);
+    }
+}
diff --git a/src/main/java/org/eclipse/openk/elogbook/common/JsonGeneratorBase.java b/src/main/java/org/eclipse/openk/elogbook/common/JsonGeneratorBase.java
new file mode 100644
index 0000000..0cff54a
--- /dev/null
+++ b/src/main/java/org/eclipse/openk/elogbook/common/JsonGeneratorBase.java
@@ -0,0 +1,15 @@
+package org.eclipse.openk.elogbook.common;
+
+import com.google.gson.Gson;
+import com.google.gson.GsonBuilder;
+import java.util.Date;
+
+public class JsonGeneratorBase {
+    private JsonGeneratorBase() {}
+    public static Gson getGson() {
+        return new GsonBuilder()
+                .registerTypeAdapter(Date.class, new GsonUTCDateAdapter())
+                .disableHtmlEscaping()
+                .create();
+    }
+}
diff --git a/src/main/java/org/eclipse/openk/elogbook/common/NotificationStatus.java b/src/main/java/org/eclipse/openk/elogbook/common/NotificationStatus.java
new file mode 100644
index 0000000..c5fa95d
--- /dev/null
+++ b/src/main/java/org/eclipse/openk/elogbook/common/NotificationStatus.java
@@ -0,0 +1,18 @@
+package org.eclipse.openk.elogbook.common;
+
+public enum NotificationStatus {
+
+	UNKNOWN(0, "unknown"),
+	OPEN(1, "open"),
+	INPROGRESS(2, "inprogress"),
+	FINISHED(3, "finished"),
+	CLOSED(4, "closed");
+
+    public final int id;
+	public final String statusName;
+
+	NotificationStatus(int id, String name) {
+        this.id = id;
+        this.statusName = name;
+	}
+}
diff --git a/src/main/java/org/eclipse/openk/elogbook/common/mapper/HResponsibilityMapper.java b/src/main/java/org/eclipse/openk/elogbook/common/mapper/HResponsibilityMapper.java
new file mode 100644
index 0000000..8932089
--- /dev/null
+++ b/src/main/java/org/eclipse/openk/elogbook/common/mapper/HResponsibilityMapper.java
@@ -0,0 +1,164 @@
+package org.eclipse.openk.elogbook.common.mapper;
+
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.HashMap;
+import java.util.LinkedHashMap;
+import java.util.List;
+import java.util.Map;
+import org.apache.log4j.Logger;
+import org.eclipse.openk.elogbook.persistence.dao.RefBranchDao;
+import org.eclipse.openk.elogbook.persistence.dao.RefGridTerritoryDao;
+import org.eclipse.openk.elogbook.persistence.model.HTblResponsibility;
+import org.eclipse.openk.elogbook.persistence.model.RefBranch;
+import org.eclipse.openk.elogbook.persistence.model.RefGridTerritory;
+import org.eclipse.openk.elogbook.persistence.model.TblResponsibility;
+import org.eclipse.openk.elogbook.viewmodel.HistoricalResponsibility;
+import org.eclipse.openk.elogbook.viewmodel.HistoricalShiftChanges;
+import org.eclipse.openk.elogbook.viewmodel.Responsibility;
+import org.eclipse.openk.elogbook.viewmodel.TerritoryResponsibility;
+
+public class HResponsibilityMapper {
+
+  private static final Logger LOGGER = Logger.getLogger(HResponsibilityMapper.class.getName());
+  private final HashMap<String, RefBranch> refBranchMap;
+  private final HashMap<String, RefGridTerritory> refGridTerritoryMap;
+
+  public HResponsibilityMapper(RefGridTerritoryDao rgtDao, RefBranchDao rbDao) {
+    List<RefGridTerritory> refGridTerritoryList = rgtDao.findInTx(true, -1, 0);
+    refGridTerritoryMap = new HashMap<>(refGridTerritoryList.size());
+    //refGridTerritoryMap.getName is a unique index in DB so we can rely on it that it's unique
+    for (RefGridTerritory item : refGridTerritoryList) {
+      refGridTerritoryMap.put(item.getName(), item);
+    }
+
+    List<RefBranch> rbList = rbDao.findInTx(true, -1, 0);
+    refBranchMap = new HashMap<>(rbList.size());
+    for (RefBranch item : rbList) {
+      refBranchMap.put(item.getName(), item);
+    }
+  }
+
+  public static HTblResponsibility mapFromTblResponsibility(TblResponsibility tblResponsibility){
+    return new HTblResponsibility(tblResponsibility);
+  }
+
+	/**
+	 * Create the HistoricalShiftChanges Object in View Model from the
+	 * historical responsibilities entities found in the specified period.
+	 *
+	 * @param hTblResponsibilities
+	 * @param transferDateFrom
+	 * @param transferDateTo
+	 * @return
+	 */
+	public HistoricalShiftChanges mapTblResponsibilitiesInPeriod(List<HTblResponsibility> hTblResponsibilities,
+			Date transferDateFrom, Date transferDateTo) {
+
+		HistoricalShiftChanges historicalShiftChanges = new HistoricalShiftChanges();
+		historicalShiftChanges.setTransferDateFrom(transferDateFrom);
+		historicalShiftChanges.setTransferDateTo(transferDateTo);
+		historicalShiftChanges.setHistoricalResponsibilities(mapToVModelList(hTblResponsibilities));
+		return historicalShiftChanges;
+	}
+
+
+  public HistoricalResponsibility mapToVModel(HTblResponsibility htblResponsibility) {
+
+    if (htblResponsibility == null) {
+      return null;
+    }
+
+    HistoricalResponsibility hResponsibility = new HistoricalResponsibility();
+    hResponsibility.setId(htblResponsibility.getId());
+    hResponsibility.setTransactionId(htblResponsibility.getTransactionId());
+
+    hResponsibility.setResponsibleUser(htblResponsibility.getResponsibleUser());
+    hResponsibility.setFormerResponsibleUser(htblResponsibility.getFormerResponsibleUser());
+    hResponsibility.setCreateUser(htblResponsibility.getCreateUser());
+    hResponsibility.setModUser(htblResponsibility.getModUser());
+
+    if (htblResponsibility.getTransferDate() != null) {
+        hResponsibility.setTransferDate(new Date(htblResponsibility.getTransferDate().getTime()));
+    }
+    if (htblResponsibility.getCreateDate() != null) {
+        hResponsibility.setCreateDate(new Date(htblResponsibility.getCreateDate().getTime()));
+    }
+    if (htblResponsibility.getModDate() != null) {
+        hResponsibility.setModDate(new Date(htblResponsibility.getModDate().getTime()));
+    }
+    if (htblResponsibility.getRefBranch() != null) {
+        hResponsibility.setRefBranch(htblResponsibility.getRefBranch());
+    }
+    if (htblResponsibility.getRefGridTerritory() != null)  {
+      hResponsibility.setRefGridTerritory(htblResponsibility.getRefGridTerritory());
+    }
+
+    return hResponsibility;
+  }
+
+
+  public List<HistoricalResponsibility> mapToVModelList(List<HTblResponsibility> hTblResponsibilityList) {
+    LOGGER.debug("mapToVModelList() is called");
+    List<HistoricalResponsibility> historicalResponsibilityList = new ArrayList<>();
+
+    for (HTblResponsibility hTblResponsibility : hTblResponsibilityList) {
+        historicalResponsibilityList.add(mapToVModel(hTblResponsibility));
+    }
+
+    LOGGER.debug("mapToVModelList() is finished");
+    return historicalResponsibilityList;
+  }
+
+  public List<TerritoryResponsibility> mapToContainerVModelList(List<HTblResponsibility> hTblResponsibilityList) {
+    LOGGER.debug("mapToContainerVModelList() is called");
+    List<TerritoryResponsibility> responsibilityList = new ArrayList<>();
+
+    Map<String, TerritoryResponsibility> responsibilityHashMap = new LinkedHashMap<>();
+
+    for (HTblResponsibility hTblResponsibility : hTblResponsibilityList) {
+      String tblRespLocation = hTblResponsibility.getRefGridTerritory().getDescription();
+      if (responsibilityHashMap.containsKey(tblRespLocation)) {
+        TerritoryResponsibility existingResponsibility = responsibilityHashMap.get(tblRespLocation);
+        mapToContainerVModel(hTblResponsibility, existingResponsibility);
+      } else {
+        responsibilityHashMap.put(tblRespLocation, mapToContainerVModel(hTblResponsibility, null));
+      }
+    }
+
+    responsibilityList.addAll(responsibilityHashMap.values());
+
+    LOGGER.debug("mapToContainerVModelList() is finished");
+    return responsibilityList;
+  }
+
+  public TerritoryResponsibility mapToContainerVModel(HTblResponsibility hTblResponsibility, TerritoryResponsibility existingResponsibilityCont) {
+    TerritoryResponsibility vmResponsibilityRet;
+
+    if (existingResponsibilityCont == null) {
+      vmResponsibilityRet = new TerritoryResponsibility();
+      vmResponsibilityRet.setGridTerritoryDescription(hTblResponsibility.getRefGridTerritory().getDescription());
+      List<Responsibility> responsibilityList = new ArrayList<>();
+      responsibilityList.add(mapToVModelForContainer(hTblResponsibility));
+      vmResponsibilityRet.setResponsibilityList(responsibilityList);
+    } else {
+      vmResponsibilityRet = existingResponsibilityCont;
+      vmResponsibilityRet.getResponsibilityList().add(mapToVModelForContainer(hTblResponsibility));
+    }
+
+    return vmResponsibilityRet;
+  }
+
+  public Responsibility mapToVModelForContainer(HTblResponsibility hTblResponsibility) {
+
+    Responsibility responsibility = new Responsibility();
+    responsibility.setId(hTblResponsibility.getId());
+    responsibility.setResponsibleUser(hTblResponsibility.getResponsibleUser());
+    responsibility.setNewResponsibleUser(hTblResponsibility.getFormerResponsibleUser());
+    responsibility.setBranchName(hTblResponsibility.getRefBranch().getName());
+    responsibility.setIsActive(true);
+
+    return responsibility;
+  }
+
+}
diff --git a/src/main/java/org/eclipse/openk/elogbook/common/mapper/KeyCloakUserMapper.java b/src/main/java/org/eclipse/openk/elogbook/common/mapper/KeyCloakUserMapper.java
new file mode 100644
index 0000000..7272a80
--- /dev/null
+++ b/src/main/java/org/eclipse/openk/elogbook/common/mapper/KeyCloakUserMapper.java
@@ -0,0 +1,34 @@
+package org.eclipse.openk.elogbook.common.mapper;
+
+import java.util.ArrayList;
+import java.util.List;
+import org.eclipse.openk.elogbook.auth2.model.KeyCloakUser;
+import org.eclipse.openk.elogbook.viewmodel.UserAuthentication;
+
+public class KeyCloakUserMapper {
+
+  private KeyCloakUserMapper(){}
+
+  public static List<UserAuthentication> mapFromKeyCloakUserList(List<KeyCloakUser> keyCloakUserList){
+    List<UserAuthentication> userAuthenticationList = new ArrayList<>();
+    if (keyCloakUserList==null) {
+      return userAuthenticationList;
+    }
+
+    for (KeyCloakUser keyCloakUser : keyCloakUserList) {
+      userAuthenticationList.add(mapFromKeyCloakUser(keyCloakUser));
+    }
+    return userAuthenticationList;
+  }
+
+  private static UserAuthentication mapFromKeyCloakUser(KeyCloakUser keyCloakUser){
+    UserAuthentication userAuthentication = new UserAuthentication();
+    userAuthentication.setId(keyCloakUser.getId());
+    userAuthentication.setUsername(keyCloakUser.getUsername());
+    String firstName = keyCloakUser.getFirstName() != null ? keyCloakUser.getFirstName() : "" ;
+    String lastName = keyCloakUser.getLastName() != null ? keyCloakUser.getLastName() : "" ;
+    String fullName = firstName + " " + lastName;
+    userAuthentication.setName(fullName.trim());
+    return userAuthentication;
+  }
+}
diff --git a/src/main/java/org/eclipse/openk/elogbook/common/mapper/NotificationMapper.java b/src/main/java/org/eclipse/openk/elogbook/common/mapper/NotificationMapper.java
new file mode 100644
index 0000000..f09cddf
--- /dev/null
+++ b/src/main/java/org/eclipse/openk/elogbook/common/mapper/NotificationMapper.java
@@ -0,0 +1,145 @@
+package org.eclipse.openk.elogbook.common.mapper;
+
+import java.sql.Timestamp;
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import org.eclipse.openk.elogbook.persistence.dao.RefBranchDao;
+import org.eclipse.openk.elogbook.persistence.dao.RefGridTerritoryDao;
+import org.eclipse.openk.elogbook.persistence.dao.RefNotificationStatusDao;
+import org.eclipse.openk.elogbook.persistence.model.AbstractNotification;
+import org.eclipse.openk.elogbook.persistence.model.RefBranch;
+import org.eclipse.openk.elogbook.persistence.model.RefGridTerritory;
+import org.eclipse.openk.elogbook.persistence.model.RefNotificationStatus;
+import org.eclipse.openk.elogbook.persistence.model.TblNotification;
+import org.eclipse.openk.elogbook.viewmodel.Notification;
+
+public class NotificationMapper {
+    private Map<Integer, RefNotificationStatus> refStatusMap;
+    private Map<Integer, RefBranch> refBranchMap;
+    private Map<Integer, RefGridTerritory> refGridTerritoryMap;
+
+	public NotificationMapper(RefNotificationStatusDao rnsDao, RefBranchDao rbDao,
+			RefGridTerritoryDao refGridTerritoryDao) {
+		createRelationsMaps(rnsDao, rbDao, refGridTerritoryDao);
+	}
+
+    public TblNotification mapFromVModel(Notification vmNot) {
+        TblNotification trg = new TblNotification();
+        trg.setId(vmNot.getId());
+        trg.setIncidentId(vmNot.getIncidentId());
+        trg.setVersion(vmNot.getVersion());
+        if (vmNot.getCreateDate() != null) {
+            trg.setCreateDate(new Timestamp(vmNot.getCreateDate().getTime()));
+        }
+        if (vmNot.getBeginDate() != null) {
+        	trg.setBeginDate(new Timestamp(vmNot.getBeginDate().getTime()));
+        }
+        trg.setCreateUser(vmNot.getCreateUser());
+        if (vmNot.getExpectedFinishDate() != null) {
+            trg.setExpectedFinishedDate(new Timestamp(vmNot.getExpectedFinishDate().getTime()));
+        }
+        if (vmNot.getFinishedDate() != null) {
+            trg.setFinishedDate(new Timestamp(vmNot.getFinishedDate().getTime()));
+        }
+        trg.setFreeText(vmNot.getFreeText());
+        trg.setFreeTextExtended(vmNot.getFreeTextExtended());
+        if (vmNot.getModDate() != null) {
+            trg.setModDate(new Timestamp(vmNot.getModDate().getTime()));
+        }
+        trg.setModUser(vmNot.getModUser());
+        trg.setNotificationText(vmNot.getNotificationText());
+        if (vmNot.getReminderDate() != null) {
+            trg.setReminderDate(new Timestamp(vmNot.getReminderDate().getTime()));
+        }
+        trg.setResponsibilityControlPoint(vmNot.getResponsibilityControlPoint());
+        trg.setResponsibilityForwarding(vmNot.getResponsibilityForwarding());
+        trg.setRefBranch(refBranchMap.get(vmNot.getFkRefBranch()));
+        trg.setRefNotificationStatus(refStatusMap.get(vmNot.getFkRefNotificationStatus()));
+        trg.setRefGridTerritory(refGridTerritoryMap.get(vmNot.getFkRefGridTerritory()));
+        trg.setAdminFlag(vmNot.isAdminFlag());
+        return trg;
+    }
+
+    public Notification mapToVModel(AbstractNotification tblNot) {
+    	if (tblNot == null) {
+    		return null;
+    	}
+        Notification not = new Notification();
+        not.setId(tblNot.getId());
+        not.setIncidentId(tblNot.getIncidentId());
+        not.setVersion(tblNot.getVersion());
+        if (tblNot.getBeginDate() != null) {
+        	not.setBeginDate(new Date(tblNot.getBeginDate().getTime()));
+        }
+        if (tblNot.getCreateDate() != null) {
+            not.setCreateDate(new Date(tblNot.getCreateDate().getTime()));
+        }
+        not.setCreateUser(tblNot.getCreateUser());
+        if (tblNot.getExpectedFinishedDate() != null) {
+            not.setExpectedFinishDate(new Date(tblNot.getExpectedFinishedDate().getTime()));
+        }
+        if (tblNot.getFinishedDate() != null) {
+            not.setFinishedDate(new Date(tblNot.getFinishedDate().getTime()));
+        }
+        not.setFreeText(tblNot.getFreeText());
+        not.setFreeTextExtended(tblNot.getFreeTextExtended());
+        if (tblNot.getModDate() != null) {
+            not.setModDate(new Date(tblNot.getModDate().getTime()));
+        }
+        not.setModUser(tblNot.getModUser());
+        not.setNotificationText(tblNot.getNotificationText());
+        if (tblNot.getReminderDate() != null) {
+            not.setReminderDate(new Date(tblNot.getReminderDate().getTime()));
+        }
+		not.setResponsibilityControlPoint(tblNot.getResponsibilityControlPoint());
+		not.setResponsibilityForwarding(tblNot.getResponsibilityForwarding());
+		if (tblNot.getRefBranch() != null) {
+			not.setFkRefBranch(tblNot.getRefBranch().getId());
+		}
+		not.setFkRefNotificationStatus(tblNot.getRefNotificationStatus().getId());
+		not.setStatus(tblNot.getRefNotificationStatus().getName());
+		if (tblNot.getRefGridTerritory() != null) {
+			not.setFkRefGridTerritory(tblNot.getRefGridTerritory().getId());
+		}
+		not.getAdminFlag(tblNot.isAdminFlag());
+		return not;
+    }
+
+    public List<Notification> mapListToVModel(List<? extends AbstractNotification> tnotlist) {
+        List<Notification> retList = new ArrayList<>(tnotlist.size());
+        for (AbstractNotification tnot : tnotlist) {
+            retList.add(mapToVModel(tnot));
+        }
+        return retList;
+    }
+  
+
+	/**
+	 * Find the related branches, notification status and grid territories and put their ids into an internal map.
+	 * @param rnsDao the dao for the notification status
+	 * @param rbDao the dao for the branches
+	 * @param refGridTerritoryDao the dao for the grid territories
+	 */
+	private void createRelationsMaps(RefNotificationStatusDao rnsDao, RefBranchDao rbDao,
+			RefGridTerritoryDao refGridTerritoryDao) {
+		List<RefNotificationStatus> rnsList = rnsDao.findInTx(true, -1, 0);
+		refStatusMap = new HashMap<>(rnsList.size());
+		for (RefNotificationStatus item : rnsList) {
+			refStatusMap.put(item.getId(), item);
+		}
+		List<RefBranch> rbList = rbDao.findInTx(true, -1, 0);
+		refBranchMap = new HashMap<>(rbList.size());
+		for (RefBranch item : rbList) {
+			refBranchMap.put(item.getId(), item);
+		}
+		List<RefGridTerritory> refGridTerritories = refGridTerritoryDao.findInTx(true, -1, 0);
+		refGridTerritoryMap = new HashMap<>(refGridTerritories.size());
+		for (RefGridTerritory refGridTerritory : refGridTerritories) {
+			refGridTerritoryMap.put(refGridTerritory.getId(), refGridTerritory);
+		}
+	}
+}
diff --git a/src/main/java/org/eclipse/openk/elogbook/common/mapper/ResponsibilityMapper.java b/src/main/java/org/eclipse/openk/elogbook/common/mapper/ResponsibilityMapper.java
new file mode 100644
index 0000000..f6f74b5
--- /dev/null
+++ b/src/main/java/org/eclipse/openk/elogbook/common/mapper/ResponsibilityMapper.java
@@ -0,0 +1,175 @@
+package org.eclipse.openk.elogbook.common.mapper;
+
+import java.sql.Timestamp;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.LinkedHashMap;
+import java.util.List;
+import java.util.Map;
+import org.apache.log4j.Logger;
+import org.eclipse.openk.elogbook.common.Globals;
+import org.eclipse.openk.elogbook.exceptions.BtbGone;
+import org.eclipse.openk.elogbook.persistence.dao.RefBranchDao;
+import org.eclipse.openk.elogbook.persistence.dao.RefGridTerritoryDao;
+import org.eclipse.openk.elogbook.persistence.model.RefBranch;
+import org.eclipse.openk.elogbook.persistence.model.RefGridTerritory;
+import org.eclipse.openk.elogbook.persistence.model.TblResponsibility;
+import org.eclipse.openk.elogbook.viewmodel.Responsibility;
+import org.eclipse.openk.elogbook.viewmodel.TerritoryResponsibility;
+
+public class ResponsibilityMapper {
+
+  private static final Logger LOGGER = Logger.getLogger(ResponsibilityMapper.class.getName());
+  private final HashMap<String, RefBranch> refBranchMap;
+  private final HashMap<String, RefGridTerritory> refGridTerritoryMap;
+
+  public ResponsibilityMapper(RefGridTerritoryDao rgtDao, RefBranchDao rbDao) {
+    List<RefGridTerritory> refGridTerritoryList = rgtDao.findInTx(true, -1, 0);
+    refGridTerritoryMap = new HashMap<>(refGridTerritoryList.size());
+    //refGridTerritoryMap.getName is a unique index in DB so we can rely on it that it's unique
+    for (RefGridTerritory item : refGridTerritoryList) {
+      refGridTerritoryMap.put(item.getName(), item);
+    }
+
+    List<RefBranch> rbList = rbDao.findInTx(true, -1, 0);
+    refBranchMap = new HashMap<>(rbList.size());
+    for (RefBranch item : rbList) {
+      refBranchMap.put(item.getName(), item);
+    }
+  }
+
+
+  public Responsibility mapToVModelForContainer(TblResponsibility tblResponsibility) {
+
+         Responsibility responsibility = new Responsibility();
+         responsibility.setId(tblResponsibility.getId());
+         responsibility.setResponsibleUser(tblResponsibility.getResponsibleUser());
+         responsibility.setNewResponsibleUser(tblResponsibility.getNewResponsibleUser());
+         responsibility.setBranchName(tblResponsibility.getRefBranch().getName());
+         responsibility.setIsActive(true);
+
+         return responsibility;
+  }
+
+
+  public TerritoryResponsibility mapToContainerVModel(TblResponsibility tblResponsibility, TerritoryResponsibility existingResponsibilityCont) {
+    TerritoryResponsibility vmResponsibilityRet;
+
+    if (existingResponsibilityCont == null) {
+      vmResponsibilityRet = new TerritoryResponsibility();
+      vmResponsibilityRet.setGridTerritoryDescription(tblResponsibility.getRefGridTerritory().getDescription());
+      List<Responsibility> responsibilityList = new ArrayList<>();
+      responsibilityList.add(mapToVModelForContainer(tblResponsibility));
+      vmResponsibilityRet.setResponsibilityList(responsibilityList);
+    } else {
+      vmResponsibilityRet = existingResponsibilityCont;
+      vmResponsibilityRet.getResponsibilityList().add(mapToVModelForContainer(tblResponsibility));
+    }
+
+    return vmResponsibilityRet;
+  }
+
+  public List<TerritoryResponsibility> mapToContainerVModelList(List<TblResponsibility> tblResponsibilityList) {
+    LOGGER.debug("mapToContainerVModelList() is called");
+    List<TerritoryResponsibility> responsibilityList = new ArrayList<>();
+
+    Map<String, TerritoryResponsibility> responsibilityHashMap = new LinkedHashMap<>();
+
+    for (TblResponsibility tblResponsibility : tblResponsibilityList) {
+      String tblRespLocation = tblResponsibility.getRefGridTerritory().getDescription();
+      if (responsibilityHashMap.containsKey(tblRespLocation)) {
+        TerritoryResponsibility existingResponsibility = responsibilityHashMap.get(tblRespLocation);
+        mapToContainerVModel(tblResponsibility, existingResponsibility);
+      } else {
+        responsibilityHashMap.put(tblRespLocation, mapToContainerVModel(tblResponsibility, null));
+      }
+    }
+
+    responsibilityList.addAll(responsibilityHashMap.values());
+
+    LOGGER.debug("mapToContainerVModelList() is finished");
+    return responsibilityList;
+  }
+
+  private boolean plannedResponsibilitiesCheck(TblResponsibility tblResponsibility, Responsibility responsibility, String gridLocationJson){
+       return (!tblResponsibility.getRefGridTerritory().getDescription().equals(gridLocationJson) ||
+        !tblResponsibility.getRefBranch().getName().equals(responsibility.getBranchName()) ||
+        !tblResponsibility.getResponsibleUser().equals(responsibility.getResponsibleUser()));
+  }
+
+  private boolean confirmResponsibilitiesCheck(TblResponsibility tblResponsibility, Responsibility responsibility, String gridLocationJson){
+    return (!tblResponsibility.getRefGridTerritory().getDescription().equals(gridLocationJson) ||
+        !tblResponsibility.getRefBranch().getName().equals(responsibility.getBranchName()));
+  }
+
+  private TblResponsibility processResponsibilities(Responsibility responsibility,Map<Integer, TblResponsibility> responsibilityHashMap , String mode, String gridLocationJson, String moduser)
+      throws BtbGone {
+    TblResponsibility tblResponsibility = responsibilityHashMap.get(responsibility.getId());
+
+    if (tblResponsibility == null){
+      throw new BtbGone(Globals.DATA_OUTDATED);
+    }
+
+    if (("planResponsibilities").equals(mode)){
+      if (plannedResponsibilitiesCheck(tblResponsibility, responsibility, gridLocationJson)){
+        //Data is outdated, we  have to reload and fill the form with the newer, recent data
+        throw new BtbGone(Globals.DATA_OUTDATED);
+      }
+      String newResponsibleUser;
+      if(responsibility.getNewResponsibleUser()!=null && responsibility.getNewResponsibleUser().isEmpty()){
+        newResponsibleUser = null;
+      } else {
+        newResponsibleUser = responsibility.getNewResponsibleUser();
+      }
+      tblResponsibility.setNewResponsibleUser(newResponsibleUser);
+
+    } else if (("confirmResponsibilities").equals(mode)){
+      if (confirmResponsibilitiesCheck(tblResponsibility, responsibility, gridLocationJson)){
+        //Data is outdated, we  have to reload and fill the form with the newer, recent data
+        throw new BtbGone(Globals.DATA_OUTDATED);
+      }
+
+      if (responsibility.isActive()) {
+        tblResponsibility.setResponsibleUser(responsibility.getNewResponsibleUser());
+      }
+      // else : user declined to take over the responsibility, old user is still responsible
+
+      tblResponsibility.setNewResponsibleUser(null);
+    }
+
+    Timestamp now = new Timestamp(System.currentTimeMillis());
+    tblResponsibility.setModDate(now);
+    tblResponsibility.setModUser(moduser);
+
+    return tblResponsibility;
+  }
+
+  public List<TblResponsibility> mapFromVModelList(List<TerritoryResponsibility> territoryResponsibilities,
+      List<TblResponsibility> currentTblResponsibilityList, String moduser, String mode) throws BtbGone {
+    LOGGER.debug("mapFromVModelList() is called");
+
+    Map<Integer, TblResponsibility> responsibilityHashMap = new LinkedHashMap<>();
+    for (TblResponsibility currentTblResponsibility : currentTblResponsibilityList) {
+      responsibilityHashMap.put(currentTblResponsibility.getId(),currentTblResponsibility);
+    }
+
+    List<TblResponsibility> tblResponsibilityListRet = new ArrayList<>();
+
+    for (TerritoryResponsibility territoryResponsibility : territoryResponsibilities) {
+      String gridLocationJson = territoryResponsibility.getGridTerritoryDescription();
+
+      List<Responsibility> responsibilityList = territoryResponsibility.getResponsibilityList();
+      for (Responsibility responsibility : responsibilityList) {
+        tblResponsibilityListRet.add(processResponsibilities(responsibility, responsibilityHashMap, mode, gridLocationJson, moduser));
+      }
+    }
+
+    if (responsibilityHashMap.size() != tblResponsibilityListRet.size()) {
+      //current user has gained or has lost responsibilities -> outdated
+      throw new BtbGone(Globals.DATA_OUTDATED);
+    }
+
+    LOGGER.debug("mapFromVModelList() is finished");
+    return tblResponsibilityListRet;
+  }
+}
diff --git a/src/main/java/org/eclipse/openk/elogbook/common/util/Comparators.java b/src/main/java/org/eclipse/openk/elogbook/common/util/Comparators.java
new file mode 100644
index 0000000..adae13a
--- /dev/null
+++ b/src/main/java/org/eclipse/openk/elogbook/common/util/Comparators.java
@@ -0,0 +1,23 @@
+package org.eclipse.openk.elogbook.common.util;
+
+import java.io.Serializable;
+import java.util.Comparator;
+import org.eclipse.openk.elogbook.persistence.model.TblResponsibility;
+
+public class Comparators {
+
+  private Comparators() {
+    throw new IllegalStateException("Utility class (Comparator Container)");
+  }
+
+  public static class TblResponsibilityIdComparator implements Comparator<TblResponsibility>, Serializable{
+
+    private static final long serialVersionUID = 1L;
+
+    @Override
+    public int compare(TblResponsibility o1, TblResponsibility o2) {
+      return o1.getId().compareTo(o2.getId());
+    }
+  }
+
+}
diff --git a/src/main/java/org/eclipse/openk/elogbook/common/util/HashingAlgo.java b/src/main/java/org/eclipse/openk/elogbook/common/util/HashingAlgo.java
new file mode 100644
index 0000000..328f19e
--- /dev/null
+++ b/src/main/java/org/eclipse/openk/elogbook/common/util/HashingAlgo.java
@@ -0,0 +1,21 @@
+package org.eclipse.openk.elogbook.common.util;
+
+import java.security.MessageDigest;
+import org.apache.commons.codec.binary.Hex;
+
+public final class HashingAlgo {
+    private HashingAlgo() {}
+
+    public static String hashIt(String pwdClear) {
+        MessageDigest cript;
+        try {
+            cript = MessageDigest.getInstance("SHA-1");
+            cript.reset();
+            cript.update(pwdClear.getBytes("utf8"));
+            return new String(Hex.encodeHex(cript.digest()));
+
+        } catch (Exception e) { //NOSONAR
+            return null;
+        }
+    }
+}
diff --git a/src/main/java/org/eclipse/openk/elogbook/common/util/LoggerUtil.java b/src/main/java/org/eclipse/openk/elogbook/common/util/LoggerUtil.java
new file mode 100644
index 0000000..d5971dd
--- /dev/null
+++ b/src/main/java/org/eclipse/openk/elogbook/common/util/LoggerUtil.java
@@ -0,0 +1,71 @@
+package org.eclipse.openk.elogbook.common.util;
+
+import java.io.IOException;
+import javax.servlet.ServletContext;
+import javax.servlet.ServletException;
+import javax.servlet.http.HttpServlet;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import org.apache.log4j.Appender;
+import org.apache.log4j.BasicConfigurator;
+import org.apache.log4j.Layout;
+import org.apache.log4j.Level;
+import org.apache.log4j.PatternLayout;
+import org.apache.log4j.net.SyslogAppender;
+import org.apache.log4j.spi.RootLogger;
+import org.apache.log4j.xml.DOMConfigurator;
+
+/**
+ * <b>LoggerConfig</b><br>
+ * Logging Implementierung
+ */
+public final class LoggerUtil extends HttpServlet {
+    /**
+     * serialVersionUID.
+     */
+    private static final long serialVersionUID = 1L;
+
+    /*
+     * (non-Javadoc)
+     * @see javax.servlet.GenericServlet#init()
+     */
+    @Override
+    public void init() {
+        final ServletContext context = getServletContext();
+
+        if (Boolean.valueOf(context.getInitParameter("param.syslog.use"))) {
+            // configure for syslog using parameters specified in configuration descriptor
+            BasicConfigurator.resetConfiguration();
+
+            final String level = context.getInitParameter("param.syslog.level");
+            RootLogger.getRootLogger().setLevel(Level.toLevel(level));
+
+            final String host = context.getInitParameter("param.syslog.host");
+            final String facility = context.getInitParameter("param.syslog.facility");
+            final Layout layout = new PatternLayout("[%d{yyyy.MM.dd HH:mm:ss}] [%p] [%c] %m%n");
+            final Appender syslogAppender = new SyslogAppender(layout, host,
+                    SyslogAppender.getFacility(facility));
+            BasicConfigurator.configure(syslogAppender);
+
+        } else {
+            // configure using parameters specified in xml file
+            final String prefix = context.getRealPath("/");
+            final String file = getInitParameter("log4j-init-file");
+
+            if (prefix != null && file != null) {
+                DOMConfigurator.configure(prefix + file);
+            }
+        }
+    }
+
+    /*
+     * (non-Javadoc)
+     * @see javax.servlet.http.HttpServlet#doGet(javax.servlet.http.HttpServletRequest,
+     * javax.servlet.http.HttpServletResponse)
+     */
+    @Override
+    protected void doGet(final HttpServletRequest req, final HttpServletResponse resp)
+            throws ServletException, IOException {
+        // Nothing done on purpose.
+    }
+}
diff --git a/src/main/java/org/eclipse/openk/elogbook/common/util/ResourceLoaderBase.java b/src/main/java/org/eclipse/openk/elogbook/common/util/ResourceLoaderBase.java
new file mode 100644
index 0000000..c879486
--- /dev/null
+++ b/src/main/java/org/eclipse/openk/elogbook/common/util/ResourceLoaderBase.java
@@ -0,0 +1,25 @@
+package org.eclipse.openk.elogbook.common.util;
+
+import java.io.InputStream;
+import java.io.StringWriter;
+import org.apache.commons.io.IOUtils;
+
+public class ResourceLoaderBase {
+    private String stream2String(InputStream is) {
+        StringWriter writer = new StringWriter();
+        try {
+            IOUtils.copy(is, writer, "UTF-8");
+        } catch (Exception e) { // NOSONAR
+            return "";
+        }
+        return writer.toString();
+
+
+    }
+
+    public String loadStringFromResource(String filename) {
+        ClassLoader classLoader = Thread.currentThread().getContextClassLoader();
+        InputStream jsonstream = classLoader.getResourceAsStream(filename);
+        return stream2String(jsonstream);
+    }
+}
diff --git a/src/main/java/org/eclipse/openk/elogbook/communication/RestServiceWrapper.java b/src/main/java/org/eclipse/openk/elogbook/communication/RestServiceWrapper.java
new file mode 100644
index 0000000..0291bf5
--- /dev/null
+++ b/src/main/java/org/eclipse/openk/elogbook/communication/RestServiceWrapper.java
@@ -0,0 +1,136 @@
+package org.eclipse.openk.elogbook.communication;
+
+import org.apache.http.HttpResponse;
+import org.apache.http.HttpStatus;
+import org.apache.http.client.methods.HttpGet;
+import org.apache.http.client.methods.HttpPost;
+import org.apache.http.conn.ssl.SSLConnectionSocketFactory;
+import org.apache.http.conn.ssl.TrustSelfSignedStrategy;
+import org.apache.http.entity.StringEntity;
+import org.apache.http.impl.client.CloseableHttpClient;
+import org.apache.http.impl.client.HttpClientBuilder;
+import org.apache.http.impl.client.HttpClients;
+import org.apache.http.ssl.SSLContextBuilder;
+import org.apache.http.util.EntityUtils;
+import org.apache.log4j.Logger;
+import org.eclipse.openk.elogbook.auth2.util.JwtHelper;
+import org.eclipse.openk.elogbook.common.Globals;
+import org.eclipse.openk.elogbook.exceptions.*;
+import org.eclipse.openk.elogbook.viewmodel.ErrorReturn;
+
+import java.io.IOException;
+import java.nio.charset.StandardCharsets;
+
+public class RestServiceWrapper {
+    private static final Logger LOGGER = Logger.getLogger(RestServiceWrapper.class.getName());
+    private String baseURL;
+    private boolean useHttps;
+
+    public RestServiceWrapper(String baseURL, boolean https) {
+        this.baseURL = baseURL;
+        this.useHttps = https;
+    }
+
+    public String performGetRequest(String restFunctionWithParams, String token) throws BtbException {
+        LOGGER.debug("BaseUrl: " + baseURL);
+        String completeRequest = baseURL + "/" + restFunctionWithParams;
+        LOGGER.debug("CompleteUrl: " + completeRequest);
+        // create HTTP Client
+        CloseableHttpClient httpClient = createHttpsClient();
+
+        // create new Request with given URL
+        HttpGet getRequest = new HttpGet(completeRequest);
+        getRequest.addHeader("accept", Globals.HEADER_JSON_UTF8);
+
+        if (token != null)
+        {
+            String accesstoken = JwtHelper.formatToken(token);
+            getRequest.addHeader(Globals.KEYCLOAK_AUTH_TAG, "Bearer " + accesstoken);
+        } else {
+            throw new BtbUnauthorized();
+        }
+
+        HttpResponse response;
+        // Execute request an catch response
+        try {
+            response = httpClient.execute(getRequest);
+
+        } catch (IOException e) {
+            String errtext = "Communication to <" + completeRequest + "> failed!";
+            LOGGER.warn(errtext, e);
+            throw new BtbServiceUnavailable(errtext);
+        }
+
+        return createJson(response);
+    }
+
+	public String performPostRequest(String restFunctionWithParams, String token, String data) throws BtbException {
+		String completeRequest = baseURL + "/" + restFunctionWithParams;
+
+		// create HTTP Client
+		CloseableHttpClient httpClient = createHttpsClient();
+
+		// create new Post Request with given URL
+		HttpPost postRequest = new HttpPost(completeRequest);
+
+		// add additional header to getRequest which accepts application/JSON data
+		postRequest.addHeader("accept", Globals.HEADER_JSON_UTF8);
+		postRequest.addHeader("Content-Type", Globals.HEADER_JSON_UTF8);
+
+		if (token != null) {
+			String accesstoken = JwtHelper.formatToken(token);
+			postRequest.addHeader(Globals.KEYCLOAK_AUTH_TAG, "Bearer " + accesstoken);
+		} else {
+			throw new BtbUnauthorized();
+		}
+
+		postRequest.setEntity(new StringEntity(data, StandardCharsets.UTF_8));
+
+		HttpResponse response;
+		// Execute request an catch response
+		try {
+			response = httpClient.execute(postRequest);
+		} catch (IOException e) {
+			String errtext = "Communication to <" + completeRequest + "> failed!";
+			LOGGER.warn(errtext, e);
+			throw new BtbServiceUnavailable(errtext);
+		}
+		return createJson(response);
+	}
+
+    private CloseableHttpClient createHttpsClient() throws BtbInternalServerError {
+        if (useHttps) {
+            try {
+                SSLContextBuilder builder = new SSLContextBuilder();
+                builder.loadTrustMaterial(null, new TrustSelfSignedStrategy());
+                SSLConnectionSocketFactory sslsf = new SSLConnectionSocketFactory(builder.build());
+
+                return HttpClients.custom().setSSLSocketFactory(sslsf).build();
+            } catch (Exception e) {
+                LOGGER.error(e);
+                throw new BtbInternalServerError("SSLContextBuilderException");
+            }
+        } else {
+            return HttpClientBuilder.create().build();
+        }
+    }
+    
+	private String createJson(HttpResponse response) throws BtbException {
+		String retJson;
+		try {
+			retJson = EntityUtils.toString(response.getEntity(), StandardCharsets.UTF_8);
+		} catch (IOException e) {
+			LOGGER.error(e);
+			throw new BtbInternalServerError("IOException");
+		}
+
+		if (response.getStatusLine().getStatusCode() != HttpStatus.SC_OK) {
+			ErrorReturn errorReturn = new ErrorReturn();
+			errorReturn.setErrorCode(response.getStatusLine().getStatusCode());
+			errorReturn.setErrorText(response.getStatusLine().getReasonPhrase());
+			throw new BtbNestedException(errorReturn);
+		}
+		return retJson;
+	}
+
+}
diff --git a/src/main/java/org/eclipse/openk/elogbook/controller/BackendControllerNotification.java b/src/main/java/org/eclipse/openk/elogbook/controller/BackendControllerNotification.java
new file mode 100644
index 0000000..8335398
--- /dev/null
+++ b/src/main/java/org/eclipse/openk/elogbook/controller/BackendControllerNotification.java
@@ -0,0 +1,323 @@
+
+package org.eclipse.openk.elogbook.controller;
+
+import java.sql.Timestamp;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+
+import javax.persistence.EntityManager;
+
+import org.apache.log4j.Logger;
+import org.eclipse.openk.elogbook.common.JsonGeneratorBase;
+import org.eclipse.openk.elogbook.common.NotificationStatus;
+import org.eclipse.openk.elogbook.common.mapper.NotificationMapper;
+import org.eclipse.openk.elogbook.exceptions.BtbException;
+import org.eclipse.openk.elogbook.exceptions.BtbInternalServerError;
+import org.eclipse.openk.elogbook.exceptions.BtbLocked;
+import org.eclipse.openk.elogbook.persistence.dao.AutoCloseEntityManager;
+import org.eclipse.openk.elogbook.persistence.dao.EntityHelper;
+import org.eclipse.openk.elogbook.persistence.dao.HTblResponsibilityDao;
+import org.eclipse.openk.elogbook.persistence.dao.RefBranchDao;
+import org.eclipse.openk.elogbook.persistence.dao.RefGridTerritoryDao;
+import org.eclipse.openk.elogbook.persistence.dao.RefNotificationStatusDao;
+import org.eclipse.openk.elogbook.persistence.dao.TblNotificationDao;
+import org.eclipse.openk.elogbook.persistence.dao.TblResponsibilityDao;
+import org.eclipse.openk.elogbook.persistence.model.HTblResponsibility;
+import org.eclipse.openk.elogbook.persistence.model.TblNotification;
+import org.eclipse.openk.elogbook.persistence.model.TblResponsibility;
+import org.eclipse.openk.elogbook.viewmodel.GlobalSearchFilter;
+import org.eclipse.openk.elogbook.viewmodel.Notification;
+import org.eclipse.openk.elogbook.viewmodel.NotificationSearchFilter;
+import org.eclipse.openk.elogbook.viewmodel.ReminderSearchFilter;
+
+public class BackendControllerNotification {
+
+	private static final Logger LOGGER = Logger.getLogger(BackendControllerNotification.class.getName());
+
+	private static NotificationMapper notificationMapper = null;
+
+	/**
+	 * Get Notifications. If historical flag in the notification search filter is not set, the active notifications are
+	 * processed and returned. If the historial flag is set, the notifications active at the given shift change date
+	 * (must also be set) are processed and returned.
+	 *
+	 * @param listType
+	 *            the {@link Notification.ListType}
+	 * @param nsf
+	 *            the {@link NotificationSearchFilter}
+	 * @return the list of notifications matching the nfs
+	 * @throws BtbException
+	 *             if an error occurs.
+	 */
+	public List<Notification> getNotifications(Notification.ListType listType, NotificationSearchFilter nsf)
+			throws BtbException {
+		LOGGER.info("getNotifications(listType) is called");
+		LOGGER.info("-> Type=" + listType.toString());
+		LOGGER.info("-> NotificationSearchFilter=" + JsonGeneratorBase.getGson().toJson(nsf));
+		LOGGER.info("-> Request for Historical Notifications = " + (nsf != null && nsf.isHistoricalFlag()));
+
+		EntityManager emOrg = EntityHelper.getEMF().createEntityManager();
+		try (AutoCloseEntityManager em = new AutoCloseEntityManager(emOrg)) {
+			TblNotificationDao notificationDao = new TblNotificationDao(em);
+			List<TblNotification> notList;
+			if (nsf != null && nsf.isHistoricalFlag()) {
+				HTblResponsibilityDao historicalResponsibilityDao = new HTblResponsibilityDao(em);
+				notList = getHistoricalNotificationListByType(historicalResponsibilityDao, notificationDao, listType,
+						nsf);
+			} else {
+				TblResponsibilityDao responsibilityDao = new TblResponsibilityDao(em);
+				notList = getNotificationListByType(responsibilityDao, notificationDao, listType, nsf);
+			}
+			return getNotificationMapper(em).mapListToVModel(notList);
+		} finally {
+			LOGGER.info("getNotifications() is finished");
+		}
+	}
+
+	/**
+	 * Returns only the highest version for each notification.
+	 * 
+	 * @return List of Active Notifications
+	 * @throws BtbException
+	 *             Exception of Type BtbException
+	 */
+	public List<Notification> getActiveNotifications() throws BtbException {
+		LOGGER.info("getActiveNotifications() is called");
+
+		EntityManager emOrg = EntityHelper.getEMF().createEntityManager();
+		try (AutoCloseEntityManager em = new AutoCloseEntityManager(emOrg)) {
+			TblNotificationDao dao = new TblNotificationDao(em);
+			List<TblNotification> notList = dao.getActiveNotifications();
+			NotificationMapper mapper = getNotificationMapper(em);
+			List<Notification> retList = new ArrayList<>();
+			for (TblNotification tblNotification : notList) {
+				retList.add(mapper.mapToVModel(tblNotification));
+			}
+			return retList;
+		} finally {
+			LOGGER.info("getActiveNotifications() is finished");
+		}
+
+	}
+
+	public List<Notification> getNotificationsWithReminder(ReminderSearchFilter rsf) throws BtbException {
+		LOGGER.info("getNotificationsWithReminder() is called");
+		LOGGER.info("-> NotificationSearchFilter=" + JsonGeneratorBase.getGson().toJson(rsf));
+
+		EntityManager emOrg = EntityHelper.getEMF().createEntityManager();
+		try (AutoCloseEntityManager em = new AutoCloseEntityManager(emOrg)) {
+			TblNotificationDao dao = new TblNotificationDao(em);
+
+			TblResponsibilityDao responsibilityDao = new TblResponsibilityDao(em);
+			List<TblNotification> tblNotifications = getNotificationListWithReminderFilter(responsibilityDao, dao, rsf);
+
+			return getNotificationMapper(em).mapListToVModel(tblNotifications);
+		} finally {
+			LOGGER.info("getNotificationsWithReminder() is finished");
+		}
+
+	}
+
+	public Notification createNotification(Notification newNotification, String modUser) throws BtbException {
+		LOGGER.info("createNotification is called");
+
+		EntityManager emOrg = EntityHelper.getEMF().createEntityManager();
+		try (AutoCloseEntityManager em = new AutoCloseEntityManager(emOrg)) {
+			em.getTransaction().begin();
+
+			NotificationMapper mapper = getNotificationMapper(em);
+			TblNotificationDao dao = new TblNotificationDao(em);
+			if (newNotification.getId() != null) {
+				checkBlockedNotification(dao.findByIdInTx(TblNotification.class, newNotification.getId()));
+			}
+			Notification ret = storeNotificationInDB(newNotification, dao, mapper, modUser);
+			em.getTransaction().commit();
+			return ret;
+		} finally {
+			LOGGER.info("createNotification is finished");
+		}
+	}
+
+	/**
+	 * Loads a Notification from the DB.
+	 *
+	 * @param id
+	 *            - the Primary key of the notification
+	 * @return Notification with the given Id
+	 */
+	public Notification getNotificationById(Integer id) {
+		LOGGER.info("getNotificationById is called");
+
+		EntityManager emOrg = EntityHelper.getEMF().createEntityManager();
+		try (AutoCloseEntityManager em = new AutoCloseEntityManager(emOrg)) {
+			TblNotificationDao dao = new TblNotificationDao(em);
+			return getNotificationMapper(em).mapToVModel(dao.findById(TblNotification.class, id));
+		} finally {
+			LOGGER.info("getNotificationById is finished");
+		}
+	}
+
+	public List<Notification> getNotificationByIncidentId(Integer incidentId) throws BtbInternalServerError {
+		LOGGER.info("getNotificationByIncidentId is called");
+
+		EntityManager emOrg = EntityHelper.getEMF().createEntityManager();
+		try (AutoCloseEntityManager em = new AutoCloseEntityManager(emOrg)) {
+			TblNotificationDao dao = new TblNotificationDao(em);
+			return getNotificationMapper(em).mapListToVModel(dao.getByIncidentId(incidentId));
+		} finally {
+			LOGGER.info("getNotificationByIncidentId is finished");
+		}
+	}
+
+	/**
+	 * Get the search results. The search results consists of those notification who match the search criteria in the
+	 * given {@link GlobalSearchFilter}.
+	 * 
+	 * @param gsf
+	 *            the {@link GlobalSearchFilter} to define the search criteria.
+	 * @return the list of notifications matching the global search filter.
+	 * @throws BtbException
+	 *             if an error occurs.
+	 */
+	public List<Notification> getSearchResults(GlobalSearchFilter gsf) throws BtbException {
+		LOGGER.info("getSearchResults(globalSearchFilter) is called");
+		LOGGER.info("-> GlobalSearchFilter=" + JsonGeneratorBase.getGson().toJson(gsf));
+		LOGGER.info("-> Request for Global Search in all available notifications");
+
+		if (gsf == null || (!isSearchStringAvailable(gsf) && !isResponsibilityForwardingAvailable(gsf))) {
+			return new ArrayList<>();
+		}
+
+		EntityManager emOrg = EntityHelper.getEMF().createEntityManager();
+		try (AutoCloseEntityManager em = new AutoCloseEntityManager(emOrg)) {
+			return getNotificationMapper(em)
+					.mapListToVModel(new TblNotificationDao().findNotificationsMatchingSearchCriteria(gsf));
+		} finally {
+			LOGGER.info("getSearchResults() is finished");
+		}
+	}
+
+	private boolean isSearchStringAvailable(GlobalSearchFilter gsf){
+		return gsf.getSearchString() != null && !gsf.getSearchString().isEmpty();
+	}
+
+	private boolean isResponsibilityForwardingAvailable(GlobalSearchFilter gsf){
+		return gsf.getResponsibilityForwarding() != null && !gsf.getResponsibilityForwarding().isEmpty();
+	}
+
+
+	private synchronized NotificationMapper getNotificationMapper(EntityManager em) {
+		if (notificationMapper == null) {
+			LOGGER.debug("Notificationmapper initializing");
+			notificationMapper = new NotificationMapper(new RefNotificationStatusDao(em), new RefBranchDao(em),
+					new RefGridTerritoryDao(em));
+		}
+		return notificationMapper;
+	}
+
+	private List<TblNotification> getNotificationListByType(TblResponsibilityDao responsibilityDao,
+			TblNotificationDao notificationDao, Notification.ListType listType,
+			NotificationSearchFilter notificationSearchFilter) throws BtbException {
+
+		List<TblResponsibility> tblResponsibilities = new ArrayList<>();
+		if (notificationSearchFilter != null && notificationSearchFilter.getResponsibilityFilterList() != null) {
+			tblResponsibilities = responsibilityDao
+					.findResponsibilitiesByIdList(notificationSearchFilter.getResponsibilityFilterList());
+		}
+
+		switch (listType) {
+		case PAST:
+			return notificationDao.getPastNotifications(notificationSearchFilter, tblResponsibilities);
+		case OPEN:
+			return notificationDao.getOpenNotifications(notificationSearchFilter, tblResponsibilities);
+		case FUTURE:
+			return notificationDao.getFutureNotifications(notificationSearchFilter, tblResponsibilities);
+		default:
+			return Collections.emptyList();
+		}
+	}
+
+	/**
+	 * Get the historical notifications for a given list type and shift transaction id.
+	 *
+	 * @param hTblResponsibilityDao
+	 *            the {@link HTblResponsibilityDao} to obtain responsibility data.
+	 * @param notificationDao
+	 *            the {@link TblNotificationDao} to access notifications and obtain the result
+	 * @param listType
+	 *            the {@link Notification.ListType} to define the type of historical notifications
+	 * @param notificationSearchFilter
+	 *            the filter with historical flag and shift transaction id
+	 * @return the historical notifications at shift change with the given list type and transaction id
+	 * @throws BtbException
+	 *             if an error occurs
+	 */
+	private List<TblNotification> getHistoricalNotificationListByType(HTblResponsibilityDao hTblResponsibilityDao,
+			TblNotificationDao notificationDao, Notification.ListType listType,
+			NotificationSearchFilter notificationSearchFilter) throws BtbException {
+
+		List<HTblResponsibility> hTblResponsibilities = hTblResponsibilityDao
+				.findResponsibilitiesByTransactionId(notificationSearchFilter.getShiftChangeTransactionId());
+		if (hTblResponsibilities.isEmpty()) {
+			return new ArrayList<>();
+		}
+		return notificationDao.findHistoricalNotificationsByResponsibility(hTblResponsibilities, listType);
+	}
+
+	private List<TblNotification> getNotificationListWithReminderFilter(TblResponsibilityDao responsibilityDao,
+			TblNotificationDao notificationDao, ReminderSearchFilter rsf) throws BtbException {
+
+		List<TblResponsibility> tblResponsibilities = new ArrayList<>();
+		if (rsf != null && rsf.getResponsibilityFilterList() != null) {
+			tblResponsibilities = responsibilityDao.findResponsibilitiesByIdList(rsf.getResponsibilityFilterList());
+		}
+		return notificationDao.getNotificationsWithReminder(rsf, tblResponsibilities);
+	}
+
+	/**
+	 * Implements the storage of the notification and returns the persisted copy...covered by Unittest Note: we do not
+	 * update existing entries in tbl_notification. Instead we add 1 to "version" and insert a new entry.
+	 *
+	 * @param newNotification
+	 *            New Notification to store
+	 * @param ndao
+	 *            NotificationDao bound to EM
+	 * @param notificationMapper
+	 *            NotificaionMapper Objekt
+	 * @return persistedNotification Persisted Notification reloaded from db
+	 * @throws BtbInternalServerError
+	 *             Exception of Type BtbException
+	 */
+	private static Notification storeNotificationInDB(Notification newNotification, TblNotificationDao ndao,
+			NotificationMapper notificationMapper, String modUser) throws BtbInternalServerError {
+		TblNotification storable = notificationMapper.mapFromVModel(newNotification);
+		storable.setId(null);
+		if (newNotification.getIncidentId() == null) {
+			Timestamp ts = new Timestamp(System.currentTimeMillis());
+			storable.setVersion(1);
+			storable.setCreateDate(ts);
+			storable.setModDate(ts);
+		} else {
+			storable.setModDate(new Timestamp(System.currentTimeMillis()));
+			storable.setModUser(modUser);
+			storable.setVersion(storable.getVersion() + 1);
+		}
+		try {
+			ndao.persistInTx(storable);
+		} catch (Exception e) {
+			LOGGER.error("Error storing Notification", e);
+			throw new BtbInternalServerError("Error storing Notification, e");
+		}
+
+		return notificationMapper.mapToVModel(storable);
+	}
+
+	private void checkBlockedNotification(TblNotification existingNotification) throws BtbLocked {
+		if (existingNotification != null
+				&& existingNotification.getRefNotificationStatus().getId() == NotificationStatus.CLOSED.id) {
+			throw new BtbLocked();
+		}
+	}
+
+}
diff --git a/src/main/java/org/eclipse/openk/elogbook/controller/BackendControllerNotificationFile.java b/src/main/java/org/eclipse/openk/elogbook/controller/BackendControllerNotificationFile.java
new file mode 100644
index 0000000..c9b52fb
--- /dev/null
+++ b/src/main/java/org/eclipse/openk/elogbook/controller/BackendControllerNotificationFile.java
@@ -0,0 +1,194 @@
+package org.eclipse.openk.elogbook.controller;
+
+import java.io.File;
+import java.io.IOException;
+import java.nio.charset.Charset;
+import java.nio.file.Files;
+import java.nio.file.Path;
+import java.nio.file.Paths;
+import java.nio.file.attribute.BasicFileAttributes;
+import java.nio.file.attribute.FileOwnerAttributeView;
+import java.nio.file.attribute.UserPrincipal;
+import java.util.ArrayList;
+import java.util.List;
+import org.apache.commons.io.FilenameUtils;
+import org.apache.log4j.Logger;
+import org.eclipse.openk.elogbook.common.BackendConfig;
+import org.eclipse.openk.elogbook.exceptions.BtbInternalServerError;
+import org.eclipse.openk.elogbook.viewmodel.NotificationFile;
+
+public class BackendControllerNotificationFile {
+
+	private static final Logger LOGGER = Logger.getLogger(BackendControllerNotification.class.getName());
+	private static String pathName = BackendConfig.getInstance().getImportFilesFolderPath();
+	private static int fileRowToRead = BackendConfig.getInstance().getFileRowToRead();
+
+	public List<NotificationFile> getNotificationsFiles(String choice) throws BtbInternalServerError {
+
+		LOGGER.info("getNotificationsFile() is called");
+		List<NotificationFile> notificationFiles = new ArrayList<>();
+
+		File folder = new File(pathName);
+		File[] listOfFiles = folder.listFiles();
+
+		return processChoiceGetNotificationFilesWithChoice(choice, notificationFiles, listOfFiles);
+	}
+
+	private List<NotificationFile> processChoiceGetNotificationFilesWithChoice(String choice, List<NotificationFile> notificationFiles, File[] listOfFiles) throws BtbInternalServerError {
+		try {
+			if ("getImportFiles".equals(choice)) {
+				processFileListForGetImportFiles(notificationFiles, listOfFiles);
+			}
+			else if ("importFile".equals(choice)) {
+				processFileListForImportFile(notificationFiles, listOfFiles);
+			}
+			else {
+				LOGGER.info("False parameter");
+			}
+
+			return notificationFiles;
+
+		} catch (IOException e) {
+			LOGGER.info("Fehler beim Einlesen einer Datei aus dem Importverzeichnis", e);
+			throw new BtbInternalServerError("Fehler beim Einlesen einer Datei aus dem Importverzeichnis");
+		}
+
+	}
+
+
+	private void processFileListForGetImportFiles(List<NotificationFile> notificationFiles, File[] listOfFiles) throws IOException {
+		if (listOfFiles != null) {
+            for (int i = 0; i < listOfFiles.length; i++) {
+
+                if (listOfFiles[i].isFile()) {
+                    Path filePath = Paths.get(listOfFiles[i].toString());
+
+                    NotificationFile notificationFile = new NotificationFile();
+                    BasicFileAttributes attr = Files.readAttributes(filePath, BasicFileAttributes.class);
+
+                    String fileName = listOfFiles[i].getName();
+                    notificationFile.setFileName(fileName);
+
+                    String fileCreationDate = attr.creationTime().toString();
+                    notificationFile.setCreationDate(fileCreationDate);
+
+                    FileOwnerAttributeView ownerAttributeView = Files.getFileAttributeView(filePath,
+                            FileOwnerAttributeView.class);
+                    UserPrincipal owner = ownerAttributeView.getOwner();
+                    String fileCreator = owner.getName();
+                    notificationFile.setCreator(fileCreator);
+
+                    String fileType = FilenameUtils.getExtension(listOfFiles[i].getName());
+                    notificationFile.setType(fileType);
+
+                    Long fileSize = attr.size();
+                    notificationFile.setSize(fileSize);
+
+                    notificationFiles.add(notificationFile);
+
+                    LOGGER.info("File " + fileName + " Date: " + fileCreationDate + " Creator: " + fileCreator
+                            + " Type: " + fileType + " Size: " + fileSize);
+
+                } else if (listOfFiles[i].isDirectory()) {
+                    LOGGER.info("Directory " + listOfFiles[i].getName());
+                }
+            }
+        }
+	}
+
+
+
+	private void processFileListForImportFile(List<NotificationFile> notificationFiles, File[] listOfFiles) throws IOException {
+		if (listOfFiles != null) {
+            for (int i = 0; i < listOfFiles.length; i++) {
+
+                if (listOfFiles[i].isFile()) {
+                    Path filePath = Paths.get(listOfFiles[i].toString());
+
+                    NotificationFile notificationFile = new NotificationFile();
+                    String fileName = listOfFiles[i].getName();
+
+                    List<String> lines = Files.readAllLines(filePath, Charset.forName("ISO-8859-1"));
+				  	        extractFileData(notificationFile, lines);
+
+                    notificationFiles.add(notificationFile);
+
+                    LOGGER.info("File " + fileName + " loaded");
+
+                } else if (listOfFiles[i].isDirectory()) {
+                    LOGGER.info("Directory " + listOfFiles[i].getName());
+                }
+            }
+        }
+	}
+
+	private void extractFileData(NotificationFile notificationFile, List<String> lines) {
+		String wholeLine = lines.get(fileRowToRead - 1);
+
+		String[] splitedLine = wholeLine.split("\\s+", 3);
+
+		String tmpBranchAndTerritory = splitedLine[1];
+		List<String> branchAndTerritory = findBranchAndTerritory(tmpBranchAndTerritory);
+
+		String notificationText = splitedLine[2];
+
+		notificationFile.setGridTerritoryName(branchAndTerritory.get(0));
+		notificationFile.setBranchName(branchAndTerritory.get(1));
+		notificationFile.setNotificationText(notificationText);
+	}
+
+	private List<String> findBranchAndTerritory(String input) {
+
+		String tmpTerritory = Character.toString(input.charAt(0));
+		String tmpBranch = Character.toString(input.charAt(1));
+		String territory = "";
+		String branch = "";
+
+		switch (tmpTerritory) {
+		case "M":
+			territory = "MA";
+			break;
+		case "O":
+			territory = "OF";
+			break;
+		default:
+			territory = tmpTerritory;
+		}
+
+		if ("E".equals(tmpBranch)) {
+			branch = "S";
+		} else {
+			branch = tmpBranch;
+		}
+
+		List<String> output = new ArrayList<>();
+		output.add(territory);
+		output.add(branch);
+
+		return output;
+
+	}
+
+	public boolean deleteImportedFile(String fileName) {
+
+		File folder = new File(pathName);
+		File[] listOfFiles = folder.listFiles();
+		boolean deleteStatus = false;
+
+		if (listOfFiles == null) {
+			return deleteStatus;
+		}
+
+		for (int i = 0; i < listOfFiles.length; i++) {
+
+			if (listOfFiles[i].getName().equals(fileName)) {
+				if (!listOfFiles[i].delete()) {
+					LOGGER.warn("Die Datei " + listOfFiles[i].getName() + " konnte nicht gelöscht werden.");
+				}
+				deleteStatus = true;
+			}
+		}
+		return deleteStatus;
+	}
+
+}
diff --git a/src/main/java/org/eclipse/openk/elogbook/controller/BackendControllerRefInfo.java b/src/main/java/org/eclipse/openk/elogbook/controller/BackendControllerRefInfo.java
new file mode 100644
index 0000000..5a75264
--- /dev/null
+++ b/src/main/java/org/eclipse/openk/elogbook/controller/BackendControllerRefInfo.java
@@ -0,0 +1,60 @@
+
+package org.eclipse.openk.elogbook.controller;
+
+import java.util.List;
+
+import javax.persistence.EntityManager;
+
+import org.apache.log4j.Logger;
+import org.eclipse.openk.elogbook.persistence.dao.AutoCloseEntityManager;
+import org.eclipse.openk.elogbook.persistence.dao.EntityHelper;
+import org.eclipse.openk.elogbook.persistence.dao.RefBranchDao;
+import org.eclipse.openk.elogbook.persistence.dao.RefGridTerritoryDao;
+import org.eclipse.openk.elogbook.persistence.dao.RefNotificationStatusDao;
+import org.eclipse.openk.elogbook.persistence.model.RefBranch;
+import org.eclipse.openk.elogbook.persistence.model.RefGridTerritory;
+import org.eclipse.openk.elogbook.persistence.model.RefNotificationStatus;
+
+public class BackendControllerRefInfo {
+	
+	private static final Logger LOGGER = Logger.getLogger(BackendControllerRefInfo.class.getName());
+
+	public List<RefNotificationStatus> getNotificationStatuses() {
+		LOGGER.info("getNotificationStatuses is called");
+
+		EntityManager emOrg = EntityHelper.getEMF().createEntityManager();
+		try (AutoCloseEntityManager em = new AutoCloseEntityManager(emOrg)) {
+			RefNotificationStatusDao dao = new RefNotificationStatusDao(em);
+			return dao.findInTx(true, -1, 0);
+
+		} finally {
+			LOGGER.info("getNotificationStatuses is finished");
+		}
+	}
+
+	public List<RefBranch> getBranches() {
+		LOGGER.info("getBranches is called");
+
+		EntityManager emOrg = EntityHelper.getEMF().createEntityManager();
+		try (AutoCloseEntityManager em = new AutoCloseEntityManager(emOrg)) {
+			RefBranchDao dao = new RefBranchDao(em);
+			return dao.findInTx(true, -1, 0);
+
+		} finally {
+			LOGGER.info("getBranches is finished");
+		}
+	}
+
+	public List<RefGridTerritory> getGridTerritories() {
+		LOGGER.info("getGridTerritories is called");
+
+		EntityManager emOrg = EntityHelper.getEMF().createEntityManager();
+		try (AutoCloseEntityManager em = new AutoCloseEntityManager(emOrg)) {
+			RefGridTerritoryDao dao = new RefGridTerritoryDao(em);
+			return dao.findInTx(true, -1, 0);
+
+		} finally {
+			LOGGER.info("getGridTerritories is finished");
+		}
+	}
+}
diff --git a/src/main/java/org/eclipse/openk/elogbook/controller/BackendControllerResponsibility.java b/src/main/java/org/eclipse/openk/elogbook/controller/BackendControllerResponsibility.java
new file mode 100644
index 0000000..a722451
--- /dev/null
+++ b/src/main/java/org/eclipse/openk/elogbook/controller/BackendControllerResponsibility.java
@@ -0,0 +1,345 @@
+
+package org.eclipse.openk.elogbook.controller;
+
+import java.sql.Timestamp;
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.List;
+
+import javax.persistence.EntityManager;
+
+import org.apache.commons.lang.SerializationUtils;
+import org.apache.log4j.Logger;
+import org.eclipse.openk.elogbook.common.JsonGeneratorBase;
+import org.eclipse.openk.elogbook.common.mapper.HResponsibilityMapper;
+import org.eclipse.openk.elogbook.common.mapper.ResponsibilityMapper;
+import org.eclipse.openk.elogbook.common.util.Comparators.TblResponsibilityIdComparator;
+import org.eclipse.openk.elogbook.exceptions.BtbException;
+import org.eclipse.openk.elogbook.exceptions.BtbGone;
+import org.eclipse.openk.elogbook.exceptions.BtbInternalServerError;
+import org.eclipse.openk.elogbook.persistence.dao.AutoCloseEntityManager;
+import org.eclipse.openk.elogbook.persistence.dao.EntityHelper;
+import org.eclipse.openk.elogbook.persistence.dao.HTblResponsibilityDao;
+import org.eclipse.openk.elogbook.persistence.dao.RefBranchDao;
+import org.eclipse.openk.elogbook.persistence.dao.RefGridTerritoryDao;
+import org.eclipse.openk.elogbook.persistence.dao.TblResponsibilityDao;
+import org.eclipse.openk.elogbook.persistence.model.HTblResponsibility;
+import org.eclipse.openk.elogbook.persistence.model.TblResponsibility;
+import org.eclipse.openk.elogbook.viewmodel.HistoricalShiftChanges;
+import org.eclipse.openk.elogbook.viewmodel.ResponsibilitySearchFilter;
+import org.eclipse.openk.elogbook.viewmodel.TerritoryResponsibility;
+
+public class BackendControllerResponsibility {
+	
+	private static final Logger LOGGER = Logger.getLogger(BackendControllerResponsibility.class.getName());
+
+	private static ResponsibilityMapper responsibilityMapper = null;
+	private static HResponsibilityMapper historicalResponsibilityMapper = null;
+
+	public List<TerritoryResponsibility> getCurrentResponsibilities(String modUser) {
+		LOGGER.info("getCurrentResponsibilities() is called");
+
+		EntityManager emOrg = EntityHelper.getEMF().createEntityManager();
+		List<TblResponsibility> tblResponsibilityList;
+		List<TerritoryResponsibility> territoryResponsibilities;
+		try (AutoCloseEntityManager em = new AutoCloseEntityManager(emOrg)) {
+			TblResponsibilityDao dao = new TblResponsibilityDao(em);
+			tblResponsibilityList = dao.getResponsibilitiesForUser(modUser);
+			territoryResponsibilities = getResponsibilityMapper(em).mapToContainerVModelList(tblResponsibilityList);
+
+		} finally {
+			LOGGER.info("getCurrentResponsibilities is finished");
+		}
+
+		LOGGER.info("getCurrentResponsibilities() finished");
+		return territoryResponsibilities;
+
+	}
+
+	public List<TerritoryResponsibility> getPlannedResponsibilities(String modUser) {
+		LOGGER.info("getPlannedResponsibilities() is called");
+
+		EntityManager emOrg = EntityHelper.getEMF().createEntityManager();
+		List<TblResponsibility> tblResponsibilityList;
+		List<TerritoryResponsibility> territoryResponsibilities;
+		try (AutoCloseEntityManager em = new AutoCloseEntityManager(emOrg)) {
+			TblResponsibilityDao dao = new TblResponsibilityDao(em);
+			tblResponsibilityList = dao.getPlannedResponsibilitiesForUser(modUser);
+			territoryResponsibilities = getResponsibilityMapper(em).mapToContainerVModelList(tblResponsibilityList);
+
+		} finally {
+			LOGGER.info("getPlannedResponsibilities is finished");
+		}
+
+		LOGGER.info("getPlannedResponsibilities() finished");
+		return territoryResponsibilities;
+
+	}
+
+	public List<TerritoryResponsibility> getAllResponsibilities() {
+		LOGGER.info("getAllResponsibilities() is called");
+
+		EntityManager emOrg = EntityHelper.getEMF().createEntityManager();
+		List<TblResponsibility> tblResponsibilityList;
+		List<TerritoryResponsibility> territoryResponsibilities;
+		try (AutoCloseEntityManager em = new AutoCloseEntityManager(emOrg)) {
+			TblResponsibilityDao dao = new TblResponsibilityDao(em);
+			tblResponsibilityList = dao.getAllResponsibilities();
+			territoryResponsibilities = getResponsibilityMapper(em).mapToContainerVModelList(tblResponsibilityList);
+
+		} finally {
+			LOGGER.info("getAllResponsibilities is finished");
+		}
+
+		LOGGER.info("getAllResponsibilities() finished");
+		return territoryResponsibilities;
+
+	}
+
+	public List<TerritoryResponsibility> getHistoricalResponsibilitiesByTransactionId(Integer transactionId) {
+		LOGGER.info("getHistoricalResponsibilitiesByTransactionId is called");
+
+		EntityManager emOrg = EntityHelper.getEMF().createEntityManager();
+		List<HTblResponsibility> htblResponsibilityList;
+		try (AutoCloseEntityManager em = new AutoCloseEntityManager(emOrg)) {
+			HTblResponsibilityDao hdao = new HTblResponsibilityDao(em);
+			htblResponsibilityList = hdao.getHistoricalResponsibilitiesByTransactionId(transactionId);
+			return getHistoricalResponsibilityMapper(em).mapToContainerVModelList(htblResponsibilityList);
+		} finally {
+			LOGGER.info("getHistoricalResponsibilitiesByTransactionId is finished");
+		}
+	}
+
+	public List<TerritoryResponsibility> planResponsibilities(List<TerritoryResponsibility> territoryResponsibilityList,
+			String modUser) throws BtbException {
+		LOGGER.info("planResponsibilities is called");
+
+		EntityManager emOrg = EntityHelper.getEMF().createEntityManager();
+		try (AutoCloseEntityManager em = new AutoCloseEntityManager(emOrg)) {
+			em.getTransaction().begin();
+
+			TblResponsibilityDao tblResponsibilityDao = new TblResponsibilityDao(em);
+			List<TerritoryResponsibility> territoryResponsibilities = storePlannedResponsibilitiesInDB(
+					territoryResponsibilityList, tblResponsibilityDao, getResponsibilityMapper(em), modUser);
+			em.getTransaction().commit();
+			return territoryResponsibilities;
+
+		} finally {
+			LOGGER.info("planResponsibilities is finished");
+		}
+	}
+
+	public List<TerritoryResponsibility> confirmResponsibilities(
+			List<TerritoryResponsibility> territoryResponsibilityList, String modUser) throws BtbException {
+		LOGGER.info("confirmResponsibilities is called");
+		EntityManager emOrg = EntityHelper.getEMF().createEntityManager();
+		try (AutoCloseEntityManager em = new AutoCloseEntityManager(emOrg)) {
+			em.getTransaction().begin();
+
+			TblResponsibilityDao tblResponsibilityDao = new TblResponsibilityDao(em);
+			HTblResponsibilityDao htblResponsibilityDao = new HTblResponsibilityDao(em);
+			List<TblResponsibility> plannedResponsibilitiesCurrentUser = tblResponsibilityDao
+					.getPlannedResponsibilitiesForUser(modUser);
+
+			List<TblResponsibility> originalPlannedResponsibilitiesCurrentUser = new ArrayList<>();
+			for (TblResponsibility tblResponsibility : plannedResponsibilitiesCurrentUser) {
+				originalPlannedResponsibilitiesCurrentUser
+						.add((TblResponsibility) SerializationUtils.clone(tblResponsibility));
+			}
+
+			List<TerritoryResponsibility> territoryResponsibilities;
+			try {
+				territoryResponsibilities = storeConfirmedResponsibilitiesInDBAndHistorize(territoryResponsibilityList,
+						tblResponsibilityDao, htblResponsibilityDao, getResponsibilityMapper(em), modUser,
+						plannedResponsibilitiesCurrentUser, originalPlannedResponsibilitiesCurrentUser);
+			} catch (BtbGone btbGone) {
+				LOGGER.info("Data outdated catching new dataset", btbGone);
+				em.getTransaction().rollback();
+				return getResponsibilityMapper(em).mapToContainerVModelList(originalPlannedResponsibilitiesCurrentUser);
+			}
+
+			em.getTransaction().commit();
+			return territoryResponsibilities;
+
+		} finally {
+			LOGGER.info("confirmResponsibilities is finished");
+		}
+	}
+
+	/**
+	 * Find all shift changes between start date and end date (given as parameters) and return them in a list.
+	 *
+	 * @param filter
+	 *            the {@link ResponsibilitySearchFilter}
+	 * @return a list containing all shift changes over the specified period
+	 * @throws BtbException
+	 *             if an error occurs
+	 */
+	public HistoricalShiftChanges getHistoricalShiftChanges(ResponsibilitySearchFilter filter) throws BtbException {
+		LOGGER.info("getHistgoricalShiftChanges(responsibilitySearchFilter) is called");
+		LOGGER.info("-> ResponsibilitySearchFilter=" + JsonGeneratorBase.getGson().toJson(filter));
+
+		EntityManager emOrg = EntityHelper.getEMF().createEntityManager();
+		try (AutoCloseEntityManager em = new AutoCloseEntityManager(emOrg)) {
+			HTblResponsibilityDao hTblResponsibilityDao = new HTblResponsibilityDao();
+			Date transferDateFrom = filter.getTransferDateFrom();
+			Date transferDateTo = filter.getTransferDateTo();
+			List<HTblResponsibility> hTblResponsibilities = hTblResponsibilityDao
+					.findHTblResponsibilitiesInPeriod(transferDateFrom, transferDateTo);
+			return getHistoricalResponsibilityMapper(em).mapTblResponsibilitiesInPeriod(hTblResponsibilities,
+					transferDateFrom, transferDateTo);
+		} finally {
+			LOGGER.info("getHistoricalShiftChanges() is finished");
+		}
+	}
+
+	public Boolean getIsObserver(String modUser) {
+		LOGGER.info("getIsObserver() is called");
+
+		EntityManager emOrg = EntityHelper.getEMF().createEntityManager();
+		boolean isObserver = false;
+
+		try (AutoCloseEntityManager em = new AutoCloseEntityManager(emOrg)) {
+			TblResponsibilityDao dao = new TblResponsibilityDao(em);
+			List<TblResponsibility> tblResponsibilityList = dao.getNewOrCurrentResponisbleUser(modUser);
+			if (tblResponsibilityList.isEmpty()) {
+				isObserver = true;
+			}
+
+		} finally {
+			LOGGER.info("getIsObserver is finished");
+		}
+
+		LOGGER.info("getIsObserver() finished");
+		return isObserver;
+	}
+
+	private synchronized ResponsibilityMapper getResponsibilityMapper(EntityManager em) {
+		if (responsibilityMapper == null) {
+			LOGGER.debug("ResponsibilityMapper initializing");
+			responsibilityMapper = new ResponsibilityMapper(new RefGridTerritoryDao(em), new RefBranchDao(em));
+		}
+		return responsibilityMapper;
+	}
+
+	private synchronized HResponsibilityMapper getHistoricalResponsibilityMapper(EntityManager em) {
+		if (historicalResponsibilityMapper == null) {
+			LOGGER.debug("HistoricalResponsibilityMapper initializing");
+			historicalResponsibilityMapper = new HResponsibilityMapper(new RefGridTerritoryDao(em),
+					new RefBranchDao(em));
+		}
+		return historicalResponsibilityMapper;
+	}
+
+	private static List<TerritoryResponsibility> storePlannedResponsibilitiesInDB(
+			List<TerritoryResponsibility> territoryResponsibilityList, TblResponsibilityDao tdao,
+			ResponsibilityMapper responsibilityMapper, String modUser) throws BtbInternalServerError {
+
+		if (territoryResponsibilityList != null && !territoryResponsibilityList.isEmpty()) {
+
+			List<TblResponsibility> responsibilitiesForCurrentUser = tdao.getResponsibilitiesForUser(modUser);
+			List<TblResponsibility> tblResponsibilityList;
+			try {
+				tblResponsibilityList = responsibilityMapper.mapFromVModelList(territoryResponsibilityList,
+						responsibilitiesForCurrentUser, modUser, "planResponsibilities");
+			} catch (BtbGone btbGone) {
+				LOGGER.info("Data outdated catching new dataset", btbGone);
+				return responsibilityMapper.mapToContainerVModelList(responsibilitiesForCurrentUser);
+			}
+
+			for (TblResponsibility tblResponsibility : tblResponsibilityList) {
+
+				try {
+					tdao.storeInTx(tblResponsibility);
+				} catch (Exception e) {
+					LOGGER.error("Error storing Responsibilities", e);
+					throw new BtbInternalServerError("Error storing Responsibilities, e");
+				}
+			}
+		}
+		return null; // NOSONAR an empty list could also be returned as an actual result of a user for example with zero
+						// responsibilities
+		// but we have to differentiate between actual results and outdated dataset of responsibilities.
+	}
+
+	private static List<TerritoryResponsibility> storeConfirmedResponsibilitiesInDBAndHistorize(
+			List<TerritoryResponsibility> territoryResponsibilityList, TblResponsibilityDao tdao,
+			HTblResponsibilityDao htdao, ResponsibilityMapper responsibilityMapper, String modUser,
+			List<TblResponsibility> plannedResponsibilitiesCurrentUser,
+			List<TblResponsibility> originalPlannedResponsibilitiesCurrentUser) throws BtbInternalServerError, BtbGone {
+
+		if (territoryResponsibilityList != null && !territoryResponsibilityList.isEmpty()) {
+
+			List<TblResponsibility> tblResponsibilityList = responsibilityMapper.mapFromVModelList(
+					territoryResponsibilityList, plannedResponsibilitiesCurrentUser, modUser,
+					"confirmResponsibilities");
+
+			List<HTblResponsibility> historyConfirmedResponsibilities = createHistoryConfirmedResponsibilities(
+					tblResponsibilityList, originalPlannedResponsibilitiesCurrentUser, htdao, modUser);
+
+			storeConfirmedResponsibilitiesInDBForHistory(historyConfirmedResponsibilities, htdao);
+			storeConfirmedResponsibilitiesInDBinTx(tblResponsibilityList, tdao);
+
+		}
+		return null; // NOSONAR an empty list could also be returned as an actual result of a user for example with zero
+						// responsibilities
+		// but we have to differentiate between actual results and outdated dataset of responsibilities.
+	}
+
+	private static List<HTblResponsibility> createHistoryConfirmedResponsibilities(
+			List<TblResponsibility> tblResponsibilityList,
+			List<TblResponsibility> originalPlannedResponsibilitiesCurrentUser, HTblResponsibilityDao htdao,
+			String modUser) throws BtbInternalServerError {
+		LOGGER.debug("createHistoryConfirmedResponsibilities is called");
+
+		Timestamp now = new Timestamp(System.currentTimeMillis());
+		Integer lastTransactionId = htdao.getLastTransactionId();
+		lastTransactionId++;
+
+		originalPlannedResponsibilitiesCurrentUser.sort(new TblResponsibilityIdComparator());
+		tblResponsibilityList.sort(new TblResponsibilityIdComparator());
+
+		List<HTblResponsibility> hTblResponsibilityList = new ArrayList<>();
+		for (int i = 0; i < tblResponsibilityList.size(); i++) {
+			TblResponsibility tblResponsibility = tblResponsibilityList.get(i);
+			if (!tblResponsibility.getResponsibleUser().equals(modUser)) {
+				continue;
+			}
+			TblResponsibility originalPlannedResposibility = originalPlannedResponsibilitiesCurrentUser.get(i);
+			HTblResponsibility hTblResponsibility = HResponsibilityMapper.mapFromTblResponsibility(tblResponsibility);
+			hTblResponsibility.setFormerResponsibleUser(originalPlannedResposibility.getResponsibleUser());
+			hTblResponsibility.setTransactionId(lastTransactionId);
+			hTblResponsibility.setTransferDate(now);
+			hTblResponsibilityList.add(hTblResponsibility);
+		}
+
+		LOGGER.debug("createHistoryConfirmedResponsibilities is finished");
+		return hTblResponsibilityList;
+	}
+
+	private static void storeConfirmedResponsibilitiesInDBinTx(List<TblResponsibility> tblResponsibilityList,
+			TblResponsibilityDao tdao) throws BtbInternalServerError {
+		for (TblResponsibility tblResponsibility : tblResponsibilityList) {
+
+			try {
+				tdao.storeInTx(tblResponsibility);
+			} catch (Exception e) {
+				LOGGER.error("Error storing ConfirmationResponsibilities", e);
+				throw new BtbInternalServerError("Error storing ConfirmationResponsibilities, e");
+			}
+		}
+	}
+
+	private static void storeConfirmedResponsibilitiesInDBForHistory(List<HTblResponsibility> htblResponsibilityList,
+			HTblResponsibilityDao htdao) throws BtbInternalServerError {
+		for (HTblResponsibility tblResponsibility : htblResponsibilityList) {
+
+			try {
+				htdao.storeInTx(tblResponsibility);
+			} catch (Exception e) {
+				LOGGER.error("Error storing History ConfirmationResponsibilities", e);
+				throw new BtbInternalServerError("Error storing History ConfirmationResponsibilities, e");
+			}
+		}
+	}
+}
diff --git a/src/main/java/org/eclipse/openk/elogbook/controller/BackendControllerUser.java b/src/main/java/org/eclipse/openk/elogbook/controller/BackendControllerUser.java
new file mode 100644
index 0000000..fe51869
--- /dev/null
+++ b/src/main/java/org/eclipse/openk/elogbook/controller/BackendControllerUser.java
@@ -0,0 +1,82 @@
+
+package org.eclipse.openk.elogbook.controller;
+
+import java.util.List;
+import javax.persistence.EntityManager;
+import org.apache.log4j.Logger;
+import org.eclipse.openk.elogbook.auth2.model.KeyCloakUser;
+import org.eclipse.openk.elogbook.auth2.util.JwtHelper;
+import org.eclipse.openk.elogbook.common.BackendConfig;
+import org.eclipse.openk.elogbook.common.JsonGeneratorBase;
+import org.eclipse.openk.elogbook.common.mapper.KeyCloakUserMapper;
+import org.eclipse.openk.elogbook.communication.RestServiceWrapper;
+import org.eclipse.openk.elogbook.exceptions.BtbException;
+import org.eclipse.openk.elogbook.exceptions.BtbUnauthorized;
+import org.eclipse.openk.elogbook.persistence.dao.AutoCloseEntityManager;
+import org.eclipse.openk.elogbook.persistence.dao.EntityHelper;
+import org.eclipse.openk.elogbook.persistence.dao.TblNotificationDao;
+import org.eclipse.openk.elogbook.viewmodel.LoginCredentials;
+import org.eclipse.openk.elogbook.viewmodel.UserAuthentication;
+
+public class BackendControllerUser {
+	
+	private static final Logger LOGGER = Logger.getLogger(BackendControllerUser.class.getName());
+	
+	private final InputDataValuator inputDataValuator = new InputDataValuator();
+
+	public List<UserAuthentication> getUsers(String accesstoken) throws BtbException {
+		LOGGER.info("getUsers() is called");
+		RestServiceWrapper restServiceWrapper = new RestServiceWrapper(BackendConfig.getInstance().getPortalBaseURL(), false);
+
+		String keyCloakUserjson = restServiceWrapper.performGetRequest("users", accesstoken);
+		List<KeyCloakUser> keyCloakUserList = JwtHelper.getUserListFromJson(keyCloakUserjson);
+
+		List<UserAuthentication> userAuthenticationList = KeyCloakUserMapper.mapFromKeyCloakUserList(keyCloakUserList);
+		LOGGER.info("getUsers() succeeded.");
+		return userAuthenticationList;
+	}
+
+	public UserAuthentication authenticate(String credentials) throws BtbException {
+		LOGGER.info("authenticate() is called");
+
+		// valuator will throw an exception if not valid
+		inputDataValuator.checkCredentials(credentials);
+
+		LoginCredentials loginCredentials = JsonGeneratorBase.getGson().fromJson(credentials, LoginCredentials.class);
+
+		UserAuthentication ret = null;
+		for (UserAuthentication uatmp : getUsers("")) {
+			            String existedUsername = uatmp.getUsername().toLowerCase();
+            String inputUsername = loginCredentials.getUserName().toLowerCase();
+
+            String exitedPassword = uatmp.getPassword();
+            String inputPassword = loginCredentials.getPassword();
+
+            if( existedUsername.equals(inputUsername) && exitedPassword.equals(inputPassword)){
+				ret = uatmp;
+				break;
+			}
+		}
+
+		if (ret == null) {
+			throw new BtbUnauthorized("Unknown User/Password");
+		}
+
+		LOGGER.info("authenticate() succeeded.");
+		return ret;
+	}
+
+	public List<String> getAssignedUserSuggestions() throws BtbException {
+		LOGGER.info("getAssignedUserSuggestions() is called");
+
+		EntityManager emOrg = EntityHelper.getEMF().createEntityManager();
+		try (AutoCloseEntityManager em = new AutoCloseEntityManager(emOrg)) {
+			TblNotificationDao dao = new TblNotificationDao(em);
+			return dao.getAssignedUserSuggestions();
+		} finally {
+			LOGGER.info("getAssignedUserSuggestions() is finished");
+		}
+
+	}
+
+}
diff --git a/src/main/java/org/eclipse/openk/elogbook/controller/BackendControllerVersionInfo.java b/src/main/java/org/eclipse/openk/elogbook/controller/BackendControllerVersionInfo.java
new file mode 100644
index 0000000..d4c0bce
--- /dev/null
+++ b/src/main/java/org/eclipse/openk/elogbook/controller/BackendControllerVersionInfo.java
@@ -0,0 +1,40 @@
+
+package org.eclipse.openk.elogbook.controller;
+
+import javax.persistence.EntityManager;
+
+import org.apache.log4j.Logger;
+import org.eclipse.openk.elogbook.persistence.dao.AutoCloseEntityManager;
+import org.eclipse.openk.elogbook.persistence.dao.EntityHelper;
+import org.eclipse.openk.elogbook.persistence.dao.RefVersionDao;
+import org.eclipse.openk.elogbook.persistence.model.RefVersion;
+import org.eclipse.openk.elogbook.viewmodel.VersionInfo;
+
+public class BackendControllerVersionInfo {
+	
+	private static final Logger LOGGER = Logger.getLogger(BackendControllerVersionInfo.class.getName());
+
+	public VersionInfo getVersionInfo() {
+		LOGGER.info("getVersionInfo is called");
+
+		EntityManager emOrg = EntityHelper.getEMF().createEntityManager();
+		try (AutoCloseEntityManager em = new AutoCloseEntityManager(emOrg)) {
+			return getVersionInfoImpl(new RefVersionDao(em), getClass().getPackage().getImplementationVersion());
+		} finally {
+			LOGGER.info("getVersionInfo is finished");
+		}
+	}
+
+	private VersionInfo getVersionInfoImpl(RefVersionDao dao, String pomVersion) {
+		RefVersion dbVersion = dao.getVersionInTx();
+		VersionInfo vi = new VersionInfo();
+		vi.setBackendVersion(pomVersion);
+
+		if (dbVersion == null) {
+			vi.setDbVersion("NO_DB");
+		} else {
+			vi.setDbVersion(dbVersion.getVersion());
+		}
+		return vi;
+	}
+}
diff --git a/src/main/java/org/eclipse/openk/elogbook/controller/BackendInvokable.java b/src/main/java/org/eclipse/openk/elogbook/controller/BackendInvokable.java
new file mode 100644
index 0000000..d77e746
--- /dev/null
+++ b/src/main/java/org/eclipse/openk/elogbook/controller/BackendInvokable.java
@@ -0,0 +1,29 @@
+package org.eclipse.openk.elogbook.controller;
+
+import org.eclipse.openk.elogbook.exceptions.BtbException;
+
+import javax.ws.rs.core.Response;
+
+public abstract class BackendInvokable {
+
+	private String modUser;
+	private int userId;
+
+	public int getUserId() {
+		return userId;
+	}
+
+	public void setUserId(int userId) {
+		this.userId = userId;
+	}
+
+	public String getModUser() {
+		return modUser;
+	}
+
+	public void setModUser(String modUser) {
+		this.modUser = modUser;
+	}
+
+	public abstract Response invoke() throws BtbException;
+}
diff --git a/src/main/java/org/eclipse/openk/elogbook/controller/BaseWebService.java b/src/main/java/org/eclipse/openk/elogbook/controller/BaseWebService.java
new file mode 100644
index 0000000..440cdea
--- /dev/null
+++ b/src/main/java/org/eclipse/openk/elogbook/controller/BaseWebService.java
@@ -0,0 +1,75 @@
+package org.eclipse.openk.elogbook.controller;
+
+import org.apache.http.HttpStatus;
+import org.apache.log4j.Logger;
+import org.eclipse.openk.elogbook.auth2.model.JwtPayload;
+import org.eclipse.openk.elogbook.auth2.util.JwtHelper;
+import org.eclipse.openk.elogbook.exceptions.BtbException;
+import org.eclipse.openk.elogbook.exceptions.BtbExceptionMapper;
+
+import javax.ws.rs.core.Response;
+import java.util.HashMap;
+import java.util.Map;
+
+public abstract class BaseWebService {
+    public enum SecureType {NONE, NORMAL, HIGH}
+    private final Map<String, Long> currentTimeMeasures = new HashMap<>();
+    private final Logger logger;
+
+    public BaseWebService(Logger logger) {
+        this.logger = logger;
+    }
+
+    protected abstract void assertAndRefreshToken(String token, SecureType secureType) throws BtbException;
+
+    private void startProcessing(String methodName) {
+        Long lStartingTime = System.currentTimeMillis();
+        String lookupName = buildLookupId(methodName);
+        currentTimeMeasures.put(lookupName, lStartingTime);
+
+        logger.info(this.getClass().getName() + "." + lookupName + ": Start processing...");
+    }
+
+    protected AutoCloseable perform(final String methodName) {
+        startProcessing(methodName);
+        return () -> endProcessing(methodName);
+    }
+
+    private String buildLookupId(String func) {
+        return func + "@@" + Thread.currentThread().getId();
+    }
+
+    private void endProcessing(String methodName) {
+        String lookupName = buildLookupId(methodName);
+        if (currentTimeMeasures.containsKey(lookupName)) {
+            Long lStartingTime = currentTimeMeasures.get(lookupName);
+            currentTimeMeasures.remove(lookupName);
+            logger.info(
+                this.getClass().getName() + "." + lookupName + ": Finished processing in " +
+                    (System.currentTimeMillis() - lStartingTime) + " ms");
+        }
+
+    }
+
+    protected Response invoke(String token, SecureType secureType, BackendInvokable invokable)
+    {
+        try (AutoCloseable ignored = perform(invokable.getClass().getName() + ".Invoke()")) { // NOSONAR
+            if (secureType != SecureType.NONE) {
+                assertAndRefreshToken(token, secureType);
+                JwtPayload jwtPayload = JwtHelper.getJwtPayload(token);
+                invokable.setModUser(jwtPayload != null ? jwtPayload.getPreferredUsername() : "null");
+            }
+
+            return invokable.invoke();
+        } catch (BtbException bee) {
+            logger.info("Caught BackendException: " + bee.getClass().getSimpleName());
+            return Response.status(bee.getHttpStatus()).entity(BtbExceptionMapper.toJson(bee))
+                    .build();
+
+        } catch (Exception e) {
+            logger.error("Unexpected exception", e);
+            return Response.status(HttpStatus.SC_INTERNAL_SERVER_ERROR).build();
+        }
+
+    }
+}
diff --git a/src/main/java/org/eclipse/openk/elogbook/controller/ControllerImplementations.java b/src/main/java/org/eclipse/openk/elogbook/controller/ControllerImplementations.java
new file mode 100644
index 0000000..1605554
--- /dev/null
+++ b/src/main/java/org/eclipse/openk/elogbook/controller/ControllerImplementations.java
@@ -0,0 +1,487 @@
+package org.eclipse.openk.elogbook.controller;
+
+import com.google.gson.reflect.TypeToken;
+import org.eclipse.openk.elogbook.common.JsonGeneratorBase;
+import org.eclipse.openk.elogbook.exceptions.BtbException;
+import org.eclipse.openk.elogbook.exceptions.BtbExceptionMapper;
+import org.eclipse.openk.elogbook.persistence.model.RefBranch;
+import org.eclipse.openk.elogbook.persistence.model.RefGridTerritory;
+import org.eclipse.openk.elogbook.persistence.model.RefNotificationStatus;
+import org.eclipse.openk.elogbook.viewmodel.GlobalSearchFilter;
+import org.eclipse.openk.elogbook.viewmodel.HistoricalShiftChanges;
+import org.eclipse.openk.elogbook.viewmodel.ListTypeMapper;
+import org.eclipse.openk.elogbook.viewmodel.Notification;
+import org.eclipse.openk.elogbook.viewmodel.NotificationFile;
+import org.eclipse.openk.elogbook.viewmodel.NotificationSearchFilter;
+import org.eclipse.openk.elogbook.viewmodel.ReminderSearchFilter;
+import org.eclipse.openk.elogbook.viewmodel.ResponsibilitySearchFilter;
+import org.eclipse.openk.elogbook.viewmodel.TerritoryResponsibility;
+import org.eclipse.openk.elogbook.viewmodel.UserAuthentication;
+import org.eclipse.openk.elogbook.viewmodel.VersionInfo;
+
+import javax.ws.rs.core.Response;
+import java.util.List;
+
+public class ControllerImplementations {
+	private ControllerImplementations() {
+	}
+
+	public static class GetVersionInfo extends BackendInvokable {
+
+		private BackendControllerVersionInfo backendControllerVersionInfo;
+
+		public GetVersionInfo(BackendControllerVersionInfo backendControllerVersionInfo) {
+			this.backendControllerVersionInfo = backendControllerVersionInfo;
+		}
+
+		@Override
+		public Response invoke() throws BtbException {
+			VersionInfo vi = backendControllerVersionInfo.getVersionInfo();
+			return ResponseBuilderWrapper.INSTANCE.buildOKResponse(JsonGeneratorBase.getGson().toJson(vi));
+		}
+	}
+
+	public static class GetNotificationStatuses extends BackendInvokable {
+
+		private BackendControllerRefInfo backendControllerRefInfo;
+
+		public GetNotificationStatuses(BackendControllerRefInfo backendControllerRefInfo) {
+			this.backendControllerRefInfo = backendControllerRefInfo;
+		}
+
+		@Override
+		public Response invoke() throws BtbException {
+			List<RefNotificationStatus> statusList = backendControllerRefInfo.getNotificationStatuses();
+			return ResponseBuilderWrapper.INSTANCE.buildOKResponse(JsonGeneratorBase.getGson().toJson(statusList));
+		}
+	}
+
+	public static class GetBranches extends BackendInvokable {
+		
+		private BackendControllerRefInfo backendControllerRefInfo;
+
+		public GetBranches(BackendControllerRefInfo backendControllerRefInfo) {
+			this.backendControllerRefInfo = backendControllerRefInfo;
+		}
+		
+		@Override
+		public Response invoke() throws BtbException {
+			List<RefBranch> branches = backendControllerRefInfo.getBranches();
+			return ResponseBuilderWrapper.INSTANCE.buildOKResponse(JsonGeneratorBase.getGson().toJson(branches));
+		}
+	}
+
+	public static class GetGridTerritories extends BackendInvokable {
+
+		private BackendControllerRefInfo backendControllerRefInfo;
+
+		public GetGridTerritories(BackendControllerRefInfo backendControllerRefInfo) {
+			this.backendControllerRefInfo = backendControllerRefInfo;
+		}
+
+		@Override
+		public Response invoke() throws BtbException {
+			List<RefGridTerritory> refGridTerritories = backendControllerRefInfo.getGridTerritories();
+			return ResponseBuilderWrapper.INSTANCE
+					.buildOKResponse(JsonGeneratorBase.getGson().toJson(refGridTerritories));
+		}
+	}
+
+	public static class GetCurrentResponsibilities extends BackendInvokable {
+		private BackendControllerResponsibility backendControllerResponsibility;
+
+		public GetCurrentResponsibilities(BackendControllerResponsibility backendControllerResponsibility) {
+			this.backendControllerResponsibility = backendControllerResponsibility;
+		}
+
+		@Override
+		public Response invoke() throws BtbException {
+			List<TerritoryResponsibility> responsibilities = backendControllerResponsibility
+					.getCurrentResponsibilities(getModUser());
+			return ResponseBuilderWrapper.INSTANCE
+					.buildOKResponse(JsonGeneratorBase.getGson().toJson(responsibilities));
+		}
+	}
+
+	public static class GetPlannedResponsibilities extends BackendInvokable {
+		private BackendControllerResponsibility backendControllerResponsibility;
+
+		public GetPlannedResponsibilities(BackendControllerResponsibility backendControllerResponsibility) {
+			this.backendControllerResponsibility = backendControllerResponsibility;
+		}
+
+		@Override
+		public Response invoke() throws BtbException {
+			List<TerritoryResponsibility> responsibilities = backendControllerResponsibility
+					.getPlannedResponsibilities(getModUser());
+			return ResponseBuilderWrapper.INSTANCE
+					.buildOKResponse(JsonGeneratorBase.getGson().toJson(responsibilities));
+		}
+	}
+
+	public static class GetAllResponsibilities extends BackendInvokable {
+
+		private BackendControllerResponsibility backendControllerResponsibility;
+
+		public GetAllResponsibilities(BackendControllerResponsibility backendControllerResponsibility) {
+			this.backendControllerResponsibility = backendControllerResponsibility;
+		}
+
+		@Override
+		public Response invoke() throws BtbException {
+			List<TerritoryResponsibility> responsibilities = backendControllerResponsibility.getAllResponsibilities();
+			return ResponseBuilderWrapper.INSTANCE
+					.buildOKResponse(JsonGeneratorBase.getGson().toJson(responsibilities));
+		}
+	}
+
+	public static class GetHistoricalResponsibilitiesByTransactionId extends BackendInvokable {
+		private String transactionId;
+		private BackendControllerResponsibility backendControllerResponsibility;
+
+		public GetHistoricalResponsibilitiesByTransactionId(String transactionId,
+				BackendControllerResponsibility backendControllerResponsibility) {
+			this.transactionId = transactionId;
+			this.backendControllerResponsibility = backendControllerResponsibility;
+		}
+
+		@Override
+		public Response invoke() throws BtbException {
+			InputDataValuator.checkHistoricalResponsibilityId(transactionId);
+			List<TerritoryResponsibility> territoryResponsibilities = backendControllerResponsibility
+					.getHistoricalResponsibilitiesByTransactionId(Integer.valueOf(transactionId));
+			return ResponseBuilderWrapper.INSTANCE
+					.buildOKResponse(JsonGeneratorBase.getGson().toJson(territoryResponsibilities));
+		}
+	}
+
+	public static class PostResponsibilities extends BackendInvokable {
+
+		private String responsibilitiesJson;
+		private BackendControllerResponsibility backendControllerResponsibility;
+
+		public PostResponsibilities(String responsibilities,
+				BackendControllerResponsibility backendControllerResponsibility) {
+			this.responsibilitiesJson = responsibilities;
+			this.backendControllerResponsibility = backendControllerResponsibility;
+		}
+
+		@Override
+		public Response invoke() throws BtbException {
+			new InputDataValuator().checkIncomingSearchFilter(responsibilitiesJson);
+			List<TerritoryResponsibility> territoryResponsibilityList = JsonGeneratorBase.getGson()
+					.fromJson(responsibilitiesJson, new TypeToken<List<TerritoryResponsibility>>() {
+					}.getType());
+			List<TerritoryResponsibility> newerResponsibilityList = backendControllerResponsibility
+					.planResponsibilities(territoryResponsibilityList, getModUser());
+			if (newerResponsibilityList == null) {
+				return ResponseBuilderWrapper.INSTANCE.buildOKResponse(BtbExceptionMapper.getGeneralOKJson());
+			} else {
+				return ResponseBuilderWrapper.INSTANCE
+						.buildOKResponse(JsonGeneratorBase.getGson().toJson(newerResponsibilityList));
+			}
+		}
+	}
+
+	public static class PostResponsibilitiesConfirmation extends BackendInvokable {
+
+		private String responsibilitiesJson;
+		private BackendControllerResponsibility backendControllerResponsibility;
+
+		public PostResponsibilitiesConfirmation(String responsibilities,
+				BackendControllerResponsibility backendControllerResponsibility) {
+			this.responsibilitiesJson = responsibilities;
+			this.backendControllerResponsibility = backendControllerResponsibility;
+		}
+
+		@Override
+		public Response invoke() throws BtbException {
+			new InputDataValuator().checkIncomingSearchFilter(responsibilitiesJson);
+			List<TerritoryResponsibility> territoryResponsiblityList = JsonGeneratorBase.getGson()
+					.fromJson(responsibilitiesJson, new TypeToken<List<TerritoryResponsibility>>() {
+					}.getType()); 
+			// its unlikely but the same incident which can occur when PostResponsibilities is called could arise here
+			// aswell:
+			// data could be outdated and has to be updated and to be sent to the FE (reload view)
+			List<TerritoryResponsibility> newerResponsibilityList = backendControllerResponsibility
+					.confirmResponsibilities(territoryResponsiblityList, getModUser());
+			if (newerResponsibilityList == null) {
+				return ResponseBuilderWrapper.INSTANCE.buildOKResponse(BtbExceptionMapper.getGeneralOKJson());
+			} else {
+				return ResponseBuilderWrapper.INSTANCE
+						.buildOKResponse(JsonGeneratorBase.getGson().toJson(newerResponsibilityList));
+			}
+		}
+	}
+
+	public static class GetIsObserver extends BackendInvokable {
+		private BackendControllerResponsibility backendControllerResponsibility;
+
+		public GetIsObserver(BackendControllerResponsibility backendControllerResponsibility) {
+			this.backendControllerResponsibility = backendControllerResponsibility;
+		}
+
+		@Override
+		public Response invoke() throws BtbException {
+			Boolean isObserver = backendControllerResponsibility.getIsObserver(getModUser());
+			return ResponseBuilderWrapper.INSTANCE.buildOKResponse(JsonGeneratorBase.getGson().toJson(isObserver));
+		}
+	}
+
+	public static class GetUsers extends BackendInvokable {
+		BackendControllerUser backendControllerUser;
+		String token;
+
+		public GetUsers(BackendControllerUser backendControllerUser, String token) {
+			this.backendControllerUser = backendControllerUser;
+			this.token = token;
+		}
+
+		@Override
+		public Response invoke() throws BtbException {
+			List<UserAuthentication> userAuthenticationList = backendControllerUser.getUsers(token);
+			return ResponseBuilderWrapper.INSTANCE
+					.buildOKResponse(JsonGeneratorBase.getGson().toJson(userAuthenticationList));
+		}
+	}
+
+	public static class GetNotifications extends BackendInvokable {
+		private String listType;
+		private String notificationSearchFilterJson;
+		private BackendControllerNotification backendControllerNotification;
+
+		public GetNotifications(String listType, String notSearchFilter,
+				BackendControllerNotification backendControllerNotification) {
+			this.listType = listType;
+			this.notificationSearchFilterJson = notSearchFilter;
+			this.backendControllerNotification = backendControllerNotification;
+		}
+
+		@Override
+		public Response invoke() throws BtbException {
+			new InputDataValuator().checkIncomingSearchFilter(notificationSearchFilterJson);
+			NotificationSearchFilter nsf = JsonGeneratorBase.getGson().fromJson(notificationSearchFilterJson,
+					NotificationSearchFilter.class);
+			List<Notification> notifications = backendControllerNotification
+					.getNotifications(ListTypeMapper.listTypeFromString(listType), nsf);
+			return ResponseBuilderWrapper.INSTANCE.buildOKResponse(JsonGeneratorBase.getGson().toJson(notifications));
+		}
+	}
+
+	/**
+	 * Provide the search results for the search criteria defined in the filter for global search.
+	 */
+	public static class GetSearchResults extends BackendInvokable {
+		private String globalSearchFilterJson;
+		private BackendControllerNotification backendControllerNotification;
+
+		/**
+		 * Constructor.
+		 * 
+		 * @param globalSearchFilter
+		 *            the {@link GlobalSearchFilter} containing the search criteria.
+		 */
+		public GetSearchResults(String globalSearchFilter,
+				BackendControllerNotification backendControllerNotification) {
+			this.globalSearchFilterJson = globalSearchFilter;
+			this.backendControllerNotification = backendControllerNotification;
+		}
+
+		/*
+		 * (non-Javadoc)
+		 * 
+		 * @see org.eclipse.openk.elogbook.controller.BaseWebService.Invokable#invoke()
+		 */
+		@Override
+		public Response invoke() throws BtbException {
+			new InputDataValuator().checkIncomingSearchFilter(globalSearchFilterJson);
+			GlobalSearchFilter globalSearchFilter = JsonGeneratorBase.getGson().fromJson(globalSearchFilterJson,
+					GlobalSearchFilter.class);
+			List<Notification> notifications = backendControllerNotification.getSearchResults(globalSearchFilter);
+			return ResponseBuilderWrapper.INSTANCE.buildOKResponse(JsonGeneratorBase.getGson().toJson(notifications));
+		}
+	}
+
+	public static class GetHistoricalShiftChangeList extends BackendInvokable {
+
+		private String responsibilitySearchFilterJson;
+		private BackendControllerResponsibility backendControllerResponsibility;
+
+		public GetHistoricalShiftChangeList(String responsibilitySearchFilter,
+				BackendControllerResponsibility backendControllerResponsibility) {
+			this.responsibilitySearchFilterJson = responsibilitySearchFilter;
+			this.backendControllerResponsibility = backendControllerResponsibility;
+		}
+
+		@Override
+		public Response invoke() throws BtbException {
+			ResponsibilitySearchFilter filter = JsonGeneratorBase.getGson().fromJson(responsibilitySearchFilterJson,
+					ResponsibilitySearchFilter.class);
+			HistoricalShiftChanges historicalShiftChanges = backendControllerResponsibility
+					.getHistoricalShiftChanges(filter);
+			return ResponseBuilderWrapper.INSTANCE
+					.buildOKResponse(JsonGeneratorBase.getGson().toJson(historicalShiftChanges));
+		}
+	}
+
+	public static class GetNotificationsByIncidentId extends BackendInvokable {
+		private String incidentId;
+		private BackendControllerNotification backendControllerNotification;
+
+		public GetNotificationsByIncidentId(String incidentId,
+				BackendControllerNotification backendControllerNotification) {
+			this.incidentId = incidentId;
+			this.backendControllerNotification = backendControllerNotification;
+		}
+
+		@Override
+		public Response invoke() throws BtbException {
+			InputDataValuator.checkNotificationId(incidentId);
+			List<Notification> notifications = backendControllerNotification
+					.getNotificationByIncidentId(Integer.valueOf(incidentId));
+			return ResponseBuilderWrapper.INSTANCE.buildOKResponse(JsonGeneratorBase.getGson().toJson(notifications));
+		}
+	}
+
+	public static class CreateNotification extends BackendInvokable {
+		private String notificationJson;
+		private BackendControllerNotification backendControllerNotification;
+
+		public CreateNotification(String newNotification, BackendControllerNotification backendControllerNotification) {
+			this.notificationJson = newNotification;
+			this.backendControllerNotification = backendControllerNotification;
+		}
+
+		@Override
+		public Response invoke() throws BtbException {
+			new InputDataValuator().checkNotification(notificationJson);
+			Notification notification = JsonGeneratorBase.getGson().fromJson(notificationJson, Notification.class);
+			Notification persistedNotification = backendControllerNotification.createNotification(notification,
+					getModUser());
+			return ResponseBuilderWrapper.INSTANCE
+					.buildOKResponse(JsonGeneratorBase.getGson().toJson(persistedNotification));
+		}
+	}
+
+	public static class GetNotificationById extends BackendInvokable {
+		private String id;
+		private BackendControllerNotification backendControllerNotification;
+
+		public GetNotificationById(String id, BackendControllerNotification backendControllerNotification) {
+			this.id = id;
+			this.backendControllerNotification = backendControllerNotification;
+		}
+
+		@Override
+		public Response invoke() throws BtbException {
+			InputDataValuator.checkNotificationId(id);
+			Notification persistedNotification = backendControllerNotification.getNotificationById(Integer.valueOf(id));
+			return ResponseBuilderWrapper.INSTANCE
+					.buildOKResponse(JsonGeneratorBase.getGson().toJson(persistedNotification));
+		}
+	}
+
+	public static class GetActiveNotifications extends BackendInvokable {
+
+		private BackendControllerNotification backendControllerNotification;
+
+		public GetActiveNotifications(BackendControllerNotification backendControllerNotification) {
+			this.backendControllerNotification = backendControllerNotification;
+		}
+
+		@Override
+		public Response invoke() throws BtbException {
+			List<Notification> notificationList = backendControllerNotification.getActiveNotifications();
+			return ResponseBuilderWrapper.INSTANCE
+					.buildOKResponse(JsonGeneratorBase.getGson().toJson(notificationList));
+		}
+	}
+
+	public static class GetImportFiles extends BackendInvokable {
+
+		private BackendControllerNotificationFile backendControllerNotificationFile;
+
+		public GetImportFiles(BackendControllerNotificationFile backendControllerNotificationFile) {
+			this.backendControllerNotificationFile = backendControllerNotificationFile;
+		}
+
+		@Override
+		public Response invoke() throws BtbException {
+			List<NotificationFile> notificationFileList = backendControllerNotificationFile.getNotificationsFiles("getImportFiles");
+			return ResponseBuilderWrapper.INSTANCE
+					.buildOKResponse(JsonGeneratorBase.getGson().toJson(notificationFileList));
+		}
+	}
+
+	public static class ImportFile extends BackendInvokable {
+
+		private BackendControllerNotificationFile backendControllerNotificationFile;
+
+		public ImportFile(BackendControllerNotificationFile backendControllerNotificationFile) {
+			this.backendControllerNotificationFile = backendControllerNotificationFile;
+		}
+
+		@Override
+		public Response invoke() throws BtbException {
+			List<NotificationFile> notificationFileList = backendControllerNotificationFile.getNotificationsFiles("importFile");
+			return ResponseBuilderWrapper.INSTANCE
+					.buildOKResponse(JsonGeneratorBase.getGson().toJson(notificationFileList));
+		}
+	}
+
+	public static class DeleteImportedFiles extends BackendInvokable {
+
+		private String fileName;
+		private BackendControllerNotificationFile backendControllerNotificationFile;
+
+		public DeleteImportedFiles(String fileName, BackendControllerNotificationFile backendControllerNotificationFile) {
+			this.fileName = fileName;
+			this.backendControllerNotificationFile = backendControllerNotificationFile;
+		}
+
+		@Override
+		public Response invoke() throws BtbException {
+			boolean deleteStatus = backendControllerNotificationFile.deleteImportedFile(fileName);
+			return ResponseBuilderWrapper.INSTANCE
+					.buildOKResponse(JsonGeneratorBase.getGson().toJson(deleteStatus));
+		}
+	}
+
+	public static class GetCurrentReminders extends BackendInvokable {
+
+		private String reminderSearchFilterJson;
+		private BackendControllerNotification backendControllerNotification;
+
+		public GetCurrentReminders(String reminderSearchFilter,
+				BackendControllerNotification backendControllerNotification) {
+			this.reminderSearchFilterJson = reminderSearchFilter;
+			this.backendControllerNotification = backendControllerNotification;
+		}
+
+		@Override
+		public Response invoke() throws BtbException {
+			new InputDataValuator().checkIncomingSearchFilter(reminderSearchFilterJson);
+			ReminderSearchFilter rsf = JsonGeneratorBase.getGson().fromJson(reminderSearchFilterJson,
+					ReminderSearchFilter.class);
+			List<Notification> notificationList = backendControllerNotification.getNotificationsWithReminder(rsf);
+			return ResponseBuilderWrapper.INSTANCE
+					.buildOKResponse(JsonGeneratorBase.getGson().toJson(notificationList));
+		}
+	}
+
+	public static class GetAssignedUserSuggestions extends BackendInvokable {
+
+		private BackendControllerUser backendControllerUser;
+
+		public GetAssignedUserSuggestions(BackendControllerUser backendControllerUser) {
+			this.backendControllerUser = backendControllerUser;
+		}
+
+		@Override
+		public Response invoke() throws BtbException {
+			List<String> assignedUserSuggestionsList = backendControllerUser.getAssignedUserSuggestions();
+			return ResponseBuilderWrapper.INSTANCE
+					.buildOKResponse(JsonGeneratorBase.getGson().toJson(assignedUserSuggestionsList));
+		}
+	}
+}
\ No newline at end of file
diff --git a/src/main/java/org/eclipse/openk/elogbook/controller/InputDataValuator.java b/src/main/java/org/eclipse/openk/elogbook/controller/InputDataValuator.java
new file mode 100644
index 0000000..3b5ced7
--- /dev/null
+++ b/src/main/java/org/eclipse/openk/elogbook/controller/InputDataValuator.java
@@ -0,0 +1,105 @@
+package org.eclipse.openk.elogbook.controller;
+
+import org.apache.log4j.Logger;
+import org.eclipse.openk.elogbook.common.Globals;
+import org.eclipse.openk.elogbook.common.JsonGeneratorBase;
+import org.eclipse.openk.elogbook.exceptions.BtbBadRequest;
+import org.eclipse.openk.elogbook.exceptions.BtbUnauthorized;
+import org.eclipse.openk.elogbook.viewmodel.LoginCredentials;
+
+public class InputDataValuator {
+    private static final Logger LOGGER = Logger.getLogger(InputDataValuator.class.getName());
+
+    private static final String WHITELIST = "[^a-zA-ZäÄöÖüÜß?0-9().,-:;_+=!%§&/'#<>\" ]";
+
+    private void checkCredentialsRaw(String credentials) throws BtbUnauthorized {
+        if (credentials == null || credentials.isEmpty()) {
+            throw new BtbUnauthorized("No credentials provided");
+        }
+        if (credentials.length() > Globals.MAX_CREDENTIALS_LENGTH) {
+            LOGGER.warn("MaxLength of credentials exceeded");
+
+            throw new BtbUnauthorized("Invalid credentials");
+        }
+    }
+
+    public void checkCredentials(String credentials) throws BtbUnauthorized {
+        checkCredentialsRaw(credentials);
+
+        LoginCredentials obj;
+        try {
+            obj = JsonGeneratorBase.getGson().fromJson(credentials, LoginCredentials.class);
+            checkWhitelistChars(obj.getPassword());
+            checkWhitelistChars(obj.getPassword());
+        } catch (Exception e) { // NOSONAR
+            obj = null;
+        }
+        if (obj == null || obj.getUserName() == null || obj.getUserName().isEmpty()) {
+            LOGGER.warn("Invalid credentials provided. ");
+            throw new BtbUnauthorized("Invalid credentials");
+        }
+    }
+
+    public void checkNotification(String notification) throws BtbBadRequest {
+        if (notification == null || notification.isEmpty()) {
+            throw new BtbBadRequest("No notification provided");
+        }
+        if (notification.length() > Globals.MAX_NOTIFICATION_LENGTH) {
+            LOGGER.warn("MaxLength of notification exceeded");
+
+            throw new BtbBadRequest("MaxLength of notification exceeded");
+        }
+    }
+
+
+    public void checkIncomingSearchFilter(String searchFilter) throws BtbBadRequest {
+        if (searchFilter == null || searchFilter.isEmpty()) {
+            return;
+        }
+        if (searchFilter.length() > Globals.MAX_NOTIFICATION_LENGTH) {
+            LOGGER.warn("MaxLength of notification search filter exceeded");
+
+            throw new BtbBadRequest("MaxLength of notification search filter exceeded");
+        }
+
+    }
+
+    public static void checkNotificationId(String id) throws BtbBadRequest {
+        if (id == null || id.isEmpty()) {
+            throw new BtbBadRequest("No id provided");
+        }
+        try {
+			Integer.parseInt(id); //NOSONAR only because of possible expected exception
+		} catch (NumberFormatException e) {
+			throw new BtbBadRequest("Invalid id for notification");
+		}
+    }
+
+    public static void checkHistoricalResponsibilityId(String id) throws BtbBadRequest {
+        if (id == null || id.isEmpty()) {
+            throw new BtbBadRequest("No id provided");
+        }
+        try {
+
+            Integer.parseInt(id); //NOSONAR  only because of possible expected exception
+        } catch (NumberFormatException e) {
+            throw new BtbBadRequest("Invalid id for responsibility");
+        }
+    }
+
+    private void checkWhitelistChars(String txt) throws BtbBadRequest {
+        checkWhitelistChars(txt, false);
+    }
+
+    private void checkWhitelistChars(String txt, boolean logTextOnError) throws BtbBadRequest {
+        // empty String is ok
+        if (txt == null || txt.isEmpty()) {
+            return;
+        }
+        String tx2 = txt.replaceAll(WHITELIST, "");
+        if (!tx2.equals(txt)) {
+            LOGGER.warn("Invalid text not matching whitelist" + (logTextOnError ? ":" + txt : ""));
+            throw new BtbBadRequest("Invalid text data");
+        }
+    }
+}
diff --git a/src/main/java/org/eclipse/openk/elogbook/controller/ResponseBuilderWrapper.java b/src/main/java/org/eclipse/openk/elogbook/controller/ResponseBuilderWrapper.java
new file mode 100644
index 0000000..51d5fb6
--- /dev/null
+++ b/src/main/java/org/eclipse/openk/elogbook/controller/ResponseBuilderWrapper.java
@@ -0,0 +1,50 @@
+package org.eclipse.openk.elogbook.controller;
+
+import org.apache.http.HttpStatus;
+import org.eclipse.openk.elogbook.common.Globals;
+import org.eclipse.openk.elogbook.exceptions.BtbException;
+import org.eclipse.openk.elogbook.exceptions.BtbInternalServerError;
+
+import javax.ws.rs.core.Response;
+import java.io.UnsupportedEncodingException;
+
+public enum ResponseBuilderWrapper {
+    INSTANCE;
+
+    public Response.ResponseBuilder getResponseBuilder( String json ) throws BtbInternalServerError {
+        return getResponseBuilder(jsonStringToBytes( json ));
+
+    }
+
+    private Response.ResponseBuilder getResponseBuilder(byte[] json) {
+        return Response.status(HttpStatus.SC_OK).entity(json)
+                .header("Content-Type", "application/json; charset=utf-8")
+                .header("X-XSS-Protection", "1; mode = block")
+                .header("X-DNS-Prefetch-Control", "off")
+                .header("X-Content-Type-Options", "nosniff")
+                .header("X-Frame-Options", "sameorigin")
+                .header("Strict-Transport-Security", "max-age=15768000; includeSubDomains")
+                .header("Cache-Control", "no-cache; no-store; must-revalidate")
+                .header("Pragma", "no-cache")
+                .header("Expires", "0")
+                .header("Access-Control-Allow-Origin", "*");
+    }
+
+    private byte[] jsonStringToBytes( String jsonString ) throws BtbInternalServerError {
+        try {
+            return jsonString.getBytes("UTF-8");
+        } catch (UnsupportedEncodingException e) {
+            throw new BtbInternalServerError("Unexpected Error", e);
+        }
+    }
+
+    public Response buildOKResponse(String jsonString) throws BtbException {
+        return getResponseBuilder( jsonStringToBytes( jsonString)).build();
+    }
+
+
+    public Response buildOKResponse(String jsonString, String sessionToken) throws BtbException  {
+        return getResponseBuilder(jsonStringToBytes(jsonString)).header(Globals.SESSION_TOKEN_TAG, sessionToken).build();
+    }
+
+}
diff --git a/src/main/java/org/eclipse/openk/elogbook/controller/TokenManager.java b/src/main/java/org/eclipse/openk/elogbook/controller/TokenManager.java
new file mode 100644
index 0000000..c6ff5af
--- /dev/null
+++ b/src/main/java/org/eclipse/openk/elogbook/controller/TokenManager.java
@@ -0,0 +1,51 @@
+package org.eclipse.openk.elogbook.controller;
+
+
+import org.apache.log4j.Logger;
+import org.eclipse.openk.elogbook.auth2.model.JwtPayload;
+import org.eclipse.openk.elogbook.auth2.util.JwtHelper;
+import org.eclipse.openk.elogbook.common.BackendConfig;
+import org.eclipse.openk.elogbook.common.Globals;
+import org.eclipse.openk.elogbook.communication.RestServiceWrapper;
+import org.eclipse.openk.elogbook.controller.BaseWebService.SecureType;
+import org.eclipse.openk.elogbook.exceptions.BtbException;
+import org.eclipse.openk.elogbook.exceptions.BtbForbidden;
+
+public class TokenManager {
+    private static final Logger LOGGER = Logger.getLogger(TokenManager.class.getName());
+
+    private static final TokenManager INSTANCE = new TokenManager();
+
+    private TokenManager() {
+    }
+
+    public static TokenManager getInstance() {
+        return INSTANCE;
+    }
+
+    public void logout(String token) throws BtbException {
+        RestServiceWrapper restServiceWrapper = new RestServiceWrapper(BackendConfig.getInstance().getPortalBaseURL(), false);
+        restServiceWrapper.performGetRequest("logout",token);
+    }
+
+    public void checkAut(String token) throws BtbException {
+        RestServiceWrapper restServiceWrapper = new RestServiceWrapper(BackendConfig.getInstance().getPortalBaseURL(), false);
+        restServiceWrapper.performGetRequest("checkAuth",token);
+    }
+
+    public void checkAutLevel(String token, BaseWebService.SecureType secureType) throws BtbForbidden {
+        JwtPayload jwtPayload = JwtHelper.getJwtPayload(token);
+
+        if (jwtPayload != null && secureType == SecureType.NORMAL && !(jwtPayload.getRealmAccess()
+            .isInRole(Globals.KEYCLOAK_ROLE_NORMALUSER) || jwtPayload.getRealmAccess()
+            .isInRole(Globals.KEYCLOAK_ROLE_SUPERUSER))){
+            LOGGER.warn("Security level not sufficent ");
+            throw new BtbForbidden("insufficent rights");
+        } else if (jwtPayload != null && secureType == BaseWebService.SecureType.HIGH &&
+            !jwtPayload.getRealmAccess().isInRole(Globals.KEYCLOAK_ROLE_SUPERUSER)){
+            LOGGER.warn("Security level not sufficent ");
+            throw new BtbForbidden("insufficent rights");
+        }
+    }
+
+}
diff --git a/src/main/java/org/eclipse/openk/elogbook/exceptions/BtbBadRequest.java b/src/main/java/org/eclipse/openk/elogbook/exceptions/BtbBadRequest.java
new file mode 100644
index 0000000..c068f62
--- /dev/null
+++ b/src/main/java/org/eclipse/openk/elogbook/exceptions/BtbBadRequest.java
@@ -0,0 +1,18 @@
+package org.eclipse.openk.elogbook.exceptions;
+
+import org.apache.http.HttpStatus;
+
+public class BtbBadRequest extends BtbException {
+    public BtbBadRequest() {
+        super();
+    }
+
+    public BtbBadRequest(String message) {
+        super(message);
+    }
+
+    @Override
+    public int getHttpStatus() {
+        return HttpStatus.SC_BAD_REQUEST;
+    }
+}
diff --git a/src/main/java/org/eclipse/openk/elogbook/exceptions/BtbConflict.java b/src/main/java/org/eclipse/openk/elogbook/exceptions/BtbConflict.java
new file mode 100644
index 0000000..e3dfbe6
--- /dev/null
+++ b/src/main/java/org/eclipse/openk/elogbook/exceptions/BtbConflict.java
@@ -0,0 +1,18 @@
+package org.eclipse.openk.elogbook.exceptions;
+
+import org.apache.http.HttpStatus;
+
+public class BtbConflict extends BtbException {
+    public BtbConflict() {
+        super();
+    }
+
+    public BtbConflict(String message) {
+        super(message);
+    }
+
+    @Override
+    public int getHttpStatus() {
+        return HttpStatus.SC_CONFLICT;
+    }
+}
diff --git a/src/main/java/org/eclipse/openk/elogbook/exceptions/BtbException.java b/src/main/java/org/eclipse/openk/elogbook/exceptions/BtbException.java
new file mode 100644
index 0000000..37de9af
--- /dev/null
+++ b/src/main/java/org/eclipse/openk/elogbook/exceptions/BtbException.java
@@ -0,0 +1,17 @@
+package org.eclipse.openk.elogbook.exceptions;
+
+public abstract class BtbException extends Exception { // NOSONAR
+    public BtbException() {
+        super();
+    }
+
+    public BtbException(String message) {
+        super(message);
+    }
+
+    public BtbException(String message, Throwable throwable) {
+        super(message, throwable);
+    }
+
+    public abstract int getHttpStatus();
+}
diff --git a/src/main/java/org/eclipse/openk/elogbook/exceptions/BtbExceptionMapper.java b/src/main/java/org/eclipse/openk/elogbook/exceptions/BtbExceptionMapper.java
new file mode 100644
index 0000000..a54432b
--- /dev/null
+++ b/src/main/java/org/eclipse/openk/elogbook/exceptions/BtbExceptionMapper.java
@@ -0,0 +1,32 @@
+package org.eclipse.openk.elogbook.exceptions;
+
+import org.apache.http.HttpStatus;
+import org.eclipse.openk.elogbook.common.JsonGeneratorBase;
+import org.eclipse.openk.elogbook.viewmodel.ErrorReturn;
+import org.eclipse.openk.elogbook.viewmodel.GeneralReturnItem;
+
+public final class BtbExceptionMapper {
+    private BtbExceptionMapper() {}
+
+    public static String unknownErrorToJson() {
+        ErrorReturn er = new ErrorReturn();
+        er.setErrorText("Unknown Error");
+        er.setErrorCode(HttpStatus.SC_INTERNAL_SERVER_ERROR);
+        return JsonGeneratorBase.getGson().toJson(er);
+    }
+
+    public static String toJson(BtbException e) {
+            ErrorReturn er = new ErrorReturn();
+            er.setErrorText(e.getMessage());
+        er.setErrorCode(e.getHttpStatus());
+            return JsonGeneratorBase.getGson().toJson(er);
+    }
+
+    public static String getGeneralErrorJson() {
+        return JsonGeneratorBase.getGson().toJson(new GeneralReturnItem("NOK"));
+    }
+
+    public static String getGeneralOKJson() {
+        return JsonGeneratorBase.getGson().toJson(new GeneralReturnItem("OK"));
+    }
+}
diff --git a/src/main/java/org/eclipse/openk/elogbook/exceptions/BtbForbidden.java b/src/main/java/org/eclipse/openk/elogbook/exceptions/BtbForbidden.java
new file mode 100644
index 0000000..74f52eb
--- /dev/null
+++ b/src/main/java/org/eclipse/openk/elogbook/exceptions/BtbForbidden.java
@@ -0,0 +1,18 @@
+package org.eclipse.openk.elogbook.exceptions;
+
+import org.apache.http.HttpStatus;
+
+public class BtbForbidden extends BtbException {
+    public BtbForbidden() {
+        super();
+    }
+
+    public BtbForbidden(String message) {
+        super(message);
+    }
+
+    @Override
+    public int getHttpStatus() {
+        return HttpStatus.SC_FORBIDDEN;
+    }
+}
diff --git a/src/main/java/org/eclipse/openk/elogbook/exceptions/BtbGone.java b/src/main/java/org/eclipse/openk/elogbook/exceptions/BtbGone.java
new file mode 100644
index 0000000..522ef7f
--- /dev/null
+++ b/src/main/java/org/eclipse/openk/elogbook/exceptions/BtbGone.java
@@ -0,0 +1,18 @@
+package org.eclipse.openk.elogbook.exceptions;
+
+import org.apache.http.HttpStatus;
+
+public class BtbGone extends BtbException {
+    public BtbGone() {
+        super();
+    }
+
+    public BtbGone(String message) {
+        super(message);
+    }
+
+    @Override
+    public int getHttpStatus() {
+        return HttpStatus.SC_GONE;
+    }
+}
diff --git a/src/main/java/org/eclipse/openk/elogbook/exceptions/BtbInternalServerError.java b/src/main/java/org/eclipse/openk/elogbook/exceptions/BtbInternalServerError.java
new file mode 100644
index 0000000..8b8743d
--- /dev/null
+++ b/src/main/java/org/eclipse/openk/elogbook/exceptions/BtbInternalServerError.java
@@ -0,0 +1,18 @@
+package org.eclipse.openk.elogbook.exceptions;
+
+import org.apache.http.HttpStatus;
+
+public class BtbInternalServerError extends BtbException {
+    public BtbInternalServerError(String message) {
+        super(message);
+    }
+
+    public BtbInternalServerError(String message, Throwable throwable) {
+        super(message, throwable);
+    }
+
+    @Override
+    public int getHttpStatus() {
+        return HttpStatus.SC_INTERNAL_SERVER_ERROR;
+    }
+}
diff --git a/src/main/java/org/eclipse/openk/elogbook/exceptions/BtbLocked.java b/src/main/java/org/eclipse/openk/elogbook/exceptions/BtbLocked.java
new file mode 100644
index 0000000..2e5ed05
--- /dev/null
+++ b/src/main/java/org/eclipse/openk/elogbook/exceptions/BtbLocked.java
@@ -0,0 +1,18 @@
+package org.eclipse.openk.elogbook.exceptions;
+
+import org.apache.http.HttpStatus;
+
+public class BtbLocked extends BtbException {
+    public BtbLocked() {
+        super();
+    }
+
+    public BtbLocked(String message) {
+        super(message);
+    }
+
+    @Override
+    public int getHttpStatus() {
+        return HttpStatus.SC_LOCKED;
+    }
+}
diff --git a/src/main/java/org/eclipse/openk/elogbook/exceptions/BtbNestedException.java b/src/main/java/org/eclipse/openk/elogbook/exceptions/BtbNestedException.java
new file mode 100644
index 0000000..f0f4fbd
--- /dev/null
+++ b/src/main/java/org/eclipse/openk/elogbook/exceptions/BtbNestedException.java
@@ -0,0 +1,27 @@
+package org.eclipse.openk.elogbook.exceptions;
+
+import org.eclipse.openk.elogbook.viewmodel.ErrorReturn;
+
+public class BtbNestedException extends BtbException {
+    private static final long serialVersionUID = 6771249960550163561L;
+    private final ErrorReturn errorReturn;
+
+    public BtbNestedException(ErrorReturn er) {
+        super(er.getErrorText());
+        errorReturn = er;
+    }
+
+    public BtbNestedException(ErrorReturn er, Throwable t) {
+        super(er.getErrorText(), t);
+        errorReturn = er;
+    }
+
+    public ErrorReturn getErrorReturn() {
+        return errorReturn;
+    }
+
+    @Override
+    public int getHttpStatus() {
+        return errorReturn.getErrorCode();
+    }
+}
diff --git a/src/main/java/org/eclipse/openk/elogbook/exceptions/BtbNotFound.java b/src/main/java/org/eclipse/openk/elogbook/exceptions/BtbNotFound.java
new file mode 100644
index 0000000..f1c8984
--- /dev/null
+++ b/src/main/java/org/eclipse/openk/elogbook/exceptions/BtbNotFound.java
@@ -0,0 +1,18 @@
+package org.eclipse.openk.elogbook.exceptions;
+
+import org.apache.http.HttpStatus;
+
+public class BtbNotFound extends BtbException {
+    public BtbNotFound() {
+        super();
+    }
+
+    public BtbNotFound(String message) {
+        super(message);
+    }
+
+    @Override
+    public int getHttpStatus() {
+        return HttpStatus.SC_NOT_FOUND;
+    }
+}
diff --git a/src/main/java/org/eclipse/openk/elogbook/exceptions/BtbPolicyNotFulfilled.java b/src/main/java/org/eclipse/openk/elogbook/exceptions/BtbPolicyNotFulfilled.java
new file mode 100644
index 0000000..0eeaf98
--- /dev/null
+++ b/src/main/java/org/eclipse/openk/elogbook/exceptions/BtbPolicyNotFulfilled.java
@@ -0,0 +1,20 @@
+package org.eclipse.openk.elogbook.exceptions;
+
+
+import org.apache.http.HttpStatus;
+
+public class BtbPolicyNotFulfilled extends BtbException {
+    public BtbPolicyNotFulfilled() {
+        super();
+    }
+
+    public BtbPolicyNotFulfilled(String message) {
+        super(message);
+    }
+
+    @Override
+    public int getHttpStatus() {
+        return HttpStatus.SC_METHOD_FAILURE;
+    }
+}
+
diff --git a/src/main/java/org/eclipse/openk/elogbook/exceptions/BtbServiceUnavailable.java b/src/main/java/org/eclipse/openk/elogbook/exceptions/BtbServiceUnavailable.java
new file mode 100644
index 0000000..f5c2393
--- /dev/null
+++ b/src/main/java/org/eclipse/openk/elogbook/exceptions/BtbServiceUnavailable.java
@@ -0,0 +1,18 @@
+package org.eclipse.openk.elogbook.exceptions;
+
+import org.apache.http.HttpStatus;
+
+public class BtbServiceUnavailable extends BtbException {
+    public BtbServiceUnavailable() {
+        super();
+    }
+
+    public BtbServiceUnavailable(String message) {
+        super(message);
+    }
+
+    @Override
+    public int getHttpStatus() {
+        return HttpStatus.SC_SERVICE_UNAVAILABLE;
+    }
+}
diff --git a/src/main/java/org/eclipse/openk/elogbook/exceptions/BtbUnauthorized.java b/src/main/java/org/eclipse/openk/elogbook/exceptions/BtbUnauthorized.java
new file mode 100644
index 0000000..a5001ed
--- /dev/null
+++ b/src/main/java/org/eclipse/openk/elogbook/exceptions/BtbUnauthorized.java
@@ -0,0 +1,18 @@
+package org.eclipse.openk.elogbook.exceptions;
+
+import org.apache.http.HttpStatus;
+
+public class BtbUnauthorized extends BtbException {
+    public BtbUnauthorized() {
+        super();
+    }
+
+    public BtbUnauthorized(String message) {
+        super(message);
+    }
+
+    @Override
+    public int getHttpStatus() {
+        return HttpStatus.SC_UNAUTHORIZED;
+    }
+}
diff --git a/src/main/java/org/eclipse/openk/elogbook/persistence/dao/AutoCloseEntityManager.java b/src/main/java/org/eclipse/openk/elogbook/persistence/dao/AutoCloseEntityManager.java
new file mode 100644
index 0000000..f94cfb0
--- /dev/null
+++ b/src/main/java/org/eclipse/openk/elogbook/persistence/dao/AutoCloseEntityManager.java
@@ -0,0 +1,286 @@
+package org.eclipse.openk.elogbook.persistence.dao;
+
+import java.util.List;
+import java.util.Map;
+import javax.persistence.EntityGraph;
+import javax.persistence.EntityManager;
+import javax.persistence.EntityManagerFactory;
+import javax.persistence.EntityTransaction;
+import javax.persistence.FlushModeType;
+import javax.persistence.LockModeType;
+import javax.persistence.Query;
+import javax.persistence.StoredProcedureQuery;
+import javax.persistence.TypedQuery;
+import javax.persistence.criteria.CriteriaBuilder;
+import javax.persistence.criteria.CriteriaDelete;
+import javax.persistence.criteria.CriteriaQuery;
+import javax.persistence.criteria.CriteriaUpdate;
+import javax.persistence.metamodel.Metamodel;
+
+public class AutoCloseEntityManager implements EntityManager, AutoCloseable {
+    private EntityManager em;
+
+    public AutoCloseEntityManager(EntityManager entityManager) {
+        em = entityManager;
+    }
+
+    @Override
+    public void persist(Object o) {
+        em.persist(o);
+    }
+
+    @Override
+    public <T> T merge(T t) {
+        return em.merge(t);
+    }
+
+    @Override
+    public void remove(Object o) {
+        em.remove(o);
+    }
+
+    @Override
+    public <T> T find(Class<T> aClass, Object o) {
+        return em.find(aClass, o);
+    }
+
+    @Override
+    public <T> T find(Class<T> aClass, Object o, Map<String, Object> map) {
+        return em.find(aClass, o, map);
+    }
+
+    @Override
+    public <T> T find(Class<T> aClass, Object o, LockModeType lockModeType) {
+        return em.find(aClass, o, lockModeType);
+    }
+
+    @Override
+    public <T> T find(Class<T> aClass, Object o, LockModeType lockModeType, Map<String, Object> map) {
+        return em.find(aClass, o, lockModeType, map);
+    }
+
+    @Override
+    public <T> T getReference(Class<T> aClass, Object o) {
+        return em.getReference(aClass, o);
+    }
+
+    @Override
+    public void flush() {
+        em.flush();
+    }
+
+    @Override
+    public FlushModeType getFlushMode() {
+        return em.getFlushMode();
+    }
+
+    @Override
+    public void setFlushMode(FlushModeType flushModeType) {
+        em.setFlushMode(flushModeType);
+    }
+
+    @Override
+    public void lock(Object o, LockModeType lockModeType) {
+        em.lock(o, lockModeType);
+    }
+
+    @Override
+    public void lock(Object o, LockModeType lockModeType, Map<String, Object> map) {
+        em.lock(o, lockModeType, map);
+    }
+
+    @Override
+    public void refresh(Object o) {
+        em.refresh(o);
+    }
+
+    @Override
+    public void refresh(Object o, Map<String, Object> map) {
+        em.refresh(o, map);
+    }
+
+    @Override
+    public void refresh(Object o, LockModeType lockModeType) {
+        em.refresh(o, lockModeType);
+    }
+
+    @Override
+    public void refresh(Object o, LockModeType lockModeType, Map<String, Object> map) {
+        em.refresh(o, lockModeType, map);
+    }
+
+    @Override
+    public void clear() {
+        em.clear();
+    }
+
+    @Override
+    public void detach(Object o) {
+        em.detach(o);
+    }
+
+    @Override
+    public boolean contains(Object o) {
+        return em.contains(o);
+    }
+
+    @Override
+    public LockModeType getLockMode(Object o) {
+        return em.getLockMode(o);
+    }
+
+    @Override
+    public void setProperty(String s, Object o) {
+        em.setProperty(s, o);
+    }
+
+    @Override
+    public Map<String, Object> getProperties() {
+        return em.getProperties();
+    }
+
+    @Override
+    public Query createQuery(String s) {
+        return em.createQuery(s);
+    }
+
+    @Override
+    public <T> TypedQuery<T> createQuery(CriteriaQuery<T> criteriaQuery) {
+        return em.createQuery(criteriaQuery);
+    }
+
+    @Override
+    public Query createQuery(CriteriaUpdate updateQuery) {
+        return em.createQuery(updateQuery);
+    }
+
+    @Override
+    public Query createQuery(CriteriaDelete deleteQuery) {
+        return em.createQuery(deleteQuery);
+    }
+
+    @Override
+    public <T> TypedQuery<T> createQuery(String s, Class<T> aClass) {
+        return em.createQuery(s, aClass);
+    }
+
+    @Override
+    public Query createNamedQuery(String s) {
+        return em.createNamedQuery(s);
+    }
+
+    @Override
+    public <T> TypedQuery<T> createNamedQuery(String s, Class<T> aClass) {
+        return em.createNamedQuery(s, aClass);
+    }
+
+    @Override
+    public Query createNativeQuery(String s) {
+        return em.createNativeQuery(s);
+    }
+
+    @Override
+    public Query createNativeQuery(String s, Class aClass) {
+        return em.createNativeQuery(s, aClass);
+    }
+
+    @Override
+    public Query createNativeQuery(String s, String s1) {
+        return em.createNativeQuery(s, s1);
+    }
+
+    @Override
+    public StoredProcedureQuery createNamedStoredProcedureQuery(String name) {
+        return em.createNamedStoredProcedureQuery(name);
+    }
+
+    @Override
+    public StoredProcedureQuery createStoredProcedureQuery(String procedureName) {
+        return em.createStoredProcedureQuery(procedureName);
+    }
+
+    @Override
+    public StoredProcedureQuery createStoredProcedureQuery(String procedureName, Class... resultClasses) {
+        return em.createStoredProcedureQuery(procedureName, resultClasses);
+    }
+
+    @Override
+    public StoredProcedureQuery createStoredProcedureQuery(String procedureName, String... resultSetMappings) {
+        return em.createStoredProcedureQuery(procedureName, resultSetMappings);
+    }
+
+    @Override
+    public void joinTransaction() {
+        em.joinTransaction();
+    }
+
+    @Override
+    public boolean isJoinedToTransaction() {
+        return em.isJoinedToTransaction();
+    }
+
+    @Override
+    public <T> T unwrap(Class<T> aClass) {
+        return em.unwrap(aClass);
+    }
+
+    @Override
+    public Object getDelegate() {
+        return em.getDelegate();
+    }
+
+    @Override
+    public void close() {
+        if (em.isOpen()) {
+            if (em.getTransaction().isActive()) {
+                em.getTransaction().rollback();
+            }
+            em.close();
+        }
+    }
+
+    @Override
+    public boolean isOpen() {
+        return em.isOpen();
+    }
+
+    @Override
+    public EntityTransaction getTransaction() {
+        return em.getTransaction();
+    }
+
+    @Override
+    public EntityManagerFactory getEntityManagerFactory() {
+        return em.getEntityManagerFactory();
+    }
+
+    @Override
+    public CriteriaBuilder getCriteriaBuilder() {
+        return em.getCriteriaBuilder();
+    }
+
+    @Override
+    public Metamodel getMetamodel() {
+        return em.getMetamodel();
+    }
+
+    @Override
+    public <T> EntityGraph<T> createEntityGraph(Class<T> rootType) {
+        return em.createEntityGraph(rootType);
+    }
+
+    @Override
+    public EntityGraph<?> createEntityGraph(String graphName) {
+        return em.createEntityGraph(graphName);
+    }
+
+    @Override
+    public EntityGraph<?> getEntityGraph(String graphName) {
+        return em.getEntityGraph(graphName);
+    }
+
+    @Override
+    public <T> List<EntityGraph<? super T>> getEntityGraphs(Class<T> entityClass) {
+        return em.getEntityGraphs(entityClass);
+    }
+}
diff --git a/src/main/java/org/eclipse/openk/elogbook/persistence/dao/EntityHelper.java b/src/main/java/org/eclipse/openk/elogbook/persistence/dao/EntityHelper.java
new file mode 100644
index 0000000..16c0580
--- /dev/null
+++ b/src/main/java/org/eclipse/openk/elogbook/persistence/dao/EntityHelper.java
@@ -0,0 +1,19 @@
+package org.eclipse.openk.elogbook.persistence.dao;
+
+import javax.persistence.EntityManagerFactory;
+import javax.persistence.Persistence;
+
+public class EntityHelper {
+    private static final String FACTORY_NAME = "betriebstagebuch";
+    private static EntityManagerFactory entityManagerFactory;
+
+    private EntityHelper() {
+    }
+
+    public static synchronized EntityManagerFactory getEMF() {
+        if (entityManagerFactory == null) {
+            entityManagerFactory = Persistence.createEntityManagerFactory(FACTORY_NAME);
+        }
+        return entityManagerFactory;
+    }
+}
diff --git a/src/main/java/org/eclipse/openk/elogbook/persistence/dao/GenericDaoJpa.java b/src/main/java/org/eclipse/openk/elogbook/persistence/dao/GenericDaoJpa.java
new file mode 100644
index 0000000..7bd5586
--- /dev/null
+++ b/src/main/java/org/eclipse/openk/elogbook/persistence/dao/GenericDaoJpa.java
@@ -0,0 +1,391 @@
+package org.eclipse.openk.elogbook.persistence.dao;
+
+import java.io.Serializable;
+import java.lang.reflect.Method;
+import java.lang.reflect.ParameterizedType;
+import java.util.ArrayList;
+import java.util.List;
+import javax.persistence.EntityManager;
+import javax.persistence.EntityNotFoundException;
+import javax.persistence.Query;
+import org.apache.log4j.Logger;
+import org.apache.log4j.xml.DOMConfigurator;
+import org.eclipse.openk.elogbook.persistence.dao.interfaces.IGenericDao;
+
+/**
+ * @param <T> - persistent Class.
+ * @param <I> - primary Key.
+ * @author Training.
+ */
+public abstract class GenericDaoJpa<T, I extends Serializable> implements IGenericDao<T, I> {
+
+    public static final Logger LOGGER = Logger.getLogger(GenericDaoJpa.class.getName());
+
+    // Create Entity Manager Factory
+    private EntityManager em = null;
+
+    @Override
+    public synchronized EntityManager getEM() {
+        if (em == null) {
+            em = EntityHelper.getEMF().createEntityManager();
+        }
+        return em;
+    }
+
+    /**
+     * Standard Constructor.
+     */
+    public GenericDaoJpa() {
+        DOMConfigurator.configureAndWatch("log4j.xml");
+    }
+
+    /**
+     * Set EntityManager from View (OSIV).
+     *
+     * @param em - EntityManager.
+     */
+    public GenericDaoJpa(EntityManager em) {
+        super();
+        if (this.em == null) {
+            this.em = em;
+        }
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    public T findByIdInTx(final Class<T> persistentClass, final I id) {
+        return getEM().find(persistentClass, id);
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    public T findById(final Class<T> persistentClass, final I id) {
+        getEM().getTransaction().begin();
+        try {
+            final T entity = getEM().find(persistentClass, id);
+
+            getEM().getTransaction().commit();
+
+            return entity;
+        } catch (Exception e) {
+            getEM().getTransaction().rollback();
+            throw e;
+        }
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    public void remove(final T entity, final I id) throws Exception {
+        getEM();
+        try {
+            em.getTransaction().begin();
+            em.find(entity.getClass(), id);
+            em.remove(entity);
+            em.getTransaction().commit();
+            LOGGER.info("Entity with Id " + id + " removed!");
+        } catch (EntityNotFoundException ex) {
+            String errorText = "Entity " + entity.toString() + " with id " + id + " no longer exists! - " + ex.getMessage(); //NOSONAR
+            LOGGER.error(errorText);
+            throw new Exception(errorText);
+        } catch (Exception ex) {
+            em.getTransaction().rollback();
+            String errorText = "Error removing " + entity + "; " + ex.getMessage();
+            LOGGER.error(errorText, ex);
+            throw new Exception(errorText);
+        } finally {
+            LOGGER.info("GenericDao.remove.finally");
+            em.close();
+        }
+    }
+
+    private void removeInTxInner(final T entity, final I id) throws Exception {
+        try {
+            em.getReference(entity.getClass(), id);
+        } catch (EntityNotFoundException ex) {
+            String errorText = "Entity " + entity.toString() + " with id " + id + " no longer exists! - " + ex.getMessage();
+            LOGGER.error(errorText);
+            throw new Exception(errorText);
+        }
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    public void removeInTx(final T entity, final I id) throws Exception {
+        getEM();
+        try {
+            this.removeInTxInner(entity, id);
+            em.remove(entity);
+            LOGGER.info("Entity with Id " + id + " removed!");
+        } catch (Exception ex) {
+            String errorText = "Error removing " + entity + "; " + ex.getMessage();
+            LOGGER.error(errorText, ex);
+            throw new Exception(errorText);
+        }
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    @SuppressWarnings("unchecked")
+    @Override
+    public List<T> find(final boolean all, final int maxResult,
+                        final int firstResult) {
+        List<T> entityList;
+        // Returns the persistent class associated wit T.
+        Class<T> persistentClass = getPersistentClass();
+        String persistentClassName = persistentClass.getSimpleName();
+        String selectString = "select t from " + persistentClassName + " t";
+        Query q = em.createQuery(selectString);
+        if (!all) {
+            q.setMaxResults(maxResult);
+            q.setFirstResult(firstResult);
+        }
+        entityList = (List<T>) q.getResultList();
+        LOGGER.info("EntityList with " + entityList.size() + " entries found!");
+        em.close();
+        return entityList;
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    @SuppressWarnings("unchecked")
+    @Override
+    public List<T> findInTx(final boolean all, final int maxResult,
+                            final int firstResult) {
+        List<T> entityList;
+        // Returns the persistent class associated wit T.
+        Class<T> persistentClass = getPersistentClass();
+        String persistentClassName = persistentClass.getSimpleName();
+        String selectString = "from " + persistentClassName + " t";
+        Query q = em.createQuery(selectString);
+        if (!all) {
+            q.setMaxResults(maxResult);
+            q.setFirstResult(firstResult);
+        }
+        entityList = (List<T>) q.getResultList();
+        LOGGER.info("EntityList with " + entityList.size() + " entries found!");
+        return entityList;
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    public T store(final T entity) throws Exception {
+        T entityNew = null;
+
+        if (isInsert(entity)) {
+            persist(entity);
+        } else {
+            entityNew = merge(entity);
+        }
+        return entityNew;
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    public T storeInTx(final T entity) throws Exception {
+        T entityNew = null;
+
+        if (isInsert(entity)) {
+            persistInTx(entity);
+        } else {
+            entityNew = mergeInTx(entity);
+        }
+        return entityNew;
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    public void persist(final T entity) throws Exception {
+
+        getEM();
+        try {
+            em.getTransaction().begin();
+            em.persist(entity);
+            em.flush();
+            em.refresh(entity);
+            em.getTransaction().commit();
+            LOGGER.info("Entity " + entity + " persisted!");
+        } catch (Exception ex) {
+            em.getTransaction().rollback();
+            String errorText = "Error persisting " + entity + ": " + ex.getMessage();
+            LOGGER.error(errorText, ex);
+            throw new Exception(errorText);
+        } finally {
+            LOGGER.info("GenericDao.persist.finally");
+            em.close();
+        }
+
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    public void persistInTx(final T entity) throws Exception {
+        getEM();
+        try {
+            em.persist(entity);
+            em.flush();
+            em.refresh(entity);
+            LOGGER.info("Entity " + entity + " persisted!");
+        } catch (Exception ex) {
+            String errorText = "Error persisting in Transaction " + entity + ": " + ex.getMessage();
+            LOGGER.error(errorText, ex);
+            throw new Exception(errorText);
+        }
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    public T merge(final T entity) throws Exception {
+        getEM();
+        T entityMerged;
+        try {
+            em.getTransaction().begin();
+            entityMerged = em.merge(entity);
+            em.getTransaction().commit();
+            LOGGER.info("Entity " + entity + " merged!");
+        } catch (Exception ex) {
+            em.getTransaction().rollback();
+            String errorText = "Error merging " + entity + ": " + ex.getMessage();
+            LOGGER.error(errorText, ex);
+            throw new Exception(errorText);
+        } finally {
+            LOGGER.info("GenericDao.merge.finally");
+            em.close();
+        }
+
+        return entityMerged;
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    public T mergeInTx(final T entity) throws Exception {
+        getEM();
+        T entityMerged;
+        try {
+            entityMerged = em.merge(entity);
+            LOGGER.info("Entity " + entity + " merged!");
+        } catch (Exception ex) {
+            String errorText = "Error merging in Transaction " + entity + ": " + ex.getMessage();
+            LOGGER.error(errorText, ex);
+            throw new Exception(errorText);
+        }
+        return entityMerged;
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    public void startTransaction() {
+        getEM();
+        em.getTransaction().begin();
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    public void commitTransaction() {
+        getEM();
+        em.getTransaction().commit();
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    public void rollbackTransaction() {
+        getEM();
+        em.getTransaction().rollback();
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    public void endTransaction() {
+        getEM();
+        em.getTransaction().begin();
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    public void closeSession() {
+        getEM();
+        em.close();
+    }
+
+    /**
+     * Get persistent Class from Parameter.
+     *
+     * @return Class<T> - persistent Class.
+     */
+    private Class<T> getPersistentClass() {
+        @SuppressWarnings("unchecked")
+        Class<T> persistentClass = (Class<T>) ((ParameterizedType) getClass().
+                getGenericSuperclass()).getActualTypeArguments()[0];
+        return persistentClass;
+    }
+
+    /**
+     * Check for insert or update.
+     * If id == 0, Insert, else Update.
+     *
+     * @param entity T - concrete Enbtity.
+     * @return boolean - true is insert, false is update.
+     * @throws Exception ex.
+     */
+    @SuppressWarnings({"rawtypes", "unchecked"})
+    private boolean isInsert(final T entity) throws Exception {
+
+        Class[] noparams = {};
+        Object[] noObjParams = {};
+        Class<T> persistentClass = (Class<T>) entity.getClass();
+        Method m = persistentClass.getDeclaredMethod("getId", noparams);
+        Integer result = (Integer) m.invoke(entity, noObjParams);
+        return result == null;
+    }
+
+    /**
+     * Refresh all entities of a collections and reload them from DB
+     *
+     * @param modelCollection List<T> - collection to be refreshed
+     * @return List<T> - refreshed collection
+     */
+    public List<T> refreshModelCollection(List<T> modelCollection) {
+        List<T> result = new ArrayList<T>();
+        if (modelCollection != null && !modelCollection.isEmpty()) {
+            em.getEntityManagerFactory().getCache().evict(modelCollection.get(0).getClass());
+            T mergedEntity;
+            for (T entity : modelCollection) {
+                mergedEntity = em.merge(entity);
+                em.refresh(mergedEntity);
+                result.add(mergedEntity);
+            }
+        }
+        return result;
+    }
+}
diff --git a/src/main/java/org/eclipse/openk/elogbook/persistence/dao/HTblResponsibilityDao.java b/src/main/java/org/eclipse/openk/elogbook/persistence/dao/HTblResponsibilityDao.java
new file mode 100644
index 0000000..01d2e47
--- /dev/null
+++ b/src/main/java/org/eclipse/openk/elogbook/persistence/dao/HTblResponsibilityDao.java
@@ -0,0 +1,139 @@
+package org.eclipse.openk.elogbook.persistence.dao;
+
+import java.sql.Timestamp;
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.List;
+import javax.persistence.EntityManager;
+import javax.persistence.NoResultException;
+import javax.persistence.Query;
+import org.eclipse.openk.elogbook.exceptions.BtbInternalServerError;
+import org.eclipse.openk.elogbook.persistence.model.HTblResponsibility;
+
+
+public class HTblResponsibilityDao extends GenericDaoJpa<HTblResponsibility, Integer> {
+
+	/** find only HTblResponsibilities starting with transfer date */
+	private static String TRANSFER_DATE_FROM = "transferDateFrom";
+	/** find only HTblResponsibilities ending with transfer date */
+	private static String TRANSFER_DATE_TO = "transferDateTo";
+
+    public HTblResponsibilityDao() {
+        super();
+    }
+
+    public HTblResponsibilityDao(EntityManager em) {
+        super(em);
+    }
+
+
+    @SuppressWarnings("unchecked")
+    public List<HTblResponsibility> getHistoricalResponsibilitiesByTransactionId(Integer transactionId) {
+
+        try {
+            String selectString = "from " + HTblResponsibility.class.getSimpleName() + " v where v.transactionId = :transactionId";
+            Query q = getEM().createQuery(selectString);
+            q.setParameter("transactionId", transactionId);
+            return refreshModelCollection((List<HTblResponsibility>) q.getResultList());
+        } catch (Throwable t) { //NOSONAR
+            LOGGER.error(t.getMessage());
+            return new ArrayList<>();
+        }
+    }
+
+
+	/**
+   * Find the "last used" (max) transaction id of hTblResponsibilites.
+   *
+   * @return the max transaction_id of htblResponsibilities
+   */
+  public Integer getLastTransactionId() throws BtbInternalServerError {
+
+    try {
+      String selectString = "select transaction_id from htbl_responsibility n order by n.transaction_id desc limit 1";
+      Query q = getEM().createNativeQuery(selectString);
+      return (Integer) q.getSingleResult();
+    } catch (NoResultException nre) {
+      return 0;
+    } catch (Throwable t) { //NOSONAR
+      LOGGER.error(t.getMessage());
+      throw new BtbInternalServerError("Error getting last transaction id of htbl_responsibility");
+    }
+  }
+
+	/**
+	 * Find the all historical responsibilities in the period specified by start
+	 * date and end date and return them in a list.
+	 *
+	 * @param transferDateFrom
+	 *            period - begin
+	 * @param transferDateTo
+	 *            period - end
+	 * @return the list containing the historical responsibilities in the
+	 *         specified period
+	 */
+	@SuppressWarnings("unchecked")
+	public List<HTblResponsibility> findHTblResponsibilitiesInPeriod(Date transferDateFrom, Date transferDateTo)
+			throws BtbInternalServerError {
+		List<HTblResponsibility> hTblResponsibilityList = new ArrayList<>();
+		try {
+			String selectString = "SELECT distinct t.transaction_id , t.transfer_date, t.responsible_user, t.former_responsible_user "
+													+ "FROM htbl_responsibility t "
+													+ "WHERE t.transfer_date >= ?transferDateFrom and t.transfer_date <= ?transferDateTo "
+													+ "ORDER BY t.transfer_date DESC";
+			Query q = getEM().createNativeQuery(selectString);
+			q.setParameter(TRANSFER_DATE_FROM, transferDateFrom);
+			q.setParameter(TRANSFER_DATE_TO, transferDateTo);
+			List<Object[]> resultList = q.getResultList();
+			for (Object[] objects : resultList) {
+				hTblResponsibilityList.add(mapToHTblResponsibilityFromObject(objects));
+			}
+			return hTblResponsibilityList;
+		} catch (Throwable t) { // NOSONAR
+			LOGGER.error(t.getMessage());
+			throw new BtbInternalServerError("Error getting last transaction id of htbl_responsibility");
+
+		}
+	}
+
+	private HTblResponsibility mapToHTblResponsibilityFromObject(Object[] obj){
+		HTblResponsibility hTblResponsibility = new HTblResponsibility();
+		hTblResponsibility.setTransactionId((Integer) obj[0]);
+		hTblResponsibility.setTransferDate((Timestamp) obj[1]);
+		hTblResponsibility.setResponsibleUser((String) obj[2]);
+		hTblResponsibility.setFormerResponsibleUser((String) obj[3]);
+		return hTblResponsibility;
+	}
+
+	/**
+	 * Find all shift changes with the transaction id, given as parameter.
+	 *
+	 * @param shiftTransactionId
+	 *            the transaction id to search for historical responsibilities
+	 * @return the list containing the matching responsibilities
+	 */
+	@SuppressWarnings("unchecked")
+	public List<HTblResponsibility> findResponsibilitiesByTransactionId(Integer shiftTransactionId)
+			throws BtbInternalServerError {
+		try {
+			StringBuilder sB = new StringBuilder(
+					"FROM HTblResponsibility h WHERE h.transactionId = :shiftTransactionId");
+			Query query = getEM().createQuery(sB.toString());
+			query.setParameter("shiftTransactionId", shiftTransactionId);
+			List<HTblResponsibility> hTblResponsibilities = (List<HTblResponsibility>) query.getResultList();
+			refreshModelCollection(hTblResponsibilities);
+
+			LOGGER.info("Results for shift changes with transaction id " + shiftTransactionId);
+			for (HTblResponsibility hTblResponsibility : hTblResponsibilities) {
+				LOGGER.info("id: " + hTblResponsibility.getId() + ", foreign key Branch: "
+						+ hTblResponsibility.getRefBranch().getId() + ", foreign key grid territory: "
+						+ hTblResponsibility.getRefGridTerritory().getId());
+			}
+			return hTblResponsibilities;
+		} catch (Throwable t) { // NOSONAR
+			LOGGER.error(t.getMessage());
+			throw new BtbInternalServerError("Error in findShiftChangeByTransactionId occured.");
+		}
+	}
+}
+
diff --git a/src/main/java/org/eclipse/openk/elogbook/persistence/dao/RefBranchDao.java b/src/main/java/org/eclipse/openk/elogbook/persistence/dao/RefBranchDao.java
new file mode 100644
index 0000000..51e8d67
--- /dev/null
+++ b/src/main/java/org/eclipse/openk/elogbook/persistence/dao/RefBranchDao.java
@@ -0,0 +1,16 @@
+package org.eclipse.openk.elogbook.persistence.dao;
+
+import javax.persistence.EntityManager;
+import org.eclipse.openk.elogbook.persistence.model.RefBranch;
+
+
+public class RefBranchDao extends GenericDaoJpa<RefBranch, Long> {
+    public RefBranchDao() {
+        super();
+    }
+
+    public RefBranchDao(EntityManager em) {
+        super(em);
+    }
+
+}
diff --git a/src/main/java/org/eclipse/openk/elogbook/persistence/dao/RefGridTerritoryDao.java b/src/main/java/org/eclipse/openk/elogbook/persistence/dao/RefGridTerritoryDao.java
new file mode 100644
index 0000000..1bec93d
--- /dev/null
+++ b/src/main/java/org/eclipse/openk/elogbook/persistence/dao/RefGridTerritoryDao.java
@@ -0,0 +1,16 @@
+package org.eclipse.openk.elogbook.persistence.dao;
+
+import javax.persistence.EntityManager;
+import org.eclipse.openk.elogbook.persistence.model.RefGridTerritory;
+
+
+public class RefGridTerritoryDao extends GenericDaoJpa<RefGridTerritory, Long> {
+    public RefGridTerritoryDao() {
+        super();
+    }
+
+    public RefGridTerritoryDao(EntityManager em) {
+        super(em);
+    }
+
+}
diff --git a/src/main/java/org/eclipse/openk/elogbook/persistence/dao/RefNotificationStatusDao.java b/src/main/java/org/eclipse/openk/elogbook/persistence/dao/RefNotificationStatusDao.java
new file mode 100644
index 0000000..17a3982
--- /dev/null
+++ b/src/main/java/org/eclipse/openk/elogbook/persistence/dao/RefNotificationStatusDao.java
@@ -0,0 +1,16 @@
+package org.eclipse.openk.elogbook.persistence.dao;
+
+import javax.persistence.EntityManager;
+import org.eclipse.openk.elogbook.persistence.model.RefNotificationStatus;
+
+
+public class RefNotificationStatusDao extends GenericDaoJpa<RefNotificationStatus, Long> {
+    public RefNotificationStatusDao() {
+        super();
+    }
+
+    public RefNotificationStatusDao(EntityManager em) {
+        super(em);
+    }
+
+}
diff --git a/src/main/java/org/eclipse/openk/elogbook/persistence/dao/RefVersionDao.java b/src/main/java/org/eclipse/openk/elogbook/persistence/dao/RefVersionDao.java
new file mode 100644
index 0000000..975ac88
--- /dev/null
+++ b/src/main/java/org/eclipse/openk/elogbook/persistence/dao/RefVersionDao.java
@@ -0,0 +1,27 @@
+package org.eclipse.openk.elogbook.persistence.dao;
+
+import javax.persistence.EntityManager;
+import javax.persistence.Query;
+import org.eclipse.openk.elogbook.persistence.model.RefVersion;
+
+public class RefVersionDao extends GenericDaoJpa<RefVersion, Long> {
+    public RefVersionDao() {
+        super();
+    }
+
+    public RefVersionDao(EntityManager em) {
+        super(em);
+    }
+
+    public RefVersion getVersionInTx() {
+        try {
+            String selectString = "from RefVersion t";
+            Query q = getEM().createQuery(selectString);
+            return (RefVersion) q.getSingleResult();
+        } catch (Throwable t) { // NOSONAR
+            LOGGER.error(t.getMessage()); // NOSONAR
+            return null;
+        }
+    }
+
+}
diff --git a/src/main/java/org/eclipse/openk/elogbook/persistence/dao/TblNotificationDao.java b/src/main/java/org/eclipse/openk/elogbook/persistence/dao/TblNotificationDao.java
new file mode 100644
index 0000000..d0913c7
--- /dev/null
+++ b/src/main/java/org/eclipse/openk/elogbook/persistence/dao/TblNotificationDao.java
@@ -0,0 +1,229 @@
+package org.eclipse.openk.elogbook.persistence.dao;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import javax.persistence.EntityManager;
+import javax.persistence.Query;
+
+import org.eclipse.openk.elogbook.common.NotificationStatus;
+import org.eclipse.openk.elogbook.exceptions.BtbException;
+import org.eclipse.openk.elogbook.exceptions.BtbInternalServerError;
+import org.eclipse.openk.elogbook.persistence.model.HTblResponsibility;
+import org.eclipse.openk.elogbook.persistence.model.TblNotification;
+import org.eclipse.openk.elogbook.persistence.model.TblResponsibility;
+import org.eclipse.openk.elogbook.persistence.util.NotificationQueryCreator;
+import org.eclipse.openk.elogbook.viewmodel.GlobalSearchFilter;
+import org.eclipse.openk.elogbook.viewmodel.Notification.ListType;
+import org.eclipse.openk.elogbook.viewmodel.NotificationSearchFilter;
+import org.eclipse.openk.elogbook.viewmodel.ReminderSearchFilter;
+
+public class TblNotificationDao extends GenericDaoJpa<TblNotification, Integer> {
+
+	public TblNotificationDao() {
+		super();
+	}
+
+	public TblNotificationDao(EntityManager em) {
+		super(em);
+	}
+
+	/*-
+	 * Mögliche Status:
+	 * 1	offen
+	 * 2	in Arbeit
+	 * 3	erledigt
+	 * 4	geschlossen
+	 */
+
+	/**
+	 * Returns the latest version of all notifications.
+	 *
+	 * @return List of notifications
+	 */
+	public List<TblNotification> getActiveNotifications() throws BtbInternalServerError {
+		return refreshModelCollection(
+				getActiveNotifications(null, null, null, null, new ArrayList<TblResponsibility>()));
+	}
+
+	/**
+	 * Get the List of Active Notifications. The active notifications view is used.
+	 *
+	 * @param nsf
+	 *            search filter to narrow the navigations to be returned
+	 * @param whereClause
+	 *            the where clause to be completed
+	 * @param tablePrefix
+	 *            the table prefix
+	 * @param listType
+	 *            the {@link ListType}
+	 * @param tblResponsibilities
+	 *            the list of responsibilities
+	 * @return the list of active notifications
+	 * @throws BtbInternalServerError
+	 * 						internal Server Error
+	 */
+	@SuppressWarnings("unchecked")
+	private List<TblNotification> getActiveNotifications(NotificationSearchFilter nsf, String whereClause,
+														 String tablePrefix, ListType listType, List<TblResponsibility> tblResponsibilities)
+			throws BtbInternalServerError {
+
+		try {
+			NotificationQueryCreator queryCreator = new NotificationQueryCreator(getEM(), tablePrefix);
+			Query q = queryCreator.generateNotificationQuery(nsf, whereClause, listType, tblResponsibilities);
+			return refreshModelCollection((List<TblNotification>) q.getResultList());
+		} catch (Exception e) {
+			LOGGER.error("Error retrieving notifications", e);
+			throw new BtbInternalServerError("Error retrieving notifications");
+		}
+	}
+
+	@SuppressWarnings("unchecked")
+	private List<TblNotification> getActiveNotificationsWithReminder(ReminderSearchFilter rsf, String whereClause,
+														 String tablePrefix, List<TblResponsibility> tblResponsibilities)
+														throws BtbInternalServerError {
+
+		try {
+			NotificationQueryCreator queryCreator = new NotificationQueryCreator(getEM(), tablePrefix);
+			Query q = queryCreator.generateNotificationQueryWithReminder(rsf, whereClause, tblResponsibilities);
+			return refreshModelCollection((List<TblNotification>) q.getResultList());
+		} catch (Exception e) {
+			LOGGER.error("Error retrieving notifications", e);
+			throw new BtbInternalServerError("Error retrieving notifications");
+		}
+	}
+
+	public List<TblNotification> getNotificationsWithReminder(ReminderSearchFilter rsf, List<TblResponsibility> tblResponsibilities) throws BtbInternalServerError {
+
+		try {
+			String where = "v.fk_ref_notification_status IN ( " + NotificationStatus.OPEN.id + "," + NotificationStatus.INPROGRESS.id + " ) ";
+			return refreshModelCollection(getActiveNotificationsWithReminder(rsf, where, "v", tblResponsibilities));
+		} catch (Exception t) {
+			LOGGER.error(t);
+			throw new BtbInternalServerError("Error loading notifications");
+		}
+	}
+
+
+	/**
+	 * Returns all Notifications with status "closed" that are not older than x
+	 * hours.
+	 *
+	 * @return List of notifications
+	 */
+	public List<TblNotification> getPastNotifications(NotificationSearchFilter nsf,
+			List<TblResponsibility> tblResponsibilities) throws BtbInternalServerError {
+		String where = "v.fk_ref_notification_status IN ( " + NotificationStatus.CLOSED.id + " ) ";
+		return refreshModelCollection(getActiveNotifications(nsf, where, "v", ListType.PAST, tblResponsibilities));
+	}
+
+	/**
+	 * Returns the Notifications with Status "open", "in progess" or "finished"
+	 * that have a begin date before tomorrow.
+	 *
+	 * @param notificationSearchFilter
+	 *            The filter to determine the the search criteria.
+	 * @return List of notifications
+	 */
+	public List<TblNotification> getOpenNotifications(NotificationSearchFilter notificationSearchFilter,
+			List<TblResponsibility> tblResponsibilities) throws BtbInternalServerError {
+		String where = "v.fk_ref_notification_status IN (" + NotificationStatus.OPEN.id + ","
+				+ NotificationStatus.INPROGRESS.id + ","
+                + NotificationStatus.FINISHED.id+ ")" + "   AND  v.begin_date < (TIMESTAMP 'tomorrow')";
+		return refreshModelCollection(
+				getActiveNotifications(notificationSearchFilter, where, "v", ListType.OPEN, tblResponsibilities));
+	}
+
+	public List<TblNotification> getFutureNotifications(NotificationSearchFilter nsf,
+			List<TblResponsibility> tblResponsibilities) throws BtbInternalServerError {
+		String where = "v.fk_ref_notification_status NOT IN (" + NotificationStatus.CLOSED.id + ","
+				+ NotificationStatus.FINISHED.id + ")";
+		return refreshModelCollection(getActiveNotifications(nsf, where, "v", ListType.FUTURE, tblResponsibilities));
+	}
+
+
+	@SuppressWarnings("unchecked")
+	public List<TblNotification> getByIncidentId(int incidentId) throws BtbInternalServerError {
+		try {
+			String selectString = "select * from tbl_notification n where n.incident_id=? order by n.version desc";
+			Query q = getEM().createNativeQuery(selectString, TblNotification.class);
+			q.setParameter(1, incidentId);
+			return refreshModelCollection(q.getResultList());
+		} catch (Exception t) {
+			LOGGER.error(t);
+			throw new BtbInternalServerError("Error loading notifications");
+		}
+	}
+
+	@SuppressWarnings("unchecked")
+	public List<String> getAssignedUserSuggestions() throws BtbInternalServerError {
+
+		try {
+			String selectString = "select distinct responsibility_forwarding from view_active_notification n where n.responsibility_forwarding is not null";
+			Query q = getEM().createNativeQuery(selectString);
+			return q.getResultList();
+		} catch (Exception t) {
+			LOGGER.error(t);
+			throw new BtbInternalServerError("Error loading notifications");
+		}
+	}
+
+
+	/**
+	 * Create and execute the query to get a collection of notifications.
+	 *
+	 * @param hTblResponsibilities
+	 *            the responsibilities containing branch and grid territory references
+	 * @param listType
+	 *            the {@link ListType}
+	 * @return a List of historical notifications relevant for the responsibility given by parameter.
+	 * @throws BtbException if an error occurs.
+	 */
+	@SuppressWarnings("unchecked")
+	public List<TblNotification> findHistoricalNotificationsByResponsibility(
+			List<HTblResponsibility> hTblResponsibilities, ListType listType) throws BtbInternalServerError {
+		try {
+			NotificationQueryCreator queryCreator = new NotificationQueryCreator(getEM(), "");
+			Query query = queryCreator.generateFindHistoricalNotificationsByResponsibilityQuery(hTblResponsibilities,
+					listType);
+			List<TblNotification> tblNotifications = refreshModelCollection(
+					(List<TblNotification>) query.getResultList());
+
+			if (LOGGER.isDebugEnabled()) {
+				for (TblNotification tblNotification : tblNotifications) {
+					LOGGER.debug("Notification found: " + tblNotification.getId() + "/"
+							+ tblNotification.getIncidentId() + tblNotification.getVersion());
+				}
+			}
+			return tblNotifications;
+		} catch (Exception e) {
+			LOGGER.error(e);
+			throw new BtbInternalServerError("Error retrieving historical notifications by responsibility");
+		}
+	}
+
+	
+	/**
+	 * Find notifications matching the search criteria in the global search filter.
+	 * 
+	 * @param globalSearchFilter
+	 *            contains the search criteria.
+	 * @return the notifications found, matching the given criteria.
+	 * @throws BtbInternalServerError
+	 *             if an error occurs.
+	 */
+	@SuppressWarnings("unchecked")
+	public List<TblNotification> findNotificationsMatchingSearchCriteria(GlobalSearchFilter globalSearchFilter)
+			throws BtbInternalServerError {
+		try {
+			NotificationQueryCreator queryCreator = new NotificationQueryCreator(getEM(), "");
+			Query query = queryCreator.generateFindNotificationsMatchingSearchCriteriaQuery(globalSearchFilter);
+			List<TblNotification> results;
+			results = query.getResultList();
+			return refreshModelCollection((List<TblNotification>) results);
+		} catch (Exception e) {
+			LOGGER.error(e);
+			throw new BtbInternalServerError("Error retrieving notifications applying global search filter.");
+		}
+	}
+}
diff --git a/src/main/java/org/eclipse/openk/elogbook/persistence/dao/TblResponsibilityDao.java b/src/main/java/org/eclipse/openk/elogbook/persistence/dao/TblResponsibilityDao.java
new file mode 100644
index 0000000..b7edb90
--- /dev/null
+++ b/src/main/java/org/eclipse/openk/elogbook/persistence/dao/TblResponsibilityDao.java
@@ -0,0 +1,95 @@
+package org.eclipse.openk.elogbook.persistence.dao;
+
+import java.util.ArrayList;
+import java.util.List;
+import javax.persistence.EntityManager;
+import javax.persistence.Query;
+import org.eclipse.openk.elogbook.persistence.model.TblResponsibility;
+
+
+public class TblResponsibilityDao extends GenericDaoJpa<TblResponsibility, Integer> {
+    public TblResponsibilityDao() {
+        super();
+    }
+
+    public TblResponsibilityDao(EntityManager em) {
+        super(em);
+    }
+
+    @SuppressWarnings("unchecked")
+    public List<TblResponsibility> getResponsibilitiesForUser(String responsibleUser) {
+
+        try {
+            String selectString = "from " + TblResponsibility.class.getSimpleName() + " v where v.responsibleUser = :responsibleUser";
+            Query q = getEM().createQuery(selectString);
+            q.setParameter("responsibleUser", responsibleUser);
+            return refreshModelCollection((List<TblResponsibility>) q.getResultList());
+        } catch (Throwable t) { //NOSONAR
+            LOGGER.error(t.getMessage());
+            return new ArrayList<>();
+        }
+    }
+
+    @SuppressWarnings("unchecked")
+    public List<TblResponsibility> getPlannedResponsibilitiesForUser(String newResponsibleUser) {
+
+        try {
+            String selectString = "from " + TblResponsibility.class.getSimpleName() + " v where v.newResponsibleUser = :newResponsibleUser";
+            Query q = getEM().createQuery(selectString);
+            q.setParameter("newResponsibleUser", newResponsibleUser);
+            return refreshModelCollection((List<TblResponsibility>) q.getResultList());
+        } catch (Throwable t) { //NOSONAR
+            LOGGER.error(t.getMessage());
+            return new ArrayList<>();
+        }
+    }
+
+    @SuppressWarnings("unchecked")
+    public List<TblResponsibility> getAllResponsibilities() {
+
+        try {
+            String selectString = "from " + TblResponsibility.class.getSimpleName() + " v";
+            Query q = getEM().createQuery(selectString);
+            return refreshModelCollection((List<TblResponsibility>) q.getResultList());
+        } catch (Throwable t) { //NOSONAR
+            LOGGER.error(t.getMessage());
+            return new ArrayList<>();
+        }
+    }
+
+    @SuppressWarnings("unchecked")
+    public List<TblResponsibility> getNewOrCurrentResponisbleUser(String modUser) {
+
+        try {
+            String selectString = "from " + TblResponsibility.class.getSimpleName() + " v where v.responsibleUser = :modUser or v.newResponsibleUser = :modUser";
+            Query q = getEM().createQuery(selectString);
+            q.setParameter("modUser", modUser);
+            return refreshModelCollection((List<TblResponsibility>) q.getResultList());
+        } catch (Throwable t) { //NOSONAR
+            LOGGER.error(t.getMessage());
+            return new ArrayList<>();
+        }
+    }
+
+	/**
+	 * Find the TblResponsibilites for the given list of Ids.
+	 *
+	 * @param responsibilityIds
+	 *            A List of {@link Integer} objects representing the Ids of the
+	 *            responsibilities
+	 * @return the list of tblResponsibilities
+	 */
+	public List<TblResponsibility> findResponsibilitiesByIdList(List<Integer> responsibilityIds) {
+
+		List<TblResponsibility> tblResponsibilities = new ArrayList<>();
+		for (Integer responsibilityId : responsibilityIds) {
+			TblResponsibility tblResponsibility = findById(TblResponsibility.class, responsibilityId);
+			if (tblResponsibility != null) {
+				tblResponsibilities.add(tblResponsibility);
+			}
+		}
+		return tblResponsibilities;
+	}
+
+}
+
diff --git a/src/main/java/org/eclipse/openk/elogbook/persistence/dao/interfaces/IGenericDao.java b/src/main/java/org/eclipse/openk/elogbook/persistence/dao/interfaces/IGenericDao.java
new file mode 100644
index 0000000..7f6f199
--- /dev/null
+++ b/src/main/java/org/eclipse/openk/elogbook/persistence/dao/interfaces/IGenericDao.java
@@ -0,0 +1,187 @@
+package org.eclipse.openk.elogbook.persistence.dao.interfaces;
+
+import java.io.Serializable;
+import java.util.List;
+import javax.persistence.EntityManager;
+
+/**
+ * @param <T>  - Persistence Class (Entity in JPA).
+ * @param <ID> - Primary Key.
+ * @author Training.
+ */
+public interface IGenericDao<T, ID extends Serializable> {
+
+    /**
+     * Find by primary key.
+     *
+     * @param persistentClass - Class<T>.
+     * @param id              - ID.
+     * @return T - Instance of T.
+     */
+    T findById(Class<T> persistentClass, ID id);
+
+    /**
+     * Find by primary key in Transaction.
+     *
+     * @param persistentClass - Class<T>.
+     * @param id              - ID.
+     * @return T - Instance of T.
+     */
+    T findByIdInTx(Class<T> persistentClass, ID id);
+
+    /**
+     * Store a <T>.
+     * If id=0, persist, else merge.
+     *
+     * @param persistentObject - Instance of Persistence Class (T).
+     * @return T - new persistent Object if merged.
+     * @throws Exception - any Exception.
+     */
+    T store(T persistentObject) throws Exception;
+
+    /**
+     * Store a <T> in a Transaction
+     * If id=0, persist, else merge.
+     *
+     * @param persistentObject - Instance of Persistence Class (T).
+     * @return T - new persistent Object if merged.
+     * @throws Exception - any Exception.
+     */
+    T storeInTx(T persistentObject) throws Exception;
+
+    /**
+     * Insert new <T>.
+     *
+     * @param persistentObject - Instance of Persistence Class (T).
+     * @throws Exception - any Exception.
+     */
+    void persist(T persistentObject) throws Exception;
+
+    /**
+     * Insert new <T> in running transaction.
+     *
+     * @param persistentObject - Instance of Persistence Class (T).
+     * @throws Exception - any Exception.
+     */
+    void persistInTx(T persistentObject) throws Exception;
+
+    /**
+     * Merge object and return newly created persistent object.
+     *
+     * @param persistentObject <T>.
+     * @return <T> - persistentObject.
+     * @throws Exception - any Exception.
+     */
+    T merge(T persistentObject) throws Exception;
+
+    /**
+     * Merge object in running transaction
+     * and return newly created persistent object.
+     *
+     * @param persistentObject <T>.
+     * @return <T> - persistentObject.
+     * @throws Exception - any Exception.
+     */
+    T mergeInTx(T persistentObject) throws Exception;
+
+    /**
+     * Remove persistentObject from Database.
+     *
+     * @param persistentObject T - Persistent Object.
+     * @param id               ID - primary key.
+     * @throws Exception - any Exception.
+     */
+    void remove(T persistentObject, ID id) throws Exception;
+
+    /**
+     * Remove persistentObject from Database in current transaction.
+     *
+     * @param persistentObject T - Persistent Object.
+     * @param id               ID - primary key.
+     * @throws Exception - any Exception.
+     */
+    void removeInTx(T persistentObject, ID id) throws Exception;
+
+    /**
+     * Return all Persistent Objects (all = true)
+     * or Persistent Objects between <firstResult> and <lastResult>.
+     *
+     * @param all         - all Persistent Objects.
+     * @param maxResult   int - end.
+     * @param firstResult int - start.
+     * @return List<T> - List of found persistent objects.
+     */
+    List<T> find(boolean all, int maxResult, int firstResult);
+
+    /**
+     * Return all Persistent Objects (all = true) in Transaction.
+     * or Persistent Objects between <firstResult> and <lastResult>.
+     *
+     * @param all         - all Persistent Objects.
+     * @param maxResult   int - end.
+     * @param firstResult int - start.
+     * @return List<T> - List of found persistent objects.
+     */
+    List<T> findInTx(boolean all, int maxResult, int firstResult);
+
+    /**
+     * Return initialized EntityManager.
+     *
+     * @return em - EntityManager.
+     */
+    EntityManager getEM();
+
+    /**
+     * Starten einer Transaktion.
+     */
+    void startTransaction();
+
+    /**
+     * Beenden Transaktion.
+     */
+    void endTransaction();
+
+    /**
+     * Commit Transaktion.
+     */
+    void commitTransaction();
+
+    /**
+     * Rollback Transaktion.
+     */
+    void rollbackTransaction();
+
+    /**
+     * Schlie�en EntityManager.
+     */
+    void closeSession();
+}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/main/java/org/eclipse/openk/elogbook/persistence/model/AbstractNotification.java b/src/main/java/org/eclipse/openk/elogbook/persistence/model/AbstractNotification.java
new file mode 100644
index 0000000..3356b48
--- /dev/null
+++ b/src/main/java/org/eclipse/openk/elogbook/persistence/model/AbstractNotification.java
@@ -0,0 +1,256 @@
+package org.eclipse.openk.elogbook.persistence.model;
+
+import java.io.Serializable;
+import java.sql.Timestamp;
+
+import javax.persistence.Column;
+import javax.persistence.GeneratedValue;
+import javax.persistence.GenerationType;
+import javax.persistence.Id;
+import javax.persistence.JoinColumn;
+import javax.persistence.ManyToOne;
+import javax.persistence.MappedSuperclass;
+import javax.persistence.SequenceGenerator;
+
+
+/**
+ * The persistent class for the tbl_notification database table.
+ *
+ */
+@MappedSuperclass
+public class AbstractNotification implements Serializable {
+	private static final long serialVersionUID = 1L;
+
+	@Id
+	@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "TBL_NOTIFICATION_ID_SEQ")
+	@SequenceGenerator(name = "TBL_NOTIFICATION_ID_SEQ", sequenceName = "TBL_NOTIFICATION_ID_SEQ", allocationSize = 1)
+	@Column(name = "id", updatable = false)
+	private Integer id;
+
+	@Column(name = "incident_id")
+	private Integer incidentId;
+
+	@Column(name="begin_date")
+	private Timestamp beginDate;
+
+	@Column(name="create_date")
+	private Timestamp createDate;
+
+	@Column(name="create_user")
+	private String createUser;
+
+	@Column(name="expected_finished_date")
+	private Timestamp expectedFinishedDate;
+
+	@Column(name="finished_date")
+	private Timestamp finishedDate;
+
+	@Column(name="free_text")
+	private String freeText;
+
+	@Column(name="free_text_extended")
+	private String freeTextExtended;
+
+	@Column(name="mod_date")
+	private Timestamp modDate;
+
+	@Column(name="mod_user")
+	private String modUser;
+
+	@Column(name="notification_text")
+	private String notificationText;
+
+	@Column(name="reminder_date")
+	private Timestamp reminderDate;
+
+	@Column(name="responsibility_control_point")
+	private String responsibilityControlPoint;
+
+	@Column(name="responsibility_forwarding")
+	private String responsibilityForwarding;
+
+	@Column(name="version")
+	private Integer version;
+	
+	@Column(name="admin_flag")
+	private Boolean adminFlag;
+
+	//bi-directional many-to-one association to RefBranch
+	@ManyToOne
+	@JoinColumn(name="fk_ref_branch")
+	private RefBranch refBranch;
+
+	//bi-directional many-to-one association to RefNotificationStatus
+	@ManyToOne
+	@JoinColumn(name="fk_ref_notification_status")
+	private RefNotificationStatus refNotificationStatus;
+
+	@ManyToOne
+	@JoinColumn(name="fk_ref_grid_territory")
+	private RefGridTerritory refGridTerritory;
+
+	public AbstractNotification() {
+		// empty Standard constructor
+	}
+
+	public Integer getId() {
+		return this.id;
+	}
+
+	public void setId(Integer id) {
+		this.id = id;
+	}
+
+	public Timestamp getBeginDate() {
+		return beginDate;
+	}
+
+	public void setBeginDate(Timestamp beginDate) {
+		this.beginDate = beginDate;
+	}
+
+	public Timestamp getCreateDate() {
+		return this.createDate;
+	}
+
+	public void setCreateDate(Timestamp createDate) {
+		this.createDate = createDate;
+	}
+
+	public String getCreateUser() {
+		return this.createUser;
+	}
+
+	public void setCreateUser(String creator) {
+		this.createUser = creator;
+	}
+
+	public Timestamp getExpectedFinishedDate() {
+		return this.expectedFinishedDate;
+	}
+
+	public void setExpectedFinishedDate(Timestamp expectedFinishedDate) {
+		this.expectedFinishedDate = expectedFinishedDate;
+	}
+
+	public Timestamp getFinishedDate() {
+		return this.finishedDate;
+	}
+
+	public void setFinishedDate(Timestamp finishedDate) {
+		this.finishedDate = finishedDate;
+	}
+
+	public String getFreeText() {
+		return this.freeText;
+	}
+
+	public void setFreeText(String freeText) {
+		this.freeText = freeText;
+	}
+
+	public String getFreeTextExtended() {
+		return this.freeTextExtended;
+	}
+
+	public void setFreeTextExtended(String freeTextExtended) {
+		this.freeTextExtended = freeTextExtended;
+	}
+
+	public Integer getIncidentId() {
+		return this.incidentId;
+	}
+
+	public void setIncidentId(Integer incidentId) {
+		this.incidentId = incidentId;
+	}
+
+	public Timestamp getModDate() {
+		return this.modDate;
+	}
+
+	public void setModDate(Timestamp modDate) {
+		this.modDate = modDate;
+	}
+
+	public String getModUser() {
+		return this.modUser;
+	}
+
+	public void setModUser(String modUser) {
+		this.modUser = modUser;
+	}
+
+	public String getNotificationText() {
+		return this.notificationText;
+	}
+
+	public void setNotificationText(String notificationText) {
+		this.notificationText = notificationText;
+	}
+
+	public Timestamp getReminderDate() {
+		return this.reminderDate;
+	}
+
+	public void setReminderDate(Timestamp reminderDate) {
+		this.reminderDate = reminderDate;
+	}
+
+	public String getResponsibilityControlPoint() {
+		return this.responsibilityControlPoint;
+	}
+
+	public void setResponsibilityControlPoint(String responsibilityControlPoint) {
+		this.responsibilityControlPoint = responsibilityControlPoint;
+	}
+
+	public String getResponsibilityForwarding() {
+		return this.responsibilityForwarding;
+	}
+
+	public void setResponsibilityForwarding(String responsibilityForwarding) {
+		this.responsibilityForwarding = responsibilityForwarding;
+	}
+
+	public Integer getVersion() {
+		return this.version;
+	}
+
+	public void setVersion(Integer version) {
+		this.version = version;
+	}
+
+	public RefBranch getRefBranch() {
+		return this.refBranch;
+	}
+
+	public void setRefBranch(RefBranch refBranch) {
+		this.refBranch = refBranch;
+	}
+
+	public RefNotificationStatus getRefNotificationStatus() {
+		return this.refNotificationStatus;
+	}
+
+	public void setRefNotificationStatus(RefNotificationStatus refNotificationStatus) {
+		this.refNotificationStatus = refNotificationStatus;
+	}
+
+	public RefGridTerritory getRefGridTerritory() {
+		return refGridTerritory;
+	}
+
+	public void setRefGridTerritory(RefGridTerritory refGridTerritory) {
+		this.refGridTerritory = refGridTerritory;
+	}
+
+	public Boolean isAdminFlag() {
+		return adminFlag;
+	}
+
+	public void setAdminFlag(Boolean adminFlag) {
+		this.adminFlag = adminFlag;
+	}
+
+}
\ No newline at end of file
diff --git a/src/main/java/org/eclipse/openk/elogbook/persistence/model/HTblResponsibility.java b/src/main/java/org/eclipse/openk/elogbook/persistence/model/HTblResponsibility.java
new file mode 100644
index 0000000..3dcfc2a
--- /dev/null
+++ b/src/main/java/org/eclipse/openk/elogbook/persistence/model/HTblResponsibility.java
@@ -0,0 +1,171 @@
+package org.eclipse.openk.elogbook.persistence.model;
+
+import java.io.Serializable;
+import java.sql.Timestamp;
+import javax.persistence.Column;
+import javax.persistence.Entity;
+import javax.persistence.GeneratedValue;
+import javax.persistence.GenerationType;
+import javax.persistence.Id;
+import javax.persistence.JoinColumn;
+import javax.persistence.ManyToOne;
+import javax.persistence.NamedQueries;
+import javax.persistence.NamedQuery;
+import javax.persistence.SequenceGenerator;
+import javax.persistence.Table;
+
+
+/**
+ * The persistent class for the htbl_responsibility database table.
+ *
+ */
+@Entity
+@Table(name="htbl_responsibility")
+@NamedQueries ({
+@NamedQuery(name="HTblResponsibility.findAll", query="SELECT t FROM HTblResponsibility t"),
+})
+public class HTblResponsibility implements Serializable {
+	private static final long serialVersionUID = 1L;
+
+	@Id
+	@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "HTBL_RESPONSIBILITY_ID_SEQ")
+	@SequenceGenerator(name = "HTBL_RESPONSIBILITY_ID_SEQ", sequenceName = "HTBL_RESPONSIBILITY_ID_SEQ", allocationSize = 1)
+	@Column(name = "id", updatable = false)
+	private Integer id;
+
+	@Column(name="responsible_user")
+	private String responsibleUser;
+
+	@Column(name="former_responsible_user")
+	private String formerResponsibleUser;
+
+	@Column(name="transfer_date")
+	private Timestamp transferDate;
+
+	@Column(name = "transaction_id")
+	private Integer transactionId;
+
+	@Column(name="create_date")
+	private Timestamp createDate;
+
+	@Column(name="create_user")
+	private String createUser;
+
+	@Column(name="mod_date")
+	private Timestamp modDate;
+
+	@Column(name="mod_user")
+	private String modUser;
+
+	//bi-directional many-to-one association to RefGridTerritory
+	@ManyToOne
+	@JoinColumn(name="fk_ref_grid_territory")
+	private RefGridTerritory refGridTerritory;
+
+	//bi-directional many-to-one association to RefBranch
+	@ManyToOne
+	@JoinColumn(name="fk_ref_branch")
+	private RefBranch refBranch;
+
+	public HTblResponsibility() {
+		// empty Standard constructor
+	}
+
+	public HTblResponsibility(TblResponsibility tblResponsibility) {
+		this.responsibleUser = tblResponsibility.getResponsibleUser();
+		this.createDate = tblResponsibility.getCreateDate();
+		this.createUser = tblResponsibility.getCreateUser();
+		this.modDate = tblResponsibility.getModDate();
+		this.modUser = tblResponsibility.getModUser();
+		this.refGridTerritory = tblResponsibility.getRefGridTerritory();
+		this.refBranch = tblResponsibility.getRefBranch();
+	}
+
+	public Integer getId() {
+		return this.id;
+	}
+
+	public void setId(Integer id) {
+		this.id = id;
+	}
+
+	public String getResponsibleUser() {
+		return responsibleUser;
+	}
+
+	public void setResponsibleUser(String responsibleUser) {
+		this.responsibleUser = responsibleUser;
+	}
+
+	public String getFormerResponsibleUser() {
+		return formerResponsibleUser;
+	}
+
+	public void setFormerResponsibleUser(String formerResponsibleUser) {
+		this.formerResponsibleUser = formerResponsibleUser;
+	}
+
+	public Timestamp getCreateDate() {
+		return createDate;
+	}
+
+	public void setCreateDate(Timestamp createDate) {
+		this.createDate = createDate;
+	}
+
+	public String getCreateUser() {
+		return createUser;
+	}
+
+	public void setCreateUser(String createUser) {
+		this.createUser = createUser;
+	}
+
+	public Timestamp getModDate() {
+		return modDate;
+	}
+
+	public void setModDate(Timestamp modDate) {
+		this.modDate = modDate;
+	}
+
+	public String getModUser() {
+		return modUser;
+	}
+
+	public void setModUser(String modUser) {
+		this.modUser = modUser;
+	}
+
+	public RefGridTerritory getRefGridTerritory() {
+		return refGridTerritory;
+	}
+
+	public void setRefGridTerritory(RefGridTerritory refGridTerritory) {
+		this.refGridTerritory = refGridTerritory;
+	}
+
+	public RefBranch getRefBranch() {
+		return refBranch;
+	}
+
+	public void setRefBranch(RefBranch refBranch) {
+		this.refBranch = refBranch;
+	}
+
+	public Timestamp getTransferDate() {
+		return transferDate;
+	}
+
+	public void setTransferDate(Timestamp transferDate) {
+		this.transferDate = transferDate;
+	}
+
+	public Integer getTransactionId() {
+		return transactionId;
+	}
+
+	public void setTransactionId(Integer transactionId) {
+		this.transactionId = transactionId;
+	}
+}
\ No newline at end of file
diff --git a/src/main/java/org/eclipse/openk/elogbook/persistence/model/RefBranch.java b/src/main/java/org/eclipse/openk/elogbook/persistence/model/RefBranch.java
new file mode 100644
index 0000000..b66cae7
--- /dev/null
+++ b/src/main/java/org/eclipse/openk/elogbook/persistence/model/RefBranch.java
@@ -0,0 +1,63 @@
+package org.eclipse.openk.elogbook.persistence.model;
+
+
+import java.io.Serializable;
+import javax.persistence.Column;
+import javax.persistence.Entity;
+import javax.persistence.GeneratedValue;
+import javax.persistence.GenerationType;
+import javax.persistence.Id;
+import javax.persistence.NamedQuery;
+import javax.persistence.Table;
+
+
+/**
+ * The persistent class for the ref_branch database table.
+ *
+ */
+@Entity
+@Table(name="ref_branch")
+@NamedQuery(name="RefBranch.findAll", query="SELECT r FROM RefBranch r")
+public class RefBranch implements Serializable {
+	private static final long serialVersionUID = 1L;
+
+	@Id
+	@GeneratedValue(strategy = GenerationType.AUTO)
+  @Column(name = "id")
+	private Integer id;
+
+	private String name;
+
+	private String description;
+
+	public RefBranch() {
+		// default constructor
+	}
+
+	public Integer getId() {
+		return this.id;
+	}
+
+	public void setId(Integer id) {
+		this.id = id;
+	}
+
+	public String getDescription() {
+		return this.description;
+	}
+
+	public void setDescription(String description) {
+		this.description = description;
+	}
+
+	public String getName() {
+		return this.name;
+	}
+
+	public void setName(String name) {
+		this.name = name;
+	}
+
+
+
+}
\ No newline at end of file
diff --git a/src/main/java/org/eclipse/openk/elogbook/persistence/model/RefGridTerritory.java b/src/main/java/org/eclipse/openk/elogbook/persistence/model/RefGridTerritory.java
new file mode 100644
index 0000000..8568809
--- /dev/null
+++ b/src/main/java/org/eclipse/openk/elogbook/persistence/model/RefGridTerritory.java
@@ -0,0 +1,86 @@
+package org.eclipse.openk.elogbook.persistence.model;
+
+import java.io.Serializable;
+import javax.persistence.Column;
+import javax.persistence.Entity;
+import javax.persistence.GeneratedValue;
+import javax.persistence.GenerationType;
+import javax.persistence.Id;
+import javax.persistence.JoinColumn;
+import javax.persistence.ManyToOne;
+import javax.persistence.NamedQuery;
+import javax.persistence.Table;
+
+
+/**
+ * The persistent class for the ref_grid_territory database table.
+ *
+ */
+@Entity
+@Table(name="ref_grid_territory")
+@NamedQuery(name="RefGridTerritory.findAll", query="SELECT r FROM RefGridTerritory r")
+public class RefGridTerritory implements Serializable {
+	private static final long serialVersionUID = 1L;
+
+	@Id
+    @GeneratedValue(strategy = GenerationType.AUTO)
+    @Column(name = "id")
+	private Integer id;
+
+	@ManyToOne
+	@JoinColumn(name="fk_ref_master")
+	private RefGridTerritory refMaster;
+
+	@Column(name = "fk_ref_master", nullable = false, updatable = false, insertable = false)
+	private Integer fkRefMaster;
+
+	private String description;
+
+	private String name;
+
+	public RefGridTerritory() {
+		//  default constructor
+	}
+
+	public Integer getId() {
+		return this.id;
+	}
+
+	public void setId(Integer id) {
+		this.id = id;
+	}
+
+	public String getDescription() {
+		return this.description;
+	}
+
+	public void setDescription(String description) {
+		this.description = description;
+	}
+
+	public String getName() {
+		return this.name;
+	}
+
+	public void setName(String name) {
+		this.name = name;
+	}
+
+	public RefGridTerritory getRefMaster() {
+		return refMaster;
+	}
+
+	public void setRefMaster(RefGridTerritory refMaster) {
+		this.refMaster = refMaster;
+	}
+
+	public Integer getFkRefMaster() {
+		return fkRefMaster;
+	}
+
+	public void setFkRefMaster(Integer fkRefMaster) {
+		this.fkRefMaster = fkRefMaster;
+	}
+
+
+}
\ No newline at end of file
diff --git a/src/main/java/org/eclipse/openk/elogbook/persistence/model/RefNotificationStatus.java b/src/main/java/org/eclipse/openk/elogbook/persistence/model/RefNotificationStatus.java
new file mode 100644
index 0000000..3a328b3
--- /dev/null
+++ b/src/main/java/org/eclipse/openk/elogbook/persistence/model/RefNotificationStatus.java
@@ -0,0 +1,50 @@
+package org.eclipse.openk.elogbook.persistence.model;
+
+import java.io.Serializable;
+import javax.persistence.Column;
+import javax.persistence.Entity;
+import javax.persistence.GeneratedValue;
+import javax.persistence.GenerationType;
+import javax.persistence.Id;
+import javax.persistence.NamedQuery;
+import javax.persistence.Table;
+
+
+/**
+ * The persistent class for the ref_notification_status database table.
+ *
+ */
+@Entity
+@Table(name="ref_notification_status", schema = "public")
+@NamedQuery(name="RefNotificationStatus.findAll", query="SELECT r FROM RefNotificationStatus r")
+public class RefNotificationStatus implements Serializable {
+	private static final long serialVersionUID = 1L;
+
+	@Id
+    @GeneratedValue(strategy = GenerationType.AUTO)
+    @Column(name = "id")
+	private Integer id;
+
+	private String name;
+
+	public RefNotificationStatus() {
+		// default constructor
+	}
+
+	public Integer getId() {
+		return this.id;
+	}
+
+	public void setId(Integer id) {
+		this.id = id;
+	}
+
+	public String getName() {
+		return this.name;
+	}
+
+	public void setName(String name) {
+		this.name = name;
+	}
+
+}
\ No newline at end of file
diff --git a/src/main/java/org/eclipse/openk/elogbook/persistence/model/RefVersion.java b/src/main/java/org/eclipse/openk/elogbook/persistence/model/RefVersion.java
new file mode 100644
index 0000000..06f0974
--- /dev/null
+++ b/src/main/java/org/eclipse/openk/elogbook/persistence/model/RefVersion.java
@@ -0,0 +1,46 @@
+package org.eclipse.openk.elogbook.persistence.model;
+
+import java.io.Serializable;
+import javax.persistence.Column;
+import javax.persistence.Entity;
+import javax.persistence.GeneratedValue;
+import javax.persistence.GenerationType;
+import javax.persistence.Id;
+import javax.persistence.NamedQuery;
+import javax.persistence.Table;
+
+
+/**
+ * The persistent class for the "REF_VERSION" database table.
+ */
+@Entity
+@Table(name = "ref_version", schema = "public")
+@NamedQuery(name = "RefVersion.findAll", query = "SELECT r FROM RefVersion r")
+public class RefVersion implements Serializable {
+    private static final long serialVersionUID = 1L;
+
+    @Id
+    @GeneratedValue(strategy = GenerationType.AUTO)
+    @Column(name = "id")
+    private Integer id;
+
+    @Column(name = "version")
+    private String version;
+
+    public Integer getId() {
+        return this.id;
+    }
+
+    public void setId(Integer id) {
+        this.id = id;
+    }
+
+    public String getVersion() {
+        return this.version;
+    }
+
+    public void setVersion(String version) {
+        this.version = version;
+    }
+
+}
\ No newline at end of file
diff --git a/src/main/java/org/eclipse/openk/elogbook/persistence/model/TblNotification.java b/src/main/java/org/eclipse/openk/elogbook/persistence/model/TblNotification.java
new file mode 100644
index 0000000..9168fb0
--- /dev/null
+++ b/src/main/java/org/eclipse/openk/elogbook/persistence/model/TblNotification.java
@@ -0,0 +1,17 @@
+package org.eclipse.openk.elogbook.persistence.model;
+
+import javax.persistence.Entity;
+import javax.persistence.Table;
+
+
+/**
+ * The persistent class for the tbl_notification database table.
+ *
+ */
+@Entity
+@Table(name="tbl_notification")
+public class TblNotification extends AbstractNotification {
+	private static final long serialVersionUID = 1L;
+
+
+}
\ No newline at end of file
diff --git a/src/main/java/org/eclipse/openk/elogbook/persistence/model/TblResponsibility.java b/src/main/java/org/eclipse/openk/elogbook/persistence/model/TblResponsibility.java
new file mode 100644
index 0000000..c91266d
--- /dev/null
+++ b/src/main/java/org/eclipse/openk/elogbook/persistence/model/TblResponsibility.java
@@ -0,0 +1,136 @@
+package org.eclipse.openk.elogbook.persistence.model;
+
+import java.io.Serializable;
+import java.sql.Timestamp;
+import javax.persistence.Column;
+import javax.persistence.Entity;
+import javax.persistence.GeneratedValue;
+import javax.persistence.GenerationType;
+import javax.persistence.Id;
+import javax.persistence.JoinColumn;
+import javax.persistence.ManyToOne;
+import javax.persistence.NamedQuery;
+import javax.persistence.SequenceGenerator;
+import javax.persistence.Table;
+
+
+/**
+ * The persistent class for the tbl_responsibility database table.
+ *
+ */
+@Entity
+@Table(name="tbl_responsibility")
+@NamedQuery(name="TblResponsibility.findAll", query="SELECT t FROM TblResponsibility t")
+public class TblResponsibility implements Serializable {
+	private static final long serialVersionUID = 1L;
+
+	@Id
+	@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "TBL_RESPONSIBILITY_ID_SEQ")
+	@SequenceGenerator(name = "TBL_RESPONSIBILITY_ID_SEQ", sequenceName = "TBL_RESPONSIBILITY_ID_SEQ", allocationSize = 1)
+	@Column(name = "id", updatable = false)
+	private Integer id;
+
+	@Column(name="responsible_user")
+	private String responsibleUser;
+
+	@Column(name="new_responsible_user")
+	private String newResponsibleUser;
+
+	@Column(name="create_date")
+	private Timestamp createDate;
+
+	@Column(name="create_user")
+	private String createUser;
+
+	@Column(name="mod_date")
+	private Timestamp modDate;
+
+	@Column(name="mod_user")
+	private String modUser;
+
+	//bi-directional many-to-one association to RefGridTerritory
+	@ManyToOne
+	@JoinColumn(name="fk_ref_grid_territory")
+	private RefGridTerritory refGridTerritory;
+
+	//bi-directional many-to-one association to RefBranch
+	@ManyToOne
+	@JoinColumn(name="fk_ref_branch")
+	private RefBranch refBranch;
+
+	public TblResponsibility() {
+		// empty Standard constructor
+	}
+
+	public Integer getId() {
+		return this.id;
+	}
+
+	public void setId(Integer id) {
+		this.id = id;
+	}
+
+	public String getResponsibleUser() {
+		return responsibleUser;
+	}
+
+	public void setResponsibleUser(String responsibleUser) {
+		this.responsibleUser = responsibleUser;
+	}
+
+	public String getNewResponsibleUser() {
+		return newResponsibleUser;
+	}
+
+	public void setNewResponsibleUser(String newResponsibleUser) {
+		this.newResponsibleUser = newResponsibleUser;
+	}
+
+	public Timestamp getCreateDate() {
+		return createDate;
+	}
+
+	public void setCreateDate(Timestamp createDate) {
+		this.createDate = createDate;
+	}
+
+	public String getCreateUser() {
+		return createUser;
+	}
+
+	public void setCreateUser(String createUser) {
+		this.createUser = createUser;
+	}
+
+	public Timestamp getModDate() {
+		return modDate;
+	}
+
+	public void setModDate(Timestamp modDate) {
+		this.modDate = modDate;
+	}
+
+	public String getModUser() {
+		return modUser;
+	}
+
+	public void setModUser(String modUser) {
+		this.modUser = modUser;
+	}
+
+	public RefGridTerritory getRefGridTerritory() {
+		return refGridTerritory;
+	}
+
+	public void setRefGridTerritory(RefGridTerritory refGridTerritory) {
+		this.refGridTerritory = refGridTerritory;
+	}
+
+	public RefBranch getRefBranch() {
+		return refBranch;
+	}
+
+	public void setRefBranch(RefBranch refBranch) {
+		this.refBranch = refBranch;
+	}
+}
\ No newline at end of file
diff --git a/src/main/java/org/eclipse/openk/elogbook/persistence/model/ViewNotification.java b/src/main/java/org/eclipse/openk/elogbook/persistence/model/ViewNotification.java
new file mode 100644
index 0000000..12f47a1
--- /dev/null
+++ b/src/main/java/org/eclipse/openk/elogbook/persistence/model/ViewNotification.java
@@ -0,0 +1,17 @@
+package org.eclipse.openk.elogbook.persistence.model;
+
+import javax.persistence.Entity;
+import javax.persistence.Table;
+
+
+/**
+ * The persistent class for the notification database view.
+ *
+ */
+@Entity
+@Table(name="view_active_notification")
+public class ViewNotification extends AbstractNotification {
+	private static final long serialVersionUID = 1L;
+
+
+}
\ No newline at end of file
diff --git a/src/main/java/org/eclipse/openk/elogbook/persistence/util/NotificationQueryCreator.java b/src/main/java/org/eclipse/openk/elogbook/persistence/util/NotificationQueryCreator.java
new file mode 100644
index 0000000..85f68fe
--- /dev/null
+++ b/src/main/java/org/eclipse/openk/elogbook/persistence/util/NotificationQueryCreator.java
@@ -0,0 +1,399 @@
+package org.eclipse.openk.elogbook.persistence.util;
+
+import org.apache.log4j.Logger;
+import org.eclipse.openk.elogbook.common.Globals;
+import org.eclipse.openk.elogbook.common.NotificationStatus;
+import org.eclipse.openk.elogbook.persistence.model.HTblResponsibility;
+import org.eclipse.openk.elogbook.persistence.model.TblNotification;
+import org.eclipse.openk.elogbook.persistence.model.TblResponsibility;
+import org.eclipse.openk.elogbook.viewmodel.GlobalSearchFilter;
+import org.eclipse.openk.elogbook.viewmodel.Notification.ListType;
+import org.eclipse.openk.elogbook.viewmodel.NotificationSearchFilter;
+import org.eclipse.openk.elogbook.viewmodel.ReminderSearchFilter;
+
+import javax.persistence.EntityManager;
+import javax.persistence.Query;
+import java.sql.Timestamp;
+import java.util.Calendar;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+public class NotificationQueryCreator {
+	private static final String AND_LIT = " AND ";
+	private static final String OR_LIT = " OR ";
+	private static final String ORDER_LIT = " ORDER BY ";
+	private static final String FK_BRANCH_EQUAL = "fk_ref_branch = ";
+	private static final String FK_GRID_TERRITORY_EQUAL = "fk_ref_grid_territory = ";
+	private static final String FK_BRANCH_NULL = "fk_ref_branch IS NULL";
+	private static final String FK_GRID_TERRITORY_NULL = "fk_ref_grid_territory IS NULL";
+	private static final String DUMMY_FALSE_VALUE_ORCLAUSE = " false ";
+	
+	private static final Logger LOGGER = Logger.getLogger(NotificationQueryCreator.class.getName());
+
+	private EntityManager em;
+	private String tablePrefix = "";
+	private Map<Integer, Object> latebindParamMap = new HashMap<>();
+	private int iCounter = 1;
+
+	public NotificationQueryCreator(EntityManager em, String tablePrefix) {
+		this.em = em;
+		if (tablePrefix != null && !tablePrefix.isEmpty()) {
+			this.tablePrefix = tablePrefix + ".";
+		}
+	}
+
+	/**
+	 * Generate the Query by processing the informations from the notification search-filter.
+	 *
+	 * @param notificationSearchFilter
+	 *            The Object obtained from view model
+	 * @param baseWhereClause
+	 *            the base where clause to be completed using the notification search filter
+	 * @param listType
+	 *            the listType (where clause creation depends from it)
+	 * @param tblResponsibilities
+	 *            the list with the {@link TblResponsibility} objects
+	 * @return the generated query
+	 */
+	public Query generateNotificationQuery(NotificationSearchFilter notificationSearchFilter, String baseWhereClause,
+			ListType listType, List<TblResponsibility> tblResponsibilities) {
+
+		StringBuilder sql = new StringBuilder("select * from view_active_notification v where 1=1 ");
+		if (baseWhereClause != null && !baseWhereClause.isEmpty()) {
+			sql.append(AND_LIT).append(baseWhereClause);
+		}
+		if (notificationSearchFilter != null) {
+			sql.append(extendWhereClauseApplyingSearchFilter(notificationSearchFilter, listType, tblResponsibilities));
+		}
+		sql.append(getNotificationOrder());
+		// _fd: No String comes unescaped from outside the program -> So SONAR
+		// is wrong with it error
+		Query q = em.createNativeQuery(sql.toString(), TblNotification.class); // NOSONAR
+		latebindParamMap.forEach(q::setParameter);
+		return q;
+	}
+
+	public Query generateNotificationQueryWithReminder(ReminderSearchFilter rsf, String baseWhereClause,
+			List<TblResponsibility> tblResponsibilities) {
+
+		StringBuilder sql = new StringBuilder("select * from view_active_notification v where 1=1 ");
+		if (baseWhereClause != null && !baseWhereClause.isEmpty()) {
+			sql.append(AND_LIT).append(baseWhereClause);
+		}
+		if (rsf != null) {
+			sql.append(extendWhereClauseApplyingSearchFilterWithReminder(rsf, tblResponsibilities));
+		}
+		sql.append(getNotificationOrder());
+
+		// _fd: No String comes unescaped from outside the program -> So SONAR
+		// is wrong with it error
+		Query q = em.createNativeQuery(sql.toString(), TblNotification.class); // NOSONAR
+		latebindParamMap.forEach(q::setParameter);
+		return q;
+	}
+
+	/**
+	 * Create a query to get historical notifications relevant for the responsibility belonging to a specific
+	 * transaction id .
+	 * 
+	 * @param hTblResponsibilities
+	 *            the list of historical responsibilities at shift change date
+	 * @param listType
+	 *            the {@link ListType}
+	 * @return the generated query.
+	 */
+	public Query generateFindHistoricalNotificationsByResponsibilityQuery(List<HTblResponsibility> hTblResponsibilities,
+			ListType listType) {
+		StringBuilder sqlSB = new StringBuilder("select * from " + " tbl_notification t1 join ( "
+				+ " select incident_id, max(version) as version FROM tbl_notification t " + " WHERE ");
+		sqlSB.append("(");
+		sqlSB.append(" mod_Date < ? ").append(OR_LIT).append(" mod_Date IS NULL").append(AND_LIT)
+				.append("create_Date < ? ");
+		sqlSB.append(")");
+		sqlSB.append(" GROUP BY incident_id");
+		sqlSB.append(" ) t2 ON ( t1.incident_id = t2.incident_id AND t1.version = t2.version) where ");
+
+		sqlSB.append("(").append(DUMMY_FALSE_VALUE_ORCLAUSE);
+		for (HTblResponsibility hTblResponsibility : hTblResponsibilities) {
+			sqlSB.append(OR_LIT);
+			sqlSB.append(FK_BRANCH_EQUAL).append(hTblResponsibility.getRefBranch().getId()).append(AND_LIT)
+					.append(FK_GRID_TERRITORY_EQUAL).append(hTblResponsibility.getRefGridTerritory().getId());
+		}
+
+		extendFindHistoricalNotificationsByResponsibilityQueryListTypeSpecific(sqlSB, listType,
+				hTblResponsibilities.get(0).getTransferDate());
+		sqlSB.append(")").append(getNotificationOrder());
+		Query query = em.createNativeQuery(sqlSB.toString(), TblNotification.class);
+		query.setParameter(1, hTblResponsibilities.get(0).getTransferDate());
+		query.setParameter(2, hTblResponsibilities.get(0).getTransferDate());
+		return query;
+	}
+
+	/**
+	 * Create a query by evaluating the search filter criteria.
+	 * 
+	 * @param gsf
+	 *            the search filter containing the search criteria.
+	 * @return the generated query.
+	 */
+	public Query generateFindNotificationsMatchingSearchCriteriaQuery(GlobalSearchFilter gsf) {
+		String sql = createSearchCriteriaSelectString(gsf);
+		Query query = em.createQuery(sql, TblNotification.class);
+		substituteSearchCriteriaParameters(gsf, query);
+		return query;
+	}
+	
+	/**
+	 * Helper method generating SQL SELECT for search.
+	 * @param gsf the search filter containing search criteria
+	 * @return The generated query string
+	 */
+	private String createSearchCriteriaSelectString(GlobalSearchFilter gsf) {
+		StringBuilder sqlSB = new StringBuilder("SELECT t FROM");
+		if (gsf.isFastSearchSelected()) {
+			sqlSB.append(" ViewNotification t WHERE 1 = 1 AND ");
+			sqlSB.append("(t.modDate > :timestamp or t.modDate IS NULL AND t.createDate > :timestamp) AND ");
+		}
+		else {
+			sqlSB.append(" TblNotification t WHERE 1 = 1 AND ");
+		}
+		
+		if (gsf.getSearchString() != null) {
+			sqlSB.append("( UPPER(t.notificationText) LIKE :notificationText OR")
+				 .append(" UPPER(t.freeText) LIKE :freeText OR")
+				 .append(" UPPER(t.freeTextExtended) LIKE :freeTextExtended)");
+		}
+		if (gsf.getResponsibilityForwarding() != null && !gsf.getResponsibilityForwarding().isEmpty()) {
+			sqlSB.append(" AND t.responsibilityForwarding LIKE :responsibilityForwarding ");
+		}
+		if (gsf.isBranchSelected()) {
+			sqlSB.append(" AND t.refBranch.id = :refBranch ");
+		}
+		if (gsf.isGridTerritorySelected()) {
+			sqlSB.append(" AND t.refGridTerritory.id = :refGridTerritory ");
+		}
+		List<Integer> statusIds = gsf.getSelectedStatusMappedToIds();
+		if (!statusIds.isEmpty()) {
+			sqlSB.append(" AND t.refNotificationStatus.id IN ( ");
+			for (Integer status : statusIds) {
+				sqlSB.append(status.toString()).append(", ");
+			}
+			replaceLastCommaWithParanthese(sqlSB);
+		}
+		sqlSB.append(" ORDER BY t.refBranch, t.incidentId DESC, t.version DESC, t.refGridTerritory, t.beginDate ");
+		return sqlSB.toString();
+	}
+	
+	
+	/**
+	 * Helper method setting parameters to the generated search query.
+	 * @param gsf the search filter where the parameter values are taken from
+	 * @param query the generated query.
+	 */
+	private void substituteSearchCriteriaParameters(GlobalSearchFilter gsf, Query query) {
+		if (gsf.isFastSearchSelected()) {
+			query.setParameter("timestamp", createSearchIntervalParameter());
+		}
+		if (gsf.getSearchString() != null) {
+			query.setParameter("notificationText", "%" + gsf.getSearchString().toUpperCase() + "%");
+			query.setParameter("freeText", "%" + gsf.getSearchString().toUpperCase() + "%");
+			query.setParameter("freeTextExtended", "%" + gsf.getSearchString().toUpperCase() + "%");
+		}
+		if (gsf.getResponsibilityForwarding() != null && !gsf.getResponsibilityForwarding().isEmpty()) {
+			query.setParameter("responsibilityForwarding", "%" + gsf.getResponsibilityForwarding() + "%");
+		}
+		if (gsf.isBranchSelected()) {
+			query.setParameter("refBranch", gsf.getFkRefBranch());
+		}
+		if (gsf.isGridTerritorySelected()) {
+			query.setParameter("refGridTerritory", gsf.getFkRefGridTerritory());
+		}
+	}
+	
+	/**
+	 * Helper method computing the search interval. The (negative) number of days actually is taken from Globals.
+	 * 
+	 * @return the search interval.
+	 */
+	private Timestamp createSearchIntervalParameter() {
+		Calendar calendar = Calendar.getInstance();
+		calendar.set(Calendar.HOUR_OF_DAY, 0);
+		calendar.set(Calendar.MINUTE, 0);
+		calendar.set(Calendar.SECOND, 0);
+		calendar.set(Calendar.MILLISECOND, 0);
+		calendar.add(Calendar.DAY_OF_YEAR, Globals.FAST_SEARCH_NUMBER_OF_DAYS_BACK);
+		long searchDateFromInms = calendar.getTime().getTime();
+		Timestamp searchDateFrom = new Timestamp(searchDateFromInms);
+		if (LOGGER.isDebugEnabled()) {
+			LOGGER.debug("Folgenden Timestamp für das Schnellsucheintervall ermittelt: " + searchDateFrom.toString());
+		}
+		return searchDateFrom;
+	}
+	
+	/**
+	 * Helper method removing last (= wrong) comma by inserting paranthese instead.
+	 * 
+	 * @param sqlSB
+	 *            the String Builderwhere the comma is to replace.
+	 */
+	private void replaceLastCommaWithParanthese(StringBuilder sqlSB) {
+		int posFinished = sqlSB.length() - 2;
+		sqlSB.replace(posFinished, posFinished + 1, ")");
+	}
+
+	/**
+	 * Helper method to extend the Where-Clause of generateFindHistoricalNotificationsByResponsibilityQuery method list
+	 * type specific
+	 * 
+	 * Note: Past notifications are picked only if their begin date is between transferDate and one week before transfer
+	 * date.
+	 * 
+	 * @param sqlSB
+	 *            the query string builder to be extended
+	 * @param listType
+	 *            the list type
+	 */
+	private void extendFindHistoricalNotificationsByResponsibilityQueryListTypeSpecific(StringBuilder sqlSB,
+			ListType listType, Timestamp transferDate) {
+		sqlSB.append(AND_LIT).append("fk_ref_notification_status ");
+		switch (listType) {
+		case PAST:
+			sqlSB.append("IN ").append("(").append(NotificationStatus.CLOSED.id).append(", ")
+					.append(NotificationStatus.FINISHED.id).append(")").append(AND_LIT).append("begin_date <= '")
+					.append(transferDate).append("'").append(AND_LIT).append("begin_date > TIMESTAMP '")
+					.append(transferDate).append("' - INTERVAL '7 days'");
+			break;
+		case OPEN:
+			sqlSB.append("IN ").append("(").append(NotificationStatus.OPEN.id).append(", ")
+					.append(NotificationStatus.INPROGRESS.id).append(", ").append(NotificationStatus.FINISHED.id)
+					.append(")").append(AND_LIT).append("begin_date < TIMESTAMP '").append(transferDate)
+					.append("'  + INTERVAL '1 day '");
+			break;
+		case FUTURE:
+			sqlSB.append("NOT IN ").append("(").append(NotificationStatus.CLOSED.id).append(", ")
+					.append(NotificationStatus.FINISHED.id).append(")");
+			break;
+		default:
+			break;
+		}
+	}
+
+	/**
+	 * Create the where clause.
+	 *
+	 * @param nsf
+	 *            The Object obtained from view model
+	 * @param listType
+	 *            the listType (where clause creation depends from it)
+	 * @param tblResponsibilities
+	 *            the list with the {@link TblResponsibility} objects
+	 * @return he appropriate String to extend the where-clause
+	 */
+	private String extendWhereClauseApplyingSearchFilter(NotificationSearchFilter nsf, ListType listType,
+			List<TblResponsibility> tblResponsibilities) {
+		StringBuilder ret = new StringBuilder();
+
+		if (listType == ListType.PAST || listType == ListType.FUTURE) {
+			ret.append(extendWhereClauseByDates(nsf));
+		}
+		ret.append(extendWhereClauseByResponsibility(tblResponsibilities));
+		return ret.toString();
+	}
+
+	private String extendWhereClauseApplyingSearchFilterWithReminder(ReminderSearchFilter rsf,
+			List<TblResponsibility> tblResponsibilities) {
+		StringBuilder ret = new StringBuilder();
+
+		ret.append(extendWhereClauseByReminderDate(rsf));
+
+		ret.append(extendWhereClauseByResponsibility(tblResponsibilities));
+		return ret.toString();
+	}
+
+	/**
+	 * Use DateFrom and DateTo in where clause.
+	 *
+	 * @param nsf
+	 *            the notification search filter
+	 * @return the appropriate String to extend the where-clause
+	 */
+	private String extendWhereClauseByDates(NotificationSearchFilter nsf) {
+		StringBuilder ret = new StringBuilder();
+		if (nsf.getDateFrom() != null) {
+			ret.append(AND_LIT).append(tablePrefix).append("begin_date >= ?");
+			latebindParamMap.put(iCounter, nsf.getDateFrom());
+			iCounter++;
+		}
+
+		if (nsf.getDateTo() != null) {
+			ret.append(AND_LIT).append(tablePrefix).append("begin_date <= ?");
+			latebindParamMap.put(iCounter, nsf.getDateTo());
+		}
+		return ret.toString();
+	}
+
+	private String extendWhereClauseByReminderDate(ReminderSearchFilter rsf) {
+		StringBuilder ret = new StringBuilder();
+		if (rsf.getReminderDate() != null) {
+			ret.append(AND_LIT).append(tablePrefix).append("reminder_date <= ?");
+			latebindParamMap.put(iCounter, rsf.getReminderDate());
+		}
+
+		return ret.toString();
+	}
+
+	/**
+	 * Use TblResponsibilities in where clause. The foreign key constraints for branches and grid territories are used
+	 * for matching. Null value matches all branches/grid territories. In case of empty responsibilities entity only the
+	 * notifications for all branches and grid territories are returned.
+	 * 
+	 * @param tblResponsibilities
+	 *            the list with the {@link TblResponsibility} objects
+	 * @return the appropriate String to extend the where-clause
+	 */
+	private String extendWhereClauseByResponsibility(List<TblResponsibility> tblResponsibilities) {
+		StringBuilder stringBuilder = new StringBuilder(AND_LIT).append("(").append(FK_BRANCH_NULL).append(AND_LIT)
+				.append(FK_GRID_TERRITORY_NULL);
+
+		if (tblResponsibilities.isEmpty()) {
+			stringBuilder.append(")");
+			return stringBuilder.toString();
+		}
+		stringBuilder.append(OR_LIT).append("(");
+
+		int actualListPos = 0;
+		for (TblResponsibility tblResponsibility : tblResponsibilities) {
+			stringBuilder.append(appendForeignKeyNullOrMatching(tblResponsibility));
+			actualListPos++;
+			if (actualListPos < tblResponsibilities.size()) {
+				stringBuilder.append(OR_LIT);
+			}
+		}
+		stringBuilder.append(")").append(")");
+		return stringBuilder.toString();
+	}
+
+	/**
+	 * Helper Method: Extend the where clause by foreign keys null or matching.
+	 * 
+	 * Append to where clause: (fk_ref_branch IS NULL OR fk_ref_branch = x) AND (fk_grid_territory IS NULL OR
+	 * fk_ref_grid_territory = y)
+	 * 
+	 * @param tblResponsibility
+	 *            the responsibility with the foreign keys to check matching
+	 * @return the extended where clause
+	 */
+	private String appendForeignKeyNullOrMatching(TblResponsibility tblResponsibility) {
+		StringBuilder stringBuilder = new StringBuilder("(");
+		stringBuilder.append(FK_BRANCH_NULL).append(OR_LIT).append(FK_BRANCH_EQUAL)
+				.append(tblResponsibility.getRefBranch().getId()).append(")").append(AND_LIT).append("(")
+				.append(FK_GRID_TERRITORY_NULL).append(OR_LIT).append(FK_GRID_TERRITORY_EQUAL)
+				.append(tblResponsibility.getRefGridTerritory().getFkRefMaster()).append(")");
+		return stringBuilder.toString();
+	}
+
+	private String getNotificationOrder() {
+		return ORDER_LIT + tablePrefix + "fk_ref_branch ASC, fk_ref_grid_territory ASC, " + tablePrefix + "begin_date";
+	}
+}
\ No newline at end of file
diff --git a/src/main/java/org/eclipse/openk/elogbook/rest/BackendRestService.java b/src/main/java/org/eclipse/openk/elogbook/rest/BackendRestService.java
new file mode 100644
index 0000000..0154c94
--- /dev/null
+++ b/src/main/java/org/eclipse/openk/elogbook/rest/BackendRestService.java
@@ -0,0 +1,304 @@
+package org.eclipse.openk.elogbook.rest;
+
+import org.apache.http.HttpStatus;
+import org.apache.log4j.Logger;
+import org.eclipse.openk.elogbook.common.Globals;
+import org.eclipse.openk.elogbook.controller.*;
+import org.eclipse.openk.elogbook.controller.ControllerImplementations.GetCurrentResponsibilities;
+import org.eclipse.openk.elogbook.exceptions.BtbException;
+import org.eclipse.openk.elogbook.exceptions.BtbExceptionMapper;
+
+import javax.ws.rs.*;
+import javax.ws.rs.core.Context;
+import javax.ws.rs.core.Response;
+import javax.ws.rs.core.UriInfo;
+
+@Path("/beservice")
+public class BackendRestService extends BaseWebService {
+	private static final Logger logger = Logger.getLogger(BackendRestService.class.getName());
+	private static final boolean DEVELOP_MODE;
+	private static final String LET_ME_IN = "LET_ME_IN";
+
+	static {
+		// determine static VersionInfo
+		String versionString = BackendRestService.class.getPackage().getImplementationVersion().toUpperCase();
+		DEVELOP_MODE = versionString.contains("DEVELOP") || versionString.contains("SNAPSHOT");
+	}
+	@Context
+	private UriInfo uriInfo;
+
+	public BackendRestService() {
+		super(logger);
+	}
+
+
+	@GET
+	@Path("/logout")
+	@Produces("application/json")
+	public Response logout(@HeaderParam(value = Globals.KEYCLOAK_AUTH_TAG) String token) {
+
+		try (AutoCloseable ignored = perform("logout()")) { // NOSONAR
+			TokenManager.getInstance().logout(token);
+			return ResponseBuilderWrapper.INSTANCE.buildOKResponse(BtbExceptionMapper.getGeneralOKJson());
+		} catch (Exception e) {
+			return responseFromException(e);
+		}
+
+	}
+
+	@GET
+	@Path("/versionInfo/")
+	@Produces("application/json")
+	public Response getVersionInfo() {
+		return invoke(null, SecureType.NONE,
+				new ControllerImplementations.GetVersionInfo(new BackendControllerVersionInfo()));
+	}
+
+	@GET
+	@Path("/notificationStatuses/")
+	@Produces("application/json")
+	public Response getNotificationStatuses() {
+		return invoke(null, SecureType.NONE,
+				new ControllerImplementations.GetNotificationStatuses(new BackendControllerRefInfo()));
+	}
+
+	@GET
+	@Path("/branches/")
+	@Produces("application/json")
+	public Response getBranches() {
+		return invoke(null, SecureType.NONE,
+				new ControllerImplementations.GetBranches(new BackendControllerRefInfo()));
+	}
+
+	@GET
+	@Path("/gridTerritories/")
+	@Produces("application/json")
+	public Response getGridTerritories() {
+		return invoke(null, SecureType.NONE,
+				new ControllerImplementations.GetGridTerritories(new BackendControllerRefInfo()));
+	}
+
+	@GET
+	@Path("/currentResponsibilities/")
+	@Produces("application/json")
+	public Response getCurrentResponsibilities(@HeaderParam(value = Globals.KEYCLOAK_AUTH_TAG) String token) {
+		return invoke(token, SecureType.NORMAL,
+				new GetCurrentResponsibilities(new BackendControllerResponsibility()));
+	}
+
+	@GET
+	@Path("/plannedResponsibilities/")
+	@Produces("application/json")
+	public Response getPlannedResponsibilities(@HeaderParam(value = Globals.KEYCLOAK_AUTH_TAG) String token) {
+		return invoke(token, SecureType.NORMAL,
+				new ControllerImplementations.GetPlannedResponsibilities(new BackendControllerResponsibility()));
+	}
+
+	@POST
+	@Path("/planResponsibilities/")
+	@Consumes("application/json")
+	@Produces("application/json")
+	public Response postResponsibilities(String responsibilities,
+			@HeaderParam(value = Globals.KEYCLOAK_AUTH_TAG) String token) {
+		return invoke(token, SecureType.NORMAL, new ControllerImplementations.PostResponsibilities(
+				responsibilities, new BackendControllerResponsibility()));
+	}
+
+	@POST
+	@Path("/confirmResponsibilities/")
+	@Consumes("application/json")
+	@Produces("application/json")
+	public Response postResponsibilitiesConfirmation(String responsibilities,
+			@HeaderParam(value = Globals.KEYCLOAK_AUTH_TAG) String token) {
+		return invoke(token, SecureType.NORMAL,
+				new ControllerImplementations.PostResponsibilitiesConfirmation(responsibilities,
+						new BackendControllerResponsibility()));
+	}
+
+	@GET
+	@Path("/allResponsibilities/")
+	@Produces("application/json")
+	public Response getAllResponsibilities(@HeaderParam(value = Globals.KEYCLOAK_AUTH_TAG) String token) {
+		return invoke(token, SecureType.NORMAL,
+				new ControllerImplementations.GetAllResponsibilities(new BackendControllerResponsibility()));
+	}
+
+	@GET
+	@Path("/historicalResponsibilities/{transactionId}")
+	@Produces("application/json")
+	public Response getHistoricalResponsibilities(@PathParam("transactionId") String transactionId,
+			@HeaderParam(value = Globals.KEYCLOAK_AUTH_TAG) String token) {
+
+		return invoke(token, SecureType.NORMAL,
+				new ControllerImplementations.GetHistoricalResponsibilitiesByTransactionId(transactionId,
+						new BackendControllerResponsibility()));
+	}
+
+	@GET
+	@Path("/isObserver/")
+	@Produces("application/json")
+	public Response getIsObserver(@HeaderParam(value = Globals.KEYCLOAK_AUTH_TAG) String token) {
+		return invoke(token, SecureType.NORMAL,
+				new ControllerImplementations.GetIsObserver(new BackendControllerResponsibility()));
+	}
+
+	@GET
+	@Path("/users")
+	@Produces("application/json")
+	public Response getUsers(@HeaderParam(value = Globals.KEYCLOAK_AUTH_TAG) String accesstoken) {
+		return invoke(accesstoken, SecureType.NORMAL,
+				new ControllerImplementations.GetUsers(new BackendControllerUser(), accesstoken));
+	}
+
+	@POST
+	@Path("/notifications/{listType}")
+	@Produces("application/json")
+	public Response getNotifications(String notificationSearchFilter, @PathParam("listType") String listType,
+			@HeaderParam(value = Globals.KEYCLOAK_AUTH_TAG) String token) {
+		return invoke(token, SecureType.NORMAL, new ControllerImplementations.GetNotifications(listType,
+				notificationSearchFilter, new BackendControllerNotification()));
+	}
+
+	@POST
+	@Path("/searchResults/")
+	@Produces("application/json")
+	public Response getSearchResults(String globalSearchFilter,
+			@HeaderParam(value = Globals.KEYCLOAK_AUTH_TAG) String token) {
+		return invoke(token, SecureType.NORMAL, new ControllerImplementations.GetSearchResults(
+				globalSearchFilter, new BackendControllerNotification()));
+	}
+
+	@POST
+	@Path("/shiftChangeList/")
+	@Produces("application/json")
+	public Response getHistoricalShiftChangeList(String responsibilitySearchFilter,
+			@HeaderParam(value = Globals.KEYCLOAK_AUTH_TAG) String token) {
+		return invoke(token, SecureType.NORMAL,
+				new ControllerImplementations.GetHistoricalShiftChangeList(responsibilitySearchFilter,
+						new BackendControllerResponsibility()));
+	}
+
+	@GET
+	@Path("/notificationsByIncident/{incidentId}")
+	@Produces("application/json")
+	public Response getNotificationsByIncidentId(@PathParam("incidentId") String incidentId,
+			@HeaderParam(value = Globals.KEYCLOAK_AUTH_TAG) String token) {
+		return invoke(token, SecureType.NORMAL,
+				new ControllerImplementations.GetNotificationsByIncidentId(incidentId,
+						new BackendControllerNotification()));
+	}
+
+	@PUT
+	@Path("/notifications/create")
+	@Consumes("application/json")
+	@Produces("application/json")
+	public Response createNotification(String newNotification,
+			@HeaderParam(value = Globals.KEYCLOAK_AUTH_TAG) String token) {
+
+		return invoke(token, SecureType.NORMAL,
+				new ControllerImplementations.CreateNotification(newNotification, new BackendControllerNotification()));
+	}
+
+	@POST
+	@Path("/notifications/update")
+	@Consumes("application/json")
+	@Produces("application/json")
+	public Response updateNotification(String aNotification,
+			@HeaderParam(value = Globals.KEYCLOAK_AUTH_TAG) String token) {
+
+		return invoke(token, SecureType.NORMAL,
+				new ControllerImplementations.CreateNotification(aNotification, new BackendControllerNotification()));
+	}
+
+	@GET
+	@Path("/notification/{id}")
+	@Produces("application/json")
+	public Response getNoticifationById(@PathParam("id") String id,
+			@HeaderParam(value = Globals.KEYCLOAK_AUTH_TAG) String token) {
+
+		return invoke(token, SecureType.NORMAL,
+				new ControllerImplementations.GetNotificationById(id, new BackendControllerNotification()));
+	}
+
+	@GET
+	@Path("/notifications/active")
+	@Produces("application/json")
+	public Response getActiveNotifications(@HeaderParam(value = Globals.KEYCLOAK_AUTH_TAG) String token) {
+		return invoke(token, SecureType.NORMAL,
+				new ControllerImplementations.GetActiveNotifications(new BackendControllerNotification()));
+	}
+
+	@GET
+	@Path("/getImportFiles")
+	@Produces("application/json")
+	public Response getImportFiles(@HeaderParam(value = Globals.KEYCLOAK_AUTH_TAG) String sessionID) {
+		return invoke(sessionID, SecureType.NORMAL,
+				new ControllerImplementations.GetImportFiles(new BackendControllerNotificationFile()));
+	}
+
+	@GET
+	@Path("/importFile")
+	@Produces("application/json")
+	public Response getImportFile(@HeaderParam(value = Globals.KEYCLOAK_AUTH_TAG) String sessionID) {
+		return invoke(sessionID, SecureType.NORMAL,
+				new ControllerImplementations.ImportFile(new BackendControllerNotificationFile()));
+	}
+
+	@DELETE
+	@Path("/deleteImportedFiles/{fileName}")
+	@Produces("application/json")
+	public Response deleteImportedFiles(@PathParam("fileName") String fileName,
+										@HeaderParam(value = Globals.KEYCLOAK_AUTH_TAG) String sessionID) {
+		return invoke(sessionID, SecureType.NORMAL,
+				new ControllerImplementations.DeleteImportedFiles(fileName, new BackendControllerNotificationFile()));
+	}	
+
+	@POST
+	@Path("/currentReminders")
+	@Produces("application/json")
+	public Response getCurrentReminders(String reminderSearchFilter,
+			@HeaderParam(value = Globals.KEYCLOAK_AUTH_TAG) String token) {
+		return invoke(token, SecureType.NORMAL, new ControllerImplementations.GetCurrentReminders(
+				reminderSearchFilter, new BackendControllerNotification()));
+	}
+
+	@GET
+	@Path("/assignedUserSuggestions")
+	@Produces("application/json")
+	public Response getAssignedUserSuggestions(@HeaderParam(value = Globals.KEYCLOAK_AUTH_TAG) String token) {
+		return invoke(token, SecureType.NORMAL,
+				new ControllerImplementations.GetAssignedUserSuggestions(new BackendControllerUser()));
+	}
+
+	private boolean isBackdoor(String token) {
+		// backdoor is only available when the version(POM) contains "DEVELOP" or "SNAPSHOT"
+		return DEVELOP_MODE && LET_ME_IN.equals(token);
+
+	}
+  
+	@Override
+	protected void assertAndRefreshToken(String token, SecureType secureType) throws BtbException {
+		if (isBackdoor(token)) {
+			return;
+		}
+		TokenManager.getInstance().checkAut(token);
+		TokenManager.getInstance().checkAutLevel(token, secureType);
+	}
+  
+
+	private Response responseFromException(Exception e) {
+		int errcode;
+		String retJson;
+
+		if (e instanceof BtbException) {
+			logger.error("Caught BackendException", e);
+			errcode = ((BtbException) e).getHttpStatus();
+			retJson = BtbExceptionMapper.toJson((BtbException) e);
+			return Response.status(errcode).entity(retJson).build();
+		} else {
+			logger.error("Unexpected exception", e);
+			return Response.status(HttpStatus.SC_INTERNAL_SERVER_ERROR)
+					.entity(BtbExceptionMapper.getGeneralErrorJson()).build();
+		}
+	}
+}
diff --git a/src/main/java/org/eclipse/openk/elogbook/rest/RestServiceConfiguration.java b/src/main/java/org/eclipse/openk/elogbook/rest/RestServiceConfiguration.java
new file mode 100644
index 0000000..a50f642
--- /dev/null
+++ b/src/main/java/org/eclipse/openk/elogbook/rest/RestServiceConfiguration.java
@@ -0,0 +1,18 @@
+package org.eclipse.openk.elogbook.rest;
+
+
+import java.util.HashSet;
+import java.util.Set;
+
+public class RestServiceConfiguration extends javax.ws.rs.core.Application {
+    public RestServiceConfiguration() {
+        // Standard Contstructor needed
+    }
+
+    @Override
+    public Set<Class<?>> getClasses() {
+        Set<Class<?>> restServicesClasses = new HashSet<>();
+        restServicesClasses.add(BackendRestService.class);
+        return restServicesClasses;
+    }
+}
diff --git a/src/main/java/org/eclipse/openk/elogbook/viewmodel/ErrorReturn.java b/src/main/java/org/eclipse/openk/elogbook/viewmodel/ErrorReturn.java
new file mode 100644
index 0000000..6cad738
--- /dev/null
+++ b/src/main/java/org/eclipse/openk/elogbook/viewmodel/ErrorReturn.java
@@ -0,0 +1,23 @@
+package org.eclipse.openk.elogbook.viewmodel;
+
+import java.io.Serializable;
+
+public class ErrorReturn implements Serializable {
+    private static final long serialVersionUID = -1841112315318005840L;
+
+    private String errorText;
+    private int errorCode;
+
+    public String getErrorText() {
+        return errorText;
+    }
+    public void setErrorText(String errorText) {
+        this.errorText = errorText;
+    }
+    public int getErrorCode() {
+        return errorCode;
+    }
+    public void setErrorCode(int errorCode) {
+        this.errorCode = errorCode;
+    }
+}
diff --git a/src/main/java/org/eclipse/openk/elogbook/viewmodel/GeneralReturnItem.java b/src/main/java/org/eclipse/openk/elogbook/viewmodel/GeneralReturnItem.java
new file mode 100644
index 0000000..d629ad6
--- /dev/null
+++ b/src/main/java/org/eclipse/openk/elogbook/viewmodel/GeneralReturnItem.java
@@ -0,0 +1,17 @@
+package org.eclipse.openk.elogbook.viewmodel;
+
+
+public class GeneralReturnItem {
+    private String ret;
+
+    public GeneralReturnItem( String ret ) {
+        this.ret = ret;
+}
+    public String getRet() {
+        return ret;
+    }
+
+    public void setRet(String ret) {
+        this.ret = ret;
+    }
+}
diff --git a/src/main/java/org/eclipse/openk/elogbook/viewmodel/GlobalSearchFilter.java b/src/main/java/org/eclipse/openk/elogbook/viewmodel/GlobalSearchFilter.java
new file mode 100644
index 0000000..9867d9f
--- /dev/null
+++ b/src/main/java/org/eclipse/openk/elogbook/viewmodel/GlobalSearchFilter.java
@@ -0,0 +1,164 @@
+package org.eclipse.openk.elogbook.viewmodel;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.eclipse.openk.elogbook.common.NotificationStatus;
+
+/**
+ * The global search criteria model.
+ */
+
+public class GlobalSearchFilter {
+	/** The string to search for. */
+	private String searchString;
+
+	/** The responsibility forwarding. */
+	private String responsibilityForwarding;
+
+	/** indicate whether to find notifications with status open */
+	private Boolean statusOpenSelection;
+
+	/** indicate whether to find notifications with status in work */
+	private Boolean statusInWorkSelection;
+
+	/** indicate whether to find notifications with status done */
+	private Boolean statusDoneSelection;
+
+	/** indicate whether to find notifications with status closed */
+	private Boolean statusClosedSelection;
+
+	/** key referring branch */
+	private Integer fkRefBranch;
+
+	/** key referring grid territory */
+	private Integer fkRefGridTerritory;
+
+	/** indicating if fast/classic search */
+	private Boolean fastSearchSelected;
+
+	/**************************************************************************
+	 * Public methods
+	 **************************************************************************/
+
+	/**
+	 * Obtain a list of the selected status ids.
+	 * 
+	 * @return an array list of Integers representing the selected status ids.
+	 */
+	public List<Integer> getSelectedStatusMappedToIds() {
+		List<Integer> selectedStati = new ArrayList<>();
+		if (isStatusOpenSelection()) {
+			selectedStati.add(NotificationStatus.OPEN.id);
+		}
+		if (isStatusInWorkSelection()) {
+			selectedStati.add(NotificationStatus.INPROGRESS.id);
+		}
+		if (isStatusDoneSelection()) {
+			selectedStati.add(NotificationStatus.FINISHED.id);
+		}
+		if (isStatusClosedSelection()) {
+			selectedStati.add(NotificationStatus.CLOSED.id);
+		}
+		return selectedStati;
+	}
+
+	public boolean isBranchSelected() {
+		return fkRefBranch != null && fkRefBranch > 0;
+	}
+
+	public boolean isGridTerritorySelected() {
+		return fkRefGridTerritory != null && fkRefGridTerritory > 0;
+	}
+
+	/**************************************************************************
+	 * Getters/Setters
+	 **************************************************************************/
+
+	public String getSearchString() {
+		return searchString;
+	}
+
+	public void setSearchString(String searchString) {
+		this.searchString = searchString;
+	}
+
+	public String getResponsibilityForwarding() {
+		return responsibilityForwarding;
+	}
+
+	public void setResponsibilityForwarding(String responsibilityForwarding) {
+		this.responsibilityForwarding = responsibilityForwarding;
+	}
+
+	public Boolean isStatusOpenSelection() {
+		if (statusOpenSelection == null) {
+			return false;
+		}
+		return statusOpenSelection;
+	}
+
+	public void setStatusOpenSelection(Boolean statusOpenSelection) {
+		this.statusOpenSelection = statusOpenSelection;
+	}
+
+	public Boolean isStatusInWorkSelection() {
+		if (statusInWorkSelection == null) {
+			return false;
+		}
+		return statusInWorkSelection;
+	}
+
+	public void setStatusInWorkSelection(Boolean statusInWorkSelection) {
+		this.statusInWorkSelection = statusInWorkSelection;
+	}
+
+	public Boolean isStatusDoneSelection() {
+		if (statusDoneSelection == null) {
+			return false;
+		}
+		return statusDoneSelection;
+	}
+
+	public void setStatusDoneSelection(Boolean statusDoneSelection) {
+		this.statusDoneSelection = statusDoneSelection;
+	}
+
+	public Boolean isStatusClosedSelection() {
+		if (statusClosedSelection == null) {
+			return false;
+		}
+		return statusClosedSelection;
+	}
+
+	public void setStatusClosedSelection(Boolean statusClosedSelection) {
+		this.statusClosedSelection = statusClosedSelection;
+	}
+
+	public Integer getFkRefBranch() {
+		return fkRefBranch;
+	}
+
+	public void setFkRefBranch(Integer fkRefBranch) {
+		this.fkRefBranch = fkRefBranch;
+	}
+
+	public Integer getFkRefGridTerritory() {
+		return fkRefGridTerritory;
+	}
+
+	public void setFkRefGridTerritory(Integer fkRefGridTerritory) {
+		this.fkRefGridTerritory = fkRefGridTerritory;
+	}
+
+	public Boolean isFastSearchSelected() {
+		if (fastSearchSelected == null) {
+			return false;
+		}
+		return fastSearchSelected;
+	}
+
+	public void setFastSearchSelected(Boolean fastSearchSelected) {
+		this.fastSearchSelected = fastSearchSelected;
+	}
+}
diff --git a/src/main/java/org/eclipse/openk/elogbook/viewmodel/HistoricalResponsibility.java b/src/main/java/org/eclipse/openk/elogbook/viewmodel/HistoricalResponsibility.java
new file mode 100644
index 0000000..78a4cce
--- /dev/null
+++ b/src/main/java/org/eclipse/openk/elogbook/viewmodel/HistoricalResponsibility.java
@@ -0,0 +1,77 @@
+package org.eclipse.openk.elogbook.viewmodel;
+
+
+import org.eclipse.openk.elogbook.persistence.model.RefBranch;
+import org.eclipse.openk.elogbook.persistence.model.RefGridTerritory;
+
+import java.util.Date;
+
+public class HistoricalResponsibility {
+    private Integer id;
+    private String responsibleUser;
+    private String formerResponsibleUser;
+    private Date transferDate;
+    private Integer transactionId;
+    private Date createDate;
+    private String createUser;
+    private Date modDate;
+    private String modUser;
+    private RefGridTerritory refGridTerritory;
+    private RefBranch refBranch;
+
+    public Integer getId() {
+        return id;
+    }
+
+    public void setId(Integer id) {
+        this.id = id;
+    }
+
+    public String getResponsibleUser() {
+        return responsibleUser;
+    }
+
+    public void setResponsibleUser(String responsibleUser) {
+        this.responsibleUser = responsibleUser;
+    }
+
+    public String getFormerResponsibleUser() {
+        return formerResponsibleUser;
+    }
+
+    public void setFormerResponsibleUser(String newResponsibleUser) {
+        this.formerResponsibleUser = newResponsibleUser;
+    }
+
+    public Date getTransferDate() { return transferDate; }
+
+    public void setTransferDate(Date transferDate) { this.transferDate = transferDate; }
+
+    public Integer getTransactionId() { return transactionId; }
+
+    public void setTransactionId(Integer transactionId) { this.transactionId = transactionId; }
+
+    public Date getCreateDate() { return createDate; }
+
+    public void setCreateDate(Date createDate) { this.createDate = createDate; }
+
+    public String getCreateUser() { return createUser; }
+
+    public void setCreateUser(String createUser) { this.createUser = createUser; }
+
+    public Date getModDate() { return modDate; }
+
+    public void setModDate(Date modDate) { this.modDate = modDate; }
+
+    public String getModUser() { return modUser; }
+
+    public void setModUser(String modUser) { this.modUser = modUser; }
+
+    public RefGridTerritory getRefGridTerritory() { return refGridTerritory; }
+
+    public void setRefGridTerritory(RefGridTerritory refGridTerritory) { this.refGridTerritory = refGridTerritory; }
+
+    public RefBranch getRefBranch() { return refBranch; }
+
+    public void setRefBranch(RefBranch refBranch) { this.refBranch = refBranch; }
+}
\ No newline at end of file
diff --git a/src/main/java/org/eclipse/openk/elogbook/viewmodel/HistoricalShiftChanges.java b/src/main/java/org/eclipse/openk/elogbook/viewmodel/HistoricalShiftChanges.java
new file mode 100644
index 0000000..239d358
--- /dev/null
+++ b/src/main/java/org/eclipse/openk/elogbook/viewmodel/HistoricalShiftChanges.java
@@ -0,0 +1,42 @@
+package org.eclipse.openk.elogbook.viewmodel;
+
+import java.util.Date;
+import java.util.List;
+
+/** View Model documenting all shift changes over a specified period. */
+public class HistoricalShiftChanges {
+
+	/** begin of the specified period */
+	private Date transferDateFrom;
+
+	/** end of the specified period */
+	private Date transferDateTo;
+
+	/** Collection of historical shift change documentation data. */
+	private List<HistoricalResponsibility> historicalResponsibilities;
+
+	public Date getTransferDateFrom() {
+		return transferDateFrom;
+	}
+
+	public void setTransferDateFrom(Date startDate) {
+		this.transferDateFrom = startDate;
+	}
+
+	public Date getTransferDateTo() {
+		return transferDateTo;
+	}
+
+	public void setTransferDateTo(Date endDate) {
+		this.transferDateTo = endDate;
+	}
+
+	public List<HistoricalResponsibility> getHistoricalResponsibilities() {
+		return historicalResponsibilities;
+	}
+
+	public void setHistoricalResponsibilities(List<HistoricalResponsibility> historicalResponsibilities) {
+		this.historicalResponsibilities = historicalResponsibilities;
+	}
+
+}
diff --git a/src/main/java/org/eclipse/openk/elogbook/viewmodel/ListTypeMapper.java b/src/main/java/org/eclipse/openk/elogbook/viewmodel/ListTypeMapper.java
new file mode 100644
index 0000000..3eda31e
--- /dev/null
+++ b/src/main/java/org/eclipse/openk/elogbook/viewmodel/ListTypeMapper.java
@@ -0,0 +1,32 @@
+package org.eclipse.openk.elogbook.viewmodel;
+
+import java.util.HashMap;
+import java.util.Map;
+import org.eclipse.openk.elogbook.exceptions.BtbBadRequest;
+import org.eclipse.openk.elogbook.exceptions.BtbException;
+
+public class ListTypeMapper {
+	private static Map<String, Notification.ListType> listTypeMap = new HashMap<>();
+
+	static {
+		listTypeMap.put("OPEN", Notification.ListType.OPEN);
+		listTypeMap.put("ALL", Notification.ListType.ALL);
+		listTypeMap.put("PAST", Notification.ListType.PAST);
+		listTypeMap.put("CURRENT", Notification.ListType.CURRENT);
+		listTypeMap.put("FUTURE", Notification.ListType.FUTURE);
+	}
+
+	private ListTypeMapper() {
+	}
+
+	public static synchronized Notification.ListType listTypeFromString(String listType)
+			throws BtbException {
+		String noti = (listType != null) ? listType.toUpperCase() : "";
+
+		if (listTypeMap.containsKey(noti)) {
+			return listTypeMap.get(noti);
+		}
+
+		throw new BtbBadRequest("Unknown parameter value: " + listType);
+	}
+}
diff --git a/src/main/java/org/eclipse/openk/elogbook/viewmodel/LoginCredentials.java b/src/main/java/org/eclipse/openk/elogbook/viewmodel/LoginCredentials.java
new file mode 100644
index 0000000..a8170c0
--- /dev/null
+++ b/src/main/java/org/eclipse/openk/elogbook/viewmodel/LoginCredentials.java
@@ -0,0 +1,22 @@
+package org.eclipse.openk.elogbook.viewmodel;
+
+public class LoginCredentials {
+    private String userName;
+    private String password;
+
+    public String getUserName() {
+        return userName;
+    }
+
+    public void setUserName(String userName) {
+        this.userName = userName;
+    }
+
+    public String getPassword() {
+        return password;
+    }
+
+    public void setPassword(String password) {
+        this.password = password;
+    }
+}
diff --git a/src/main/java/org/eclipse/openk/elogbook/viewmodel/Notification.java b/src/main/java/org/eclipse/openk/elogbook/viewmodel/Notification.java
new file mode 100644
index 0000000..a6a6a43
--- /dev/null
+++ b/src/main/java/org/eclipse/openk/elogbook/viewmodel/Notification.java
@@ -0,0 +1,229 @@
+package org.eclipse.openk.elogbook.viewmodel;
+
+import java.util.Date;
+import java.util.List;
+
+public class Notification {
+
+    public enum ListType { ALL, PAST, CURRENT, OPEN, FUTURE }
+
+    private Integer id;
+    private Integer incidentId;
+    private Integer version;
+    private boolean selected;
+    private String status;
+    private Date beginDate;
+    private String notificationText;
+    private String freeText;
+    private String freeTextExtended;
+    private String responsibilityForwarding;
+    private String responsibilityControlPoint;
+    private Date reminderDate;
+    private Date futureDate;
+    private Date expectedFinishDate;
+    private Date finishedDate;
+    private String createUser;
+    private Date createDate;
+    private Date modDate;
+    private String modUser;
+
+    private Integer fkRefBranch;
+    private Integer fkRefNotificationStatus;
+    private Integer fkRefGridTerritory;
+    
+    private Boolean adminFlag;
+
+    private List<Notification> notificationList;
+
+    public Integer getId() {
+        return id;
+    }
+
+    public void setId(Integer id) {
+        this.id = id;
+    }
+
+    public boolean isSelected() {
+        return selected;
+    }
+
+    public void setSelected(boolean selected) {
+        this.selected = selected;
+    }
+
+    public String getStatus() {
+        return status;
+    }
+
+    public void setStatus(String status) {
+        this.status = status;
+    }
+
+    public Date getBeginDate() {
+		return beginDate;
+	}
+
+	public void setBeginDate(Date beginDate) {
+		this.beginDate = beginDate;
+	}
+
+	public String getNotificationText() {
+        return notificationText;
+    }
+
+    public void setNotificationText(String notificationText) {
+        this.notificationText = notificationText;
+    }
+
+    public String getFreeText() {
+        return freeText;
+    }
+
+    public void setFreeText(String freeText) {
+        this.freeText = freeText;
+    }
+
+    public String getFreeTextExtended() {
+        return freeTextExtended;
+    }
+
+    public void setFreeTextExtended(String freeTextExtended) {
+        this.freeTextExtended = freeTextExtended;
+    }
+
+    public String getResponsibilityForwarding() {
+        return responsibilityForwarding;
+    }
+
+    public void setResponsibilityForwarding(String responsibilityForwarding) {
+        this.responsibilityForwarding = responsibilityForwarding;
+    }
+
+    public String getResponsibilityControlPoint() {
+        return responsibilityControlPoint;
+    }
+
+    public void setResponsibilityControlPoint(String responsibilityControlPoint) {
+        this.responsibilityControlPoint = responsibilityControlPoint;
+    }
+
+    public Date getReminderDate() {
+        return reminderDate;
+    }
+
+    public void setReminderDate(Date reminderDate) {
+        this.reminderDate = reminderDate;
+    }
+
+    public Date getFutureDate() {
+        return futureDate;
+    }
+
+    public void setFutureDate(Date futureDate) {
+        this.futureDate = futureDate;
+    }
+
+    public Date getCreateDate() {
+        return createDate;
+    }
+
+    public void setCreateDate(Date createDate) {
+        this.createDate = createDate;
+    }
+
+    public Date getExpectedFinishDate() {
+        return expectedFinishDate;
+    }
+
+    public void setExpectedFinishDate(Date expectedFinishDate) {
+        this.expectedFinishDate = expectedFinishDate;
+    }
+
+    public Date getFinishedDate() {
+        return finishedDate;
+    }
+
+    public void setFinishedDate(Date finishedDate) {
+        this.finishedDate = finishedDate;
+    }
+
+    public String getCreateUser() {
+        return createUser;
+    }
+
+    public void setCreateUser(String creator) {
+        this.createUser = creator;
+    }
+
+    public Integer getIncidentId() {
+        return incidentId;
+    }
+
+    public void setIncidentId(Integer incidentId) {
+        this.incidentId = incidentId;
+    }
+
+    public Date getModDate() {
+        return modDate;
+    }
+
+    public void setModDate(Date modDate) {
+        this.modDate = modDate;
+    }
+
+    public String getModUser() {
+        return modUser;
+    }
+
+    public void setModUser(String modUser) {
+        this.modUser = modUser;
+    }
+
+    public Integer getVersion() {
+        return version;
+    }
+
+    public void setVersion(Integer version) {
+        this.version = version;
+    }
+
+    public Integer getFkRefBranch() {
+        return fkRefBranch;
+    }
+
+    public void setFkRefBranch(Integer fkRefBranch) {
+        this.fkRefBranch = fkRefBranch;
+    }
+
+    public Integer getFkRefNotificationStatus() {
+        return fkRefNotificationStatus;
+    }
+
+    public void setFkRefNotificationStatus(Integer fkRefNotificationStatus) {
+        this.fkRefNotificationStatus = fkRefNotificationStatus;
+    }
+
+	public Integer getFkRefGridTerritory() {
+		return fkRefGridTerritory;
+	}
+
+	public void setFkRefGridTerritory(Integer fkRefGridTerritory) {
+		this.fkRefGridTerritory = fkRefGridTerritory;
+	}
+
+	public Boolean isAdminFlag() {
+		return adminFlag;
+	}
+
+	public void getAdminFlag(Boolean adminFlag) {
+		this.adminFlag = adminFlag;
+	}
+
+    public List<Notification> getNotificationList() {
+        return notificationList;
+    }
+
+    public void setNotificationList(List<Notification> notificationList) {
+        this.notificationList = notificationList;
+    }
+}
diff --git a/src/main/java/org/eclipse/openk/elogbook/viewmodel/NotificationFile.java b/src/main/java/org/eclipse/openk/elogbook/viewmodel/NotificationFile.java
new file mode 100644
index 0000000..b5d1d8c
--- /dev/null
+++ b/src/main/java/org/eclipse/openk/elogbook/viewmodel/NotificationFile.java
@@ -0,0 +1,84 @@
+package org.eclipse.openk.elogbook.viewmodel;
+
+public class NotificationFile {
+
+    private String fileName;
+    private String creationDate;
+    private String creator;
+    private String type;
+    private Long size;
+    private String branchName;
+    private String gridTerritoryName;
+    private String notificationText;
+
+
+    public String getFileName() {
+        return fileName;
+    }
+
+    public void setFileName(String fileName) {
+        this.fileName = fileName;
+    }
+
+    public String getCreationDate() {
+        return creationDate;
+    }
+
+    public void setCreationDate(String creationdate) {
+        this.creationDate = creationdate;
+    }
+
+    public String getCreator() {
+        return creator;
+    }
+
+    public void setCreator(String creator) {
+        this.creator = creator;
+    }
+
+    public String getType() {
+        return type;
+    }
+
+    public void setType(String type) {
+        this.type = type;
+    }
+
+    public Long getSize() {
+        return size;
+    }
+
+    public void setSize(Long size) {
+        this.size = size;
+    }
+
+    public String getBranchName() {
+        return branchName;
+    }
+
+    public void setBranchName(String branchName) {
+        this.branchName = branchName;
+    }
+
+    public String getGridTerritoryName() {
+        return gridTerritoryName;
+    }
+
+    public void setGridTerritoryName(String gridTerritoryName) {
+        this.gridTerritoryName = gridTerritoryName;
+    }
+
+    public String getNotificationText() {
+        return notificationText;
+    }
+
+    public void setNotificationText(String notificationText) {
+        this.notificationText = notificationText;
+    }
+
+
+
+
+
+
+}
diff --git a/src/main/java/org/eclipse/openk/elogbook/viewmodel/NotificationSearchFilter.java b/src/main/java/org/eclipse/openk/elogbook/viewmodel/NotificationSearchFilter.java
new file mode 100644
index 0000000..d0b5a97
--- /dev/null
+++ b/src/main/java/org/eclipse/openk/elogbook/viewmodel/NotificationSearchFilter.java
@@ -0,0 +1,81 @@
+package org.eclipse.openk.elogbook.viewmodel;
+
+import java.util.Date;
+import java.util.List;
+
+/**
+ * Define criteria whether to restrict the notifications to be delivered, e. g.
+ * by time, responsibility...
+ *
+ */
+public class NotificationSearchFilter {
+
+	/** Filtering notifications by date (only deliver notifications starting after dateFrom). */
+	private Date dateFrom;
+
+	/** Filtering notifications by date (only deliver notifications until dateTo). */
+	private Date dateTo;
+
+	private Date reminderDate;
+
+	/** Filter notifications depending on responsibilities. Empty list, if no responsibility */
+	private List<Integer> responsibilityFilterList;
+	
+	/** Flag indicating historical notifications request. */
+	private Boolean historicalFlag;
+	
+	/** The shift change transaction id in historical responsibilities table. */
+	private Integer shiftChangeTransactionId;
+	
+	/**************************************************************************
+	 * Getters/Setters
+	 **************************************************************************/
+
+	public Date getDateFrom() {
+		return dateFrom;
+	}
+
+	public void setDateFrom(Date dateFrom) {
+		this.dateFrom = dateFrom;
+	}
+
+	public Date getDateTo() {
+		return dateTo;
+	}
+
+	public void setDateTo(Date dateTo) {
+		this.dateTo = dateTo;
+	}
+
+	public List<Integer> getResponsibilityFilterList() {
+		return responsibilityFilterList;
+	}
+
+	public void setResponsibilityFilterList(List<Integer> responsibilityFilterList) {
+		this.responsibilityFilterList = responsibilityFilterList;
+	}
+
+	public Date getReminderDate() { return reminderDate; }
+
+	public void setReminderDate(Date reminderDate) { this.reminderDate = reminderDate; }
+	
+	public Boolean isHistoricalFlag() {
+		if (historicalFlag == null) {
+			return Boolean.FALSE;
+		}
+		return historicalFlag;
+	}
+
+	public void setHistoricalFlag(Boolean historicalFlag) {
+		this.historicalFlag = historicalFlag;
+	}
+
+	public Integer getShiftChangeTransactionId() {
+		return shiftChangeTransactionId;
+	}
+
+	public void setShiftChangeTransactionId(Integer shiftChangeTransactionId) {
+		this.shiftChangeTransactionId = shiftChangeTransactionId;
+	}
+
+}
diff --git a/src/main/java/org/eclipse/openk/elogbook/viewmodel/ReminderSearchFilter.java b/src/main/java/org/eclipse/openk/elogbook/viewmodel/ReminderSearchFilter.java
new file mode 100644
index 0000000..4f63a6f
--- /dev/null
+++ b/src/main/java/org/eclipse/openk/elogbook/viewmodel/ReminderSearchFilter.java
@@ -0,0 +1,37 @@
+package org.eclipse.openk.elogbook.viewmodel;
+
+import java.util.Date;
+import java.util.List;
+
+/**
+ * Define criteria whether to restrict the notifications to be delivered, e. g.
+ * by time, responsibility...
+ *
+ */
+public class ReminderSearchFilter {
+
+	private Date reminderDate;
+
+	/** Filter notifications depending on responsibilities. Empty list, if no responsibility */
+	private List<Integer> responsibilityFilterList;
+
+	/**************************************************************************
+	 * Getters/Setters
+	 **************************************************************************/
+
+	public Date getReminderDate() {
+		return reminderDate;
+	}
+
+	public void setReminderDate(Date reminderDate) {
+		this.reminderDate = reminderDate;
+	}
+
+	public List<Integer> getResponsibilityFilterList() {
+		return responsibilityFilterList;
+	}
+
+	public void setResponsibilityFilterList(List<Integer> responsibilityFilterList) {
+		this.responsibilityFilterList = responsibilityFilterList;
+	}
+}
diff --git a/src/main/java/org/eclipse/openk/elogbook/viewmodel/Responsibility.java b/src/main/java/org/eclipse/openk/elogbook/viewmodel/Responsibility.java
new file mode 100644
index 0000000..c22f04a
--- /dev/null
+++ b/src/main/java/org/eclipse/openk/elogbook/viewmodel/Responsibility.java
@@ -0,0 +1,48 @@
+package org.eclipse.openk.elogbook.viewmodel;
+
+
+public class Responsibility {
+    private Integer id;
+    private String responsibleUser;
+    private String newResponsibleUser;
+    private String branchName;
+    private Boolean isActive;
+
+    public Integer getId() {
+        return id;
+    }
+
+    public void setId(Integer id) {
+        this.id = id;
+    }
+
+    public String getResponsibleUser() { return responsibleUser; }
+
+    public void setResponsibleUser(String responsibleUser) {
+        this.responsibleUser = responsibleUser;
+    }
+
+    public String getNewResponsibleUser() {
+        return newResponsibleUser;
+    }
+
+    public void setNewResponsibleUser(String newResponsibleUser) {
+        this.newResponsibleUser = newResponsibleUser;
+    }
+
+    public String getBranchName() {
+    return branchName;
+  }
+
+    public void setBranchName(String branchName) {
+    this.branchName = branchName;
+  }
+
+    public Boolean isActive() {
+        return isActive;
+    }
+
+    public void setIsActive(Boolean active) {
+        isActive = active;
+    }
+}
\ No newline at end of file
diff --git a/src/main/java/org/eclipse/openk/elogbook/viewmodel/ResponsibilitySearchFilter.java b/src/main/java/org/eclipse/openk/elogbook/viewmodel/ResponsibilitySearchFilter.java
new file mode 100644
index 0000000..c13ff18
--- /dev/null
+++ b/src/main/java/org/eclipse/openk/elogbook/viewmodel/ResponsibilitySearchFilter.java
@@ -0,0 +1,44 @@
+package org.eclipse.openk.elogbook.viewmodel;
+
+import java.util.Date;
+
+/**
+ * ResponsibilitySearchFilter - Define criteria to limit the responsibilities
+ * from the past.
+ */
+public class ResponsibilitySearchFilter {
+
+	/**
+	 * Filtering historical responsibilities by period (only deliver
+	 * notifications starting at or after transferDateFrom).
+	 */
+	private Date transferDateFrom;
+
+	/**
+	 * Filtering historical responsibilities by period (only deliver
+	 * notifications ending before or at transferDateTo).
+	 */
+	private Date transferDateTo;
+	
+	
+	/** *************************************************************************
+	 * Getters/Setters
+	 ****************************************************************************/
+
+	public Date getTransferDateFrom() {
+		return transferDateFrom;
+	}
+
+	public void setTransferDateFrom(Date dateFrom) {
+		this.transferDateFrom = dateFrom;
+	}
+
+	public Date getTransferDateTo() {
+		return transferDateTo;
+	}
+
+	public void setTransferDateTo(Date dateTo) {
+		this.transferDateTo = dateTo;
+	}
+
+}
diff --git a/src/main/java/org/eclipse/openk/elogbook/viewmodel/TerritoryResponsibility.java b/src/main/java/org/eclipse/openk/elogbook/viewmodel/TerritoryResponsibility.java
new file mode 100644
index 0000000..54343c5
--- /dev/null
+++ b/src/main/java/org/eclipse/openk/elogbook/viewmodel/TerritoryResponsibility.java
@@ -0,0 +1,25 @@
+package org.eclipse.openk.elogbook.viewmodel;
+
+import java.util.List;
+
+public class TerritoryResponsibility {
+
+  private String gridTerritoryDescription;
+  private List<Responsibility> responsibilityList;
+
+  public String getGridTerritoryDescription() {
+    return gridTerritoryDescription;
+  }
+
+  public void setGridTerritoryDescription(String gridTerritoryDescription) {
+    this.gridTerritoryDescription = gridTerritoryDescription;
+  }
+
+  public List<Responsibility> getResponsibilityList() {
+    return responsibilityList;
+  }
+
+  public void setResponsibilityList(List<Responsibility> responsibilityList) {
+    this.responsibilityList = responsibilityList;
+  }
+}
diff --git a/src/main/java/org/eclipse/openk/elogbook/viewmodel/UserAuthentication.java b/src/main/java/org/eclipse/openk/elogbook/viewmodel/UserAuthentication.java
new file mode 100644
index 0000000..f81dfe3
--- /dev/null
+++ b/src/main/java/org/eclipse/openk/elogbook/viewmodel/UserAuthentication.java
@@ -0,0 +1,58 @@
+package org.eclipse.openk.elogbook.viewmodel;
+
+public class UserAuthentication {
+
+    private String id;
+    private boolean selected;
+    private String username;
+    private String password;
+    private String name;
+    private boolean specialUser;
+
+    public String getId() {
+        return id;
+    }
+
+    public void setId(String id) {
+        this.id = id;
+    }
+
+    public boolean isSelected() {
+        return selected;
+    }
+
+    public void setSelected(boolean selected) {
+        this.selected = selected;
+    }
+
+    public String getPassword() {
+        return password;
+    }
+
+    public void setPassword(String password) {
+        this.password = password;
+    }
+
+    public String getName() {
+        return name;
+    }
+
+    public void setName(String name) {
+        this.name = name;
+    }
+
+    public boolean isSpecialUser() {
+        return specialUser;
+    }
+
+    public void setSpecialUser(boolean specialUser) {
+        this.specialUser = specialUser;
+    }
+
+    public String getUsername() {
+        return username;
+    }
+    public void setUsername(String username) {
+        this.username = username;
+    }
+}
diff --git a/src/main/java/org/eclipse/openk/elogbook/viewmodel/VersionInfo.java b/src/main/java/org/eclipse/openk/elogbook/viewmodel/VersionInfo.java
new file mode 100644
index 0000000..6edae99
--- /dev/null
+++ b/src/main/java/org/eclipse/openk/elogbook/viewmodel/VersionInfo.java
@@ -0,0 +1,23 @@
+package org.eclipse.openk.elogbook.viewmodel;
+
+public class VersionInfo {
+    private String dbVersion;
+    private String backendVersion;
+
+    public String getBackendVersion() {
+        return backendVersion;
+    }
+
+    public void setBackendVersion(String backendVersion) {
+        this.backendVersion = backendVersion;
+    }
+
+    public String getDbVersion() {
+        return dbVersion;
+    }
+
+    public void setDbVersion(String dbVersion) {
+        this.dbVersion = dbVersion;
+    }
+
+}
diff --git a/src/main/resources/META-INF/persistence.xml b/src/main/resources/META-INF/persistence.xml
new file mode 100644
index 0000000..f6a4e42
--- /dev/null
+++ b/src/main/resources/META-INF/persistence.xml
@@ -0,0 +1,22 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<persistence version="2.1" xmlns="http://xmlns.jcp.org/xml/ns/persistence"
+             xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+             xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/persistence http://xmlns.jcp.org/xml/ns/persistence/persistence_2_1.xsd">
+    <persistence-unit name="betriebstagebuch">
+        <provider>org.eclipse.persistence.jpa.PersistenceProvider</provider>
+        <non-jta-data-source>java:comp/env/jdbc/okBetriebstagebuchDS</non-jta-data-source>
+        <class>org.eclipse.openk.elogbook.persistence.model.RefVersion</class>
+        <class>org.eclipse.openk.elogbook.persistence.model.RefBranch</class>
+        <class>org.eclipse.openk.elogbook.persistence.model.RefGridTerritory</class>
+        <class>org.eclipse.openk.elogbook.persistence.model.RefNotificationStatus</class>
+        <class>org.eclipse.openk.elogbook.persistence.model.TblNotification</class>
+        <class>org.eclipse.openk.elogbook.persistence.model.TblResponsibility</class>
+        <exclude-unlisted-classes>false</exclude-unlisted-classes>
+        <properties>
+            <!--<property name="eclipselink.logging.file" value="../logs/eclipselink.log"/>-->
+            <!--<property name="eclipselink.logging.level" value="FINE" />-->
+            <!--<property name="eclipselink.logging.level.sql" value="FINE"/>-->
+            <!--<property name="eclipselink.logging.parameters" value="true"/>-->
+        </properties>
+    </persistence-unit>
+</persistence>
diff --git a/src/main/resources/backendConfigCustom.json b/src/main/resources/backendConfigCustom.json
new file mode 100644
index 0000000..6d1bf17
--- /dev/null
+++ b/src/main/resources/backendConfigCustom.json
@@ -0,0 +1,5 @@
+{
+  "portalBaseURL" : "http://localhost:8088/portal/rest/beservice",
+  "fileRowToRead": "9",
+  "importFilesFolderPath": "C:/FilesToImport"
+}
diff --git a/src/main/resources/backendConfigDevLocal.json b/src/main/resources/backendConfigDevLocal.json
new file mode 100644
index 0000000..f645c06
--- /dev/null
+++ b/src/main/resources/backendConfigDevLocal.json
@@ -0,0 +1,5 @@
+{
+  "portalBaseURL" : "http://localhost:8080/portal/rest/beservice",
+  "fileRowToRead": "9",
+  "importFilesFolderPath": "C:/FilesToImport"
+}
diff --git a/src/main/resources/backendConfigDevServer.json b/src/main/resources/backendConfigDevServer.json
new file mode 100644
index 0000000..e25858a
--- /dev/null
+++ b/src/main/resources/backendConfigDevServer.json
@@ -0,0 +1,5 @@
+{
+  "portalBaseURL" : "http://localhost:8880/portal/rest/beservice",
+  "fileRowToRead": "9",
+  "importFilesFolderPath": "C:/FilesToImport"
+}
diff --git a/src/main/resources/backendConfigProduction.json b/src/main/resources/backendConfigProduction.json
new file mode 100644
index 0000000..264af28
--- /dev/null
+++ b/src/main/resources/backendConfigProduction.json
@@ -0,0 +1,5 @@
+{
+  "portalBaseURL" : "http://localhost:8080/portal/rest/beservice",
+  "fileRowToRead": "9",
+  "importFilesFolderPath": "/home/btbservice/importFiles"
+}
\ No newline at end of file
diff --git a/src/main/webapp/WEB-INF/logger.xml b/src/main/webapp/WEB-INF/logger.xml
new file mode 100644
index 0000000..58a1c22
--- /dev/null
+++ b/src/main/webapp/WEB-INF/logger.xml
@@ -0,0 +1,66 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE log4j:configuration PUBLIC
+        "-//APACHE//DTD LOG4J 1.2//EN"
+        "http://logging.apache.org/log4j/1.2/apidocs/org/apache/log4j/xml/doc-files/log4j.dtd">
+<log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/">
+
+    <appender name="CONSOLE" class="org.apache.log4j.ConsoleAppender">
+        <param name="Threshold" value="DEBUG"/>
+        <param name="Target" value="System.out"/>
+        <layout class="org.apache.log4j.PatternLayout">
+            <param name="ConversionPattern" value="[%d{yyyy.MM.dd HH:mm:ss}] [%p] [%c] %m%n"/>
+        </layout>
+    </appender>
+
+    <appender name="Socket" class="org.apache.log4j.net.SocketAppender">
+        <param name="remoteHost" value="127.0.0.1"/>
+        <param name="port" value="4560"/>
+        <layout class="org.apache.log4j.PatternLayout">
+            <param name="ConversionPattern" value="[%d{yyyy.MM.dd HH:mm:ss}] [%p] [%c] %m%n"/>
+        </layout>
+    </appender>
+
+    <!-- Issue: das Verzeichnis muss existieren ... -->
+    <appender name="FILE" class="org.apache.log4j.DailyRollingFileAppender">
+        <param name="Threshold" value="TRACE"/>
+        <param name="File" value="${catalina.base}/logs/betriebstagebuch.backend.log"/>
+        <param name="Append" value="true"/>
+        <param name="DatePattern" value="'.'yyyy-MM-dd"/>
+        <layout class="org.apache.log4j.PatternLayout">
+            <param name="ConversionPattern" value="[%d{yyyy.MM.dd HH:mm:ss}] [%p] [%c] %m%n"/>
+        </layout>
+    </appender>
+
+    <!-- Default Logging configuration beginnend mit org.eclipse (= alle Packages) -->
+    <category name="org.eclipse">
+        <priority value="INFO"/>
+        <!--<priority value="DEBUG"/> -->
+        <!--<priority value="ERROR"/> -->
+        <appender-ref ref="CONSOLE"/>
+        <!--<appender-ref ref="Socket"/> -->
+        <!--<appender-ref ref="FILE"/> -->
+        <!--<appender-ref ref="SYSLOG"/> -->
+        <appender-ref ref="FILE"/>
+    </category>
+    <category name="org.jboss.resteasy">
+        <priority value="WARN"/>
+        <!--<priority value="DEBUG"/> -->
+        <!--<priority value="ERROR"/> -->
+        <appender-ref ref="CONSOLE"/>
+        <!--<appender-ref ref="Socket"/> -->
+        <!--<appender-ref ref="FILE"/> -->
+        <!--<appender-ref ref="SYSLOG"/> -->
+        <appender-ref ref="FILE"/>
+    </category>
+    <category name="javax.persistence.Persistence">
+        <priority value="INFO"/>
+        <!--<priority value="DEBUG"/> -->
+        <!--<priority value="ERROR"/> -->
+        <appender-ref ref="CONSOLE"/>
+        <!--<appender-ref ref="Socket"/> -->
+        <!--<appender-ref ref="FILE"/> -->
+        <!--<appender-ref ref="SYSLOG"/> -->
+        <appender-ref ref="FILE"/>
+    </category>
+
+</log4j:configuration>
\ No newline at end of file
diff --git a/src/main/webapp/WEB-INF/web.xml b/src/main/webapp/WEB-INF/web.xml
new file mode 100644
index 0000000..650b911
--- /dev/null
+++ b/src/main/webapp/WEB-INF/web.xml
@@ -0,0 +1,55 @@
+<web-app id="WebApp_ID" version="2.4"
+         xmlns="http://java.sun.com/xml/ns/j2ee"
+         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee
+	http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">
+    <display-name>Restful Web Application</display-name>
+
+    <context-param>
+        <param-name>resteasy.servlet.mapping.prefix</param-name>
+        <param-value>/rest</param-value>
+    </context-param>
+
+    <context-param>
+        <param-name>resteasy.scan</param-name>
+        <param-value>false</param-value>
+    </context-param>
+
+    <listener>
+        <listener-class>org.jboss.resteasy.plugins.server.servlet.ResteasyBootstrap</listener-class>
+    </listener>
+
+    <servlet>
+        <servlet-name>Resteasy</servlet-name>
+        <servlet-class>
+            org.jboss.resteasy.plugins.server.servlet.HttpServletDispatcher
+        </servlet-class>
+        <init-param>
+            <param-name>javax.ws.rs.Application</param-name>
+            <param-value>org.eclipse.openk.elogbook.rest.RestServiceConfiguration</param-value>
+        </init-param>
+    </servlet>
+
+    <servlet-mapping>
+        <servlet-name>Resteasy</servlet-name>
+        <url-pattern>/rest/*</url-pattern>
+    </servlet-mapping>
+
+    <servlet>
+        <servlet-name>log4j-init</servlet-name>
+        <servlet-class>org.eclipse.openk.elogbook.common.util.LoggerUtil</servlet-class>
+        <init-param>
+            <param-name>log4j-init-file</param-name>
+            <param-value>WEB-INF/logger.xml</param-value>
+        </init-param>
+        <load-on-startup>0</load-on-startup>
+    </servlet>
+
+    <servlet>
+        <servlet-name>InitBackendConfig</servlet-name>
+        <servlet-class>org.eclipse.openk.elogbook.common.InitBackendConfig</servlet-class>
+        <load-on-startup>2</load-on-startup>
+    </servlet>
+
+
+</web-app>
diff --git a/src/main/webapp/index.html b/src/main/webapp/index.html
new file mode 100644
index 0000000..97b5341
--- /dev/null
+++ b/src/main/webapp/index.html
@@ -0,0 +1,10 @@
+<!DOCTYPE html>
+<html>
+<head>
+<meta charset="UTF-8">
+<title>Insert title here</title>
+</head>
+<body>
+it works!
+</body>
+</html>
\ No newline at end of file
diff --git a/src/test/java/org/eclipse/openk/elogbook/common/BackendConfigTest.java b/src/test/java/org/eclipse/openk/elogbook/common/BackendConfigTest.java
new file mode 100644
index 0000000..619ab1a
--- /dev/null
+++ b/src/test/java/org/eclipse/openk/elogbook/common/BackendConfigTest.java
@@ -0,0 +1,18 @@
+package org.eclipse.openk.elogbook.common;
+
+
+import static org.junit.Assert.assertEquals;
+
+import org.junit.Test;
+
+public class BackendConfigTest {
+    @Test
+    public void testConfig() {
+        BackendConfig bc = BackendConfig.getInstance();
+        assertEquals( bc.getPortalBaseURL(), "http://localhost:8080/portal/rest/beservice" );
+        assertEquals( bc.getImportFilesFolderPath(), "C:/FilesToImport" );
+        assertEquals( bc.getFileRowToRead(), 9 );
+        BackendConfig.setConfigFileName("backendConfigProduction.json");
+        assertEquals( BackendConfig.getConfigFileName(), "backendConfigProduction.json");
+    }
+}
diff --git a/src/test/java/org/eclipse/openk/elogbook/common/Communication/RestServiceWrapperTest.java b/src/test/java/org/eclipse/openk/elogbook/common/Communication/RestServiceWrapperTest.java
new file mode 100644
index 0000000..567ce89
--- /dev/null
+++ b/src/test/java/org/eclipse/openk/elogbook/common/Communication/RestServiceWrapperTest.java
@@ -0,0 +1,28 @@
+package org.eclipse.openk.elogbook.common.Communication;
+
+import org.eclipse.openk.elogbook.communication.RestServiceWrapper;
+import org.eclipse.openk.elogbook.exceptions.BtbException;
+import org.junit.Before;
+import org.junit.Test;
+
+public class RestServiceWrapperTest {
+
+    private RestServiceWrapper restServiceWrapper;
+    private boolean useHttps = true;
+
+    @Before
+    public void init() {
+        this.restServiceWrapper = new RestServiceWrapper("testURL", useHttps);
+    }
+
+    @Test(expected = BtbException.class)
+    public void testPerformGetRequest() throws BtbException {
+        restServiceWrapper.performGetRequest("testParam", "testToken");
+    }
+
+    @Test(expected = BtbException.class)
+    public void testPerformPostRequest() throws Exception {
+        restServiceWrapper.performPostRequest("testParam", "testToken", "testData");
+    }
+
+}
diff --git a/src/test/java/org/eclipse/openk/elogbook/common/InitBackendConfigTest.java b/src/test/java/org/eclipse/openk/elogbook/common/InitBackendConfigTest.java
new file mode 100644
index 0000000..4c42578
--- /dev/null
+++ b/src/test/java/org/eclipse/openk/elogbook/common/InitBackendConfigTest.java
@@ -0,0 +1,38 @@
+package org.eclipse.openk.elogbook.common;
+
+import org.junit.Test;
+import org.powermock.reflect.Whitebox;
+
+public class InitBackendConfigTest {
+
+    private InitBackendConfig initBackendConfig = new InitBackendConfig();
+
+    @Test
+    public void testSetConfigFiles() throws Exception {
+        Whitebox.invokeMethod(initBackendConfig, "setConfigFiles", "DevLocal");
+    }
+
+    private void testGeneric(String environment ) throws Exception {
+        Whitebox.invokeMethod(initBackendConfig, "setConfigFiles", environment);
+    }
+
+    @Test
+    public void testCombinations() throws Exception {
+
+        testGeneric("DevLocal");
+        testGeneric("DevLocal");
+
+        testGeneric("DevServer");
+        testGeneric("DevServer");
+
+        testGeneric("Custom");
+        testGeneric("Custom");
+
+        testGeneric(null);
+        testGeneric(null);
+
+        testGeneric("");
+        testGeneric("");
+
+}
+}
diff --git a/src/test/java/org/eclipse/openk/elogbook/common/NotificationStatusTest.java b/src/test/java/org/eclipse/openk/elogbook/common/NotificationStatusTest.java
new file mode 100644
index 0000000..ede11e7
--- /dev/null
+++ b/src/test/java/org/eclipse/openk/elogbook/common/NotificationStatusTest.java
@@ -0,0 +1,20 @@
+package org.eclipse.openk.elogbook.common;
+
+import static org.junit.Assert.assertEquals;
+
+import org.junit.Test;
+
+public class NotificationStatusTest {
+
+	@Test
+	public void createNotificationStatus() throws Exception {
+
+        assertEquals(0, NotificationStatus.UNKNOWN.id);
+        assertEquals(1, NotificationStatus.OPEN.id);
+        assertEquals(2, NotificationStatus.INPROGRESS.id);
+        assertEquals(3, NotificationStatus.FINISHED.id);
+        assertEquals(4, NotificationStatus.CLOSED.id);
+
+    }
+
+}
diff --git a/src/test/java/org/eclipse/openk/elogbook/common/mapper/HResponsibilityMapperTest.java b/src/test/java/org/eclipse/openk/elogbook/common/mapper/HResponsibilityMapperTest.java
new file mode 100644
index 0000000..04e7c7d
--- /dev/null
+++ b/src/test/java/org/eclipse/openk/elogbook/common/mapper/HResponsibilityMapperTest.java
@@ -0,0 +1,354 @@
+package org.eclipse.openk.elogbook.common.mapper;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertNull;
+import static org.junit.Assert.assertTrue;
+
+import java.sql.Timestamp;
+import java.time.LocalDateTime;
+import java.util.*;
+
+import org.eclipse.openk.elogbook.common.Globals;
+import org.eclipse.openk.elogbook.common.mapper.HResponsibilityMapper;
+import org.eclipse.openk.elogbook.persistence.model.HTblResponsibility;
+import org.eclipse.openk.elogbook.persistence.model.RefBranch;
+import org.eclipse.openk.elogbook.persistence.model.RefGridTerritory;
+import org.eclipse.openk.elogbook.persistence.model.TblResponsibility;
+import org.eclipse.openk.elogbook.viewmodel.HistoricalResponsibility;
+import org.eclipse.openk.elogbook.viewmodel.HistoricalShiftChanges;
+import org.eclipse.openk.elogbook.viewmodel.Responsibility;
+import org.eclipse.openk.elogbook.viewmodel.TerritoryResponsibility;
+import org.junit.Before;
+import org.junit.Test;
+
+public class HResponsibilityMapperTest {
+
+  private List<TblResponsibility> tblResponsibilityList = new ArrayList<>();
+  private List<HTblResponsibility> htblResponsibilityList = new ArrayList<>();
+
+  Calendar calendar = Calendar.getInstance();
+  java.util.Date compareDate = calendar.getTime();
+
+  LocalDateTime ldtCreate = LocalDateTime.parse("2017-06-19T15:00:00");
+  Timestamp tsCreate = Timestamp.valueOf(ldtCreate);
+
+  LocalDateTime ldtMod = LocalDateTime.parse("2017-06-20T15:00:00");
+  Timestamp tsMod = Timestamp.valueOf(ldtMod);
+
+  LocalDateTime ldtTrans = LocalDateTime.parse("2017-06-21T15:00:00");
+  Timestamp tsTrans = Timestamp.valueOf(ldtTrans);
+
+  @Before
+  public void createResponsibilityList() {
+
+    RefBranch refBranchElectricity = new RefBranch();
+    refBranchElectricity.setName(Globals.ELECTRICITY_MARK);
+    RefBranch refBranchGas = new RefBranch();
+    refBranchGas.setName(Globals.GAS_MARK);
+    RefBranch refBranchDistrictHeat = new RefBranch();
+    refBranchDistrictHeat.setName(Globals.DISTRICT_HEAT_MARK);
+    RefBranch refBranchWater = new RefBranch();
+    refBranchWater.setName(Globals.WATER_MARK);
+
+    RefGridTerritory refGridTerritory1 = new RefGridTerritory();
+    RefGridTerritory refGridTerritory2 = new RefGridTerritory();
+    RefGridTerritory refGridTerritory3 = new RefGridTerritory();
+
+    refGridTerritory1.setDescription("Mannheim");
+    refGridTerritory2.setDescription("Offenbach");
+    refGridTerritory3.setDescription("Stuttgart");
+
+
+    //Mannheim all (4) responsibilities
+    TblResponsibility tblResponsibility0 = new TblResponsibility();
+    tblResponsibility0.setId(1);
+    tblResponsibility0.setResponsibleUser("responsibleUser1");
+    tblResponsibility0.setRefGridTerritory(refGridTerritory1);
+    tblResponsibility0.setRefBranch(refBranchElectricity);
+    tblResponsibility0.setCreateDate(tsCreate);
+    tblResponsibility0.setModDate(tsMod);
+    tblResponsibility0.setModUser("modUserRespTest");
+
+    TblResponsibility tblResponsibility1 = new TblResponsibility();
+    tblResponsibility1.setId(2);
+    tblResponsibility1.setResponsibleUser("responsibleUser1");
+    tblResponsibility1.setRefGridTerritory(refGridTerritory1);
+    tblResponsibility1.setRefBranch(refBranchGas);
+
+    TblResponsibility tblResponsibility2 = new TblResponsibility();
+    tblResponsibility2.setId(3);
+    tblResponsibility2.setResponsibleUser("responsibleUser1");
+    tblResponsibility2.setRefGridTerritory(refGridTerritory1);
+    tblResponsibility2.setRefBranch(refBranchWater);
+
+    TblResponsibility tblResponsibility3 = new TblResponsibility();
+    tblResponsibility3.setId(4);
+    tblResponsibility3.setResponsibleUser("responsibleUser1");
+    tblResponsibility3.setNewResponsibleUser("newResponsibleUser1");
+    tblResponsibility3.setRefGridTerritory(refGridTerritory1);
+    tblResponsibility3.setRefBranch(refBranchDistrictHeat);
+
+    //Offenbach 1 responsibility
+    TblResponsibility tblResponsibility4 = new TblResponsibility();
+    tblResponsibility4.setId(33);
+    tblResponsibility4.setResponsibleUser("responsibleUser1");
+    tblResponsibility4.setRefGridTerritory(refGridTerritory2);
+    tblResponsibility4.setRefBranch(refBranchWater);
+
+    //Stuttgart 2 responsibilities
+    TblResponsibility tblResponsibility5 = new TblResponsibility();
+    tblResponsibility5.setId(44);
+    tblResponsibility5.setResponsibleUser("responsibleUser1");
+    tblResponsibility5.setNewResponsibleUser("newResponsibleUser1");
+    tblResponsibility5.setRefGridTerritory(refGridTerritory3);
+    tblResponsibility5.setRefBranch(refBranchDistrictHeat);
+
+    TblResponsibility tblResponsibility6 = new TblResponsibility();
+    tblResponsibility6.setId(45);
+    tblResponsibility6.setResponsibleUser("responsibleUser1");
+    tblResponsibility6.setRefGridTerritory(refGridTerritory3);
+    tblResponsibility6.setRefBranch(refBranchWater);
+
+    tblResponsibilityList.add(tblResponsibility0);
+    tblResponsibilityList.add(tblResponsibility1);
+    tblResponsibilityList.add(tblResponsibility2);
+    tblResponsibilityList.add(tblResponsibility3);
+    tblResponsibilityList.add(tblResponsibility4);
+    tblResponsibilityList.add(tblResponsibility5);
+    tblResponsibilityList.add(tblResponsibility6);
+
+  }
+
+  @Before
+  public void createHResponsibilityList() {
+
+    RefBranch refBranchElectricity = new RefBranch();
+    refBranchElectricity.setName(Globals.ELECTRICITY_MARK);
+    RefBranch refBranchGas = new RefBranch();
+    refBranchGas.setName(Globals.GAS_MARK);
+    RefBranch refBranchDistrictHeat = new RefBranch();
+    refBranchDistrictHeat.setName(Globals.DISTRICT_HEAT_MARK);
+    RefBranch refBranchWater = new RefBranch();
+    refBranchWater.setName(Globals.WATER_MARK);
+
+    RefGridTerritory refGridTerritory1 = new RefGridTerritory();
+    RefGridTerritory refGridTerritory2 = new RefGridTerritory();
+    RefGridTerritory refGridTerritory3 = new RefGridTerritory();
+
+    refGridTerritory1.setDescription("Mannheim");
+    refGridTerritory2.setDescription("Offenbach");
+    refGridTerritory3.setDescription("Stuttgart");
+
+
+
+    //Mannheim all (4) responsibilities
+    HTblResponsibility htblResponsibility0 = new HTblResponsibility();
+    htblResponsibility0.setId(1);
+    htblResponsibility0.setResponsibleUser("responsibleUser1");
+    htblResponsibility0.setRefGridTerritory(refGridTerritory1);
+    htblResponsibility0.setRefBranch(refBranchElectricity);
+    htblResponsibility0.setCreateDate(tsCreate);
+    htblResponsibility0.setModDate(tsMod);
+    htblResponsibility0.setModUser("modUserRespTest1");
+
+    HTblResponsibility htblResponsibility1 = new HTblResponsibility();
+    htblResponsibility1.setId(2);
+    htblResponsibility1.setTransferDate(tsTrans);
+    htblResponsibility1.setResponsibleUser("responsibleUser2");
+    htblResponsibility1.setRefGridTerritory(refGridTerritory1);
+    htblResponsibility1.setRefBranch(refBranchGas);
+
+    HTblResponsibility htblResponsibility2 = new HTblResponsibility();
+    htblResponsibility2.setId(3);
+    htblResponsibility2.setResponsibleUser("responsibleUser3");
+    htblResponsibility2.setRefGridTerritory(refGridTerritory1);
+    htblResponsibility2.setRefBranch(refBranchWater);
+
+    HTblResponsibility htblResponsibility3 = new HTblResponsibility();
+    htblResponsibility3.setId(4);
+    htblResponsibility3.setResponsibleUser("responsibleUser4");
+    htblResponsibility3.setRefGridTerritory(refGridTerritory1);
+    htblResponsibility3.setModUser("modResponsibleUser4");
+    htblResponsibility3.setRefBranch(refBranchDistrictHeat);
+
+    //Offenbach 1 responsibility
+    HTblResponsibility htblResponsibility4 = new HTblResponsibility();
+    htblResponsibility4.setId(33);
+    htblResponsibility4.setResponsibleUser("responsibleUser5");
+    htblResponsibility4.setRefGridTerritory(refGridTerritory2);
+    htblResponsibility4.setRefBranch(refBranchWater);
+
+    //Stuttgart 2 responsibilities
+    HTblResponsibility htblResponsibility5 = new HTblResponsibility();
+    htblResponsibility5.setId(44);
+    htblResponsibility5.setResponsibleUser("responsibleUser6");
+    htblResponsibility5.setTransactionId(3);
+    htblResponsibility5.setRefGridTerritory(refGridTerritory3);
+    htblResponsibility5.setRefBranch(refBranchDistrictHeat);
+
+    HTblResponsibility htblResponsibility6 = new HTblResponsibility();
+    htblResponsibility6.setId(45);
+    htblResponsibility6.setResponsibleUser("responsibleUser7");
+    htblResponsibility6.setRefGridTerritory(refGridTerritory3);
+    htblResponsibility6.setRefBranch(refBranchWater);
+
+    htblResponsibilityList.add(htblResponsibility0);
+    htblResponsibilityList.add(htblResponsibility1);
+    htblResponsibilityList.add(htblResponsibility2);
+    htblResponsibilityList.add(htblResponsibility3);
+    htblResponsibilityList.add(htblResponsibility4);
+    htblResponsibilityList.add(htblResponsibility5);
+    htblResponsibilityList.add(htblResponsibility6);
+
+  }
+
+  @Test
+  public void testMapFromTblResponsibility() {
+    TblResponsibility tblResponsibility = tblResponsibilityList.get(0);
+    HTblResponsibility hTblResponsibility = HResponsibilityMapper.mapFromTblResponsibility(tblResponsibility);
+
+    assertEquals(hTblResponsibility.getResponsibleUser(), tblResponsibility.getResponsibleUser());
+    assertEquals(hTblResponsibility.getCreateDate(), tblResponsibility.getCreateDate());
+    assertEquals(hTblResponsibility.getCreateUser(), tblResponsibility.getCreateUser());
+    assertEquals(hTblResponsibility.getModDate(), tblResponsibility.getModDate());
+    assertEquals(hTblResponsibility.getModUser(), tblResponsibility.getModUser());
+    assertEquals(hTblResponsibility.getRefGridTerritory(), tblResponsibility.getRefGridTerritory());
+    assertEquals(hTblResponsibility.getRefBranch(), tblResponsibility.getRefBranch());
+
+  }
+
+  @Test
+  public void testMapToVModel() {
+    HResponsibilityMapper hresponsibilityMappy = HResponsibilityTestHelper.createMapper();
+    HTblResponsibility htblResponsibility = htblResponsibilityList.get(0);
+    HistoricalResponsibility historicalResponsibility = hresponsibilityMappy.mapToVModel(htblResponsibility);
+
+    assertNotNull(historicalResponsibility);
+    assertEquals(historicalResponsibility.getId(), htblResponsibility.getId());
+    assertEquals(historicalResponsibility.getTransactionId(), htblResponsibility.getTransactionId());
+    assertEquals(historicalResponsibility.getResponsibleUser(), htblResponsibility.getResponsibleUser());
+    assertEquals(historicalResponsibility.getCreateDate(), htblResponsibility.getCreateDate());
+    assertEquals(historicalResponsibility.getCreateUser(), htblResponsibility.getCreateUser());
+    assertEquals(historicalResponsibility.getTransferDate(), htblResponsibility.getTransferDate());
+    assertEquals(historicalResponsibility.getModDate(), htblResponsibility.getModDate());
+    assertEquals(historicalResponsibility.getModUser(), htblResponsibility.getModUser());
+    assertEquals(historicalResponsibility.getRefGridTerritory(), htblResponsibility.getRefGridTerritory());
+    assertEquals(historicalResponsibility.getRefBranch(), htblResponsibility.getRefBranch());
+
+  }
+
+  @Test
+  public void testMapToVModelList() {
+
+    HResponsibilityMapper hresponsibilityMappy = HResponsibilityTestHelper.createMapper();
+    List<HistoricalResponsibility> historicalResponsibilityList = hresponsibilityMappy.mapToVModelList(htblResponsibilityList);
+
+    assertEquals(historicalResponsibilityList.get(0).getRefGridTerritory().getDescription(), "Mannheim");
+    assertEquals(historicalResponsibilityList.get(0).getResponsibleUser(), "responsibleUser1");
+    assertTrue(historicalResponsibilityList.get(0).getId() == 1);
+    assertTrue(historicalResponsibilityList.get(5).getTransactionId() == 3);
+    assertEquals(historicalResponsibilityList.get(0).getRefBranch().getName(), Globals.ELECTRICITY_MARK);
+
+    assertEquals(historicalResponsibilityList.get(0).getModUser(), "modUserRespTest1");
+
+    assertEquals(historicalResponsibilityList.get(4).getRefGridTerritory().getDescription(), "Offenbach");
+    assertEquals(historicalResponsibilityList.get(5).getRefGridTerritory().getDescription(), "Stuttgart");
+    assertEquals(historicalResponsibilityList.get(0).getCreateDate(), tsCreate);
+    assertEquals(historicalResponsibilityList.get(0).getModDate(), tsMod);
+    assertEquals(historicalResponsibilityList.get(1).getTransferDate(), tsTrans);
+  }
+
+  @Test
+  public void testMapTblResponsibilitiesInPeriod() {
+
+    HResponsibilityMapper hresponsibilityMappy = HResponsibilityTestHelper.createMapper();
+    HistoricalShiftChanges historicalShiftChanges = hresponsibilityMappy.mapTblResponsibilitiesInPeriod(htblResponsibilityList, compareDate, compareDate);
+
+    assertEquals(historicalShiftChanges.getTransferDateFrom(), compareDate);
+    assertEquals(historicalShiftChanges.getTransferDateTo(), compareDate);
+  }
+
+  @Test
+  public void testHTblResponsibilityNull() {
+
+    List<HTblResponsibility> hTblResponsibilities = new ArrayList<>();
+    HResponsibilityMapper mappy = HResponsibilityTestHelper.createMapper();
+    hTblResponsibilities.add(null);
+    List<HistoricalResponsibility> hresList = mappy.mapToVModelList(hTblResponsibilities);
+    assertNull(hresList.get(0));
+
+  }
+
+  @Test
+  public void testHTblResponsibilityFkNull() {
+
+    HTblResponsibility hTblResponsibility =  new HTblResponsibility();
+    HResponsibilityMapper mappy = HResponsibilityTestHelper.createMapper();
+    HistoricalResponsibility historicalResponsibility = mappy.mapToVModel(hTblResponsibility);
+    assertNull(historicalResponsibility.getRefGridTerritory());
+    assertNull(historicalResponsibility.getRefBranch());
+  }
+
+  @Test
+  public void testMapToContainerVModelList() {
+
+    HResponsibilityMapper mappy = HResponsibilityTestHelper.createMapper();
+    List<TerritoryResponsibility> territoryResponsibilityList = mappy.mapToContainerVModelList(htblResponsibilityList);
+
+    assertTrue(territoryResponsibilityList.size() == 3);
+    assertEquals(territoryResponsibilityList.get(0).getGridTerritoryDescription(), "Mannheim");
+    assertEquals(territoryResponsibilityList.get(0).getResponsibilityList().get(0).getResponsibleUser(), "responsibleUser1");
+    assertTrue(territoryResponsibilityList.get(0).getResponsibilityList().get(0).getId() == 1);
+    assertTrue(territoryResponsibilityList.get(0).getResponsibilityList().size() == 4);
+    assertEquals(territoryResponsibilityList.get(0).getResponsibilityList().get(0).getBranchName() , Globals.ELECTRICITY_MARK);
+
+    assertTrue(territoryResponsibilityList.get(0).getResponsibilityList().get(3).getId() == 4);
+
+    assertEquals(territoryResponsibilityList.get(1).getGridTerritoryDescription(), "Offenbach");
+    assertEquals(territoryResponsibilityList.get(2).getGridTerritoryDescription(), "Stuttgart");
+  }
+
+  @Test
+  public void testMapToContainerVModelList_EmptyList() {
+
+    List<HTblResponsibility> htblResponsibilityList = new ArrayList<>();
+    HResponsibilityMapper mappy = HResponsibilityTestHelper.createMapper();
+    List<TerritoryResponsibility> territoryResponsibilities = mappy.mapToContainerVModelList(htblResponsibilityList);
+
+    assertTrue(territoryResponsibilities.size() == 0);
+
+  }
+
+
+  @Test
+  public void testMapToContainerVModel() {
+    HResponsibilityMapper mappy = HResponsibilityTestHelper.createMapper();
+    TerritoryResponsibility terRespExist = new TerritoryResponsibility();;
+
+    List<Responsibility> responsibilityList = new ArrayList<>();
+
+    terRespExist.setGridTerritoryDescription(htblResponsibilityList.get(0).getRefGridTerritory().getDescription());
+    terRespExist.setResponsibilityList(responsibilityList);
+    responsibilityList.add(mappy.mapToVModelForContainer(htblResponsibilityList.get(0)));
+    TerritoryResponsibility terResp = mappy.mapToContainerVModel(htblResponsibilityList.get(0), terRespExist);
+
+    assertEquals(terResp.getGridTerritoryDescription(), htblResponsibilityList.get(0).getRefGridTerritory().getDescription());
+    assertEquals(terResp.getResponsibilityList(), responsibilityList);
+  }
+
+
+  @Test
+  public void testMapToVModelForContainer() {
+    HResponsibilityMapper hresponsibilityMappy = HResponsibilityTestHelper.createMapper();
+    HTblResponsibility htblResponsibility = htblResponsibilityList.get(0);
+    Responsibility responsibility = hresponsibilityMappy.mapToVModelForContainer(htblResponsibility);
+
+    assertNotNull(responsibility);
+    assertEquals(responsibility.getId(), htblResponsibility.getId());
+    assertEquals(responsibility.getResponsibleUser(), htblResponsibility.getResponsibleUser());
+    assertEquals(responsibility.getBranchName(), htblResponsibility.getRefBranch().getName());
+    assertTrue(responsibility.isActive());
+  }
+
+}
\ No newline at end of file
diff --git a/src/test/java/org/eclipse/openk/elogbook/common/mapper/HResponsibilityTestHelper.java b/src/test/java/org/eclipse/openk/elogbook/common/mapper/HResponsibilityTestHelper.java
new file mode 100644
index 0000000..837bd80
--- /dev/null
+++ b/src/test/java/org/eclipse/openk/elogbook/common/mapper/HResponsibilityTestHelper.java
@@ -0,0 +1,64 @@
+package org.eclipse.openk.elogbook.common.mapper;
+
+import org.eclipse.openk.elogbook.common.mapper.HResponsibilityMapper;
+import org.eclipse.openk.elogbook.persistence.dao.RefBranchDao;
+import org.eclipse.openk.elogbook.persistence.dao.RefGridTerritoryDao;
+import org.eclipse.openk.elogbook.persistence.model.RefBranch;
+import org.eclipse.openk.elogbook.persistence.model.RefGridTerritory;
+import org.powermock.api.easymock.PowerMock;
+
+import java.util.LinkedList;
+import java.util.List;
+
+import static org.easymock.EasyMock.expect;
+import static org.easymock.EasyMock.replay;
+
+public class HResponsibilityTestHelper {
+
+    private static RefGridTerritory newRefGridTerritoryItem(int id, String name, String descritpion) {
+        RefGridTerritory ret = new RefGridTerritory();
+        ret.setId(id);
+        ret.setName(name);
+        ret.setDescription(descritpion);
+        return ret;
+    }
+
+    private static RefBranch newBranch(int id, String name, String description) {
+        RefBranch ret = new RefBranch();
+        ret.setId(id);
+        ret.setName(name);
+        ret.setDescription(description);
+        return ret;
+    }
+
+    private static RefGridTerritoryDao createStatusDaoMock(List<RefGridTerritory> rgtList) {
+        RefGridTerritoryDao rgtdaoMock = PowerMock.createNiceMock(RefGridTerritoryDao.class);
+        expect(rgtdaoMock.findInTx(true, -1, 0)).andReturn(rgtList);
+        replay(rgtdaoMock);
+        return rgtdaoMock;
+    }
+
+    private static RefBranchDao createBranchDaoMock(List<RefBranch> rbList) {
+        RefBranchDao rbdaoMock = PowerMock.createNiceMock(RefBranchDao.class);
+        expect(rbdaoMock.findInTx(true, -1, 0)).andReturn(rbList);
+        replay(rbdaoMock);
+        return rbdaoMock;
+    }
+
+    public static HResponsibilityMapper createMapper() {
+        List<RefGridTerritory> refGridTerritoryLinkedList = new LinkedList<>();
+        refGridTerritoryLinkedList.add(newRefGridTerritoryItem(1, "MA","Mannheim"));
+        refGridTerritoryLinkedList.add(newRefGridTerritoryItem(1, "OF","Offenbach"));
+
+        RefGridTerritoryDao rgtDao = createStatusDaoMock(refGridTerritoryLinkedList);
+
+        List<RefBranch> rbList = new LinkedList<>();
+        rbList.add(newBranch(1, "S", "Strom"));
+        rbList.add(newBranch(2, "G", "Gas"));
+        rbList.add(newBranch(3, "F", "Fernwärme"));
+        rbList.add(newBranch(4, "W", "Wasser"));
+        RefBranchDao rbDao = createBranchDaoMock(rbList);
+
+        return new HResponsibilityMapper(rgtDao, rbDao);
+    }
+}
diff --git a/src/test/java/org/eclipse/openk/elogbook/common/mapper/KeyCloakUserMapperTest.java b/src/test/java/org/eclipse/openk/elogbook/common/mapper/KeyCloakUserMapperTest.java
new file mode 100644
index 0000000..5afd106
--- /dev/null
+++ b/src/test/java/org/eclipse/openk/elogbook/common/mapper/KeyCloakUserMapperTest.java
@@ -0,0 +1,75 @@
+package org.eclipse.openk.elogbook.common.mapper;
+
+import org.eclipse.openk.elogbook.auth2.model.KeyCloakUser;
+import org.eclipse.openk.elogbook.auth2.model.KeyCloakUserAccess;
+import org.eclipse.openk.elogbook.viewmodel.UserAuthentication;
+import org.junit.Before;
+import org.junit.Test;
+
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.List;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertTrue;
+
+public class KeyCloakUserMapperTest {
+	private KeyCloakUser keyCloakUser;
+	private List<KeyCloakUser> keyCloakUsers;
+
+	@Before
+	public void init() {
+		this.keyCloakUser = new KeyCloakUser();
+		this.keyCloakUsers = new ArrayList<>();
+		this.keyCloakUser.setAccess(new KeyCloakUserAccess());
+		this.keyCloakUser.setCreatedTimestamp(new Date().getTime());
+		this.keyCloakUser.setDisableableCredentialTypes(new ArrayList<String>());
+		this.keyCloakUser.setEmailVerified(Boolean.FALSE.booleanValue());
+		this.keyCloakUser.setEnabled(Boolean.FALSE.booleanValue());
+		this.keyCloakUser.setId("4711");
+		this.keyCloakUser.setFirstName("Heinz");
+		this.keyCloakUser.setLastName("Goergens");
+		this.keyCloakUser.setRealmRoles(new ArrayList<String>());
+		this.keyCloakUser.setRequiredActions(new ArrayList<String>());
+		this.keyCloakUser.setTotp(Boolean.TRUE.booleanValue());
+		this.keyCloakUser.setUsername("goergh");
+
+		keyCloakUsers.add(keyCloakUser);
+
+		this.keyCloakUser = new KeyCloakUser();
+		this.keyCloakUser.setAccess(new KeyCloakUserAccess());
+		this.keyCloakUser.setCreatedTimestamp(new Date().getTime());
+		this.keyCloakUser.setDisableableCredentialTypes(new ArrayList<String>());
+		this.keyCloakUser.setEmailVerified(Boolean.TRUE.booleanValue());
+		this.keyCloakUser.setEnabled(Boolean.TRUE.booleanValue());
+		this.keyCloakUser.setId("4712");
+		this.keyCloakUser.setFirstName(null);
+		this.keyCloakUser.setLastName(null);
+		this.keyCloakUser.setRealmRoles(null);
+		this.keyCloakUser.setRequiredActions(null);
+		this.keyCloakUser.setTotp(Boolean.FALSE.booleanValue());
+		this.keyCloakUser.setUsername("");
+
+		keyCloakUsers.add(keyCloakUser);
+
+	}
+
+	@Test
+	public void testMapping() {
+
+		List<UserAuthentication> userAuthentications = KeyCloakUserMapper.mapFromKeyCloakUserList(keyCloakUsers);
+		assertEquals(userAuthentications.get(0).getId(), "4711");
+		assertEquals(userAuthentications.get(0).getName(), "Heinz Goergens");
+
+		assertEquals(userAuthentications.get(0).getUsername(), "goergh");
+
+		assertEquals("", userAuthentications.get(1).getName());
+	}
+	
+	@Test
+	public void testMappingWithParameterNull() {
+		List<UserAuthentication> userAuthentications = KeyCloakUserMapper.mapFromKeyCloakUserList(null);
+		assertTrue(userAuthentications.isEmpty());
+	}
+
+}
\ No newline at end of file
diff --git a/src/test/java/org/eclipse/openk/elogbook/common/mapper/NotificationMapperTest.java b/src/test/java/org/eclipse/openk/elogbook/common/mapper/NotificationMapperTest.java
new file mode 100644
index 0000000..4e34661
--- /dev/null
+++ b/src/test/java/org/eclipse/openk/elogbook/common/mapper/NotificationMapperTest.java
@@ -0,0 +1,135 @@
+package org.eclipse.openk.elogbook.common.mapper;
+
+
+import org.eclipse.openk.elogbook.common.mapper.NotificationMapper;
+import org.eclipse.openk.elogbook.controller.NotificationTestHelper;
+import org.eclipse.openk.elogbook.persistence.model.RefNotificationStatus;
+import org.eclipse.openk.elogbook.persistence.model.TblNotification;
+import org.eclipse.openk.elogbook.viewmodel.Notification;
+import org.junit.Test;
+
+import java.sql.Timestamp;
+import java.util.ArrayList;
+import java.util.List;
+
+import static junit.framework.TestCase.*;
+
+public class NotificationMapperTest {
+
+    public Notification createNotification(){
+
+        Timestamp ts = new Timestamp(System.currentTimeMillis());
+        Notification vmNot = new Notification();
+        vmNot.setId(1);
+        vmNot.setIncidentId(null);
+        vmNot.setVersion(3);
+        vmNot.setCreateDate(ts);
+        vmNot.setCreateUser("Creator");
+        vmNot.setExpectedFinishDate(ts);
+        vmNot.setBeginDate(ts);
+        vmNot.setFinishedDate(ts);
+        vmNot.setFreeText("Free Willi");
+        vmNot.setFreeTextExtended("...is still alive");
+        vmNot.setModDate(ts);
+        vmNot.setModUser("modificatore");
+        vmNot.setNotificationText("notnot");
+        vmNot.setReminderDate(ts);
+        vmNot.setResponsibilityControlPoint("Resp1");
+        vmNot.setResponsibilityForwarding("fwd");
+        vmNot.setFkRefBranch(1);
+        vmNot.setFkRefNotificationStatus(2);
+        vmNot.setFkRefGridTerritory(1);
+        vmNot.getAdminFlag(Boolean.TRUE);
+        return vmNot;
+
+    }
+
+    @Test
+    public void testMap() {
+
+        Notification vmNot = createNotification();
+
+        NotificationMapper mappy = NotificationTestHelper.createMapper();
+        TblNotification tnot = mappy.mapFromVModel(vmNot);
+        assertEquals(vmNot.getId(), tnot.getId());
+        assertEquals(vmNot.getIncidentId(), tnot.getIncidentId());
+        assertEquals(vmNot.getVersion(), tnot.getVersion());
+        assertEquals(vmNot.getCreateDate().getTime(), tnot.getCreateDate().getTime());
+        assertEquals(vmNot.getCreateUser(), tnot.getCreateUser());
+        assertEquals(vmNot.getExpectedFinishDate().getTime(), tnot.getExpectedFinishedDate().getTime());
+        assertEquals(vmNot.getFinishedDate().getTime(), tnot.getFinishedDate().getTime());
+        assertEquals(vmNot.getBeginDate().getTime(), tnot.getBeginDate().getTime());
+        assertEquals(vmNot.getFreeText(), tnot.getFreeText());
+        assertEquals(vmNot.getFreeTextExtended(), tnot.getFreeTextExtended());
+        assertEquals(vmNot.getModDate().getTime(), tnot.getModDate().getTime());
+        assertEquals(vmNot.getModUser(), tnot.getModUser());
+        assertEquals(vmNot.getNotificationText(), tnot.getNotificationText());
+        assertEquals(vmNot.getReminderDate().getTime(), tnot.getReminderDate().getTime());
+        assertEquals(vmNot.getResponsibilityControlPoint(), tnot.getResponsibilityControlPoint());
+        assertEquals(vmNot.getResponsibilityForwarding(), tnot.getResponsibilityForwarding());
+        assertEquals(vmNot.getFkRefBranch(), tnot.getRefBranch().getId());
+        assertEquals(vmNot.getFkRefNotificationStatus(), tnot.getRefNotificationStatus().getId());
+        assertEquals(vmNot.getFkRefGridTerritory(),  tnot.getRefGridTerritory().getId());
+        assertEquals(vmNot.isAdminFlag(),  tnot.isAdminFlag());
+
+        List<TblNotification> tblNotList = new ArrayList<>();
+        tblNotList.add(tnot);
+        List<Notification> notList = mappy.mapListToVModel(tblNotList);
+        Notification rev = notList.get(0);
+        assertNotNull(rev);
+        assertEquals(vmNot.getId(), rev.getId());
+        assertEquals(vmNot.getIncidentId(), rev.getIncidentId());
+        assertEquals(vmNot.getVersion(), rev.getVersion());
+        assertEquals(vmNot.getCreateDate().getTime(), rev.getCreateDate().getTime());
+        assertEquals(vmNot.getCreateUser(), rev.getCreateUser());
+        assertEquals(vmNot.getExpectedFinishDate().getTime(), rev.getExpectedFinishDate().getTime());
+        assertEquals(vmNot.getBeginDate().getTime(), rev.getBeginDate().getTime());
+        assertEquals(vmNot.getFinishedDate().getTime(), rev.getFinishedDate().getTime());
+        assertEquals(vmNot.getFreeText(), rev.getFreeText());
+        assertEquals(vmNot.getFreeTextExtended(), rev.getFreeTextExtended());
+        assertEquals(vmNot.getModDate().getTime(), rev.getModDate().getTime());
+        assertEquals(vmNot.getModUser(), rev.getModUser());
+        assertEquals(vmNot.getNotificationText(), rev.getNotificationText());
+        assertEquals(vmNot.getReminderDate().getTime(), rev.getReminderDate().getTime());
+        assertEquals(vmNot.getResponsibilityControlPoint(), rev.getResponsibilityControlPoint());
+        assertEquals(vmNot.getResponsibilityForwarding(), rev.getResponsibilityForwarding());
+        assertEquals(vmNot.getFkRefBranch(), rev.getFkRefBranch());
+        assertEquals(vmNot.getFkRefNotificationStatus(), rev.getFkRefNotificationStatus());
+        assertEquals(vmNot.getFkRefGridTerritory(), rev.getFkRefGridTerritory());
+        assertEquals(vmNot.isAdminFlag(), rev.isAdminFlag());
+    }
+
+    @Test
+    public void testTblNotificationNull() {
+
+        List<TblNotification> tblNotList = new ArrayList<>();
+        NotificationMapper mappy = NotificationTestHelper.createMapper();
+        tblNotList.add(null);
+        List<Notification> notList = mappy.mapListToVModel(tblNotList);
+        assertNull(notList.get(0));
+
+    }
+
+    @Test
+    public void testTblNotificationModDateNull() {
+
+        Notification vmNot = createNotification();
+        vmNot.setModDate(null);
+        NotificationMapper mappy = NotificationTestHelper.createMapper();
+        TblNotification tnot = mappy.mapFromVModel(vmNot);
+        assertNull(tnot.getModDate());
+
+    }
+    
+    @Test
+    public void testTblNotificationFkNull() {
+
+       TblNotification tblNotification =  new TblNotification();
+       tblNotification.setRefNotificationStatus(new RefNotificationStatus());
+       NotificationMapper mappy = NotificationTestHelper.createMapper();
+       Notification notification = mappy.mapToVModel(tblNotification);
+       assertNull(notification.getFkRefBranch());
+       assertNull(notification.getFkRefGridTerritory());
+    }
+
+}
diff --git a/src/test/java/org/eclipse/openk/elogbook/common/mapper/ResponsibilityMapperTest.java b/src/test/java/org/eclipse/openk/elogbook/common/mapper/ResponsibilityMapperTest.java
new file mode 100644
index 0000000..5c22c47
--- /dev/null
+++ b/src/test/java/org/eclipse/openk/elogbook/common/mapper/ResponsibilityMapperTest.java
@@ -0,0 +1,288 @@
+package org.eclipse.openk.elogbook.common.mapper;
+
+import com.google.gson.reflect.TypeToken;
+import org.eclipse.openk.elogbook.common.Globals;
+import org.eclipse.openk.elogbook.common.JsonGeneratorBase;
+import org.eclipse.openk.elogbook.common.mapper.ResponsibilityMapper;
+import org.eclipse.openk.elogbook.common.util.ResourceLoaderBase;
+import org.eclipse.openk.elogbook.exceptions.BtbGone;
+import org.eclipse.openk.elogbook.persistence.model.RefBranch;
+import org.eclipse.openk.elogbook.persistence.model.RefGridTerritory;
+import org.eclipse.openk.elogbook.persistence.model.TblResponsibility;
+import org.eclipse.openk.elogbook.viewmodel.TerritoryResponsibility;
+import org.junit.Before;
+import org.junit.Test;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import static org.junit.Assert.*;
+
+public class ResponsibilityMapperTest extends ResourceLoaderBase {
+
+  private List<TblResponsibility> tblResponsibilityList = new ArrayList<>();
+
+  @Before
+  public void createResponsibilityList() {
+
+    RefBranch refBranchElectricity = new RefBranch();
+    refBranchElectricity.setName(Globals.ELECTRICITY_MARK);
+    RefBranch refBranchGas = new RefBranch();
+    refBranchGas.setName(Globals.GAS_MARK);
+    RefBranch refBranchDistrictHeat = new RefBranch();
+    refBranchDistrictHeat.setName(Globals.DISTRICT_HEAT_MARK);
+    RefBranch refBranchWater = new RefBranch();
+    refBranchWater.setName(Globals.WATER_MARK);
+
+    RefGridTerritory refGridTerritory1 = new RefGridTerritory();
+    RefGridTerritory refGridTerritory2 = new RefGridTerritory();
+    RefGridTerritory refGridTerritory3 = new RefGridTerritory();
+
+    refGridTerritory1.setDescription("Mannheim");
+    refGridTerritory2.setDescription("Offenbach");
+    refGridTerritory3.setDescription("Stuttgart");
+
+    //Mannheim all (4) responsibilities
+    TblResponsibility tblResponsibility0 = new TblResponsibility();
+    tblResponsibility0.setId(1);
+    tblResponsibility0.setResponsibleUser("responsibleUser1");
+    tblResponsibility0.setRefGridTerritory(refGridTerritory1);
+    tblResponsibility0.setRefBranch(refBranchElectricity);
+
+    TblResponsibility tblResponsibility1 = new TblResponsibility();
+    tblResponsibility1.setId(2);
+    tblResponsibility1.setResponsibleUser("responsibleUser1");
+    tblResponsibility1.setRefGridTerritory(refGridTerritory1);
+    tblResponsibility1.setRefBranch(refBranchGas);
+
+    TblResponsibility tblResponsibility2 = new TblResponsibility();
+    tblResponsibility2.setId(3);
+    tblResponsibility2.setResponsibleUser("responsibleUser1");
+    tblResponsibility2.setRefGridTerritory(refGridTerritory1);
+    tblResponsibility2.setRefBranch(refBranchWater);
+
+    TblResponsibility tblResponsibility3 = new TblResponsibility();
+    tblResponsibility3.setId(4);
+    tblResponsibility3.setResponsibleUser("responsibleUser1");
+    tblResponsibility3.setNewResponsibleUser("newResponsibleUser1");
+    tblResponsibility3.setRefGridTerritory(refGridTerritory1);
+    tblResponsibility3.setRefBranch(refBranchDistrictHeat);
+
+    //Offenbach 1 responsibility
+    TblResponsibility tblResponsibility4 = new TblResponsibility();
+    tblResponsibility4.setId(33);
+    tblResponsibility4.setResponsibleUser("responsibleUser1");
+    tblResponsibility4.setRefGridTerritory(refGridTerritory2);
+    tblResponsibility4.setRefBranch(refBranchWater);
+
+    //Stuttgart 2 responsibilities
+    TblResponsibility tblResponsibility5 = new TblResponsibility();
+    tblResponsibility5.setId(44);
+    tblResponsibility5.setResponsibleUser("responsibleUser1");
+    tblResponsibility5.setNewResponsibleUser("newResponsibleUser1");
+    tblResponsibility5.setRefGridTerritory(refGridTerritory3);
+    tblResponsibility5.setRefBranch(refBranchDistrictHeat);
+
+    TblResponsibility tblResponsibility6 = new TblResponsibility();
+    tblResponsibility6.setId(45);
+    tblResponsibility6.setResponsibleUser("responsibleUser1");
+    tblResponsibility6.setRefGridTerritory(refGridTerritory3);
+    tblResponsibility6.setRefBranch(refBranchWater);
+
+    tblResponsibilityList.add(tblResponsibility0);
+    tblResponsibilityList.add(tblResponsibility1);
+    tblResponsibilityList.add(tblResponsibility2);
+    tblResponsibilityList.add(tblResponsibility3);
+    tblResponsibilityList.add(tblResponsibility4);
+    tblResponsibilityList.add(tblResponsibility5);
+    tblResponsibilityList.add(tblResponsibility6);
+
+  }
+
+  @Test
+  public void testMapToContainerVModelList() {
+
+    ResponsibilityMapper responsibilityMappy = ResponsibilityTestHelper.createMapper();
+    List<TerritoryResponsibility> territoryResponsibilityList = responsibilityMappy.mapToContainerVModelList(tblResponsibilityList);
+
+    assertTrue(territoryResponsibilityList.size() == 3);
+    assertEquals(territoryResponsibilityList.get(0).getGridTerritoryDescription(), "Mannheim");
+    assertEquals(territoryResponsibilityList.get(0).getResponsibilityList().get(0).getResponsibleUser(), "responsibleUser1");
+    assertTrue(territoryResponsibilityList.get(0).getResponsibilityList().get(0).getId() == 1);
+    assertTrue(territoryResponsibilityList.get(0).getResponsibilityList().size() == 4);
+    assertEquals(territoryResponsibilityList.get(0).getResponsibilityList().get(0).getBranchName() , Globals.ELECTRICITY_MARK);
+
+    assertTrue(territoryResponsibilityList.get(0).getResponsibilityList().get(3).getId() == 4);
+    assertEquals(territoryResponsibilityList.get(0).getResponsibilityList().get(3).getNewResponsibleUser(), "newResponsibleUser1");
+
+    assertEquals(territoryResponsibilityList.get(1).getGridTerritoryDescription(), "Offenbach");
+    assertEquals(territoryResponsibilityList.get(2).getGridTerritoryDescription(), "Stuttgart");
+    assertTrue(territoryResponsibilityList.get(2).getResponsibilityList().size() == 2);
+    assertTrue(territoryResponsibilityList.get(2).getResponsibilityList().get(0).isActive());
+
+  }
+
+  @Test
+  public void testMapToContainerVModelList_EmptyList() {
+
+    List<TblResponsibility> tblResponsibilityList = new ArrayList<>();
+    ResponsibilityMapper responsibilityMappy = ResponsibilityTestHelper.createMapper();
+    List<TerritoryResponsibility> territoryResponsibilities = responsibilityMappy.mapToContainerVModelList(tblResponsibilityList);
+
+    assertTrue(territoryResponsibilities.size() == 0);
+
+  }
+
+  @Test
+  public void testMapFromVModelList_planResponsibilities() throws BtbGone {
+    String json = super.loadStringFromResource("testTerritoryResponsibility.json");
+    String moduser = "modUser";
+    List<TerritoryResponsibility> territoryResponsiblityList = JsonGeneratorBase
+        .getGson().fromJson(json, new TypeToken<List<TerritoryResponsibility>>(){}.getType());
+
+    ResponsibilityMapper responsibilityMappy = ResponsibilityTestHelper.createMapper();
+
+    List<TblResponsibility> responsibilityList = responsibilityMappy.mapFromVModelList(territoryResponsiblityList, tblResponsibilityList, moduser, "planResponsibilities");
+
+    assertTrue(responsibilityList.size() == 7);
+    assertTrue(responsibilityList.get(0).getId()== 1);
+    assertTrue(responsibilityList.get(0).getResponsibleUser().equals("responsibleUser1"));
+    assertTrue(responsibilityList.get(0).getNewResponsibleUser().equals("newResponsibleUser"));
+    assertTrue(responsibilityList.get(0).getRefBranch().getName().equals(Globals.ELECTRICITY_MARK));
+
+    assertTrue(responsibilityList.get(5).getId()== 44);
+    assertTrue(responsibilityList.get(5).getResponsibleUser().equals("responsibleUser1"));
+    assertTrue(responsibilityList.get(5).getNewResponsibleUser().equals("newResponsibleUser2"));
+    assertTrue(responsibilityList.get(5).getRefBranch().getName().equals(Globals.DISTRICT_HEAT_MARK));
+    assertNull(responsibilityList.get(6).getNewResponsibleUser());
+
+  }
+
+  @Test( expected = BtbGone.class)
+  public void testMapFromVModelListGridLocationException() throws BtbGone {
+    String json = super.loadStringFromResource("testTerritoryResponsibilityBranchException.json");
+    String moduser = "modUser";
+    List<TerritoryResponsibility> territoryResponsibilities = JsonGeneratorBase
+        .getGson().fromJson(json, new TypeToken<List<TerritoryResponsibility>>(){}.getType());
+    ResponsibilityMapper responsibilityMappy = ResponsibilityTestHelper.createMapper();
+    responsibilityMappy.mapFromVModelList(territoryResponsibilities, tblResponsibilityList, moduser, "planResponsibilities");
+
+  }
+
+  @Test( expected = BtbGone.class)
+  public void testMapFromVModelListRespUserException() throws BtbGone {
+    String json = super.loadStringFromResource("testTerritoryResponsibilityUserException.json");
+    String moduser = "modUser";
+    List<TerritoryResponsibility> territoryResponsiblityList = JsonGeneratorBase
+        .getGson().fromJson(json, new TypeToken<List<TerritoryResponsibility>>(){}.getType());
+    ResponsibilityMapper responsibilityMappy = ResponsibilityTestHelper.createMapper();
+    responsibilityMappy.mapFromVModelList(territoryResponsiblityList, tblResponsibilityList, moduser, "planResponsibilities");
+
+  }
+
+  @Test( expected = BtbGone.class)
+  public void testMapFromVModelListBranchException() throws BtbGone {
+    String json = super.loadStringFromResource("testTerritoryResponsibilityBranchException.json");
+    String moduser = "modUser";
+    List<TerritoryResponsibility> territoryResponsiblityList = JsonGeneratorBase
+        .getGson().fromJson(json, new TypeToken<List<TerritoryResponsibility>>(){}.getType());
+    ResponsibilityMapper responsibilityMappy = ResponsibilityTestHelper.createMapper();
+    responsibilityMappy.mapFromVModelList(territoryResponsiblityList, tblResponsibilityList, moduser, "planResponsibilities");
+
+  }
+
+  @Test( expected = BtbGone.class)
+  public void testMapFromVModelListResponsibilityOutdatedPlus() throws BtbGone {
+    String json = super.loadStringFromResource("testResponsibilityOutdatedDataPlus.json");
+    String moduser = "modUser";
+    List<TerritoryResponsibility> territoryResponsiblityList = JsonGeneratorBase
+        .getGson().fromJson(json, new TypeToken<List<TerritoryResponsibility>>(){}.getType());
+    ResponsibilityMapper responsibilityMappy = ResponsibilityTestHelper.createMapper();
+   responsibilityMappy.mapFromVModelList(territoryResponsiblityList, tblResponsibilityList, moduser, "planResponsibilities");
+
+  }
+
+  @Test( expected = BtbGone.class)
+  public void testMapFromVModelListResponsibilityOutdatedMinus() throws BtbGone {
+    String json = super.loadStringFromResource("testResponsibilityOutdatedDataMinus.json");
+    String moduser = "modUser";
+    List<TerritoryResponsibility> territoryResponsiblityList = JsonGeneratorBase
+        .getGson().fromJson(json, new TypeToken<List<TerritoryResponsibility>>(){}.getType());
+    ResponsibilityMapper responsibilityMappy = ResponsibilityTestHelper.createMapper();
+    responsibilityMappy.mapFromVModelList(territoryResponsiblityList, tblResponsibilityList, moduser, "planResponsibilities");
+
+  }
+
+  @Test
+  public void testMapFromVModelList_confirmResponsibilities() throws BtbGone {
+    String json = super.loadStringFromResource("testTerritoryResponsibility.json");
+    String moduser = "modUser";
+    List<TerritoryResponsibility> territoryResponsiblityList = JsonGeneratorBase.getGson()
+        .fromJson(json, new TypeToken<List<TerritoryResponsibility>>() {
+        }.getType());
+
+    ResponsibilityMapper responsibilityMappy = ResponsibilityTestHelper.createMapper();
+
+    List<TblResponsibility> responsibilityList = responsibilityMappy
+        .mapFromVModelList(territoryResponsiblityList, tblResponsibilityList, moduser, "confirmResponsibilities");
+
+    assertTrue(responsibilityList.size() == 7);
+    assertTrue(responsibilityList.get(0).getId() == 1);
+    assertTrue(responsibilityList.get(0).getResponsibleUser().equals("newResponsibleUser"));
+    assertNull(responsibilityList.get(0).getNewResponsibleUser());
+    assertTrue(responsibilityList.get(0).getRefBranch().getName().equals(Globals.ELECTRICITY_MARK));
+
+    assertTrue(responsibilityList.get(5).getId() == 44);
+    assertTrue(responsibilityList.get(5).getResponsibleUser().equals("responsibleUser1"));
+    assertNull(responsibilityList.get(5).getNewResponsibleUser());
+    assertTrue(responsibilityList.get(5).getRefBranch().getName().equals(Globals.DISTRICT_HEAT_MARK));
+
+  }
+
+  @Test( expected = BtbGone.class)
+  public void testMapFromVModelListGridLocationException1() throws BtbGone {
+    String json = super.loadStringFromResource("testTerritoryResponsibilityBranchException.json");
+    String moduser = "modUser";
+    List<TerritoryResponsibility> territoryResponsibilities = JsonGeneratorBase
+            .getGson().fromJson(json, new TypeToken<List<TerritoryResponsibility>>(){}.getType());
+    ResponsibilityMapper responsibilityMappy = ResponsibilityTestHelper.createMapper();
+    responsibilityMappy.mapFromVModelList(territoryResponsibilities, tblResponsibilityList, moduser, "confirmResponsibilities");
+  }
+  @Test( expected = BtbGone.class)
+  public void testMapFromVModelListRespUserException1() throws BtbGone {
+    String json = super.loadStringFromResource("testTerritoryResponsibilityUserException.json");
+    String moduser = "modUser";
+    List<TerritoryResponsibility> territoryResponsiblityList = JsonGeneratorBase
+            .getGson().fromJson(json, new TypeToken<List<TerritoryResponsibility>>(){}.getType());
+    ResponsibilityMapper responsibilityMappy = ResponsibilityTestHelper.createMapper();
+    responsibilityMappy.mapFromVModelList(territoryResponsiblityList, tblResponsibilityList, moduser, "confirmResponsibilities");
+  }
+  @Test( expected = BtbGone.class)
+  public void testMapFromVModelListBranchException1() throws BtbGone {
+    String json = super.loadStringFromResource("testTerritoryResponsibilityBranchException.json");
+    String moduser = "modUser";
+    List<TerritoryResponsibility> territoryResponsiblityList = JsonGeneratorBase
+            .getGson().fromJson(json, new TypeToken<List<TerritoryResponsibility>>(){}.getType());
+    ResponsibilityMapper responsibilityMappy = ResponsibilityTestHelper.createMapper();
+    responsibilityMappy.mapFromVModelList(territoryResponsiblityList, tblResponsibilityList, moduser, "confirmResponsibilities");
+  }
+  @Test( expected = BtbGone.class)
+  public void testMapFromVModelListResponsibilityOutdatedPlus1() throws BtbGone {
+    String json = super.loadStringFromResource("testResponsibilityOutdatedDataPlus.json");
+    String moduser = "modUser";
+    List<TerritoryResponsibility> territoryResponsiblityList = JsonGeneratorBase
+            .getGson().fromJson(json, new TypeToken<List<TerritoryResponsibility>>(){}.getType());
+    ResponsibilityMapper responsibilityMappy = ResponsibilityTestHelper.createMapper();
+    responsibilityMappy.mapFromVModelList(territoryResponsiblityList, tblResponsibilityList, moduser, "confirmResponsibilities");
+  }
+  @Test( expected = BtbGone.class)
+  public void testMapFromVModelListResponsibilityOutdatedMinus1() throws BtbGone {
+    String json = super.loadStringFromResource("testResponsibilityOutdatedDataMinus.json");
+    String moduser = "modUser";
+    List<TerritoryResponsibility> territoryResponsiblityList = JsonGeneratorBase
+            .getGson().fromJson(json, new TypeToken<List<TerritoryResponsibility>>(){}.getType());
+    ResponsibilityMapper responsibilityMappy = ResponsibilityTestHelper.createMapper();
+    responsibilityMappy.mapFromVModelList(territoryResponsiblityList, tblResponsibilityList, moduser, "confirmResponsibilities");
+  }
+
+}
diff --git a/src/test/java/org/eclipse/openk/elogbook/common/mapper/ResponsibilityTestHelper.java b/src/test/java/org/eclipse/openk/elogbook/common/mapper/ResponsibilityTestHelper.java
new file mode 100644
index 0000000..2c89b1c
--- /dev/null
+++ b/src/test/java/org/eclipse/openk/elogbook/common/mapper/ResponsibilityTestHelper.java
@@ -0,0 +1,64 @@
+package org.eclipse.openk.elogbook.common.mapper;
+
+
+import org.eclipse.openk.elogbook.common.mapper.ResponsibilityMapper;
+import org.eclipse.openk.elogbook.persistence.dao.RefBranchDao;
+import org.eclipse.openk.elogbook.persistence.dao.RefGridTerritoryDao;
+import org.eclipse.openk.elogbook.persistence.model.RefBranch;
+import org.eclipse.openk.elogbook.persistence.model.RefGridTerritory;
+import org.powermock.api.easymock.PowerMock;
+
+import java.util.LinkedList;
+import java.util.List;
+
+import static org.easymock.EasyMock.expect;
+import static org.easymock.EasyMock.replay;
+
+public class ResponsibilityTestHelper {
+    private static RefGridTerritory newRefGridTerritoryItem(int id, String name, String descritpion) {
+        RefGridTerritory ret = new RefGridTerritory();
+        ret.setId(id);
+        ret.setName(name);
+        ret.setDescription(descritpion);
+        return ret;
+    }
+
+    private static RefBranch newBranch(int id, String name, String description) {
+        RefBranch ret = new RefBranch();
+        ret.setId(id);
+        ret.setName(name);
+        ret.setDescription(description);
+        return ret;
+    }
+
+    private static RefGridTerritoryDao createStatusDaoMock(List<RefGridTerritory> rgtList) {
+        RefGridTerritoryDao rgtdaoMock = PowerMock.createNiceMock(RefGridTerritoryDao.class);
+        expect(rgtdaoMock.findInTx(true, -1, 0)).andReturn(rgtList);
+        replay(rgtdaoMock);
+        return rgtdaoMock;
+    }
+
+    private static RefBranchDao createBranchDaoMock(List<RefBranch> rbList) {
+        RefBranchDao rbdaoMock = PowerMock.createNiceMock(RefBranchDao.class);
+        expect(rbdaoMock.findInTx(true, -1, 0)).andReturn(rbList);
+        replay(rbdaoMock);
+        return rbdaoMock;
+    }
+
+    public static ResponsibilityMapper createMapper() {
+        List<RefGridTerritory> refGridTerritoryLinkedList = new LinkedList<>();
+        refGridTerritoryLinkedList.add(newRefGridTerritoryItem(1, "MA","Mannheim"));
+        refGridTerritoryLinkedList.add(newRefGridTerritoryItem(1, "OF","Offenbach"));
+
+        RefGridTerritoryDao rgtDao = createStatusDaoMock(refGridTerritoryLinkedList);
+
+        List<RefBranch> rbList = new LinkedList<>();
+        rbList.add(newBranch(1, "S", "Strom"));
+        rbList.add(newBranch(2, "G", "Gas"));
+        rbList.add(newBranch(3, "F", "Fernwärme"));
+        rbList.add(newBranch(4, "W", "Wasser"));
+        RefBranchDao rbDao = createBranchDaoMock(rbList);
+
+        return new ResponsibilityMapper(rgtDao, rbDao);
+    }
+}
diff --git a/src/test/java/org/eclipse/openk/elogbook/common/util/ComparatorsTest.java b/src/test/java/org/eclipse/openk/elogbook/common/util/ComparatorsTest.java
new file mode 100644
index 0000000..98f4858
--- /dev/null
+++ b/src/test/java/org/eclipse/openk/elogbook/common/util/ComparatorsTest.java
@@ -0,0 +1,31 @@
+package org.eclipse.openk.elogbook.common.util;
+
+import static org.junit.Assert.assertTrue;
+
+import org.eclipse.openk.elogbook.common.util.Comparators.TblResponsibilityIdComparator;
+import org.eclipse.openk.elogbook.persistence.model.TblResponsibility;
+import org.junit.Test;
+import org.powermock.reflect.Whitebox;
+
+public class ComparatorsTest {
+
+  @Test
+  public void testTblResponsibilityIdComparator(){
+    TblResponsibility tblResponsibility1 = new TblResponsibility();
+    tblResponsibility1.setId(1);
+    TblResponsibility tblResponsibility2 = new TblResponsibility();
+    tblResponsibility2.setId(2);
+
+    TblResponsibilityIdComparator tblResponsibilityIdComparator = new TblResponsibilityIdComparator();
+
+    int compareResult = tblResponsibilityIdComparator.compare(tblResponsibility1, tblResponsibility2);
+    assertTrue(compareResult < 0);
+
+  }
+  
+  @Test(expected = IllegalStateException.class)
+  public void testMy() throws Exception{
+	  Whitebox.invokeConstructor(Comparators.class);
+  }
+
+}
diff --git a/src/test/java/org/eclipse/openk/elogbook/common/util/HashingAlgoTest.java b/src/test/java/org/eclipse/openk/elogbook/common/util/HashingAlgoTest.java
new file mode 100644
index 0000000..951d893
--- /dev/null
+++ b/src/test/java/org/eclipse/openk/elogbook/common/util/HashingAlgoTest.java
@@ -0,0 +1,17 @@
+package org.eclipse.openk.elogbook.common.util;
+
+import static org.junit.Assert.assertNull;
+import static org.junit.Assert.assertTrue;
+
+import java.util.Objects;
+import org.junit.Test;
+
+public class HashingAlgoTest {
+	@Test
+	public void testHashIt() {
+		String hash = HashingAlgo.hashIt("TestMe");
+		assertTrue("66d565a2eb74e1a20b6c12bb2cbf84ecaade84ec".equals(hash));
+		assertTrue(!Objects.equals(HashingAlgo.hashIt("ThisIsTest"), HashingAlgo.hashIt("thisIsATest")));
+		assertNull(HashingAlgo.hashIt(null));
+	}
+}
diff --git a/src/test/java/org/eclipse/openk/elogbook/common/util/ResourceLoaderBaseTest.java b/src/test/java/org/eclipse/openk/elogbook/common/util/ResourceLoaderBaseTest.java
new file mode 100644
index 0000000..7ecfed4
--- /dev/null
+++ b/src/test/java/org/eclipse/openk/elogbook/common/util/ResourceLoaderBaseTest.java
@@ -0,0 +1,15 @@
+package org.eclipse.openk.elogbook.common.util;
+
+
+import static org.junit.Assert.assertEquals;
+
+import org.junit.Test;
+
+public class ResourceLoaderBaseTest {
+    @Test
+    public void testloadStringFromResourceError() {
+        ResourceLoaderBase rlb = new ResourceLoaderBase();
+        String str = rlb.loadStringFromResource("UNKNOWN_FILE");
+        assertEquals(str, "");
+    }
+}
diff --git a/src/test/java/org/eclipse/openk/elogbook/controller/BackendControllerNotificationFileTest.java b/src/test/java/org/eclipse/openk/elogbook/controller/BackendControllerNotificationFileTest.java
new file mode 100644
index 0000000..95faefa
--- /dev/null
+++ b/src/test/java/org/eclipse/openk/elogbook/controller/BackendControllerNotificationFileTest.java
@@ -0,0 +1,96 @@
+package org.eclipse.openk.elogbook.controller;
+
+import org.eclipse.openk.elogbook.common.BackendConfig;
+import org.eclipse.openk.elogbook.exceptions.BtbInternalServerError;
+import org.eclipse.openk.elogbook.viewmodel.NotificationFile;
+import org.junit.Test;
+import org.powermock.reflect.Whitebox;
+
+import java.io.File;
+import java.nio.charset.Charset;
+import java.nio.file.Files;
+import java.nio.file.Path;
+import java.nio.file.Paths;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
+
+public class BackendControllerNotificationFileTest{
+
+    private static int fileRowToRead = BackendConfig.getInstance().getFileRowToRead();
+    BackendControllerNotificationFile backConF = new BackendControllerNotificationFile();
+
+    @Test
+    public void testGetNotificationFiles_Exception() throws BtbInternalServerError {
+        backConF.getNotificationsFiles("getImportFiles");
+    }
+
+    @Test
+    public void testGetNotificationsFiles() throws Exception {
+
+        File[] listOfFiles = new File[1];
+        File file = File.createTempFile( "testFile", ".txt");
+        List<String> lines = Arrays.asList("line MA test", "line MA test", "line MA test", "line MA test", "line MA test", "line MA test", "line MA test", "line MA test", "line MA test", "line MA test");
+
+        listOfFiles[0] = file;
+
+        if (listOfFiles != null)
+        {
+            List<NotificationFile> notFiles = backConF.getNotificationsFiles("choice");
+            Whitebox.invokeMethod(backConF, "processChoiceGetNotificationFilesWithChoice", "getImportFiles", notFiles, listOfFiles);
+
+            Path filePath = Paths.get(listOfFiles[0].toString());
+            Files.write(filePath, lines);
+            List<String> allTheLines = Files.readAllLines(filePath, Charset.defaultCharset());
+            if (allTheLines.size() >= fileRowToRead)
+            {
+                Whitebox.invokeMethod(backConF, "processChoiceGetNotificationFilesWithChoice", "importFile", notFiles, listOfFiles);
+
+            }
+        }
+        file.deleteOnExit();
+    }
+
+
+    @Test
+    public void testExtractFileData() throws Exception {
+
+        NotificationFile nf = new NotificationFile();
+        List<String> lines = new ArrayList<>();
+        String line = "10:10:51,425 ME Text";
+        String line2 = "10:10:51,425 OW Text";
+        for (int i=0; i<5; i++)
+        {
+            lines.add(line);
+        }
+        for (int i=6; i<10; i++)
+        {
+            lines.add(line2);
+        }
+        lines.add("10:10:51,425 XX Text"); // unknown branch
+
+        Whitebox.invokeMethod(backConF, "extractFileData", nf, lines);
+
+        String[] splitedLine = line.split("\\s+", 3);
+
+        List<String> branchAndTerritory = Whitebox.invokeMethod(backConF, "findBranchAndTerritory", splitedLine[1]);
+
+        if (nf != null) {
+            nf.setGridTerritoryName(branchAndTerritory.get(0));
+            nf.setBranchName(branchAndTerritory.get(1));
+            nf.setNotificationText(splitedLine[2]);
+        }
+
+
+    }
+
+
+	@Test
+	public void testDeleteNotificationsFile() {
+
+		String fileName = "name";
+		BackendControllerNotificationFile backendControllerNotificationFile = new BackendControllerNotificationFile();
+		backendControllerNotificationFile.deleteImportedFile(fileName);
+
+	}
+}
diff --git a/src/test/java/org/eclipse/openk/elogbook/controller/BackendControllerTest.java b/src/test/java/org/eclipse/openk/elogbook/controller/BackendControllerTest.java
new file mode 100644
index 0000000..408d07a
--- /dev/null
+++ b/src/test/java/org/eclipse/openk/elogbook/controller/BackendControllerTest.java
@@ -0,0 +1,351 @@
+package org.eclipse.openk.elogbook.controller;
+
+import static org.easymock.EasyMock.anyObject;
+import static org.easymock.EasyMock.expect;
+import static org.easymock.EasyMock.expectLastCall;
+import static org.easymock.EasyMock.replay;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertTrue;
+
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.List;
+
+import org.eclipse.openk.elogbook.common.JsonGeneratorBase;
+import org.eclipse.openk.elogbook.common.mapper.NotificationMapper;
+import org.eclipse.openk.elogbook.common.util.ResourceLoaderBase;
+import org.eclipse.openk.elogbook.exceptions.BtbInternalServerError;
+import org.eclipse.openk.elogbook.exceptions.BtbLocked;
+import org.eclipse.openk.elogbook.exceptions.BtbUnauthorized;
+import org.eclipse.openk.elogbook.persistence.dao.HTblResponsibilityDao;
+import org.eclipse.openk.elogbook.persistence.dao.RefVersionDao;
+import org.eclipse.openk.elogbook.persistence.dao.TblNotificationDao;
+import org.eclipse.openk.elogbook.persistence.dao.TblResponsibilityDao;
+import org.eclipse.openk.elogbook.persistence.model.HTblResponsibility;
+import org.eclipse.openk.elogbook.persistence.model.RefBranch;
+import org.eclipse.openk.elogbook.persistence.model.RefGridTerritory;
+import org.eclipse.openk.elogbook.persistence.model.RefNotificationStatus;
+import org.eclipse.openk.elogbook.persistence.model.RefVersion;
+import org.eclipse.openk.elogbook.persistence.model.TblNotification;
+import org.eclipse.openk.elogbook.persistence.model.TblResponsibility;
+import org.eclipse.openk.elogbook.viewmodel.HistoricalShiftChanges;
+import org.eclipse.openk.elogbook.viewmodel.LoginCredentials;
+import org.eclipse.openk.elogbook.viewmodel.Notification;
+import org.eclipse.openk.elogbook.viewmodel.NotificationSearchFilter;
+import org.eclipse.openk.elogbook.viewmodel.ReminderSearchFilter;
+import org.eclipse.openk.elogbook.viewmodel.UserAuthentication;
+import org.eclipse.openk.elogbook.viewmodel.VersionInfo;
+import org.junit.Ignore;
+import org.junit.Test;
+import org.powermock.api.easymock.PowerMock;
+import org.powermock.reflect.Whitebox;
+
+public class BackendControllerTest  extends ResourceLoaderBase {
+
+    //FIXME resolve Tests
+    @Ignore
+    @Test
+    public void testGetUsers() throws Exception {
+        BackendControllerUser bec = new BackendControllerUser();
+        List<UserAuthentication> userAuthenticationList = bec.getUsers("");
+
+        assertNotNull(userAuthenticationList);
+        assertTrue(userAuthenticationList.size()== 5);
+        assertEquals(userAuthenticationList.get(0).getId(), 1);
+        assertEquals(userAuthenticationList.get(0).getUsername(), "max");
+        assertEquals(userAuthenticationList.get(0).getPassword(), "max");
+        assertEquals(userAuthenticationList.get(0).isSpecialUser(), false);
+        assertEquals(userAuthenticationList.get(0).isSelected(), false);
+        assertEquals(userAuthenticationList.get(2).getId(), 3);
+
+    }
+
+    //FIXME resolve Tests
+    @Ignore
+    @Test
+    public void testAuthenticateUser() throws Exception {
+        BackendControllerUser bec = new BackendControllerUser();
+        LoginCredentials lcr= new LoginCredentials();
+        lcr.setUserName("max");
+        lcr.setPassword("max");
+
+        UserAuthentication ua = bec.authenticate(JsonGeneratorBase.getGson().toJson(lcr));
+        assertNotNull(ua);
+        assertEquals(ua.getUsername(), lcr.getUserName());
+        assertEquals(ua.getPassword(), lcr.getPassword());
+    }
+
+    //FIXME resolve Tests
+    @Ignore
+    @Test( expected = BtbUnauthorized.class )
+    public void testAuthenticateUser_UnknownUser() throws Exception {
+        BackendControllerUser bec = new BackendControllerUser();
+        LoginCredentials lcr= new LoginCredentials();
+        lcr.setUserName("Unknown");
+        lcr.setPassword("max");
+
+        bec.authenticate(JsonGeneratorBase.getGson().toJson(lcr));
+    }
+
+    //FIXME resolve Tests
+    @Ignore
+    @Test( expected = BtbUnauthorized.class )
+    public void testAuthenticateUser_UnknownPassword() throws Exception {
+        BackendControllerUser bec = new BackendControllerUser();
+        LoginCredentials lcr= new LoginCredentials();
+        lcr.setUserName("max");
+        lcr.setPassword("Unknown");
+
+        bec.authenticate(JsonGeneratorBase.getGson().toJson(lcr));
+    }
+
+    @Test
+    public void testGetVersionInfoImpl_OK() throws Exception {
+        RefVersion rv = new RefVersion();
+        rv.setId(1);
+        rv.setVersion("-666-");
+        String backendVersion = "-888-";
+        RefVersionDao daoMock = PowerMock.createNiceMock(RefVersionDao.class);
+        expect(daoMock.getVersionInTx()).andReturn(rv);
+        replay(daoMock);
+        BackendControllerVersionInfo bec = new BackendControllerVersionInfo();
+        VersionInfo vi = Whitebox.invokeMethod(bec, "getVersionInfoImpl", daoMock, backendVersion);
+        assertEquals(vi.getBackendVersion(), backendVersion);
+        assertEquals(vi.getDbVersion(), "-666-");
+    }
+
+    @Test
+    public void testGetVersionInfoImpl_NODB() throws Exception {
+        String backendVersion = "-888-";
+        RefVersionDao daoMock = PowerMock.createNiceMock(RefVersionDao.class);
+        expect(daoMock.getVersionInTx()).andReturn(null);
+        replay(daoMock);
+        BackendControllerVersionInfo bec = new BackendControllerVersionInfo();
+        VersionInfo vi = Whitebox.invokeMethod(bec, "getVersionInfoImpl", daoMock, backendVersion);
+        assertEquals(vi.getDbVersion(), "NO_DB");
+    }
+
+
+    @Test
+    public void testStoreNotificationInDB_Insert() throws Exception {
+        Notification not = new Notification();
+        not.setId(null);
+        not.setIncidentId(null);  // should be ignored later on because these fields are set by the db
+        not.setVersion(222); // should be ignored later on because these fields are set by the db
+        not.setFkRefNotificationStatus(2);
+        not.setFkRefBranch(1);
+        not.setNotificationText("myTextYourText");
+        not.setFkRefGridTerritory(1);
+
+        RefBranch rb = new RefBranch();
+        rb.setId(1);
+        rb.setName("NamosUnos");
+        rb.setDescription("Descriptore");
+        RefNotificationStatus rns = new RefNotificationStatus();
+        rns.setId(2);
+        rns.setName("NamosDos");
+
+        TblNotification notificationFromDB = new TblNotification();
+        notificationFromDB.setId(43);
+        notificationFromDB.setIncidentId(1);
+        notificationFromDB.setVersion(1);
+        notificationFromDB.setRefBranch(rb);
+        notificationFromDB.setRefNotificationStatus(rns);
+        notificationFromDB.setNotificationText("myTextYourText");
+        notificationFromDB.setRefGridTerritory(createRefGridTerritory());
+        NotificationMapper mappy = NotificationTestHelper.createMapper();
+        TblNotificationDao daoMock = PowerMock.createNiceMock(TblNotificationDao.class);
+        //expect(daoMock.storeInTx(isA(TblNotification.class))).andReturn(notificationFromDB);
+        //expect(daoMock.persistInTx(isA(TblNotification.class))).andVoid();
+        replay(daoMock);
+        BackendControllerNotification bec = new BackendControllerNotification();
+
+        Notification testable = Whitebox.invokeMethod(bec, "storeNotificationInDB", not, daoMock, mappy, "moddy");
+        /*assertEquals((Integer)43, (Integer)testable.getId());
+        assertEquals((Integer)1, (Integer)testable.getIncidentId());
+        assertEquals((Integer)1, (Integer)testable.getVersion());
+        assertEquals(not.getNotificationText(), testable.getNotificationText());*/ //todo
+
+    }
+
+
+    @Test
+    public void testStoreNotificationInDB_Update() throws Exception {
+        Notification not = new Notification();
+        not.setId(22);
+        not.setIncidentId(333);  // should be ignored later on because these fields are set by the db
+        not.setVersion(222); // should be ignored later on because these fields are set by the db
+        not.setFkRefNotificationStatus(2);
+        not.setFkRefBranch(1);
+        not.setFkRefGridTerritory(1);
+        not.setNotificationText("myTextYourText");
+
+        RefBranch rb = new RefBranch();
+        rb.setId(1);
+        rb.setName("NamosUnos");
+        rb.setDescription("Descriptore");
+        RefNotificationStatus rns = new RefNotificationStatus();
+        rns.setId(2);
+        rns.setName("NamosDos");
+
+        TblNotification notificationFromDB = new TblNotification();
+        notificationFromDB.setId(43);
+        notificationFromDB.setIncidentId(1);
+        notificationFromDB.setVersion(1);
+        notificationFromDB.setRefBranch(rb);
+        notificationFromDB.setRefNotificationStatus(rns);
+        notificationFromDB.setNotificationText("myTextYourText");
+        notificationFromDB.setRefGridTerritory(createRefGridTerritory());
+        NotificationMapper mappy = NotificationTestHelper.createMapper();
+        TblNotificationDao daoMock = PowerMock.createNiceMock(TblNotificationDao.class);
+        //expect(daoMock.storeInTx(isA(TblNotification.class))).andReturn(notificationFromDB);
+        //expect(daoMock.persistInTx(isA(TblNotification.class))).andVoid();
+        replay(daoMock);
+        BackendControllerNotification bec = new BackendControllerNotification();
+
+        Notification testable = Whitebox.invokeMethod(bec, "storeNotificationInDB", not, daoMock, mappy, "moddy");
+
+
+    }
+
+
+    @Test(expected = Exception.class)
+    public void testStoreNotificationInDB_Exception() throws Exception {
+        Notification not = new Notification();
+        not.setId(22);
+        not.setIncidentId(333);  // should be ignored later on because these fields are set by the db
+        not.setVersion(222); // should be ignored later on because these fields are set by the db
+        not.setFkRefNotificationStatus(2);
+        not.setFkRefBranch(1);
+        not.setNotificationText("myTextYourText");
+
+        RefBranch rb = new RefBranch();
+        rb.setId(1);
+        rb.setName("NamosUnos");
+        rb.setDescription("Descriptore");
+        RefNotificationStatus rns = new RefNotificationStatus();
+        rns.setId(2);
+        rns.setName("NamosDos");
+
+        TblNotification notificationFromDB = new TblNotification();
+        notificationFromDB.setId(43);
+        notificationFromDB.setIncidentId(1);
+        notificationFromDB.setVersion(1);
+        notificationFromDB.setRefBranch(rb);
+        notificationFromDB.setRefNotificationStatus(rns);
+        notificationFromDB.setNotificationText("myTextYourText");
+        NotificationMapper mappy = NotificationTestHelper.createMapper();
+        TblNotificationDao daoMock = PowerMock.createNiceMock(TblNotificationDao.class);
+        //expect(daoMock.storeInTx(isA(TblNotification.class))).andReturn(notificationFromDB);
+        daoMock.persistInTx(anyObject());
+        expectLastCall().andThrow(new Exception());
+        replay(daoMock);
+        BackendControllerNotification bec = new BackendControllerNotification();
+
+        Notification testable = Whitebox.invokeMethod(bec, "storeNotificationInDB", not, daoMock, mappy, "moddy");
+    }
+
+    @Test(expected = BtbLocked.class)
+    public void testCreateNotification_locked() throws Exception {
+        // todo test with tblNotification instead of view model notification
+        throw new BtbLocked();
+        /*
+        String json = super.loadStringFromResource("testLockedNotification.json");
+        TblNotification noti = JsonGeneratorBase.getGson().fromJson(json, Notification.class);
+
+        IBackendController bec = new IBackendController();
+        Whitebox.invokeMethod(bec, "checkBlockedNotification", noti);
+        */
+    }
+	@Test
+	public void testGetNotificationListByType() throws Exception {
+		List<TblNotification> futureList = new ArrayList<>();
+		futureList.add(new TblNotification());
+
+		List<TblNotification> openList = new ArrayList<>();
+		openList.add(new TblNotification());
+		openList.add(new TblNotification());
+
+		List<TblNotification> pastList = new ArrayList<>();
+		pastList.add(new TblNotification());
+		pastList.add(new TblNotification());
+		pastList.add(new TblNotification());
+
+		List<TblResponsibility> responsibilityList = new ArrayList<>();
+		responsibilityList.add(new TblResponsibility());
+		responsibilityList.add(new TblResponsibility());
+
+		TblNotificationDao tblNotificationDaoMock = PowerMock.createNiceMock(TblNotificationDao.class);
+		expect(tblNotificationDaoMock.getFutureNotifications(null, new ArrayList<TblResponsibility>())).andReturn(futureList);
+
+		expect(tblNotificationDaoMock.getOpenNotifications(new NotificationSearchFilter(), new ArrayList<TblResponsibility>())).andReturn(openList);
+		expect(tblNotificationDaoMock.getPastNotifications(null, new ArrayList<TblResponsibility>())).andReturn(pastList);
+		replay(tblNotificationDaoMock);
+		TblResponsibilityDao tblResponsibilityDaoMock = PowerMock.createNiceMock(TblResponsibilityDao.class);
+
+		BackendControllerNotification bec = new BackendControllerNotification();
+
+		assertTrue(0 == ((List<TblNotification>) Whitebox.invokeMethod(bec, "getNotificationListByType",
+				tblResponsibilityDaoMock, tblNotificationDaoMock, Notification.ListType.ALL, null)).size());
+		// ALL is currently not returned by this function and ends in the
+		// default case with an empty List
+
+		assertTrue(1 == ((List<TblNotification>) Whitebox.invokeMethod(bec, "getNotificationListByType",
+				tblResponsibilityDaoMock, tblNotificationDaoMock, Notification.ListType.FUTURE, null)).size());
+		//TODO creating Mock for ResponsibilityDao to fix this test
+		//assertTrue(2 == ((List<TblNotification>) Whitebox.invokeMethod(bec, "getNotificationListByType",
+		//		tblResponsibilityDaoMock, tblNotificationDaoMock, Notification.ListType.OPEN, new NotificationSearchFilter())).size());
+		assertTrue(3 == ((List<TblNotification>) Whitebox.invokeMethod(bec, "getNotificationListByType",
+				tblResponsibilityDaoMock, tblNotificationDaoMock, Notification.ListType.PAST, null)).size());
+
+	}
+
+    private RefGridTerritory createRefGridTerritory() {
+    	RefGridTerritory refGridTerritory = new RefGridTerritory();
+    	refGridTerritory.setId(1);
+    	refGridTerritory.setDescription("MA");
+    	refGridTerritory.setName("Mannheim");
+    	RefGridTerritory refMaster = new RefGridTerritory();
+    	refMaster.setId(1);
+    	refGridTerritory.setRefMaster(refMaster);
+    	return refGridTerritory;
+    }
+    
+	@Test
+	public void testGetHistoricalShiftChanges() throws BtbInternalServerError {
+		HistoricalShiftChanges historicalShiftChanges = new HistoricalShiftChanges();
+		Date now = new Date();
+		historicalShiftChanges.setTransferDateFrom(now);
+		historicalShiftChanges.setTransferDateTo(now);
+
+		List<HTblResponsibility> hTblResponsibilities = new ArrayList<>();
+		hTblResponsibilities.add(new HTblResponsibility());
+		hTblResponsibilities.add(new HTblResponsibility());
+		
+
+		HTblResponsibilityDao daoMock = PowerMock.createNiceMock(HTblResponsibilityDao.class);
+
+		expect(daoMock.findHTblResponsibilitiesInPeriod(historicalShiftChanges.getTransferDateFrom(),
+				historicalShiftChanges.getTransferDateTo())).andReturn(hTblResponsibilities);
+
+	}
+
+    @Test
+    public void testGetNotificationsWithReminder() throws BtbInternalServerError {
+        Notification notification = new Notification();
+        Date now = new Date();
+        notification.setReminderDate(now);
+        ReminderSearchFilter nsf = new ReminderSearchFilter();
+        List<TblResponsibility> tblResponsibilities = new ArrayList<>();
+
+        List<TblNotification> notifications = new ArrayList<>();
+        notifications.add(new TblNotification());
+
+        TblNotificationDao daoMock = PowerMock.createNiceMock(TblNotificationDao.class);
+
+        expect(daoMock.getNotificationsWithReminder(nsf, tblResponsibilities)).andReturn(notifications);
+
+    }
+
+}
diff --git a/src/test/java/org/eclipse/openk/elogbook/controller/BaseWebServiceTest.java b/src/test/java/org/eclipse/openk/elogbook/controller/BaseWebServiceTest.java
new file mode 100644
index 0000000..91ba639
--- /dev/null
+++ b/src/test/java/org/eclipse/openk/elogbook/controller/BaseWebServiceTest.java
@@ -0,0 +1,256 @@
+package org.eclipse.openk.elogbook.controller;
+
+import org.apache.http.HttpStatus;
+import org.eclipse.openk.elogbook.auth2.model.JwtToken;
+import org.eclipse.openk.elogbook.common.JsonGeneratorBase;
+import org.eclipse.openk.elogbook.common.util.ResourceLoaderBase;
+import org.eclipse.openk.elogbook.controller.BaseWebService.SecureType;
+import org.eclipse.openk.elogbook.exceptions.BtbBadRequest;
+import org.eclipse.openk.elogbook.exceptions.BtbException;
+import org.eclipse.openk.elogbook.exceptions.BtbUnauthorized;
+import org.junit.Assert;
+import org.junit.Test;
+
+import javax.ws.rs.core.*;
+import java.lang.annotation.Annotation;
+import java.net.URI;
+import java.util.Date;
+import java.util.Locale;
+import java.util.Map;
+import java.util.Set;
+
+import static org.junit.Assert.*;
+
+public class BaseWebServiceTest extends ResourceLoaderBase {
+	private static final org.apache.log4j.Logger EMPTYLOGGER = org.apache.log4j.Logger
+			.getLogger(BaseWebServiceTest.class.getName());
+
+	String json = super.loadStringFromResource("JwtAdmin.json");
+	JwtToken jwtToken = JsonGeneratorBase.getGson().fromJson(json, JwtToken.class);
+
+	public static class TestWebService extends BaseWebService {
+		public String sessionId;
+		public String cookieId;
+		public boolean throwUnauthException = false;
+
+		public TestWebService() {
+			super(EMPTYLOGGER);
+		}
+
+		@Override
+		protected void assertAndRefreshToken(String token, SecureType secureType) throws BtbException {
+			if (throwUnauthException) {
+				throw new BtbUnauthorized();
+			} else {
+				this.sessionId = token;
+			}
+		}
+
+	}
+
+	public static class TestInvokable extends BackendInvokable {
+		public boolean isInvoked = false;
+		public BtbException exceptionToThrow = null;
+		public boolean throwRuntime = false;
+		public Response response = null;
+
+		@Override
+		public Response invoke() throws BtbException {
+			if (exceptionToThrow != null) {
+				throw exceptionToThrow;
+			}
+			if (throwRuntime) {
+				((String) null).equals("error"); //NOSONAR
+			}
+			isInvoked = true;
+			return response;
+		}
+	}
+	
+	@Test
+	public void testInvokeException() {
+		TestWebService tws = new TestWebService();
+		TestInvokable ti = new TestInvokable();
+
+		ti.exceptionToThrow = new BtbBadRequest();
+		Response ret = tws.invoke(jwtToken.getAccessToken(), BaseWebService.SecureType.NORMAL, ti);
+		Assert.assertEquals(ret.getStatus(), HttpStatus.SC_BAD_REQUEST);
+	}
+
+	@Test
+	public void testInvokeRuntimeException() {
+		TestWebService tws = new TestWebService();
+		TestInvokable ti = new TestInvokable();
+
+		ti.throwRuntime = true;
+		Response ret = tws.invoke(jwtToken.getAccessToken(), BaseWebService.SecureType.NORMAL, ti);
+		assertEquals(ret.getStatus(), HttpStatus.SC_INTERNAL_SERVER_ERROR);
+	}
+
+	@Test
+	public void testUnauthException() {
+		TestWebService tws = new TestWebService();
+		TestInvokable ti = new TestInvokable();
+		tws.throwUnauthException = true;
+		Response ret = tws.invoke(jwtToken.getAccessToken(), BaseWebService.SecureType.NORMAL, ti);
+		assertEquals(ret.getStatus(), HttpStatus.SC_UNAUTHORIZED);
+	}
+
+	@Test
+	public void testSecureTypeNone() {
+		TestWebService tws = new TestWebService();
+		TestInvokable ti = new TestInvokable();
+		Response responseForTypeNONE = tws.invoke(jwtToken.getAccessToken(), SecureType.NONE, ti);
+		Response responseForTypeHIGH = tws.invoke(jwtToken.getAccessToken(), SecureType.HIGH, ti);
+		Response responseForTypeNORMAL = tws.invoke(jwtToken.getAccessToken(), SecureType.NORMAL, ti);
+		assertNull(responseForTypeNONE);
+		assertNull(responseForTypeHIGH);
+		assertNull(responseForTypeNORMAL);
+	}
+
+
+	@Test
+	public void testInvokation() {
+		TestWebService tws = new TestWebService();
+		TestInvokable ti = new TestInvokable();
+		ti.response = new Response() {
+			@Override
+			public Object getEntity() {
+				return null;
+			}
+
+			@Override
+			public <T> T readEntity(Class<T> aClass) {
+				return null;
+			}
+
+			@Override
+			public <T> T readEntity(GenericType<T> genericType) {
+				return null;
+			}
+
+			@Override
+			public <T> T readEntity(Class<T> aClass, Annotation[] annotations) {
+				return null;
+			}
+
+			@Override
+			public <T> T readEntity(GenericType<T> genericType, Annotation[] annotations) {
+				return null;
+			}
+
+			@Override
+			public boolean hasEntity() {
+				return false;
+			}
+
+			@Override
+			public boolean bufferEntity() {
+				return false;
+			}
+
+			@Override
+			public void close() {
+
+			}
+
+			@Override
+			public MediaType getMediaType() {
+				return null;
+			}
+
+			@Override
+			public Locale getLanguage() {
+				return null;
+			}
+
+			@Override
+			public int getLength() {
+				return 0;
+			}
+
+			@Override
+			public Set<String> getAllowedMethods() {
+				return null;
+			}
+
+			@Override
+			public Map<String, NewCookie> getCookies() {
+				return null;
+			}
+
+			@Override
+			public EntityTag getEntityTag() {
+				return null;
+			}
+
+			@Override
+			public Date getDate() {
+				return null;
+			}
+
+			@Override
+			public Date getLastModified() {
+				return null;
+			}
+
+			@Override
+			public URI getLocation() {
+				return null;
+			}
+
+			@Override
+			public Set<Link> getLinks() {
+				return null;
+			}
+
+			@Override
+			public boolean hasLink(String s) {
+				return false;
+			}
+
+			@Override
+			public Link getLink(String s) {
+				return null;
+			}
+
+			@Override
+			public Link.Builder getLinkBuilder(String s) {
+				return null;
+			}
+
+			@Override
+			public int getStatus() {
+				return 666;
+			}
+
+			@Override
+			public StatusType getStatusInfo() {
+				return null;
+			}
+
+			@Override
+			public MultivaluedMap<String, Object> getMetadata() {
+				return null;
+			}
+
+			@Override
+			public MultivaluedMap<String, String> getStringHeaders() {
+				return null;
+			}
+
+			@Override
+			public String getHeaderString(String s) {
+				return null;
+			}
+		};
+
+		Response ret = tws.invoke(jwtToken.getAccessToken(), BaseWebService.SecureType.NORMAL, ti);
+		assertTrue(ti.isInvoked);
+		assertEquals(tws.sessionId, jwtToken.getAccessToken());
+		assertEquals(tws.cookieId, null);
+		assertEquals(ret.getStatus(), 666);
+
+	}
+
+}
diff --git a/src/test/java/org/eclipse/openk/elogbook/controller/ControllerImplementationsTest.java b/src/test/java/org/eclipse/openk/elogbook/controller/ControllerImplementationsTest.java
new file mode 100644
index 0000000..8c324b8
--- /dev/null
+++ b/src/test/java/org/eclipse/openk/elogbook/controller/ControllerImplementationsTest.java
@@ -0,0 +1,408 @@
+package org.eclipse.openk.elogbook.controller;
+
+//TODO create Mock for ControllerImplementations (must not use BackendController)
+
+import junit.framework.TestCase;
+import org.apache.http.HttpStatus;
+import org.eclipse.openk.elogbook.common.util.ResourceLoaderBase;
+import org.eclipse.openk.elogbook.controller.ControllerImplementations.GetAllResponsibilities;
+import org.eclipse.openk.elogbook.controller.ControllerImplementations.GetCurrentResponsibilities;
+import org.eclipse.openk.elogbook.controller.ControllerImplementations.GetIsObserver;
+import org.eclipse.openk.elogbook.controller.ControllerImplementations.GetPlannedResponsibilities;
+import org.eclipse.openk.elogbook.exceptions.BtbBadRequest;
+import org.eclipse.openk.elogbook.exceptions.BtbException;
+import org.eclipse.openk.elogbook.persistence.model.RefBranch;
+import org.eclipse.openk.elogbook.persistence.model.RefGridTerritory;
+import org.eclipse.openk.elogbook.persistence.model.RefNotificationStatus;
+import org.eclipse.openk.elogbook.viewmodel.HistoricalShiftChanges;
+import org.eclipse.openk.elogbook.viewmodel.Notification;
+import org.eclipse.openk.elogbook.viewmodel.TerritoryResponsibility;
+import org.eclipse.openk.elogbook.viewmodel.VersionInfo;
+import org.junit.Before;
+import org.junit.Test;
+import org.powermock.api.easymock.PowerMock;
+
+import javax.ws.rs.core.Response;
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.LinkedList;
+import java.util.List;
+
+import static junit.framework.TestCase.assertEquals;
+import static org.easymock.EasyMock.*;
+
+
+public class ControllerImplementationsTest extends ResourceLoaderBase {
+    private BackendControllerResponsibility beMockResponsibility;
+    private BackendControllerNotification beMockNotification;
+    private BackendControllerNotificationFile beMockNotificationFile;
+    private BackendControllerUser beMockUser;
+    private BackendControllerVersionInfo beMockVersionInfo;
+    private BackendControllerRefInfo beMockRefInfo;
+    private BackendControllerUser beMockBackendControllerUser;;
+    
+    @Before
+    public void prepareTests() {
+        beMockResponsibility = PowerMock.createNiceMock(BackendControllerResponsibility.class);
+        beMockNotification = PowerMock.createNiceMock(BackendControllerNotification.class);
+        beMockNotificationFile = PowerMock.createNiceMock(BackendControllerNotificationFile.class);
+        beMockUser = PowerMock.createNiceMock(BackendControllerUser.class);
+        beMockVersionInfo = PowerMock.createNiceMock(BackendControllerVersionInfo.class);
+        beMockRefInfo = PowerMock.createNiceMock(BackendControllerRefInfo.class);
+        beMockBackendControllerUser = PowerMock.createMock(BackendControllerUser.class);
+    }
+
+    @Test
+    public void testGetCurrentReponsibilities() throws BtbException {
+        List<TerritoryResponsibility> emptyList = new LinkedList<>();
+
+        GetCurrentResponsibilities controllerImpl = new GetCurrentResponsibilities(beMockResponsibility);
+        controllerImpl.setModUser( "modUserTest" );
+        expect(beMockResponsibility.getCurrentResponsibilities("modUserTest" )).andReturn(emptyList);
+        PowerMock.replay(beMockResponsibility);
+
+        TestCase.assertEquals(controllerImpl.invoke().getStatus(), HttpStatus.SC_OK);
+    }
+
+    @Test
+    public void testGetPlannedReponsibilities() throws BtbException {
+        List<TerritoryResponsibility> emptyList = new LinkedList<>();
+
+        GetPlannedResponsibilities controllerImpl = new GetPlannedResponsibilities(beMockResponsibility);
+        controllerImpl.setModUser( "modUserTest" );
+        expect(beMockResponsibility.getPlannedResponsibilities("modUserTest" )).andReturn(emptyList);
+        PowerMock.replay(beMockResponsibility);
+
+        TestCase.assertEquals(controllerImpl.invoke().getStatus(), HttpStatus.SC_OK);
+    }
+
+    @Test
+    public void testGetAllResponsibilities() throws BtbException {
+        List<TerritoryResponsibility> allResponsibilitiesList = new LinkedList<>();
+
+        GetAllResponsibilities controllerImpl = new GetAllResponsibilities(beMockResponsibility);
+        expect(beMockResponsibility.getAllResponsibilities()).andReturn(allResponsibilitiesList);
+        PowerMock.replay(beMockResponsibility);
+
+        assertEquals(controllerImpl.invoke().getStatus(), HttpStatus.SC_OK);
+    }
+
+	@Test
+	public void testGetHistoricalResponsibilitiesByTransactionId() throws BtbException {
+		String id = "1";
+		List<TerritoryResponsibility> territoryResponsibilities = new LinkedList<>();
+		ControllerImplementations.GetHistoricalResponsibilitiesByTransactionId controllerImpl = new ControllerImplementations.GetHistoricalResponsibilitiesByTransactionId(
+				id, beMockResponsibility);
+
+		expect(beMockResponsibility.getHistoricalResponsibilitiesByTransactionId(anyObject())).andReturn(territoryResponsibilities);
+		PowerMock.replay(beMockResponsibility);
+
+		assertEquals(controllerImpl.invoke().getStatus(), HttpStatus.SC_OK);
+	}
+    
+    @Test
+    public void testSearchResults() throws BtbException {
+        String gsf = "";
+        List<Notification> notifications = new ArrayList<>();
+        ControllerImplementations.GetSearchResults controllerImpl = new ControllerImplementations.GetSearchResults(gsf, beMockNotification);
+
+        expect(beMockNotification.getSearchResults(anyObject())).andReturn(notifications);
+        PowerMock.replay(beMockNotification);
+
+        assertEquals(controllerImpl.invoke().getStatus(), HttpStatus.SC_OK);
+    }
+
+    @Test
+    public void testGetNotifications() throws BtbException {
+        List<Notification> emptyList = new LinkedList<>();
+
+        ControllerImplementations.GetNotifications controllerImpl = new ControllerImplementations.GetNotifications("OPEN", null, beMockNotification);
+        controllerImpl.setModUser("EgalUser");
+        controllerImpl.setUserId(1);
+        expect(beMockNotification.getNotifications(Notification.ListType.OPEN, null)).andReturn(emptyList);
+        PowerMock.replay(beMockNotification);
+        assertEquals(controllerImpl.invoke().getStatus(), HttpStatus.SC_OK);
+        assertEquals(controllerImpl.getModUser(), "EgalUser");
+        assertEquals(controllerImpl.getUserId(), 1);
+    }
+
+    @Test
+    public void testGetCurrentReminders() throws BtbException {
+        List<Notification> notificationsWithReminderList = new LinkedList<>();
+        String emptyFilter = "";
+
+        ControllerImplementations.GetCurrentReminders controllerImpl = new ControllerImplementations.GetCurrentReminders(emptyFilter, beMockNotification);
+        controllerImpl.setModUser("EgalUser");
+        controllerImpl.setUserId(1);
+        expect(beMockNotification.getNotificationsWithReminder(null)).andReturn(notificationsWithReminderList);
+        PowerMock.replay(beMockNotification);
+
+        assertEquals(controllerImpl.invoke().getStatus(), HttpStatus.SC_OK);
+        assertEquals(controllerImpl.getModUser(), "EgalUser");
+        assertEquals(controllerImpl.getUserId(), 1);
+    }
+
+	@Test
+	public void testGetHistoricalShiftChangesList() throws BtbException {
+		HistoricalShiftChanges historicalShiftChanges = new HistoricalShiftChanges();
+		String emptyFilter = "";
+
+		ControllerImplementations.GetHistoricalShiftChangeList controllerImpl = new ControllerImplementations.GetHistoricalShiftChangeList(
+				emptyFilter, beMockResponsibility);
+		controllerImpl.setModUser("EgalUser");
+		controllerImpl.setUserId(1);
+		expect(beMockResponsibility.getHistoricalShiftChanges(null)).andReturn(historicalShiftChanges);
+		PowerMock.replay(beMockResponsibility);
+
+		assertEquals(controllerImpl.invoke().getStatus(), HttpStatus.SC_OK);
+		assertEquals(controllerImpl.getModUser(), "EgalUser");
+		assertEquals(controllerImpl.getUserId(), 1);
+	}
+
+    @Test
+    public void testGetIsObserver() throws BtbException {
+        boolean isObserver = false;
+
+        GetIsObserver controllerImpl = new GetIsObserver(beMockResponsibility);
+        controllerImpl.setModUser("modUserTest");
+        expect(beMockResponsibility.getIsObserver("modUserTest")).andReturn(isObserver);
+        PowerMock.replay(beMockResponsibility);
+        Response resp = controllerImpl.invoke();
+        assertEquals(resp.getStatus(), HttpStatus.SC_OK);
+        assertEquals(resp.hasEntity(), true);
+        assertEquals(controllerImpl.getModUser(), "modUserTest");
+    }
+
+    //FIXME resolve test
+    /*@Test
+    public void testGetUsers() throws BtbException {
+        List<UserAuthentication> userAuthenticationList = new ArrayList<>();
+
+        ControllerImplementations.GetUsers controllerImpl = new ControllerImplementations.GetUsers(beMockUser);
+        controllerImpl.setModUser("EgalUser");
+        expect(beMockUser.getUsers()).andReturn(userAuthenticationList);
+        PowerMock.replay(beMockUser);
+
+        assertEquals(controllerImpl.invoke().getStatus(), Globals.HTTPSTATUS_OK);
+        assertEquals(controllerImpl.getModUser(), "EgalUser");
+    }*/
+
+
+    @Test
+    public void testPostResponsibilities_NewerRespsAreNull() throws BtbException {
+        List<TerritoryResponsibility> territoryResponsibilityList = new ArrayList<>();
+
+        ControllerImplementations.PostResponsibilities controllerImpl = new ControllerImplementations.PostResponsibilities("", beMockResponsibility);
+        controllerImpl.setModUser("EgalUser");
+        expect(beMockResponsibility.planResponsibilities(territoryResponsibilityList, "modUser")).andReturn(null);
+        PowerMock.replay(beMockResponsibility);
+
+        assertEquals(controllerImpl.invoke().getStatus(), HttpStatus.SC_OK);
+        assertEquals(controllerImpl.getModUser(), "EgalUser");
+
+    }
+
+    @Test
+    public void testPostResponsibilities_NewerRespsNotNull() throws BtbException {
+        List<TerritoryResponsibility> territoryResponsibilityList = new ArrayList<>();
+
+        ControllerImplementations.PostResponsibilities controllerImpl = new ControllerImplementations.PostResponsibilities("", beMockResponsibility);
+        controllerImpl.setModUser("EgalUser");
+        expect(beMockResponsibility.planResponsibilities(anyObject(), anyString())).andReturn(new ArrayList<>());
+        PowerMock.replay(beMockResponsibility);
+
+        assertEquals(controllerImpl.invoke().getStatus(), HttpStatus.SC_OK);
+        assertEquals(controllerImpl.getModUser(), "EgalUser");
+
+    }
+
+    @Test
+    public void testPostResponsibilitiesConfirmation_NewerRespsAreNull() throws BtbException {
+        List<TerritoryResponsibility> territoryResponsiblityList = new ArrayList<>();
+
+        ControllerImplementations.PostResponsibilitiesConfirmation controllerImpl = new ControllerImplementations.PostResponsibilitiesConfirmation("", beMockResponsibility);
+        controllerImpl.setModUser("EgalUser");
+        expect(beMockResponsibility.confirmResponsibilities(territoryResponsiblityList, "modUser")).andReturn(null);
+        PowerMock.replay(beMockResponsibility);
+
+        assertEquals(controllerImpl.invoke().getStatus(), HttpStatus.SC_OK);
+        assertEquals(controllerImpl.getModUser(), "EgalUser");
+    }
+
+    @Test
+    public void testPostResponsibilitiesConfirmation_NewerRespsNotNull() throws BtbException {
+        List<TerritoryResponsibility> territoryResponsiblityList = new ArrayList<>();
+
+        ControllerImplementations.PostResponsibilitiesConfirmation controllerImpl = new ControllerImplementations.PostResponsibilitiesConfirmation("", beMockResponsibility);
+        controllerImpl.setModUser("EgalUser");
+        expect(beMockResponsibility.confirmResponsibilities(anyObject(), anyString())).andReturn(new ArrayList<>());
+        PowerMock.replay(beMockResponsibility);
+
+        assertEquals(controllerImpl.invoke().getStatus(), HttpStatus.SC_OK);
+        assertEquals(controllerImpl.getModUser(), "EgalUser");
+    }
+
+
+    @Test
+    public void testGetVersionInfo() throws BtbException {
+        VersionInfo vi = new VersionInfo();
+        ControllerImplementations.GetVersionInfo controllerImpl = new ControllerImplementations.GetVersionInfo(beMockVersionInfo);
+
+        expect(beMockVersionInfo.getVersionInfo()).andReturn(vi);
+        PowerMock.replay(beMockVersionInfo);
+
+        assertEquals(controllerImpl.invoke().getStatus(), HttpStatus.SC_OK);
+    }
+
+    @Test
+    public void testGetBranches() throws BtbException {
+        List<RefBranch> rbList = new LinkedList<>();
+        rbList.add(new RefBranch());
+
+        ControllerImplementations.GetBranches controllerImpl = new ControllerImplementations.GetBranches(beMockRefInfo);
+
+        expect(beMockRefInfo.getBranches()).andReturn(rbList);
+        PowerMock.replay(beMockRefInfo);
+
+        assertEquals(controllerImpl.invoke().getStatus(), HttpStatus.SC_OK);
+    }
+
+    @Test
+    public void testGetGridTerritories() throws BtbException {
+        List<RefGridTerritory> gridTerritories = new LinkedList<>();
+        gridTerritories.add(new RefGridTerritory());
+
+        ControllerImplementations.GetGridTerritories controllerImpl = new ControllerImplementations.GetGridTerritories(beMockRefInfo);
+
+        expect(beMockRefInfo.getGridTerritories()).andReturn(gridTerritories);
+        PowerMock.replay(beMockRefInfo);
+
+        assertEquals(controllerImpl.invoke().getStatus(), HttpStatus.SC_OK);
+    }
+
+    @Test
+    public void testGetNotificationStatuses() throws BtbException {
+        List<RefNotificationStatus> nsList = new LinkedList<>();
+        nsList.add(new RefNotificationStatus());
+
+        ControllerImplementations.GetNotificationStatuses controllerImpl = new ControllerImplementations.GetNotificationStatuses(beMockRefInfo );
+
+        expect(beMockRefInfo.getNotificationStatuses()).andReturn(nsList);
+        PowerMock.replay(beMockRefInfo);
+
+        assertEquals(controllerImpl.invoke().getStatus(), HttpStatus.SC_OK);
+    }
+
+
+    @Test
+    public void testCreateNotification() throws BtbException {
+        String json = super.loadStringFromResource("testSingleNotification.json");
+
+        ControllerImplementations.CreateNotification controllerImpl = new ControllerImplementations.CreateNotification(json, beMockNotification);
+
+        expect(beMockNotification.createNotification(anyObject(), anyObject())).andReturn(new Notification());
+        PowerMock.replay(beMockNotification);
+
+        assertEquals(controllerImpl.invoke().getStatus(), HttpStatus.SC_OK);
+    }
+
+    @Test(expected = BtbBadRequest.class)
+    public void testCreateNotification_null() throws BtbException {
+        ControllerImplementations.CreateNotification controllerImpl = new ControllerImplementations.CreateNotification(null, beMockNotification);
+
+        expect(beMockNotification.createNotification(anyObject(), anyObject())).andReturn(new Notification());
+        PowerMock.replay(beMockNotification);
+
+        assertEquals(controllerImpl.invoke().getStatus(), HttpStatus.SC_OK);
+    }
+
+    @Test
+    public void testGetNotificationById() throws BtbException {
+        String id = "100";
+        ControllerImplementations.GetNotificationById controllerImpl = new ControllerImplementations.GetNotificationById(id, beMockNotification);
+
+        expect(beMockNotification.getNotificationById(anyObject())).andReturn(new Notification());
+        PowerMock.replay(beMockNotification);
+
+        assertEquals(controllerImpl.invoke().getStatus(), HttpStatus.SC_OK);
+    }
+
+    @Test
+    public void testGetActiveNotifications() throws BtbException {
+
+        ControllerImplementations.GetActiveNotifications controllerImpl = new ControllerImplementations.GetActiveNotifications(beMockNotification);
+
+        expect(beMockNotification.getActiveNotifications()).andReturn(new ArrayList<>());
+        PowerMock.replay(beMockNotification);
+
+        assertEquals(controllerImpl.invoke().getStatus(), HttpStatus.SC_OK);
+    }
+
+    @Test
+    public void testGetNotificationsByIncidentId() throws BtbException {
+
+        ControllerImplementations.GetNotificationsByIncidentId controllerImpl = new ControllerImplementations.GetNotificationsByIncidentId("3", beMockNotification);
+
+        expect(beMockNotification.getNotificationByIncidentId(anyInt())).andReturn(new ArrayList<>());
+        PowerMock.replay(beMockNotification);
+
+        assertEquals(controllerImpl.invoke().getStatus(), HttpStatus.SC_OK);
+    }
+
+    @Test
+    public void testGetAssignedUserSuggestions() throws BtbException {
+        List<String> assignedUserSuggestionsList = new LinkedList<>();
+
+        ControllerImplementations.GetAssignedUserSuggestions controllerImpl = new ControllerImplementations.GetAssignedUserSuggestions(beMockUser);
+        expect(beMockUser.getAssignedUserSuggestions()).andReturn(assignedUserSuggestionsList);
+         PowerMock.replay(beMockUser);
+
+       assertEquals(controllerImpl.invoke().getStatus(), HttpStatus.SC_OK);
+    }
+
+    @Test
+    public void testGetImportFiles() throws BtbException, IOException {
+
+        ControllerImplementations.GetImportFiles controllerImpl = new ControllerImplementations.GetImportFiles(beMockNotificationFile);
+
+        expect(beMockNotificationFile.getNotificationsFiles("getImportFiles")).andReturn(new ArrayList<>());
+        PowerMock.replay(beMockNotificationFile);
+
+        assertEquals(controllerImpl.invoke().getStatus(), HttpStatus.SC_OK);
+    }
+
+    @Test
+    public void testDeleteImportedFiles() throws BtbException, IOException {
+
+        String fileName = "";
+        ControllerImplementations.DeleteImportedFiles controllerImpl = new ControllerImplementations.DeleteImportedFiles(fileName, beMockNotificationFile);
+
+        expect(beMockNotificationFile.deleteImportedFile(fileName)).andReturn(true);
+        PowerMock.replay(beMockNotificationFile);
+
+        assertEquals(controllerImpl.invoke().getStatus(), HttpStatus.SC_OK);
+    }
+
+    @Test
+    public void testImportFile() throws BtbException, IOException {
+
+        ControllerImplementations.ImportFile controllerImpl = new ControllerImplementations.ImportFile(beMockNotificationFile);
+
+        expect(beMockNotificationFile.getNotificationsFiles("importFile")).andReturn(new ArrayList<>());
+        PowerMock.replay(beMockNotificationFile);
+
+        assertEquals(controllerImpl.invoke().getStatus(), HttpStatus.SC_OK);
+    }
+
+    @Test
+    public void testGetUsers() throws BtbException {
+        String token = "";
+
+        ControllerImplementations.GetUsers controllerImpl = new ControllerImplementations.GetUsers(beMockBackendControllerUser, token);
+
+        expect(beMockBackendControllerUser.getUsers(token)).andReturn(new ArrayList<>());
+        PowerMock.replay(beMockBackendControllerUser);
+
+        assertEquals(controllerImpl.invoke().getStatus(), HttpStatus.SC_OK);
+    }
+}
diff --git a/src/test/java/org/eclipse/openk/elogbook/controller/InputValidatorTest.java b/src/test/java/org/eclipse/openk/elogbook/controller/InputValidatorTest.java
new file mode 100644
index 0000000..4648faa
--- /dev/null
+++ b/src/test/java/org/eclipse/openk/elogbook/controller/InputValidatorTest.java
@@ -0,0 +1,160 @@
+package org.eclipse.openk.elogbook.controller;
+
+import org.eclipse.openk.elogbook.common.Globals;
+import org.eclipse.openk.elogbook.common.util.ResourceLoaderBase;
+import org.eclipse.openk.elogbook.exceptions.BtbBadRequest;
+import org.eclipse.openk.elogbook.exceptions.BtbUnauthorized;
+import org.junit.Test;
+import org.powermock.reflect.Whitebox;
+
+public class InputValidatorTest extends ResourceLoaderBase {
+
+    // Check Credentials -------------------------------------------------------
+
+    @Test(expected = BtbUnauthorized.class)
+    public void testCheckCredentials_Null() throws BtbUnauthorized {
+        new InputDataValuator().checkCredentials(null);
+    }
+
+    @Test(expected = BtbUnauthorized.class)
+    public void testCheckCredentials_Empty() throws BtbUnauthorized {
+        new InputDataValuator().checkCredentials("");
+    }
+
+    @Test(expected = BtbUnauthorized.class)
+    public void testCheckCredentials_TooLong() throws BtbUnauthorized {
+        StringBuilder sb = new StringBuilder();
+        for (int i = 0; i < Globals.MAX_CREDENTIALS_LENGTH; i++) {
+            sb.append("W");
+        }
+        new InputDataValuator().checkCredentials(sb.toString());
+
+    }
+
+    @Test(expected = BtbUnauthorized.class)
+    public void testCheckCredentials_Invalid() throws BtbUnauthorized {
+        new InputDataValuator().checkCredentials("{\"abc\":\"123\"}");
+    }
+
+    @Test(expected = BtbUnauthorized.class)
+    public void testCheckCredentials_InvalidNoJson() throws BtbUnauthorized {
+        new InputDataValuator().checkCredentials("123");
+    }
+
+    @Test(expected = BtbUnauthorized.class)
+    public void testCheckCredentials_tooLong() throws BtbUnauthorized {
+        StringBuilder sb = new StringBuilder(Globals.MAX_CREDENTIALS_LENGTH + 1);
+        for (int i = 0; i < Globals.MAX_CREDENTIALS_LENGTH + 1; i++) {
+            sb.append("@");
+        }
+        new InputDataValuator().checkCredentials(sb.toString());
+
+    }
+
+    // -- check notifications
+
+    @Test(expected = BtbBadRequest.class)
+    public void testCheckNotification_null() throws BtbBadRequest {
+        new InputDataValuator().checkNotification(null);
+    }
+
+    @Test(expected = BtbBadRequest.class)
+    public void testCheckNotification_Empty() throws BtbBadRequest {
+        new InputDataValuator().checkNotification("");
+    }
+
+    @Test(expected = BtbBadRequest.class)
+    public void testCheckNotification_TooLong() throws BtbBadRequest {
+        StringBuilder sb = new StringBuilder(Globals.MAX_NOTIFICATION_LENGTH + 1);
+        for (int i = 0; i < Globals.MAX_NOTIFICATION_LENGTH + 1; i++) {
+            sb.append("@");
+        }
+        new InputDataValuator().checkNotification(sb.toString());
+    }
+
+    // -- check notifications
+
+    @Test
+    public void testCheckNotificationSearchFilter_null() throws BtbBadRequest {
+        new InputDataValuator().checkIncomingSearchFilter(null);
+    }
+
+    @Test
+    public void testCheckNotificationSearchFilter_Empty() throws BtbBadRequest {
+        new InputDataValuator().checkIncomingSearchFilter("");
+    }
+
+    @Test(expected = BtbBadRequest.class)
+    public void testCheckNotificationSearchFilter_TooLong() throws BtbBadRequest {
+        StringBuilder sb = new StringBuilder(Globals.MAX_NOTIFICATION_LENGTH + 1);
+        for (int i = 0; i < Globals.MAX_NOTIFICATION_LENGTH + 1; i++) {
+            sb.append("@");
+        }
+        new InputDataValuator().checkIncomingSearchFilter(sb.toString());
+    }
+
+    @Test
+    public void testCheckNotification_OK() throws BtbBadRequest {
+        new InputDataValuator().checkNotification("{}"); // at this time...empty is allowed ;-)
+    }
+
+    @Test
+    public void checkWhitelistChars_ok() throws Exception {
+        callWhitelistCheck("AaBbCcäÄöÖüÜß ?0123456789(). _+  ,-:;=!§%&/'#<>\"");
+    }
+
+    @Test(expected = BtbBadRequest.class)
+    public void checkWhitelistChars_nok() throws Exception {
+        callWhitelistCheck(null);
+        callWhitelistCheck("");
+        callWhitelistCheck("AaBbCc.,{}");
+    }
+
+    @Test(expected = BtbBadRequest.class)
+    public void checkNotificationId_null() throws Exception {
+        InputDataValuator.checkNotificationId(null);
+    }
+
+    @Test(expected = BtbBadRequest.class)
+    public void checkNotificationId_empty() throws Exception {
+        InputDataValuator.checkNotificationId("");
+    }
+
+    @Test(expected = BtbBadRequest.class)
+    public void checkNotificationId_bad() throws Exception {
+        InputDataValuator.checkNotificationId("aaa");
+    }
+
+    @Test
+    public void checkNotificationId_ok() throws Exception {
+        InputDataValuator.checkNotificationId("1234");
+    }
+
+    @Test(expected = BtbBadRequest.class)
+    public void checkHistoricalResponsibilityId_null() throws Exception {
+        InputDataValuator.checkHistoricalResponsibilityId(null);
+    }
+
+    @Test(expected = BtbBadRequest.class)
+    public void checkHistoricalResponsibilityId_empty() throws Exception {
+        InputDataValuator.checkHistoricalResponsibilityId("");
+    }
+
+    @Test(expected = BtbBadRequest.class)
+    public void checkHistoricalResponsibilityId_bad() throws Exception {
+        InputDataValuator.checkHistoricalResponsibilityId("aaa");
+    }
+
+    @Test
+    public void checkHistoricalResponsibilityId_ok() throws Exception {
+        InputDataValuator.checkHistoricalResponsibilityId("1234");
+    }
+
+
+    private void callWhitelistCheck(String tst) throws Exception {
+        InputDataValuator idv = new InputDataValuator();
+        Whitebox.invokeMethod(idv, "checkWhitelistChars", tst, false);
+    }
+
+
+}
diff --git a/src/test/java/org/eclipse/openk/elogbook/controller/NotificationTestHelper.java b/src/test/java/org/eclipse/openk/elogbook/controller/NotificationTestHelper.java
new file mode 100644
index 0000000..cf93938
--- /dev/null
+++ b/src/test/java/org/eclipse/openk/elogbook/controller/NotificationTestHelper.java
@@ -0,0 +1,83 @@
+package org.eclipse.openk.elogbook.controller;
+
+
+import static org.easymock.EasyMock.expect;
+import static org.easymock.EasyMock.replay;
+
+import java.util.LinkedList;
+import java.util.List;
+import org.eclipse.openk.elogbook.common.mapper.NotificationMapper;
+import org.eclipse.openk.elogbook.persistence.dao.RefBranchDao;
+import org.eclipse.openk.elogbook.persistence.dao.RefGridTerritoryDao;
+import org.eclipse.openk.elogbook.persistence.dao.RefNotificationStatusDao;
+import org.eclipse.openk.elogbook.persistence.model.RefBranch;
+import org.eclipse.openk.elogbook.persistence.model.RefGridTerritory;
+import org.eclipse.openk.elogbook.persistence.model.RefNotificationStatus;
+import org.powermock.api.easymock.PowerMock;
+
+public class NotificationTestHelper {
+    private static RefNotificationStatus newStatusItem(int id, String name) {
+        RefNotificationStatus ret = new RefNotificationStatus();
+        ret.setId(id);
+        ret.setName(name);
+        return ret;
+    }
+
+    private static RefBranch newBranch(int id, String name, String description) {
+        RefBranch ret = new RefBranch();
+        ret.setId(id);
+        ret.setName(name);
+        ret.setDescription(description);
+        return ret;
+    }
+
+    private static RefGridTerritory newRefGridTerritory(int id, String description, String name, int refMasterId) {
+        RefGridTerritory refGridTerritory  = new RefGridTerritory();
+        refGridTerritory.setId(id);
+        refGridTerritory.setName(name);
+        refGridTerritory.setDescription(description);
+        refGridTerritory.setRefMaster(new RefGridTerritory());
+        refGridTerritory.getRefMaster().setId(refMasterId);
+        return refGridTerritory;
+    }
+
+    private static RefNotificationStatusDao createStatusDaoMock(List<RefNotificationStatus> rnsList) {
+        RefNotificationStatusDao rnsdaoMock = PowerMock.createNiceMock(RefNotificationStatusDao.class);
+        expect(rnsdaoMock.findInTx(true, -1, 0)).andReturn(rnsList);
+        replay(rnsdaoMock);
+        return rnsdaoMock;
+    }
+
+    private static RefBranchDao createBranchDaoMock(List<RefBranch> rbList) {
+        RefBranchDao rbdaoMock = PowerMock.createNiceMock(RefBranchDao.class);
+        expect(rbdaoMock.findInTx(true, -1, 0)).andReturn(rbList);
+        replay(rbdaoMock);
+        return rbdaoMock;
+    }
+
+    private static RefGridTerritoryDao createRefGridTerritoryDaoMock(List<RefGridTerritory> refGridTerritories) {
+        RefGridTerritoryDao refGridTerritoryDaoMock = PowerMock.createNiceMock(RefGridTerritoryDao.class);
+        expect(refGridTerritoryDaoMock.findInTx(true, -1, 0)).andReturn(refGridTerritories);
+        replay(refGridTerritoryDaoMock);
+        return refGridTerritoryDaoMock;
+    }
+
+    public static NotificationMapper createMapper() {
+        List<RefNotificationStatus> rnsList = new LinkedList<>();
+        rnsList.add(newStatusItem(1, "offen"));
+        rnsList.add(newStatusItem(2, "geschlossen"));
+        RefNotificationStatusDao rnsDao = createStatusDaoMock(rnsList);
+
+        List<RefBranch> rbList = new LinkedList<>();
+        rbList.add(newBranch(1, "W", "Wasser"));
+        rbList.add(newBranch(2, "G", "Gas"));
+        RefBranchDao rbDao = createBranchDaoMock(rbList);
+
+        List<RefGridTerritory> refGridTerritories = new LinkedList<RefGridTerritory>();
+        refGridTerritories.add(newRefGridTerritory(1, "MA", "Mannheim", 1));
+        refGridTerritories.add(newRefGridTerritory(2, "OF", "Offenbach", 1));
+        RefGridTerritoryDao refGridTerritoryDao = createRefGridTerritoryDaoMock(refGridTerritories);
+
+        return new NotificationMapper(rnsDao, rbDao, refGridTerritoryDao);
+    }
+}
diff --git a/src/test/java/org/eclipse/openk/elogbook/controller/ResponseBuilderWrapperTest.java b/src/test/java/org/eclipse/openk/elogbook/controller/ResponseBuilderWrapperTest.java
new file mode 100644
index 0000000..ecba703
--- /dev/null
+++ b/src/test/java/org/eclipse/openk/elogbook/controller/ResponseBuilderWrapperTest.java
@@ -0,0 +1,43 @@
+package org.eclipse.openk.elogbook.controller;
+
+
+import org.apache.http.HttpStatus;
+import org.eclipse.openk.elogbook.exceptions.BtbException;
+import org.eclipse.openk.elogbook.exceptions.BtbInternalServerError;
+import org.junit.Test;
+
+import javax.ws.rs.core.Response;
+
+import static org.junit.Assert.assertEquals;
+
+
+public class ResponseBuilderWrapperTest {
+    @Test
+    public void testGetResponseBuilder() throws BtbInternalServerError {
+        String json = "{ 'ret' : 'OK' }";
+        Response.ResponseBuilder rb = ResponseBuilderWrapper.INSTANCE.getResponseBuilder( json );
+        Response resp = rb.build();
+        assertEquals(resp.getStatus(), HttpStatus.SC_OK );
+    }
+
+    @Test
+    public void testBuildOkResponse() throws BtbException {
+        String json = "{ 'test' : 'Value' }";
+        Response resp = ResponseBuilderWrapper.INSTANCE.buildOKResponse( json );
+        assertEquals( resp.getStatus(), HttpStatus.SC_OK );
+
+        resp = ResponseBuilderWrapper.INSTANCE.buildOKResponse(json, "ssess");
+        assertEquals( resp.getStatus(), HttpStatus.SC_OK);
+    }
+/*
+    @Test( expected = BtbInternalServerError.class)
+    public void testBuildOkResponse1_withException() {
+
+        Response.ResponseBuilder mockedResponseBuilder = PowerMock.createNiceMock(Response.ResponseBuilder.class);
+        expect( mockedResponseBuilder.build()).andThrow( new UnsupportedEncodingException());
+        PowerMock.replay(mockedResponseBuilder);
+        PowerMock.mockStatic(BaseWebService.class, "getResponseBuilder", );
+
+
+    }*/
+}
diff --git a/src/test/java/org/eclipse/openk/elogbook/controller/TokenManagerTest.java b/src/test/java/org/eclipse/openk/elogbook/controller/TokenManagerTest.java
new file mode 100644
index 0000000..f71abd3
--- /dev/null
+++ b/src/test/java/org/eclipse/openk/elogbook/controller/TokenManagerTest.java
@@ -0,0 +1,37 @@
+package org.eclipse.openk.elogbook.controller;
+
+import org.eclipse.openk.elogbook.controller.BaseWebService.SecureType;
+import org.eclipse.openk.elogbook.exceptions.BtbException;
+import org.eclipse.openk.elogbook.exceptions.BtbForbidden;
+import org.junit.Before;
+import org.junit.Test;
+
+public class TokenManagerTest {
+	private TokenManager tokenManager;
+	private String payload = "eyJhbGciOiJSUzI1NiIsInR5cCIgOiAiSldUIiwia2lkIiA6ICJodVl0eVByUEVLQ1phY3FfMW5sOGZscENETnFHdmZEZHctYUxGQXNoWHZVIn0.eyJqdGkiOiI5MDVjMDYzMy03MzlkLTQ2MjYtYWFiZi0xMWNmZDc0Mzg2ZTQiLCJleHAiOjE1MDY1MDkwOTIsIm5iZiI6MCwiaWF0IjoxNTA2NTA4NzkyLCJpc3MiOiJodHRwOi8vZW50amF2YTAwMjo4MDgwL2F1dGgvcmVhbG1zL2Vsb2dib29rIiwiYXVkIjoiZWxvZ2Jvb2stYmFja2VuZCIsInN1YiI6ImMyZTlkN2FlLTJiZmEtNDU3OC1iMDllLWY1ZGM1ZjA5YTg3OSIsInR5cCI6IkJlYXJlciIsImF6cCI6ImVsb2dib29rLWJhY2tlbmQiLCJhdXRoX3RpbWUiOjAsInNlc3Npb25fc3RhdGUiOiI1M2Q2YjdlNi04NDgyLTRjNzEtYTBlYi05ZDUyYzgzNjg4ZDAiLCJhY3IiOiIxIiwiYWxsb3dlZC1vcmlnaW5zIjpbIioiXSwicmVhbG1fYWNjZXNzIjp7InJvbGVzIjpbImVsb2dib29rLW5vcm1hbHVzZXIiLCJ1bWFfYXV0aG9yaXphdGlvbiJdfSwicmVzb3VyY2VfYWNjZXNzIjp7ImFjY291bnQiOnsicm9sZXMiOlsibWFuYWdlLWFjY291bnQiLCJtYW5hZ2UtYWNjb3VudC1saW5rcyIsInZpZXctcHJvZmlsZSJdfX0sIm5hbWUiOiJPdHRvIE5vcm1hbHZlcmJyYXVjaGVyIiwicHJlZmVycmVkX3VzZXJuYW1lIjoib3R0byIsImdpdmVuX25hbWUiOiJPdHRvIiwiZmFtaWx5X25hbWUiOiJOb3JtYWx2ZXJicmF1Y2hlciIsInJvbGVzdGVzdCI6IltvZmZsaW5lX2FjY2VzcywgdW1hX2F1dGhvcml6YXRpb24sIGVsb2dib29rLW5vcm1hbHVzZXJdIn0.yTVAVWqm8RuENrDEnrYRJNT2CbeqQ19qMD2vLP0yhyR5IQ_IVxSPLYKwpo5mbQFJGadbPhQxdr5Vv7kflr1ciIbuV2lSGb2cT3NawdFuPQbrbXTCIVig5oo7q7GzI_pTLXw9J2eQ-AHNpuo-uui0khqHKHIlx9TT8HvbwTe6DZDC3HOFnQOcyaTjtO_F46AfLTmwQ1J91J-ng_A6KzbBNS5LBbY2NzluP1B8290M5nOjLGASjCEJ8BEpo37LWScxPwdxXr7i9JlKVqxRvGeetEm1fMtZBvIrY8n9X7K2VWItnUdSGcTwEwj4iCGEev8okj22vKjKtIkRGscKgyQRWw";
+
+	@Before
+	public void init() {
+		this.tokenManager = TokenManager.getInstance();
+	}
+
+	@Test(expected = BtbException.class)
+	public void testLogout() throws BtbException {
+		tokenManager.logout("bla");
+	}
+
+	@Test(expected = BtbException.class)
+	public void testCheckAuth() throws BtbException {
+		tokenManager.checkAut("bla");
+	}
+
+	@Test
+	public void testSecureTypeNormal() throws BtbException {
+		tokenManager.checkAutLevel(payload, SecureType.NORMAL);
+	}
+
+	@Test(expected = BtbForbidden.class)
+	public void testSecureTypeHigh() throws BtbException {
+		tokenManager.checkAutLevel(payload, SecureType.HIGH);
+	}
+}
diff --git a/src/test/java/org/eclipse/openk/elogbook/exceptions/BtbExceptionMapperTest.java b/src/test/java/org/eclipse/openk/elogbook/exceptions/BtbExceptionMapperTest.java
new file mode 100644
index 0000000..6c6ee54
--- /dev/null
+++ b/src/test/java/org/eclipse/openk/elogbook/exceptions/BtbExceptionMapperTest.java
@@ -0,0 +1,44 @@
+package org.eclipse.openk.elogbook.exceptions;
+
+
+import static junit.framework.Assert.assertEquals;
+import static junit.framework.Assert.assertTrue;
+
+import org.eclipse.openk.elogbook.common.JsonGeneratorBase;
+import org.eclipse.openk.elogbook.common.util.ResourceLoaderBase;
+import org.eclipse.openk.elogbook.viewmodel.ErrorReturn;
+import org.junit.Test;
+
+public class BtbExceptionMapperTest extends ResourceLoaderBase {
+    @Test
+    public void testToJson() {
+        String json = BtbExceptionMapper.toJson(new BtbNotFound("lalilu"));
+
+        ErrorReturn er = JsonGeneratorBase.getGson().fromJson(json, ErrorReturn.class);
+        assertEquals(er.getErrorCode(), 404);
+        assertTrue(er.getErrorText().equals("lalilu"));
+    }
+
+    @Test
+    public void testUnknownErrorToJson() {
+        String json = BtbExceptionMapper.unknownErrorToJson();
+
+        ErrorReturn er = JsonGeneratorBase.getGson().fromJson(json, ErrorReturn.class);
+        assertEquals(er.getErrorCode(), 500);
+    }
+
+    @Test
+    public void testGeneralOKJson() {
+        String ok = BtbExceptionMapper.getGeneralOKJson();
+        assertTrue("{\"ret\":\"OK\"}".equals(ok));
+    }
+
+    @Test
+    public void testGeneralErrorJson() {
+        String nok = BtbExceptionMapper.getGeneralErrorJson();
+        assertTrue("{\"ret\":\"NOK\"}".equals(nok));
+    }
+
+
+
+}
diff --git a/src/test/java/org/eclipse/openk/elogbook/exceptions/BtbExceptionsTest.java b/src/test/java/org/eclipse/openk/elogbook/exceptions/BtbExceptionsTest.java
new file mode 100644
index 0000000..76132fd
--- /dev/null
+++ b/src/test/java/org/eclipse/openk/elogbook/exceptions/BtbExceptionsTest.java
@@ -0,0 +1,51 @@
+package org.eclipse.openk.elogbook.exceptions;
+
+import org.apache.http.HttpStatus;
+import org.eclipse.openk.elogbook.viewmodel.ErrorReturn;
+import org.junit.Test;
+
+import static org.junit.Assert.assertEquals;
+
+public class BtbExceptionsTest {
+
+    @Test
+    public void testConstructors() {
+        assertEquals(new BtbBadRequest().getHttpStatus(), HttpStatus.SC_BAD_REQUEST);
+        assertEquals(new BtbConflict().getHttpStatus(), HttpStatus.SC_CONFLICT);
+        assertEquals(new BtbForbidden().getHttpStatus(), HttpStatus.SC_FORBIDDEN);
+        assertEquals(new BtbGone().getHttpStatus(), HttpStatus.SC_GONE);
+        assertEquals(new BtbInternalServerError(null, null).getHttpStatus(), HttpStatus.SC_INTERNAL_SERVER_ERROR);
+        assertEquals(new BtbLocked().getHttpStatus(), HttpStatus.SC_LOCKED);
+        assertEquals(new BtbNotFound().getHttpStatus(), HttpStatus.SC_NOT_FOUND);
+        assertEquals(new BtbPolicyNotFulfilled().getHttpStatus(), HttpStatus.SC_METHOD_FAILURE);
+        assertEquals(new BtbServiceUnavailable().getHttpStatus(), HttpStatus.SC_SERVICE_UNAVAILABLE);
+        assertEquals(new BtbUnauthorized().getHttpStatus(), HttpStatus.SC_UNAUTHORIZED);
+    }
+
+
+    @Test
+    public void testConstructors2() {
+        final String extext = "ExText";
+        assertEquals(new BtbBadRequest(extext).getMessage(), extext);
+        assertEquals(new BtbConflict(extext).getMessage(), extext);
+        assertEquals(new BtbForbidden(extext).getMessage(), extext);
+        assertEquals(new BtbGone(extext).getMessage(), extext);
+        assertEquals(new BtbInternalServerError(extext).getMessage(), extext);
+        assertEquals(new BtbLocked(extext).getMessage(), extext);
+        assertEquals(new BtbNotFound(extext).getMessage(), extext);
+        assertEquals(new BtbPolicyNotFulfilled(extext).getMessage(), extext);
+        assertEquals(new BtbServiceUnavailable(extext).getMessage(), extext);
+        assertEquals(new BtbUnauthorized(extext).getMessage(), extext);
+    }
+    
+    @Test
+    public void testBtBNestedExceptions() {
+    	 ErrorReturn errorReturn = new ErrorReturn();
+         errorReturn.setErrorText("this is an error");
+         errorReturn.setErrorCode(404);
+         assertEquals(new BtbNestedException(errorReturn).getMessage(), "this is an error");
+         assertEquals(new BtbNestedException(errorReturn, new Throwable()).getMessage(), "this is an error");
+         BtbNestedException exception = new BtbNestedException(errorReturn);
+         assertEquals(exception.getHttpStatus(), 404);
+    }
+}
diff --git a/src/test/java/org/eclipse/openk/elogbook/persistence/model/HTblResponsibilityTest.java b/src/test/java/org/eclipse/openk/elogbook/persistence/model/HTblResponsibilityTest.java
new file mode 100644
index 0000000..26ea29c
--- /dev/null
+++ b/src/test/java/org/eclipse/openk/elogbook/persistence/model/HTblResponsibilityTest.java
@@ -0,0 +1,63 @@
+package org.eclipse.openk.elogbook.persistence.model;
+
+import org.junit.Test;
+
+import java.sql.Timestamp;
+import java.time.LocalDateTime;
+
+import static org.junit.Assert.assertEquals;
+
+public class HTblResponsibilityTest {
+    @Test
+    public void testGettersAndSetters() {
+        HTblResponsibility hTblResponsibility = new HTblResponsibility();
+
+        hTblResponsibility.setId(1);
+        assertEquals((long) hTblResponsibility.getId(), 1);
+
+        hTblResponsibility.setTransactionId(1);
+        assertEquals((long) hTblResponsibility.getTransactionId(), 1);
+
+        LocalDateTime ldtCreate = LocalDateTime.parse("2017-06-19T15:00:00");
+        Timestamp tsCreate = Timestamp.valueOf(ldtCreate);
+
+        LocalDateTime ldtMod = LocalDateTime.parse("2017-06-20T15:00:00");
+        Timestamp tsMod = Timestamp.valueOf(ldtMod);
+
+        LocalDateTime ldtTransfer = LocalDateTime.parse("2017-07-20T15:00:00");
+        Timestamp tsTransfer = Timestamp.valueOf(ldtTransfer);
+
+        hTblResponsibility.setResponsibleUser("respoUser");
+        assertEquals("respoUser", hTblResponsibility.getResponsibleUser());
+
+        hTblResponsibility.setFormerResponsibleUser("formerRespoUser");
+        assertEquals("formerRespoUser", hTblResponsibility.getFormerResponsibleUser());
+
+        hTblResponsibility.setCreateDate(tsCreate);
+        assertEquals(tsCreate, hTblResponsibility.getCreateDate());
+
+        hTblResponsibility.setCreateUser("creatore");
+        assertEquals("creatore", hTblResponsibility.getCreateUser());
+
+        hTblResponsibility.setModDate(tsMod);
+        assertEquals(tsMod, hTblResponsibility.getModDate());
+
+        hTblResponsibility.setTransferDate(tsTransfer);
+        assertEquals(tsTransfer, hTblResponsibility.getTransferDate());
+
+        hTblResponsibility.setModUser("musr");
+        assertEquals("musr", hTblResponsibility.getModUser());
+
+        RefBranch rb = new RefBranch();
+        rb.setDescription("brunch");
+        hTblResponsibility.setRefBranch(rb);
+        assertEquals("brunch", hTblResponsibility.getRefBranch().getDescription());
+
+        RefGridTerritory refGridTerritory = new RefGridTerritory();
+        refGridTerritory.setDescription("Mannheim");
+        hTblResponsibility.setRefGridTerritory(refGridTerritory);
+        assertEquals(hTblResponsibility.getRefGridTerritory().getDescription(),"Mannheim");
+
+    }
+
+}
diff --git a/src/test/java/org/eclipse/openk/elogbook/persistence/model/RefBranchTest.java b/src/test/java/org/eclipse/openk/elogbook/persistence/model/RefBranchTest.java
new file mode 100644
index 0000000..0c4f131
--- /dev/null
+++ b/src/test/java/org/eclipse/openk/elogbook/persistence/model/RefBranchTest.java
@@ -0,0 +1,36 @@
+package org.eclipse.openk.elogbook.persistence.model;
+
+import static org.junit.Assert.assertEquals;
+
+import org.eclipse.openk.elogbook.common.JsonGeneratorBase;
+import org.eclipse.openk.elogbook.common.util.ResourceLoaderBase;
+import org.junit.Test;
+
+public class RefBranchTest extends ResourceLoaderBase {
+	// IMPORTANT TEST!!!
+	// Make sure, our Interface produces a DEFINED Json!
+	// Changes in the interface will HOPEFULLY crash here!!!
+
+	@Test
+	public void TestStructureAgainstJson() {
+		String json = super.loadStringFromResource("testRefBranch.json");
+		RefBranch br = JsonGeneratorBase.getGson().fromJson(json, RefBranch.class);
+
+		assertEquals((int) br.getId(), 3);
+		assertEquals(br.getName(), "BD1");
+		assertEquals(br.getDescription(), "branch description");
+	}
+
+	@Test
+	public void TestSetters() {
+		RefBranch branch = new RefBranch();
+		branch.setId(1);
+		branch.setDescription("desc_");
+		branch.setName("bla bla");
+
+		assertEquals((long) branch.getId(), 1);
+		assertEquals(branch.getName(),"bla bla");
+		assertEquals(branch.getDescription(),"desc_");
+
+	}
+}
diff --git a/src/test/java/org/eclipse/openk/elogbook/persistence/model/RefGridTerritoryTest.java b/src/test/java/org/eclipse/openk/elogbook/persistence/model/RefGridTerritoryTest.java
new file mode 100644
index 0000000..d1a50d5
--- /dev/null
+++ b/src/test/java/org/eclipse/openk/elogbook/persistence/model/RefGridTerritoryTest.java
@@ -0,0 +1,35 @@
+package org.eclipse.openk.elogbook.persistence.model;
+
+import org.junit.Test;
+
+import static org.junit.Assert.assertEquals;
+
+public class RefGridTerritoryTest {
+
+	@Test
+	public void TestGettersSetters() {
+	  RefGridTerritory refGridTerritory = new RefGridTerritory();
+    refGridTerritory.setId(1);
+    refGridTerritory.setDescription("desc_");
+    refGridTerritory.setName("bla bla");
+
+    assertEquals((long) refGridTerritory.getId(), 1);
+    assertEquals(refGridTerritory.getName(),"bla bla");
+    assertEquals(refGridTerritory.getDescription(),"desc_");
+
+	}
+
+	@Test
+	public void TestRefMaster() {
+	RefGridTerritory refGridTerritoryParent = new RefGridTerritory();
+	refGridTerritoryParent.setId(1);
+	refGridTerritoryParent.setName("Test");
+	refGridTerritoryParent.setFkRefMaster(2);
+
+	RefGridTerritory self = new RefGridTerritory();
+	self.setId(2);
+	refGridTerritoryParent.setRefMaster(self);
+
+    assertEquals(refGridTerritoryParent.getRefMaster().getId(), self.getId());
+ 	}
+}
diff --git a/src/test/java/org/eclipse/openk/elogbook/persistence/model/RefNotificationStatusTest.java b/src/test/java/org/eclipse/openk/elogbook/persistence/model/RefNotificationStatusTest.java
new file mode 100644
index 0000000..1163f4d
--- /dev/null
+++ b/src/test/java/org/eclipse/openk/elogbook/persistence/model/RefNotificationStatusTest.java
@@ -0,0 +1,28 @@
+package org.eclipse.openk.elogbook.persistence.model;
+
+import static org.junit.Assert.assertEquals;
+
+import org.eclipse.openk.elogbook.common.JsonGeneratorBase;
+import org.eclipse.openk.elogbook.common.util.ResourceLoaderBase;
+import org.junit.Test;
+
+public class RefNotificationStatusTest extends ResourceLoaderBase {
+	// IMPORTANT TEST!!!
+	// Make sure, our Interface produces a DEFINED Json!
+	// Changes in the interface will HOPEFULLY crash here!!!
+
+	@Test
+	public void TestStructureAgainstJson() {
+		String json = super.loadStringFromResource("testRefNotificationStatus.json");
+		RefNotificationStatus status = JsonGeneratorBase.getGson().fromJson(json, RefNotificationStatus.class);
+		assertEquals((int) status.getId(), 3);
+		assertEquals(status.getName(), "status1");
+	}
+
+	@Test
+	public void TestSetters() {
+		RefNotificationStatus status = new RefNotificationStatus();
+		status.setId(3);
+		status.setName("status1");
+	}
+}
diff --git a/src/test/java/org/eclipse/openk/elogbook/persistence/model/RefVersionTest.java b/src/test/java/org/eclipse/openk/elogbook/persistence/model/RefVersionTest.java
new file mode 100644
index 0000000..c7db3a7
--- /dev/null
+++ b/src/test/java/org/eclipse/openk/elogbook/persistence/model/RefVersionTest.java
@@ -0,0 +1,22 @@
+package org.eclipse.openk.elogbook.persistence.model;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertTrue;
+
+import org.junit.Test;
+
+public class RefVersionTest {
+
+	@Test
+	public void testGetterSetter() {
+
+		RefVersion refVersion = new RefVersion();
+		refVersion.setId(1);
+		refVersion.setVersion("1.0");
+
+		assertTrue(refVersion.getId() == 1);
+		assertEquals(refVersion.getVersion(),"1.0");
+	}
+
+
+}
diff --git a/src/test/java/org/eclipse/openk/elogbook/persistence/model/TblNotificationTest.java b/src/test/java/org/eclipse/openk/elogbook/persistence/model/TblNotificationTest.java
new file mode 100644
index 0000000..f0265d6
--- /dev/null
+++ b/src/test/java/org/eclipse/openk/elogbook/persistence/model/TblNotificationTest.java
@@ -0,0 +1,82 @@
+package org.eclipse.openk.elogbook.persistence.model;
+
+import static org.junit.Assert.*;
+
+import java.sql.Timestamp;
+import java.time.LocalDateTime;
+import org.junit.Test;
+
+public class TblNotificationTest {
+    @Test
+    public void TestGettersAndSetters() {
+        Timestamp ts = Timestamp.valueOf(LocalDateTime.now());
+        TblNotification not = new TblNotification();
+        not.setId(1);
+        assertEquals((long) not.getId(), 1);
+
+        not.setCreateDate(ts);
+        assertEquals(ts, not.getCreateDate());
+
+        not.setCreateUser("creatore");
+        assertEquals("creatore", not.getCreateUser());
+
+        not.setExpectedFinishedDate(ts);
+        assertEquals(ts, not.getExpectedFinishedDate());
+
+        not.setFinishedDate(ts);
+        assertEquals(ts, not.getFinishedDate());
+
+        not.setFreeText("blabla");
+        assertEquals("blabla", not.getFreeText());
+
+        not.setFreeTextExtended("fte");
+        assertEquals("fte", not.getFreeTextExtended());
+
+        not.setIncidentId(22);
+        assertEquals(22, (int) not.getIncidentId());
+
+        not.setModDate(ts);
+        assertEquals(ts, not.getModDate());
+
+        not.setModUser("musr");
+        assertEquals("musr", not.getModUser());
+
+        not.setNotificationText("notare");
+        assertEquals("notare", not.getNotificationText());
+
+        not.setReminderDate(ts);
+        assertEquals(ts, not.getReminderDate());
+
+        not.setBeginDate(ts);
+        assertEquals(ts, not.getBeginDate());
+
+        not.setResponsibilityControlPoint("controllare");
+        assertEquals("controllare", not.getResponsibilityControlPoint());
+
+        not.setResponsibilityForwarding("fwd");
+        assertEquals("fwd", not.getResponsibilityForwarding());
+
+        not.setVersion(55);
+        assertEquals(55, (int) not.getVersion());
+
+        RefBranch rb = new RefBranch();
+        rb.setDescription("brunch");
+        not.setRefBranch(rb);
+        assertEquals("brunch", not.getRefBranch().getDescription());
+
+        RefNotificationStatus rns = new RefNotificationStatus();
+        rns.setName("offen");
+        not.setRefNotificationStatus(rns);
+        assertEquals("offen", not.getRefNotificationStatus().getName());
+
+        RefGridTerritory refGridTerritory = new RefGridTerritory();
+        refGridTerritory.setName("Mannheim");
+        not.setRefGridTerritory(refGridTerritory);
+        assertEquals("Mannheim", not.getRefGridTerritory().getName());
+        
+        not.setAdminFlag(Boolean.TRUE);
+        assertTrue(not.isAdminFlag());
+
+    }
+
+}
diff --git a/src/test/java/org/eclipse/openk/elogbook/persistence/model/TblResponsibilityTest.java b/src/test/java/org/eclipse/openk/elogbook/persistence/model/TblResponsibilityTest.java
new file mode 100644
index 0000000..4c21d5a
--- /dev/null
+++ b/src/test/java/org/eclipse/openk/elogbook/persistence/model/TblResponsibilityTest.java
@@ -0,0 +1,53 @@
+package org.eclipse.openk.elogbook.persistence.model;
+
+import static org.junit.Assert.assertEquals;
+
+import java.sql.Timestamp;
+import java.time.LocalDateTime;
+import org.junit.Test;
+
+public class TblResponsibilityTest {
+    @Test
+    public void TestGettersAndSetters() {
+        TblResponsibility tblResponsibility = new TblResponsibility();
+
+        tblResponsibility.setId(1);
+        assertEquals((long) tblResponsibility.getId(), 1);
+
+        LocalDateTime ldtCreate = LocalDateTime.parse("2017-06-19T15:00:00");
+        Timestamp tsCreate = Timestamp.valueOf(ldtCreate);
+
+        LocalDateTime ldtMod = LocalDateTime.parse("2017-06-20T15:00:00");
+        Timestamp tsMod = Timestamp.valueOf(ldtMod);
+
+        tblResponsibility.setResponsibleUser("respoUser");
+        assertEquals("respoUser", tblResponsibility.getResponsibleUser());
+
+        tblResponsibility.setNewResponsibleUser("newRespoUser");
+        assertEquals("newRespoUser", tblResponsibility.getNewResponsibleUser());
+
+        tblResponsibility.setCreateDate(tsCreate);
+        assertEquals(tsCreate, tblResponsibility.getCreateDate());
+
+        tblResponsibility.setCreateUser("creatore");
+        assertEquals("creatore", tblResponsibility.getCreateUser());
+
+        tblResponsibility.setModDate(tsMod);
+        assertEquals(tsMod, tblResponsibility.getModDate());
+
+        tblResponsibility.setModUser("musr");
+        assertEquals("musr", tblResponsibility.getModUser());
+
+        RefBranch rb = new RefBranch();
+        rb.setDescription("brunch");
+        tblResponsibility.setRefBranch(rb);
+        assertEquals("brunch", tblResponsibility.getRefBranch().getDescription());
+
+        RefGridTerritory refGridTerritory = new RefGridTerritory();
+        refGridTerritory.setDescription("Mannheim");
+        tblResponsibility.setRefGridTerritory(refGridTerritory);
+        assertEquals(tblResponsibility.getRefGridTerritory().getDescription(),"Mannheim");
+
+    }
+
+}
diff --git a/src/test/java/org/eclipse/openk/elogbook/persistence/model/ViewNotificationTest.java b/src/test/java/org/eclipse/openk/elogbook/persistence/model/ViewNotificationTest.java
new file mode 100644
index 0000000..98cada3
--- /dev/null
+++ b/src/test/java/org/eclipse/openk/elogbook/persistence/model/ViewNotificationTest.java
@@ -0,0 +1,82 @@
+package org.eclipse.openk.elogbook.persistence.model;
+
+import static org.junit.Assert.*;
+
+import java.sql.Timestamp;
+import java.time.LocalDateTime;
+import org.junit.Test;
+
+public class ViewNotificationTest {
+    @Test
+    public void TestGettersAndSetters() {
+        Timestamp ts = Timestamp.valueOf(LocalDateTime.now());
+        ViewNotification not = new ViewNotification();
+        not.setId(1);
+        assertEquals((long) not.getId(), 1);
+
+        not.setCreateDate(ts);
+        assertEquals(ts, not.getCreateDate());
+
+        not.setCreateUser("creatore");
+        assertEquals("creatore", not.getCreateUser());
+
+        not.setExpectedFinishedDate(ts);
+        assertEquals(ts, not.getExpectedFinishedDate());
+
+        not.setFinishedDate(ts);
+        assertEquals(ts, not.getFinishedDate());
+
+        not.setFreeText("blabla");
+        assertEquals("blabla", not.getFreeText());
+
+        not.setFreeTextExtended("fte");
+        assertEquals("fte", not.getFreeTextExtended());
+
+        not.setIncidentId(22);
+        assertEquals(22, (int) not.getIncidentId());
+
+        not.setModDate(ts);
+        assertEquals(ts, not.getModDate());
+
+        not.setModUser("musr");
+        assertEquals("musr", not.getModUser());
+
+        not.setNotificationText("notare");
+        assertEquals("notare", not.getNotificationText());
+
+        not.setReminderDate(ts);
+        assertEquals(ts, not.getReminderDate());
+
+        not.setBeginDate(ts);
+        assertEquals(ts, not.getBeginDate());
+
+        not.setResponsibilityControlPoint("controllare");
+        assertEquals("controllare", not.getResponsibilityControlPoint());
+
+        not.setResponsibilityForwarding("fwd");
+        assertEquals("fwd", not.getResponsibilityForwarding());
+
+        not.setVersion(55);
+        assertEquals(55, (int) not.getVersion());
+
+        RefBranch rb = new RefBranch();
+        rb.setDescription("brunch");
+        not.setRefBranch(rb);
+        assertEquals("brunch", not.getRefBranch().getDescription());
+
+        RefNotificationStatus rns = new RefNotificationStatus();
+        rns.setName("offen");
+        not.setRefNotificationStatus(rns);
+        assertEquals("offen", not.getRefNotificationStatus().getName());
+
+        RefGridTerritory refGridTerritory = new RefGridTerritory();
+        refGridTerritory.setName("Mannheim");
+        not.setRefGridTerritory(refGridTerritory);
+        assertEquals("Mannheim", not.getRefGridTerritory().getName());
+        
+        not.setAdminFlag(Boolean.TRUE);
+        assertTrue(not.isAdminFlag());
+
+    }
+
+}
diff --git a/src/test/java/org/eclipse/openk/elogbook/persistence/util/NotificationQueryCreatorTest.java b/src/test/java/org/eclipse/openk/elogbook/persistence/util/NotificationQueryCreatorTest.java
new file mode 100644
index 0000000..eef41e1
--- /dev/null
+++ b/src/test/java/org/eclipse/openk/elogbook/persistence/util/NotificationQueryCreatorTest.java
@@ -0,0 +1,380 @@
+package org.eclipse.openk.elogbook.persistence.util;
+
+import org.eclipse.openk.elogbook.persistence.model.*;
+import org.eclipse.openk.elogbook.viewmodel.GlobalSearchFilter;
+import org.eclipse.openk.elogbook.viewmodel.Notification.ListType;
+import org.eclipse.openk.elogbook.viewmodel.NotificationSearchFilter;
+import org.eclipse.openk.elogbook.viewmodel.ReminderSearchFilter;
+import org.junit.Before;
+import org.junit.Test;
+import org.powermock.api.easymock.PowerMock;
+import org.powermock.reflect.Whitebox;
+
+import javax.persistence.EntityManager;
+import javax.persistence.Query;
+import javax.persistence.TypedQuery;
+import java.sql.Timestamp;
+import java.util.*;
+
+import static junit.framework.TestCase.assertEquals;
+import static junit.framework.TestCase.assertFalse;
+import static org.easymock.EasyMock.*;
+import static org.junit.Assert.assertTrue;
+
+public class NotificationQueryCreatorTest {
+	Query mockedQuery;
+	TypedQuery<TblNotification> mockedTypedQuery;
+	EntityManager mockedEm;
+	NotificationQueryCreator notificationQueryCreator;
+	
+	@Before
+	public  void initialize(){
+        mockedQuery = PowerMock.createNiceMock(Query.class);
+        mockedTypedQuery = PowerMock.createNiceMock(TypedQuery.class);
+        mockedEm = PowerMock.createNiceMock(EntityManager.class);
+	}
+
+	@Test
+    public void testgenerateNotificationQueryListTypeNull() {
+    
+        expect(mockedQuery.setParameter(anyInt(), anyObject())).andReturn(mockedQuery);
+        expect(mockedEm.createNativeQuery(anyString(), eq(TblNotification.class))).andReturn(mockedQuery).anyTimes();
+        replay(mockedQuery);
+        replay(mockedEm);
+		notificationQueryCreator = new NotificationQueryCreator(mockedEm, "");
+        NotificationSearchFilter nsf = new NotificationSearchFilter();
+        nsf.setDateFrom(new Date(System.currentTimeMillis()));
+        nsf.setDateTo(new Date(System.currentTimeMillis()));
+        notificationQueryCreator.generateNotificationQuery(nsf, "AAA", null, new ArrayList<TblResponsibility>());
+    }
+	
+	@Test
+    public void testgenerateNotificationQuery_firstTwoArgsEmpty() {
+		   
+        expect(mockedQuery.setParameter(anyInt(), anyObject())).andReturn(mockedQuery);
+        expect(mockedEm.createNativeQuery(anyString(), eq(TblNotification.class))).andReturn(mockedQuery).anyTimes();
+        replay(mockedQuery);
+        replay(mockedEm);
+		notificationQueryCreator = new NotificationQueryCreator(mockedEm, "v");
+        NotificationSearchFilter nsf = new NotificationSearchFilter();
+        notificationQueryCreator.generateNotificationQuery(nsf, "", null, new ArrayList<TblResponsibility>());
+    }
+	
+	@Test
+    public void testgenerateNotificationQuery_firstTwoArgsNull() {
+		   
+        expect(mockedQuery.setParameter(anyInt(), anyObject())).andReturn(mockedQuery);
+        expect(mockedEm.createNativeQuery(anyString(), eq(TblNotification.class))).andReturn(mockedQuery).anyTimes();
+        replay(mockedQuery);
+        replay(mockedEm);
+		notificationQueryCreator = new NotificationQueryCreator(mockedEm, null);
+         notificationQueryCreator.generateNotificationQuery(null, null, ListType.OPEN, new ArrayList<TblResponsibility>());
+    }
+
+	@Test
+	public void testgenerateNotificationQueryWithReminder() {
+
+		expect(mockedQuery.setParameter(anyInt(), anyObject())).andReturn(mockedQuery);
+		expect(mockedEm.createNativeQuery(anyString(), eq(TblNotification.class))).andReturn(mockedQuery).anyTimes();
+		replay(mockedQuery);
+		replay(mockedEm);
+		notificationQueryCreator = new NotificationQueryCreator(mockedEm, "");
+		ReminderSearchFilter rsf = new ReminderSearchFilter();
+		rsf.setReminderDate(new Date(System.currentTimeMillis()));
+		notificationQueryCreator.generateNotificationQueryWithReminder(rsf, "AAA", new ArrayList<TblResponsibility>());
+	}
+
+	@Test
+	public void testgenerateNotificationQueryWithReminder_firstTwoArgsEmpty() {
+
+		expect(mockedQuery.setParameter(anyInt(), anyObject())).andReturn(mockedQuery);
+		expect(mockedEm.createNativeQuery(anyString(), eq(TblNotification.class))).andReturn(mockedQuery).anyTimes();
+		replay(mockedQuery);
+		replay(mockedEm);
+		notificationQueryCreator = new NotificationQueryCreator(mockedEm, "v");
+		ReminderSearchFilter rsf = new ReminderSearchFilter();
+		notificationQueryCreator.generateNotificationQueryWithReminder(rsf, "", new ArrayList<TblResponsibility>());
+	}
+
+	@Test
+	public void testgenerateNotificationQueryWithReminder_firstTwoArgsNull() {
+
+		expect(mockedQuery.setParameter(anyInt(), anyObject())).andReturn(mockedQuery);
+		expect(mockedEm.createNativeQuery(anyString(), eq(TblNotification.class))).andReturn(mockedQuery).anyTimes();
+		replay(mockedQuery);
+		replay(mockedEm);
+		notificationQueryCreator = new NotificationQueryCreator(mockedEm, null);
+		notificationQueryCreator.generateNotificationQueryWithReminder(null, null, new ArrayList<TblResponsibility>());
+	}
+
+	@Test
+	public void testCreateWhereClauseFromSearchFilter_allEmpty() throws Exception {
+
+		NotificationQueryCreator queryCreator = new NotificationQueryCreator(null, "");
+		Map<Integer, Object> paramMap = new HashMap<>();
+
+		NotificationSearchFilter notificationSearchFilter = new NotificationSearchFilter();
+		notificationSearchFilter.setDateFrom(null);
+		notificationSearchFilter.setDateTo(null);
+
+		String ret = Whitebox.invokeMethod(queryCreator, "extendWhereClauseApplyingSearchFilter", notificationSearchFilter,
+				ListType.OPEN, new ArrayList<TblResponsibility>());
+		assertEquals(paramMap.size(), 0);
+		assertFalse(ret.contains("."));
+		assertFalse(ret.contains(">="));
+		assertFalse(ret.contains("<="));
+	}
+
+	@Test
+	public void testCreateWhereClauseFromSearchFilter_allSet() throws Exception {
+		NotificationQueryCreator queryCreator = new NotificationQueryCreator(null, "w");
+
+		NotificationSearchFilter nsf = new NotificationSearchFilter();
+		nsf.setDateFrom(new Date(System.currentTimeMillis()));
+		nsf.setDateTo(new Date(System.currentTimeMillis()));
+
+		String ret = Whitebox.invokeMethod(queryCreator, "extendWhereClauseApplyingSearchFilter", nsf, ListType.OPEN,
+				new ArrayList<TblResponsibility>());
+		assertTrue(!ret.isEmpty());
+	}
+	
+	@Test
+	public void testCreateWhereClauseFromSearchFilter_ListTypePAST() throws Exception {
+		NotificationQueryCreator queryCreator = new NotificationQueryCreator(null, "w");
+
+		NotificationSearchFilter nsf = new NotificationSearchFilter();
+		nsf.setDateFrom(null);
+		nsf.setDateTo(null);
+
+		String ret = Whitebox.invokeMethod(queryCreator, "extendWhereClauseApplyingSearchFilter", nsf, ListType.PAST,
+				new ArrayList<TblResponsibility>());
+		assertTrue(! ret.isEmpty());
+	}
+	
+	@Test
+	public void testCreateWhereClauseFromSearchFilter_ListTypeFUTURE() throws Exception {
+		NotificationQueryCreator queryCreator = new NotificationQueryCreator(null, "w");
+
+		NotificationSearchFilter nsf = new NotificationSearchFilter();
+		nsf.setDateFrom(createDate(2017, 3, 8));
+		nsf.setDateTo(createDate(2017,4,2));
+
+		String ret = Whitebox.invokeMethod(queryCreator, "extendWhereClauseApplyingSearchFilter", nsf, ListType.FUTURE,
+				new ArrayList<TblResponsibility>());
+		assertTrue("AND w.begin_date >= ? AND w.begin_date <= ? AND (fk_ref_branch IS NULL AND fk_ref_grid_territory IS NULL)".equalsIgnoreCase(ret.trim()));
+	}
+
+	/**
+	 * Notification Filter - dateFrom and dateTo must not be used for ListType OPEN
+	 * 
+	 * @throws Exception
+	 *             if an error occurs
+	 */
+	@Test
+	public void testExtendWhereClauseApplyingSearchFilterListTypeOPEN() throws Exception {
+		NotificationQueryCreator queryCreator = new NotificationQueryCreator(null, "w");
+		NotificationSearchFilter nsf = new NotificationSearchFilter();
+		nsf.setDateFrom(createDate(2017, Calendar.JANUARY, 1));
+		nsf.setDateTo(createDate(2017, Calendar.JUNE, 1));
+
+		List<TblResponsibility> tblResponsibilities = new ArrayList<>();
+		tblResponsibilities.add(createTblResponsibility(1, 1, 1, 1));
+		String ret = Whitebox.invokeMethod(queryCreator, "extendWhereClauseApplyingSearchFilter", nsf, ListType.PAST,
+				tblResponsibilities);
+		assertTrue(" AND w.begin_date >= ? AND w.begin_date <= ? AND (fk_ref_branch IS NULL AND fk_ref_grid_territory IS NULL OR ((fk_ref_branch IS NULL OR fk_ref_branch = 1) AND (fk_ref_grid_territory IS NULL OR fk_ref_grid_territory = 1)))".equals(ret));
+	}
+
+	/**
+	 * Notification Filter - dateFrom and dateTo must  be used for ListType PAST
+	 * @throws Exception if an error occurs
+	 */
+	@Test
+	public void testExtendWhereClauseApplyingSearchFilterListTypePAST() throws Exception {
+		NotificationQueryCreator queryCreator = new NotificationQueryCreator(null, "w");
+		NotificationSearchFilter nsf = new NotificationSearchFilter();
+		nsf.setDateFrom(createDate(2017, Calendar.JANUARY, 1));
+		nsf.setDateTo(createDate(2017, Calendar.JUNE, 1));
+
+		String ret = Whitebox.invokeMethod(queryCreator, "extendWhereClauseApplyingSearchFilter", nsf, ListType.PAST,
+				new ArrayList<TblResponsibility>());
+		assertTrue(" AND w.begin_date >= ? AND w.begin_date <= ? AND (fk_ref_branch IS NULL AND fk_ref_grid_territory IS NULL)".equals(ret));
+	}
+
+	/**
+	 * Notification Filter - dateFrom and dateTo must  be used for ListType PAST
+	 * @throws Exception if an error occurs
+	 */
+	@Test
+	public void testExtendWhereClauseApplyingSearchFilterListWithResponsibilities() throws Exception {
+		NotificationQueryCreator queryCreator = new NotificationQueryCreator(null, "w");
+		NotificationSearchFilter nsf = new NotificationSearchFilter();
+		List<TblResponsibility> tblResponsibilities = new ArrayList<>();
+		tblResponsibilities.add(createTblResponsibility(1, 7, 9, 1));
+		tblResponsibilities.add(createTblResponsibility(2, 7, 13, 2));
+		tblResponsibilities.add(createTblResponsibility(3, 7, 14, 2));
+
+		String ret = Whitebox.invokeMethod(queryCreator, "extendWhereClauseApplyingSearchFilter", nsf, ListType.OPEN,
+				tblResponsibilities);
+		StringBuilder sb = new StringBuilder("( AND fk_ref_branch IS NULL AND fk_ref_grid_territory IS NULL OR ");
+			sb.append("((fk_ref_branch IS NULL OR fk_ref_branch = 7) AND (fk_ref_grid_territory IS NULL OR fk_ref_grid_territory = 1) OR ") 
+			  .append("(fk_ref_branch IS NULL OR fk_ref_branch = 7) AND (fk_ref_grid_territory IS NULL OR fk_ref_grid_territory = 2) OR ") 
+			  .append("(fk_ref_branch IS NULL OR fk_ref_branch = 7) AND (fk_ref_grid_territory IS NULL OR fk_ref_grid_territory = 2)))");
+		assertTrue((sb.toString()).length() == ret.length());
+			
+	}
+
+	@Test
+	public void testGenerateFindHistoricalNotificationsByResponsibilityQueryOPEN() {
+		HTblResponsibility hTblResponsibility = createHTblResponsibility(1, 2);
+		List<HTblResponsibility> hTblResponsibilities = new ArrayList<>();
+		hTblResponsibilities.add(hTblResponsibility);
+
+		expect(mockedQuery.setParameter(anyInt(), anyObject())).andReturn(mockedQuery);
+		expect(mockedEm.createNativeQuery(anyString(), eq(TblNotification.class))).andReturn(mockedQuery).anyTimes();
+		replay(mockedQuery);
+		replay(mockedEm);
+		notificationQueryCreator = new NotificationQueryCreator(mockedEm, "");
+		notificationQueryCreator.generateFindHistoricalNotificationsByResponsibilityQuery(hTblResponsibilities,
+				ListType.OPEN);
+	}
+	
+	@Test
+	public void testGenerateFindHistoricalNotificationsByResponsibilityQueryPAST() {
+		HTblResponsibility hTblResponsibility = createHTblResponsibility(1, 2);
+		List<HTblResponsibility> hTblResponsibilities = new ArrayList<>();
+		hTblResponsibilities.add(hTblResponsibility);
+
+		expect(mockedQuery.setParameter(anyInt(), anyObject())).andReturn(mockedQuery);
+		expect(mockedEm.createNativeQuery(anyString(), eq(TblNotification.class))).andReturn(mockedQuery).anyTimes();
+		replay(mockedQuery);
+		replay(mockedEm);
+		notificationQueryCreator = new NotificationQueryCreator(mockedEm, "");
+		notificationQueryCreator.generateFindHistoricalNotificationsByResponsibilityQuery(hTblResponsibilities,
+				ListType.PAST);
+	}
+	
+	@Test
+	public void testGenerateFindHistoricalNotificationsByResponsibilityQueryFUTURE() {
+		HTblResponsibility hTblResponsibility = createHTblResponsibility(1, 2);
+		List<HTblResponsibility> hTblResponsibilities = new ArrayList<>();
+		hTblResponsibilities.add(hTblResponsibility);
+
+		expect(mockedQuery.setParameter(anyInt(), anyObject())).andReturn(mockedQuery);
+		expect(mockedEm.createNativeQuery(anyString(), eq(TblNotification.class))).andReturn(mockedQuery).anyTimes();
+		replay(mockedQuery);
+		replay(mockedEm);
+		notificationQueryCreator = new NotificationQueryCreator(mockedEm, "");
+		notificationQueryCreator.generateFindHistoricalNotificationsByResponsibilityQuery(hTblResponsibilities,
+				ListType.FUTURE);
+	}
+	
+	@Test
+	public void testGenerateFindHistoricalNotificationsByResponsibilityQueryDefault() {
+		HTblResponsibility hTblResponsibility = createHTblResponsibility(1, 2);
+		List<HTblResponsibility> hTblResponsibilities = new ArrayList<>();
+		hTblResponsibilities.add(hTblResponsibility);
+
+		expect(mockedQuery.setParameter(anyInt(), anyObject())).andReturn(mockedQuery);
+		expect(mockedEm.createNativeQuery(anyString(), eq(TblNotification.class))).andReturn(mockedQuery).anyTimes();
+		replay(mockedQuery);
+		replay(mockedEm);
+		notificationQueryCreator = new NotificationQueryCreator(mockedEm, "");
+		notificationQueryCreator.generateFindHistoricalNotificationsByResponsibilityQuery(hTblResponsibilities,
+				ListType.ALL);
+	}
+	
+/** Testing  generateFindNotificationsMatchingSearchCriteriaQuery  - Begin -*/	
+	
+	@Test
+	public void testGsfWithDefaultValues() {
+		GlobalSearchFilter gsf = new GlobalSearchFilter();
+		mockTypedQuery(gsf);
+	}
+	
+	@Test
+	public void testGsfWithInitialValues() {
+		GlobalSearchFilter gsf = new GlobalSearchFilter();
+		gsf.setFastSearchSelected(Boolean.TRUE);
+		gsf.setFkRefBranch(null);
+		gsf.setFkRefGridTerritory(null);
+		gsf.setResponsibilityForwarding(null);
+		gsf.setSearchString(null);
+		gsf.setStatusClosedSelection(Boolean.TRUE);
+		gsf.setStatusDoneSelection(Boolean.TRUE);
+		gsf.setStatusInWorkSelection(Boolean.TRUE);
+		gsf.setStatusOpenSelection(Boolean.TRUE);
+		mockTypedQuery(gsf);
+	}
+	
+	@Test
+	public void testGsfWithRandomSelection() {
+		GlobalSearchFilter gsf = new GlobalSearchFilter();
+		gsf.setFastSearchSelected(Boolean.FALSE);
+		gsf.setFkRefBranch(1);
+		gsf.setFkRefGridTerritory(2);
+		gsf.setResponsibilityForwarding("Maier");
+		gsf.setSearchString("Tag");
+		gsf.setStatusClosedSelection(Boolean.FALSE);
+		gsf.setStatusDoneSelection(Boolean.FALSE);
+		gsf.setStatusInWorkSelection(Boolean.FALSE);
+		gsf.setStatusOpenSelection(Boolean.TRUE);
+		mockTypedQuery(gsf);
+	}
+	
+	private void mockTypedQuery (GlobalSearchFilter gsf) {
+		expect(mockedTypedQuery.setParameter(anyInt(), anyObject())).andReturn(mockedTypedQuery);
+		expect(mockedEm.createQuery(anyString(), eq(TblNotification.class))).andReturn(mockedTypedQuery).anyTimes();
+		replay(mockedTypedQuery);
+		replay(mockedEm);
+		notificationQueryCreator = new NotificationQueryCreator(mockedEm, "");
+		notificationQueryCreator.generateFindNotificationsMatchingSearchCriteriaQuery(gsf);
+	}
+
+	/** Testing generateFindNotificationsMatchingSearchCriteriaQuery  - End - */	
+ 
+	private Date createDate(int year, int month, int day) {
+		 Calendar calendar = Calendar.getInstance();
+		 calendar.set(year,  month, day);
+		 return calendar.getTime();
+	}
+	
+	private Timestamp createTimestamp(int year, int month, int day, int hour, int min, int sec) {
+
+		Calendar calendar = Calendar.getInstance();
+		calendar.set(Calendar.YEAR, year);
+		calendar.set(Calendar.MONTH, month);
+		calendar.set(Calendar.DAY_OF_MONTH, day);
+		calendar.set(Calendar.HOUR, hour);
+		calendar.set(Calendar.MINUTE, min);
+		calendar.set(Calendar.SECOND, 0);
+		calendar.set(Calendar.MILLISECOND, sec);
+		Date date = calendar.getTime();
+		return new Timestamp(date.getTime());
+	}
+	
+	private HTblResponsibility createHTblResponsibility(int fkBranch, int fkGridTerritory) {
+		 RefBranch refBranch = new RefBranch();
+		 refBranch.setId(fkBranch);
+		 RefGridTerritory refGridTerritory = new RefGridTerritory();
+		 refGridTerritory.setId(fkGridTerritory);
+		 HTblResponsibility hTblResponsibility = new HTblResponsibility();
+		 hTblResponsibility.setRefBranch(refBranch);
+		 hTblResponsibility.setRefGridTerritory(refGridTerritory);
+		 hTblResponsibility.setTransferDate(createTimestamp(2017,8,17,7,0,0));
+		 return hTblResponsibility;
+	}
+
+	private TblResponsibility createTblResponsibility(Integer id, Integer branchId, Integer gridTerritoryId, Integer fkMaster) {
+		 TblResponsibility tblResponsibility = new TblResponsibility();
+		 tblResponsibility.setId(id);
+		 RefBranch branch = new RefBranch();
+		 branch.setId(branchId);
+		 tblResponsibility.setRefBranch(branch);
+		 RefGridTerritory gridTerritory = new RefGridTerritory();
+		 gridTerritory.setId(gridTerritoryId);
+		 Whitebox.setInternalState(gridTerritory, "fkRefMaster", fkMaster);
+		 tblResponsibility.setRefGridTerritory(gridTerritory);
+		 return tblResponsibility;
+	}
+
+}
diff --git a/src/test/java/org/eclipse/openk/elogbook/viewmodel/ErrorReturnTest.java b/src/test/java/org/eclipse/openk/elogbook/viewmodel/ErrorReturnTest.java
new file mode 100644
index 0000000..2489471
--- /dev/null
+++ b/src/test/java/org/eclipse/openk/elogbook/viewmodel/ErrorReturnTest.java
@@ -0,0 +1,30 @@
+package org.eclipse.openk.elogbook.viewmodel;
+
+import static org.eclipse.openk.elogbook.common.JsonGeneratorBase.getGson;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
+
+import org.eclipse.openk.elogbook.common.util.ResourceLoaderBase;
+import org.junit.Test;
+
+public class ErrorReturnTest extends ResourceLoaderBase {
+	// IMPORTANT TEST!!!
+	// Make sure, our Interface produces a DEFINED Json!
+	// Changes in the interface will HOPEFULLY crash here!!!
+
+	@Test
+	public void TestStructureAgainstJson() {
+		String json = super.loadStringFromResource("testErrorReturn.json");
+		ErrorReturn errRet = getGson().fromJson(json, ErrorReturn.class);
+		assertFalse(errRet.getErrorText().isEmpty());
+		assertEquals(errRet.getErrorCode(), 999);
+	}
+
+	@Test
+	public void TestSetters() {
+		ErrorReturn errRet = new ErrorReturn();
+		errRet.setErrorCode(1);
+		errRet.setErrorText("bla bla");
+	}
+
+}
diff --git a/src/test/java/org/eclipse/openk/elogbook/viewmodel/GeneralReturnItemTest.java b/src/test/java/org/eclipse/openk/elogbook/viewmodel/GeneralReturnItemTest.java
new file mode 100644
index 0000000..c45dc78
--- /dev/null
+++ b/src/test/java/org/eclipse/openk/elogbook/viewmodel/GeneralReturnItemTest.java
@@ -0,0 +1,31 @@
+package org.eclipse.openk.elogbook.viewmodel;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertTrue;
+
+import org.eclipse.openk.elogbook.common.JsonGeneratorBase;
+import org.eclipse.openk.elogbook.common.util.ResourceLoaderBase;
+import org.junit.Test;
+
+public class GeneralReturnItemTest extends ResourceLoaderBase {
+	// IMPORTANT TEST!!!
+	// Make sure, our Interface produces a DEFINED Json!
+	// Changes in the interface will HOPEFULLY crash here!!!
+
+	@Test
+	public void TestStructureAgainstJson() {
+		String json = super.loadStringFromResource("testGeneralReturnItem.json");
+		GeneralReturnItem gRRet = JsonGeneratorBase.getGson().fromJson(json, GeneralReturnItem.class);
+		assertEquals(gRRet.getRet(), "It works!");
+	}
+
+	@Test
+	public void TestSetters() {
+		GeneralReturnItem gri = new GeneralReturnItem("firstStrike");
+		assertTrue("firstStrike".equals(gri.getRet()));
+		gri.setRet("Retour");
+		assertTrue("Retour".equals(gri.getRet()));
+
+	}
+
+}
diff --git a/src/test/java/org/eclipse/openk/elogbook/viewmodel/HistoricalResponsibilityTest.java b/src/test/java/org/eclipse/openk/elogbook/viewmodel/HistoricalResponsibilityTest.java
new file mode 100644
index 0000000..2e97a49
--- /dev/null
+++ b/src/test/java/org/eclipse/openk/elogbook/viewmodel/HistoricalResponsibilityTest.java
@@ -0,0 +1,56 @@
+package org.eclipse.openk.elogbook.viewmodel;
+
+import org.eclipse.openk.elogbook.common.JsonGeneratorBase;
+import org.eclipse.openk.elogbook.common.util.ResourceLoaderBase;
+import org.eclipse.openk.elogbook.persistence.model.RefBranch;
+import org.eclipse.openk.elogbook.persistence.model.RefGridTerritory;
+import org.junit.Test;
+
+import java.util.Date;
+
+import static org.junit.Assert.assertTrue;
+
+public class HistoricalResponsibilityTest extends ResourceLoaderBase {
+    // IMPORTANT TEST!!!
+    // Make sure, our Interface produces a DEFINED Json!
+    // Changes in the interface will HOPEFULLY crash here!!!
+
+    @Test
+    public void testStructureAgainstJson() {
+        String json = super.loadStringFromResource("testHistoricalResponsibility.json");
+        HistoricalResponsibility hresp = JsonGeneratorBase.getGson().fromJson(json, HistoricalResponsibility.class);
+        Date earlyDate = new Date(1000L * 60 * 60 * 24 * 365 * 5);
+
+        //assertNotNull( hresp );
+        assertTrue(hresp.getId() == 1);
+        assertTrue( hresp.getResponsibleUser().equals("responsibleUser"));
+        assertTrue( hresp.getFormerResponsibleUser().equals("formerResponsibleUser"));
+        assertTrue( hresp.getCreateUser().equals("createUser"));
+        assertTrue( hresp.getModUser().equals("modUser"));
+        assertTrue( hresp.getTransactionId() == 2);
+        assertTrue( hresp.getRefBranch().getId() == 33);
+        assertTrue( hresp.getRefGridTerritory().getId() == 44);
+        assertTrue( earlyDate.before(hresp.getCreateDate()));
+        assertTrue( earlyDate.before(hresp.getModDate()));
+        assertTrue( earlyDate.before(hresp.getTransferDate()));
+
+    }
+
+    @Test
+    public void testSetters() {
+        Date aDate = new Date(1000L * 60 * 60 * 24 * 365 * 5);
+
+        HistoricalResponsibility hresp = new HistoricalResponsibility();
+        hresp.setId(1);
+        hresp.setResponsibleUser("responsibleUser");
+        hresp.setFormerResponsibleUser("formerResponsibleUser");
+        hresp.setCreateUser("createUser");
+        hresp.setModUser("modUser");
+        hresp.setTransactionId(2);
+        hresp.setRefBranch(new RefBranch());
+        hresp.setRefGridTerritory(new RefGridTerritory());
+        hresp.setCreateDate(aDate);
+        hresp.setModDate(aDate);
+        hresp.setTransferDate(aDate);
+    }
+}
diff --git a/src/test/java/org/eclipse/openk/elogbook/viewmodel/HistoricalShiftChangesTest.java b/src/test/java/org/eclipse/openk/elogbook/viewmodel/HistoricalShiftChangesTest.java
new file mode 100644
index 0000000..557ad39
--- /dev/null
+++ b/src/test/java/org/eclipse/openk/elogbook/viewmodel/HistoricalShiftChangesTest.java
@@ -0,0 +1,47 @@
+package org.eclipse.openk.elogbook.viewmodel;
+
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertTrue;
+
+import java.util.ArrayList;
+import java.util.Calendar;
+import java.util.Date;
+
+import org.eclipse.openk.elogbook.common.JsonGeneratorBase;
+import org.eclipse.openk.elogbook.common.util.ResourceLoaderBase;
+import org.junit.Test;
+
+public class HistoricalShiftChangesTest extends ResourceLoaderBase {
+
+    @Test
+   
+    public void TestStructureAgainstJson() {
+        String json = super.loadStringFromResource("testHistoricalShiftChanges.json");
+
+        HistoricalShiftChanges shiftChanges = JsonGeneratorBase.getGson().fromJson(json, HistoricalShiftChanges.class);
+        Calendar calendar = Calendar.getInstance();
+        calendar.set(2017, Calendar.JULY, 17);
+        Date compareDate = calendar.getTime();
+       
+        assertNotNull(shiftChanges);
+        assertTrue(compareDate.after(shiftChanges.getTransferDateFrom()));
+        assertTrue(compareDate.before(shiftChanges.getTransferDateTo()));
+       assertEquals(shiftChanges.getHistoricalResponsibilities().size(), 10);
+ 
+    }
+
+    @Test
+    public void testSetters() {
+        Date now = new Date();
+        HistoricalShiftChanges shiftChanges = new HistoricalShiftChanges();
+        shiftChanges.setTransferDateFrom(now);
+        shiftChanges.setTransferDateTo(now);
+        shiftChanges.setHistoricalResponsibilities(new ArrayList<HistoricalResponsibility>());
+        
+        assertEquals(now, shiftChanges.getTransferDateFrom());
+        assertEquals(now, shiftChanges.getTransferDateTo());
+        assertTrue(shiftChanges.getHistoricalResponsibilities().isEmpty());
+    }
+}
diff --git a/src/test/java/org/eclipse/openk/elogbook/viewmodel/LoginCredentialsTest.java b/src/test/java/org/eclipse/openk/elogbook/viewmodel/LoginCredentialsTest.java
new file mode 100644
index 0000000..62846bf
--- /dev/null
+++ b/src/test/java/org/eclipse/openk/elogbook/viewmodel/LoginCredentialsTest.java
@@ -0,0 +1,29 @@
+package org.eclipse.openk.elogbook.viewmodel;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertTrue;
+
+import org.eclipse.openk.elogbook.common.JsonGeneratorBase;
+import org.eclipse.openk.elogbook.common.util.ResourceLoaderBase;
+import org.junit.Test;
+
+public class LoginCredentialsTest extends ResourceLoaderBase {
+
+	@Test
+	public void testStructureAgainstJson() {
+		String json = super.loadStringFromResource("testLoginCredentials.json");
+		LoginCredentials lc = JsonGeneratorBase.getGson().fromJson(json, LoginCredentials.class);
+		assertEquals(lc.getUserName(), "Carlo");
+		assertEquals(lc.getPassword(), "Cottura");
+	}
+
+	@Test
+	public void testSetters() {
+		LoginCredentials lc = new LoginCredentials();
+		lc.setPassword("pwd");
+		assertTrue("pwd".equals(lc.getPassword()));
+		lc.setUserName("usr");
+		assertTrue("usr".equals(lc.getUserName()));
+	}
+
+}
diff --git a/src/test/java/org/eclipse/openk/elogbook/viewmodel/NotificationFileTest.java b/src/test/java/org/eclipse/openk/elogbook/viewmodel/NotificationFileTest.java
new file mode 100644
index 0000000..a84c65d
--- /dev/null
+++ b/src/test/java/org/eclipse/openk/elogbook/viewmodel/NotificationFileTest.java
@@ -0,0 +1,38 @@
+package org.eclipse.openk.elogbook.viewmodel;
+
+import org.eclipse.openk.elogbook.common.JsonGeneratorBase;
+import org.eclipse.openk.elogbook.common.util.ResourceLoaderBase;
+import org.junit.Test;
+
+import static org.junit.Assert.assertTrue;
+
+public class NotificationFileTest extends ResourceLoaderBase {
+    @Test
+    public void testStructureAgainstJson() {
+        String json = super.loadStringFromResource("testNotificationFile.json");
+        NotificationFile notFile = JsonGeneratorBase.getGson().fromJson(json, NotificationFile.class);
+
+        assertTrue(notFile.getFileName().equals("test.csv"));
+        assertTrue(notFile.getCreationDate().equals("2017-09-25T12:00:01.635887Z"));
+        assertTrue(notFile.getCreator().equals("admin"));
+        assertTrue(notFile.getType().equals("csv"));
+        assertTrue(notFile.getSize() == 5);
+        assertTrue(notFile.getBranchName().equals("S"));
+        assertTrue(notFile.getGridTerritoryName().equals("MA"));
+        assertTrue(notFile.getNotificationText().equals("This is a simple test text"));
+
+    }
+
+    @Test
+    public void testSetters() {
+        NotificationFile notFile = new NotificationFile();
+        notFile.setFileName("testNotificationFile.json");
+        notFile.setCreationDate("2017-09-25T12:00:01.635887Z");
+        notFile.setCreator("admin");
+        notFile.setType("csv");
+        notFile.setSize((long) 5);
+        notFile.setBranchName("S");
+        notFile.setGridTerritoryName("MA");
+        notFile.setNotificationText("This is a simple test text");
+    }
+}
diff --git a/src/test/java/org/eclipse/openk/elogbook/viewmodel/NotificationSearchFilterTest.java b/src/test/java/org/eclipse/openk/elogbook/viewmodel/NotificationSearchFilterTest.java
new file mode 100644
index 0000000..238e2c1
--- /dev/null
+++ b/src/test/java/org/eclipse/openk/elogbook/viewmodel/NotificationSearchFilterTest.java
@@ -0,0 +1,66 @@
+package org.eclipse.openk.elogbook.viewmodel;
+
+
+import org.eclipse.openk.elogbook.common.JsonGeneratorBase;
+import org.eclipse.openk.elogbook.common.util.ResourceLoaderBase;
+import org.junit.Test;
+
+import java.util.ArrayList;
+import java.util.Date;
+
+import static org.junit.Assert.*;
+
+public class NotificationSearchFilterTest extends ResourceLoaderBase {
+    // IMPORTANT TEST!!!
+    // Make sure, our Interface produces a DEFINED Json!
+    // Changes in the interface will HOPEFULLY crash here!!!
+
+    @Test
+    public void TestStructureAgainstJson() {
+        String json = super.loadStringFromResource("testNotificationSearchFilter.json");
+
+        NotificationSearchFilter nsf = JsonGeneratorBase.getGson().fromJson(json, NotificationSearchFilter.class);
+        Date earlyDate = new Date(1000L * 60 * 60 * 24 * 365 * 5);
+        assertNotNull(nsf);
+        assertTrue(earlyDate.before(nsf.getDateFrom()));
+        assertTrue(earlyDate.before(nsf.getDateTo()));
+        assertNotNull(nsf.getResponsibilityFilterList());
+        assertTrue(nsf.getResponsibilityFilterList().size() == 2);
+        assertTrue(earlyDate.before(nsf.getReminderDate()));
+    }
+
+    @Test
+    public void testSetters() {
+        Date earlyDate = new Date(1000L * 60 * 60 * 24 * 365 * 5);
+        Date now = new Date(System.currentTimeMillis());
+        NotificationSearchFilter nsf = new NotificationSearchFilter();
+        nsf.setDateFrom(earlyDate);
+        assertEquals(earlyDate, nsf.getDateFrom());
+
+        nsf.setDateTo(now);
+        assertEquals(now, nsf.getDateTo());
+
+        nsf.setResponsibilityFilterList(new ArrayList<>());
+        nsf.getResponsibilityFilterList().add(Integer.valueOf(3));
+        nsf.getResponsibilityFilterList().add(Integer.valueOf(19));
+        nsf.getResponsibilityFilterList().add(Integer.valueOf(22));
+        nsf.setReminderDate(now);
+        
+        nsf.setHistoricalFlag(Boolean.TRUE);
+        nsf.setShiftChangeTransactionId(Integer.valueOf(34));
+
+        assertEquals(Integer.valueOf(3), nsf.getResponsibilityFilterList().get(0));
+        assertEquals(Integer.valueOf(19), nsf.getResponsibilityFilterList().get(1));
+        assertEquals(Integer.valueOf(22), nsf.getResponsibilityFilterList().get(2));
+        assertEquals(now, nsf.getReminderDate());
+        assertEquals(Boolean.TRUE, nsf.isHistoricalFlag());
+        assertEquals(Integer.valueOf(34), nsf.getShiftChangeTransactionId());
+    }
+
+	@Test
+	public void testHistoricalFlag() {
+		NotificationSearchFilter nsf = new NotificationSearchFilter();
+		assertNotNull(nsf.isHistoricalFlag());
+		assertFalse(nsf.isHistoricalFlag());
+	}
+}
diff --git a/src/test/java/org/eclipse/openk/elogbook/viewmodel/NotificationTest.java b/src/test/java/org/eclipse/openk/elogbook/viewmodel/NotificationTest.java
new file mode 100644
index 0000000..5579076
--- /dev/null
+++ b/src/test/java/org/eclipse/openk/elogbook/viewmodel/NotificationTest.java
@@ -0,0 +1,122 @@
+package org.eclipse.openk.elogbook.viewmodel;
+
+
+import org.eclipse.openk.elogbook.common.JsonGeneratorBase;
+import org.eclipse.openk.elogbook.common.util.ResourceLoaderBase;
+import org.junit.Test;
+
+import java.util.ArrayList;
+import java.util.Date;
+
+import static org.junit.Assert.*;
+
+public class NotificationTest extends ResourceLoaderBase {
+    // IMPORTANT TEST!!!
+    // Make sure, our Interface produces a DEFINED Json!
+    // Changes in the interface will HOPEFULLY crash here!!!
+
+    @Test
+    public void testStructureAgainstJson() {
+        String json = super.loadStringFromResource("testNotification.json");
+
+        Notification noti[] = JsonGeneratorBase.getGson().fromJson(json, Notification[].class);
+
+        Date earlyDate = new Date(1000L * 60 * 60 * 24 * 365 * 5);
+
+        assertNotNull( noti );
+        assertEquals( noti.length, 3);
+        assertEquals((int) noti[0].getId(), 1);
+        assertEquals((int) noti[0].getIncidentId(), 23);
+        assertFalse( noti[0].isSelected() );
+        assertTrue( noti[0].getStatus().equals("offen") );
+        assertTrue( noti[1].getNotificationText().equals("Fehler Bereich D") );
+        assertTrue( noti[1].getFreeText().equals("free Willi"));
+        assertTrue( noti[0].getFreeText().equals(""));
+        assertTrue(noti[1].getFreeTextExtended().equals("aa"));
+        assertTrue( noti[0].getResponsibilityForwarding().equals(""));
+        assertTrue( noti[0].getResponsibilityControlPoint().equals("Abteilung 4"));
+        assertTrue( earlyDate.before(noti[1].getReminderDate()));
+        assertNull( noti[0].getReminderDate());
+        assertNull( noti[0].getFutureDate());
+        assertTrue( earlyDate.before(noti[0].getCreateDate()));
+        assertNull( noti[0].getExpectedFinishDate());
+        assertNull( noti[0].getFinishedDate());
+        assertTrue( noti[1].getCreateUser().equals("MasterAndServant"));
+        assertTrue(earlyDate.before((noti[0].getModDate())));
+        assertTrue(noti[0].getModUser().equals("_fd"));
+        assertEquals((int) noti[0].getVersion(), 33);
+        assertEquals(noti[0].getFkRefBranch().intValue(), 44);
+        assertEquals(noti[0].getFkRefNotificationStatus().intValue(), 55);
+        assertEquals(noti[0].getFkRefGridTerritory().intValue(),1);
+    }
+
+    @Test
+    public void testSetters() {
+        Date aDate = new Date(1000L * 60 * 60 * 24 * 365 * 5);
+        Notification noti = new Notification();
+        noti.setId(1);
+        assertEquals((int) noti.getId(), 1);
+
+        noti.setIncidentId(2);
+        assertEquals(2, (int) noti.getIncidentId());
+
+        noti.setSelected(false);
+        assertFalse(noti.isSelected());
+
+        noti.setStatus("offen");
+        assertTrue(noti.getStatus().equals("offen"));
+
+        noti.setNotificationText("Fehler Bereich D");
+        assertTrue(noti.getNotificationText().equals("Fehler Bereich D"));
+
+        noti.setFreeText("free Willi");
+        assertTrue(noti.getFreeText().equals("free Willi"));
+
+        noti.setResponsibilityForwarding("fff");
+        assertTrue(noti.getResponsibilityForwarding().equals("fff"));
+
+        noti.setResponsibilityControlPoint("Abteilung 4");
+        assertTrue(noti.getResponsibilityControlPoint().equals("Abteilung 4"));
+
+        noti.setReminderDate(aDate);
+        assertEquals(aDate, noti.getReminderDate());
+
+        Date now = new Date(System.currentTimeMillis());
+        noti.setFutureDate(now);
+        assertEquals(noti.getFutureDate(), now);
+
+        noti.setCreateDate(aDate);
+        assertEquals(aDate, noti.getCreateDate());
+
+        noti.setExpectedFinishDate(now);
+        assertEquals(noti.getExpectedFinishDate(), now);
+
+        noti.setFinishedDate(aDate);
+        assertEquals(aDate, noti.getFinishedDate());
+
+        noti.setCreateUser("MasterAndServant");
+        assertTrue(noti.getCreateUser().equals("MasterAndServant"));
+
+        noti.setModDate(now);
+        assertEquals(noti.getModDate(), now);
+
+        noti.setModUser("Modmod");
+        assertEquals("Modmod", noti.getModUser());
+
+        noti.setVersion(77);
+        assertEquals((int) noti.getVersion(), 77);
+
+        noti.setFkRefBranch(555);
+        assertEquals(555, noti.getFkRefBranch().intValue());
+
+        noti.setFkRefNotificationStatus(666);
+        assertEquals(666, noti.getFkRefNotificationStatus().intValue());
+
+        noti.setBeginDate(aDate);
+        assertEquals(aDate, noti.getBeginDate());
+
+        noti.setNotificationList(new ArrayList<Notification>());
+        assertTrue(noti.getNotificationList().isEmpty());
+
+    }
+}
diff --git a/src/test/java/org/eclipse/openk/elogbook/viewmodel/ReminderSearchFilterTest.java b/src/test/java/org/eclipse/openk/elogbook/viewmodel/ReminderSearchFilterTest.java
new file mode 100644
index 0000000..4cc053c
--- /dev/null
+++ b/src/test/java/org/eclipse/openk/elogbook/viewmodel/ReminderSearchFilterTest.java
@@ -0,0 +1,49 @@
+package org.eclipse.openk.elogbook.viewmodel;
+
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertTrue;
+
+import java.util.ArrayList;
+import java.util.Date;
+import org.eclipse.openk.elogbook.common.JsonGeneratorBase;
+import org.eclipse.openk.elogbook.common.util.ResourceLoaderBase;
+import org.junit.Test;
+
+public class ReminderSearchFilterTest extends ResourceLoaderBase {
+    // IMPORTANT TEST!!!
+    // Make sure, our Interface produces a DEFINED Json!
+    // Changes in the interface will HOPEFULLY crash here!!!
+
+    @Test
+    public void TestStructureAgainstJson() {
+        String json = super.loadStringFromResource("testReminderSearchFilter.json");
+        Date earlyDate = new Date(1000L * 60 * 60 * 24 * 365 * 5);
+        ReminderSearchFilter rsf = JsonGeneratorBase.getGson().fromJson(json, ReminderSearchFilter.class);
+        assertNotNull(rsf);
+        assertTrue(earlyDate.before(rsf.getReminderDate()));
+        assertNotNull(rsf.getResponsibilityFilterList());
+        assertTrue(rsf.getResponsibilityFilterList().size() == 2);
+    }
+
+    @Test
+    public void testSetters() {
+        Date earlyDate = new Date(1000L * 60 * 60 * 24 * 365 * 5);
+        Date now = new Date(System.currentTimeMillis());
+        ReminderSearchFilter nsf = new ReminderSearchFilter();
+        nsf.setReminderDate(earlyDate);
+        assertEquals(earlyDate, nsf.getReminderDate());
+
+        nsf.setResponsibilityFilterList(new ArrayList<>());
+        nsf.getResponsibilityFilterList().add(3);
+        nsf.getResponsibilityFilterList().add(19);
+        nsf.getResponsibilityFilterList().add(22);
+        nsf.setReminderDate(now);
+
+        assertEquals(Integer.valueOf(3), nsf.getResponsibilityFilterList().get(0));
+        assertEquals(Integer.valueOf(19), nsf.getResponsibilityFilterList().get(1));
+        assertEquals(Integer.valueOf(22), nsf.getResponsibilityFilterList().get(2));
+        assertEquals(now, nsf.getReminderDate());
+    }
+}
diff --git a/src/test/java/org/eclipse/openk/elogbook/viewmodel/ResponsibilitySearchFilterTest.java b/src/test/java/org/eclipse/openk/elogbook/viewmodel/ResponsibilitySearchFilterTest.java
new file mode 100644
index 0000000..70a37b6
--- /dev/null
+++ b/src/test/java/org/eclipse/openk/elogbook/viewmodel/ResponsibilitySearchFilterTest.java
@@ -0,0 +1,44 @@
+package org.eclipse.openk.elogbook.viewmodel;
+
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertTrue;
+
+import java.util.Calendar;
+import java.util.Date;
+
+import org.eclipse.openk.elogbook.common.JsonGeneratorBase;
+import org.eclipse.openk.elogbook.common.util.ResourceLoaderBase;
+import org.junit.Test;
+
+public class ResponsibilitySearchFilterTest extends ResourceLoaderBase {
+
+    @Test
+   
+    public void TestStructureAgainstJson() {
+        String json = super.loadStringFromResource("testResponsibilitySearchFilter.json");
+
+        ResponsibilitySearchFilter filter = JsonGeneratorBase.getGson().fromJson(json, ResponsibilitySearchFilter.class);
+        Calendar calendar = Calendar.getInstance();
+        calendar.set(2017, Calendar.JULY, 17);
+        Date compareDate = calendar.getTime();
+       
+        assertNotNull(filter);
+        assertTrue(compareDate.after(filter.getTransferDateFrom()));
+        assertTrue(compareDate.before(filter.getTransferDateTo()));
+       //assertTrue(calendar.get(Calendar.MONTH).equals(filter.getTransferDateTo().get(Calendar.MONTH)));
+ 
+    }
+
+    @Test
+    public void testSetters() {
+        Date now = new Date();
+        ResponsibilitySearchFilter filter = new ResponsibilitySearchFilter();
+        filter.setTransferDateFrom(now);
+        filter.setTransferDateTo(now);
+        
+        assertEquals(now, filter.getTransferDateFrom());
+        assertEquals(now, filter.getTransferDateTo());
+    }
+}
diff --git a/src/test/java/org/eclipse/openk/elogbook/viewmodel/ResponsibilityTest.java b/src/test/java/org/eclipse/openk/elogbook/viewmodel/ResponsibilityTest.java
new file mode 100644
index 0000000..a40eded
--- /dev/null
+++ b/src/test/java/org/eclipse/openk/elogbook/viewmodel/ResponsibilityTest.java
@@ -0,0 +1,34 @@
+package org.eclipse.openk.elogbook.viewmodel;
+
+
+import static org.junit.Assert.assertTrue;
+
+import org.eclipse.openk.elogbook.common.JsonGeneratorBase;
+import org.eclipse.openk.elogbook.common.util.ResourceLoaderBase;
+import org.junit.Test;
+
+public class ResponsibilityTest extends ResourceLoaderBase {
+    // IMPORTANT TEST!!!
+    // Make sure, our Interface produces a DEFINED Json!
+    // Changes in the interface will HOPEFULLY crash here!!!
+
+    @Test
+    public void testStructureAgainstJson() {
+        String json = super.loadStringFromResource("testResponsibility.json");
+        Responsibility resp = JsonGeneratorBase.getGson().fromJson(json, Responsibility.class);
+
+        assertTrue(resp.getId() == 3);
+        assertTrue(resp.getResponsibleUser().equals("currentResponsibleUser"));
+        assertTrue(resp.getNewResponsibleUser().equals("newResponsibleUser"));
+        assertTrue(resp.getBranchName().equals("W"));
+        assertTrue(resp.isActive());
+    }
+
+    @Test
+    public void testSetters() {
+        Responsibility resp = new Responsibility();
+        resp.setId(3);
+        resp.setBranchName("S");
+        resp.setIsActive(true);
+    }
+}
diff --git a/src/test/java/org/eclipse/openk/elogbook/viewmodel/TerritoryResponsibilityTest.java b/src/test/java/org/eclipse/openk/elogbook/viewmodel/TerritoryResponsibilityTest.java
new file mode 100644
index 0000000..6d37667
--- /dev/null
+++ b/src/test/java/org/eclipse/openk/elogbook/viewmodel/TerritoryResponsibilityTest.java
@@ -0,0 +1,45 @@
+package org.eclipse.openk.elogbook.viewmodel;
+
+
+import static org.junit.Assert.assertTrue;
+
+import com.google.gson.reflect.TypeToken;
+import java.util.ArrayList;
+import java.util.List;
+import org.eclipse.openk.elogbook.common.Globals;
+import org.eclipse.openk.elogbook.common.JsonGeneratorBase;
+import org.eclipse.openk.elogbook.common.util.ResourceLoaderBase;
+import org.junit.Test;
+
+public class TerritoryResponsibilityTest extends ResourceLoaderBase {
+    // IMPORTANT TEST!!!
+    // Make sure, our Interface produces a DEFINED Json!
+    // Changes in the interface will HOPEFULLY crash here!!!
+
+    @Test
+    public void testStructureAgainstJson() {
+        String json = super.loadStringFromResource("testTerritoryResponsibility.json");
+        List<TerritoryResponsibility> territoryResponsiblityList = JsonGeneratorBase.getGson().fromJson(json, new TypeToken<List<TerritoryResponsibility>>(){}.getType());
+
+        assertTrue(territoryResponsiblityList.size() == 3);
+        assertTrue(territoryResponsiblityList.get(0).getResponsibilityList().size() == 4);
+        assertTrue(territoryResponsiblityList.get(0).getGridTerritoryDescription().equals("Mannheim"));
+        assertTrue(territoryResponsiblityList.get(0).getResponsibilityList().get(0).getResponsibleUser().equals("responsibleUser1"));
+        assertTrue(territoryResponsiblityList.get(0).getResponsibilityList().get(0).getNewResponsibleUser().equals("newResponsibleUser"));
+        assertTrue(territoryResponsiblityList.get(0).getResponsibilityList().get(0).getBranchName().equals(Globals.ELECTRICITY_MARK));
+
+        assertTrue(territoryResponsiblityList.get(2).getResponsibilityList().get(1).getId() == 45);
+
+    }
+
+    @Test
+    public void testSetters() {
+        TerritoryResponsibility territoryResponsibility =  new TerritoryResponsibility();
+        territoryResponsibility.setGridTerritoryDescription("Ort1");
+        List<Responsibility> responsibilityList = new ArrayList<>();
+        territoryResponsibility.setResponsibilityList(responsibilityList);
+
+        assertTrue(territoryResponsibility.getGridTerritoryDescription().equals("Ort1"));
+        assertTrue(territoryResponsibility.getResponsibilityList().size() == 0);
+    }
+}
diff --git a/src/test/java/org/eclipse/openk/elogbook/viewmodel/TestTypeMapper.java b/src/test/java/org/eclipse/openk/elogbook/viewmodel/TestTypeMapper.java
new file mode 100644
index 0000000..b9a071f
--- /dev/null
+++ b/src/test/java/org/eclipse/openk/elogbook/viewmodel/TestTypeMapper.java
@@ -0,0 +1,40 @@
+package org.eclipse.openk.elogbook.viewmodel;
+
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.fail;
+
+import org.eclipse.openk.elogbook.exceptions.BtbException;
+import org.junit.Test;
+
+public class TestTypeMapper {
+
+    @Test
+    public void listTypeFromString() throws BtbException {
+        assertEquals(ListTypeMapper.listTypeFromString( "CuRRent" ), Notification.ListType.CURRENT);
+        assertEquals(ListTypeMapper.listTypeFromString( "futuRe" ), Notification.ListType.FUTURE);
+        assertEquals(ListTypeMapper.listTypeFromString( "past" ), Notification.ListType.PAST);
+        assertEquals(ListTypeMapper.listTypeFromString( "OPEN" ), Notification.ListType.OPEN);
+    }
+
+    @Test
+    public void testListTypeFromInvalidString () {
+    	try {
+    		ListTypeMapper.listTypeFromString( "WeissDerGeierWas" );
+			fail("Expected BtbBadRequest(\"Unknown parameter value: \"" + "WeissDerGeierWas");
+		} catch (BtbException e) {
+			assertEquals(e.getMessage(), "Unknown parameter value: WeissDerGeierWas");
+		}
+	}
+
+    @Test
+    public void testListTypeFromNullString () {
+    	try {
+    		ListTypeMapper.listTypeFromString( null );
+			fail("Expected BtbBadRequest(\"Unknown parameter value: \"" + "null");
+		} catch (BtbException e) {
+			assertEquals(e.getMessage(), "Unknown parameter value: null");
+		}
+	}
+}
+
diff --git a/src/test/java/org/eclipse/openk/elogbook/viewmodel/UserAuthenticationTest.java b/src/test/java/org/eclipse/openk/elogbook/viewmodel/UserAuthenticationTest.java
new file mode 100644
index 0000000..eaca3a8
--- /dev/null
+++ b/src/test/java/org/eclipse/openk/elogbook/viewmodel/UserAuthenticationTest.java
@@ -0,0 +1,36 @@
+package org.eclipse.openk.elogbook.viewmodel;
+
+
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertTrue;
+
+import org.eclipse.openk.elogbook.common.JsonGeneratorBase;
+import org.eclipse.openk.elogbook.common.util.ResourceLoaderBase;
+import org.junit.Test;
+
+public class UserAuthenticationTest extends ResourceLoaderBase {
+
+    @Test
+    public void testStructureAgainstJson() {
+        String json = super.loadStringFromResource("testUserAuthentication.json");
+        UserAuthentication ua = JsonGeneratorBase.getGson().fromJson(json, UserAuthentication.class);
+        assertTrue(ua.getId().equals("1") );
+        assertTrue(ua.getUsername().equals("Pedro"));
+        assertTrue(ua.getPassword().equals("pwd"));
+        assertTrue(ua.getName().equals("Pedro Pepito Sanchez"));
+        assertFalse(ua.isSpecialUser());
+        assertTrue(ua.isSelected());
+    }
+
+    @Test
+    public void testSetters() {
+        UserAuthentication ua = new UserAuthentication();
+        ua.setId("1");
+        ua.setName("Vamos-Namos");
+        ua.setPassword("passoporto");
+        ua.setUsername("VNAMOS");
+        ua.setSpecialUser(true);
+        ua.setSelected(true);
+    }
+
+}
diff --git a/src/test/java/org/eclipse/openk/elogbook/viewmodel/VersionInfoTest.java b/src/test/java/org/eclipse/openk/elogbook/viewmodel/VersionInfoTest.java
new file mode 100644
index 0000000..98439ea
--- /dev/null
+++ b/src/test/java/org/eclipse/openk/elogbook/viewmodel/VersionInfoTest.java
@@ -0,0 +1,31 @@
+package org.eclipse.openk.elogbook.viewmodel;
+
+
+import static org.junit.Assert.assertTrue;
+
+import org.eclipse.openk.elogbook.common.JsonGeneratorBase;
+import org.eclipse.openk.elogbook.common.util.ResourceLoaderBase;
+import org.junit.Test;
+
+public class VersionInfoTest extends ResourceLoaderBase {
+    // IMPORTANT TEST!!!
+    // Make sure, our Interface produces a DEFINED Json!
+    // Changes in the interface will HOPEFULLY crash here!!!
+
+    @Test
+    public void testStructureAgainstJson() {
+        String json = super.loadStringFromResource("VersionInfo.json");
+        VersionInfo vi = JsonGeneratorBase.getGson().fromJson(json, VersionInfo.class);
+
+        assertTrue(vi.getDbVersion().equals("1y.1y.yy"));
+        assertTrue(vi.getBackendVersion().equals("0x.0x.xx"));
+    }
+
+    @Test
+    public void testSetters() {
+        VersionInfo vi = new VersionInfo();
+        vi.setDbVersion("333");
+        vi.setBackendVersion("222");
+    }
+
+}
diff --git a/src/test/resources/JwtAdmin.json b/src/test/resources/JwtAdmin.json
new file mode 100644
index 0000000..dda65c5
--- /dev/null
+++ b/src/test/resources/JwtAdmin.json
@@ -0,0 +1,8 @@
+{
+  "access_token": "eyJhbGciOiJSUzI1NiIsInR5cCIgOiAiSldUIiwia2lkIiA6ICJodVl0eVByUEVLQ1phY3FfMW5sOGZscENETnFHdmZEZHctYUxGQXNoWHZVIn0.eyJqdGkiOiI4ZmY5NTlhZC02ODQ1LTRlOGEtYjRiYi02ODQ0YjAwMjU0ZjgiLCJleHAiOjE1MDY2MDA0NTAsIm5iZiI6MCwiaWF0IjoxNTA2NjAwMTUwLCJpc3MiOiJodHRwOi8vZW50amF2YTAwMjo4MDgwL2F1dGgvcmVhbG1zL2Vsb2dib29rIiwiYXVkIjoiZWxvZ2Jvb2stYmFja2VuZCIsInN1YiI6IjM1OWVmOWM5LTc3ZGYtNGEzZC1hOWM5LWY5NmQ4MzdkMmQ1NyIsInR5cCI6IkJlYXJlciIsImF6cCI6ImVsb2dib29rLWJhY2tlbmQiLCJhdXRoX3RpbWUiOjAsInNlc3Npb25fc3RhdGUiOiI5NjVmNzM1MS0yZThiLTQ1MjgtOWYzZC1lZTYyODNhOTViMTYiLCJhY3IiOiIxIiwiYWxsb3dlZC1vcmlnaW5zIjpbIioiXSwicmVhbG1fYWNjZXNzIjp7InJvbGVzIjpbImVsb2dib29rLXN1cGVydXNlciIsImVsb2dib29rLW5vcm1hbHVzZXIiLCJ1bWFfYXV0aG9yaXphdGlvbiJdfSwicmVzb3VyY2VfYWNjZXNzIjp7InJlYWxtLW1hbmFnZW1lbnQiOnsicm9sZXMiOlsidmlldy11c2VycyIsInF1ZXJ5LWdyb3VwcyIsInF1ZXJ5LXVzZXJzIl19LCJhY2NvdW50Ijp7InJvbGVzIjpbIm1hbmFnZS1hY2NvdW50IiwibWFuYWdlLWFjY291bnQtbGlua3MiLCJ2aWV3LXByb2ZpbGUiXX19LCJuYW1lIjoiQWRtaW5pc3RyYXRvciBBZG1pbmlzdHJhdG93aWNoIiwicHJlZmVycmVkX3VzZXJuYW1lIjoiYWRtaW4iLCJnaXZlbl9uYW1lIjoiQWRtaW5pc3RyYXRvciIsImZhbWlseV9uYW1lIjoiQWRtaW5pc3RyYXRvd2ljaCIsImVtYWlsIjoic2VyZ2VqLmtlcm5AcHRhLmRlIiwicm9sZXN0ZXN0IjoiW2Vsb2dib29rLXN1cGVydXNlciwgZWxvZ2Jvb2stbm9ybWFsdXNlciwgdW1hX2F1dGhvcml6YXRpb24sIG9mZmxpbmVfYWNjZXNzLCB1bWFfYXV0aG9yaXphdGlvbiwgZWxvZ2Jvb2stbm9ybWFsdXNlcl0ifQ.o94Bl43oqyLNzZRABvIq9z-XI8JQjqj2FSDdUUEZGZPTN4uwD5fyi0sONbDxmTFvgWPh_8ZhX6tlDGiupVDBY4eRH43Eettm-t4CDauL7FzB3w3dDPFMB5DhP4rrpk_kATwnY2NKLRbequnh8Z6wLXjcmQNLgrgknXB_gogWAqH29dqKexwceMNIbq-kjaeLsmHSXM9TE9q7_Ln9el04OlkpOVspVguedfINcNFg0DmYLJWyD2ORkOHLmYigN6YnyB9P2NFOnKGlLuQ87GjosI00zBniRGi3PhE9NGd51Qggdbcsm0aM8GiMaZ7SO5i8iQWL10TRFRFyTEfy6hSO8g",
+  "refresh_token": "eyJhbGciOiJSUzI1NiIsInR5cCIgOiAiSldUIiwia2lkIiA6ICJodVl0eVByUEVLQ1phY3FfMW5sOGZscENETnFHdmZEZHctYUxGQXNoWHZVIn0.eyJqdGkiOiJlZmNmNzExNS04YzRiLTQzZmQtOGM0ZS0xNjVhYTVmM2ZhZDEiLCJleHAiOjE1MDY2MDE5NTAsIm5iZiI6MCwiaWF0IjoxNTA2NjAwMTUwLCJpc3MiOiJodHRwOi8vZW50amF2YTAwMjo4MDgwL2F1dGgvcmVhbG1zL2Vsb2dib29rIiwiYXVkIjoiZWxvZ2Jvb2stYmFja2VuZCIsInN1YiI6IjM1OWVmOWM5LTc3ZGYtNGEzZC1hOWM5LWY5NmQ4MzdkMmQ1NyIsInR5cCI6IlJlZnJlc2giLCJhenAiOiJlbG9nYm9vay1iYWNrZW5kIiwiYXV0aF90aW1lIjowLCJzZXNzaW9uX3N0YXRlIjoiOTY1ZjczNTEtMmU4Yi00NTI4LTlmM2QtZWU2MjgzYTk1YjE2IiwicmVhbG1fYWNjZXNzIjp7InJvbGVzIjpbImVsb2dib29rLXN1cGVydXNlciIsImVsb2dib29rLW5vcm1hbHVzZXIiLCJ1bWFfYXV0aG9yaXphdGlvbiJdfSwicmVzb3VyY2VfYWNjZXNzIjp7InJlYWxtLW1hbmFnZW1lbnQiOnsicm9sZXMiOlsidmlldy11c2VycyIsInF1ZXJ5LWdyb3VwcyIsInF1ZXJ5LXVzZXJzIl19LCJhY2NvdW50Ijp7InJvbGVzIjpbIm1hbmFnZS1hY2NvdW50IiwibWFuYWdlLWFjY291bnQtbGlua3MiLCJ2aWV3LXByb2ZpbGUiXX19fQ.rN1f4h9t1-sHW2EXpvYs3Spo8Zxe1-qNuLWCgOwD6E3l_zDwdHOlPxJwlPLwweQ2uuHi1-blk80OdgoDueDslE3tCdkyg_5lXOXG_jVwqgIF8qP2KTlz9gjhJBwBJ94YsHYV2wwy8jvTmUk108FVzEYBvAHL7KMzoD-BJ_4QxLhLuUvhO7I2-xP9sNRnUG_4xOrXl22WhQQVNvWBWL076TOSdBsno8-1oh4zWrXsbRa_iA1GyDQ_QM5Cpf11WE6tfvTDJsEHT_6GBQ8qz8FWSh4P_YtVDTOZZhDbbdddFeZPnQdxkLWXBhpD_jw8JuuE1qR_rAUytWdJpSjz2V90mQ",
+  "token_type": "bearer",
+  "session_state": "965f7351-2e8b-4528-9f3d-ee6283a95b16",
+  "expires_in": 300,
+  "refresh_expires_in": 1800
+}
diff --git a/src/test/resources/VersionInfo.json b/src/test/resources/VersionInfo.json
new file mode 100644
index 0000000..b63fd4d
--- /dev/null
+++ b/src/test/resources/VersionInfo.json
@@ -0,0 +1,4 @@
+{
+  "backendVersion": "0x.0x.xx",
+  "dbVersion": "1y.1y.yy"
+}
\ No newline at end of file
diff --git a/src/test/resources/testErrorReturn.json b/src/test/resources/testErrorReturn.json
new file mode 100644
index 0000000..f5540af
--- /dev/null
+++ b/src/test/resources/testErrorReturn.json
@@ -0,0 +1,4 @@
+{
+  "errorText": "TESTAT",
+  "errorCode": 999
+}
diff --git a/src/test/resources/testGeneralReturnItem.json b/src/test/resources/testGeneralReturnItem.json
new file mode 100644
index 0000000..34f9d39
--- /dev/null
+++ b/src/test/resources/testGeneralReturnItem.json
@@ -0,0 +1,3 @@
+{
+  "ret" : "It works!"
+}
\ No newline at end of file
diff --git a/src/test/resources/testHistoricalResponsibility.json b/src/test/resources/testHistoricalResponsibility.json
new file mode 100644
index 0000000..5f7d9a7
--- /dev/null
+++ b/src/test/resources/testHistoricalResponsibility.json
@@ -0,0 +1,17 @@
+{
+  "id": 1,
+  "responsibleUser": "responsibleUser",
+  "formerResponsibleUser": "formerResponsibleUser",
+  "transferDate": "2017-03-09T15:27:17.666Z",
+  "transactionId": 2,
+  "createDate": "2017-03-09T15:27:17.666Z",
+  "createUser": "createUser",
+  "modDate": "2017-03-09T15:27:17.666Z",
+  "modUser": "modUser",
+  "refBranch": {
+    "id": 33
+  },
+  "refGridTerritory": {
+    "id": 44
+  }
+}
\ No newline at end of file
diff --git a/src/test/resources/testHistoricalShiftChanges.json b/src/test/resources/testHistoricalShiftChanges.json
new file mode 100644
index 0000000..72316bc
--- /dev/null
+++ b/src/test/resources/testHistoricalShiftChanges.json
@@ -0,0 +1,226 @@
+{
+  "transferDateFrom": "2017-06-01T15:27:17.666Z",
+  "transferDateTo": "2017-08-09T15:27:17.666Z",
+  "historicalResponsibilities": [
+    {
+      "id": 2,
+      "responsibleUser": "hugo",
+      "formerResponsibleUser": "max",
+      "transferDate": "2017-08-04T08:53:27.502Z",
+      "transactionId": 1,
+      "createDate": "2017-06-19T12:34:35.881Z",
+      "createUser": "admin",
+      "modDate": "2017-08-04T08:53:27.502Z",
+      "modUser": "hugo",
+      "refGridTerritory": {
+        "id": 1,
+        "fkRefMaster": 1,
+        "description": "Mannheim",
+        "name": "MA"
+      },
+      "refBranch": {
+        "id": 3,
+        "name": "F",
+        "description": "Fernwärme"
+      }
+    },
+    {
+      "id": 3,
+      "responsibleUser": "hugo",
+      "formerResponsibleUser": "admin",
+      "transferDate": "2017-08-04T08:53:27.502Z",
+      "transactionId": 1,
+      "createDate": "2017-06-19T11:14:38.525Z",
+      "createUser": "Otto",
+      "modDate": "2017-08-04T08:53:27.502Z",
+      "modUser": "hugo",
+      "refGridTerritory": {
+        "id": 2,
+        "fkRefMaster": 2,
+        "description": "Offenbach",
+        "name": "OF"
+      },
+      "refBranch": {
+        "id": 3,
+        "name": "F",
+        "description": "Fernwärme"
+      }
+    },
+    {
+      "id": 4,
+      "responsibleUser": "hugo",
+      "formerResponsibleUser": "admin",
+      "transferDate": "2017-08-04T08:53:27.502Z",
+      "transactionId": 1,
+      "createDate": "2017-06-19T11:14:38.532Z",
+      "createUser": "Otto",
+      "modDate": "2017-08-04T08:53:27.502Z",
+      "modUser": "hugo",
+      "refGridTerritory": {
+        "id": 1,
+        "fkRefMaster": 1,
+        "description": "Mannheim",
+        "name": "MA"
+      },
+      "refBranch": {
+        "id": 4,
+        "name": "W",
+        "description": "Wasser"
+      }
+    },
+    {
+      "id": 5,
+      "responsibleUser": "hugo",
+      "formerResponsibleUser": "otto",
+      "transferDate": "2017-08-04T08:53:27.502Z",
+      "transactionId": 1,
+      "createDate": "2017-07-24T11:13:00.000Z",
+      "createUser": "admin",
+      "modDate": "2017-08-04T08:53:27.502Z",
+      "modUser": "hugo",
+      "refGridTerritory": {
+        "id": 2,
+        "fkRefMaster": 2,
+        "description": "Offenbach",
+        "name": "OF"
+      },
+      "refBranch": {
+        "id": 4,
+        "name": "W",
+        "description": "Wasser"
+      }
+    },
+    {
+      "id": 6,
+      "responsibleUser": "pete",
+      "formerResponsibleUser": "pete",
+      "transferDate": "2017-08-04T11:22:20.340Z",
+      "transactionId": 2,
+      "createDate": "2017-06-19T12:34:35.881Z",
+      "createUser": "admin",
+      "modDate": "2017-08-04T11:22:20.340Z",
+      "modUser": "admin",
+      "refGridTerritory": {
+        "id": 1,
+        "fkRefMaster": 1,
+        "description": "Mannheim",
+        "name": "MA"
+      },
+      "refBranch": {
+        "id": 1,
+        "name": "S",
+        "description": "Strom"
+      }
+    },
+    {
+      "id": 7,
+      "responsibleUser": "admin",
+      "formerResponsibleUser": "hugo",
+      "transferDate": "2017-08-04T11:22:20.340Z",
+      "transactionId": 2,
+      "createDate": "2017-06-19T12:34:35.881Z",
+      "createUser": "admin",
+      "modDate": "2017-08-04T11:22:20.340Z",
+      "modUser": "admin",
+      "refGridTerritory": {
+        "id": 1,
+        "fkRefMaster": 1,
+        "description": "Mannheim",
+        "name": "MA"
+      },
+      "refBranch": {
+        "id": 3,
+        "name": "F",
+        "description": "Fernwärme"
+      }
+    },
+    {
+      "id": 8,
+      "responsibleUser": "admin",
+      "formerResponsibleUser": "max",
+      "transferDate": "2017-08-04T11:22:20.340Z",
+      "transactionId": 2,
+      "createDate": "2017-06-19T12:34:35.881Z",
+      "createUser": "admin",
+      "modDate": "2017-08-04T11:22:20.340Z",
+      "modUser": "admin",
+      "refGridTerritory": {
+        "id": 2,
+        "fkRefMaster": 2,
+        "description": "Offenbach",
+        "name": "OF"
+      },
+      "refBranch": {
+        "id": 2,
+        "name": "G",
+        "description": "Gas"
+      }
+    },
+    {
+      "id": 9,
+      "responsibleUser": "max",
+      "formerResponsibleUser": "admin",
+      "transferDate": "2017-08-08T13:50:10.862Z",
+      "transactionId": 3,
+      "createDate": "2017-06-19T12:34:35.881Z",
+      "createUser": "admin",
+      "modDate": "2017-08-08T13:50:10.861Z",
+      "modUser": "max",
+      "refGridTerritory": {
+        "id": 1,
+        "fkRefMaster": 1,
+        "description": "Mannheim",
+        "name": "MA"
+      },
+      "refBranch": {
+        "id": 2,
+        "name": "G",
+        "description": "Gas"
+      }
+    },
+    {
+      "id": 10,
+      "responsibleUser": "max",
+      "formerResponsibleUser": "admin",
+      "transferDate": "2017-08-08T13:50:10.862Z",
+      "transactionId": 3,
+      "createDate": "2017-06-19T12:34:35.881Z",
+      "createUser": "admin",
+      "modDate": "2017-08-08T13:50:10.861Z",
+      "modUser": "max",
+      "refGridTerritory": {
+        "id": 1,
+        "fkRefMaster": 1,
+        "description": "Mannheim",
+        "name": "MA"
+      },
+      "refBranch": {
+        "id": 3,
+        "name": "F",
+        "description": "Fernwärme"
+      }
+    },
+    {
+      "id": 11,
+      "responsibleUser": "max",
+      "formerResponsibleUser": "admin",
+      "transferDate": "2017-08-08T13:50:10.862Z",
+      "transactionId": 3,
+      "createDate": "2017-07-23T22:00:00.000Z",
+      "createUser": "max",
+      "modDate": "2017-08-08T13:50:10.861Z",
+      "modUser": "max",
+      "refGridTerritory": {
+        "id": 3,
+        "fkRefMaster": 3,
+        "description": "Darmstadt",
+        "name": "DA"
+      },
+      "refBranch": {
+        "id": 1,
+        "name": "S",
+        "description": "Strom"
+      }
+    }
+  ]
+}
\ No newline at end of file
diff --git a/src/test/resources/testLockedNotification.json b/src/test/resources/testLockedNotification.json
new file mode 100644
index 0000000..af517de
--- /dev/null
+++ b/src/test/resources/testLockedNotification.json
@@ -0,0 +1,22 @@
+{
+  "id": 1,
+  "incidentId": 23,
+  "selected": false,
+  "status": "geschlossen",
+  "notificationText": null,
+  "freeText": "",
+  "freeTextExtended": "extended",
+  "responsibilityForwarding": "",
+  "responsibilityControlPoint": "Abteilung 4",
+  "reminderDate": null,
+  "futureDate": null,
+  "createdDate": "2017-03-09T15:27:17.062Z",
+  "expectedFinishDate": null,
+  "finishedDate": null,
+  "creator": "MasterAndCreator",
+  "modDate": "2017-03-09T15:27:17.777Z",
+  "modUser": "_fd",
+  "version": 33,
+  "fkRefBranch": 44,
+  "fkRefNotificationStatus": 4
+}
\ No newline at end of file
diff --git a/src/test/resources/testLoginCredentials.json b/src/test/resources/testLoginCredentials.json
new file mode 100644
index 0000000..88974c6
--- /dev/null
+++ b/src/test/resources/testLoginCredentials.json
@@ -0,0 +1,4 @@
+{
+  "userName": "Carlo",
+  "password": "Cottura"
+}
\ No newline at end of file
diff --git a/src/test/resources/testNotification.json b/src/test/resources/testNotification.json
new file mode 100644
index 0000000..7390edc
--- /dev/null
+++ b/src/test/resources/testNotification.json
@@ -0,0 +1,61 @@
+[
+  {
+    "id": 1,
+    "incidentId": 23,
+    "selected": false,
+    "status": "offen",
+    "notificationText": null,
+    "freeText": "",
+    "freeTextExtended": "extended",
+    "responsibilityForwarding": "",
+    "responsibilityControlPoint": "Abteilung 4",
+    "reminderDate": null,
+    "futureDate": null,
+    "createDate": "2017-03-09T15:27:17.666Z",
+    "expectedFinishDate": null,
+    "finishedDate": null,
+    "createUser": "MasterAndcreateUser",
+    "modDate": "2017-03-09T15:27:17.666Z",
+    "modUser": "_fd",
+    "version": 33,
+    "fkRefBranch": 44,
+    "fkRefNotificationStatus": 55,
+    "fkRefGridTerritory": 1
+  },
+  {
+    "id": 2,
+    "incidentId": 24,
+    "selected": true,
+    "status": "offen",
+    "notificationText": "Fehler Bereich D",
+    "freeText": "free Willi",
+    "freeTextExtended": "aa",
+    "responsibilityForwarding": "",
+    "responsibilityControlPoint": "Abteilung 4",
+    "reminderDate": "2014-02-09T15:26:17.666Z",
+    "futureDate": null,
+    "createDate": "2017-03-09T15:27:17.666Z",
+    "expectedFinishDate": null,
+    "finishedDate": null,
+    "createUser": "MasterAndServant"
+
+  },
+  {
+    "id": 3,
+    "incidentId": 25,
+    "selected": false,
+    "status": "offen",
+    "notificationText": "Fehler Bereich D",
+    "freeText": "",
+    "freeTextExtended": "",
+    "responsibilityForwarding": null,
+    "responsibilityControlPoint": "Abteilung 4",
+    "reminderDate": null,
+    "futureDate": "2016-03-09T15:27:17.666Z",
+    "createDate": null,
+    "expectedFinishDate": "2018-03-09T15:27:17.666Z",
+    "finishedDate": null,
+    "createUser": "MasterAndCommander"
+
+  }
+]
diff --git a/src/test/resources/testNotificationFile.json b/src/test/resources/testNotificationFile.json
new file mode 100644
index 0000000..4df0801
--- /dev/null
+++ b/src/test/resources/testNotificationFile.json
@@ -0,0 +1,10 @@
+{
+    "fileName": "test.csv",
+    "creationDate": "2017-09-25T12:00:01.635887Z",
+    "creator": "admin",
+    "type": "csv",
+    "size": 5,
+    "branchName": "S",
+    "gridTerritoryName": "MA",
+    "notificationText": "This is a simple test text"
+}
diff --git a/src/test/resources/testNotificationSearchFilter.json b/src/test/resources/testNotificationSearchFilter.json
new file mode 100644
index 0000000..ef00747
--- /dev/null
+++ b/src/test/resources/testNotificationSearchFilter.json
@@ -0,0 +1,9 @@
+{
+  "dateFrom": "2017-03-09T15:27:17.666Z",
+  "dateTo": "2017-04-09T15:27:17.666Z",
+  "reminderDate": "2017-03-09T15:27:17.666Z",
+  "responsibilityFilterList": [
+              1,
+              6       
+   ]
+}
\ No newline at end of file
diff --git a/src/test/resources/testRefBranch.json b/src/test/resources/testRefBranch.json
new file mode 100644
index 0000000..e84468e
--- /dev/null
+++ b/src/test/resources/testRefBranch.json
@@ -0,0 +1,5 @@
+{
+  "id": 3,
+  "description": "branch description",
+  "name": "BD1"
+}
diff --git a/src/test/resources/testRefNotificationStatus.json b/src/test/resources/testRefNotificationStatus.json
new file mode 100644
index 0000000..1adff67
--- /dev/null
+++ b/src/test/resources/testRefNotificationStatus.json
@@ -0,0 +1,4 @@
+{
+  "id": 3,
+  "name": "status1"
+}
diff --git a/src/test/resources/testReminderSearchFilter.json b/src/test/resources/testReminderSearchFilter.json
new file mode 100644
index 0000000..2ff117c
--- /dev/null
+++ b/src/test/resources/testReminderSearchFilter.json
@@ -0,0 +1,7 @@
+{
+  "reminderDate": "2017-03-09T15:27:17.666Z",
+  "responsibilityFilterList": [
+              1,
+              6       
+   ]
+}
\ No newline at end of file
diff --git a/src/test/resources/testResponsibility.json b/src/test/resources/testResponsibility.json
new file mode 100644
index 0000000..4a212c7
--- /dev/null
+++ b/src/test/resources/testResponsibility.json
@@ -0,0 +1,7 @@
+{
+    "id": 3,
+    "responsibleUser": "currentResponsibleUser",
+    "newResponsibleUser": "newResponsibleUser",
+    "branchName": "W",
+    "isActive": true
+}
diff --git a/src/test/resources/testResponsibilityOutdatedDataMinus.json b/src/test/resources/testResponsibilityOutdatedDataMinus.json
new file mode 100644
index 0000000..27e3f80
--- /dev/null
+++ b/src/test/resources/testResponsibilityOutdatedDataMinus.json
@@ -0,0 +1,61 @@
+[
+    {
+        "gridTerritoryDescription": "Mannheim",
+        "responsibilityList": [
+            {
+                "id" : 1,
+                "responsibleUser": "responsibleUser1",
+                "newResponsibleUser": "newResponsibleUser",
+                "branchName": "S",
+                "isActive": true
+            },
+            {
+                "id" : 2,
+                "responsibleUser": "responsibleUser1",
+                "newResponsibleUser": "newResponsibleUser",
+                "branchName": "G",
+                "isActive": true
+            },
+            {
+                "id" : 3,
+                "responsibleUser": "responsibleUser1",
+                "newResponsibleUser": "newResponsibleUser",
+                "branchName": "W",
+                "isActive": true
+            }
+        ]
+    },
+
+    {
+        "gridTerritoryDescription": "Offenbach",
+        "responsibilityList": [
+            {
+                "id" : 33,
+                "responsibleUser": "responsibleUser1",
+                "newResponsibleUser": "newResponsibleUser2",
+                "branchName": "W",
+                "isActive": true
+            }
+        ]
+    },
+
+    {
+        "gridTerritoryDescription": "Stuttgart",
+        "responsibilityList": [
+            {
+                "id" : 44,
+                "responsibleUser": "responsibleUser1",
+                "newResponsibleUser": "newResponsibleUser2",
+                "branchName": "F",
+                "isActive": false
+            },
+            {
+                "id" : 45,
+                "responsibleUser": "responsibleUser1",
+                "newResponsibleUser": "newResponsibleUser",
+                "branchName": "W",
+                "isActive": true
+            }
+        ]
+    }
+]
\ No newline at end of file
diff --git a/src/test/resources/testResponsibilityOutdatedDataPlus.json b/src/test/resources/testResponsibilityOutdatedDataPlus.json
new file mode 100644
index 0000000..4622aa8
--- /dev/null
+++ b/src/test/resources/testResponsibilityOutdatedDataPlus.json
@@ -0,0 +1,76 @@
+[
+    {
+        "gridTerritoryDescription": "Mannheim",
+        "responsibilityList": [
+            {
+                "id" : 1,
+                "responsibleUser": "responsibleUser1",
+                "newResponsibleUser": "newResponsibleUser",
+                "branchName": "S",
+                "isActive": true
+            },
+            {
+                "id" : 2,
+                "responsibleUser": "responsibleUser1",
+                "newResponsibleUser": "newResponsibleUser",
+                "branchName": "G",
+                "isActive": true
+            },
+            {
+                "id" : 3,
+                "responsibleUser": "responsibleUser1",
+                "newResponsibleUser": "newResponsibleUser",
+                "branchName": "W",
+                "isActive": true
+            },
+            {
+                "id" : 4,
+                "responsibleUser": "responsibleUser1",
+                "newResponsibleUser": "newResponsibleUser",
+                "branchName": "F",
+                "isActive": true
+            }
+        ]
+    },
+
+    {
+        "gridTerritoryDescription": "Offenbach",
+        "responsibilityList": [
+            {
+                "id" : 33,
+                "responsibleUser": "responsibleUser1",
+                "newResponsibleUser": "newResponsibleUser2",
+                "branchName": "W",
+                "isActive": true
+            },
+            {
+                "id" : 34,
+                "responsibleUser": "responsibleUser1",
+                "newResponsibleUser": "newResponsibleUser2",
+                "branchName": "G",
+                "isActive": true
+            }
+
+        ]
+    },
+
+    {
+        "gridTerritoryDescription": "Stuttgart",
+        "responsibilityList": [
+            {
+                "id" : 44,
+                "responsibleUser": "responsibleUser1",
+                "newResponsibleUser": "newResponsibleUser2",
+                "branchName": "F",
+                "isActive": false
+            },
+            {
+                "id" : 45,
+                "responsibleUser": "responsibleUser1",
+                "newResponsibleUser": "newResponsibleUser",
+                "branchName": "W",
+                "isActive": true
+            }
+        ]
+    }
+]
\ No newline at end of file
diff --git a/src/test/resources/testResponsibilitySearchFilter.json b/src/test/resources/testResponsibilitySearchFilter.json
new file mode 100644
index 0000000..8a6cdd8
--- /dev/null
+++ b/src/test/resources/testResponsibilitySearchFilter.json
@@ -0,0 +1,4 @@
+{
+  "transferDateFrom": "2017-06-01T15:27:17.666Z",
+  "transferDateTo": "2017-08-09T15:27:17.666Z" 
+}
\ No newline at end of file
diff --git a/src/test/resources/testSingleNotification.json b/src/test/resources/testSingleNotification.json
new file mode 100644
index 0000000..443f6dc
--- /dev/null
+++ b/src/test/resources/testSingleNotification.json
@@ -0,0 +1,22 @@
+{
+  "id": 1,
+  "incidentId": 23,
+  "selected": false,
+  "status": "offen",
+  "notificationText": null,
+  "freeText": "",
+  "freeTextExtended": "extended",
+  "responsibilityForwarding": "",
+  "responsibilityControlPoint": "Abteilung 4",
+  "reminderDate": null,
+  "futureDate": null,
+  "createdDate": "2017-03-09T15:27:17.062Z",
+  "expectedFinishDate": null,
+  "finishedDate": null,
+  "creator": "MasterAndCreator",
+  "modDate": "2017-03-09T15:27:17.777Z",
+  "modUser": "_fd",
+  "version": 33,
+  "fkRefBranch": 44,
+  "fkRefNotificationStatus": 55
+}
\ No newline at end of file
diff --git a/src/test/resources/testTerritoryResponsibility.json b/src/test/resources/testTerritoryResponsibility.json
new file mode 100644
index 0000000..c097a9c
--- /dev/null
+++ b/src/test/resources/testTerritoryResponsibility.json
@@ -0,0 +1,68 @@
+[
+    {
+        "gridTerritoryDescription": "Mannheim",
+        "responsibilityList": [
+            {
+                "id" : 1,
+                "responsibleUser": "responsibleUser1",
+                "newResponsibleUser": "newResponsibleUser",
+                "branchName": "S",
+                "isActive": true
+            },
+            {
+                "id" : 2,
+                "responsibleUser": "responsibleUser1",
+                "newResponsibleUser": "newResponsibleUser",
+                "branchName": "G",
+                "isActive": true
+            },
+            {
+                "id" : 3,
+                "responsibleUser": "responsibleUser1",
+                "newResponsibleUser": "newResponsibleUser",
+                "branchName": "W",
+                "isActive": true
+            },
+            {
+                "id" : 4,
+                "responsibleUser": "responsibleUser1",
+                "newResponsibleUser": "newResponsibleUser",
+                "branchName": "F",
+                "isActive": true
+            }
+        ]
+    },
+
+    {
+        "gridTerritoryDescription": "Offenbach",
+        "responsibilityList": [
+            {
+                "id" : 33,
+                "responsibleUser": "responsibleUser1",
+                "newResponsibleUser": "newResponsibleUser2",
+                "branchName": "W",
+                "isActive": true
+            }
+        ]
+    },
+
+    {
+        "gridTerritoryDescription": "Stuttgart",
+        "responsibilityList": [
+            {
+                "id" : 44,
+                "responsibleUser": "responsibleUser1",
+                "newResponsibleUser": "newResponsibleUser2",
+                "branchName": "F",
+                "isActive": false
+            },
+            {
+                "id" : 45,
+                "responsibleUser": "responsibleUser1",
+                "newResponsibleUser": "",
+                "branchName": "W",
+                "isActive": true
+            }
+        ]
+    }
+]
\ No newline at end of file
diff --git a/src/test/resources/testTerritoryResponsibilityBranchException.json b/src/test/resources/testTerritoryResponsibilityBranchException.json
new file mode 100644
index 0000000..461fbb9
--- /dev/null
+++ b/src/test/resources/testTerritoryResponsibilityBranchException.json
@@ -0,0 +1,37 @@
+[
+    {
+        "gridTerritoryDescription": "Offenbach",
+        "responsibilityList": [
+            {
+                "id" : 1,
+                "responsibleUser": "responsibleUser1",
+                "newResponsibleUser": "newResponsibleUser",
+                "branchName": "F"
+            },
+            {
+                "id" : 3,
+                "responsibleUser": "responsibleUser1",
+                "newResponsibleUser": "newResponsibleUser",
+                "branchName": "W"
+            }
+        ]
+    },
+
+    {
+        "gridTerritoryDescription": "Stuttgart",
+        "responsibilityList": [
+            {
+                "id" : 44,
+                "responsibleUser": "responsibleUser1",
+                "newResponsibleUser": "newResponsibleUser2",
+                "branchName": "F"
+            },
+            {
+                "id" : 45,
+                "responsibleUser": "responsibleUser1",
+                "newResponsibleUser": "newResponsibleUser",
+                "branchName": "W"
+            }
+        ]
+    }
+]
\ No newline at end of file
diff --git a/src/test/resources/testTerritoryResponsibilityGridException.json b/src/test/resources/testTerritoryResponsibilityGridException.json
new file mode 100644
index 0000000..07deb35
--- /dev/null
+++ b/src/test/resources/testTerritoryResponsibilityGridException.json
@@ -0,0 +1,37 @@
+[
+    {
+        "gridTerritoryDescription": "Offenbach",
+        "responsibilityList": [
+            {
+                "id" : 1,
+                "responsibleUser": "responsibleUser1",
+                "newResponsibleUser": "newResponsibleUser",
+                "branchName": "S"
+            },
+            {
+                "id" : 3,
+                "responsibleUser": "responsibleUser1",
+                "newResponsibleUser": "newResponsibleUser",
+                "branchName": "W"
+            }
+        ]
+    },
+
+    {
+        "gridTerritoryDescription": "Stuttgart",
+        "responsibilityList": [
+            {
+                "id" : 44,
+                "responsibleUser": "responsibleUser1",
+                "newResponsibleUser": "newResponsibleUser2",
+                "branchName": "F"
+            },
+            {
+                "id" : 45,
+                "responsibleUser": "responsibleUser1",
+                "newResponsibleUser": "newResponsibleUser",
+                "branchName": "W"
+            }
+        ]
+    }
+]
\ No newline at end of file
diff --git a/src/test/resources/testTerritoryResponsibilityUserException.json b/src/test/resources/testTerritoryResponsibilityUserException.json
new file mode 100644
index 0000000..2b789ce
--- /dev/null
+++ b/src/test/resources/testTerritoryResponsibilityUserException.json
@@ -0,0 +1,37 @@
+[
+    {
+        "gridTerritoryDescription": "Offenbach",
+        "responsibilityList": [
+            {
+                "id" : 1,
+                "responsibleUser": "responsibleUser2",
+                "newResponsibleUser": "newResponsibleUser",
+                "branchName": "S"
+            },
+            {
+                "id" : 3,
+                "responsibleUser": "responsibleUser2",
+                "newResponsibleUser": "newResponsibleUser",
+                "branchName": "W"
+            }
+        ]
+    },
+
+    {
+        "gridTerritoryDescription": "Stuttgart",
+        "responsibilityList": [
+            {
+                "id" : 44,
+                "responsibleUser": "responsibleUser2",
+                "newResponsibleUser": "newResponsibleUser2",
+                "branchName": "F"
+            },
+            {
+                "id" : 45,
+                "responsibleUser": "responsibleUser2",
+                "newResponsibleUser": "newResponsibleUser",
+                "branchName": "W"
+            }
+        ]
+    }
+]
\ No newline at end of file
diff --git a/src/test/resources/testUserAuthentication.json b/src/test/resources/testUserAuthentication.json
new file mode 100644
index 0000000..2cdef21
--- /dev/null
+++ b/src/test/resources/testUserAuthentication.json
@@ -0,0 +1,8 @@
+{
+  "id": 1,
+  "selected": true,
+  "username": "Pedro",
+  "password": "pwd",
+  "name": "Pedro Pepito Sanchez",
+  "specialUser": false
+}