diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml
index a63410119c8a758c7d5ad0ebba1e2ba3d6a06775..8742084d439b165c105c67ace7b1902111064d29 100644
--- a/.gitlab-ci.yml
+++ b/.gitlab-ci.yml
@@ -1,4 +1,42 @@
-image: docker:latest
+stages:
+  - test
+  - build
+
+test_api:
+  stage: test
+  before_script:
+    - docker-compose -f api/test.yml build
+  script:
+    - docker-compose -f api/test.yml run test
+  after_script:
+    - docker-compose -f api/test.yml run test rm -rf funkwhale_api/media/
+
+  tags:
+    - dind
+
+build_front:
+  stage: build
+  image: node:6-alpine
+  before_script:
+    - cd front
+
+  script:
+    - npm install
+    - npm run build
+  cache:
+    key: "$CI_COMMIT_REF_NAME"
+    paths:
+      - front/node_modules
+  artifacts:
+    name: "front_${CI_COMMIT_REF_NAME}"
+    paths:
+      - front/dist/
+  only:
+    - master
+    - develop
+  tags:
+    - docker
+
 
 # When using dind, it's wise to use the overlayfs driver for
 # improved performance.
diff --git a/api/config/settings/test.py b/api/config/settings/test.py
index 1323ff35a1ea2fdd93b3c9f52a03bffaebeafdff..b8dd89b049724a69465e428cf4ed3d120cf5a0a8 100644
--- a/api/config/settings/test.py
+++ b/api/config/settings/test.py
@@ -32,3 +32,4 @@ CELERY_ALWAYS_EAGER = True
 ########## END CELERY
 
 # Your local stuff: Below this line define 3rd party library settings
+API_AUTHENTICATION_REQUIRED = False
diff --git a/api/docker/Dockerfile.base b/api/docker/Dockerfile.base
deleted file mode 100644
index 2617c9587b40cd63e7a9b7d826132f22d92a55e0..0000000000000000000000000000000000000000
--- a/api/docker/Dockerfile.base
+++ /dev/null
@@ -1,10 +0,0 @@
-FROM python:3.5
-
-ENV PYTHONUNBUFFERED 1
-
-# Requirements have to be pulled and installed here, otherwise caching won't work
-COPY ./requirements.apt /requirements.apt
-COPY ./install_os_dependencies.sh /install_os_dependencies.sh
-RUN bash install_os_dependencies.sh install
-COPY ./requirements /requirements
-RUN pip install -r /requirements/base.txt
diff --git a/api/docker/Dockerfile.local b/api/docker/Dockerfile.local
deleted file mode 100644
index b70410459bebc0ed83d9fdd61d341c5b0b6bb26f..0000000000000000000000000000000000000000
--- a/api/docker/Dockerfile.local
+++ /dev/null
@@ -1,12 +0,0 @@
-FROM python:3.5
-
-ENV PYTHONUNBUFFERED 1
-
-# Requirements have to be pulled and installed here, otherwise caching won't work
-COPY ./requirements.apt /requirements.apt
-COPY ./install_os_dependencies.sh /install_os_dependencies.sh
-RUN bash install_os_dependencies.sh install
-COPY ./requirements /requirements
-RUN pip install -r /requirements/local.txt
-
-WORKDIR /app
diff --git a/api/docker/Dockerfile.test b/api/docker/Dockerfile.test
index f2e2ef893b2e81c3790b48d5923d05c45d847cfc..eda9f9c8f5820d7139e8a25d4caf305f1bc9fb98 100644
--- a/api/docker/Dockerfile.test
+++ b/api/docker/Dockerfile.test
@@ -1,13 +1,19 @@
-FROM funkwhale/apibase
+FROM python:3.5
 
 ENV PYTHONUNBUFFERED 1
+ENV PYTHONDONTWRITEBYTECODE  1
 
 # Requirements have to be pulled and installed here, otherwise caching won't work
 COPY ./requirements.apt /requirements.apt
 COPY ./install_os_dependencies.sh /install_os_dependencies.sh
 RUN bash install_os_dependencies.sh install
