Fixed my issue So I have found a difference in how Jumpgate & Legacy works with toBack() and toFront() and perhaps also with obj.set(). The following code works well in Legacy: crossHair = createObj('graphic', { _type: 'graphic', _subtype: 'token', _pageid: pageid, isdrawing: 1, name: fields.crossHairName, imgsrc: chImg, layer: 'objects', width: 70, height: 70, left: chLeft, top: chTop, rotation: chRotation, represents: chOwnerID, }); if (crossHair && !confirmedDrop) { crossHair.set({aura2_color:colors.GREEN,aura2_radius:range}); } toFront(crossHair); // ... many lines of other code ... sometimes with player interaction hence the toFront() call crossHair.set({tint_color:(colors[aoeImage.toUpperCase()] || 'transparent'), left:chLeft, top:chTop, height:chHeight, width:endWidth, imgsrc:chImage, represents:charID}); toBack(crossHair); However, in Jumpgate, clearly the timings of the createObj(), obj.set() and toBack(obj) are different, and perhaps have become asynchronous (?). Whatever the case, things are not happening in the same order that they do in Legacy. So I have changed the code to the following: crossHair = createObj('graphic', { _type: 'graphic', _subtype: 'token', _pageid: pageid, isdrawing: 1, name: fields.crossHairName, imgsrc: chImg, layer: 'objects', width: 70, height: 70, left: chLeft, top: chTop, rotation: chRotation, represents: chOwnerID, }); if (crossHair && !confirmedDrop) { crossHair.set({aura2_color:colors.GREEN,aura2_radius:range}); } toFront(crossHair); // ... many lines of other code ... sometimes with player interaction hence the toFront() call setTimeout( () => crossHair.set({tint_color:(colors[aoeImage.toUpperCase()] || 'transparent'), left:chLeft, top:chTop, height:chHeight, width:endWidth, imgsrc:chImage, represents:charID}), 500); setTimeout( () => toBack(crossHair), 1000); Everything then works absolutely fine in Jumpgate - the area of effect graphic is snapped underneath the tokens once the toBack() executes.