diff --git a/CHANGELOG b/CHANGELOG
index 5ab83783414da7898b33afe3bf0d3adea63f62d5..444d6f19a146895fc9a4c60e833cf199122ac3f6 100644
--- a/CHANGELOG
+++ b/CHANGELOG
@@ -8,6 +8,7 @@ Changelog
 Features:
 
 - Models: now store relese group mbid on Album model (#7)
+- Models: now bind import job to track files (#44)
 
 Bugfixes:
 
diff --git a/api/config/settings/common.py b/api/config/settings/common.py
index 0fa7bbe59940704b8af522e172a863a5cf5af48f..b10a0310c162a1b94df427de5b17ea2f2d5b56d8 100644
--- a/api/config/settings/common.py
+++ b/api/config/settings/common.py
@@ -336,3 +336,4 @@ CACHALOT_ENABLED = env.bool('CACHALOT_ENABLED', default=True)
 
 # Custom Admin URL, use {% url 'admin:index' %}
 ADMIN_URL = env('DJANGO_ADMIN_URL', default='^api/admin/')
+CSRF_USE_SESSIONS = True
diff --git a/api/funkwhale_api/contrib/sites/migrations/0003_auto_20171214_2205.py b/api/funkwhale_api/contrib/sites/migrations/0003_auto_20171214_2205.py
new file mode 100644
index 0000000000000000000000000000000000000000..14a9ec1a8a49ded7ec0458db9f8a9a2f6388dbe5
--- /dev/null
+++ b/api/funkwhale_api/contrib/sites/migrations/0003_auto_20171214_2205.py
@@ -0,0 +1,27 @@
+# -*- coding: utf-8 -*-
+# Generated by Django 1.11 on 2017-12-14 22:05
+from __future__ import unicode_literals
+
+import django.contrib.sites.models
+from django.db import migrations, models
+
+
+class Migration(migrations.Migration):
+
+    dependencies = [
+        ('sites', '0002_set_site_domain_and_name'),
+    ]
+
+    operations = [
+        migrations.AlterModelManagers(
+            name='site',
+            managers=[
+                ('objects', django.contrib.sites.models.SiteManager()),
+            ],
+        ),
+        migrations.AlterField(
+            model_name='site',
+            name='domain',
+            field=models.CharField(max_length=100, unique=True, validators=[django.contrib.sites.models._simple_domain_name_validator], verbose_name='domain name'),
+        ),
+    ]
diff --git a/api/funkwhale_api/music/admin.py b/api/funkwhale_api/music/admin.py
index a6a7f94f3b90abae353bc85f2a51734db6a31edb..524b85386a6c4b41482d2733719757b2fdb18dbf 100644
--- a/api/funkwhale_api/music/admin.py
+++ b/api/funkwhale_api/music/admin.py
@@ -2,30 +2,35 @@ from django.contrib import admin
 
 from . import models
 
+
 @admin.register(models.Artist)
 class ArtistAdmin(admin.ModelAdmin):
     list_display = ['name', 'mbid', 'creation_date']
     search_fields = ['name', 'mbid']
 
+
 @admin.register(models.Album)
 class AlbumAdmin(admin.ModelAdmin):
     list_display = ['title', 'artist', 'mbid', 'release_date', 'creation_date']
     search_fields = ['title', 'artist__name', 'mbid']
     list_select_related = True
 
+
 @admin.register(models.Track)
 class TrackAdmin(admin.ModelAdmin):
     list_display = ['title', 'artist', 'album', 'mbid']
     search_fields = ['title', 'artist__name', 'album__title', 'mbid']
     list_select_related = True
 
+
 @admin.register(models.ImportBatch)
 class ImportBatchAdmin(admin.ModelAdmin):
     list_display = ['creation_date', 'status']
 
+
 @admin.register(models.ImportJob)
 class ImportJobAdmin(admin.ModelAdmin):
-    list_display = ['source', 'batch', 'status', 'mbid']
+    list_display = ['source', 'batch', 'track_file', 'status', 'mbid']
     list_select_related = True
     search_fields = ['source', 'batch__pk', 'mbid']
     list_filter = ['status']
diff --git a/api/funkwhale_api/music/migrations/0014_importjob_track_file.py b/api/funkwhale_api/music/migrations/0014_importjob_track_file.py
new file mode 100644
index 0000000000000000000000000000000000000000..6950fd3c1d55d0f5352d04cf217068d30b127381
--- /dev/null
+++ b/api/funkwhale_api/music/migrations/0014_importjob_track_file.py
@@ -0,0 +1,21 @@
+# -*- coding: utf-8 -*-
+# Generated by Django 1.11 on 2017-12-14 21:14
+from __future__ import unicode_literals
+
+from django.db import migrations, models
+import django.db.models.deletion
+
+
+class Migration(migrations.Migration):
+
+    dependencies = [
+        ('music', '0013_auto_20171213_2211'),
+    ]
+
+    operations = [
+        migrations.AddField(
+            model_name='importjob',
+            name='track_file',
+            field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='jobs', to='music.TrackFile'),
+        ),
+    ]
diff --git a/api/funkwhale_api/music/migrations/0015_bind_track_file_to_import_job.py b/api/funkwhale_api/music/migrations/0015_bind_track_file_to_import_job.py
new file mode 100644
index 0000000000000000000000000000000000000000..edb5e6470dc87de3c282ea362d1e247adb7c75cd
--- /dev/null
+++ b/api/funkwhale_api/music/migrations/0015_bind_track_file_to_import_job.py
@@ -0,0 +1,34 @@
+# -*- coding: utf-8 -*-
+from __future__ import unicode_literals
+import os
+
+from django.db import migrations, models
+from funkwhale_api.common.utils import rename_file
+
+
+def bind_jobs(apps, schema_editor):
+    TrackFile = apps.get_model("music", "TrackFile")
+    ImportJob = apps.get_model("music", "ImportJob")
+
+    for job in ImportJob.objects.all().only('mbid'):
+        f = TrackFile.objects.filter(track__mbid=job.mbid).first()
+        if not f:
+            print('No file for mbid {}'.format(job.mbid))
+            continue
+        job.track_file = f
+        job.save(update_fields=['track_file'])
+
+
+def rewind(apps, schema_editor):
+    pass
+
+
+class Migration(migrations.Migration):
+
+    dependencies = [
+        ('music', '0014_importjob_track_file'),
+    ]
+
+    operations = [
+        migrations.RunPython(bind_jobs, rewind),
+    ]
diff --git a/api/funkwhale_api/music/models.py b/api/funkwhale_api/music/models.py
index d87da1eb7cb4b8a59dbb45dd195d660ba2230655..95a47fd4a7ac6fabe2cd842d6ed2d9994e26b1bd 100644
--- a/api/funkwhale_api/music/models.py
+++ b/api/funkwhale_api/music/models.py
@@ -393,6 +393,8 @@ class ImportBatch(models.Model):
 
 class ImportJob(models.Model):
     batch = models.ForeignKey(ImportBatch, related_name='jobs')
+    track_file = models.ForeignKey(
+        TrackFile, related_name='jobs', null=True, blank=True)
     source = models.URLField()
     mbid = models.UUIDField(editable=False)
     STATUS_CHOICES = (
@@ -413,10 +415,12 @@ class ImportJob(models.Model):
             elif track.files.count() > 0:
                 return
 
-            track_file = track_file or TrackFile(track=track, source=self.source)
+            track_file = track_file or TrackFile(
+                track=track, source=self.source)
             track_file.download_file()
             track_file.save()
             self.status = 'finished'
+            self.track_file = track_file
             self.save()
             return track.pk
 
diff --git a/api/funkwhale_api/music/serializers.py b/api/funkwhale_api/music/serializers.py
index 744115f866ff43137be1b61cf47671fec4f414ae..43daf9d5a19404309b3ccf1f85e2e4c4713a9840 100644
--- a/api/funkwhale_api/music/serializers.py
+++ b/api/funkwhale_api/music/serializers.py
@@ -9,35 +9,26 @@ class TagSerializer(serializers.ModelSerializer):
         model = Tag
         fields = ('id', 'name', 'slug')
 
+
 class SimpleArtistSerializer(serializers.ModelSerializer):
     class Meta:
         model = models.Artist
         fields = ('id', 'mbid', 'name')
 
+
 class ArtistSerializer(serializers.ModelSerializer):
     tags = TagSerializer(many=True, read_only=True)
     class Meta:
         model = models.Artist
         fields = ('id', 'mbid', 'name', 'tags')
 
-class ImportJobSerializer(serializers.ModelSerializer):
-    class Meta:
-        model = models.ImportJob
-        fields = ('id', 'mbid', 'source', 'status')
-
-class ImportBatchSerializer(serializers.ModelSerializer):
-    jobs = ImportJobSerializer(many=True, read_only=True)
-    class Meta:
-        model = models.ImportBatch
-        fields = ('id', 'jobs', 'status', 'creation_date')
-
 
 class TrackFileSerializer(serializers.ModelSerializer):
     path = serializers.SerializerMethodField()
 
     class Meta:
         model = models.TrackFile
-        fields = ('id', 'path', 'duration', 'source', 'filename')
+        fields = ('id', 'path', 'duration', 'source', 'filename', 'track')
 
     def get_path(self, o):
         request = self.context.get('request')
@@ -46,12 +37,14 @@ class TrackFileSerializer(serializers.ModelSerializer):
             url = request.build_absolute_uri(url)
         return url
 
+
 class SimpleAlbumSerializer(serializers.ModelSerializer):
 
     class Meta:
         model = models.Album
         fields = ('id', 'mbid', 'title', 'release_date', 'cover')
 
+
 class AlbumSerializer(serializers.ModelSerializer):
     tags = TagSerializer(many=True, read_only=True)
     class Meta:
@@ -81,6 +74,7 @@ class TrackSerializer(LyricsMixin):
             'position',
             'lyrics')
 
+
 class TrackSerializerNested(LyricsMixin):
     artist = ArtistSerializer()
     files = TrackFileSerializer(many=True, read_only=True)
@@ -90,6 +84,7 @@ class TrackSerializerNested(LyricsMixin):
         model = models.Track
         fields = ('id', 'mbid', 'title', 'artist', 'files', 'album', 'tags', 'lyrics')
 
+
 class AlbumSerializerNested(serializers.ModelSerializer):
     tracks = TrackSerializer(many=True, read_only=True)
     artist = SimpleArtistSerializer()
@@ -99,6 +94,7 @@ class AlbumSerializerNested(serializers.ModelSerializer):
         model = models.Album
         fields = ('id', 'mbid', 'title', 'cover', 'artist', 'release_date', 'tracks', 'tags')
 
+
 class ArtistSerializerNested(serializers.ModelSerializer):
     albums = AlbumSerializerNested(many=True, read_only=True)
     tags = TagSerializer(many=True, read_only=True)
@@ -111,3 +107,17 @@ class LyricsSerializer(serializers.ModelSerializer):
     class Meta:
         model = models.Lyrics
         fields = ('id', 'work', 'content', 'content_rendered')
+
+
+class ImportJobSerializer(serializers.ModelSerializer):
+    track_file = TrackFileSerializer(read_only=True)
+    class Meta:
+        model = models.ImportJob
+        fields = ('id', 'mbid', 'source', 'status', 'track_file')
+
+
+class ImportBatchSerializer(serializers.ModelSerializer):
+    jobs = ImportJobSerializer(many=True, read_only=True)
+    class Meta:
+        model = models.ImportBatch
+        fields = ('id', 'jobs', 'status', 'creation_date')
diff --git a/api/funkwhale_api/music/tests/factories.py b/api/funkwhale_api/music/tests/factories.py
index d3cd625b3da554920d3b2932ef7e08d51c2a517c..b554e3e14a934bc26281130dc869ec09907dc80f 100644
--- a/api/funkwhale_api/music/tests/factories.py
+++ b/api/funkwhale_api/music/tests/factories.py
@@ -1,6 +1,8 @@
 import factory
 import os
 
+from funkwhale_api.users.tests.factories import UserFactory
+
 SAMPLES_PATH = os.path.dirname(os.path.abspath(__file__))
 
 
@@ -42,3 +44,18 @@ class TrackFileFactory(factory.django.DjangoModelFactory):
 
     class Meta:
         model = 'music.TrackFile'
+
+
+class ImportBatchFactory(factory.django.DjangoModelFactory):
+    submitted_by = factory.SubFactory(UserFactory)
+
+    class Meta:
+        model = 'music.ImportBatch'
+
+
+class ImportJobFactory(factory.django.DjangoModelFactory):
+    batch = factory.SubFactory(ImportBatchFactory)
+    source = factory.Faker('url')
+
+    class Meta:
+        model = 'music.ImportJob'
diff --git a/api/funkwhale_api/music/tests/test_models.py b/api/funkwhale_api/music/tests/test_models.py
index a652676d7d40c03ee3bd1a5b5665f6fa4fcb52c0..4b43e46382ad28d4bbf382fef854c39b8cae5d48 100644
--- a/api/funkwhale_api/music/tests/test_models.py
+++ b/api/funkwhale_api/music/tests/test_models.py
@@ -39,3 +39,13 @@ def test_import_album_stores_release_group(db):
 
     assert album.release_group_id == album_data['release-group']['id']
     assert album.artist == artist
+
+
+def test_import_job_is_bound_to_track_file(db, mocker):
+    track = factories.TrackFactory()
+    job = factories.ImportJobFactory(mbid=track.mbid)
+
+    mocker.patch('funkwhale_api.music.models.TrackFile.download_file')
+    job.run()
+    job.refresh_from_db()
+    assert job.track_file.track == track
diff --git a/api/funkwhale_api/music/views.py b/api/funkwhale_api/music/views.py
index d149b5d1b9b937955d89debc33ecf2689d64c9e5..72982e4c5b916360e6f02d811507757c51dcb61a 100644
--- a/api/funkwhale_api/music/views.py
+++ b/api/funkwhale_api/music/views.py
@@ -72,7 +72,10 @@ class AlbumViewSet(SearchMixin, viewsets.ReadOnlyModelViewSet):
 
 
 class ImportBatchViewSet(viewsets.ReadOnlyModelViewSet):
-    queryset = models.ImportBatch.objects.all().order_by('-creation_date')
+    queryset = (
+        models.ImportBatch.objects.all()
+                          .prefetch_related('jobs__track_file')
+                          .order_by('-creation_date'))
     serializer_class = serializers.ImportBatchSerializer
 
     def get_queryset(self):
diff --git a/api/funkwhale_api/users/migrations/0002_auto_20171214_2205.py b/api/funkwhale_api/users/migrations/0002_auto_20171214_2205.py
new file mode 100644
index 0000000000000000000000000000000000000000..4bbbaa62bcc44591449333ef4faa82e3fdd49c80
--- /dev/null
+++ b/api/funkwhale_api/users/migrations/0002_auto_20171214_2205.py
@@ -0,0 +1,28 @@
+# -*- coding: utf-8 -*-
+# Generated by Django 1.11 on 2017-12-14 22:05
+from __future__ import unicode_literals
+
+import django.contrib.auth.models
+import django.contrib.auth.validators
+from django.db import migrations, models
+
+
+class Migration(migrations.Migration):
+
+    dependencies = [
+        ('users', '0001_initial'),
+    ]
+
+    operations = [
+        migrations.AlterModelManagers(
+            name='user',
+            managers=[
+                ('objects', django.contrib.auth.models.UserManager()),
+            ],
+        ),
+        migrations.AlterField(
+            model_name='user',
+            name='username',
+            field=models.CharField(error_messages={'unique': 'A user with that username already exists.'}, help_text='Required. 150 characters or fewer. Letters, digits and @/./+/-/_ only.', max_length=150, unique=True, validators=[django.contrib.auth.validators.UnicodeUsernameValidator()], verbose_name='username'),
+        ),
+    ]
diff --git a/api/requirements/test.txt b/api/requirements/test.txt
index a26cf5bdbb1a8b60209fb7632c9acf3b3f9c0b08..7c304bbdb430bb46647c713a6e0cd1d85ed4111e 100644
--- a/api/requirements/test.txt
+++ b/api/requirements/test.txt
@@ -4,8 +4,8 @@
 
 flake8==2.5.0
 model-mommy==1.3.2
-tox==2.7.0
 pytest
 pytest-django
+pytest-mock
 pytest-sugar
 pytest-xdist
diff --git a/front/src/components/library/import/BatchDetail.vue b/front/src/components/library/import/BatchDetail.vue
index 57560fc04e5779e55d20189a5623ab619b6953a8..726ec9c3e29eed7e6e3aa8433e7140d3b2a40cc4 100644
--- a/front/src/components/library/import/BatchDetail.vue
+++ b/front/src/components/library/import/BatchDetail.vue
@@ -23,6 +23,7 @@
             <th>Recording MusicBrainz ID</th>
             <th>Source</th>
             <th>Status</th>
+            <th>Track</th>
           </tr>
         </thead>
         <tbody>
@@ -38,6 +39,9 @@
               <span
                 :class="['ui', {'yellow': job.status === 'pending'}, {'green': job.status === 'finished'}, 'label']">{{ job.status }}</span>
             </td>
+            <td>
+              <router-link v-if="job.track_file" :to="{name: 'library.tracks.detail', params: {id: job.track_file.track }}">{{ job.track_file.track }}</router-link>
+            </td>
           </tr>
         </tbody>
       </table>