Index: resTools_backend/backend/Controllers/UsersController.cs
===================================================================
--- resTools_backend/backend/Controllers/UsersController.cs	(revision 899b19da4d7326788e23e45dd1881ec1395e1d88)
+++ resTools_backend/backend/Controllers/UsersController.cs	(revision a26f6a1dc0314af7fc65fdabb78f1acbaca506a0)
@@ -41,5 +41,43 @@
         }catch (Exception ex){ return null; }
         User user = await _userService.GetById(userId);
-        return new AuthenticateResponse() { Email=user.Email, Id = user.Id};
+        return new AuthenticateResponse() { Email=user.Email, Id = user.Id, IsAdmin = user.IsAdmin, IsConfirmed = user.IsConfirmed};
+    }
+
+    [HttpPost("confirm")]
+    public async Task ConfirmEmail()
+    {
+        int userId = 0;
+        try
+        {
+            userId = (int)this.HttpContext.Items["User"];
+        }
+        catch (Exception ex) { return; }
+        User user = await _userService.GetById(userId);
+        await _userService.SendEmailConfirmation(user.Email);
+    }
+
+    [HttpPost("reset")]
+    public async Task ResetPassword(string email)
+    {
+        await _userService.SendPasswordReset(email);
+    }
+
+    [HttpPost("confirmed")]
+    public async Task ConfirmedEmail(string validityString)
+    {
+        int userId = 0;
+        try
+        {
+            userId = (int)this.HttpContext.Items["User"];
+        }
+        catch (Exception ex) { return; }
+        User user = await _userService.GetById(userId);
+        await _userService.ConfirmEmail(user, validityString);
+    }
+
+    [HttpPost("reseted")]
+    public async Task ResetedPassword(string validityString, string newPassword)
+    {
+        await _userService.ResetPassword(validityString, newPassword);
     }
 
Index: resTools_backend/backend/DTOs/AuthenticateResponse.cs
===================================================================
--- resTools_backend/backend/DTOs/AuthenticateResponse.cs	(revision 899b19da4d7326788e23e45dd1881ec1395e1d88)
+++ resTools_backend/backend/DTOs/AuthenticateResponse.cs	(revision a26f6a1dc0314af7fc65fdabb78f1acbaca506a0)
@@ -15,3 +15,5 @@
     [JsonProperty]
     public bool IsAdmin { get; set; }
+    [JsonProperty]
+    public bool IsConfirmed { get; set; }
 }
Index: resTools_backend/backend/Email/EmailSender.cs
===================================================================
--- resTools_backend/backend/Email/EmailSender.cs	(revision a26f6a1dc0314af7fc65fdabb78f1acbaca506a0)
+++ resTools_backend/backend/Email/EmailSender.cs	(revision a26f6a1dc0314af7fc65fdabb78f1acbaca506a0)
@@ -0,0 +1,25 @@
+﻿using SendGrid;
+using SendGrid.Helpers.Mail;
+
+namespace backend.Email;
+public interface IEmailSender
+{
+    Task SendEmailAsync(string subject, string body, string toEmail);
+}
+public class EmailSender : IEmailSender
+{
+    public async Task SendEmailAsync(string subject, string message, string toEmail)
+    {
+        var client = new SendGridClient("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");
+        var msg = new SendGridMessage()
+        {
+            From = new EmailAddress("danilo.najkov@students.finki.ukim.mk", "Danilo"),
+            Subject = subject,
+            PlainTextContent = message,
+            HtmlContent = message
+        };
+        msg.AddTo(new EmailAddress(toEmail));
+        msg.SetClickTracking(false, false);
+        var response = await client.SendEmailAsync(msg);
+    }
+}
Index: resTools_backend/backend/Entities/User.cs
===================================================================
--- resTools_backend/backend/Entities/User.cs	(revision 899b19da4d7326788e23e45dd1881ec1395e1d88)
+++ resTools_backend/backend/Entities/User.cs	(revision a26f6a1dc0314af7fc65fdabb78f1acbaca506a0)
@@ -9,4 +9,9 @@
     public string Password { get; set; }
     public bool IsAdmin { get; set; }
+    public bool IsConfirmed { get; set; }
+    public string? ConfirmationURL { get; set; }
+    public DateTime? ConfirmationValidTo { get; set; }
+    public string? PasswordResetURL { get; set; }
+    public DateTime? PasswordResetValidTo { get; set; }
     public virtual Restaurant Restaurant { get; set; }
 }
