diff --git a/api/funkwhale_api/history/tests/factories.py b/api/funkwhale_api/history/tests/factories.py
new file mode 100644
index 0000000000000000000000000000000000000000..0a411adf0ce02467e41fe8dd94958755606f0b95
--- /dev/null
+++ b/api/funkwhale_api/history/tests/factories.py
@@ -0,0 +1,12 @@
+import factory
+from funkwhale_api.music.tests import factories
+
+from funkwhale_api.users.tests.factories import UserFactory
+
+
+class ListeningFactory(factory.django.DjangoModelFactory):
+    user = factory.SubFactory(UserFactory)
+    track = factory.SubFactory(factories.TrackFactory)
+
+    class Meta:
+        model = 'history.Listening'
diff --git a/api/funkwhale_api/history/tests/test_history.py b/api/funkwhale_api/history/tests/test_history.py
index 61009615a607ac7c3f6a0dcd1876d2413cddb1e3..a5b771f09ae64492a4309fd9a86863d59f824fef 100644
--- a/api/funkwhale_api/history/tests/test_history.py
+++ b/api/funkwhale_api/history/tests/test_history.py
@@ -5,11 +5,12 @@ from django.core.urlresolvers import reverse
 from django.core.exceptions import ValidationError
 from django.utils import timezone
 
-from model_mommy import mommy
+from funkwhale_api.music.tests.factories import TrackFactory
 
 from funkwhale_api.users.models import User
 from funkwhale_api.history import models
 
+
 class TestHistory(TestCase):
 
     def setUp(self):
@@ -17,12 +18,12 @@ class TestHistory(TestCase):
         self.user = User.objects.create_user(username='test', email='test@test.com', password='test')
 
     def test_can_create_listening(self):
-        track = mommy.make('music.Track')
+        track = TrackFactory()
         now = timezone.now()
         l = models.Listening.objects.create(user=self.user, track=track)
 
     def test_anonymous_user_can_create_listening_via_api(self):