-COPY ./requirements /requirements
+
+RUN mkdir /requirements
+COPY ./requirements/base.txt /requirements
+RUN pip install -r /requirements/base.txt
+COPY ./requirements/local.txt /requirements
 RUN pip install -r /requirements/local.txt
+COPY ./requirements/test.txt /requirements
 RUN pip install -r /requirements/test.txt
 
 WORKDIR /app
diff --git a/api/funkwhale_api/radios/radios.py b/api/funkwhale_api/radios/radios.py
index 0f2632fe943f27cc686f486ac8658caab05bb976..43819b9c4e1079a98e0bc47a1ab50855f6a12b07 100644
--- a/api/funkwhale_api/radios/radios.py
+++ b/api/funkwhale_api/radios/radios.py
@@ -50,7 +50,7 @@ class SessionRadio(SimpleRadio):
 
     def filter_from_session(self, queryset):
         already_played = self.session.session_tracks.all().values_list('track', flat=True)
-        queryset = queryset.exclude(pk__in=already_played)
+        queryset = queryset.exclude(pk__in=list(already_played))
         return queryset
 
     def pick(self, **kwargs):
diff --git a/api/funkwhale_api/radios/tests/test_radios.py b/api/funkwhale_api/radios/tests/test_radios.py
index eb839a426ba7e156506b204cb48fb351ce0843c0..7d069be9c602cce65624de1ec756a82177013442 100644
--- a/api/funkwhale_api/radios/tests/test_radios.py
+++ b/api/funkwhale_api/radios/tests/test_radios.py
@@ -74,12 +74,11 @@ class TestRadios(TestCase):
 
     def test_can_use_radio_session_to_filter_choices(self):
         tracks = mommy.make('music.Track', _quantity=30)
-
         radio = radios.RandomRadio()
         session = radio.start_session(self.user)
 
         for i in range(30):
-            radio.pick()
+            p = radio.pick()
 
         # ensure 30 differents tracks have been suggested
         tracks_id = [session_track.track.pk for session_track in session.session_tracks.all()]
diff --git a/api/requirements/test.txt b/api/requirements/test.txt
index e3540b72dd6ea2bf558b4809d354bf81453f6395..bcb6ef060cc73db6cf7f55e531c57a8177e79492 100644
--- a/api/requirements/test.txt
+++ b/api/requirements/test.txt
@@ -7,6 +7,6 @@ coverage==4.0.3
 django_coverage_plugin==1.1
 flake8==2.5.0
 django-test-plus==1.0.11
-factory_boy==2.6.0
+factory_boy>=2.8.1
 model_mommy
 tox
diff --git a/api/test.yml b/api/test.yml
index c28a8138c6707205cd28d69846a8e60603920c90..dc50a9b545d75382531f2684de6cb7ed3925be78 100644
--- a/api/test.yml
+++ b/api/test.yml
@@ -6,4 +6,3 @@ test:
     - .:/app
   environment:
     - DJANGO_SETTINGS_MODULE=config.settings.test
-    - API_AUTHENTICATION_REQUIRED=False
diff --git a/dev.yml b/dev.yml
index 2144d4b16362b5bc9f77c42aa1bcb31f7b27b70d..526ce1ba870f89bb8c6d2864b7db3bf026cc0b86 100644
--- a/dev.yml
+++ b/dev.yml
@@ -52,12 +52,12 @@ services:
       - redis
       - celeryworker
 
-  nginx:
-    env_file: .env.dev
-    build: ./api/compose/nginx
-    links:
-      - api
-    volumes:
-      - ./api/funkwhale_api/media:/staticfiles/media
-    ports:
-      - "0.0.0.0:6001:80"
+  # nginx:
+  #   env_file: .env.dev
+  #   build: ./api/compose/nginx
+  #   links:
+  #     - api
+  #   volumes:
+  #     - ./api/funkwhale_api/media:/staticfiles/media
+  #   ports:
+  #     - "0.0.0.0:6001:80"