Index: resTools_backend/backend/Migrations/20220808143343_Auth-changes.Designer.cs
===================================================================
--- resTools_backend/backend/Migrations/20220808143343_Auth-changes.Designer.cs	(revision a26f6a1dc0314af7fc65fdabb78f1acbaca506a0)
+++ resTools_backend/backend/Migrations/20220808143343_Auth-changes.Designer.cs	(revision a26f6a1dc0314af7fc65fdabb78f1acbaca506a0)
@@ -0,0 +1,280 @@
+﻿// <auto-generated />
+using System;
+using Microsoft.EntityFrameworkCore;
+using Microsoft.EntityFrameworkCore.Infrastructure;
+using Microsoft.EntityFrameworkCore.Migrations;
+using Microsoft.EntityFrameworkCore.Storage.ValueConversion;
+using Npgsql.EntityFrameworkCore.PostgreSQL.Metadata;
+using backend.Data;
+
+#nullable disable
+
+namespace backend.Migrations
+{
+    [DbContext(typeof(DataContext))]
+    [Migration("20220808143343_Auth-changes")]
+    partial class Authchanges
+    {
+        protected override void BuildTargetModel(ModelBuilder modelBuilder)
+        {
+#pragma warning disable 612, 618
+            modelBuilder
+                .HasAnnotation("ProductVersion", "6.0.3")
+                .HasAnnotation("Relational:MaxIdentifierLength", 63);
+
+            NpgsqlModelBuilderExtensions.UseIdentityByDefaultColumns(modelBuilder);
+
+            modelBuilder.Entity("backend.Entities.MenuItem", b =>
+                {
+                    b.Property<int>("Id")
+                        .ValueGeneratedOnAdd()
+                        .HasColumnType("integer");
+
+                    NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property<int>("Id"));
+
+                    b.Property<string>("Description")
+                        .IsRequired()
+                        .HasColumnType("text");
+
+                    b.Property<int>("Price")
+                        .HasColumnType("integer");
+
+                    b.Property<int>("RestaurantId")
+                        .HasColumnType("integer");
+
+                    b.Property<string>("Title")
+                        .IsRequired()
+                        .HasColumnType("text");
+
+                    b.HasKey("Id");
+
+                    b.HasIndex("RestaurantId");
+
+                    b.ToTable("MenuItems");
+                });
+
+            modelBuilder.Entity("backend.Entities.Reservation", b =>
+                {
+                    b.Property<int>("Id")
+                        .ValueGeneratedOnAdd()
+                        .HasColumnType("integer");
+
+                    NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property<int>("Id"));
+
+                    b.Property<string>("ContactName")
+                        .IsRequired()
+                        .HasColumnType("text");
+
+                    b.Property<string>("ContactNumber")
+                        .IsRequired()
+                        .HasColumnType("text");
+
+                    b.Property<int>("Persons")
+                        .HasColumnType("integer");
+
+                    b.Property<int>("ReservationPlace")
+                        .HasColumnType("integer");
+
+                    b.Property<int>("ReservationStatus")
+                        .HasColumnType("integer");
+
+                    b.Property<int>("ReservationType")
+                        .HasColumnType("integer");
+
+                    b.Property<int>("RestaurantId")
+                        .HasColumnType("integer");
+
+                    b.Property<DateTime>("StartDate")
+                        .HasColumnType("timestamp with time zone");
+
+                    b.Property<int>("Table")
+                        .HasColumnType("integer");
+
+                    b.HasKey("Id");
+
+                    b.HasIndex("RestaurantId");
+
+                    b.ToTable("Reservations");
+                });
+
+            modelBuilder.Entity("backend.Entities.Restaurant", b =>
+                {
+                    b.Property<int>("Id")
+                        .ValueGeneratedOnAdd()
+                        .HasColumnType("integer");
+
+                    NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property<int>("Id"));
+
+                    b.Property<string>("Address")
+                        .IsRequired()
+                        .HasColumnType("text");
+
+                    b.Property<byte[]>("Image")
+                        .IsRequired()
+                        .HasColumnType("bytea");
+
+                    b.Property<string>("Name")
+                        .IsRequired()
+                        .HasColumnType("text");
+
+                    b.Property<int?>("OwnerFk")
+                        .HasColumnType("integer");
+
+                    b.Property<string>("Phone")
+                        .IsRequired()
+                        .HasColumnType("text");
+
+                    b.HasKey("Id");
+
+                    b.HasIndex("OwnerFk")
+                        .IsUnique();
+
+                    b.ToTable("Restoraunts");
+                });
+
+            modelBuilder.Entity("backend.Entities.Review", b =>
+                {
+                    b.Property<int>("Id")
+                        .ValueGeneratedOnAdd()
+                        .HasColumnType("integer");
+
+                    NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property<int>("Id"));
+
+                    b.Property<DateTime>("CreatedAt")
+                        .HasColumnType("timestamp with time zone");
+
+                    b.Property<string>("Description")
+                        .IsRequired()
+                        .HasColumnType("text");
+
+                    b.Property<int>("RestaurantId")
+                        .HasColumnType("integer");
+
+                    b.Property<int>("Stars")
+                        .HasColumnType("integer");
+
+                    b.Property<string>("Title")
+                        .IsRequired()
+                        .HasColumnType("text");
+
+                    b.Property<int>("UserId")
+                        .HasColumnType("integer");
+
+                    b.HasKey("Id");
+
+                    b.HasIndex("RestaurantId");
+
+                    b.HasIndex("UserId");
+
+                    b.ToTable("Reviews");
+                });
+
+            modelBuilder.Entity("backend.Entities.User", b =>
+                {
+                    b.Property<int>("Id")
+                        .ValueGeneratedOnAdd()
+                        .HasColumnType("integer");
+
+                    NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property<int>("Id"));
+
+                    b.Property<string>("ConfirmationURL")
+                        .IsRequired()
+                        .HasColumnType("text");
+
+                    b.Property<DateTime>("ConfirmationValidTo")
+                        .HasColumnType("timestamp with time zone");
+
+                    b.Property<string>("Email")
+                        .IsRequired()
+                        .HasColumnType("text");
+
+                    b.Property<bool>("IsAdmin")
+                        .HasColumnType("boolean");
+
+                    b.Property<bool>("IsConfirmed")
+                        .HasColumnType("boolean");
+
+                    b.Property<string>("Password")
+                        .IsRequired()
+                        .HasColumnType("text");
+
+                    b.Property<string>("PasswordResetURL")
+                        .IsRequired()
+                        .HasColumnType("text");
+
+                    b.Property<DateTime>("PasswordResetValidTo")
+                        .HasColumnType("timestamp with time zone");
+
+                    b.HasKey("Id");
+
+                    b.ToTable("Users");
+                });
+
+            modelBuilder.Entity("backend.Entities.MenuItem", b =>
+                {
+                    b.HasOne("backend.Entities.Restaurant", "Restaurant")
+                        .WithMany("Menu")
+                        .HasForeignKey("RestaurantId")
+                        .OnDelete(DeleteBehavior.Cascade)
+                        .IsRequired();
+
+                    b.Navigation("Restaurant");
+                });
+
+            modelBuilder.Entity("backend.Entities.Reservation", b =>
+                {
+                    b.HasOne("backend.Entities.Restaurant", "Restaurant")
+                        .WithMany("Reservations")
+                        .HasForeignKey("RestaurantId")
+                        .OnDelete(DeleteBehavior.Cascade)
+                        .IsRequired();
+
+                    b.Navigation("Restaurant");
+                });
+
+            modelBuilder.Entity("backend.Entities.Restaurant", b =>
+                {
+                    b.HasOne("backend.Entities.User", "Owner")
+                        .WithOne("Restaurant")
+                        .HasForeignKey("backend.Entities.Restaurant", "OwnerFk");
+
+                    b.Navigation("Owner");
+                });
+
+            modelBuilder.Entity("backend.Entities.Review", b =>
+                {
+                    b.HasOne("backend.Entities.Restaurant", "Restaurant")
+                        .WithMany("Reviews")
+                        .HasForeignKey("RestaurantId")
+                        .OnDelete(DeleteBehavior.Cascade)
+                        .IsRequired();
+
+                    b.HasOne("backend.Entities.User", "User")
+                        .WithMany()
+                        .HasForeignKey("UserId")
+                        .OnDelete(DeleteBehavior.Cascade)
+                        .IsRequired();
+
+                    b.Navigation("Restaurant");
+
+                    b.Navigation("User");
+                });
+
+            modelBuilder.Entity("backend.Entities.Restaurant", b =>
+                {
+                    b.Navigation("Menu");
+
+                    b.Navigation("Reservations");
+
+                    b.Navigation("Reviews");
+                });
+
+            modelBuilder.Entity("backend.Entities.User", b =>
+                {
+                    b.Navigation("Restaurant")
+                        .IsRequired();
+                });
+#pragma warning restore 612, 618
+        }
+    }
+}
Index: resTools_backend/backend/Migrations/20220808143343_Auth-changes.cs
===================================================================
--- resTools_backend/backend/Migrations/20220808143343_Auth-changes.cs	(revision a26f6a1dc0314af7fc65fdabb78f1acbaca506a0)
+++ resTools_backend/backend/Migrations/20220808143343_Auth-changes.cs	(revision a26f6a1dc0314af7fc65fdabb78f1acbaca506a0)
@@ -0,0 +1,71 @@
+﻿using System;
+using Microsoft.EntityFrameworkCore.Migrations;
+
+#nullable disable
+
+namespace backend.Migrations
+{
+    public partial class Authchanges : Migration
+    {
+        protected override void Up(MigrationBuilder migrationBuilder)
+        {
+            migrationBuilder.AddColumn<string>(
+                name: "ConfirmationURL",
+                table: "Users",
+                type: "text",
+                nullable: false,
+                defaultValue: "");
+
+            migrationBuilder.AddColumn<DateTime>(
+                name: "ConfirmationValidTo",
+                table: "Users",
+                type: "timestamp with time zone",
+                nullable: false,
+                defaultValue: new DateTime(1, 1, 1, 0, 0, 0, 0, DateTimeKind.Unspecified));
+
+            migrationBuilder.AddColumn<bool>(
+                name: "IsConfirmed",
+                table: "Users",
+                type: "boolean",
+                nullable: false,
+                defaultValue: false);
+
+            migrationBuilder.AddColumn<string>(
+                name: "PasswordResetURL",
+                table: "Users",
+                type: "text",
+                nullable: false,
+                defaultValue: "");
+
+            migrationBuilder.AddColumn<DateTime>(
+                name: "PasswordResetValidTo",
+                table: "Users",
+                type: "timestamp with time zone",
+                nullable: false,
+                defaultValue: new DateTime(1, 1, 1, 0, 0, 0, 0, DateTimeKind.Unspecified));
+        }
+
+        protected override void Down(MigrationBuilder migrationBuilder)
+        {
+            migrationBuilder.DropColumn(
+                name: "ConfirmationURL",
+                table: "Users");
+
+            migrationBuilder.DropColumn(
+                name: "ConfirmationValidTo",
+                table: "Users");
+
+            migrationBuilder.DropColumn(
+                name: "IsConfirmed",
+                table: "Users");
+
+            migrationBuilder.DropColumn(
+                name: "PasswordResetURL",
+                table: "Users");
+
+            migrationBuilder.DropColumn(
+                name: "PasswordResetValidTo",
+                table: "Users");
+        }
+    }
+}
Index: resTools_backend/backend/Migrations/20220808143757_Auth-changes-nullable.Designer.cs
===================================================================
--- resTools_backend/backend/Migrations/20220808143757_Auth-changes-nullable.Designer.cs	(revision a26f6a1dc0314af7fc65fdabb78f1acbaca506a0)
+++ resTools_backend/backend/Migrations/20220808143757_Auth-changes-nullable.Designer.cs	(revision a26f6a1dc0314af7fc65fdabb78f1acbaca506a0)
@@ -0,0 +1,278 @@
+﻿// <auto-generated />
+using System;
+using Microsoft.EntityFrameworkCore;
+using Microsoft.EntityFrameworkCore.Infrastructure;
+using Microsoft.EntityFrameworkCore.Migrations;
+using Microsoft.EntityFrameworkCore.Storage.ValueConversion;
+using Npgsql.EntityFrameworkCore.PostgreSQL.Metadata;
+using backend.Data;
+
+#nullable disable
+
+namespace backend.Migrations
+{
+    [DbContext(typeof(DataContext))]
+    [Migration("20220808143757_Auth-changes-nullable")]
+    partial class Authchangesnullable
+    {
+        protected override void BuildTargetModel(ModelBuilder modelBuilder)
+        {
+#pragma warning disable 612, 618
+            modelBuilder
+                .HasAnnotation("ProductVersion", "6.0.3")
+                .HasAnnotation("Relational:MaxIdentifierLength", 63);
+
+            NpgsqlModelBuilderExtensions.UseIdentityByDefaultColumns(modelBuilder);
+
+            modelBuilder.Entity("backend.Entities.MenuItem", b =>
+                {
+                    b.Property<int>("Id")
+                        .ValueGeneratedOnAdd()
+                        .HasColumnType("integer");
+
+                    NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property<int>("Id"));
+
+                    b.Property<string>("Description")
+                        .IsRequired()
+                        .HasColumnType("text");
+
+                    b.Property<int>("Price")
+                        .HasColumnType("integer");
+
+                    b.Property<int>("RestaurantId")
+                        .HasColumnType("integer");
+
+                    b.Property<string>("Title")
+                        .IsRequired()
+                        .HasColumnType("text");
+
+                    b.HasKey("Id");
+
+                    b.HasIndex("RestaurantId");
+
+                    b.ToTable("MenuItems");
+                });
+
+            modelBuilder.Entity("backend.Entities.Reservation", b =>
+                {
+                    b.Property<int>("Id")
+                        .ValueGeneratedOnAdd()
+                        .HasColumnType("integer");
+
+                    NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property<int>("Id"));
+
+                    b.Property<string>("ContactName")
+                        .IsRequired()
+                        .HasColumnType("text");
+
+                    b.Property<string>("ContactNumber")
+                        .IsRequired()
+                        .HasColumnType("text");
+
+                    b.Property<int>("Persons")
+                        .HasColumnType("integer");
+
+                    b.Property<int>("ReservationPlace")
+                        .HasColumnType("integer");
+
+                    b.Property<int>("ReservationStatus")
+                        .HasColumnType("integer");
+
+                    b.Property<int>("ReservationType")
+                        .HasColumnType("integer");
+
+                    b.Property<int>("RestaurantId")
+                        .HasColumnType("integer");
+
+                    b.Property<DateTime>("StartDate")
+                        .HasColumnType("timestamp with time zone");
+
+                    b.Property<int>("Table")
+                        .HasColumnType("integer");
+
+                    b.HasKey("Id");
+
+                    b.HasIndex("RestaurantId");
+
+                    b.ToTable("Reservations");
+                });
+
+            modelBuilder.Entity("backend.Entities.Restaurant", b =>
+                {
+                    b.Property<int>("Id")
+                        .ValueGeneratedOnAdd()
+                        .HasColumnType("integer");
+
+                    NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property<int>("Id"));
+
+                    b.Property<string>("Address")
+                        .IsRequired()
+                        .HasColumnType("text");
+
+                    b.Property<byte[]>("Image")
+                        .IsRequired()
+                        .HasColumnType("bytea");
+
+                    b.Property<string>("Name")
+                        .IsRequired()
+                        .HasColumnType("text");
+
+                    b.Property<int?>("OwnerFk")
+                        .HasColumnType("integer");
+
+                    b.Property<string>("Phone")
+                        .IsRequired()
+                        .HasColumnType("text");
+
+                    b.HasKey("Id");
+
+                    b.HasIndex("OwnerFk")
+                        .IsUnique();
+
+                    b.ToTable("Restoraunts");
+                });
+
+            modelBuilder.Entity("backend.Entities.Review", b =>
+                {
+                    b.Property<int>("Id")
+                        .ValueGeneratedOnAdd()
+                        .HasColumnType("integer");
+
+                    NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property<int>("Id"));
+
+                    b.Property<DateTime>("CreatedAt")
+                        .HasColumnType("timestamp with time zone");
+
+                    b.Property<string>("Description")
+                        .IsRequired()
+                        .HasColumnType("text");
+
+                    b.Property<int>("RestaurantId")
+                        .HasColumnType("integer");
+
+                    b.Property<int>("Stars")
+                        .HasColumnType("integer");
+
+                    b.Property<string>("Title")
+                        .IsRequired()
+                        .HasColumnType("text");
+
+                    b.Property<int>("UserId")
+                        .HasColumnType("integer");
+
+                    b.HasKey("Id");
+
+                    b.HasIndex("RestaurantId");
+
+                    b.HasIndex("UserId");
+
+                    b.ToTable("Reviews");
+                });
+
+            modelBuilder.Entity("backend.Entities.User", b =>
+                {
+                    b.Property<int>("Id")
+                        .ValueGeneratedOnAdd()
+                        .HasColumnType("integer");
+
+                    NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property<int>("Id"));
+
+                    b.Property<string>("ConfirmationURL")
+                        .HasColumnType("text");
+
+                    b.Property<DateTime?>("ConfirmationValidTo")
+                        .HasColumnType("timestamp with time zone");
+
+                    b.Property<string>("Email")
+                        .IsRequired()
+                        .HasColumnType("text");
+
+                    b.Property<bool>("IsAdmin")
+                        .HasColumnType("boolean");
+
+                    b.Property<bool>("IsConfirmed")
+                        .HasColumnType("boolean");
+
+                    b.Property<string>("Password")
+                        .IsRequired()
+                        .HasColumnType("text");
+
+                    b.Property<string>("PasswordResetURL")
+                        .HasColumnType("text");
+
+                    b.Property<DateTime?>("PasswordResetValidTo")
+                        .HasColumnType("timestamp with time zone");
+
+                    b.HasKey("Id");
+
+                    b.ToTable("Users");
+                });
+
+            modelBuilder.Entity("backend.Entities.MenuItem", b =>
+                {
+                    b.HasOne("backend.Entities.Restaurant", "Restaurant")
+                        .WithMany("Menu")
+                        .HasForeignKey("RestaurantId")
+                        .OnDelete(DeleteBehavior.Cascade)
+                        .IsRequired();
+
+                    b.Navigation("Restaurant");
+                });
+
+            modelBuilder.Entity("backend.Entities.Reservation", b =>
+                {
+                    b.HasOne("backend.Entities.Restaurant", "Restaurant")
+                        .WithMany("Reservations")
+                        .HasForeignKey("RestaurantId")
+                        .OnDelete(DeleteBehavior.Cascade)
+                        .IsRequired();
+
+                    b.Navigation("Restaurant");
+                });
+
+            modelBuilder.Entity("backend.Entities.Restaurant", b =>
+                {
+                    b.HasOne("backend.Entities.User", "Owner")
+                        .WithOne("Restaurant")
+                        .HasForeignKey("backend.Entities.Restaurant", "OwnerFk");
+
+                    b.Navigation("Owner");
+                });
+
+            modelBuilder.Entity("backend.Entities.Review", b =>
+                {
+                    b.HasOne("backend.Entities.Restaurant", "Restaurant")
+                        .WithMany("Reviews")
+                        .HasForeignKey("RestaurantId")
+                        .OnDelete(DeleteBehavior.Cascade)
+                        .IsRequired();
+
+                    b.HasOne("backend.Entities.User", "User")
+                        .WithMany()
+                        .HasForeignKey("UserId")
+                        .OnDelete(DeleteBehavior.Cascade)
+                        .IsRequired();
+
+                    b.Navigation("Restaurant");
+
+                    b.Navigation("User");
+                });
+
+            modelBuilder.Entity("backend.Entities.Restaurant", b =>
+                {
+                    b.Navigation("Menu");
+
+                    b.Navigation("Reservations");
+
+                    b.Navigation("Reviews");
+                });
+
+            modelBuilder.Entity("backend.Entities.User", b =>
+                {
+                    b.Navigation("Restaurant")
+                        .IsRequired();
+                });
+#pragma warning restore 612, 618
+        }
+    }
+}
Index: resTools_backend/backend/Migrations/20220808143757_Auth-changes-nullable.cs
===================================================================
--- resTools_backend/backend/Migrations/20220808143757_Auth-changes-nullable.cs	(revision a26f6a1dc0314af7fc65fdabb78f1acbaca506a0)
+++ resTools_backend/backend/Migrations/20220808143757_Auth-changes-nullable.cs	(revision a26f6a1dc0314af7fc65fdabb78f1acbaca506a0)
@@ -0,0 +1,88 @@
+﻿using System;
+using Microsoft.EntityFrameworkCore.Migrations;
+
+#nullable disable
+
+namespace backend.Migrations
+{
+    public partial class Authchangesnullable : Migration
+    {
+        protected override void Up(MigrationBuilder migrationBuilder)
+        {
+            migrationBuilder.AlterColumn<DateTime>(
+                name: "PasswordResetValidTo",
+                table: "Users",
+                type: "timestamp with time zone",
+                nullable: true,
+                oldClrType: typeof(DateTime),
+                oldType: "timestamp with time zone");
+
+            migrationBuilder.AlterColumn<string>(
+                name: "PasswordResetURL",
+                table: "Users",
+                type: "text",
+                nullable: true,
+                oldClrType: typeof(string),
+                oldType: "text");
+
+            migrationBuilder.AlterColumn<DateTime>(
+                name: "ConfirmationValidTo",
+                table: "Users",
+                type: "timestamp with time zone",
+                nullable: true,
+                oldClrType: typeof(DateTime),
+                oldType: "timestamp with time zone");
+
+            migrationBuilder.AlterColumn<string>(
+                name: "ConfirmationURL",
+                table: "Users",
+                type: "text",
+                nullable: true,
+                oldClrType: typeof(string),
+                oldType: "text");
+        }
+
+        protected override void Down(MigrationBuilder migrationBuilder)
+        {
+            migrationBuilder.AlterColumn<DateTime>(
+                name: "PasswordResetValidTo",
+                table: "Users",
+                type: "timestamp with time zone",
+                nullable: false,
+                defaultValue: new DateTime(1, 1, 1, 0, 0, 0, 0, DateTimeKind.Unspecified),
+                oldClrType: typeof(DateTime),
+                oldType: "timestamp with time zone",
+                oldNullable: true);
+
+            migrationBuilder.AlterColumn<string>(
+                name: "PasswordResetURL",
+                table: "Users",
+                type: "text",
+                nullable: false,
+                defaultValue: "",
+                oldClrType: typeof(string),
+                oldType: "text",
+                oldNullable: true);
+
+            migrationBuilder.AlterColumn<DateTime>(
+                name: "ConfirmationValidTo",
+                table: "Users",
+                type: "timestamp with time zone",
+                nullable: false,
+                defaultValue: new DateTime(1, 1, 1, 0, 0, 0, 0, DateTimeKind.Unspecified),
+                oldClrType: typeof(DateTime),
+                oldType: "timestamp with time zone",
+                oldNullable: true);
+
+            migrationBuilder.AlterColumn<string>(
+                name: "ConfirmationURL",
+                table: "Users",
+                type: "text",
+                nullable: false,
+                defaultValue: "",
+                oldClrType: typeof(string),
+                oldType: "text",
+                oldNullable: true);
+        }
+    }
+}
Index: resTools_backend/backend/Migrations/DataContextModelSnapshot.cs
===================================================================
--- resTools_backend/backend/Migrations/DataContextModelSnapshot.cs	(revision 899b19da4d7326788e23e45dd1881ec1395e1d88)
+++ resTools_backend/backend/Migrations/DataContextModelSnapshot.cs	(revision a26f6a1dc0314af7fc65fdabb78f1acbaca506a0)
@@ -176,4 +176,10 @@
                     NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property<int>("Id"));
 
