       for ad in aliasDecs
         p = sessionContext.deviceData.paths.add(ad[0])
         allDeclareTimestamps.set(p, Math.max(ad[1] or 1, allDeclareTimestamps.get(p) or 0))
-        attrTrackers = []
+        attrTrackers = null
         if ad[2]
-          cur = allDeclareAttributeTimestamps.get(p)
-          allDeclareAttributeTimestamps.set(p, cur = {}) if not cur
-          for k, v of ad[2]
-            attrTrackers.push(k)
-            cur[k] = Math.max(v, cur[k] or 0)
-
+          attrTrackers = Object.keys(ad[2])
+          mergeAttributeTimestamps(p, ad[2])
         device.track(sessionContext.deviceData, p, 'prerequisite', attrTrackers)
 
       unpacked = device.unpack(sessionContext.deviceData, path)
       for u in unpacked
         allDeclareTimestamps.set(u, Math.max(declaration[1] or 1, allDeclareTimestamps.get(u) or 0))
         if declaration[2]
-          cur = allDeclareAttributeTimestamps.get(u)
-          allDeclareAttributeTimestamps.set(u, cur = {}) if not cur
-          for k, v of declaration[2]
-            cur[k] = Math.max(v, cur[k] or 0)
-
-        if declaration[4]
-          cur = allDeclareAttributeValues.get(u)
-          allDeclareAttributeValues.set(u, cur = {}) if not cur
-          for k, v of declaration[4]
-            cur[k] = v
+          mergeAttributeTimestamps(u, declaration[2])
     else
       path = sessionContext.deviceData.paths.add(path)
       allDeclareTimestamps.set(path, Math.max(declaration[1] or 1, allDeclareTimestamps.get(path) or 0))
       if declaration[2]
-        cur = allDeclareAttributeTimestamps.get(path)
-        allDeclareAttributeTimestamps.set(path, cur = {}) if not cur
-        for k, v of declaration[2]
-          cur[k] = Math.max(v, cur[k] or 0)
-
-      if declaration[4]
-        if declaration[4]
-          cur = allDeclareAttributeValues.get(path)
-          allDeclareAttributeValues.set(path, cur = {}) if not cur
-          for k, v of declaration[4]
-            cur[k] = v
-
+        mergeAttributeTimestamps(path, declaration[2])
       device.track(sessionContext.deviceData, path, 'prerequisite')
+
+    if declaration[4]
+      if path.alias | path.wildcard
+        unpacked ?= device.unpack(sessionContext.deviceData, path)
+        for u in unpacked
+          mergeAttributeValues(u, declaration[4])
+      else
+        mergeAttributeValues(path, declaration[4])
 
     if declaration[3]?
       if Array.isArray(declaration[3])

          if currentPath.wildcard == 0
            if declareAttributeTimestamps
              for attrName of declareAttributeTimestamps
                if declareAttributeTimestamps[attrName] <= currentAttributes?[attrName]?[0]
                  delete declareAttributeTimestamps[attrName]

              if Object.keys(declareAttributeTimestamps).length
                d ?= [currentPath]
                d[1] = declareAttributeTimestamps

            if Object.keys(declareAttributeValues).length
              d ?= [currentPath]
              d[2] = declareAttributeValues


    switch (if currentPath[0] != '*' then currentPath[0] else leafParam[0])
      when 'Reboot'
        if currentPath.length == 1
          if declareAttributeValues?.value?
            syncState.reboot = +(new Date(declareAttributeValues.value[0]))
      when 'FactoryReset'
        if currentPath.length == 1
          if declareAttributeValues?.value?
            syncState.factoryReset = +(new Date(declareAttributeValues.value[0]))
      when 'Tags'
        if currentPath.length == 2 and currentPath.wildcard == 0 and declareAttributeValues?.value?
