diff --git a/.environment-dev b/.environment-dev
index 335bee02784270b902cb18a538adb44da03977dc..d92b941dcad49a7f5b8c08a21898151a6e73df59 100644
--- a/.environment-dev
+++ b/.environment-dev
@@ -1,9 +1,16 @@
-UWSGI_PROCESS_PER_CONTAINER=4
-DEBUG=true
 ALLOWED_HOSTS=localhost,127.0.0.1
-SECRET_KEY=Ixosoh1iemoh0Heloh1thee5akooboonu5veehae4aikoh2ohg
 DATABASE_HOST=shellvalier-postgresql
 DATABASE_NAME=shellvalier
-DATABASE_USER=shellvalier
 DATABASE_PASSWORD=shellvalier
 DATABASE_PORT=5432
+DATABASE_USER=shellvalier
+DEBUG=true
+EMAIL_BACKEND=django.core.mail.backends.console.EmailBackend
+EMAIL_HOST=
+EMAIL_PORT=25
+EMAIL_HOST_USER=
+EMAIL_HOST_PASSWORD=
+EMAIL_USE_TLS=false
+EMAIL_USE_SSL=false
+SECRET_KEY=Ixosoh1iemoh0Heloh1thee5akooboonu5veehae4aikoh2ohg
+UWSGI_PROCESS_PER_CONTAINER=4
diff --git a/locale/en/LC_MESSAGES/django.mo b/locale/en/LC_MESSAGES/django.mo
index f7595614722432da63fc8ccf1e3efcd5f783fe8f..29f13eb298a0c8e679ff2df730c09217471e3bb9 100644
Binary files a/locale/en/LC_MESSAGES/django.mo and b/locale/en/LC_MESSAGES/django.mo differ
diff --git a/locale/en/LC_MESSAGES/django.po b/locale/en/LC_MESSAGES/django.po
index 56413e06d44ffb05795ec4e8352700e97c68a701..2986a6ffea95bba2b7fdc6eb850605b61925a229 100644
--- a/locale/en/LC_MESSAGES/django.po
+++ b/locale/en/LC_MESSAGES/django.po
@@ -8,7 +8,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: PACKAGE VERSION\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2022-04-07 23:17+0200\n"
+"POT-Creation-Date: 2022-04-08 21:59+0200\n"
 "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
 "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
 "Language-Team: LANGUAGE <LL@li.org>\n"
@@ -46,9 +46,8 @@ msgstr "Your profile"
 msgid "Wyloguj siÄ™"
 msgstr "Sign out"
 
-#: common/templates/base.html:89 users/forms.py:71
-#: users/templates/registration/login.html:6
-#: users/templates/registration/login.html:12
+#: common/templates/base.html:89 users/forms.py:74 users/templates/login.html:6
+#: users/templates/login.html:12
 msgid "Zaloguj siÄ™"
 msgstr "Sign in"
 
@@ -2290,28 +2289,100 @@ msgstr "distributive phrase"
 msgid "fraza posesywna"
 msgstr "possesive phrase"
 
-#: users/forms.py:10 users/templates/user_list.html:21
+#: users/forms.py:12 users/templates/user_list.html:21
 msgid "Grupa"
 msgstr "Group"
 
-#: users/forms.py:29 users/forms.py:59
+#: users/forms.py:31 users/forms.py:61
 msgid "Zapisz"
 msgstr "Save"
 
-#: users/forms.py:30 users/forms.py:60
+#: users/forms.py:32 users/forms.py:63 users/forms.py:84 users/forms.py:93
+#: users/forms.py:102
 msgid "Wróć"
 msgstr "Back"
 
-#: users/forms.py:84
+#: users/forms.py:62 users/templates/password_change.html:6
+#: users/templates/password_change.html:12
+msgid "Zmień swoje hasło"
+msgstr "Change your password"
+
+#: users/forms.py:75
+msgid "Nie pamiętam hasła"
+msgstr "I forgot my password"
+
+#: users/forms.py:83
 msgid "Zresetuj hasło"
 msgstr "Reset password"
 
