Index: trip-planner-front/src/app/app.module.ts
===================================================================
--- trip-planner-front/src/app/app.module.ts	(revision 8d391a12ef6baa3aefe9611a6f7c5b569977c946)
+++ trip-planner-front/src/app/app.module.ts	(revision 1ad8e64a349fcc7c996155279b16efc2cfe001dd)
@@ -45,4 +45,6 @@
 import {PaginatorModule} from 'primeng/paginator';
 import {CardModule} from 'primeng/card';
+import { RegisterComponent } from './homepage/register/register.component';
+import { LoginComponent } from './homepage/login/login.component';
 
 @NgModule({
@@ -57,5 +59,7 @@
     AddLocationToPlannerPanelComponent,
     HomepageComponent,
-    LocationDetailsComponent
+    LocationDetailsComponent,
+    RegisterComponent,
+    LoginComponent
   ],
   imports: [
Index: trip-planner-front/src/app/create-initial-planner/create-initial-planner.component.html
===================================================================
--- trip-planner-front/src/app/create-initial-planner/create-initial-planner.component.html	(revision 8d391a12ef6baa3aefe9611a6f7c5b569977c946)
+++ trip-planner-front/src/app/create-initial-planner/create-initial-planner.component.html	(revision 1ad8e64a349fcc7c996155279b16efc2cfe001dd)
@@ -1,3 +1,2 @@
-<form (ngSubmit)="onFormSubmitPlanner(f)" #f="ngForm" >
   <div mat-dialog-content>
     <p>Planner name</p>
@@ -12,6 +11,5 @@
   </div>
   <div mat-dialog-actions>
-    <button pButton pRipple type="button" label="Save" [disabled]="!f.form.valid"
-      class="p-button-outlined p-button-rounded p-button-help"></button>
+    <button pButton pRipple type="submit" label="Save" 
+      class="p-button-outlined p-button-rounded p-button-help" (click)="onFormSubmitPlanner(planner)"></button>
   </div>
-</form>
Index: trip-planner-front/src/app/create-initial-planner/create-initial-planner.component.ts
===================================================================
--- trip-planner-front/src/app/create-initial-planner/create-initial-planner.component.ts	(revision 8d391a12ef6baa3aefe9611a6f7c5b569977c946)
+++ trip-planner-front/src/app/create-initial-planner/create-initial-planner.component.ts	(revision 1ad8e64a349fcc7c996155279b16efc2cfe001dd)
@@ -1,11 +1,6 @@
-import { ResourceLoader } from '@angular/compiler';
-import { Route } from '@angular/compiler/src/core';
-import { Component, Inject, OnInit } from '@angular/core';
-import { NgForm } from '@angular/forms';
-import { MatDialogRef, MAT_DIALOG_DATA } from '@angular/material/dialog';
-import { ActivatedRoute, Params, Router } from '@angular/router';
+import { Component, OnInit } from '@angular/core';
+import { DynamicDialogRef } from 'primeng/dynamicdialog';
 import { PlannerDto } from '../_models/dto/plannerDto';
 import { Planner } from '../_models/planner';
-import { PlannerService } from '../_services/planner.service';
 
 @Component({
@@ -17,11 +12,8 @@
 
   planner: Planner;
-  planners: Planner[];
   plannerDto: PlannerDto;
 
-  constructor(private dialogRef: MatDialogRef<CreateInitialPlannerComponent>,
-              private plannerService : PlannerService, private router : Router) {
+  constructor( private ref: DynamicDialogRef) {
                 this.planner = new Planner;
-                this.planners = [];
                 this.plannerDto = new PlannerDto();
               }
@@ -32,18 +24,7 @@
   }
 
-  onCancelClick(): void {
-    this.dialogRef.close();
-  }
-  
-  onFormSubmitPlanner(form: NgForm){
-   console.log(this.planner);
-      this.plannerService.postInitialPlanner(this.planner).subscribe(
-        data=>{
-          console.log(data);
-          this.router.navigate(['planner']);
-        },
-        error => console.log('oops', error)
-     );
-     window.location.reload();
+  onFormSubmitPlanner(planner){
+    this.ref.close(planner);
+    window.location.reload();
   }
 
Index: trip-planner-front/src/app/homepage/homepage.component.html
===================================================================
--- trip-planner-front/src/app/homepage/homepage.component.html	(revision 8d391a12ef6baa3aefe9611a6f7c5b569977c946)
+++ trip-planner-front/src/app/homepage/homepage.component.html	(revision 1ad8e64a349fcc7c996155279b16efc2cfe001dd)
@@ -17,4 +17,7 @@
 
       <ul class="navbar-nav ml-auto">
+        <li class="nav-item">
+          <button class="btn btn-dark" (click)="onClickSignUp()" type="button">Sign up</button>
+        </li>
         <li class="nav-item">
           <button class="btn btn-dark">Sign in</button>
Index: trip-planner-front/src/app/homepage/homepage.component.ts
===================================================================
--- trip-planner-front/src/app/homepage/homepage.component.ts	(revision 8d391a12ef6baa3aefe9611a6f7c5b569977c946)
+++ trip-planner-front/src/app/homepage/homepage.component.ts	(revision 1ad8e64a349fcc7c996155279b16efc2cfe001dd)
@@ -1,5 +1,7 @@
 import { Component, OnInit } from '@angular/core';
+import { DialogService, DynamicDialogRef } from 'primeng/dynamicdialog';
 import { Location } from '../_models/location';
 import { LocationService } from '../_services/location.service';
+import { RegisterComponent } from './register/register.component';
 
 
@@ -16,6 +18,7 @@
    locations: Location[];
    villages: Location[];
+   ref: DynamicDialogRef;
 
-   constructor(private locationService: LocationService) {
+   constructor(private locationService: LocationService, private dialogService: DialogService) {
       this.responsiveOptions = [
          {
@@ -37,4 +40,5 @@
       this.locations = [];
       this.villages = [];
+      this.ref = new DynamicDialogRef;
    }
 
@@ -52,3 +56,13 @@
       );
    }
+
+   onClickSignUp(){
+      console.log("VLEGOV");
+      this.ref = this.dialogService.open(RegisterComponent, {
+         header: 'Register form',
+         width: '70%',
+         contentStyle: { "max-height": "500px", "overflow": "auto" },
+         baseZIndex: 10000
+       });
+   }
 }
Index: trip-planner-front/src/app/homepage/login/login.component.html
===================================================================
--- trip-planner-front/src/app/homepage/login/login.component.html	(revision 1ad8e64a349fcc7c996155279b16efc2cfe001dd)
+++ trip-planner-front/src/app/homepage/login/login.component.html	(revision 1ad8e64a349fcc7c996155279b16efc2cfe001dd)
@@ -0,0 +1,1 @@
+<p>login works!</p>
Index: trip-planner-front/src/app/homepage/login/login.component.spec.ts
===================================================================
--- trip-planner-front/src/app/homepage/login/login.component.spec.ts	(revision 1ad8e64a349fcc7c996155279b16efc2cfe001dd)
+++ trip-planner-front/src/app/homepage/login/login.component.spec.ts	(revision 1ad8e64a349fcc7c996155279b16efc2cfe001dd)
@@ -0,0 +1,25 @@
+import { ComponentFixture, TestBed } from '@angular/core/testing';
+
+import { LoginComponent } from './login.component';
+
+describe('LoginComponent', () => {
+  let component: LoginComponent;
+  let fixture: ComponentFixture<LoginComponent>;
+
+  beforeEach(async () => {
+    await TestBed.configureTestingModule({
+      declarations: [ LoginComponent ]
+    })
+    .compileComponents();
+  });
+
+  beforeEach(() => {
+    fixture = TestBed.createComponent(LoginComponent);
+    component = fixture.componentInstance;
+    fixture.detectChanges();
+  });
+
+  it('should create', () => {
+    expect(component).toBeTruthy();
+  });
+});
Index: trip-planner-front/src/app/homepage/login/login.component.ts
===================================================================
--- trip-planner-front/src/app/homepage/login/login.component.ts	(revision 1ad8e64a349fcc7c996155279b16efc2cfe001dd)
+++ trip-planner-front/src/app/homepage/login/login.component.ts	(revision 1ad8e64a349fcc7c996155279b16efc2cfe001dd)
@@ -0,0 +1,15 @@
+import { Component, OnInit } from '@angular/core';
+
+@Component({
+  selector: 'app-login',
+  templateUrl: './login.component.html',
+  styleUrls: ['./login.component.css']
+})
+export class LoginComponent implements OnInit {
+
+  constructor() { }
+
+  ngOnInit(): void {
+  }
+
+}
Index: trip-planner-front/src/app/homepage/register/register.component.html
===================================================================
--- trip-planner-front/src/app/homepage/register/register.component.html	(revision 1ad8e64a349fcc7c996155279b16efc2cfe001dd)
+++ trip-planner-front/src/app/homepage/register/register.component.html	(revision 1ad8e64a349fcc7c996155279b16efc2cfe001dd)
@@ -0,0 +1,31 @@
+<div class="p-grid p-fluid">
+    <div class="p-col-12 p-md-4">
+        <div class="p-inputgroup">
+            <span class="p-inputgroup-addon"><i class="pi pi-user"></i></span>
+            <input type="text" pInputText placeholder="Full name">         
+        </div>
+    </div>
+
+    <div class="p-col-12 p-md-4">
+        <div class="p-inputgroup">
+            <span class="p-inputgroup-addon"><i class="pi pi-user"></i></span>
+            <input type="text" pInputText placeholder="Ema address (Username)">         
+        </div>
+    </div>
+    <div class="p-col-12 p-md-4">
+        <div class="p-inputgroup">
+            <span class="p-inputgroup-addon"><i class="pi pi-password"></i></span>
+            <input type="text" pInputText placeholder="Password">         
+        </div>
+    </div>
+    <div class="p-col-12 p-md-4">
+        <div class="p-inputgroup">
+            <span class="p-inputgroup-addon"><i class="pi pi-password"></i></span>
+            <input type="text" pInputText placeholder="Repeat password">         
+        </div>
+    </div>
+
+    <div class="p-col-12 p-md-4">
+        <button pButton pRipple type="button" label="Submit" class="p-button-secondary"></button>
+    </div>
+</div>
Index: trip-planner-front/src/app/homepage/register/register.component.ts
===================================================================
--- trip-planner-front/src/app/homepage/register/register.component.ts	(revision 1ad8e64a349fcc7c996155279b16efc2cfe001dd)
+++ trip-planner-front/src/app/homepage/register/register.component.ts	(revision 1ad8e64a349fcc7c996155279b16efc2cfe001dd)
@@ -0,0 +1,15 @@
+import { Component, OnInit } from '@angular/core';
+
+@Component({
+  selector: 'app-register',
+  templateUrl: './register.component.html',
+  styleUrls: ['./register.component.css']
+})
+export class RegisterComponent implements OnInit {
+
+  constructor() { }
+
+  ngOnInit(): void {
+  }
+
+}
Index: trip-planner-front/src/app/location/add-location-to-planner-panel/add-location-to-planner-panel.component.ts
===================================================================
--- trip-planner-front/src/app/location/add-location-to-planner-panel/add-location-to-planner-panel.component.ts	(revision 8d391a12ef6baa3aefe9611a6f7c5b569977c946)
+++ trip-planner-front/src/app/location/add-location-to-planner-panel/add-location-to-planner-panel.component.ts	(revision 1ad8e64a349fcc7c996155279b16efc2cfe001dd)
@@ -5,6 +5,5 @@
 import { DynamicDialogRef } from 'primeng/dynamicdialog';
 import { LocationService } from 'src/app/_services/location.service';
-import { Location } from 'src/app/_models/location';
-import { PlannerLocationDto } from 'src/app/_models/dto/plannerLocationDto';
+
 
 
Index: trip-planner-front/src/app/location/location.component.html
===================================================================
--- trip-planner-front/src/app/location/location.component.html	(revision 8d391a12ef6baa3aefe9611a6f7c5b569977c946)
+++ trip-planner-front/src/app/location/location.component.html	(revision 1ad8e64a349fcc7c996155279b16efc2cfe001dd)
@@ -1,5 +1,6 @@
 <link href="https://cdn.jsdelivr.net/npm/bootstrap@5.0.1/dist/css/bootstrap.min.css" rel="stylesheet"
   integrity="sha384-+0n0xVW2eSR5OomGNYDnhzAbDsOXxcvSN1TPprVMTNDbiYZCxYbOOl7+AMvyTG2x" crossorigin="anonymous">
-  <p-toast></p-toast>
+
+<p-toast></p-toast>
 <h3>Here are all locations</h3>
 <button pButton pRipple type="button" icon="pi pi-bell" class="p-button-rounded p-button-warning" label="Back to my Planners" (click)="onClickBackToMyPlanners()"></button>
Index: trip-planner-front/src/app/location/location.component.ts
===================================================================
--- trip-planner-front/src/app/location/location.component.ts	(revision 8d391a12ef6baa3aefe9611a6f7c5b569977c946)
+++ trip-planner-front/src/app/location/location.component.ts	(revision 1ad8e64a349fcc7c996155279b16efc2cfe001dd)
@@ -124,6 +124,4 @@
         }
       );
-
-
     });
   }
