diff --git a/common/test.py b/common/test.py
index 43336a9..7478f64 100644
--- a/common/test.py
+++ b/common/test.py
@@ -17,6 +17,7 @@
 import re
 import six
 import subprocess
+import testscenarios
 import testtools
 import time
 
@@ -63,7 +64,8 @@
         return randbits
 
 
-class HeatIntegrationTest(testtools.TestCase):
+class HeatIntegrationTest(testscenarios.WithScenarios,
+                          testtools.TestCase):
 
     def setUp(self):
         super(HeatIntegrationTest, self).setUp()
diff --git a/functional/test_default_parameters.py b/functional/test_default_parameters.py
new file mode 100644
index 0000000..138a13e
--- /dev/null
+++ b/functional/test_default_parameters.py
@@ -0,0 +1,107 @@
+#    Licensed under the Apache License, Version 2.0 (the "License"); you may
+#    not use this file except in compliance with the License. You may obtain
+#    a copy of the License at
+#
+#         http://www.apache.org/licenses/LICENSE-2.0
+#
+#    Unless required by applicable law or agreed to in writing, software
+#    distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+#    WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+#    License for the specific language governing permissions and limitations
+#    under the License.
+
+import yaml
+
+from heat_integrationtests.common import test
+
+
+class DefaultParametersTest(test.HeatIntegrationTest):
+
+    template = '''
+heat_template_version: 2013-05-23
+parameters:
+  length:
+    type: string
+    default: 40
+resources:
+  random1:
+    type: nested_random.yaml
+  random2:
+    type: OS::Heat::RandomString
+    properties:
+      length: {get_param: length}
+outputs:
+  random1:
+    value: {get_attr: [random1, random1_value]}
+  random2:
+    value: {get_resource: random2}
+'''
+    nested_template = '''
+heat_template_version: 2013-05-23
+parameters:
+  length:
+    type: string
+    default: 50
+resources:
+  random1:
+    type: OS::Heat::RandomString
+    properties:
+      length: {get_param: length}
+outputs:
+  random1_value:
+    value: {get_resource: random1}
+'''
+
+    scenarios = [
+        ('none', dict(param=None, default=None, temp_def=True,
+                      expect1=50, expect2=40)),
+        ('default', dict(param=None, default=12, temp_def=True,
+                         expect1=12, expect2=12)),
+        ('both', dict(param=15, default=12, temp_def=True,
+                      expect1=12, expect2=15)),
+        ('no_temp_default', dict(param=None, default=12, temp_def=False,
+                                 expect1=12, expect2=12)),
+    ]
+
+    def setUp(self):
+        super(DefaultParametersTest, self).setUp()
+        self.client = self.orchestration_client
+
+    def test_defaults(self):
+        stack_name = self._stack_rand_name()
+
+        env = {'parameters': {}, 'parameter_defaults': {}}
+        if self.param:
+            env['parameters'] = {'length': self.param}
+        if self.default:
+            env['parameter_defaults'] = {'length': self.default}
+
+        if not self.temp_def:
+            # remove the default from the parameter in the nested template.
+            ntempl = yaml.load(self.nested_template)
+            del ntempl['parameters']['length']['default']
+            nested_template = yaml.dump(ntempl)
+        else:
+            nested_template = self.nested_template
+
+        self.client.stacks.create(
+            stack_name=stack_name,
+            template=self.template,
+            files={'nested_random.yaml': nested_template},
+            disable_rollback=True,
+            parameters={},
+            environment=env
+        )
+        self.addCleanup(self.client.stacks.delete, stack_name)
+
+        stack = self.client.stacks.get(stack_name)
+        stack_identifier = '%s/%s' % (stack_name, stack.id)
+
+        self._wait_for_stack_status(stack_identifier, 'CREATE_COMPLETE')
+
+        stack = self.client.stacks.get(stack_name)
+        for out in stack.outputs:
+            if out['output_key'] == 'random1':
+                self.assertEqual(self.expect1, len(out['output_value']))
+            if out['output_key'] == 'random2':
+                self.assertEqual(self.expect2, len(out['output_value']))