-#: users/templates/registration/password_reset.html:6
-#: users/templates/registration/password_reset.html:12
+#: users/forms.py:92
+msgid "Zmień hasło"
+msgstr "Change password"
+
+#: users/forms.py:101
+msgid "Ustaw hasło"
+msgstr "Set password"
+
+#: users/templates/new_user_email.html:2
+#, python-format
+msgid "Otrzymujesz ten e-mail, ponieważ ktoś zaprosił Cię do %(site_name)s."
+msgstr ""
+"You're receiving this email because you have been invited to %(site_name)s."
+
+#: users/templates/new_user_email.html:4
+msgid "Przejdź na poniższą stronę i ustaw swoje hasło:"
+msgstr "Please go to the following page and set your password:"
+
+#: users/templates/new_user_email.html:8
+msgid "Twoja nazwa użytkownika"
+msgstr "Your username"
+
+#: users/templates/new_user_email.html:10
+#: users/templates/password_reset_email.html:10
+#, python-format
+msgid "Zespół %(site_name)s"
+msgstr "The %(site_name)s team"
+
+#: users/templates/password_reset.html:6 users/templates/password_reset.html:12
 msgid "Zresetuj swoje hasło"
 msgstr "Reset your password"
 
-#: users/templates/user_list.html:12 users/views.py:35
+#: users/templates/password_reset_email.html:2
+#, python-format
+msgid ""
+"Otrzymujesz ten e-mail w związku z prośbą o zmianę hasła Twojego użytkownia "
+"na %(site_name)s."
+msgstr ""
+"You're receiving this email because you requested a password reset for your "
+"user account at %(site_name)s."
+
+#: users/templates/password_reset_email.html:4
+msgid "Przejdź na poniższą stronę i ustaw swoje nowe hasło:"
+msgstr "Please go to the following page and choose a new password:"
+
+#: users/templates/password_reset_email.html:8
+msgid "Twoja nazwa użytkownia:"
+msgstr "Your username, in case you’ve forgotten:"
+
+#: users/templates/password_reset_form.html:6
+#: users/templates/password_reset_form.html:12
+msgid "Ustaw swoje nowe hasło"
+msgstr "Choose your new password"
+
+#: users/templates/password_reset_requested.html:6
+#: users/templates/password_reset_requested.html:12
+msgid "Sprawdź swoją skrzynkę e-mail"
+msgstr "Please check your e-mail inbox"
+
+#: users/templates/password_reset_requested.html:13
+msgid ""
+"Wysłaliśmy na Twój adres e-mail link, po kliknięciu którego uzyskasz "
+"możliwość wprowadzenia swojego nowego hasła."
+msgstr ""
+"We've sent you an e-mail containing a link you can use to set your new "
+"password."
+
+#: users/templates/user_list.html:12 users/views.py:38
 msgid "Dodaj użytkownika"
 msgstr "Add a user"
 
@@ -2335,7 +2406,12 @@ msgstr "Actions"
 msgid "Edytuj"
 msgstr "Edit"
 
-#: users/views.py:48
+#: users/utils.py:7
+#, python-format
+msgid "Zaproszenie do %s"
+msgstr "An invitation to %s"
+
+#: users/views.py:51
 msgid "Edytuj użytkownika"
 msgstr "Edit user"
 
diff --git a/locale/en/LC_MESSAGES/djangojs.po b/locale/en/LC_MESSAGES/djangojs.po
index fb7fa6fc0cacfb9be3b7ebf56bdaeacf3a7298e4..e5f578e8e1bc7926f857b206a7bba0ce5368c160 100644
--- a/locale/en/LC_MESSAGES/djangojs.po
+++ b/locale/en/LC_MESSAGES/djangojs.po
@@ -8,7 +8,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: PACKAGE VERSION\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2022-04-07 23:17+0200\n"
+"POT-Creation-Date: 2022-04-08 21:59+0200\n"
 "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
 "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
 "Language-Team: LANGUAGE <LL@li.org>\n"