Index: trip-planner-front/src/app/planner/edit-planner/edit-planner.component.html
===================================================================
--- trip-planner-front/src/app/planner/edit-planner/edit-planner.component.html	(revision 8d391a12ef6baa3aefe9611a6f7c5b569977c946)
+++ trip-planner-front/src/app/planner/edit-planner/edit-planner.component.html	(revision 1ad8e64a349fcc7c996155279b16efc2cfe001dd)
@@ -43,6 +43,4 @@
     </div>
     <button pButton pRipplelabel label="Save" class="p-button-help"></button>
-    <button pButton pRipple label="Back" class="p-button-info" (click)="onClickBack()" [style]="{'margin-left': '.5em'}"></button>
-
 </form>
-
+<button pButton pRipple label="Back" class="p-button-info" (click)="onClickBack()" [style]="{'margin-left': '.11em'}"></button>
Index: trip-planner-front/src/app/planner/edit-planner/edit-planner.component.ts
===================================================================
--- trip-planner-front/src/app/planner/edit-planner/edit-planner.component.ts	(revision 8d391a12ef6baa3aefe9611a6f7c5b569977c946)
+++ trip-planner-front/src/app/planner/edit-planner/edit-planner.component.ts	(revision 1ad8e64a349fcc7c996155279b16efc2cfe001dd)
@@ -78,5 +78,4 @@
 
   onClickBack(){
-    console.log("promena");
     this.router.navigate(['planners']);
   }
