diff --git a/apps/activity/tables.py b/apps/activity/tables.py
index 44939bc455d4632ab8f61dd99f66d45791696253..95f43e51263f568396f51f8e6bfc22da1f4f4a71 100644
--- a/apps/activity/tables.py
+++ b/apps/activity/tables.py
@@ -2,19 +2,17 @@
 # SPDX-License-Identifier: GPL-3.0-or-later
 
 from django.utils.translation import gettext_lazy as _
-from django_tables2 import tables, A
+import django_tables2 as tables
+from django_tables2 import A
 
 from .models import Activity, Guest
 
 
 class ActivityTable(tables.Table):
-    name = tables.columns.LinkColumn('activity:activity_detail',
-                                     args=[A('pk'), ],)
-
-    invite = tables.columns.LinkColumn('activity:activity_invite',
-                                       args=[A('pk'), ],
-                                       verbose_name=_("Invite"),
-                                       text=_("Invite"),)
+    name = tables.LinkColumn(
+        'activity:activity_detail',
+        args=[A('pk'), ],
+    )
 
     class Meta:
         attrs = {
@@ -22,19 +20,34 @@ class ActivityTable(tables.Table):
         }
         model = Activity
         template_name = 'django_tables2/bootstrap4.html'
-        fields = ('name', 'activity_type', 'organizer', 'attendees_club', 'date_start', 'date_end', 'invite', )
+        fields = ('name', 'activity_type', 'organizer', 'attendees_club', 'date_start', 'date_end', )
 
 
 class GuestTable(tables.Table):
+    inviter = tables.LinkColumn(
+        'member:user_detail',
+        args=[A('inviter.user.pk'), ],
+    )
+
+    entry = tables.Column(
+        empty_values=(),
+        attrs={
+            "td": {
+                "class": lambda record: "" if record.entry else "validate btn btn-danger",
+                "onclick": lambda record: "" if record.entry else "remove_guest(" + str(record.pk) + ")"
+            }
+        }
+    )
+
     class Meta:
         attrs = {
             'class': 'table table-condensed table-striped table-hover'
         }
         model = Guest
         template_name = 'django_tables2/bootstrap4.html'
-        fields = ('name', 'inviter', )
-        row_attrs = {
-            'class': 'table-row',
-            'id': lambda record: "row-" + str(record.pk),
-            'data-href': lambda record: record.pk
-        }
+        fields = ("last_name", "first_name", "inviter", )
+
+    def render_entry(self, record):
+        if record.entry:
+            return str(record.date)
+        return _("remove").capitalize()
diff --git a/apps/activity/views.py b/apps/activity/views.py
index 952ea59ccf2311931d638e0751dc5de0bf114dad..38e487e0f446212119f27a8277457d8103d94fc3 100644
--- a/apps/activity/views.py
+++ b/apps/activity/views.py
@@ -7,15 +7,18 @@ from django.views.generic import CreateView, DetailView, UpdateView, TemplateVie
 from django.utils.translation import gettext_lazy as _
 from django_tables2.views import SingleTableView
 
+from permission.backends import PermissionBackend
 from .forms import ActivityForm, GuestForm
 from .models import Activity, Guest
-from .tables import ActivityTable
+from .tables import ActivityTable, GuestTable
 
 
 class ActivityCreateView(LoginRequiredMixin, CreateView):
     model = Activity
     form_class = ActivityForm
-    success_url = reverse_lazy('activity:activity_list')
+
+    def get_success_url(self, **kwargs):
+        return reverse_lazy('activity:activity_detail', kwargs={"pk": self.kwargs["pk"]})
 
 
 class ActivityListView(LoginRequiredMixin, SingleTableView):
@@ -34,11 +37,22 @@ class ActivityDetailView(LoginRequiredMixin, DetailView):
     model = Activity
     context_object_name = "activity"
 
+    def get_context_data(self, **kwargs):
+        ctx = super().get_context_data()
+
+        table = GuestTable(data=Guest.objects.filter(activity=self.object)
+                           .filter(PermissionBackend.filter_queryset(self.request.user, Guest, "view")))
+        ctx["guests"] = table
+
+        return ctx
+
 
 class ActivityUpdateView(LoginRequiredMixin, UpdateView):
     model = Activity
     form_class = ActivityForm
-    success_url = reverse_lazy('activity:activity_list')
+
+    def get_success_url(self, **kwargs):
+        return reverse_lazy('activity:activity_detail', kwargs={"pk": self.kwargs["pk"]})
 
 
 class ActivityInviteView(LoginRequiredMixin, CreateView):
diff --git a/apps/permission/templatetags/perms.py b/apps/permission/templatetags/perms.py
index 8bcd359794f1721f84b133c9a3a2402ac788bcb9..f1ecfacb71fbf62c1356f377550f9d62d5482725 100644
--- a/apps/permission/templatetags/perms.py
+++ b/apps/permission/templatetags/perms.py
@@ -48,6 +48,13 @@ def not_empty_model_change_list(model_name):
     return session.get("not_empty_model_change_list_" + model_name) == 1
 
 
+def has_perm(t, obj, field=None):
+    print(t)
+    perm = "." + t + ("__" + field if field else "_")
+    return PermissionBackend().has_perm(get_current_authenticated_user(), perm, obj)
+
+
 register = template.Library()
 register.filter('not_empty_model_list', not_empty_model_list)
 register.filter('not_empty_model_change_list', not_empty_model_change_list)