diff --git a/shellvalier/settings.py b/shellvalier/settings.py
index 89ee949596a18b838e7573bf307d4a64a48b9cfc..4bd5bef14bb0aa051311b79e514f83d815e595a5 100644
--- a/shellvalier/settings.py
+++ b/shellvalier/settings.py
@@ -162,6 +162,14 @@ STATICFILES_DIRS = [
     os.path.join(BASE_DIR, 'common/static/'),
 ]
 
-LOGIN_URL = reverse_lazy("users:login")
+LOGIN_URL = reverse_lazy('users:login')
 LOGIN_REDIRECT_URL = reverse_lazy('dash')
 LOGOUT_REDIRECT_URL = reverse_lazy('dash')
+
+EMAIL_BACKEND = get_environment('EMAIL_BACKEND')
+EMAIL_HOST = get_environment('EMAIL_HOST')
+EMAIL_PORT = get_environment('EMAIL_PORT', mapper=int)
+EMAIL_HOST_USER = get_environment('EMAIL_HOST_USER')
+EMAIL_HOST_PASSWORD = get_environment('EMAIL_HOST_PASSWORD')
+EMAIL_USE_TLS = get_environment('EMAIL_USE_TLS', mapper=boolean_mapper)
+EMAIL_USE_SSL = get_environment('EMAIL_USE_SSL', mapper=boolean_mapper)
diff --git a/users/forms.py b/users/forms.py
index e0d98f1683665d27456c77d4808a485879d91055..054b6aff9a2e3eba0224de9188072d5fc486beb2 100644
--- a/users/forms.py
+++ b/users/forms.py
@@ -1,13 +1,15 @@
 from django import forms
 from django.contrib.auth.models import Group, User
-from django.utils.translation import gettext as _
+from django.urls import reverse_lazy
+from django.utils.text import format_lazy
+from django.utils.translation import gettext_lazy as _
 
 from crispy_forms.helper import FormHelper
 from crispy_forms.layout import HTML, Layout, Fieldset, ButtonHolder, Submit
 
 
 class UserForm(forms.ModelForm):
-    group = forms.ModelChoiceField(queryset=Group.objects.all(), label=_("Grupa"))
+    group = forms.ModelChoiceField(queryset=Group.objects.all(), label=_('Grupa'))
 
     class Meta:
         model = User
@@ -27,7 +29,7 @@ class UserForm(forms.ModelForm):
             Fieldset('', 'first_name', 'last_name', 'username', 'email', 'group', 'is_active'),
             ButtonHolder(
                 Submit('submit', _('Zapisz'), css_class='btn btn-sm btn-success'),
-                HTML('''<a class="btn btn-sm btn-light" href="{% url 'users:user_list' %}">''' + _('Wróć') + '</a>'),
+                HTML(format_lazy('<a class="btn btn-sm btn-light" href="{}">{}</a>', reverse_lazy('users:user_list'), _('Wróć'))),
             ),
         )
         for field in ['first_name', 'last_name', 'email']:
@@ -57,7 +59,8 @@ class UserProfileForm(forms.ModelForm):
             Fieldset('', 'first_name', 'last_name', 'email'),
             ButtonHolder(
                 Submit('submit', _('Zapisz'), css_class='btn btn-sm btn-success'),
-                HTML('''<a class="btn btn-sm btn-light" href="{% url 'dash' %}">''' + _('Wróć') + '</a>'),
+                HTML(format_lazy('<a class="btn btn-sm btn-light" href="{}">{}</a>', reverse_lazy('users:password_change'), _('Zmień swoje hasło'))),
+                HTML(format_lazy('<a class="btn btn-sm btn-light" href="{}">{}</a>', reverse_lazy('dash'), _('Wróć'))),
             ),
         )
         for field in ['first_name', 'last_name', 'email']:
