diff --git a/biscuit/core/forms.py b/biscuit/core/forms.py
index e4aa0d69f6403648bf2bc719f20d1fb6a80493bf..c7e813fdec59f29777da3670fb1aeee377850b3f 100644
--- a/biscuit/core/forms.py
+++ b/biscuit/core/forms.py
@@ -1,6 +1,7 @@
 from django import forms
 from django.contrib.auth import get_user_model
 from django.utils.translation import ugettext_lazy as _
+from django_select2.forms import ModelSelect2MultipleWidget, Select2Widget
 
 from .models import Person, Group, School, SchoolTerm
 
@@ -9,6 +10,9 @@ class PersonAccountForm(forms.ModelForm):
     class Meta:
         model = Person
         fields = ['last_name', 'first_name', 'user']
+        widgets = {
+            'user': Select2Widget
+        }
 
     new_user = forms.CharField(required=False)
 
@@ -44,6 +48,9 @@ class EditPersonForm(forms.ModelForm):
         model = Person
         fields = ['user', 'is_active', 'first_name', 'last_name', 'additional_name', 'short_name', 'street', 'housenumber',
                   'postal_code', 'place', 'phone_number', 'mobile_number', 'email', 'date_of_birth', 'sex', 'photo', 'photo_cropping']
+        widgets = {
+            'user': Select2Widget
+        }
 
     new_user = forms.CharField(
         required=False,
@@ -72,7 +79,11 @@ class EditGroupForm(forms.ModelForm):
     class Meta:
         model = Group
         fields = ['name', 'short_name', 'members', 'owners', 'parent_groups']
-
+        widgets = {
+            'members': ModelSelect2MultipleWidget(search_fields=['first_name__icontains', 'last_name__icontains', 'short_name__icontains']),
+            'owners': ModelSelect2MultipleWidget(search_fields=['first_name__icontains', 'last_name__icontains', 'short_name__icontains']),
+            'parent_groups': ModelSelect2MultipleWidget(search_fields=['name__icontains', 'short_name__icontains']),
+        }
 
 class EditSchoolForm(forms.ModelForm):
     class Meta:
diff --git a/biscuit/core/settings.py b/biscuit/core/settings.py
index 367084c6edd5e8fdffe39712f8ddc889a35d6173..72900c31913f8d8cc15268c5ffe1fd30c4668ca5 100644
--- a/biscuit/core/settings.py
+++ b/biscuit/core/settings.py
@@ -64,6 +64,7 @@ INSTALLED_APPS = [
     'phonenumber_field',
     'debug_toolbar',
     'contact_form',
+    'django_select2',
     'hattori',
     'biscuit.core',
     'impersonate',
diff --git a/biscuit/core/templates/core/edit_group.html b/biscuit/core/templates/core/edit_group.html
index f49bcc0057c055af6200244554ef45b9c23d5658..0eb63393e8c7326012cb6fe6209f4c7e33218126 100644
--- a/biscuit/core/templates/core/edit_group.html
+++ b/biscuit/core/templates/core/edit_group.html
@@ -3,6 +3,16 @@
 {% extends "core/base.html" %}
 {% load bootstrap4 i18n %}
 
+{% block bootstrap4_extra_head %}
+  {{ block.super }}
+  {{ edit_group_form.media.css }}
+{% endblock %}
+
+{% block bootstrap4_extra_script %}
+  {{ block.super }}
+  {{ edit_group_form.media.js }}
+{% endblock %}
+
 {% block bootstrap4_title %}{% blocktrans %}Edit group{% endblocktrans %} - {{ block.super }}{% endblock %}
 
 {% block page_title %}{% blocktrans %}Edit group{% endblocktrans %}{% endblock %}
diff --git a/biscuit/core/templates/core/edit_person.html b/biscuit/core/templates/core/edit_person.html
index ae0f6da794f5f3a7e3cd20ca3c9029e0b78f842c..c1b4f8e22115bca0f821c7dcc04b67c8e88b3bf6 100644
--- a/biscuit/core/templates/core/edit_person.html
+++ b/biscuit/core/templates/core/edit_person.html
@@ -11,6 +11,12 @@
 {% block bootstrap4_extra_head %}
   {{ block.super }}
   {{ edit_person_form.media }}
+  {{ edit_person_form.media.css }}
+{% endblock %}
+
+{% block bootstrap4_extra_script %}
+  {{ block.super }}
+  {{ edit_person_form.media.js }}
 {% endblock %}
 
 {% block content %}
diff --git a/biscuit/core/templates/core/persons_accounts.html b/biscuit/core/templates/core/persons_accounts.html
index 14e2b8f42931b62ee8684cfc30bcaa61c907c1b3..eb376f1a2cab700c10886e4f452537d24faa27b1 100644
--- a/biscuit/core/templates/core/persons_accounts.html
+++ b/biscuit/core/templates/core/persons_accounts.html
@@ -4,6 +4,16 @@
 
 {% load bootstrap4 i18n %}
 
+{% block bootstrap4_extra_head %}
+  {{ block.super }}
+  {{ persons_accounts_formset.media.css }}
+{% endblock %}
+
+{% block bootstrap4_extra_script %}
+  {{ block.super }}
+  {{ persons_accounts_formset.media.js }}
+{% endblock %}
+
 {% block bootstrap4_title %}{% blocktrans %}Link persons to accounts{% endblocktrans%} - {{ block.super }}{% endblock %}
 
 {% block page_title %}
diff --git a/biscuit/core/urls.py b/biscuit/core/urls.py
index 896467e504ba350783425b97a28de98417fd05b4..794394a34baecd64f3744140ba2922e592c7d571 100644
--- a/biscuit/core/urls.py
+++ b/biscuit/core/urls.py
@@ -31,7 +31,8 @@ urlpatterns = [
     path('maintenance-mode/', include('maintenance_mode.urls')),
     path('contact/', include('contact_form.urls')),
     path('impersonate/', include('impersonate.urls')),
-    path('__i18n__/', include('django.conf.urls.i18n'))
+    path('__i18n__/', include('django.conf.urls.i18n')),
+    path('select2/', include('django_select2.urls'))
 ]
 
 # Serve javascript-common if in development