diff --git a/controller/northbound/server/auth.go b/controller/northbound/server/auth.go
index 50e8dafa223486e072e2ab24b15bf2304546962b..5230b2848d9818da5c483bd5541a2655b0c5285a 100644
--- a/controller/northbound/server/auth.go
+++ b/controller/northbound/server/auth.go
@@ -2,6 +2,7 @@ package server
 
 import (
 	"context"
+	"fmt"
 	"time"
 
 	apb "code.fbi.h-da.de/danet/gosdn/api/go/gosdn/rbac"
@@ -125,6 +126,9 @@ func (s Auth) GetUser(ctx context.Context, request *apb.GetUserRequest) (*apb.Ge
 	start := metrics.StartHook(labels, grpcRequestsTotal)
 	defer metrics.FinishHook(labels, start, grpcRequestDurationSecondsTotal, grpcRequestDurationSeconds)
 
+	usersA, _ := userc.GetAll()
+	fmt.Printf("%+v", usersA)
+
 	// TODO: implement check if user is allowed to get this user data; only their own if not admin
 	userData, err := userc.Get(store.Query{Name: request.Name})
 	if err != nil {
@@ -230,6 +234,8 @@ func (s Auth) isValidUser(user rbac.User) (bool, error) {
 	storedUser, err := userc.Get(store.Query{Name: user.Name()})
 	if err != nil {
 		return false, err
+	} else if storedUser == nil {
+		return false, status.Errorf(codes.Aborted, "no user object")
 	}
 
 	if storedUser.Name() == user.Name() {
diff --git a/controller/northbound/server/auth_test.go b/controller/northbound/server/auth_test.go
index 5c29f1b84857e18c298d7f2a0a8884d36ff434c2..7d20e706b0b1672136516d06bf18891e8561768f 100644
--- a/controller/northbound/server/auth_test.go
+++ b/controller/northbound/server/auth_test.go
@@ -4,13 +4,22 @@ import (
 	"context"
 	"reflect"
 	"testing"
-	"time"
 
 	apb "code.fbi.h-da.de/danet/gosdn/api/go/gosdn/rbac"
 	"code.fbi.h-da.de/danet/gosdn/controller/rbac"
+	"github.com/google/uuid"
 )
 
-func Test_auth_Login(t *testing.T) {
+const adminID = "5c248a22-8eb7-48cf-b392-45680a1863a5"
+const userID = "57005d13-7a4d-493d-a02b-50ca51c40197"
+const adminRoleID = "126683ae-5ff2-43ee-92f7-0e2b936f8c77"
+const randomRoleName = "bertram"
+
+var adminRoleMap = map[string]string{pndID: "admin"}
+var userRoleMap = map[string]string{pndID: "user"}
+var jwt *rbac.JWTManager
+
+func TestAuth_Login(t *testing.T) {
 	type args struct {
 		ctx     context.Context
 		request *apb.LoginRequest
@@ -21,112 +30,187 @@ func Test_auth_Login(t *testing.T) {
 		want    string
 		wantErr bool
 	}{
-		// TODO: Add test cases.
 		{
-			name: "login test",
+			name: "default login",
+			want: "testAdmin",
+			args: args{
+				request: &apb.LoginRequest{
+					Username: "testAdmin",
+					Pwd:      "admin",
+				},
+			},
+			wantErr: false,
+		},
+		{
+			name: "login fail wrong pwd",
 			want: "",
 			args: args{
-				request: &apb.LoginRequest{},
+				request: &apb.LoginRequest{
+					Username: "testAdmin",
+					Pwd:      "nope",
+				},
 			},
 			wantErr: true,
 		},
 	}
 
-	jwt := rbac.NewJWTManager("", 1*time.Minute)
-
 	for _, tt := range tests {
 		t.Run(tt.name, func(t *testing.T) {
 			r := Auth{
-				UnimplementedAuthServiceServer: apb.UnimplementedAuthServiceServer{},
-				jwtManager:                     jwt,
+				jwtManager: jwt,
 			}
 			resp, err := r.Login(tt.args.ctx, tt.args.request)
 			if (err != nil) != tt.wantErr {
-				t.Errorf("rbac.Login() error = %v, wantErr %v", err, tt.wantErr)
+				t.Errorf("Auth.Login() error = %v, wantErr %v", err, tt.wantErr)
 				return
 			}
 
-			got := resp.GetStatus().String()
-			got = ""
-
-			if !reflect.DeepEqual(got, tt.want) {
-				t.Errorf("rbac.Login() = %v, want %v", got, tt.want)
+			if resp != nil {
+				got := resp.Token
+				if got == "" {
+					t.Errorf("Auth.Login() = %v, want non empty token", got)
+				}
 			}
 		})
 	}
 }
 
-func Test_auth_Logout(t *testing.T) {
-	type fields struct {
-		UnimplementedAuthServiceServer apb.UnimplementedAuthServiceServer
-	}
+func TestAuth_Logout(t *testing.T) {
 	type args struct {
 		ctx     context.Context
 		request *apb.LogoutRequest
 	}
 	tests := []struct {
 		name    string
-		fields  fields
 		args    args
 		want    *apb.LogoutResponse
 		wantErr bool
 	}{
 		// TODO: Add test cases.
+		// Implement after session hdanling was added
 	}
 	for _, tt := range tests {
 		t.Run(tt.name, func(t *testing.T) {
-			r := Auth{
-				UnimplementedAuthServiceServer: tt.fields.UnimplementedAuthServiceServer,
-			}
-			got, err := r.Logout(tt.args.ctx, tt.args.request)
+			s := Auth{}
+			got, err := s.Logout(tt.args.ctx, tt.args.request)
 			if (err != nil) != tt.wantErr {
-				t.Errorf("rbac.Logout() error = %v, wantErr %v", err, tt.wantErr)
+				t.Errorf("Auth.Logout() error = %v, wantErr %v", err, tt.wantErr)
 				return
 			}
 			if !reflect.DeepEqual(got, tt.want) {
-				t.Errorf("rbac.Logout() = %v, want %v", got, tt.want)
+				t.Errorf("Auth.Logout() = %v, want %v", got, tt.want)
 			}
 		})
 	}
 }
 
-func Test_rbac_CreateUsers(t *testing.T) {
-	type fields struct {
-		UnimplementedAuthServiceServer apb.UnimplementedAuthServiceServer
-	}
+func TestAuth_CreateUsers(t *testing.T) {
 	type args struct {
 		ctx     context.Context
 		request *apb.CreateUsersRequest
 	}
 	tests := []struct {
 		name    string
-		fields  fields
 		args    args
-		want    *apb.CreateUsersResponse
+		want    apb.Status
 		wantErr bool
 	}{
-		// TODO: Add test cases.
+		{
+			name: "default create users",
+			args: args{ctx: context.TODO(),
+				request: &apb.CreateUsersRequest{
+					User: []*apb.User{
+						{
+							Name:     "asdf",
+							Roles:    map[string]string{pndID: "asdf"},
+							Password: "asdf",
+							Token:    "",
+						},
+					},
+				},
+			},
+			want:    apb.Status_STATUS_OK,
+			wantErr: false,
+		},
 	}
 	for _, tt := range tests {
 		t.Run(tt.name, func(t *testing.T) {
-			r := Auth{
-				UnimplementedAuthServiceServer: tt.fields.UnimplementedAuthServiceServer,
+			s := Auth{}
+			got, err := s.CreateUsers(tt.args.ctx, tt.args.request)
+			if (err != nil) != tt.wantErr {
+				t.Errorf("Auth.CreateUsers() error = %v, wantErr %v", err, tt.wantErr)
+				return
+			}
+
+			if !reflect.DeepEqual(got.Status, tt.want) {
+				t.Errorf("Auth.CreateUsers() = %v, want %v", got, tt.want)
 			}
-			got, err := r.CreateUsers(tt.args.ctx, tt.args.request)
+		})
+	}
+}
+
+func TestAuth_GetUser(t *testing.T) {
+	type args struct {
+		ctx     context.Context
+		request *apb.GetUserRequest
+	}
+	tests := []struct {
+		name    string
+		args    args
+		want    *apb.GetUserResponse
+		wantErr bool
+	}{
+		{
+			name: "default get user",
+			args: args{
+				ctx: context.TODO(),
+				request: &apb.GetUserRequest{
+					Name: "testAdmin",
+				},
+			},
+			want: &apb.GetUserResponse{Status: apb.Status_STATUS_OK,
+				User: &apb.User{Id: adminID,
+					Name: "testAdmin"}},
+			wantErr: false,
+		},
+		{
+			name: "fail get user",
+			args: args{
+				ctx: context.TODO(),
+				request: &apb.GetUserRequest{
+					Name: "nope",
+				},
+			},
+			want:    nil,
+			wantErr: true,
+		},
+	}
+	for _, tt := range tests {
+		t.Run(tt.name, func(t *testing.T) {
+			s := Auth{}
+			got, err := s.GetUser(tt.args.ctx, tt.args.request)
 			if (err != nil) != tt.wantErr {
-				t.Errorf("rbac.CreateUsers() error = %v, wantErr %v", err, tt.wantErr)
+				t.Errorf("Auth.GetUser() error = %v, wantErr %v", err, tt.wantErr)
 				return
 			}
-			if !reflect.DeepEqual(got, tt.want) {
-				t.Errorf("rbac.CreateUsers() = %v, want %v", got, tt.want)
+
+			if got != nil && got.Status == tt.want.Status {
+				if got.User.Name != tt.want.User.Name || got.User.Id != tt.want.User.Id {
+					t.Errorf("Auth.GetUser() = %v, want %v", got, tt.want)
+				}
+			} else {
+				if got != nil {
+					t.Errorf("Auth.GetUser() = %v, want %v", got, tt.want)
+				}
 			}
 		})
 	}
 }
 
-func Test_rbac_GetUsers(t *testing.T) {
-	type fields struct {
-		UnimplementedAuthServiceServer apb.UnimplementedAuthServiceServer
+func TestAuth_GetUsers(t *testing.T) {
+	err := clearAndCreateAuthTestSetup()
+	if err != nil {
+		t.Fatalf("%v", err)
 	}
 	type args struct {
 		ctx     context.Context
@@ -134,94 +218,615 @@ func Test_rbac_GetUsers(t *testing.T) {
 	}
 	tests := []struct {
 		name    string
-		fields  fields
 		args    args
 		want    *apb.GetUsersResponse
+		wantLen int
 		wantErr bool
 	}{
-		// TODO: Add test cases.
+		{
+			name: "default get users",
+			args: args{ctx: context.TODO(),
+				request: &apb.GetUsersRequest{},
+			},
+			want: &apb.GetUsersResponse{Status: apb.Status_STATUS_OK,
+				User: []*apb.User{
+					{Name: "testAdmin"},
+					{Name: "testUser"},
+					{Name: "testRandom"}},
+			},
+			wantLen: 3,
+			wantErr: false,
+		},
 	}
+
 	for _, tt := range tests {
 		t.Run(tt.name, func(t *testing.T) {
-			r := Auth{
-				UnimplementedAuthServiceServer: tt.fields.UnimplementedAuthServiceServer,
-			}
-			got, err := r.GetUsers(tt.args.ctx, tt.args.request)
+			s := Auth{}
+			got, err := s.GetUsers(tt.args.ctx, tt.args.request)
 			if (err != nil) != tt.wantErr {
-				t.Errorf("rbac.GetUsers() error = %v, wantErr %v", err, tt.wantErr)
+				t.Errorf("Auth.GetUsers() error = %v, wantErr %v", err, tt.wantErr)
 				return
 			}
-			if !reflect.DeepEqual(got, tt.want) {
-				t.Errorf("rbac.GetUsers() = %v, want %v", got, tt.want)
+
+			if got != nil && got.Status == apb.Status_STATUS_OK {
+				if len(got.User) != tt.wantLen {
+					t.Errorf("Auth.GetUsers() = %v, want %v", got, tt.want)
+				}
+
+				for _, gotU := range got.User {
+					containsExpected := false
+					for _, wantU := range tt.want.User {
+						if gotU.Name == wantU.Name {
+							containsExpected = true
+							break
+						}
+					}
+					if !containsExpected {
+						t.Errorf("Auth.GetUsers() = %v, want %v", got, tt.want)
+					}
+				}
 			}
 		})
 	}
 }
 
-func Test_rbac_UpdateUsers(t *testing.T) {
-	type fields struct {
-		UnimplementedAuthServiceServer apb.UnimplementedAuthServiceServer
-	}
+func TestAuth_UpdateUsers(t *testing.T) {
 	type args struct {
 		ctx     context.Context
 		request *apb.UpdateUsersRequest
 	}
 	tests := []struct {
 		name    string
-		fields  fields
 		args    args
 		want    *apb.UpdateUsersResponse
 		wantErr bool
 	}{
-		// TODO: Add test cases.
+		{
+			name: "default update user",
+			args: args{ctx: context.TODO(),
+				request: &apb.UpdateUsersRequest{User: []*apb.User{
+					{Id: adminID,
+						Name: "sth Else"},
+				},
+				},
+			},
+			want: &apb.UpdateUsersResponse{
+				Status: apb.Status_STATUS_OK},
+			wantErr: false,
+		},
+		{
+			name: "error update user",
+			args: args{ctx: context.TODO(),
+				request: &apb.UpdateUsersRequest{User: []*apb.User{
+					{Id: uuid.NewString(),
+						Name: "not a user"},
+				},
+				},
+			},
+			want:    nil,
+			wantErr: true,
+		},
 	}
+
 	for _, tt := range tests {
 		t.Run(tt.name, func(t *testing.T) {
-			r := Auth{
-				UnimplementedAuthServiceServer: tt.fields.UnimplementedAuthServiceServer,
-			}
-			got, err := r.UpdateUsers(tt.args.ctx, tt.args.request)
+			s := Auth{}
+			got, err := s.UpdateUsers(tt.args.ctx, tt.args.request)
 			if (err != nil) != tt.wantErr {
-				t.Errorf("rbac.UpdateUsers() error = %v, wantErr %v", err, tt.wantErr)
+				t.Errorf("Auth.UpdateUsers() error = %v, wantErr %v", err, tt.wantErr)
 				return
 			}
-			if !reflect.DeepEqual(got, tt.want) {
-				t.Errorf("rbac.UpdateUsers() = %v, want %v", got, tt.want)
+			if got != nil && got.Status != tt.want.Status {
+				t.Errorf("Auth.UpdateUsers() = %v, want %v", got, tt.want)
 			}
 		})
 	}
 }
 
-func Test_rbac_DeleteUsers(t *testing.T) {
-	type fields struct {
-		UnimplementedAuthServiceServer apb.UnimplementedAuthServiceServer
-	}
+func TestAuth_DeleteUsers(t *testing.T) {
 	type args struct {
 		ctx     context.Context
 		request *apb.DeleteUsersRequest
 	}
 	tests := []struct {
 		name    string
-		fields  fields
 		args    args
 		want    *apb.DeleteUsersResponse
 		wantErr bool
 	}{
-		// TODO: Add test cases.
+		{
+			name: "default delete users",
+			args: args{ctx: context.TODO(),
+				request: &apb.DeleteUsersRequest{Username: []string{"testUser"}},
+			},
+			want:    &apb.DeleteUsersResponse{Status: apb.Status_STATUS_OK},
+			wantErr: false,
+		},
+		{
+			name: "error delete users",
+			args: args{ctx: context.TODO(),
+				request: &apb.DeleteUsersRequest{Username: []string{"no user"}},
+			},
+			want:    &apb.DeleteUsersResponse{Status: apb.Status_STATUS_OK},
+			wantErr: true,
+		},
 	}
 	for _, tt := range tests {
 		t.Run(tt.name, func(t *testing.T) {
-			r := Auth{
-				UnimplementedAuthServiceServer: tt.fields.UnimplementedAuthServiceServer,
+			s := Auth{}
+			got, err := s.DeleteUsers(tt.args.ctx, tt.args.request)
+			if (err != nil) != tt.wantErr {
+				t.Errorf("Auth.DeleteUsers() error = %v, wantErr %v", err, tt.wantErr)
+				return
+			}
+			if got != nil && got.Status != tt.want.Status {
+				t.Errorf("Auth.DeleteUsers() = %v, want %v", got, tt.want)
 			}
-			got, err := r.DeleteUsers(tt.args.ctx, tt.args.request)
+		})
+	}
+}
+
+func TestAuth_CreateRoles(t *testing.T) {
+	type args struct {
+		ctx     context.Context
+		request *apb.CreateRolesRequest
+	}
+	tests := []struct {
+		name    string
+		args    args
+		want    *apb.CreateRolesResponse
+		wantErr bool
+	}{
+		{
+			name: "default create roles",
+			args: args{ctx: context.TODO(),
+				request: &apb.CreateRolesRequest{
+					Roles: []*apb.Role{
+						{
+							Name:        "new role 1",
+							Description: "Role 1",
+							Permissions: []string{"permission 1", "permission 2"},
+						},
+					},
+				},
+			},
+			want:    &apb.CreateRolesResponse{Status: apb.Status_STATUS_OK},
+			wantErr: false,
+		},
+	}
+	for _, tt := range tests {
+		t.Run(tt.name, func(t *testing.T) {
+			s := Auth{}
+			got, err := s.CreateRoles(tt.args.ctx, tt.args.request)
 			if (err != nil) != tt.wantErr {
-				t.Errorf("rbac.DeleteUsers() error = %v, wantErr %v", err, tt.wantErr)
+				t.Errorf("Auth.CreateRoles() error = %v, wantErr %v", err, tt.wantErr)
 				return
 			}
-			if !reflect.DeepEqual(got, tt.want) {
-				t.Errorf("rbac.DeleteUsers() = %v, want %v", got, tt.want)
+
+			if got != nil && got.Status != tt.want.Status {
+				t.Errorf("Auth.CreateRoles() = %v, want %v", got, tt.want)
 			}
 		})
 	}
 }
+
+func TestAuth_GetRole(t *testing.T) {
+	type args struct {
+		ctx     context.Context
+		request *apb.GetRoleRequest
+	}
+	tests := []struct {
+		name    string
+		args    args
+		want    *apb.GetRoleResponse
+		wantErr bool
+	}{
+		{
+			name: "default get role",
+			args: args{
+				ctx: context.TODO(),
+				request: &apb.GetRoleRequest{
+					RoleName: "adminTestRole",
+				},
+			},
+			want: &apb.GetRoleResponse{
+				Role: &apb.Role{
+					Name:        "adminTestRole",
+					Description: "Admin",
+				},
+				Status: apb.Status_STATUS_OK,
+			},
+			wantErr: false,
+		},
+		{
+			name: "error get role",
+			args: args{
+				ctx: context.TODO(),
+				request: &apb.GetRoleRequest{
+					RoleName: "not role",
+				},
+			},
+			want:    nil,
+			wantErr: true,
+		},
+	}
+	for _, tt := range tests {
+		t.Run(tt.name, func(t *testing.T) {
+			s := Auth{}
+			got, err := s.GetRole(tt.args.ctx, tt.args.request)
+			if (err != nil) != tt.wantErr {
+				t.Errorf("Auth.GetRole() error = %v, wantErr %v", err, tt.wantErr)
+				return
+			}
+			if got != nil && got.Status == tt.want.Status {
+				if got.Role.Name != tt.want.Role.Name || got.Role.Description != tt.want.Role.Description {
+					t.Errorf("Auth.GetRole() = %v, want %v", got, tt.want)
+				}
+			} else {
+				if got != nil {
+					t.Errorf("Auth.GetRole() = %v, want %v", got, tt.want)
+				}
+			}
+		})
+	}
+}
+
+func TestAuth_GetRoles(t *testing.T) {
+	err := clearAndCreateAuthTestSetup()
+	if err != nil {
+		t.Fatalf("%v", err)
+	}
+
+	type args struct {
+		ctx     context.Context
+		request *apb.GetRolesRequest
+	}
+	tests := []struct {
+		name    string
+		args    args
+		want    *apb.GetRolesResponse
+		wantLen int
+		wantErr bool
+	}{
+		{
+			name: "default get roles",
+			args: args{
+				ctx:     context.TODO(),
+				request: &apb.GetRolesRequest{},
+			},
+			want: &apb.GetRolesResponse{
+				Status: apb.Status_STATUS_OK,
+				Roles: []*apb.Role{
+					{
+						Name:        "adminTestRole",
+						Description: "Admin",
+						Permissions: []string{
+							"/gosdn.core.CoreService/GetPnd",
+							"/gosdn.core.CoreService/GetPndList",
+						}},
+					{
+						Name:        "userTestRole",
+						Description: "User",
+						Permissions: []string{
+							"/gosdn.pnd.PndService/GetChangeList",
+						}},
+					{
+						Name:        randomRoleName,
+						Description: "Not a role",
+						Permissions: []string{
+							"nope",
+						},
+					},
+				},
+			},
+			wantLen: 3,
+			wantErr: false,
+		},
+	}
+	for _, tt := range tests {
+		t.Run(tt.name, func(t *testing.T) {
+			s := Auth{}
+			got, err := s.GetRoles(tt.args.ctx, tt.args.request)
+			if (err != nil) != tt.wantErr {
+				t.Errorf("Auth.GetRoles() error = %v, wantErr %v", err, tt.wantErr)
+				return
+			}
+			if got != nil && got.Status == tt.want.Status {
+				if len(got.Roles) != 3 {
+					t.Errorf("Auth.GetRoles() = %v, want %v", got, tt.want)
+				}
+				for _, gotR := range got.Roles {
+					containsExpected := false
+					for _, wantR := range tt.want.Roles {
+						gotPerm := gotR.Permissions
+						wantPerm := wantR.Permissions
+						if gotR.Description == wantR.Description && gotR.Name == wantR.Name &&
+							reflect.DeepEqual(gotPerm, wantPerm) {
+							containsExpected = true
+							break
+						}
+					}
+					if !containsExpected {
+						t.Errorf("Auth.GetRoles() = %v, want %v", got, tt.want)
+					}
+				}
+			}
+		})
+	}
+}
+
+func TestAuth_UpdateRoles(t *testing.T) {
+	type args struct {
+		ctx     context.Context
+		request *apb.UpdateRolesRequest
+	}
+	tests := []struct {
+		name    string
+		args    args
+		want    *apb.UpdateRolesResponse
+		wantErr bool
+	}{
+		{
+			name: "default update roles",
+			args: args{
+				ctx: context.TODO(),
+				request: &apb.UpdateRolesRequest{
+					Roles: []*apb.Role{
+						{
+							Id:   adminRoleID,
+							Name: "New Name",
+						},
+					},
+				},
+			},
+			want: &apb.UpdateRolesResponse{
+				Status: apb.Status_STATUS_OK,
+			},
+			wantErr: false,
+		},
+		{
+			name: "error update roles",
+			args: args{
+				ctx: context.TODO(),
+				request: &apb.UpdateRolesRequest{
+					Roles: []*apb.Role{
+						{
+							Id:   uuid.NewString(),
+							Name: "New Name",
+						},
+					},
+				},
+			},
+			want:    nil,
+			wantErr: true,
+		},
+	}
+	for _, tt := range tests {
+		t.Run(tt.name, func(t *testing.T) {
+			s := Auth{}
+			got, err := s.UpdateRoles(tt.args.ctx, tt.args.request)
+			if (err != nil) != tt.wantErr {
+				t.Errorf("Auth.UpdateRoles() error = %v, wantErr %v", err, tt.wantErr)
+				return
+			}
+			if got != nil && got.Status != tt.want.Status {
+				t.Errorf("Auth.UpdateRoles() = %v, want %v", got, tt.want)
+			}
+		})
+	}
+}
+
+func TestAuth_DeletePermissionsForRole(t *testing.T) {
+	type args struct {
+		ctx     context.Context
+		request *apb.DeletePermissionsForRoleRequest
+	}
+	tests := []struct {
+		name    string
+		args    args
+		want    *apb.DeletePermissionsForRoleResponse
+		wantErr bool
+	}{
+		{
+			name: "default delete permissions for role",
+			args: args{
+				ctx: context.TODO(),
+				request: &apb.DeletePermissionsForRoleRequest{
+					RoleName: "adminTestRole",
+					PermissionsToDelete: []string{
+						"/gosdn.core.CoreService/GetPnd",
+						"/gosdn.core.CoreService/GetPndList",
+					},
+				},
+			},
+			want: &apb.DeletePermissionsForRoleResponse{
+				Status: apb.Status_STATUS_OK,
+			},
+			wantErr: false,
+		},
+		{
+			name: "error delete permissions for role no proper permissions provided",
+			args: args{
+				ctx: context.TODO(),
+				request: &apb.DeletePermissionsForRoleRequest{
+					RoleName: "adminTestRole",
+					PermissionsToDelete: []string{
+						"no",
+					},
+				},
+			},
+			want: &apb.DeletePermissionsForRoleResponse{
+				Status: apb.Status_STATUS_OK,
+			},
+			wantErr: true,
+		},
+	}
+	for _, tt := range tests {
+		t.Run(tt.name, func(t *testing.T) {
+			s := Auth{}
+			got, err := s.DeletePermissionsForRole(tt.args.ctx, tt.args.request)
+			if (err != nil) != tt.wantErr {
+				t.Errorf("Auth.DeletePermissionsForRole() error = %v, wantErr %v", err, tt.wantErr)
+				return
+			}
+			if got != nil && got.Status != tt.want.Status {
+				t.Errorf("Auth.DeletePermissionsForRole() = %v, want %v", got, tt.want)
+			}
+		})
+	}
+}
+
+func TestAuth_DeleteRoles(t *testing.T) {
+	type args struct {
+		ctx     context.Context
+		request *apb.DeleteRolesRequest
+	}
+	tests := []struct {
+		name    string
+		args    args
+		want    *apb.DeleteRolesResponse
+		wantErr bool
+	}{
+		{
+			name: "default delete roles",
+			args: args{
+				ctx: context.TODO(),
+				request: &apb.DeleteRolesRequest{
+					RoleName: []string{
+						"userTestRole",
+					},
+				},
+			},
+			want: &apb.DeleteRolesResponse{
+				Status: apb.Status_STATUS_OK,
+			},
+			wantErr: false,
+		},
+		{
+			name: "error delete roles",
+			args: args{
+				ctx: context.TODO(),
+				request: &apb.DeleteRolesRequest{
+					RoleName: []string{
+						"no",
+					},
+				},
+			},
+			want: &apb.DeleteRolesResponse{
+				Status: apb.Status_STATUS_OK,
+			},
+			wantErr: true,
+		},
+	}
+	for _, tt := range tests {
+		t.Run(tt.name, func(t *testing.T) {
+			s := Auth{}
+			got, err := s.DeleteRoles(tt.args.ctx, tt.args.request)
+			if (err != nil) != tt.wantErr {
+				t.Errorf("Auth.DeleteRoles() error = %v, wantErr %v", err, tt.wantErr)
+				return
+			}
+			if got != nil && got.Status != tt.want.Status {
+				t.Errorf("Auth.DeleteRoles() = %v, want %v", got, tt.want)
+			}
+		})
+	}
+}
+
+func clearAndCreateAuthTestSetup() error {
+	//clear setup if changed
+	storedUsers, err := userc.GetAll()
+	if err != nil {
+		return err
+	}
+	for _, u := range storedUsers {
+		err = userc.Delete(u)
+		if err != nil {
+			return err
+		}
+	}
+
+	storedRoles, err := rolec.GetAll()
+	if err != nil {
+		return err
+	}
+	for _, r := range storedRoles {
+		err = rolec.Delete(r)
+		if err != nil {
+			return err
+		}
+	}
+
+	// create dataset
+	err = createTestUsers()
+	if err != nil {
+		return err
+	}
+
+	err = createTestRoles()
+	if err != nil {
+		return err
+	}
+
+	return nil
+}
+
+//TODO(faseid): change password to hashed/encrypted one
+func createTestUsers() error {
+
+	randomRoleMap := map[string]string{pndID: randomRoleName}
+
+	users := []rbac.User{
+		{UserID: uuid.MustParse(adminID), UserName: "testAdmin", Roles: adminRoleMap, Password: "admin"},
+		{UserID: uuid.MustParse(userID), UserName: "testUser", Roles: userRoleMap, Password: "user"},
+		{UserID: uuid.New(), UserName: "testRandom", Roles: randomRoleMap, Password: "aurelius", Token: "wrong token"},
+	}
+
+	for _, u := range users {
+		err := userc.Add(rbac.NewUser(u.ID(), u.Name(), u.Roles, u.Password, ""))
+		if err != nil {
+			return err
+		}
+	}
+
+	return nil
+}
+
+func createTestRoles() error {
+	roles := []rbac.Role{
+		{
+			RoleID:      uuid.MustParse(adminRoleID),
+			RoleName:    "adminTestRole",
+			Description: "Admin",
+			Permissions: []string{
+				"/gosdn.core.CoreService/GetPnd",
+				"/gosdn.core.CoreService/GetPndList",
+			},
+		},
+		{
+			RoleID:      uuid.New(),
+			RoleName:    "userTestRole",
+			Description: "User",
+			Permissions: []string{
+				"/gosdn.pnd.PndService/GetChangeList",
+			},
+		},
+		{
+			RoleID:      uuid.New(),
+			RoleName:    randomRoleName,
+			Description: "Not a role",
+			Permissions: []string{
+				"nope",
+			},
+		},
+	}
+
+	for _, r := range roles {
+		err := rolec.Add(rbac.NewRole(r.ID(), r.Name(), r.Description, r.Permissions))
+		if err != nil {
+			return err
+		}
+	}
+
+	return nil
+}
diff --git a/controller/northbound/server/pnd_test.go b/controller/northbound/server/pnd_test.go
index 64fd8a80fb533f573ea86a64153a56cc21b0474e..4e63f520532090d34c6389fdd6ef6f3d46711207 100644
--- a/controller/northbound/server/pnd_test.go
+++ b/controller/northbound/server/pnd_test.go
@@ -46,6 +46,7 @@ var deviceUUID uuid.UUID
 var mockPnd *mocks.NetworkDomain
 var mockDevice device.Device
 var sbiStore southbound.SbiStore
+var mockJwt *rbac.JWTManager
 
 func callback(id uuid.UUID, ch chan device.Details) {
 	// Need for pnd creation, but not needed for this test case.
@@ -148,8 +149,14 @@ func TestMain(m *testing.M) {
 		log.Fatal(err)
 	}
 
+	// everyting auth related
 	userc = rbac.NewUserStore()
 	rolec = rbac.NewRoleStore()
+	err = clearAndCreateAuthTestSetup()
+	if err != nil {
+		log.Fatal(err)
+	}
+	jwt = rbac.NewJWTManager("", 1*time.Minute)
 
 	os.Exit(m.Run())
 }
diff --git a/controller/store/genericStore.go b/controller/store/genericStore.go
index 551e1cf89081483ced57aa2caaa36883fc5da913..cb4c255cf991ea7fbb6f86b5d15717d1c8862b3f 100644
--- a/controller/store/genericStore.go
+++ b/controller/store/genericStore.go
@@ -1,6 +1,8 @@
 package store
 
 import (
+	"errors"
+
 	"github.com/google/uuid"
 )
 
@@ -26,7 +28,7 @@ func NewGenericStore[T storableConstraint]() GenericStore[T] {
 func (t *GenericStore[T]) Add(item T) error {
 	_, ok := t.Store[item.ID()]
 	if ok {
-		return nil
+		return errors.New("item not found")
 	}
 
 	t.Store[item.ID()] = item
@@ -60,12 +62,12 @@ func (t *GenericStore[T]) Get(query Query) (T, error) {
 		// Second search for name
 		id, ok := t.nameLookupTable[query.Name]
 		if !ok {
-			return *new(T), nil
+			return *new(T), errors.New("item not found")
 		}
 
 		item, ok := t.Store[id]
 		if !ok {
-			return *new(T), nil
+			return *new(T), errors.New("item not found")
 		}
 
 		return item, nil