@@ -69,11 +72,7 @@ login_form_helper.layout = Layout(
     Fieldset('', 'username', 'password'),
     ButtonHolder(
         Submit('submit', _('Zaloguj siÄ™'), css_class='btn btn-sm btn-success'),
-        HTML(
-            '''<a class="btn btn-sm btn-light" href="{% url 'users:password_reset' %}">'''
-            f"{_('Nie pamiętam hasła')}"
-            '</a>'
-        ),
+        HTML(format_lazy('<a class="btn btn-sm btn-light" href="{}">{}</a>', reverse_lazy('users:password_reset'), _('Nie pamiętam hasła'))),
     ),
 )
 
@@ -82,6 +81,24 @@ password_reset_form_helper.layout = Layout(
     Fieldset('', 'email'),
     ButtonHolder(
         Submit('submit', _('Zresetuj hasło'), css_class='btn btn-sm btn-success'),
-        HTML('''<a class="btn btn-sm btn-light" href="{% url 'users:login' %}">''' f"{_('Wróć')}" '</a>'),
+        HTML(format_lazy('<a class="btn btn-sm btn-light" href="{}">{}</a>', reverse_lazy('users:login'), _('Wróć'))),
+    )
+)
+
+password_change_form_helper = FormHelper()
+password_change_form_helper.layout = Layout(
+    Fieldset('', 'old_password', 'new_password1', 'new_password2'),
+    ButtonHolder(
+        Submit('submit', _('Zmień hasło'), css_class='btn btn-sm btn-success'),
+        HTML(format_lazy('<a class="btn btn-sm btn-light" href="{}">{}</a>', reverse_lazy('users:user_profile'), _("Wróć"))),
+    )
+)
+
+password_reset_set_password_form_helper = FormHelper()
+password_reset_set_password_form_helper.layout = Layout(
+    Fieldset('', 'new_password1', 'new_password2'),
+    ButtonHolder(
+        Submit('submit', _('Ustaw hasło'), css_class='btn btn-sm btn-success'),
+        HTML(format_lazy('<a class="btn btn-sm btn-light" href="{}">{}</a>', reverse_lazy('dash'), _("Wróć"))),
     )
 )
diff --git a/users/management/commands/create_groups_and_permissions.py b/users/management/commands/create_groups_and_permissions.py
index 195d2d1942458bd7a63f4d41ff8c4a97c051dc5f..a4361ca1c071820a42947ba2a3c222300bba2e0c 100644
--- a/users/management/commands/create_groups_and_permissions.py
+++ b/users/management/commands/create_groups_and_permissions.py
@@ -5,18 +5,18 @@ from django.core.management.base import BaseCommand
 
 class Command(BaseCommand):
     def handle(self, **options):
-        admins, __ = Group.objects.get_or_create(name="Admini")
+        admins, __ = Group.objects.get_or_create(name='Admini')
         admins.permissions.add(
-            Permission.objects.get(codename="view_user", content_type=ContentType.objects.get_for_model(User)),
-            Permission.objects.get(codename="add_user", content_type=ContentType.objects.get_for_model(User)),
-            Permission.objects.get(codename="change_user", content_type=ContentType.objects.get_for_model(User)),
-            Permission.objects.get(codename="delete_user", content_type=ContentType.objects.get_for_model(User)),
+            Permission.objects.get(codename='view_user', content_type=ContentType.objects.get_for_model(User)),
+            Permission.objects.get(codename='add_user', content_type=ContentType.objects.get_for_model(User)),
+            Permission.objects.get(codename='change_user', content_type=ContentType.objects.get_for_model(User)),
+            Permission.objects.get(codename='delete_user', content_type=ContentType.objects.get_for_model(User)),
         )