-        track = mommy.make('music.Track')
+        track = TrackFactory()
         url = self.reverse('api:v1:history:listenings-list')
         response = self.client.post(url, {
             'track': track.pk,
@@ -34,7 +35,7 @@ class TestHistory(TestCase):
         self.assertIsNotNone(listening.session_key)
 
     def test_logged_in_user_can_create_listening_via_api(self):
-        track = mommy.make('music.Track')
+        track = TrackFactory()
 
         self.client.login(username=self.user.username, password='test')
 
diff --git a/api/funkwhale_api/music/tests/factories.py b/api/funkwhale_api/music/tests/factories.py
index b554e3e14a934bc26281130dc869ec09907dc80f..567e2a765f426e8ca9ce4359bf6644431ef97dec 100644
--- a/api/funkwhale_api/music/tests/factories.py
+++ b/api/funkwhale_api/music/tests/factories.py
@@ -59,3 +59,30 @@ class ImportJobFactory(factory.django.DjangoModelFactory):
 
     class Meta:
         model = 'music.ImportJob'
+
+
+class WorkFactory(factory.django.DjangoModelFactory):
+    mbid = factory.Faker('uuid4')
+    language = 'eng'
+    nature = 'song'
+    title = factory.Faker('sentence', nb_words=3)
+
+    class Meta:
+        model = 'music.Work'
+
+
+class LyricsFactory(factory.django.DjangoModelFactory):
+    work = factory.SubFactory(WorkFactory)
+    url = factory.Faker('url')
+    content = factory.Faker('paragraphs', nb=4)
+
+    class Meta:
+        model = 'music.Lyrics'
+
+
+class TagFactory(factory.django.DjangoModelFactory):
+    name = factory.SelfAttribute('slug')
+    slug = factory.Faker('slug')
+
+    class Meta:
+        model = 'taggit.Tag'
diff --git a/api/funkwhale_api/music/tests/test_lyrics.py b/api/funkwhale_api/music/tests/test_lyrics.py
index 0ea22371bad091ed17796db24b58f414191979f4..7032e58087ff46eb3caa969a1c2c675b4343a817 100644
--- a/api/funkwhale_api/music/tests/test_lyrics.py
+++ b/api/funkwhale_api/music/tests/test_lyrics.py
@@ -2,24 +2,25 @@ import json
 import unittest
 from test_plus.test import TestCase
 from django.core.urlresolvers import reverse
-from model_mommy import mommy
 
 from funkwhale_api.music import models
 from funkwhale_api.musicbrainz import api
 from funkwhale_api.music import serializers
 from funkwhale_api.users.models import User
+from funkwhale_api.music import lyrics as lyrics_utils
 
 from .mocking import lyricswiki
+from . import factories
 from . import data as api_data
-from funkwhale_api.music import lyrics as lyrics_utils
+
+
 
 class TestLyrics(TestCase):
 
     @unittest.mock.patch('funkwhale_api.music.lyrics._get_html',
                          return_value=lyricswiki.content)
     def test_works_import_lyrics_if_any(self, *mocks):
-        lyrics = mommy.make(
-            models.Lyrics,
+        lyrics = factories.LyricsFactory(
             url='http://lyrics.wikia.com/System_Of_A_Down:Chop_Suey!')
 
         lyrics.fetch_content()
@@ -42,7 +43,7 @@ Is it me you're looking for?
         content = """Hello
 Is it me you're looking for?"""
 
-        l = mommy.make(models.Lyrics, content=content)
+        l = factories.LyricsFactory(content=content)
 
         expected = "<p>Hello<br />Is it me you're looking for?</p>"
         self.assertHTMLEqual(expected, l.content_rendered)
@@ -54,8 +55,7 @@ Is it me you're looking for?"""
     @unittest.mock.patch('funkwhale_api.music.lyrics._get_html',
                          return_value=lyricswiki.content)
     def test_works_import_lyrics_if_any(self, *mocks):
-        track = mommy.make(
-            models.Track,
+        track = factories.TrackFactory(
             work=None,
             mbid='07ca77cf-f513-4e9c-b190-d7e24bbad448')
 
diff --git a/api/funkwhale_api/music/tests/test_music.py b/api/funkwhale_api/music/tests/test_music.py
index cc01bc9edcacbae05c0e9cf4280d78df4d49a193..5cf9d0cf96d53c6060759b6a8c65cf1aaef6917f 100644
--- a/api/funkwhale_api/music/tests/test_music.py
+++ b/api/funkwhale_api/music/tests/test_music.py
@@ -2,13 +2,11 @@ from test_plus.test import TestCase
 import unittest.mock
 from funkwhale_api.music import models
 import datetime
-from model_mommy import mommy
+
+from . import factories
 from . import data as api_data
 from .cover import binary_data
 
-def prettyprint(d):
-    import json
-    print(json.dumps(d, sort_keys=True, indent=4))
 
 class TestMusic(TestCase):
 
@@ -79,9 +77,9 @@ class TestMusic(TestCase):
         self.assertEqual(track, track2)
 
     def test_album_tags_deduced_from_tracks_tags(self):
-        tag = mommy.make('taggit.Tag')
-        album = mommy.make('music.Album')
-        tracks = mommy.make('music.Track', album=album, _quantity=5)
+        tag = factories.TagFactory()
+        album = factories.AlbumFactory()
+        tracks = factories.TrackFactory.create_batch(album=album, size=5)
 
         for track in tracks:
             track.tags.add(tag)
@@ -92,10 +90,10 @@ class TestMusic(TestCase):
             self.assertIn(tag, album.tags)
 
     def test_artist_tags_deduced_from_album_tags(self):
-        tag = mommy.make('taggit.Tag')
-        artist = mommy.make('music.Artist')
-        album = mommy.make('music.Album', artist=artist)
-        tracks = mommy.make('music.Track', album=album, _quantity=5)
+        tag = factories.TagFactory()
+        artist = factories.ArtistFactory()
+        album = factories.AlbumFactory(artist=artist)
+        tracks = factories.TrackFactory.create_batch(album=album, size=5)
 
         for track in tracks:
             track.tags.add(tag)
@@ -108,7 +106,7 @@ class TestMusic(TestCase):
     @unittest.mock.patch('funkwhale_api.musicbrainz.api.images.get_front', return_value=binary_data)
     def test_can_download_image_file_for_album(self, *mocks):
         # client._api.get_image_front('55ea4f82-b42b-423e-a0e5-290ccdf443ed')
-        album = mommy.make('music.Album', mbid='55ea4f82-b42b-423e-a0e5-290ccdf443ed')
+        album = factories.AlbumFactory(mbid='55ea4f82-b42b-423e-a0e5-290ccdf443ed')
         album.get_image()
         album.save()
 
diff --git a/api/funkwhale_api/music/tests/test_works.py b/api/funkwhale_api/music/tests/test_works.py
index 84cb51cde09a54c131f76636f6d13545381cd063..b199c8c5b7d98f839296ba9e6f3c65a059ff98b1 100644
--- a/api/funkwhale_api/music/tests/test_works.py
+++ b/api/funkwhale_api/music/tests/test_works.py
@@ -2,22 +2,23 @@ import json
 import unittest
 from test_plus.test import TestCase
 from django.core.urlresolvers import reverse
-from model_mommy import mommy
 
 from funkwhale_api.music import models
 from funkwhale_api.musicbrainz import api
 from funkwhale_api.music import serializers
+from funkwhale_api.music.tests import factories
 from funkwhale_api.users.models import User
 
 from . import data as api_data
 
+
 class TestWorks(TestCase):
 
     @unittest.mock.patch('funkwhale_api.musicbrainz.api.works.get',
                          return_value=api_data.works['get']['chop_suey'])
     def test_can_import_work(self, *mocks):
-        recording = mommy.make(
-            models.Track, mbid='07ca77cf-f513-4e9c-b190-d7e24bbad448')
+        recording = factories.TrackFactory(
+            mbid='07ca77cf-f513-4e9c-b190-d7e24bbad448')
         mbid = 'e2ecabc4-1b9d-30b2-8f30-3596ec423dc5'
         work = models.Work.create_from_api(id=mbid)
 
@@ -36,8 +37,7 @@ class TestWorks(TestCase):
     @unittest.mock.patch('funkwhale_api.musicbrainz.api.recordings.get',
                          return_value=api_data.tracks['get']['chop_suey'])
     def test_can_get_work_from_recording(self, *mocks):
-        recording = mommy.make(
-            models.Track,
+        recording = factories.TrackFactory(
             work=None,
             mbid='07ca77cf-f513-4e9c-b190-d7e24bbad448')
         mbid = 'e2ecabc4-1b9d-30b2-8f30-3596ec423dc5'
diff --git a/api/funkwhale_api/playlists/tests/test_playlists.py b/api/funkwhale_api/playlists/tests/test_playlists.py
index 49025cd11b078e072e196325ce32506b448e142f..59054be2be4bbe51a0d3c99e5a9204f78d5b4aa6 100644
--- a/api/funkwhale_api/playlists/tests/test_playlists.py
+++ b/api/funkwhale_api/playlists/tests/test_playlists.py
@@ -4,8 +4,7 @@ from django.core.urlresolvers import reverse
 from django.core.exceptions import ValidationError
 from django.utils import timezone
 
-from model_mommy import mommy
-
+from funkwhale_api.music.tests import factories
 from funkwhale_api.users.models import User
 from funkwhale_api.playlists import models
 from funkwhale_api.playlists.serializers import PlaylistSerializer
@@ -18,7 +17,7 @@ class TestPlayLists(TestCase):
         self.user = User.objects.create_user(username='test', email='test@test.com', password='test')
 
     def test_can_create_playlist(self):
-        tracks = list(mommy.make('music.Track', _quantity=5))
+        tracks = factories.TrackFactory.create_batch(size=5)
         playlist = models.Playlist.objects.create(user=self.user, name="test")
 
         previous = None
@@ -49,7 +48,7 @@ class TestPlayLists(TestCase):
         self.assertEqual(playlist.name, 'test')
 
     def test_can_add_playlist_track_via_api(self):
-        tracks = list(mommy.make('music.Track', _quantity=5))
+        tracks = factories.TrackFactory.create_batch(size=5)
         playlist = models.Playlist.objects.create(user=self.user, name="test")
 
         self.client.login(username=self.user.username, password='test')
diff --git a/api/funkwhale_api/radios/tests/test_radios.py b/api/funkwhale_api/radios/tests/test_radios.py
index 5729b4412104d906e208674177b893414ea9a44b..aec919ee0218d0163758165d5d040bd7db5ca85e 100644
--- a/api/funkwhale_api/radios/tests/test_radios.py
+++ b/api/funkwhale_api/radios/tests/test_radios.py
@@ -4,13 +4,15 @@ from test_plus.test import TestCase
 from django.core.urlresolvers import reverse
 from django.core.exceptions import ValidationError
 
-from model_mommy import mommy
 
 from funkwhale_api.radios import radios
 from funkwhale_api.radios import models
 from funkwhale_api.favorites.models import TrackFavorite
 from funkwhale_api.users.models import User
 from funkwhale_api.music.models import Artist
+from funkwhale_api.music.tests import factories
+from funkwhale_api.history.tests.factories import ListeningFactory
+
 
 class TestRadios(TestCase):
 
@@ -55,7 +57,7 @@ class TestRadios(TestCase):
         self.assertTrue(picks[2] > picks[1])
 
     def test_can_get_choices_for_favorites_radio(self):
-        tracks = mommy.make('music.Track', _quantity=100)
+        tracks = factories.TrackFactory.create_batch(size=100)
 
         for i in range(20):
             TrackFavorite.add(track=random.choice(tracks), user=self.user)
@@ -73,7 +75,7 @@ class TestRadios(TestCase):
             self.assertIn(pick, choices)
 
     def test_can_use_radio_session_to_filter_choices(self):
-        tracks = mommy.make('music.Track', _quantity=30)
+        tracks = factories.TrackFactory.create_batch(size=30)
         radio = radios.RandomRadio()
         session = radio.start_session(self.user)
 
@@ -85,7 +87,7 @@ class TestRadios(TestCase):
         self.assertEqual(len(set(tracks_id)), 30)
 
     def test_can_restore_radio_from_previous_session(self):
-        tracks = mommy.make('music.Track', _quantity=30)
+        tracks = factories.TrackFactory.create_batch(size=30)
 
         radio = radios.RandomRadio()
         session = radio.start_session(self.user)
@@ -115,7 +117,7 @@ class TestRadios(TestCase):
         self.assertIsNotNone(session.session_key)
 
     def test_can_get_track_for_session_from_api(self):
-        tracks = mommy.make('music.Track', _quantity=1)
+        tracks = factories.TrackFactory.create_batch(size=1)
 
         self.client.login(username=self.user.username, password='test')
         url = reverse('api:v1:radios:sessions-list')
@@ -129,7 +131,7 @@ class TestRadios(TestCase):
         self.assertEqual(data['track']['id'], tracks[0].id)
         self.assertEqual(data['position'], 1)
 
-        next_track = mommy.make('music.Track')
+        next_track = factories.TrackFactory()
         response = self.client.post(url, {'session': session.pk})
         data = json.loads(response.content.decode('utf-8'))
 
@@ -148,9 +150,10 @@ class TestRadios(TestCase):
             radio.start_session(self.user, related_object=self.user)
 
     def test_can_start_artist_radio(self):
-        artist = mommy.make('music.Artist')
-        wrong_tracks = mommy.make('music.Track', _quantity=30)
-        good_tracks = mommy.make('music.Track', artist=artist, _quantity=5)
+        artist = factories.ArtistFactory()
+        wrong_tracks = factories.TrackFactory.create_batch(size=30)
+        good_tracks = factories.TrackFactory.create_batch(
+            artist=artist, size=5)
 
         radio = radios.ArtistRadio()
         session = radio.start_session(self.user, related_object=artist)
@@ -159,9 +162,9 @@ class TestRadios(TestCase):
             self.assertIn(radio.pick(), good_tracks)
 
     def test_can_start_tag_radio(self):
-        tag = mommy.make('taggit.Tag')
-        wrong_tracks = mommy.make('music.Track', _quantity=30)
-        good_tracks = mommy.make('music.Track', _quantity=5)
+        tag = factories.TagFactory()
+        wrong_tracks = factories.TrackFactory.create_batch(size=30)
+        good_tracks = factories.TrackFactory.create_batch(size=5)
         for track in good_tracks:
             track.tags.add(tag)
 
@@ -172,7 +175,7 @@ class TestRadios(TestCase):
             self.assertIn(radio.pick(), good_tracks)
 
     def test_can_start_artist_radio_from_api(self):
-        artist = mommy.make('music.Artist')
+        artist = factories.ArtistFactory()
         url = reverse('api:v1:radios:sessions-list')
 
         response = self.client.post(url, {'radio_type': 'artist', 'related_object_id': artist.id})
@@ -181,10 +184,10 @@ class TestRadios(TestCase):
         self.assertEqual(session.related_object, artist)
 
     def test_can_start_less_listened_radio(self):
-        history = mommy.make('history.Listening', _quantity=5, user=self.user)
+        history = ListeningFactory.create_batch(size=5, user=self.user)
         wrong_tracks = [h.track for h in history]
 
-        good_tracks = mommy.make('music.Track', _quantity=30)
+        good_tracks = factories.TrackFactory.create_batch(size=30)
 
         radio = radios.LessListenedRadio()
         session = radio.start_session(self.user)
diff --git a/api/requirements/test.txt b/api/requirements/test.txt
index 7c304bbdb430bb46647c713a6e0cd1d85ed4111e..3606bc988e429c7a8ffe6b04f469fdbef5d4d66a 100644
--- a/api/requirements/test.txt
+++ b/api/requirements/test.txt
@@ -3,7 +3,6 @@
 
 
 flake8==2.5.0
-model-mommy==1.3.2
 pytest
 pytest-django
 pytest-mock