diff --git a/reclass/utils/compitem.py b/reclass/utils/compitem.py
new file mode 100644
index 0000000..0e95d48
--- /dev/null
+++ b/reclass/utils/compitem.py
@@ -0,0 +1,53 @@
+#
+# -*- coding: utf-8 -*-
+#
+# This file is part of reclass
+#
+
+from reclass.utils.mergeoptions import MergeOptions
+from reclass.utils.dictpath import DictPath
+from reclass.errors import UndefinedVariableError
+
+class CompItem(object):
+
+    def __init__(self, items):
+        self._items = items
+        self._refs = []
+        self._allRefs = False
+        self.assembleRefs()
+
+    def assembleRefs(self, context={}):
+        self._refs = []
+        self._allRefs = True
+        options = MergeOptions()
+        for item in self._items:
+            if item.has_references():
+                item.assembleRefs(context)
+                self._refs.extend(item.get_references())
+                if item.allRefs() is False:
+                    self._allRefs = False
+
+    def contents(self):
+        return self._items
+
+    def allRefs(self):
+        return self._allRefs
+
+    def has_references(self):
+        return len(self._refs) > 0
+
+    def get_references(self):
+        return self._refs
+
+    def render(self, context):
+        # Preserve type if only one item
+        if len(self._items) == 1:
+            return self._items[0].render(context)
+        # Multiple items
+        string = ''
+        for item in self._items:
+            string += str(item.render(context))
+        return string
+
+    def __repr__(self):
+        return 'CompItem(%r)' % self._items
diff --git a/reclass/utils/value.py b/reclass/utils/value.py
index 0e11071..b934b1e 100644
--- a/reclass/utils/value.py
+++ b/reclass/utils/value.py
@@ -6,11 +6,12 @@
 
 import pyparsing as pp
 
-from reclass.utils.mergeoptions import *
-from reclass.utils.dictitem import *
-from reclass.utils.listitem import *
-from reclass.utils.refitem import *
-from reclass.utils.scaitem import *
+from reclass.utils.mergeoptions import MergeOptions
+from reclass.utils.compitem import CompItem
+from reclass.utils.dictitem import DictItem
+from reclass.utils.listitem import ListItem
+from reclass.utils.refitem import RefItem
+from reclass.utils.scaitem import ScaItem
 from reclass.defaults import PARAMETER_INTERPOLATION_DELIMITER, PARAMETER_INTERPOLATION_SENTINELS
 
 _STR = 'STR'
@@ -55,21 +56,24 @@
 
     def __init__(self, val, delimiter=PARAMETER_INTERPOLATION_DELIMITER):
         self._delimiter = delimiter
-        self._items = []
         self._refs = []
         self._allRefs = False
         self._container = False
         if isinstance(val, str):
             tokens = Value._parser.leaveWhitespace().parseString(val).asList()
-            self._items = self._createItems(tokens)
+            items = self._createItems(tokens)
+            if len(items) is 1:
+                self._item = items[0]
+            else:
+                self._item = CompItem(items)
         elif isinstance(val, list):
-            self._items.append(ListItem(val))
+            self._item = ListItem(val)
             self._container = True
         elif isinstance(val, dict):
-            self._items.append(DictItem(val))
+            self._item = DictItem(val)
             self._container = True
         else:
-            self._items.append(ScaItem(val))
+            self._item = ScaItem(val)
         self.assembleRefs()
 
     def _createRef(self, tokens):
@@ -91,14 +95,13 @@
         return items
 
     def assembleRefs(self, context={}):
-        self._refs = []
-        self._allRefs = True
-        for item in self._items:
-            if item.has_references():
-                item.assembleRefs(context)
-                self._refs.extend(item.get_references())
-            if item.allRefs() is False:
-                self._allRefs = False
+        if self._item.has_references():
+            self._item.assembleRefs(context)
+            self._refs = self._item.get_references()
+            self._allRefs = self._item.allRefs()
+        else:
+            self._refs = []
+            self._allRefs = True
 
     def is_container(self):
         return self._container
@@ -112,29 +115,15 @@
     def get_references(self):
         return self._refs
 
-    def render(self, context, options=None):
-        if options is None:
-            options = MergeOptions()
-        if len(self._items) == 1:
-            return self._items[0].render(context, options)
-        value = ''
-        for item in self._items:
-            value += str(item.render(context, options))
-        return value
+    def render(self, context, dummy=None):
+        return self._item.render(context)
 
     def contents(self):
-        if len(self._items) == 1:
-            return self._items[0].contents()
-        value = ''
-        for item in self._items:
-            value += str(item.contents())
-        return value
+        return self._item.contents()
 
     def merge_over(self, value, options):
-        if len(self._items) is 1 and len(value._items) is 1:
-            self._items[0] = self._items[0].merge_over(value._items[0], options)
-            return self
-        raise TypeError('Cannot merge %s onto %s' % (repr(self), repr(value)))
+        self._item = self._item.merge_over(value._item, options)
+        return self
 
     def __repr__(self):
-        return 'Value(%r)' % self._items
+        return 'Value(%r)' % self._item