Index: trip-planner-front/src/app/planner/planner.component.html
===================================================================
--- trip-planner-front/src/app/planner/planner.component.html	(revision 8d391a12ef6baa3aefe9611a6f7c5b569977c946)
+++ trip-planner-front/src/app/planner/planner.component.html	(revision 1ad8e64a349fcc7c996155279b16efc2cfe001dd)
@@ -1,5 +1,5 @@
 <link href="https://cdn.jsdelivr.net/npm/bootstrap@5.0.1/dist/css/bootstrap.min.css" rel="stylesheet" integrity="sha384-+0n0xVW2eSR5OomGNYDnhzAbDsOXxcvSN1TPprVMTNDbiYZCxYbOOl7+AMvyTG2x" crossorigin="anonymous">
 
-
+<p-toast></p-toast>
 <button pButton pRipple type="button" label="Create initial planner" class="p-button-help " (click)="show()"></button>
 <br>
Index: trip-planner-front/src/app/planner/planner.component.ts
===================================================================
--- trip-planner-front/src/app/planner/planner.component.ts	(revision 8d391a12ef6baa3aefe9611a6f7c5b569977c946)
+++ trip-planner-front/src/app/planner/planner.component.ts	(revision 1ad8e64a349fcc7c996155279b16efc2cfe001dd)
@@ -5,7 +5,6 @@
 import { Router } from '@angular/router';
 import { PlannerDto } from '../_models/dto/plannerDto';