+                    b.Property<string>("ConfirmationURL")
+                        .HasColumnType("text");
+
+                    b.Property<DateTime?>("ConfirmationValidTo")
+                        .HasColumnType("timestamp with time zone");
+
                     b.Property<string>("Email")
                         .IsRequired()
@@ -183,7 +189,16 @@
                         .HasColumnType("boolean");
 
+                    b.Property<bool>("IsConfirmed")
+                        .HasColumnType("boolean");
+
                     b.Property<string>("Password")
                         .IsRequired()
                         .HasColumnType("text");
+
+                    b.Property<string>("PasswordResetURL")
+                        .HasColumnType("text");
+
+                    b.Property<DateTime?>("PasswordResetValidTo")
+                        .HasColumnType("timestamp with time zone");
 
                     b.HasKey("Id");
Index: resTools_backend/backend/Program.cs
===================================================================
--- resTools_backend/backend/Program.cs	(revision 899b19da4d7326788e23e45dd1881ec1395e1d88)
+++ resTools_backend/backend/Program.cs	(revision a26f6a1dc0314af7fc65fdabb78f1acbaca506a0)
@@ -1,3 +1,4 @@
 using backend.Data;
+using backend.Email;
 using backend.Helpers;
 using backend.Services;
@@ -50,4 +51,6 @@
 builder.Services.AddScoped<ISmsService, SmsService>();
 
