diff --git a/djangoldp/models.py b/djangoldp/models.py
index dcebce7af3edd38ece5ad89fac9872b9f1f1912d..3dce34ef3348e1373dd90905fdf09217ba72fa0e 100644
--- a/djangoldp/models.py
+++ b/djangoldp/models.py
@@ -1,3 +1,4 @@
+from django.conf import settings
 from django.contrib.auth.models import User
 from django.db import models
 from django.db.models.base import ModelBase
@@ -138,7 +139,7 @@ class Model(models.Model):
     @classmethod
     def is_external(cls, value):
         try:
-            return value.urlid is not None
+            return value.urlid is not None and not value.urlid.startswith(settings.SITE_URL)
         except:
             return False
 
diff --git a/djangoldp/serializers.py b/djangoldp/serializers.py
index 2d2e96e59c389793cde1cf827ec6cf311aac3793..304933b9c260b642630f4bad29a24e21ebe10165 100644
--- a/djangoldp/serializers.py
+++ b/djangoldp/serializers.py
@@ -339,6 +339,8 @@ class LDPSerializer(HyperlinkedModelSerializer):
                 super().__init__(**kwargs)
 
             def get_value(self, dictionary):
+                if self.field_name == 'urlid':
+                    self.field_name = '@id'
                 try:
                     object_list = dictionary["@graph"]
                     if self.parent.instance is None:
@@ -354,6 +356,9 @@ class LDPSerializer(HyperlinkedModelSerializer):
                 except KeyError:
                     value = super().get_value(dictionary)
 
+                if self.field_name == '@id' and value == './':
+                    self.field_name = 'urlid'
+                    return None
                 return self.manage_empty(value)
 
             def manage_empty(self, value):
@@ -384,6 +389,8 @@ class LDPSerializer(HyperlinkedModelSerializer):
                     fields = '__all__'
 
             def to_internal_value(self, data):
+                if self.url_field_name in data and not 'urlid' in data and data[self.url_field_name].startswith('http'):
+                    data['urlid'] = data[self.url_field_name]
                 if data is '':
                     return ''
                 if self.url_field_name in data:
@@ -397,6 +404,7 @@ class LDPSerializer(HyperlinkedModelSerializer):
 
                     ret = OrderedDict()
                     errors = OrderedDict()
+
                     fields = list(filter(lambda x: x.field_name in data, self._writable_fields))
 
                     for field in fields:
diff --git a/djangoldp/tests/models.py b/djangoldp/tests/models.py
index fe6de31f645f445108295ef3f325f6ea05ea8768..c3bf10a6c537097ab4bd6106577277962f36366b 100644
--- a/djangoldp/tests/models.py
+++ b/djangoldp/tests/models.py
@@ -40,7 +40,7 @@ class JobOffer(Model):
         authenticated_perms = ['inherit', 'change', 'add']
         owner_perms = ['inherit', 'delete', 'control']
         nested_fields = ["skills"]
-        serializer_fields = ["@id", "title", "skills", "recent_skills", "resources", "slug", "some_skill"]
+        serializer_fields = ["@id", "title", "skills", "recent_skills", "resources", "slug", "some_skill", "urlid"]
         container_path = "job-offers/"
         lookup_field = 'slug'
 
diff --git a/djangoldp/tests/tests_save.py b/djangoldp/tests/tests_save.py
index 0674d12a6e7fe5bc85f5f332f7d7dddaffe8e30d..089cb551050e55d9341e7afa801388fcaf5bff76 100644
--- a/djangoldp/tests/tests_save.py
+++ b/djangoldp/tests/tests_save.py
@@ -268,6 +268,19 @@ class Save(TestCase):
         self.assertEqual(response.data['resources']['ldp:contains'][0]['@id'], "http://testserver/resources/{}/".format(resource.pk))
         self.assertEqual(response.data['title'], "new job")
 
