diff --git a/apps/member/models.py b/apps/member/models.py
index 883f9b4956ab78b31a3d8cb4b628efe465b9d8b6..35b7027c5704e6ff5474370996dd4e3c23dccd93 100644
--- a/apps/member/models.py
+++ b/apps/member/models.py
@@ -118,6 +118,9 @@ class Role(models.Model):
         verbose_name = _('role')
         verbose_name_plural = _('roles')
 
+    def __str__(self):
+        return str(self.name)
+
 
 class Membership(models.Model):
     """
diff --git a/apps/note/admin.py b/apps/note/admin.py
index 298b91c052294d5a3a1b7a64d4fc6637adefb631..0b2461d02e0818eb63ecaa6a109d281952b451e1 100644
--- a/apps/note/admin.py
+++ b/apps/note/admin.py
@@ -8,7 +8,7 @@ from polymorphic.admin import PolymorphicChildModelAdmin, \
     PolymorphicChildModelFilter, PolymorphicParentModelAdmin
 
 from .models.notes import Alias, Note, NoteClub, NoteSpecial, NoteUser
-from .models.transactions import Transaction, TransactionTemplate
+from .models.transactions import Transaction, TransactionCategory, TransactionTemplate
 
 
 class AliasInlines(admin.TabularInline):
@@ -146,3 +146,12 @@ class TransactionTemplateAdmin(admin.ModelAdmin):
         return str(obj.destination)
 
     poly_destination.short_description = _('destination')
+
+
+@admin.register(TransactionCategory)
+class TransactionCategoryAdmin(admin.ModelAdmin):
+    """
+    Admin customisation for TransactionTemplate
+    """
+    list_display = ('name',)
+    list_filter = ('name',)
diff --git a/apps/note/forms.py b/apps/note/forms.py
index d74fa5b4db8572da1e29fdad542f4796b8b3acce..d861345b4e83bc50f15496563eeafba539ddfa96 100644
--- a/apps/note/forms.py
+++ b/apps/note/forms.py
@@ -1,9 +1,22 @@
 #!/usr/bin/env python
 
 from django import forms
-from .models import TransactionTemplate
+from .models import TransactionTemplate, Transaction
 
 class TransactionTemplateForm(forms.ModelForm):
     class Meta:
         model = TransactionTemplate
         fields ='__all__'
+
+class ConsoForm(forms.ModelForm):
+    def save(self, commit=True):
+        button: TransactionTemplate = TransactionTemplate.objects.filter(name=self.data['button']).get()
+        self.instance.destination = button.destination
+        self.instance.amount = button.amount
+        self.instance.transaction_type = 'bouton'
+        self.instance.reason = button.name
+        super().save(commit)
+
+    class Meta:
+        model = Transaction
+        fields = ('source',)
diff --git a/apps/note/models/__init__.py b/apps/note/models/__init__.py
index b00572ce4a83a36d03791895e0a9ca33fc2b6644..ee290bb59bb5d675a3f53bc1803c2fb849cb030e 100644
--- a/apps/note/models/__init__.py
+++ b/apps/note/models/__init__.py
@@ -4,11 +4,11 @@
 
 from .notes import Alias, Note, NoteClub, NoteSpecial, NoteUser
 from .transactions import MembershipTransaction, Transaction, \
-    TransactionTemplate
+    TransactionCategory, TransactionTemplate
 
 __all__ = [
     # Notes
     'Alias', 'Note', 'NoteClub', 'NoteSpecial', 'NoteUser',
     # Transactions
-    'MembershipTransaction', 'Transaction', 'TransactionTemplate',
+    'MembershipTransaction', 'Transaction', 'TransactionCategory', 'TransactionTemplate',
 ]
diff --git a/apps/note/models/transactions.py b/apps/note/models/transactions.py
index 4ce23311cd31d62a27a20fee70720bf71074576d..5c2422553dd9be4d66c320ae56d5237828da7ee2 100644
--- a/apps/note/models/transactions.py
+++ b/apps/note/models/transactions.py
@@ -13,10 +13,28 @@ from .notes import Note,NoteClub
 Defines transactions
 """
 
+class TransactionCategory(models.Model):
+    """
+    Defined a recurrent transaction category
+
+    Example: food, softs, ...
+    """
+    name = models.CharField(
+        verbose_name=_("name"),
+        max_length=31,
+        unique=True,
+    )
+
+    class Meta:
+        verbose_name = _("transaction category")
+        verbose_name_plural = _("transaction categories")
+
+    def __str__(self):
+        return str(self.name)
 
 class TransactionTemplate(models.Model):
     """
-    Defined a reccurent transaction
+    Defined a recurrent transaction
 
     associated to selling something (a burger, a beer, ...)
     """
@@ -35,7 +53,9 @@ class TransactionTemplate(models.Model):
         verbose_name=_('amount'),
         help_text=_('in centimes'),
     )