+builder.Services.AddTransient<IEmailSender, EmailSender>();
+
 builder.Services.AddDbContext<DataContext>(p => p.UseNpgsql(builder.Configuration.GetConnectionString("DefaultConnection")));
 
Index: resTools_backend/backend/Services/UserService.cs
===================================================================
--- resTools_backend/backend/Services/UserService.cs	(revision 899b19da4d7326788e23e45dd1881ec1395e1d88)
+++ resTools_backend/backend/Services/UserService.cs	(revision a26f6a1dc0314af7fc65fdabb78f1acbaca506a0)
@@ -1,6 +1,7 @@
-namespace backend.Services;
+﻿namespace backend.Services;
 
 using backend.Data;
 using backend.DTOs;
+using backend.Email;
 using backend.Entities;
 using backend.Helpers;
@@ -11,4 +12,6 @@
 using System.IdentityModel.Tokens.Jwt;
 using System.Security.Claims;
+using System.Security.Cryptography;
+using System.Text;
 
 public interface IUserService
@@ -17,4 +20,8 @@
     Task<AuthenticateResponse> Register(CreateUserRequest req, bool isFirst);
     Task<User> GetById(int id);
+    Task SendEmailConfirmation(string email);
+    Task SendPasswordReset(string email);
+    Task ConfirmEmail(User user, string checkValid);
+    Task ResetPassword(string checkValid, string password);
 }
 