+    def test_nested_container_federated(self):
+        resource = Resource.objects.create()
+        body = {
+            'http://happy-dev.fr/owl/#@id': "http://external.job/job/1",
+        }
+
+        response = self.client.post('/resources/{}/joboffers/'.format(resource.pk),
+                                    data=json.dumps(body),
+                                    content_type='application/ld+json')
+        self.assertEqual(response.status_code, 201)
+        self.assertEqual(response.data['resources']['ldp:contains'][0]['@id'], "http://testserver/resources/{}/".format(resource.pk))
+        self.assertEqual(response.data['@id'], "http://external.job/job/1")
+
     def test_embedded_context_2(self):
         body = {
             '@id': "./",
diff --git a/djangoldp/tests/tests_temp.py b/djangoldp/tests/tests_temp.py
index 6896080d1d3f2712c0adf3ac687131f0cd8a561d..b3ef7100cea8141b870c33296df8616979c57f10 100644
--- a/djangoldp/tests/tests_temp.py
+++ b/djangoldp/tests/tests_temp.py
@@ -12,3 +12,4 @@ class TestTemp(TestCase):
 
     def tearDown(self):
         pass
+
diff --git a/djangoldp/tests/tests_update.py b/djangoldp/tests/tests_update.py
index 431db723282d3467746d77162ca92c2764ac843b..bbd9846ac2767bd8484a5a19e3dd83a1c8fe83a6 100644
--- a/djangoldp/tests/tests_update.py
+++ b/djangoldp/tests/tests_update.py
@@ -264,7 +264,7 @@ class Update(TestCase):
     def test_put_resource(self):
         post = Post.objects.create(content="content")
         body = [{
-            '@id': '/posts/{}/'.format(post.pk),
+            '@id': 'http://testserver.com/posts/{}/'.format(post.pk),
             'http://happy-dev.fr/owl/#content': "post content"}]
         response = self.client.put('/posts/{}/'.format(post.pk), data=json.dumps(body),
                                    content_type='application/ld+json')
@@ -401,7 +401,7 @@ class Update(TestCase):
         job = JobOffer.objects.create(title="first title", slug="job")
         body = {
             'http://happy-dev.fr/owl/#joboffers': {
-                '@id': 'http://testserver/job-offers/{}/'.format(job.slug),
+                '@id': 'http://testserver.com/job-offers/{}/'.format(job.slug),
             }
         }
 
@@ -410,7 +410,7 @@ class Update(TestCase):
                                    content_type='application/ld+json')
         self.assertEqual(response.status_code, 200)
         self.assertEqual(response.data['joboffers']['ldp:contains'][0]['@id'],
-                         "http://testserver/job-offers/{}/".format(job.slug))
+                         "http://testserver.com/job-offers/{}/".format(job.slug))
         self.assertEqual(response.data['joboffers']['ldp:contains'][0]['title'], "first title")
 
     def test_m2m_new_link_bis(self):
@@ -419,9 +419,9 @@ class Update(TestCase):
         body = {
             'http://happy-dev.fr/owl/#joboffers':
                 {
-                    '@id': "http://testserver/resources/{}/joboffers/".format(resource.pk),
+                    '@id': "http://testserver.com/resources/{}/joboffers/".format(resource.pk),
                     'ldp:contains': [
-                        {'@id': 'http://testserver/job-offers/{}/'.format(job.slug),
+                        {'@id': 'http://testserver.com/job-offers/{}/'.format(job.slug),
                          'http://happy-dev.fr/owl/#title': "new job",
                          },
                     ]
@@ -433,7 +433,7 @@ class Update(TestCase):
                                    content_type='application/ld+json')
         self.assertEqual(response.status_code, 200)
         self.assertEqual(response.data['joboffers']['ldp:contains'][0]['@id'],
-                         "http://testserver/job-offers/{}/".format(job.slug))
+                         "http://testserver.com/job-offers/{}/".format(job.slug))
         self.assertEqual(response.data['joboffers']['ldp:contains'][0]['title'], "new job")
 
     def test_m2m_new_link_embedded(self):
@@ -463,7 +463,7 @@ class Update(TestCase):
                 # '@id': "http://testserver/resources/{}/joboffers/".format(resource.pk),
                 'ldp:contains': [
                     {
-                        '@id': 'http://testserver/job-offers/{}/'.format(job.slug),
+                        '@id': 'http://testserver.com/job-offers/{}/'.format(job.slug),
                         'http://happy-dev.fr/owl/#title': "new job",
                     }
                 ]
@@ -475,5 +475,20 @@ class Update(TestCase):
                                    content_type='application/ld+json')
         self.assertEqual(response.status_code, 200)
         self.assertEqual(response.data['joboffers']['ldp:contains'][0]['@id'],
-                         "http://testserver/job-offers/{}/".format(job.slug))
+                         "http://testserver.com/job-offers/{}/".format(job.slug))
         self.assertEqual(response.data['joboffers']['ldp:contains'][0]['title'], "new job")
+
+    def test_m2m_new_link_federated(self):
+        resource = Resource.objects.create()
+        body = {
+            'http://happy-dev.fr/owl/#joboffers': {
+                'http://happy-dev.fr/owl/#@id': 'http://external.job/job/1',
+            }
+        }
+
+        response = self.client.put('/resources/{}/'.format(resource.pk),
+                                   data=json.dumps(body),
+                                   content_type='application/ld+json')
+        self.assertEqual(response.status_code, 200)
+        self.assertEqual(response.data['joboffers']['ldp:contains'][0]['@id'],
+                         "http://external.job/job/1")