-    template_type = models.CharField(
+    template_type = models.ForeignKey(
+        TransactionCategory,
+        on_delete=models.PROTECT,
         verbose_name=_('type'),
         max_length=31
     )
diff --git a/apps/note/urls.py b/apps/note/urls.py
index 5e423d465b6339124063fe1f59e28e93f96d2f4a..59bb4672d48a17bf17148acf0b22611803a37198 100644
--- a/apps/note/urls.py
+++ b/apps/note/urls.py
@@ -11,5 +11,7 @@ urlpatterns = [
     path('transfer/', views.TransactionCreate.as_view(), name='transfer'),
     path('buttons/create/',views.TransactionTemplateCreateView.as_view(),name='template_create'),
     path('buttons/update/<int:pk>/',views.TransactionTemplateUpdateView.as_view(),name='template_update'),
-    path('buttons/',views.TransactionTemplateListView.as_view(),name='template_list')
+    path('buttons/',views.TransactionTemplateListView.as_view(),name='template_list'),
+    path('consos/<str:template_type>/',views.ConsoView.as_view(),name='consos'),
+    path('consos/',views.ConsoView.as_view(),name='consos'),
 ]
diff --git a/apps/note/views.py b/apps/note/views.py
index 08f4f63093a89226a6d3548b9ee7e9399449dacc..ce27832c3492fdae360a7117c26757bf8f342aba 100644
--- a/apps/note/views.py
+++ b/apps/note/views.py
@@ -3,11 +3,12 @@
 # SPDX-License-Identifier: GPL-3.0-or-later
 
 from django.contrib.auth.mixins import LoginRequiredMixin
+from django.urls import reverse_lazy, reverse
 from django.utils.translation import gettext_lazy as _
 from django.views.generic import CreateView, ListView, DetailView, UpdateView
 
-from .models import Transaction,TransactionTemplate
-from .forms import TransactionTemplateForm
+from .models import Transaction,TransactionCategory,TransactionTemplate
+from .forms import TransactionTemplateForm, ConsoForm
 
 class TransactionCreate(LoginRequiredMixin, CreateView):
     """
@@ -45,4 +46,31 @@ class TransactionTemplateUpdateView(LoginRequiredMixin,UpdateView):
     """
     """
     model = TransactionTemplate
-    form_class=TransactionTemplateForm
+    form_class = TransactionTemplateForm
+
+class ConsoView(LoginRequiredMixin,CreateView):
+    """
+    Consume
+    """
+    model = Transaction
+    template_name = "note/conso_form.html"
+    form_class = ConsoForm
+
+    def get_context_data(self, **kwargs):
+        """
+        Add some context variables in template such as page title
+        """
+        context = super().get_context_data(**kwargs)
+        context['template_types'] = TransactionCategory.objects.all()
+
+        if 'template_type' not in self.kwargs.keys():
+            return context
+
+        template_type = TransactionCategory.objects.filter(name=self.kwargs.get('template_type')).get()
+        context['buttons'] = TransactionTemplate.objects.filter(template_type=template_type)
+        context['title'] = template_type
+
+        return context
+
+    def get_success_url(self):
+        return reverse('note:consos',args=(self.kwargs.get('template_type'),))
diff --git a/templates/base.html b/templates/base.html
index 5c85759319fc558902ee0b6364afbdf51337e959..96f56881bc660192eec6a81eb4da93f4b3812efd 100644
--- a/templates/base.html
+++ b/templates/base.html
@@ -46,7 +46,7 @@ SPDX-License-Identifier: GPL-3.0-or-later
         <div class="collapse navbar-collapse" id="navbarNavDropdown">
             <ul class="navbar-nav">
                 <li class="nav-item active">
-                    <a class="nav-link" href="#"><i class="fa fa-coffee"></i> Consos</a>
+                    <a class="nav-link" href="{% url 'note:consos' %}"><i class="fa fa-coffee"></i> Consos</a>
                 </li>
                 <li class="nav-item active">
                     <a class="nav-link" href="{% url 'member:club_list' %}"><i class="fa fa-users"></i> Clubs</a>
diff --git a/templates/note/conso_form.html b/templates/note/conso_form.html
new file mode 100644
index 0000000000000000000000000000000000000000..e2106f1794c41d65c42c438df6fa4771c73057b2
--- /dev/null
+++ b/templates/note/conso_form.html
@@ -0,0 +1,41 @@
+{% extends "base.html" %}
+
+{% load i18n static pretty_money %}
+
+{% block content %}
+    <fieldset class="module aligned">
+        {% for type in template_types %}
+            <a href="{% url 'note:consos' template_type=type %}"><button>{{ type }}</button></a>
+        {% endfor %}
+    </fieldset>
+    <form method="post" onsubmit="window.onbeforeunload=null">{% csrf_token %}
+        {% if form.non_field_errors %}
+            <p class="errornote">
+                {% for error in form.non_field_errors %}
+                    {{ error }}
+                {% endfor %}
+            </p>
+        {% endif %}
+        <fieldset class="module aligned">
+            {% for field in form %}
+                <div class="form-row{% if field.errors %} errors{% endif %}">
+                    {{ field.errors }}
+                    <div>
+                        {{ field.label_tag }}
+                        {% if field.is_readonly %}
+                            <div class="readonly">{{ field.contents }}</div>
+                        {% else %}
+                            {{ field }}
+                        {% endif %}
+                        {% if field.field.help_text %}
+                            <div class="help">{{ field.field.help_text|safe }}</div>
+                        {% endif %}
+                    </div>
+                </div>
+            {% endfor %}
+            {% for button in buttons %}
+                <button name="button" value="{{ button.name }}">{{ button.name }} ({{ button.amount | pretty_money }})</button>
+            {% endfor %}
+        </fieldset>
+    </form>
+{% endblock %}