-import { FormBuilder, FormGroup, Validators } from '@angular/forms';
 import { DialogService, DynamicDialogRef } from 'primeng/dynamicdialog';
-import { PrimeNGConfig } from 'primeng/api';
+import { MessageService, PrimeNGConfig } from 'primeng/api';
 
 
@@ -13,5 +12,6 @@
   selector: 'app-planner',
   templateUrl: './planner.component.html',
-  styleUrls: ['./planner.component.css']
+  styleUrls: ['./planner.component.css'],
+  providers: [DialogService, MessageService]
 })
 export class PlannerComponent implements OnInit {
@@ -19,16 +19,12 @@
   planners: Planner[];
   plannerDto: PlannerDto;
-  editForm: FormGroup;
   ref: DynamicDialogRef;
 
 
   constructor(private plannerService: PlannerService, private router: Router,
-    private fb: FormBuilder, private dialogService: DialogService, private primengConfig: PrimeNGConfig) {
+    private dialogService: DialogService, private primengConfig: PrimeNGConfig, private messageService: MessageService) {
     this.planners = [];
     this.plannerDto = new PlannerDto();
-    this.editForm = fb.group({
-      title: fb.control('initial value', Validators.required)
-    });
-    this.ref = new DynamicDialogRef;   
+    this.ref = new DynamicDialogRef;
   }
 
@@ -51,6 +47,6 @@
       }
     );
+  }
 
-  }
   show() {
     this.ref = this.dialogService.open(CreateInitialPlannerComponent, {
@@ -60,4 +56,16 @@
       baseZIndex: 10000
     });
+    this.ref.onClose.subscribe((planner: Planner) => {
+      console.log("NOVOKREIRANIOT NAME NA PLANNER: " + planner.name);
+      this.plannerService.postInitialPlanner(planner).subscribe(
+        data=>{
+          console.log(data);
+        },
+        error => console.log('oops', error)
+     );
+      this.messageService.add({ severity: 'success', summary: 'The planner: ' + planner.name + ' has been created.' });
+    });
+    
   }
+
 }
Index: trip-planner/pom.xml
===================================================================
--- trip-planner/pom.xml	(revision 8d391a12ef6baa3aefe9611a6f7c5b569977c946)
+++ trip-planner/pom.xml	(revision 1ad8e64a349fcc7c996155279b16efc2cfe001dd)
@@ -80,4 +80,23 @@
             <version>3.0.3</version>
         </dependency>
+        <!--SPRING SECURITY-->
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-security</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>com.google.code.gson</groupId>
+            <artifactId>gson</artifactId>
+            <version>2.8.5</version>
+        </dependency>
+        <dependency>
+            <groupId>io.jsonwebtoken</groupId>
+            <artifactId>jjwt</artifactId>
+            <version>0.9.0</version>
+        </dependency>
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-validation</artifactId>
+        </dependency>
     </dependencies>
 
Index: trip-planner/src/main/java/finki/diplomska/tripplanner/TripPlannerApplication.java
===================================================================
--- trip-planner/src/main/java/finki/diplomska/tripplanner/TripPlannerApplication.java	(revision 8d391a12ef6baa3aefe9611a6f7c5b569977c946)
+++ trip-planner/src/main/java/finki/diplomska/tripplanner/TripPlannerApplication.java	(revision 1ad8e64a349fcc7c996155279b16efc2cfe001dd)
@@ -4,4 +4,6 @@
 import org.springframework.boot.SpringApplication;
 import org.springframework.boot.autoconfigure.SpringBootApplication;
+import org.springframework.context.annotation.Bean;
+import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
 
 @SpringBootApplication
