diff --git a/apps/note/forms.py b/apps/note/forms.py
index 15cccf2e6d4c6de632d6f8228de6926edf754d96..3222acec14b18adc92dd7d170319c9dfb52a599c 100644
--- a/apps/note/forms.py
+++ b/apps/note/forms.py
@@ -3,6 +3,7 @@
 
 from dal import autocomplete
 from django import forms
+from django.utils.translation import gettext_lazy as _
 
 from .models import Transaction, TransactionTemplate, TemplateTransaction
 
@@ -33,6 +34,23 @@ class TransactionForm(forms.ModelForm):
     def save(self, commit=True):
         super().save(commit)
 
+
+    def clean(self):
+        """
+        If the user has no right to transfer funds, then it will be the source of the transfer by default.
+        Transactions between a note and the same note are not authorized.
+        """
+
+        cleaned_data = super().clean()
+        if not "source" in cleaned_data: # TODO Replace it with "if %user has no right to transfer funds"
+            cleaned_data["source"] = self.user.note
+
+        if cleaned_data["source"].pk == cleaned_data["destination"].pk:
+            self.add_error("destination", _("Source and destination must be different."))
+
+        return cleaned_data
+
+
     class Meta:
         model = Transaction
         fields = (
diff --git a/apps/note/models/transactions.py b/apps/note/models/transactions.py
index 49fc44b4bc44070cce44c72f55edb4dc90b1b9f4..598c119bc5e441413aaeefd2b5ddda4a004721b9 100644
--- a/apps/note/models/transactions.py
+++ b/apps/note/models/transactions.py
@@ -84,8 +84,6 @@ class Transaction(PolymorphicModel):
 
     amount is store in centimes of currency, making it a  positive integer
     value. (from someone to someone else)
-
-    TODO: Ensure source != destination.
     """
 
     source = models.ForeignKey(
@@ -126,6 +124,11 @@ class Transaction(PolymorphicModel):
         """
         When saving, also transfer money between two notes
         """
+
+        if self.source.pk == self.destination.pk:
+            # When source == destination, no money is transfered
+            return
+
         created = self.pk is None
         to_transfer = self.amount * self.quantity
         if not created:
diff --git a/apps/note/views.py b/apps/note/views.py
index 75577a2e3ced39bbd28b165b5b5d3f6438d4552c..5038df164c02555fa4b7083953537f38eaac1fdd 100644
--- a/apps/note/views.py
+++ b/apps/note/views.py
@@ -41,17 +41,12 @@ class TransactionCreate(LoginRequiredMixin, CreateView):
 
         if False:  # TODO: fix it with "if %user has no right to transfer funds"
             del form.fields['source']
+            form.user = self.request.user
 
         return form
 
-    def form_valid(self, form):
-        """
-        If the user has no right to transfer funds, then it will be the source of the transfer by default.
-        """
-        if False:  # TODO: fix it with "if %user has no right to transfer funds"
-            form.instance.source = self.request.user.note
-
-        return super().form_valid(form)
+    def get_success_url(self):
+        return reverse('note:transfer')
 
 
 class NoteAutocomplete(autocomplete.Select2QuerySetView):