Sorry GiGs for being a pain. I have been using an API script: Patrols using Waypoints from here . All credit to Matt for writing the API it works like a treat. My issue is that although i can select multiple tokens to move to a path, there isn't an option to have each token move to a different path when selected together. It becomes tedious selecting each and setting the patrol for each. My suspicion is that it comes down to this section of the script (but I don't really know): WPP.SetTokenToPatrol = function(selected, opts) { //check to see if a token has been selected if (!selected || selected.length === 0) { return 'Err: no token selected'; } if (!state.WaypointPatrol['tokens']) { state.WaypointPatrol['tokens'] = {}; } if (!opts || !opts['patrolname'] || opts['patrolname'].trim() === '' ) { return 'Err: patrol name missing'; } opts['patrolname'] = opts['patrolname'].toLowerCase(); var pageid = getObj(selected[0]['_type'], selected[0]['_id']).get('_pageid'); if (!state.WaypointPatrol['paths'] || !state.WaypointPatrol['paths'][pageid] || !state.WaypointPatrol['paths'][pageid][opts['patrolname']]) { return 'Err: patrol name does not exist for this map'; } var points = state.WaypointPatrol['paths'][pageid][opts['patrolname']]; for (i in selected) { if (selected[i]['_type'] === 'graphic') { state.WaypointPatrol['tokens'][selected[i]['_id']] = { 'patrolname' : opts['patrolname'], 'active' : opts['active'] || true, 'patrolmode' : opts['patrolmode'] || 0, 'movementrate' : opts['movementrate'] || getObj('page', pageid).get('scale_number'), 'rotation' : isNaN(opts['rotation']) ? false : opts['rotation'], 'random' : opts['random'] || false, 'phase' : opts['phase'] || 0, }; //move token to closest point on patrol path var obj = getObj('graphic', selected[i]['_id']); WPP.MoveTokenToPath(obj, points); } } return 'Success: patrol added'; } And my thought is that the selected tokens get read as sharing the same patrol path. I have a macro that calls the api command like this: !wp patrol path:s_@{selected|bar1} mode:0 speed:5 rotation:false Where the paths are differentiated by the value of bar1 of the selected tokens. Now that I'm looking at it, the @{selected|bar1} might be the issue if it only reads the first token and applies that to the whole script? 😕 very much not certain. Thanks again GiGs for putting up with my vagary. If you have any insights they are more than welcome.