@@ -9,4 +11,8 @@
 public class TripPlannerApplication {
 
+    @Bean
+    BCryptPasswordEncoder bCryptPasswordEncoder(){
+        return new BCryptPasswordEncoder();
+    }
     public static void main(String[] args) {
         SpringApplication.run(TripPlannerApplication.class, args);
Index: trip-planner/src/main/java/finki/diplomska/tripplanner/models/User.java
===================================================================
--- trip-planner/src/main/java/finki/diplomska/tripplanner/models/User.java	(revision 1ad8e64a349fcc7c996155279b16efc2cfe001dd)
+++ trip-planner/src/main/java/finki/diplomska/tripplanner/models/User.java	(revision 1ad8e64a349fcc7c996155279b16efc2cfe001dd)
@@ -0,0 +1,84 @@
+package finki.diplomska.tripplanner.models;
+
+import com.fasterxml.jackson.annotation.JsonIgnore;
+import lombok.AllArgsConstructor;
+import lombok.Getter;
+import lombok.Setter;
+import org.springframework.security.core.GrantedAuthority;
+import org.springframework.security.core.userdetails.UserDetails;
+
+import javax.persistence.*;
+import javax.validation.constraints.Email;
+import javax.validation.constraints.NotBlank;
+import java.util.Collection;
+import java.util.Date;
+
+@Entity
+@Table(name = "users")
+@AllArgsConstructor
+@Getter
+@Setter
+public class User implements UserDetails {
+
+    @Id
+    @GeneratedValue(strategy = GenerationType.IDENTITY)
+    private Long id;
+
+    @Email(message = "Username needs to be an email")
+    @NotBlank(message = "username is required")
+    @Column(unique = true)
+    private String username;
+    @NotBlank(message = "Please enter your full name")
+    private String fullName;
+    @NotBlank(message = "Password field is required")
+    private String password;
+    @Transient
+    private String confirmPassword;
+    private Date create_At;
+    private Date update_At;
+
+    //OneToMany with Project
+
+    public User() {
+    }
+
+
+    @PrePersist
+    protected void onCreate(){
+        this.create_At = new Date();
+    }
+    @PreUpdate
+    protected void onUpdate(){
+        this.update_At = new Date();
+    }
+
+    @Override
+    @JsonIgnore
+    public Collection<? extends GrantedAuthority> getAuthorities() {
+        return null;
+    }
+
+    @Override
+    @JsonIgnore
+    public boolean isAccountNonExpired() {
+        return true;
+    }
+
+    @Override
+    @JsonIgnore
+    public boolean isAccountNonLocked() {
+        return true;
+    }
+
+    @Override
+    @JsonIgnore
+    public boolean isCredentialsNonExpired() {
+        return true;
+    }
+
+    @Override
+    @JsonIgnore
+    public boolean isEnabled() {
+        return true;
+    }
+}
Index: trip-planner/src/main/java/finki/diplomska/tripplanner/models/dto/PlannerDto.java
===================================================================
--- trip-planner/src/main/java/finki/diplomska/tripplanner/models/dto/PlannerDto.java	(revision 8d391a12ef6baa3aefe9611a6f7c5b569977c946)
+++ trip-planner/src/main/java/finki/diplomska/tripplanner/models/dto/PlannerDto.java	(revision 1ad8e64a349fcc7c996155279b16efc2cfe001dd)
@@ -3,5 +3,4 @@
 import lombok.Data;
 
-import java.util.List;
 
 @Data
Index: trip-planner/src/main/java/finki/diplomska/tripplanner/models/dto/UserDto.java
===================================================================
--- trip-planner/src/main/java/finki/diplomska/tripplanner/models/dto/UserDto.java	(revision 1ad8e64a349fcc7c996155279b16efc2cfe001dd)
+++ trip-planner/src/main/java/finki/diplomska/tripplanner/models/dto/UserDto.java	(revision 1ad8e64a349fcc7c996155279b16efc2cfe001dd)
@@ -0,0 +1,30 @@
+package finki.diplomska.tripplanner.models.dto;
+
+
+import lombok.Data;
+
+import java.util.Date;
+
+@Data
+public class UserDto {
+    private String username;
+
+    private String fullName;
+
+    private String password;
+
+    private String confirmPassword;
+
+    private Date create_At;
+
+    private Date update_At;
+
+    public UserDto(String username, String fullName, String password, String confirmPassword, Date create_At, Date update_At) {
+        this.username = username;
+        this.fullName = fullName;
+        this.password = password;
+        this.confirmPassword = confirmPassword;
+        this.create_At = create_At;
+        this.update_At = update_At;
+    }
+}
Index: trip-planner/src/main/java/finki/diplomska/tripplanner/models/exceptions/CustomResponseEntityExceptionHandler.java
===================================================================
--- trip-planner/src/main/java/finki/diplomska/tripplanner/models/exceptions/CustomResponseEntityExceptionHandler.java	(revision 1ad8e64a349fcc7c996155279b16efc2cfe001dd)
+++ trip-planner/src/main/java/finki/diplomska/tripplanner/models/exceptions/CustomResponseEntityExceptionHandler.java	(revision 1ad8e64a349fcc7c996155279b16efc2cfe001dd)
@@ -0,0 +1,18 @@
+package finki.diplomska.tripplanner.models.exceptions;
+
+import org.springframework.http.HttpStatus;
+import org.springframework.http.ResponseEntity;
+import org.springframework.web.bind.annotation.ControllerAdvice;
+import org.springframework.web.bind.annotation.ExceptionHandler;
+import org.springframework.web.bind.annotation.RestController;
+import org.springframework.web.context.request.WebRequest;
+
+@ControllerAdvice
+@RestController
+public class CustomResponseEntityExceptionHandler {
+    @ExceptionHandler
+    public final ResponseEntity<Object> handleUsernameAlreadyExists(UsernameAlreadyExistsException ex, WebRequest request){
+        UsernameAlreadyExistsResponse exceptionResponse = new UsernameAlreadyExistsResponse(ex.getMessage());
+        return new ResponseEntity(exceptionResponse, HttpStatus.BAD_REQUEST);
+    }
+}
Index: trip-planner/src/main/java/finki/diplomska/tripplanner/models/exceptions/InvalidLoginResponse.java
===================================================================
--- trip-planner/src/main/java/finki/diplomska/tripplanner/models/exceptions/InvalidLoginResponse.java	(revision 1ad8e64a349fcc7c996155279b16efc2cfe001dd)
+++ trip-planner/src/main/java/finki/diplomska/tripplanner/models/exceptions/InvalidLoginResponse.java	(revision 1ad8e64a349fcc7c996155279b16efc2cfe001dd)
@@ -0,0 +1,27 @@
+package finki.diplomska.tripplanner.models.exceptions;
+
+public class InvalidLoginResponse {
+    private String username;
+    private String password;
+
+    public InvalidLoginResponse() {
+        this.username = "Invalid username";
+        this.password = "Invalid 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;
+    }
+}
Index: trip-planner/src/main/java/finki/diplomska/tripplanner/models/exceptions/UsernameAlreadyExistsException.java
===================================================================
--- trip-planner/src/main/java/finki/diplomska/tripplanner/models/exceptions/UsernameAlreadyExistsException.java	(revision 1ad8e64a349fcc7c996155279b16efc2cfe001dd)
+++ trip-planner/src/main/java/finki/diplomska/tripplanner/models/exceptions/UsernameAlreadyExistsException.java	(revision 1ad8e64a349fcc7c996155279b16efc2cfe001dd)
@@ -0,0 +1,12 @@
+package finki.diplomska.tripplanner.models.exceptions;
+
+import org.springframework.http.HttpStatus;
+import org.springframework.web.bind.annotation.ResponseStatus;
+
+@ResponseStatus(HttpStatus.BAD_REQUEST)
+public class UsernameAlreadyExistsException extends RuntimeException{
+
+    public UsernameAlreadyExistsException (String message){
+        super(message);
+    }
+}
Index: trip-planner/src/main/java/finki/diplomska/tripplanner/models/exceptions/UsernameAlreadyExistsResponse.java
===================================================================
--- trip-planner/src/main/java/finki/diplomska/tripplanner/models/exceptions/UsernameAlreadyExistsResponse.java	(revision 1ad8e64a349fcc7c996155279b16efc2cfe001dd)
+++ trip-planner/src/main/java/finki/diplomska/tripplanner/models/exceptions/UsernameAlreadyExistsResponse.java	(revision 1ad8e64a349fcc7c996155279b16efc2cfe001dd)
@@ -0,0 +1,17 @@
+package finki.diplomska.tripplanner.models.exceptions;
+
+public class UsernameAlreadyExistsResponse {
+    private String username;
+
+    public UsernameAlreadyExistsResponse(String username) {
+        this.username = username;
+    }
+
+    public String getUsername() {
+        return username;
+    }
+
+    public void setUsername(String username) {
+        this.username = username;
+    }
+}
Index: trip-planner/src/main/java/finki/diplomska/tripplanner/repository/jpa/JpaUserRepository.java
===================================================================
--- trip-planner/src/main/java/finki/diplomska/tripplanner/repository/jpa/JpaUserRepository.java	(revision 1ad8e64a349fcc7c996155279b16efc2cfe001dd)
+++ trip-planner/src/main/java/finki/diplomska/tripplanner/repository/jpa/JpaUserRepository.java	(revision 1ad8e64a349fcc7c996155279b16efc2cfe001dd)
@@ -0,0 +1,9 @@
+package finki.diplomska.tripplanner.repository.jpa;
+
+import finki.diplomska.tripplanner.models.User;
+import org.springframework.data.repository.CrudRepository;
+import org.springframework.stereotype.Repository;
+
+@Repository
+public interface JpaUserRepository extends CrudRepository<User, Long> {
+}
Index: trip-planner/src/main/java/finki/diplomska/tripplanner/security/JwtAuthenticationEntryPoint.java
===================================================================
--- trip-planner/src/main/java/finki/diplomska/tripplanner/security/JwtAuthenticationEntryPoint.java	(revision 1ad8e64a349fcc7c996155279b16efc2cfe001dd)
+++ trip-planner/src/main/java/finki/diplomska/tripplanner/security/JwtAuthenticationEntryPoint.java	(revision 1ad8e64a349fcc7c996155279b16efc2cfe001dd)
@@ -0,0 +1,28 @@
+package finki.diplomska.tripplanner.security;
+
+import com.google.gson.Gson;
+import finki.diplomska.tripplanner.models.exceptions.InvalidLoginResponse;
+import org.springframework.security.core.AuthenticationException;
+import org.springframework.security.web.AuthenticationEntryPoint;
+import org.springframework.stereotype.Component;
+
+import javax.servlet.ServletException;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import java.io.IOException;
+
+@Component
+public class JwtAuthenticationEntryPoint implements AuthenticationEntryPoint {
+    @Override
+    public void commence(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse,
+                         AuthenticationException e) throws IOException, ServletException {
+
+        InvalidLoginResponse loginResponse = new InvalidLoginResponse();
+        String jsonLoginResponse = new Gson().toJson(loginResponse);
+
+
+        httpServletResponse.setContentType("application/json");
+        httpServletResponse.setStatus(401);
+        httpServletResponse.getWriter().print(jsonLoginResponse);
+    }
+}
Index: trip-planner/src/main/java/finki/diplomska/tripplanner/security/SecurityConfig.java
===================================================================
--- trip-planner/src/main/java/finki/diplomska/tripplanner/security/SecurityConfig.java	(revision 1ad8e64a349fcc7c996155279b16efc2cfe001dd)
+++ trip-planner/src/main/java/finki/diplomska/tripplanner/security/SecurityConfig.java	(revision 1ad8e64a349fcc7c996155279b16efc2cfe001dd)
@@ -0,0 +1,48 @@
+package finki.diplomska.tripplanner.security;
+
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.security.config.annotation.method.configuration.EnableGlobalMethodSecurity;
+import org.springframework.security.config.annotation.web.builders.HttpSecurity;
+import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
+import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;
+import org.springframework.security.config.http.SessionCreationPolicy;
+
+@Configuration
+@EnableWebSecurity
+@EnableGlobalMethodSecurity(
+        securedEnabled = true,
+        jsr250Enabled = true,
+        prePostEnabled = true
+)
+public class SecurityConfig extends WebSecurityConfigurerAdapter {
+
+    @Autowired
+    private JwtAuthenticationEntryPoint unauthorizedHandler;
+
+    @Override
+    protected void configure(HttpSecurity http) throws Exception {
+        http.cors().and().csrf().disable()
+                .exceptionHandling().authenticationEntryPoint(unauthorizedHandler).and()
+                .sessionManagement()
+                .sessionCreationPolicy(SessionCreationPolicy.STATELESS)
+                .and()
+                .headers().frameOptions().sameOrigin() //To enable H2 Database
+                .and()
+                .authorizeRequests()
+                .antMatchers(
+                        "/",
+                        "/favicon.ico",
+                        "/**/*.png",
+                        "/**/*.gif",
+                        "/**/*.svg",
+                        "/**/*.jpg",
+                        "/**/*.html",
+                        "/**/*.css",
+                        "/**/*.js"
+                ).permitAll()
+                .antMatchers("/api/users/**").permitAll()
+                .anyRequest().authenticated();
+    }
+}
Index: trip-planner/src/main/java/finki/diplomska/tripplanner/service/UserService.java
===================================================================
--- trip-planner/src/main/java/finki/diplomska/tripplanner/service/UserService.java	(revision 1ad8e64a349fcc7c996155279b16efc2cfe001dd)
+++ trip-planner/src/main/java/finki/diplomska/tripplanner/service/UserService.java	(revision 1ad8e64a349fcc7c996155279b16efc2cfe001dd)
@@ -0,0 +1,11 @@
+package finki.diplomska.tripplanner.service;
+
+import finki.diplomska.tripplanner.models.User;
+
+
+
+public interface UserService {
+
+    User saveUser (User user);
+
+}
Index: trip-planner/src/main/java/finki/diplomska/tripplanner/service/impl/MapValidationErrorService.java
===================================================================
--- trip-planner/src/main/java/finki/diplomska/tripplanner/service/impl/MapValidationErrorService.java	(revision 1ad8e64a349fcc7c996155279b16efc2cfe001dd)
+++ trip-planner/src/main/java/finki/diplomska/tripplanner/service/impl/MapValidationErrorService.java	(revision 1ad8e64a349fcc7c996155279b16efc2cfe001dd)
@@ -0,0 +1,28 @@
+package finki.diplomska.tripplanner.service.impl;
+
+import org.springframework.http.HttpStatus;
+import org.springframework.http.ResponseEntity;
+import org.springframework.stereotype.Service;
+import org.springframework.validation.BindingResult;
+import org.springframework.validation.FieldError;
+
+import java.util.HashMap;
+import java.util.Map;
+
+@Service
+public class MapValidationErrorService {
+    public ResponseEntity<?> MapValidationService(BindingResult result){
+
+        if(result.hasErrors()){
+            Map<String, String> errorMap = new HashMap<>();
+
+            for(FieldError error: result.getFieldErrors()){
+                errorMap.put(error.getField(), error.getDefaultMessage());
+            }
+            return new ResponseEntity<Map<String, String>>(errorMap, HttpStatus.BAD_REQUEST);
+        }
+
+        return null;
+
+    }
+}
Index: trip-planner/src/main/java/finki/diplomska/tripplanner/service/impl/UserServiceImpl.java
===================================================================
--- trip-planner/src/main/java/finki/diplomska/tripplanner/service/impl/UserServiceImpl.java	(revision 1ad8e64a349fcc7c996155279b16efc2cfe001dd)
+++ trip-planner/src/main/java/finki/diplomska/tripplanner/service/impl/UserServiceImpl.java	(revision 1ad8e64a349fcc7c996155279b16efc2cfe001dd)
@@ -0,0 +1,37 @@
+package finki.diplomska.tripplanner.service.impl;
+
+import finki.diplomska.tripplanner.models.User;
+import finki.diplomska.tripplanner.models.dto.UserDto;
+import finki.diplomska.tripplanner.models.exceptions.UsernameAlreadyExistsException;
+import finki.diplomska.tripplanner.repository.jpa.JpaUserRepository;
+import finki.diplomska.tripplanner.service.UserService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
+import org.springframework.stereotype.Service;
+
+
+@Service
+public class UserServiceImpl  implements UserService {
+
+    @Autowired
+    private JpaUserRepository userRepository;
+
+    @Autowired
+    private BCryptPasswordEncoder bCryptPasswordEncoder;
+
+    public User saveUser (User newUser){
+        try{
+            newUser.setPassword(bCryptPasswordEncoder.encode(newUser.getPassword()));
+            //Username has to be unique (exception)
+            newUser.setUsername(newUser.getUsername());
+            // Make sure that password and confirmPassword match
+            // We don't persist or show the confirmPassword
+            newUser.setConfirmPassword("");
+            return this.userRepository.save(newUser);
+        }catch(Exception e){
+            throw new UsernameAlreadyExistsException("Username '"+newUser.getUsername()+ "' already exists");
+        }
+
+    }
+
+}
Index: trip-planner/src/main/java/finki/diplomska/tripplanner/validator/UserValidator.java
===================================================================
--- trip-planner/src/main/java/finki/diplomska/tripplanner/validator/UserValidator.java	(revision 1ad8e64a349fcc7c996155279b16efc2cfe001dd)
+++ trip-planner/src/main/java/finki/diplomska/tripplanner/validator/UserValidator.java	(revision 1ad8e64a349fcc7c996155279b16efc2cfe001dd)
@@ -0,0 +1,26 @@
+package finki.diplomska.tripplanner.validator;
+
+import finki.diplomska.tripplanner.models.User;
+import org.springframework.stereotype.Component;
+import org.springframework.validation.Errors;
+import org.springframework.validation.Validator;
+
+
+@Component
+public class UserValidator implements Validator {
+    @Override
+    public boolean supports(Class<?> aClass) {
+        return User.class.equals(aClass);
+    }
+
+    @Override
+    public void validate(Object object, Errors errors) {
+        User user = (User) object;
+        if(user.getPassword().length() < 6){
+            errors.rejectValue("password","Length", "Password must be at least 6 characters" );
+        }
+        if(!user.getPassword().equals(user.getConfirmPassword())){
+           errors.rejectValue("confirmPassword", "Match", "Password must match");
+        }
+    }
+}
Index: trip-planner/src/main/java/finki/diplomska/tripplanner/web/rest/UserController.java
===================================================================
--- trip-planner/src/main/java/finki/diplomska/tripplanner/web/rest/UserController.java	(revision 1ad8e64a349fcc7c996155279b16efc2cfe001dd)
+++ trip-planner/src/main/java/finki/diplomska/tripplanner/web/rest/UserController.java	(revision 1ad8e64a349fcc7c996155279b16efc2cfe001dd)
@@ -0,0 +1,41 @@
+package finki.diplomska.tripplanner.web.rest;
+
+import finki.diplomska.tripplanner.models.User;
+import finki.diplomska.tripplanner.models.dto.UserDto;
+import finki.diplomska.tripplanner.service.UserService;
+import finki.diplomska.tripplanner.service.impl.MapValidationErrorService;
+import finki.diplomska.tripplanner.validator.UserValidator;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.http.HttpStatus;
+import org.springframework.http.ResponseEntity;
+import org.springframework.validation.BindingResult;
+import org.springframework.web.bind.annotation.*;
+
+import javax.validation.Valid;
+
+@RestController
+@CrossOrigin(origins = "http://localhost:4200")
+@RequestMapping(value = "/api/users")
+public class UserController {
+
+    @Autowired
+    private MapValidationErrorService mapValidationErrorService;
+
+    @Autowired
+    private UserService userService;
+
+    @Autowired
+    private UserValidator userValidator;
+
+    @PostMapping("/register")
+    public ResponseEntity<?> registerUser(@Valid @RequestBody User user, BindingResult result){
+        // Validate passwords match
+        userValidator.validate(user, result);
+        ResponseEntity<?> errorMap = mapValidationErrorService.MapValidationService(result);
+        if(errorMap != null)return errorMap;
+
+        User newUser = userService.saveUser(user);
+
+        return  new ResponseEntity<User>(newUser, HttpStatus.CREATED);
+    }
+}
