diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml
index dd50908b3a24a5928d5a478d108827f97f9f9fdd..ef36506b1812f540264e32e1318a4a0aab933e5d 100644
--- a/.gitlab-ci.yml
+++ b/.gitlab-ci.yml
@@ -2,8 +2,10 @@ stages:
   - build
 
 variables:
-  PREFIX: /opt/beat.env.web/usr
-  TEST_PREFIX_PATH_FILE: '/tmp/test_prefix_$CI_JOB_ID.txt'
+  TEST_PREFIX_PATH_FILE: 'test_prefix_$CI_JOB_ID.txt'
+  CONDA_ENV_NAME: beat_test_env
+  CONDA_PREFIX: /local/opt/conda
+  PREFIX: $CONDA_PREFIX/envs/$CONDA_ENV_NAME
 
 build:
   stage: build
@@ -12,10 +14,13 @@ build:
   before_script:
   - ${PREFIX}/bin/python --version
   - docker info
+  - git clean -ffdx
   - export BEAT_TEST_PREFIX=`mktemp -d --tmpdir=/var/tmp beat_test_prefix.XXXXXXXXX`
   - echo $BEAT_TEST_PREFIX > $TEST_PREFIX_PATH_FILE
+  - export PATH="$CONDA_PREFIX/bin:$PATH"
+  - source activate $CONDA_ENV_NAME
+  - conda info --envs
   script:
-  - git clean -ffdx
   - ${PREFIX}/bin/python bootstrap-buildout.py
   - ./bin/buildout
   - export COVERAGE_FILE=.coverage.django
diff --git a/beat/web/accounts/urls.py b/beat/web/accounts/urls.py
index dd7c08297f36c58639736e9ab65e09004c900c4d..0d32cda0d887e97571346c103f069b1cba0e5d1f 100644
--- a/beat/web/accounts/urls.py
+++ b/beat/web/accounts/urls.py
@@ -25,7 +25,7 @@
 #                                                                             #
 ###############################################################################
 
-from django.conf.urls import patterns, url
+from django.conf.urls import url
 from . import views
 
 urlpatterns = [
diff --git a/beat/web/algorithms/views.py b/beat/web/algorithms/views.py
index 62f3ace9d5e86f73f57a28f8e99d3a5f49f1717a..c64cbf44fa1094eda76cbdf73b7459d5696c927f 100755
--- a/beat/web/algorithms/views.py
+++ b/beat/web/algorithms/views.py
@@ -27,8 +27,7 @@
 
 from django.http import Http404, HttpResponseForbidden
 from django.shortcuts import get_object_or_404
-from django.shortcuts import render_to_response
-from django.template import RequestContext
+from django.shortcuts import render
 from django.contrib.auth.decorators import login_required
 from django.conf import settings
 from django.contrib.auth.models import User
@@ -95,9 +94,7 @@ def create(request, name=None):
         declaration['language'] = 'python'
         parameters['declaration'] = json.dumps(declaration)
 
-    return render_to_response('algorithms/edition.html',
-                              parameters,
-                              context_instance=RequestContext(request))
+    return render(request, 'algorithms/edition.html', parameters)
 
 
 #----------------------------------------------------------
@@ -144,9 +141,7 @@ def fork(request, author, name, version):
     if not fork_of.is_binary():
         parameters['source_code'] = fork_of.source_code_file.read()
 
-    return render_to_response('algorithms/edition.html',
-                              parameters,
-                              context_instance=RequestContext(request))
+    return render(request, 'algorithms/edition.html', parameters)
 
 
 #----------------------------------------------------------
@@ -193,9 +188,7 @@ def edit(request, author, name, version):
     if not algorithm.is_binary():
         parameters['source_code'] = algorithm.source_code_file.read()
 
-    return render_to_response('algorithms/edition.html',
-                              parameters,
-                              context_instance=RequestContext(request))
+    return render(request, 'algorithms/edition.html', parameters)
 
 
 #----------------------------------------------------------
@@ -232,14 +225,14 @@ def view(request, author, name, version=None):
     users = User.objects.exclude(username__in=settings.ACCOUNTS_TO_EXCLUDE_FROM_TEAMS).order_by('username')
 
     # Render the page
-    return render_to_response('algorithms/view.html',
-                              {
-                                  'algorithm': algorithm,
-                                  'owner': owner,
-                                  'users': users,
-                                  'teams': Team.objects.for_user(request.user, True)
-                              },
-                              context_instance=RequestContext(request))
+    return render(request,
+                  'algorithms/view.html',
+                  {
+                      'algorithm': algorithm,
+                      'owner': owner,
+                      'users': users,
+                      'teams': Team.objects.for_user(request.user, True)
+                  })
 
 
 #----------------------------------------------------------
@@ -250,15 +243,15 @@ def diff(request, author1, name1, version1, author2, name2, version2):
     retrieve the details about the algorithms and check the accessibility.
     """
 
-    return render_to_response('algorithms/diff.html',
-                              {'algorithm1_author':  author1,
-                               'algorithm1_name':    name1,
-                               'algorithm1_version': version1,
-                               'algorithm2_author':  author2,
-                               'algorithm2_name':    name2,
-                               'algorithm2_version': version2,
-                              },
-                              context_instance=RequestContext(request))
+    return render(request,
+                  'algorithms/diff.html',
+                  {'algorithm1_author':  author1,
+                   'algorithm1_name':    name1,
+                   'algorithm1_version': version1,
+                   'algorithm2_author':  author2,
+                   'algorithm2_name':    name2,
+                   'algorithm2_version': version2,
+                  })
 
 
 #----------------------------------------------------------
@@ -277,14 +270,13 @@ def ls(request, author_name):
                                                        author_name).order_by('-creation_date')
     objects = Algorithm.filter_latest_versions(objects)
 
-    return render_to_response('algorithms/list.html',
-                              dict(
-                                  objects=objects,
-                                  author=author,
-                                  owner=(request.user==author),
-                              ),
-                              context_instance=RequestContext(request),
-    )
+    return render(request,
+                  'algorithms/list.html',
+                  dict(
+                      objects=objects,
+                      author=author,
+                      owner=(request.user == author)
+                  ))
 
 
 #----------------------------------------------------------
@@ -297,11 +289,10 @@ def public_ls(request):
     objects = Algorithm.objects.public().order_by('-creation_date')
     objects = Algorithm.filter_latest_versions(objects)
 
-    return render_to_response('algorithms/list.html',
-                              dict(
-                                  objects=objects,
-                                  author=request.user, #anonymous
-                                  owner=False,
-                              ),
-                              context_instance=RequestContext(request),
-    )
+    return render(request,
+                  'algorithms/list.html',
+                  dict(
+                      objects=objects,
+                      author=request.user, # anonymous
+                      owner=False
+                  ))
diff --git a/beat/web/attestations/views.py b/beat/web/attestations/views.py
index 64e73a0ed72ff1f1a6e6ffda729ff754951ae52d..62d10e536c612962eaad659349b70a8f64fcb619 100644
--- a/beat/web/attestations/views.py
+++ b/beat/web/attestations/views.py
@@ -31,8 +31,7 @@
 
 
 from django.shortcuts import get_object_or_404
-from django.shortcuts import render_to_response
-from django.template import RequestContext
+from django.shortcuts import render
 from django.contrib.auth.models import User
 from django.db.models import Q
 
@@ -46,13 +45,13 @@ def view(request, number):
     (has_access, _) = attestation.experiment.accessibility_for(request.user)
 
     # Render the page
-    return render_to_response('attestations/view.html',
-                              dict(
-                                  attestation=attestation,
-                                  has_access=has_access,
-                                  owner=(attestation.experiment.author == request.user),
-                              ),
-                              context_instance=RequestContext(request))
+    return render(request,
+                  'attestations/view.html',
+                  dict(
+                      attestation=attestation,
+                      has_access=has_access,
+                      owner=(attestation.experiment.author == request.user)
+                  ))
 
 
 def ls(request, author_name):
@@ -75,14 +74,13 @@ def ls(request, author_name):
 
     objects = objects.order_by('-locked', 'expiration_date')
 
-    return render_to_response('attestations/list.html',
-                              dict(
-                                  objects=objects,
-                                  author=author,
-                                  owner=(request.user==author),
-                              ),
-                              context_instance=RequestContext(request),
-    )
+    return render(request,
+                  'attestations/list.html',
+                  dict(
+                      objects=objects,
+                      author=author,
+                      owner=(request.user == author)
+                  ))
 
 
 def public_ls(request):
@@ -91,11 +89,10 @@ def public_ls(request):
     # orders so that recent objects are displayed first
     objects = Attestation.objects.filter(locked=False).order_by('-publication_date')
 
-    return render_to_response('attestations/list.html',
-                              dict(
-                                  objects=objects,
-                                  author=request.user, #anonymous
-                                  owner=False,
-                              ),
-                              context_instance=RequestContext(request),
-    )
+    return render(request,
+                  'attestations/list.html',
+                  dict(
+                      objects=objects,
+                      author=request.user, # anonymous
+                      owner=False,
+                  ))
diff --git a/beat/web/backend/views.py b/beat/web/backend/views.py
index 94a71e5513337ca9e146b82e29c9bbf4b8df9759..de7bd1fb6ea08991373b083b477a9ec686ecc28c 100755
--- a/beat/web/backend/views.py
+++ b/beat/web/backend/views.py
@@ -36,8 +36,7 @@ from django.http import Http404, HttpResponseRedirect
 from django.conf import settings
 from django.core.urlresolvers import reverse
 from django.shortcuts import get_object_or_404
-from django.shortcuts import render_to_response
-from django.template import RequestContext
+from django.shortcuts import render
 from django.contrib.auth.decorators import login_required
 from django.http import HttpResponseForbidden
 from django.contrib import messages
@@ -81,18 +80,18 @@ def scheduler(request):
     if request.GET.has_key('period'):
         refreshing_period = int(request.GET['period'])
 
-    return render_to_response('backend/scheduler.html',
-                              dict(
-                                  jobs=state.jobs(),
-                                  experiments=state.experiments(),
-                                  workers=Worker.objects.order_by('-active', 'name'),
-                                  queues=Queue.objects.order_by('memory_limit', 'max_slots_per_user'),
-                                  cache_chart_data=simplejson.dumps(cache_chart_data),
-                                  cache_gb=cache_gb,
-                                  helper_panel=getattr(settings, 'SCHEDULING_PANEL', False),
-                                  refreshing_period=refreshing_period,
-                              ),
-                              context_instance=RequestContext(request))
+    return render(request,
+                  'backend/scheduler.html',
+                  dict(
+                      jobs=state.jobs(),
+                      experiments=state.experiments(),
+                      workers=Worker.objects.order_by('-active', 'name'),
+                      queues=Queue.objects.order_by('memory_limit', 'max_slots_per_user'),
+                      cache_chart_data=simplejson.dumps(cache_chart_data),
+                      cache_gb=cache_gb,
+                      helper_panel=getattr(settings, 'SCHEDULING_PANEL', False),
+                      refreshing_period=refreshing_period
+                  ))
 
 
 #------------------------------------------------
@@ -109,11 +108,9 @@ def environment(request, name, version):
         raise Http404()
 
     # Render the page
-    return render_to_response('backend/environment.html',
-                              {
-                                  'environment': environment,
-                              },
-                              context_instance=RequestContext(request))
+    return render(request,
+                  'backend/environment.html',
+                  {'environment': environment})
 
 
 #----------------------------------------------------------
@@ -125,15 +122,13 @@ def list_environments(request):
     objects = Environment.objects.for_user(request.user, True).filter(active=True).order_by('-creation_date')
 
     # Render the page
-    return render_to_response(
-        'backend/environment_list.html',
-            dict(
-                objects=objects,
-                author=request.user,
-                owner=True,
-            ),
-            context_instance=RequestContext(request),
-    )
+    return render(request,
+                  'backend/environment_list.html',
+                  dict(
+                      objects=objects,
+                      author=request.user,
+                      owner=True
+                  ))
 
 
 
diff --git a/beat/web/databases/views.py b/beat/web/databases/views.py
index 88d37e553728974ecb5d58c281ba1eec95d46b82..b2e22661ff6f14fe271bf932755d341adb9ab823 100644
--- a/beat/web/databases/views.py
+++ b/beat/web/databases/views.py
@@ -26,8 +26,7 @@
 ###############################################################################
 
 from django.http import Http404
-from django.shortcuts import render_to_response
-from django.template import RequestContext
+from django.shortcuts import render
 
 from .models import Database
 
@@ -48,10 +47,9 @@ def view(request, name, version=None):
         raise Http404
 
     # Render the page
-    return render_to_response('databases/view.html',
-                              {'database': database,
-                              },
-                              context_instance=RequestContext(request))
+    return render(request,
+                  'databases/view.html',
+                  {'database': database})
 
 
 def ls(request):
@@ -61,11 +59,10 @@ def ls(request):
     objects = Database.objects.for_user(request.user, True).order_by('-creation_date')
     objects = Database.filter_latest_versions(objects)
 
-    return render_to_response('databases/list.html',
-                              dict(
-                                  objects=objects,
-                                  author=request.user,
-                                  owner=True,
-                              ),
-                              context_instance=RequestContext(request),
-    )
+    return render(request,
+                  'databases/list.html',
+                  dict(
+                      objects=objects,
+                      author=request.user,
+                      owner=True,
+                  ))
diff --git a/beat/web/dataformats/serializers.py b/beat/web/dataformats/serializers.py
index a296776e9df18ef4b199d0a7a81851a1d42380b7..68fee96f423c4a9288da3ab288e3bf5adf046f9e 100644
--- a/beat/web/dataformats/serializers.py
+++ b/beat/web/dataformats/serializers.py
@@ -52,7 +52,8 @@ class BaseSerializer(DynamicFieldsSerializer):
     name = serializers.CharField(source="fullname")
     accessibility = serializers.SerializerMethodField()
 
-    class Meta:
+    class Meta(DynamicFieldsSerializer.Meta):
+        fields = '__all__'
         default_fields = ['name', 'short_description', 'accessibility']
 
     def get_accessibility(self, obj):
diff --git a/beat/web/dataformats/views.py b/beat/web/dataformats/views.py
index 63665106eb10ccf6c8e3ef03819518d97035049f..2140eda27dc4a51889a925df5abb0e99e9a0d111 100644
--- a/beat/web/dataformats/views.py
+++ b/beat/web/dataformats/views.py
@@ -29,8 +29,7 @@ from django.http import HttpResponseRedirect
 from django.core.urlresolvers import reverse
 from django.http import Http404
 from django.shortcuts import get_object_or_404
-from django.shortcuts import render_to_response
-from django.template import RequestContext
+from django.shortcuts import render
 from django.views.decorators.csrf import csrf_protect
 from django.contrib.auth.decorators import login_required
 from django.conf import settings
@@ -133,14 +132,14 @@ def create(request, name=None):
         form = CreationForm(**form_args)
 
 
-    return render_to_response('dataformats/edition.html',
-                              {
-                                  'form': form,
-                                'object': previous_version,
-                                'op': 'new-version' if previous_version else 'new',
-                                'edition': False,
-                              },
-                              context_instance=RequestContext(request))
+    return render(request,
+                  'dataformats/edition.html',
+                  {
+                    'form': form,
+                    'object': previous_version,
+                    'op': 'new-version' if previous_version else 'new',
+                    'edition': False,
+                  })
 
 
 #----------------------------------------------------------
@@ -210,13 +209,13 @@ def fork(request, author, name, version):
         form = CreationForm(**form_args)
 
 
-    return render_to_response('dataformats/edition.html',
-                              {
-                                  'form': form,
-                                'object': fork_of,
-                                'op': 'fork',
-                              },
-                              context_instance=RequestContext(request))
+    return render(request,
+                  'dataformats/edition.html',
+                  {
+                      'form': form,
+                    'object': fork_of,
+                    'op': 'fork',
+                  })
 
 
 #----------------------------------------------------------
@@ -287,12 +286,12 @@ def edit(request, author, name, version):
 
         form = UpdateForm(**form_args)
 
-    return render_to_response('dataformats/edition.html',
-                              {'form': form,
-                               'op': 'edit',
-                               'object': dataformat,
-                              },
-                              context_instance=RequestContext(request))
+    return render(request,
+                  'dataformats/edition.html',
+                  {'form': form,
+                   'op': 'edit',
+                   'object': dataformat,
+                  })
 
 
 #----------------------------------------------------------
@@ -328,14 +327,14 @@ def view(request, author, name, version=None):
     users = User.objects.exclude(username__in=settings.ACCOUNTS_TO_EXCLUDE_FROM_TEAMS).order_by('username')
 
     # Render the page
-    return render_to_response('dataformats/view.html',
-                              {
-                                  'dataformat': dataformat,
-                                  'owner': owner,
-                                  'users': users,
-                                  'teams': Team.objects.for_user(request.user, True)
-                              },
-                              context_instance=RequestContext(request))
+    return render(request,
+                  'dataformats/view.html',
+                  {
+                      'dataformat': dataformat,
+                      'owner': owner,
+                      'users': users,
+                      'teams': Team.objects.for_user(request.user, True)
+                  })
 
 
 #----------------------------------------------------------
@@ -351,15 +350,15 @@ def diff(request, author1, name1, version1, author2, name2, version2):
 
     """
 
-    return render_to_response('dataformats/diff.html',
-                              {'dataformat1_author':  author1,
-                               'dataformat1_name':    name1,
-                               'dataformat1_version': version1,
-                               'dataformat2_author':  author2,
-                               'dataformat2_name':    name2,
-                               'dataformat2_version': version2,
-                              },
-                              context_instance=RequestContext(request))
+    return render(request,
+                  'dataformats/diff.html',
+                  {'dataformat1_author':  author1,
+                   'dataformat1_name':    name1,
+                   'dataformat1_version': version1,
+                   'dataformat2_author':  author2,
+                   'dataformat2_name':    name2,
+                   'dataformat2_version': version2,
+                  })
 
 
 #----------------------------------------------------------
@@ -378,14 +377,13 @@ def ls(request, author_name):
                                                         author_name).order_by('-creation_date')
     objects = DataFormat.filter_latest_versions(objects)
 
