diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml
index 7c001369ed7e505c2ecbb7f30c787e5c558da304..dd50908b3a24a5928d5a478d108827f97f9f9fdd 100644
--- a/.gitlab-ci.yml
+++ b/.gitlab-ci.yml
@@ -3,6 +3,7 @@ stages:
 
 variables:
   PREFIX: /opt/beat.env.web/usr
+  TEST_PREFIX_PATH_FILE: '/tmp/test_prefix_$CI_JOB_ID.txt'
 
 build:
   stage: build
@@ -11,12 +12,13 @@ build:
   before_script:
   - ${PREFIX}/bin/python --version
   - docker info
+  - export BEAT_TEST_PREFIX=`mktemp -d --tmpdir=/var/tmp beat_test_prefix.XXXXXXXXX`
+  - echo $BEAT_TEST_PREFIX > $TEST_PREFIX_PATH_FILE
   script:
   - git clean -ffdx
   - ${PREFIX}/bin/python bootstrap-buildout.py
   - ./bin/buildout
   - export COVERAGE_FILE=.coverage.django
-  - export BEAT_TEST_PREFIX=`mktemp -d --tmpdir=/var/tmp beat_test_prefix.XXXXXXXXX`
   - ./bin/python ${PREFIX}/bin/coverage run --source=${CI_PROJECT_NAME} ./bin/django test --settings=beat.web.settings.ci -v 2
   - export BEAT_CMDLINE_TEST_PLATFORM=django://beat.web.settings.ci
   - export COVERAGE_FILE=.coverage.cmdline
@@ -24,13 +26,16 @@ build:
   - export NOSE_COVER_PACKAGE=beat.web
   - ./bin/python ${PREFIX}/bin/coverage run --source=./src/beat.cmdline ./bin/nosetests -sv beat.cmdline
   - unset COVERAGE_FILE
-  - rm -rf $BEAT_TEST_PREFIX
-  - unset BEAT_TEST_PREFIX
   - ./bin/python ${PREFIX}/bin/coverage combine .coverage.django .coverage.cmdline
   - ./bin/python ${PREFIX}/bin/coverage report
   - ./bin/python ${PREFIX}/bin/sphinx-apidoc --separate -d 2 --output=doc/api ${CI_PROJECT_NAMESPACE} beat/web/*/migrations beat/web/*/tests
   - ./bin/python ${PREFIX}/bin/sphinx-build doc/api html/api
   - ./bin/python ${PREFIX}/bin/sphinx-build doc/admin html/admin
   - ./bin/python ${PREFIX}/bin/sphinx-build doc/user html/user
+  after_script:
+  - export BEAT_TEST_PREFIX=`cat $TEST_PREFIX_PATH_FILE`
+  - echo "Deleting BEAT test prefix $BEAT_TEST_PREFIX"
+  - rm -rf $BEAT_TEST_PREFIX $TEST_PREFIX_PATH_FILE
+  - unset BEAT_TEST_PREFIX
   tags:
   - docker-build
diff --git a/beat/web/databases/models.py b/beat/web/databases/models.py
index 3d8f5447568ec3fbc772800c3ef1529c5559b23d..6179e22843e317d83b4d15934f878ea10bde0017 100755
--- a/beat/web/databases/models.py
+++ b/beat/web/databases/models.py
@@ -301,6 +301,7 @@ class DatabaseProtocol(models.Model):
 
     def natural_key(self):
         return self.database.natural_key() + (self.name,)
+    natural_key.dependencies = ['databases.database']
 
     def fullname(self):
         if self.name != '':
@@ -394,6 +395,8 @@ class DatabaseSet(models.Model):
 
     def natural_key(self):
         return self.protocol.natural_key() + (self.name,) + self.template.natural_key()
+    natural_key.dependencies = ['databases.databaseprotocol',
+                                'databases.databasesettemplate']
 
     def fullname(self):
         if self.name != '':
@@ -437,15 +440,10 @@ class DatabaseSetTemplateOutput(models.Model):
 
 
 class DatabaseSetOutputManager(models.Manager):
-
-    def get_by_natural_key(self, database_name, database_version, protocol_name, name,
-                           template_name, output_name):
+    def get_by_natural_key(self, set_natural_key, output_name):
+        set_ = DatabaseSet.objects.get_by_natural_key(*set_natural_key)
         return self.get(
-            set__protocol__database__name=database_name,
-            set__protocol__database__version=database_version,
-            set__protocol__name=protocol_name,
-            set__name=name,
-            set__template__name=template_name,
+            set=set_,
             template__name=output_name,
         )
 
@@ -477,3 +475,5 @@ class DatabaseSetOutput(models.Model):
 
     def natural_key(self):
         return (self.set.natural_key(), self.template.name)
+    natural_key.dependencies = ['databases.databasesettemplateoutput',
+                                'databases.databaseset']
diff --git a/beat/web/experiments/models/block.py b/beat/web/experiments/models/block.py
index f7e4fd3e69a843b828bd6ae2cd368ecc2a06e8e1..38b48dbb4d66b89bd8e4cc074abffe1985ee8f13 100755
--- a/beat/web/experiments/models/block.py
+++ b/beat/web/experiments/models/block.py
@@ -138,6 +138,7 @@ class Block(models.Model):
             self.experiment.toolchain.version,
             self.experiment.name,
         )