@@ -23,9 +30,11 @@
     private readonly AppSettings _appSettings;
     private readonly DataContext _context = null;
+    private readonly IEmailSender _emailSender;
 
-    public UserService(IOptions<AppSettings> appSettings, DataContext context)
+    public UserService(IOptions<AppSettings> appSettings, DataContext context, IEmailSender emailSender)
     {
         _appSettings = appSettings.Value;
         _context = context;
+        _emailSender = emailSender;
     }
 
@@ -40,5 +49,21 @@
         var token = generateJwtToken(user);
 
-        return new AuthenticateResponse { Email = user.Email, Id = user.Id, Token = token, IsAdmin = user.IsAdmin};
+        return new AuthenticateResponse { Email = user.Email, Id = user.Id, Token = token, IsAdmin = user.IsAdmin, IsConfirmed = user.IsConfirmed};
+    }
+
+    public async Task ConfirmEmail(User user, string checkValid)
+    {
+        if(user.ConfirmationURL != checkValid)
+        {
+            throw new Exception("Invalid check");
+        }
+        if(user.ConfirmationValidTo < DateTime.UtcNow)
+        {
+            throw new Exception("Link expired");
+        }
+
+        user.IsConfirmed = true;
+        _context.Users.Update(user);
+        await _context.SaveChangesAsync();
     }
 