-        lexicographs, __ = Group.objects.get_or_create(name="Leksykografowie")
+        lexicographs, __ = Group.objects.get_or_create(name='Leksykografowie')
         lexicographs.permissions.add(
             # TODO
         )
-        super_lexicographs, __ = Group.objects.get_or_create(name="Super Leksykografowie")
+        super_lexicographs, __ = Group.objects.get_or_create(name='Super Leksykografowie')
         super_lexicographs.permissions.add(
             # TODO
         )
diff --git a/users/templates/registration/login.html b/users/templates/login.html
similarity index 71%
rename from users/templates/registration/login.html
rename to users/templates/login.html
index 10834c7ffb611fb88384be4752384c3879a255c2..d184db392db4e40d59fdb2f57346f56e711f7e0e 100644
--- a/users/templates/registration/login.html
+++ b/users/templates/login.html
@@ -1,15 +1,15 @@
-{% extends "base.html" %}
+{% extends 'base.html' %}
 
 {% load i18n %}
 {% load crispy_forms_filters %}
 
-{% block title %}{% trans "Zaloguj siÄ™" %}{% endblock %}
+{% block title %}{% trans 'Zaloguj siÄ™' %}{% endblock %}
 
 {% block content %}
     <div class="row m-0">
         <div class="col-lg-4 col-md-6 m-auto">
             <div class="bg-white mt-4 p-3 clearfix">
-                <h5 class="mt-2 mb-4">{% trans "Zaloguj siÄ™" %}</h5>
+                <h5 class="mt-2 mb-4">{% trans 'Zaloguj siÄ™' %}</h5>
                 <form action="." method="post">
                     {% crispy form helper %}
                 </form>
diff --git a/users/templates/new_user_email.html b/users/templates/new_user_email.html
new file mode 100644
index 0000000000000000000000000000000000000000..1d4ca57c4134ae1b910f5279c4da5d824f334d1d
--- /dev/null
+++ b/users/templates/new_user_email.html
@@ -0,0 +1,11 @@
+{% load i18n %}{% autoescape off %}
+{% blocktranslate %}Otrzymujesz ten e-mail, ponieważ ktoś zaprosił Cię do {{ site_name }}.{% endblocktranslate %}
+
+{% translate 'Przejdź na poniższą stronę i ustaw swoje hasło:' %}
+{% block reset_link %}
+{{ protocol }}://{{ domain }}{% url 'users:password_reset' %}
+{% endblock %}
+{% translate 'Twoja nazwa użytkownika' %}: {{ user.get_username }}
+
+{% blocktranslate %}Zespół {{ site_name }}{% endblocktranslate %}
+{% endautoescape %}
diff --git a/users/templates/password_change.html b/users/templates/password_change.html
new file mode 100644
index 0000000000000000000000000000000000000000..33ac0d7b86654d07cb6f9d5970c90836dff73b62
--- /dev/null
+++ b/users/templates/password_change.html
@@ -0,0 +1,19 @@
+{% extends 'base.html' %}
+
+{% load i18n %}
+{% load crispy_forms_filters %}
+
+{% block title %}{% trans 'Zmień swoje hasło' %}{% endblock %}
+
+{% block content %}
+    <div class="row m-0">
+        <div class="col-lg-4 col-md-6 m-auto">
+            <div class="bg-white mt-4 p-3 clearfix">
+                <h5 class="mt-2 mb-4">{% trans 'Zmień swoje hasło' %}</h5>
+                <form action="." method="post">
+                    {% crispy form helper %}
+                </form>
+            </div>
+        </div>
+    </div>
+{% endblock %}
diff --git a/users/templates/registration/password_reset.html b/users/templates/password_reset.html
similarity index 69%
rename from users/templates/registration/password_reset.html
rename to users/templates/password_reset.html
index 7d37fa921a0e368d281916c3a87cd588213ea538..195135cb7d61bde6fe5fbb1f0d06c3cfe1b72148 100644
--- a/users/templates/registration/password_reset.html
+++ b/users/templates/password_reset.html
@@ -1,15 +1,15 @@
-{% extends "base.html" %}
+{% extends 'base.html' %}
 
 {% load i18n %}
 {% load crispy_forms_filters %}
 
