diff --git a/apps/note/tables.py b/apps/note/tables.py
index 496ae335f24d2a280869b2c1634c91a99cb6ebe2..9309e14ce924e5708183d5b7233b43ccd95a753d 100644
--- a/apps/note/tables.py
+++ b/apps/note/tables.py
@@ -1,6 +1,8 @@
 # Copyright (C) 2018-2020 by BDE ENS Paris-Saclay
 # SPDX-License-Identifier: GPL-3.0-or-later
 
+import html
+
 import django_tables2 as tables
 from django.db.models import F
 from django_tables2.utils import A
@@ -19,23 +21,38 @@ class HistoryTable(tables.Table):
         model = Transaction
         exclude = ("id", "polymorphic_ctype", )
         template_name = 'django_tables2/bootstrap4.html'
-        sequence = ('...', 'total', 'valid')
+        sequence = ('...', 'total', 'valid', )
+        orderable = False
 
     total = tables.Column()  # will use Transaction.total() !!
 
+    valid = tables.Column(attrs={"td": {"id": lambda record: "validate_" + str(record.id),
+                                        "class": lambda record: str(record.valid).lower() + ' validate'}})
+
     def order_total(self, queryset, is_descending):
         # needed for rendering
         queryset = queryset.annotate(total=F('amount') * F('quantity')) \
             .order_by(('-' if is_descending else '') + 'total')
-        return (queryset, True)
+        return queryset, True
+
 
     def render_amount(self, value):
         return pretty_money(value)
 
+
     def render_total(self, value):
         return pretty_money(value)
 
 
+    # Django-tables escape strings. That's a wrong thing.
+    def render_reason(self, value):
+        return html.unescape(value)
+
+
+    def render_valid(self, value):
+        return "✔" if value else "✖"
+
+
 class AliasTable(tables.Table):
     class Meta:
         attrs = {
diff --git a/static/js/base.js b/static/js/base.js
index 87ab0eb3f19a941d791c5314b1ebcef30c1a21f6..cca6e41c431abc2becfba0b32c81d0ac6496c30c 100644
--- a/static/js/base.js
+++ b/static/js/base.js
@@ -139,7 +139,7 @@ function autoCompleteNote(field_id, alias_matched_id, note_list_id, notes, notes
 
         let pattern = field.val();
         // If the pattern is not modified, we don't query the API
-        if (pattern === old_pattern)
+        if (pattern === old_pattern || pattern === "")
             return;
 
         old_pattern = pattern;
@@ -150,11 +150,6 @@ function autoCompleteNote(field_id, alias_matched_id, note_list_id, notes, notes
         let aliases_matched_obj = $("#" + alias_matched_id);
         let aliases_matched_html = "";
 
-        if (pattern === "") {
-            aliases_matched_obj.html("");
-            return;
-        }
-
         // Get matched notes with the given pattern
         getMatchedNotes(pattern, function(aliases) {
             // The response arrived too late, we stop the request
diff --git a/templates/note/conso_form.html b/templates/note/conso_form.html
index 100f46c2c5aa42f0d4e457dec67d8ef7eea1a2cc..a007cecfc09722f26e5d453d71e51cccfe8a9b8b 100644
--- a/templates/note/conso_form.html
+++ b/templates/note/conso_form.html
@@ -133,9 +133,9 @@
 
 {% block extracss %}
     <style>
-        .select2-container{
-            max-width: 100%;
-            min-width: 100%;
+        .validate:hover {
+            cursor: pointer;
+            text-decoration: underline;
         }
     </style>
 {% endblock %}
@@ -143,6 +143,7 @@
 {% block extrajavascript %}
     <script type="text/javascript" src="/static/js/consos.js"></script>
     <script type="text/javascript">
+        // Switching in double consumptions mode should update the layout
         $("#double_conso").click(function() {
             $("#consos_list_div").show();
             $("#infos_div").attr('class', 'col-sm-5 col-xl-6');
@@ -190,5 +191,28 @@
                 });
             {% endif %}
         {% endfor %}
+
+        // When we click on the validate button, the validation status is switched
+        $(".validate").click(function(e) {
+            let id = e.target.id.substring(9);
+            let validated = e.target.classList.contains("true");
+
+            // Perform a PATCH request to the API in order to update the transaction
+            // If the user has insuffisent rights, an error message will appear
+            // TODO: Add this error message
+            $.ajax({
+                "url": "/api/note/transaction/transaction/" + id + "/",
+                type: "PATCH",
+                dataType: "json",
+                headers: {
+                    "X-CSRFTOKEN": CSRF_TOKEN
+                },
+                data: {
+                    "resourcetype": "TemplateTransaction",
+                    valid: !validated
+                },
+                success: refreshHistory
+            });
+        });
     </script>
 {% endblock %}