-    return render_to_response('dataformats/list.html',
-                              dict(
-                                  objects=objects,
-                                  author=author,
-                                  owner=(request.user==author),
-                              ),
-                              context_instance=RequestContext(request),
-    )
+    return render(request,
+                  'dataformats/list.html',
+                  dict(
+                      objects=objects,
+                      author=author,
+                      owner=(request.user == author)
+                  ))
 
 
 #----------------------------------------------------------
@@ -398,11 +396,10 @@ def public_ls(request):
     objects = DataFormat.objects.public().order_by('-creation_date')
     objects = DataFormat.filter_latest_versions(objects)
 
-    return render_to_response('dataformats/list.html',
-                              dict(
-                                  objects=objects,
-                                  author=request.user, #anonymous
-                                  owner=False,
-                              ),
-                              context_instance=RequestContext(request),
-    )
+    return render(request,
+                  'dataformats/list.html',
+                  dict(
+                      objects=objects,
+                      author=request.user, #anonymous
+                      owner=False,
+                  ))
diff --git a/beat/web/experiments/serializers.py b/beat/web/experiments/serializers.py
index c9fde18c0b22dc936eb7ac5cd5c550dce6978249..c873f1e3cdc85dd9f40c562d309177adf5e166cf 100755
--- a/beat/web/experiments/serializers.py
+++ b/beat/web/experiments/serializers.py
@@ -59,6 +59,7 @@ class ExperimentSerializer(ShareableSerializer):
 
     class Meta:
         model = Experiment