-{% block title %}{% trans "Zresetuj swoje hasło" %}{% endblock %}
+{% block title %}{% trans 'Zresetuj swoje hasło' %}{% endblock %}
 
 {% block content %}
     <div class="row m-0">
         <div class="col-lg-4 col-md-6 m-auto">
             <div class="bg-white mt-4 p-3 clearfix">
-                <h5 class="mt-2 mb-4">{% trans "Zresetuj swoje hasło" %}</h5>
+                <h5 class="mt-2 mb-4">{% trans 'Zresetuj swoje hasło' %}</h5>
                 <form action="." method="post">
                     {% crispy form helper %}
                 </form>
diff --git a/users/templates/password_reset_email.html b/users/templates/password_reset_email.html
new file mode 100644
index 0000000000000000000000000000000000000000..32d2ae9f470a241e2fe7c70245db10d389a13c34
--- /dev/null
+++ b/users/templates/password_reset_email.html
@@ -0,0 +1,11 @@
+{% load i18n %}{% autoescape off %}
+{% blocktranslate %}Otrzymujesz ten e-mail w związku z prośbą o zmianę hasła Twojego użytkownia na {{ site_name }}.{% endblocktranslate %}
+
+{% translate 'Przejdź na poniższą stronę i ustaw swoje nowe hasło:' %}
+{% block reset_link %}
+{{ protocol }}://{{ domain }}{% url 'users:password_reset_confirm' uidb64=uid token=token %}
+{% endblock %}
+{% translate 'Twoja nazwa użytkownia:' %} {{ user.get_username }}
+
+{% blocktranslate %}Zespół {{ site_name }}{% endblocktranslate %}
+{% endautoescape %}
diff --git a/users/templates/password_reset_form.html b/users/templates/password_reset_form.html
new file mode 100644
index 0000000000000000000000000000000000000000..83e179e0ebf4872ac9bf19585347a62293a19e76
--- /dev/null
+++ b/users/templates/password_reset_form.html
@@ -0,0 +1,23 @@
+{% extends 'base.html' %}
+
+{% load i18n %}
+{% load crispy_forms_filters %}
+
+{% block title %}{% trans 'Ustaw swoje nowe hasło' %}{% endblock %}
+
+{% block content %}
+    <div class="row m-0">
+        <div class="col-lg-4 col-md-6 m-auto">
+            <div class="bg-white mt-4 p-3 clearfix">
+                <h5 class="mt-2 mb-4">{% trans 'Ustaw swoje nowe hasło' %}</h5>
+                <form action="." method="post">
+                    {% if form %}
+                        {% crispy form helper %}
+                    {% else %}
+                        <div class="alert alert-danger">{{ title }}</div>
+                    {% endif %}
+                </form>
+            </div>
+        </div>
+    </div>
+{% endblock %}
diff --git a/users/templates/password_reset_requested.html b/users/templates/password_reset_requested.html
new file mode 100644
index 0000000000000000000000000000000000000000..84a64e3fdba21f7df347da92fd728fdbd03ab4ca
--- /dev/null
+++ b/users/templates/password_reset_requested.html
@@ -0,0 +1,17 @@
+{% extends 'base.html' %}
+
+{% load i18n %}
+{% load crispy_forms_filters %}
+
+{% block title %}{% trans 'Sprawdź swoją skrzynkę e-mail' %}{% endblock %}
+
+{% block content %}
+    <div class="row m-0">
+        <div class="col-lg-4 col-md-6 m-auto">
+            <div class="bg-white mt-4 p-3 clearfix">
+                <h5 class="mt-2 mb-4">{% trans 'Sprawdź swoją skrzynkę e-mail' %}</h5>
+                <p>{% trans 'Wysłaliśmy na Twój adres e-mail link, po kliknięciu którego uzyskasz możliwość wprowadzenia swojego nowego hasła.' %}</p>
+            </div>
+        </div>
+    </div>
+{% endblock %}
diff --git a/users/templates/user_form.html b/users/templates/user_form.html
index 82fbbf3540492162a340f08a1165c63a2e1fa62b..25d2a4624a39c08205b8fd7302782a91ac4429cb 100644
--- a/users/templates/user_form.html
+++ b/users/templates/user_form.html
@@ -1,4 +1,4 @@
-{% extends "base-margins.html" %}
+{% extends 'base-margins.html' %}
 
 {% load i18n %}
 