@@ -50,9 +75,52 @@
     public async Task<AuthenticateResponse> Register(CreateUserRequest req, bool isFirst)
     {
-        User user = new User() { Email = req.Email, Password = req.Password, IsAdmin = isFirst };
+        User user = new User() { Email = req.Email, Password = req.Password, IsAdmin = isFirst, IsConfirmed = false };
         await _context.Users.AddAsync(user);
         await _context.SaveChangesAsync();
         var token = generateJwtToken(user);
-        return new AuthenticateResponse { Email = user.Email, Id = user.Id, Token = token, IsAdmin = user.IsAdmin };
+        return new AuthenticateResponse { Email = user.Email, Id = user.Id, Token = token, IsAdmin = user.IsAdmin, IsConfirmed = false };
+    }
+
+    public async Task ResetPassword(string checkValid, string password)
+    {
+        var user = await _context.Users.Where(x => x.PasswordResetURL == checkValid).FirstOrDefaultAsync();
+        if (user == null)
+        {
+            throw new Exception("Invalid check");
+        }
+        if (user.PasswordResetValidTo < DateTime.UtcNow)
+        {
+            throw new Exception("Link expired");
+        }
+
+        user.Password = password;
+        _context.Users.Update(user);
+        await _context.SaveChangesAsync();
+    }
+
+    public async Task SendEmailConfirmation(string email)
+    {
+        User user = await _context.Users.FirstOrDefaultAsync(x => x.Email == email);
+        user.ConfirmationURL = Guid.NewGuid().ToString();
+        user.ConfirmationValidTo = DateTime.UtcNow.AddHours(24);
+        _context.Users.Update(user);
+        await _context.SaveChangesAsync();
+        await _emailSender.SendEmailAsync(
+            "Потврдете го вашиот емаил",
+            "Ве молиме кликнете на следниот линк за да го потврдите вашиот емаил: http://localhost:3000/confirm?id=" + user.ConfirmationURL,
+            email);
+    }
+
+    public async Task SendPasswordReset(string email)
+    {
+        User user = await _context.Users.FirstOrDefaultAsync(x => x.Email == email);
+        user.PasswordResetURL = Guid.NewGuid().ToString();
+        user.PasswordResetValidTo = DateTime.UtcNow.AddHours(24);
+        _context.Users.Update(user);
+        await _context.SaveChangesAsync();
+        await _emailSender.SendEmailAsync(
+           "Ресетирајте ја лозинката",
+           "Ве молиме кликнете на следниот линк за да ја ресетирате лозинката: http://localhost:3000/reset?id=" + user.PasswordResetURL,
+           email);
     }
 
