diff --git a/slapos/recipe/slapconfiguration.py b/slapos/recipe/slapconfiguration.py
index 140ae3c4d00b97d7c99f07070be17705acd66424..a1c35f6fe3d2a59465d66d7eb8a38ff9981d8a65 100644
--- a/slapos/recipe/slapconfiguration.py
+++ b/slapos/recipe/slapconfiguration.py
@@ -345,18 +345,22 @@ class DefaultValidator(object):
       for error in self.validator.iter_errors(instance):
         invalid = True
         yield error
-    # Apply collected defaults - only to valid instances
+    # Stop there in case of validation errors
     if invalid:
       return
-    for instance, defaults in self.defaults.values():
+    # Apply collected defaults
+    for data, defaults in self.defaults.values():
       for key, defaultdict in defaults.items():
-        if key not in instance:
+        if key not in data:
           it = iter(defaultdict.values())
           default = next(it)
           if any(d != default for d in it):
             raise UserError(
               "Conflicting defaults for key %s: %r" % (key, defaultlist))
-          instance[key] = default
+          data[key] = default
+    # Validate the updated instance
+    for error in self.validatorfor(self.schema).iter_errors(instance):
+      yield error
 
 
 class JsonSchema(Recipe):
diff --git a/slapos/test/recipe/test_slaposconfiguration.py b/slapos/test/recipe/test_slaposconfiguration.py
index acc09348f58588d06cd7def96a7aaea014834dce..374ab75346a1c484d76ecdec6fabe241eeccd8fd 100644
--- a/slapos/test/recipe/test_slaposconfiguration.py
+++ b/slapos/test/recipe/test_slaposconfiguration.py
@@ -54,7 +54,7 @@ class SlapConfigurationTest(unittest.TestCase):
     self.assertEqual(options['address-list'], [10, 20],
       "All underscores should be replaced with -")
 
-  def writeJsonSchema(self, serialisation='json-in-xml'):
+  def writeJsonSchema(self, serialisation='json-in-xml', valid_defaults=True):
     self.software_json_file = os.path.join(self.software_root, 'software.cfg.json')
     software_schema = {
       "name": "Test",
@@ -82,7 +82,7 @@ class SlapConfigurationTest(unittest.TestCase):
       "letter": {
         "type": "string",
         "enum": ["a", "b", "c"],
-        "default": "a"
+        "default": "a" if valid_defaults else 1,
       },
       "number": {
         "type": "integer",
@@ -136,7 +136,7 @@ class SlapConfigurationTest(unittest.TestCase):
         },
         "thing": {
           "type": "string",
-          "default": "hello",
+          "default": "hello" if valid_defaults else 1,
         },
       },
       "required": ["kind"],
@@ -153,7 +153,7 @@ class SlapConfigurationTest(unittest.TestCase):
         },
         "thing": {
           "type": "integer",
-          "default": 42,
+          "default": 42 if valid_defaults else "forty-two",
         },
         "required": ["kind"],
       }
@@ -286,6 +286,15 @@ class SlapConfigurationTest(unittest.TestCase):
         self.receiveParameters,
       )
 
+  def test_jsonschema_json_in_xml_invalid_defaults_json_input(self):
+    self.writeJsonSchema(valid_defaults=False)
+    parameters = {"number": 1}
+    with self.patchSlap(parameters, True):
+      self.assertRaises(
+        slapconfiguration.UserError,
+        self.receiveParameters,
+      )
+
   def test_jsonschema_shared_1_valid_defaults(self):
     self.writeJsonSchema()
     parameters = {"number": 1}