diff --git a/users/templates/user_list.html b/users/templates/user_list.html
index c3b00516c9eac5e6ebe75f76222384c388421f16..4d84c66b448595f50648f2ff09a8cf18d38b4a1e 100644
--- a/users/templates/user_list.html
+++ b/users/templates/user_list.html
@@ -1,4 +1,4 @@
-{% extends "base-margins.html" %}
+{% extends 'base-margins.html' %}
 
 {% load i18n %}
 
@@ -16,11 +16,11 @@
 <table class="table">
     <thead>
         <tr>
-            <th>{% trans "ImiÄ™ i nazwisko" %}</th>
-            <th>{% trans "Nazwa użytkownika" %}</th>
-            <th>{% trans "Grupa" %}</th>
-            <th>{% trans "Aktywny" %}</th>
-            <th>{% trans "Akcje" %}</th>
+            <th>{% trans 'ImiÄ™ i nazwisko' %}</th>
+            <th>{% trans 'Nazwa użytkownika' %}</th>
+            <th>{% trans 'Grupa' %}</th>
+            <th>{% trans 'Aktywny' %}</th>
+            <th>{% trans 'Akcje' %}</th>
         </tr>
     </thead>
     <tbody>
@@ -28,7 +28,7 @@
         <tr>
             <td>{{ user.get_full_name }}</td>
             <td>{{ user.username }}</td>
-            <td>{{ user.groups.all|join:", " }}</td>
+            <td>{{ user.groups.all|join:', ' }}</td>
             <td>{{ user.is_active|yesno }}</td>
             <td><a href="{% url 'users:user_edit' pk=user.pk %}" class="btn btn-xs btn-outline-dark">{% trans 'Edytuj' %}</a></td>
         </tr>
diff --git a/users/templates/user_profile.html b/users/templates/user_profile.html
index 35db9c221e1fd076b4dce4c02ff56ab1cd350170..e29608cd606750027f6dd872894237ef6225a40b 100644
--- a/users/templates/user_profile.html
+++ b/users/templates/user_profile.html
@@ -1,4 +1,4 @@
-{% extends "base-margins.html" %}
+{% extends 'base-margins.html' %}
 
 {% load i18n %}
 
diff --git a/users/urls.py b/users/urls.py
index 76ae1faa248c31572c181cbb1e88b1829f8eef33..03b60f160ea1186d8f4275c17bb56203c36910b5 100644
--- a/users/urls.py
+++ b/users/urls.py
@@ -1,29 +1,57 @@
-from django.urls import include, path, reverse_lazy
-
 from django.contrib.auth import views as auth_views
+from django.urls import include, path, reverse_lazy
+from django.views.generic import TemplateView
 
 from . import views
