diff --git a/djangoldp/migrations/0002_auto_20190905_1542.py b/djangoldp/migrations/0002_auto_20190906_0642.py
similarity index 60%
rename from djangoldp/migrations/0002_auto_20190905_1542.py
rename to djangoldp/migrations/0002_auto_20190906_0642.py
index ff3b2dc14e84c5e2037fbd444450f3f668d86c29..c68a1c5147a9f96426e114d4da02f3e92f01e5dd 100644
--- a/djangoldp/migrations/0002_auto_20190905_1542.py
+++ b/djangoldp/migrations/0002_auto_20190906_0642.py
@@ -1,8 +1,9 @@
 # -*- coding: utf-8 -*-
-# Generated by Django 1.11 on 2019-09-05 15:42
+# Generated by Django 1.11 on 2019-09-06 06:42
 from __future__ import unicode_literals
 
-from django.db import migrations, models
+from django.db import migrations
+import djangoldp.fields
 
 
 class Migration(migrations.Migration):
@@ -16,9 +17,9 @@ class Migration(migrations.Migration):
             model_name='ldpsource',
             name='container',
         ),
-        migrations.AlterField(
+        migrations.AddField(
             model_name='ldpsource',
-            name='id',
-            field=models.URLField(primary_key=True, serialize=False),
+            name='urlid',
+            field=djangoldp.fields.LDPUrlField(null=True, unique=True),
         ),
     ]
diff --git a/djangoldp/models.py b/djangoldp/models.py
index 73c1c17d9a7f9d23061cf51ae222e1d9006b3ab0..dcebce7af3edd38ece5ad89fac9872b9f1f1912d 100644
--- a/djangoldp/models.py
+++ b/djangoldp/models.py
@@ -5,6 +5,7 @@ from django.urls import get_resolver
 from django.utils.datastructures import MultiValueDict, MultiValueDictKeyError
 from django.utils.decorators import classonlymethod
 
+from djangoldp.fields import LDPUrlField
 from djangoldp.permissions import LDPPermissions
 
 User._meta.rdf_type = "foaf:user"
@@ -12,6 +13,7 @@ User._meta.owner_field = "id"
 
 
 class Model(models.Model):
+    urlid = LDPUrlField(null=True, unique=True)
 
     @classmethod
     def get_view_set(cls):
@@ -133,20 +135,26 @@ class Model(models.Model):
             permissions = permission_class().filter_user_perms(user_or_group, obj_or_model, permissions)
         return [{'mode': {'@type': name.split('_')[0]}} for name in permissions]
 
+    @classmethod
+    def is_external(cls, value):
+        try:
+            return value.urlid is not None
+        except:
+            return False
+
 
 class LDPSource(Model):
-    id = models.URLField(primary_key=True)
     federation = models.CharField(max_length=255)
 
     class Meta:
         rdf_type = 'ldp:Container'
         ordering = ('federation',)
         container_path = 'sources'
-        lookup_field = 'id'
+        lookup_field = 'federation'
         permissions = (
             ('view_source', 'acl:Read'),
             ('control_source', 'acl:Control'),
         )
 
     def __str__(self):
-        return "{}: {}".format(self.federation, self.id)
+        return "{}: {}".format(self.federation, self.urlid)
diff --git a/djangoldp/serializers.py b/djangoldp/serializers.py
index 5560793a8bfd23b3d0a474ffc32a7811f9af1759..2d2e96e59c389793cde1cf827ec6cf311aac3793 100644
--- a/djangoldp/serializers.py
+++ b/djangoldp/serializers.py
@@ -184,7 +184,10 @@ class JsonLdField(HyperlinkedRelatedField):
 class JsonLdRelatedField(JsonLdField):
     def to_representation(self, value):
         try:
-            return {'@id': super().to_representation(value)}
+            if Model.is_external(value):
+                return {'@id': value.urlid }
+            else:
+                return {'@id': super().to_representation(value)}
         except ImproperlyConfigured:
             return value.pk
 
@@ -223,10 +226,20 @@ class JsonLdIdentityField(JsonLdField):
 
     def to_representation(self, value: Any) -> Any:
         try:
-            return Hyperlink(value.webid(), value)
+            if isinstance(value, str):
+                return Hyperlink(value, value)
+            else:
+                return Hyperlink(value.webid(), value)
         except AttributeError:
             return super().to_representation(value)
 
+    def get_attribute(self, instance):
+        if Model.is_external(instance):
+            return instance.urlid
+        else:
+            return super().get_attribute(instance)
+
+
 
 class LDPSerializer(HyperlinkedModelSerializer):
     url_field_name = "@id"
