diff --git a/apps/activity/views.py b/apps/activity/views.py
index cac7f18345feaf666da0cd32ccce8277c54dde70..923f32ecc39e8d5005052cb2ab4108b72cb6ed8a 100644
--- a/apps/activity/views.py
+++ b/apps/activity/views.py
@@ -114,28 +114,31 @@ class ActivityEntryView(LoginRequiredMixin, TemplateView):
         context = super().get_context_data(**kwargs)
 
         activity = Activity.objects.filter(PermissionBackend.filter_queryset(self.request.user, Activity, "view"))\
-            .get(pk=self.kwargs["pk"])
+            .distinct().get(pk=self.kwargs["pk"])
         context["activity"] = activity
 
         matched = []
 
-        pattern = "^$"
-        if "search" in self.request.GET:
-            pattern = self.request.GET["search"]
-
-        if not pattern:
-            pattern = "^$"
-
-        if pattern[0] != "^":
-            pattern = "^" + pattern
-
         guest_qs = Guest.objects\
             .annotate(balance=F("inviter__balance"), note_name=F("inviter__user__username"))\
-            .filter(Q(first_name__regex=pattern) | Q(last_name__regex=pattern)
-                    | Q(inviter__alias__name__regex=pattern)
-                    | Q(inviter__alias__normalized_name__regex=Alias.normalize(pattern))) \
+            .filter(activity=activity)\
             .filter(PermissionBackend.filter_queryset(self.request.user, Guest, "view"))\
-            .distinct()[:20]
+            .order_by('last_name', 'first_name').distinct()
+
+        if "search" in self.request.GET:
+            pattern = self.request.GET["search"]
+            if pattern[0] != "^":
+                pattern = "^" + pattern
+            guest_qs = guest_qs.filter(
+                Q(first_name__regex=pattern)
+                | Q(last_name__regex=pattern)
+                | Q(inviter__alias__name__regex=pattern)
+                | Q(inviter__alias__normalized_name__regex=Alias.normalize(pattern))
+            )
+        else:
+            pattern = None
+            guest_qs = guest_qs.none()
+
         for guest in guest_qs:
             guest.type = "Invité"
             matched.append(guest)
@@ -145,12 +148,18 @@ class ActivityEntryView(LoginRequiredMixin, TemplateView):
                                          username=F("note__noteuser__user__username"),
                                          note_name=F("name"),
                                          balance=F("note__balance"))\
-            .filter(Q(note__polymorphic_ctype__model="noteuser")
-                    & (Q(note__noteuser__user__first_name__regex=pattern)
-                    | Q(note__noteuser__user__last_name__regex=pattern)
-                    | Q(name__regex=pattern)
-                    | Q(normalized_name__regex=Alias.normalize(pattern)))) \
+            .filter(note__polymorphic_ctype__model="noteuser")\
             .filter(PermissionBackend.filter_queryset(self.request.user, Alias, "view"))
+        if pattern:
+            note_qs = note_qs.filter(
+                Q(note__noteuser__user__first_name__regex=pattern)
+                | Q(note__noteuser__user__last_name__regex=pattern)
+                | Q(name__regex=pattern)
+                | Q(normalized_name__regex=Alias.normalize(pattern))
+            )
+        else:
+            note_qs = note_qs.none()
+
         if settings.DATABASES[note_qs.db]["ENGINE"] == 'django.db.backends.postgresql_psycopg2':
             note_qs = note_qs.distinct('note__pk')[:20]
         else:
@@ -158,6 +167,7 @@ class ActivityEntryView(LoginRequiredMixin, TemplateView):
             # have distinct aliases rather than distinct notes with a SQLite DB, but it can fill the result page.
             # In production mode, please use PostgreSQL.
             note_qs = note_qs.distinct()[:20]
+
         for note in note_qs:
             note.type = "Adhérent"
             note.activity = activity
diff --git a/apps/member/forms.py b/apps/member/forms.py
index 50fa9c472428457dcee42ec4afff58b7cf8afb09..58285b792b179a5766aa3f42c13e202d7e6bdfaa 100644
--- a/apps/member/forms.py
+++ b/apps/member/forms.py
@@ -4,6 +4,7 @@
 from django import forms
 from django.contrib.auth.forms import AuthenticationForm
 from django.contrib.auth.models import User
+from django.forms import CheckboxSelectMultiple
 from django.utils.translation import gettext_lazy as _
 from note.models import NoteSpecial, Alias
 from note_kfet.inputs import Autocomplete, AmountInput, DatePickerInput