+register.filter('has_perm', has_perm)
diff --git a/templates/activity/activity_detail.html b/templates/activity/activity_detail.html
index bd946643ebedd9adb29e1b57d443e50b156fb949..339d087bc7b55cb24d7e6e55146e098f5f0a8a21 100644
--- a/templates/activity/activity_detail.html
+++ b/templates/activity/activity_detail.html
@@ -3,48 +3,79 @@
 {% load i18n %}
 {% load render_table from django_tables2 %}
 {% load pretty_money %}
+{% load perms %}
 
 {% block content %}
 
-<div class="card bg-light shadow">
-    <div class="card-header text-center">
-        <h4>{{ activity.name }}</h4>
-    </div>
-    <div class="card-body" id="profile_infos">
-        <dl class="row">
-            <dt class="col-xl-6">{% trans 'description'|capfirst %}</dt>
-            <dd class="col-xl-6"> {{ activity.description }}</dd>
+    <div class="card bg-light shadow">
+        <div class="card-header text-center">
+            <h4>{{ activity.name }}</h4>
+        </div>
+        <div class="card-body" id="profile_infos">
+            <dl class="row">
+                <dt class="col-xl-6">{% trans 'description'|capfirst %}</dt>
+                <dd class="col-xl-6"> {{ activity.description }}</dd>
+
+                <dt class="col-xl-6">{% trans 'type'|capfirst %}</dt>
+                <dd class="col-xl-6"> {{ activity.activity_type }}</dd>
 
-            <dt class="col-xl-6">{% trans 'type'|capfirst %}</dt>
-            <dd class="col-xl-6"> {{ activity.activity_type }}</dd>
+                <dt class="col-xl-6">{% trans 'start date'|capfirst %}</dt>
+                <dd class="col-xl-6">{{ activity.date_start }}</dd>
 
-            <dt class="col-xl-6">{% trans 'start date'|capfirst %}</dt>
-            <dd class="col-xl-6">{{ activity.date_start }}</dd>
+                <dt class="col-xl-6">{% trans 'end date'|capfirst %}</dt>
+                <dd class="col-xl-6">{{ activity.date_end }}</dd>
 
-            <dt class="col-xl-6">{% trans 'end date'|capfirst %}</dt>
-            <dd class="col-xl-6">{{ activity.date_end }}</dd>
+                <dt class="col-xl-6">{% trans 'organizer'|capfirst %}</dt>
+                <dd class="col-xl-6"><a href="{% url "member:club_detail" pk=activity.organizer.pk %}">{{ activity.organizer }}</a></dd>
 
-            <dt class="col-xl-6">{% trans 'organizer'|capfirst %}</dt>
-            <dd class="col-xl-6"><a href="{% url "member:club_detail" pk=activity.organizer.pk %}">{{ activity.organizer }}</a></dd>
+                <dt class="col-xl-6">{% trans 'attendees club'|capfirst %}</dt>
+                <dd class="col-xl-6"><a href="{% url "member:club_detail" pk=activity.attendees_club.pk %}">{{ activity.attendees_club }}</a></dd>
 
-            <dt class="col-xl-6">{% trans 'attendees club'|capfirst %}</dt>
-            <dd class="col-xl-6"><a href="{% url "member:club_detail" pk=activity.attendees_club.pk %}">{{ activity.attendees_club }}</a></dd>
+                <dt class="col-xl-6">{% trans 'can invite'|capfirst %}</dt>
+                <dd class="col-xl-6">{{ activity.activity_type.can_invite|yesno }}</dd>
 
-            <dt class="col-xl-6">{% trans 'can invite'|capfirst %}</dt>
-            <dd class="col-xl-6">{{ activity.activity_type.can_invite|yesno }}</dd>
+                {% if activity.activity_type.can_invite %}
+                    <dt class="col-xl-6">{% trans 'guest entry fee'|capfirst %}</dt>
+                    <dd class="col-xl-6">{{ activity.activity_type.guest_entry_fee|pretty_money }}</dd>
+                {% endif %}
+            </dl>
+        </div>
 
+        <div class="card-footer text-center">
+            {% if "view"|has_perm:activity %}
+                <a class="btn btn-primary btn-sm my-1" href="{% url 'activity:activity_update' pk=activity.pk %}"> {% trans "edit"|capfirst %}</a>
+            {% endif %}
             {% if activity.activity_type.can_invite %}
-                <dt class="col-xl-6">{% trans 'guest entry fee'|capfirst %}</dt>
-                <dd class="col-xl-6">{{ activity.activity_type.guest_entry_fee|pretty_money }}</dd>
+                <a class="btn btn-primary btn-sm my-1" href="{% url 'activity:activity_invite' pk=activity.pk %}"> {% trans "Invite" %}</a>
             {% endif %}
-        </dl>
+        </div>
     </div>
 
-    <div class="card-footer text-center">
-        {% if activity.activity_type.can_invite %}
-            <a class="btn btn-primary btn-sm my-1" href="{% url 'activity:activity_invite' pk=activity.pk %}"> {% trans "Invite" %}</a>
-        {% endif %}
-    </div>
-</div>
+    {% if guests.data %}
+        <hr>
+        <h2>{% trans "Guests list" %}</h2>
+        <div id="guests_table">
+            {% render_table guests %}
+        </div>
+    {% endif %}
+
+{% endblock %}
 
+{% block extrajavascript %}
+<script>
+    function remove_guest(guest_id) {
+        $.ajax({
+         url:"/api/activity/guest/" + guest_id + "/",
+         method:"DELETE",
+         headers: {"X-CSRFTOKEN": CSRF_TOKEN}
+     })
+      .done(function() {
+          addMsg('Invité supprimé','success');
+          $("#guests_table").load(location.href + " #guests_table");
+      })
+      .fail(function(xhr, textStatus, error) {
+          errMsg(xhr.responseJSON);
+      });
+    }
+</script>
 {% endblock %}