@@ -71,3 +139,13 @@
         return tokenHandler.WriteToken(token);
     }
+    
+    private string sha256Hash(String value)
+    {
+        using (SHA256 hash = SHA256.Create())
+        {
+            return String.Concat(hash
+              .ComputeHash(Encoding.UTF8.GetBytes(value))
+              .Select(item => item.ToString("x2")));
+        }
+    }
 }
Index: resTools_backend/backend/backend.csproj
===================================================================
--- resTools_backend/backend/backend.csproj	(revision 899b19da4d7326788e23e45dd1881ec1395e1d88)
+++ resTools_backend/backend/backend.csproj	(revision a26f6a1dc0314af7fc65fdabb78f1acbaca506a0)
@@ -1,3 +1,3 @@
-<Project Sdk="Microsoft.NET.Sdk.Web">
+﻿<Project Sdk="Microsoft.NET.Sdk.Web">
 
   <PropertyGroup>
@@ -22,4 +22,5 @@
     <PackageReference Include="Npgsql" Version="6.0.3" />
     <PackageReference Include="Npgsql.EntityFrameworkCore.PostgreSQL" Version="6.0.3" />
+    <PackageReference Include="SendGrid" Version="9.28.0" />
     <PackageReference Include="Swashbuckle.AspNetCore" Version="6.2.3" />
     <PackageReference Include="Swashbuckle.Core" Version="5.6.0" />