@@ -151,6 +152,7 @@ class MembershipRolesForm(forms.ModelForm):
     roles = forms.ModelMultipleChoiceField(
         queryset=Role.objects.filter(weirole=None).all(),
         label=_("Roles"),
+        widget=CheckboxSelectMultiple(),
     )
 
     class Meta:
diff --git a/apps/wei/forms/registration.py b/apps/wei/forms/registration.py
index 9ce3a35070aafaef888d33393238558d8bf20510..738db4e2c06ef159b5950b04f0b10d628c6d9c5b 100644
--- a/apps/wei/forms/registration.py
+++ b/apps/wei/forms/registration.py
@@ -4,6 +4,7 @@
 from django import forms
 from django.contrib.auth.models import User
 from django.db.models import Q
+from django.forms import CheckboxSelectMultiple
 from django.utils.translation import gettext_lazy as _
 from note_kfet.inputs import AmountInput, DatePickerInput, Autocomplete, ColorWidget
 
@@ -47,6 +48,7 @@ class WEIChooseBusForm(forms.Form):
         label=_("bus"),
         help_text=_("This choice is not definitive. The WEI organizers are free to attribute for you a bus and a team,"
                     + " in particular if you are a free eletron."),
+        widget=CheckboxSelectMultiple(),
     )
 
     team = forms.ModelMultipleChoiceField(
@@ -54,17 +56,24 @@ class WEIChooseBusForm(forms.Form):
         label=_("Team"),
         required=False,
         help_text=_("Leave this field empty if you won't be in a team (staff, bus chief, free electron)"),
+        widget=CheckboxSelectMultiple(),
     )
 
     roles = forms.ModelMultipleChoiceField(
         queryset=WEIRole.objects.filter(~Q(name="1A")),
         label=_("WEI Roles"),
         help_text=_("Select the roles that you are interested in."),
+        initial=WEIRole.objects.filter(name="Adhérent WEI").all(),
+        widget=CheckboxSelectMultiple(),
     )
 
 
 class WEIMembershipForm(forms.ModelForm):
-    roles = forms.ModelMultipleChoiceField(queryset=WEIRole.objects, label=_("WEI Roles"))
+    roles = forms.ModelMultipleChoiceField(
+        queryset=WEIRole.objects,
+        label=_("WEI Roles"),
+        widget=CheckboxSelectMultiple(),
+    )
 
     def clean(self):
         cleaned_data = super().clean()
diff --git a/apps/wei/views.py b/apps/wei/views.py
index fb0f7b320a492ffeca2dbdb0865e3fa8a4f8b6f1..8a95c72a18f7cce88c4a41b8afe0b09aa3da10c1 100644
--- a/apps/wei/views.py
+++ b/apps/wei/views.py
@@ -527,8 +527,9 @@ class WEIRegister2AView(ProtectQuerysetMixin, LoginRequiredMixin, CreateView):
             context["form"].fields["user"].disabled = True
 
         choose_bus_form = WEIChooseBusForm()
-        choose_bus_form.fields["bus"].queryset = Bus.objects.filter(wei=context["club"])
-        choose_bus_form.fields["team"].queryset = BusTeam.objects.filter(bus__wei=context["club"])
+        choose_bus_form.fields["bus"].queryset = Bus.objects.filter(wei=context["club"]).order_by('name')
+        choose_bus_form.fields["team"].queryset = BusTeam.objects.filter(bus__wei=context["club"])\
+            .order_by('bus__name', 'name')
         context['membership_form'] = choose_bus_form
 
         return context
diff --git a/templates/wei/weiregistration_form.html b/templates/wei/weiregistration_form.html
index 86aea555d094af848868acc5e7cb40412808d5dc..9cf507c8ba6349d6eb4aa562f4abe8d3fa1443aa 100644
--- a/templates/wei/weiregistration_form.html
+++ b/templates/wei/weiregistration_form.html
@@ -14,3 +14,29 @@
         <button class="btn btn-primary" type="submit">{% trans "Submit" %}</button>
     </form>
 {% endblock %}
+
+{% block extrajavascript %}
+    <script>
+    $(document).ready(function() {
+        function refreshTeams() {
+            let buses = [];
+            $("input[name='bus']:checked").each(function(ignored) {
+                buses.push($(this).parent().text().trim());
+            });
+            console.log(buses);
+            $("input[name='team']").each(function() {
+                let label = $(this).parent();
+                $(this).parent().addClass('d-none');
+                buses.forEach(function(bus) {
+                    if (label.text().includes(bus))
+                        label.removeClass('d-none');
+                });
+            });
+        }
+
+        $("input[name='bus']").change(refreshTeams);
+
+        refreshTeams();
+    });
+    </script>
+{% endblock %}