@@ -254,10 +267,10 @@ class LDPSerializer(HyperlinkedModelSerializer):
         for field in data:
             if isinstance(data[field], dict) and '@id' in data[field]:
                 data[field]['@id'] = data[field]['@id'].format(Model.container_id(obj), str(getattr(obj, slug_field)))
-        if not ('@id' in data or 'id' in data):
+        if 'urlid' in data and data['urlid'] is not None:
+            data['@id'] = data.pop('urlid')['@id']
+        if not '@id' in data:
             data['@id'] = '{}{}'.format(settings.SITE_URL, Model.resource(obj))
-        if 'id' in data:
-            data['@id'] = data.pop('id')
         rdf_type = Model.get_meta(obj, 'rdf_type', None)
         rdf_context = Model.get_meta(obj, 'rdf_context', None)
         if rdf_type is not None:
diff --git a/djangoldp/tests/tests_get.py b/djangoldp/tests/tests_get.py
index fb2c0b9925d0868fa4df0cd4b199be9a8ba58a38..e69f119f23cbef0094600ba50b1c330f6c58f360 100644
--- a/djangoldp/tests/tests_get.py
+++ b/djangoldp/tests/tests_get.py
@@ -42,14 +42,17 @@ class TestGET(APITestCase):
     def test_get_filtered_fields(self):
         skill = Skill.objects.create(title="Java", obligatoire="ok", slug="1")
         skill2 = Skill.objects.create(title="Java", obligatoire="ok", slug="2")
+        skill3 = Skill.objects.create(urlid="http://external/skills/1")
         job = JobOffer.objects.create(title="job", slug="1")
         job.skills.add(skill)
         job.skills.add(skill2)
+        job.skills.add(skill3)
         job.save()
         response = self.client.get('/job-offers/{}/'.format(job.slug), content_type='application/ld+json')
         self.assertEqual(response.status_code, 200)
         self.assertIn('recent_skills', response.data)
         self.assertEqual(response.data['recent_skills']['@id'], "http://happy-dev.fr/job-offers/1/recent_skills/")
+        self.assertEqual(response.data['skills']['ldp:contains'][2]['@id'], "http://external/skills/1")
 
     def test_get_reverse_filtered_fields(self):
         skill = Skill.objects.create(title="Java", obligatoire="ok", slug="1")
diff --git a/djangoldp/tests/tests_sources.py b/djangoldp/tests/tests_sources.py
index a68327f56c190503210d48870be5a95f1bb3c786..e43f3e9457cf9d828da01b85b6531b8e199aeca9 100644
--- a/djangoldp/tests/tests_sources.py
+++ b/djangoldp/tests/tests_sources.py
@@ -13,6 +13,6 @@ class TestSource(APITestCase):
         pass
 
     def test_get_resource(self):
-        source = LDPSource.objects.create(federation="source_name", id="http://bar.foo/")
+        source = LDPSource.objects.create(federation="source_name", urlid="http://bar.foo/")
         response = self.client.get('/sources/{}/'.format(source.federation), content_type='application/ld+json')
         self.assertEqual(response.status_code, 200)
diff --git a/djangoldp/tests/tests_temp.py b/djangoldp/tests/tests_temp.py
index 161703c81abc8562d445f07bd2e04fc503ee5de0..6896080d1d3f2712c0adf3ac687131f0cd8a561d 100644
--- a/djangoldp/tests/tests_temp.py
+++ b/djangoldp/tests/tests_temp.py
@@ -1,11 +1,7 @@
-import json
-
 from django.contrib.auth.models import User
 from django.test import TestCase
 from rest_framework.test import APIRequestFactory, APIClient
 
-from djangoldp.tests.models import Resource, JobOffer, Invoice, Batch
-
 
 class TestTemp(TestCase):
 
@@ -16,4 +12,3 @@ class TestTemp(TestCase):
 
     def tearDown(self):
         pass
-
diff --git a/djangoldp/urls.py b/djangoldp/urls.py
index f92a2ab43590fc8c27da7ae3b5e387e36cad273e..a83b98eb262e80c0dd805ce4bc186d02f4f74fbf 100644
--- a/djangoldp/urls.py
+++ b/djangoldp/urls.py
@@ -17,7 +17,7 @@ def __clean_path(path):
 
 
 urlpatterns = [
-    url(r'^sources/(?P<federation>\w+)/', LDPSourceViewSet.urls(model=LDPSource, fields=['federation', 'id'],
+    url(r'^sources/(?P<federation>\w+)/', LDPSourceViewSet.urls(model=LDPSource, fields=['federation', 'urlid'],
                                                                 permission_classes=[LDPPermissions], )),
     url(r'^\.well-known/webfinger/?$', WebFingerView.as_view()),
 ]