allow key values of None/null to be unconditionally over written
diff --git a/reclass/datatypes/tests/test_parameters.py b/reclass/datatypes/tests/test_parameters.py
index c1ef640..e33f3b8 100644
--- a/reclass/datatypes/tests/test_parameters.py
+++ b/reclass/datatypes/tests/test_parameters.py
@@ -346,6 +346,14 @@
         p.interpolate()
         self.assertEqual(p.as_dict(), r)
 
+    def test_overwrite_none(self):
+        p1 = Parameters({'A': None, 'B': None, 'C': None, 'D': None, 'E': None, 'F': None})
+        p2 = Parameters({'A': 'abc', 'B': [1, 2, 3], 'C': {'a': 'aaa', 'b': 'bbb'}, 'D': '${A}', 'E': '${B}', 'F': '${C}'})
+        r = {'A': 'abc', 'B': [1, 2, 3], 'C': {'a': 'aaa', 'b': 'bbb'}, 'D': 'abc', 'E': [1, 2, 3], 'F': {'a': 'aaa', 'b': 'bbb'}}
+        p1.merge(p2)
+        p1.interpolate()
+        self.assertEqual(p1.as_dict(), r)
+
     def test_interpolate_escaping(self):
         v = 'bar'.join(PARAMETER_INTERPOLATION_SENTINELS)
         d = {'foo': ESCAPE_CHARACTER + 'bar'.join(PARAMETER_INTERPOLATION_SENTINELS),
diff --git a/reclass/utils/dictitem.py b/reclass/utils/dictitem.py
index fca9982..9492f49 100644
--- a/reclass/utils/dictitem.py
+++ b/reclass/utils/dictitem.py
@@ -44,7 +44,7 @@
         from reclass.utils.scaitem import ScaItem
 
         if isinstance(item, ScaItem):
-            if options.allow_dict_over_scalar:
+            if item.contents() is None or options.allow_dict_over_scalar:
                 return self
             else:
                 raise TypeError('allow dict over scalar = False: cannot merge %s onto %s' % (repr(self), repr(item)))
diff --git a/reclass/utils/listitem.py b/reclass/utils/listitem.py
index ed13257..4abf9a6 100644
--- a/reclass/utils/listitem.py
+++ b/reclass/utils/listitem.py
@@ -45,7 +45,9 @@
                 item._list.append(i)
             return item
         elif isinstance(item, ScaItem):
-            if options.allow_list_over_scalar:
+            if item.contents() is None:
+                return self
+            elif options.allow_list_over_scalar:
                 self._list.insert(0, item.contents())
                 return self
             else:
diff --git a/reclass/utils/valuelist.py b/reclass/utils/valuelist.py
index 5e57f6f..0fa7d0a 100644
--- a/reclass/utils/valuelist.py
+++ b/reclass/utils/valuelist.py
@@ -64,11 +64,11 @@
         if options is None:
             options = MergeOptions()
         output = None
+        deepCopied = False
         for n, value in enumerate(self._values):
-            if n is 0:
-                output = self._values[0].render(context, options)
-                if isinstance(output, list):
-                    output = copy.deepcopy(output)
+            if output is None:
+                output = self._values[n].render(context, options)
+                deepCopied = False
             else:
                 new = value.render(context, options)
                 if isinstance(output, dict) and isinstance(new, dict):
@@ -78,6 +78,8 @@
                     output = p1.as_dict()
                     continue
                 elif isinstance(output, list) and isinstance(new, list):
+                    if not deepCopied:
+                        output = copy.deepcopy(output)
                     output.extend(new)
                     continue
                 elif isinstance(output, (dict, list)) or isinstance(new, (dict, list)):