-from .forms import login_form_helper, password_reset_form_helper
+from . import forms
 
 app_name = 'users'
 
 urlpatterns = [
-    path('', views.user_list, name="user_list"),
-    path('add/', views.user_add, name="user_add"),
-    path('<int:pk>/edit/', views.user_edit, name="user_edit"),
-    path('profile/', views.user_profile, name="user_profile"),
+    path('', views.user_list, name='user_list'),
+    path('add/', views.user_add, name='user_add'),
+    path('<int:pk>/edit/', views.user_edit, name='user_edit'),
+    path('profile/', views.user_profile, name='user_profile'),
     path(
         'login/',
-        auth_views.LoginView.as_view(extra_context={"helper": login_form_helper}, success_url=reverse_lazy('dash')),
-        name="login",
+        auth_views.LoginView.as_view(
+            template_name='login.html',
+            success_url=reverse_lazy('dash'),
+            extra_context={'helper': forms.login_form_helper},
+        ),
+        name='login',
     ),
-    path('logout/', auth_views.LogoutView.as_view(), name="logout"),
+    path('logout/', auth_views.LogoutView.as_view(), name='logout'),
+    path(
+        'psasword-change/',
+        auth_views.PasswordChangeView.as_view(
+            template_name='password_change.html',
+            success_url=reverse_lazy('users:user_profile'),
+            extra_context={'helper': forms.password_change_form_helper},
+        ),
+        name='password_change'),
     path(
         'password-reset/',
         auth_views.PasswordResetView.as_view(
-            template_name="registration/password_reset.html",
-            extra_context={"helper": password_reset_form_helper},
+            template_name='password_reset.html',
+            email_template_name='password_reset_email.html',
+            success_url=reverse_lazy('users:password_reset_requested'),
+            extra_context={'helper': forms.password_reset_form_helper},
+        ),
+        name='password_reset',
+    ),
+    path(
+        'password-reset/check-your-inbox/',
+        TemplateView.as_view(template_name='password_reset_requested.html'),
+        name='password_reset_requested',
+    ),
+    path(
+        'password-reset/<uidb64>/<token>/',
+        auth_views.PasswordResetConfirmView.as_view(
+            template_name='password_reset_form.html',
+            success_url=reverse_lazy('users:login'),
+            extra_context={'helper': forms.password_reset_set_password_form_helper},
         ),
-        name="password_reset",
+        name='password_reset_confirm'
     ),
 ]
diff --git a/users/utils.py b/users/utils.py
new file mode 100644
index 0000000000000000000000000000000000000000..ae63178dd6fd61841290acf7c820d243972e00fe
--- /dev/null
+++ b/users/utils.py
@@ -0,0 +1,14 @@
+from django.core.mail import send_mail
+from django.utils.translation import gettext as _
+from django.template import loader
+
+
+def send_new_user_email(site, user, use_https):
+    subject = _('Zaproszenie do %s') % (site.name, )
+    body = loader.render_to_string('new_user_email.html', {
+        'site_name': site.name,
+        'protocol': 'https' if use_https else 'http',
+        'domain': site.domain,
+        'user': user,
+    })
+    send_mail(subject, body, from_email=None, recipient_list=[user.email])
diff --git a/users/views.py b/users/views.py
index 97b3b5aac9bed68aad34067282e246964e79c094..9e9a6a806937cc2fe1e0b705e9faa0d4ee1cabec 100644
--- a/users/views.py
+++ b/users/views.py
@@ -1,9 +1,11 @@
 from django.contrib.auth.decorators import login_required, permission_required
 from django.contrib.auth.models import User
+from django.contrib.sites.shortcuts import get_current_site
 from django.shortcuts import get_object_or_404, render, redirect
 from django.utils.translation import gettext_lazy as _
 
 from users.forms import UserForm, UserProfileForm
+from users.utils import send_new_user_email
 
 
 @permission_required('users.view_user')
@@ -28,7 +30,8 @@ def user_add(request):
     if request.method == 'POST':
         form = UserForm(instance=User(), data=request.POST)
         if form.is_valid():
-            form.save()
+            user = form.save()
+            send_new_user_email(site=get_current_site(request), user=user, use_https=request.is_secure())
             return redirect('users:user_list')
     else:
         form = UserForm(instance=User())