+    natural_key.dependencies = ['experiments.experiment']
 
 
     def save(self, *args, **kwargs):
diff --git a/beat/web/experiments/models/block_input.py b/beat/web/experiments/models/block_input.py
index 89153f8269d380a5c44722861cbde4f29db81989..e48adb4a2b2bcf749cb375c26493cd942c9ee4e6 100755
--- a/beat/web/experiments/models/block_input.py
+++ b/beat/web/experiments/models/block_input.py
@@ -26,32 +26,32 @@
 ###############################################################################
 
 from django.db import models
-from django.conf import settings
 
-from ...databases.models import DatabaseSetOutput
+from beat.web.databases.models import DatabaseSetOutput
 
 from .block import Block
 
 
-#----------------------------------------------------------
+# ----------------------------------------------------------
 
 
 class BlockInputManager(models.Manager):
 
-    def get_by_natural_key(self, name, experiment_author, toolchain_author,
-                           toolchain_name, toolchain_version, experiment_name,
-                           cache_hash, database_hash):
-        block = Block.objects.get_by_natural_key(name, experiment_author,
-                                                 toolchain_author, toolchain_name, toolchain_version,
-                                                 experiment_name)
+    def get_by_natural_key(self, block_natural_key,
+                           cache_hash, database_natural_key):
+        if block_natural_key:
+            block = Block.objects.get_by_natural_key(*block_natural_key)
+        else:
+            block = None
 
         if cache_hash:
             return self.get(cache__hash=cache_hash, block=block)
         else:
-            return self.get(database__hash=database_hash, block=block)
-
+            database = DatabaseSetOutput.objects.get_by_natural_key(
+                *database_natural_key)
+            return self.get(database=database, block=block)
 
-#----------------------------------------------------------
+# ----------------------------------------------------------
 
 
 class BlockInput(models.Model):
@@ -68,12 +68,19 @@ class BlockInput(models.Model):
                                  null=True, on_delete=models.CASCADE)
 
     channel = models.CharField(max_length=200, default='', blank=True,
-                               help_text="Synchronization channel within the toolchain")
+                               help_text="Synchronization channel within "
+                                         "the toolchain")
 
     objects = BlockInputManager()
 
-
     def natural_key(self):
+        if self.block:
+            block_natural_key = self.block.natural_key()
+        else:
+            block_natural_key = None
         cache_hash = self.cache and self.cache.hash
-        database_hash = self.database and self.database.hash
-        return self.block.natural_key() + (cache_hash, database_hash)
+        database_natural_key = self.database and self.database.natural_key()
+        return (block_natural_key, cache_hash, database_natural_key)
+    natural_key.dependencies = ['experiments.block',
+                                'experiments.cachedfile',
+                                'databases.databasesetoutput']
diff --git a/beat/web/experiments/models/experiment.py b/beat/web/experiments/models/experiment.py
index db9371fd8801134e297cc49178fd5362a658badd..bda6d9f117bfd5878e51d73c3e7e8bfa23604ceb 100755
--- a/beat/web/experiments/models/experiment.py
+++ b/beat/web/experiments/models/experiment.py
@@ -278,9 +278,9 @@ class Experiment(Shareable):
     #_____ Utilities __________
 
     def natural_key(self):
-
         return (self.author.username,) + \
             self.toolchain.natural_key() + (self.name,)
+    natural_key.dependencies = ['toolchains.toolchain']
 
 
     #_____ Methods __________
diff --git a/beat/web/experiments/models/result.py b/beat/web/experiments/models/result.py
index d85afa67cba360e14f8916b153b41c54100f918f..eb0f5edb572b9442a1e2d55f4db313208a215f20 100755
--- a/beat/web/experiments/models/result.py
+++ b/beat/web/experiments/models/result.py
@@ -73,6 +73,7 @@ class Result(models.Model):
             self.name,
             self.cache.hash,
         )
+    natural_key.dependencies = ['experiments.cachedfile']
 
 
     def value(self):
diff --git a/beat/web/search/models.py b/beat/web/search/models.py
index 826097b4c9af020063ca31fdacd6198cdb52ca7d..5577c5637eb682bbe049d88ba45aa33618487b1f 100644
--- a/beat/web/search/models.py
+++ b/beat/web/search/models.py
@@ -146,6 +146,7 @@ class Leaderboard(models.Model):
 
     def natural_key(self):
         return (self.search.author.username, self.search.name, self.search.version)
+    natural_key.dependencies = ['search.search']
 
     def get_absolute_url(self):
         return reverse(
diff --git a/buildout.cfg b/buildout.cfg
index e8ab3838d1572f6ae96a90a27399a7f2fd45e76b..b46762413fe23b350c01af24fff69ff7c3adc896 100644
--- a/buildout.cfg
+++ b/buildout.cfg
@@ -88,7 +88,7 @@ eggs = alabaster
 
 [sources]
 beat.core = git git@gitlab.idiap.ch:beat/beat.core branch=1.6.x
-beat.cmdline = git git@gitlab.idiap.ch:beat/beat.cmdline
+beat.cmdline = git git@gitlab.idiap.ch:beat/beat.cmdline branch=1.4.x
 beat.backend.python = git git@gitlab.idiap.ch:beat/beat.backend.python branch=1.5.x
 beat.examples = git git@gitlab.idiap.ch:beat/beat.examples egg=false