+        fields = '__all__'
         default_fields = ShareableSerializer.Meta.default_fields + ['name', 'toolchain',
                                                                     'datasets', 'short_description',
                                                                     'creation_date', 'start_date', 'end_date',
@@ -148,6 +149,7 @@ class AnalyzerSerializer(serializers.ModelSerializer):
 
     class Meta:
         model = Block
+        fields = '__all__'
 
     def get_results(self, obj):
         results = {}
@@ -187,6 +189,7 @@ class BlockErrorSerializer(serializers.ModelSerializer):
 
     class Meta:
         model = Block
+        fields = '__all__'
 
 
 #----------------------------------------------------------
@@ -211,6 +214,7 @@ class ExperimentResultsSerializer(ShareableSerializer):
 
     class Meta(ShareableSerializer.Meta):
         model = Experiment
+        fields = '__all__'
         default_fields = ['started', 'done', 'failed', 'status', 'blocks_status',
                           'results', 'attestation', 'declaration',
                           'errors', 'sharing', 'accessibility',
diff --git a/beat/web/experiments/views.py b/beat/web/experiments/views.py
index 576af7f573ba291773ed46f4b8b1bc00d1838720..94059074eada47a499bf9ac0bef853723e08c313 100644
--- a/beat/web/experiments/views.py
+++ b/beat/web/experiments/views.py
@@ -26,9 +26,8 @@
 ###############################################################################
 
 from django.shortcuts import get_object_or_404
-from django.shortcuts import render_to_response, redirect
+from django.shortcuts import render, redirect
 from django.http import Http404
-from django.template import RequestContext
 from django.contrib.auth.decorators import login_required
 from django.contrib.auth.models import User
 from django.conf import settings
@@ -59,14 +58,12 @@ def new_from_toolchain(request, toolchain_author_name, toolchain_name,
     has_access = toolchain.accessibility_for(request.user)[0]
     if not(has_access): raise Http404()
 
-    return render_to_response(
-        'experiments/setup.html',
-            {
-                'toolchain': toolchain,
-                'action': 'new',
-            },
-            context_instance=RequestContext(request),
-    )
+    return render(request,
+                  'experiments/setup.html',
+                  {
+                      'toolchain': toolchain,
+                      'action': 'new',
+                  })
 
 
 #----------------------------------------------------------
@@ -91,15 +88,13 @@ def fork(request, author_name, toolchain_author_name,
     (has_access, accessibility) = experiment.accessibility_for(request.user)
     if not(has_access): raise Http404()
 
-    return render_to_response(
-        'experiments/setup.html',
-            {
-                'toolchain': experiment.toolchain,
-                'experiment': experiment,
-                'action': 'fork',
-            },
-            context_instance=RequestContext(request),
-    )
+    return render(request,
+                  'experiments/setup.html',
+                  {
+                      'toolchain': experiment.toolchain,
+                      'experiment': experiment,
+                      'action': 'fork',
+                  })
 
 
 #----------------------------------------------------------
@@ -146,30 +141,26 @@ def view(request, author_name, toolchain_author_name, toolchain_name,
 
     if experiment.status == Experiment.PENDING:
         if request.user.is_anonymous(): raise Http404()
-        return render_to_response(
-            'experiments/setup.html',
-                {
-                    'toolchain': experiment.toolchain,
-                    'experiment': experiment,
-                    'action': 'pending',
-                },
-                context_instance=RequestContext(request),
-        )
+        return render(request,
+                      'experiments/setup.html',
+                      {
+                          'toolchain': experiment.toolchain,
+                          'experiment': experiment,
+                          'action': 'pending',
+                      })
 
     # Users the object can be shared with
     users = User.objects.exclude(username__in=settings.ACCOUNTS_TO_EXCLUDE_FROM_TEAMS).order_by('username')
 
     # The experiment was already done, show results
-    return render_to_response(
-        'experiments/view.html',
-            {
-                'experiment': experiment,
-                'owner': experiment.author == request.user,
-                'users': users,
-                'teams': Team.objects.for_user(request.user, True)
-            },
-            context_instance=RequestContext(request),
-    )
+    return render(request,
+                  'experiments/view.html',
+                  {
+                      'experiment': experiment,
+                      'owner': experiment.author == request.user,
+                      'users': users,
+                      'teams': Team.objects.for_user(request.user, True)
+                  })
 
 
 #----------------------------------------------------------
@@ -193,14 +184,13 @@ def ls(request, author_name):
 
     owner = (request.user == author)
 
-    return render_to_response('experiments/list.html',
-                              dict(
-                                  objects=objects,
-                                  author=author,
-                                  owner=owner,
-                              ),
-                              context_instance=RequestContext(request),
-    )
+    return render(request,
+                  'experiments/list.html',
+                  dict(
+                      objects=objects,
+                      author=author,
+                      owner=owner,
+                  ))
 
 
 #----------------------------------------------------------
@@ -212,11 +202,10 @@ def public_ls(request):
     # orders so that recent objects are displayed first
     objects = Experiment.objects.public().exclude(status=Experiment.PENDING).annotate(updated=Coalesce('end_date', 'start_date', 'creation_date')).order_by('-updated')
 
-    return render_to_response('experiments/list.html',
-                              dict(
-                                  objects=objects,
-                                  author=request.user, #anonymous
-                                  owner=False,
-                              ),
-                              context_instance=RequestContext(request),
-    )
+    return render(request,
+                  'experiments/list.html',
+                  dict(
+                      objects=objects,
+                      author=request.user, #anonymous
+                      owner=False,
+                  ))
diff --git a/beat/web/libraries/views.py b/beat/web/libraries/views.py
index 38ce49142a28690e2e91b5296bda90620d2daf2b..79b3af4402372e611954a9e03c966c916fe29d6b 100644
--- a/beat/web/libraries/views.py
+++ b/beat/web/libraries/views.py
@@ -27,8 +27,7 @@
 
 from django.http import Http404, HttpResponseForbidden
 from django.shortcuts import get_object_or_404
-from django.shortcuts import render_to_response
-from django.template import RequestContext
+from django.shortcuts import render
 from django.views.decorators.csrf import csrf_protect
 from django.contrib.auth.decorators import login_required
 from django.contrib.auth.models import User
@@ -55,14 +54,13 @@ def create(request):
     visible_libraries = Library.objects.from_author_and_public(request.user,
                                                                request.user.username).order_by('-creation_date')
 
-    return render_to_response('libraries/edition.html',
-                              dict(
-                                  op="new",
-                                  texts=Messages,
-                                  visible_libraries=visible_libraries,
-                              ),
-                              context_instance=RequestContext(request)
-    )
+    return render(request,
+                  'libraries/edition.html',
+                  dict(
+                      op="new",
+                      texts=Messages,
+                      visible_libraries=visible_libraries,
+                  ))
 
 
 @csrf_protect
@@ -81,15 +79,14 @@ def new_version(request, name):
     visible_libraries = Library.objects.from_author_and_public(request.user,
                                                                request.user.username).order_by('-creation_date')
 
-    return render_to_response('libraries/edition.html',
-                              dict(
-                                  op="new-version",
-                                  texts=Messages,
-                                  library=previous_version[0],
-                                  visible_libraries=visible_libraries,
-                              ),
-                              context_instance=RequestContext(request)
-    )
+    return render(request,
+                  'libraries/edition.html',
+                  dict(
+                      op="new-version",
+                      texts=Messages,
+                      library=previous_version[0],
+                      visible_libraries=visible_libraries,
+                  ))
 
 
 @csrf_protect
@@ -119,14 +116,14 @@ def fork(request, author_name, name, version):
     visible_libraries = Library.objects.from_author_and_public(request.user,
                                                                request.user.username).order_by('-creation_date')
 
-    return render_to_response('libraries/edition.html',
-                              dict(
-                                  op="fork",
-                                  texts=Messages,
-                                  library=fork_of,
-                                  visible_libraries=visible_libraries,
-                              ),
-                              context_instance=RequestContext(request))
+    return render(request,
+                  'libraries/edition.html',
+                  dict(
+                      op="fork",
+                      texts=Messages,
+                      library=fork_of,
+                      visible_libraries=visible_libraries,
+                  ))
 
 
 #----------------------------------------------------------
@@ -153,14 +150,14 @@ def edit(request, author_name, name, version):
     visible_libraries = Library.objects.from_author_and_public(request.user,
                                                                request.user.username).exclude(id=library.id).order_by('-creation_date')
 
-    return render_to_response('libraries/edition.html',
-                              dict(
-                                  op="edit",
-                                  texts=Messages,
-                                  library=library,
-                                  visible_libraries=visible_libraries,
-                              ),
-                              context_instance=RequestContext(request))
+    return render(request,
+                  'libraries/edition.html',
+                  dict(
+                      op="edit",
+                      texts=Messages,
+                      library=library,
+                      visible_libraries=visible_libraries,
+                  ))
 
 
 #----------------------------------------------------------
@@ -195,14 +192,14 @@ def view(request, author_name, name, version=None):
     users = User.objects.exclude(username__in=settings.ACCOUNTS_TO_EXCLUDE_FROM_TEAMS).order_by('username')
 
     # Render the page
-    return render_to_response('libraries/view.html',
-                              {
-                                  'library': library,
-                                  'owner': owner,
-                                  'users': users,
-                                  'teams': Team.objects.all(),
-                              },
-                              context_instance=RequestContext(request))
+    return render(request,
+                  'libraries/view.html',
+                  {
+                      'library': library,
+                      'owner': owner,
+                      'users': users,
+                      'teams': Team.objects.all(),
+                  })
 
 
 #----------------------------------------------------------
@@ -218,15 +215,15 @@ def diff(request, author1, name1, version1, author2, name2, version2):
 
     """
 
-    return render_to_response('libraries/diff.html',
-                              {'library1_author':  author1,
-                               'library1_name':    name1,
-                               'library1_version': version1,
-                               'library2_author':  author2,
-                               'library2_name':    name2,
-                               'library2_version': version2,
-                              },
-                              context_instance=RequestContext(request))
+    return render(request,
+                  'libraries/diff.html',
+                  {'library1_author':  author1,
+                   'library1_name':    name1,
+                   'library1_version': version1,
+                   'library2_author':  author2,
+                   'library2_name':    name2,
+                   'library2_version': version2,
+                  })
 
 
 #----------------------------------------------------------
@@ -245,14 +242,13 @@ def ls(request, author_name):
                                                      author_name).order_by('-creation_date')
     objects = Library.filter_latest_versions(objects)
 
-    return render_to_response('libraries/list.html',
-                              dict(
-                                  objects=objects,
-                                  author=author,
-                                  owner=(request.user==author),
-                              ),
-                              context_instance=RequestContext(request),
-    )
+    return render(request,
+                  'libraries/list.html',
+                  dict(
+                      objects=objects,
+                      author=author,
+                      owner=(request.user==author),
+                  ))
 
 
 #----------------------------------------------------------
@@ -265,11 +261,10 @@ def public_ls(request):
     objects = Library.objects.public().order_by('-creation_date')
     objects = Library.filter_latest_versions(objects)
 
-    return render_to_response('libraries/list.html',
-                              dict(
-                                  objects=objects,
-                                  author=request.user, #anonymous
-                                  owner=False,
-                              ),
-                              context_instance=RequestContext(request),
-    )
+    return render(request,
+                  'libraries/list.html',
+                  dict(
+                      objects=objects,
+                      author=request.user, #anonymous
+                      owner=False,
+                  ))
diff --git a/beat/web/navigation/views.py b/beat/web/navigation/views.py
index d291dbc212ecf36aec1985a15d5e3631b6af9483..40989eab44659ae1033d44e1066b8e964cc88378 100644
--- a/beat/web/navigation/views.py
+++ b/beat/web/navigation/views.py
@@ -25,10 +25,8 @@
 #                                                                             #
 ###############################################################################
 
-from django.shortcuts import render_to_response
-from django.shortcuts import get_object_or_404
-from django.template import RequestContext, Context, loader
-from django.contrib import messages
+from django.shortcuts import render
+from django.template import Context, loader
 from django.conf import settings
 
 from .middleware import remove_banner_message
@@ -50,11 +48,9 @@ def terms_of_service(request):
             settings.LEGAL_DISCLAIMER_VERSION
     remove_banner_message(request)
 
-    return render_to_response(
-        'navigation/terms_of_service.html',
-            dict(contents=contents),
-            context_instance=RequestContext(request),
-    )
+    return render(request,
+                  'navigation/terms_of_service.html',
+                  dict(contents=contents))
 
 
 #------------------------------------------------
@@ -77,11 +73,9 @@ def legal_disclaimer(request):
 
     remove_banner_message(request)
 
-    return render_to_response(
-        'navigation/legal_disclaimer.html',
-            dict(contents=contents),
-            context_instance=RequestContext(request),
-    )
+    return render(request,
+                  'navigation/legal_disclaimer.html',
+                  dict(contents=contents))
 
 
 
@@ -91,8 +85,4 @@ def legal_disclaimer(request):
 def contact(request):
     '''Returns an HTML page with the contact information'''
 
-    return render_to_response(
-        'navigation/contact.html',
-            dict(),
-            context_instance=RequestContext(request),
-    )
+    return render(request, 'navigation/contact.html')
diff --git a/beat/web/plotters/serializers.py b/beat/web/plotters/serializers.py
index e6a6ce109494b25d89c7489448999c2c89c5f898..3577c9f5397c29c28bf4f49ed6bd206bef2ecb70 100644
--- a/beat/web/plotters/serializers.py
+++ b/beat/web/plotters/serializers.py
@@ -101,6 +101,7 @@ class FullPlotterSerializer(PlotterAllSerializer):
 
     class Meta(PlotterAllSerializer.Meta):
         default_fields = PlotterAllSerializer.Meta.default_fields + PlotterAllSerializer.Meta.extra_fields
+        exclude = []
 
 
 #----------------------------------------------------------
@@ -117,7 +118,7 @@ class PlotterParameterCreationSerializer(ContributionCreationSerializer):
 
     def create(self, validated_data):
         plotterparameter = None
-        
+
         if not validated_data.has_key("name"):
             raise serializers.ValidationError('No name provided')
 
@@ -131,7 +132,7 @@ class PlotterParameterCreationSerializer(ContributionCreationSerializer):
 
         if not self.data.has_key("plotter"):
             raise serializers.ValidationError('No plotter provided')
-        
+
         plotter = None
         try:
             plotter = Plotter.objects.get(id=self.data['plotter'])
diff --git a/beat/web/plotters/views.py b/beat/web/plotters/views.py
index 71a9b270454d53146e9993a8ca0d78070395de91..2bf1c23623e060130f1fc72e89c6c66cd24d64d7 100644
--- a/beat/web/plotters/views.py
+++ b/beat/web/plotters/views.py
@@ -37,9 +37,9 @@ import simplejson
 
 from django.http import HttpResponse, HttpResponseForbidden, HttpResponseBadRequest
 from django.conf import settings
-from django.shortcuts import render_to_response
+from django.shortcuts import render
 from django.shortcuts import get_object_or_404
-from django.template import RequestContext, Context
+from django.template import Context
 from django.contrib.auth.decorators import login_required
 from django.contrib.auth.models import User
 from django.views.generic import TemplateView
@@ -614,14 +614,14 @@ def view(request, author, name, version=None):
     users = User.objects.exclude(username__in=settings.ACCOUNTS_TO_EXCLUDE_FROM_TEAMS).order_by('username')
 
     # Render the page
-    return render_to_response('plotters/view.html',
-                              {
-                                  'plotter': plotter,
-                                  'owner': owner,
-                                  'users': users,
-                                  'teams': Team.objects.for_user(request.user, True)
-                              },
-                              context_instance=RequestContext(request))
+    return render(request,
+                  'plotters/view.html',
+                  {
+                      'plotter': plotter,
+                      'owner': owner,
+                      'users': users,
+                      'teams': Team.objects.for_user(request.user, True)
+                  })
 
 
 #----------------------------------------------------------
@@ -639,14 +639,14 @@ def list_plotters(request):
         objects=Plotter.objects.from_author_and_public(request.user,request.user.username)
         owner=(request.user==author)
 
-    return render_to_response('plotters/list.html',
-                              dict(
-                                  objects=objects,
-                                  author=author,
-                                  owner=owner,
-                              ),
-                              context_instance=RequestContext(request),
-    )
+    return render(request,
+                  'plotters/list.html',
+                  dict(
+                      objects=objects,
+                      author=author,
+                      owner=owner,
+                  ))
+
 
 #----------------------------------------------------------
 
@@ -657,14 +657,13 @@ def list_plotters_public(request):
     # orders so that objects with latest information are displayed first
     objects=Plotter.objects.public().order_by('-creation_date')
 
-    return render_to_response('plotters/list.html',
-                              dict(
-                                  objects=objects,
-                                  author=request.user, #anonymous
-                                  owner=False,
-                              ),
-                              context_instance=RequestContext(request),
-    )
+    return render(request,
+                  'plotters/list.html',
+                  dict(
+                      objects=objects,
+                      author=request.user, #anonymous
+                      owner=False,
+                  ))
 
 
 #----------------------------------------------------------
@@ -681,14 +680,13 @@ def list_plotterparameters(request, author_name):
 
     owner=(request.user==author)
 
-    return render_to_response('plotterparameters/list.html',
-                              dict(
-                                  objects=objects,
-                                  author=author,
-                                  owner=owner,
-                              ),
-                              context_instance=RequestContext(request),
-    )
+    return render(request,
+                  'plotterparameters/list.html',
+                  dict(
+                      objects=objects,
+                      author=author,
+                      owner=owner,
+                  ))
 
 
 #----------------------------------------------------------
@@ -701,14 +699,13 @@ def list_plotterparameters_public(request):
     objects = PlotterParameter.objects.public().order_by('-creation_date')
     objects = PlotterParameter.filter_latest_versions(objects)
 
-    return render_to_response('plotterparameters/list.html',
-                              dict(
-                                  objects=objects,
-                                  author=request.user, #anonymous
-                                  owner=False,
-                              ),
-                              context_instance=RequestContext(request),
-    )
+    return render(request,
+                  'plotterparameters/list.html',
+                  dict(
+                      objects=objects,
+                      author=request.user, #anonymous
+                      owner=False,
+                  ))
 
 
 #----------------------------------------------------------
@@ -725,14 +722,13 @@ def plotterparameter_latest(request, author, name):
 
     objects = PlotterParameter.filter_latest_versions(objects)
 
-    return render_to_response('plotterparameters/list.html',
-                              dict(
-                                  objects=objects,
-                                  author=request.user, #anonymous
-                                  owner=False,
-                              ),
-                              context_instance=RequestContext(request),
-    )
+    return render(request,
+                  'plotterparameters/list.html',
+                  dict(
+                      objects=objects,
+                      author=request.user, #anonymous
+                      owner=False,
+                  ))
 
 
 
@@ -758,18 +754,18 @@ def plotterparameter_for_author(request, author_name, plotterparameter_name, ver
     # Users the object can be shared with
     users = User.objects.exclude(username__in=settings.ACCOUNTS_TO_EXCLUDE_FROM_TEAMS).order_by('username')
 
-    return render_to_response('plotterparameters/plotterparameter.html',
-                              {
-                                  'author'      : author_name,
-                                  'plotterparameter_name' : plotterparameter_name,
-                                  'owner'       : (request.user == obj.author),
-                                  'users': users,
-                                  'teams': Team.objects.for_user(request.user, True),
-                                  'plotterparameter'      : obj,
-                                  'plotter_origin'      : plotter_origin,
-                                  'USE_HTTPS_GRAVATAR': settings.USE_HTTPS_GRAVATAR,
-                              },
-                              context_instance=RequestContext(request))
+    return render(request,
+                  'plotterparameters/plotterparameter.html',
+                  {
+                      'author'      : author_name,
+                      'plotterparameter_name' : plotterparameter_name,
+                      'owner'       : (request.user == obj.author),
+                      'users': users,
+                      'teams': Team.objects.for_user(request.user, True),
+                      'plotterparameter'      : obj,
+                      'plotter_origin'      : plotter_origin,
+                      'USE_HTTPS_GRAVATAR': settings.USE_HTTPS_GRAVATAR,
+                  })
 
 
 #----------------------------------------------------------
@@ -798,14 +794,14 @@ def diff(request, author1, name1, version1, author2, name2, version2):
     has_access, _ = plotterparameter2.accessibility_for(request.user)
     if not has_access: raise Http404()
 
-    return render_to_response('plotterparameters/diff.html',
-                              {
-                                  'plotterparameter1':  plotterparameter1,
-                                  'plotterparameter1_data':  simplejson.loads(plotterparameter1.data),
-                                  'plotterparameter2':  plotterparameter2,
-                                  'plotterparameter2_data':  simplejson.loads(plotterparameter2.data),
-                              },
-                              context_instance=RequestContext(request))
+    return render(request,
+                  'plotterparameters/diff.html',
+                  {
+                      'plotterparameter1':  plotterparameter1,
+                      'plotterparameter1_data':  simplejson.loads(plotterparameter1.data),
+                      'plotterparameter2':  plotterparameter2,
+                      'plotterparameter2_data':  simplejson.loads(plotterparameter2.data),
+                  })
 
 
 #----------------------------------------------------------
@@ -822,17 +818,16 @@ def create_plotterparameter(request, author_name):
 
     owner=(request.user==author)
 
-    return render_to_response('plotterparameters/plotterparameter.html',
-                              dict(
-                                  objects=objects,
-                                  author=author,
-                                  owner=owner,
-                                  plotterparameter_name="CREATION_MODE",
-                                  plotterparameter="CREATION_MODE",
-                                  USE_HTTPS_GRAVATAR=settings.USE_HTTPS_GRAVATAR,
-                              ),
-                              context_instance=RequestContext(request),
-    )
+    return render(request,
+                 'plotterparameters/plotterparameter.html',
+                  dict(
+                      objects=objects,
+                      author=author,
+                      owner=owner,
+                      plotterparameter_name="CREATION_MODE",
+                      plotterparameter="CREATION_MODE",
+                      USE_HTTPS_GRAVATAR=settings.USE_HTTPS_GRAVATAR,
+                  ))
 
 #------------------------------------------------
 
@@ -877,17 +872,16 @@ def create_new_version(request, author_name=None, plotterparameter_name=None, ve
         declaration, errors = prototypes.load('toolchain')
         parameters['declaration'] = simplejson.dumps(declaration)
 
-    return render_to_response('plotterparameters/plotterparameter.html',
-                              dict(
-                                  author=request.user.username,
-                                  parameters=parameters,
-                                  plotterparameter_name=plotterparameter_name,
-                                  plotterparameter=plotterparameter,
-                                  owner=(request.user == plotterparameter.author),
-                                  plotterparameter_mode="NEW_VERSION_MODE",
-                              ),
-                              context_instance=RequestContext(request),
-    )
+    return render(request,
+                  'plotterparameters/plotterparameter.html',
+                  dict(
+                      author=request.user.username,
+                      parameters=parameters,
+                      plotterparameter_name=plotterparameter_name,
+                      plotterparameter=plotterparameter,
+                      owner=(request.user == plotterparameter.author),
+                      plotterparameter_mode="NEW_VERSION_MODE",
+                  ))
 
 
 @login_required
@@ -918,17 +912,16 @@ def fork(request, author_name, plotterparameter_name, version):
                   'request_user': request.user.username,
     }
 
-    return render_to_response('plotterparameters/plotterparameter.html',
-                              dict(
-                                  author=request.user.username,
-                                  parameters=parameters,
-                                  plotterparameter_name=plotterparameter_name,
-                                  plotterparameter=fork_of,
-                                  owner=(request.user == fork_of.author),
-                                  plotterparameter_mode="FORK_MODE",
-                              ),
-                              context_instance=RequestContext(request),
-    )
+    return render(request,
+                  'plotterparameters/plotterparameter.html',
+                  dict(
+                      author=request.user.username,
+                      parameters=parameters,
+                      plotterparameter_name=plotterparameter_name,
+                      plotterparameter=fork_of,
+                      owner=(request.user == fork_of.author),
+                      plotterparameter_mode="FORK_MODE",
+                  ))
 
 
 
diff --git a/beat/web/reports/views.py b/beat/web/reports/views.py
index 59aa872b8999d91a7bc7f0fee627561b32b3d8d7..1ad7f06d82108824578e6f4d150e864a80507515 100644
--- a/beat/web/reports/views.py
+++ b/beat/web/reports/views.py
@@ -25,9 +25,9 @@
 #                                                                             #
 ###############################################################################
 
-from django.shortcuts import render_to_response, redirect
+from django.shortcuts import render, redirect
 from django.shortcuts import get_object_or_404
-from django.template import RequestContext, Context
+from django.template import Context
 from django.conf import settings
 from django.views.generic import TemplateView
 from django.contrib.auth.models import User
@@ -73,15 +73,15 @@ def by_number(request, number):
         # return 404
         raise Http404('No %s matches the given query.' % Report._meta.object_name)
 
-    return render_to_response('reports/report.html',
-                              {
-                                  'report_number' : number,
-                                  'owner': False,
-                                  'report': obj,
-                                  'USE_HTTPS_GRAVATAR': settings.USE_HTTPS_GRAVATAR,
-                                  'show_actionbar': show_actionbar(request, obj)
-                              },
-                              context_instance=RequestContext(request))
+    return render(request,
+                  'reports/report.html',
+                  {
+                      'report_number' : number,
+                      'owner': False,
+                      'report': obj,
+                      'USE_HTTPS_GRAVATAR': settings.USE_HTTPS_GRAVATAR,
+                      'show_actionbar': show_actionbar(request, obj)
+                  })
 
 
 #------------------------------------------------
@@ -106,16 +106,16 @@ def for_author(request, author_name, report_name):
 
     # only valid when the author is accessing it and its editable
     if isEditable and isAuthor:
-        return render_to_response('reports/report.html',
-                                  {
-                                      'author'      : author_name,
-                                      'report_name' : report_name,
-                                      'owner'       : (request.user == obj.author),
-                                      'report'      : obj,
-                                      'USE_HTTPS_GRAVATAR': settings.USE_HTTPS_GRAVATAR,
-                                      'show_actionbar': show_actionbar(request, obj)
-                                  },
-                                  context_instance=RequestContext(request))
+        return render(request,
+                      'reports/report.html',
+                      {
+                          'author'      : author_name,
+                          'report_name' : report_name,
+                          'owner'       : (request.user == obj.author),
+                          'report'      : obj,
+                          'USE_HTTPS_GRAVATAR': settings.USE_HTTPS_GRAVATAR,
+                          'show_actionbar': show_actionbar(request, obj)
+                      })
 
     # return 404
     raise Http404('No %s matches the given query.' % Report._meta.object_name)
@@ -142,14 +142,13 @@ def ls(request, author_name):
 
     objects = objects.annotate(updated=Coalesce('publication_date', 'creation_date',)).order_by('-updated')
 
-    return render_to_response('reports/list.html',
-                              dict(
-                                  objects=objects,
-                                  author=author,
-                                  owner=owner,
-                              ),
-                              context_instance=RequestContext(request),
-    )
+    return render(request,
+                  'reports/list.html',
+                  dict(
+                      objects=objects,
+                      author=author,
+                      owner=owner,
+                  ))
 
 
 #------------------------------------------------
@@ -162,14 +161,13 @@ def public_ls(request):
 
     objects = objects.annotate(updated=Coalesce('publication_date', 'creation_date',)).order_by('-updated')
 
-    return render_to_response('reports/list.html',
-                              dict(
-                                  objects=objects,
-                                  author=request.user,
-                                  owner=False,
-                              ),
-                              context_instance=RequestContext(request),
-    )
+    return render(request,
+                  'reports/list.html',
+                  dict(
+                      objects=objects,
+                      author=request.user,
+                      owner=False,
+                  ))
 
 
 #------------------------------------------------
diff --git a/beat/web/search/models.py b/beat/web/search/models.py
index 5577c5637eb682bbe049d88ba45aa33618487b1f..f70b392b3024a52ffa1b3630c3b774b2348ae67c 100644
--- a/beat/web/search/models.py
+++ b/beat/web/search/models.py
@@ -132,7 +132,6 @@ class Leaderboard(models.Model):
     notify = models.ManyToManyField(User, limit_choices_to={'is_active': True}, blank=True, help_text='If set, and the leader board changes, an e-mail notification will be sent to people on this list, every time it changes.')
 
     experiments = models.ManyToManyField(Experiment,
-                                         limit_choices_to={'status': Experiment.DONE},
                                          through='Rank',
                                          related_name='leaderboards',
                                          blank=True,
diff --git a/beat/web/search/views.py b/beat/web/search/views.py
index 2e139be5bb17d24378570053954252a405c266ea..19a7f34a008c13bda621276b8c50cbb0b659ca69 100644
--- a/beat/web/search/views.py
+++ b/beat/web/search/views.py
@@ -26,9 +26,8 @@
 ###############################################################################
 
 from django.http import Http404
-from django.shortcuts import render_to_response, redirect
+from django.shortcuts import render, redirect
 from django.shortcuts import get_object_or_404
-from django.template import RequestContext
 from django.conf import settings
 from django.contrib.auth.models import User
 from django.db.models import Count
@@ -285,16 +284,16 @@ def search(request):
     if 'settings' in request.POST: #overrules the other two
         display_settings = request.POST['settings'].strip()
 
-    return render_to_response('search/view.html',
-                              dict(
-                                  search=None,
-                                  owner=False,
-                                  filters=filters,
-                                  settings=display_settings,
-                                  results=search_experiments(request.user, json.loads(filters)),
-                                  URL_PREFIX=settings.URL_PREFIX,
-                              ),
-                              context_instance=RequestContext(request))
+    return render(request,
+                  'search/view.html',
+                  dict(
+                      search=None,
+                      owner=False,
+                      filters=filters,
+                      settings=display_settings,
+                      results=search_experiments(request.user, json.loads(filters)),
+                      URL_PREFIX=settings.URL_PREFIX,
+                  ))
 
 
 #------------------------------------------------
@@ -327,19 +326,18 @@ def view(request, author_name, query_name):
     # Users the object can be shared with
     users = User.objects.exclude(username__in=settings.ACCOUNTS_TO_EXCLUDE_FROM_TEAMS).order_by('username')
 
-    return render_to_response('search/view.html',
-                              {
-                                  'search': obj,
-                                  'owner': (request.user == obj.author),
-                                  'filters': filters,
-                                  'settings': display_settings,
-                                  'results': search_experiments(request.user, json.loads(filters)),
-                                  'URL_PREFIX': settings.URL_PREFIX,
-                                  'users': users,
-                                  'teams': Team.objects.for_user(request.user, True)
-                              },
-                              context_instance=RequestContext(request),
-    )
+    return render(request,
+                  'search/view.html',
+                  {
+                      'search': obj,
+                      'owner': (request.user == obj.author),
+                      'filters': filters,
+                      'settings': display_settings,
+                      'results': search_experiments(request.user, json.loads(filters)),
+                      'URL_PREFIX': settings.URL_PREFIX,
+                      'users': users,
+                      'teams': Team.objects.for_user(request.user, True)
+                  })
 
 
 #----------------------------------------------------------
@@ -357,14 +355,13 @@ def ls(request, author_name):
     objects = Search.objects.from_author_and_public(request.user,
                                                     author_name).order_by('-creation_date')
 
-    return render_to_response('search/list.html',
-                              dict(
-                                  objects=objects,
-                                  author=author,
-                                  owner=(request.user==author),
-                              ),
-                              context_instance=RequestContext(request),
-    )
+    return render(request,
+                  'search/list.html',
+                  dict(
+                      objects=objects,
+                      author=author,
+                      owner=(request.user==author),
+                  ))
 
 
 #----------------------------------------------------------
@@ -376,14 +373,13 @@ def public_ls(request):
     # orders searchs so that the latest information is displayed first
     objects = Search.objects.public().order_by('-creation_date')
 
-    return render_to_response('search/list.html',
-                              dict(
-                                  objects=objects,
-                                  author=request.user,
-                                  owner=False,
-                              ),
-                              context_instance=RequestContext(request),
-    )
+    return render(request,
+                  'search/list.html',
+                  dict(
+                      objects=objects,
+                      author=request.user,
+                      owner=False,
+                  ))
 
 
 #----------------------------------------------------------
diff --git a/beat/web/settings/settings.py b/beat/web/settings/settings.py
index d27a2aca26a20e5d742e2172b6282b4a54452bb9..355efa685036a48c67eb3c4d7061fca0bf3274b6 100755
--- a/beat/web/settings/settings.py
+++ b/beat/web/settings/settings.py
@@ -300,7 +300,7 @@ TEMPLATES = [
         'OPTIONS': {
             'context_processors': [
                 'django.contrib.auth.context_processors.auth',
-                'django.core.context_processors.request',
+                'django.template.context_processors.request',
                 'django.template.context_processors.csrf',
                 'django.contrib.messages.context_processors.messages',
                 'beat.web.navigation.context_processors.exported_settings',
@@ -313,10 +313,13 @@ TEMPLATES = [
 ]
 
 MIDDLEWARE_CLASSES = (
+    'django.middleware.security.SecurityMiddleware',
     'django.middleware.common.CommonMiddleware',
     'django.contrib.sessions.middleware.SessionMiddleware',
+    'django.middleware.csrf.CsrfViewMiddleware',
     'django.contrib.auth.middleware.AuthenticationMiddleware',
     'django.contrib.messages.middleware.MessageMiddleware',
+    'django.middleware.clickjacking.XFrameOptionsMiddleware',
     'beat.web.navigation.middleware.AgreementMiddleware',
 )
 
diff --git a/beat/web/statistics/views.py b/beat/web/statistics/views.py
index 616fdcb5ed419e2b3b84e490b07c3ef0fded9c90..f35426c98e89f4bce02b135980109020c10e80b2 100644
--- a/beat/web/statistics/views.py
+++ b/beat/web/statistics/views.py
@@ -31,14 +31,14 @@ import itertools
 
 import simplejson
 
-from django.shortcuts import render_to_response
-from django.template import RequestContext
+from django.shortcuts import render
 from django.contrib.auth.decorators import login_required
 from django.http import HttpResponseForbidden
 from django.db.models import Sum
 
 from .models import HourlyStatistics
 
+
 def calculate_totals():
     """Caculates all totals required by the statistics display"""
 
@@ -269,11 +269,11 @@ def statistics(request):
 
     if not(request.user.is_superuser): return HttpResponseForbidden()
 
-    return render_to_response('statistics/statistics.html',
-                              dict(
-                                  totals=calculate_totals(),
-                                  hourly_chart_data=hourly_charts(),
-                                  daily_chart_data=daily_charts(),
-                                  weekly_chart_data=weekly_charts(),
-                              ),
-                              context_instance=RequestContext(request))
+    return render(request,
+                  'statistics/statistics.html',
+                  dict(
+                      totals=calculate_totals(),
+                      hourly_chart_data=hourly_charts(),
+                      daily_chart_data=daily_charts(),
+                      weekly_chart_data=weekly_charts(),
+                  ))
diff --git a/beat/web/team/views.py b/beat/web/team/views.py
index 902eb1b68159f3e3f656bd3725cb661b30d5c4c7..1bdcdb342f7a714a0d4873cf42f0952af6fe46ea 100644
--- a/beat/web/team/views.py
+++ b/beat/web/team/views.py
@@ -28,9 +28,7 @@
 from django.conf import settings
 from django.shortcuts import get_object_or_404
 from django.shortcuts import render
-from django.shortcuts import render_to_response
 from django.contrib.auth.decorators import login_required
-from django.template import RequestContext
 from django.contrib.auth.models import User
 from django.http import Http404
 
@@ -47,11 +45,11 @@ def create(request):
     The user must be authenticated before it can add a new team
     """
 
-    return render_to_response('team/edition.html',
-                              {
-                                  'users': User.objects.exclude(username__in=settings.ACCOUNTS_TO_EXCLUDE_FROM_TEAMS).order_by('username'),
-                              },
-                              context_instance=RequestContext(request))
+    return render(request,
+                  'team/edition.html',
+                  {
+                      'users': User.objects.exclude(username__in=settings.ACCOUNTS_TO_EXCLUDE_FROM_TEAMS).order_by('username'),
+                  })
 
 
 #----------------------------------------------------------
@@ -72,12 +70,12 @@ def edit(request, author_name, name):
                              name__iexact=name
             )
 
-    return render_to_response('team/edition.html',
-                              {
-                                  'team': team,
-                                  'users': User.objects.exclude(username__in=settings.ACCOUNTS_TO_EXCLUDE_FROM_TEAMS).order_by('username'),
-                              },
-                              context_instance=RequestContext(request))
+    return render(request,
+                  'team/edition.html',
+                  {
+                      'team': team,
+                      'users': User.objects.exclude(username__in=settings.ACCOUNTS_TO_EXCLUDE_FROM_TEAMS).order_by('username'),
+                  })
 
 
 #----------------------------------------------------------
@@ -110,14 +108,13 @@ def ls(request, author_name):
     else:
         objects = Team.objects.for_user(request.user, True).filter(owner=author)
 
-    return render_to_response('team/list.html',
-                              dict(
-                                  objects=objects,
-                                  author=author,
-                                  owner=(request.user == author),
-                              ),
-                              context_instance=RequestContext(request),
-    )
+    return render(request,
+                  'team/list.html',
+                  dict(
+                      objects=objects,
+                      author=author,
+                      owner=(request.user == author),
+                  ))
 
 
 #----------------------------------------------------------
@@ -126,11 +123,10 @@ def ls(request, author_name):
 def public_ls(request):
     '''List all accessible teams to the request user'''
 
-    return render_to_response('team/list.html',
-                              dict(
-                                  objects=Team.objects.public(),
-                                  author=request.user, #anonymous
-                                  owner=False,
-                              ),
-                              context_instance=RequestContext(request),
-    )
+    return render(request,
+                  'team/list.html',
+                  dict(
+                      objects=Team.objects.public(),
+                      author=request.user, #anonymous
+                      owner=False,
+                  ))
diff --git a/beat/web/toolchains/views.py b/beat/web/toolchains/views.py
index 51c7458cd2154fc0317513f74f2e57c4da986d59..55ffa8b42527fd1df2c620eb2813f1f4e49d3bd3 100644
--- a/beat/web/toolchains/views.py
+++ b/beat/web/toolchains/views.py
@@ -27,8 +27,7 @@
 
 from django.http import Http404
 from django.shortcuts import get_object_or_404
-from django.shortcuts import render_to_response
-from django.template import RequestContext
+from django.shortcuts import render
 from django.contrib.auth.decorators import login_required
 from django.conf import settings
 from django.contrib.auth.models import User
@@ -85,9 +84,9 @@ def create(request, name=None):
         declaration, errors = prototypes.load('toolchain')
         parameters['declaration'] = json.dumps(declaration)
 
-    return render_to_response('toolchains/edition.html',
-                              parameters,
-                              context_instance=RequestContext(request))
+    return render(request,
+                  'toolchains/edition.html',
+                  parameters)
 
 
 @login_required
@@ -118,9 +117,9 @@ def fork(request, author, name, version):
                   'messages':          Messages,
                  }
 
-    return render_to_response('toolchains/edition.html',
-                              parameters,
-                              context_instance=RequestContext(request))
+    return render(request,
+                  'toolchains/edition.html',
+                  parameters)
 
 
 @login_required
@@ -143,19 +142,19 @@ def edit(request, author, name, version):
     description = toolchain.description
 
     # Render the page
-    return render_to_response('toolchains/edition.html',
-                              {'toolchain_author':  request.user.username,
-                               'toolchain_name':    name,
-                               'toolchain_version': toolchain.version,
-                               'declaration':       toolchain.declaration_string.replace('\n', ''),
-                               'short_description': toolchain.short_description,
-                               'description':       description.replace('\n', '\\n'),
-                               'html_description':  restructuredtext(description).replace('\n', ''),
-                               'errors':            toolchain.errors.replace('\n', '\\n') if toolchain.errors is not None else '',
-                               'edition':           True,
-                               'messages':          Messages,
-                              },
-                              context_instance=RequestContext(request))
+    return render(request,
+                  'toolchains/edition.html',
+                  {'toolchain_author':  request.user.username,
+                   'toolchain_name':    name,
+                   'toolchain_version': toolchain.version,
+                   'declaration':       toolchain.declaration_string.replace('\n', ''),
+                   'short_description': toolchain.short_description,
+                   'description':       description.replace('\n', '\\n'),
+                   'html_description':  restructuredtext(description).replace('\n', ''),
+                   'errors':            toolchain.errors.replace('\n', '\\n') if toolchain.errors is not None else '',
+                   'edition':           True,
+                   'messages':          Messages,
+                  })
 
 
 def view(request, author, name, version=None):
@@ -194,15 +193,15 @@ def view(request, author, name, version=None):
     users = User.objects.exclude(username__in=settings.ACCOUNTS_TO_EXCLUDE_FROM_TEAMS).order_by('username')
 
     # Render the page
-    return render_to_response('toolchains/view.html',
-                              {
-                                  'toolchain': toolchain,
-                                  'owner': owner,
-                                  'reports': reports,
-                                  'users': users,
-                                  'teams': Team.objects.for_user(request.user, True)
-                              },
-                              context_instance=RequestContext(request))
+    return render(request,
+                  'toolchains/view.html',
+                  {
+                      'toolchain': toolchain,
+                      'owner': owner,
+                      'reports': reports,
+                      'users': users,
+                      'teams': Team.objects.for_user(request.user, True)
+                  })
 
 
 def diff(request, author1, name1, version1, author2, name2, version2):
@@ -228,12 +227,12 @@ def diff(request, author1, name1, version1, author2, name2, version2):
     has_access, _ = toolchain2.accessibility_for(request.user)
     if not has_access: raise Http404()
 
-    return render_to_response('toolchains/diff.html',
-                              {
-                                  'toolchain1':  toolchain1,
-                                  'toolchain2':  toolchain2,
-                              },
-                              context_instance=RequestContext(request))
+    return render(request,
+                  'toolchains/diff.html',
+                  {
+                      'toolchain1':  toolchain1,
+                      'toolchain2':  toolchain2,
+                  })
 
 
 def ls(request, author_name):
@@ -249,14 +248,13 @@ def ls(request, author_name):
                                                        author_name).order_by('-creation_date')
     objects = Toolchain.filter_latest_versions(objects)
 
-    return render_to_response('toolchains/list.html',
-                              dict(
-                                  objects=objects,
-                                  author=author,
-                                  owner=(request.user==author),
-                              ),
-                              context_instance=RequestContext(request),
-    )
+    return render(request,
+                  'toolchains/list.html',
+                  dict(
+                      objects=objects,
+                      author=author,
+                      owner=(request.user==author),
+                  ))
 
 
 def public_ls(request):
@@ -266,11 +264,10 @@ def public_ls(request):
     objects = Toolchain.objects.public().order_by('-creation_date')
     objects = Toolchain.filter_latest_versions(objects)
 
-    return render_to_response('toolchains/list.html',
-                              dict(
-                                  objects=objects,
-                                  author=request.user, #anonymous
-                                  owner=False,
-                              ),
-                              context_instance=RequestContext(request),
-    )
+    return render(request,
+                  'toolchains/list.html',
+                  dict(
+                      objects=objects,
+                      author=request.user, #anonymous
+                      owner=False,
+                  ))
diff --git a/beat/web/ui/registration/views.py b/beat/web/ui/registration/views.py
index 2db209b71d0ef42d46917eb380654209983d73fd..e1701e8135d4833af5db952eb7544dec3fda19c5 100644
--- a/beat/web/ui/registration/views.py
+++ b/beat/web/ui/registration/views.py
@@ -34,8 +34,7 @@ Views which allow users to create and activate accounts.
 from django.conf import settings
 from django.core.urlresolvers import reverse
 from django.http import HttpResponseRedirect
-from django.shortcuts import render_to_response
-from django.template import RequestContext
+from django.shortcuts import render
 from django.views.decorators.csrf import csrf_protect
 
 from .forms import RegistrationFormTermsOfService
@@ -97,10 +96,10 @@ def activate(request, activation_key,
     context = RequestContext(request)
     for key, value in extra_context.items():
         context[key] = callable(value) and value() or value
-    return render_to_response(template_name,
-                              { 'account': account,
-                                'expiration_days': settings.ACCOUNT_ACTIVATION_DAYS },
-                              context_instance=context)
+    return render(request,
+                  template_name,
+                  { 'account': account,
+                    'expiration_days': settings.ACCOUNT_ACTIVATION_DAYS })
 
 
 @csrf_protect
@@ -203,12 +202,11 @@ def register(request, success_url=None,
     for key, value in extra_context.items():
         context[key] = callable(value) and value() or value
 
-    return render_to_response(
-        template_name,
-        {
-            'form': form,
-            'form_supervisor': form_supervisor,
-            'supervisor_form_active': supervisor_form_active,
-            'url_prefix':settings.URL_PREFIX,
-            },
-        context_instance=context)
+    return render(request,
+                  template_name,
+                  {
+                      'form': form,
+                      'form_supervisor': form_supervisor,
+                      'supervisor_form_active': supervisor_form_active,
+                      'url_prefix':settings.URL_PREFIX,
+                  })
diff --git a/beat/web/ui/templatetags/fingerprint.py b/beat/web/ui/templatetags/fingerprint.py
index 10f827ca6e9e61ff1744c04eb89cd3f770128a69..4d0e69db7bf58b53fab59fbd0b36dc56876b3989 100644
--- a/beat/web/ui/templatetags/fingerprint.py
+++ b/beat/web/ui/templatetags/fingerprint.py
@@ -26,7 +26,9 @@
 ###############################################################################
 
 from django import template
-from django.contrib.staticfiles.templatetags.staticfiles import StaticFilesNode
+from django.templatetags.static import StaticNode
+from django.contrib.staticfiles.storage import staticfiles_storage
+
 from ... import __version__
 
 
@@ -36,10 +38,12 @@ register = template.Library()
 #--------------------------------------------------
 
 
-class FingerprintedFilesNode(StaticFilesNode):
+class FingerprintedFilesNode(StaticNode):
 
     def url(self, context):
-        return super(FingerprintedFilesNode, self).url(context) + '?v' + __version__
+        path = self.path.resolve(context)
+        url = staticfiles_storage.url(path)
+        return url + '?v' + __version__
 
 
 #--------------------------------------------------
diff --git a/beat/web/ui/views.py b/beat/web/ui/views.py
index 6ad045ce523a24d0a26ca4b9a92b05c31f3c99a4..bcffa5f04fee31299894711fdb4f997ce267485a 100755
--- a/beat/web/ui/views.py
+++ b/beat/web/ui/views.py
@@ -27,8 +27,7 @@
 
 
 from django.shortcuts import get_object_or_404
-from django.shortcuts import render_to_response
-from django.template import RequestContext
+from django.shortcuts import render
 from django.template import loader
 from django.template import Context
 from django.contrib.auth.views import login as django_login
@@ -63,8 +62,7 @@ logger = logging.getLogger(__name__)
 def index(request):
     '''Our main index page'''
 
-    return render_to_response('ui/index.html',
-                              context_instance=RequestContext(request))
+    return render(request, 'ui/index.html')
 
 
 #----------------------------------------------------------
@@ -190,8 +188,9 @@ def blocked_user_reactivation(request):
     else:
         form = BlockedUserRevalidationForm()
 
-    return render_to_response('registration/blocked_user_reactivate.html', {'form': form},
-                              context_instance=RequestContext(request))
+    return render(request,
+                  'registration/blocked_user_reactivate.html',
+                  {'form': form})
 
 
 #----------------------------------------------------------
@@ -263,15 +262,14 @@ def activity_stream(request, author_name):
       # 2. request.user != author
       leaderboards = Leaderboard.objects.filter(search__in=Search.objects.for_user(request.user).filter(author=author)).order_by('-changed')
 
-    return render_to_response('ui/activity_stream.html',
-                              dict(
-                                  owner = (request.user == author),
-                                  author= author,
-                                  statistics= gather_contributions(request.user, author),
-                                  leaderboards= leaderboards,
-                              ),
-                              context_instance=RequestContext(request),
-    )
+    return render(request,
+                  'ui/activity_stream.html',
+                  dict(
+                      owner = (request.user == author),
+                      author= author,
+                      statistics= gather_contributions(request.user, author),
+                      leaderboards= leaderboards,
+                  ))
 
 
 #----------------------------------------------------------
@@ -350,25 +348,25 @@ def user_settings(request):
 
         password_change_form = PasswordChangeForm(user=user)
 
-    return render_to_response('ui/user_settings.html',
-                              {
-                                  'password_change_form': password_change_form,
-                                  'token' : user.auth_token,
-                                  'statistics' : {
-                                      'nb_experiments': user.experiments.count(),
-                                      'nb_public_experiments': user.experiments.filter(sharing=Shareable.PUBLIC).count(),
-                                      'nb_attested_experiments': user.experiments.filter(~Q(attestation=None)).count(),
-                                      'nb_toolchains': user.toolchains.count(),
-                                      'nb_public_toolchains': user.toolchains.filter(sharing=Shareable.PUBLIC).count(),
-                                      'nb_algorithms': user.algorithms.count(),
-                                      'nb_public_algorithms': user.algorithms.filter(sharing=Shareable.PUBLIC).count(),
-                                      'nb_libraries': user.algorithms.count(),
-                                      'nb_public_libraries': user.librarys.filter(sharing=Shareable.PUBLIC).count(),
-                                      'nb_dataformats': user.dataformats.count(),
-                                      'nb_public_dataformats': user.dataformats.filter(sharing=Shareable.PUBLIC).count(),
-                                  },
-                              },
-                              context_instance=RequestContext(request))
+    return render(request,
+                  'ui/user_settings.html',
+                  {
+                      'password_change_form': password_change_form,
+                      'token' : user.auth_token,
+                      'statistics' : {
+                          'nb_experiments': user.experiments.count(),
+                          'nb_public_experiments': user.experiments.filter(sharing=Shareable.PUBLIC).count(),
+                          'nb_attested_experiments': user.experiments.filter(~Q(attestation=None)).count(),
+                          'nb_toolchains': user.toolchains.count(),
+                          'nb_public_toolchains': user.toolchains.filter(sharing=Shareable.PUBLIC).count(),
+                          'nb_algorithms': user.algorithms.count(),
+                          'nb_public_algorithms': user.algorithms.filter(sharing=Shareable.PUBLIC).count(),
+                          'nb_libraries': user.algorithms.count(),
+                          'nb_public_libraries': user.librarys.filter(sharing=Shareable.PUBLIC).count(),
+                          'nb_dataformats': user.dataformats.count(),
+                          'nb_public_dataformats': user.dataformats.filter(sharing=Shareable.PUBLIC).count(),
+                      },
+                  })
 
 
 #----------------------------------------------------------
diff --git a/beat/web/urls.py b/beat/web/urls.py
index d7d626b32c84ebab706a864fc3c14c50af54610a..3c09aead55c42532ac3b3859df681e9f0d7615f2 100755
--- a/beat/web/urls.py
+++ b/beat/web/urls.py
@@ -30,6 +30,8 @@ from django.conf import settings
 from django.views.generic import TemplateView
 from django.contrib.staticfiles.urls import staticfiles_urlpatterns
 
+from rest_framework_swagger.views import get_swagger_view
+
 from .ui import urls as ui_urls
 from .navigation import urls as navigation_urls
 
@@ -38,6 +40,8 @@ from urlparse import urlparse
 from django.contrib import admin
 admin.autodiscover()
 
+schema_view = get_swagger_view(title='BEAT API')
+
 # Views
 unprefixed_patterns = ui_urls.urlpatterns
 unprefixed_patterns += navigation_urls.urlpatterns
@@ -103,7 +107,7 @@ unprefixed_patterns += [
     url(r'^admin/', include(admin.site.urls)),
 
     url(r'^docs/',
-        include('rest_framework_swagger.urls', namespace='docs'),
+        schema_view
       ),
 
     url(r'^activity/',
diff --git a/buildout.cfg b/buildout.cfg
index b46762413fe23b350c01af24fff69ff7c3adc896..cdc4dc392376d79dbb35d01089efc5a91a326508 100644
--- a/buildout.cfg
+++ b/buildout.cfg
@@ -16,11 +16,12 @@ develop = .
 versions = versions
 
 [versions]
-django = >=1.9,<1.10
-django-rest-swagger = >=0.3.2,<0.3.3
+django = >=1.11,<2.0
+django-rest-swagger = >2.1
 django-guardian = >=1.3
-djangorestframework = >=3.2,<3.3
-django-activity-stream = >= 0.6.0
+djangorestframework = >3.7
+django-activity-stream = >= 0.6.5
+django-jsonield = >= 1.0.1
 
 [sysegg]
 recipe = syseggrecipe