diff --git a/reclass/datatypes/parameters.py b/reclass/datatypes/parameters.py
index fd3e572..576afb0 100644
--- a/reclass/datatypes/parameters.py
+++ b/reclass/datatypes/parameters.py
@@ -100,17 +100,10 @@
             return new
 
         values = cur
-        if isinstance(cur, dict):
-            value = Value(cur)
-            values = Values()
-            values.append(value)
-        elif isinstance(cur, list):
-            value = Value(cur)
-            values = Values()
-            values.append(value)
+        if isinstance(cur, (dict, list)):
+            values = Values(Value(cur))
         elif isinstance(cur, Value):
-            values = Values()
-            values.append(cur)
+            values = Values(cur)
 
         if isinstance(new, (dict, list)):
            new = Value(new)
@@ -306,9 +299,8 @@
                     value_inner = path_from_ref.get_value(self._base)
                     self._interpolate_inner(path_from_ref, value_inner, options)
 
-        # all references deferenced and on more references to work out
-        # so render value
         if value.allRefs():
+            # all references have been deferenced so render value
             try:
                 new = value.render(self._base, options)
                 if isinstance(new, dict):
@@ -320,7 +312,7 @@
                 else:
                     path.set_value(self._base, new)
 
-                # finally, remove the reference from the occurrences cache
+                # remove the reference from the unrendered list
                 del self._unrendered[path]
             except UndefinedVariableError as e:
                 raise UndefinedVariableError(e.var, path)
diff --git a/reclass/utils/dictitem.py b/reclass/utils/dictitem.py
index 726e3ef..8185d23 100644
--- a/reclass/utils/dictitem.py
+++ b/reclass/utils/dictitem.py
@@ -50,7 +50,7 @@
                 raise TypeError('allow dict over scalar = False: cannot merge %s onto %s' % (repr(self), repr(item)))
         raise TypeError('Cannot merge %s over %s' % (repr(self), repr(item)))
 
-    def render(self, context, options):
+    def render(self, context):
         value = {}
         for key, item in self._items.iteritems():
             value[key] = item
diff --git a/reclass/utils/listitem.py b/reclass/utils/listitem.py
index ec87294..f79212e 100644
--- a/reclass/utils/listitem.py
+++ b/reclass/utils/listitem.py
@@ -36,7 +36,7 @@
     def get_references(self):
         return self._refs
 
-    def render(self, context, options):
+    def render(self, context):
         value = []
         for item in self._items:
             value.append(item)
diff --git a/reclass/utils/refitem.py b/reclass/utils/refitem.py
index e25d04f..e606e98 100644
--- a/reclass/utils/refitem.py
+++ b/reclass/utils/refitem.py
@@ -6,12 +6,11 @@
 
 from reclass.utils.mergeoptions import MergeOptions
 from reclass.utils.dictpath import DictPath
-from reclass.defaults import PARAMETER_INTERPOLATION_DELIMITER
 from reclass.errors import UndefinedVariableError
 
 class RefItem(object):
 
-    def __init__(self, items, delimiter=PARAMETER_INTERPOLATION_DELIMITER):
+    def __init__(self, items, delimiter):
         self._delimiter = delimiter
         self._items = items
         self._refs = []
@@ -22,13 +21,12 @@
         self._refs = []
         self._allRefs = True
         value = ''
-        options = MergeOptions()
         for item in self._items:
             if item.has_references():
                 item.assembleRefs(context)
                 self._refs.extend(item.get_references())
             try:
-                value += item.render(context, options)
+                value += item.render(context)
             except UndefinedVariableError as e:
                 self._allRefs = False
         if self._allRefs:
@@ -53,14 +51,14 @@
         except KeyError as e:
             raise UndefinedVariableError(ref)
 
-    def render(self, context, options):
+    def render(self, context):
         # Preserve type if only one item
         if len(self._items) == 1:
-            return self._resolve(self._items[0].render(context, options), context)
+            return self._resolve(self._items[0].render(context), context)
         # Multiple items
         string = ''
         for item in self._items:
-            string += str(item.render(context, options))
+            string += str(item.render(context))
         return self._resolve(string, context)
 
     def __repr__(self):
diff --git a/reclass/utils/scaitem.py b/reclass/utils/scaitem.py
index 76a2e61..05fc9a2 100644
--- a/reclass/utils/scaitem.py
+++ b/reclass/utils/scaitem.py
@@ -42,7 +42,7 @@
                 raise TypeError('allow scalar over dict = False: cannot merge %s over %s' % (repr(self), repr(item)))
         raise TypeError('Cannot merge %s over %s' % (repr(self), repr(item)))
 
-    def render(self, context, options):
+    def render(self, context):
         return self._value
 
     def __repr__(self):
diff --git a/reclass/utils/values.py b/reclass/utils/values.py
index fba09e1..918f75d 100644
--- a/reclass/utils/values.py
+++ b/reclass/utils/values.py
@@ -8,10 +8,12 @@
 
 class Values(object):
 
-    def __init__(self):
+    def __init__(self, value=None):
         self._refs = []
         self._allRefs = True
         self._values = []
+        if value is not None:
+            self._values.append(value)
         self.assembleRefs()
 
     def append(self, value):
@@ -56,8 +58,6 @@
 
     def render(self, context, options=None):
         from reclass.datatypes.parameters import Parameters
-        from reclass.utils.dictitem import DictItem
-        from reclass.utils.scaitem import ScaItem
 
         if options is None:
             options = MergeOptions()
@@ -74,7 +74,8 @@
                     output = p1.as_dict()
                     continue
                 elif isinstance(output, list) and isinstance(new, list):
-                    raise TypeError('Cannot merge %s over %s' % (repr(self._values[n]), repr(self._values[n-1])))
+                    output.extend(new)
+                    continue
                 elif isinstance(output, (dict, list)) or isinstance(new, (dict, list)):
                     raise TypeError('Cannot merge %s over %s' % (repr(self._values[n]), repr(self._values[n-1])))
                 else:
